diff --git a/.aspect/bazelrc/correctness.bazelrc b/.aspect/bazelrc/correctness.bazelrc
index f381062ae..e5501930c 100644
--- a/.aspect/bazelrc/correctness.bazelrc
+++ b/.aspect/bazelrc/correctness.bazelrc
@@ -24,7 +24,7 @@ test --test_verbose_timeout_warnings
# Allow the Bazel server to check directory sources for changes. Ensures that the Bazel server
# notices when a directory changes, if you have a directory listed in the srcs of some target.
# Recommended when using
-# [copy_directory](https://github.com/aspect-build/bazel-lib/blob/main/docs/copy_directory.md) and
+# [copy_directory](https://github.com/bazel-contrib/bazel-lib/blob/main/docs/copy_directory.md) and
# [rules_js](https://github.com/aspect-build/rules_js) since npm package are source directories
# inputs to copy_directory actions.
# Docs: https://bazel.build/reference/command-line-reference#flag--host_jvm_args
@@ -42,17 +42,6 @@ test --incompatible_exclusive_test_sandboxed
# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_strict_action_env
build --incompatible_strict_action_env
-# Propagate tags from a target declaration to the actions' execution requirements.
-# Ensures that tags applied in your BUILD file, like `tags=["no-remote"]`
-# get propagated to actions created by the rule.
-# Without this option, you rely on rules authors to manually check the tags you passed
-# and apply relevant ones to the actions they create.
-# See https://github.com/bazelbuild/bazel/issues/8830 for details.
-# Docs: https://bazel.build/reference/command-line-reference#flag--experimental_allow_tags_propagation
-build --experimental_allow_tags_propagation
-fetch --experimental_allow_tags_propagation
-query --experimental_allow_tags_propagation
-
# Do not automatically create `__init__.py` files in the runfiles of Python targets. Fixes the wrong
# default that comes from Google's internal monorepo by using `__init__.py` to delimit a Python
# package. Precisely, when a `py_binary` or `py_test` target has `legacy_create_init` set to `auto (the
diff --git a/.aspect/bazelrc/performance.bazelrc b/.aspect/bazelrc/performance.bazelrc
index acc48c59e..56749dd19 100644
--- a/.aspect/bazelrc/performance.bazelrc
+++ b/.aspect/bazelrc/performance.bazelrc
@@ -1,9 +1,3 @@
-# Don't apply `--noremote_upload_local_results` and `--noremote_accept_cached` to the disk cache.
-# If you have both `--noremote_upload_local_results` and `--disk_cache`, then this fixes a bug where
-# Bazel doesn't write to the local disk cache as it treats as a remote cache.
-# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_remote_results_ignore_disk
-build --incompatible_remote_results_ignore_disk
-
# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.
# Save time on Sandbox creation and deletion when many of the same kind of action run during the
# build.
@@ -11,10 +5,15 @@ build --incompatible_remote_results_ignore_disk
# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories
build --experimental_reuse_sandbox_directories
-# Do not build runfiles symlink forests for external repositories under
-# `.runfiles/wsname/external/repo` (in addition to `.runfiles/repo`). This reduces runfiles &
-# sandbox creation times & prevents accidentally depending on this feature which may flip to off by
-# default in the future. Note, some rules may fail under this flag, please file issues with the rule
-# author.
-# Docs: https://bazel.build/reference/command-line-reference#flag--legacy_external_runfiles
-build --nolegacy_external_runfiles
+# Avoid creating a runfiles tree for binaries or tests until it is needed.
+# Docs: https://bazel.build/reference/command-line-reference#flag--build_runfile_links
+# See https://github.com/bazelbuild/bazel/issues/6627
+#
+# This may break local workflows that `build` a binary target, then run the resulting program
+# outside of `bazel run`. In those cases, the script will need to call
+# `bazel build --build_runfile_links //my/binary:target` and then execute the resulting program.
+build --nobuild_runfile_links
+
+# Needed prior to Bazel 8; see
+# https://github.com/bazelbuild/bazel/issues/20577
+coverage --build_runfile_links
diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
index 5287958c2..7e24044d5 100755
--- a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
@@ -21,7 +21,6 @@ examples/runfiles/package.json=-1545884645
examples/stack_traces/package.json=2011229626
examples/webpack_cli/package.json=1911342006
js/private/coverage/bundle/package.json=-24783848
-js/private/image/package.json=-789619063
js/private/test/image/package.json=1430754959
js/private/test/js_run_devserver/package.json=-381403605
js/private/worker/src/package.json=-1243560410
@@ -32,5 +31,5 @@ npm/private/test/vendored/is-odd/package.json=1041695223
npm/private/test/vendored/lodash-4.17.21.tgz=-1206623349
npm/private/test/vendored/semver-max/package.json=578664053
package.json=1510979981
-pnpm-lock.yaml=-101429861
-pnpm-workspace.yaml=-1123429050
+pnpm-lock.yaml=-349512393
+pnpm-workspace.yaml=854106668
diff --git a/.bazelignore b/.bazelignore
index 1acf2063f..431a9c935 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -18,7 +18,6 @@ examples/runfiles/node_modules
examples/stack_traces/node_modules
examples/webpack_cli/node_modules/
js/private/coverage/bundle/node_modules
-js/private/image/node_modules
js/private/test/image/node_modules
js/private/test/js_run_devserver/node_modules
js/private/worker/src/node_modules
diff --git a/.bazelrc b/.bazelrc
index 461a3a768..724c8d06d 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -23,6 +23,12 @@ build --workspace_status_command="echo BUILD_SCM_VERSION 1.2.3"
# https://bazelbuild.slack.com/archives/C014RARENH0/p1691158021917459?thread_ts=1691156601.420349&cid=C014RARENH0
common --check_direct_dependencies=off
+
+# Ignore this test as it breaks the runfiles tree generation in coverage mode.
+# Also see: .aspect/bazelrc/performance.bazelrc where runfiles trees are eagerly
+# generated due to `coverage --build_runfile_links`
+coverage --deleted_packages=js/private/test/image/non_ascii
+
# Load any settings & overrides specific to the current user from `.aspect/bazelrc/user.bazelrc`.
# This file should appear in `.gitignore` so that settings are not shared with team members. This
# should be last statement in this config so the user configuration is able to overwrite flags from
diff --git a/.github/workflows/bazel6.bazelrc b/.github/workflows/bazel6.bazelrc
index f6a155c7c..e377913dd 100644
--- a/.github/workflows/bazel6.bazelrc
+++ b/.github/workflows/bazel6.bazelrc
@@ -20,8 +20,35 @@ build --noexperimental_action_cache_store_output_metadata
# when local debugging.
# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/pkgcache/PackageOptions.java#L185
# NB: This flag is in bazel6.bazelrc as when used in Bazel 7 is has been observed to break
-# "build without the bytes" --remote_download_outputs=toplevel. See https://github.com/aspect-build/bazel-lib/pull/711
+# "build without the bytes" --remote_download_outputs=toplevel. See https://github.com/bazel-contrib/bazel-lib/pull/711
# for more info.
build --noexperimental_check_output_files
fetch --noexperimental_check_output_files
query --noexperimental_check_output_files
+
+# Don't apply `--noremote_upload_local_results` and `--noremote_accept_cached` to the disk cache.
+# If you have both `--noremote_upload_local_results` and `--disk_cache`, then this fixes a bug where
+# Bazel doesn't write to the local disk cache as it treats as a remote cache.
+# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_remote_results_ignore_disk
+# NB: This flag is in bazel6.bazelrc because it became a no-op in Bazel 7 and has been removed
+# in Bazel 8.
+build --incompatible_remote_results_ignore_disk
+
+# Propagate tags from a target declaration to the actions' execution requirements.
+# Ensures that tags applied in your BUILD file, like `tags=["no-remote"]`
+# get propagated to actions created by the rule.
+# Without this option, you rely on rules authors to manually check the tags you passed
+# and apply relevant ones to the actions they create.
+# See https://github.com/bazelbuild/bazel/issues/8830 for details.
+# Docs: https://bazel.build/reference/command-line-reference#flag--experimental_allow_tags_propagation
+build --experimental_allow_tags_propagation
+fetch --experimental_allow_tags_propagation
+query --experimental_allow_tags_propagation
+
+# Do not build runfiles symlink forests for external repositories under
+# `.runfiles/wsname/external/repo` (in addition to `.runfiles/repo`). This reduces runfiles &
+# sandbox creation times & prevents accidentally depending on this feature which may flip to off by
+# default in the future. Note, some rules may fail under this flag, please file issues with the rule
+# author.
+# Docs: https://bazel.build/reference/command-line-reference#flag--legacy_external_runfiles
+build --nolegacy_external_runfiles
diff --git a/.github/workflows/bazel7.bazelrc b/.github/workflows/bazel7.bazelrc
index dbd40ee84..0a263625b 100644
--- a/.github/workflows/bazel7.bazelrc
+++ b/.github/workflows/bazel7.bazelrc
@@ -13,3 +13,11 @@ common --check_direct_dependencies=off
# build.
# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories
build --reuse_sandbox_directories
+
+# Do not build runfiles symlink forests for external repositories under
+# `.runfiles/wsname/external/repo` (in addition to `.runfiles/repo`). This reduces runfiles &
+# sandbox creation times & prevents accidentally depending on this feature which may flip to off by
+# default in the future. Note, some rules may fail under this flag, please file issues with the rule
+# author.
+# Docs: https://bazel.build/reference/command-line-reference#flag--legacy_external_runfiles
+build --nolegacy_external_runfiles
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index abf0a8344..d86419293 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -137,6 +137,9 @@ jobs:
- bazel-version:
major: 6
bzlmod: 0
+ # Don't run workspace tests unit tests.
+ - bzlmod: 0
+ folder: .
# Don't run workspace smoke test under bzlmod
- bzlmod: 1
folder: e2e/workspace
diff --git a/.gitignore b/.gitignore
index a597df8f1..28e65d907 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ node_modules/
.idea/
.ijwb/
+.bazelbsp/
.vscode
.DS_Store
diff --git a/.prettierignore b/.prettierignore
index d6e63a9d3..30bdfee36 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -8,4 +8,3 @@ min/
npm/private/test/vendored/
js/private/worker/worker.js
js/private/worker/src/worker_protocol.ts
-js/private/js_image_layer.mjs
diff --git a/MODULE.bazel b/MODULE.bazel
index 763ab513a..388783354 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -9,7 +9,7 @@ module(
# Lower-bounds (minimum) versions for direct runtime dependencies.
# Do not bump these unless rules_js requires a newer version to function.
-bazel_dep(name = "aspect_bazel_lib", version = "2.8.1")
+bazel_dep(name = "aspect_bazel_lib", version = "2.14.0")
bazel_dep(name = "bazel_features", version = "1.9.0")
bazel_dep(name = "bazel_skylib", version = "1.5.0")
bazel_dep(name = "platforms", version = "0.0.5")
@@ -140,7 +140,6 @@ npm.npm_translate_lock(
"//examples/runfiles:package.json",
"//examples/webpack_cli:package.json",
"//js/private/coverage/bundle:package.json",
- "//js/private/image:package.json",
"//js/private/test/image:package.json",
"//js/private/test/js_run_devserver:package.json",
"//js/private/worker/src:package.json",
diff --git a/WORKSPACE b/WORKSPACE
index 5e746b051..ed2e6e586 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,260 +1,7 @@
-workspace(name = "aspect_rules_js")
+# This file is not used by Bazel 8 and should be removed.
+#
+# However its presence works around issues with some tools:
+# https://github.com/bazel-contrib/bazel-gazelle/issues/2012
+# https://github.com/bazelbuild/bazel-watcher/issues/646
-# buildifier: disable=bzl-visibility
-load("//js/private:dev_deps.bzl", "rules_js_dev_dependencies")
-
-rules_js_dev_dependencies()
-
-load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies")
-
-rules_js_dependencies()
-
-load("@aspect_rules_js//js:toolchains.bzl", "rules_js_register_toolchains")
-
-rules_js_register_toolchains(node_version = "16.14.2")
-
-load("@aspect_bazel_lib//lib:repositories.bzl", "register_expand_template_toolchains")
-
-register_expand_template_toolchains()
-
-load("@rules_nodejs//nodejs:repositories.bzl", "nodejs_register_toolchains")
-
-# Alternate toolchains for testing across versions
-nodejs_register_toolchains(
- name = "node16",
- node_version = "16.13.1",
-)
-
-nodejs_register_toolchains(
- name = "node18",
- node_version = "18.13.0",
-)
-
-nodejs_register_toolchains(
- name = "node20",
- node_version = "20.11.1",
-)
-
-load("@bazel_skylib//lib:unittest.bzl", "register_unittest_toolchains")
-
-register_unittest_toolchains()
-
-load("@aspect_bazel_lib//lib:host_repo.bzl", "host_repo")
-
-host_repo(name = "aspect_bazel_lib_host")
-
-############################################
-# Example npm dependencies
-
-load("@aspect_rules_js//npm:repositories.bzl", "npm_import", "npm_translate_lock")
-
-npm_translate_lock(
- name = "npm",
- bins = {
- # derived from "bin" attribute in node_modules/typescript/package.json
- "typescript": {
- "tsc": "./bin/tsc",
- "tsserver": "./bin/tsserver",
- },
- },
- custom_postinstalls = {
- "@aspect-test/c": "echo moo > cow.txt",
- "@aspect-test/c@2.0.2": "echo mooo >> cow.txt",
- },
- data = [
- "//:examples/npm_deps/patches/meaning-of-life@1.0.0-pnpm.patch",
- "//:package.json",
- "//:pnpm-workspace.yaml",
- "//examples/js_binary:package.json",
- "//examples/linked_consumer:package.json",
- "//examples/linked_empty_node_modules:package.json",
- "//examples/linked_lib:package.json",
- "//examples/linked_pkg:package.json",
- "//examples/macro:package.json",
- "//examples/npm_deps:package.json",
- "//examples/npm_package/libs/lib_a:package.json",
- "//examples/npm_package/packages/pkg_a:package.json",
- "//examples/npm_package/packages/pkg_b:package.json",
- "//examples/npm_package/packages/pkg_d:package.json",
- "//examples/npm_package/packages/pkg_e:package.json",
- "//examples/runfiles:package.json",
- "//examples/webpack_cli:package.json",
- "//js/private/coverage/bundle:package.json",
- "//js/private/image:package.json",
- "//js/private/test/image:package.json",
- "//js/private/test/js_run_devserver:package.json",
- "//js/private/worker/src:package.json",
- "//npm/private/test:package.json",
- "//npm/private/test:vendored/lodash-4.17.21.tgz",
- "//npm/private/test/npm_package:package.json",
- "//npm/private/test/npm_package_publish:package.json",
- "//npm/private/test/vendored/is-odd:package.json",
- "//npm/private/test/vendored/semver-max:package.json",
- ],
- exclude_package_contents = {
- "chalk": ["**/README*"],
- },
- generate_bzl_library_targets = True,
- lifecycle_hooks = {
- # We fetch @kubernetes/client-node from source and it has a `prepare` lifecycle hook that needs to be run
- # which runs the `build` package.json script: https://github.com/kubernetes-client/javascript/blob/fc681991e61c6808dd26012a2331f83671a11218/package.json#L28.
- # Here we run run build so we just run `tsc` instead of `npm run build` which ends up just running `tsc`.
- "@kubernetes/client-node": ["build"],
- # 'install' hook fails as it assumes the following path to `node-pre-gyp`: ./node_modules/.bin/node-pre-gyp
- # https://github.com/stultuss/protoc-gen-grpc-ts/blob/53d52a9d0e1fe3cbe930dec5581eca89b3dde807/package.json#L28
- "protoc-gen-grpc@2.0.3": [],
- },
- lifecycle_hooks_execution_requirements = {
- "*": [
- "no-sandbox",
- ],
- # If @kubernetes/client-node is not sandboxed, will fail with
- # ```
- # src/azure_auth.ts(97,43): error TS2575: No overload expects 2 arguments, but overloads do exist that expect either 1 or 4 arguments.
- # src/azure_auth.ts(98,34): error TS2575: No overload expects 2 arguments, but overloads do exist that expect either 1 or 4 arguments.
- # src/gcp_auth.ts(93,43): error TS2575: No overload expects 2 arguments, but overloads do exist that expect either 1 or 4 arguments.
- # src/gcp_auth.ts(94,34): error TS2575: No overload expects 2 arguments, but overloads do exist that expect either 1 or 4 arguments.
- # ```
- # since a `jsonpath-plus@7.2.0` that is newer then the transitive dep `jsonpath-plus@0.19.0` is found outside of the sandbox that
- # includes typings that don't match the 0.19.0 "any" usage.
- "@kubernetes/client-node": [],
- "@figma/nodegit": [
- "no-sandbox",
- "requires-network",
- ],
- "esbuild": [
- "no-sandbox",
- "requires-network",
- ],
- "segfault-handler": [
- "no-sandbox",
- "requires-network",
- ],
- "puppeteer": [
- "no-sandbox",
- "requires-network",
- ],
- },
- npmrc = "//:.npmrc",
- package_visibility = {
- "unused": ["//visibility:private"],
- "@mycorp/pkg-a": ["//examples:__subpackages__"],
- },
- pnpm_lock = "//:pnpm-lock.yaml",
- # Use a version that's not vendored into rules_js by providing a (version, integrity) tuple.
- # curl --silent https://registry.npmjs.org/pnpm | jq '.versions["8.6.11"].dist.integrity'
- pnpm_version = ("8.6.11", "sha512-jqknppuj45tDzJsLcLqkAxytBHZXIx9JTYkGNq0/7pSRggpio9wRxTDj4NA2ilOHPlJ5BVjB5Ij5dx65woMi5A=="),
- public_hoist_packages = {
- # Instructs the linker to hoist the ms@2.1.3 npm package to `node_modules/ms` in the `examples/npm_deps` package.
- # Similar to adding `public-hoist-pattern[]=ms` in .npmrc but with control over which version to hoist and where
- # to hoist it. This hoisted package can be referenced by the label `//examples/npm_deps:node_modules/ms` same as
- # other direct dependencies in the `examples/npm_deps/package.json`.
- "ms@2.1.3": ["examples/npm_deps"],
- },
- update_pnpm_lock = True,
- verify_node_modules_ignored = "//:.bazelignore",
- verify_patches = "//examples/npm_deps/patches:patches",
-)
-
-load("@npm//:repositories.bzl", "npm_repositories")
-
-# Declares npm_import rules from the pnpm-lock.yaml file
-npm_repositories()
-
-# As an example, manually import a package using explicit coordinates.
-# Just a demonstration of the syntax de-sugaring.
-npm_import(
- name = "acorn__8.4.0",
- bins = {"acorn": "./bin/acorn"},
- integrity = "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==",
- package = "acorn",
- # Root package where to link the package store
- root_package = "",
- version = "8.4.0",
-)
-
-############################################
-# Stardoc
-load("@io_bazel_stardoc//:setup.bzl", "stardoc_repositories")
-
-stardoc_repositories()
-
-load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps")
-
-rules_jvm_external_deps()
-
-load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup")
-
-rules_jvm_external_setup()
-
-load("@io_bazel_stardoc//:deps.bzl", "stardoc_external_deps")
-
-stardoc_external_deps()
-
-load("@bazel_features//:deps.bzl", "bazel_features_deps")
-
-bazel_features_deps()
-
-load("@stardoc_maven//:defs.bzl", stardoc_pinned_maven_install = "pinned_maven_install")
-
-stardoc_pinned_maven_install()
-
-# Buildifier
-load("@buildifier_prebuilt//:deps.bzl", "buildifier_prebuilt_deps")
-
-buildifier_prebuilt_deps()
-
-load("@buildifier_prebuilt//:defs.bzl", "buildifier_prebuilt_register_toolchains")
-
-buildifier_prebuilt_register_toolchains()
-
-# rules_lint
-load(
- "@aspect_rules_lint//format:repositories.bzl",
- "rules_lint_dependencies",
-)
-
-rules_lint_dependencies()
-
-load("@rules_multitool//multitool:multitool.bzl", "multitool")
-
-multitool(
- name = "multitool",
- lockfiles = [
- "@aspect_rules_lint//format:multitool.lock.json",
- "@aspect_rules_lint//lint:multitool.lock.json",
- ],
-)
-
-load("@com_grail_bazel_toolchain//toolchain:deps.bzl", "bazel_toolchain_dependencies")
-
-bazel_toolchain_dependencies()
-
-load("@com_grail_bazel_toolchain//toolchain:rules.bzl", "llvm_toolchain")
-
-llvm_toolchain(
- name = "llvm_toolchain",
- llvm_version = "14.0.0",
- sha256 = {
- "darwin-aarch64": "1b8975db6b638b308c1ee437291f44cf8f67a2fb926eb2e6464efd180e843368",
- "linux-x86_64": "564fcbd79c991e93fdf75f262fa7ac6553ec1dd04622f5d7db2a764c5dc7fac6",
- },
- strip_prefix = {
- "darwin-aarch64": "clang+llvm-14.0.0-arm64-apple-darwin",
- "linux-x86_64": "clang+llvm-14.0.0-x86_64-linux-gnu",
- },
- sysroot = {
- "linux-aarch64": "@org_chromium_sysroot_linux_arm64//:sysroot",
- "linux-x86_64": "@org_chromium_sysroot_linux_x86_64//:sysroot",
- "darwin-aarch64": "@sysroot_darwin_universal//:sysroot",
- "darwin-x86_64": "@sysroot_darwin_universal//:sysroot",
- },
- urls = {
- "darwin-aarch64": ["https://github.com/aspect-forks/llvm-project/releases/download/aspect-release-14.0.0/clang+llvm-14.0.0-arm64-apple-darwin.tar.xz"],
- "linux-x86_64": ["https://github.com/aspect-forks/llvm-project/releases/download/aspect-release-14.0.0/clang+llvm-14.0.0-x86_64-linux-gnu.tar.xz"],
- },
-)
-
-load("@llvm_toolchain//:toolchains.bzl", "llvm_register_toolchains")
-
-llvm_register_toolchains()
+fail("Local WORKSPACE development unsupported")
diff --git a/docs/README.md b/docs/README.md
index dd9436533..8d4a63c6d 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -109,21 +109,15 @@ $ bazel fetch @npm//...
### Using pnpm workspaces
-Here's an example `pnpm-workspace.yaml` file which will automatically discover all packages in the repository, based on the existence of a `package.json` file.
+Here's an example `pnpm-workspace.yaml` file which will find all projects under `apps` or `packages` at any depth, and anything directly under `tools`, based on the existence of a `package.json` file.
+
Make sure to place this file at the root of the repository.
```yaml
packages:
- # Include all directories in the workspace
- - '*'
- # Include all subdirectories at any depth
- - '**/*'
- # Exclude node_modules folders anywhere in the tree
- - '!**/node_modules/**'
- # Exclude node_modules folder in root
- - '!node_modules'
- # Exclude anything inside bazel dirs
- - '!bazel-*/**'
+ - 'apps/**'
+ - 'packages/**'
+ - 'tools/*'
```
### Link the node_modules
diff --git a/docs/js_image_layer.md b/docs/js_image_layer.md
index 516568bf1..fab44e408 100644
--- a/docs/js_image_layer.md
+++ b/docs/js_image_layer.md
@@ -19,7 +19,8 @@ js_image_layer(
## js_image_layer
-js_image_layer(name , binary , compression , generate_empty_layers , owner , platform , root )
+js_image_layer(name , binary , compression , generate_empty_layers , layer_groups , owner , platform ,
+ preserve_symlinks , root )
Create container image layers from js_binary targets.
@@ -261,6 +262,29 @@ container_image(
)
```
+
+## Performance
+
+For better performance, it is recommended to split the large parts of a `js_binary` to have a separate layer.
+
+The matching order for layer groups is as follows:
+
+1. `layer_groups` are checked in order first
+2. If no match is found for `layer_groups`, the `default layer groups` are checked.
+3. Any remaining files are placed into the app layer.
+
+The default layer groups are as follows and always created.
+
+```
+{
+ "node": "\/js\/private\/node-patches\/|\/bin\/nodejs\/",
+ "package_store_1p": "\.aspect_rules_js\/.*@0\.0\.0\/node_modules",
+ "package_store_3p": "\.aspect_rules_js\/.*\/node_modules",
+ "node_modules": "\/node_modules\/",
+ "app": "", # empty means just match anything.
+}
+```
+
**ATTRIBUTES**
@@ -268,10 +292,12 @@ container_image(
| :------------- | :------------- | :------------- | :------------- | :------------- |
| name | A unique name for this target. | Name | required | |
| binary | Label to an js_binary target | Label | required | |
-| compression | Compression algorithm. Can be one of `gzip`, `none`. | String | optional | `"gzip"` |
-| generate_empty_layers | Generate layers even if they are empty. Helpful when using js_image_layer with rules_docker. See https://github.com/aspect-build/rules_js/pull/1714 for more info | Boolean | optional | `False` |
+| compression | Compression algorithm. See https://github.com/bazel-contrib/bazel-lib/blob/bdc6ade0ba1ebe88d822bcdf4d4aaa2ce7e2cd37/lib/private/tar.bzl#L29-L39 | String | optional | `"gzip"` |
+| generate_empty_layers | DEPRECATED. An empty layer is always generated if the layer group have no matching files. | Boolean | optional | `False` |
+| layer_groups | Layer groups to create. These are utilized to categorize files into distinct layers, determined by their respective paths. The expected format for each entry is "": "", where MUST be a valid Bazel and JavaScript identifier (alphanumeric characters), and MAY be either an empty string (signifying a universal match) or a valid regular expression. | Dictionary: String -> String | optional | `{}` |
| owner | Owner of the entries, in `GID:UID` format. By default `0:0` (root, root) is used. | String | optional | `"0:0"` |
| platform | Platform to transition. | Label | optional | `None` |
+| preserve_symlinks | Preserve symlinks for entries matching the pattern. By default symlinks within the `node_modules` is preserved. | String | optional | `".*\\/node_modules\\/.*"` |
| root | Path where the files from js_binary will reside in. eg: /apps/app1 or /app | String | optional | `""` |
diff --git a/docs/npm_import.md b/docs/npm_import.md
index e493440dd..32839d662 100644
--- a/docs/npm_import.md
+++ b/docs/npm_import.md
@@ -51,6 +51,19 @@ npm_import(
)
```
+In `MODULE.bazel` the same would look like so:
+
+```starlark
+npm.npm_import(
+ name = "npm__at_types_node__15.12.2",
+ package = "@types/node",
+ version = "15.12.2",
+ integrity = "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",v
+)
+use_repo(npm, "npm__at_types_node__15.12.2")
+use_repo(npm, "npm__at_types_node__15.12.2__links")
+```
+
> This is similar to Bazel rules in other ecosystems named "_import" like
> `apple_bundle_import`, `scala_import`, `java_import`, and `py_import`.
> `go_repository` is also a model for this rule.
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index 6e43cdba5..b55de8080 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -162,6 +162,27 @@ This can lead to builds performing slower due to IO throttling, or even failing
If you are experiencing slower than expected builds, you can try disabling or reducing parallelism for the tools you are using.
+### Unnecessary npm package content
+
+Npm packages sometimes include unnecessary files such as tests, test data etc. Large files or a large number of files
+can effect performance and are sometimes worth explicitly excluding content.
+
+In these cases you can add such packages and the respective files/folders you want to exclude to your npm_translate_lock
+rule in the `exclude_package_contents` attribute like so:
+
+```starlark
+npm.npm_translate_lock(
+ ...
+ exclude_package_contents = {
+ "resolve": ["**/test/*"],
+ },
+)
+```
+
+This example will remove the test folder.
+
+You can use this to remove whatever you find to be not needed for your project.
+
#### Jest
See [rules_jest](https://github.com/aspect-build/rules_jest) specific [troubleshooting](https://docs.aspect.build/rulesets/aspect_rules_jest/docs/troubleshooting#performance).
diff --git a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
index 456d411c9..10a939883 100644
--- a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
+++ b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl
@@ -139,7 +139,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -150,7 +149,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if True else "@@aspect_rules_js~~npm~npm__segfault-handler__1.3.0//:pkg",
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -162,7 +160,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~npm__segfault-handler__1.3.0//:pkg",
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
@@ -287,7 +284,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc_lite".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -298,7 +294,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = lc_deps,
tags = ["manual"],
diff --git a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
index b6936c2d0..c77757dd1 100644
--- a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
+++ b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl
@@ -139,7 +139,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -150,7 +149,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if True else "@@npm__segfault-handler__1.3.0//:pkg",
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -162,7 +160,6 @@ def npm_imported_package_store(name):
src = None if True else "@@npm__segfault-handler__1.3.0//:pkg",
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
@@ -287,7 +284,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc_lite".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -298,7 +294,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc".format(store_target_name),
package = "segfault-handler",
version = "1.3.0",
- exclude_package_contents = [],
dev = False,
deps = lc_deps,
tags = ["manual"],
diff --git a/e2e/js_image_oci/src/BUILD.bazel b/e2e/js_image_oci/src/BUILD.bazel
index fa1cc313d..2a3c99486 100644
--- a/e2e/js_image_oci/src/BUILD.bazel
+++ b/e2e/js_image_oci/src/BUILD.bazel
@@ -54,6 +54,7 @@ js_image_layer(
"@platforms//cpu:x86_64": ":linux_amd64",
}),
root = "/app",
+ tags = ["no-remote-exec"],
visibility = ["//visibility:__pkg__"],
)
@@ -63,7 +64,7 @@ oci_image(
base = "@debian",
# This is `/[js_image_layer 'root']/[package name of js_image_layer 'binary' target]/[name of js_image_layer 'binary' target]`
cmd = ["/app/src/bin"],
- entrypoint = ["bash"],
+ entrypoint = ["/usr/bin/bash"],
tars = [
":layers",
],
diff --git a/e2e/js_image_oci/src/test.yaml b/e2e/js_image_oci/src/test.yaml
index 592ca0d8a..943312ccc 100644
--- a/e2e/js_image_oci/src/test.yaml
+++ b/e2e/js_image_oci/src/test.yaml
@@ -2,7 +2,7 @@ schemaVersion: 2.0.0
commandTests:
- name: 'smoke'
- command: 'bash'
+ command: '/usr/bin/bash'
args: ['/app/src/bin']
expectedOutput:
[
@@ -22,7 +22,8 @@ commandTests:
' SOURCE DIRECTORY CHECK true',
]
- name: 'smoke2'
- command: '/app/src/bin'
+ command: '/usr/bin/bash'
+ args: ['/app/src/bin']
expectedOutput:
[
'OS',
diff --git a/e2e/js_run_devserver/.bazelrc b/e2e/js_run_devserver/.bazelrc
index 413c99502..802938805 100644
--- a/e2e/js_run_devserver/.bazelrc
+++ b/e2e/js_run_devserver/.bazelrc
@@ -13,3 +13,7 @@ import %workspace%/../../.aspect/bazelrc/performance.bazelrc
# should be last statement in this config so the user configuration is able to overwrite flags from
# this file. See https://bazel.build/configure/best-practices#bazelrc-file.
try-import %workspace%/../../.aspect/bazelrc/user.bazelrc
+
+# An override of the performance.bazelrc setting
+# This is needed as Bazel fails to detect a new file when added during an iBazel execution
+build --build_runfile_links
\ No newline at end of file
diff --git a/e2e/npm_translate_lock/WORKSPACE b/e2e/npm_translate_lock/WORKSPACE
index f83410b68..8921e454d 100644
--- a/e2e/npm_translate_lock/WORKSPACE
+++ b/e2e/npm_translate_lock/WORKSPACE
@@ -16,6 +16,9 @@ load("@aspect_rules_js//npm:repositories.bzl", "npm_translate_lock")
npm_translate_lock(
name = "npm",
data = ["//:package.json"],
+ exclude_package_contents = {
+ "is-odd@3.0.1": ["**/README*"],
+ },
npmrc = "//:.npmrc",
pnpm_lock = "//:pnpm-lock.yaml",
update_pnpm_lock = True,
diff --git a/e2e/npm_translate_lock/snapshots/wksp/repositories.bzl b/e2e/npm_translate_lock/snapshots/wksp/repositories.bzl
index fe95ce8d3..deb5a2419 100644
--- a/e2e/npm_translate_lock/snapshots/wksp/repositories.bzl
+++ b/e2e/npm_translate_lock/snapshots/wksp/repositories.bzl
@@ -565,6 +565,7 @@ def npm_repositories():
"is-number": ["6.0.0"],
"is-odd": ["3.0.1"],
},
+ exclude_package_contents = ["**/README*"],
)
npm_import(
diff --git a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
index aa8978d52..0d10d069b 100644
--- a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
+++ b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl
@@ -32,7 +32,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "@aspect-test/c",
version = "2.0.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -43,7 +42,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~npm__at_aspect-test_c__2.0.0//:pkg",
package = "@aspect-test/c",
version = "2.0.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -55,7 +53,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~npm__at_aspect-test_c__2.0.0//:pkg",
package = "@aspect-test/c",
version = "2.0.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel b/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel
index e895be1da..29996dd54 100644
--- a/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel
+++ b/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel
@@ -4,7 +4,7 @@ npm_link_all_packages(name = "node_modules")
sh_test(
name = "test_sh",
- srcs = ["is-odd-exclude-test.sh"],
+ srcs = ["exclude-test.sh"],
data = [
":node_modules/is-odd",
],
diff --git a/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel b/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel
index e64d82039..481109977 100644
--- a/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel
+++ b/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel
@@ -17,7 +17,11 @@ npm.npm_translate_lock(
name = "npm",
data = ["//:package.json"],
exclude_package_contents = {
- "is-odd@3.0.1": ["**/README*"],
+ "is-odd@3.0.1": [
+ "**/README*",
+ "",
+ "**/LICENSE*",
+ ],
},
npmrc = "//:.npmrc",
pnpm_lock = "//:pnpm-lock.yaml",
diff --git a/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE
index 5ea667491..1f4df40f6 100644
--- a/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE
+++ b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE
@@ -16,7 +16,11 @@ load("@aspect_rules_js//npm:repositories.bzl", "npm_translate_lock")
npm_translate_lock(
name = "npm",
exclude_package_contents = {
- "is-odd@3.0.1": ["**/README*"],
+ "is-odd@3.0.1": [
+ "**/README*",
+ "",
+ "**/LICENSE*",
+ ],
},
npmrc = "//:.npmrc",
pnpm_lock = "//:pnpm-lock.yaml",
diff --git a/e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh b/e2e/npm_translate_lock_exclude_package_contents/exclude-test.sh
similarity index 76%
rename from e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh
rename to e2e/npm_translate_lock_exclude_package_contents/exclude-test.sh
index 629ea9164..06e8eb2c5 100755
--- a/e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh
+++ b/e2e/npm_translate_lock_exclude_package_contents/exclude-test.sh
@@ -21,4 +21,10 @@ if ls "$TARGET_DIR"/README* >/dev/null 2>&1; then
exit 1
fi
+# Check if any LICENSE file exists
+if ls "$TARGET_DIR"/LICENSE* >/dev/null 2>&1; then
+ echo "Error: LICENSE file found in $TARGET_DIR, exclusion did not work."
+ exit 1
+fi
+
echo "All tests passed"
diff --git a/e2e/npm_translate_lock_git+ssh/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= b/e2e/npm_translate_lock_git+ssh/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
index 0519715b8..c11598465 100755
--- a/e2e/npm_translate_lock_git+ssh/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
+++ b/e2e/npm_translate_lock_git+ssh/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=
@@ -1,6 +1,6 @@
# @generated
-# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "//:pnpm-lock.yaml").
+# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@@//:pnpm-lock.yaml").
# This file should be checked into version control along with the pnpm-lock.yaml file.
.npmrc=664934919
-package.json=-1742353198
-pnpm-lock.yaml=-43506523
+package.json=-410028920
+pnpm-lock.yaml=-462092313
diff --git a/e2e/npm_translate_lock_git+ssh/package.json b/e2e/npm_translate_lock_git+ssh/package.json
index 1a4a08412..021d5d0c6 100644
--- a/e2e/npm_translate_lock_git+ssh/package.json
+++ b/e2e/npm_translate_lock_git+ssh/package.json
@@ -1,6 +1,6 @@
{
"private": true,
"dependencies": {
- "@aspect-test/test-private-npm-package": "git+ssh://git@github.com:aspect-build/test-private-npm-package#a09b6c1084c15c0dcd230a7017aefee66e6bb9db"
+ "@aspect-test/test-private-npm-package": "git+ssh://git@github.com:aspect-test/test-private-npm-package#a09b6c1084c15c0dcd230a7017aefee66e6bb9db"
}
}
diff --git a/e2e/npm_translate_lock_git+ssh/pnpm-lock.yaml b/e2e/npm_translate_lock_git+ssh/pnpm-lock.yaml
index 66bff4ae9..4b9ff1bd5 100644
--- a/e2e/npm_translate_lock_git+ssh/pnpm-lock.yaml
+++ b/e2e/npm_translate_lock_git+ssh/pnpm-lock.yaml
@@ -6,13 +6,13 @@ settings:
dependencies:
'@aspect-test/test-private-npm-package':
- specifier: git+ssh://git@github.com:aspect-build/test-private-npm-package#a09b6c1084c15c0dcd230a7017aefee66e6bb9db
- version: git@github.com+aspect-build/test-private-npm-package/a09b6c1084c15c0dcd230a7017aefee66e6bb9db
+ specifier: git+ssh://git@github.com:aspect-test/test-private-npm-package#a09b6c1084c15c0dcd230a7017aefee66e6bb9db
+ version: git/github.com+aspect-test/test-private-npm-package/a09b6c1084c15c0dcd230a7017aefee66e6bb9db
packages:
- git@github.com+aspect-build/test-private-npm-package/a09b6c1084c15c0dcd230a7017aefee66e6bb9db:
- resolution: {commit: a09b6c1084c15c0dcd230a7017aefee66e6bb9db, repo: git@github.com:aspect-build/test-private-npm-package.git, type: git}
+ git/github.com+aspect-test/test-private-npm-package/a09b6c1084c15c0dcd230a7017aefee66e6bb9db:
+ resolution: {commit: a09b6c1084c15c0dcd230a7017aefee66e6bb9db, repo: git@github.com:aspect-test/test-private-npm-package.git, type: git}
name: '@aspect-test/test-private-npm-package'
version: 1.0.0
dev: false
diff --git a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
index 0cd71b68f..ff6615a79 100644
--- a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
index 0cd71b68f..ff6615a79 100644
--- a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
index 0cd71b68f..ff6615a79 100644
--- a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
index 0cd71b68f..ff6615a79 100644
--- a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
+++ b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg",
package = "rollup",
version = "2.14.0",
- exclude_package_contents = [],
dev = False,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/e2e/repo_mapping/BUILD.bazel b/e2e/repo_mapping/BUILD.bazel
index b09cee261..404bb6bc5 100644
--- a/e2e/repo_mapping/BUILD.bazel
+++ b/e2e/repo_mapping/BUILD.bazel
@@ -1,9 +1,16 @@
+load("@aspect_bazel_lib//lib:output_files.bzl", "output_files")
load("@bazel_skylib//rules:build_test.bzl", "build_test")
load("@npm//:defs.bzl", "npm_link_all_packages")
+load("@npm__uvu__0.5.6__links//:defs.bzl", npm_link_types_node = "npm_link_imported_package")
load("@rules_js-repo_name//js:defs.bzl", "js_test")
-load("@rules_js-repo_name//npm:defs.bzl", "npm_package")
+load("@rules_js-repo_name//npm:defs.bzl", "npm_link_package", "npm_package")
-npm_link_all_packages(name = "node_modules")
+npm_link_all_packages(
+ name = "node_modules",
+ imported_links = [
+ npm_link_types_node,
+ ],
+)
js_test(
name = "test",
@@ -23,3 +30,24 @@ build_test(
":npm-pkg",
],
)
+
+npm_link_package(
+ name = "node_modules/@e2e/lib",
+ src = "//lib:lib_pkg",
+ package = "@e2e/lib",
+)
+
+output_files(
+ name = "e2e/lib-package_store_entry",
+ paths = [
+ "node_modules/.aspect_rules_js/@e2e+lib@0.0.0/node_modules/@e2e/lib",
+ ],
+ target = ":node_modules/@e2e/lib",
+)
+
+build_test(
+ name = "package_store_targets_test",
+ targets = [
+ ":e2e/lib-package_store_entry",
+ ],
+)
diff --git a/e2e/repo_mapping/MODULE.bazel b/e2e/repo_mapping/MODULE.bazel
index aa9a9a6bc..4e6a10a0d 100644
--- a/e2e/repo_mapping/MODULE.bazel
+++ b/e2e/repo_mapping/MODULE.bazel
@@ -24,4 +24,11 @@ npm.npm_translate_lock(
pnpm_lock = "//:pnpm-lock.yaml",
verify_node_modules_ignored = "//:.bazelignore",
)
+npm.npm_import(
+ name = "npm__uvu__0.5.6",
+ package = "uvu",
+ version = "0.5.6",
+)
+use_repo(npm, "npm__uvu__0.5.6")
+use_repo(npm, "npm__uvu__0.5.6__links")
use_repo(npm, "npm")
diff --git a/e2e/repo_mapping/lib/BUILD.bazel b/e2e/repo_mapping/lib/BUILD.bazel
new file mode 100644
index 000000000..1b7a605bb
--- /dev/null
+++ b/e2e/repo_mapping/lib/BUILD.bazel
@@ -0,0 +1,15 @@
+load("@rules_js-repo_name//js:defs.bzl", "js_library")
+
+js_library(
+ name = "lib_pkg",
+ srcs = [
+ "index.js",
+ "package.json",
+ ],
+ visibility = ["//visibility:public"],
+ deps = [
+ # uvu is a runtime dependency of this package and should be linked into its direct dependencies
+ # by the downstream npm_link_package
+ "//:node_modules/uvu",
+ ],
+)
diff --git a/e2e/repo_mapping/lib/index.js b/e2e/repo_mapping/lib/index.js
new file mode 100644
index 000000000..b4ea6934d
--- /dev/null
+++ b/e2e/repo_mapping/lib/index.js
@@ -0,0 +1,9 @@
+const packageJson = require('./package.json')
+const assert = require('uvu/assert')
+assert.is(2 + 2, 4)
+module.exports = {
+ id: () =>
+ `${packageJson.name}@${
+ packageJson.version ? packageJson.version : '0.0.0'
+ }`,
+}
diff --git a/e2e/repo_mapping/lib/package.json b/e2e/repo_mapping/lib/package.json
new file mode 100644
index 000000000..421f59696
--- /dev/null
+++ b/e2e/repo_mapping/lib/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@e2e/lib",
+ "private": true
+}
diff --git a/examples/js_binary/BUILD.bazel b/examples/js_binary/BUILD.bazel
index 9501f365b..6e0a6be68 100644
--- a/examples/js_binary/BUILD.bazel
+++ b/examples/js_binary/BUILD.bazel
@@ -176,6 +176,12 @@ js_run_binary(
"@mycorp/pkg-a",
],
chdir = package_name(),
+ # This specifically tests that a `select` can be used when setting `env`.
+ env = select({
+ "//conditions:default": {
+ "NODE_ENV": "production",
+ },
+ }),
out_dirs = ["out4-dist"],
tool = ":bin4",
)
@@ -200,6 +206,12 @@ js_run_binary(
"@mycorp/pkg-b",
],
chdir = package_name(),
+ # This specifically tests that a `select` and `|` operator can be used when setting `env`.
+ env = {} | select({
+ "//conditions:default": {
+ "NODE_ENV": "production",
+ },
+ }),
tool = ":bin4",
)
diff --git a/js/private/BUILD.bazel b/js/private/BUILD.bazel
index b8ddfc468..16a896295 100644
--- a/js/private/BUILD.bazel
+++ b/js/private/BUILD.bazel
@@ -2,9 +2,7 @@
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("@aspect_bazel_lib//lib:utils.bzl", bazel_lib_utils = "utils")
-load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files")
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-load("//js:defs.bzl", "js_binary")
exports_files(
glob(["*.bzl"]),
@@ -17,18 +15,9 @@ exports_files([
"node_wrapper.sh",
"npm_wrapper.bat",
"npm_wrapper.sh",
+ "js_image_layer.mjs",
])
-bzl_library(
- name = "dev_deps",
- srcs = ["dev_deps.bzl"],
- visibility = ["//visibility:public"],
- deps = [
- "@bazel_tools//tools/build_defs/repo:http.bzl",
- "@bazel_tools//tools/build_defs/repo:utils.bzl",
- ] + (["@bazel_tools//tools/build_defs/repo:cache.bzl"] if bazel_lib_utils.is_bazel_7_or_greater() else []),
-)
-
bzl_library(
name = "js_info_files",
srcs = ["js_info_files.bzl"],
@@ -140,8 +129,7 @@ bzl_library(
"//js:__subpackages__",
],
deps = [
- "@aspect_bazel_lib//lib:paths",
- "@aspect_bazel_lib//lib:utils",
+ "@aspect_bazel_lib//lib:tar",
"@bazel_skylib//lib:paths",
] + (["@bazel_tools//tools/build_defs/repo:cache.bzl"] if bazel_lib_utils.is_bazel_7_or_greater() else []),
)
@@ -151,16 +139,3 @@ copy_to_bin(
srcs = ["js_run_devserver.mjs"],
visibility = ["//visibility:public"],
)
-
-write_source_files(
- name = "js_image_layer_checked",
- files = {
- "js_image_layer.mjs": "//js/private/image:image.mjs",
- },
-)
-
-js_binary(
- name = "js_image_layer_builder",
- entry_point = "js_image_layer.mjs",
- visibility = ["//visibility:public"],
-)
diff --git a/js/private/dev_deps.bzl b/js/private/dev_deps.bzl
deleted file mode 100644
index 00ae45e08..000000000
--- a/js/private/dev_deps.bzl
+++ /dev/null
@@ -1,93 +0,0 @@
-"""Our "development" dependencies
-
-Users should *not* need to install these. If users see a load()
-statement from these, that's a bug in our distribution.
-"""
-
-# buildifier: disable=bzl-visibility
-load("//js/private:maybe.bzl", http_archive = "maybe_http_archive")
-
-def rules_js_dev_dependencies():
- "Fetch repositories used for developing the rules"
- http_archive(
- name = "bazel_skylib",
- sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f",
- urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz"],
- )
-
- http_archive(
- name = "io_bazel_stardoc",
- sha256 = "62bd2e60216b7a6fec3ac79341aa201e0956477e7c8f6ccc286f279ad1d96432",
- urls = ["https://github.com/bazelbuild/stardoc/releases/download/0.6.2/stardoc-0.6.2.tar.gz"],
- )
-
- http_archive(
- name = "bazel_features",
- sha256 = "2cd9e57d4c38675d321731d65c15258f3a66438ad531ae09cb8bb14217dc8572",
- strip_prefix = "bazel_features-1.11.0",
- url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.11.0/bazel_features-v1.11.0.tar.gz",
- )
-
- http_archive(
- name = "buildifier_prebuilt",
- sha256 = "5dbf72e4f93917edfb91f53958d6289736adb845b2b89dbfb9bfc199a492030c",
- strip_prefix = "buildifier-prebuilt-8.0.1",
- urls = ["http://github.com/keith/buildifier-prebuilt/archive/8.0.1.tar.gz"],
- )
-
- http_archive(
- name = "aspect_rules_lint",
- sha256 = "f60e4a737a5e09402f5fa3bd182efa80dac5523ca4b9bc5c6fa8c06fbfb46630",
- strip_prefix = "rules_lint-1.1.0",
- url = "https://github.com/aspect-build/rules_lint/releases/download/v1.1.0/rules_lint-v1.1.0.tar.gz",
- )
-
- http_archive(
- name = "com_grail_bazel_toolchain",
- sha256 = "a9fc7cf01d0ea0a935bd9e3674dd3103766db77dfc6aafcb447a7ddd6ca24a78",
- strip_prefix = "toolchains_llvm-c65ef7a45907016a754e5bf5bfabac76eb702fd3",
- urls = ["https://github.com/bazel-contrib/toolchains_llvm/archive/c65ef7a45907016a754e5bf5bfabac76eb702fd3.tar.gz"],
- )
-
- http_archive(
- name = "org_chromium_sysroot_linux_arm64",
- build_file_content = _SYSROOT_LINUX_BUILD_FILE,
- sha256 = "cf2fefded0449f06d3cf634bfa94ffed60dbe47f2a14d2900b00eb9bcfb104b8",
- urls = ["https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/80fc74e431f37f590d0c85f16a9d8709088929e8/debian_bullseye_arm64_sysroot.tar.xz"],
- )
-
- http_archive(
- name = "org_chromium_sysroot_linux_x86_64",
- build_file_content = _SYSROOT_LINUX_BUILD_FILE,
- sha256 = "04b94ba1098b71f8543cb0ba6c36a6ea2890d4d417b04a08b907d96b38a48574",
- urls = ["https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/f5f68713249b52b35db9e08f67184cac392369ab/debian_bullseye_amd64_sysroot.tar.xz"],
- )
-
- http_archive(
- name = "sysroot_darwin_universal",
- build_file_content = _SYSROOT_DARWIN_BUILD_FILE,
- # The ruby header has an infinite symlink that we need to remove.
- patch_cmds = ["rm System/Library/Frameworks/Ruby.framework/Versions/Current/Headers/ruby/ruby"],
- sha256 = "71ae00a90be7a8c382179014969cec30d50e6e627570af283fbe52132958daaf",
- strip_prefix = "MacOSX11.3.sdk",
- urls = ["https://s3.us-east-2.amazonaws.com/static.aspect.build/sysroots/MacOSX11.3.sdk.tar.xz"],
- )
-
-_SYSROOT_LINUX_BUILD_FILE = """
-filegroup(
- name = "sysroot",
- srcs = glob(["*/**"]),
- visibility = ["//visibility:public"],
-)
-"""
-
-_SYSROOT_DARWIN_BUILD_FILE = """
-filegroup(
- name = "sysroot",
- srcs = glob(
- include = ["**"],
- exclude = ["**/*:*"],
- ),
- visibility = ["//visibility:public"],
-)
-"""
diff --git a/js/private/image/BUILD.bazel b/js/private/image/BUILD.bazel
deleted file mode 100644
index 4828c84f1..000000000
--- a/js/private/image/BUILD.bazel
+++ /dev/null
@@ -1,32 +0,0 @@
-load("@npm//:defs.bzl", "npm_link_all_packages")
-load("@npm//js/private/image:rollup/package_json.bzl", rollup_bin = "bin")
-
-npm_link_all_packages(name = "node_modules")
-
-rollup_bin.rollup(
- name = "bundle",
- srcs = [
- "index.ts",
- "rollup.config.js",
- ":node_modules/@rollup/plugin-commonjs",
- ":node_modules/@rollup/plugin-node-resolve",
- ":node_modules/@rollup/plugin-typescript",
- ":node_modules/@types/node",
- ":node_modules/@types/tar-stream",
- ":node_modules/tar-stream",
- ],
- outs = [
- "image.mjs",
- ],
- args = [
- "index.ts",
- "--config",
- "rollup.config.js",
- "--format",
- "es",
- "--file",
- "image.mjs",
- ],
- chdir = package_name(),
- visibility = ["//js/private:__pkg__"],
-)
diff --git a/js/private/image/README.md b/js/private/image/README.md
deleted file mode 100644
index 0f60e2ffc..000000000
--- a/js/private/image/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# js_image_layer faq
-
-## why js_image_layer isn't like nodejs_image from rules_docker
-
-That would require rules_js to take rules_docker as a dependency which would be not ideal given that rules_docker is in maintenance mode and [other](https://github.com/bazel-contrib/rules_oci) rulesets exists.
-So instead of being full-fledged js_image rule that is specific to one container building ruleset, it tries to be not opinionated and work with any ruleset out there.
-
-## why use custom builder script instead of using pkg_tar
-
-There are two reasons why js_image_layer doesn't use pkg_tar.
-
-1. It's a python dependency which we'd like to avoid
-2. It doesn't work very well with `ctx.actions.symlink`. We needed to maintain a [patch](https://github.com/bazelbuild/rules_pkg/issues/115) to make it work with rules_js which is specific to rules_js and can't be pushed upstream.
-
-Apart from that, `pkg_tar` is general and has more than needed here. maintaining 150LOC code is much easier than dealing with version skews and breaking changes in rules_pkg.
-
-## why check-in the image builder as minified javascript
-
-There are number of reasons for this. Most significant one is not transpiling from `ts` to `js` anytime there is a cache miss on userland or at all for that matter. next one is convenience running `.js` files directly without fetching necessary toolchain to fetch dependencies and transpilers just to run a `.ts` file.
diff --git a/js/private/image/index.ts b/js/private/image/index.ts
deleted file mode 100644
index 3395acf86..000000000
--- a/js/private/image/index.ts
+++ /dev/null
@@ -1,388 +0,0 @@
-import { createReadStream, createWriteStream } from 'node:fs'
-import { readdir, readFile, readlink, stat } from 'node:fs/promises'
-import * as path from 'node:path'
-import { Readable, Stream } from 'node:stream'
-import { pathToFileURL } from 'node:url'
-import { createGzip } from 'node:zlib'
-import { pack, Pack } from 'tar-stream'
-
-const MTIME = new Date(0)
-const MODE_FOR_DIR = 0o755
-const MODE_FOR_FILE = 0o555
-const MODE_FOR_SYMLINK = 0o775
-
-type HermeticStat = {
- mtime: Date
- mode: number
- size?: number
-}
-
-type Owner = {
- gid: number
- uid: number
-}
-
-type Entry = {
- is_source: boolean
- is_directory: boolean
- is_external: boolean
- dest: string
- root?: string
- remove_non_hermetic_lines?: boolean
-}
-type Entries = { [path: string]: Entry }
-
-type Compression = 'gzip' | 'none'
-
-function findKeyByValue(entries: Entries, value: string): string | undefined {
- for (const [key, { dest: val }] of Object.entries(entries)) {
- // Check for exact match
- if (val == value) {
- return key
- }
- // Check matching parent directory (https://stackoverflow.com/a/45242825).
- // For example, if `value` is a parent directory of `val`:
- //
- // value = bazel-out/darwin_arm64-fastbuild-ST-1072e68bc32d/bin/pkg/b
- // val = bazel-out/darwin_arm64-fastbuild-ST-1072e68bc32d/bin/pkg/b/index.js
- //
- // then relative is `index.js` and `/index.js` is stripped from `key`:
- //
- // key = /app/src/bin.runfiles/_main/pkg/b/index.js
- //
- // which returns `/app/src/bin.runfiles/_main/pkg/b`
- const relative = path.relative(value, val)
- if (
- relative &&
- !relative.startsWith('..') &&
- !path.isAbsolute(relative) &&
- key.length > relative.length + 1
- ) {
- return key.substring(0, key.length - relative.length - 1)
- }
- }
- return undefined
-}
-
-async function readlinkSafe(p: string) {
- try {
- const link = await readlink(p)
- return path.resolve(path.dirname(p), link)
- } catch (e) {
- if (e.code == 'EINVAL') {
- return p
- }
- if (e.code == 'ENOENT') {
- // That is as far as we can follow this symlink in this layer so we can only
- // assume the file exists in another layer
- return p
- }
- throw e
- }
-}
-
-async function resolveSymlink(p: string) {
- let prevHop = path.resolve(p)
- let hopped = false
-
- while (true) {
- // /output-base/sandbox/4/execroot/wksp/bazel-out
- // /output-base/execroot/wksp/bazel-out
- let nextHop = await readlinkSafe(prevHop)
- if (!nextHop.startsWith(process.env.JS_BINARY__EXECROOT!)) {
- return hopped ? prevHop : undefined
- }
- if (nextHop != prevHop) {
- prevHop = nextHop
- hopped = true
- } else if (!hopped) {
- return undefined
- } else {
- return nextHop
- }
- }
-}
-
-async function* walk(dir: string, accumulate = '') {
- const dirents = await readdir(dir, { withFileTypes: true })
- for (const dirent of dirents) {
- let isDirectory = dirent.isDirectory()
-
- if (
- dirent.isSymbolicLink() &&
- !dirent.isDirectory() &&
- !dirent.isFile()
- ) {
- // On OSX we sometimes encounter this bug: https://github.com/nodejs/node/issues/30646
- // The entry is apparently a symlink, but it's ambiguous whether it's a symlink to a
- // file or to a directory, and lstat doesn't tell us either. Determine the type by
- // attempting to read it as a directory.
-
- try {
- await readdir(path.join(dir, dirent.name))
- isDirectory = true
- } catch (error) {
- if (error.code === 'ENOTDIR') {
- isDirectory = false
- } else {
- throw error
- }
- }
- }
-
- if (isDirectory) {
- yield* walk(
- path.join(dir, dirent.name),
- path.join(accumulate, dirent.name)
- )
- } else {
- yield path.join(accumulate, dirent.name)
- }
- }
-}
-
-function add_parents(
- name: string,
- pkg: Pack,
- existing_paths: Set,
- owner: Owner
-) {
- const segments = path.dirname(name).split('/')
- let prev = ''
- const stats: HermeticStat = {
- // this is an intermediate directory and bazel does not allow specifying
- // modes for intermediate directories.
- mode: MODE_FOR_DIR,
- mtime: MTIME,
- }
- for (const part of segments) {
- if (!part) {
- continue
- }
- prev = path.join(prev, part)
- // check if the directory has been has been created before.
- if (existing_paths.has(prev)) {
- continue
- }
-
- existing_paths.add(prev)
- add_directory(prev, pkg, owner, stats)
- }
-}
-
-function add_directory(
- name: string,
- pkg: Pack,
- owner: Owner,
- stats: HermeticStat
-) {
- pkg.entry({
- type: 'directory',
- name: name.replace(/^\//, ''),
- mode: stats.mode,
- mtime: MTIME,
- gid: owner.gid,
- uid: owner.uid,
- }).end()
-}
-
-function add_symlink(
- name: string,
- linkname: string,
- pkg: Pack,
- owner: Owner,
- stats: HermeticStat
-) {
- const link_parent = path.dirname(name)
- pkg.entry({
- type: 'symlink',
- name: name.replace(/^\//, ''),
- linkname: path.relative(link_parent, linkname),
- mode: stats.mode,
- mtime: MTIME,
- uid: owner.uid,
- gid: owner.gid,
- }).end()
-}
-
-function add_file(
- name: string,
- content: Readable,
- pkg: Pack,
- owner: Owner,
- stats: HermeticStat
-) {
- return new Promise((resolve, reject) => {
- const entry = pkg.entry(
- {
- type: 'file',
- name: name.replace(/^\//, ''),
- mode: stats.mode,
- size: stats.size,
- mtime: MTIME,
- uid: owner.uid,
- gid: owner.gid,
- },
- (err) => {
- if (err) {
- reject(err)
- } else {
- resolve(undefined)
- }
- }
- )
- content.pipe(entry)
- })
-}
-
-export async function build(
- allEntries: Entries,
- entries: Entries,
- outputPath: string,
- compression: Compression,
- owner: Owner
-) {
- const output = pack()
- const existing_paths = new Set()
-
- let write: Stream = output
- if (compression == 'gzip') {
- write = write.pipe(createGzip())
- }
- write.pipe(createWriteStream(outputPath))
-
- for (const key of Object.keys(entries).sort()) {
- const {
- dest,
- is_directory,
- is_source,
- is_external,
- root,
- remove_non_hermetic_lines,
- } = entries[key]
-
- // its a treeartifact. expand it and add individual entries.
- if (is_directory) {
- for await (const sub_key of walk(dest)) {
- const new_key = path.join(key, sub_key)
- const new_dest = path.join(dest, sub_key)
-
- add_parents(new_key, output, existing_paths, owner)
-
- const stats = await stat(new_dest)
- await add_file(
- new_key,
- createReadStream(new_dest),
- output,
- owner,
- stats
- )
- }
- continue
- }
-
- // create parents of current path.
- add_parents(key, output, existing_paths, owner)
-
- // A source file from workspace, not an output of a target.
- if (is_source) {
- const originalStat = await stat(dest)
- // use stable mode bits instead of preserving the one from file.
- const stats: HermeticStat = {
- mode: MODE_FOR_FILE,
- mtime: MTIME,
- size: originalStat.size,
- }
- await add_file(key, createReadStream(dest), output, owner, stats)
- continue
- }
-
- // root indicates where the generated source comes from. it looks like
- // `bazel-out/darwin_arm64-fastbuild` when there's no transition.
- if (!root) {
- // everything except sources should have
- throw new Error(
- `unexpected entry format. ${JSON.stringify(
- entries[key]
- )}. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose`
- )
- }
-
- const realp = await resolveSymlink(dest)
-
- // it's important that we don't treat any symlink pointing out of execroot since
- // bazel symlinks external files into sandbox to make them available to us.
- if (realp && !is_external) {
- const output_path = realp.slice(realp.indexOf(root))
- // interestingly, bazel 5 and 6 sets different mode bits on symlinks.
- // well use `0o755` to allow owner&group to `rwx` and others `rx`
- // see: https://chmodcommand.com/chmod-775/
- // const stats = await stat(dest)
- const stats: HermeticStat = { mode: MODE_FOR_SYMLINK, mtime: MTIME }
- // Look in all entries for symlinks since they may be in other layers
- const linkname = findKeyByValue(allEntries, output_path)
- if (linkname == undefined) {
- throw new Error(
- `Couldn't map symbolic link ${output_path} to a path. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose\n\n` +
- `dest: ${dest}\n` +
- `realpath: ${realp}\n` +
- `outputpath: ${output_path}\n` +
- `root: ${root}\n` +
- `runfiles: ${key}\n\n`
- )
- }
- add_symlink(key, linkname, output, owner, stats)
- } else {
- // Due to filesystems setting different bits depending on the os we have to opt-in
- // to use a stable mode for files.
- // In the future, we might want to hand off fine-grained control of these to users
- // see: https://chmodcommand.com/chmod-0555/
- const originalStat = await stat(dest)
- const stats: HermeticStat = {
- mode: MODE_FOR_FILE,
- mtime: MTIME,
- size: originalStat.size,
- }
- let stream: Readable = createReadStream(dest)
-
- if (remove_non_hermetic_lines) {
- const content = await readFile(dest)
- const replaced = Buffer.from(
- content
- .toString()
- .replace(
- /.*JS_BINARY__TARGET_CPU=".*?"/g,
- `export JS_BINARY__TARGET_CPU="$(uname -m)"`
- )
- .replace(
- /.*JS_BINARY__BINDIR=".*"/g,
- `export JS_BINARY__BINDIR="$(pwd)"`
- )
- )
- stream = Readable.from(replaced)
- stats.size = replaced.byteLength
- }
-
- await add_file(key, stream, output, owner, stats)
- }
- }
-
- output.finalize()
-}
-
-if (import.meta.url === pathToFileURL(process.argv[1]).href) {
- const [allEntriesPath, entriesPath, outputPath, compression, owner] =
- process.argv.slice(2)
- const rawAllEntries = await readFile(allEntriesPath)
- const allEntries: Entries = JSON.parse(rawAllEntries.toString())
- const rawEntries = await readFile(entriesPath)
- const entries: Entries = JSON.parse(rawEntries.toString())
- const [uid, gid] = owner.split(':').map(Number)
- build(
- allEntries,
- entries,
- outputPath,
- compression as Compression,
- { uid, gid } as Owner
- )
-}
diff --git a/js/private/image/package.json b/js/private/image/package.json
deleted file mode 100644
index 77b6934bc..000000000
--- a/js/private/image/package.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "dependencies": {
- "tar-stream": "3.0.0"
- },
- "devDependencies": {
- "rollup": "2.79.2",
- "@rollup/plugin-commonjs": "23.0.7",
- "@rollup/plugin-node-resolve": "15.3.0",
- "@rollup/plugin-typescript": "10.0.1",
- "@types/node": "18.19.54",
- "@types/tar-stream": "2.2.3",
- "@types/archiver": "5.3.4",
- "typescript": "4.9.5",
- "tslib": "2.7.0"
- }
-}
diff --git a/js/private/image/rollup.config.js b/js/private/image/rollup.config.js
deleted file mode 100644
index 84eea2287..000000000
--- a/js/private/image/rollup.config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import resolve from '@rollup/plugin-node-resolve'
-import commonjs from '@rollup/plugin-commonjs'
-import ts from '@rollup/plugin-typescript'
-
-/** @type {import("rollup").RollupOptions} */
-export default {
- plugins: [
- resolve(),
- commonjs(),
- ts({
- sourceMap: true,
- inlineSourceMap: true,
- target: 'es2022',
- }),
- ],
- output: {
- sourcemap: 'inline',
- },
-}
diff --git a/js/private/js_image_layer.bzl b/js/private/js_image_layer.bzl
index a0caa6b48..471ab9671 100644
--- a/js/private/js_image_layer.bzl
+++ b/js/private/js_image_layer.bzl
@@ -13,9 +13,17 @@ js_image_layer(
```
"""
-load("@aspect_bazel_lib//lib:paths.bzl", "to_rlocation_path")
+load("@aspect_bazel_lib//lib:tar.bzl", "tar_lib")
load("@bazel_skylib//lib:paths.bzl", "paths")
+_DEFAULT_LAYER_GROUPS = {
+ "node": "\\/js\\/private\\/node-patches\\/|\\/bin\\/nodejs\\/",
+ "package_store_1p": "\\.aspect_rules_js\\/.*@0\\.0\\.0\\/node_modules",
+ "package_store_3p": "\\.aspect_rules_js\\/.*\\/node_modules",
+ "node_modules": "\\/node_modules\\/",
+ "app": "", # empty means just match anything.
+}
+
_DOC = """Create container image layers from js_binary targets.
By design, js_image_layer doesn't have any preference over which rule assembles the container image.
@@ -254,210 +262,297 @@ container_image(
}),
)
```
+
+
+## Performance
+
+For better performance, it is recommended to split the large parts of a `js_binary` to have a separate layer.
+
+The matching order for layer groups is as follows:
+
+1. `layer_groups` are checked in order first
+2. If no match is found for `layer_groups`, the `default layer groups` are checked.
+3. Any remaining files are placed into the app layer.
+
+The default layer groups are as follows and always created.
+
+```
+{
+ "node": "\\/js\\/private\\/node-patches\\/|\\/bin\\/nodejs\\/",
+ "package_store_1p": "\\.aspect_rules_js\\/.*@0\\.0\\.0\\/node_modules",
+ "package_store_3p": "\\.aspect_rules_js\\/.*\\/node_modules",
+ "node_modules": "\\/node_modules\\/",
+ "app": "", # empty means just match anything.
+}
+```
+
"""
# BAZEL_BINDIR has to be set to '.' so that js_binary preserves the PWD when running inside container.
# See https://github.com/aspect-build/rules_js/tree/dbb5af0d2a9a2bb50e4cf4a96dbc582b27567155#running-nodejs-programs
# for why this is needed.
-_LAUNCHER_TMPL = """\
+_LAUNCHER_PREABMLE = """\
#!/usr/bin/env bash
-export BAZEL_BINDIR=.
-source {real_binary_path}
+
+export BAZEL_BINDIR="."
+
+# patched by js_image_layer for hermeticity
"""
-def _write_laucher(ctx, real_binary_path):
+def _write_laucher(ctx, real_binary):
"Creates a call-through shell entrypoint which sets BAZEL_BINDIR to '.' then immediately invokes the original entrypoint."
launcher = ctx.actions.declare_file("%s_launcher" % ctx.label.name)
- ctx.actions.write(
+
+ ctx.actions.expand_template(
+ template = real_binary,
output = launcher,
- content = _LAUNCHER_TMPL.format(real_binary_path = real_binary_path),
+ substitutions = {
+ "#!/usr/bin/env bash": _LAUNCHER_PREABMLE,
+ 'export JS_BINARY__BINDIR="%s"' % real_binary.root.path: 'export JS_BINARY__BINDIR="$(pwd)"',
+ 'export JS_BINARY__BINDIR="%s"' % ctx.bin_dir.path: 'export JS_BINARY__BINDIR="$(pwd)"',
+ 'export JS_BINARY__TARGET_CPU="%s"' % ctx.expand_make_variables("", "$(TARGET_CPU)", {}): 'export JS_BINARY__TARGET_CPU="$(uname -m)"',
+ },
is_executable = True,
)
return launcher
-def _runfile_path(ctx, file, runfiles_dir):
- return paths.join(runfiles_dir, to_rlocation_path(ctx, file))
-
-def _build_layer(ctx, type, all_entries_json, entries, inputs):
- if not entries and not ctx.attr.generate_empty_layers:
- return None
-
- entries_json = ctx.actions.declare_file("{}_{}_entries.json".format(ctx.label.name, type))
- ctx.actions.write(entries_json, content = json.encode(entries))
-
- extension = "tar.gz" if ctx.attr.compression == "gzip" else "tar"
- output = ctx.actions.declare_file("{name}_{type}.{extension}".format(name = ctx.label.name, type = type, extension = extension))
+def _run_splitter(ctx, runfiles_dir, files, entries_json, layer_groups):
+ ownersplit = ctx.attr.owner.split(":")
+ if len(ownersplit) != 2 or not ownersplit[0].isdigit() or not ownersplit[1].isdigit():
+ fail("owner attribute should be in `0:0` `int:int` format.")
- args = ctx.actions.args()
- args.add(all_entries_json)
- args.add(entries_json)
- args.add(output)
- args.add(ctx.attr.compression)
- args.add(ctx.attr.owner)
+ VARIABLES = ""
+ PICK_STATEMENTS = ""
+ WRITE_STATEMENTS = ""
+
+ splitter_outputs = []
+ expected_layer_groups = []
+
+ for name, match in layer_groups.items():
+ mtree = ctx.actions.declare_file("{}_{}.mtree".format(ctx.label.name, name))
+ unused_inputs = ctx.actions.declare_file("{}_{}_unused_inputs.txt".format(ctx.label.name, name))
+ splitter_outputs.extend([mtree, unused_inputs])
+ VARIABLES += """
+ const {name}mtree = new Set(["#mtree"]);
+ const {name}unusedinputs = createWriteStream("{}");
+""".format(unused_inputs.path, name = name)
+
+ STMT = "else if" if PICK_STATEMENTS != "" else "if"
+
+ IF_STMT = "%s (/%s/.test(key))" % (STMT, match)
+
+ # Empty match means, match anything, same as .* but faster.
+ if match == "":
+ IF_STMT = "%s (true)" % (STMT)
+
+ PICK_STATEMENTS += """
+%s {
+ mtree = %smtree;
+%s
+}
+ """ % (
+ IF_STMT,
+ name,
+ "\n".join([
+ " %sunusedinputs.write(destBuf);" % oname
+ for oname in layer_groups.keys()
+ if oname != name
+ ]),
+ )
+
+ WRITE_STATEMENTS += """writeFile("%s", Array.from(%smtree).sort().concat(["\\n"]).join("\\n")),\n""" % (mtree.path, name)
+
+ expected_layer_groups.append((name, mtree, unused_inputs))
+
+ unused_inputs = ctx.actions.declare_file("{}_splitter_unused_inputs.txt".format(ctx.label.name))
+ splitter_outputs.append(unused_inputs)
+
+ splitter = ctx.actions.declare_file("{}_js_image_layer_splitter.mjs".format(ctx.label.name))
+ ctx.actions.expand_template(
+ template = ctx.file._splitter,
+ output = splitter,
+ is_executable = True,
+ substitutions = {
+ "{{UID}}": ownersplit[0],
+ "{{GID}}": ownersplit[1],
+ "{{RUNFILES_DIR}}": runfiles_dir,
+ "{{REPO_NAME}}": ctx.workspace_name,
+ "{{ENTRIES}}": entries_json.path,
+ "{{PRESERVE_SYMLINKS}}": ctx.attr.preserve_symlinks,
+ "{{UNUSED_INPUTS}}": unused_inputs.path,
+ "/*{{VARIABLES}}*/": VARIABLES,
+ "/*{{PICK_STATEMENTS}}*/": PICK_STATEMENTS,
+ "/*{{WRITE_STATEMENTS}}*/": WRITE_STATEMENTS,
+ },
+ )
+ inputs = depset(
+ [entries_json, splitter],
+ transitive = [files],
+ )
+ nodeinfo = ctx.toolchains["@rules_nodejs//nodejs:toolchain_type"].nodeinfo
ctx.actions.run(
- inputs = inputs + [all_entries_json, entries_json],
- outputs = [output],
- arguments = [args],
- executable = ctx.executable._builder,
- progress_message = "JsImageLayer %{label}",
- mnemonic = "JsImageLayer",
- env = {
- "BAZEL_BINDIR": ".",
- },
+ inputs = inputs,
+ arguments = [splitter.path],
+ unused_inputs_list = unused_inputs,
+ outputs = splitter_outputs,
+ executable = nodeinfo.node,
+ progress_message = "Computing Layer Groups %{label}",
+ mnemonic = "JsImageLayerGroups",
+ toolchain = "@rules_nodejs//nodejs:toolchain_type",
)
- return output
-
-def _select_layer(layers, destination, file):
- is_node = file.owner.repo_name != "" and "/bin/nodejs/" in destination
- is_js_patches = "/js/private/node-patches" in destination
- if is_node or is_js_patches:
- return layers.node
- is_package_store = "/.aspect_rules_js/" in destination
- if is_package_store:
- is_1p_dep = "@0.0.0/node_modules/" in destination
- if is_1p_dep:
- return layers.package_store_1p
- else:
- return layers.package_store_3p
- is_node_modules = "/node_modules/" in destination
- if is_node_modules:
- return layers.node_modules
- return layers.app
+ return expected_layer_groups
+
+# This function exactly same as the one from "@aspect_bazel_lib//lib:paths.bzl"
+# except that it takes workspace_name directly instead of the ctx object.
+# Reason is the performance of Args.add_all closures where we use this function.
+# https://bazel.build/rules/lib/builtins/Args#add_all `allow_closure` explains this.
+def _to_rlocation_path(file, workspace):
+ if file.short_path.startswith("../"):
+ return file.short_path[3:]
+ return workspace + "/" + file.short_path
def _repo_mapping_manifest(files_to_run):
return getattr(files_to_run, "repo_mapping_manifest", None)
+_ENTRY = '"%s":{"dest":%s,"root":"%s","is_external":%s,"is_source":%s,"is_directory":%s,"repo_name":"%s"},\n%s:"%s"'
+
def _js_image_layer_impl(ctx):
+ if ctx.attr.generate_empty_layers:
+ # buildifier: disable=print
+ print("The `generate_empty_layers` attribute is deprecated and will be removed in the next major release. Its behavior is now implicitly `True`")
if len(ctx.attr.binary) != 1:
fail("binary attribute has more than one transition")
- ownersplit = ctx.attr.owner.split(":")
- if len(ownersplit) != 2 or not ownersplit[0].isdigit() or not ownersplit[1].isdigit():
- fail("owner attribute should be in `0:0` `int:int` format.")
-
binary_default_info = ctx.attr.binary[0][DefaultInfo]
binary_label = ctx.attr.binary[0].label
- binary_path = paths.join(ctx.attr.root, binary_label.package, binary_label.name)
+ binary_path = "." + paths.join(ctx.attr.root, binary_label.package, binary_label.name)
runfiles_dir = binary_path + ".runfiles"
- real_binary_path = _runfile_path(ctx, binary_default_info.files_to_run.executable, runfiles_dir)
- launcher = _write_laucher(ctx, real_binary_path)
+ launcher = _write_laucher(ctx, binary_default_info.files_to_run.executable)
repo_mapping = _repo_mapping_manifest(binary_default_info.files_to_run)
- all_files = depset(
- [repo_mapping] if repo_mapping else [],
+ runfiles_plus_files = depset(
transitive = [binary_default_info.files, binary_default_info.default_runfiles.files],
)
- all_entries = {}
- layers = struct(
- node = struct(
- entries = {},
- inputs = [],
- ),
- package_store_3p = struct(
- entries = {},
- inputs = [],
- ),
- package_store_1p = struct(
- entries = {},
- inputs = [],
- ),
- node_modules = struct(
- entries = {},
- inputs = [],
- ),
- app = struct(
- entries = {binary_path: {"dest": launcher.path, "root": launcher.root.path}},
- inputs = [launcher],
- ),
+ # copy workspace name here just in case to prevent ctx to be transferred to execution phase.
+ workspace_name = str(ctx.workspace_name)
+
+ # be careful about what you access outside of the function closure. accessing objects
+ # such as ctx within this function will make it significantly slower.
+ def map_entry(f, _):
+ runfiles_dest = runfiles_dir + "/" + _to_rlocation_path(f, workspace_name)
+ path = json.encode(f.path)
+ return _ENTRY % (
+ runfiles_dest,
+ path,
+ f.root.path,
+ "true" if f.owner.repo_name != "" else "false",
+ "true" if f.is_source else "false",
+ "true" if f.is_directory else "false",
+ f.owner.repo_name,
+ # To avoid O(N ^ N) complexity when searching for entries by their destination
+ # the map also has to have entries by their path on bazel-out,
+ path,
+ runfiles_dest,
+ )
+
+ entries = ctx.actions.args()
+ entries.set_param_file_format("multiline")
+
+ entries.add("{")
+ entries.add_joined(
+ [binary_path, {"dest": launcher.path, "root": launcher.root.path}],
+ join_with = ":",
+ map_each = json.encode,
)
-
- for file in all_files.to_list():
- destination = _runfile_path(ctx, file, runfiles_dir)
- entry = {
- "dest": file.path,
- "root": file.root.path,
- "is_external": file.owner.repo_name != "",
- "is_source": file.is_source,
- "is_directory": file.is_directory,
- }
- if destination == real_binary_path:
- entry["remove_non_hermetic_lines"] = True
-
- all_entries[destination] = entry
-
- layer = _select_layer(layers, destination, file)
- layer.entries[destination] = entry
- layer.inputs.append(file)
-
- if repo_mapping:
- destination = paths.join(runfiles_dir, "_repo_mapping")
- entry = {
- "dest": repo_mapping.path,
- "root": repo_mapping.root.path,
- }
- all_entries[destination] = entry
- layers.app.entries[destination] = entry
-
- all_entries_json = ctx.actions.declare_file("{}_all_entries.json".format(ctx.label.name))
- ctx.actions.write(all_entries_json, content = json.encode(all_entries))
-
- node = _build_layer(
- ctx,
- type = "node",
- all_entries_json = all_entries_json,
- entries = layers.node.entries,
- inputs = layers.node.inputs,
- )
- package_store_3p = _build_layer(
- ctx,
- type = "package_store_3p",
- all_entries_json = all_entries_json,
- entries = layers.package_store_3p.entries,
- inputs = layers.package_store_3p.inputs,
- )
- package_store_1p = _build_layer(
- ctx,
- type = "package_store_1p",
- all_entries_json = all_entries_json,
- entries = layers.package_store_1p.entries,
- inputs = layers.package_store_1p.inputs,
- )
- node_modules = _build_layer(
- ctx,
- type = "node_modules",
- all_entries_json = all_entries_json,
- entries = layers.node_modules.entries,
- inputs = layers.node_modules.inputs,
+ entries.add_all(
+ runfiles_plus_files,
+ expand_directories = False,
+ map_each = map_entry,
+ allow_closure = True,
+ before_each = ",",
)
- app = _build_layer(
- ctx,
- type = "app",
- all_entries_json = all_entries_json,
- entries = layers.app.entries,
- inputs = layers.app.inputs,
+ entries.add(",")
+
+ # shell launcher generated by js_binary contains non-reproducible information swap it out with the sanitized one.
+ binary_path_under_runfiles = runfiles_dir + "/" + _to_rlocation_path(binary_default_info.files_to_run.executable, workspace_name)
+ entries.add_joined(
+ [binary_path_under_runfiles, {"dest": launcher.path, "root": launcher.root.path}],
+ join_with = ":",
+ map_each = json.encode,
)
+ if repo_mapping:
+ entries.add(",")
+ entries.add_joined(
+ [runfiles_dir + "/" + "_repo_mapping", {"dest": repo_mapping.path, "root": repo_mapping.root.path}],
+ join_with = ":",
+ map_each = json.encode,
+ )
+ entries.add("}")
+
+ entries_json = ctx.actions.declare_file("{}_entries.json".format(ctx.label.name))
+ ctx.actions.write(entries_json, content = entries)
+
+ # Ordering of these matter.
+ layer_groups = dict()
+ for key in ctx.attr.layer_groups:
+ # Only add if the key is not in the default layer groups since we already handled the collision below.
+ if key not in _DEFAULT_LAYER_GROUPS:
+ layer_groups[key] = ctx.attr.layer_groups[key]
+
+ for key, value in _DEFAULT_LAYER_GROUPS.items():
+ # if the key is provided by the user, use it, otherwise use the default.
+ if key in ctx.attr.layer_groups:
+ layer_groups[key] = ctx.attr.layer_groups[key]
+ else:
+ layer_groups[key] = value
+
+ layer_groups_gen = _run_splitter(ctx, runfiles_dir, runfiles_plus_files, entries_json, layer_groups)
+
+ tarinfo = ctx.toolchains[tar_lib.toolchain_type].tarinfo
+
+ outputs = []
+ output_groups = dict()
+ compress = "" if ctx.attr.compression == "none" else ctx.attr.compression
+ for typ, mtree, unused_inputs in layer_groups_gen:
+ ext = tar_lib.common.compression_to_extension[compress] if compress else ""
+ output = ctx.actions.declare_file("%s_%s%s" % (ctx.label.name, typ, ext))
+
+ # add the layer group to outputgroupinfo and defaultinfo
+ outputs.append(output)
+ output_groups[typ] = depset([output])
+
+ args = ctx.actions.args()
+ args.add("--create")
+ args.add("--file")
+ args.add(output)
+ tar_lib.common.add_compression_args(compress, args)
+ args.add(mtree, format = "@%s")
+
+ ctx.actions.run(
+ inputs = depset(
+ ([repo_mapping] if repo_mapping else []) + [entries_json, launcher, mtree, unused_inputs],
+ transitive = [runfiles_plus_files],
+ ),
+ arguments = [args],
+ executable = tarinfo.binary,
+ unused_inputs_list = unused_inputs,
+ env = tarinfo.default_env,
+ outputs = [output],
+ mnemonic = "JsImageLayer",
+ progress_message = "JsImageLayer " + typ + " %{label}",
+ toolchain = "@aspect_bazel_lib//lib:tar_toolchain_type",
+ )
+
return [
- DefaultInfo(files = depset([i for i in [
- node,
- package_store_3p,
- package_store_1p,
- node_modules,
- app,
- ] if i])),
- OutputGroupInfo(
- node = depset([node]) if node else depset(),
- package_store_3p = depset([package_store_3p]) if package_store_3p else depset(),
- package_store_1p = depset([package_store_1p]) if package_store_1p else depset(),
- node_modules = depset([node_modules]) if node_modules else depset(),
- app = depset([app]) if app else depset(),
- ),
+ DefaultInfo(files = depset(outputs)),
+ OutputGroupInfo(**output_groups),
]
def _js_image_layer_transition_impl(settings, attr):
@@ -481,10 +576,9 @@ js_image_layer_lib = struct(
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
),
- "_builder": attr.label(
- default = "//js/private:js_image_layer_builder",
- executable = True,
- cfg = "exec",
+ "_splitter": attr.label(
+ default = "//js/private:js_image_layer.mjs",
+ allow_single_file = True,
),
"binary": attr.label(
mandatory = True,
@@ -500,18 +594,30 @@ js_image_layer_lib = struct(
default = "0:0",
),
"compression": attr.string(
- doc = "Compression algorithm. Can be one of `gzip`, `none`.",
- values = ["gzip", "none"],
+ doc = "Compression algorithm. See https://github.com/bazel-contrib/bazel-lib/blob/bdc6ade0ba1ebe88d822bcdf4d4aaa2ce7e2cd37/lib/private/tar.bzl#L29-L39",
+ values = tar_lib.common.accepted_compression_types + ["none"],
default = "gzip",
),
"platform": attr.label(
doc = "Platform to transition.",
),
"generate_empty_layers": attr.bool(
- doc = """Generate layers even if they are empty.
-
-Helpful when using js_image_layer with rules_docker.
-See https://github.com/aspect-build/rules_js/pull/1714 for more info""",
+ # TODO(3.0): remove this attribute.
+ doc = """DEPRECATED. An empty layer is always generated if the layer group have no matching files.""",
+ default = False,
+ ),
+ "preserve_symlinks": attr.string(
+ doc = """Preserve symlinks for entries matching the pattern.
+By default symlinks within the `node_modules` is preserved.
+""",
+ default = ".*\\/node_modules\\/.*",
+ ),
+ "layer_groups": attr.string_dict(
+ doc = """Layer groups to create.
+These are utilized to categorize files into distinct layers, determined by their respective paths.
+The expected format for each entry is "": "", where MUST be a valid Bazel and
+JavaScript identifier (alphanumeric characters), and MAY be either an empty string (signifying a universal match)
+or a valid regular expression.""",
),
},
)
@@ -520,4 +626,8 @@ js_image_layer = rule(
implementation = js_image_layer_lib.implementation,
attrs = js_image_layer_lib.attrs,
doc = _DOC,
+ toolchains = [
+ tar_lib.toolchain_type,
+ "@rules_nodejs//nodejs:toolchain_type",
+ ],
)
diff --git a/js/private/js_image_layer.mjs b/js/private/js_image_layer.mjs
index 9cc90d799..520e72e61 100644
--- a/js/private/js_image_layer.mjs
+++ b/js/private/js_image_layer.mjs
@@ -1,9877 +1,319 @@
-import { createWriteStream, createReadStream } from 'node:fs';
-import { readFile, stat, readdir, readlink } from 'node:fs/promises';
-import * as path from 'node:path';
-import { Readable as Readable$2 } from 'node:stream';
-import { pathToFileURL } from 'node:url';
-import { createGzip } from 'node:zlib';
-import require$$0$1 from 'stream';
-import require$$0 from 'buffer';
-import require$$2 from 'events';
-import require$$13 from 'string_decoder';
-import require$$0$2 from 'fs';
-
-var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function getAugmentedNamespace(n) {
- if (n.__esModule) return n;
- var f = n.default;
- if (typeof f == "function") {
- var a = function a () {
- if (this instanceof a) {
- var args = [null];
- args.push.apply(args, arguments);
- var Ctor = Function.bind.apply(f, args);
- return new Ctor();
- }
- return f.apply(this, arguments);
- };
- a.prototype = f.prototype;
- } else a = {};
- Object.defineProperty(a, '__esModule', {value: true});
- Object.keys(n).forEach(function (k) {
- var d = Object.getOwnPropertyDescriptor(n, k);
- Object.defineProperty(a, k, d.get ? d : {
- enumerable: true,
- get: function () {
- return n[k];
- }
- });
- });
- return a;
-}
-
-var blExports = {};
-var bl = {
- get exports(){ return blExports; },
- set exports(v){ blExports = v; },
-};
-
-var oursExports = {};
-var ours = {
- get exports(){ return oursExports; },
- set exports(v){ oursExports = v; },
-};
-
-var streamExports = {};
-var stream = {
- get exports(){ return streamExports; },
- set exports(v){ streamExports = v; },
-};
-
-var primordials;
-var hasRequiredPrimordials;
-
-function requirePrimordials () {
- if (hasRequiredPrimordials) return primordials;
- hasRequiredPrimordials = 1;
-
- /*
- This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at
-
- https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js
-
- Don't try to replace with the original file and keep it up to date with the upstream file.
- */
- primordials = {
- ArrayIsArray(self) {
- return Array.isArray(self)
- },
- ArrayPrototypeIncludes(self, el) {
- return self.includes(el)
- },
- ArrayPrototypeIndexOf(self, el) {
- return self.indexOf(el)
- },
- ArrayPrototypeJoin(self, sep) {
- return self.join(sep)
- },
- ArrayPrototypeMap(self, fn) {
- return self.map(fn)
- },
- ArrayPrototypePop(self, el) {
- return self.pop(el)
- },
- ArrayPrototypePush(self, el) {
- return self.push(el)
- },
- ArrayPrototypeSlice(self, start, end) {
- return self.slice(start, end)
- },
- Error,
- FunctionPrototypeCall(fn, thisArgs, ...args) {
- return fn.call(thisArgs, ...args)
- },
- FunctionPrototypeSymbolHasInstance(self, instance) {
- return Function.prototype[Symbol.hasInstance].call(self, instance)
- },
- MathFloor: Math.floor,
- Number,
- NumberIsInteger: Number.isInteger,
- NumberIsNaN: Number.isNaN,
- NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,
- NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,
- NumberParseInt: Number.parseInt,
- ObjectDefineProperties(self, props) {
- return Object.defineProperties(self, props)
- },
- ObjectDefineProperty(self, name, prop) {
- return Object.defineProperty(self, name, prop)
- },
- ObjectGetOwnPropertyDescriptor(self, name) {
- return Object.getOwnPropertyDescriptor(self, name)
- },
- ObjectKeys(obj) {
- return Object.keys(obj)
- },
- ObjectSetPrototypeOf(target, proto) {
- return Object.setPrototypeOf(target, proto)
- },
- Promise,
- PromisePrototypeCatch(self, fn) {
- return self.catch(fn)
- },
- PromisePrototypeThen(self, thenFn, catchFn) {
- return self.then(thenFn, catchFn)
- },
- PromiseReject(err) {
- return Promise.reject(err)
- },
- ReflectApply: Reflect.apply,
- RegExpPrototypeTest(self, value) {
- return self.test(value)
- },
- SafeSet: Set,
- String,
- StringPrototypeSlice(self, start, end) {
- return self.slice(start, end)
- },
- StringPrototypeToLowerCase(self) {
- return self.toLowerCase()
- },
- StringPrototypeToUpperCase(self) {
- return self.toUpperCase()
- },
- StringPrototypeTrim(self) {
- return self.trim()
- },
- Symbol,
- SymbolAsyncIterator: Symbol.asyncIterator,
- SymbolHasInstance: Symbol.hasInstance,
- SymbolIterator: Symbol.iterator,
- TypedArrayPrototypeSet(self, buf, len) {
- return self.set(buf, len)
- },
- Uint8Array
- };
- return primordials;
-}
-
-var utilExports = {};
-var util = {
- get exports(){ return utilExports; },
- set exports(v){ utilExports = v; },
-};
-
-var hasRequiredUtil;
-
-function requireUtil () {
- if (hasRequiredUtil) return utilExports;
- hasRequiredUtil = 1;
- (function (module) {
-
- const bufferModule = require$$0;
- const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
- const Blob = globalThis.Blob || bufferModule.Blob;
- /* eslint-disable indent */
- const isBlob =
- typeof Blob !== 'undefined'
- ? function isBlob(b) {
- // eslint-disable-next-line indent
- return b instanceof Blob
- }
- : function isBlob(b) {
- return false
- };
- /* eslint-enable indent */
-
- // This is a simplified version of AggregateError
- class AggregateError extends Error {
- constructor(errors) {
- if (!Array.isArray(errors)) {
- throw new TypeError(`Expected input to be an Array, got ${typeof errors}`)
- }
- let message = '';
- for (let i = 0; i < errors.length; i++) {
- message += ` ${errors[i].stack}\n`;
- }
- super(message);
- this.name = 'AggregateError';
- this.errors = errors;
- }
- }
- module.exports = {
- AggregateError,
- kEmptyObject: Object.freeze({}),
- once(callback) {
- let called = false;
- return function (...args) {
- if (called) {
- return
- }
- called = true;
- callback.apply(this, args);
- }
- },
- createDeferredPromise: function () {
- let resolve;
- let reject;
-
- // eslint-disable-next-line promise/param-names
- const promise = new Promise((res, rej) => {
- resolve = res;
- reject = rej;
- });
- return {
- promise,
- resolve,
- reject
- }
- },
- promisify(fn) {
- return new Promise((resolve, reject) => {
- fn((err, ...args) => {
- if (err) {
- return reject(err)
- }
- return resolve(...args)
- });
- })
- },
- debuglog() {
- return function () {}
- },
- format(format, ...args) {
- // Simplified version of https://nodejs.org/api/util.html#utilformatformat-args
- return format.replace(/%([sdifj])/g, function (...[_unused, type]) {
- const replacement = args.shift();
- if (type === 'f') {
- return replacement.toFixed(6)
- } else if (type === 'j') {
- return JSON.stringify(replacement)
- } else if (type === 's' && typeof replacement === 'object') {
- const ctor = replacement.constructor !== Object ? replacement.constructor.name : '';
- return `${ctor} {}`.trim()
- } else {
- return replacement.toString()
- }
- })
- },
- inspect(value) {
- // Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options
- switch (typeof value) {
- case 'string':
- if (value.includes("'")) {
- if (!value.includes('"')) {
- return `"${value}"`
- } else if (!value.includes('`') && !value.includes('${')) {
- return `\`${value}\``
- }
- }
- return `'${value}'`
- case 'number':
- if (isNaN(value)) {
- return 'NaN'
- } else if (Object.is(value, -0)) {
- return String(value)
- }
- return value
- case 'bigint':
- return `${String(value)}n`
- case 'boolean':
- case 'undefined':
- return String(value)
- case 'object':
- return '{}'
- }
- },
- types: {
- isAsyncFunction(fn) {
- return fn instanceof AsyncFunction
- },
- isArrayBufferView(arr) {
- return ArrayBuffer.isView(arr)
- }
- },
- isBlob
- };
- module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom');
-} (util));
- return utilExports;
-}
-
-var operators = {};
-
-/**
- * @author Toru Nagashima
- * @copyright 2015 Toru Nagashima. All rights reserved.
- * See LICENSE file in root directory for full license.
- */
-/**
- * @typedef {object} PrivateData
- * @property {EventTarget} eventTarget The event target.
- * @property {{type:string}} event The original event object.
- * @property {number} eventPhase The current event phase.
- * @property {EventTarget|null} currentTarget The current event target.
- * @property {boolean} canceled The flag to prevent default.
- * @property {boolean} stopped The flag to stop propagation.
- * @property {boolean} immediateStopped The flag to stop propagation immediately.
- * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null.
- * @property {number} timeStamp The unix time.
- * @private
- */
-
-/**
- * Private data for event wrappers.
- * @type {WeakMap}
- * @private
- */
-const privateData = new WeakMap();
+import { readdir, readFile, readlink, writeFile } from 'node:fs/promises'
+import { createWriteStream } from 'node:fs'
+import * as path from 'node:path'
/**
- * Cache for wrapper classes.
- * @type {WeakMap}
- * @private
+ * @typedef {{
+ * is_source: boolean
+ * is_directory: boolean
+ * is_external: boolean
+ * dest: string
+ * root?: string
+ * skip?: boolean
+ * repo_name?: string
+ * }} Entry
+ * @typedef {{ [path: string]: Entry }} Entries
+ * @typedef {Map} LayerGroup
*/
-const wrappers = new WeakMap();
-
-/**
- * Get private data.
- * @param {Event} event The event object to get private data.
- * @returns {PrivateData} The private data of the event.
- * @private
- */
-function pd(event) {
- const retv = privateData.get(event);
- console.assert(
- retv != null,
- "'this' is expected an Event object, but got",
- event
- );
- return retv
-}
/**
- * https://dom.spec.whatwg.org/#set-the-canceled-flag
- * @param data {PrivateData} private data.
+ * @param {Entry} entries
+ * @param {string} value
+ * @returns {string | undefined}
*/
-function setCancelFlag(data) {
- if (data.passiveListener != null) {
- if (
- typeof console !== "undefined" &&
- typeof console.error === "function"
- ) {
- console.error(
- "Unable to preventDefault inside passive event listener invocation.",
- data.passiveListener
- );
- }
- return
- }
- if (!data.event.cancelable) {
- return
- }
-
- data.canceled = true;
- if (typeof data.event.preventDefault === "function") {
- data.event.preventDefault();
+function findKeyByValue(entries, value) {
+ const found = entries[value]
+ if (!found) {
+ return undefined
+ } else if (typeof found != 'string') {
+ // matched against the real entry.
+ return undefined
}
+ return found
}
-/**
- * @see https://dom.spec.whatwg.org/#interface-event
- * @private
- */
-/**
- * The event wrapper.
- * @constructor
- * @param {EventTarget} eventTarget The event target of this dispatching.
- * @param {Event|{type:string}} event The original event to wrap.
- */
-function Event(eventTarget, event) {
- privateData.set(this, {
- eventTarget,
- event,
- eventPhase: 2,
- currentTarget: eventTarget,
- canceled: false,
- stopped: false,
- immediateStopped: false,
- passiveListener: null,
- timeStamp: event.timeStamp || Date.now(),
- });
-
- // https://heycam.github.io/webidl/#Unforgeable
- Object.defineProperty(this, "isTrusted", { value: false, enumerable: true });
-
- // Define accessors
- const keys = Object.keys(event);
- for (let i = 0; i < keys.length; ++i) {
- const key = keys[i];
- if (!(key in this)) {
- Object.defineProperty(this, key, defineRedirectDescriptor(key));
+async function readlinkSafe(p) {
+ try {
+ const link = await readlink(p)
+ return path.resolve(path.dirname(p), link)
+ } catch (e) {
+ if (e.code == 'EINVAL') {
+ return p
}
+ if (e.code == 'ENOENT') {
+ // That is as far as we can follow this symlink in this layer so we can only
+ // assume the file exists in another layer
+ return p
+ }
+ throw e
}
}
-// Should be enumerable, but class methods are not enumerable.
-Event.prototype = {
- /**
- * The type of this event.
- * @type {string}
- */
- get type() {
- return pd(this).event.type
- },
+const EXECROOT = process.cwd()
- /**
- * The target of this event.
- * @type {EventTarget}
- */
- get target() {
- return pd(this).eventTarget
- },
-
- /**
- * The target of this event.
- * @type {EventTarget}
- */
- get currentTarget() {
- return pd(this).currentTarget
- },
+// Resolve symlinks while staying inside the sandbox.
+async function resolveSymlink(p) {
+ let prevHop = path.resolve(p)
+ let hopped = false
+ while (true) {
+ // /output-base/sandbox/4/execroot/wksp/bazel-out
+ // /output-base/execroot/wksp/bazel-out
+ let nextHop = await readlinkSafe(prevHop)
+ // if the next hop leads to out of execroot, that means
+ // we hopped too far, return the previous hop.
- /**
- * @returns {EventTarget[]} The composed path of this event.
- */
- composedPath() {
- const currentTarget = pd(this).currentTarget;
- if (currentTarget == null) {
- return []
+ if (!nextHop.startsWith(EXECROOT)) {
+ return hopped ? prevHop : undefined
}
- return [currentTarget]
- },
-
- /**
- * Constant of NONE.
- * @type {number}
- */
- get NONE() {
- return 0
- },
-
- /**
- * Constant of CAPTURING_PHASE.
- * @type {number}
- */
- get CAPTURING_PHASE() {
- return 1
- },
-
- /**
- * Constant of AT_TARGET.
- * @type {number}
- */
- get AT_TARGET() {
- return 2
- },
- /**
- * Constant of BUBBLING_PHASE.
- * @type {number}
- */
- get BUBBLING_PHASE() {
- return 3
- },
-
- /**
- * The target of this event.
- * @type {number}
- */
- get eventPhase() {
- return pd(this).eventPhase
- },
-
- /**
- * Stop event bubbling.
- * @returns {void}
- */
- stopPropagation() {
- const data = pd(this);
-
- data.stopped = true;
- if (typeof data.event.stopPropagation === "function") {
- data.event.stopPropagation();
+ // If there is more than one hop while staying inside sandbox
+ // that means the symlink has multiple indirection within sandbox
+ // but we want to hop only once, for example first party deps.
+ // -> js/private/test/image/node_modules/@mycorp/pkg-d
+ // -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d <- WE WANT TO STOP RIGHT HERE.
+ // -> ../../../../../../examples/npm_package/packages/pkg_d
+ if (nextHop != prevHop && hopped) {
+ return prevHop
}
- },
-
- /**
- * Stop event bubbling.
- * @returns {void}
- */
- stopImmediatePropagation() {
- const data = pd(this);
- data.stopped = true;
- data.immediateStopped = true;
- if (typeof data.event.stopImmediatePropagation === "function") {
- data.event.stopImmediatePropagation();
+ // if the next hop is leads to a different path
+ // that indicates a symlink
+ if (nextHop != prevHop && !hopped) {
+ prevHop = nextHop
+ hopped = true
+ } else if (!hopped) {
+ return undefined
+ } else {
+ return nextHop
}
- },
-
- /**
- * The flag to be bubbling.
- * @type {boolean}
- */
- get bubbles() {
- return Boolean(pd(this).event.bubbles)
- },
-
- /**
- * The flag to be cancelable.
- * @type {boolean}
- */
- get cancelable() {
- return Boolean(pd(this).event.cancelable)
- },
-
- /**
- * Cancel this event.
- * @returns {void}
- */
- preventDefault() {
- setCancelFlag(pd(this));
- },
-
- /**
- * The flag to indicate cancellation state.
- * @type {boolean}
- */
- get defaultPrevented() {
- return pd(this).canceled
- },
-
- /**
- * The flag to be composed.
- * @type {boolean}
- */
- get composed() {
- return Boolean(pd(this).event.composed)
- },
-
- /**
- * The unix time of this event.
- * @type {number}
- */
- get timeStamp() {
- return pd(this).timeStamp
- },
+ }
+}
- /**
- * The target of this event.
- * @type {EventTarget}
- * @deprecated
- */
- get srcElement() {
- return pd(this).eventTarget
- },
+async function* walk(dir, accumulate = '') {
+ const dirents = await readdir(dir, { withFileTypes: true })
+ for (const dirent of dirents) {
+ let isDirectory = dirent.isDirectory()
- /**
- * The flag to stop event bubbling.
- * @type {boolean}
- * @deprecated
- */
- get cancelBubble() {
- return pd(this).stopped
- },
- set cancelBubble(value) {
- if (!value) {
- return
- }
- const data = pd(this);
+ if (
+ dirent.isSymbolicLink() &&
+ !dirent.isDirectory() &&
+ !dirent.isFile()
+ ) {
+ // On OSX we sometimes encounter this bug: https://github.com/nodejs/node/issues/30646
+ // The entry is apparently a symlink, but it's ambiguous whether it's a symlink to a
+ // file or to a directory, and lstat doesn't tell us either. Determine the type by
+ // attempting to read it as a directory.
- data.stopped = true;
- if (typeof data.event.cancelBubble === "boolean") {
- data.event.cancelBubble = true;
+ try {
+ await readdir(path.join(dir, dirent.name))
+ isDirectory = true
+ } catch (error) {
+ if (error.code === 'ENOTDIR') {
+ isDirectory = false
+ } else {
+ throw error
+ }
+ }
}
- },
- /**
- * The flag to indicate cancellation state.
- * @type {boolean}
- * @deprecated
- */
- get returnValue() {
- return !pd(this).canceled
- },
- set returnValue(value) {
- if (!value) {
- setCancelFlag(pd(this));
+ if (isDirectory) {
+ yield* walk(
+ path.join(dir, dirent.name),
+ path.join(accumulate, dirent.name)
+ )
+ } else {
+ yield path.join(accumulate, dirent.name)
}
- },
-
- /**
- * Initialize this event object. But do nothing under event dispatching.
- * @param {string} type The event type.
- * @param {boolean} [bubbles=false] The flag to be possible to bubble up.
- * @param {boolean} [cancelable=false] The flag to be possible to cancel.
- * @deprecated
- */
- initEvent() {
- // Do nothing.
- },
-};
-
-// `constructor` is not enumerable.
-Object.defineProperty(Event.prototype, "constructor", {
- value: Event,
- configurable: true,
- writable: true,
-});
-
-// Ensure `event instanceof window.Event` is `true`.
-if (typeof window !== "undefined" && typeof window.Event !== "undefined") {
- Object.setPrototypeOf(Event.prototype, window.Event.prototype);
-
- // Make association for wrappers.
- wrappers.set(window.Event.prototype, Event);
-}
-
-/**
- * Get the property descriptor to redirect a given property.
- * @param {string} key Property name to define property descriptor.
- * @returns {PropertyDescriptor} The property descriptor to redirect the property.
- * @private
- */
-function defineRedirectDescriptor(key) {
- return {
- get() {
- return pd(this).event[key]
- },
- set(value) {
- pd(this).event[key] = value;
- },
- configurable: true,
- enumerable: true,
}
}
-/**
- * Get the property descriptor to call a given method property.
- * @param {string} key Property name to define property descriptor.
- * @returns {PropertyDescriptor} The property descriptor to call the method property.
- * @private
- */
-function defineCallDescriptor(key) {
- return {
- value() {
- const event = pd(this).event;
- return event[key].apply(event, arguments)
- },
- configurable: true,
- enumerable: true,
- }
-}
-
-/**
- * Define new wrapper class.
- * @param {Function} BaseEvent The base wrapper class.
- * @param {Object} proto The prototype of the original event.
- * @returns {Function} The defined wrapper class.
- * @private
- */
-function defineWrapper(BaseEvent, proto) {
- const keys = Object.keys(proto);
- if (keys.length === 0) {
- return BaseEvent
- }
-
- /** CustomEvent */
- function CustomEvent(eventTarget, event) {
- BaseEvent.call(this, eventTarget, event);
- }
-
- CustomEvent.prototype = Object.create(BaseEvent.prototype, {
- constructor: { value: CustomEvent, configurable: true, writable: true },
- });
-
- // Define accessors.
- for (let i = 0; i < keys.length; ++i) {
- const key = keys[i];
- if (!(key in BaseEvent.prototype)) {
- const descriptor = Object.getOwnPropertyDescriptor(proto, key);
- const isFunc = typeof descriptor.value === "function";
- Object.defineProperty(
- CustomEvent.prototype,
- key,
- isFunc
- ? defineCallDescriptor(key)
- : defineRedirectDescriptor(key)
- );
+function add_parents(mtree, dest) {
+ const segments = path.dirname(dest).split('/')
+ let prev = ''
+ for (const part of segments) {
+ if (!part || part == '.') {
+ continue
}
+ prev = path.join(prev, part)
+ mtree.add(_mtree_dir_line(prev))
}
-
- return CustomEvent
}
/**
- * Get the wrapper class of a given prototype.
- * @param {Object} proto The prototype of the original event to get its wrapper.
- * @returns {Function} The wrapper class.
- * @private
+ * @param {string} str
+ * @returns {string}
*/
-function getWrapper(proto) {
- if (proto == null || proto === Object.prototype) {
- return Event
- }
-
- let wrapper = wrappers.get(proto);
- if (wrapper == null) {
- wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto);
- wrappers.set(proto, wrapper);
+function vis(str) {
+ let result = ''
+ // There is no way to iterate over byte-by-byte UTF-8 characters in JS
+ // so we have to use Buffer to get the bytes.
+ // Rust has this https://doc.rust-lang.org/std/string/struct.String.html#method.as_bytes
+ // and the equivalent in nodejs is Buffer.
+ for (const char of Buffer.from(str)) {
+ if (char < 33 || char > 126) {
+ // Non-printable
+ result += '\\' + char.toString(8).padStart(3, '0')
+ } else {
+ result += String.fromCharCode(char)
+ }
}
- return wrapper
-}
-
-/**
- * Wrap a given event to management a dispatching.
- * @param {EventTarget} eventTarget The event target of this dispatching.
- * @param {Object} event The event to wrap.
- * @returns {Event} The wrapper instance.
- * @private
- */
-function wrapEvent(eventTarget, event) {
- const Wrapper = getWrapper(Object.getPrototypeOf(event));
- return new Wrapper(eventTarget, event)
-}
-
-/**
- * Get the immediateStopped flag of a given event.
- * @param {Event} event The event to get.
- * @returns {boolean} The flag to stop propagation immediately.
- * @private
- */
-function isStopped(event) {
- return pd(event).immediateStopped
-}
-
-/**
- * Set the current event phase of a given event.
- * @param {Event} event The event to set current target.
- * @param {number} eventPhase New event phase.
- * @returns {void}
- * @private
- */
-function setEventPhase(event, eventPhase) {
- pd(event).eventPhase = eventPhase;
-}
-
-/**
- * Set the current target of a given event.
- * @param {Event} event The event to set current target.
- * @param {EventTarget|null} currentTarget New current target.
- * @returns {void}
- * @private
- */
-function setCurrentTarget(event, currentTarget) {
- pd(event).currentTarget = currentTarget;
-}
-
-/**
- * Set a passive listener of a given event.
- * @param {Event} event The event to set current target.
- * @param {Function|null} passiveListener New passive listener.
- * @returns {void}
- * @private
- */
-function setPassiveListener(event, passiveListener) {
- pd(event).passiveListener = passiveListener;
-}
-
-/**
- * @typedef {object} ListenerNode
- * @property {Function} listener
- * @property {1|2|3} listenerType
- * @property {boolean} passive
- * @property {boolean} once
- * @property {ListenerNode|null} next
- * @private
- */
-
-/**
- * @type {WeakMap>}
- * @private
- */
-const listenersMap = new WeakMap();
-
-// Listener types
-const CAPTURE = 1;
-const BUBBLE = 2;
-const ATTRIBUTE = 3;
-
-/**
- * Check whether a given value is an object or not.
- * @param {any} x The value to check.
- * @returns {boolean} `true` if the value is an object.
- */
-function isObject(x) {
- return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax
+ return result
}
-/**
- * Get listeners.
- * @param {EventTarget} eventTarget The event target to get.
- * @returns {Map} The listeners.
- * @private
- */
-function getListeners(eventTarget) {
- const listeners = listenersMap.get(eventTarget);
- if (listeners == null) {
- throw new TypeError(
- "'this' is expected an EventTarget object, but got another value."
- )
- }
- return listeners
+function _mtree_dir_line(dir) {
+ const dest = vis(dir)
+ // Due to filesystems setting different bits depending on the os we have to opt-in
+ // to use a stable mode for files.
+ // In the future, we might want to hand off fine-grained control of these to users
+ // see: https://chmodcommand.com/chmod-0755/
+ return `./${dest} uid={{UID}} gid={{GID}} time=0 mode=0755 type=dir`
}
-/**
- * Get the property descriptor for the event attribute of a given event.
- * @param {string} eventName The event name to get property descriptor.
- * @returns {PropertyDescriptor} The property descriptor.
- * @private
- */
-function defineEventAttributeDescriptor(eventName) {
- return {
- get() {
- const listeners = getListeners(this);
- let node = listeners.get(eventName);
- while (node != null) {
- if (node.listenerType === ATTRIBUTE) {
- return node.listener
- }
- node = node.next;
- }
- return null
- },
-
- set(listener) {
- if (typeof listener !== "function" && !isObject(listener)) {
- listener = null; // eslint-disable-line no-param-reassign
- }
- const listeners = getListeners(this);
-
- // Traverse to the tail while removing old value.
- let prev = null;
- let node = listeners.get(eventName);
- while (node != null) {
- if (node.listenerType === ATTRIBUTE) {
- // Remove old value.
- if (prev !== null) {
- prev.next = node.next;
- } else if (node.next !== null) {
- listeners.set(eventName, node.next);
- } else {
- listeners.delete(eventName);
- }
- } else {
- prev = node;
- }
+function _mtree_link_line(key, linkname) {
+ const link_parent = path.dirname(key)
+ linkname = path.relative(link_parent, linkname)
- node = node.next;
- }
-
- // Add new value.
- if (listener !== null) {
- const newNode = {
- listener,
- listenerType: ATTRIBUTE,
- passive: false,
- once: false,
- next: null,
- };
- if (prev === null) {
- listeners.set(eventName, newNode);
- } else {
- prev.next = newNode;
- }
- }
- },
- configurable: true,
- enumerable: true,
- }
+ // interestingly, bazel 5 and 6 sets different mode bits on symlinks.
+ // well use `0o755` to allow owner&group to `rwx` and others `rx`
+ // see: https://chmodcommand.com/chmod-775/
+ return `${vis(
+ key
+ )} uid={{UID}} gid={{GID}} time=0 mode=0775 type=link link=${vis(linkname)}`
}
-/**
- * Define an event attribute (e.g. `eventTarget.onclick`).
- * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite.
- * @param {string} eventName The event name to define.
- * @returns {void}
- */
-function defineEventAttribute(eventTargetPrototype, eventName) {
- Object.defineProperty(
- eventTargetPrototype,
- `on${eventName}`,
- defineEventAttributeDescriptor(eventName)
- );
+function _mtree_file_line(key, content) {
+ const dest = vis(key)
+ // Due to filesystems setting different bits depending on the os we have to opt-in
+ // to use a stable mode for files.
+ // In the future, we might want to hand off fine-grained control of these to users
+ // see: https://chmodcommand.com/chmod-0555/
+ return `${dest} uid={{UID}} gid={{GID}} time=0 mode=0555 type=file content=${vis(
+ content
+ )}`
}
-/**
- * Define a custom EventTarget with event attributes.
- * @param {string[]} eventNames Event names for event attributes.
- * @returns {EventTarget} The custom EventTarget.
- * @private
- */
-function defineCustomEventTarget(eventNames) {
- /** CustomEventTarget */
- function CustomEventTarget() {
- EventTarget.call(this);
- }
-
- CustomEventTarget.prototype = Object.create(EventTarget.prototype, {
- constructor: {
- value: CustomEventTarget,
- configurable: true,
- writable: true,
- },
- });
+async function split() {
+ const UID = '{{UID}}'
+ const GID = '{{GID}}'
+ const RUNFILES_DIR = '{{RUNFILES_DIR}}'
+ const REPO_NAME = '{{REPO_NAME}}'
- for (let i = 0; i < eventNames.length; ++i) {
- defineEventAttribute(CustomEventTarget.prototype, eventNames[i]);
- }
-
- return CustomEventTarget
-}
-
-/**
- * EventTarget.
- *
- * - This is constructor if no arguments.
- * - This is a function which returns a CustomEventTarget constructor if there are arguments.
- *
- * For example:
- *
- * class A extends EventTarget {}
- * class B extends EventTarget("message") {}
- * class C extends EventTarget("message", "error") {}
- * class D extends EventTarget(["message", "error"]) {}
- */
-function EventTarget() {
- /*eslint-disable consistent-return */
- if (this instanceof EventTarget) {
- listenersMap.set(this, new Map());
- return
- }
- if (arguments.length === 1 && Array.isArray(arguments[0])) {
- return defineCustomEventTarget(arguments[0])
- }
- if (arguments.length > 0) {
- const types = new Array(arguments.length);
- for (let i = 0; i < arguments.length; ++i) {
- types[i] = arguments[i];
- }
- return defineCustomEventTarget(types)
- }
- throw new TypeError("Cannot call a class as a function")
- /*eslint-enable consistent-return */
-}
+ // TODO: use computed_substitutions when we only support >= Bazel 7
+ const entries = JSON.parse((await readFile('{{ENTRIES}}')).toString())
-// Should be enumerable, but class methods are not enumerable.
-EventTarget.prototype = {
- /**
- * Add a given listener to this event target.
- * @param {string} eventName The event name to add.
- * @param {Function} listener The listener to add.
- * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
- * @returns {void}
- */
- addEventListener(eventName, listener, options) {
- if (listener == null) {
- return
- }
- if (typeof listener !== "function" && !isObject(listener)) {
- throw new TypeError("'listener' should be a function or an object.")
- }
+ /*{{VARIABLES}}*/
- const listeners = getListeners(this);
- const optionsIsObj = isObject(options);
- const capture = optionsIsObj
- ? Boolean(options.capture)
- : Boolean(options);
- const listenerType = capture ? CAPTURE : BUBBLE;
- const newNode = {
- listener,
- listenerType,
- passive: optionsIsObj && Boolean(options.passive),
- once: optionsIsObj && Boolean(options.once),
- next: null,
- };
+ const resolveTasks = []
+ const splitterUnusedInputs = createWriteStream('{{UNUSED_INPUTS}}')
- // Set it as the first node if the first node is null.
- let node = listeners.get(eventName);
- if (node === undefined) {
- listeners.set(eventName, newNode);
- return
+ for (const key in entries) {
+ if (typeof entries[key] == 'string') {
+ continue
}
+ const { dest, is_directory, is_source, is_external, root, repo_name } =
+ entries[key]
- // Traverse to the tail while checking duplication..
- let prev = null;
- while (node != null) {
- if (
- node.listener === listener &&
- node.listenerType === listenerType
- ) {
- // Should ignore duplication.
- return
- }
- prev = node;
- node = node.next;
- }
+ /** @type Set */
+ let mtree = null
- // Add it.
- prev.next = newNode;
- },
+ const destBuf = Buffer.from(dest + '\n')
- /**
- * Remove a given listener from this event target.
- * @param {string} eventName The event name to remove.
- * @param {Function} listener The listener to remove.
- * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
- * @returns {void}
- */
- removeEventListener(eventName, listener, options) {
- if (listener == null) {
- return
- }
+ /*{{PICK_STATEMENTS}}*/
- const listeners = getListeners(this);
- const capture = isObject(options)
- ? Boolean(options.capture)
- : Boolean(options);
- const listenerType = capture ? CAPTURE : BUBBLE;
+ // its a treeartifact. expand it and add individual entries.
+ if (is_directory) {
+ for await (const sub_key of walk(dest)) {
+ const new_key = key + '/' + sub_key
+ const new_dest = dest + '/' + sub_key
- let prev = null;
- let node = listeners.get(eventName);
- while (node != null) {
- if (
- node.listener === listener &&
- node.listenerType === listenerType
- ) {
- if (prev !== null) {
- prev.next = node.next;
- } else if (node.next !== null) {
- listeners.set(eventName, node.next);
- } else {
- listeners.delete(eventName);
- }
- return
+ add_parents(mtree, new_key)
+ mtree.add(_mtree_file_line(new_key, new_dest))
}
-
- prev = node;
- node = node.next;
+ // Splitter does not care about this file since its not a symlink, so prune it for better cache hit rate.
+ splitterUnusedInputs.write(destBuf)
+ continue
}
- },
- /**
- * Dispatch a given event.
- * @param {Event|{type:string}} event The event to dispatch.
- * @returns {boolean} `false` if canceled.
- */
- dispatchEvent(event) {
- if (event == null || typeof event.type !== "string") {
- throw new TypeError('"event.type" should be a string.')
- }
+ // create parents of current path.
+ add_parents(mtree, key)
- // If listeners aren't registered, terminate.
- const listeners = getListeners(this);
- const eventName = event.type;
- let node = listeners.get(eventName);
- if (node == null) {
- return true
+ // A source file from workspace, not an output of a target.
+ if (is_source) {
+ mtree.add(_mtree_file_line(key, dest))
+ // Splitter does not care about this file since its not a symlink, so prune it for better cache hit rate.
+ splitterUnusedInputs.write(destBuf)
+ continue
}
- // Since we cannot rewrite several properties, so wrap object.
- const wrappedEvent = wrapEvent(this, event);
-
- // This doesn't process capturing phase and bubbling phase.
- // This isn't participating in a tree.
- let prev = null;
- while (node != null) {
- // Remove this listener if it's once
- if (node.once) {
- if (prev !== null) {
- prev.next = node.next;
- } else if (node.next !== null) {
- listeners.set(eventName, node.next);
- } else {
- listeners.delete(eventName);
+ // root indicates where the generated source comes from. it looks like
+ // `bazel-out/darwin_arm64-fastbuild` when there's no transition.
+ if (!root) {
+ // everything except sources should have
+ throw new Error(
+ `unexpected entry format. ${JSON.stringify(
+ entries[key]
+ )}. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose`
+ )
+ }
+
+ // If its external or if it does not match the `preserve_symlinks` regex
+ // we don't support preserving symlinks.
+ if (is_external || !/{{PRESERVE_SYMLINKS}}/.test(key)) {
+ // Just add the file as a regular file.
+ mtree.add(_mtree_file_line(key, dest))
+ // Splitter does not care about this file since its not a symlink, so prune it for better cache hit rate.
+ splitterUnusedInputs.write(destBuf)
+ continue
+ }
+
+ const resolveTask = resolveSymlink(dest).then((realp) => {
+ // it's important that we don't treat any symlink pointing out of execroot since
+ // bazel symlinks external files into sandbox to make them available to us.
+ if (realp) {
+ const output_path = realp.slice(realp.indexOf(root))
+ // Look in all entries for symlinks since they may be in other layers
+ let linkname = findKeyByValue(entries, output_path)
+
+ // First party dependencies are linked against a folder in output tree or source tree
+ // which means that we won't have an exact match for it in the entries. We could continue
+ // doing what we have done https://github.com/aspect-build/rules_js/commit/f83467ba91deb88d43fd4ac07991b382bb14945f
+ // but that is expensive and does not scale.
+ if (linkname == undefined && !repo_name) {
+ linkname =
+ RUNFILES_DIR +
+ '/' +
+ REPO_NAME +
+ realp.slice(realp.indexOf(root) + root.length)
}
- } else {
- prev = node;
- }
- // Call this listener
- setPassiveListener(
- wrappedEvent,
- node.passive ? node.listener : null
- );
- if (typeof node.listener === "function") {
- try {
- node.listener.call(this, wrappedEvent);
- } catch (err) {
- if (
- typeof console !== "undefined" &&
- typeof console.error === "function"
- ) {
- console.error(err);
- }
+ if (linkname == undefined) {
+ throw new Error(
+ `Couldn't map symbolic link ${output_path} to a path. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose\n\n` +
+ `dest: ${dest}\n` +
+ `realpath: ${realp}\n` +
+ `output_path: ${output_path}\n` +
+ `root: ${root}\n` +
+ `repo_name: ${repo_name}\n` +
+ `runfiles: ${key}\n\n`
+ )
}
- } else if (
- node.listenerType !== ATTRIBUTE &&
- typeof node.listener.handleEvent === "function"
- ) {
- node.listener.handleEvent(wrappedEvent);
- }
-
- // Break if `event.stopImmediatePropagation` was called.
- if (isStopped(wrappedEvent)) {
- break
+ // add the symlink to the mtree
+ mtree.add(_mtree_link_line(key, linkname))
+ } else {
+ // If we can't resolve the symlink, we just add the file as a regular file.
+ mtree.add(_mtree_file_line(key, dest))
+ // Splitter does not care about this file since its not a symlink, so prune it for better cache hit rate.
+ splitterUnusedInputs.write(destBuf)
}
-
- node = node.next;
- }
- setPassiveListener(wrappedEvent, null);
- setEventPhase(wrappedEvent, 0);
- setCurrentTarget(wrappedEvent, null);
-
- return !wrappedEvent.defaultPrevented
- },
-};
-
-// `constructor` is not enumerable.
-Object.defineProperty(EventTarget.prototype, "constructor", {
- value: EventTarget,
- configurable: true,
- writable: true,
-});
-
-// Ensure `eventTarget instanceof window.EventTarget` is `true`.
-if (
- typeof window !== "undefined" &&
- typeof window.EventTarget !== "undefined"
-) {
- Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype);
-}
-
-/**
- * @author Toru Nagashima
- * See LICENSE file in root directory for full license.
- */
-
-/**
- * The signal class.
- * @see https://dom.spec.whatwg.org/#abortsignal
- */
-class AbortSignal extends EventTarget {
- /**
- * AbortSignal cannot be constructed directly.
- */
- constructor() {
- super();
- throw new TypeError("AbortSignal cannot be constructed directly");
- }
- /**
- * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise.
- */
- get aborted() {
- const aborted = abortedFlags.get(this);
- if (typeof aborted !== "boolean") {
- throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`);
- }
- return aborted;
- }
-}
-defineEventAttribute(AbortSignal.prototype, "abort");
-/**
- * Create an AbortSignal object.
- */
-function createAbortSignal() {
- const signal = Object.create(AbortSignal.prototype);
- EventTarget.call(signal);
- abortedFlags.set(signal, false);
- return signal;
-}
-/**
- * Abort a given signal.
- */
-function abortSignal(signal) {
- if (abortedFlags.get(signal) !== false) {
- return;
- }
- abortedFlags.set(signal, true);
- signal.dispatchEvent({ type: "abort" });
-}
-/**
- * Aborted flag for each instances.
- */
-const abortedFlags = new WeakMap();
-// Properties should be enumerable.
-Object.defineProperties(AbortSignal.prototype, {
- aborted: { enumerable: true },
-});
-// `toString()` should return `"[object AbortSignal]"`
-if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {
- Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, {
- configurable: true,
- value: "AbortSignal",
- });
-}
-
-/**
- * The AbortController.
- * @see https://dom.spec.whatwg.org/#abortcontroller
- */
-class AbortController {
- /**
- * Initialize this controller.
- */
- constructor() {
- signals.set(this, createAbortSignal());
- }
- /**
- * Returns the `AbortSignal` object associated with this object.
- */
- get signal() {
- return getSignal(this);
- }
- /**
- * Abort and signal to any observers that the associated activity is to be aborted.
- */
- abort() {
- abortSignal(getSignal(this));
- }
-}
-/**
- * Associated signals.
- */
-const signals = new WeakMap();
-/**
- * Get the associated signal of a given controller.
- */
-function getSignal(controller) {
- const signal = signals.get(controller);
- if (signal == null) {
- throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`);
+ })
+ resolveTasks.push(resolveTask)
}
- return signal;
-}
-// Properties should be enumerable.
-Object.defineProperties(AbortController.prototype, {
- signal: { enumerable: true },
- abort: { enumerable: true },
-});
-if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") {
- Object.defineProperty(AbortController.prototype, Symbol.toStringTag, {
- configurable: true,
- value: "AbortController",
- });
-}
-
-var abortController = /*#__PURE__*/Object.freeze({
- __proto__: null,
- 'default': AbortController,
- AbortController: AbortController,
- AbortSignal: AbortSignal
-});
-
-var require$$9 = /*@__PURE__*/getAugmentedNamespace(abortController);
-
-var errors;
-var hasRequiredErrors;
-function requireErrors () {
- if (hasRequiredErrors) return errors;
- hasRequiredErrors = 1;
-
- const { format, inspect, AggregateError: CustomAggregateError } = requireUtil();
-
- /*
- This file is a reduced and adapted version of the main lib/internal/errors.js file defined at
-
- https://github.com/nodejs/node/blob/master/lib/internal/errors.js
-
- Don't try to replace with the original file and keep it up to date (starting from E(...) definitions)
- with the upstream file.
- */
-
- const AggregateError = globalThis.AggregateError || CustomAggregateError;
- const kIsNodeError = Symbol('kIsNodeError');
- const kTypes = [
- 'string',
- 'function',
- 'number',
- 'object',
- // Accept 'Function' and 'Object' as alternative to the lower cased version.
- 'Function',
- 'Object',
- 'boolean',
- 'bigint',
- 'symbol'
- ];
- const classRegExp = /^([A-Z][a-z0-9]*)+$/;
- const nodeInternalPrefix = '__node_internal_';
- const codes = {};
- function assert(value, message) {
- if (!value) {
- throw new codes.ERR_INTERNAL_ASSERTION(message)
- }
- }
-
- // Only use this for integers! Decimal numbers do not work with this function.
- function addNumericalSeparator(val) {
- let res = '';
- let i = val.length;
- const start = val[0] === '-' ? 1 : 0;
- for (; i >= start + 4; i -= 3) {
- res = `_${val.slice(i - 3, i)}${res}`;
- }
- return `${val.slice(0, i)}${res}`
- }
- function getMessage(key, msg, args) {
- if (typeof msg === 'function') {
- assert(
- msg.length <= args.length,
- // Default options do not count.
- `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`
- );
- return msg(...args)
- }
- const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length;
- assert(
- expectedLength === args.length,
- `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`
- );
- if (args.length === 0) {
- return msg
- }
- return format(msg, ...args)
- }
- function E(code, message, Base) {
- if (!Base) {
- Base = Error;
- }
- class NodeError extends Base {
- constructor(...args) {
- super(getMessage(code, message, args));
- }
- toString() {
- return `${this.name} [${code}]: ${this.message}`
- }
- }
- Object.defineProperties(NodeError.prototype, {
- name: {
- value: Base.name,
- writable: true,
- enumerable: false,
- configurable: true
- },
- toString: {
- value() {
- return `${this.name} [${code}]: ${this.message}`
- },
- writable: true,
- enumerable: false,
- configurable: true
- }
- });
- NodeError.prototype.code = code;
- NodeError.prototype[kIsNodeError] = true;
- codes[code] = NodeError;
- }
- function hideStackFrames(fn) {
- // We rename the functions that will be hidden to cut off the stacktrace
- // at the outermost one
- const hidden = nodeInternalPrefix + fn.name;
- Object.defineProperty(fn, 'name', {
- value: hidden
- });
- return fn
- }
- function aggregateTwoErrors(innerError, outerError) {
- if (innerError && outerError && innerError !== outerError) {
- if (Array.isArray(outerError.errors)) {
- // If `outerError` is already an `AggregateError`.
- outerError.errors.push(innerError);
- return outerError
- }
- const err = new AggregateError([outerError, innerError], outerError.message);
- err.code = outerError.code;
- return err
- }
- return innerError || outerError
- }
- class AbortError extends Error {
- constructor(message = 'The operation was aborted', options = undefined) {
- if (options !== undefined && typeof options !== 'object') {
- throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options)
- }
- super(message, options);
- this.code = 'ABORT_ERR';
- this.name = 'AbortError';
- }
- }
- E('ERR_ASSERTION', '%s', Error);
- E(
- 'ERR_INVALID_ARG_TYPE',
- (name, expected, actual) => {
- assert(typeof name === 'string', "'name' must be a string");
- if (!Array.isArray(expected)) {
- expected = [expected];
- }
- let msg = 'The ';
- if (name.endsWith(' argument')) {
- // For cases like 'first argument'
- msg += `${name} `;
- } else {
- msg += `"${name}" ${name.includes('.') ? 'property' : 'argument'} `;
- }
- msg += 'must be ';
- const types = [];
- const instances = [];
- const other = [];
- for (const value of expected) {
- assert(typeof value === 'string', 'All expected entries have to be of type string');
- if (kTypes.includes(value)) {
- types.push(value.toLowerCase());
- } else if (classRegExp.test(value)) {
- instances.push(value);
- } else {
- assert(value !== 'object', 'The value "object" should be written as "Object"');
- other.push(value);
- }
- }
-
- // Special handle `object` in case other instances are allowed to outline
- // the differences between each other.
- if (instances.length > 0) {
- const pos = types.indexOf('object');
- if (pos !== -1) {
- types.splice(types, pos, 1);
- instances.push('Object');
- }
- }
- if (types.length > 0) {
- switch (types.length) {
- case 1:
- msg += `of type ${types[0]}`;
- break
- case 2:
- msg += `one of type ${types[0]} or ${types[1]}`;
- break
- default: {
- const last = types.pop();
- msg += `one of type ${types.join(', ')}, or ${last}`;
- }
- }
- if (instances.length > 0 || other.length > 0) {
- msg += ' or ';
- }
- }
- if (instances.length > 0) {
- switch (instances.length) {
- case 1:
- msg += `an instance of ${instances[0]}`;
- break
- case 2:
- msg += `an instance of ${instances[0]} or ${instances[1]}`;
- break
- default: {
- const last = instances.pop();
- msg += `an instance of ${instances.join(', ')}, or ${last}`;
- }
- }
- if (other.length > 0) {
- msg += ' or ';
- }
- }
- switch (other.length) {
- case 0:
- break
- case 1:
- if (other[0].toLowerCase() !== other[0]) {
- msg += 'an ';
- }
- msg += `${other[0]}`;
- break
- case 2:
- msg += `one of ${other[0]} or ${other[1]}`;
- break
- default: {
- const last = other.pop();
- msg += `one of ${other.join(', ')}, or ${last}`;
- }
- }
- if (actual == null) {
- msg += `. Received ${actual}`;
- } else if (typeof actual === 'function' && actual.name) {
- msg += `. Received function ${actual.name}`;
- } else if (typeof actual === 'object') {
- var _actual$constructor;
- if (
- (_actual$constructor = actual.constructor) !== null &&
- _actual$constructor !== undefined &&
- _actual$constructor.name
- ) {
- msg += `. Received an instance of ${actual.constructor.name}`;
- } else {
- const inspected = inspect(actual, {
- depth: -1
- });
- msg += `. Received ${inspected}`;
- }
- } else {
- let inspected = inspect(actual, {
- colors: false
- });
- if (inspected.length > 25) {
- inspected = `${inspected.slice(0, 25)}...`;
- }
- msg += `. Received type ${typeof actual} (${inspected})`;
- }
- return msg
- },
- TypeError
- );
- E(
- 'ERR_INVALID_ARG_VALUE',
- (name, value, reason = 'is invalid') => {
- let inspected = inspect(value);
- if (inspected.length > 128) {
- inspected = inspected.slice(0, 128) + '...';
- }
- const type = name.includes('.') ? 'property' : 'argument';
- return `The ${type} '${name}' ${reason}. Received ${inspected}`
- },
- TypeError
- );
- E(
- 'ERR_INVALID_RETURN_VALUE',
- (input, name, value) => {
- var _value$constructor;
- const type =
- value !== null &&
- value !== undefined &&
- (_value$constructor = value.constructor) !== null &&
- _value$constructor !== undefined &&
- _value$constructor.name
- ? `instance of ${value.constructor.name}`
- : `type ${typeof value}`;
- return `Expected ${input} to be returned from the "${name}"` + ` function but got ${type}.`
- },
- TypeError
- );
- E(
- 'ERR_MISSING_ARGS',
- (...args) => {
- assert(args.length > 0, 'At least one arg needs to be specified');
- let msg;
- const len = args.length;
- args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(' or ');
- switch (len) {
- case 1:
- msg += `The ${args[0]} argument`;
- break
- case 2:
- msg += `The ${args[0]} and ${args[1]} arguments`;
- break
- default:
- {
- const last = args.pop();
- msg += `The ${args.join(', ')}, and ${last} arguments`;
- }
- break
- }
- return `${msg} must be specified`
- },
- TypeError
- );
- E(
- 'ERR_OUT_OF_RANGE',
- (str, range, input) => {
- assert(range, 'Missing "range" argument');
- let received;
- if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {
- received = addNumericalSeparator(String(input));
- } else if (typeof input === 'bigint') {
- received = String(input);
- if (input > 2n ** 32n || input < -(2n ** 32n)) {
- received = addNumericalSeparator(received);
- }
- received += 'n';
- } else {
- received = inspect(input);
- }
- return `The value of "${str}" is out of range. It must be ${range}. Received ${received}`
- },
- RangeError
- );
- E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error);
- E('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error);
- E('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error);
- E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error);
- E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error);
- E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
- E('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error);
- E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error);
- E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error);
- E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error);
- E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError);
- errors = {
- AbortError,
- aggregateTwoErrors: hideStackFrames(aggregateTwoErrors),
- hideStackFrames,
- codes
- };
- return errors;
-}
+ await Promise.all(resolveTasks)
-var validators;
-var hasRequiredValidators;
-
-function requireValidators () {
- if (hasRequiredValidators) return validators;
- hasRequiredValidators = 1;
-
- const {
- ArrayIsArray,
- ArrayPrototypeIncludes,
- ArrayPrototypeJoin,
- ArrayPrototypeMap,
- NumberIsInteger,
- NumberIsNaN,
- NumberMAX_SAFE_INTEGER,
- NumberMIN_SAFE_INTEGER,
- NumberParseInt,
- ObjectPrototypeHasOwnProperty,
- RegExpPrototypeExec,
- String,
- StringPrototypeToUpperCase,
- StringPrototypeTrim
- } = requirePrimordials();
- const {
- hideStackFrames,
- codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL }
- } = requireErrors();
- const { normalizeEncoding } = requireUtil();
- const { isAsyncFunction, isArrayBufferView } = requireUtil().types;
- const signals = {};
-
- /**
- * @param {*} value
- * @returns {boolean}
- */
- function isInt32(value) {
- return value === (value | 0)
- }
-
- /**
- * @param {*} value
- * @returns {boolean}
- */
- function isUint32(value) {
- return value === value >>> 0
- }
- const octalReg = /^[0-7]+$/;
- const modeDesc = 'must be a 32-bit unsigned integer or an octal string';
-
- /**
- * Parse and validate values that will be converted into mode_t (the S_*
- * constants). Only valid numbers and octal strings are allowed. They could be
- * converted to 32-bit unsigned integers or non-negative signed integers in the
- * C++ land, but any value higher than 0o777 will result in platform-specific
- * behaviors.
- *
- * @param {*} value Values to be validated
- * @param {string} name Name of the argument
- * @param {number} [def] If specified, will be returned for invalid values
- * @returns {number}
- */
- function parseFileMode(value, name, def) {
- if (typeof value === 'undefined') {
- value = def;
- }
- if (typeof value === 'string') {
- if (RegExpPrototypeExec(octalReg, value) === null) {
- throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc)
- }
- value = NumberParseInt(value, 8);
- }
- validateUint32(value, name);
- return value
- }
-
- /**
- * @callback validateInteger
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
- /** @type {validateInteger} */
- const validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {
- if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
- });
-
- /**
- * @callback validateInt32
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
- /** @type {validateInt32} */
- const validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => {
- // The defaults for min and max correspond to the limits of 32-bit integers.
- if (typeof value !== 'number') {
- throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- }
- if (!NumberIsInteger(value)) {
- throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- }
- if (value < min || value > max) {
- throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
- }
- });
-
- /**
- * @callback validateUint32
- * @param {*} value
- * @param {string} name
- * @param {number|boolean} [positive=false]
- * @returns {asserts value is number}
- */
-
- /** @type {validateUint32} */
- const validateUint32 = hideStackFrames((value, name, positive = false) => {
- if (typeof value !== 'number') {
- throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- }
- if (!NumberIsInteger(value)) {
- throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- }
- const min = positive ? 1 : 0;
- // 2 ** 32 === 4294967296
- const max = 4294967295;
- if (value < min || value > max) {
- throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
- }
- });
-
- /**
- * @callback validateString
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is string}
- */
-
- /** @type {validateString} */
- function validateString(value, name) {
- if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value)
- }
-
- /**
- * @callback validateNumber
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
- /** @type {validateNumber} */
- function validateNumber(value, name, min = undefined, max) {
- if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- if (
- (min != null && value < min) ||
- (max != null && value > max) ||
- ((min != null || max != null) && NumberIsNaN(value))
- ) {
- throw new ERR_OUT_OF_RANGE(
- name,
- `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`,
- value
- )
- }
- }
-
- /**
- * @callback validateOneOf
- * @template T
- * @param {T} value
- * @param {string} name
- * @param {T[]} oneOf
- */
-
- /** @type {validateOneOf} */
- const validateOneOf = hideStackFrames((value, name, oneOf) => {
- if (!ArrayPrototypeIncludes(oneOf, value)) {
- const allowed = ArrayPrototypeJoin(
- ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))),
- ', '
- );
- const reason = 'must be one of: ' + allowed;
- throw new ERR_INVALID_ARG_VALUE(name, value, reason)
- }
- });
-
- /**
- * @callback validateBoolean
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is boolean}
- */
-
- /** @type {validateBoolean} */
- function validateBoolean(value, name) {
- if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value)
- }
- function getOwnPropertyValueOrDefault(options, key, defaultValue) {
- return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]
- }
-
- /**
- * @callback validateObject
- * @param {*} value
- * @param {string} name
- * @param {{
- * allowArray?: boolean,
- * allowFunction?: boolean,
- * nullable?: boolean
- * }} [options]
- */
-
- /** @type {validateObject} */
- const validateObject = hideStackFrames((value, name, options = null) => {
- const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false);
- const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false);
- const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false);
- if (
- (!nullable && value === null) ||
- (!allowArray && ArrayIsArray(value)) ||
- (typeof value !== 'object' && (!allowFunction || typeof value !== 'function'))
- ) {
- throw new ERR_INVALID_ARG_TYPE(name, 'Object', value)
- }
- });
-
- /**
- * @callback validateArray
- * @param {*} value
- * @param {string} name
- * @param {number} [minLength]
- * @returns {asserts value is any[]}
- */
-
- /** @type {validateArray} */
- const validateArray = hideStackFrames((value, name, minLength = 0) => {
- if (!ArrayIsArray(value)) {
- throw new ERR_INVALID_ARG_TYPE(name, 'Array', value)
- }
- if (value.length < minLength) {
- const reason = `must be longer than ${minLength}`;
- throw new ERR_INVALID_ARG_VALUE(name, value, reason)
- }
- });
-
- // eslint-disable-next-line jsdoc/require-returns-check
- /**
- * @param {*} signal
- * @param {string} [name='signal']
- * @returns {asserts signal is keyof signals}
- */
- function validateSignalName(signal, name = 'signal') {
- validateString(signal, name);
- if (signals[signal] === undefined) {
- if (signals[StringPrototypeToUpperCase(signal)] !== undefined) {
- throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)')
- }
- throw new ERR_UNKNOWN_SIGNAL(signal)
- }
- }
-
- /**
- * @callback validateBuffer
- * @param {*} buffer
- * @param {string} [name='buffer']
- * @returns {asserts buffer is ArrayBufferView}
- */
-
- /** @type {validateBuffer} */
- const validateBuffer = hideStackFrames((buffer, name = 'buffer') => {
- if (!isArrayBufferView(buffer)) {
- throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer)
- }
- });
-
- /**
- * @param {string} data
- * @param {string} encoding
- */
- function validateEncoding(data, encoding) {
- const normalizedEncoding = normalizeEncoding(encoding);
- const length = data.length;
- if (normalizedEncoding === 'hex' && length % 2 !== 0) {
- throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`)
- }
- }
-
- /**
- * Check that the port number is not NaN when coerced to a number,
- * is an integer and that it falls within the legal range of port numbers.
- * @param {*} port
- * @param {string} [name='Port']
- * @param {boolean} [allowZero=true]
- * @returns {number}
- */
- function validatePort(port, name = 'Port', allowZero = true) {
- if (
- (typeof port !== 'number' && typeof port !== 'string') ||
- (typeof port === 'string' && StringPrototypeTrim(port).length === 0) ||
- +port !== +port >>> 0 ||
- port > 0xffff ||
- (port === 0 && !allowZero)
- ) {
- throw new ERR_SOCKET_BAD_PORT(name, port, allowZero)
- }
- return port | 0
- }
-
- /**
- * @callback validateAbortSignal
- * @param {*} signal
- * @param {string} name
- */
-
- /** @type {validateAbortSignal} */
- const validateAbortSignal = hideStackFrames((signal, name) => {
- if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
- throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
- }
- });
-
- /**
- * @callback validateFunction
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is Function}
- */
-
- /** @type {validateFunction} */
- const validateFunction = hideStackFrames((value, name) => {
- if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
- });
-
- /**
- * @callback validatePlainFunction
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is Function}
- */
-
- /** @type {validatePlainFunction} */
- const validatePlainFunction = hideStackFrames((value, name) => {
- if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
- });
-
- /**
- * @callback validateUndefined
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is undefined}
- */
-
- /** @type {validateUndefined} */
- const validateUndefined = hideStackFrames((value, name) => {
- if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value)
- });
-
- /**
- * @template T
- * @param {T} value
- * @param {string} name
- * @param {T[]} union
- */
- function validateUnion(value, name, union) {
- if (!ArrayPrototypeIncludes(union, value)) {
- throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value)
- }
- }
- validators = {
- isInt32,
- isUint32,
- parseFileMode,
- validateArray,
- validateBoolean,
- validateBuffer,
- validateEncoding,
- validateFunction,
- validateInt32,
- validateInteger,
- validateNumber,
- validateObject,
- validateOneOf,
- validatePlainFunction,
- validatePort,
- validateSignalName,
- validateString,
- validateUint32,
- validateUndefined,
- validateUnion,
- validateAbortSignal
- };
- return validators;
-}
-
-var endOfStreamExports = {};
-var endOfStream = {
- get exports(){ return endOfStreamExports; },
- set exports(v){ endOfStreamExports = v; },
-};
-
-var process$1;
-var hasRequiredProcess;
-
-function requireProcess () {
- if (hasRequiredProcess) return process$1;
- hasRequiredProcess = 1;
- // for now just expose the builtin process global from node.js
- process$1 = commonjsGlobal.process;
- return process$1;
-}
-
-var utils;
-var hasRequiredUtils;
-
-function requireUtils () {
- if (hasRequiredUtils) return utils;
- hasRequiredUtils = 1;
-
- const { Symbol, SymbolAsyncIterator, SymbolIterator } = requirePrimordials();
- const kDestroyed = Symbol('kDestroyed');
- const kIsErrored = Symbol('kIsErrored');
- const kIsReadable = Symbol('kIsReadable');
- const kIsDisturbed = Symbol('kIsDisturbed');
- function isReadableNodeStream(obj, strict = false) {
- var _obj$_readableState;
- return !!(
- (
- obj &&
- typeof obj.pipe === 'function' &&
- typeof obj.on === 'function' &&
- (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&
- (!obj._writableState ||
- ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined
- ? undefined
- : _obj$_readableState.readable) !== false) &&
- // Duplex
- (!obj._writableState || obj._readableState)
- ) // Writable has .pipe.
- )
- }
-
- function isWritableNodeStream(obj) {
- var _obj$_writableState;
- return !!(
- (
- obj &&
- typeof obj.write === 'function' &&
- typeof obj.on === 'function' &&
- (!obj._readableState ||
- ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined
- ? undefined
- : _obj$_writableState.writable) !== false)
- ) // Duplex
- )
- }
-
- function isDuplexNodeStream(obj) {
- return !!(
- obj &&
- typeof obj.pipe === 'function' &&
- obj._readableState &&
- typeof obj.on === 'function' &&
- typeof obj.write === 'function'
- )
- }
- function isNodeStream(obj) {
- return (
- obj &&
- (obj._readableState ||
- obj._writableState ||
- (typeof obj.write === 'function' && typeof obj.on === 'function') ||
- (typeof obj.pipe === 'function' && typeof obj.on === 'function'))
- )
- }
- function isIterable(obj, isAsync) {
- if (obj == null) return false
- if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'
- if (isAsync === false) return typeof obj[SymbolIterator] === 'function'
- return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'
- }
- function isDestroyed(stream) {
- if (!isNodeStream(stream)) return null
- const wState = stream._writableState;
- const rState = stream._readableState;
- const state = wState || rState;
- return !!(stream.destroyed || stream[kDestroyed] || (state !== null && state !== undefined && state.destroyed))
- }
-
- // Have been end():d.
- function isWritableEnded(stream) {
- if (!isWritableNodeStream(stream)) return null
- if (stream.writableEnded === true) return true
- const wState = stream._writableState;
- if (wState !== null && wState !== undefined && wState.errored) return false
- if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null
- return wState.ended
- }
-
- // Have emitted 'finish'.
- function isWritableFinished(stream, strict) {
- if (!isWritableNodeStream(stream)) return null
- if (stream.writableFinished === true) return true
- const wState = stream._writableState;
- if (wState !== null && wState !== undefined && wState.errored) return false
- if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null
- return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))
- }
-
- // Have been push(null):d.
- function isReadableEnded(stream) {
- if (!isReadableNodeStream(stream)) return null
- if (stream.readableEnded === true) return true
- const rState = stream._readableState;
- if (!rState || rState.errored) return false
- if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null
- return rState.ended
- }
-
- // Have emitted 'end'.
- function isReadableFinished(stream, strict) {
- if (!isReadableNodeStream(stream)) return null
- const rState = stream._readableState;
- if (rState !== null && rState !== undefined && rState.errored) return false
- if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null
- return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))
- }
- function isReadable(stream) {
- if (stream && stream[kIsReadable] != null) return stream[kIsReadable]
- if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null
- if (isDestroyed(stream)) return false
- return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)
- }
- function isWritable(stream) {
- if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null
- if (isDestroyed(stream)) return false
- return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)
- }
- function isFinished(stream, opts) {
- if (!isNodeStream(stream)) {
- return null
- }
- if (isDestroyed(stream)) {
- return true
- }
- if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {
- return false
- }
- if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {
- return false
- }
- return true
- }
- function isWritableErrored(stream) {
- var _stream$_writableStat, _stream$_writableStat2;
- if (!isNodeStream(stream)) {
- return null
- }
- if (stream.writableErrored) {
- return stream.writableErrored
- }
- return (_stream$_writableStat =
- (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined
- ? undefined
- : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined
- ? _stream$_writableStat
- : null
- }
- function isReadableErrored(stream) {
- var _stream$_readableStat, _stream$_readableStat2;
- if (!isNodeStream(stream)) {
- return null
- }
- if (stream.readableErrored) {
- return stream.readableErrored
- }
- return (_stream$_readableStat =
- (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined
- ? undefined
- : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined
- ? _stream$_readableStat
- : null
- }
- function isClosed(stream) {
- if (!isNodeStream(stream)) {
- return null
- }
- if (typeof stream.closed === 'boolean') {
- return stream.closed
- }
- const wState = stream._writableState;
- const rState = stream._readableState;
- if (
- typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||
- typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'
- ) {
- return (
- (wState === null || wState === undefined ? undefined : wState.closed) ||
- (rState === null || rState === undefined ? undefined : rState.closed)
- )
- }
- if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
- return stream._closed
- }
- return null
- }
- function isOutgoingMessage(stream) {
- return (
- typeof stream._closed === 'boolean' &&
- typeof stream._defaultKeepAlive === 'boolean' &&
- typeof stream._removedConnection === 'boolean' &&
- typeof stream._removedContLen === 'boolean'
- )
- }
- function isServerResponse(stream) {
- return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)
- }
- function isServerRequest(stream) {
- var _stream$req;
- return (
- typeof stream._consuming === 'boolean' &&
- typeof stream._dumped === 'boolean' &&
- ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===
- undefined
- )
- }
- function willEmitClose(stream) {
- if (!isNodeStream(stream)) return null
- const wState = stream._writableState;
- const rState = stream._readableState;
- const state = wState || rState;
- return (
- (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)
- )
- }
- function isDisturbed(stream) {
- var _stream$kIsDisturbed;
- return !!(
- stream &&
- ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined
- ? _stream$kIsDisturbed
- : stream.readableDidRead || stream.readableAborted)
- )
- }
- function isErrored(stream) {
- var _ref,
- _ref2,
- _ref3,
- _ref4,
- _ref5,
- _stream$kIsErrored,
- _stream$_readableStat3,
- _stream$_writableStat3,
- _stream$_readableStat4,
- _stream$_writableStat4;
- return !!(
- stream &&
- ((_ref =
- (_ref2 =
- (_ref3 =
- (_ref4 =
- (_ref5 =
- (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined
- ? _stream$kIsErrored
- : stream.readableErrored) !== null && _ref5 !== undefined
- ? _ref5
- : stream.writableErrored) !== null && _ref4 !== undefined
- ? _ref4
- : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined
- ? undefined
- : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined
- ? _ref3
- : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined
- ? undefined
- : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined
- ? _ref2
- : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined
- ? undefined
- : _stream$_readableStat4.errored) !== null && _ref !== undefined
- ? _ref
- : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined
- ? undefined
- : _stream$_writableStat4.errored)
- )
- }
- utils = {
- kDestroyed,
- isDisturbed,
- kIsDisturbed,
- isErrored,
- kIsErrored,
- isReadable,
- kIsReadable,
- isClosed,
- isDestroyed,
- isDuplexNodeStream,
- isFinished,
- isIterable,
- isReadableNodeStream,
- isReadableEnded,
- isReadableFinished,
- isReadableErrored,
- isNodeStream,
- isWritable,
- isWritableNodeStream,
- isWritableEnded,
- isWritableFinished,
- isWritableErrored,
- isServerRequest,
- isServerResponse,
- willEmitClose
- };
- return utils;
-}
-
-/* replacement start */
-
-var hasRequiredEndOfStream;
-
-function requireEndOfStream () {
- if (hasRequiredEndOfStream) return endOfStreamExports;
- hasRequiredEndOfStream = 1;
- const process = requireProcess()
-
- /* replacement end */
- // Ported from https://github.com/mafintosh/end-of-stream with
- // permission from the author, Mathias Buus (@mafintosh).
-
- ; const { AbortError, codes } = requireErrors();
- const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes;
- const { kEmptyObject, once } = requireUtil();
- const { validateAbortSignal, validateFunction, validateObject } = requireValidators();
- const { Promise } = requirePrimordials();
- const {
- isClosed,
- isReadable,
- isReadableNodeStream,
- isReadableFinished,
- isReadableErrored,
- isWritable,
- isWritableNodeStream,
- isWritableFinished,
- isWritableErrored,
- isNodeStream,
- willEmitClose: _willEmitClose
- } = requireUtils();
- function isRequest(stream) {
- return stream.setHeader && typeof stream.abort === 'function'
- }
- const nop = () => {};
- function eos(stream, options, callback) {
- var _options$readable, _options$writable;
- if (arguments.length === 2) {
- callback = options;
- options = kEmptyObject;
- } else if (options == null) {
- options = kEmptyObject;
- } else {
- validateObject(options, 'options');
- }
- validateFunction(callback, 'callback');
- validateAbortSignal(options.signal, 'options.signal');
- callback = once(callback);
- const readable =
- (_options$readable = options.readable) !== null && _options$readable !== undefined
- ? _options$readable
- : isReadableNodeStream(stream);
- const writable =
- (_options$writable = options.writable) !== null && _options$writable !== undefined
- ? _options$writable
- : isWritableNodeStream(stream);
- if (!isNodeStream(stream)) {
- // TODO: Webstreams.
- throw new ERR_INVALID_ARG_TYPE('stream', 'Stream', stream)
- }
- const wState = stream._writableState;
- const rState = stream._readableState;
- const onlegacyfinish = () => {
- if (!stream.writable) {
- onfinish();
- }
- };
-
- // TODO (ronag): Improve soft detection to include core modules and
- // common ecosystem modules that do properly emit 'close' but fail
- // this generic check.
- let willEmitClose =
- _willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable;
- let writableFinished = isWritableFinished(stream, false);
- const onfinish = () => {
- writableFinished = true;
- // Stream should not be destroyed here. If it is that
- // means that user space is doing something differently and
- // we cannot trust willEmitClose.
- if (stream.destroyed) {
- willEmitClose = false;
- }
- if (willEmitClose && (!stream.readable || readable)) {
- return
- }
- if (!readable || readableFinished) {
- callback.call(stream);
- }
- };
- let readableFinished = isReadableFinished(stream, false);
- const onend = () => {
- readableFinished = true;
- // Stream should not be destroyed here. If it is that
- // means that user space is doing something differently and
- // we cannot trust willEmitClose.
- if (stream.destroyed) {
- willEmitClose = false;
- }
- if (willEmitClose && (!stream.writable || writable)) {
- return
- }
- if (!writable || writableFinished) {
- callback.call(stream);
- }
- };
- const onerror = (err) => {
- callback.call(stream, err);
- };
- let closed = isClosed(stream);
- const onclose = () => {
- closed = true;
- const errored = isWritableErrored(stream) || isReadableErrored(stream);
- if (errored && typeof errored !== 'boolean') {
- return callback.call(stream, errored)
- }
- if (readable && !readableFinished && isReadableNodeStream(stream, true)) {
- if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
- }
- if (writable && !writableFinished) {
- if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
- }
- callback.call(stream);
- };
- const onrequest = () => {
- stream.req.on('finish', onfinish);
- };
- if (isRequest(stream)) {
- stream.on('complete', onfinish);
- if (!willEmitClose) {
- stream.on('abort', onclose);
- }
- if (stream.req) {
- onrequest();
- } else {
- stream.on('request', onrequest);
- }
- } else if (writable && !wState) {
- // legacy streams
- stream.on('end', onlegacyfinish);
- stream.on('close', onlegacyfinish);
- }
-
- // Not all streams will emit 'close' after 'aborted'.
- if (!willEmitClose && typeof stream.aborted === 'boolean') {
- stream.on('aborted', onclose);
- }
- stream.on('end', onend);
- stream.on('finish', onfinish);
- if (options.error !== false) {
- stream.on('error', onerror);
- }
- stream.on('close', onclose);
- if (closed) {
- process.nextTick(onclose);
- } else if (
- (wState !== null && wState !== undefined && wState.errorEmitted) ||
- (rState !== null && rState !== undefined && rState.errorEmitted)
- ) {
- if (!willEmitClose) {
- process.nextTick(onclose);
- }
- } else if (
- !readable &&
- (!willEmitClose || isReadable(stream)) &&
- (writableFinished || isWritable(stream) === false)
- ) {
- process.nextTick(onclose);
- } else if (
- !writable &&
- (!willEmitClose || isWritable(stream)) &&
- (readableFinished || isReadable(stream) === false)
- ) {
- process.nextTick(onclose);
- } else if (rState && stream.req && stream.aborted) {
- process.nextTick(onclose);
- }
- const cleanup = () => {
- callback = nop;
- stream.removeListener('aborted', onclose);
- stream.removeListener('complete', onfinish);
- stream.removeListener('abort', onclose);
- stream.removeListener('request', onrequest);
- if (stream.req) stream.req.removeListener('finish', onfinish);
- stream.removeListener('end', onlegacyfinish);
- stream.removeListener('close', onlegacyfinish);
- stream.removeListener('finish', onfinish);
- stream.removeListener('end', onend);
- stream.removeListener('error', onerror);
- stream.removeListener('close', onclose);
- };
- if (options.signal && !closed) {
- const abort = () => {
- // Keep it because cleanup removes it.
- const endCallback = callback;
- cleanup();
- endCallback.call(
- stream,
- new AbortError(undefined, {
- cause: options.signal.reason
- })
- );
- };
- if (options.signal.aborted) {
- process.nextTick(abort);
- } else {
- const originalCallback = callback;
- callback = once((...args) => {
- options.signal.removeEventListener('abort', abort);
- originalCallback.apply(stream, args);
- });
- options.signal.addEventListener('abort', abort);
- }
- }
- return cleanup
- }
- function finished(stream, opts) {
- return new Promise((resolve, reject) => {
- eos(stream, opts, (err) => {
- if (err) {
- reject(err);
- } else {
- resolve();
- }
- });
- })
- }
- endOfStream.exports = eos;
- endOfStreamExports.finished = finished;
- return endOfStreamExports;
-}
-
-var hasRequiredOperators;
-
-function requireOperators () {
- if (hasRequiredOperators) return operators;
- hasRequiredOperators = 1;
-
- const AbortController = globalThis.AbortController || require$$9.AbortController;
- const {
- codes: { ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE },
- AbortError
- } = requireErrors();
- const { validateAbortSignal, validateInteger, validateObject } = requireValidators();
- const kWeakHandler = requirePrimordials().Symbol('kWeak');
- const { finished } = requireEndOfStream();
- const {
- ArrayPrototypePush,
- MathFloor,
- Number,
- NumberIsNaN,
- Promise,
- PromiseReject,
- PromisePrototypeThen,
- Symbol
- } = requirePrimordials();
- const kEmpty = Symbol('kEmpty');
- const kEof = Symbol('kEof');
- function map(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- let concurrency = 1;
- if ((options === null || options === undefined ? undefined : options.concurrency) != null) {
- concurrency = MathFloor(options.concurrency);
- }
- validateInteger(concurrency, 'concurrency', 1);
- return async function* map() {
- var _options$signal, _options$signal2;
- const ac = new AbortController();
- const stream = this;
- const queue = [];
- const signal = ac.signal;
- const signalOpt = {
- signal
- };
- const abort = () => ac.abort();
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal = options.signal) !== null &&
- _options$signal !== undefined &&
- _options$signal.aborted
- ) {
- abort();
- }
- options === null || options === undefined
- ? undefined
- : (_options$signal2 = options.signal) === null || _options$signal2 === undefined
- ? undefined
- : _options$signal2.addEventListener('abort', abort);
- let next;
- let resume;
- let done = false;
- function onDone() {
- done = true;
- }
- async function pump() {
- try {
- for await (let val of stream) {
- var _val;
- if (done) {
- return
- }
- if (signal.aborted) {
- throw new AbortError()
- }
- try {
- val = fn(val, signalOpt);
- } catch (err) {
- val = PromiseReject(err);
- }
- if (val === kEmpty) {
- continue
- }
- if (typeof ((_val = val) === null || _val === undefined ? undefined : _val.catch) === 'function') {
- val.catch(onDone);
- }
- queue.push(val);
- if (next) {
- next();
- next = null;
- }
- if (!done && queue.length && queue.length >= concurrency) {
- await new Promise((resolve) => {
- resume = resolve;
- });
- }
- }
- queue.push(kEof);
- } catch (err) {
- const val = PromiseReject(err);
- PromisePrototypeThen(val, undefined, onDone);
- queue.push(val);
- } finally {
- var _options$signal3;
- done = true;
- if (next) {
- next();
- next = null;
- }
- options === null || options === undefined
- ? undefined
- : (_options$signal3 = options.signal) === null || _options$signal3 === undefined
- ? undefined
- : _options$signal3.removeEventListener('abort', abort);
- }
- }
- pump();
- try {
- while (true) {
- while (queue.length > 0) {
- const val = await queue[0];
- if (val === kEof) {
- return
- }
- if (signal.aborted) {
- throw new AbortError()
- }
- if (val !== kEmpty) {
- yield val;
- }
- queue.shift();
- if (resume) {
- resume();
- resume = null;
- }
- }
- await new Promise((resolve) => {
- next = resolve;
- });
- }
- } finally {
- ac.abort();
- done = true;
- if (resume) {
- resume();
- resume = null;
- }
- }
- }.call(this)
- }
- function asIndexedPairs(options = undefined) {
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- return async function* asIndexedPairs() {
- let index = 0;
- for await (const val of this) {
- var _options$signal4;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal4 = options.signal) !== null &&
- _options$signal4 !== undefined &&
- _options$signal4.aborted
- ) {
- throw new AbortError({
- cause: options.signal.reason
- })
- }
- yield [index++, val];
- }
- }.call(this)
- }
- async function some(fn, options = undefined) {
- for await (const unused of filter.call(this, fn, options)) {
- return true
- }
- return false
- }
- async function every(fn, options = undefined) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- // https://en.wikipedia.org/wiki/De_Morgan%27s_laws
- return !(await some.call(
- this,
- async (...args) => {
- return !(await fn(...args))
- },
- options
- ))
- }
- async function find(fn, options) {
- for await (const result of filter.call(this, fn, options)) {
- return result
- }
- return undefined
- }
- async function forEach(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- async function forEachFn(value, options) {
- await fn(value, options);
- return kEmpty
- }
- // eslint-disable-next-line no-unused-vars
- for await (const unused of map.call(this, forEachFn, options));
- }
- function filter(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- async function filterFn(value, options) {
- if (await fn(value, options)) {
- return value
- }
- return kEmpty
- }
- return map.call(this, filterFn, options)
- }
-
- // Specific to provide better error to reduce since the argument is only
- // missing if the stream has no items in it - but the code is still appropriate
- class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS {
- constructor() {
- super('reduce');
- this.message = 'Reduce of an empty stream requires an initial value';
- }
- }
- async function reduce(reducer, initialValue, options) {
- var _options$signal5;
- if (typeof reducer !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer)
- }
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- let hasInitialValue = arguments.length > 1;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal5 = options.signal) !== null &&
- _options$signal5 !== undefined &&
- _options$signal5.aborted
- ) {
- const err = new AbortError(undefined, {
- cause: options.signal.reason
- });
- this.once('error', () => {}); // The error is already propagated
- await finished(this.destroy(err));
- throw err
- }
- const ac = new AbortController();
- const signal = ac.signal;
- if (options !== null && options !== undefined && options.signal) {
- const opts = {
- once: true,
- [kWeakHandler]: this
- };
- options.signal.addEventListener('abort', () => ac.abort(), opts);
- }
- let gotAnyItemFromStream = false;
- try {
- for await (const value of this) {
- var _options$signal6;
- gotAnyItemFromStream = true;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal6 = options.signal) !== null &&
- _options$signal6 !== undefined &&
- _options$signal6.aborted
- ) {
- throw new AbortError()
- }
- if (!hasInitialValue) {
- initialValue = value;
- hasInitialValue = true;
- } else {
- initialValue = await reducer(initialValue, value, {
- signal
- });
- }
- }
- if (!gotAnyItemFromStream && !hasInitialValue) {
- throw new ReduceAwareErrMissingArgs()
- }
- } finally {
- ac.abort();
- }
- return initialValue
- }
- async function toArray(options) {
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- const result = [];
- for await (const val of this) {
- var _options$signal7;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal7 = options.signal) !== null &&
- _options$signal7 !== undefined &&
- _options$signal7.aborted
- ) {
- throw new AbortError(undefined, {
- cause: options.signal.reason
- })
- }
- ArrayPrototypePush(result, val);
- }
- return result
- }
- function flatMap(fn, options) {
- const values = map.call(this, fn, options);
- return async function* flatMap() {
- for await (const val of values) {
- yield* val;
- }
- }.call(this)
- }
- function toIntegerOrInfinity(number) {
- // We coerce here to align with the spec
- // https://github.com/tc39/proposal-iterator-helpers/issues/169
- number = Number(number);
- if (NumberIsNaN(number)) {
- return 0
- }
- if (number < 0) {
- throw new ERR_OUT_OF_RANGE('number', '>= 0', number)
- }
- return number
- }
- function drop(number, options = undefined) {
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- number = toIntegerOrInfinity(number);
- return async function* drop() {
- var _options$signal8;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal8 = options.signal) !== null &&
- _options$signal8 !== undefined &&
- _options$signal8.aborted
- ) {
- throw new AbortError()
- }
- for await (const val of this) {
- var _options$signal9;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal9 = options.signal) !== null &&
- _options$signal9 !== undefined &&
- _options$signal9.aborted
- ) {
- throw new AbortError()
- }
- if (number-- <= 0) {
- yield val;
- }
- }
- }.call(this)
- }
- function take(number, options = undefined) {
- if (options != null) {
- validateObject(options, 'options');
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal');
- }
- number = toIntegerOrInfinity(number);
- return async function* take() {
- var _options$signal10;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal10 = options.signal) !== null &&
- _options$signal10 !== undefined &&
- _options$signal10.aborted
- ) {
- throw new AbortError()
- }
- for await (const val of this) {
- var _options$signal11;
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal11 = options.signal) !== null &&
- _options$signal11 !== undefined &&
- _options$signal11.aborted
- ) {
- throw new AbortError()
- }
- if (number-- > 0) {
- yield val;
- } else {
- return
- }
- }
- }.call(this)
- }
- operators.streamReturningOperators = {
- asIndexedPairs,
- drop,
- filter,
- flatMap,
- map,
- take
- };
- operators.promiseReturningOperators = {
- every,
- forEach,
- reduce,
- toArray,
- some,
- find
- };
- return operators;
-}
-
-var destroy_1;
-var hasRequiredDestroy;
-
-function requireDestroy () {
- if (hasRequiredDestroy) return destroy_1;
- hasRequiredDestroy = 1;
-
- /* replacement start */
-
- const process = requireProcess();
-
- /* replacement end */
-
- const {
- aggregateTwoErrors,
- codes: { ERR_MULTIPLE_CALLBACK },
- AbortError
- } = requireErrors();
- const { Symbol } = requirePrimordials();
- const { kDestroyed, isDestroyed, isFinished, isServerRequest } = requireUtils();
- const kDestroy = Symbol('kDestroy');
- const kConstruct = Symbol('kConstruct');
- function checkError(err, w, r) {
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack; // eslint-disable-line no-unused-expressions
-
- if (w && !w.errored) {
- w.errored = err;
- }
- if (r && !r.errored) {
- r.errored = err;
- }
- }
- }
-
- // Backwards compat. cb() is undocumented and unused in core but
- // unfortunately might be used by modules.
- function destroy(err, cb) {
- const r = this._readableState;
- const w = this._writableState;
- // With duplex streams we use the writable side for state.
- const s = w || r;
- if ((w && w.destroyed) || (r && r.destroyed)) {
- if (typeof cb === 'function') {
- cb();
- }
- return this
- }
-
- // We set destroyed to true before firing error callbacks in order
- // to make it re-entrance safe in case destroy() is called within callbacks
- checkError(err, w, r);
- if (w) {
- w.destroyed = true;
- }
- if (r) {
- r.destroyed = true;
- }
-
- // If still constructing then defer calling _destroy.
- if (!s.constructed) {
- this.once(kDestroy, function (er) {
- _destroy(this, aggregateTwoErrors(er, err), cb);
- });
- } else {
- _destroy(this, err, cb);
- }
- return this
- }
- function _destroy(self, err, cb) {
- let called = false;
- function onDestroy(err) {
- if (called) {
- return
- }
- called = true;
- const r = self._readableState;
- const w = self._writableState;
- checkError(err, w, r);
- if (w) {
- w.closed = true;
- }
- if (r) {
- r.closed = true;
- }
- if (typeof cb === 'function') {
- cb(err);
- }
- if (err) {
- process.nextTick(emitErrorCloseNT, self, err);
- } else {
- process.nextTick(emitCloseNT, self);
- }
- }
- try {
- self._destroy(err || null, onDestroy);
- } catch (err) {
- onDestroy(err);
- }
- }
- function emitErrorCloseNT(self, err) {
- emitErrorNT(self, err);
- emitCloseNT(self);
- }
- function emitCloseNT(self) {
- const r = self._readableState;
- const w = self._writableState;
- if (w) {
- w.closeEmitted = true;
- }
- if (r) {
- r.closeEmitted = true;
- }
- if ((w && w.emitClose) || (r && r.emitClose)) {
- self.emit('close');
- }
- }
- function emitErrorNT(self, err) {
- const r = self._readableState;
- const w = self._writableState;
- if ((w && w.errorEmitted) || (r && r.errorEmitted)) {
- return
- }
- if (w) {
- w.errorEmitted = true;
- }
- if (r) {
- r.errorEmitted = true;
- }
- self.emit('error', err);
- }
- function undestroy() {
- const r = this._readableState;
- const w = this._writableState;
- if (r) {
- r.constructed = true;
- r.closed = false;
- r.closeEmitted = false;
- r.destroyed = false;
- r.errored = null;
- r.errorEmitted = false;
- r.reading = false;
- r.ended = r.readable === false;
- r.endEmitted = r.readable === false;
- }
- if (w) {
- w.constructed = true;
- w.destroyed = false;
- w.closed = false;
- w.closeEmitted = false;
- w.errored = null;
- w.errorEmitted = false;
- w.finalCalled = false;
- w.prefinished = false;
- w.ended = w.writable === false;
- w.ending = w.writable === false;
- w.finished = w.writable === false;
- }
- }
- function errorOrDestroy(stream, err, sync) {
- // We have tests that rely on errors being emitted
- // in the same tick, so changing this is semver major.
- // For now when you opt-in to autoDestroy we allow
- // the error to be emitted nextTick. In a future
- // semver major update we should change the default to this.
-
- const r = stream._readableState;
- const w = stream._writableState;
- if ((w && w.destroyed) || (r && r.destroyed)) {
- return this
- }
- if ((r && r.autoDestroy) || (w && w.autoDestroy)) stream.destroy(err);
- else if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack; // eslint-disable-line no-unused-expressions
-
- if (w && !w.errored) {
- w.errored = err;
- }
- if (r && !r.errored) {
- r.errored = err;
- }
- if (sync) {
- process.nextTick(emitErrorNT, stream, err);
- } else {
- emitErrorNT(stream, err);
- }
- }
- }
- function construct(stream, cb) {
- if (typeof stream._construct !== 'function') {
- return
- }
- const r = stream._readableState;
- const w = stream._writableState;
- if (r) {
- r.constructed = false;
- }
- if (w) {
- w.constructed = false;
- }
- stream.once(kConstruct, cb);
- if (stream.listenerCount(kConstruct) > 1) {
- // Duplex
- return
- }
- process.nextTick(constructNT, stream);
- }
- function constructNT(stream) {
- let called = false;
- function onConstruct(err) {
- if (called) {
- errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK());
- return
- }
- called = true;
- const r = stream._readableState;
- const w = stream._writableState;
- const s = w || r;
- if (r) {
- r.constructed = true;
- }
- if (w) {
- w.constructed = true;
- }
- if (s.destroyed) {
- stream.emit(kDestroy, err);
- } else if (err) {
- errorOrDestroy(stream, err, true);
- } else {
- process.nextTick(emitConstructNT, stream);
- }
- }
- try {
- stream._construct(onConstruct);
- } catch (err) {
- onConstruct(err);
- }
- }
- function emitConstructNT(stream) {
- stream.emit(kConstruct);
- }
- function isRequest(stream) {
- return stream && stream.setHeader && typeof stream.abort === 'function'
- }
- function emitCloseLegacy(stream) {
- stream.emit('close');
- }
- function emitErrorCloseLegacy(stream, err) {
- stream.emit('error', err);
- process.nextTick(emitCloseLegacy, stream);
- }
-
- // Normalize destroy for legacy.
- function destroyer(stream, err) {
- if (!stream || isDestroyed(stream)) {
- return
- }
- if (!err && !isFinished(stream)) {
- err = new AbortError();
- }
-
- // TODO: Remove isRequest branches.
- if (isServerRequest(stream)) {
- stream.socket = null;
- stream.destroy(err);
- } else if (isRequest(stream)) {
- stream.abort();
- } else if (isRequest(stream.req)) {
- stream.req.abort();
- } else if (typeof stream.destroy === 'function') {
- stream.destroy(err);
- } else if (typeof stream.close === 'function') {
- // TODO: Don't lose err?
- stream.close();
- } else if (err) {
- process.nextTick(emitErrorCloseLegacy, stream, err);
- } else {
- process.nextTick(emitCloseLegacy, stream);
- }
- if (!stream.destroyed) {
- stream[kDestroyed] = true;
- }
- }
- destroy_1 = {
- construct,
- destroyer,
- destroy,
- undestroy,
- errorOrDestroy
- };
- return destroy_1;
-}
-
-var legacy;
-var hasRequiredLegacy;
-
-function requireLegacy () {
- if (hasRequiredLegacy) return legacy;
- hasRequiredLegacy = 1;
-
- const { ArrayIsArray, ObjectSetPrototypeOf } = requirePrimordials();
- const { EventEmitter: EE } = require$$2;
- function Stream(opts) {
- EE.call(this, opts);
- }
- ObjectSetPrototypeOf(Stream.prototype, EE.prototype);
- ObjectSetPrototypeOf(Stream, EE);
- Stream.prototype.pipe = function (dest, options) {
- const source = this;
- function ondata(chunk) {
- if (dest.writable && dest.write(chunk) === false && source.pause) {
- source.pause();
- }
- }
- source.on('data', ondata);
- function ondrain() {
- if (source.readable && source.resume) {
- source.resume();
- }
- }
- dest.on('drain', ondrain);
-
- // If the 'end' option is not supplied, dest.end() will be called when
- // source gets the 'end' or 'close' events. Only dest.end() once.
- if (!dest._isStdio && (!options || options.end !== false)) {
- source.on('end', onend);
- source.on('close', onclose);
- }
- let didOnEnd = false;
- function onend() {
- if (didOnEnd) return
- didOnEnd = true;
- dest.end();
- }
- function onclose() {
- if (didOnEnd) return
- didOnEnd = true;
- if (typeof dest.destroy === 'function') dest.destroy();
- }
-
- // Don't leave dangling pipes when there are errors.
- function onerror(er) {
- cleanup();
- if (EE.listenerCount(this, 'error') === 0) {
- this.emit('error', er);
- }
- }
- prependListener(source, 'error', onerror);
- prependListener(dest, 'error', onerror);
-
- // Remove all the event listeners that were added.
- function cleanup() {
- source.removeListener('data', ondata);
- dest.removeListener('drain', ondrain);
- source.removeListener('end', onend);
- source.removeListener('close', onclose);
- source.removeListener('error', onerror);
- dest.removeListener('error', onerror);
- source.removeListener('end', cleanup);
- source.removeListener('close', cleanup);
- dest.removeListener('close', cleanup);
- }
- source.on('end', cleanup);
- source.on('close', cleanup);
- dest.on('close', cleanup);
- dest.emit('pipe', source);
-
- // Allow for unix-like usage: A.pipe(B).pipe(C)
- return dest
- };
- function prependListener(emitter, event, fn) {
- // Sadly this is not cacheable as some libraries bundle their own
- // event emitter implementation with them.
- if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn)
-
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- // the prependListener() method. The goal is to eventually remove this hack.
- if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);
- else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn);
- else emitter._events[event] = [fn, emitter._events[event]];
- }
- legacy = {
- Stream,
- prependListener
- };
- return legacy;
-}
-
-var addAbortSignalExports = {};
-var addAbortSignal = {
- get exports(){ return addAbortSignalExports; },
- set exports(v){ addAbortSignalExports = v; },
-};
-
-var hasRequiredAddAbortSignal;
-
-function requireAddAbortSignal () {
- if (hasRequiredAddAbortSignal) return addAbortSignalExports;
- hasRequiredAddAbortSignal = 1;
- (function (module) {
-
- const { AbortError, codes } = requireErrors();
- const eos = requireEndOfStream();
- const { ERR_INVALID_ARG_TYPE } = codes;
-
- // This method is inlined here for readable-stream
- // It also does not allow for signal to not exist on the stream
- // https://github.com/nodejs/node/pull/36061#discussion_r533718029
- const validateAbortSignal = (signal, name) => {
- if (typeof signal !== 'object' || !('aborted' in signal)) {
- throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
- }
- };
- function isNodeStream(obj) {
- return !!(obj && typeof obj.pipe === 'function')
- }
- module.exports.addAbortSignal = function addAbortSignal(signal, stream) {
- validateAbortSignal(signal, 'signal');
- if (!isNodeStream(stream)) {
- throw new ERR_INVALID_ARG_TYPE('stream', 'stream.Stream', stream)
- }
- return module.exports.addAbortSignalNoValidate(signal, stream)
- };
- module.exports.addAbortSignalNoValidate = function (signal, stream) {
- if (typeof signal !== 'object' || !('aborted' in signal)) {
- return stream
- }
- const onAbort = () => {
- stream.destroy(
- new AbortError(undefined, {
- cause: signal.reason
- })
- );
- };
- if (signal.aborted) {
- onAbort();
- } else {
- signal.addEventListener('abort', onAbort);
- eos(stream, () => signal.removeEventListener('abort', onAbort));
- }
- return stream
- };
-} (addAbortSignal));
- return addAbortSignalExports;
-}
-
-var buffer_list;
-var hasRequiredBuffer_list;
-
-function requireBuffer_list () {
- if (hasRequiredBuffer_list) return buffer_list;
- hasRequiredBuffer_list = 1;
-
- const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = requirePrimordials();
- const { Buffer } = require$$0;
- const { inspect } = requireUtil();
- buffer_list = class BufferList {
- constructor() {
- this.head = null;
- this.tail = null;
- this.length = 0;
- }
- push(v) {
- const entry = {
- data: v,
- next: null
- };
- if (this.length > 0) this.tail.next = entry;
- else this.head = entry;
- this.tail = entry;
- ++this.length;
- }
- unshift(v) {
- const entry = {
- data: v,
- next: this.head
- };
- if (this.length === 0) this.tail = entry;
- this.head = entry;
- ++this.length;
- }
- shift() {
- if (this.length === 0) return
- const ret = this.head.data;
- if (this.length === 1) this.head = this.tail = null;
- else this.head = this.head.next;
- --this.length;
- return ret
- }
- clear() {
- this.head = this.tail = null;
- this.length = 0;
- }
- join(s) {
- if (this.length === 0) return ''
- let p = this.head;
- let ret = '' + p.data;
- while ((p = p.next) !== null) ret += s + p.data;
- return ret
- }
- concat(n) {
- if (this.length === 0) return Buffer.alloc(0)
- const ret = Buffer.allocUnsafe(n >>> 0);
- let p = this.head;
- let i = 0;
- while (p) {
- TypedArrayPrototypeSet(ret, p.data, i);
- i += p.data.length;
- p = p.next;
- }
- return ret
- }
-
- // Consumes a specified amount of bytes or characters from the buffered data.
- consume(n, hasStrings) {
- const data = this.head.data;
- if (n < data.length) {
- // `slice` is the same for buffers and strings.
- const slice = data.slice(0, n);
- this.head.data = data.slice(n);
- return slice
- }
- if (n === data.length) {
- // First chunk is a perfect match.
- return this.shift()
- }
- // Result spans more than one buffer.
- return hasStrings ? this._getString(n) : this._getBuffer(n)
- }
- first() {
- return this.head.data
- }
- *[SymbolIterator]() {
- for (let p = this.head; p; p = p.next) {
- yield p.data;
- }
- }
-
- // Consumes a specified amount of characters from the buffered data.
- _getString(n) {
- let ret = '';
- let p = this.head;
- let c = 0;
- do {
- const str = p.data;
- if (n > str.length) {
- ret += str;
- n -= str.length;
- } else {
- if (n === str.length) {
- ret += str;
- ++c;
- if (p.next) this.head = p.next;
- else this.head = this.tail = null;
- } else {
- ret += StringPrototypeSlice(str, 0, n);
- this.head = p;
- p.data = StringPrototypeSlice(str, n);
- }
- break
- }
- ++c;
- } while ((p = p.next) !== null)
- this.length -= c;
- return ret
- }
-
- // Consumes a specified amount of bytes from the buffered data.
- _getBuffer(n) {
- const ret = Buffer.allocUnsafe(n);
- const retLen = n;
- let p = this.head;
- let c = 0;
- do {
- const buf = p.data;
- if (n > buf.length) {
- TypedArrayPrototypeSet(ret, buf, retLen - n);
- n -= buf.length;
- } else {
- if (n === buf.length) {
- TypedArrayPrototypeSet(ret, buf, retLen - n);
- ++c;
- if (p.next) this.head = p.next;
- else this.head = this.tail = null;
- } else {
- TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n);
- this.head = p;
- p.data = buf.slice(n);
- }
- break
- }
- ++c;
- } while ((p = p.next) !== null)
- this.length -= c;
- return ret
- }
-
- // Make sure the linked list only shows the minimal necessary information.
- [Symbol.for('nodejs.util.inspect.custom')](_, options) {
- return inspect(this, {
- ...options,
- // Only inspect one level.
- depth: 0,
- // It should not recurse.
- customInspect: false
- })
- }
- };
- return buffer_list;
-}
-
-var state;
-var hasRequiredState;
-
-function requireState () {
- if (hasRequiredState) return state;
- hasRequiredState = 1;
-
- const { MathFloor, NumberIsInteger } = requirePrimordials();
- const { ERR_INVALID_ARG_VALUE } = requireErrors().codes;
- function highWaterMarkFrom(options, isDuplex, duplexKey) {
- return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null
- }
- function getDefaultHighWaterMark(objectMode) {
- return objectMode ? 16 : 16 * 1024
- }
- function getHighWaterMark(state, options, duplexKey, isDuplex) {
- const hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
- if (hwm != null) {
- if (!NumberIsInteger(hwm) || hwm < 0) {
- const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark';
- throw new ERR_INVALID_ARG_VALUE(name, hwm)
- }
- return MathFloor(hwm)
- }
-
- // Default value
- return getDefaultHighWaterMark(state.objectMode)
- }
- state = {
- getHighWaterMark,
- getDefaultHighWaterMark
- };
- return state;
-}
-
-var from_1;
-var hasRequiredFrom;
-
-function requireFrom () {
- if (hasRequiredFrom) return from_1;
- hasRequiredFrom = 1;
-
- /* replacement start */
-
- const process = requireProcess();
-
- /* replacement end */
-
- const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = requirePrimordials();
- const { Buffer } = require$$0;
- const { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = requireErrors().codes;
- function from(Readable, iterable, opts) {
- let iterator;
- if (typeof iterable === 'string' || iterable instanceof Buffer) {
- return new Readable({
- objectMode: true,
- ...opts,
- read() {
- this.push(iterable);
- this.push(null);
- }
- })
- }
- let isAsync;
- if (iterable && iterable[SymbolAsyncIterator]) {
- isAsync = true;
- iterator = iterable[SymbolAsyncIterator]();
- } else if (iterable && iterable[SymbolIterator]) {
- isAsync = false;
- iterator = iterable[SymbolIterator]();
- } else {
- throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable)
- }
- const readable = new Readable({
- objectMode: true,
- highWaterMark: 1,
- // TODO(ronag): What options should be allowed?
- ...opts
- });
-
- // Flag to protect against _read
- // being called before last iteration completion.
- let reading = false;
- readable._read = function () {
- if (!reading) {
- reading = true;
- next();
- }
- };
- readable._destroy = function (error, cb) {
- PromisePrototypeThen(
- close(error),
- () => process.nextTick(cb, error),
- // nextTick is here in case cb throws
- (e) => process.nextTick(cb, e || error)
- );
- };
- async function close(error) {
- const hadError = error !== undefined && error !== null;
- const hasThrow = typeof iterator.throw === 'function';
- if (hadError && hasThrow) {
- const { value, done } = await iterator.throw(error);
- await value;
- if (done) {
- return
- }
- }
- if (typeof iterator.return === 'function') {
- const { value } = await iterator.return();
- await value;
- }
- }
- async function next() {
- for (;;) {
- try {
- const { value, done } = isAsync ? await iterator.next() : iterator.next();
- if (done) {
- readable.push(null);
- } else {
- const res = value && typeof value.then === 'function' ? await value : value;
- if (res === null) {
- reading = false;
- throw new ERR_STREAM_NULL_VALUES()
- } else if (readable.push(res)) {
- continue
- } else {
- reading = false;
- }
- }
- } catch (err) {
- readable.destroy(err);
- }
- break
- }
- }
- return readable
- }
- from_1 = from;
- return from_1;
-}
-
-/* replacement start */
-
-var readable;
-var hasRequiredReadable;
-
-function requireReadable () {
- if (hasRequiredReadable) return readable;
- hasRequiredReadable = 1;
- const process = requireProcess()
-
- /* replacement end */
- // Copyright Joyent, Inc. and other Node 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.
-
- ; const {
- ArrayPrototypeIndexOf,
- NumberIsInteger,
- NumberIsNaN,
- NumberParseInt,
- ObjectDefineProperties,
- ObjectKeys,
- ObjectSetPrototypeOf,
- Promise,
- SafeSet,
- SymbolAsyncIterator,
- Symbol
- } = requirePrimordials();
- readable = Readable;
- Readable.ReadableState = ReadableState;
- const { EventEmitter: EE } = require$$2;
- const { Stream, prependListener } = requireLegacy();
- const { Buffer } = require$$0;
- const { addAbortSignal } = requireAddAbortSignal();
- const eos = requireEndOfStream();
- let debug = requireUtil().debuglog('stream', (fn) => {
- debug = fn;
- });
- const BufferList = requireBuffer_list();
- const destroyImpl = requireDestroy();
- const { getHighWaterMark, getDefaultHighWaterMark } = requireState();
- const {
- aggregateTwoErrors,
- codes: {
- ERR_INVALID_ARG_TYPE,
- ERR_METHOD_NOT_IMPLEMENTED,
- ERR_OUT_OF_RANGE,
- ERR_STREAM_PUSH_AFTER_EOF,
- ERR_STREAM_UNSHIFT_AFTER_END_EVENT
- }
- } = requireErrors();
- const { validateObject } = requireValidators();
- const kPaused = Symbol('kPaused');
- const { StringDecoder } = require$$13;
- const from = requireFrom();
- ObjectSetPrototypeOf(Readable.prototype, Stream.prototype);
- ObjectSetPrototypeOf(Readable, Stream);
- const nop = () => {};
- const { errorOrDestroy } = destroyImpl;
- function ReadableState(options, stream, isDuplex) {
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex();
-
- // Object stream flag. Used to make read(n) ignore n and to
- // make all the buffer merging and length checks go away.
- this.objectMode = !!(options && options.objectMode);
- if (isDuplex) this.objectMode = this.objectMode || !!(options && options.readableObjectMode);
-
- // The point at which it stops calling _read() to fill the buffer
- // Note: 0 is a valid value, means "don't call _read preemptively ever"
- this.highWaterMark = options
- ? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex)
- : getDefaultHighWaterMark(false);
-
- // A linked list is used to store data chunks instead of an array because the
- // linked list can remove elements from the beginning faster than
- // array.shift().
- this.buffer = new BufferList();
- this.length = 0;
- this.pipes = [];
- this.flowing = null;
- this.ended = false;
- this.endEmitted = false;
- this.reading = false;
-
- // Stream is still being constructed and cannot be
- // destroyed until construction finished or failed.
- // Async construction is opt in, therefore we start as
- // constructed.
- this.constructed = true;
-
- // A flag to be able to tell if the event 'readable'/'data' is emitted
- // immediately, or on a later tick. We set this to true at first, because
- // any actions that shouldn't happen until "later" should generally also
- // not happen before the first read call.
- this.sync = true;
-
- // Whenever we return null, then we set a flag to say
- // that we're awaiting a 'readable' event emission.
- this.needReadable = false;
- this.emittedReadable = false;
- this.readableListening = false;
- this.resumeScheduled = false;
- this[kPaused] = null;
-
- // True if the error was already emitted and should not be thrown again.
- this.errorEmitted = false;
-
- // Should close be emitted on destroy. Defaults to true.
- this.emitClose = !options || options.emitClose !== false;
-
- // Should .destroy() be called after 'end' (and potentially 'finish').
- this.autoDestroy = !options || options.autoDestroy !== false;
-
- // Has it been destroyed.
- this.destroyed = false;
-
- // Indicates whether the stream has errored. When true no further
- // _read calls, 'data' or 'readable' events should occur. This is needed
- // since when autoDestroy is disabled we need a way to tell whether the
- // stream has failed.
- this.errored = null;
-
- // Indicates whether the stream has finished destroying.
- this.closed = false;
-
- // True if close has been emitted or would have been emitted
- // depending on emitClose.
- this.closeEmitted = false;
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
-
- // Ref the piped dest which we need a drain event on it
- // type: null | Writable | Set.
- this.awaitDrainWriters = null;
- this.multiAwaitDrain = false;
-
- // If true, a maybeReadMore has been scheduled.
- this.readingMore = false;
- this.dataEmitted = false;
- this.decoder = null;
- this.encoding = null;
- if (options && options.encoding) {
- this.decoder = new StringDecoder(options.encoding);
- this.encoding = options.encoding;
- }
- }
- function Readable(options) {
- if (!(this instanceof Readable)) return new Readable(options)
-
- // Checking for a Stream.Duplex instance is faster here instead of inside
- // the ReadableState constructor, at least with V8 6.5.
- const isDuplex = this instanceof requireDuplex();
- this._readableState = new ReadableState(options, this, isDuplex);
- if (options) {
- if (typeof options.read === 'function') this._read = options.read;
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
- if (typeof options.construct === 'function') this._construct = options.construct;
- if (options.signal && !isDuplex) addAbortSignal(options.signal, this);
- }
- Stream.call(this, options);
- destroyImpl.construct(this, () => {
- if (this._readableState.needReadable) {
- maybeReadMore(this, this._readableState);
- }
- });
- }
- Readable.prototype.destroy = destroyImpl.destroy;
- Readable.prototype._undestroy = destroyImpl.undestroy;
- Readable.prototype._destroy = function (err, cb) {
- cb(err);
- };
- Readable.prototype[EE.captureRejectionSymbol] = function (err) {
- this.destroy(err);
- };
-
- // Manually shove something into the read() buffer.
- // This returns true if the highWaterMark has not been hit yet,
- // similar to how Writable.write() returns true if you should
- // write() some more.
- Readable.prototype.push = function (chunk, encoding) {
- return readableAddChunk(this, chunk, encoding, false)
- };
-
- // Unshift should *always* be something directly out of read().
- Readable.prototype.unshift = function (chunk, encoding) {
- return readableAddChunk(this, chunk, encoding, true)
- };
- function readableAddChunk(stream, chunk, encoding, addToFront) {
- debug('readableAddChunk', chunk);
- const state = stream._readableState;
- let err;
- if (!state.objectMode) {
- if (typeof chunk === 'string') {
- encoding = encoding || state.defaultEncoding;
- if (state.encoding !== encoding) {
- if (addToFront && state.encoding) {
- // When unshifting, if state.encoding is set, we have to save
- // the string in the BufferList with the state encoding.
- chunk = Buffer.from(chunk, encoding).toString(state.encoding);
- } else {
- chunk = Buffer.from(chunk, encoding);
- encoding = '';
- }
- }
- } else if (chunk instanceof Buffer) {
- encoding = '';
- } else if (Stream._isUint8Array(chunk)) {
- chunk = Stream._uint8ArrayToBuffer(chunk);
- encoding = '';
- } else if (chunk != null) {
- err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
- }
- }
- if (err) {
- errorOrDestroy(stream, err);
- } else if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
- } else if (state.objectMode || (chunk && chunk.length > 0)) {
- if (addToFront) {
- if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());
- else if (state.destroyed || state.errored) return false
- else addChunk(stream, state, chunk, true);
- } else if (state.ended) {
- errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
- } else if (state.destroyed || state.errored) {
- return false
- } else {
- state.reading = false;
- if (state.decoder && !encoding) {
- chunk = state.decoder.write(chunk);
- if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);
- else maybeReadMore(stream, state);
- } else {
- addChunk(stream, state, chunk, false);
- }
- }
- } else if (!addToFront) {
- state.reading = false;
- maybeReadMore(stream, state);
- }
-
- // We can push more data if we are below the highWaterMark.
- // Also, if we have no data yet, we can stand some more bytes.
- // This is to work around cases where hwm=0, such as the repl.
- return !state.ended && (state.length < state.highWaterMark || state.length === 0)
- }
- function addChunk(stream, state, chunk, addToFront) {
- if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) {
- // Use the guard to avoid creating `Set()` repeatedly
- // when we have multiple pipes.
- if (state.multiAwaitDrain) {
- state.awaitDrainWriters.clear();
- } else {
- state.awaitDrainWriters = null;
- }
- state.dataEmitted = true;
- stream.emit('data', chunk);
- } else {
- // Update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length;
- if (addToFront) state.buffer.unshift(chunk);
- else state.buffer.push(chunk);
- if (state.needReadable) emitReadable(stream);
- }
- maybeReadMore(stream, state);
- }
- Readable.prototype.isPaused = function () {
- const state = this._readableState;
- return state[kPaused] === true || state.flowing === false
- };
-
- // Backwards compatibility.
- Readable.prototype.setEncoding = function (enc) {
- const decoder = new StringDecoder(enc);
- this._readableState.decoder = decoder;
- // If setEncoding(null), decoder.encoding equals utf8.
- this._readableState.encoding = this._readableState.decoder.encoding;
- const buffer = this._readableState.buffer;
- // Iterate over current buffer to convert already stored Buffers:
- let content = '';
- for (const data of buffer) {
- content += decoder.write(data);
- }
- buffer.clear();
- if (content !== '') buffer.push(content);
- this._readableState.length = content.length;
- return this
- };
-
- // Don't raise the hwm > 1GB.
- const MAX_HWM = 0x40000000;
- function computeNewHighWaterMark(n) {
- if (n > MAX_HWM) {
- throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n)
- } else {
- // Get the next highest power of 2 to prevent increasing hwm excessively in
- // tiny amounts.
- n--;
- n |= n >>> 1;
- n |= n >>> 2;
- n |= n >>> 4;
- n |= n >>> 8;
- n |= n >>> 16;
- n++;
- }
- return n
- }
-
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function howMuchToRead(n, state) {
- if (n <= 0 || (state.length === 0 && state.ended)) return 0
- if (state.objectMode) return 1
- if (NumberIsNaN(n)) {
- // Only flow one buffer at a time.
- if (state.flowing && state.length) return state.buffer.first().length
- return state.length
- }
- if (n <= state.length) return n
- return state.ended ? state.length : 0
- }
-
- // You can override either this method, or the async _read(n) below.
- Readable.prototype.read = function (n) {
- debug('read', n);
- // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
- // in this scenario, so we are doing it manually.
- if (n === undefined) {
- n = NaN;
- } else if (!NumberIsInteger(n)) {
- n = NumberParseInt(n, 10);
- }
- const state = this._readableState;
- const nOrig = n;
-
- // If we're asking for more than the current hwm, then raise the hwm.
- if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
- if (n !== 0) state.emittedReadable = false;
-
- // If we're doing read(0) to trigger a readable event, but we
- // already have a bunch of data in the buffer, then just trigger
- // the 'readable' event and move on.
- if (
- n === 0 &&
- state.needReadable &&
- ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)
- ) {
- debug('read: emitReadable', state.length, state.ended);
- if (state.length === 0 && state.ended) endReadable(this);
- else emitReadable(this);
- return null
- }
- n = howMuchToRead(n, state);
-
- // If we've ended, and we're now clear, then finish it up.
- if (n === 0 && state.ended) {
- if (state.length === 0) endReadable(this);
- return null
- }
-
- // All the actual chunk generation logic needs to be
- // *below* the call to _read. The reason is that in certain
- // synthetic stream cases, such as passthrough streams, _read
- // may be a completely synchronous operation which may change
- // the state of the read buffer, providing enough data when
- // before there was *not* enough.
- //
- // So, the steps are:
- // 1. Figure out what the state of things will be after we do
- // a read from the buffer.
- //
- // 2. If that resulting state will trigger a _read, then call _read.
- // Note that this may be asynchronous, or synchronous. Yes, it is
- // deeply ugly to write APIs this way, but that still doesn't mean
- // that the Readable class should behave improperly, as streams are
- // designed to be sync/async agnostic.
- // Take note if the _read call is sync or async (ie, if the read call
- // has returned yet), so that we know whether or not it's safe to emit
- // 'readable' etc.
- //
- // 3. Actually pull the requested chunks out of the buffer and return.
-
- // if we need a readable event, then we need to do some reading.
- let doRead = state.needReadable;
- debug('need readable', doRead);
-
- // If we currently have less than the highWaterMark, then also read some.
- if (state.length === 0 || state.length - n < state.highWaterMark) {
- doRead = true;
- debug('length less than watermark', doRead);
- }
-
- // However, if we've ended, then there's no point, if we're already
- // reading, then it's unnecessary, if we're constructing we have to wait,
- // and if we're destroyed or errored, then it's not allowed,
- if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) {
- doRead = false;
- debug('reading, ended or constructing', doRead);
- } else if (doRead) {
- debug('do read');
- state.reading = true;
- state.sync = true;
- // If the length is currently zero, then we *need* a readable event.
- if (state.length === 0) state.needReadable = true;
-
- // Call internal read method
- try {
- this._read(state.highWaterMark);
- } catch (err) {
- errorOrDestroy(this, err);
- }
- state.sync = false;
- // If _read pushed data synchronously, then `reading` will be false,
- // and we need to re-evaluate how much data we can return to the user.
- if (!state.reading) n = howMuchToRead(nOrig, state);
- }
- let ret;
- if (n > 0) ret = fromList(n, state);
- else ret = null;
- if (ret === null) {
- state.needReadable = state.length <= state.highWaterMark;
- n = 0;
- } else {
- state.length -= n;
- if (state.multiAwaitDrain) {
- state.awaitDrainWriters.clear();
- } else {
- state.awaitDrainWriters = null;
- }
- }
- if (state.length === 0) {
- // If we have nothing in the buffer, then we want to know
- // as soon as we *do* get something into the buffer.
- if (!state.ended) state.needReadable = true;
-
- // If we tried to read() past the EOF, then emit end on the next tick.
- if (nOrig !== n && state.ended) endReadable(this);
- }
- if (ret !== null && !state.errorEmitted && !state.closeEmitted) {
- state.dataEmitted = true;
- this.emit('data', ret);
- }
- return ret
- };
- function onEofChunk(stream, state) {
- debug('onEofChunk');
- if (state.ended) return
- if (state.decoder) {
- const chunk = state.decoder.end();
- if (chunk && chunk.length) {
- state.buffer.push(chunk);
- state.length += state.objectMode ? 1 : chunk.length;
- }
- }
- state.ended = true;
- if (state.sync) {
- // If we are sync, wait until next tick to emit the data.
- // Otherwise we risk emitting data in the flow()
- // the readable code triggers during a read() call.
- emitReadable(stream);
- } else {
- // Emit 'readable' now to make sure it gets picked up.
- state.needReadable = false;
- state.emittedReadable = true;
- // We have to emit readable now that we are EOF. Modules
- // in the ecosystem (e.g. dicer) rely on this event being sync.
- emitReadable_(stream);
- }
- }
-
- // Don't emit readable right away in sync mode, because this can trigger
- // another read() call => stack overflow. This way, it might trigger
- // a nextTick recursion warning, but that's not so bad.
- function emitReadable(stream) {
- const state = stream._readableState;
- debug('emitReadable', state.needReadable, state.emittedReadable);
- state.needReadable = false;
- if (!state.emittedReadable) {
- debug('emitReadable', state.flowing);
- state.emittedReadable = true;
- process.nextTick(emitReadable_, stream);
- }
- }
- function emitReadable_(stream) {
- const state = stream._readableState;
- debug('emitReadable_', state.destroyed, state.length, state.ended);
- if (!state.destroyed && !state.errored && (state.length || state.ended)) {
- stream.emit('readable');
- state.emittedReadable = false;
- }
-
- // The stream needs another readable event if:
- // 1. It is not flowing, as the flow mechanism will take
- // care of it.
- // 2. It is not ended.
- // 3. It is below the highWaterMark, so we can schedule
- // another readable later.
- state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
- flow(stream);
- }
-
- // At this point, the user has presumably seen the 'readable' event,
- // and called read() to consume some data. that may have triggered
- // in turn another _read(n) call, in which case reading = true if
- // it's in progress.
- // However, if we're not ended, or reading, and the length < hwm,
- // then go ahead and try to read some more preemptively.
- function maybeReadMore(stream, state) {
- if (!state.readingMore && state.constructed) {
- state.readingMore = true;
- process.nextTick(maybeReadMore_, stream, state);
- }
- }
- function maybeReadMore_(stream, state) {
- // Attempt to read more data if we should.
- //
- // The conditions for reading more data are (one of):
- // - Not enough data buffered (state.length < state.highWaterMark). The loop
- // is responsible for filling the buffer with enough data if such data
- // is available. If highWaterMark is 0 and we are not in the flowing mode
- // we should _not_ attempt to buffer any extra data. We'll get more data
- // when the stream consumer calls read() instead.
- // - No data in the buffer, and the stream is in flowing mode. In this mode
- // the loop below is responsible for ensuring read() is called. Failing to
- // call read here would abort the flow and there's no other mechanism for
- // continuing the flow if the stream consumer has just subscribed to the
- // 'data' event.
- //
- // In addition to the above conditions to keep reading data, the following
- // conditions prevent the data from being read:
- // - The stream has ended (state.ended).
- // - There is already a pending 'read' operation (state.reading). This is a
- // case where the stream has called the implementation defined _read()
- // method, but they are processing the call asynchronously and have _not_
- // called push() with new data. In this case we skip performing more
- // read()s. The execution ends in this method again after the _read() ends
- // up calling push() with more data.
- while (
- !state.reading &&
- !state.ended &&
- (state.length < state.highWaterMark || (state.flowing && state.length === 0))
- ) {
- const len = state.length;
- debug('maybeReadMore read 0');
- stream.read(0);
- if (len === state.length)
- // Didn't get any data, stop spinning.
- break
- }
- state.readingMore = false;
- }
-
- // Abstract method. to be overridden in specific implementation classes.
- // call cb(er, data) where data is <= n in length.
- // for virtual (non-string, non-buffer) streams, "length" is somewhat
- // arbitrary, and perhaps not very meaningful.
- Readable.prototype._read = function (n) {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_read()')
- };
- Readable.prototype.pipe = function (dest, pipeOpts) {
- const src = this;
- const state = this._readableState;
- if (state.pipes.length === 1) {
- if (!state.multiAwaitDrain) {
- state.multiAwaitDrain = true;
- state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : []);
- }
- }
- state.pipes.push(dest);
- debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts);
- const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
- const endFn = doEnd ? onend : unpipe;
- if (state.endEmitted) process.nextTick(endFn);
- else src.once('end', endFn);
- dest.on('unpipe', onunpipe);
- function onunpipe(readable, unpipeInfo) {
- debug('onunpipe');
- if (readable === src) {
- if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
- unpipeInfo.hasUnpiped = true;
- cleanup();
- }
- }
- }
- function onend() {
- debug('onend');
- dest.end();
- }
- let ondrain;
- let cleanedUp = false;
- function cleanup() {
- debug('cleanup');
- // Cleanup event handlers once the pipe is broken.
- dest.removeListener('close', onclose);
- dest.removeListener('finish', onfinish);
- if (ondrain) {
- dest.removeListener('drain', ondrain);
- }
- dest.removeListener('error', onerror);
- dest.removeListener('unpipe', onunpipe);
- src.removeListener('end', onend);
- src.removeListener('end', unpipe);
- src.removeListener('data', ondata);
- cleanedUp = true;
-
- // If the reader is waiting for a drain event from this
- // specific writer, then it would cause it to never start
- // flowing again.
- // So, if this is awaiting a drain, then we just call it now.
- // If we don't know, then assume that we are waiting for one.
- if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain();
- }
- function pause() {
- // If the user unpiped during `dest.write()`, it is possible
- // to get stuck in a permanently paused state if that write
- // also returned false.
- // => Check whether `dest` is still a piping destination.
- if (!cleanedUp) {
- if (state.pipes.length === 1 && state.pipes[0] === dest) {
- debug('false write response, pause', 0);
- state.awaitDrainWriters = dest;
- state.multiAwaitDrain = false;
- } else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
- debug('false write response, pause', state.awaitDrainWriters.size);
- state.awaitDrainWriters.add(dest);
- }
- src.pause();
- }
- if (!ondrain) {
- // When the dest drains, it reduces the awaitDrain counter
- // on the source. This would be more elegant with a .once()
- // handler in flow(), but adding and removing repeatedly is
- // too slow.
- ondrain = pipeOnDrain(src, dest);
- dest.on('drain', ondrain);
- }
- }
- src.on('data', ondata);
- function ondata(chunk) {
- debug('ondata');
- const ret = dest.write(chunk);
- debug('dest.write', ret);
- if (ret === false) {
- pause();
- }
- }
-
- // If the dest has an error, then stop piping into it.
- // However, don't suppress the throwing behavior for this.
- function onerror(er) {
- debug('onerror', er);
- unpipe();
- dest.removeListener('error', onerror);
- if (dest.listenerCount('error') === 0) {
- const s = dest._writableState || dest._readableState;
- if (s && !s.errorEmitted) {
- // User incorrectly emitted 'error' directly on the stream.
- errorOrDestroy(dest, er);
- } else {
- dest.emit('error', er);
- }
- }
- }
-
- // Make sure our error handler is attached before userland ones.
- prependListener(dest, 'error', onerror);
-
- // Both close and finish should trigger unpipe, but only once.
- function onclose() {
- dest.removeListener('finish', onfinish);
- unpipe();
- }
- dest.once('close', onclose);
- function onfinish() {
- debug('onfinish');
- dest.removeListener('close', onclose);
- unpipe();
- }
- dest.once('finish', onfinish);
- function unpipe() {
- debug('unpipe');
- src.unpipe(dest);
- }
-
- // Tell the dest that it's being piped to.
- dest.emit('pipe', src);
-
- // Start the flow if it hasn't been started already.
-
- if (dest.writableNeedDrain === true) {
- if (state.flowing) {
- pause();
- }
- } else if (!state.flowing) {
- debug('pipe resume');
- src.resume();
- }
- return dest
- };
- function pipeOnDrain(src, dest) {
- return function pipeOnDrainFunctionResult() {
- const state = src._readableState;
-
- // `ondrain` will call directly,
- // `this` maybe not a reference to dest,
- // so we use the real dest here.
- if (state.awaitDrainWriters === dest) {
- debug('pipeOnDrain', 1);
- state.awaitDrainWriters = null;
- } else if (state.multiAwaitDrain) {
- debug('pipeOnDrain', state.awaitDrainWriters.size);
- state.awaitDrainWriters.delete(dest);
- }
- if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) {
- src.resume();
- }
- }
- }
- Readable.prototype.unpipe = function (dest) {
- const state = this._readableState;
- const unpipeInfo = {
- hasUnpiped: false
- };
-
- // If we're not piping anywhere, then do nothing.
- if (state.pipes.length === 0) return this
- if (!dest) {
- // remove all.
- const dests = state.pipes;
- state.pipes = [];
- this.pause();
- for (let i = 0; i < dests.length; i++)
- dests[i].emit('unpipe', this, {
- hasUnpiped: false
- });
- return this
- }
-
- // Try to find the right one.
- const index = ArrayPrototypeIndexOf(state.pipes, dest);
- if (index === -1) return this
- state.pipes.splice(index, 1);
- if (state.pipes.length === 0) this.pause();
- dest.emit('unpipe', this, unpipeInfo);
- return this
- };
-
- // Set up data events if they are asked for
- // Ensure readable listeners eventually get something.
- Readable.prototype.on = function (ev, fn) {
- const res = Stream.prototype.on.call(this, ev, fn);
- const state = this._readableState;
- if (ev === 'data') {
- // Update readableListening so that resume() may be a no-op
- // a few lines down. This is needed to support once('readable').
- state.readableListening = this.listenerCount('readable') > 0;
-
- // Try start flowing on next tick if stream isn't explicitly paused.
- if (state.flowing !== false) this.resume();
- } else if (ev === 'readable') {
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.flowing = false;
- state.emittedReadable = false;
- debug('on readable', state.length, state.reading);
- if (state.length) {
- emitReadable(this);
- } else if (!state.reading) {
- process.nextTick(nReadingNextTick, this);
- }
- }
- }
- return res
- };
- Readable.prototype.addListener = Readable.prototype.on;
- Readable.prototype.removeListener = function (ev, fn) {
- const res = Stream.prototype.removeListener.call(this, ev, fn);
- if (ev === 'readable') {
- // We need to check if there is someone still listening to
- // readable and reset the state. However this needs to happen
- // after readable has been emitted but before I/O (nextTick) to
- // support once('readable', fn) cycles. This means that calling
- // resume within the same tick will have no
- // effect.
- process.nextTick(updateReadableListening, this);
- }
- return res
- };
- Readable.prototype.off = Readable.prototype.removeListener;
- Readable.prototype.removeAllListeners = function (ev) {
- const res = Stream.prototype.removeAllListeners.apply(this, arguments);
- if (ev === 'readable' || ev === undefined) {
- // We need to check if there is someone still listening to
- // readable and reset the state. However this needs to happen
- // after readable has been emitted but before I/O (nextTick) to
- // support once('readable', fn) cycles. This means that calling
- // resume within the same tick will have no
- // effect.
- process.nextTick(updateReadableListening, this);
- }
- return res
- };
- function updateReadableListening(self) {
- const state = self._readableState;
- state.readableListening = self.listenerCount('readable') > 0;
- if (state.resumeScheduled && state[kPaused] === false) {
- // Flowing needs to be set to true now, otherwise
- // the upcoming resume will not flow.
- state.flowing = true;
-
- // Crude way to check if we should resume.
- } else if (self.listenerCount('data') > 0) {
- self.resume();
- } else if (!state.readableListening) {
- state.flowing = null;
- }
- }
- function nReadingNextTick(self) {
- debug('readable nexttick read 0');
- self.read(0);
- }
-
- // pause() and resume() are remnants of the legacy readable stream API
- // If the user uses them, then switch into old mode.
- Readable.prototype.resume = function () {
- const state = this._readableState;
- if (!state.flowing) {
- debug('resume');
- // We flow only if there is no one listening
- // for readable, but we still have to call
- // resume().
- state.flowing = !state.readableListening;
- resume(this, state);
- }
- state[kPaused] = false;
- return this
- };
- function resume(stream, state) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true;
- process.nextTick(resume_, stream, state);
- }
- }
- function resume_(stream, state) {
- debug('resume', state.reading);
- if (!state.reading) {
- stream.read(0);
- }
- state.resumeScheduled = false;
- stream.emit('resume');
- flow(stream);
- if (state.flowing && !state.reading) stream.read(0);
- }
- Readable.prototype.pause = function () {
- debug('call pause flowing=%j', this._readableState.flowing);
- if (this._readableState.flowing !== false) {
- debug('pause');
- this._readableState.flowing = false;
- this.emit('pause');
- }
- this._readableState[kPaused] = true;
- return this
- };
- function flow(stream) {
- const state = stream._readableState;
- debug('flow', state.flowing);
- while (state.flowing && stream.read() !== null);
- }
-
- // Wrap an old-style stream as the async data source.
- // This is *not* part of the readable stream interface.
- // It is an ugly unfortunate mess of history.
- Readable.prototype.wrap = function (stream) {
- let paused = false;
-
- // TODO (ronag): Should this.destroy(err) emit
- // 'error' on the wrapped stream? Would require
- // a static factory method, e.g. Readable.wrap(stream).
-
- stream.on('data', (chunk) => {
- if (!this.push(chunk) && stream.pause) {
- paused = true;
- stream.pause();
- }
- });
- stream.on('end', () => {
- this.push(null);
- });
- stream.on('error', (err) => {
- errorOrDestroy(this, err);
- });
- stream.on('close', () => {
- this.destroy();
- });
- stream.on('destroy', () => {
- this.destroy();
- });
- this._read = () => {
- if (paused && stream.resume) {
- paused = false;
- stream.resume();
- }
- };
-
- // Proxy all the other methods. Important when wrapping filters and duplexes.
- const streamKeys = ObjectKeys(stream);
- for (let j = 1; j < streamKeys.length; j++) {
- const i = streamKeys[j];
- if (this[i] === undefined && typeof stream[i] === 'function') {
- this[i] = stream[i].bind(stream);
- }
- }
- return this
- };
- Readable.prototype[SymbolAsyncIterator] = function () {
- return streamToAsyncIterator(this)
- };
- Readable.prototype.iterator = function (options) {
- if (options !== undefined) {
- validateObject(options, 'options');
- }
- return streamToAsyncIterator(this, options)
- };
- function streamToAsyncIterator(stream, options) {
- if (typeof stream.read !== 'function') {
- stream = Readable.wrap(stream, {
- objectMode: true
- });
- }
- const iter = createAsyncIterator(stream, options);
- iter.stream = stream;
- return iter
- }
- async function* createAsyncIterator(stream, options) {
- let callback = nop;
- function next(resolve) {
- if (this === stream) {
- callback();
- callback = nop;
- } else {
- callback = resolve;
- }
- }
- stream.on('readable', next);
- let error;
- const cleanup = eos(
- stream,
- {
- writable: false
- },
- (err) => {
- error = err ? aggregateTwoErrors(error, err) : null;
- callback();
- callback = nop;
- }
- );
- try {
- while (true) {
- const chunk = stream.destroyed ? null : stream.read();
- if (chunk !== null) {
- yield chunk;
- } else if (error) {
- throw error
- } else if (error === null) {
- return
- } else {
- await new Promise(next);
- }
- }
- } catch (err) {
- error = aggregateTwoErrors(error, err);
- throw error
- } finally {
- if (
- (error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) &&
- (error === undefined || stream._readableState.autoDestroy)
- ) {
- destroyImpl.destroyer(stream, null);
- } else {
- stream.off('readable', next);
- cleanup();
- }
- }
- }
-
- // Making it explicit these properties are not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail.
- ObjectDefineProperties(Readable.prototype, {
- readable: {
- __proto__: null,
- get() {
- const r = this._readableState;
- // r.readable === false means that this is part of a Duplex stream
- // where the readable side was disabled upon construction.
- // Compat. The user might manually disable readable side through
- // deprecated setter.
- return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted
- },
- set(val) {
- // Backwards compat.
- if (this._readableState) {
- this._readableState.readable = !!val;
- }
- }
- },
- readableDidRead: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.dataEmitted
- }
- },
- readableAborted: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return !!(
- this._readableState.readable !== false &&
- (this._readableState.destroyed || this._readableState.errored) &&
- !this._readableState.endEmitted
- )
- }
- },
- readableHighWaterMark: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.highWaterMark
- }
- },
- readableBuffer: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState && this._readableState.buffer
- }
- },
- readableFlowing: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.flowing
- },
- set: function (state) {
- if (this._readableState) {
- this._readableState.flowing = state;
- }
- }
- },
- readableLength: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState.length
- }
- },
- readableObjectMode: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.objectMode : false
- }
- },
- readableEncoding: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.encoding : null
- }
- },
- errored: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.errored : null
- }
- },
- closed: {
- __proto__: null,
- get() {
- return this._readableState ? this._readableState.closed : false
- }
- },
- destroyed: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.destroyed : false
- },
- set(value) {
- // We ignore the value if the stream
- // has not been initialized yet.
- if (!this._readableState) {
- return
- }
-
- // Backward compatibility, the user is explicitly
- // managing destroyed.
- this._readableState.destroyed = value;
- }
- },
- readableEnded: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.endEmitted : false
- }
- }
- });
- ObjectDefineProperties(ReadableState.prototype, {
- // Legacy getter for `pipesCount`.
- pipesCount: {
- __proto__: null,
- get() {
- return this.pipes.length
- }
- },
- // Legacy property for `paused`.
- paused: {
- __proto__: null,
- get() {
- return this[kPaused] !== false
- },
- set(value) {
- this[kPaused] = !!value;
- }
- }
- });
-
- // Exposed for testing purposes only.
- Readable._fromList = fromList;
-
- // Pluck off n bytes from an array of buffers.
- // Length is the combined lengths of all the buffers in the list.
- // This function is designed to be inlinable, so please take care when making
- // changes to the function body.
- function fromList(n, state) {
- // nothing buffered.
- if (state.length === 0) return null
- let ret;
- if (state.objectMode) ret = state.buffer.shift();
- else if (!n || n >= state.length) {
- // Read it all, truncate the list.
- if (state.decoder) ret = state.buffer.join('');
- else if (state.buffer.length === 1) ret = state.buffer.first();
- else ret = state.buffer.concat(state.length);
- state.buffer.clear();
- } else {
- // read part of list.
- ret = state.buffer.consume(n, state.decoder);
- }
- return ret
- }
- function endReadable(stream) {
- const state = stream._readableState;
- debug('endReadable', state.endEmitted);
- if (!state.endEmitted) {
- state.ended = true;
- process.nextTick(endReadableNT, state, stream);
- }
- }
- function endReadableNT(state, stream) {
- debug('endReadableNT', state.endEmitted, state.length);
-
- // Check that we didn't get one last unshift.
- if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) {
- state.endEmitted = true;
- stream.emit('end');
- if (stream.writable && stream.allowHalfOpen === false) {
- process.nextTick(endWritableNT, stream);
- } else if (state.autoDestroy) {
- // In case of duplex streams we need a way to detect
- // if the writable side is ready for autoDestroy as well.
- const wState = stream._writableState;
- const autoDestroy =
- !wState ||
- (wState.autoDestroy &&
- // We don't expect the writable to ever 'finish'
- // if writable is explicitly set to false.
- (wState.finished || wState.writable === false));
- if (autoDestroy) {
- stream.destroy();
- }
- }
- }
- }
- function endWritableNT(stream) {
- const writable = stream.writable && !stream.writableEnded && !stream.destroyed;
- if (writable) {
- stream.end();
- }
- }
- Readable.from = function (iterable, opts) {
- return from(Readable, iterable, opts)
- };
- let webStreamsAdapters;
-
- // Lazy to avoid circular references
- function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {};
- return webStreamsAdapters
- }
- Readable.fromWeb = function (readableStream, options) {
- return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options)
- };
- Readable.toWeb = function (streamReadable, options) {
- return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options)
- };
- Readable.wrap = function (src, options) {
- var _ref, _src$readableObjectMo;
- return new Readable({
- objectMode:
- (_ref =
- (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined
- ? _src$readableObjectMo
- : src.objectMode) !== null && _ref !== undefined
- ? _ref
- : true,
- ...options,
- destroy(err, callback) {
- destroyImpl.destroyer(src, err);
- callback(err);
- }
- }).wrap(src)
- };
- return readable;
-}
-
-/* replacement start */
-
-var writable;
-var hasRequiredWritable;
-
-function requireWritable () {
- if (hasRequiredWritable) return writable;
- hasRequiredWritable = 1;
- const process = requireProcess()
-
- /* replacement end */
- // Copyright Joyent, Inc. and other Node 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.
-
- // A bit simpler than readable streams.
- // Implement an async ._write(chunk, encoding, cb), and it'll handle all
- // the drain event emission and buffering.
-
- ; const {
- ArrayPrototypeSlice,
- Error,
- FunctionPrototypeSymbolHasInstance,
- ObjectDefineProperty,
- ObjectDefineProperties,
- ObjectSetPrototypeOf,
- StringPrototypeToLowerCase,
- Symbol,
- SymbolHasInstance
- } = requirePrimordials();
- writable = Writable;
- Writable.WritableState = WritableState;
- const { EventEmitter: EE } = require$$2;
- const Stream = requireLegacy().Stream;
- const { Buffer } = require$$0;
- const destroyImpl = requireDestroy();
- const { addAbortSignal } = requireAddAbortSignal();
- const { getHighWaterMark, getDefaultHighWaterMark } = requireState();
- const {
- ERR_INVALID_ARG_TYPE,
- ERR_METHOD_NOT_IMPLEMENTED,
- ERR_MULTIPLE_CALLBACK,
- ERR_STREAM_CANNOT_PIPE,
- ERR_STREAM_DESTROYED,
- ERR_STREAM_ALREADY_FINISHED,
- ERR_STREAM_NULL_VALUES,
- ERR_STREAM_WRITE_AFTER_END,
- ERR_UNKNOWN_ENCODING
- } = requireErrors().codes;
- const { errorOrDestroy } = destroyImpl;
- ObjectSetPrototypeOf(Writable.prototype, Stream.prototype);
- ObjectSetPrototypeOf(Writable, Stream);
- function nop() {}
- const kOnFinished = Symbol('kOnFinished');
- function WritableState(options, stream, isDuplex) {
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream,
- // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
- if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof requireDuplex();
-
- // Object stream flag to indicate whether or not this stream
- // contains buffers or objects.
- this.objectMode = !!(options && options.objectMode);
- if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode);
-
- // The point at which write() starts returning false
- // Note: 0 is a valid value, means that we always return false if
- // the entire buffer is not flushed immediately on write().
- this.highWaterMark = options
- ? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex)
- : getDefaultHighWaterMark(false);
-
- // if _final has been called.
- this.finalCalled = false;
-
- // drain event flag.
- this.needDrain = false;
- // At the start of calling end()
- this.ending = false;
- // When end() has been called, and returned.
- this.ended = false;
- // When 'finish' is emitted.
- this.finished = false;
-
- // Has it been destroyed
- this.destroyed = false;
-
- // Should we decode strings into buffers before passing to _write?
- // this is here so that some node-core streams can optimize string
- // handling at a lower level.
- const noDecode = !!(options && options.decodeStrings === false);
- this.decodeStrings = !noDecode;
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
-
- // Not an actual buffer we keep track of, but a measurement
- // of how much we're waiting to get pushed to some underlying
- // socket or file.
- this.length = 0;
-
- // A flag to see when we're in the middle of a write.
- this.writing = false;
-
- // When true all writes will be buffered until .uncork() call.
- this.corked = 0;
-
- // A flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true;
-
- // A flag to know if we're processing previously buffered items, which
- // may call the _write() callback in the same tick, so that we don't
- // end up in an overlapped onwrite situation.
- this.bufferProcessing = false;
-
- // The callback that's passed to _write(chunk, cb).
- this.onwrite = onwrite.bind(undefined, stream);
-
- // The callback that the user supplies to write(chunk, encoding, cb).
- this.writecb = null;
-
- // The amount that is being written when _write is called.
- this.writelen = 0;
-
- // Storage for data passed to the afterWrite() callback in case of
- // synchronous _write() completion.
- this.afterWriteTickInfo = null;
- resetBuffer(this);
-
- // Number of pending user-supplied write callbacks
- // this must be 0 before 'finish' can be emitted.
- this.pendingcb = 0;
-
- // Stream is still being constructed and cannot be
- // destroyed until construction finished or failed.
- // Async construction is opt in, therefore we start as
- // constructed.
- this.constructed = true;
-
- // Emit prefinish if the only thing we're waiting for is _write cbs
- // This is relevant for synchronous Transform streams.
- this.prefinished = false;
-
- // True if the error was already emitted and should not be thrown again.
- this.errorEmitted = false;
-
- // Should close be emitted on destroy. Defaults to true.
- this.emitClose = !options || options.emitClose !== false;
-
- // Should .destroy() be called after 'finish' (and potentially 'end').
- this.autoDestroy = !options || options.autoDestroy !== false;
-
- // Indicates whether the stream has errored. When true all write() calls
- // should return false. This is needed since when autoDestroy
- // is disabled we need a way to tell whether the stream has failed.
- this.errored = null;
-
- // Indicates whether the stream has finished destroying.
- this.closed = false;
-
- // True if close has been emitted or would have been emitted
- // depending on emitClose.
- this.closeEmitted = false;
- this[kOnFinished] = [];
- }
- function resetBuffer(state) {
- state.buffered = [];
- state.bufferedIndex = 0;
- state.allBuffers = true;
- state.allNoop = true;
- }
- WritableState.prototype.getBuffer = function getBuffer() {
- return ArrayPrototypeSlice(this.buffered, this.bufferedIndex)
- };
- ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', {
- __proto__: null,
- get() {
- return this.buffered.length - this.bufferedIndex
- }
- });
- function Writable(options) {
- // Writable ctor is applied to Duplexes, too.
- // `realHasInstance` is necessary because using plain `instanceof`
- // would return false, as no `_writableState` property is attached.
-
- // Trying to use the custom `instanceof` for Writable here will also break the
- // Node.js LazyTransform implementation, which has a non-trivial getter for
- // `_writableState` that would lead to infinite recursion.
-
- // Checking for a Stream.Duplex instance is faster here instead of inside
- // the WritableState constructor, at least with V8 6.5.
- const isDuplex = this instanceof requireDuplex();
- if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options)
- this._writableState = new WritableState(options, this, isDuplex);
- if (options) {
- if (typeof options.write === 'function') this._write = options.write;
- if (typeof options.writev === 'function') this._writev = options.writev;
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
- if (typeof options.final === 'function') this._final = options.final;
- if (typeof options.construct === 'function') this._construct = options.construct;
- if (options.signal) addAbortSignal(options.signal, this);
- }
- Stream.call(this, options);
- destroyImpl.construct(this, () => {
- const state = this._writableState;
- if (!state.writing) {
- clearBuffer(this, state);
- }
- finishMaybe(this, state);
- });
- }
- ObjectDefineProperty(Writable, SymbolHasInstance, {
- __proto__: null,
- value: function (object) {
- if (FunctionPrototypeSymbolHasInstance(this, object)) return true
- if (this !== Writable) return false
- return object && object._writableState instanceof WritableState
- }
- });
-
- // Otherwise people can pipe Writable streams, which is just wrong.
- Writable.prototype.pipe = function () {
- errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
- };
- function _write(stream, chunk, encoding, cb) {
- const state = stream._writableState;
- if (typeof encoding === 'function') {
- cb = encoding;
- encoding = state.defaultEncoding;
- } else {
- if (!encoding) encoding = state.defaultEncoding;
- else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
- if (typeof cb !== 'function') cb = nop;
- }
- if (chunk === null) {
- throw new ERR_STREAM_NULL_VALUES()
- } else if (!state.objectMode) {
- if (typeof chunk === 'string') {
- if (state.decodeStrings !== false) {
- chunk = Buffer.from(chunk, encoding);
- encoding = 'buffer';
- }
- } else if (chunk instanceof Buffer) {
- encoding = 'buffer';
- } else if (Stream._isUint8Array(chunk)) {
- chunk = Stream._uint8ArrayToBuffer(chunk);
- encoding = 'buffer';
- } else {
- throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
- }
- }
- let err;
- if (state.ending) {
- err = new ERR_STREAM_WRITE_AFTER_END();
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED('write');
- }
- if (err) {
- process.nextTick(cb, err);
- errorOrDestroy(stream, err, true);
- return err
- }
- state.pendingcb++;
- return writeOrBuffer(stream, state, chunk, encoding, cb)
- }
- Writable.prototype.write = function (chunk, encoding, cb) {
- return _write(this, chunk, encoding, cb) === true
- };
- Writable.prototype.cork = function () {
- this._writableState.corked++;
- };
- Writable.prototype.uncork = function () {
- const state = this._writableState;
- if (state.corked) {
- state.corked--;
- if (!state.writing) clearBuffer(this, state);
- }
- };
- Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding);
- if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
- this._writableState.defaultEncoding = encoding;
- return this
- };
-
- // If we're already writing something, then just put this
- // in the queue, and wait our turn. Otherwise, call _write
- // If we return false, then we need a drain event, so set that flag.
- function writeOrBuffer(stream, state, chunk, encoding, callback) {
- const len = state.objectMode ? 1 : chunk.length;
- state.length += len;
-
- // stream._write resets state.length
- const ret = state.length < state.highWaterMark;
- // We must ensure that previous needDrain will not be reset to false.
- if (!ret) state.needDrain = true;
- if (state.writing || state.corked || state.errored || !state.constructed) {
- state.buffered.push({
- chunk,
- encoding,
- callback
- });
- if (state.allBuffers && encoding !== 'buffer') {
- state.allBuffers = false;
- }
- if (state.allNoop && callback !== nop) {
- state.allNoop = false;
- }
- } else {
- state.writelen = len;
- state.writecb = callback;
- state.writing = true;
- state.sync = true;
- stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
- }
-
- // Return false if errored or destroyed in order to break
- // any synchronous while(stream.write(data)) loops.
- return ret && !state.errored && !state.destroyed
- }
- function doWrite(stream, state, writev, len, chunk, encoding, cb) {
- state.writelen = len;
- state.writecb = cb;
- state.writing = true;
- state.sync = true;
- if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));
- else if (writev) stream._writev(chunk, state.onwrite);
- else stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
- }
- function onwriteError(stream, state, er, cb) {
- --state.pendingcb;
- cb(er);
- // Ensure callbacks are invoked even when autoDestroy is
- // not enabled. Passing `er` here doesn't make sense since
- // it's related to one specific write, not to the buffered
- // writes.
- errorBuffer(state);
- // This can emit error, but error must always follow cb.
- errorOrDestroy(stream, er);
- }
- function onwrite(stream, er) {
- const state = stream._writableState;
- const sync = state.sync;
- const cb = state.writecb;
- if (typeof cb !== 'function') {
- errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK());
- return
- }
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
- if (er) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- er.stack; // eslint-disable-line no-unused-expressions
-
- if (!state.errored) {
- state.errored = er;
- }
-
- // In case of duplex streams we need to notify the readable side of the
- // error.
- if (stream._readableState && !stream._readableState.errored) {
- stream._readableState.errored = er;
- }
- if (sync) {
- process.nextTick(onwriteError, stream, state, er, cb);
- } else {
- onwriteError(stream, state, er, cb);
- }
- } else {
- if (state.buffered.length > state.bufferedIndex) {
- clearBuffer(stream, state);
- }
- if (sync) {
- // It is a common case that the callback passed to .write() is always
- // the same. In that case, we do not schedule a new nextTick(), but
- // rather just increase a counter, to improve performance and avoid
- // memory allocations.
- if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) {
- state.afterWriteTickInfo.count++;
- } else {
- state.afterWriteTickInfo = {
- count: 1,
- cb,
- stream,
- state
- };
- process.nextTick(afterWriteTick, state.afterWriteTickInfo);
- }
- } else {
- afterWrite(stream, state, 1, cb);
- }
- }
- }
- function afterWriteTick({ stream, state, count, cb }) {
- state.afterWriteTickInfo = null;
- return afterWrite(stream, state, count, cb)
- }
- function afterWrite(stream, state, count, cb) {
- const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain;
- if (needDrain) {
- state.needDrain = false;
- stream.emit('drain');
- }
- while (count-- > 0) {
- state.pendingcb--;
- cb();
- }
- if (state.destroyed) {
- errorBuffer(state);
- }
- finishMaybe(stream, state);
- }
-
- // If there's something in the buffer waiting, then invoke callbacks.
- function errorBuffer(state) {
- if (state.writing) {
- return
- }
- for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
- var _state$errored;
- const { chunk, callback } = state.buffered[n];
- const len = state.objectMode ? 1 : chunk.length;
- state.length -= len;
- callback(
- (_state$errored = state.errored) !== null && _state$errored !== undefined
- ? _state$errored
- : new ERR_STREAM_DESTROYED('write')
- );
- }
- const onfinishCallbacks = state[kOnFinished].splice(0);
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- var _state$errored2;
- onfinishCallbacks[i](
- (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined
- ? _state$errored2
- : new ERR_STREAM_DESTROYED('end')
- );
- }
- resetBuffer(state);
- }
-
- // If there's something in the buffer waiting, then process it.
- function clearBuffer(stream, state) {
- if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) {
- return
- }
- const { buffered, bufferedIndex, objectMode } = state;
- const bufferedLength = buffered.length - bufferedIndex;
- if (!bufferedLength) {
- return
- }
- let i = bufferedIndex;
- state.bufferProcessing = true;
- if (bufferedLength > 1 && stream._writev) {
- state.pendingcb -= bufferedLength - 1;
- const callback = state.allNoop
- ? nop
- : (err) => {
- for (let n = i; n < buffered.length; ++n) {
- buffered[n].callback(err);
- }
- };
- // Make a copy of `buffered` if it's going to be used by `callback` above,
- // since `doWrite` will mutate the array.
- const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i);
- chunks.allBuffers = state.allBuffers;
- doWrite(stream, state, true, state.length, chunks, '', callback);
- resetBuffer(state);
- } else {
- do {
- const { chunk, encoding, callback } = buffered[i];
- buffered[i++] = null;
- const len = objectMode ? 1 : chunk.length;
- doWrite(stream, state, false, len, chunk, encoding, callback);
- } while (i < buffered.length && !state.writing)
- if (i === buffered.length) {
- resetBuffer(state);
- } else if (i > 256) {
- buffered.splice(0, i);
- state.bufferedIndex = 0;
- } else {
- state.bufferedIndex = i;
- }
- }
- state.bufferProcessing = false;
- }
- Writable.prototype._write = function (chunk, encoding, cb) {
- if (this._writev) {
- this._writev(
- [
- {
- chunk,
- encoding
- }
- ],
- cb
- );
- } else {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_write()')
- }
- };
- Writable.prototype._writev = null;
- Writable.prototype.end = function (chunk, encoding, cb) {
- const state = this._writableState;
- if (typeof chunk === 'function') {
- cb = chunk;
- chunk = null;
- encoding = null;
- } else if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
- let err;
- if (chunk !== null && chunk !== undefined) {
- const ret = _write(this, chunk, encoding);
- if (ret instanceof Error) {
- err = ret;
- }
- }
-
- // .end() fully uncorks.
- if (state.corked) {
- state.corked = 1;
- this.uncork();
- }
- if (err) ; else if (!state.errored && !state.ending) {
- // This is forgiving in terms of unnecessary calls to end() and can hide
- // logic errors. However, usually such errors are harmless and causing a
- // hard error can be disproportionately destructive. It is not always
- // trivial for the user to determine whether end() needs to be called
- // or not.
-
- state.ending = true;
- finishMaybe(this, state, true);
- state.ended = true;
- } else if (state.finished) {
- err = new ERR_STREAM_ALREADY_FINISHED('end');
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED('end');
- }
- if (typeof cb === 'function') {
- if (err || state.finished) {
- process.nextTick(cb, err);
- } else {
- state[kOnFinished].push(cb);
- }
- }
- return this
- };
- function needFinish(state) {
- return (
- state.ending &&
- !state.destroyed &&
- state.constructed &&
- state.length === 0 &&
- !state.errored &&
- state.buffered.length === 0 &&
- !state.finished &&
- !state.writing &&
- !state.errorEmitted &&
- !state.closeEmitted
- )
- }
- function callFinal(stream, state) {
- let called = false;
- function onFinish(err) {
- if (called) {
- errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK());
- return
- }
- called = true;
- state.pendingcb--;
- if (err) {
- const onfinishCallbacks = state[kOnFinished].splice(0);
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- onfinishCallbacks[i](err);
- }
- errorOrDestroy(stream, err, state.sync);
- } else if (needFinish(state)) {
- state.prefinished = true;
- stream.emit('prefinish');
- // Backwards compat. Don't check state.sync here.
- // Some streams assume 'finish' will be emitted
- // asynchronously relative to _final callback.
- state.pendingcb++;
- process.nextTick(finish, stream, state);
- }
- }
- state.sync = true;
- state.pendingcb++;
- try {
- stream._final(onFinish);
- } catch (err) {
- onFinish(err);
- }
- state.sync = false;
- }
- function prefinish(stream, state) {
- if (!state.prefinished && !state.finalCalled) {
- if (typeof stream._final === 'function' && !state.destroyed) {
- state.finalCalled = true;
- callFinal(stream, state);
- } else {
- state.prefinished = true;
- stream.emit('prefinish');
- }
- }
- }
- function finishMaybe(stream, state, sync) {
- if (needFinish(state)) {
- prefinish(stream, state);
- if (state.pendingcb === 0) {
- if (sync) {
- state.pendingcb++;
- process.nextTick(
- (stream, state) => {
- if (needFinish(state)) {
- finish(stream, state);
- } else {
- state.pendingcb--;
- }
- },
- stream,
- state
- );
- } else if (needFinish(state)) {
- state.pendingcb++;
- finish(stream, state);
- }
- }
- }
- }
- function finish(stream, state) {
- state.pendingcb--;
- state.finished = true;
- const onfinishCallbacks = state[kOnFinished].splice(0);
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- onfinishCallbacks[i]();
- }
- stream.emit('finish');
- if (state.autoDestroy) {
- // In case of duplex streams we need a way to detect
- // if the readable side is ready for autoDestroy as well.
- const rState = stream._readableState;
- const autoDestroy =
- !rState ||
- (rState.autoDestroy &&
- // We don't expect the readable to ever 'end'
- // if readable is explicitly set to false.
- (rState.endEmitted || rState.readable === false));
- if (autoDestroy) {
- stream.destroy();
- }
- }
- }
- ObjectDefineProperties(Writable.prototype, {
- closed: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.closed : false
- }
- },
- destroyed: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.destroyed : false
- },
- set(value) {
- // Backward compatibility, the user is explicitly managing destroyed.
- if (this._writableState) {
- this._writableState.destroyed = value;
- }
- }
- },
- writable: {
- __proto__: null,
- get() {
- const w = this._writableState;
- // w.writable === false means that this is part of a Duplex stream
- // where the writable side was disabled upon construction.
- // Compat. The user might manually disable writable side through
- // deprecated setter.
- return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended
- },
- set(val) {
- // Backwards compatible.
- if (this._writableState) {
- this._writableState.writable = !!val;
- }
- }
- },
- writableFinished: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.finished : false
- }
- },
- writableObjectMode: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.objectMode : false
- }
- },
- writableBuffer: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.getBuffer()
- }
- },
- writableEnded: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.ending : false
- }
- },
- writableNeedDrain: {
- __proto__: null,
- get() {
- const wState = this._writableState;
- if (!wState) return false
- return !wState.destroyed && !wState.ending && wState.needDrain
- }
- },
- writableHighWaterMark: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.highWaterMark
- }
- },
- writableCorked: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.corked : 0
- }
- },
- writableLength: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.length
- }
- },
- errored: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._writableState ? this._writableState.errored : null
- }
- },
- writableAborted: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return !!(
- this._writableState.writable !== false &&
- (this._writableState.destroyed || this._writableState.errored) &&
- !this._writableState.finished
- )
- }
- }
- });
- const destroy = destroyImpl.destroy;
- Writable.prototype.destroy = function (err, cb) {
- const state = this._writableState;
-
- // Invoke pending callbacks.
- if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) {
- process.nextTick(errorBuffer, state);
- }
- destroy.call(this, err, cb);
- return this
- };
- Writable.prototype._undestroy = destroyImpl.undestroy;
- Writable.prototype._destroy = function (err, cb) {
- cb(err);
- };
- Writable.prototype[EE.captureRejectionSymbol] = function (err) {
- this.destroy(err);
- };
- let webStreamsAdapters;
-
- // Lazy to avoid circular references
- function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {};
- return webStreamsAdapters
- }
- Writable.fromWeb = function (writableStream, options) {
- return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options)
- };
- Writable.toWeb = function (streamWritable) {
- return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable)
- };
- return writable;
-}
-
-/* replacement start */
-
-var duplexify;
-var hasRequiredDuplexify;
-
-function requireDuplexify () {
- if (hasRequiredDuplexify) return duplexify;
- hasRequiredDuplexify = 1;
- const process = requireProcess()
-
- /* replacement end */
-
- ; const bufferModule = require$$0;
- const {
- isReadable,
- isWritable,
- isIterable,
- isNodeStream,
- isReadableNodeStream,
- isWritableNodeStream,
- isDuplexNodeStream
- } = requireUtils();
- const eos = requireEndOfStream();
- const {
- AbortError,
- codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }
- } = requireErrors();
- const { destroyer } = requireDestroy();
- const Duplex = requireDuplex();
- const Readable = requireReadable();
- const { createDeferredPromise } = requireUtil();
- const from = requireFrom();
- const Blob = globalThis.Blob || bufferModule.Blob;
- const isBlob =
- typeof Blob !== 'undefined'
- ? function isBlob(b) {
- return b instanceof Blob
- }
- : function isBlob(b) {
- return false
- };
- const AbortController = globalThis.AbortController || require$$9.AbortController;
- const { FunctionPrototypeCall } = requirePrimordials();
-
- // This is needed for pre node 17.
- class Duplexify extends Duplex {
- constructor(options) {
- super(options);
-
- // https://github.com/nodejs/node/pull/34385
-
- if ((options === null || options === undefined ? undefined : options.readable) === false) {
- this._readableState.readable = false;
- this._readableState.ended = true;
- this._readableState.endEmitted = true;
- }
- if ((options === null || options === undefined ? undefined : options.writable) === false) {
- this._writableState.writable = false;
- this._writableState.ending = true;
- this._writableState.ended = true;
- this._writableState.finished = true;
- }
- }
- }
- duplexify = function duplexify(body, name) {
- if (isDuplexNodeStream(body)) {
- return body
- }
- if (isReadableNodeStream(body)) {
- return _duplexify({
- readable: body
- })
- }
- if (isWritableNodeStream(body)) {
- return _duplexify({
- writable: body
- })
- }
- if (isNodeStream(body)) {
- return _duplexify({
- writable: false,
- readable: false
- })
- }
-
- // TODO: Webstreams
- // if (isReadableStream(body)) {
- // return _duplexify({ readable: Readable.fromWeb(body) });
- // }
-
- // TODO: Webstreams
- // if (isWritableStream(body)) {
- // return _duplexify({ writable: Writable.fromWeb(body) });
- // }
-
- if (typeof body === 'function') {
- const { value, write, final, destroy } = fromAsyncGen(body);
- if (isIterable(value)) {
- return from(Duplexify, value, {
- // TODO (ronag): highWaterMark?
- objectMode: true,
- write,
- final,
- destroy
- })
- }
- const then = value === null || value === undefined ? undefined : value.then;
- if (typeof then === 'function') {
- let d;
- const promise = FunctionPrototypeCall(
- then,
- value,
- (val) => {
- if (val != null) {
- throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val)
- }
- },
- (err) => {
- destroyer(d, err);
- }
- );
- return (d = new Duplexify({
- // TODO (ronag): highWaterMark?
- objectMode: true,
- readable: false,
- write,
- final(cb) {
- final(async () => {
- try {
- await promise;
- process.nextTick(cb, null);
- } catch (err) {
- process.nextTick(cb, err);
- }
- });
- },
- destroy
- }))
- }
- throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value)
- }
- if (isBlob(body)) {
- return duplexify(body.arrayBuffer())
- }
- if (isIterable(body)) {
- return from(Duplexify, body, {
- // TODO (ronag): highWaterMark?
- objectMode: true,
- writable: false
- })
- }
-
- // TODO: Webstreams.
- // if (
- // isReadableStream(body?.readable) &&
- // isWritableStream(body?.writable)
- // ) {
- // return Duplexify.fromWeb(body);
- // }
-
- if (
- typeof (body === null || body === undefined ? undefined : body.writable) === 'object' ||
- typeof (body === null || body === undefined ? undefined : body.readable) === 'object'
- ) {
- const readable =
- body !== null && body !== undefined && body.readable
- ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable)
- ? body === null || body === undefined
- ? undefined
- : body.readable
- : duplexify(body.readable)
- : undefined;
- const writable =
- body !== null && body !== undefined && body.writable
- ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable)
- ? body === null || body === undefined
- ? undefined
- : body.writable
- : duplexify(body.writable)
- : undefined;
- return _duplexify({
- readable,
- writable
- })
- }
- const then = body === null || body === undefined ? undefined : body.then;
- if (typeof then === 'function') {
- let d;
- FunctionPrototypeCall(
- then,
- body,
- (val) => {
- if (val != null) {
- d.push(val);
- }
- d.push(null);
- },
- (err) => {
- destroyer(d, err);
- }
- );
- return (d = new Duplexify({
- objectMode: true,
- writable: false,
- read() {}
- }))
- }
- throw new ERR_INVALID_ARG_TYPE(
- name,
- [
- 'Blob',
- 'ReadableStream',
- 'WritableStream',
- 'Stream',
- 'Iterable',
- 'AsyncIterable',
- 'Function',
- '{ readable, writable } pair',
- 'Promise'
- ],
- body
- )
- };
- function fromAsyncGen(fn) {
- let { promise, resolve } = createDeferredPromise();
- const ac = new AbortController();
- const signal = ac.signal;
- const value = fn(
- (async function* () {
- while (true) {
- const _promise = promise;
- promise = null;
- const { chunk, done, cb } = await _promise;
- process.nextTick(cb);
- if (done) return
- if (signal.aborted)
- throw new AbortError(undefined, {
- cause: signal.reason
- })
- ;({ promise, resolve } = createDeferredPromise());
- yield chunk;
- }
- })(),
- {
- signal
- }
- );
- return {
- value,
- write(chunk, encoding, cb) {
- const _resolve = resolve;
- resolve = null;
- _resolve({
- chunk,
- done: false,
- cb
- });
- },
- final(cb) {
- const _resolve = resolve;
- resolve = null;
- _resolve({
- done: true,
- cb
- });
- },
- destroy(err, cb) {
- ac.abort();
- cb(err);
- }
- }
- }
- function _duplexify(pair) {
- const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable;
- const w = pair.writable;
- let readable = !!isReadable(r);
- let writable = !!isWritable(w);
- let ondrain;
- let onfinish;
- let onreadable;
- let onclose;
- let d;
- function onfinished(err) {
- const cb = onclose;
- onclose = null;
- if (cb) {
- cb(err);
- } else if (err) {
- d.destroy(err);
- } else if (!readable && !writable) {
- d.destroy();
- }
- }
-
- // TODO(ronag): Avoid double buffering.
- // Implement Writable/Readable/Duplex traits.
- // See, https://github.com/nodejs/node/pull/33515.
- d = new Duplexify({
- // TODO (ronag): highWaterMark?
- readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode),
- writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode),
- readable,
- writable
- });
- if (writable) {
- eos(w, (err) => {
- writable = false;
- if (err) {
- destroyer(r, err);
- }
- onfinished(err);
- });
- d._write = function (chunk, encoding, callback) {
- if (w.write(chunk, encoding)) {
- callback();
- } else {
- ondrain = callback;
- }
- };
- d._final = function (callback) {
- w.end();
- onfinish = callback;
- };
- w.on('drain', function () {
- if (ondrain) {
- const cb = ondrain;
- ondrain = null;
- cb();
- }
- });
- w.on('finish', function () {
- if (onfinish) {
- const cb = onfinish;
- onfinish = null;
- cb();
- }
- });
- }
- if (readable) {
- eos(r, (err) => {
- readable = false;
- if (err) {
- destroyer(r, err);
- }
- onfinished(err);
- });
- r.on('readable', function () {
- if (onreadable) {
- const cb = onreadable;
- onreadable = null;
- cb();
- }
- });
- r.on('end', function () {
- d.push(null);
- });
- d._read = function () {
- while (true) {
- const buf = r.read();
- if (buf === null) {
- onreadable = d._read;
- return
- }
- if (!d.push(buf)) {
- return
- }
- }
- };
- }
- d._destroy = function (err, callback) {
- if (!err && onclose !== null) {
- err = new AbortError();
- }
- onreadable = null;
- ondrain = null;
- onfinish = null;
- if (onclose === null) {
- callback(err);
- } else {
- onclose = callback;
- destroyer(w, err);
- destroyer(r, err);
- }
- };
- return d
- }
- return duplexify;
-}
-
-var duplex;
-var hasRequiredDuplex;
-
-function requireDuplex () {
- if (hasRequiredDuplex) return duplex;
- hasRequiredDuplex = 1;
-
- const {
- ObjectDefineProperties,
- ObjectGetOwnPropertyDescriptor,
- ObjectKeys,
- ObjectSetPrototypeOf
- } = requirePrimordials();
- duplex = Duplex;
- const Readable = requireReadable();
- const Writable = requireWritable();
- ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype);
- ObjectSetPrototypeOf(Duplex, Readable);
- {
- const keys = ObjectKeys(Writable.prototype);
- // Allow the keys array to be GC'ed.
- for (let i = 0; i < keys.length; i++) {
- const method = keys[i];
- if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
- }
- }
- function Duplex(options) {
- if (!(this instanceof Duplex)) return new Duplex(options)
- Readable.call(this, options);
- Writable.call(this, options);
- if (options) {
- this.allowHalfOpen = options.allowHalfOpen !== false;
- if (options.readable === false) {
- this._readableState.readable = false;
- this._readableState.ended = true;
- this._readableState.endEmitted = true;
- }
- if (options.writable === false) {
- this._writableState.writable = false;
- this._writableState.ending = true;
- this._writableState.ended = true;
- this._writableState.finished = true;
- }
- } else {
- this.allowHalfOpen = true;
- }
- }
- ObjectDefineProperties(Duplex.prototype, {
- writable: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable')
- },
- writableHighWaterMark: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark')
- },
- writableObjectMode: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode')
- },
- writableBuffer: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer')
- },
- writableLength: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength')
- },
- writableFinished: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished')
- },
- writableCorked: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked')
- },
- writableEnded: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded')
- },
- writableNeedDrain: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain')
- },
- destroyed: {
- __proto__: null,
- get() {
- if (this._readableState === undefined || this._writableState === undefined) {
- return false
- }
- return this._readableState.destroyed && this._writableState.destroyed
- },
- set(value) {
- // Backward compatibility, the user is explicitly
- // managing destroyed.
- if (this._readableState && this._writableState) {
- this._readableState.destroyed = value;
- this._writableState.destroyed = value;
- }
- }
- }
- });
- let webStreamsAdapters;
-
- // Lazy to avoid circular references
- function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {};
- return webStreamsAdapters
- }
- Duplex.fromWeb = function (pair, options) {
- return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options)
- };
- Duplex.toWeb = function (duplex) {
- return lazyWebStreams().newReadableWritablePairFromDuplex(duplex)
- };
- let duplexify;
- Duplex.from = function (body) {
- if (!duplexify) {
- duplexify = requireDuplexify();
- }
- return duplexify(body, 'body')
- };
- return duplex;
-}
-
-var transform;
-var hasRequiredTransform;
-
-function requireTransform () {
- if (hasRequiredTransform) return transform;
- hasRequiredTransform = 1;
-
- const { ObjectSetPrototypeOf, Symbol } = requirePrimordials();
- transform = Transform;
- const { ERR_METHOD_NOT_IMPLEMENTED } = requireErrors().codes;
- const Duplex = requireDuplex();
- const { getHighWaterMark } = requireState();
- ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype);
- ObjectSetPrototypeOf(Transform, Duplex);
- const kCallback = Symbol('kCallback');
- function Transform(options) {
- if (!(this instanceof Transform)) return new Transform(options)
-
- // TODO (ronag): This should preferably always be
- // applied but would be semver-major. Or even better;
- // make Transform a Readable with the Writable interface.
- const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null;
- if (readableHighWaterMark === 0) {
- // A Duplex will buffer both on the writable and readable side while
- // a Transform just wants to buffer hwm number of elements. To avoid
- // buffering twice we disable buffering on the writable side.
- options = {
- ...options,
- highWaterMark: null,
- readableHighWaterMark,
- // TODO (ronag): 0 is not optimal since we have
- // a "bug" where we check needDrain before calling _write and not after.
- // Refs: https://github.com/nodejs/node/pull/32887
- // Refs: https://github.com/nodejs/node/pull/35941
- writableHighWaterMark: options.writableHighWaterMark || 0
- };
- }
- Duplex.call(this, options);
-
- // We have implemented the _read method, and done the other things
- // that Readable wants before the first _read call, so unset the
- // sync guard flag.
- this._readableState.sync = false;
- this[kCallback] = null;
- if (options) {
- if (typeof options.transform === 'function') this._transform = options.transform;
- if (typeof options.flush === 'function') this._flush = options.flush;
- }
-
- // When the writable side finishes, then flush out anything remaining.
- // Backwards compat. Some Transform streams incorrectly implement _final
- // instead of or in addition to _flush. By using 'prefinish' instead of
- // implementing _final we continue supporting this unfortunate use case.
- this.on('prefinish', prefinish);
- }
- function final(cb) {
- if (typeof this._flush === 'function' && !this.destroyed) {
- this._flush((er, data) => {
- if (er) {
- if (cb) {
- cb(er);
- } else {
- this.destroy(er);
- }
- return
- }
- if (data != null) {
- this.push(data);
- }
- this.push(null);
- if (cb) {
- cb();
- }
- });
- } else {
- this.push(null);
- if (cb) {
- cb();
- }
- }
- }
- function prefinish() {
- if (this._final !== final) {
- final.call(this);
- }
- }
- Transform.prototype._final = final;
- Transform.prototype._transform = function (chunk, encoding, callback) {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()')
- };
- Transform.prototype._write = function (chunk, encoding, callback) {
- const rState = this._readableState;
- const wState = this._writableState;
- const length = rState.length;
- this._transform(chunk, encoding, (err, val) => {
- if (err) {
- callback(err);
- return
- }
- if (val != null) {
- this.push(val);
- }
- if (
- wState.ended ||
- // Backwards compat.
- length === rState.length ||
- // Backwards compat.
- rState.length < rState.highWaterMark
- ) {
- callback();
- } else {
- this[kCallback] = callback;
- }
- });
- };
- Transform.prototype._read = function () {
- if (this[kCallback]) {
- const callback = this[kCallback];
- this[kCallback] = null;
- callback();
- }
- };
- return transform;
-}
-
-var passthrough;
-var hasRequiredPassthrough;
-
-function requirePassthrough () {
- if (hasRequiredPassthrough) return passthrough;
- hasRequiredPassthrough = 1;
-
- const { ObjectSetPrototypeOf } = requirePrimordials();
- passthrough = PassThrough;
- const Transform = requireTransform();
- ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype);
- ObjectSetPrototypeOf(PassThrough, Transform);
- function PassThrough(options) {
- if (!(this instanceof PassThrough)) return new PassThrough(options)
- Transform.call(this, options);
- }
- PassThrough.prototype._transform = function (chunk, encoding, cb) {
- cb(null, chunk);
- };
- return passthrough;
-}
-
-/* replacement start */
-
-var pipeline_1;
-var hasRequiredPipeline;
-
-function requirePipeline () {
- if (hasRequiredPipeline) return pipeline_1;
- hasRequiredPipeline = 1;
- const process = requireProcess()
-
- /* replacement end */
- // Ported from https://github.com/mafintosh/pump with
- // permission from the author, Mathias Buus (@mafintosh).
-
- ; const { ArrayIsArray, Promise, SymbolAsyncIterator } = requirePrimordials();
- const eos = requireEndOfStream();
- const { once } = requireUtil();
- const destroyImpl = requireDestroy();
- const Duplex = requireDuplex();
- const {
- aggregateTwoErrors,
- codes: {
- ERR_INVALID_ARG_TYPE,
- ERR_INVALID_RETURN_VALUE,
- ERR_MISSING_ARGS,
- ERR_STREAM_DESTROYED,
- ERR_STREAM_PREMATURE_CLOSE
- },
- AbortError
- } = requireErrors();
- const { validateFunction, validateAbortSignal } = requireValidators();
- const { isIterable, isReadable, isReadableNodeStream, isNodeStream } = requireUtils();
- const AbortController = globalThis.AbortController || require$$9.AbortController;
- let PassThrough;
- let Readable;
- function destroyer(stream, reading, writing) {
- let finished = false;
- stream.on('close', () => {
- finished = true;
- });
- const cleanup = eos(
- stream,
- {
- readable: reading,
- writable: writing
- },
- (err) => {
- finished = !err;
- }
- );
- return {
- destroy: (err) => {
- if (finished) return
- finished = true;
- destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe'));
- },
- cleanup
- }
- }
- function popCallback(streams) {
- // Streams should never be an empty array. It should always contain at least
- // a single stream. Therefore optimize for the average case instead of
- // checking for length === 0 as well.
- validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]');
- return streams.pop()
- }
- function makeAsyncIterable(val) {
- if (isIterable(val)) {
- return val
- } else if (isReadableNodeStream(val)) {
- // Legacy streams are not Iterable.
- return fromReadable(val)
- }
- throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val)
- }
- async function* fromReadable(val) {
- if (!Readable) {
- Readable = requireReadable();
- }
- yield* Readable.prototype[SymbolAsyncIterator].call(val);
- }
- async function pump(iterable, writable, finish, { end }) {
- let error;
- let onresolve = null;
- const resume = (err) => {
- if (err) {
- error = err;
- }
- if (onresolve) {
- const callback = onresolve;
- onresolve = null;
- callback();
- }
- };
- const wait = () =>
- new Promise((resolve, reject) => {
- if (error) {
- reject(error);
- } else {
- onresolve = () => {
- if (error) {
- reject(error);
- } else {
- resolve();
- }
- };
- }
- });
- writable.on('drain', resume);
- const cleanup = eos(
- writable,
- {
- readable: false
- },
- resume
- );
- try {
- if (writable.writableNeedDrain) {
- await wait();
- }
- for await (const chunk of iterable) {
- if (!writable.write(chunk)) {
- await wait();
- }
- }
- if (end) {
- writable.end();
- }
- await wait();
- finish();
- } catch (err) {
- finish(error !== err ? aggregateTwoErrors(error, err) : err);
- } finally {
- cleanup();
- writable.off('drain', resume);
- }
- }
- function pipeline(...streams) {
- return pipelineImpl(streams, once(popCallback(streams)))
- }
- function pipelineImpl(streams, callback, opts) {
- if (streams.length === 1 && ArrayIsArray(streams[0])) {
- streams = streams[0];
- }
- if (streams.length < 2) {
- throw new ERR_MISSING_ARGS('streams')
- }
- const ac = new AbortController();
- const signal = ac.signal;
- const outerSignal = opts === null || opts === undefined ? undefined : opts.signal;
-
- // Need to cleanup event listeners if last stream is readable
- // https://github.com/nodejs/node/issues/35452
- const lastStreamCleanup = [];
- validateAbortSignal(outerSignal, 'options.signal');
- function abort() {
- finishImpl(new AbortError());
- }
- outerSignal === null || outerSignal === undefined ? undefined : outerSignal.addEventListener('abort', abort);
- let error;
- let value;
- const destroys = [];
- let finishCount = 0;
- function finish(err) {
- finishImpl(err, --finishCount === 0);
- }
- function finishImpl(err, final) {
- if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) {
- error = err;
- }
- if (!error && !final) {
- return
- }
- while (destroys.length) {
- destroys.shift()(error);
- }
- outerSignal === null || outerSignal === undefined ? undefined : outerSignal.removeEventListener('abort', abort);
- ac.abort();
- if (final) {
- if (!error) {
- lastStreamCleanup.forEach((fn) => fn());
- }
- process.nextTick(callback, error, value);
- }
- }
- let ret;
- for (let i = 0; i < streams.length; i++) {
- const stream = streams[i];
- const reading = i < streams.length - 1;
- const writing = i > 0;
- const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false;
- const isLastStream = i === streams.length - 1;
- if (isNodeStream(stream)) {
- if (end) {
- const { destroy, cleanup } = destroyer(stream, reading, writing);
- destroys.push(destroy);
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(cleanup);
- }
- }
-
- // Catch stream errors that occur after pipe/pump has completed.
- function onError(err) {
- if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
- finish(err);
- }
- }
- stream.on('error', onError);
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(() => {
- stream.removeListener('error', onError);
- });
- }
- }
- if (i === 0) {
- if (typeof stream === 'function') {
- ret = stream({
- signal
- });
- if (!isIterable(ret)) {
- throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret)
- }
- } else if (isIterable(stream) || isReadableNodeStream(stream)) {
- ret = stream;
- } else {
- ret = Duplex.from(stream);
- }
- } else if (typeof stream === 'function') {
- ret = makeAsyncIterable(ret);
- ret = stream(ret, {
- signal
- });
- if (reading) {
- if (!isIterable(ret, true)) {
- throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret)
- }
- } else {
- var _ret;
- if (!PassThrough) {
- PassThrough = requirePassthrough();
- }
-
- // If the last argument to pipeline is not a stream
- // we must create a proxy stream so that pipeline(...)
- // always returns a stream which can be further
- // composed through `.pipe(stream)`.
-
- const pt = new PassThrough({
- objectMode: true
- });
-
- // Handle Promises/A+ spec, `then` could be a getter that throws on
- // second use.
- const then = (_ret = ret) === null || _ret === undefined ? undefined : _ret.then;
- if (typeof then === 'function') {
- finishCount++;
- then.call(
- ret,
- (val) => {
- value = val;
- if (val != null) {
- pt.write(val);
- }
- if (end) {
- pt.end();
- }
- process.nextTick(finish);
- },
- (err) => {
- pt.destroy(err);
- process.nextTick(finish, err);
- }
- );
- } else if (isIterable(ret, true)) {
- finishCount++;
- pump(ret, pt, finish, {
- end
- });
- } else {
- throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret)
- }
- ret = pt;
- const { destroy, cleanup } = destroyer(ret, false, true);
- destroys.push(destroy);
- if (isLastStream) {
- lastStreamCleanup.push(cleanup);
- }
- }
- } else if (isNodeStream(stream)) {
- if (isReadableNodeStream(ret)) {
- finishCount += 2;
- const cleanup = pipe(ret, stream, finish, {
- end
- });
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(cleanup);
- }
- } else if (isIterable(ret)) {
- finishCount++;
- pump(ret, stream, finish, {
- end
- });
- } else {
- throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], ret)
- }
- ret = stream;
- } else {
- ret = Duplex.from(stream);
- }
- }
- if (
- (signal !== null && signal !== undefined && signal.aborted) ||
- (outerSignal !== null && outerSignal !== undefined && outerSignal.aborted)
- ) {
- process.nextTick(abort);
- }
- return ret
- }
- function pipe(src, dst, finish, { end }) {
- let ended = false;
- dst.on('close', () => {
- if (!ended) {
- // Finish if the destination closes before the source has completed.
- finish(new ERR_STREAM_PREMATURE_CLOSE());
- }
- });
- src.pipe(dst, {
- end
- });
- if (end) {
- // Compat. Before node v10.12.0 stdio used to throw an error so
- // pipe() did/does not end() stdio destinations.
- // Now they allow it but "secretly" don't close the underlying fd.
- src.once('end', () => {
- ended = true;
- dst.end();
- });
- } else {
- finish();
- }
- eos(
- src,
- {
- readable: true,
- writable: false
- },
- (err) => {
- const rState = src._readableState;
- if (
- err &&
- err.code === 'ERR_STREAM_PREMATURE_CLOSE' &&
- rState &&
- rState.ended &&
- !rState.errored &&
- !rState.errorEmitted
- ) {
- // Some readable streams will emit 'close' before 'end'. However, since
- // this is on the readable side 'end' should still be emitted if the
- // stream has been ended and no error emitted. This should be allowed in
- // favor of backwards compatibility. Since the stream is piped to a
- // destination this should not result in any observable difference.
- // We don't need to check if this is a writable premature close since
- // eos will only fail with premature close on the reading side for
- // duplex streams.
- src.once('end', finish).once('error', finish);
- } else {
- finish(err);
- }
- }
- );
- return eos(
- dst,
- {
- readable: false,
- writable: true
- },
- finish
- )
- }
- pipeline_1 = {
- pipelineImpl,
- pipeline
- };
- return pipeline_1;
-}
-
-var compose;
-var hasRequiredCompose;
-
-function requireCompose () {
- if (hasRequiredCompose) return compose;
- hasRequiredCompose = 1;
-
- const { pipeline } = requirePipeline();
- const Duplex = requireDuplex();
- const { destroyer } = requireDestroy();
- const { isNodeStream, isReadable, isWritable } = requireUtils();
- const {
- AbortError,
- codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }
- } = requireErrors();
- compose = function compose(...streams) {
- if (streams.length === 0) {
- throw new ERR_MISSING_ARGS('streams')
- }
- if (streams.length === 1) {
- return Duplex.from(streams[0])
- }
- const orgStreams = [...streams];
- if (typeof streams[0] === 'function') {
- streams[0] = Duplex.from(streams[0]);
- }
- if (typeof streams[streams.length - 1] === 'function') {
- const idx = streams.length - 1;
- streams[idx] = Duplex.from(streams[idx]);
- }
- for (let n = 0; n < streams.length; ++n) {
- if (!isNodeStream(streams[n])) {
- // TODO(ronag): Add checks for non streams.
- continue
- }
- if (n < streams.length - 1 && !isReadable(streams[n])) {
- throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable')
- }
- if (n > 0 && !isWritable(streams[n])) {
- throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable')
- }
- }
- let ondrain;
- let onfinish;
- let onreadable;
- let onclose;
- let d;
- function onfinished(err) {
- const cb = onclose;
- onclose = null;
- if (cb) {
- cb(err);
- } else if (err) {
- d.destroy(err);
- } else if (!readable && !writable) {
- d.destroy();
- }
- }
- const head = streams[0];
- const tail = pipeline(streams, onfinished);
- const writable = !!isWritable(head);
- const readable = !!isReadable(tail);
-
- // TODO(ronag): Avoid double buffering.
- // Implement Writable/Readable/Duplex traits.
- // See, https://github.com/nodejs/node/pull/33515.
- d = new Duplex({
- // TODO (ronag): highWaterMark?
- writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode),
- readableObjectMode: !!(tail !== null && tail !== undefined && tail.writableObjectMode),
- writable,
- readable
- });
- if (writable) {
- d._write = function (chunk, encoding, callback) {
- if (head.write(chunk, encoding)) {
- callback();
- } else {
- ondrain = callback;
- }
- };
- d._final = function (callback) {
- head.end();
- onfinish = callback;
- };
- head.on('drain', function () {
- if (ondrain) {
- const cb = ondrain;
- ondrain = null;
- cb();
- }
- });
- tail.on('finish', function () {
- if (onfinish) {
- const cb = onfinish;
- onfinish = null;
- cb();
- }
- });
- }
- if (readable) {
- tail.on('readable', function () {
- if (onreadable) {
- const cb = onreadable;
- onreadable = null;
- cb();
- }
- });
- tail.on('end', function () {
- d.push(null);
- });
- d._read = function () {
- while (true) {
- const buf = tail.read();
- if (buf === null) {
- onreadable = d._read;
- return
- }
- if (!d.push(buf)) {
- return
- }
- }
- };
- }
- d._destroy = function (err, callback) {
- if (!err && onclose !== null) {
- err = new AbortError();
- }
- onreadable = null;
- ondrain = null;
- onfinish = null;
- if (onclose === null) {
- callback(err);
- } else {
- onclose = callback;
- destroyer(tail, err);
- }
- };
- return d
- };
- return compose;
-}
-
-var promises;
-var hasRequiredPromises;
-
-function requirePromises () {
- if (hasRequiredPromises) return promises;
- hasRequiredPromises = 1;
-
- const { ArrayPrototypePop, Promise } = requirePrimordials();
- const { isIterable, isNodeStream } = requireUtils();
- const { pipelineImpl: pl } = requirePipeline();
- const { finished } = requireEndOfStream();
- function pipeline(...streams) {
- return new Promise((resolve, reject) => {
- let signal;
- let end;
- const lastArg = streams[streams.length - 1];
- if (lastArg && typeof lastArg === 'object' && !isNodeStream(lastArg) && !isIterable(lastArg)) {
- const options = ArrayPrototypePop(streams);
- signal = options.signal;
- end = options.end;
- }
- pl(
- streams,
- (err, value) => {
- if (err) {
- reject(err);
- } else {
- resolve(value);
- }
- },
- {
- signal,
- end
- }
- );
- })
- }
- promises = {
- finished,
- pipeline
- };
- return promises;
-}
-
-/* replacement start */
-
-var hasRequiredStream;
-
-function requireStream () {
- if (hasRequiredStream) return streamExports;
- hasRequiredStream = 1;
- const { Buffer } = require$$0
-
- /* replacement end */
- // Copyright Joyent, Inc. and other Node 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.
-
- ; const { ObjectDefineProperty, ObjectKeys, ReflectApply } = requirePrimordials();
- const {
- promisify: { custom: customPromisify }
- } = requireUtil();
- const { streamReturningOperators, promiseReturningOperators } = requireOperators();
- const {
- codes: { ERR_ILLEGAL_CONSTRUCTOR }
- } = requireErrors();
- const compose = requireCompose();
- const { pipeline } = requirePipeline();
- const { destroyer } = requireDestroy();
- const eos = requireEndOfStream();
- const promises = requirePromises();
- const utils = requireUtils();
- const Stream = (stream.exports = requireLegacy().Stream);
- Stream.isDisturbed = utils.isDisturbed;
- Stream.isErrored = utils.isErrored;
- Stream.isReadable = utils.isReadable;
- Stream.Readable = requireReadable();
- for (const key of ObjectKeys(streamReturningOperators)) {
- const op = streamReturningOperators[key];
- function fn(...args) {
- if (new.target) {
- throw ERR_ILLEGAL_CONSTRUCTOR()
- }
- return Stream.Readable.from(ReflectApply(op, this, args))
- }
- ObjectDefineProperty(fn, 'name', {
- __proto__: null,
- value: op.name
- });
- ObjectDefineProperty(fn, 'length', {
- __proto__: null,
- value: op.length
- });
- ObjectDefineProperty(Stream.Readable.prototype, key, {
- __proto__: null,
- value: fn,
- enumerable: false,
- configurable: true,
- writable: true
- });
- }
- for (const key of ObjectKeys(promiseReturningOperators)) {
- const op = promiseReturningOperators[key];
- function fn(...args) {
- if (new.target) {
- throw ERR_ILLEGAL_CONSTRUCTOR()
- }
- return ReflectApply(op, this, args)
- }
- ObjectDefineProperty(fn, 'name', {
- __proto__: null,
- value: op.name
- });
- ObjectDefineProperty(fn, 'length', {
- __proto__: null,
- value: op.length
- });
- ObjectDefineProperty(Stream.Readable.prototype, key, {
- __proto__: null,
- value: fn,
- enumerable: false,
- configurable: true,
- writable: true
- });
- }
- Stream.Writable = requireWritable();
- Stream.Duplex = requireDuplex();
- Stream.Transform = requireTransform();
- Stream.PassThrough = requirePassthrough();
- Stream.pipeline = pipeline;
- const { addAbortSignal } = requireAddAbortSignal();
- Stream.addAbortSignal = addAbortSignal;
- Stream.finished = eos;
- Stream.destroy = destroyer;
- Stream.compose = compose;
- ObjectDefineProperty(Stream, 'promises', {
- __proto__: null,
- configurable: true,
- enumerable: true,
- get() {
- return promises
- }
- });
- ObjectDefineProperty(pipeline, customPromisify, {
- __proto__: null,
- enumerable: true,
- get() {
- return promises.pipeline
- }
- });
- ObjectDefineProperty(eos, customPromisify, {
- __proto__: null,
- enumerable: true,
- get() {
- return promises.finished
- }
- });
-
- // Backwards-compat with node 0.4.x
- Stream.Stream = Stream;
- Stream._isUint8Array = function isUint8Array(value) {
- return value instanceof Uint8Array
- };
- Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
- };
- return streamExports;
-}
-
-(function (module) {
-
- const Stream = require$$0$1;
- if (Stream && process.env.READABLE_STREAM === 'disable') {
- const promises = Stream.promises;
-
- // Explicit export naming is needed for ESM
- module.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer;
- module.exports._isUint8Array = Stream._isUint8Array;
- module.exports.isDisturbed = Stream.isDisturbed;
- module.exports.isErrored = Stream.isErrored;
- module.exports.isReadable = Stream.isReadable;
- module.exports.Readable = Stream.Readable;
- module.exports.Writable = Stream.Writable;
- module.exports.Duplex = Stream.Duplex;
- module.exports.Transform = Stream.Transform;
- module.exports.PassThrough = Stream.PassThrough;
- module.exports.addAbortSignal = Stream.addAbortSignal;
- module.exports.finished = Stream.finished;
- module.exports.destroy = Stream.destroy;
- module.exports.pipeline = Stream.pipeline;
- module.exports.compose = Stream.compose;
- Object.defineProperty(Stream, 'promises', {
- configurable: true,
- enumerable: true,
- get() {
- return promises
- }
- });
- module.exports.Stream = Stream.Stream;
- } else {
- const CustomStream = requireStream();
- const promises = requirePromises();
- const originalDestroy = CustomStream.Readable.destroy;
- module.exports = CustomStream.Readable;
-
- // Explicit export naming is needed for ESM
- module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer;
- module.exports._isUint8Array = CustomStream._isUint8Array;
- module.exports.isDisturbed = CustomStream.isDisturbed;
- module.exports.isErrored = CustomStream.isErrored;
- module.exports.isReadable = CustomStream.isReadable;
- module.exports.Readable = CustomStream.Readable;
- module.exports.Writable = CustomStream.Writable;
- module.exports.Duplex = CustomStream.Duplex;
- module.exports.Transform = CustomStream.Transform;
- module.exports.PassThrough = CustomStream.PassThrough;
- module.exports.addAbortSignal = CustomStream.addAbortSignal;
- module.exports.finished = CustomStream.finished;
- module.exports.destroy = CustomStream.destroy;
- module.exports.destroy = originalDestroy;
- module.exports.pipeline = CustomStream.pipeline;
- module.exports.compose = CustomStream.compose;
- Object.defineProperty(CustomStream, 'promises', {
- configurable: true,
- enumerable: true,
- get() {
- return promises
- }
- });
- module.exports.Stream = CustomStream.Stream;
- }
-
- // Allow default importing
- module.exports.default = module.exports;
-} (ours));
-
-var inheritsExports = {};
-var inherits$1 = {
- get exports(){ return inheritsExports; },
- set exports(v){ inheritsExports = v; },
-};
-
-var inherits_browserExports = {};
-var inherits_browser = {
- get exports(){ return inherits_browserExports; },
- set exports(v){ inherits_browserExports = v; },
-};
-
-var hasRequiredInherits_browser;
-
-function requireInherits_browser () {
- if (hasRequiredInherits_browser) return inherits_browserExports;
- hasRequiredInherits_browser = 1;
- if (typeof Object.create === 'function') {
- // implementation from standard node.js 'util' module
- inherits_browser.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- // old school shim for old browsers
- inherits_browser.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function () {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor();
- ctor.prototype.constructor = ctor;
- }
- };
- }
- return inherits_browserExports;
-}
-
-(function (module) {
- try {
- var util = require('util');
- /* istanbul ignore next */
- if (typeof util.inherits !== 'function') throw '';
- module.exports = util.inherits;
- } catch (e) {
- /* istanbul ignore next */
- module.exports = requireInherits_browser();
- }
-} (inherits$1));
-
-const { Buffer: Buffer$1 } = require$$0;
-const symbol = Symbol.for('BufferList');
-
-function BufferList$1 (buf) {
- if (!(this instanceof BufferList$1)) {
- return new BufferList$1(buf)
- }
-
- BufferList$1._init.call(this, buf);
-}
-
-BufferList$1._init = function _init (buf) {
- Object.defineProperty(this, symbol, { value: true });
-
- this._bufs = [];
- this.length = 0;
-
- if (buf) {
- this.append(buf);
- }
-};
-
-BufferList$1.prototype._new = function _new (buf) {
- return new BufferList$1(buf)
-};
-
-BufferList$1.prototype._offset = function _offset (offset) {
- if (offset === 0) {
- return [0, 0]
- }
-
- let tot = 0;
-
- for (let i = 0; i < this._bufs.length; i++) {
- const _t = tot + this._bufs[i].length;
- if (offset < _t || i === this._bufs.length - 1) {
- return [i, offset - tot]
- }
- tot = _t;
- }
-};
-
-BufferList$1.prototype._reverseOffset = function (blOffset) {
- const bufferId = blOffset[0];
- let offset = blOffset[1];
-
- for (let i = 0; i < bufferId; i++) {
- offset += this._bufs[i].length;
- }
-
- return offset
-};
-
-BufferList$1.prototype.get = function get (index) {
- if (index > this.length || index < 0) {
- return undefined
- }
-
- const offset = this._offset(index);
-
- return this._bufs[offset[0]][offset[1]]
-};
-
-BufferList$1.prototype.slice = function slice (start, end) {
- if (typeof start === 'number' && start < 0) {
- start += this.length;
- }
-
- if (typeof end === 'number' && end < 0) {
- end += this.length;
- }
-
- return this.copy(null, 0, start, end)
-};
-
-BufferList$1.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
- if (typeof srcStart !== 'number' || srcStart < 0) {
- srcStart = 0;
- }
-
- if (typeof srcEnd !== 'number' || srcEnd > this.length) {
- srcEnd = this.length;
- }
-
- if (srcStart >= this.length) {
- return dst || Buffer$1.alloc(0)
- }
-
- if (srcEnd <= 0) {
- return dst || Buffer$1.alloc(0)
- }
-
- const copy = !!dst;
- const off = this._offset(srcStart);
- const len = srcEnd - srcStart;
- let bytes = len;
- let bufoff = (copy && dstStart) || 0;
- let start = off[1];
-
- // copy/slice everything
- if (srcStart === 0 && srcEnd === this.length) {
- if (!copy) {
- // slice, but full concat if multiple buffers
- return this._bufs.length === 1
- ? this._bufs[0]
- : Buffer$1.concat(this._bufs, this.length)
- }
-
- // copy, need to copy individual buffers
- for (let i = 0; i < this._bufs.length; i++) {
- this._bufs[i].copy(dst, bufoff);
- bufoff += this._bufs[i].length;
- }
-
- return dst
- }
-
- // easy, cheap case where it's a subset of one of the buffers
- if (bytes <= this._bufs[off[0]].length - start) {
- return copy
- ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
- : this._bufs[off[0]].slice(start, start + bytes)
- }
-
- if (!copy) {
- // a slice, we need something to copy in to
- dst = Buffer$1.allocUnsafe(len);
- }
-
- for (let i = off[0]; i < this._bufs.length; i++) {
- const l = this._bufs[i].length - start;
-
- if (bytes > l) {
- this._bufs[i].copy(dst, bufoff, start);
- bufoff += l;
- } else {
- this._bufs[i].copy(dst, bufoff, start, start + bytes);
- bufoff += l;
- break
- }
-
- bytes -= l;
-
- if (start) {
- start = 0;
- }
- }
-
- // safeguard so that we don't return uninitialized memory
- if (dst.length > bufoff) return dst.slice(0, bufoff)
-
- return dst
-};
-
-BufferList$1.prototype.shallowSlice = function shallowSlice (start, end) {
- start = start || 0;
- end = typeof end !== 'number' ? this.length : end;
-
- if (start < 0) {
- start += this.length;
- }
-
- if (end < 0) {
- end += this.length;
- }
-
- if (start === end) {
- return this._new()
- }
-
- const startOffset = this._offset(start);
- const endOffset = this._offset(end);
- const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1);
-
- if (endOffset[1] === 0) {
- buffers.pop();
- } else {
- buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]);
- }
-
- if (startOffset[1] !== 0) {
- buffers[0] = buffers[0].slice(startOffset[1]);
- }
-
- return this._new(buffers)
-};
-
-BufferList$1.prototype.toString = function toString (encoding, start, end) {
- return this.slice(start, end).toString(encoding)
-};
-
-BufferList$1.prototype.consume = function consume (bytes) {
- // first, normalize the argument, in accordance with how Buffer does it
- bytes = Math.trunc(bytes);
- // do nothing if not a positive number
- if (Number.isNaN(bytes) || bytes <= 0) return this
-
- while (this._bufs.length) {
- if (bytes >= this._bufs[0].length) {
- bytes -= this._bufs[0].length;
- this.length -= this._bufs[0].length;
- this._bufs.shift();
- } else {
- this._bufs[0] = this._bufs[0].slice(bytes);
- this.length -= bytes;
- break
- }
- }
-
- return this
-};
-
-BufferList$1.prototype.duplicate = function duplicate () {
- const copy = this._new();
-
- for (let i = 0; i < this._bufs.length; i++) {
- copy.append(this._bufs[i]);
- }
-
- return copy
-};
-
-BufferList$1.prototype.append = function append (buf) {
- if (buf == null) {
- return this
- }
-
- if (buf.buffer) {
- // append a view of the underlying ArrayBuffer
- this._appendBuffer(Buffer$1.from(buf.buffer, buf.byteOffset, buf.byteLength));
- } else if (Array.isArray(buf)) {
- for (let i = 0; i < buf.length; i++) {
- this.append(buf[i]);
- }
- } else if (this._isBufferList(buf)) {
- // unwrap argument into individual BufferLists
- for (let i = 0; i < buf._bufs.length; i++) {
- this.append(buf._bufs[i]);
- }
- } else {
- // coerce number arguments to strings, since Buffer(number) does
- // uninitialized memory allocation
- if (typeof buf === 'number') {
- buf = buf.toString();
- }
-
- this._appendBuffer(Buffer$1.from(buf));
- }
-
- return this
-};
-
-BufferList$1.prototype._appendBuffer = function appendBuffer (buf) {
- this._bufs.push(buf);
- this.length += buf.length;
-};
-
-BufferList$1.prototype.indexOf = function (search, offset, encoding) {
- if (encoding === undefined && typeof offset === 'string') {
- encoding = offset;
- offset = undefined;
- }
-
- if (typeof search === 'function' || Array.isArray(search)) {
- throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
- } else if (typeof search === 'number') {
- search = Buffer$1.from([search]);
- } else if (typeof search === 'string') {
- search = Buffer$1.from(search, encoding);
- } else if (this._isBufferList(search)) {
- search = search.slice();
- } else if (Array.isArray(search.buffer)) {
- search = Buffer$1.from(search.buffer, search.byteOffset, search.byteLength);
- } else if (!Buffer$1.isBuffer(search)) {
- search = Buffer$1.from(search);
- }
-
- offset = Number(offset || 0);
-
- if (isNaN(offset)) {
- offset = 0;
- }
-
- if (offset < 0) {
- offset = this.length + offset;
- }
-
- if (offset < 0) {
- offset = 0;
- }
-
- if (search.length === 0) {
- return offset > this.length ? this.length : offset
- }
-
- const blOffset = this._offset(offset);
- let blIndex = blOffset[0]; // index of which internal buffer we're working on
- let buffOffset = blOffset[1]; // offset of the internal buffer we're working on
-
- // scan over each buffer
- for (; blIndex < this._bufs.length; blIndex++) {
- const buff = this._bufs[blIndex];
-
- while (buffOffset < buff.length) {
- const availableWindow = buff.length - buffOffset;
-
- if (availableWindow >= search.length) {
- const nativeSearchResult = buff.indexOf(search, buffOffset);
-
- if (nativeSearchResult !== -1) {
- return this._reverseOffset([blIndex, nativeSearchResult])
- }
-
- buffOffset = buff.length - search.length + 1; // end of native search window
- } else {
- const revOffset = this._reverseOffset([blIndex, buffOffset]);
-
- if (this._match(revOffset, search)) {
- return revOffset
- }
-
- buffOffset++;
- }
- }
-
- buffOffset = 0;
- }
-
- return -1
-};
-
-BufferList$1.prototype._match = function (offset, search) {
- if (this.length - offset < search.length) {
- return false
- }
-
- for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
- if (this.get(offset + searchOffset) !== search[searchOffset]) {
- return false
- }
- }
- return true
-}
-
-;(function () {
- const methods = {
- readDoubleBE: 8,
- readDoubleLE: 8,
- readFloatBE: 4,
- readFloatLE: 4,
- readBigInt64BE: 8,
- readBigInt64LE: 8,
- readBigUInt64BE: 8,
- readBigUInt64LE: 8,
- readInt32BE: 4,
- readInt32LE: 4,
- readUInt32BE: 4,
- readUInt32LE: 4,
- readInt16BE: 2,
- readInt16LE: 2,
- readUInt16BE: 2,
- readUInt16LE: 2,
- readInt8: 1,
- readUInt8: 1,
- readIntBE: null,
- readIntLE: null,
- readUIntBE: null,
- readUIntLE: null
- };
-
- for (const m in methods) {
- (function (m) {
- if (methods[m] === null) {
- BufferList$1.prototype[m] = function (offset, byteLength) {
- return this.slice(offset, offset + byteLength)[m](0, byteLength)
- };
- } else {
- BufferList$1.prototype[m] = function (offset = 0) {
- return this.slice(offset, offset + methods[m])[m](0)
- };
- }
- }(m));
- }
-}());
-
-// Used internally by the class and also as an indicator of this object being
-// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
-// environment because there could be multiple different copies of the
-// BufferList class and some `BufferList`s might be `BufferList`s.
-BufferList$1.prototype._isBufferList = function _isBufferList (b) {
- return b instanceof BufferList$1 || BufferList$1.isBufferList(b)
-};
-
-BufferList$1.isBufferList = function isBufferList (b) {
- return b != null && b[symbol]
-};
-
-var BufferList_1 = BufferList$1;
-
-const DuplexStream = oursExports.Duplex;
-const inherits = inheritsExports;
-const BufferList = BufferList_1;
-
-function BufferListStream (callback) {
- if (!(this instanceof BufferListStream)) {
- return new BufferListStream(callback)
- }
-
- if (typeof callback === 'function') {
- this._callback = callback;
-
- const piper = function piper (err) {
- if (this._callback) {
- this._callback(err);
- this._callback = null;
- }
- }.bind(this);
-
- this.on('pipe', function onPipe (src) {
- src.on('error', piper);
- });
- this.on('unpipe', function onUnpipe (src) {
- src.removeListener('error', piper);
- });
-
- callback = null;
- }
-
- BufferList._init.call(this, callback);
- DuplexStream.call(this);
-}
-
-inherits(BufferListStream, DuplexStream);
-Object.assign(BufferListStream.prototype, BufferList.prototype);
-
-BufferListStream.prototype._new = function _new (callback) {
- return new BufferListStream(callback)
-};
-
-BufferListStream.prototype._write = function _write (buf, encoding, callback) {
- this._appendBuffer(buf);
-
- if (typeof callback === 'function') {
- callback();
- }
-};
-
-BufferListStream.prototype._read = function _read (size) {
- if (!this.length) {
- return this.push(null)
- }
-
- size = Math.min(size, this.length);
- this.push(this.slice(0, size));
- this.consume(size);
-};
-
-BufferListStream.prototype.end = function end (chunk) {
- DuplexStream.prototype.end.call(this, chunk);
-
- if (this._callback) {
- this._callback(null, this.slice());
- this._callback = null;
- }
-};
-
-BufferListStream.prototype._destroy = function _destroy (err, cb) {
- this._bufs.length = 0;
- this.length = 0;
- cb(err);
-};
-
-BufferListStream.prototype._isBufferList = function _isBufferList (b) {
- return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
-};
-
-BufferListStream.isBufferList = BufferList.isBufferList;
-
-bl.exports = BufferListStream;
-blExports.BufferListStream = BufferListStream;
-blExports.BufferList = BufferList;
-
-var queueMicrotask_1;
-var hasRequiredQueueMicrotask;
-
-function requireQueueMicrotask () {
- if (hasRequiredQueueMicrotask) return queueMicrotask_1;
- hasRequiredQueueMicrotask = 1;
- queueMicrotask_1 = typeof queueMicrotask === 'function' ? queueMicrotask : (fn) => Promise.resolve().then(fn);
- return queueMicrotask_1;
-}
-
-var processNextTick = (typeof process !== 'undefined' && typeof process.nextTick === 'function')
- ? process.nextTick.bind(process)
- : requireQueueMicrotask();
-
-var fixedSize = class FixedFIFO {
- constructor (hwm) {
- if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) throw new Error('Max size for a FixedFIFO should be a power of two')
- this.buffer = new Array(hwm);
- this.mask = hwm - 1;
- this.top = 0;
- this.btm = 0;
- this.next = null;
- }
-
- push (data) {
- if (this.buffer[this.top] !== undefined) return false
- this.buffer[this.top] = data;
- this.top = (this.top + 1) & this.mask;
- return true
- }
-
- shift () {
- const last = this.buffer[this.btm];
- if (last === undefined) return undefined
- this.buffer[this.btm] = undefined;
- this.btm = (this.btm + 1) & this.mask;
- return last
- }
-
- peek () {
- return this.buffer[this.btm]
- }
-
- isEmpty () {
- return this.buffer[this.btm] === undefined
- }
-};
-
-const FixedFIFO = fixedSize;
-
-var fastFifo = class FastFIFO {
- constructor (hwm) {
- this.hwm = hwm || 16;
- this.head = new FixedFIFO(this.hwm);
- this.tail = this.head;
- }
-
- push (val) {
- if (!this.head.push(val)) {
- const prev = this.head;
- this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length);
- this.head.push(val);
- }
- }
-
- shift () {
- const val = this.tail.shift();
- if (val === undefined && this.tail.next) {
- const next = this.tail.next;
- this.tail.next = null;
- this.tail = next;
- return this.tail.shift()
- }
- return val
- }
-
- peek () {
- return this.tail.peek()
- }
-
- isEmpty () {
- return this.head.isEmpty()
- }
-};
-
-const { EventEmitter } = require$$2;
-const STREAM_DESTROYED = new Error('Stream was destroyed');
-const PREMATURE_CLOSE = new Error('Premature close');
-
-const queueTick = processNextTick;
-const FIFO = fastFifo;
-
-/* eslint-disable no-multi-spaces */
-
-// 26 bits used total (4 from shared, 13 from read, and 9 from write)
-const MAX = ((1 << 26) - 1);
-
-// Shared state
-const OPENING = 0b0001;
-const PREDESTROYING = 0b0010;
-const DESTROYING = 0b0100;
-const DESTROYED = 0b1000;
-
-const NOT_OPENING = MAX ^ OPENING;
-const NOT_PREDESTROYING = MAX ^ PREDESTROYING;
-
-// Read state (4 bit offset from shared state)
-const READ_ACTIVE = 0b0000000000001 << 4;
-const READ_PRIMARY = 0b0000000000010 << 4;
-const READ_SYNC = 0b0000000000100 << 4;
-const READ_QUEUED = 0b0000000001000 << 4;
-const READ_RESUMED = 0b0000000010000 << 4;
-const READ_PIPE_DRAINED = 0b0000000100000 << 4;
-const READ_ENDING = 0b0000001000000 << 4;
-const READ_EMIT_DATA = 0b0000010000000 << 4;
-const READ_EMIT_READABLE = 0b0000100000000 << 4;
-const READ_EMITTED_READABLE = 0b0001000000000 << 4;
-const READ_DONE = 0b0010000000000 << 4;
-const READ_NEXT_TICK = 0b0100000000001 << 4; // also active
-const READ_NEEDS_PUSH = 0b1000000000000 << 4;
-
-// Combined read state
-const READ_FLOWING = READ_RESUMED | READ_PIPE_DRAINED;
-const READ_ACTIVE_AND_SYNC = READ_ACTIVE | READ_SYNC;
-const READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH = READ_ACTIVE | READ_SYNC | READ_NEEDS_PUSH;
-const READ_PRIMARY_AND_ACTIVE = READ_PRIMARY | READ_ACTIVE;
-const READ_EMIT_READABLE_AND_QUEUED = READ_EMIT_READABLE | READ_QUEUED;
-
-const READ_NOT_ACTIVE = MAX ^ READ_ACTIVE;
-const READ_NON_PRIMARY = MAX ^ READ_PRIMARY;
-const READ_NON_PRIMARY_AND_PUSHED = MAX ^ (READ_PRIMARY | READ_NEEDS_PUSH);
-const READ_NOT_SYNC = MAX ^ READ_SYNC;
-const READ_PUSHED = MAX ^ READ_NEEDS_PUSH;
-const READ_PAUSED = MAX ^ READ_RESUMED;
-const READ_NOT_QUEUED = MAX ^ (READ_QUEUED | READ_EMITTED_READABLE);
-const READ_NOT_ENDING = MAX ^ READ_ENDING;
-const READ_PIPE_NOT_DRAINED = MAX ^ READ_FLOWING;
-const READ_NOT_NEXT_TICK = MAX ^ READ_NEXT_TICK;
-
-// Write state (17 bit offset, 4 bit offset from shared state and 13 from read state)
-const WRITE_ACTIVE = 0b000000001 << 17;
-const WRITE_PRIMARY = 0b000000010 << 17;
-const WRITE_SYNC = 0b000000100 << 17;
-const WRITE_QUEUED = 0b000001000 << 17;
-const WRITE_UNDRAINED = 0b000010000 << 17;
-const WRITE_DONE = 0b000100000 << 17;
-const WRITE_EMIT_DRAIN = 0b001000000 << 17;
-const WRITE_NEXT_TICK = 0b010000001 << 17; // also active
-const WRITE_FINISHING = 0b100000000 << 17;
-
-const WRITE_NOT_ACTIVE = MAX ^ WRITE_ACTIVE;
-const WRITE_NOT_SYNC = MAX ^ WRITE_SYNC;
-const WRITE_NON_PRIMARY = MAX ^ WRITE_PRIMARY;
-const WRITE_NOT_FINISHING = MAX ^ WRITE_FINISHING;
-const WRITE_DRAINED = MAX ^ WRITE_UNDRAINED;
-const WRITE_NOT_QUEUED = MAX ^ WRITE_QUEUED;
-const WRITE_NOT_NEXT_TICK = MAX ^ WRITE_NEXT_TICK;
-
-// Combined shared state
-const ACTIVE = READ_ACTIVE | WRITE_ACTIVE;
-const NOT_ACTIVE = MAX ^ ACTIVE;
-const DONE = READ_DONE | WRITE_DONE;
-const DESTROY_STATUS = DESTROYING | DESTROYED | PREDESTROYING;
-const OPEN_STATUS = DESTROY_STATUS | OPENING;
-const AUTO_DESTROY = DESTROY_STATUS | DONE;
-const NON_PRIMARY = WRITE_NON_PRIMARY & READ_NON_PRIMARY;
-const ACTIVE_OR_TICKING = WRITE_NEXT_TICK | READ_NEXT_TICK;
-const TICKING = ACTIVE_OR_TICKING & NOT_ACTIVE;
-const IS_OPENING = OPEN_STATUS | TICKING;
-
-// Combined shared state and read state
-const READ_PRIMARY_STATUS = OPEN_STATUS | READ_ENDING | READ_DONE;
-const READ_STATUS = OPEN_STATUS | READ_DONE | READ_QUEUED;
-const READ_ENDING_STATUS = OPEN_STATUS | READ_ENDING | READ_QUEUED;
-const READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | READ_EMITTED_READABLE;
-const SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH;
-const READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE;
-
-// Combined write state
-const WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE;
-const WRITE_QUEUED_AND_UNDRAINED = WRITE_QUEUED | WRITE_UNDRAINED;
-const WRITE_QUEUED_AND_ACTIVE = WRITE_QUEUED | WRITE_ACTIVE;
-const WRITE_DRAIN_STATUS = WRITE_QUEUED | WRITE_UNDRAINED | OPEN_STATUS | WRITE_ACTIVE;
-const WRITE_STATUS = OPEN_STATUS | WRITE_ACTIVE | WRITE_QUEUED;
-const WRITE_PRIMARY_AND_ACTIVE = WRITE_PRIMARY | WRITE_ACTIVE;
-const WRITE_ACTIVE_AND_SYNC = WRITE_ACTIVE | WRITE_SYNC;
-const WRITE_FINISHING_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_QUEUED_AND_ACTIVE | WRITE_DONE;
-const WRITE_BACKPRESSURE_STATUS = WRITE_UNDRAINED | DESTROY_STATUS | WRITE_FINISHING | WRITE_DONE;
-
-const asyncIterator = Symbol.asyncIterator || Symbol('asyncIterator');
-
-class WritableState {
- constructor (stream, { highWaterMark = 16384, map = null, mapWritable, byteLength, byteLengthWritable } = {}) {
- this.stream = stream;
- this.queue = new FIFO();
- this.highWaterMark = highWaterMark;
- this.buffered = 0;
- this.error = null;
- this.pipeline = null;
- this.byteLength = byteLengthWritable || byteLength || defaultByteLength;
- this.map = mapWritable || map;
- this.afterWrite = afterWrite.bind(this);
- this.afterUpdateNextTick = updateWriteNT.bind(this);
- }
-
- get ended () {
- return (this.stream._duplexState & WRITE_DONE) !== 0
- }
-
- push (data) {
- if (this.map !== null) data = this.map(data);
-
- this.buffered += this.byteLength(data);
- this.queue.push(data);
-
- if (this.buffered < this.highWaterMark) {
- this.stream._duplexState |= WRITE_QUEUED;
- return true
- }
-
- this.stream._duplexState |= WRITE_QUEUED_AND_UNDRAINED;
- return false
- }
-
- shift () {
- const data = this.queue.shift();
- const stream = this.stream;
-
- this.buffered -= this.byteLength(data);
- if (this.buffered === 0) stream._duplexState &= WRITE_NOT_QUEUED;
-
- return data
- }
-
- end (data) {
- if (typeof data === 'function') this.stream.once('finish', data);
- else if (data !== undefined && data !== null) this.push(data);
- this.stream._duplexState = (this.stream._duplexState | WRITE_FINISHING) & WRITE_NON_PRIMARY;
- }
-
- autoBatch (data, cb) {
- const buffer = [];
- const stream = this.stream;
-
- buffer.push(data);
- while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED_AND_ACTIVE) {
- buffer.push(stream._writableState.shift());
- }
-
- if ((stream._duplexState & OPEN_STATUS) !== 0) return cb(null)
- stream._writev(buffer, cb);
- }
-
- update () {
- const stream = this.stream;
-
- while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED) {
- const data = this.shift();
- stream._duplexState |= WRITE_ACTIVE_AND_SYNC;
- stream._write(data, this.afterWrite);
- stream._duplexState &= WRITE_NOT_SYNC;
- }
-
- if ((stream._duplexState & WRITE_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
- }
-
- updateNonPrimary () {
- const stream = this.stream;
-
- if ((stream._duplexState & WRITE_FINISHING_STATUS) === WRITE_FINISHING) {
- stream._duplexState = (stream._duplexState | WRITE_ACTIVE) & WRITE_NOT_FINISHING;
- stream._final(afterFinal.bind(this));
- return
- }
-
- if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
- if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
- stream._duplexState |= ACTIVE;
- stream._destroy(afterDestroy.bind(this));
- }
- return
- }
-
- if ((stream._duplexState & IS_OPENING) === OPENING) {
- stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
- stream._open(afterOpen.bind(this));
- }
- }
-
- updateNextTick () {
- if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return
- this.stream._duplexState |= WRITE_NEXT_TICK;
- queueTick(this.afterUpdateNextTick);
- }
-}
-
-class ReadableState {
- constructor (stream, { highWaterMark = 16384, map = null, mapReadable, byteLength, byteLengthReadable } = {}) {
- this.stream = stream;
- this.queue = new FIFO();
- this.highWaterMark = highWaterMark;
- this.buffered = 0;
- this.error = null;
- this.pipeline = null;
- this.byteLength = byteLengthReadable || byteLength || defaultByteLength;
- this.map = mapReadable || map;
- this.pipeTo = null;
- this.afterRead = afterRead.bind(this);
- this.afterUpdateNextTick = updateReadNT.bind(this);
- }
-
- get ended () {
- return (this.stream._duplexState & READ_DONE) !== 0
- }
-
- pipe (pipeTo, cb) {
- if (this.pipeTo !== null) throw new Error('Can only pipe to one destination')
- if (typeof cb !== 'function') cb = null;
-
- this.stream._duplexState |= READ_PIPE_DRAINED;
- this.pipeTo = pipeTo;
- this.pipeline = new Pipeline(this.stream, pipeTo, cb);
-
- if (cb) this.stream.on('error', noop$1); // We already error handle this so supress crashes
-
- if (isStreamx(pipeTo)) {
- pipeTo._writableState.pipeline = this.pipeline;
- if (cb) pipeTo.on('error', noop$1); // We already error handle this so supress crashes
- pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline)); // TODO: just call finished from pipeTo itself
- } else {
- const onerror = this.pipeline.done.bind(this.pipeline, pipeTo);
- const onclose = this.pipeline.done.bind(this.pipeline, pipeTo, null); // onclose has a weird bool arg
- pipeTo.on('error', onerror);
- pipeTo.on('close', onclose);
- pipeTo.on('finish', this.pipeline.finished.bind(this.pipeline));
- }
-
- pipeTo.on('drain', afterDrain.bind(this));
- this.stream.emit('piping', pipeTo);
- pipeTo.emit('pipe', this.stream);
- }
-
- push (data) {
- const stream = this.stream;
-
- if (data === null) {
- this.highWaterMark = 0;
- stream._duplexState = (stream._duplexState | READ_ENDING) & READ_NON_PRIMARY_AND_PUSHED;
- return false
- }
-
- if (this.map !== null) data = this.map(data);
- this.buffered += this.byteLength(data);
- this.queue.push(data);
-
- stream._duplexState = (stream._duplexState | READ_QUEUED) & READ_PUSHED;
-
- return this.buffered < this.highWaterMark
- }
-
- shift () {
- const data = this.queue.shift();
-
- this.buffered -= this.byteLength(data);
- if (this.buffered === 0) this.stream._duplexState &= READ_NOT_QUEUED;
- return data
- }
-
- unshift (data) {
- let tail;
- const pending = [];
-
- while ((tail = this.queue.shift()) !== undefined) {
- pending.push(tail);
- }
-
- this.push(data);
-
- for (let i = 0; i < pending.length; i++) {
- this.queue.push(pending[i]);
- }
- }
-
- read () {
- const stream = this.stream;
-
- if ((stream._duplexState & READ_STATUS) === READ_QUEUED) {
- const data = this.shift();
- if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED;
- if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data);
- return data
- }
-
- return null
- }
-
- drain () {
- const stream = this.stream;
-
- while ((stream._duplexState & READ_STATUS) === READ_QUEUED && (stream._duplexState & READ_FLOWING) !== 0) {
- const data = this.shift();
- if (this.pipeTo !== null && this.pipeTo.write(data) === false) stream._duplexState &= READ_PIPE_NOT_DRAINED;
- if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit('data', data);
- }
- }
-
- update () {
- const stream = this.stream;
-
- this.drain();
-
- while (this.buffered < this.highWaterMark && (stream._duplexState & SHOULD_NOT_READ) === 0) {
- stream._duplexState |= READ_ACTIVE_AND_SYNC_AND_NEEDS_PUSH;
- stream._read(this.afterRead);
- stream._duplexState &= READ_NOT_SYNC;
- if ((stream._duplexState & READ_ACTIVE) === 0) this.drain();
- }
-
- if ((stream._duplexState & READ_READABLE_STATUS) === READ_EMIT_READABLE_AND_QUEUED) {
- stream._duplexState |= READ_EMITTED_READABLE;
- stream.emit('readable');
- }
-
- if ((stream._duplexState & READ_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
- }
-
- updateNonPrimary () {
- const stream = this.stream;
-
- if ((stream._duplexState & READ_ENDING_STATUS) === READ_ENDING) {
- stream._duplexState = (stream._duplexState | READ_DONE) & READ_NOT_ENDING;
- stream.emit('end');
- if ((stream._duplexState & AUTO_DESTROY) === DONE) stream._duplexState |= DESTROYING;
- if (this.pipeTo !== null) this.pipeTo.end();
- }
-
- if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
- if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
- stream._duplexState |= ACTIVE;
- stream._destroy(afterDestroy.bind(this));
- }
- return
- }
-
- if ((stream._duplexState & IS_OPENING) === OPENING) {
- stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
- stream._open(afterOpen.bind(this));
- }
- }
-
- updateNextTick () {
- if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return
- this.stream._duplexState |= READ_NEXT_TICK;
- queueTick(this.afterUpdateNextTick);
- }
-}
-
-class TransformState {
- constructor (stream) {
- this.data = null;
- this.afterTransform = afterTransform.bind(stream);
- this.afterFinal = null;
- }
-}
-
-class Pipeline {
- constructor (src, dst, cb) {
- this.from = src;
- this.to = dst;
- this.afterPipe = cb;
- this.error = null;
- this.pipeToFinished = false;
- }
-
- finished () {
- this.pipeToFinished = true;
- }
-
- done (stream, err) {
- if (err) this.error = err;
-
- if (stream === this.to) {
- this.to = null;
-
- if (this.from !== null) {
- if ((this.from._duplexState & READ_DONE) === 0 || !this.pipeToFinished) {
- this.from.destroy(this.error || new Error('Writable stream closed prematurely'));
- }
- return
- }
- }
-
- if (stream === this.from) {
- this.from = null;
-
- if (this.to !== null) {
- if ((stream._duplexState & READ_DONE) === 0) {
- this.to.destroy(this.error || new Error('Readable stream closed before ending'));
- }
- return
- }
- }
-
- if (this.afterPipe !== null) this.afterPipe(this.error);
- this.to = this.from = this.afterPipe = null;
- }
-}
-
-function afterDrain () {
- this.stream._duplexState |= READ_PIPE_DRAINED;
- if ((this.stream._duplexState & READ_ACTIVE_AND_SYNC) === 0) this.updateNextTick();
- else this.drain();
-}
-
-function afterFinal (err) {
- const stream = this.stream;
- if (err) stream.destroy(err);
- if ((stream._duplexState & DESTROY_STATUS) === 0) {
- stream._duplexState |= WRITE_DONE;
- stream.emit('finish');
- }
- if ((stream._duplexState & AUTO_DESTROY) === DONE) {
- stream._duplexState |= DESTROYING;
- }
-
- stream._duplexState &= WRITE_NOT_ACTIVE;
- this.update();
-}
-
-function afterDestroy (err) {
- const stream = this.stream;
-
- if (!err && this.error !== STREAM_DESTROYED) err = this.error;
- if (err) stream.emit('error', err);
- stream._duplexState |= DESTROYED;
- stream.emit('close');
-
- const rs = stream._readableState;
- const ws = stream._writableState;
-
- if (rs !== null && rs.pipeline !== null) rs.pipeline.done(stream, err);
- if (ws !== null && ws.pipeline !== null) ws.pipeline.done(stream, err);
-}
-
-function afterWrite (err) {
- const stream = this.stream;
-
- if (err) stream.destroy(err);
- stream._duplexState &= WRITE_NOT_ACTIVE;
-
- if ((stream._duplexState & WRITE_DRAIN_STATUS) === WRITE_UNDRAINED) {
- stream._duplexState &= WRITE_DRAINED;
- if ((stream._duplexState & WRITE_EMIT_DRAIN) === WRITE_EMIT_DRAIN) {
- stream.emit('drain');
- }
- }
-
- if ((stream._duplexState & WRITE_SYNC) === 0) this.update();
-}
-
-function afterRead (err) {
- if (err) this.stream.destroy(err);
- this.stream._duplexState &= READ_NOT_ACTIVE;
- if ((this.stream._duplexState & READ_SYNC) === 0) this.update();
-}
-
-function updateReadNT () {
- this.stream._duplexState &= READ_NOT_NEXT_TICK;
- this.update();
-}
-
-function updateWriteNT () {
- this.stream._duplexState &= WRITE_NOT_NEXT_TICK;
- this.update();
-}
-
-function afterOpen (err) {
- const stream = this.stream;
-
- if (err) stream.destroy(err);
-
- if ((stream._duplexState & DESTROYING) === 0) {
- if ((stream._duplexState & READ_PRIMARY_STATUS) === 0) stream._duplexState |= READ_PRIMARY;
- if ((stream._duplexState & WRITE_PRIMARY_STATUS) === 0) stream._duplexState |= WRITE_PRIMARY;
- stream.emit('open');
- }
-
- stream._duplexState &= NOT_ACTIVE;
-
- if (stream._writableState !== null) {
- stream._writableState.update();
- }
-
- if (stream._readableState !== null) {
- stream._readableState.update();
- }
-}
-
-function afterTransform (err, data) {
- if (data !== undefined && data !== null) this.push(data);
- this._writableState.afterWrite(err);
-}
-
-class Stream extends EventEmitter {
- constructor (opts) {
- super();
-
- this._duplexState = 0;
- this._readableState = null;
- this._writableState = null;
-
- if (opts) {
- if (opts.open) this._open = opts.open;
- if (opts.destroy) this._destroy = opts.destroy;
- if (opts.predestroy) this._predestroy = opts.predestroy;
- if (opts.signal) {
- opts.signal.addEventListener('abort', abort.bind(this));
- }
- }
- }
-
- _open (cb) {
- cb(null);
- }
-
- _destroy (cb) {
- cb(null);
- }
-
- _predestroy () {
- // does nothing
- }
-
- get readable () {
- return this._readableState !== null ? true : undefined
- }
-
- get writable () {
- return this._writableState !== null ? true : undefined
- }
-
- get destroyed () {
- return (this._duplexState & DESTROYED) !== 0
- }
-
- get destroying () {
- return (this._duplexState & DESTROY_STATUS) !== 0
- }
-
- destroy (err) {
- if ((this._duplexState & DESTROY_STATUS) === 0) {
- if (!err) err = STREAM_DESTROYED;
- this._duplexState = (this._duplexState | DESTROYING) & NON_PRIMARY;
-
- if (this._readableState !== null) this._readableState.error = err;
- if (this._writableState !== null) this._writableState.error = err;
-
- this._duplexState |= PREDESTROYING;
- this._predestroy();
- this._duplexState &= NOT_PREDESTROYING;
-
- if (this._readableState !== null) this._readableState.updateNextTick();
- if (this._writableState !== null) this._writableState.updateNextTick();
- }
- }
-
- on (name, fn) {
- if (this._readableState !== null) {
- if (name === 'data') {
- this._duplexState |= (READ_EMIT_DATA | READ_RESUMED);
- this._readableState.updateNextTick();
- }
- if (name === 'readable') {
- this._duplexState |= READ_EMIT_READABLE;
- this._readableState.updateNextTick();
- }
- }
-
- if (this._writableState !== null) {
- if (name === 'drain') {
- this._duplexState |= WRITE_EMIT_DRAIN;
- this._writableState.updateNextTick();
- }
- }
-
- return super.on(name, fn)
- }
-}
-
-class Readable$1 extends Stream {
- constructor (opts) {
- super(opts);
-
- this._duplexState |= OPENING | WRITE_DONE;
- this._readableState = new ReadableState(this, opts);
-
- if (opts) {
- if (opts.read) this._read = opts.read;
- if (opts.eagerOpen) this.resume().pause();
- }
- }
-
- _read (cb) {
- cb(null);
- }
-
- pipe (dest, cb) {
- this._readableState.pipe(dest, cb);
- this._readableState.updateNextTick();
- return dest
- }
-
- read () {
- this._readableState.updateNextTick();
- return this._readableState.read()
- }
-
- push (data) {
- this._readableState.updateNextTick();
- return this._readableState.push(data)
- }
-
- unshift (data) {
- this._readableState.updateNextTick();
- return this._readableState.unshift(data)
- }
-
- resume () {
- this._duplexState |= READ_RESUMED;
- this._readableState.updateNextTick();
- return this
- }
-
- pause () {
- this._duplexState &= READ_PAUSED;
- return this
- }
-
- static _fromAsyncIterator (ite, opts) {
- let destroy;
-
- const rs = new Readable$1({
- ...opts,
- read (cb) {
- ite.next().then(push).then(cb.bind(null, null)).catch(cb);
- },
- predestroy () {
- destroy = ite.return();
- },
- destroy (cb) {
- if (!destroy) return cb(null)
- destroy.then(cb.bind(null, null)).catch(cb);
- }
- });
-
- return rs
-
- function push (data) {
- if (data.done) rs.push(null);
- else rs.push(data.value);
- }
- }
-
- static from (data, opts) {
- if (isReadStreamx(data)) return data
- if (data[asyncIterator]) return this._fromAsyncIterator(data[asyncIterator](), opts)
- if (!Array.isArray(data)) data = data === undefined ? [] : [data];
-
- let i = 0;
- return new Readable$1({
- ...opts,
- read (cb) {
- this.push(i === data.length ? null : data[i++]);
- cb(null);
- }
- })
- }
-
- static isBackpressured (rs) {
- return (rs._duplexState & READ_BACKPRESSURE_STATUS) !== 0 || rs._readableState.buffered >= rs._readableState.highWaterMark
- }
-
- static isPaused (rs) {
- return (rs._duplexState & READ_RESUMED) === 0
- }
-
- [asyncIterator] () {
- const stream = this;
-
- let error = null;
- let promiseResolve = null;
- let promiseReject = null;
-
- this.on('error', (err) => { error = err; });
- this.on('readable', onreadable);
- this.on('close', onclose);
-
- return {
- [asyncIterator] () {
- return this
- },
- next () {
- return new Promise(function (resolve, reject) {
- promiseResolve = resolve;
- promiseReject = reject;
- const data = stream.read();
- if (data !== null) ondata(data);
- else if ((stream._duplexState & DESTROYED) !== 0) ondata(null);
- })
- },
- return () {
- return destroy(null)
- },
- throw (err) {
- return destroy(err)
- }
- }
-
- function onreadable () {
- if (promiseResolve !== null) ondata(stream.read());
- }
-
- function onclose () {
- if (promiseResolve !== null) ondata(null);
- }
-
- function ondata (data) {
- if (promiseReject === null) return
- if (error) promiseReject(error);
- else if (data === null && (stream._duplexState & READ_DONE) === 0) promiseReject(STREAM_DESTROYED);
- else promiseResolve({ value: data, done: data === null });
- promiseReject = promiseResolve = null;
- }
-
- function destroy (err) {
- stream.destroy(err);
- return new Promise((resolve, reject) => {
- if (stream._duplexState & DESTROYED) return resolve({ value: undefined, done: true })
- stream.once('close', function () {
- if (err) reject(err);
- else resolve({ value: undefined, done: true });
- });
- })
- }
- }
-}
-
-class Writable$1 extends Stream {
- constructor (opts) {
- super(opts);
-
- this._duplexState |= OPENING | READ_DONE;
- this._writableState = new WritableState(this, opts);
-
- if (opts) {
- if (opts.writev) this._writev = opts.writev;
- if (opts.write) this._write = opts.write;
- if (opts.final) this._final = opts.final;
- }
- }
-
- _writev (batch, cb) {
- cb(null);
- }
-
- _write (data, cb) {
- this._writableState.autoBatch(data, cb);
- }
-
- _final (cb) {
- cb(null);
- }
-
- static isBackpressured (ws) {
- return (ws._duplexState & WRITE_BACKPRESSURE_STATUS) !== 0
- }
-
- write (data) {
- this._writableState.updateNextTick();
- return this._writableState.push(data)
- }
-
- end (data) {
- this._writableState.updateNextTick();
- this._writableState.end(data);
- return this
- }
-}
-
-class Duplex extends Readable$1 { // and Writable
- constructor (opts) {
- super(opts);
-
- this._duplexState = OPENING;
- this._writableState = new WritableState(this, opts);
-
- if (opts) {
- if (opts.writev) this._writev = opts.writev;
- if (opts.write) this._write = opts.write;
- if (opts.final) this._final = opts.final;
- }
- }
-
- _writev (batch, cb) {
- cb(null);
- }
-
- _write (data, cb) {
- this._writableState.autoBatch(data, cb);
- }
-
- _final (cb) {
- cb(null);
- }
-
- write (data) {
- this._writableState.updateNextTick();
- return this._writableState.push(data)
- }
-
- end (data) {
- this._writableState.updateNextTick();
- this._writableState.end(data);
- return this
- }
-}
-
-class Transform extends Duplex {
- constructor (opts) {
- super(opts);
- this._transformState = new TransformState(this);
-
- if (opts) {
- if (opts.transform) this._transform = opts.transform;
- if (opts.flush) this._flush = opts.flush;
- }
- }
-
- _write (data, cb) {
- if (this._readableState.buffered >= this._readableState.highWaterMark) {
- this._transformState.data = data;
- } else {
- this._transform(data, this._transformState.afterTransform);
- }
- }
-
- _read (cb) {
- if (this._transformState.data !== null) {
- const data = this._transformState.data;
- this._transformState.data = null;
- cb(null);
- this._transform(data, this._transformState.afterTransform);
- } else {
- cb(null);
- }
- }
-
- _transform (data, cb) {
- cb(null, data);
- }
-
- _flush (cb) {
- cb(null);
- }
-
- _final (cb) {
- this._transformState.afterFinal = cb;
- this._flush(transformAfterFlush.bind(this));
- }
-}
-
-class PassThrough extends Transform {}
-
-function transformAfterFlush (err, data) {
- const cb = this._transformState.afterFinal;
- if (err) return cb(err)
- if (data !== null && data !== undefined) this.push(data);
- this.push(null);
- cb(null);
-}
-
-function pipelinePromise (...streams) {
- return new Promise((resolve, reject) => {
- return pipeline(...streams, (err) => {
- if (err) return reject(err)
- resolve();
- })
- })
-}
-
-function pipeline (stream, ...streams) {
- const all = Array.isArray(stream) ? [...stream, ...streams] : [stream, ...streams];
- const done = (all.length && typeof all[all.length - 1] === 'function') ? all.pop() : null;
-
- if (all.length < 2) throw new Error('Pipeline requires at least 2 streams')
-
- let src = all[0];
- let dest = null;
- let error = null;
-
- for (let i = 1; i < all.length; i++) {
- dest = all[i];
-
- if (isStreamx(src)) {
- src.pipe(dest, onerror);
- } else {
- errorHandle(src, true, i > 1, onerror);
- src.pipe(dest);
- }
-
- src = dest;
- }
-
- if (done) {
- let fin = false;
-
- dest.on('finish', () => { fin = true; });
- dest.on('error', err => { error = error || err; });
- dest.on('close', () => done(error || (fin ? null : PREMATURE_CLOSE)));
- }
-
- return dest
-
- function errorHandle (s, rd, wr, onerror) {
- s.on('error', onerror);
- s.on('close', onclose);
-
- function onclose () {
- if (rd && s._readableState && !s._readableState.ended) return onerror(PREMATURE_CLOSE)
- if (wr && s._writableState && !s._writableState.ended) return onerror(PREMATURE_CLOSE)
- }
- }
-
- function onerror (err) {
- if (!err || error) return
- error = err;
-
- for (const s of all) {
- s.destroy(err);
- }
- }
-}
-
-function isStream (stream) {
- return !!stream._readableState || !!stream._writableState
-}
-
-function isStreamx (stream) {
- return typeof stream._duplexState === 'number' && isStream(stream)
-}
-
-function getStreamError (stream) {
- return (stream._readableState && stream._readableState.error) || (stream._writableState && stream._writableState.error)
-}
-
-function isReadStreamx (stream) {
- return isStreamx(stream) && stream.readable
-}
-
-function isTypedArray (data) {
- return typeof data === 'object' && data !== null && typeof data.byteLength === 'number'
-}
-
-function defaultByteLength (data) {
- return isTypedArray(data) ? data.byteLength : 1024
-}
-
-function noop$1 () {}
-
-function abort () {
- this.destroy(new Error('Stream aborted.'));
-}
-
-var streamx = {
- pipeline,
- pipelinePromise,
- isStream,
- isStreamx,
- getStreamError,
- Stream,
- Writable: Writable$1,
- Readable: Readable$1,
- Duplex,
- Transform,
- // Export PassThrough for compatibility with Node.js core's stream module
- PassThrough
-};
-
-var headers$1 = {};
-
-function isBuffer (value) {
- return Buffer.isBuffer(value) || value instanceof Uint8Array
-}
-
-function isEncoding (encoding) {
- return Buffer.isEncoding(encoding)
-}
-
-function alloc (size, fill, encoding) {
- return Buffer.alloc(size, fill, encoding)
-}
-
-function allocUnsafe (size) {
- return Buffer.allocUnsafe(size)
-}
-
-function allocUnsafeSlow (size) {
- return Buffer.allocUnsafeSlow(size)
-}
-
-function byteLength (string, encoding) {
- return Buffer.byteLength(string, encoding)
-}
-
-function compare (a, b) {
- return Buffer.compare(a, b)
-}
-
-function concat (buffers, totalLength) {
- return Buffer.concat(buffers, totalLength)
-}
-
-function copy (source, target, targetStart, start, end) {
- return toBuffer(source).copy(target, targetStart, start, end)
-}
-
-function equals (a, b) {
- return toBuffer(a).equals(b)
-}
-
-function fill (buffer, value, offset, end, encoding) {
- return toBuffer(buffer).fill(value, offset, end, encoding)
-}
-
-function from (value, encodingOrOffset, length) {
- return Buffer.from(value, encodingOrOffset, length)
-}
-
-function includes (buffer, value, byteOffset, encoding) {
- return toBuffer(buffer).includes(value, byteOffset, encoding)
-}
-
-function indexOf$1 (buffer, value, byfeOffset, encoding) {
- return toBuffer(buffer).indexOf(value, byfeOffset, encoding)
-}
-
-function lastIndexOf (buffer, value, byteOffset, encoding) {
- return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding)
-}
-
-function swap16 (buffer) {
- return toBuffer(buffer).swap16()
-}
-
-function swap32 (buffer) {
- return toBuffer(buffer).swap32()
-}
-
-function swap64 (buffer) {
- return toBuffer(buffer).swap64()
-}
-
-function toBuffer (buffer) {
- if (Buffer.isBuffer(buffer)) return buffer
- return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength)
-}
-
-function toString (buffer, encoding, start, end) {
- return toBuffer(buffer).toString(encoding, start, end)
-}
-
-function write (buffer, string, offset, length, encoding) {
- return toBuffer(buffer).write(string, offset, length, encoding)
-}
-
-function writeDoubleLE (buffer, value, offset) {
- return toBuffer(buffer).writeDoubleLE(value, offset)
-}
-
-function writeFloatLE (buffer, value, offset) {
- return toBuffer(buffer).writeFloatLE(value, offset)
-}
-
-function writeUInt32LE (buffer, value, offset) {
- return toBuffer(buffer).writeUInt32LE(value, offset)
-}
-
-function writeInt32LE (buffer, value, offset) {
- return toBuffer(buffer).writeInt32LE(value, offset)
-}
-
-function readDoubleLE (buffer, offset) {
- return toBuffer(buffer).readDoubleLE(offset)
-}
-
-function readFloatLE (buffer, offset) {
- return toBuffer(buffer).readFloatLE(offset)
-}
-
-function readUInt32LE (buffer, offset) {
- return toBuffer(buffer).readUInt32LE(offset)
-}
-
-function readInt32LE (buffer, offset) {
- return toBuffer(buffer).readInt32LE(offset)
-}
-
-var b4a$2 = {
- isBuffer,
- isEncoding,
- alloc,
- allocUnsafe,
- allocUnsafeSlow,
- byteLength,
- compare,
- concat,
- copy,
- equals,
- fill,
- from,
- includes,
- indexOf: indexOf$1,
- lastIndexOf,
- swap16,
- swap32,
- swap64,
- toBuffer,
- toString,
- write,
- writeDoubleLE,
- writeFloatLE,
- writeUInt32LE,
- writeInt32LE,
- readDoubleLE,
- readFloatLE,
- readUInt32LE,
- readInt32LE
-};
-
-const b4a$1 = b4a$2;
-
-const ZEROS = '0000000000000000000';
-const SEVENS = '7777777777777777777';
-const ZERO_OFFSET = '0'.charCodeAt(0);
-const USTAR_MAGIC = b4a$1.from('ustar\x00', 'binary');
-const USTAR_VER = b4a$1.from('00', 'binary');
-const GNU_MAGIC = b4a$1.from('ustar\x20', 'binary');
-const GNU_VER = b4a$1.from('\x20\x00', 'binary');
-const MASK = 0o7777;
-const MAGIC_OFFSET = 257;
-const VERSION_OFFSET = 263;
-
-const clamp = function (index, len, defaultValue) {
- if (typeof index !== 'number') return defaultValue
- index = ~~index; // Coerce to integer.
- if (index >= len) return len
- if (index >= 0) return index
- index += len;
- if (index >= 0) return index
- return 0
-};
-
-const toType = function (flag) {
- switch (flag) {
- case 0:
- return 'file'
- case 1:
- return 'link'
- case 2:
- return 'symlink'
- case 3:
- return 'character-device'
- case 4:
- return 'block-device'
- case 5:
- return 'directory'
- case 6:
- return 'fifo'
- case 7:
- return 'contiguous-file'
- case 72:
- return 'pax-header'
- case 55:
- return 'pax-global-header'
- case 27:
- return 'gnu-long-link-path'
- case 28:
- case 30:
- return 'gnu-long-path'
- }
-
- return null
-};
-
-const toTypeflag = function (flag) {
- switch (flag) {
- case 'file':
- return 0
- case 'link':
- return 1
- case 'symlink':
- return 2
- case 'character-device':
- return 3
- case 'block-device':
- return 4
- case 'directory':
- return 5
- case 'fifo':
- return 6
- case 'contiguous-file':
- return 7
- case 'pax-header':
- return 72
- }
-
- return 0
-};
-
-const indexOf = function (block, num, offset, end) {
- for (; offset < end; offset++) {
- if (block[offset] === num) return offset
- }
- return end
-};
-
-const cksum = function (block) {
- let sum = 8 * 32;
- for (let i = 0; i < 148; i++) sum += block[i];
- for (let j = 156; j < 512; j++) sum += block[j];
- return sum
-};
-
-const encodeOct = function (val, n) {
- val = val.toString(8);
- if (val.length > n) return SEVENS.slice(0, n) + ' '
- else return ZEROS.slice(0, n - val.length) + val + ' '
-};
-
-/* Copied from the node-tar repo and modified to meet
- * tar-stream coding standard.
- *
- * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349
- */
-function parse256 (buf) {
- // first byte MUST be either 80 or FF
- // 80 for positive, FF for 2's comp
- let positive;
- if (buf[0] === 0x80) positive = true;
- else if (buf[0] === 0xFF) positive = false;
- else return null
-
- // build up a base-256 tuple from the least sig to the highest
- const tuple = [];
- let i;
- for (i = buf.length - 1; i > 0; i--) {
- const byte = buf[i];
- if (positive) tuple.push(byte);
- else tuple.push(0xFF - byte);
- }
-
- let sum = 0;
- const l = tuple.length;
- for (i = 0; i < l; i++) {
- sum += tuple[i] * Math.pow(256, i);
- }
-
- return positive ? sum : -1 * sum
-}
-
-const decodeOct = function (val, offset, length) {
- val = val.slice(offset, offset + length);
- offset = 0;
-
- // If prefixed with 0x80 then parse as a base-256 integer
- if (val[offset] & 0x80) {
- return parse256(val)
- } else {
- // Older versions of tar can prefix with spaces
- while (offset < val.length && val[offset] === 32) offset++;
- const end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length);
- while (offset < end && val[offset] === 0) offset++;
- if (end === offset) return 0
- return parseInt(val.slice(offset, end).toString(), 8)
- }
-};
-
-const decodeStr = function (val, offset, length, encoding) {
- return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)
-};
-
-const addLength = function (str) {
- const len = b4a$1.byteLength(str);
- let digits = Math.floor(Math.log(len) / Math.log(10)) + 1;
- if (len + digits >= Math.pow(10, digits)) digits++;
-
- return (len + digits) + str
-};
-
-headers$1.decodeLongPath = function (buf, encoding) {
- return decodeStr(buf, 0, buf.length, encoding)
-};
-
-headers$1.encodePax = function (opts) { // TODO: encode more stuff in pax
- let result = '';
- if (opts.name) result += addLength(' path=' + opts.name + '\n');
- if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n');
- const pax = opts.pax;
- if (pax) {
- for (const key in pax) {
- result += addLength(' ' + key + '=' + pax[key] + '\n');
- }
- }
- return b4a$1.from(result)
-};
-
-headers$1.decodePax = function (buf) {
- const result = {};
-
- while (buf.length) {
- let i = 0;
- while (i < buf.length && buf[i] !== 32) i++;
- const len = parseInt(buf.slice(0, i).toString(), 10);
- if (!len) return result
-
- const b = buf.slice(i + 1, len - 1).toString();
- const keyIndex = b.indexOf('=');
- if (keyIndex === -1) return result
- result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1);
-
- buf = buf.slice(len);
- }
-
- return result
-};
-
-headers$1.encode = function (opts) {
- const buf = b4a$1.alloc(512);
- let name = opts.name;
- let prefix = '';
-
- if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/';
- if (b4a$1.byteLength(name) !== name.length) return null // utf-8
-
- while (b4a$1.byteLength(name) > 100) {
- const i = name.indexOf('/');
- if (i === -1) return null
- prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i);
- name = name.slice(i + 1);
- }
-
- if (b4a$1.byteLength(name) > 100 || b4a$1.byteLength(prefix) > 155) return null
- if (opts.linkname && b4a$1.byteLength(opts.linkname) > 100) return null
-
- b4a$1.write(buf, name);
- b4a$1.write(buf, encodeOct(opts.mode & MASK, 6), 100);
- b4a$1.write(buf, encodeOct(opts.uid, 6), 108);
- b4a$1.write(buf, encodeOct(opts.gid, 6), 116);
- b4a$1.write(buf, encodeOct(opts.size, 11), 124);
- b4a$1.write(buf, encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136);
-
- buf[156] = ZERO_OFFSET + toTypeflag(opts.type);
-
- if (opts.linkname) b4a$1.write(buf, opts.linkname, 157);
-
- b4a$1.copy(USTAR_MAGIC, buf, MAGIC_OFFSET);
- b4a$1.copy(USTAR_VER, buf, VERSION_OFFSET);
- if (opts.uname) b4a$1.write(buf, opts.uname, 265);
- if (opts.gname) b4a$1.write(buf, opts.gname, 297);
- b4a$1.write(buf, encodeOct(opts.devmajor || 0, 6), 329);
- b4a$1.write(buf, encodeOct(opts.devminor || 0, 6), 337);
-
- if (prefix) b4a$1.write(buf, prefix, 345);
-
- b4a$1.write(buf, encodeOct(cksum(buf), 6), 148);
-
- return buf
-};
-
-headers$1.decode = function (buf, filenameEncoding, allowUnknownFormat) {
- let typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET;
-
- let name = decodeStr(buf, 0, 100, filenameEncoding);
- const mode = decodeOct(buf, 100, 8);
- const uid = decodeOct(buf, 108, 8);
- const gid = decodeOct(buf, 116, 8);
- const size = decodeOct(buf, 124, 12);
- const mtime = decodeOct(buf, 136, 12);
- const type = toType(typeflag);
- const linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding);
- const uname = decodeStr(buf, 265, 32);
- const gname = decodeStr(buf, 297, 32);
- const devmajor = decodeOct(buf, 329, 8);
- const devminor = decodeOct(buf, 337, 8);
-
- const c = cksum(buf);
-
- // checksum is still initial value if header was null.
- if (c === 8 * 32) return null
-
- // valid checksum
- if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')
-
- if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) {
- // ustar (posix) format.
- // prepend prefix, if present.
- if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name;
- } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 &&
- GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) ; else {
- if (!allowUnknownFormat) {
- throw new Error('Invalid tar header: unknown format.')
- }
- }
-
- // to support old tar versions that use trailing / to indicate dirs
- if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5;
-
- return {
- name,
- mode,
- uid,
- gid,
- size,
- mtime: new Date(1000 * mtime),
- type,
- linkname,
- uname,
- gname,
- devmajor,
- devminor
- }
-};
-
-const { constants } = require$$0$2;
-const { Readable, Writable } = streamx;
-const { StringDecoder } = require$$13;
-const b4a = b4a$2;
-
-const headers = headers$1;
-
-const DMODE = 0o755;
-const FMODE = 0o644;
-
-const END_OF_TAR = b4a.alloc(1024);
-
-const noop = function () {};
-
-const overflow = function (self, size) {
- size &= 511;
- if (size) self.push(END_OF_TAR.subarray(0, 512 - size));
-};
-
-function modeToType (mode) {
- switch (mode & constants.S_IFMT) {
- case constants.S_IFBLK: return 'block-device'
- case constants.S_IFCHR: return 'character-device'
- case constants.S_IFDIR: return 'directory'
- case constants.S_IFIFO: return 'fifo'
- case constants.S_IFLNK: return 'symlink'
- }
-
- return 'file'
-}
-
-class Sink extends Writable {
- constructor (to) {
- super();
- this.written = 0;
- this._to = to;
- }
-
- _write (data, cb) {
- this.written += data.byteLength;
- if (this._to.push(data)) return cb()
- this._to._drain = cb;
- }
-}
-
-class LinkSink extends Writable {
- constructor () {
- super();
- this.linkname = '';
- this._decoder = new StringDecoder('utf-8');
- }
-
- _write (data, cb) {
- this.linkname += this._decoder.write(data);
- cb();
- }
-}
-
-class Void extends Writable {
- _write (data, cb) {
- cb(new Error('No body allowed for this entry'));
- }
-}
-
-class Pack extends Readable {
- constructor (opts) {
- super(opts);
- this._drain = noop;
- this._finalized = false;
- this._finalizing = false;
- this._stream = null;
- }
-
- entry (header, buffer, callback) {
- if (this._stream) throw new Error('already piping an entry')
- if (this._finalized || this.destroyed) return
-
- if (typeof buffer === 'function') {
- callback = buffer;
- buffer = null;
- }
-
- if (!callback) callback = noop;
-
- const self = this;
-
- if (!header.size || header.type === 'symlink') header.size = 0;
- if (!header.type) header.type = modeToType(header.mode);
- if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE;
- if (!header.uid) header.uid = 0;
- if (!header.gid) header.gid = 0;
- if (!header.mtime) header.mtime = new Date();
-
- if (typeof buffer === 'string') buffer = b4a.from(buffer);
- if (b4a.isBuffer(buffer)) {
- header.size = buffer.byteLength;
- this._encode(header);
- const ok = this.push(buffer);
- overflow(self, header.size);
- if (ok) process.nextTick(callback);
- else this._drain = callback;
- return new Void()
- }
-
- if (header.type === 'symlink' && !header.linkname) {
- const linkSink = new LinkSink();
- linkSink
- .on('error', function (err) {
- self.destroy();
- callback(err);
- })
- .on('close', function () {
- header.linkname = linkSink.linkname;
- self._encode(header);
- callback();
- });
-
- return linkSink
- }
-
- this._encode(header);
-
- if (header.type !== 'file' && header.type !== 'contiguous-file') {
- process.nextTick(callback);
- return new Void()
- }
-
- const sink = new Sink(this);
- sink
- .on('error', function (err) {
- self._stream = null;
- self.destroy();
- callback(err);
- })
- .on('close', function () {
- self._stream = null;
-
- if (sink.written !== header.size) ;
-
- overflow(self, header.size);
- if (self._finalizing) { self.finalize(); }
- callback();
- });
-
- this._stream = sink;
-
- return sink
- }
-
- finalize () {
- if (this._stream) {
- this._finalizing = true;
- return
- }
-
- if (this._finalized) return
- this._finalized = true;
- this.push(END_OF_TAR);
- this.push(null);
- }
-
- _encode (header) {
- if (!header.pax) {
- const buf = headers.encode(header);
- if (buf) {
- this.push(buf);
- return
- }
- }
- this._encodePax(header);
- }
-
- _encodePax (header) {
- const paxHeader = headers.encodePax({
- name: header.name,
- linkname: header.linkname,
- pax: header.pax
- });
-
- const newHeader = {
- name: 'PaxHeader',
- mode: header.mode,
- uid: header.uid,
- gid: header.gid,
- size: paxHeader.byteLength,
- mtime: header.mtime,
- type: 'pax-header',
- linkname: header.linkname && 'PaxHeader',
- uname: header.uname,
- gname: header.gname,
- devmajor: header.devmajor,
- devminor: header.devminor
- };
-
- this.push(headers.encode(newHeader));
- this.push(paxHeader);
- overflow(this, paxHeader.byteLength);
-
- newHeader.size = header.size;
- newHeader.type = header.type;
- this.push(headers.encode(newHeader));
- }
-
- _read (cb) {
- const drain = this._drain;
- this._drain = noop;
- drain();
- cb();
- }
-}
-
-var pack$1 = function pack (opts) {
- return new Pack(opts)
-};
-
-var pack = pack$1;
-
-const MTIME = new Date(0);
-const MODE_FOR_DIR = 0o755;
-const MODE_FOR_FILE = 0o555;
-const MODE_FOR_SYMLINK = 0o775;
-function findKeyByValue(entries, value) {
- for (const [key, { dest: val }] of Object.entries(entries)) {
- // Check for exact match
- if (val == value) {
- return key;
- }
- // Check matching parent directory (https://stackoverflow.com/a/45242825).
- // For example, if `value` is a parent directory of `val`:
- //
- // value = bazel-out/darwin_arm64-fastbuild-ST-1072e68bc32d/bin/pkg/b
- // val = bazel-out/darwin_arm64-fastbuild-ST-1072e68bc32d/bin/pkg/b/index.js
- //
- // then relative is `index.js` and `/index.js` is stripped from `key`:
- //
- // key = /app/src/bin.runfiles/_main/pkg/b/index.js
- //
- // which returns `/app/src/bin.runfiles/_main/pkg/b`
- const relative = path.relative(value, val);
- if (relative &&
- !relative.startsWith('..') &&
- !path.isAbsolute(relative) &&
- key.length > relative.length + 1) {
- return key.substring(0, key.length - relative.length - 1);
- }
- }
- return undefined;
-}
-async function readlinkSafe(p) {
- try {
- const link = await readlink(p);
- return path.resolve(path.dirname(p), link);
- }
- catch (e) {
- if (e.code == 'EINVAL') {
- return p;
- }
- if (e.code == 'ENOENT') {
- // That is as far as we can follow this symlink in this layer so we can only
- // assume the file exists in another layer
- return p;
- }
- throw e;
- }
-}
-async function resolveSymlink(p) {
- let prevHop = path.resolve(p);
- let hopped = false;
- while (true) {
- // /output-base/sandbox/4/execroot/wksp/bazel-out
- // /output-base/execroot/wksp/bazel-out
- let nextHop = await readlinkSafe(prevHop);
- if (!nextHop.startsWith(process.env.JS_BINARY__EXECROOT)) {
- return hopped ? prevHop : undefined;
- }
- if (nextHop != prevHop) {
- prevHop = nextHop;
- hopped = true;
- }
- else if (!hopped) {
- return undefined;
- }
- else {
- return nextHop;
- }
- }
-}
-async function* walk(dir, accumulate = '') {
- const dirents = await readdir(dir, { withFileTypes: true });
- for (const dirent of dirents) {
- let isDirectory = dirent.isDirectory();
- if (dirent.isSymbolicLink() &&
- !dirent.isDirectory() &&
- !dirent.isFile()) {
- // On OSX we sometimes encounter this bug: https://github.com/nodejs/node/issues/30646
- // The entry is apparently a symlink, but it's ambiguous whether it's a symlink to a
- // file or to a directory, and lstat doesn't tell us either. Determine the type by
- // attempting to read it as a directory.
- try {
- await readdir(path.join(dir, dirent.name));
- isDirectory = true;
- }
- catch (error) {
- if (error.code === 'ENOTDIR') {
- isDirectory = false;
- }
- else {
- throw error;
- }
- }
- }
- if (isDirectory) {
- yield* walk(path.join(dir, dirent.name), path.join(accumulate, dirent.name));
- }
- else {
- yield path.join(accumulate, dirent.name);
- }
- }
-}
-function add_parents(name, pkg, existing_paths, owner) {
- const segments = path.dirname(name).split('/');
- let prev = '';
- const stats = {
- // this is an intermediate directory and bazel does not allow specifying
- // modes for intermediate directories.
- mode: MODE_FOR_DIR,
- mtime: MTIME,
- };
- for (const part of segments) {
- if (!part) {
- continue;
- }
- prev = path.join(prev, part);
- // check if the directory has been has been created before.
- if (existing_paths.has(prev)) {
- continue;
- }
- existing_paths.add(prev);
- add_directory(prev, pkg, owner, stats);
- }
-}
-function add_directory(name, pkg, owner, stats) {
- pkg.entry({
- type: 'directory',
- name: name.replace(/^\//, ''),
- mode: stats.mode,
- mtime: MTIME,
- gid: owner.gid,
- uid: owner.uid,
- }).end();
-}
-function add_symlink(name, linkname, pkg, owner, stats) {
- const link_parent = path.dirname(name);
- pkg.entry({
- type: 'symlink',
- name: name.replace(/^\//, ''),
- linkname: path.relative(link_parent, linkname),
- mode: stats.mode,
- mtime: MTIME,
- uid: owner.uid,
- gid: owner.gid,
- }).end();
-}
-function add_file(name, content, pkg, owner, stats) {
- return new Promise((resolve, reject) => {
- const entry = pkg.entry({
- type: 'file',
- name: name.replace(/^\//, ''),
- mode: stats.mode,
- size: stats.size,
- mtime: MTIME,
- uid: owner.uid,
- gid: owner.gid,
- }, (err) => {
- if (err) {
- reject(err);
- }
- else {
- resolve(undefined);
- }
- });
- content.pipe(entry);
- });
-}
-async function build(allEntries, entries, outputPath, compression, owner) {
- const output = pack();
- const existing_paths = new Set();
- let write = output;
- if (compression == 'gzip') {
- write = write.pipe(createGzip());
- }
- write.pipe(createWriteStream(outputPath));
- for (const key of Object.keys(entries).sort()) {
- const { dest, is_directory, is_source, is_external, root, remove_non_hermetic_lines, } = entries[key];
- // its a treeartifact. expand it and add individual entries.
- if (is_directory) {
- for await (const sub_key of walk(dest)) {
- const new_key = path.join(key, sub_key);
- const new_dest = path.join(dest, sub_key);
- add_parents(new_key, output, existing_paths, owner);
- const stats = await stat(new_dest);
- await add_file(new_key, createReadStream(new_dest), output, owner, stats);
- }
- continue;
- }
- // create parents of current path.
- add_parents(key, output, existing_paths, owner);
- // A source file from workspace, not an output of a target.
- if (is_source) {
- const originalStat = await stat(dest);
- // use stable mode bits instead of preserving the one from file.
- const stats = {
- mode: MODE_FOR_FILE,
- mtime: MTIME,
- size: originalStat.size,
- };
- await add_file(key, createReadStream(dest), output, owner, stats);
- continue;
- }
- // root indicates where the generated source comes from. it looks like
- // `bazel-out/darwin_arm64-fastbuild` when there's no transition.
- if (!root) {
- // everything except sources should have
- throw new Error(`unexpected entry format. ${JSON.stringify(entries[key])}. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose`);
- }
- const realp = await resolveSymlink(dest);
- // it's important that we don't treat any symlink pointing out of execroot since
- // bazel symlinks external files into sandbox to make them available to us.
- if (realp && !is_external) {
- const output_path = realp.slice(realp.indexOf(root));
- // interestingly, bazel 5 and 6 sets different mode bits on symlinks.
- // well use `0o755` to allow owner&group to `rwx` and others `rx`
- // see: https://chmodcommand.com/chmod-775/
- // const stats = await stat(dest)
- const stats = { mode: MODE_FOR_SYMLINK, mtime: MTIME };
- // Look in all entries for symlinks since they may be in other layers
- const linkname = findKeyByValue(allEntries, output_path);
- if (linkname == undefined) {
- throw new Error(`Couldn't map symbolic link ${output_path} to a path. please file a bug at https://github.com/aspect-build/rules_js/issues/new/choose\n\n` +
- `dest: ${dest}\n` +
- `realpath: ${realp}\n` +
- `outputpath: ${output_path}\n` +
- `root: ${root}\n` +
- `runfiles: ${key}\n\n`);
- }
- add_symlink(key, linkname, output, owner, stats);
- }
- else {
- // Due to filesystems setting different bits depending on the os we have to opt-in
- // to use a stable mode for files.
- // In the future, we might want to hand off fine-grained control of these to users
- // see: https://chmodcommand.com/chmod-0555/
- const originalStat = await stat(dest);
- const stats = {
- mode: MODE_FOR_FILE,
- mtime: MTIME,
- size: originalStat.size,
- };
- let stream = createReadStream(dest);
- if (remove_non_hermetic_lines) {
- const content = await readFile(dest);
- const replaced = Buffer.from(content
- .toString()
- .replace(/.*JS_BINARY__TARGET_CPU=".*?"/g, `export JS_BINARY__TARGET_CPU="$(uname -m)"`)
- .replace(/.*JS_BINARY__BINDIR=".*"/g, `export JS_BINARY__BINDIR="$(pwd)"`));
- stream = Readable$2.from(replaced);
- stats.size = replaced.byteLength;
- }
- await add_file(key, stream, output, owner, stats);
- }
- }
- output.finalize();
-}
-if (import.meta.url === pathToFileURL(process.argv[1]).href) {
- const [allEntriesPath, entriesPath, outputPath, compression, owner] = process.argv.slice(2);
- const rawAllEntries = await readFile(allEntriesPath);
- const allEntries = JSON.parse(rawAllEntries.toString());
- const rawEntries = await readFile(entriesPath);
- const entries = JSON.parse(rawEntries.toString());
- const [uid, gid] = owner.split(':').map(Number);
- build(allEntries, entries, outputPath, compression, { uid, gid });
+ await Promise.all([
+ /*{{WRITE_STATEMENTS}}*/
+ ])
}
-export { build };
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9wcmltb3JkaWFscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL3V0aWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ldmVudC10YXJnZXQtc2hpbUA1LjAuMS9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vZGlzdC9ldmVudC10YXJnZXQtc2hpbS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9hYm9ydC1jb250cm9sbGVyQDMuMC4wL25vZGVfbW9kdWxlcy9hYm9ydC1jb250cm9sbGVyL2Rpc3QvYWJvcnQtY29udHJvbGxlci5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvb3Vycy9lcnJvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvdmFsaWRhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3Byb2Nlc3NAMC4xMS4xMC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL29wZXJhdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3kuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hZGQtYWJvcnQtc2lnbmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4aWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGFzc3Rocm91Z2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9yZWFkYWJsZS1zdHJlYW1ANC4zLjAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvc3RyZWFtL3Byb21pc2VzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcmVhZGFibGUtc3RyZWFtQDQuMy4wL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL3N0cmVhbS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3JlYWRhYmxlLXN0cmVhbUA0LjMuMC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvaW5oZXJpdHNAMi4wLjQvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9pbmhlcml0c0AyLjAuNC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9ibEA2LjAuMC9ub2RlX21vZHVsZXMvYmwvQnVmZmVyTGlzdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2JsQDYuMC4wL25vZGVfbW9kdWxlcy9ibC9ibC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3F1ZXVlLXRpY2tAMS4wLjEvbm9kZV9tb2R1bGVzL3F1ZXVlLXRpY2svcXVldWUtbWljcm90YXNrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvcXVldWUtdGlja0AxLjAuMS9ub2RlX21vZHVsZXMvcXVldWUtdGljay9wcm9jZXNzLW5leHQtdGljay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL2Zhc3QtZmlmb0AxLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2ZpeGVkLXNpemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy9mYXN0LWZpZm9AMS4xLjAvbm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYXNwZWN0X3J1bGVzX2pzL3N0cmVhbXhAMi4xMy4yL25vZGVfbW9kdWxlcy9zdHJlYW14L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5hc3BlY3RfcnVsZXNfanMvYjRhQDEuNi4xL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL3BhY2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmFzcGVjdF9ydWxlc19qcy90YXItc3RyZWFtQDMuMC4wL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2luZGV4LmpzIiwiaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvcGVyX2NvbnRleHQvcHJpbW9yZGlhbHMuanMgZmlsZSBkZWZpbmVkIGF0XG5cbiAgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9wZXJfY29udGV4dC9wcmltb3JkaWFscy5qc1xuXG4gIERvbid0IHRyeSB0byByZXBsYWNlIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZSB3aXRoIHRoZSB1cHN0cmVhbSBmaWxlLlxuKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcnJheUlzQXJyYXkoc2VsZikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlbGYpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlSW5jbHVkZXMoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5pbmNsdWRlcyhlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVJbmRleE9mKHNlbGYsIGVsKSB7XG4gICAgcmV0dXJuIHNlbGYuaW5kZXhPZihlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVKb2luKHNlbGYsIHNlcCkge1xuICAgIHJldHVybiBzZWxmLmpvaW4oc2VwKVxuICB9LFxuICBBcnJheVByb3RvdHlwZU1hcChzZWxmLCBmbikge1xuICAgIHJldHVybiBzZWxmLm1hcChmbilcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVQb3Aoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5wb3AoZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlUHVzaChzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLnB1c2goZWwpXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlU2xpY2Uoc2VsZiwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzZWxmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0sXG4gIEVycm9yLFxuICBGdW5jdGlvblByb3RvdHlwZUNhbGwoZm4sIHRoaXNBcmdzLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpc0FyZ3MsIC4uLmFyZ3MpXG4gIH0sXG4gIEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbChzZWxmLCBpbnN0YW5jZSlcbiAgfSxcbiAgTWF0aEZsb29yOiBNYXRoLmZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzSW50ZWdlcjogTnVtYmVyLmlzSW50ZWdlcixcbiAgTnVtYmVySXNOYU46IE51bWJlci5pc05hTixcbiAgTnVtYmVyTUFYX1NBRkVfSU5URUdFUjogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gIE51bWJlck1JTl9TQUZFX0lOVEVHRVI6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludDogTnVtYmVyLnBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNlbGYsIHByb3BzKVxuICB9LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBuYW1lLCBwcm9wKVxuICB9LFxuICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwgbmFtZSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIG5hbWUpXG4gIH0sXG4gIE9iamVjdEtleXMob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgfSxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbiAgfSxcbiAgUHJvbWlzZSxcbiAgUHJvbWlzZVByb3RvdHlwZUNhdGNoKHNlbGYsIGZuKSB7XG4gICAgcmV0dXJuIHNlbGYuY2F0Y2goZm4pXG4gIH0sXG4gIFByb21pc2VQcm90b3R5cGVUaGVuKHNlbGYsIHRoZW5GbiwgY2F0Y2hGbikge1xuICAgIHJldHVybiBzZWxmLnRoZW4odGhlbkZuLCBjYXRjaEZuKVxuICB9LFxuICBQcm9taXNlUmVqZWN0KGVycikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpXG4gIH0sXG4gIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSxcbiAgUmVnRXhwUHJvdG90eXBlVGVzdChzZWxmLCB2YWx1ZSkge1xuICAgIHJldHVybiBzZWxmLnRlc3QodmFsdWUpXG4gIH0sXG4gIFNhZmVTZXQ6IFNldCxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvTG93ZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvVXBwZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYudHJpbSgpXG4gIH0sXG4gIFN5bWJvbCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcjogU3ltYm9sLmFzeW5jSXRlcmF0b3IsXG4gIFN5bWJvbEhhc0luc3RhbmNlOiBTeW1ib2wuaGFzSW5zdGFuY2UsXG4gIFN5bWJvbEl0ZXJhdG9yOiBTeW1ib2wuaXRlcmF0b3IsXG4gIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQoc2VsZiwgYnVmLCBsZW4pIHtcbiAgICByZXR1cm4gc2VsZi5zZXQoYnVmLCBsZW4pXG4gIH0sXG4gIFVpbnQ4QXJyYXlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBidWZmZXJNb2R1bGUgPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgQXN5bmNGdW5jdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiAoKSB7fSkuY29uc3RydWN0b3JcbmNvbnN0IEJsb2IgPSBnbG9iYWxUaGlzLkJsb2IgfHwgYnVmZmVyTW9kdWxlLkJsb2Jcbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuY29uc3QgaXNCbG9iID1cbiAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnXG4gICAgPyBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW5kZW50XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4vKiBlc2xpbnQtZW5hYmxlIGluZGVudCAqL1xuXG4vLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIEFnZ3JlZ2F0ZUVycm9yXG5jbGFzcyBBZ2dyZWdhdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZXJyb3JzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9ycykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGlucHV0IHRvIGJlIGFuIEFycmF5LCBnb3QgJHt0eXBlb2YgZXJyb3JzfWApXG4gICAgfVxuICAgIGxldCBtZXNzYWdlID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgbWVzc2FnZSArPSBgICAgICR7ZXJyb3JzW2ldLnN0YWNrfVxcbmBcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQWdncmVnYXRlRXJyb3InXG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnNcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFnZ3JlZ2F0ZUVycm9yLFxuICBrRW1wdHlPYmplY3Q6IE9iamVjdC5mcmVlemUoe30pLFxuICBvbmNlKGNhbGxiYWNrKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBpZiAoY2FsbGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJncylcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZTogZnVuY3Rpb24gKCkge1xuICAgIGxldCByZXNvbHZlXG4gICAgbGV0IHJlamVjdFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICByZXNvbHZlID0gcmVzXG4gICAgICByZWplY3QgPSByZWpcbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdFxuICAgIH1cbiAgfSxcbiAgcHJvbWlzaWZ5KGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZuKChlcnIsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlKC4uLmFyZ3MpXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG4gIGRlYnVnbG9nKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICB9LFxuICBmb3JtYXQoZm9ybWF0LCAuLi5hcmdzKSB7XG4gICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdXRpbC5odG1sI3V0aWxmb3JtYXRmb3JtYXQtYXJnc1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvJShbc2RpZmpdKS9nLCBmdW5jdGlvbiAoLi4uW191bnVzZWQsIHR5cGVdKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGFyZ3Muc2hpZnQoKVxuICAgICAgaWYgKHR5cGUgPT09ICdmJykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQudG9GaXhlZCg2KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnaicpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncycgJiYgdHlwZW9mIHJlcGxhY2VtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjdG9yID0gcmVwbGFjZW1lbnQuY29uc3RydWN0b3IgIT09IE9iamVjdCA/IHJlcGxhY2VtZW50LmNvbnN0cnVjdG9yLm5hbWUgOiAnJ1xuICAgICAgICByZXR1cm4gYCR7Y3Rvcn0ge31gLnRyaW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50LnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuICBpbnNwZWN0KHZhbHVlKSB7XG4gICAgLy8gVmFzdGx5IHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL25vZGVqcy5vcmcvYXBpL3V0aWwuaHRtbCN1dGlsaW5zcGVjdG9iamVjdC1vcHRpb25zXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5pbmNsdWRlcygnYCcpICYmICF2YWx1ZS5pbmNsdWRlcygnJHsnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcXGAke3ZhbHVlfVxcYGBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAnJHt2YWx1ZX0nYFxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAnTmFOJ1xuICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5pcyh2YWx1ZSwgLTApKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfW5gXG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ3t9J1xuICAgIH1cbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBpc0FzeW5jRnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiBmbiBpbnN0YW5jZW9mIEFzeW5jRnVuY3Rpb25cbiAgICB9LFxuICAgIGlzQXJyYXlCdWZmZXJWaWV3KGFycikge1xuICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpXG4gICAgfVxuICB9LFxuICBpc0Jsb2Jcbn1cbm1vZHVsZS5leHBvcnRzLnByb21pc2lmeS5jdXN0b20gPSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5wcm9taXNpZnkuY3VzdG9tJylcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpdmF0ZURhdGFcbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3t0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnRQaGFzZSBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBUaGUgY3VycmVudCBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbmNlbGVkIFRoZSBmbGFnIHRvIHByZXZlbnQgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW1lZGlhdGVTdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBUaGUgbGlzdGVuZXIgaWYgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZS4gT3RoZXJ3aXNlIHRoaXMgaXMgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3RhbXAgVGhlIHVuaXggdGltZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICogQHR5cGUge1dlYWtNYXA8RXZlbnQsIFByaXZhdGVEYXRhPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHByaXZhdGVEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVycyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIHtQcml2YXRlRGF0YX0gVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwZChldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBwcml2YXRlRGF0YS5nZXQoZXZlbnQpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICByZXR2ICE9IG51bGwsXG4gICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50IG9iamVjdCwgYnV0IGdvdFwiLFxuICAgICAgICBldmVudFxuICAgICk7XG4gICAgcmV0dXJuIHJldHZcbn1cblxuLyoqXG4gKiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3NldC10aGUtY2FuY2VsZWQtZmxhZ1xuICogQHBhcmFtIGRhdGEge1ByaXZhdGVEYXRhfSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLnBhc3NpdmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiLFxuICAgICAgICAgICAgICAgIGRhdGEucGFzc2l2ZUxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIWRhdGEuZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkYXRhLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbi8qKlxuICogVGhlIGV2ZW50IHdyYXBwZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIHByaXZhdGVEYXRhLnNldCh0aGlzLCB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgZXZlbnRQaGFzZTogMixcbiAgICAgICAgY3VycmVudFRhcmdldDogZXZlbnRUYXJnZXQsXG4gICAgICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICAgICAgc3RvcHBlZDogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlTGlzdGVuZXI6IG51bGwsXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCksXG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNVbmZvcmdlYWJsZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVHJ1c3RlZFwiLCB7IHZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudC50eXBlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtFdmVudFRhcmdldFtdfSBUaGUgY29tcG9zZWQgcGF0aCBvZiB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGNvbXBvc2VkUGF0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3VycmVudFRhcmdldF1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgTk9ORS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBDQVBUVVJJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBBVF9UQVJHRVQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gMlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBCVUJCTElOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDNcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFBoYXNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZGF0YS5pbW1lZGlhdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5idWJibGVzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjYW5jZWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jYW5jZWxhYmxlKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhpcyBldmVudC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNvbXBvc2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY29tcG9zZWQpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bml4IHRpbWUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS50aW1lU3RhbXBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gc3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5zdG9wcGVkXG4gICAgfSxcbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICFwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBvYmplY3QuIEJ1dCBkbyBub3RoaW5nIHVuZGVyIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGJ1YmJsZSB1cC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5jZWxhYmxlPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBjYW5jZWwuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbml0RXZlbnQoKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnQucHJvdG90eXBlKTtcblxuICAgIC8vIE1ha2UgYXNzb2NpYXRpb24gZm9yIHdyYXBwZXJzLlxuICAgIHdyYXBwZXJzLnNldCh3aW5kb3cuRXZlbnQucHJvdG90eXBlLCBFdmVudCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCB0aGUgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50W2tleV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBwZCh0aGlzKS5ldmVudFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgYSBnaXZlbiBtZXRob2QgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIHRoZSBtZXRob2QgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGQodGhpcykuZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRba2V5XS5hcHBseShldmVudCwgYXJndW1lbnRzKVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IEJhc2VFdmVudCBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgZGVmaW5lZCB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lV3JhcHBlcihCYXNlRXZlbnQsIHByb3RvKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3RvKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJhc2VFdmVudFxuICAgIH1cblxuICAgIC8qKiBDdXN0b21FdmVudCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgICAgICBCYXNlRXZlbnQuY2FsbCh0aGlzLCBldmVudFRhcmdldCwgZXZlbnQpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogQ3VzdG9tRXZlbnQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiBCYXNlRXZlbnQucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBpc0Z1bmMgPSB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgaXNGdW5jXG4gICAgICAgICAgICAgICAgICAgID8gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgICAgICAgICA6IGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50XG59XG5cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGdldCBpdHMgd3JhcHBlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKHByb3RvKSB7XG4gICAgaWYgKHByb3RvID09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXIgPSB3cmFwcGVycy5nZXQocHJvdG8pO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKSwgcHJvdG8pO1xuICAgICAgICB3cmFwcGVycy5zZXQocHJvdG8sIHdyYXBwZXIpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlclxufVxuXG4vKipcbiAqIFdyYXAgYSBnaXZlbiBldmVudCB0byBtYW5hZ2VtZW50IGEgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RXZlbnR9IFRoZSB3cmFwcGVyIGluc3RhbmNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIGNvbnN0IFdyYXBwZXIgPSBnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkpO1xuICAgIHJldHVybiBuZXcgV3JhcHBlcihldmVudFRhcmdldCwgZXZlbnQpXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGVTdG9wcGVkIGZsYWcgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBwZChldmVudCkuaW1tZWRpYXRlU3RvcHBlZFxufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBldmVudCBwaGFzZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBldmVudFBoYXNlIE5ldyBldmVudCBwaGFzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRQaGFzZShldmVudCwgZXZlbnRQaGFzZSkge1xuICAgIHBkKGV2ZW50KS5ldmVudFBoYXNlID0gZXZlbnRQaGFzZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IE5ldyBjdXJyZW50IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0Q3VycmVudFRhcmdldChldmVudCwgY3VycmVudFRhcmdldCkge1xuICAgIHBkKGV2ZW50KS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbn1cblxuLyoqXG4gKiBTZXQgYSBwYXNzaXZlIGxpc3RlbmVyIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgTmV3IHBhc3NpdmUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldFBhc3NpdmVMaXN0ZW5lcihldmVudCwgcGFzc2l2ZUxpc3RlbmVyKSB7XG4gICAgcGQoZXZlbnQpLnBhc3NpdmVMaXN0ZW5lciA9IHBhc3NpdmVMaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcHJvcGVydHkgezF8MnwzfSBsaXN0ZW5lclR5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc2l2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmNlXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyTm9kZXxudWxsfSBuZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+Pn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8vIExpc3RlbmVyIHR5cGVzXG5jb25zdCBDQVBUVVJFID0gMTtcbmNvbnN0IEJVQkJMRSA9IDI7XG5jb25zdCBBVFRSSUJVVEUgPSAzO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQHBhcmFtIHthbnl9IHggVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG59XG5cbi8qKlxuICogR2V0IGxpc3RlbmVycy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgdG8gZ2V0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT59IFRoZSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZXZlbnRUYXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50VGFyZ2V0KTtcbiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50VGFyZ2V0IG9iamVjdCwgYnV0IGdvdCBhbm90aGVyIHZhbHVlLlwiXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RlbmVyc1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGV2ZW50IGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBnZXQgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgcmVtb3Zpbmcgb2xkIHZhbHVlLlxuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGU6IEFUVFJJQlVURSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUgKGUuZy4gYGV2ZW50VGFyZ2V0Lm9uY2xpY2tgKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFRhcmdldFByb3RvdHlwZSBUaGUgZXZlbnQgdGFyZ2V0IHByb3RvdHlwZSB0byBkZWZpbmUgYW4gZXZlbnQgYXR0cmJpdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGRlZmluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZShldmVudFRhcmdldFByb3RvdHlwZSwgZXZlbnROYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBldmVudFRhcmdldFByb3RvdHlwZSxcbiAgICAgICAgYG9uJHtldmVudE5hbWV9YCxcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSlcbiAgICApO1xufVxuXG4vKipcbiAqIERlZmluZSBhIGN1c3RvbSBFdmVudFRhcmdldCB3aXRoIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudE5hbWVzIEV2ZW50IG5hbWVzIGZvciBldmVudCBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgY3VzdG9tIEV2ZW50VGFyZ2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoZXZlbnROYW1lcykge1xuICAgIC8qKiBDdXN0b21FdmVudFRhcmdldCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50VGFyZ2V0KCkge1xuICAgICAgICBFdmVudFRhcmdldC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogQ3VzdG9tRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldFxufVxuXG4vKipcbiAqIEV2ZW50VGFyZ2V0LlxuICpcbiAqIC0gVGhpcyBpcyBjb25zdHJ1Y3RvciBpZiBubyBhcmd1bWVudHMuXG4gKiAtIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgQ3VzdG9tRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgaWYgdGhlcmUgYXJlIGFyZ3VtZW50cy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgY2xhc3MgQSBleHRlbmRzIEV2ZW50VGFyZ2V0IHt9XG4gKiAgICAgY2xhc3MgQiBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiKSB7fVxuICogICAgIGNsYXNzIEMgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIiwgXCJlcnJvclwiKSB7fVxuICogICAgIGNsYXNzIEQgZXh0ZW5kcyBFdmVudFRhcmdldChbXCJtZXNzYWdlXCIsIFwiZXJyb3JcIl0pIHt9XG4gKi9cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoYXJndW1lbnRzWzBdKVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQodHlwZXMpXG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcbiAgICAvKmVzbGludC1lbmFibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidsaXN0ZW5lcicgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zSXNPYmogPSBpc09iamVjdChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnNJc09ialxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgIGxpc3RlbmVyVHlwZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaXQgYXMgdGhlIGZpcnN0IG5vZGUgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbnVsbC5cbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgY2hlY2tpbmcgZHVwbGljYXRpb24uLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpZ25vcmUgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaXQuXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKVxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgZmFsc2VgIGlmIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09IG51bGwgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXZlbnQudHlwZVwiIHNob3VsZCBiZSBhIHN0cmluZy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnQudHlwZTtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW5ub3QgcmV3cml0ZSBzZXZlcmFsIHByb3BlcnRpZXMsIHNvIHdyYXAgb2JqZWN0LlxuICAgICAgICBjb25zdCB3cmFwcGVkRXZlbnQgPSB3cmFwRXZlbnQodGhpcywgZXZlbnQpO1xuXG4gICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgcGFydGljaXBhdGluZyBpbiBhIHRyZWUuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaXQncyBvbmNlXG4gICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzaXZlID8gbm9kZS5saXN0ZW5lciA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUubGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuY2FsbCh0aGlzLCB3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgIT09IEFUVFJJQlVURSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQod3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgaWYgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgIGlmIChpc1N0b3BwZWQod3JhcHBlZEV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKHdyYXBwZWRFdmVudCwgbnVsbCk7XG4gICAgICAgIHNldEV2ZW50UGhhc2Uod3JhcHBlZEV2ZW50LCAwKTtcbiAgICAgICAgc2V0Q3VycmVudFRhcmdldCh3cmFwcGVkRXZlbnQsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiAhd3JhcHBlZEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2Ygd2luZG93LkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiXG4pIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRUYXJnZXQ7XG5leHBvcnQgeyBkZWZpbmVFdmVudEF0dHJpYnV0ZSwgRXZlbnRUYXJnZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LXRhcmdldC1zaGltLm1qcy5tYXBcbiIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEV2ZW50VGFyZ2V0LCBkZWZpbmVFdmVudEF0dHJpYnV0ZSB9IGZyb20gJ2V2ZW50LXRhcmdldC1zaGltJztcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBgQWJvcnRTaWduYWxgJ3MgYEFib3J0Q29udHJvbGxlcmAgaGFzIHNpZ25hbGVkIHRvIGFib3J0LCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ZWQgPSBhYm9ydGVkRmxhZ3MuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGFib3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0U2lnbmFsJyBvYmplY3QsIGJ1dCBnb3QgJHt0aGlzID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdGhpc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZDtcbiAgICB9XG59XG5kZWZpbmVFdmVudEF0dHJpYnV0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwiYWJvcnRcIik7XG4vKipcbiAqIENyZWF0ZSBhbiBBYm9ydFNpZ25hbCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IE9iamVjdC5jcmVhdGUoQWJvcnRTaWduYWwucHJvdG90eXBlKTtcbiAgICBFdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRTaWduYWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0LWNvbnRyb2xsZXIubWpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZm9ybWF0LCBpbnNwZWN0LCBBZ2dyZWdhdGVFcnJvcjogQ3VzdG9tQWdncmVnYXRlRXJyb3IgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qXG4gIFRoaXMgZmlsZSBpcyBhIHJlZHVjZWQgYW5kIGFkYXB0ZWQgdmVyc2lvbiBvZiB0aGUgbWFpbiBsaWIvaW50ZXJuYWwvZXJyb3JzLmpzIGZpbGUgZGVmaW5lZCBhdFxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvZXJyb3JzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIChzdGFydGluZyBmcm9tIEUoLi4uKSBkZWZpbml0aW9ucylcbiAgd2l0aCB0aGUgdXBzdHJlYW0gZmlsZS5cbiovXG5cbmNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsVGhpcy5BZ2dyZWdhdGVFcnJvciB8fCBDdXN0b21BZ2dyZWdhdGVFcnJvclxuY29uc3Qga0lzTm9kZUVycm9yID0gU3ltYm9sKCdrSXNOb2RlRXJyb3InKVxuY29uc3Qga1R5cGVzID0gW1xuICAnc3RyaW5nJyxcbiAgJ2Z1bmN0aW9uJyxcbiAgJ251bWJlcicsXG4gICdvYmplY3QnLFxuICAvLyBBY2NlcHQgJ0Z1bmN0aW9uJyBhbmQgJ09iamVjdCcgYXMgYWx0ZXJuYXRpdmUgdG8gdGhlIGxvd2VyIGNhc2VkIHZlcnNpb24uXG4gICdGdW5jdGlvbicsXG4gICdPYmplY3QnLFxuICAnYm9vbGVhbicsXG4gICdiaWdpbnQnLFxuICAnc3ltYm9sJ1xuXVxuY29uc3QgY2xhc3NSZWdFeHAgPSAvXihbQS1aXVthLXowLTldKikrJC9cbmNvbnN0IG5vZGVJbnRlcm5hbFByZWZpeCA9ICdfX25vZGVfaW50ZXJuYWxfJ1xuY29uc3QgY29kZXMgPSB7fVxuZnVuY3Rpb24gYXNzZXJ0KHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgY29kZXMuRVJSX0lOVEVSTkFMX0FTU0VSVElPTihtZXNzYWdlKVxuICB9XG59XG5cbi8vIE9ubHkgdXNlIHRoaXMgZm9yIGludGVnZXJzISBEZWNpbWFsIG51bWJlcnMgZG8gbm90IHdvcmsgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoa2V5LCBtc2csIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NlcnQoXG4gICAgICBtc2cubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoLFxuICAgICAgLy8gRGVmYXVsdCBvcHRpb25zIGRvIG5vdCBjb3VudC5cbiAgICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7bXNnLmxlbmd0aH0pLmBcbiAgICApXG4gICAgcmV0dXJuIG1zZyguLi5hcmdzKVxuICB9XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gKG1zZy5tYXRjaCgvJVtkZmlqb09zXS9nKSB8fCBbXSkubGVuZ3RoXG4gIGFzc2VydChcbiAgICBleHBlY3RlZExlbmd0aCA9PT0gYXJncy5sZW5ndGgsXG4gICAgYENvZGU6ICR7a2V5fTsgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBsZW5ndGggKCR7YXJncy5sZW5ndGh9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHtleHBlY3RlZExlbmd0aH0pLmBcbiAgKVxuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbXNnXG4gIH1cbiAgcmV0dXJuIGZvcm1hdChtc2csIC4uLmFyZ3MpXG59XG5mdW5jdGlvbiBFKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yXG4gIH1cbiAgY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgc3VwZXIoZ2V0TWVzc2FnZShjb2RlLCBtZXNzYWdlLCBhcmdzKSlcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtjb2RlfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTm9kZUVycm9yLnByb3RvdHlwZSwge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBCYXNlLm5hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICB0b1N0cmluZzoge1xuICAgICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske2NvZGV9XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pXG4gIE5vZGVFcnJvci5wcm90b3R5cGUuY29kZSA9IGNvZGVcbiAgTm9kZUVycm9yLnByb3RvdHlwZVtrSXNOb2RlRXJyb3JdID0gdHJ1ZVxuICBjb2Rlc1tjb2RlXSA9IE5vZGVFcnJvclxufVxuZnVuY3Rpb24gaGlkZVN0YWNrRnJhbWVzKGZuKSB7XG4gIC8vIFdlIHJlbmFtZSB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBoaWRkZW4gdG8gY3V0IG9mZiB0aGUgc3RhY2t0cmFjZVxuICAvLyBhdCB0aGUgb3V0ZXJtb3N0IG9uZVxuICBjb25zdCBoaWRkZW4gPSBub2RlSW50ZXJuYWxQcmVmaXggKyBmbi5uYW1lXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6IGhpZGRlblxuICB9KVxuICByZXR1cm4gZm5cbn1cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhpbm5lckVycm9yLCBvdXRlckVycm9yKSB7XG4gIGlmIChpbm5lckVycm9yICYmIG91dGVyRXJyb3IgJiYgaW5uZXJFcnJvciAhPT0gb3V0ZXJFcnJvcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGVyRXJyb3IuZXJyb3JzKSkge1xuICAgICAgLy8gSWYgYG91dGVyRXJyb3JgIGlzIGFscmVhZHkgYW4gYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICAgIG91dGVyRXJyb3IuZXJyb3JzLnB1c2goaW5uZXJFcnJvcilcbiAgICAgIHJldHVybiBvdXRlckVycm9yXG4gICAgfVxuICAgIGNvbnN0IGVyciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihbb3V0ZXJFcnJvciwgaW5uZXJFcnJvcl0sIG91dGVyRXJyb3IubWVzc2FnZSlcbiAgICBlcnIuY29kZSA9IG91dGVyRXJyb3IuY29kZVxuICAgIHJldHVybiBlcnJcbiAgfVxuICByZXR1cm4gaW5uZXJFcnJvciB8fCBvdXRlckVycm9yXG59XG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnb3B0aW9ucycsICdPYmplY3QnLCBvcHRpb25zKVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMuY29kZSA9ICdBQk9SVF9FUlInXG4gICAgdGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InXG4gIH1cbn1cbkUoJ0VSUl9BU1NFUlRJT04nLCAnJXMnLCBFcnJvcilcbkUoXG4gICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSA9PiB7XG4gICAgYXNzZXJ0KHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJywgXCInbmFtZScgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICAgIGV4cGVjdGVkID0gW2V4cGVjdGVkXVxuICAgIH1cbiAgICBsZXQgbXNnID0gJ1RoZSAnXG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoJyBhcmd1bWVudCcpKSB7XG4gICAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgICBtc2cgKz0gYCR7bmFtZX0gYFxuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYFwiJHtuYW1lfVwiICR7bmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCd9IGBcbiAgICB9XG4gICAgbXNnICs9ICdtdXN0IGJlICdcbiAgICBjb25zdCB0eXBlcyA9IFtdXG4gICAgY29uc3QgaW5zdGFuY2VzID0gW11cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBleHBlY3RlZCkge1xuICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsICdBbGwgZXhwZWN0ZWQgZW50cmllcyBoYXZlIHRvIGJlIG9mIHR5cGUgc3RyaW5nJylcbiAgICAgIGlmIChrVHlwZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIHR5cGVzLnB1c2godmFsdWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodmFsdWUgIT09ICdvYmplY3QnLCAnVGhlIHZhbHVlIFwib2JqZWN0XCIgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgXCJPYmplY3RcIicpXG4gICAgICAgIG90aGVyLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGUgYG9iamVjdGAgaW4gY2FzZSBvdGhlciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQgdG8gb3V0bGluZVxuICAgIC8vIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVhY2ggb3RoZXIuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0eXBlcy5pbmRleE9mKCdvYmplY3QnKVxuICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgdHlwZXMuc3BsaWNlKHR5cGVzLCBwb3MsIDEpXG4gICAgICAgIGluc3RhbmNlcy5wdXNoKCdPYmplY3QnKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoICh0eXBlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1zZyArPSBgb2YgdHlwZSAke3R5cGVzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzWzBdfSBvciAke3R5cGVzWzFdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHR5cGVzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBvbmUgb2YgdHlwZSAke3R5cGVzLmpvaW4oJywgJyl9LCBvciAke2xhc3R9YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA+IDAgfHwgb3RoZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBtc2cgKz0gJyBvciAnXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3dpdGNoIChpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtc2cgKz0gYGFuIGluc3RhbmNlIG9mICR7aW5zdGFuY2VzWzBdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlc1swXX0gb3IgJHtpbnN0YW5jZXNbMV19YFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gaW5zdGFuY2VzLnBvcCgpXG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlcy5qb2luKCcsICcpfSwgb3IgJHtsYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnICs9ICcgb3IgJ1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKG90aGVyLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAob3RoZXJbMF0udG9Mb3dlckNhc2UoKSAhPT0gb3RoZXJbMF0pIHtcbiAgICAgICAgICBtc2cgKz0gJ2FuICdcbiAgICAgICAgfVxuICAgICAgICBtc2cgKz0gYCR7b3RoZXJbMF19YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYG9uZSBvZiAke290aGVyWzBdfSBvciAke290aGVyWzFdfWBcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG90aGVyLnBvcCgpXG4gICAgICAgIG1zZyArPSBgb25lIG9mICR7b3RoZXIuam9pbignLCAnKX0sIG9yICR7bGFzdH1gXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3R1YWwgPT0gbnVsbCkge1xuICAgICAgbXNnICs9IGAuIFJlY2VpdmVkICR7YWN0dWFsfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdmdW5jdGlvbicgJiYgYWN0dWFsLm5hbWUpIHtcbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBmdW5jdGlvbiAke2FjdHVhbC5uYW1lfWBcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2FjdHVhbCRjb25zdHJ1Y3RvclxuICAgICAgaWYgKFxuICAgICAgICAoX2FjdHVhbCRjb25zdHJ1Y3RvciA9IGFjdHVhbC5jb25zdHJ1Y3RvcikgIT09IG51bGwgJiZcbiAgICAgICAgX2FjdHVhbCRjb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9hY3R1YWwkY29uc3RydWN0b3IubmFtZVxuICAgICAgKSB7XG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2FjdHVhbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluc3BlY3RlZCA9IGluc3BlY3QoYWN0dWFsLCB7XG4gICAgICAgICAgZGVwdGg6IC0xXG4gICAgICAgIH0pXG4gICAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCAke2luc3BlY3RlZH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpbnNwZWN0ZWQgPSBpbnNwZWN0KGFjdHVhbCwge1xuICAgICAgICBjb2xvcnM6IGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluc3BlY3RlZC5sZW5ndGggPiAyNSkge1xuICAgICAgICBpbnNwZWN0ZWQgPSBgJHtpbnNwZWN0ZWQuc2xpY2UoMCwgMjUpfS4uLmBcbiAgICAgIH1cbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGFjdHVhbH0gKCR7aW5zcGVjdGVkfSlgXG4gICAgfVxuICAgIHJldHVybiBtc2dcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfQVJHX1ZBTFVFJyxcbiAgKG5hbWUsIHZhbHVlLCByZWFzb24gPSAnaXMgaW52YWxpZCcpID0+IHtcbiAgICBsZXQgaW5zcGVjdGVkID0gaW5zcGVjdCh2YWx1ZSlcbiAgICBpZiAoaW5zcGVjdGVkLmxlbmd0aCA+IDEyOCkge1xuICAgICAgaW5zcGVjdGVkID0gaW5zcGVjdGVkLnNsaWNlKDAsIDEyOCkgKyAnLi4uJ1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gbmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCdcbiAgICByZXR1cm4gYFRoZSAke3R5cGV9ICcke25hbWV9JyAke3JlYXNvbn0uIFJlY2VpdmVkICR7aW5zcGVjdGVkfWBcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJyxcbiAgKGlucHV0LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIHZhciBfdmFsdWUkY29uc3RydWN0b3JcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX3ZhbHVlJGNvbnN0cnVjdG9yID0gdmFsdWUuY29uc3RydWN0b3IpICE9PSBudWxsICYmXG4gICAgICBfdmFsdWUkY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgX3ZhbHVlJGNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgPyBgaW5zdGFuY2Ugb2YgJHt2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgOiBgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke2lucHV0fSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBcIiR7bmFtZX1cImAgKyBgIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlfS5gXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9NSVNTSU5HX0FSR1MnLFxuICAoLi4uYXJncykgPT4ge1xuICAgIGFzc2VydChhcmdzLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgYXJnIG5lZWRzIHRvIGJlIHNwZWNpZmllZCcpXG4gICAgbGV0IG1zZ1xuICAgIGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoXG4gICAgYXJncyA9IChBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSkubWFwKChhKSA9PiBgXCIke2F9XCJgKS5qb2luKCcgb3IgJylcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFyZ3VtZW50YFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3NbMF19IGFuZCAke2FyZ3NbMV19IGFyZ3VtZW50c2BcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgVGhlICR7YXJncy5qb2luKCcsICcpfSwgYW5kICR7bGFzdH0gYXJndW1lbnRzYFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJldHVybiBgJHttc2d9IG11c3QgYmUgc3BlY2lmaWVkYFxuICB9LFxuICBUeXBlRXJyb3JcbilcbkUoXG4gICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgKHN0ciwgcmFuZ2UsIGlucHV0KSA9PiB7XG4gICAgYXNzZXJ0KHJhbmdlLCAnTWlzc2luZyBcInJhbmdlXCIgYXJndW1lbnQnKVxuICAgIGxldCByZWNlaXZlZFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiAybiAqKiAzMm4gfHwgaW5wdXQgPCAtKDJuICoqIDMybikpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjZWl2ZWQgPSBpbnNwZWN0KGlucHV0KVxuICAgIH1cbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBvZiBcIiR7c3RyfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gIH0sXG4gIFJhbmdlRXJyb3JcbilcbkUoJ0VSUl9NVUxUSVBMRV9DQUxMQkFDSycsICdDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnLCBFcnJvcilcbkUoJ0VSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJywgJ1RoZSAlcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQnLCAnQ2Fubm90IGNhbGwgJXMgYWZ0ZXIgYSBzdHJlYW0gd2FzIGZpbmlzaGVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgJ0Nhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScsICdQcmVtYXR1cmUgY2xvc2UnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnLCBFcnJvcilcbkUoJ0VSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EJywgJ3dyaXRlIGFmdGVyIGVuZCcsIEVycm9yKVxuRSgnRVJSX1VOS05PV05fRU5DT0RJTkcnLCAnVW5rbm93biBlbmNvZGluZzogJXMnLCBUeXBlRXJyb3IpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWJvcnRFcnJvcixcbiAgYWdncmVnYXRlVHdvRXJyb3JzOiBoaWRlU3RhY2tGcmFtZXMoYWdncmVnYXRlVHdvRXJyb3JzKSxcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2Rlc1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgQXJyYXlJc0FycmF5LFxuICBBcnJheVByb3RvdHlwZUluY2x1ZGVzLFxuICBBcnJheVByb3RvdHlwZUpvaW4sXG4gIEFycmF5UHJvdG90eXBlTWFwLFxuICBOdW1iZXJJc0ludGVnZXIsXG4gIE51bWJlcklzTmFOLFxuICBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSLFxuICBOdW1iZXJQYXJzZUludCxcbiAgT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHksXG4gIFJlZ0V4cFByb3RvdHlwZUV4ZWMsXG4gIFN0cmluZyxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2UsXG4gIFN0cmluZ1Byb3RvdHlwZVRyaW1cbn0gPSByZXF1aXJlKCcuLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaGlkZVN0YWNrRnJhbWVzLFxuICBjb2RlczogeyBFUlJfU09DS0VUX0JBRF9QT1JULCBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX0lOVkFMSURfQVJHX1ZBTFVFLCBFUlJfT1VUX09GX1JBTkdFLCBFUlJfVU5LTk9XTl9TSUdOQUwgfVxufSA9IHJlcXVpcmUoJy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgbm9ybWFsaXplRW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpXG5jb25zdCB7IGlzQXN5bmNGdW5jdGlvbiwgaXNBcnJheUJ1ZmZlclZpZXcgfSA9IHJlcXVpcmUoJy4uL291cnMvdXRpbCcpLnR5cGVzXG5jb25zdCBzaWduYWxzID0ge31cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNJbnQzMih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICh2YWx1ZSB8IDApXG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVWludDMyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPj4+IDBcbn1cbmNvbnN0IG9jdGFsUmVnID0gL15bMC03XSskL1xuY29uc3QgbW9kZURlc2MgPSAnbXVzdCBiZSBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9yIGFuIG9jdGFsIHN0cmluZydcblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBtb2RlX3QgKHRoZSBTXypcbiAqIGNvbnN0YW50cykuIE9ubHkgdmFsaWQgbnVtYmVycyBhbmQgb2N0YWwgc3RyaW5ncyBhcmUgYWxsb3dlZC4gVGhleSBjb3VsZCBiZVxuICogY29udmVydGVkIHRvIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyBvciBub24tbmVnYXRpdmUgc2lnbmVkIGludGVnZXJzIGluIHRoZVxuICogQysrIGxhbmQsIGJ1dCBhbnkgdmFsdWUgaGlnaGVyIHRoYW4gMG83Nzcgd2lsbCByZXN1bHQgaW4gcGxhdGZvcm0tc3BlY2lmaWNcbiAqIGJlaGF2aW9ycy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlcyB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGFyZ3VtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZl0gSWYgc3BlY2lmaWVkLCB3aWxsIGJlIHJldHVybmVkIGZvciBpbnZhbGlkIHZhbHVlc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VGaWxlTW9kZSh2YWx1ZSwgbmFtZSwgZGVmKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFsdWUgPSBkZWZcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChSZWdFeHBQcm90b3R5cGVFeGVjKG9jdGFsUmVnLCB2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgdmFsdWUsIG1vZGVEZXNjKVxuICAgIH1cbiAgICB2YWx1ZSA9IE51bWJlclBhcnNlSW50KHZhbHVlLCA4KVxuICB9XG4gIHZhbGlkYXRlVWludDMyKHZhbHVlLCBuYW1lKVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnRlZ2VyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlSW50ZWdlcn0gKi9cbmNvbnN0IHZhbGlkYXRlSW50ZWdlciA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IE51bWJlck1JTl9TQUZFX0lOVEVHRVIsIG1heCA9IE51bWJlck1BWF9TQUZFX0lOVEVHRVIpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVJbnQzMlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUludDMyfSAqL1xuY29uc3QgdmFsaWRhdGVJbnQzMiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbiA9IC0yMTQ3NDgzNjQ4LCBtYXggPSAyMTQ3NDgzNjQ3KSA9PiB7XG4gIC8vIFRoZSBkZWZhdWx0cyBmb3IgbWluIGFuZCBtYXggY29ycmVzcG9uZCB0byB0aGUgbGltaXRzIG9mIDMyLWJpdCBpbnRlZ2Vycy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVaW50MzJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbcG9zaXRpdmU9ZmFsc2VdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVpbnQzMn0gKi9cbmNvbnN0IHZhbGlkYXRlVWludDMyID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgcG9zaXRpdmUgPSBmYWxzZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbiAgaWYgKCFOdW1iZXJJc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuICBjb25zdCBtaW4gPSBwb3NpdGl2ZSA/IDEgOiAwXG4gIC8vIDIgKiogMzIgPT09IDQyOTQ5NjcyOTZcbiAgY29uc3QgbWF4ID0gNDI5NDk2NzI5NVxuICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCBgPj0gJHttaW59ICYmIDw9ICR7bWF4fWAsIHZhbHVlKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZVN0cmluZ1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIHN0cmluZ31cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlU3RyaW5nfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnc3RyaW5nJywgdmFsdWUpXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlTnVtYmVyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IFttaW5dXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIG51bWJlcn1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlTnVtYmVyfSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIodmFsdWUsIG5hbWUsIG1pbiA9IHVuZGVmaW5lZCwgbWF4KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICBpZiAoXG4gICAgKG1pbiAhPSBudWxsICYmIHZhbHVlIDwgbWluKSB8fFxuICAgIChtYXggIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkgfHxcbiAgICAoKG1pbiAhPSBudWxsIHx8IG1heCAhPSBudWxsKSAmJiBOdW1iZXJJc05hTih2YWx1ZSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKFxuICAgICAgbmFtZSxcbiAgICAgIGAke21pbiAhPSBudWxsID8gYD49ICR7bWlufWAgOiAnJ30ke21pbiAhPSBudWxsICYmIG1heCAhPSBudWxsID8gJyAmJiAnIDogJyd9JHttYXggIT0gbnVsbCA/IGA8PSAke21heH1gIDogJyd9YCxcbiAgICAgIHZhbHVlXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlT25lT2ZcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtUW119IG9uZU9mXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9uZU9mfSAqL1xuY29uc3QgdmFsaWRhdGVPbmVPZiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG9uZU9mKSA9PiB7XG4gIGlmICghQXJyYXlQcm90b3R5cGVJbmNsdWRlcyhvbmVPZiwgdmFsdWUpKSB7XG4gICAgY29uc3QgYWxsb3dlZCA9IEFycmF5UHJvdG90eXBlSm9pbihcbiAgICAgIEFycmF5UHJvdG90eXBlTWFwKG9uZU9mLCAodikgPT4gKHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGAnJHt2fSdgIDogU3RyaW5nKHYpKSksXG4gICAgICAnLCAnXG4gICAgKVxuICAgIGNvbnN0IHJlYXNvbiA9ICdtdXN0IGJlIG9uZSBvZjogJyArIGFsbG93ZWRcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIHZhbHVlLCByZWFzb24pXG4gIH1cbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUJvb2xlYW59ICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4odmFsdWUsIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ2Jvb2xlYW4nLCB2YWx1ZSlcbn1cbmZ1bmN0aW9uIGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIG9wdGlvbnMgPT0gbnVsbCB8fCAhT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHkob3B0aW9ucywga2V5KSA/IGRlZmF1bHRWYWx1ZSA6IG9wdGlvbnNba2V5XVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU9iamVjdFxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7e1xuICogICBhbGxvd0FycmF5PzogYm9vbGVhbixcbiAqICAgYWxsb3dGdW5jdGlvbj86IGJvb2xlYW4sXG4gKiAgIG51bGxhYmxlPzogYm9vbGVhblxuICogfX0gW29wdGlvbnNdXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU9iamVjdH0gKi9cbmNvbnN0IHZhbGlkYXRlT2JqZWN0ID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSwgb3B0aW9ucyA9IG51bGwpID0+IHtcbiAgY29uc3QgYWxsb3dBcnJheSA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93QXJyYXknLCBmYWxzZSlcbiAgY29uc3QgYWxsb3dGdW5jdGlvbiA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ2FsbG93RnVuY3Rpb24nLCBmYWxzZSlcbiAgY29uc3QgbnVsbGFibGUgPSBnZXRPd25Qcm9wZXJ0eVZhbHVlT3JEZWZhdWx0KG9wdGlvbnMsICdudWxsYWJsZScsIGZhbHNlKVxuICBpZiAoXG4gICAgKCFudWxsYWJsZSAmJiB2YWx1ZSA9PT0gbnVsbCkgfHxcbiAgICAoIWFsbG93QXJyYXkgJiYgQXJyYXlJc0FycmF5KHZhbHVlKSkgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiAoIWFsbG93RnVuY3Rpb24gfHwgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdPYmplY3QnLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluTGVuZ3RoXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgYW55W119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFycmF5fSAqL1xuY29uc3QgdmFsaWRhdGVBcnJheSA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbkxlbmd0aCA9IDApID0+IHtcbiAgaWYgKCFBcnJheUlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBcnJheScsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICBjb25zdCByZWFzb24gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke21pbkxlbmd0aH1gXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrXG4vKipcbiAqIEBwYXJhbSB7Kn0gc2lnbmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J3NpZ25hbCddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzaWduYWwgaXMga2V5b2Ygc2lnbmFsc31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTaWduYWxOYW1lKHNpZ25hbCwgbmFtZSA9ICdzaWduYWwnKSB7XG4gIHZhbGlkYXRlU3RyaW5nKHNpZ25hbCwgbmFtZSlcbiAgaWYgKHNpZ25hbHNbc2lnbmFsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNpZ25hbHNbU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2lnbmFsKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwgKyAnIChzaWduYWxzIG11c3QgdXNlIGFsbCBjYXBpdGFsIGxldHRlcnMpJylcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVSUl9VTktOT1dOX1NJR05BTChzaWduYWwpXG4gIH1cbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVCdWZmZXJcbiAqIEBwYXJhbSB7Kn0gYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J2J1ZmZlciddXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBidWZmZXIgaXMgQXJyYXlCdWZmZXJWaWV3fVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVCdWZmZXJ9ICovXG5jb25zdCB2YWxpZGF0ZUJ1ZmZlciA9IGhpZGVTdGFja0ZyYW1lcygoYnVmZmVyLCBuYW1lID0gJ2J1ZmZlcicpID0+IHtcbiAgaWYgKCFpc0FycmF5QnVmZmVyVmlldyhidWZmZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsIFsnQnVmZmVyJywgJ1R5cGVkQXJyYXknLCAnRGF0YVZpZXcnXSwgYnVmZmVyKVxuICB9XG59KVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbmNvZGluZyhkYXRhLCBlbmNvZGluZykge1xuICBjb25zdCBub3JtYWxpemVkRW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZylcbiAgY29uc3QgbGVuZ3RoID0gZGF0YS5sZW5ndGhcbiAgaWYgKG5vcm1hbGl6ZWRFbmNvZGluZyA9PT0gJ2hleCcgJiYgbGVuZ3RoICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoJ2VuY29kaW5nJywgZW5jb2RpbmcsIGBpcyBpbnZhbGlkIGZvciBkYXRhIG9mIGxlbmd0aCAke2xlbmd0aH1gKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgcG9ydCBudW1iZXIgaXMgbm90IE5hTiB3aGVuIGNvZXJjZWQgdG8gYSBudW1iZXIsXG4gKiBpcyBhbiBpbnRlZ2VyIGFuZCB0aGF0IGl0IGZhbGxzIHdpdGhpbiB0aGUgbGVnYWwgcmFuZ2Ugb2YgcG9ydCBudW1iZXJzLlxuICogQHBhcmFtIHsqfSBwb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9J1BvcnQnXVxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3daZXJvPXRydWVdXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBvcnQocG9ydCwgbmFtZSA9ICdQb3J0JywgYWxsb3daZXJvID0gdHJ1ZSkge1xuICBpZiAoXG4gICAgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgcG9ydCAhPT0gJ3N0cmluZycpIHx8XG4gICAgKHR5cGVvZiBwb3J0ID09PSAnc3RyaW5nJyAmJiBTdHJpbmdQcm90b3R5cGVUcmltKHBvcnQpLmxlbmd0aCA9PT0gMCkgfHxcbiAgICArcG9ydCAhPT0gK3BvcnQgPj4+IDAgfHxcbiAgICBwb3J0ID4gMHhmZmZmIHx8XG4gICAgKHBvcnQgPT09IDAgJiYgIWFsbG93WmVybylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9TT0NLRVRfQkFEX1BPUlQobmFtZSwgcG9ydCwgYWxsb3daZXJvKVxuICB9XG4gIHJldHVybiBwb3J0IHwgMFxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUFib3J0U2lnbmFsXG4gKiBAcGFyYW0geyp9IHNpZ25hbFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQWJvcnRTaWduYWx9ICovXG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gaGlkZVN0YWNrRnJhbWVzKChzaWduYWwsIG5hbWUpID0+IHtcbiAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIChzaWduYWwgPT09IG51bGwgfHwgdHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUZ1bmN0aW9ufSAqL1xuY29uc3QgdmFsaWRhdGVGdW5jdGlvbiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVBsYWluRnVuY3Rpb259ICovXG5jb25zdCB2YWxpZGF0ZVBsYWluRnVuY3Rpb24gPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgfHwgaXNBc3luY0Z1bmN0aW9uKHZhbHVlKSkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdGdW5jdGlvbicsIHZhbHVlKVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVVbmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVVuZGVmaW5lZH0gKi9cbmNvbnN0IHZhbGlkYXRlVW5kZWZpbmVkID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICd1bmRlZmluZWQnLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1RbXX0gdW5pb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVVbmlvbih2YWx1ZSwgbmFtZSwgdW5pb24pIHtcbiAgaWYgKCFBcnJheVByb3RvdHlwZUluY2x1ZGVzKHVuaW9uLCB2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgYCgnJHtBcnJheVByb3RvdHlwZUpvaW4odW5pb24sICd8Jyl9JylgLCB2YWx1ZSlcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzSW50MzIsXG4gIGlzVWludDMyLFxuICBwYXJzZUZpbGVNb2RlLFxuICB2YWxpZGF0ZUFycmF5LFxuICB2YWxpZGF0ZUJvb2xlYW4sXG4gIHZhbGlkYXRlQnVmZmVyLFxuICB2YWxpZGF0ZUVuY29kaW5nLFxuICB2YWxpZGF0ZUZ1bmN0aW9uLFxuICB2YWxpZGF0ZUludDMyLFxuICB2YWxpZGF0ZUludGVnZXIsXG4gIHZhbGlkYXRlTnVtYmVyLFxuICB2YWxpZGF0ZU9iamVjdCxcbiAgdmFsaWRhdGVPbmVPZixcbiAgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uLFxuICB2YWxpZGF0ZVBvcnQsXG4gIHZhbGlkYXRlU2lnbmFsTmFtZSxcbiAgdmFsaWRhdGVTdHJpbmcsXG4gIHZhbGlkYXRlVWludDMyLFxuICB2YWxpZGF0ZVVuZGVmaW5lZCxcbiAgdmFsaWRhdGVVbmlvbixcbiAgdmFsaWRhdGVBYm9ydFNpZ25hbFxufVxuIiwiLy8gZm9yIG5vdyBqdXN0IGV4cG9zZSB0aGUgYnVpbHRpbiBwcm9jZXNzIGdsb2JhbCBmcm9tIG5vZGUuanNcbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLnByb2Nlc3M7XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBTeW1ib2wsIFN5bWJvbEFzeW5jSXRlcmF0b3IsIFN5bWJvbEl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2tEZXN0cm95ZWQnKVxuY29uc3Qga0lzRXJyb3JlZCA9IFN5bWJvbCgna0lzRXJyb3JlZCcpXG5jb25zdCBrSXNSZWFkYWJsZSA9IFN5bWJvbCgna0lzUmVhZGFibGUnKVxuY29uc3Qga0lzRGlzdHVyYmVkID0gU3ltYm9sKCdrSXNEaXN0dXJiZWQnKVxuZnVuY3Rpb24gaXNSZWFkYWJsZU5vZGVTdHJlYW0ob2JqLCBzdHJpY3QgPSBmYWxzZSkge1xuICB2YXIgX29iaiRfcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICghc3RyaWN0IHx8ICh0eXBlb2Ygb2JqLnBhdXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoucmVzdW1lID09PSAnZnVuY3Rpb24nKSkgJiZcbiAgICAgICghb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAgICgoX29iaiRfcmVhZGFibGVTdGF0ZSA9IG9iai5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX29iaiRfcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IF9vYmokX3JlYWRhYmxlU3RhdGUucmVhZGFibGUpICE9PSBmYWxzZSkgJiZcbiAgICAgIC8vIER1cGxleFxuICAgICAgKCFvYmouX3dyaXRhYmxlU3RhdGUgfHwgb2JqLl9yZWFkYWJsZVN0YXRlKVxuICAgICkgLy8gV3JpdGFibGUgaGFzIC5waXBlLlxuICApXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGFibGVOb2RlU3RyZWFtKG9iaikge1xuICB2YXIgX29iaiRfd3JpdGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoIW9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgICAoKF9vYmokX3dyaXRhYmxlU3RhdGUgPSBvYmouX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9vYmokX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb2JqJF93cml0YWJsZVN0YXRlLndyaXRhYmxlKSAhPT0gZmFsc2UpXG4gICAgKSAvLyBEdXBsZXhcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0R1cGxleE5vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShcbiAgICBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICBvYmouX3JlYWRhYmxlU3RhdGUgJiZcbiAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5mdW5jdGlvbiBpc05vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgKG9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAodHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSlcbiAgKVxufVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmosIGlzQXN5bmMpIHtcbiAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKGlzQXN5bmMgPT09IHRydWUpIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIGlmIChpc0FzeW5jID09PSBmYWxzZSkgcmV0dXJuIHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBpc0Rlc3Ryb3llZChzdHJlYW0pIHtcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBzdGF0ZSA9IHdTdGF0ZSB8fCByU3RhdGVcbiAgcmV0dXJuICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdIHx8IChzdGF0ZSAhPT0gbnVsbCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLmRlc3Ryb3llZCkpXG59XG5cbi8vIEhhdmUgYmVlbiBlbmQoKTpkLlxuZnVuY3Rpb24gaXNXcml0YWJsZUVuZGVkKHN0cmVhbSkge1xuICBpZiAoIWlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGlmIChzdHJlYW0ud3JpdGFibGVFbmRlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWVcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh3U3RhdGUgIT09IG51bGwgJiYgd1N0YXRlICE9PSB1bmRlZmluZWQgJiYgd1N0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiB3U3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdmaW5pc2gnLlxuZnVuY3Rpb24gaXNXcml0YWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS53cml0YWJsZUZpbmlzaGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5maW5pc2hlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHdTdGF0ZS5maW5pc2hlZCB8fCAoc3RyaWN0ID09PSBmYWxzZSAmJiB3U3RhdGUuZW5kZWQgPT09IHRydWUgJiYgd1N0YXRlLmxlbmd0aCA9PT0gMCkpXG59XG5cbi8vIEhhdmUgYmVlbiBwdXNoKG51bGwpOmQuXG5mdW5jdGlvbiBpc1JlYWRhYmxlRW5kZWQoc3RyZWFtKSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS5yZWFkYWJsZUVuZGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kZWQpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIHJldHVybiByU3RhdGUuZW5kZWRcbn1cblxuLy8gSGF2ZSBlbWl0dGVkICdlbmQnLlxuZnVuY3Rpb24gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgc3RyaWN0KSB7XG4gIGlmICghaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yZWQpIHJldHVybiBmYWxzZVxuICBpZiAodHlwZW9mIChyU3RhdGUgPT09IG51bGwgfHwgclN0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByU3RhdGUuZW5kRW1pdHRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuICEhKHJTdGF0ZS5lbmRFbWl0dGVkIHx8IChzdHJpY3QgPT09IGZhbHNlICYmIHJTdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiByU3RhdGUubGVuZ3RoID09PSAwKSlcbn1cbmZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyZWFtKSB7XG4gIGlmIChzdHJlYW0gJiYgc3RyZWFtW2tJc1JlYWRhYmxlXSAhPSBudWxsKSByZXR1cm4gc3RyZWFtW2tJc1JlYWRhYmxlXVxuICBpZiAodHlwZW9mIChzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJlYW0ucmVhZGFibGUpICE9PSAnYm9vbGVhbicpIHJldHVybiBudWxsXG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGlzUmVhZGFibGVOb2RlU3RyZWFtKHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlICYmICFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtKVxufVxuZnVuY3Rpb24gaXNXcml0YWJsZShzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiAoc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RyZWFtLndyaXRhYmxlKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICBpZiAoaXNEZXN0cm95ZWQoc3RyZWFtKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pICYmIHN0cmVhbS53cml0YWJsZSAmJiAhaXNXcml0YWJsZUVuZGVkKHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGlzRmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0cy5yZWFkYWJsZSkgIT09IGZhbHNlICYmIGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLndyaXRhYmxlKSAhPT0gZmFsc2UgJiYgaXNXcml0YWJsZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cbmZ1bmN0aW9uIGlzV3JpdGFibGVFcnJvcmVkKHN0cmVhbSkge1xuICB2YXIgX3N0cmVhbSRfd3JpdGFibGVTdGF0LCBfc3RyZWFtJF93cml0YWJsZVN0YXQyXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChzdHJlYW0ud3JpdGFibGVFcnJvcmVkKSB7XG4gICAgcmV0dXJuIHN0cmVhbS53cml0YWJsZUVycm9yZWRcbiAgfVxuICByZXR1cm4gKF9zdHJlYW0kX3dyaXRhYmxlU3RhdCA9XG4gICAgKF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0Mi5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RyZWFtJF93cml0YWJsZVN0YXQgIT09IHVuZGVmaW5lZFxuICAgID8gX3N0cmVhbSRfd3JpdGFibGVTdGF0XG4gICAgOiBudWxsXG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0kX3JlYWRhYmxlU3RhdCwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MlxuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZGFibGVFcnJvcmVkXG4gIH1cbiAgcmV0dXJuIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQgPVxuICAgIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3JlYWRhYmxlU3RhdDIuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0cmVhbSRfcmVhZGFibGVTdGF0ICE9PSB1bmRlZmluZWRcbiAgICA/IF9zdHJlYW0kX3JlYWRhYmxlU3RhdFxuICAgIDogbnVsbFxufVxuZnVuY3Rpb24gaXNDbG9zZWQoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5jbG9zZWRcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChcbiAgICB0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbicgfHxcbiAgICB0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuY2xvc2VkKSB8fFxuICAgICAgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpXG4gICAgKVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLl9jbG9zZWQgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fY2xvc2VkXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbmZ1bmN0aW9uIGlzT3V0Z29pbmdNZXNzYWdlKHN0cmVhbSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2Nsb3NlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZGVmYXVsdEtlZXBBbGl2ZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fcmVtb3ZlZENvbm5lY3Rpb24gPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX3JlbW92ZWRDb250TGVuID09PSAnYm9vbGVhbidcbiAgKVxufVxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZShzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX3NlbnQxMDAgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pXG59XG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJHJlcVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2NvbnN1bWluZyA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZHVtcGVkID09PSAnYm9vbGVhbicgJiZcbiAgICAoKF9zdHJlYW0kcmVxID0gc3RyZWFtLnJlcSkgPT09IG51bGwgfHwgX3N0cmVhbSRyZXEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9zdHJlYW0kcmVxLnVwZ3JhZGVPckNvbm5lY3QpID09PVxuICAgICAgdW5kZWZpbmVkXG4gIClcbn1cbmZ1bmN0aW9uIHdpbGxFbWl0Q2xvc2Uoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgc3RhdGUgPSB3U3RhdGUgfHwgclN0YXRlXG4gIHJldHVybiAoXG4gICAgKCFzdGF0ZSAmJiBpc1NlcnZlclJlc3BvbnNlKHN0cmVhbSkpIHx8ICEhKHN0YXRlICYmIHN0YXRlLmF1dG9EZXN0cm95ICYmIHN0YXRlLmVtaXRDbG9zZSAmJiBzdGF0ZS5jbG9zZWQgPT09IGZhbHNlKVxuICApXG59XG5mdW5jdGlvbiBpc0Rpc3R1cmJlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0ka0lzRGlzdHVyYmVkXG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9zdHJlYW0ka0lzRGlzdHVyYmVkID0gc3RyZWFtW2tJc0Rpc3R1cmJlZF0pICE9PSBudWxsICYmIF9zdHJlYW0ka0lzRGlzdHVyYmVkICE9PSB1bmRlZmluZWRcbiAgICAgID8gX3N0cmVhbSRrSXNEaXN0dXJiZWRcbiAgICAgIDogc3RyZWFtLnJlYWRhYmxlRGlkUmVhZCB8fCBzdHJlYW0ucmVhZGFibGVBYm9ydGVkKVxuICApXG59XG5mdW5jdGlvbiBpc0Vycm9yZWQoc3RyZWFtKSB7XG4gIHZhciBfcmVmLFxuICAgIF9yZWYyLFxuICAgIF9yZWYzLFxuICAgIF9yZWY0LFxuICAgIF9yZWY1LFxuICAgIF9zdHJlYW0ka0lzRXJyb3JlZCxcbiAgICBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLFxuICAgIF9zdHJlYW0kX3dyaXRhYmxlU3RhdDMsXG4gICAgX3N0cmVhbSRfcmVhZGFibGVTdGF0NCxcbiAgICBfc3RyZWFtJF93cml0YWJsZVN0YXQ0XG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9yZWYgPVxuICAgICAgKF9yZWYyID1cbiAgICAgICAgKF9yZWYzID1cbiAgICAgICAgICAoX3JlZjQgPVxuICAgICAgICAgICAgKF9yZWY1ID1cbiAgICAgICAgICAgICAgKF9zdHJlYW0ka0lzRXJyb3JlZCA9IHN0cmVhbVtrSXNFcnJvcmVkXSkgIT09IG51bGwgJiYgX3N0cmVhbSRrSXNFcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IF9zdHJlYW0ka0lzRXJyb3JlZFxuICAgICAgICAgICAgICAgIDogc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IF9yZWY1XG4gICAgICAgICAgICAgIDogc3RyZWFtLndyaXRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBfcmVmNFxuICAgICAgICAgICAgOiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLmVycm9yRW1pdHRlZCkgIT09IG51bGwgJiYgX3JlZjMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gX3JlZjNcbiAgICAgICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0My5lcnJvckVtaXR0ZWQpICE9PSBudWxsICYmIF9yZWYyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmMlxuICAgICAgICA6IChfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0LmVycm9yZWQpICE9PSBudWxsICYmIF9yZWYgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfcmVmXG4gICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDQuZXJyb3JlZClcbiAgKVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtEZXN0cm95ZWQsXG4gIGlzRGlzdHVyYmVkLFxuICBrSXNEaXN0dXJiZWQsXG4gIGlzRXJyb3JlZCxcbiAga0lzRXJyb3JlZCxcbiAgaXNSZWFkYWJsZSxcbiAga0lzUmVhZGFibGUsXG4gIGlzQ2xvc2VkLFxuICBpc0Rlc3Ryb3llZCxcbiAgaXNEdXBsZXhOb2RlU3RyZWFtLFxuICBpc0ZpbmlzaGVkLFxuICBpc0l0ZXJhYmxlLFxuICBpc1JlYWRhYmxlTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUVuZGVkLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGUsXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc1dyaXRhYmxlRW5kZWQsXG4gIGlzV3JpdGFibGVGaW5pc2hlZCxcbiAgaXNXcml0YWJsZUVycm9yZWQsXG4gIGlzU2VydmVyUmVxdWVzdCxcbiAgaXNTZXJ2ZXJSZXNwb25zZSxcbiAgd2lsbEVtaXRDbG9zZVxufVxuIiwiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBBYm9ydEVycm9yLCBjb2RlcyB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgfSA9IGNvZGVzXG5jb25zdCB7IGtFbXB0eU9iamVjdCwgb25jZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgdmFsaWRhdGVBYm9ydFNpZ25hbCwgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3QgeyBQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaXNDbG9zZWQsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZUZpbmlzaGVkLFxuICBpc1dyaXRhYmxlRXJyb3JlZCxcbiAgaXNOb2RlU3RyZWFtLFxuICB3aWxsRW1pdENsb3NlOiBfd2lsbEVtaXRDbG9zZVxufSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5jb25zdCBub3AgPSAoKSA9PiB7fVxuZnVuY3Rpb24gZW9zKHN0cmVhbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIF9vcHRpb25zJHJlYWRhYmxlLCBfb3B0aW9ucyR3cml0YWJsZVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBrRW1wdHlPYmplY3RcbiAgfSBlbHNlIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICBvcHRpb25zID0ga0VtcHR5T2JqZWN0XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIHZhbGlkYXRlRnVuY3Rpb24oY2FsbGJhY2ssICdjYWxsYmFjaycpXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcbiAgY29uc3QgcmVhZGFibGUgPVxuICAgIChfb3B0aW9ucyRyZWFkYWJsZSA9IG9wdGlvbnMucmVhZGFibGUpICE9PSBudWxsICYmIF9vcHRpb25zJHJlYWRhYmxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gX29wdGlvbnMkcmVhZGFibGVcbiAgICAgIDogaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKVxuICBjb25zdCB3cml0YWJsZSA9XG4gICAgKF9vcHRpb25zJHdyaXRhYmxlID0gb3B0aW9ucy53cml0YWJsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkd3JpdGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfb3B0aW9ucyR3cml0YWJsZVxuICAgICAgOiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAvLyBUT0RPOiBXZWJzdHJlYW1zLlxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ1N0cmVhbScsIHN0cmVhbSlcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IG9ubGVnYWN5ZmluaXNoID0gKCkgPT4ge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICBvbmZpbmlzaCgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyAocm9uYWcpOiBJbXByb3ZlIHNvZnQgZGV0ZWN0aW9uIHRvIGluY2x1ZGUgY29yZSBtb2R1bGVzIGFuZFxuICAvLyBjb21tb24gZWNvc3lzdGVtIG1vZHVsZXMgdGhhdCBkbyBwcm9wZXJseSBlbWl0ICdjbG9zZScgYnV0IGZhaWxcbiAgLy8gdGhpcyBnZW5lcmljIGNoZWNrLlxuICBsZXQgd2lsbEVtaXRDbG9zZSA9XG4gICAgX3dpbGxFbWl0Q2xvc2Uoc3RyZWFtKSAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSByZWFkYWJsZSAmJiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pID09PSB3cml0YWJsZVxuICBsZXQgd3JpdGFibGVGaW5pc2hlZCA9IGlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKVxuICBjb25zdCBvbmZpbmlzaCA9ICgpID0+IHtcbiAgICB3cml0YWJsZUZpbmlzaGVkID0gdHJ1ZVxuICAgIC8vIFN0cmVhbSBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBoZXJlLiBJZiBpdCBpcyB0aGF0XG4gICAgLy8gbWVhbnMgdGhhdCB1c2VyIHNwYWNlIGlzIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnRseSBhbmRcbiAgICAvLyB3ZSBjYW5ub3QgdHJ1c3Qgd2lsbEVtaXRDbG9zZS5cbiAgICBpZiAoc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgd2lsbEVtaXRDbG9zZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh3aWxsRW1pdENsb3NlICYmICghc3RyZWFtLnJlYWRhYmxlIHx8IHJlYWRhYmxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVhZGFibGUgfHwgcmVhZGFibGVGaW5pc2hlZCkge1xuICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gICAgfVxuICB9XG4gIGxldCByZWFkYWJsZUZpbmlzaGVkID0gaXNSZWFkYWJsZUZpbmlzaGVkKHN0cmVhbSwgZmFsc2UpXG4gIGNvbnN0IG9uZW5kID0gKCkgPT4ge1xuICAgIHJlYWRhYmxlRmluaXNoZWQgPSB0cnVlXG4gICAgLy8gU3RyZWFtIHNob3VsZCBub3QgYmUgZGVzdHJveWVkIGhlcmUuIElmIGl0IGlzIHRoYXRcbiAgICAvLyBtZWFucyB0aGF0IHVzZXIgc3BhY2UgaXMgZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudGx5IGFuZFxuICAgIC8vIHdlIGNhbm5vdCB0cnVzdCB3aWxsRW1pdENsb3NlLlxuICAgIGlmIChzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgICB3aWxsRW1pdENsb3NlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKHdpbGxFbWl0Q2xvc2UgJiYgKCFzdHJlYW0ud3JpdGFibGUgfHwgd3JpdGFibGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCF3cml0YWJsZSB8fCB3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKVxuICB9XG4gIGxldCBjbG9zZWQgPSBpc0Nsb3NlZChzdHJlYW0pXG4gIGNvbnN0IG9uY2xvc2UgPSAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICAgIGNvbnN0IGVycm9yZWQgPSBpc1dyaXRhYmxlRXJyb3JlZChzdHJlYW0pIHx8IGlzUmVhZGFibGVFcnJvcmVkKHN0cmVhbSlcbiAgICBpZiAoZXJyb3JlZCAmJiB0eXBlb2YgZXJyb3JlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycm9yZWQpXG4gICAgfVxuICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVGaW5pc2hlZCAmJiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0sIHRydWUpKSB7XG4gICAgICBpZiAoIWlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgaWYgKHdyaXRhYmxlICYmICF3cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICBpZiAoIWlzV3JpdGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKSlcbiAgICB9XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gIH1cbiAgY29uc3Qgb25yZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICB9XG4gIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBpZiAoIXdpbGxFbWl0Q2xvc2UpIHtcbiAgICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKVxuICAgIH1cbiAgICBpZiAoc3RyZWFtLnJlcSkge1xuICAgICAgb25yZXF1ZXN0KClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KVxuICAgIH1cbiAgfSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd1N0YXRlKSB7XG4gICAgLy8gbGVnYWN5IHN0cmVhbXNcbiAgICBzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaClcbiAgfVxuXG4gIC8vIE5vdCBhbGwgc3RyZWFtcyB3aWxsIGVtaXQgJ2Nsb3NlJyBhZnRlciAnYWJvcnRlZCcuXG4gIGlmICghd2lsbEVtaXRDbG9zZSAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgIHN0cmVhbS5vbignYWJvcnRlZCcsIG9uY2xvc2UpXG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZClcbiAgc3RyZWFtLm9uKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgaWYgKG9wdGlvbnMuZXJyb3IgIT09IGZhbHNlKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gIH1cbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gIGlmIChjbG9zZWQpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gIH0gZWxzZSBpZiAoXG4gICAgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JFbWl0dGVkKSB8fFxuICAgIChyU3RhdGUgIT09IG51bGwgJiYgclN0YXRlICE9PSB1bmRlZmluZWQgJiYgclN0YXRlLmVycm9yRW1pdHRlZClcbiAgKSB7XG4gICAgaWYgKCF3aWxsRW1pdENsb3NlKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2UpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgICFyZWFkYWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1JlYWRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHdyaXRhYmxlRmluaXNoZWQgfHwgaXNXcml0YWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKFxuICAgICF3cml0YWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1dyaXRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHJlYWRhYmxlRmluaXNoZWQgfHwgaXNSZWFkYWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9IGVsc2UgaWYgKHJTdGF0ZSAmJiBzdHJlYW0ucmVxICYmIHN0cmVhbS5hYm9ydGVkKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlKVxuICB9XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2FsbGJhY2sgPSBub3BcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbmNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWNsb3NlZCkge1xuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgLy8gS2VlcCBpdCBiZWNhdXNlIGNsZWFudXAgcmVtb3ZlcyBpdC5cbiAgICAgIGNvbnN0IGVuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNsZWFudXAoKVxuICAgICAgZW5kQ2FsbGJhY2suY2FsbChcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gb25jZSgoLi4uYXJncykgPT4ge1xuICAgICAgICBvcHRpb25zLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xlYW51cFxufVxuZnVuY3Rpb24gZmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZW9zKHN0cmVhbSwgb3B0cywgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cbm1vZHVsZS5leHBvcnRzID0gZW9zXG5tb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IGZpbmlzaGVkXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX01JU1NJTkdfQVJHUywgRVJSX09VVF9PRl9SQU5HRSB9LFxuICBBYm9ydEVycm9yXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyB2YWxpZGF0ZUFib3J0U2lnbmFsLCB2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlT2JqZWN0IH0gPSByZXF1aXJlKCcuLi92YWxpZGF0b3JzJylcbmNvbnN0IGtXZWFrSGFuZGxlciA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKS5TeW1ib2woJ2tXZWFrJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlUHVzaCxcbiAgTWF0aEZsb29yLFxuICBOdW1iZXIsXG4gIE51bWJlcklzTmFOLFxuICBQcm9taXNlLFxuICBQcm9taXNlUmVqZWN0LFxuICBQcm9taXNlUHJvdG90eXBlVGhlbixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBrRW1wdHkgPSBTeW1ib2woJ2tFbXB0eScpXG5jb25zdCBrRW9mID0gU3ltYm9sKCdrRW9mJylcbmZ1bmN0aW9uIG1hcChmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGNvbmN1cnJlbmN5ID0gMVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5jb25jdXJyZW5jeSkgIT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbmN5ID0gTWF0aEZsb29yKG9wdGlvbnMuY29uY3VycmVuY3kpXG4gIH1cbiAgdmFsaWRhdGVJbnRlZ2VyKGNvbmN1cnJlbmN5LCAnY29uY3VycmVuY3knLCAxKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIG1hcCgpIHtcbiAgICB2YXIgX29wdGlvbnMkc2lnbmFsLCBfb3B0aW9ucyRzaWduYWwyXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG4gICAgY29uc3QgcXVldWUgPSBbXVxuICAgIGNvbnN0IHNpZ25hbCA9IGFjLnNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbE9wdCA9IHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgICBjb25zdCBhYm9ydCA9ICgpID0+IGFjLmFib3J0KClcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWwgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwuYWJvcnRlZFxuICAgICkge1xuICAgICAgYWJvcnQoKVxuICAgIH1cbiAgICBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogKF9vcHRpb25zJHNpZ25hbDIgPSBvcHRpb25zLnNpZ25hbCkgPT09IG51bGwgfHwgX29wdGlvbnMkc2lnbmFsMiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBfb3B0aW9ucyRzaWduYWwyLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgbGV0IG5leHRcbiAgICBsZXQgcmVzdW1lXG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuICAgIGZ1bmN0aW9uIG9uRG9uZSgpIHtcbiAgICAgIGRvbmUgPSB0cnVlXG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGxldCB2YWwgb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgdmFyIF92YWxcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsID0gZm4odmFsLCBzaWduYWxPcHQpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB2YWwgPSBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VtcHR5KSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mICgoX3ZhbCA9IHZhbCkgPT09IG51bGwgfHwgX3ZhbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3ZhbC5jYXRjaCkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbC5jYXRjaChvbkRvbmUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIG5leHQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZG9uZSAmJiBxdWV1ZS5sZW5ndGggJiYgcXVldWUubGVuZ3RoID49IGNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bWUgPSByZXNvbHZlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZS5wdXNoKGtFb2YpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgdmFsID0gUHJvbWlzZVJlamVjdChlcnIpXG4gICAgICAgIFByb21pc2VQcm90b3R5cGVUaGVuKHZhbCwgdW5kZWZpbmVkLCBvbkRvbmUpXG4gICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdmFyIF9vcHRpb25zJHNpZ25hbDNcbiAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0KClcbiAgICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IChfb3B0aW9ucyRzaWduYWwzID0gb3B0aW9ucy5zaWduYWwpID09PSBudWxsIHx8IF9vcHRpb25zJHNpZ25hbDMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb3B0aW9ucyRzaWduYWwzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpXG4gICAgICB9XG4gICAgfVxuICAgIHB1bXAoKVxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHF1ZXVlWzBdXG4gICAgICAgICAgaWYgKHZhbCA9PT0ga0VvZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsICE9PSBrRW1wdHkpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbFxuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICAgICAgcmVzdW1lKClcbiAgICAgICAgICAgIHJlc3VtZSA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBuZXh0ID0gcmVzb2x2ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICByZXN1bWUoKVxuICAgICAgICByZXN1bWUgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIGFzSW5kZXhlZFBhaXJzKG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogYXNJbmRleGVkUGFpcnMoKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw0XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChfb3B0aW9ucyRzaWduYWw0ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw0LmFib3J0ZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcih7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgeWllbGQgW2luZGV4KyssIHZhbF1cbiAgICB9XG4gIH0uY2FsbCh0aGlzKVxufVxuYXN5bmMgZnVuY3Rpb24gc29tZShmbiwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBmaWx0ZXIuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuYXN5bmMgZnVuY3Rpb24gZXZlcnkoZm4sIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVfTW9yZ2FuJTI3c19sYXdzXG4gIHJldHVybiAhKGF3YWl0IHNvbWUuY2FsbChcbiAgICB0aGlzLFxuICAgIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICByZXR1cm4gIShhd2FpdCBmbiguLi5hcmdzKSlcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKSlcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmQoZm4sIG9wdGlvbnMpIHtcbiAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgZmlsdGVyLmNhbGwodGhpcywgZm4sIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cbmFzeW5jIGZ1bmN0aW9uIGZvckVhY2goZm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZm9yRWFjaEZuKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgYXdhaXQgZm4odmFsdWUsIG9wdGlvbnMpXG4gICAgcmV0dXJuIGtFbXB0eVxuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBmb3IgYXdhaXQgKGNvbnN0IHVudXNlZCBvZiBtYXAuY2FsbCh0aGlzLCBmb3JFYWNoRm4sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIGZpbHRlcihmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBmaWx0ZXJGbih2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmIChhd2FpdCBmbih2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4ga0VtcHR5XG4gIH1cbiAgcmV0dXJuIG1hcC5jYWxsKHRoaXMsIGZpbHRlckZuLCBvcHRpb25zKVxufVxuXG4vLyBTcGVjaWZpYyB0byBwcm92aWRlIGJldHRlciBlcnJvciB0byByZWR1Y2Ugc2luY2UgdGhlIGFyZ3VtZW50IGlzIG9ubHlcbi8vIG1pc3NpbmcgaWYgdGhlIHN0cmVhbSBoYXMgbm8gaXRlbXMgaW4gaXQgLSBidXQgdGhlIGNvZGUgaXMgc3RpbGwgYXBwcm9wcmlhdGVcbmNsYXNzIFJlZHVjZUF3YXJlRXJyTWlzc2luZ0FyZ3MgZXh0ZW5kcyBFUlJfTUlTU0lOR19BUkdTIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3JlZHVjZScpXG4gICAgdGhpcy5tZXNzYWdlID0gJ1JlZHVjZSBvZiBhbiBlbXB0eSBzdHJlYW0gcmVxdWlyZXMgYW4gaW5pdGlhbCB2YWx1ZSdcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcmVkdWNlKHJlZHVjZXIsIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkc2lnbmFsNVxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3JlZHVjZXInLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgcmVkdWNlcilcbiAgfVxuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbGV0IGhhc0luaXRpYWxWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gIGlmIChcbiAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgKF9vcHRpb25zJHNpZ25hbDUgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1ICE9PSB1bmRlZmluZWQgJiZcbiAgICBfb3B0aW9ucyRzaWduYWw1LmFib3J0ZWRcbiAgKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgfSlcbiAgICB0aGlzLm9uY2UoJ2Vycm9yJywgKCkgPT4ge30pIC8vIFRoZSBlcnJvciBpcyBhbHJlYWR5IHByb3BhZ2F0ZWRcbiAgICBhd2FpdCBmaW5pc2hlZCh0aGlzLmRlc3Ryb3koZXJyKSlcbiAgICB0aHJvdyBlcnJcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2lnbmFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBba1dlYWtIYW5kbGVyXTogdGhpc1xuICAgIH1cbiAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KCksIG9wdHMpXG4gIH1cbiAgbGV0IGdvdEFueUl0ZW1Gcm9tU3RyZWFtID0gZmFsc2VcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw2XG4gICAgICBnb3RBbnlJdGVtRnJvbVN0cmVhbSA9IHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbDYgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsNiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDYuYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKClcbiAgICAgIH1cbiAgICAgIGlmICghaGFzSW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IHZhbHVlXG4gICAgICAgIGhhc0luaXRpYWxWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IGF3YWl0IHJlZHVjZXIoaW5pdGlhbFZhbHVlLCB2YWx1ZSwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWdvdEFueUl0ZW1Gcm9tU3RyZWFtICYmICFoYXNJbml0aWFsVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBSZWR1Y2VBd2FyZUVyck1pc3NpbmdBcmdzKClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYWMuYWJvcnQoKVxuICB9XG4gIHJldHVybiBpbml0aWFsVmFsdWVcbn1cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXkob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdGhpcykge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWw3XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoX29wdGlvbnMkc2lnbmFsNyA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw3LmFib3J0ZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIH1cbiAgICBBcnJheVByb3RvdHlwZVB1c2gocmVzdWx0LCB2YWwpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuZnVuY3Rpb24gZmxhdE1hcChmbiwgb3B0aW9ucykge1xuICBjb25zdCB2YWx1ZXMgPSBtYXAuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucylcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiBmbGF0TWFwKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgICAgeWllbGQqIHZhbFxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5mdW5jdGlvbiB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcikge1xuICAvLyBXZSBjb2VyY2UgaGVyZSB0byBhbGlnbiB3aXRoIHRoZSBzcGVjXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMvaXNzdWVzLzE2OVxuICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKVxuICBpZiAoTnVtYmVySXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKG51bWJlciA8IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRSgnbnVtYmVyJywgJz49IDAnLCBudW1iZXIpXG4gIH1cbiAgcmV0dXJuIG51bWJlclxufVxuZnVuY3Rpb24gZHJvcChudW1iZXIsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIG51bWJlciA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGRyb3AoKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDhcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw4ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDguYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsOVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsOSA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsOS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tIDw9IDApIHtcbiAgICAgICAgeWllbGQgdmFsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIHRha2UobnVtYmVyLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KG51bWJlcilcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiB0YWtlKCkge1xuICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMFxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKF9vcHRpb25zJHNpZ25hbDEwID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWwxMC5hYm9ydGVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWwxMVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsMTEgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsMTEgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwxMS5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tID4gMCkge1xuICAgICAgICB5aWVsZCB2YWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMgPSB7XG4gIGFzSW5kZXhlZFBhaXJzLFxuICBkcm9wLFxuICBmaWx0ZXIsXG4gIGZsYXRNYXAsXG4gIG1hcCxcbiAgdGFrZVxufVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZVJldHVybmluZ09wZXJhdG9ycyA9IHtcbiAgZXZlcnksXG4gIGZvckVhY2gsXG4gIHJlZHVjZSxcbiAgdG9BcnJheSxcbiAgc29tZSxcbiAgZmluZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG5jb25zdCB7XG4gIGFnZ3JlZ2F0ZVR3b0Vycm9ycyxcbiAgY29kZXM6IHsgRVJSX01VTFRJUExFX0NBTExCQUNLIH0sXG4gIEFib3J0RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGtEZXN0cm95ZWQsIGlzRGVzdHJveWVkLCBpc0ZpbmlzaGVkLCBpc1NlcnZlclJlcXVlc3QgfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3Qga0Rlc3Ryb3kgPSBTeW1ib2woJ2tEZXN0cm95JylcbmNvbnN0IGtDb25zdHJ1Y3QgPSBTeW1ib2woJ2tDb25zdHJ1Y3QnKVxuZnVuY3Rpb24gY2hlY2tFcnJvcihlcnIsIHcsIHIpIHtcbiAgaWYgKGVycikge1xuICAgIC8vIEF2b2lkIFY4IGxlYWssIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0MTAzI2lzc3VlY29tbWVudC02NTIwMDIzNjRcbiAgICBlcnIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICh3ICYmICF3LmVycm9yZWQpIHtcbiAgICAgIHcuZXJyb3JlZCA9IGVyclxuICAgIH1cbiAgICBpZiAociAmJiAhci5lcnJvcmVkKSB7XG4gICAgICByLmVycm9yZWQgPSBlcnJcbiAgICB9XG4gIH1cbn1cblxuLy8gQmFja3dhcmRzIGNvbXBhdC4gY2IoKSBpcyB1bmRvY3VtZW50ZWQgYW5kIHVudXNlZCBpbiBjb3JlIGJ1dFxuLy8gdW5mb3J0dW5hdGVseSBtaWdodCBiZSB1c2VkIGJ5IG1vZHVsZXMuXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgLy8gV2l0aCBkdXBsZXggc3RyZWFtcyB3ZSB1c2UgdGhlIHdyaXRhYmxlIHNpZGUgZm9yIHN0YXRlLlxuICBjb25zdCBzID0gdyB8fCByXG4gIGlmICgodyAmJiB3LmRlc3Ryb3llZCkgfHwgKHIgJiYgci5kZXN0cm95ZWQpKSB7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gV2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuICBjaGVja0Vycm9yKGVyciwgdywgcilcbiAgaWYgKHcpIHtcbiAgICB3LmRlc3Ryb3llZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZGVzdHJveWVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gSWYgc3RpbGwgY29uc3RydWN0aW5nIHRoZW4gZGVmZXIgY2FsbGluZyBfZGVzdHJveS5cbiAgaWYgKCFzLmNvbnN0cnVjdGVkKSB7XG4gICAgdGhpcy5vbmNlKGtEZXN0cm95LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIF9kZXN0cm95KHRoaXMsIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlciwgZXJyKSwgY2IpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBfZGVzdHJveSh0aGlzLCBlcnIsIGNiKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBfZGVzdHJveShzZWxmLCBlcnIsIGNiKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gICAgY2hlY2tFcnJvcihlcnIsIHcsIHIpXG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiKGVycilcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZU5ULCBzZWxmLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHNlbGYpXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fZGVzdHJveShlcnIgfHwgbnVsbCwgb25EZXN0cm95KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkRlc3Ryb3koZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpXG4gIGVtaXRDbG9zZU5UKHNlbGYpXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGNvbnN0IHIgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gIGlmICh3KSB7XG4gICAgdy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgaWYgKHIpIHtcbiAgICByLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAoKHcgJiYgdy5lbWl0Q2xvc2UpIHx8IChyICYmIHIuZW1pdENsb3NlKSkge1xuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgY29uc3QgciA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHNlbGYuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZXJyb3JFbWl0dGVkKSB8fCAociAmJiByLmVycm9yRW1pdHRlZCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodykge1xuICAgIHcuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICB9XG4gIGlmIChyKSB7XG4gICAgci5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcbn1cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgY29uc3QgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHIpIHtcbiAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIHIuY2xvc2VkID0gZmFsc2VcbiAgICByLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG4gICAgci5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHIuZXJyb3JlZCA9IG51bGxcbiAgICByLmVycm9yRW1pdHRlZCA9IGZhbHNlXG4gICAgci5yZWFkaW5nID0gZmFsc2VcbiAgICByLmVuZGVkID0gci5yZWFkYWJsZSA9PT0gZmFsc2VcbiAgICByLmVuZEVtaXR0ZWQgPSByLnJlYWRhYmxlID09PSBmYWxzZVxuICB9XG4gIGlmICh3KSB7XG4gICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB3LmRlc3Ryb3llZCA9IGZhbHNlXG4gICAgdy5jbG9zZWQgPSBmYWxzZVxuICAgIHcuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgICB3LmVycm9yZWQgPSBudWxsXG4gICAgdy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuICAgIHcuZmluYWxDYWxsZWQgPSBmYWxzZVxuICAgIHcucHJlZmluaXNoZWQgPSBmYWxzZVxuICAgIHcuZW5kZWQgPSB3LndyaXRhYmxlID09PSBmYWxzZVxuICAgIHcuZW5kaW5nID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICB3LmZpbmlzaGVkID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHN5bmMpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cblxuICBjb25zdCByID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKCh3ICYmIHcuZGVzdHJveWVkKSB8fCAociAmJiByLmRlc3Ryb3llZCkpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIGlmICgociAmJiByLmF1dG9EZXN0cm95KSB8fCAodyAmJiB3LmF1dG9EZXN0cm95KSkgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBlbHNlIGlmIChlcnIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXJyLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cbiAgICBpZiAodyAmJiAhdy5lcnJvcmVkKSB7XG4gICAgICB3LmVycm9yZWQgPSBlcnJcbiAgICB9XG4gICAgaWYgKHIgJiYgIXIuZXJyb3JlZCkge1xuICAgICAgci5lcnJvcmVkID0gZXJyXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCBzdHJlYW0sIGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdEVycm9yTlQoc3RyZWFtLCBlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3Qoc3RyZWFtLCBjYikge1xuICBpZiAodHlwZW9mIHN0cmVhbS5fY29uc3RydWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgciA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmIChyKSB7XG4gICAgci5jb25zdHJ1Y3RlZCA9IGZhbHNlXG4gIH1cbiAgaWYgKHcpIHtcbiAgICB3LmNvbnN0cnVjdGVkID0gZmFsc2VcbiAgfVxuICBzdHJlYW0ub25jZShrQ29uc3RydWN0LCBjYilcbiAgaWYgKHN0cmVhbS5saXN0ZW5lckNvdW50KGtDb25zdHJ1Y3QpID4gMSkge1xuICAgIC8vIER1cGxleFxuICAgIHJldHVyblxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soY29uc3RydWN0TlQsIHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdE5UKHN0cmVhbSkge1xuICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgZnVuY3Rpb24gb25Db25zdHJ1Y3QoZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIgIT09IG51bGwgJiYgZXJyICE9PSB1bmRlZmluZWQgPyBlcnIgOiBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIGNvbnN0IHIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gICAgY29uc3QgcyA9IHcgfHwgclxuICAgIGlmIChyKSB7XG4gICAgICByLmNvbnN0cnVjdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodykge1xuICAgICAgdy5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKHMuZGVzdHJveWVkKSB7XG4gICAgICBzdHJlYW0uZW1pdChrRGVzdHJveSwgZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q29uc3RydWN0TlQsIHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBzdHJlYW0uX2NvbnN0cnVjdChvbkNvbnN0cnVjdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25Db25zdHJ1Y3QoZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0Q29uc3RydWN0TlQoc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KGtDb25zdHJ1Y3QpXG59XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gJiYgc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VMZWdhY3koc3RyZWFtKSB7XG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZUxlZ2FjeShzdHJlYW0sIGVycikge1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG59XG5cbi8vIE5vcm1hbGl6ZSBkZXN0cm95IGZvciBsZWdhY3kuXG5mdW5jdGlvbiBkZXN0cm95ZXIoc3RyZWFtLCBlcnIpIHtcbiAgaWYgKCFzdHJlYW0gfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICghZXJyICYmICFpc0ZpbmlzaGVkKHN0cmVhbSkpIHtcbiAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gIH1cblxuICAvLyBUT0RPOiBSZW1vdmUgaXNSZXF1ZXN0IGJyYW5jaGVzLlxuICBpZiAoaXNTZXJ2ZXJSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAoaXNSZXF1ZXN0KHN0cmVhbS5yZXEpKSB7XG4gICAgc3RyZWFtLnJlcS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUT0RPOiBEb24ndCBsb3NlIGVycj9cbiAgICBzdHJlYW0uY2xvc2UoKVxuICB9IGVsc2UgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQ2xvc2VMZWdhY3ksIHN0cmVhbSwgZXJyKVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTGVnYWN5LCBzdHJlYW0pXG4gIH1cbiAgaWYgKCFzdHJlYW0uZGVzdHJveWVkKSB7XG4gICAgc3RyZWFtW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29uc3RydWN0LFxuICBkZXN0cm95ZXIsXG4gIGRlc3Ryb3ksXG4gIHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3lcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFycmF5SXNBcnJheSwgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuZnVuY3Rpb24gU3RyZWFtKG9wdHMpIHtcbiAgRUUuY2FsbCh0aGlzLCBvcHRzKVxufVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLnByb3RvdHlwZSwgRUUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLCBFRSlcblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHRoaXNcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUgJiYgZGVzdC53cml0ZShjaHVuaykgPT09IGZhbHNlICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgc291cmNlLnBhdXNlKClcbiAgICB9XG4gIH1cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKVxuICB9XG4gIGxldCBkaWRPbkVuZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuXG4gICAgZGlkT25FbmQgPSB0cnVlXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm5cbiAgICBkaWRPbkVuZCA9IHRydWVcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KClcbiAgfVxuXG4gIC8vIERvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgfVxuICB9XG4gIHByZXBlbmRMaXN0ZW5lcihzb3VyY2UsICdlcnJvcicsIG9uZXJyb3IpXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cClcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKVxuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0XG59XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKVxuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pXG4gIGVsc2UgaWYgKEFycmF5SXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKVxuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3RyZWFtLFxuICBwcmVwZW5kTGlzdGVuZXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFib3J0RXJyb3IsIGNvZGVzIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSB9ID0gY29kZXNcblxuLy8gVGhpcyBtZXRob2QgaXMgaW5saW5lZCBoZXJlIGZvciByZWFkYWJsZS1zdHJlYW1cbi8vIEl0IGFsc28gZG9lcyBub3QgYWxsb3cgZm9yIHNpZ25hbCB0byBub3QgZXhpc3Qgb24gdGhlIHN0cmVhbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzYwNjEjZGlzY3Vzc2lvbl9yNTMzNzE4MDI5XG5jb25zdCB2YWxpZGF0ZUFib3J0U2lnbmFsID0gKHNpZ25hbCwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnQWJvcnRTaWduYWwnLCBzaWduYWwpXG4gIH1cbn1cbmZ1bmN0aW9uIGlzTm9kZVN0cmVhbShvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicpXG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IGZ1bmN0aW9uIGFkZEFib3J0U2lnbmFsKHNpZ25hbCwgc3RyZWFtKSB7XG4gIHZhbGlkYXRlQWJvcnRTaWduYWwoc2lnbmFsLCAnc2lnbmFsJylcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgJ3N0cmVhbS5TdHJlYW0nLCBzdHJlYW0pXG4gIH1cbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZShzaWduYWwsIHN0cmVhbSlcbn1cbm1vZHVsZS5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZSA9IGZ1bmN0aW9uIChzaWduYWwsIHN0cmVhbSkge1xuICBpZiAodHlwZW9mIHNpZ25hbCAhPT0gJ29iamVjdCcgfHwgISgnYWJvcnRlZCcgaW4gc2lnbmFsKSkge1xuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgIHN0cmVhbS5kZXN0cm95KFxuICAgICAgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBzaWduYWwucmVhc29uXG4gICAgICB9KVxuICAgIClcbiAgfVxuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBvbkFib3J0KClcbiAgfSBlbHNlIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KVxuICAgIGVvcyhzdHJlYW0sICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpKVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFN0cmluZ1Byb3RvdHlwZVNsaWNlLCBTeW1ib2xJdGVyYXRvciwgVHlwZWRBcnJheVByb3RvdHlwZVNldCwgVWludDhBcnJheSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaW5zcGVjdCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQnVmZmVyTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IG51bGxcbiAgICB0aGlzLnRhaWwgPSBudWxsXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cbiAgcHVzaCh2KSB7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhOiB2LFxuICAgICAgbmV4dDogbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeVxuICAgIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgKyt0aGlzLmxlbmd0aFxuICB9XG4gIHVuc2hpZnQodikge1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZGF0YTogdixcbiAgICAgIG5leHQ6IHRoaXMuaGVhZFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgdGhpcy5oZWFkID0gZW50cnlcbiAgICArK3RoaXMubGVuZ3RoXG4gIH1cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCByZXQgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgICAtLXRoaXMubGVuZ3RoXG4gICAgcmV0dXJuIHJldFxuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IHJldCA9ICcnICsgcC5kYXRhXG4gICAgd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbCkgcmV0ICs9IHMgKyBwLmRhdGFcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgICBjb25zdCByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMClcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChwKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgcC5kYXRhLCBpKVxuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoXG4gICAgICBwID0gcC5uZXh0XG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIGNvbnN1bWUobiwgaGFzU3RyaW5ncykge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmIChuIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICBjb25zdCBzbGljZSA9IGRhdGEuc2xpY2UoMCwgbilcbiAgICAgIHRoaXMuaGVhZC5kYXRhID0gZGF0YS5zbGljZShuKVxuICAgICAgcmV0dXJuIHNsaWNlXG4gICAgfVxuICAgIGlmIChuID09PSBkYXRhLmxlbmd0aCkge1xuICAgICAgLy8gRmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQoKVxuICAgIH1cbiAgICAvLyBSZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXIuXG4gICAgcmV0dXJuIGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobilcbiAgfVxuICBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGFcbiAgfVxuICAqW1N5bWJvbEl0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5oZWFkOyBwOyBwID0gcC5uZXh0KSB7XG4gICAgICB5aWVsZCBwLmRhdGFcbiAgICB9XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICBfZ2V0U3RyaW5nKG4pIHtcbiAgICBsZXQgcmV0ID0gJydcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ciA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgbiAtPSBzdHIubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgICArK2NcbiAgICAgICAgICBpZiAocC5uZXh0KSB0aGlzLmhlYWQgPSBwLm5leHRcbiAgICAgICAgICBlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgKz0gU3RyaW5nUHJvdG90eXBlU2xpY2Uoc3RyLCAwLCBuKVxuICAgICAgICAgIHRoaXMuaGVhZCA9IHBcbiAgICAgICAgICBwLmRhdGEgPSBTdHJpbmdQcm90b3R5cGVTbGljZShzdHIsIG4pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgICsrY1xuICAgIH0gd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbClcbiAgICB0aGlzLmxlbmd0aCAtPSBjXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIF9nZXRCdWZmZXIobikge1xuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGNvbnN0IHJldExlbiA9IG5cbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBidWYubGVuZ3RoKSB7XG4gICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBidWYsIHJldExlbiAtIG4pXG4gICAgICAgIG4gLT0gYnVmLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgYnVmLCByZXRMZW4gLSBuKVxuICAgICAgICAgICsrY1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dFxuICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIHJldExlbiAtIG4pXG4gICAgICAgICAgdGhpcy5oZWFkID0gcFxuICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICArK2NcbiAgICB9IHdoaWxlICgocCA9IHAubmV4dCkgIT09IG51bGwpXG4gICAgdGhpcy5sZW5ndGggLT0gY1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGUgbGlua2VkIGxpc3Qgb25seSBzaG93cyB0aGUgbWluaW1hbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24uXG4gIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXShfLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3QodGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICBkZXB0aDogMCxcbiAgICAgIC8vIEl0IHNob3VsZCBub3QgcmVjdXJzZS5cbiAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgfSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgTWF0aEZsb29yLCBOdW1iZXJJc0ludGVnZXIgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHtcbiAgcmV0dXJuIG9wdGlvbnMuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIDogaXNEdXBsZXggPyBvcHRpb25zW2R1cGxleEtleV0gOiBudWxsXG59XG5mdW5jdGlvbiBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayhvYmplY3RNb2RlKSB7XG4gIHJldHVybiBvYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjRcbn1cbmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsIG9wdGlvbnMsIGR1cGxleEtleSwgaXNEdXBsZXgpIHtcbiAgY29uc3QgaHdtID0gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSlcbiAgaWYgKGh3bSAhPSBudWxsKSB7XG4gICAgaWYgKCFOdW1iZXJJc0ludGVnZXIoaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICBjb25zdCBuYW1lID0gaXNEdXBsZXggPyBgb3B0aW9ucy4ke2R1cGxleEtleX1gIDogJ29wdGlvbnMuaGlnaFdhdGVyTWFyaydcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUobmFtZSwgaHdtKVxuICAgIH1cbiAgICByZXR1cm4gTWF0aEZsb29yKGh3bSlcbiAgfVxuXG4gIC8vIERlZmF1bHQgdmFsdWVcbiAgcmV0dXJuIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKHN0YXRlLm9iamVjdE1vZGUpXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0SGlnaFdhdGVyTWFyayxcbiAgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cblxuY29uc3QgeyBQcm9taXNlUHJvdG90eXBlVGhlbiwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sSXRlcmF0b3IgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfU1RSRUFNX05VTExfVkFMVUVTIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5mdW5jdGlvbiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cykge1xuICBsZXQgaXRlcmF0b3JcbiAgaWYgKHR5cGVvZiBpdGVyYWJsZSA9PT0gJ3N0cmluZycgfHwgaXRlcmFibGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKGl0ZXJhYmxlKVxuICAgICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGxldCBpc0FzeW5jXG4gIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSkge1xuICAgIGlzQXN5bmMgPSB0cnVlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xBc3luY0l0ZXJhdG9yXSgpXG4gIH0gZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sSXRlcmF0b3JdKSB7XG4gICAgaXNBc3luYyA9IGZhbHNlXG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2xJdGVyYXRvcl0oKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnaXRlcmFibGUnLCBbJ0l0ZXJhYmxlJ10sIGl0ZXJhYmxlKVxuICB9XG4gIGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgIGhpZ2hXYXRlck1hcms6IDEsXG4gICAgLy8gVE9ETyhyb25hZyk6IFdoYXQgb3B0aW9ucyBzaG91bGQgYmUgYWxsb3dlZD9cbiAgICAuLi5vcHRzXG4gIH0pXG5cbiAgLy8gRmxhZyB0byBwcm90ZWN0IGFnYWluc3QgX3JlYWRcbiAgLy8gYmVpbmcgY2FsbGVkIGJlZm9yZSBsYXN0IGl0ZXJhdGlvbiBjb21wbGV0aW9uLlxuICBsZXQgcmVhZGluZyA9IGZhbHNlXG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgIG5leHQoKVxuICAgIH1cbiAgfVxuICByZWFkYWJsZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnJvciwgY2IpIHtcbiAgICBQcm9taXNlUHJvdG90eXBlVGhlbihcbiAgICAgIGNsb3NlKGVycm9yKSxcbiAgICAgICgpID0+IHByb2Nlc3MubmV4dFRpY2soY2IsIGVycm9yKSxcbiAgICAgIC8vIG5leHRUaWNrIGlzIGhlcmUgaW4gY2FzZSBjYiB0aHJvd3NcbiAgICAgIChlKSA9PiBwcm9jZXNzLm5leHRUaWNrKGNiLCBlIHx8IGVycm9yKVxuICAgIClcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjbG9zZShlcnJvcikge1xuICAgIGNvbnN0IGhhZEVycm9yID0gZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBlcnJvciAhPT0gbnVsbFxuICAgIGNvbnN0IGhhc1Rocm93ID0gdHlwZW9mIGl0ZXJhdG9yLnRocm93ID09PSAnZnVuY3Rpb24nXG4gICAgaWYgKGhhZEVycm9yICYmIGhhc1Rocm93KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnJvcilcbiAgICAgIGF3YWl0IHZhbHVlXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICBhd2FpdCB2YWx1ZVxuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlzQXN5bmMgPyBhd2FpdCBpdGVyYXRvci5uZXh0KCkgOiBpdGVyYXRvci5uZXh0KClcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICByZWFkYWJsZS5wdXNoKG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicgPyBhd2FpdCB2YWx1ZSA6IHZhbHVlXG4gICAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gICAgICAgICAgfSBlbHNlIGlmIChyZWFkYWJsZS5wdXNoKHJlcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlYWRhYmxlLmRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlYWRhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb21cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZUluZGV4T2YsXG4gIE51bWJlcklzSW50ZWdlcixcbiAgTnVtYmVySXNOYU4sXG4gIE51bWJlclBhcnNlSW50LFxuICBPYmplY3REZWZpbmVQcm9wZXJ0aWVzLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZixcbiAgUHJvbWlzZSxcbiAgU2FmZVNldCxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgeyBTdHJlYW0sIHByZXBlbmRMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9sZWdhY3knKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGFkZEFib3J0U2lnbmFsIH0gPSByZXF1aXJlKCcuL2FkZC1hYm9ydC1zaWduYWwnKVxuY29uc3QgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbmxldCBkZWJ1ZyA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmRlYnVnbG9nKCdzdHJlYW0nLCAoZm4pID0+IHtcbiAgZGVidWcgPSBmblxufSlcbmNvbnN0IEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2J1ZmZlcl9saXN0JylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gICAgRVJSX09VVF9PRl9SQU5HRSxcbiAgICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFxuICAgIEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlRcbiAgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3Qga1BhdXNlZCA9IFN5bWJvbCgna1BhdXNlZCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IGZyb20gPSByZXF1aXJlKCcuL2Zyb20nKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUucHJvdG90eXBlLCBTdHJlYW0ucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUsIFN0cmVhbSlcbmNvbnN0IG5vcCA9ICgpID0+IHt9XG5jb25zdCB7IGVycm9yT3JEZXN0cm95IH0gPSBkZXN0cm95SW1wbFxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheS5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KCkuXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5waXBlcyA9IFtdXG4gIHRoaXMuZmxvd2luZyA9IG51bGxcbiAgdGhpcy5lbmRlZCA9IGZhbHNlXG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlXG4gIHRoaXMucmVhZGluZyA9IGZhbHNlXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBXaGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZVxuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZVxuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlXG4gIHRoaXNba1BhdXNlZF0gPSBudWxsXG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW4uXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2VcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZVxuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKS5cbiAgdGhpcy5hdXRvRGVzdHJveSA9ICFvcHRpb25zIHx8IG9wdGlvbnMuYXV0b0Rlc3Ryb3kgIT09IGZhbHNlXG5cbiAgLy8gSGFzIGl0IGJlZW4gZGVzdHJveWVkLlxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXJyb3JlZC4gV2hlbiB0cnVlIG5vIGZ1cnRoZXJcbiAgLy8gX3JlYWQgY2FsbHMsICdkYXRhJyBvciAncmVhZGFibGUnIGV2ZW50cyBzaG91bGQgb2NjdXIuIFRoaXMgaXMgbmVlZGVkXG4gIC8vIHNpbmNlIHdoZW4gYXV0b0Rlc3Ryb3kgaXMgZGlzYWJsZWQgd2UgbmVlZCBhIHdheSB0byB0ZWxsIHdoZXRoZXIgdGhlXG4gIC8vIHN0cmVhbSBoYXMgZmFpbGVkLlxuICB0aGlzLmVycm9yZWQgPSBudWxsXG5cbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZGVzdHJveWluZy5cbiAgdGhpcy5jbG9zZWQgPSBmYWxzZVxuXG4gIC8vIFRydWUgaWYgY2xvc2UgaGFzIGJlZW4gZW1pdHRlZCBvciB3b3VsZCBoYXZlIGJlZW4gZW1pdHRlZFxuICAvLyBkZXBlbmRpbmcgb24gZW1pdENsb3NlLlxuICB0aGlzLmNsb3NlRW1pdHRlZCA9IGZhbHNlXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gUmVmIHRoZSBwaXBlZCBkZXN0IHdoaWNoIHdlIG5lZWQgYSBkcmFpbiBldmVudCBvbiBpdFxuICAvLyB0eXBlOiBudWxsIHwgV3JpdGFibGUgfCBTZXQ8V3JpdGFibGU+LlxuICB0aGlzLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICB0aGlzLm11bHRpQXdhaXREcmFpbiA9IGZhbHNlXG5cbiAgLy8gSWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZC5cbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlXG4gIHRoaXMuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuICB0aGlzLmRlY29kZXIgPSBudWxsXG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKVxuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nXG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKVxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFJlYWRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41LlxuICBjb25zdCBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzLCBpc0R1cGxleClcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWlzRHVwbGV4KSBhZGRBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgdGhpcylcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzLCBvcHRpb25zKVxuICBkZXN0cm95SW1wbC5jb25zdHJ1Y3QodGhpcywgKCkgPT4ge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSkge1xuICAgICAgbWF5YmVSZWFkTW9yZSh0aGlzLCB0aGlzLl9yZWFkYWJsZVN0YXRlKVxuICAgIH1cbiAgfSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3lcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycilcbn1cblJlYWRhYmxlLnByb3RvdHlwZVtFRS5jYXB0dXJlUmVqZWN0aW9uU3ltYm9sXSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy5kZXN0cm95KGVycilcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpXG59XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpLlxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgdHJ1ZSlcbn1cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuaylcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgbGV0IGVyclxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgICAgIGlmIChzdGF0ZS5lbmNvZGluZyAhPT0gZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQgJiYgc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgICAvLyBXaGVuIHVuc2hpZnRpbmcsIGlmIHN0YXRlLmVuY29kaW5nIGlzIHNldCwgd2UgaGF2ZSB0byBzYXZlXG4gICAgICAgICAgLy8gdGhlIHN0cmluZyBpbiB0aGUgQnVmZmVyTGlzdCB3aXRoIHRoZSBzdGF0ZSBlbmNvZGluZy5cbiAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZykudG9TdHJpbmcoc3RhdGUuZW5jb2RpbmcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgIT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdjaHVuaycsIFsnc3RyaW5nJywgJ0J1ZmZlcicsICdVaW50OEFycmF5J10sIGNodW5rKVxuICAgIH1cbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkpIHtcbiAgICBpZiAoYWRkVG9Gcm9udCkge1xuICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQoKSlcbiAgICAgIGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCB8fCBzdGF0ZS5lcnJvcmVkKSByZXR1cm4gZmFsc2VcbiAgICAgIGVsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRigpKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKVxuICAgICAgICBlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2VcbiAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpXG4gIH1cblxuICAvLyBXZSBjYW4gcHVzaCBtb3JlIGRhdGEgaWYgd2UgYXJlIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLlxuICAvLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZSBtb3JlIGJ5dGVzLlxuICAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLCBzdWNoIGFzIHRoZSByZXBsLlxuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMClcbn1cbmZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBhZGRUb0Zyb250KSB7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYyAmJiBzdHJlYW0ubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIC8vIFVzZSB0aGUgZ3VhcmQgdG8gYXZvaWQgY3JlYXRpbmcgYFNldCgpYCByZXBlYXRlZGx5XG4gICAgLy8gd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHBpcGVzLlxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspXG4gIH0gZWxzZSB7XG4gICAgLy8gVXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGhcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspXG4gICAgZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuaylcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKVxuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSlcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIHJldHVybiBzdGF0ZVtrUGF1c2VkXSA9PT0gdHJ1ZSB8fCBzdGF0ZS5mbG93aW5nID09PSBmYWxzZVxufVxuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlclxuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZ1xuICBjb25zdCBidWZmZXIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlclxuICAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuICBsZXQgY29udGVudCA9ICcnXG4gIGZvciAoY29uc3QgZGF0YSBvZiBidWZmZXIpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUoZGF0YSlcbiAgfVxuICBidWZmZXIuY2xlYXIoKVxuICBpZiAoY29udGVudCAhPT0gJycpIGJ1ZmZlci5wdXNoKGNvbnRlbnQpXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gY29udGVudC5sZW5ndGhcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDFHQi5cbmNvbnN0IE1BWF9IV00gPSAweDQwMDAwMDAwXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID4gTUFYX0hXTSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKCdzaXplJywgJzw9IDFHaUInLCBuKVxuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50cy5cbiAgICBuLS1cbiAgICBuIHw9IG4gPj4+IDFcbiAgICBuIHw9IG4gPj4+IDJcbiAgICBuIHw9IG4gPj4+IDRcbiAgICBuIHw9IG4gPj4+IDhcbiAgICBuIHw9IG4gPj4+IDE2XG4gICAgbisrXG4gIH1cbiAgcmV0dXJuIG5cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkpIHJldHVybiAwXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMVxuICBpZiAoTnVtYmVySXNOYU4obikpIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWUuXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmZpcnN0KCkubGVuZ3RoXG4gICAgcmV0dXJuIHN0YXRlLmxlbmd0aFxuICB9XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG5cbiAgcmV0dXJuIHN0YXRlLmVuZGVkID8gc3RhdGUubGVuZ3RoIDogMFxufVxuXG4vLyBZb3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pXG4gIC8vIFNhbWUgYXMgcGFyc2VJbnQodW5kZWZpbmVkLCAxMCksIGhvd2V2ZXIgVjggNy4zIHBlcmZvcm1hbmNlIHJlZ3Jlc3NlZFxuICAvLyBpbiB0aGlzIHNjZW5hcmlvLCBzbyB3ZSBhcmUgZG9pbmcgaXQgbWFudWFsbHkuXG4gIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICBuID0gTmFOXG4gIH0gZWxzZSBpZiAoIU51bWJlcklzSW50ZWdlcihuKSkge1xuICAgIG4gPSBOdW1iZXJQYXJzZUludChuLCAxMClcbiAgfVxuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgbk9yaWcgPSBuXG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuXG4gIC8vIElmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKFxuICAgIG4gPT09IDAgJiZcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAoKHN0YXRlLmhpZ2hXYXRlck1hcmsgIT09IDAgPyBzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayA6IHN0YXRlLmxlbmd0aCA+IDApIHx8IHN0YXRlLmVuZGVkKVxuICApIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKVxuICAgIGVsc2UgZW1pdFJlYWRhYmxlKHRoaXMpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSlcblxuICAvLyBJZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcylcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIGxldCBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGVcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpXG5cbiAgLy8gSWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZVxuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZClcbiAgfVxuXG4gIC8vIEhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LCBpZiB3ZSdyZSBjb25zdHJ1Y3Rpbmcgd2UgaGF2ZSB0byB3YWl0LFxuICAvLyBhbmQgaWYgd2UncmUgZGVzdHJveWVkIG9yIGVycm9yZWQsIHRoZW4gaXQncyBub3QgYWxsb3dlZCxcbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgZG9SZWFkID0gZmFsc2VcbiAgICBkZWJ1ZygncmVhZGluZywgZW5kZWQgb3IgY29uc3RydWN0aW5nJywgZG9SZWFkKVxuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJylcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgLy8gSWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlXG5cbiAgICAvLyBDYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIGVycilcbiAgICB9XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpXG4gIH1cbiAgbGV0IHJldFxuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKVxuICBlbHNlIHJldCA9IG51bGxcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgbiA9IDBcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gblxuICAgIGlmIChzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcylcbiAgfVxuICBpZiAocmV0ICE9PSBudWxsICYmICFzdGF0ZS5lcnJvckVtaXR0ZWQgJiYgIXN0YXRlLmNsb3NlRW1pdHRlZCkge1xuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ29uRW9mQ2h1bmsnKVxuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVyblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIGNvbnN0IGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKVxuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKVxuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZVxuICBpZiAoc3RhdGUuc3luYykge1xuICAgIC8vIElmIHdlIGFyZSBzeW5jLCB3YWl0IHVudGlsIG5leHQgdGljayB0byBlbWl0IHRoZSBkYXRhLlxuICAgIC8vIE90aGVyd2lzZSB3ZSByaXNrIGVtaXR0aW5nIGRhdGEgaW4gdGhlIGZsb3coKVxuICAgIC8vIHRoZSByZWFkYWJsZSBjb2RlIHRyaWdnZXJzIGR1cmluZyBhIHJlYWQoKSBjYWxsLlxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2VcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlXG4gICAgLy8gV2UgaGF2ZSB0byBlbWl0IHJlYWRhYmxlIG5vdyB0aGF0IHdlIGFyZSBFT0YuIE1vZHVsZXNcbiAgICAvLyBpbiB0aGUgZWNvc3lzdGVtIChlLmcuIGRpY2VyKSByZWx5IG9uIHRoaXMgZXZlbnQgYmVpbmcgc3luYy5cbiAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSlcbiAgfVxufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlXG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW1pdFJlYWRhYmxlXycsIHN0YXRlLmRlc3Ryb3llZCwgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZClcbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgIXN0YXRlLmVycm9yZWQgJiYgKHN0YXRlLmxlbmd0aCB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlXG4gIH1cblxuICAvLyBUaGUgc3RyZWFtIG5lZWRzIGFub3RoZXIgcmVhZGFibGUgZXZlbnQgaWY6XG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgZmxvdyhzdHJlYW0pXG59XG5cbi8vIEF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUgJiYgc3RhdGUuY29uc3RydWN0ZWQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIC8vIEF0dGVtcHQgdG8gcmVhZCBtb3JlIGRhdGEgaWYgd2Ugc2hvdWxkLlxuICAvL1xuICAvLyBUaGUgY29uZGl0aW9ucyBmb3IgcmVhZGluZyBtb3JlIGRhdGEgYXJlIChvbmUgb2YpOlxuICAvLyAtIE5vdCBlbm91Z2ggZGF0YSBidWZmZXJlZCAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykuIFRoZSBsb29wXG4gIC8vICAgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlciB3aXRoIGVub3VnaCBkYXRhIGlmIHN1Y2ggZGF0YVxuICAvLyAgIGlzIGF2YWlsYWJsZS4gSWYgaGlnaFdhdGVyTWFyayBpcyAwIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBmbG93aW5nIG1vZGVcbiAgLy8gICB3ZSBzaG91bGQgX25vdF8gYXR0ZW1wdCB0byBidWZmZXIgYW55IGV4dHJhIGRhdGEuIFdlJ2xsIGdldCBtb3JlIGRhdGFcbiAgLy8gICB3aGVuIHRoZSBzdHJlYW0gY29uc3VtZXIgY2FsbHMgcmVhZCgpIGluc3RlYWQuXG4gIC8vIC0gTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBhbmQgdGhlIHN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUuIEluIHRoaXMgbW9kZVxuICAvLyAgIHRoZSBsb29wIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyByZWFkKCkgaXMgY2FsbGVkLiBGYWlsaW5nIHRvXG4gIC8vICAgY2FsbCByZWFkIGhlcmUgd291bGQgYWJvcnQgdGhlIGZsb3cgYW5kIHRoZXJlJ3Mgbm8gb3RoZXIgbWVjaGFuaXNtIGZvclxuICAvLyAgIGNvbnRpbnVpbmcgdGhlIGZsb3cgaWYgdGhlIHN0cmVhbSBjb25zdW1lciBoYXMganVzdCBzdWJzY3JpYmVkIHRvIHRoZVxuICAvLyAgICdkYXRhJyBldmVudC5cbiAgLy9cbiAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGNvbmRpdGlvbnMgdG8ga2VlcCByZWFkaW5nIGRhdGEsIHRoZSBmb2xsb3dpbmdcbiAgLy8gY29uZGl0aW9ucyBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgcmVhZDpcbiAgLy8gLSBUaGUgc3RyZWFtIGhhcyBlbmRlZCAoc3RhdGUuZW5kZWQpLlxuICAvLyAtIFRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nICdyZWFkJyBvcGVyYXRpb24gKHN0YXRlLnJlYWRpbmcpLiBUaGlzIGlzIGFcbiAgLy8gICBjYXNlIHdoZXJlIHRoZSBzdHJlYW0gaGFzIGNhbGxlZCB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBfcmVhZCgpXG4gIC8vICAgbWV0aG9kLCBidXQgdGhleSBhcmUgcHJvY2Vzc2luZyB0aGUgY2FsbCBhc3luY2hyb25vdXNseSBhbmQgaGF2ZSBfbm90X1xuICAvLyAgIGNhbGxlZCBwdXNoKCkgd2l0aCBuZXcgZGF0YS4gSW4gdGhpcyBjYXNlIHdlIHNraXAgcGVyZm9ybWluZyBtb3JlXG4gIC8vICAgcmVhZCgpcy4gVGhlIGV4ZWN1dGlvbiBlbmRzIGluIHRoaXMgbWV0aG9kIGFnYWluIGFmdGVyIHRoZSBfcmVhZCgpIGVuZHNcbiAgLy8gICB1cCBjYWxsaW5nIHB1c2goKSB3aXRoIG1vcmUgZGF0YS5cbiAgd2hpbGUgKFxuICAgICFzdGF0ZS5yZWFkaW5nICYmXG4gICAgIXN0YXRlLmVuZGVkICYmXG4gICAgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSlcbiAgKSB7XG4gICAgY29uc3QgbGVuID0gc3RhdGUubGVuZ3RoXG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJylcbiAgICBzdHJlYW0ucmVhZCgwKVxuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIERpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVha1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2Vcbn1cblxuLy8gQWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ19yZWFkKCknKVxufVxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgY29uc3Qgc3JjID0gdGhpc1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICghc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBzdGF0ZS5tdWx0aUF3YWl0RHJhaW4gPSB0cnVlXG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG5ldyBTYWZlU2V0KHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID8gW3N0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzXSA6IFtdKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpXG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlcy5sZW5ndGgsIHBpcGVPcHRzKVxuICBjb25zdCBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnJcbiAgY29uc3QgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlXG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKVxuICBlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbilcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpXG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJylcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlXG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKVxuICAgIGRlc3QuZW5kKClcbiAgfVxuICBsZXQgb25kcmFpblxuICBsZXQgY2xlYW5lZFVwID0gZmFsc2VcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpXG4gICAgLy8gQ2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlbi5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKVxuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGNsZWFuZWRVcCA9IHRydWVcblxuICAgIC8vIElmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKG9uZHJhaW4gJiYgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpXG4gIH1cbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgIGlmICghY2xlYW5lZFVwKSB7XG4gICAgICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAxICYmIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0KSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCAwKVxuICAgICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IGRlc3RcbiAgICAgICAgc3RhdGUubXVsdGlBd2FpdERyYWluID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID4gMSAmJiBzdGF0ZS5waXBlcy5pbmNsdWRlcyhkZXN0KSkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuc2l6ZSlcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuYWRkKGRlc3QpXG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKVxuICAgIH1cbiAgICBpZiAoIW9uZHJhaW4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgICAgIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAgICAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgICAgIC8vIHRvbyBzbG93LlxuICAgICAgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYywgZGVzdClcbiAgICAgIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcbiAgICB9XG4gIH1cbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJylcbiAgICBjb25zdCByZXQgPSBkZXN0LndyaXRlKGNodW5rKVxuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KVxuICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIEhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpXG4gICAgdW5waXBlKClcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgaWYgKGRlc3QubGlzdGVuZXJDb3VudCgnZXJyb3InKSA9PT0gMCkge1xuICAgICAgY29uc3QgcyA9IGRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKHMgJiYgIXMuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIC8vIFVzZXIgaW5jb3JyZWN0bHkgZW1pdHRlZCAnZXJyb3InIGRpcmVjdGx5IG9uIHRoZSBzdHJlYW0uXG4gICAgICAgIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpXG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKVxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgICB1bnBpcGUoKVxuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJylcbiAgICBzcmMudW5waXBlKGRlc3QpXG4gIH1cblxuICAvLyBUZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0by5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKVxuXG4gIC8vIFN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblxuICBpZiAoZGVzdC53cml0YWJsZU5lZWREcmFpbiA9PT0gdHJ1ZSkge1xuICAgIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgICBwYXVzZSgpXG4gICAgfVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJylcbiAgICBzcmMucmVzdW1lKClcbiAgfVxuICByZXR1cm4gZGVzdFxufVxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjLCBkZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCkge1xuICAgIGNvbnN0IHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlXG5cbiAgICAvLyBgb25kcmFpbmAgd2lsbCBjYWxsIGRpcmVjdGx5LFxuICAgIC8vIGB0aGlzYCBtYXliZSBub3QgYSByZWZlcmVuY2UgdG8gZGVzdCxcbiAgICAvLyBzbyB3ZSB1c2UgdGhlIHJlYWwgZGVzdCBoZXJlLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9PT0gZGVzdCkge1xuICAgICAgZGVidWcoJ3BpcGVPbkRyYWluJywgMSlcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplKVxuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuZGVsZXRlKGRlc3QpXG4gICAgfVxuICAgIGlmICgoIXN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzIHx8IHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLnNpemUgPT09IDApICYmIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykpIHtcbiAgICAgIHNyYy5yZXN1bWUoKVxuICAgIH1cbiAgfVxufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH1cblxuICAvLyBJZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgY29uc3QgZGVzdHMgPSBzdGF0ZS5waXBlc1xuICAgIHN0YXRlLnBpcGVzID0gW11cbiAgICB0aGlzLnBhdXNlKClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3RzLmxlbmd0aDsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywge1xuICAgICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgY29uc3QgaW5kZXggPSBBcnJheVByb3RvdHlwZUluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpXG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSlcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5wYXVzZSgpXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gU2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmcuXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIGNvbnN0IHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFVwZGF0ZSByZWFkYWJsZUxpc3RlbmluZyBzbyB0aGF0IHJlc3VtZSgpIG1heSBiZSBhIG5vLW9wXG4gICAgLy8gYSBmZXcgbGluZXMgZG93bi4gVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScpLlxuICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuXG4gICAgLy8gVHJ5IHN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZC5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKClcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuICAgICAgZGVidWcoJ29uIHJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5yZWFkaW5nKVxuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcylcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub25cblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbilcbiAgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuUmVhZGFibGUucHJvdG90eXBlLm9mZiA9IFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lclxuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICBjb25zdCBzdGF0ZSA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzZWxmLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwXG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgc3RhdGVba1BhdXNlZF0gPT09IGZhbHNlKSB7XG4gICAgLy8gRmxvd2luZyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBub3csIG90aGVyd2lzZVxuICAgIC8vIHRoZSB1cGNvbWluZyByZXN1bWUgd2lsbCBub3QgZmxvdy5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZVxuXG4gICAgLy8gQ3J1ZGUgd2F5IHRvIGNoZWNrIGlmIHdlIHNob3VsZCByZXN1bWUuXG4gIH0gZWxzZSBpZiAoc2VsZi5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgc2VsZi5yZXN1bWUoKVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgIHN0YXRlLmZsb3dpbmcgPSBudWxsXG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJylcbiAgc2VsZi5yZWFkKDApXG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJylcbiAgICAvLyBXZSBmbG93IG9ubHkgaWYgdGhlcmUgaXMgbm8gb25lIGxpc3RlbmluZ1xuICAgIC8vIGZvciByZWFkYWJsZSwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gY2FsbFxuICAgIC8vIHJlc3VtZSgpLlxuICAgIHN0YXRlLmZsb3dpbmcgPSAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmdcbiAgICByZXN1bWUodGhpcywgc3RhdGUpXG4gIH1cbiAgc3RhdGVba1BhdXNlZF0gPSBmYWxzZVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpXG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIHN0cmVhbS5yZWFkKDApXG4gIH1cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2VcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gIGZsb3coc3RyZWFtKVxuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMClcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHtcbiAgICBkZWJ1ZygncGF1c2UnKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdwYXVzZScpXG4gIH1cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZVtrUGF1c2VkXSA9IHRydWVcbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZylcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCk7XG59XG5cbi8vIFdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBsZXQgcGF1c2VkID0gZmFsc2VcblxuICAvLyBUT0RPIChyb25hZyk6IFNob3VsZCB0aGlzLmRlc3Ryb3koZXJyKSBlbWl0XG4gIC8vICdlcnJvcicgb24gdGhlIHdyYXBwZWQgc3RyZWFtPyBXb3VsZCByZXF1aXJlXG4gIC8vIGEgc3RhdGljIGZhY3RvcnkgbWV0aG9kLCBlLmcuIFJlYWRhYmxlLndyYXAoc3RyZWFtKS5cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAoIXRoaXMucHVzaChjaHVuaykgJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgdGhpcy5wdXNoKG51bGwpXG4gIH0pXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgZXJyb3JPckRlc3Ryb3kodGhpcywgZXJyKVxuICB9KVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gIH0pXG4gIHN0cmVhbS5vbignZGVzdHJveScsICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICB9KVxuICB0aGlzLl9yZWFkID0gKCkgPT4ge1xuICAgIGlmIChwYXVzZWQgJiYgc3RyZWFtLnJlc3VtZSkge1xuICAgICAgcGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy4gSW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGNvbnN0IHN0cmVhbUtleXMgPSBPYmplY3RLZXlzKHN0cmVhbSlcbiAgZm9yIChsZXQgaiA9IDE7IGogPCBzdHJlYW1LZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgY29uc3QgaSA9IHN0cmVhbUtleXNbal1cbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBzdHJlYW1baV0uYmluZChzdHJlYW0pXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5SZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sQXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBzdHJlYW1Ub0FzeW5jSXRlcmF0b3IodGhpcylcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVRvQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zKVxufVxuZnVuY3Rpb24gc3RyZWFtVG9Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHN0cmVhbS5yZWFkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtID0gUmVhZGFibGUud3JhcChzdHJlYW0sIHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICB9KVxuICB9XG4gIGNvbnN0IGl0ZXIgPSBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucylcbiAgaXRlci5zdHJlYW0gPSBzdHJlYW1cbiAgcmV0dXJuIGl0ZXJcbn1cbmFzeW5jIGZ1bmN0aW9uKiBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBsZXQgY2FsbGJhY2sgPSBub3BcbiAgZnVuY3Rpb24gbmV4dChyZXNvbHZlKSB7XG4gICAgaWYgKHRoaXMgPT09IHN0cmVhbSkge1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgY2FsbGJhY2sgPSBub3BcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSByZXNvbHZlXG4gICAgfVxuICB9XG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBuZXh0KVxuICBsZXQgZXJyb3JcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBlcnJvciA9IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IG51bGxcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGNhbGxiYWNrID0gbm9wXG4gICAgfVxuICApXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gc3RyZWFtLmRlc3Ryb3llZCA/IG51bGwgOiBzdHJlYW0ucmVhZCgpXG4gICAgICBpZiAoY2h1bmsgIT09IG51bGwpIHtcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShuZXh0KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3IgPSBhZ2dyZWdhdGVUd29FcnJvcnMoZXJyb3IsIGVycilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIGlmIChcbiAgICAgIChlcnJvciB8fCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmRlc3Ryb3lPblJldHVybikgIT09IGZhbHNlKSAmJlxuICAgICAgKGVycm9yID09PSB1bmRlZmluZWQgfHwgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuICAgICkge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9mZigncmVhZGFibGUnLCBuZXh0KVxuICAgICAgY2xlYW51cCgpXG4gICAgfVxuICB9XG59XG5cbi8vIE1ha2luZyBpdCBleHBsaWNpdCB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgZW51bWVyYWJsZVxuLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4vLyB1c2VybGFuZCB3aWxsIGZhaWwuXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlLnByb3RvdHlwZSwge1xuICByZWFkYWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICAgICAgLy8gci5yZWFkYWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgcmVhZGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgcmVhZGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXIgJiYgci5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgIXIuZGVzdHJveWVkICYmICFyLmVycm9yRW1pdHRlZCAmJiAhci5lbmRFbWl0dGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9ICEhdmFsXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZWFkYWJsZURpZFJlYWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkXG4gICAgICApXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUhpZ2hXYXRlck1hcms6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUZsb3dpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlRW5jb2Rpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuICAgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkIDogZmFsc2VcbiAgICB9XG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RhdGUucHJvdG90eXBlLCB7XG4gIC8vIExlZ2FjeSBnZXR0ZXIgZm9yIGBwaXBlc0NvdW50YC5cbiAgcGlwZXNDb3VudDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5waXBlcy5sZW5ndGhcbiAgICB9XG4gIH0sXG4gIC8vIExlZ2FjeSBwcm9wZXJ0eSBmb3IgYHBhdXNlZGAuXG4gIHBhdXNlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1trUGF1c2VkXSAhPT0gZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgdGhpc1trUGF1c2VkXSA9ICEhdmFsdWVcbiAgICB9XG4gIH1cbn0pXG5cbi8vIEV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWQuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gIGxldCByZXRcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpXG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gUmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0LlxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJylcbiAgICBlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKVxuICAgIGVsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKClcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdC5cbiAgICByZXQgPSBzdGF0ZS5idWZmZXIuY29uc3VtZShuLCBzdGF0ZS5kZWNvZGVyKVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKVxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pXG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aClcblxuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5jbG9zZUVtaXR0ZWQgJiYgIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICBpZiAoc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRXcml0YWJsZU5ULCBzdHJlYW0pXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgICAgLy8gaWYgdGhlIHdyaXRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICAgIXdTdGF0ZSB8fFxuICAgICAgICAod1N0YXRlLmF1dG9EZXN0cm95ICYmXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSB3cml0YWJsZSB0byBldmVyICdmaW5pc2gnXG4gICAgICAgICAgLy8gaWYgd3JpdGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgKHdTdGF0ZS5maW5pc2hlZCB8fCB3U3RhdGUud3JpdGFibGUgPT09IGZhbHNlKSlcbiAgICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZU5UKHN0cmVhbSkge1xuICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS53cml0YWJsZSAmJiAhc3RyZWFtLndyaXRhYmxlRW5kZWQgJiYgIXN0cmVhbS5kZXN0cm95ZWRcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgc3RyZWFtLmVuZCgpXG4gIH1cbn1cblJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cblJlYWRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtUmVhZGFibGVGcm9tUmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5SZWFkYWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdSZWFkYWJsZVN0cmVhbUZyb21TdHJlYW1SZWFkYWJsZShzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucylcbn1cblJlYWRhYmxlLndyYXAgPSBmdW5jdGlvbiAoc3JjLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgb2JqZWN0TW9kZTpcbiAgICAgIChfcmVmID1cbiAgICAgICAgKF9zcmMkcmVhZGFibGVPYmplY3RNbyA9IHNyYy5yZWFkYWJsZU9iamVjdE1vZGUpICE9PSBudWxsICYmIF9zcmMkcmVhZGFibGVPYmplY3RNbyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgICAgICAgICA6IHNyYy5vYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmXG4gICAgICAgIDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRlc3Ryb3koZXJyLCBjYWxsYmFjaykge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHNyYywgZXJyKVxuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH1cbiAgfSkud3JhcChzcmMpXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3Qge1xuICBBcnJheVByb3RvdHlwZVNsaWNlLFxuICBFcnJvcixcbiAgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZSxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHksXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMsXG4gIE9iamVjdFNldFByb3RvdHlwZU9mLFxuICBTdHJpbmdQcm90b3R5cGVUb0xvd2VyQ2FzZSxcbiAgU3ltYm9sLFxuICBTeW1ib2xIYXNJbnN0YW5jZVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZVxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGVcbmNvbnN0IHsgRXZlbnRFbWl0dGVyOiBFRSB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUoJy4vbGVnYWN5JykuU3RyZWFtXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgYWRkQWJvcnRTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWRkLWFib3J0LXNpZ25hbCcpXG5jb25zdCB7IGdldEhpZ2hXYXRlck1hcmssIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbmNvbnN0IHtcbiAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFxuICBFUlJfTVVMVElQTEVfQ0FMTEJBQ0ssXG4gIEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVELFxuICBFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsXG4gIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElOR1xufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmNvbnN0IHsgZXJyb3JPckRlc3Ryb3kgfSA9IGRlc3Ryb3lJbXBsXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZS5wcm90b3R5cGUsIFN0cmVhbS5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihXcml0YWJsZSwgU3RyZWFtKVxuZnVuY3Rpb24gbm9wKCkge31cbmNvbnN0IGtPbkZpbmlzaGVkID0gU3ltYm9sKCdrT25GaW5pc2hlZCcpXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0sXG4gIC8vIGUuZy4gb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUgdnMuIG9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlLCBldGMuXG4gIGlmICh0eXBlb2YgaXNEdXBsZXggIT09ICdib29sZWFuJykgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiByZXF1aXJlKCcuL2R1cGxleCcpXG5cbiAgLy8gT2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9iamVjdE1vZGUpXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUpXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWQuXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZVxuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2VcbiAgLy8gQXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZVxuICAvLyBXaGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkLlxuICB0aGlzLmVuZGVkID0gZmFsc2VcbiAgLy8gV2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkLlxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBIYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgY29uc3Qgbm9EZWNvZGUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2UpXG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZVxuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpIHx8ICd1dGY4J1xuXG4gIC8vIE5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMFxuXG4gIC8vIEEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlXG5cbiAgLy8gV2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbC5cbiAgdGhpcy5jb3JrZWQgPSAwXG5cbiAgLy8gQSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWVcblxuICAvLyBBIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxuXG4gIC8vIFRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuaywgY2IpLlxuICB0aGlzLm9ud3JpdGUgPSBvbndyaXRlLmJpbmQodW5kZWZpbmVkLCBzdHJlYW0pXG5cbiAgLy8gVGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikuXG4gIHRoaXMud3JpdGVjYiA9IG51bGxcblxuICAvLyBUaGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwXG5cbiAgLy8gU3RvcmFnZSBmb3IgZGF0YSBwYXNzZWQgdG8gdGhlIGFmdGVyV3JpdGUoKSBjYWxsYmFjayBpbiBjYXNlIG9mXG4gIC8vIHN5bmNocm9ub3VzIF93cml0ZSgpIGNvbXBsZXRpb24uXG4gIHRoaXMuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXNldEJ1ZmZlcih0aGlzKVxuXG4gIC8vIE51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZC5cbiAgdGhpcy5wZW5kaW5nY2IgPSAwXG5cbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWVcblxuICAvLyBFbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zLlxuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2VcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2Fpbi5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlXG5cbiAgLy8gU2hvdWxkIC5kZXN0cm95KCkgYmUgY2FsbGVkIGFmdGVyICdmaW5pc2gnIChhbmQgcG90ZW50aWFsbHkgJ2VuZCcpLlxuICB0aGlzLmF1dG9EZXN0cm95ID0gIW9wdGlvbnMgfHwgb3B0aW9ucy5hdXRvRGVzdHJveSAhPT0gZmFsc2VcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBlcnJvcmVkLiBXaGVuIHRydWUgYWxsIHdyaXRlKCkgY2FsbHNcbiAgLy8gc2hvdWxkIHJldHVybiBmYWxzZS4gVGhpcyBpcyBuZWVkZWQgc2luY2Ugd2hlbiBhdXRvRGVzdHJveVxuICAvLyBpcyBkaXNhYmxlZCB3ZSBuZWVkIGEgd2F5IHRvIHRlbGwgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmYWlsZWQuXG4gIHRoaXMuZXJyb3JlZCA9IG51bGxcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBkZXN0cm95aW5nLlxuICB0aGlzLmNsb3NlZCA9IGZhbHNlXG5cbiAgLy8gVHJ1ZSBpZiBjbG9zZSBoYXMgYmVlbiBlbWl0dGVkIG9yIHdvdWxkIGhhdmUgYmVlbiBlbWl0dGVkXG4gIC8vIGRlcGVuZGluZyBvbiBlbWl0Q2xvc2UuXG4gIHRoaXMuY2xvc2VFbWl0dGVkID0gZmFsc2VcbiAgdGhpc1trT25GaW5pc2hlZF0gPSBbXVxufVxuZnVuY3Rpb24gcmVzZXRCdWZmZXIoc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyZWQgPSBbXVxuICBzdGF0ZS5idWZmZXJlZEluZGV4ID0gMFxuICBzdGF0ZS5hbGxCdWZmZXJzID0gdHJ1ZVxuICBzdGF0ZS5hbGxOb29wID0gdHJ1ZVxufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICByZXR1cm4gQXJyYXlQcm90b3R5cGVTbGljZSh0aGlzLmJ1ZmZlcmVkLCB0aGlzLmJ1ZmZlcmVkSW5kZXgpXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcmVkUmVxdWVzdENvdW50Jywge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJlZC5sZW5ndGggLSB0aGlzLmJ1ZmZlcmVkSW5kZXhcbiAgfVxufSlcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjUuXG4gIGNvbnN0IGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcbiAgaWYgKCFpc0R1cGxleCAmJiAhRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZShXcml0YWJsZSwgdGhpcykpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucylcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXZcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnN0cnVjdCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY29uc3RydWN0ID0gb3B0aW9ucy5jb25zdHJ1Y3RcbiAgICBpZiAob3B0aW9ucy5zaWduYWwpIGFkZEFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCB0aGlzKVxuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGRlc3Ryb3lJbXBsLmNvbnN0cnVjdCh0aGlzLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSB7XG4gICAgICBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgICB9XG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUpXG4gIH0pXG59XG5PYmplY3REZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sSGFzSW5zdGFuY2UsIHtcbiAgX19wcm90b19fOiBudWxsLFxuICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIGlmIChGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlXG4gICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGVcbiAgfVxufSlcblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFKCkpXG59XG5mdW5jdGlvbiBfd3JpdGUoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZ1xuICAgIGVsc2UgaWYgKGVuY29kaW5nICE9PSAnYnVmZmVyJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3BcbiAgfVxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpXG4gIH0gZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspXG4gICAgfVxuICB9XG4gIGxldCBlcnJcbiAgaWYgKHN0YXRlLmVuZGluZykge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpXG4gIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpXG4gIH1cbiAgaWYgKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVycilcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyciwgdHJ1ZSlcbiAgICByZXR1cm4gZXJyXG4gIH1cbiAgc3RhdGUucGVuZGluZ2NiKytcbiAgcmV0dXJuIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYilcbn1cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHJldHVybiBfd3JpdGUodGhpcywgY2h1bmssIGVuY29kaW5nLCBjYikgPT09IHRydWVcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrXG59XG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nKSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSlcbiAgfVxufVxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2UoZW5jb2RpbmcpXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2RpbmdcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICBzdGF0ZS5sZW5ndGggKz0gbGVuXG5cbiAgLy8gc3RyZWFtLl93cml0ZSByZXNldHMgc3RhdGUubGVuZ3RoXG4gIGNvbnN0IHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCB8fCBzdGF0ZS5lcnJvcmVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHN0YXRlLmJ1ZmZlcmVkLnB1c2goe1xuICAgICAgY2h1bmssXG4gICAgICBlbmNvZGluZyxcbiAgICAgIGNhbGxiYWNrXG4gICAgfSlcbiAgICBpZiAoc3RhdGUuYWxsQnVmZmVycyAmJiBlbmNvZGluZyAhPT0gJ2J1ZmZlcicpIHtcbiAgICAgIHN0YXRlLmFsbEJ1ZmZlcnMgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAoc3RhdGUuYWxsTm9vcCAmJiBjYWxsYmFjayAhPT0gbm9wKSB7XG4gICAgICBzdGF0ZS5hbGxOb29wID0gZmFsc2VcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUud3JpdGVsZW4gPSBsZW5cbiAgICBzdGF0ZS53cml0ZWNiID0gY2FsbGJhY2tcbiAgICBzdGF0ZS53cml0aW5nID0gdHJ1ZVxuICAgIHN0YXRlLnN5bmMgPSB0cnVlXG4gICAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gICAgc3RhdGUuc3luYyA9IGZhbHNlXG4gIH1cblxuICAvLyBSZXR1cm4gZmFsc2UgaWYgZXJyb3JlZCBvciBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYnJlYWtcbiAgLy8gYW55IHN5bmNocm9ub3VzIHdoaWxlKHN0cmVhbS53cml0ZShkYXRhKSkgbG9vcHMuXG4gIHJldHVybiByZXQgJiYgIXN0YXRlLmVycm9yZWQgJiYgIXN0YXRlLmRlc3Ryb3llZFxufVxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlblxuICBzdGF0ZS53cml0ZWNiID0gY2JcbiAgc3RhdGUud3JpdGluZyA9IHRydWVcbiAgc3RhdGUuc3luYyA9IHRydWVcbiAgaWYgKHN0YXRlLmRlc3Ryb3llZCkgc3RhdGUub253cml0ZShuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJykpXG4gIGVsc2UgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpXG4gIGVsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpXG4gIHN0YXRlLnN5bmMgPSBmYWxzZVxufVxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYlxuICBjYihlcilcbiAgLy8gRW5zdXJlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBldmVuIHdoZW4gYXV0b0Rlc3Ryb3kgaXNcbiAgLy8gbm90IGVuYWJsZWQuIFBhc3NpbmcgYGVyYCBoZXJlIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZVxuICAvLyBpdCdzIHJlbGF0ZWQgdG8gb25lIHNwZWNpZmljIHdyaXRlLCBub3QgdG8gdGhlIGJ1ZmZlcmVkXG4gIC8vIHdyaXRlcy5cbiAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIC8vIFRoaXMgY2FuIGVtaXQgZXJyb3IsIGJ1dCBlcnJvciBtdXN0IGFsd2F5cyBmb2xsb3cgY2IuXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpXG59XG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3Qgc3luYyA9IHN0YXRlLnN5bmNcbiAgY29uc3QgY2IgPSBzdGF0ZS53cml0ZWNiXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSlcbiAgICByZXR1cm5cbiAgfVxuICBzdGF0ZS53cml0aW5nID0gZmFsc2VcbiAgc3RhdGUud3JpdGVjYiA9IG51bGxcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuXG4gIHN0YXRlLndyaXRlbGVuID0gMFxuICBpZiAoZXIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXIuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGlmICghc3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RhdGUuZXJyb3JlZCA9IGVyXG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcmVhZGFibGUgc2lkZSBvZiB0aGVcbiAgICAvLyBlcnJvci5cbiAgICBpZiAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmICFzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCkge1xuICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVycm9yZWQgPSBlclxuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbndyaXRlRXJyb3IsIHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9IGVsc2Uge1xuICAgICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIGVyLCBjYilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA+IHN0YXRlLmJ1ZmZlcmVkSW5kZXgpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvLyBJdCBpcyBhIGNvbW1vbiBjYXNlIHRoYXQgdGhlIGNhbGxiYWNrIHBhc3NlZCB0byAud3JpdGUoKSBpcyBhbHdheXNcbiAgICAgIC8vIHRoZSBzYW1lLiBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCBzY2hlZHVsZSBhIG5ldyBuZXh0VGljaygpLCBidXRcbiAgICAgIC8vIHJhdGhlciBqdXN0IGluY3JlYXNlIGEgY291bnRlciwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgYXZvaWRcbiAgICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy5cbiAgICAgIGlmIChzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gIT09IG51bGwgJiYgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvLmNiID09PSBjYikge1xuICAgICAgICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8uY291bnQrK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0ge1xuICAgICAgICAgIGNvdW50OiAxLFxuICAgICAgICAgIGNiLFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZVRpY2ssIHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mbylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCAxLCBjYilcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGVUaWNrKHsgc3RyZWFtLCBzdGF0ZSwgY291bnQsIGNiIH0pIHtcbiAgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbFxuICByZXR1cm4gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBjb3VudCwgY2IpXG59XG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGNvdW50LCBjYikge1xuICBjb25zdCBuZWVkRHJhaW4gPSAhc3RhdGUuZW5kaW5nICYmICFzdHJlYW0uZGVzdHJveWVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW5cbiAgaWYgKG5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlXG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLVxuICAgIGNiKClcbiAgfVxuICBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyb3JCdWZmZXIoc3RhdGUpXG4gIH1cbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSlcbn1cblxuLy8gSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIGludm9rZSBjYWxsYmFja3MuXG5mdW5jdGlvbiBlcnJvckJ1ZmZlcihzdGF0ZSkge1xuICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAobGV0IG4gPSBzdGF0ZS5idWZmZXJlZEluZGV4OyBuIDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoOyArK24pIHtcbiAgICB2YXIgX3N0YXRlJGVycm9yZWRcbiAgICBjb25zdCB7IGNodW5rLCBjYWxsYmFjayB9ID0gc3RhdGUuYnVmZmVyZWRbbl1cbiAgICBjb25zdCBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgIHN0YXRlLmxlbmd0aCAtPSBsZW5cbiAgICBjYWxsYmFjayhcbiAgICAgIChfc3RhdGUkZXJyb3JlZCA9IHN0YXRlLmVycm9yZWQpICE9PSBudWxsICYmIF9zdGF0ZSRlcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfc3RhdGUkZXJyb3JlZFxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKVxuICAgIClcbiAgfVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfc3RhdGUkZXJyb3JlZDJcbiAgICBvbmZpbmlzaENhbGxiYWNrc1tpXShcbiAgICAgIChfc3RhdGUkZXJyb3JlZDIgPSBzdGF0ZS5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RhdGUkZXJyb3JlZDIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IF9zdGF0ZSRlcnJvcmVkMlxuICAgICAgICA6IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgICApXG4gIH1cbiAgcmVzZXRCdWZmZXIoc3RhdGUpXG59XG5cbi8vIElmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0LlxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuY29ya2VkIHx8IHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8ICFzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHsgYnVmZmVyZWQsIGJ1ZmZlcmVkSW5kZXgsIG9iamVjdE1vZGUgfSA9IHN0YXRlXG4gIGNvbnN0IGJ1ZmZlcmVkTGVuZ3RoID0gYnVmZmVyZWQubGVuZ3RoIC0gYnVmZmVyZWRJbmRleFxuICBpZiAoIWJ1ZmZlcmVkTGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IGkgPSBidWZmZXJlZEluZGV4XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlXG4gIGlmIChidWZmZXJlZExlbmd0aCA+IDEgJiYgc3RyZWFtLl93cml0ZXYpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IgLT0gYnVmZmVyZWRMZW5ndGggLSAxXG4gICAgY29uc3QgY2FsbGJhY2sgPSBzdGF0ZS5hbGxOb29wXG4gICAgICA/IG5vcFxuICAgICAgOiAoZXJyKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgbiA9IGk7IG4gPCBidWZmZXJlZC5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgYnVmZmVyZWRbbl0uY2FsbGJhY2soZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIC8vIE1ha2UgYSBjb3B5IG9mIGBidWZmZXJlZGAgaWYgaXQncyBnb2luZyB0byBiZSB1c2VkIGJ5IGBjYWxsYmFja2AgYWJvdmUsXG4gICAgLy8gc2luY2UgYGRvV3JpdGVgIHdpbGwgbXV0YXRlIHRoZSBhcnJheS5cbiAgICBjb25zdCBjaHVua3MgPSBzdGF0ZS5hbGxOb29wICYmIGkgPT09IDAgPyBidWZmZXJlZCA6IEFycmF5UHJvdG90eXBlU2xpY2UoYnVmZmVyZWQsIGkpXG4gICAgY2h1bmtzLmFsbEJ1ZmZlcnMgPSBzdGF0ZS5hbGxCdWZmZXJzXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGNodW5rcywgJycsIGNhbGxiYWNrKVxuICAgIHJlc2V0QnVmZmVyKHN0YXRlKVxuICB9IGVsc2Uge1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHsgY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayB9ID0gYnVmZmVyZWRbaV1cbiAgICAgIGJ1ZmZlcmVkW2krK10gPSBudWxsXG4gICAgICBjb25zdCBsZW4gPSBvYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aFxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKVxuICAgIH0gd2hpbGUgKGkgPCBidWZmZXJlZC5sZW5ndGggJiYgIXN0YXRlLndyaXRpbmcpXG4gICAgaWYgKGkgPT09IGJ1ZmZlcmVkLmxlbmd0aCkge1xuICAgICAgcmVzZXRCdWZmZXIoc3RhdGUpXG4gICAgfSBlbHNlIGlmIChpID4gMjU2KSB7XG4gICAgICBidWZmZXJlZC5zcGxpY2UoMCwgaSlcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSBpXG4gICAgfVxuICB9XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZVxufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICh0aGlzLl93cml0ZXYpIHtcbiAgICB0aGlzLl93cml0ZXYoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjaHVuayxcbiAgICAgICAgICBlbmNvZGluZ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgY2JcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfd3JpdGUoKScpXG4gIH1cbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbFxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVua1xuICAgIGNodW5rID0gbnVsbFxuICAgIGVuY29kaW5nID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG51bGxcbiAgfVxuICBsZXQgZXJyXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ID0gX3dyaXRlKHRoaXMsIGNodW5rLCBlbmNvZGluZylcbiAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGVyciA9IHJldFxuICAgIH1cbiAgfVxuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzLlxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMVxuICAgIHRoaXMudW5jb3JrKClcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgLy8gRG8gbm90aGluZy4uLlxuICB9IGVsc2UgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5lbmRpbmcpIHtcbiAgICAvLyBUaGlzIGlzIGZvcmdpdmluZyBpbiB0ZXJtcyBvZiB1bm5lY2Vzc2FyeSBjYWxscyB0byBlbmQoKSBhbmQgY2FuIGhpZGVcbiAgICAvLyBsb2dpYyBlcnJvcnMuIEhvd2V2ZXIsIHVzdWFsbHkgc3VjaCBlcnJvcnMgYXJlIGhhcm1sZXNzIGFuZCBjYXVzaW5nIGFcbiAgICAvLyBoYXJkIGVycm9yIGNhbiBiZSBkaXNwcm9wb3J0aW9uYXRlbHkgZGVzdHJ1Y3RpdmUuIEl0IGlzIG5vdCBhbHdheXNcbiAgICAvLyB0cml2aWFsIGZvciB0aGUgdXNlciB0byBkZXRlcm1pbmUgd2hldGhlciBlbmQoKSBuZWVkcyB0byBiZSBjYWxsZWRcbiAgICAvLyBvciBub3QuXG5cbiAgICBzdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgZmluaXNoTWF5YmUodGhpcywgc3RhdGUsIHRydWUpXG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlXG4gIH0gZWxzZSBpZiAoc3RhdGUuZmluaXNoZWQpIHtcbiAgICBlcnIgPSBuZXcgRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEKCdlbmQnKVxuICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCkge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnZW5kJylcbiAgfVxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGVyciB8fCBzdGF0ZS5maW5pc2hlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZVtrT25GaW5pc2hlZF0ucHVzaChjYilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5lbmRpbmcgJiZcbiAgICAhc3RhdGUuZGVzdHJveWVkICYmXG4gICAgc3RhdGUuY29uc3RydWN0ZWQgJiZcbiAgICBzdGF0ZS5sZW5ndGggPT09IDAgJiZcbiAgICAhc3RhdGUuZXJyb3JlZCAmJlxuICAgIHN0YXRlLmJ1ZmZlcmVkLmxlbmd0aCA9PT0gMCAmJlxuICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICFzdGF0ZS53cml0aW5nICYmXG4gICAgIXN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgICFzdGF0ZS5jbG9zZUVtaXR0ZWRcbiAgKVxufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uRmluaXNoKGVycikge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8gZXJyIDogRVJSX01VTFRJUExFX0NBTExCQUNLKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc3Qgb25maW5pc2hDYWxsYmFja3MgPSBzdGF0ZVtrT25GaW5pc2hlZF0uc3BsaWNlKDApXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKGVycilcbiAgICAgIH1cbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCBzdGF0ZS5zeW5jKVxuICAgIH0gZWxzZSBpZiAobmVlZEZpbmlzaChzdGF0ZSkpIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LiBEb24ndCBjaGVjayBzdGF0ZS5zeW5jIGhlcmUuXG4gICAgICAvLyBTb21lIHN0cmVhbXMgYXNzdW1lICdmaW5pc2gnIHdpbGwgYmUgZW1pdHRlZFxuICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcmVsYXRpdmUgdG8gX2ZpbmFsIGNhbGxiYWNrLlxuICAgICAgc3RhdGUucGVuZGluZ2NiKytcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoLCBzdHJlYW0sIHN0YXRlKVxuICAgIH1cbiAgfVxuICBzdGF0ZS5zeW5jID0gdHJ1ZVxuICBzdGF0ZS5wZW5kaW5nY2IrK1xuICB0cnkge1xuICAgIHN0cmVhbS5fZmluYWwob25GaW5pc2gpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG9uRmluaXNoKGVycilcbiAgfVxuICBzdGF0ZS5zeW5jID0gZmFsc2Vcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZVxuICAgICAgY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlLCBzeW5jKSB7XG4gIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYisrXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soXG4gICAgICAgICAgKHN0cmVhbSwgc3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nY2IrK1xuICAgICAgICBmaW5pc2goc3RyZWFtLCBzdGF0ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLnBlbmRpbmdjYi0tXG4gIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmZpbmlzaENhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKClcbiAgfVxuICBzdHJlYW0uZW1pdCgnZmluaXNoJylcbiAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsLlxuICAgIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICFyU3RhdGUgfHxcbiAgICAgIChyU3RhdGUuYXV0b0Rlc3Ryb3kgJiZcbiAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSByZWFkYWJsZSB0byBldmVyICdlbmQnXG4gICAgICAgIC8vIGlmIHJlYWRhYmxlIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAgICAoclN0YXRlLmVuZEVtaXR0ZWQgfHwgclN0YXRlLnJlYWRhYmxlID09PSBmYWxzZSkpXG4gICAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgfVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlLnByb3RvdHlwZSwge1xuICBjbG9zZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmNsb3NlZCA6IGZhbHNlXG4gICAgfVxuICB9LFxuICBkZXN0cm95ZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA6IGZhbHNlXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcgZGVzdHJveWVkLlxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgICAgIC8vIHcud3JpdGFibGUgPT09IGZhbHNlIG1lYW5zIHRoYXQgdGhpcyBpcyBwYXJ0IG9mIGEgRHVwbGV4IHN0cmVhbVxuICAgICAgLy8gd2hlcmUgdGhlIHdyaXRhYmxlIHNpZGUgd2FzIGRpc2FibGVkIHVwb24gY29uc3RydWN0aW9uLlxuICAgICAgLy8gQ29tcGF0LiBUaGUgdXNlciBtaWdodCBtYW51YWxseSBkaXNhYmxlIHdyaXRhYmxlIHNpZGUgdGhyb3VnaFxuICAgICAgLy8gZGVwcmVjYXRlZCBzZXR0ZXIuXG4gICAgICByZXR1cm4gISF3ICYmIHcud3JpdGFibGUgIT09IGZhbHNlICYmICF3LmRlc3Ryb3llZCAmJiAhdy5lcnJvcmVkICYmICF3LmVuZGluZyAmJiAhdy5lbmRlZFxuICAgIH0sXG4gICAgc2V0KHZhbCkge1xuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGlibGUuXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlID0gISF2YWxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlT2JqZWN0TW9kZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3Qgd1N0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICAgICAgaWYgKCF3U3RhdGUpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuICF3U3RhdGUuZGVzdHJveWVkICYmICF3U3RhdGUuZW5kaW5nICYmIHdTdGF0ZS5uZWVkRHJhaW5cbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlSGlnaFdhdGVyTWFyazoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQ29ya2VkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQgOiAwXG4gICAgfVxuICB9LFxuICB3cml0YWJsZUxlbmd0aDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQWJvcnRlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIShcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JlZCkgJiZcbiAgICAgICAgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWRcbiAgICAgIClcbiAgICB9XG4gIH1cbn0pXG5jb25zdCBkZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcblxuICAvLyBJbnZva2UgcGVuZGluZyBjYWxsYmFja3MuXG4gIGlmICghc3RhdGUuZGVzdHJveWVkICYmIChzdGF0ZS5idWZmZXJlZEluZGV4IDwgc3RhdGUuYnVmZmVyZWQubGVuZ3RoIHx8IHN0YXRlW2tPbkZpbmlzaGVkXS5sZW5ndGgpKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlcnJvckJ1ZmZlciwgc3RhdGUpXG4gIH1cbiAgZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgY2IpXG4gIHJldHVybiB0aGlzXG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveVxuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKVxufVxuV3JpdGFibGUucHJvdG90eXBlW0VFLmNhcHR1cmVSZWplY3Rpb25TeW1ib2xdID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmRlc3Ryb3koZXJyKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbldyaXRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAod3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtV3JpdGFibGVGcm9tV3JpdGFibGVTdHJlYW0od3JpdGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5Xcml0YWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1Xcml0YWJsZSkge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdXcml0YWJsZVN0cmVhbUZyb21TdHJlYW1Xcml0YWJsZShzdHJlYW1Xcml0YWJsZSlcbn1cbiIsIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG47KCd1c2Ugc3RyaWN0JylcbmNvbnN0IGJ1ZmZlck1vZHVsZSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7XG4gIGlzUmVhZGFibGUsXG4gIGlzV3JpdGFibGUsXG4gIGlzSXRlcmFibGUsXG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNSZWFkYWJsZU5vZGVTdHJlYW0sXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc0R1cGxleE5vZGVTdHJlYW1cbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUgfVxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgUmVhZGFibGUgPSByZXF1aXJlKCcuL3JlYWRhYmxlJylcbmNvbnN0IHsgY3JlYXRlRGVmZXJyZWRQcm9taXNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZnJvbSA9IHJlcXVpcmUoJy4vZnJvbScpXG5jb25zdCBCbG9iID0gZ2xvYmFsVGhpcy5CbG9iIHx8IGJ1ZmZlck1vZHVsZS5CbG9iXG5jb25zdCBpc0Jsb2IgPVxuICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQmxvYlxuICAgICAgfVxuICAgIDogZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5jb25zdCB7IEZ1bmN0aW9uUHJvdG90eXBlQ2FsbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5cbi8vIFRoaXMgaXMgbmVlZGVkIGZvciBwcmUgbm9kZSAxNy5cbmNsYXNzIER1cGxleGlmeSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzQzODVcblxuICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnJlYWRhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMud3JpdGFibGUpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IHRydWVcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkdXBsZXhpZnkoYm9keSwgbmFtZSkge1xuICBpZiAoaXNEdXBsZXhOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHlcbiAgfVxuICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZTogYm9keVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkpKSB7XG4gICAgcmV0dXJuIF9kdXBsZXhpZnkoe1xuICAgICAgd3JpdGFibGU6IGJvZHlcbiAgICB9KVxuICB9XG4gIGlmIChpc05vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICByZWFkYWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtc1xuICAvLyBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAvLyAgIHJldHVybiBfZHVwbGV4aWZ5KHsgcmVhZGFibGU6IFJlYWRhYmxlLmZyb21XZWIoYm9keSkgfSk7XG4gIC8vIH1cblxuICAvLyBUT0RPOiBXZWJzdHJlYW1zXG4gIC8vIGlmIChpc1dyaXRhYmxlU3RyZWFtKGJvZHkpKSB7XG4gIC8vICAgcmV0dXJuIF9kdXBsZXhpZnkoeyB3cml0YWJsZTogV3JpdGFibGUuZnJvbVdlYihib2R5KSB9KTtcbiAgLy8gfVxuXG4gIGlmICh0eXBlb2YgYm9keSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHsgdmFsdWUsIHdyaXRlLCBmaW5hbCwgZGVzdHJveSB9ID0gZnJvbUFzeW5jR2VuKGJvZHkpXG4gICAgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIHZhbHVlLCB7XG4gICAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIGZpbmFsLFxuICAgICAgICBkZXN0cm95XG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB0aGVuID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHZhbHVlLnRoZW5cbiAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkXG4gICAgICBjb25zdCBwcm9taXNlID0gRnVuY3Rpb25Qcm90b3R5cGVDYWxsKFxuICAgICAgICB0aGVuLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSgnbnVsbHknLCAnYm9keScsIHZhbClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICBkZXN0cm95ZXIoZCwgZXJyKVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm4gKGQgPSBuZXcgRHVwbGV4aWZ5KHtcbiAgICAgICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRlLFxuICAgICAgICBmaW5hbChjYikge1xuICAgICAgICAgIGZpbmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHByb21pc2VcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgbnVsbClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveVxuICAgICAgfSkpXG4gICAgfVxuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0l0ZXJhYmxlLCBBc3luY0l0ZXJhYmxlIG9yIEFzeW5jRnVuY3Rpb24nLCBuYW1lLCB2YWx1ZSlcbiAgfVxuICBpZiAoaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGR1cGxleGlmeShib2R5LmFycmF5QnVmZmVyKCkpXG4gIH1cbiAgaWYgKGlzSXRlcmFibGUoYm9keSkpIHtcbiAgICByZXR1cm4gZnJvbShEdXBsZXhpZnksIGJvZHksIHtcbiAgICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogV2Vic3RyZWFtcy5cbiAgLy8gaWYgKFxuICAvLyAgIGlzUmVhZGFibGVTdHJlYW0oYm9keT8ucmVhZGFibGUpICYmXG4gIC8vICAgaXNXcml0YWJsZVN0cmVhbShib2R5Py53cml0YWJsZSlcbiAgLy8gKSB7XG4gIC8vICAgcmV0dXJuIER1cGxleGlmeS5mcm9tV2ViKGJvZHkpO1xuICAvLyB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LndyaXRhYmxlKSA9PT0gJ29iamVjdCcgfHxcbiAgICB0eXBlb2YgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS5yZWFkYWJsZSkgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlYWRhYmxlID1cbiAgICAgIGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkICYmIGJvZHkucmVhZGFibGVcbiAgICAgICAgPyBpc1JlYWRhYmxlTm9kZVN0cmVhbShib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkucmVhZGFibGUpXG4gICAgICAgICAgPyBib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogYm9keS5yZWFkYWJsZVxuICAgICAgICAgIDogZHVwbGV4aWZ5KGJvZHkucmVhZGFibGUpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3Qgd3JpdGFibGUgPVxuICAgICAgYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQgJiYgYm9keS53cml0YWJsZVxuICAgICAgICA/IGlzV3JpdGFibGVOb2RlU3RyZWFtKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS53cml0YWJsZSlcbiAgICAgICAgICA/IGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBib2R5LndyaXRhYmxlXG4gICAgICAgICAgOiBkdXBsZXhpZnkoYm9keS53cml0YWJsZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZSxcbiAgICAgIHdyaXRhYmxlXG4gICAgfSlcbiAgfVxuICBjb25zdCB0aGVuID0gYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnRoZW5cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbGV0IGRcbiAgICBGdW5jdGlvblByb3RvdHlwZUNhbGwoXG4gICAgICB0aGVuLFxuICAgICAgYm9keSxcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgZC5wdXNoKHZhbClcbiAgICAgICAgfVxuICAgICAgICBkLnB1c2gobnVsbClcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGRlc3Ryb3llcihkLCBlcnIpXG4gICAgICB9XG4gICAgKVxuICAgIHJldHVybiAoZCA9IG5ldyBEdXBsZXhpZnkoe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHJlYWQoKSB7fVxuICAgIH0pKVxuICB9XG4gIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICBuYW1lLFxuICAgIFtcbiAgICAgICdCbG9iJyxcbiAgICAgICdSZWFkYWJsZVN0cmVhbScsXG4gICAgICAnV3JpdGFibGVTdHJlYW0nLFxuICAgICAgJ1N0cmVhbScsXG4gICAgICAnSXRlcmFibGUnLFxuICAgICAgJ0FzeW5jSXRlcmFibGUnLFxuICAgICAgJ0Z1bmN0aW9uJyxcbiAgICAgICd7IHJlYWRhYmxlLCB3cml0YWJsZSB9IHBhaXInLFxuICAgICAgJ1Byb21pc2UnXG4gICAgXSxcbiAgICBib2R5XG4gIClcbn1cbmZ1bmN0aW9uIGZyb21Bc3luY0dlbihmbikge1xuICBsZXQgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3QgdmFsdWUgPSBmbihcbiAgICAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IF9wcm9taXNlID0gcHJvbWlzZVxuICAgICAgICBwcm9taXNlID0gbnVsbFxuICAgICAgICBjb25zdCB7IGNodW5rLCBkb25lLCBjYiB9ID0gYXdhaXQgX3Byb21pc2VcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICAgICAgaWYgKGRvbmUpIHJldHVyblxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBjYXVzZTogc2lnbmFsLnJlYXNvblxuICAgICAgICAgIH0pXG4gICAgICAgIDsoeyBwcm9taXNlLCByZXNvbHZlIH0gPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKSlcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgKVxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICAgIGNvbnN0IF9yZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgcmVzb2x2ZSA9IG51bGxcbiAgICAgIF9yZXNvbHZlKHtcbiAgICAgICAgY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICBjYlxuICAgICAgfSlcbiAgICB9LFxuICAgIGZpbmFsKGNiKSB7XG4gICAgICBjb25zdCBfcmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHJlc29sdmUgPSBudWxsXG4gICAgICBfcmVzb2x2ZSh7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIGNiXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveShlcnIsIGNiKSB7XG4gICAgICBhYy5hYm9ydCgpXG4gICAgICBjYihlcnIpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBfZHVwbGV4aWZ5KHBhaXIpIHtcbiAgY29uc3QgciA9IHBhaXIucmVhZGFibGUgJiYgdHlwZW9mIHBhaXIucmVhZGFibGUucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IFJlYWRhYmxlLndyYXAocGFpci5yZWFkYWJsZSkgOiBwYWlyLnJlYWRhYmxlXG4gIGNvbnN0IHcgPSBwYWlyLndyaXRhYmxlXG4gIGxldCByZWFkYWJsZSA9ICEhaXNSZWFkYWJsZShyKVxuICBsZXQgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUodylcbiAgbGV0IG9uZHJhaW5cbiAgbGV0IG9uZmluaXNoXG4gIGxldCBvbnJlYWRhYmxlXG4gIGxldCBvbmNsb3NlXG4gIGxldCBkXG4gIGZ1bmN0aW9uIG9uZmluaXNoZWQoZXJyKSB7XG4gICAgY29uc3QgY2IgPSBvbmNsb3NlXG4gICAgb25jbG9zZSA9IG51bGxcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycilcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgZC5kZXN0cm95KGVycilcbiAgICB9IGVsc2UgaWYgKCFyZWFkYWJsZSAmJiAhd3JpdGFibGUpIHtcbiAgICAgIGQuZGVzdHJveSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyhyb25hZyk6IEF2b2lkIGRvdWJsZSBidWZmZXJpbmcuXG4gIC8vIEltcGxlbWVudCBXcml0YWJsZS9SZWFkYWJsZS9EdXBsZXggdHJhaXRzLlxuICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNTE1LlxuICBkID0gbmV3IER1cGxleGlmeSh7XG4gICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogISEociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5yZWFkYWJsZU9iamVjdE1vZGUpLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogISEodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy53cml0YWJsZU9iamVjdE1vZGUpLFxuICAgIHJlYWRhYmxlLFxuICAgIHdyaXRhYmxlXG4gIH0pXG4gIGlmICh3cml0YWJsZSkge1xuICAgIGVvcyh3LCAoZXJyKSA9PiB7XG4gICAgICB3cml0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRlc3Ryb3llcihyLCBlcnIpXG4gICAgICB9XG4gICAgICBvbmZpbmlzaGVkKGVycilcbiAgICB9KVxuICAgIGQuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgIGlmICh3LndyaXRlKGNodW5rLCBlbmNvZGluZykpIHtcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25kcmFpbiA9IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfVxuICAgIGQuX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICB3LmVuZCgpXG4gICAgICBvbmZpbmlzaCA9IGNhbGxiYWNrXG4gICAgfVxuICAgIHcub24oJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZHJhaW4pIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmRyYWluXG4gICAgICAgIG9uZHJhaW4gPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHcub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbmZpbmlzaCkge1xuICAgICAgICBjb25zdCBjYiA9IG9uZmluaXNoXG4gICAgICAgIG9uZmluaXNoID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpZiAocmVhZGFibGUpIHtcbiAgICBlb3MociwgKGVycikgPT4ge1xuICAgICAgcmVhZGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBkZXN0cm95ZXIociwgZXJyKVxuICAgICAgfVxuICAgICAgb25maW5pc2hlZChlcnIpXG4gICAgfSlcbiAgICByLm9uKCdyZWFkYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbnJlYWRhYmxlKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25yZWFkYWJsZVxuICAgICAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgICByLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkLnB1c2gobnVsbClcbiAgICB9KVxuICAgIGQuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBidWYgPSByLnJlYWQoKVxuICAgICAgICBpZiAoYnVmID09PSBudWxsKSB7XG4gICAgICAgICAgb25yZWFkYWJsZSA9IGQuX3JlYWRcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWQucHVzaChidWYpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZC5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFlcnIgJiYgb25jbG9zZSAhPT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgIG9uZHJhaW4gPSBudWxsXG4gICAgb25maW5pc2ggPSBudWxsXG4gICAgaWYgKG9uY2xvc2UgPT09IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9IGVsc2Uge1xuICAgICAgb25jbG9zZSA9IGNhbGxiYWNrXG4gICAgICBkZXN0cm95ZXIodywgZXJyKVxuICAgICAgZGVzdHJveWVyKHIsIGVycilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwZSBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZlxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXhcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LnByb3RvdHlwZSwgUmVhZGFibGUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LCBSZWFkYWJsZSlcbntcbiAgY29uc3Qga2V5cyA9IE9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKVxuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWV0aG9kID0ga2V5c1tpXVxuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXVxuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucylcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKVxuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gb3B0aW9ucy5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZVxuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKER1cGxleC5wcm90b3R5cGUsIHtcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlJylcbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnKVxuICB9LFxuICB3cml0YWJsZU9iamVjdE1vZGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlT2JqZWN0TW9kZScpXG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicpXG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcpXG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlRmluaXNoZWQnKVxuICB9LFxuICB3cml0YWJsZUNvcmtlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAuLi5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVDb3JrZWQnKVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUVuZGVkJylcbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTmVlZERyYWluJylcbiAgfSxcbiAgZGVzdHJveWVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbkR1cGxleC5mcm9tV2ViID0gZnVuY3Rpb24gKHBhaXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtRHVwbGV4RnJvbVJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIG9wdGlvbnMpXG59XG5EdXBsZXgudG9XZWIgPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleChkdXBsZXgpXG59XG5sZXQgZHVwbGV4aWZ5XG5EdXBsZXguZnJvbSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gIGlmICghZHVwbGV4aWZ5KSB7XG4gICAgZHVwbGV4aWZ5ID0gcmVxdWlyZSgnLi9kdXBsZXhpZnknKVxuICB9XG4gIHJldHVybiBkdXBsZXhpZnkoYm9keSwgJ2JvZHknKVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgT2JqZWN0U2V0UHJvdG90eXBlT2YsIFN5bWJvbCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybVxuY29uc3QgeyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBnZXRIaWdoV2F0ZXJNYXJrIH0gPSByZXF1aXJlKCcuL3N0YXRlJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFRyYW5zZm9ybS5wcm90b3R5cGUsIER1cGxleC5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihUcmFuc2Zvcm0sIER1cGxleClcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgna0NhbGxiYWNrJylcbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKVxuXG4gIC8vIFRPRE8gKHJvbmFnKTogVGhpcyBzaG91bGQgcHJlZmVyYWJseSBhbHdheXMgYmVcbiAgLy8gYXBwbGllZCBidXQgd291bGQgYmUgc2VtdmVyLW1ham9yLiBPciBldmVuIGJldHRlcjtcbiAgLy8gbWFrZSBUcmFuc2Zvcm0gYSBSZWFkYWJsZSB3aXRoIHRoZSBXcml0YWJsZSBpbnRlcmZhY2UuXG4gIGNvbnN0IHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IG9wdGlvbnMgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB0cnVlKSA6IG51bGxcbiAgaWYgKHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9PT0gMCkge1xuICAgIC8vIEEgRHVwbGV4IHdpbGwgYnVmZmVyIGJvdGggb24gdGhlIHdyaXRhYmxlIGFuZCByZWFkYWJsZSBzaWRlIHdoaWxlXG4gICAgLy8gYSBUcmFuc2Zvcm0ganVzdCB3YW50cyB0byBidWZmZXIgaHdtIG51bWJlciBvZiBlbGVtZW50cy4gVG8gYXZvaWRcbiAgICAvLyBidWZmZXJpbmcgdHdpY2Ugd2UgZGlzYWJsZSBidWZmZXJpbmcgb24gdGhlIHdyaXRhYmxlIHNpZGUuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoaWdoV2F0ZXJNYXJrOiBudWxsLFxuICAgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLFxuICAgICAgLy8gVE9ETyAocm9uYWcpOiAwIGlzIG5vdCBvcHRpbWFsIHNpbmNlIHdlIGhhdmVcbiAgICAgIC8vIGEgXCJidWdcIiB3aGVyZSB3ZSBjaGVjayBuZWVkRHJhaW4gYmVmb3JlIGNhbGxpbmcgX3dyaXRlIGFuZCBub3QgYWZ0ZXIuXG4gICAgICAvLyBSZWZzOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMjg4N1xuICAgICAgLy8gUmVmczogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzU5NDFcbiAgICAgIHdyaXRhYmxlSGlnaFdhdGVyTWFyazogb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcmsgfHwgMFxuICAgIH1cbiAgfVxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKVxuXG4gIC8vIFdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2VcbiAgdGhpc1trQ2FsbGJhY2tdID0gbnVsbFxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2hcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgLy8gQmFja3dhcmRzIGNvbXBhdC4gU29tZSBUcmFuc2Zvcm0gc3RyZWFtcyBpbmNvcnJlY3RseSBpbXBsZW1lbnQgX2ZpbmFsXG4gIC8vIGluc3RlYWQgb2Ygb3IgaW4gYWRkaXRpb24gdG8gX2ZsdXNoLiBCeSB1c2luZyAncHJlZmluaXNoJyBpbnN0ZWFkIG9mXG4gIC8vIGltcGxlbWVudGluZyBfZmluYWwgd2UgY29udGludWUgc3VwcG9ydGluZyB0aGlzIHVuZm9ydHVuYXRlIHVzZSBjYXNlLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpXG59XG5mdW5jdGlvbiBmaW5hbChjYikge1xuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKChlciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVyKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGVzdHJveShlcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdXNoKGRhdGEpXG4gICAgICB9XG4gICAgICB0aGlzLnB1c2gobnVsbClcbiAgICAgIGlmIChjYikge1xuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKClcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgaWYgKHRoaXMuX2ZpbmFsICE9PSBmaW5hbCkge1xuICAgIGZpbmFsLmNhbGwodGhpcylcbiAgfVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZmluYWwgPSBmaW5hbFxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgdGhyb3cgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfdHJhbnNmb3JtKCknKVxufVxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjb25zdCByU3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHdTdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgbGVuZ3RoID0gclN0YXRlLmxlbmd0aFxuICB0aGlzLl90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCAoZXJyLCB2YWwpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnB1c2godmFsKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB3U3RhdGUuZW5kZWQgfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICBsZW5ndGggPT09IHJTdGF0ZS5sZW5ndGggfHxcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuXG4gICAgICByU3RhdGUubGVuZ3RoIDwgclN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICApIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trQ2FsbGJhY2tdID0gY2FsbGJhY2tcbiAgICB9XG4gIH0pXG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpc1trQ2FsbGJhY2tdKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzW2tDYWxsYmFja11cbiAgICB0aGlzW2tDYWxsYmFja10gPSBudWxsXG4gICAgY2FsbGJhY2soKVxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE9iamVjdFNldFByb3RvdHlwZU9mIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2hcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJylcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLnByb3RvdHlwZSwgVHJhbnNmb3JtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucylcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucylcbn1cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IEFycmF5SXNBcnJheSwgUHJvbWlzZSwgU3ltYm9sQXN5bmNJdGVyYXRvciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBvbmNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLFxuICAgIEVSUl9NSVNTSU5HX0FSR1MsXG4gICAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gICAgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzUmVhZGFibGUsIGlzUmVhZGFibGVOb2RlU3RyZWFtLCBpc05vZGVTdHJlYW0gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxubGV0IFBhc3NUaHJvdWdoXG5sZXQgUmVhZGFibGVcbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcpIHtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfSlcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgICB3cml0YWJsZTogd3JpdGluZ1xuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZmluaXNoZWQgPSAhZXJyXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgZGVzdHJveTogKGVycikgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKVxuICAgIH0sXG4gICAgY2xlYW51cFxuICB9XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIC8vIFN0cmVhbXMgc2hvdWxkIG5ldmVyIGJlIGFuIGVtcHR5IGFycmF5LiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3RcbiAgLy8gYSBzaW5nbGUgc3RyZWFtLiBUaGVyZWZvcmUgb3B0aW1pemUgZm9yIHRoZSBhdmVyYWdlIGNhc2UgaW5zdGVhZCBvZlxuICAvLyBjaGVja2luZyBmb3IgbGVuZ3RoID09PSAwIGFzIHdlbGwuXG4gIHZhbGlkYXRlRnVuY3Rpb24oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdLCAnc3RyZWFtc1tzdHJlYW0ubGVuZ3RoIC0gMV0nKVxuICByZXR1cm4gc3RyZWFtcy5wb3AoKVxufVxuZnVuY3Rpb24gbWFrZUFzeW5jSXRlcmFibGUodmFsKSB7XG4gIGlmIChpc0l0ZXJhYmxlKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsXG4gIH0gZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odmFsKSkge1xuICAgIC8vIExlZ2FjeSBzdHJlYW1zIGFyZSBub3QgSXRlcmFibGUuXG4gICAgcmV0dXJuIGZyb21SZWFkYWJsZSh2YWwpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCd2YWwnLCBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnXSwgdmFsKVxufVxuYXN5bmMgZnVuY3Rpb24qIGZyb21SZWFkYWJsZSh2YWwpIHtcbiAgaWYgKCFSZWFkYWJsZSkge1xuICAgIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG4gIH1cbiAgeWllbGQqIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0l0ZXJhdG9yXS5jYWxsKHZhbClcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXAoaXRlcmFibGUsIHdyaXRhYmxlLCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVycm9yXG4gIGxldCBvbnJlc29sdmUgPSBudWxsXG4gIGNvbnN0IHJlc3VtZSA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAob25yZXNvbHZlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9ucmVzb2x2ZVxuICAgICAgb25yZXNvbHZlID0gbnVsbFxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjb25zdCB3YWl0ID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25yZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB3cml0YWJsZS5vbignZHJhaW4nLCByZXN1bWUpXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgd3JpdGFibGUsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICByZXN1bWVcbiAgKVxuICB0cnkge1xuICAgIGlmICh3cml0YWJsZS53cml0YWJsZU5lZWREcmFpbikge1xuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICAgIGlmICghd3JpdGFibGUud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXQoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICB3cml0YWJsZS5lbmQoKVxuICAgIH1cbiAgICBhd2FpdCB3YWl0KClcbiAgICBmaW5pc2goKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBmaW5pc2goZXJyb3IgIT09IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhbnVwKClcbiAgICB3cml0YWJsZS5vZmYoJ2RyYWluJywgcmVzdW1lKVxuICB9XG59XG5mdW5jdGlvbiBwaXBlbGluZSguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBwaXBlbGluZUltcGwoc3RyZWFtcywgb25jZShwb3BDYWxsYmFjayhzdHJlYW1zKSkpXG59XG5mdW5jdGlvbiBwaXBlbGluZUltcGwoc3RyZWFtcywgY2FsbGJhY2ssIG9wdHMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAxICYmIEFycmF5SXNBcnJheShzdHJlYW1zWzBdKSkge1xuICAgIHN0cmVhbXMgPSBzdHJlYW1zWzBdXG4gIH1cbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJylcbiAgfVxuICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBjb25zdCBzaWduYWwgPSBhYy5zaWduYWxcbiAgY29uc3Qgb3V0ZXJTaWduYWwgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdHMuc2lnbmFsXG5cbiAgLy8gTmVlZCB0byBjbGVhbnVwIGV2ZW50IGxpc3RlbmVycyBpZiBsYXN0IHN0cmVhbSBpcyByZWFkYWJsZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzM1NDUyXG4gIGNvbnN0IGxhc3RTdHJlYW1DbGVhbnVwID0gW11cbiAgdmFsaWRhdGVBYm9ydFNpZ25hbChvdXRlclNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgZmluaXNoSW1wbChuZXcgQWJvcnRFcnJvcigpKVxuICB9XG4gIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICBsZXQgZXJyb3JcbiAgbGV0IHZhbHVlXG4gIGNvbnN0IGRlc3Ryb3lzID0gW11cbiAgbGV0IGZpbmlzaENvdW50ID0gMFxuICBmdW5jdGlvbiBmaW5pc2goZXJyKSB7XG4gICAgZmluaXNoSW1wbChlcnIsIC0tZmluaXNoQ291bnQgPT09IDApXG4gIH1cbiAgZnVuY3Rpb24gZmluaXNoSW1wbChlcnIsIGZpbmFsKSB7XG4gICAgaWYgKGVyciAmJiAoIWVycm9yIHx8IGVycm9yLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAoIWVycm9yICYmICFmaW5hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdoaWxlIChkZXN0cm95cy5sZW5ndGgpIHtcbiAgICAgIGRlc3Ryb3lzLnNoaWZ0KCkoZXJyb3IpXG4gICAgfVxuICAgIG91dGVyU2lnbmFsID09PSBudWxsIHx8IG91dGVyU2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvdXRlclNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxuICAgIGFjLmFib3J0KClcbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbGFzdFN0cmVhbUNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvciwgdmFsdWUpXG4gICAgfVxuICB9XG4gIGxldCByZXRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXVxuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgY29uc3Qgd3JpdGluZyA9IGkgPiAwXG4gICAgY29uc3QgZW5kID0gcmVhZGluZyB8fCAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLmVuZCkgIT09IGZhbHNlXG4gICAgY29uc3QgaXNMYXN0U3RyZWFtID0gaSA9PT0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgZGVzdHJveSwgY2xlYW51cCB9ID0gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZylcbiAgICAgICAgZGVzdHJveXMucHVzaChkZXN0cm95KVxuICAgICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pICYmIGlzTGFzdFN0cmVhbSkge1xuICAgICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goY2xlYW51cClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYXRjaCBzdHJlYW0gZXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgcGlwZS9wdW1wIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicgJiYgZXJyLmNvZGUgIT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpIHtcbiAgICAgICAgICBmaW5pc2goZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkgJiYgaXNMYXN0U3RyZWFtKSB7XG4gICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtKHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBTdHJlYW0nLCAnc291cmNlJywgcmV0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUoc3RyZWFtKSB8fCBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICAgIHJldCA9IHN0cmVhbVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0ID0gbWFrZUFzeW5jSXRlcmFibGUocmV0KVxuICAgICAgcmV0ID0gc3RyZWFtKHJldCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pXG4gICAgICBpZiAocmVhZGluZykge1xuICAgICAgICBpZiAoIWlzSXRlcmFibGUocmV0LCB0cnVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUnLCBgdHJhbnNmb3JtWyR7aSAtIDF9XWAsIHJldClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9yZXRcbiAgICAgICAgaWYgKCFQYXNzVGhyb3VnaCkge1xuICAgICAgICAgIFBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9wYXNzdGhyb3VnaCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCB0byBwaXBlbGluZSBpcyBub3QgYSBzdHJlYW1cbiAgICAgICAgLy8gd2UgbXVzdCBjcmVhdGUgYSBwcm94eSBzdHJlYW0gc28gdGhhdCBwaXBlbGluZSguLi4pXG4gICAgICAgIC8vIGFsd2F5cyByZXR1cm5zIGEgc3RyZWFtIHdoaWNoIGNhbiBiZSBmdXJ0aGVyXG4gICAgICAgIC8vIGNvbXBvc2VkIHRocm91Z2ggYC5waXBlKHN0cmVhbSlgLlxuXG4gICAgICAgIGNvbnN0IHB0ID0gbmV3IFBhc3NUaHJvdWdoKHtcbiAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSGFuZGxlIFByb21pc2VzL0ErIHNwZWMsIGB0aGVuYCBjb3VsZCBiZSBhIGdldHRlciB0aGF0IHRocm93cyBvblxuICAgICAgICAvLyBzZWNvbmQgdXNlLlxuICAgICAgICBjb25zdCB0aGVuID0gKF9yZXQgPSByZXQpID09PSBudWxsIHx8IF9yZXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9yZXQudGhlblxuICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbFxuICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwdC53cml0ZSh2YWwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIHB0LmVuZCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBwdC5kZXN0cm95KGVycilcbiAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gsIGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQsIHRydWUpKSB7XG4gICAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICAgIHB1bXAocmV0LCBwdCwgZmluaXNoLCB7XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUgb3IgUHJvbWlzZScsICdkZXN0aW5hdGlvbicsIHJldClcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBwdFxuICAgICAgICBjb25zdCB7IGRlc3Ryb3ksIGNsZWFudXAgfSA9IGRlc3Ryb3llcihyZXQsIGZhbHNlLCB0cnVlKVxuICAgICAgICBkZXN0cm95cy5wdXNoKGRlc3Ryb3kpXG4gICAgICAgIGlmIChpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCArPSAyXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBwaXBlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSAmJiBpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShyZXQpKSB7XG4gICAgICAgIGZpbmlzaENvdW50KytcbiAgICAgICAgcHVtcChyZXQsIHN0cmVhbSwgZmluaXNoLCB7XG4gICAgICAgICAgZW5kXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3ZhbCcsIFsnUmVhZGFibGUnLCAnSXRlcmFibGUnLCAnQXN5bmNJdGVyYWJsZSddLCByZXQpXG4gICAgICB9XG4gICAgICByZXQgPSBzdHJlYW1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0ID0gRHVwbGV4LmZyb20oc3RyZWFtKVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKHNpZ25hbCAhPT0gbnVsbCAmJiBzaWduYWwgIT09IHVuZGVmaW5lZCAmJiBzaWduYWwuYWJvcnRlZCkgfHxcbiAgICAob3V0ZXJTaWduYWwgIT09IG51bGwgJiYgb3V0ZXJTaWduYWwgIT09IHVuZGVmaW5lZCAmJiBvdXRlclNpZ25hbC5hYm9ydGVkKVxuICApIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIHBpcGUoc3JjLCBkc3QsIGZpbmlzaCwgeyBlbmQgfSkge1xuICBsZXQgZW5kZWQgPSBmYWxzZVxuICBkc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghZW5kZWQpIHtcbiAgICAgIC8vIEZpbmlzaCBpZiB0aGUgZGVzdGluYXRpb24gY2xvc2VzIGJlZm9yZSB0aGUgc291cmNlIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmaW5pc2gobmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICB9KVxuICBzcmMucGlwZShkc3QsIHtcbiAgICBlbmRcbiAgfSlcbiAgaWYgKGVuZCkge1xuICAgIC8vIENvbXBhdC4gQmVmb3JlIG5vZGUgdjEwLjEyLjAgc3RkaW8gdXNlZCB0byB0aHJvdyBhbiBlcnJvciBzb1xuICAgIC8vIHBpcGUoKSBkaWQvZG9lcyBub3QgZW5kKCkgc3RkaW8gZGVzdGluYXRpb25zLlxuICAgIC8vIE5vdyB0aGV5IGFsbG93IGl0IGJ1dCBcInNlY3JldGx5XCIgZG9uJ3QgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmQuXG4gICAgc3JjLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgZHN0LmVuZCgpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBmaW5pc2goKVxuICB9XG4gIGVvcyhcbiAgICBzcmMsXG4gICAge1xuICAgICAgcmVhZGFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScgJiZcbiAgICAgICAgclN0YXRlICYmXG4gICAgICAgIHJTdGF0ZS5lbmRlZCAmJlxuICAgICAgICAhclN0YXRlLmVycm9yZWQgJiZcbiAgICAgICAgIXJTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgICAgICkge1xuICAgICAgICAvLyBTb21lIHJlYWRhYmxlIHN0cmVhbXMgd2lsbCBlbWl0ICdjbG9zZScgYmVmb3JlICdlbmQnLiBIb3dldmVyLCBzaW5jZVxuICAgICAgICAvLyB0aGlzIGlzIG9uIHRoZSByZWFkYWJsZSBzaWRlICdlbmQnIHNob3VsZCBzdGlsbCBiZSBlbWl0dGVkIGlmIHRoZVxuICAgICAgICAvLyBzdHJlYW0gaGFzIGJlZW4gZW5kZWQgYW5kIG5vIGVycm9yIGVtaXR0ZWQuIFRoaXMgc2hvdWxkIGJlIGFsbG93ZWQgaW5cbiAgICAgICAgLy8gZmF2b3Igb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNpbmNlIHRoZSBzdHJlYW0gaXMgcGlwZWQgdG8gYVxuICAgICAgICAvLyBkZXN0aW5hdGlvbiB0aGlzIHNob3VsZCBub3QgcmVzdWx0IGluIGFueSBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIHdyaXRhYmxlIHByZW1hdHVyZSBjbG9zZSBzaW5jZVxuICAgICAgICAvLyBlb3Mgd2lsbCBvbmx5IGZhaWwgd2l0aCBwcmVtYXR1cmUgY2xvc2Ugb24gdGhlIHJlYWRpbmcgc2lkZSBmb3JcbiAgICAgICAgLy8gZHVwbGV4IHN0cmVhbXMuXG4gICAgICAgIHNyYy5vbmNlKCdlbmQnLCBmaW5pc2gpLm9uY2UoJ2Vycm9yJywgZmluaXNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoKGVycilcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgcmV0dXJuIGVvcyhcbiAgICBkc3QsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIGZpbmlzaFxuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmVJbXBsLFxuICBwaXBlbGluZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcGlwZWxpbmUgfSA9IHJlcXVpcmUoJy4vcGlwZWxpbmUnKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3QgeyBkZXN0cm95ZXIgfSA9IHJlcXVpcmUoJy4vZGVzdHJveScpXG5jb25zdCB7IGlzTm9kZVN0cmVhbSwgaXNSZWFkYWJsZSwgaXNXcml0YWJsZSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCB7XG4gIEFib3J0RXJyb3IsXG4gIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19WQUxVRSwgRVJSX01JU1NJTkdfQVJHUyB9XG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlKC4uLnN0cmVhbXMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBEdXBsZXguZnJvbShzdHJlYW1zWzBdKVxuICB9XG4gIGNvbnN0IG9yZ1N0cmVhbXMgPSBbLi4uc3RyZWFtc11cbiAgaWYgKHR5cGVvZiBzdHJlYW1zWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtc1swXSA9IER1cGxleC5mcm9tKHN0cmVhbXNbMF0pXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpZHggPSBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICBzdHJlYW1zW2lkeF0gPSBEdXBsZXguZnJvbShzdHJlYW1zW2lkeF0pXG4gIH1cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBzdHJlYW1zLmxlbmd0aDsgKytuKSB7XG4gICAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtc1tuXSkpIHtcbiAgICAgIC8vIFRPRE8ocm9uYWcpOiBBZGQgY2hlY2tzIGZvciBub24gc3RyZWFtcy5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChuIDwgc3RyZWFtcy5sZW5ndGggLSAxICYmICFpc1JlYWRhYmxlKHN0cmVhbXNbbl0pKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKGBzdHJlYW1zWyR7bn1dYCwgb3JnU3RyZWFtc1tuXSwgJ211c3QgYmUgcmVhZGFibGUnKVxuICAgIH1cbiAgICBpZiAobiA+IDAgJiYgIWlzV3JpdGFibGUoc3RyZWFtc1tuXSkpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoYHN0cmVhbXNbJHtufV1gLCBvcmdTdHJlYW1zW25dLCAnbXVzdCBiZSB3cml0YWJsZScpXG4gICAgfVxuICB9XG4gIGxldCBvbmRyYWluXG4gIGxldCBvbmZpbmlzaFxuICBsZXQgb25yZWFkYWJsZVxuICBsZXQgb25jbG9zZVxuICBsZXQgZFxuICBmdW5jdGlvbiBvbmZpbmlzaGVkKGVycikge1xuICAgIGNvbnN0IGNiID0gb25jbG9zZVxuICAgIG9uY2xvc2UgPSBudWxsXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpXG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGQuZGVzdHJveShlcnIpXG4gICAgfSBlbHNlIGlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7XG4gICAgICBkLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuICBjb25zdCBoZWFkID0gc3RyZWFtc1swXVxuICBjb25zdCB0YWlsID0gcGlwZWxpbmUoc3RyZWFtcywgb25maW5pc2hlZClcbiAgY29uc3Qgd3JpdGFibGUgPSAhIWlzV3JpdGFibGUoaGVhZClcbiAgY29uc3QgcmVhZGFibGUgPSAhIWlzUmVhZGFibGUodGFpbClcblxuICAvLyBUT0RPKHJvbmFnKTogQXZvaWQgZG91YmxlIGJ1ZmZlcmluZy5cbiAgLy8gSW1wbGVtZW50IFdyaXRhYmxlL1JlYWRhYmxlL0R1cGxleCB0cmFpdHMuXG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzM1MTUuXG4gIGQgPSBuZXcgRHVwbGV4KHtcbiAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgd3JpdGFibGVPYmplY3RNb2RlOiAhIShoZWFkICE9PSBudWxsICYmIGhlYWQgIT09IHVuZGVmaW5lZCAmJiBoZWFkLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgcmVhZGFibGVPYmplY3RNb2RlOiAhISh0YWlsICE9PSBudWxsICYmIHRhaWwgIT09IHVuZGVmaW5lZCAmJiB0YWlsLndyaXRhYmxlT2JqZWN0TW9kZSksXG4gICAgd3JpdGFibGUsXG4gICAgcmVhZGFibGVcbiAgfSlcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgZC5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGhlYWQud3JpdGUoY2h1bmssIGVuY29kaW5nKSkge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbmRyYWluID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9XG4gICAgZC5fZmluYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGhlYWQuZW5kKClcbiAgICAgIG9uZmluaXNoID0gY2FsbGJhY2tcbiAgICB9XG4gICAgaGVhZC5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25kcmFpbikge1xuICAgICAgICBjb25zdCBjYiA9IG9uZHJhaW5cbiAgICAgICAgb25kcmFpbiA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGFpbC5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uZmluaXNoKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25maW5pc2hcbiAgICAgICAgb25maW5pc2ggPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGlmIChyZWFkYWJsZSkge1xuICAgIHRhaWwub24oJ3JlYWRhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9ucmVhZGFibGUpIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbnJlYWRhYmxlXG4gICAgICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHRhaWwub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGQucHVzaChudWxsKVxuICAgIH0pXG4gICAgZC5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHRhaWwucmVhZCgpXG4gICAgICAgIGlmIChidWYgPT09IG51bGwpIHtcbiAgICAgICAgICBvbnJlYWRhYmxlID0gZC5fcmVhZFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZC5wdXNoKGJ1ZikpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWVyciAmJiBvbmNsb3NlICE9PSBudWxsKSB7XG4gICAgICBlcnIgPSBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIG9ucmVhZGFibGUgPSBudWxsXG4gICAgb25kcmFpbiA9IG51bGxcbiAgICBvbmZpbmlzaCA9IG51bGxcbiAgICBpZiAob25jbG9zZSA9PT0gbnVsbCkge1xuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbmNsb3NlID0gY2FsbGJhY2tcbiAgICAgIGRlc3Ryb3llcih0YWlsLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiBkXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBcnJheVByb3RvdHlwZVBvcCwgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzTm9kZVN0cmVhbSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy91dGlscycpXG5jb25zdCB7IHBpcGVsaW5lSW1wbDogcGwgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUnKVxuY29uc3QgeyBmaW5pc2hlZCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtJylcbmZ1bmN0aW9uIHBpcGVsaW5lKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgc2lnbmFsXG4gICAgbGV0IGVuZFxuICAgIGNvbnN0IGxhc3RBcmcgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICBpZiAobGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gJ29iamVjdCcgJiYgIWlzTm9kZVN0cmVhbShsYXN0QXJnKSAmJiAhaXNJdGVyYWJsZShsYXN0QXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5UHJvdG90eXBlUG9wKHN0cmVhbXMpXG4gICAgICBzaWduYWwgPSBvcHRpb25zLnNpZ25hbFxuICAgICAgZW5kID0gb3B0aW9ucy5lbmRcbiAgICB9XG4gICAgcGwoXG4gICAgICBzdHJlYW1zLFxuICAgICAgKGVyciwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBlbmRcbiAgICAgIH1cbiAgICApXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmluaXNoZWQsXG4gIHBpcGVsaW5lXG59XG4iLCIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IE9iamVjdERlZmluZVByb3BlcnR5LCBPYmplY3RLZXlzLCBSZWZsZWN0QXBwbHkgfSA9IHJlcXVpcmUoJy4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7XG4gIHByb21pc2lmeTogeyBjdXN0b206IGN1c3RvbVByb21pc2lmeSB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL3V0aWwnKVxuY29uc3QgeyBzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMsIHByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9vcGVyYXRvcnMnKVxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUiB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL2Vycm9ycycpXG5jb25zdCBjb21wb3NlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UnKVxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZGVzdHJveWVyIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5jb25zdCBpbnRlcm5hbEJ1ZmZlciA9IHt9XG5jb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4vc3RyZWFtL3Byb21pc2VzJylcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3V0aWxzJylcbmNvbnN0IFN0cmVhbSA9IChtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9sZWdhY3knKS5TdHJlYW0pXG5TdHJlYW0uaXNEaXN0dXJiZWQgPSB1dGlscy5pc0Rpc3R1cmJlZFxuU3RyZWFtLmlzRXJyb3JlZCA9IHV0aWxzLmlzRXJyb3JlZFxuU3RyZWFtLmlzUmVhZGFibGUgPSB1dGlscy5pc1JlYWRhYmxlXG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvcmVhZGFibGUnKVxuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0S2V5cyhzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMpKSB7XG4gIGNvbnN0IG9wID0gc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBTdHJlYW0uUmVhZGFibGUuZnJvbShSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpKVxuICB9XG4gIE9iamVjdERlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLm5hbWVcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICdsZW5ndGgnLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBvcC5sZW5ndGhcbiAgfSlcbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLlJlYWRhYmxlLnByb3RvdHlwZSwga2V5LCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBmbixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcbn1cbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdEtleXMocHJvbWlzZVJldHVybmluZ09wZXJhdG9ycykpIHtcbiAgY29uc3Qgb3AgPSBwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzW2tleV1cbiAgZnVuY3Rpb24gZm4oLi4uYXJncykge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUigpXG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0QXBwbHkob3AsIHRoaXMsIGFyZ3MpXG4gIH1cbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubmFtZVxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLmxlbmd0aFxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0uUmVhZGFibGUucHJvdG90eXBlLCBrZXksIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IGZuLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3dyaXRhYmxlJylcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZHVwbGV4JylcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvdHJhbnNmb3JtJylcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaCcpXG5TdHJlYW0ucGlwZWxpbmUgPSBwaXBlbGluZVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2FkZC1hYm9ydC1zaWduYWwnKVxuU3RyZWFtLmFkZEFib3J0U2lnbmFsID0gYWRkQWJvcnRTaWduYWxcblN0cmVhbS5maW5pc2hlZCA9IGVvc1xuU3RyZWFtLmRlc3Ryb3kgPSBkZXN0cm95ZXJcblN0cmVhbS5jb21wb3NlID0gY29tcG9zZVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzXG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0eShwaXBlbGluZSwgY3VzdG9tUHJvbWlzaWZ5LCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9taXNlcy5waXBlbGluZVxuICB9XG59KVxuT2JqZWN0RGVmaW5lUHJvcGVydHkoZW9zLCBjdXN0b21Qcm9taXNpZnksIHtcbiAgX19wcm90b19fOiBudWxsLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHByb21pc2VzLmZpbmlzaGVkXG4gIH1cbn0pXG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtXG5TdHJlYW0uX2lzVWludDhBcnJheSA9IGZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5TdHJlYW0uX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IGZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuaWYgKFN0cmVhbSAmJiBwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU0gPT09ICdkaXNhYmxlJykge1xuICBjb25zdCBwcm9taXNlcyA9IFN0cmVhbS5wcm9taXNlc1xuXG4gIC8vIEV4cGxpY2l0IGV4cG9ydCBuYW1pbmcgaXMgbmVlZGVkIGZvciBFU01cbiAgbW9kdWxlLmV4cG9ydHMuX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyXG4gIG1vZHVsZS5leHBvcnRzLl9pc1VpbnQ4QXJyYXkgPSBTdHJlYW0uX2lzVWludDhBcnJheVxuICBtb2R1bGUuZXhwb3J0cy5pc0Rpc3R1cmJlZCA9IFN0cmVhbS5pc0Rpc3R1cmJlZFxuICBtb2R1bGUuZXhwb3J0cy5pc0Vycm9yZWQgPSBTdHJlYW0uaXNFcnJvcmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBTdHJlYW0uaXNSZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5SZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5Xcml0YWJsZSA9IFN0cmVhbS5Xcml0YWJsZVxuICBtb2R1bGUuZXhwb3J0cy5EdXBsZXggPSBTdHJlYW0uRHVwbGV4XG4gIG1vZHVsZS5leHBvcnRzLlRyYW5zZm9ybSA9IFN0cmVhbS5UcmFuc2Zvcm1cbiAgbW9kdWxlLmV4cG9ydHMuUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbiAgbW9kdWxlLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBTdHJlYW0uYWRkQWJvcnRTaWduYWxcbiAgbW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBTdHJlYW0uZmluaXNoZWRcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IFN0cmVhbS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzLnBpcGVsaW5lID0gU3RyZWFtLnBpcGVsaW5lXG4gIG1vZHVsZS5leHBvcnRzLmNvbXBvc2UgPSBTdHJlYW0uY29tcG9zZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHByb21pc2VzXG4gICAgfVxuICB9KVxuICBtb2R1bGUuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0uU3RyZWFtXG59IGVsc2Uge1xuICBjb25zdCBDdXN0b21TdHJlYW0gPSByZXF1aXJlKCcuLi9zdHJlYW0nKVxuICBjb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4uL3N0cmVhbS9wcm9taXNlcycpXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG5cbiAgLy8gRXhwbGljaXQgZXhwb3J0IG5hbWluZyBpcyBuZWVkZWQgZm9yIEVTTVxuICBtb2R1bGUuZXhwb3J0cy5fdWludDhBcnJheVRvQnVmZmVyID0gQ3VzdG9tU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXJcbiAgbW9kdWxlLmV4cG9ydHMuX2lzVWludDhBcnJheSA9IEN1c3RvbVN0cmVhbS5faXNVaW50OEFycmF5XG4gIG1vZHVsZS5leHBvcnRzLmlzRGlzdHVyYmVkID0gQ3VzdG9tU3RyZWFtLmlzRGlzdHVyYmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzRXJyb3JlZCA9IEN1c3RvbVN0cmVhbS5pc0Vycm9yZWRcbiAgbW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IEN1c3RvbVN0cmVhbS5pc1JlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLlJlYWRhYmxlID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLldyaXRhYmxlID0gQ3VzdG9tU3RyZWFtLldyaXRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLkR1cGxleCA9IEN1c3RvbVN0cmVhbS5EdXBsZXhcbiAgbW9kdWxlLmV4cG9ydHMuVHJhbnNmb3JtID0gQ3VzdG9tU3RyZWFtLlRyYW5zZm9ybVxuICBtb2R1bGUuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IEN1c3RvbVN0cmVhbS5QYXNzVGhyb3VnaFxuICBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IEN1c3RvbVN0cmVhbS5hZGRBYm9ydFNpZ25hbFxuICBtb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IEN1c3RvbVN0cmVhbS5maW5pc2hlZFxuICBtb2R1bGUuZXhwb3J0cy5kZXN0cm95ID0gQ3VzdG9tU3RyZWFtLmRlc3Ryb3lcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IG9yaWdpbmFsRGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IEN1c3RvbVN0cmVhbS5waXBlbGluZVxuICBtb2R1bGUuZXhwb3J0cy5jb21wb3NlID0gQ3VzdG9tU3RyZWFtLmNvbXBvc2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbVN0cmVhbSwgJ3Byb21pc2VzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH1cbiAgfSlcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gQ3VzdG9tU3RyZWFtLlN0cmVhbVxufVxuXG4vLyBBbGxvdyBkZWZhdWx0IGltcG9ydGluZ1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzXG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcignQnVmZmVyTGlzdCcpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QgKGJ1Zikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyTGlzdCkpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpc3QoYnVmKVxuICB9XG5cbiAgQnVmZmVyTGlzdC5faW5pdC5jYWxsKHRoaXMsIGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5faW5pdCA9IGZ1bmN0aW9uIF9pbml0IChidWYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN5bWJvbCwgeyB2YWx1ZTogdHJ1ZSB9KVxuXG4gIHRoaXMuX2J1ZnMgPSBbXVxuICB0aGlzLmxlbmd0aCA9IDBcblxuICBpZiAoYnVmKSB7XG4gICAgdGhpcy5hcHBlbmQoYnVmKVxuICB9XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiBfbmV3IChidWYpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0KGJ1Zilcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX29mZnNldCA9IGZ1bmN0aW9uIF9vZmZzZXQgKG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgcmV0dXJuIFswLCAwXVxuICB9XG5cbiAgbGV0IHRvdCA9IDBcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBfdCA9IHRvdCArIHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgaWYgKG9mZnNldCA8IF90IHx8IGkgPT09IHRoaXMuX2J1ZnMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIFtpLCBvZmZzZXQgLSB0b3RdXG4gICAgfVxuICAgIHRvdCA9IF90XG4gIH1cbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX3JldmVyc2VPZmZzZXQgPSBmdW5jdGlvbiAoYmxPZmZzZXQpIHtcbiAgY29uc3QgYnVmZmVySWQgPSBibE9mZnNldFswXVxuICBsZXQgb2Zmc2V0ID0gYmxPZmZzZXRbMV1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcklkOyBpKyspIHtcbiAgICBvZmZzZXQgKz0gdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpbmRleCkge1xuICBpZiAoaW5kZXggPiB0aGlzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQoaW5kZXgpXG5cbiAgcmV0dXJuIHRoaXMuX2J1ZnNbb2Zmc2V0WzBdXVtvZmZzZXRbMV1dXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicgJiYgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5kID09PSAnbnVtYmVyJyAmJiBlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhpcy5jb3B5KG51bGwsIDAsIHN0YXJ0LCBlbmQpXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkc3QsIGRzdFN0YXJ0LCBzcmNTdGFydCwgc3JjRW5kKSB7XG4gIGlmICh0eXBlb2Ygc3JjU3RhcnQgIT09ICdudW1iZXInIHx8IHNyY1N0YXJ0IDwgMCkge1xuICAgIHNyY1N0YXJ0ID0gMFxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcmNFbmQgIT09ICdudW1iZXInIHx8IHNyY0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgc3JjRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzcmNTdGFydCA+PSB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiBkc3QgfHwgQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICBpZiAoc3JjRW5kIDw9IDApIHtcbiAgICByZXR1cm4gZHN0IHx8IEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgY29uc3QgY29weSA9ICEhZHN0XG4gIGNvbnN0IG9mZiA9IHRoaXMuX29mZnNldChzcmNTdGFydClcbiAgY29uc3QgbGVuID0gc3JjRW5kIC0gc3JjU3RhcnRcbiAgbGV0IGJ5dGVzID0gbGVuXG4gIGxldCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICBsZXQgc3RhcnQgPSBvZmZbMV1cblxuICAvLyBjb3B5L3NsaWNlIGV2ZXJ5dGhpbmdcbiAgaWYgKHNyY1N0YXJ0ID09PSAwICYmIHNyY0VuZCA9PT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIHtcbiAgICAgIC8vIHNsaWNlLCBidXQgZnVsbCBjb25jYXQgaWYgbXVsdGlwbGUgYnVmZmVyc1xuICAgICAgcmV0dXJuIHRoaXMuX2J1ZnMubGVuZ3RoID09PSAxXG4gICAgICAgID8gdGhpcy5fYnVmc1swXVxuICAgICAgICA6IEJ1ZmZlci5jb25jYXQodGhpcy5fYnVmcywgdGhpcy5sZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gY29weSwgbmVlZCB0byBjb3B5IGluZGl2aWR1YWwgYnVmZmVyc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmKVxuICAgICAgYnVmb2ZmICs9IHRoaXMuX2J1ZnNbaV0ubGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdFxuICB9XG5cbiAgLy8gZWFzeSwgY2hlYXAgY2FzZSB3aGVyZSBpdCdzIGEgc3Vic2V0IG9mIG9uZSBvZiB0aGUgYnVmZmVyc1xuICBpZiAoYnl0ZXMgPD0gdGhpcy5fYnVmc1tvZmZbMF1dLmxlbmd0aCAtIHN0YXJ0KSB7XG4gICAgcmV0dXJuIGNvcHlcbiAgICAgID8gdGhpcy5fYnVmc1tvZmZbMF1dLmNvcHkoZHN0LCBkc3RTdGFydCwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICA6IHRoaXMuX2J1ZnNbb2ZmWzBdXS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgfVxuXG4gIGlmICghY29weSkge1xuICAgIC8vIGEgc2xpY2UsIHdlIG5lZWQgc29tZXRoaW5nIHRvIGNvcHkgaW4gdG9cbiAgICBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IG9mZlswXTsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsID0gdGhpcy5fYnVmc1tpXS5sZW5ndGggLSBzdGFydFxuXG4gICAgaWYgKGJ5dGVzID4gbCkge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydClcbiAgICAgIGJ1Zm9mZiArPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbaV0uY29weShkc3QsIGJ1Zm9mZiwgc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gICAgICBidWZvZmYgKz0gbFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBieXRlcyAtPSBsXG5cbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMFxuICAgIH1cbiAgfVxuXG4gIC8vIHNhZmVndWFyZCBzbyB0aGF0IHdlIGRvbid0IHJldHVybiB1bmluaXRpYWxpemVkIG1lbW9yeVxuICBpZiAoZHN0Lmxlbmd0aCA+IGJ1Zm9mZikgcmV0dXJuIGRzdC5zbGljZSgwLCBidWZvZmYpXG5cbiAgcmV0dXJuIGRzdFxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGFsbG93U2xpY2UgPSBmdW5jdGlvbiBzaGFsbG93U2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwXG4gIGVuZCA9IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gdGhpcy5sZW5ndGggOiBlbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiB0aGlzLl9uZXcoKVxuICB9XG5cbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSB0aGlzLl9vZmZzZXQoc3RhcnQpXG4gIGNvbnN0IGVuZE9mZnNldCA9IHRoaXMuX29mZnNldChlbmQpXG4gIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9idWZzLnNsaWNlKHN0YXJ0T2Zmc2V0WzBdLCBlbmRPZmZzZXRbMF0gKyAxKVxuXG4gIGlmIChlbmRPZmZzZXRbMV0gPT09IDApIHtcbiAgICBidWZmZXJzLnBvcCgpXG4gIH0gZWxzZSB7XG4gICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZE9mZnNldFsxXSlcbiAgfVxuXG4gIGlmIChzdGFydE9mZnNldFsxXSAhPT0gMCkge1xuICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHN0YXJ0T2Zmc2V0WzFdKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuX25ldyhidWZmZXJzKVxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIC8vIGZpcnN0LCBub3JtYWxpemUgdGhlIGFyZ3VtZW50LCBpbiBhY2NvcmRhbmNlIHdpdGggaG93IEJ1ZmZlciBkb2VzIGl0XG4gIGJ5dGVzID0gTWF0aC50cnVuYyhieXRlcylcbiAgLy8gZG8gbm90aGluZyBpZiBub3QgYSBwb3NpdGl2ZSBudW1iZXJcbiAgaWYgKE51bWJlci5pc05hTihieXRlcykgfHwgYnl0ZXMgPD0gMCkgcmV0dXJuIHRoaXNcblxuICB3aGlsZSAodGhpcy5fYnVmcy5sZW5ndGgpIHtcbiAgICBpZiAoYnl0ZXMgPj0gdGhpcy5fYnVmc1swXS5sZW5ndGgpIHtcbiAgICAgIGJ5dGVzIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLmxlbmd0aCAtPSB0aGlzLl9idWZzWzBdLmxlbmd0aFxuICAgICAgdGhpcy5fYnVmcy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2J1ZnNbMF0gPSB0aGlzLl9idWZzWzBdLnNsaWNlKGJ5dGVzKVxuICAgICAgdGhpcy5sZW5ndGggLT0gYnl0ZXNcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZHVwbGljYXRlID0gZnVuY3Rpb24gZHVwbGljYXRlICgpIHtcbiAgY29uc3QgY29weSA9IHRoaXMuX25ldygpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29weS5hcHBlbmQodGhpcy5fYnVmc1tpXSlcbiAgfVxuXG4gIHJldHVybiBjb3B5XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoYnVmKSB7XG4gIGlmIChidWYgPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAoYnVmLmJ1ZmZlcikge1xuICAgIC8vIGFwcGVuZCBhIHZpZXcgb2YgdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKSlcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGJ1ZikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmW2ldKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLl9pc0J1ZmZlckxpc3QoYnVmKSkge1xuICAgIC8vIHVud3JhcCBhcmd1bWVudCBpbnRvIGluZGl2aWR1YWwgQnVmZmVyTGlzdHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcHBlbmQoYnVmLl9idWZzW2ldKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjb2VyY2UgbnVtYmVyIGFyZ3VtZW50cyB0byBzdHJpbmdzLCBzaW5jZSBCdWZmZXIobnVtYmVyKSBkb2VzXG4gICAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvblxuICAgIGlmICh0eXBlb2YgYnVmID09PSAnbnVtYmVyJykge1xuICAgICAgYnVmID0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoQnVmZmVyLmZyb20oYnVmKSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9hcHBlbmRCdWZmZXIgPSBmdW5jdGlvbiBhcHBlbmRCdWZmZXIgKGJ1Zikge1xuICB0aGlzLl9idWZzLnB1c2goYnVmKVxuICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkoc2VhcmNoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQnVmZmVyTGlzdCwgb3IgVWludDhBcnJheS4nKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWFyY2ggPT09ICdudW1iZXInKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oW3NlYXJjaF0pXG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICBzZWFyY2ggPSBCdWZmZXIuZnJvbShzZWFyY2gsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKHRoaXMuX2lzQnVmZmVyTGlzdChzZWFyY2gpKSB7XG4gICAgc2VhcmNoID0gc2VhcmNoLnNsaWNlKClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaC5idWZmZXIpKSB7XG4gICAgc2VhcmNoID0gQnVmZmVyLmZyb20oc2VhcmNoLmJ1ZmZlciwgc2VhcmNoLmJ5dGVPZmZzZXQsIHNlYXJjaC5ieXRlTGVuZ3RoKVxuICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgIHNlYXJjaCA9IEJ1ZmZlci5mcm9tKHNlYXJjaClcbiAgfVxuXG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQgfHwgMClcblxuICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IDBcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gdGhpcy5sZW5ndGggKyBvZmZzZXRcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgb2Zmc2V0ID0gMFxuICB9XG5cbiAgaWYgKHNlYXJjaC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2Zmc2V0ID4gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aCA6IG9mZnNldFxuICB9XG5cbiAgY29uc3QgYmxPZmZzZXQgPSB0aGlzLl9vZmZzZXQob2Zmc2V0KVxuICBsZXQgYmxJbmRleCA9IGJsT2Zmc2V0WzBdIC8vIGluZGV4IG9mIHdoaWNoIGludGVybmFsIGJ1ZmZlciB3ZSdyZSB3b3JraW5nIG9uXG4gIGxldCBidWZmT2Zmc2V0ID0gYmxPZmZzZXRbMV0gLy8gb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgd2UncmUgd29ya2luZyBvblxuXG4gIC8vIHNjYW4gb3ZlciBlYWNoIGJ1ZmZlclxuICBmb3IgKDsgYmxJbmRleCA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBibEluZGV4KyspIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5fYnVmc1tibEluZGV4XVxuXG4gICAgd2hpbGUgKGJ1ZmZPZmZzZXQgPCBidWZmLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlV2luZG93ID0gYnVmZi5sZW5ndGggLSBidWZmT2Zmc2V0XG5cbiAgICAgIGlmIChhdmFpbGFibGVXaW5kb3cgPj0gc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuYXRpdmVTZWFyY2hSZXN1bHQgPSBidWZmLmluZGV4T2Yoc2VhcmNoLCBidWZmT2Zmc2V0KVxuXG4gICAgICAgIGlmIChuYXRpdmVTZWFyY2hSZXN1bHQgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIG5hdGl2ZVNlYXJjaFJlc3VsdF0pXG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0ID0gYnVmZi5sZW5ndGggLSBzZWFyY2gubGVuZ3RoICsgMSAvLyBlbmQgb2YgbmF0aXZlIHNlYXJjaCB3aW5kb3dcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJldk9mZnNldCA9IHRoaXMuX3JldmVyc2VPZmZzZXQoW2JsSW5kZXgsIGJ1ZmZPZmZzZXRdKVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXRjaChyZXZPZmZzZXQsIHNlYXJjaCkpIHtcbiAgICAgICAgICByZXR1cm4gcmV2T2Zmc2V0XG4gICAgICAgIH1cblxuICAgICAgICBidWZmT2Zmc2V0KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBidWZmT2Zmc2V0ID0gMFxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9tYXRjaCA9IGZ1bmN0aW9uIChvZmZzZXQsIHNlYXJjaCkge1xuICBpZiAodGhpcy5sZW5ndGggLSBvZmZzZXQgPCBzZWFyY2gubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBzZWFyY2hPZmZzZXQgPSAwOyBzZWFyY2hPZmZzZXQgPCBzZWFyY2gubGVuZ3RoOyBzZWFyY2hPZmZzZXQrKykge1xuICAgIGlmICh0aGlzLmdldChvZmZzZXQgKyBzZWFyY2hPZmZzZXQpICE9PSBzZWFyY2hbc2VhcmNoT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbjsoZnVuY3Rpb24gKCkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIHJlYWREb3VibGVCRTogOCxcbiAgICByZWFkRG91YmxlTEU6IDgsXG4gICAgcmVhZEZsb2F0QkU6IDQsXG4gICAgcmVhZEZsb2F0TEU6IDQsXG4gICAgcmVhZEJpZ0ludDY0QkU6IDgsXG4gICAgcmVhZEJpZ0ludDY0TEU6IDgsXG4gICAgcmVhZEJpZ1VJbnQ2NEJFOiA4LFxuICAgIHJlYWRCaWdVSW50NjRMRTogOCxcbiAgICByZWFkSW50MzJCRTogNCxcbiAgICByZWFkSW50MzJMRTogNCxcbiAgICByZWFkVUludDMyQkU6IDQsXG4gICAgcmVhZFVJbnQzMkxFOiA0LFxuICAgIHJlYWRJbnQxNkJFOiAyLFxuICAgIHJlYWRJbnQxNkxFOiAyLFxuICAgIHJlYWRVSW50MTZCRTogMixcbiAgICByZWFkVUludDE2TEU6IDIsXG4gICAgcmVhZEludDg6IDEsXG4gICAgcmVhZFVJbnQ4OiAxLFxuICAgIHJlYWRJbnRCRTogbnVsbCxcbiAgICByZWFkSW50TEU6IG51bGwsXG4gICAgcmVhZFVJbnRCRTogbnVsbCxcbiAgICByZWFkVUludExFOiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IG0gaW4gbWV0aG9kcykge1xuICAgIChmdW5jdGlvbiAobSkge1xuICAgICAgaWYgKG1ldGhvZHNbbV0gPT09IG51bGwpIHtcbiAgICAgICAgQnVmZmVyTGlzdC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbiAob2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKVttXSgwLCBieXRlTGVuZ3RoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBCdWZmZXJMaXN0LnByb3RvdHlwZVttXSA9IGZ1bmN0aW9uIChvZmZzZXQgPSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtZXRob2RzW21dKVttXSgwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfShtKSlcbiAgfVxufSgpKVxuXG4vLyBVc2VkIGludGVybmFsbHkgYnkgdGhlIGNsYXNzIGFuZCBhbHNvIGFzIGFuIGluZGljYXRvciBvZiB0aGlzIG9iamVjdCBiZWluZ1xuLy8gYSBgQnVmZmVyTGlzdGAuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJMaXN0YCBpbiBhIGJyb3dzZXJcbi8vIGVudmlyb25tZW50IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGVcbi8vIEJ1ZmZlckxpc3QgY2xhc3MgYW5kIHNvbWUgYEJ1ZmZlckxpc3RgcyBtaWdodCBiZSBgQnVmZmVyTGlzdGBzLlxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX2lzQnVmZmVyTGlzdCA9IGZ1bmN0aW9uIF9pc0J1ZmZlckxpc3QgKGIpIHtcbiAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCdWZmZXJMaXN0IHx8IEJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0KGIpXG59XG5cbkJ1ZmZlckxpc3QuaXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gaXNCdWZmZXJMaXN0IChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYltzeW1ib2xdXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyTGlzdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IER1cGxleFN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLkR1cGxleFxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5jb25zdCBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9CdWZmZXJMaXN0JylcblxuZnVuY3Rpb24gQnVmZmVyTGlzdFN0cmVhbSAoY2FsbGJhY2spIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0pKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcblxuICAgIGNvbnN0IHBpcGVyID0gZnVuY3Rpb24gcGlwZXIgKGVycikge1xuICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrKGVycilcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLm9uKCdwaXBlJywgZnVuY3Rpb24gb25QaXBlIChzcmMpIHtcbiAgICAgIHNyYy5vbignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuICAgIHRoaXMub24oJ3VucGlwZScsIGZ1bmN0aW9uIG9uVW5waXBlIChzcmMpIHtcbiAgICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBwaXBlcilcbiAgICB9KVxuXG4gICAgY2FsbGJhY2sgPSBudWxsXG4gIH1cblxuICBCdWZmZXJMaXN0Ll9pbml0LmNhbGwodGhpcywgY2FsbGJhY2spXG4gIER1cGxleFN0cmVhbS5jYWxsKHRoaXMpXG59XG5cbmluaGVyaXRzKEJ1ZmZlckxpc3RTdHJlYW0sIER1cGxleFN0cmVhbSlcbk9iamVjdC5hc3NpZ24oQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUsIEJ1ZmZlckxpc3QucHJvdG90eXBlKVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fbmV3ID0gZnVuY3Rpb24gX25ldyAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXJMaXN0U3RyZWFtKGNhbGxiYWNrKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiBfd3JpdGUgKGJ1ZiwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2FwcGVuZEJ1ZmZlcihidWYpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIF9yZWFkIChzaXplKSB7XG4gIGlmICghdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpXG4gIH1cblxuICBzaXplID0gTWF0aC5taW4oc2l6ZSwgdGhpcy5sZW5ndGgpXG4gIHRoaXMucHVzaCh0aGlzLnNsaWNlKDAsIHNpemUpKVxuICB0aGlzLmNvbnN1bWUoc2l6ZSlcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kIChjaHVuaykge1xuICBEdXBsZXhTdHJlYW0ucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGNodW5rKVxuXG4gIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHRoaXMuc2xpY2UoKSlcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcbiAgfVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIF9kZXN0cm95IChlcnIsIGNiKSB7XG4gIHRoaXMuX2J1ZnMubGVuZ3RoID0gMFxuICB0aGlzLmxlbmd0aCA9IDBcbiAgY2IoZXJyKVxufVxuXG5CdWZmZXJMaXN0U3RyZWFtLnByb3RvdHlwZS5faXNCdWZmZXJMaXN0ID0gZnVuY3Rpb24gX2lzQnVmZmVyTGlzdCAoYikge1xuICByZXR1cm4gYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3RTdHJlYW0gfHwgYiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3QgfHwgQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QoYilcbn1cblxuQnVmZmVyTGlzdFN0cmVhbS5pc0J1ZmZlckxpc3QgPSBCdWZmZXJMaXN0LmlzQnVmZmVyTGlzdFxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlckxpc3RTdHJlYW1cbm1vZHVsZS5leHBvcnRzLkJ1ZmZlckxpc3RTdHJlYW0gPSBCdWZmZXJMaXN0U3RyZWFtXG5tb2R1bGUuZXhwb3J0cy5CdWZmZXJMaXN0ID0gQnVmZmVyTGlzdFxuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsIm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgPyBwcm9jZXNzLm5leHRUaWNrLmJpbmQocHJvY2VzcylcbiAgOiByZXF1aXJlKCcuL3F1ZXVlLW1pY3JvdGFzaycpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEZpeGVkRklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICBpZiAoIShod20gPiAwKSB8fCAoKGh3bSAtIDEpICYgaHdtKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdNYXggc2l6ZSBmb3IgYSBGaXhlZEZJRk8gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvJylcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShod20pXG4gICAgdGhpcy5tYXNrID0gaHdtIC0gMVxuICAgIHRoaXMudG9wID0gMFxuICAgIHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5idWZmZXJbdGhpcy50b3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuYnVmZmVyW3RoaXMudG9wXSA9IGRhdGFcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnRtID0gKHRoaXMuYnRtICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gbGFzdFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9PT0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICB9XG5cbiAgcHVzaCAodmFsKSB7XG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFpbC5wZWVrKClcbiAgfVxuXG4gIGlzRW1wdHkgKCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpXG4gIH1cbn1cbiIsImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjYgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxMyBmcm9tIHJlYWQsIGFuZCA5IGZyb20gd3JpdGUpXG5jb25zdCBNQVggPSAoKDEgPDwgMjYpIC0gMSlcblxuLy8gU2hhcmVkIHN0YXRlXG5jb25zdCBPUEVOSU5HICAgICAgID0gMGIwMDAxXG5jb25zdCBQUkVERVNUUk9ZSU5HID0gMGIwMDEwXG5jb25zdCBERVNUUk9ZSU5HICAgID0gMGIwMTAwXG5jb25zdCBERVNUUk9ZRUQgICAgID0gMGIxMDAwXG5cbmNvbnN0IE5PVF9PUEVOSU5HID0gTUFYIF4gT1BFTklOR1xuY29uc3QgTk9UX1BSRURFU1RST1lJTkcgPSBNQVggXiBQUkVERVNUUk9ZSU5HXG5cbi8vIFJlYWQgc3RhdGUgKDQgYml0IG9mZnNldCBmcm9tIHNoYXJlZCBzdGF0ZSlcbmNvbnN0IFJFQURfQUNUSVZFICAgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMSA8PCA0XG5jb25zdCBSRUFEX1BSSU1BUlkgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9TWU5DICAgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMTAwIDw8IDRcbmNvbnN0IFJFQURfUVVFVUVEICAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMCA8PCA0XG5jb25zdCBSRUFEX1JFU1VNRUQgICAgICAgICAgPSAwYjAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMTAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU5ESU5HICAgICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRfREFUQSAgICAgICAgPSAwYjAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMTAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVFRFRF9SRUFEQUJMRSA9IDBiMDAwMTAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0RPTkUgICAgICAgICAgICAgPSAwYjAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMTAwMDAwMDAwMDAxIDw8IDQgLy8gYWxzbyBhY3RpdmVcbmNvbnN0IFJFQURfTkVFRFNfUFVTSCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMCA8PCA0XG5cbi8vIENvbWJpbmVkIHJlYWQgc3RhdGVcbmNvbnN0IFJFQURfRkxPV0lORyA9IFJFQURfUkVTVU1FRCB8IFJFQURfUElQRV9EUkFJTkVEXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQyA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DXG5jb25zdCBSRUFEX0FDVElWRV9BTkRfU1lOQ19BTkRfTkVFRFNfUFVTSCA9IFJFQURfQUNUSVZFIHwgUkVBRF9TWU5DIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSA9IFJFQURfUFJJTUFSWSB8IFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCA9IFJFQURfRU1JVF9SRUFEQUJMRSB8IFJFQURfUVVFVUVEXG5cbmNvbnN0IFJFQURfTk9UX0FDVElWRSAgICAgICAgICAgICA9IE1BWCBeIFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX05PTl9QUklNQVJZICAgICAgICAgICAgPSBNQVggXiBSRUFEX1BSSU1BUllcbmNvbnN0IFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRCA9IE1BWCBeIChSRUFEX1BSSU1BUlkgfCBSRUFEX05FRURTX1BVU0gpXG5jb25zdCBSRUFEX05PVF9TWU5DICAgICAgICAgICAgICAgPSBNQVggXiBSRUFEX1NZTkNcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuXG4vLyBXcml0ZSBzdGF0ZSAoMTcgYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxMyBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDEgPDwgMTdcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAxMCA8PCAxN1xuY29uc3QgV1JJVEVfU1lOQyAgICAgICA9IDBiMDAwMDAwMTAwIDw8IDE3XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDEwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX1VORFJBSU5FRCAgPSAwYjAwMDAxMDAwMCA8PCAxN1xuY29uc3QgV1JJVEVfRE9ORSAgICAgICA9IDBiMDAwMTAwMDAwIDw8IDE3XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDEwMDAwMDAgPDwgMTdcbmNvbnN0IFdSSVRFX05FWFRfVElDSyAgPSAwYjAxMDAwMDAwMSA8PCAxNyAvLyBhbHNvIGFjdGl2ZVxuY29uc3QgV1JJVEVfRklOSVNISU5HICA9IDBiMTAwMDAwMDAwIDw8IDE3XG5cbmNvbnN0IFdSSVRFX05PVF9BQ1RJVkUgICAgPSBNQVggXiBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX05PVF9TWU5DICAgICAgPSBNQVggXiBXUklURV9TWU5DXG5jb25zdCBXUklURV9OT05fUFJJTUFSWSAgID0gTUFYIF4gV1JJVEVfUFJJTUFSWVxuY29uc3QgV1JJVEVfTk9UX0ZJTklTSElORyA9IE1BWCBeIFdSSVRFX0ZJTklTSElOR1xuY29uc3QgV1JJVEVfRFJBSU5FRCAgICAgICA9IE1BWCBeIFdSSVRFX1VORFJBSU5FRFxuY29uc3QgV1JJVEVfTk9UX1FVRVVFRCAgICA9IE1BWCBeIFdSSVRFX1FVRVVFRFxuY29uc3QgV1JJVEVfTk9UX05FWFRfVElDSyA9IE1BWCBeIFdSSVRFX05FWFRfVElDS1xuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfU1lOQyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1NZTkNcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuXG5jb25zdCBhc3luY0l0ZXJhdG9yID0gU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgU3ltYm9sKCdhc3luY0l0ZXJhdG9yJylcblxuY2xhc3MgV3JpdGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBXcml0YWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFdyaXRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFdyaXRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFdyaXRhYmxlIHx8IG1hcFxuICAgIHRoaXMuYWZ0ZXJXcml0ZSA9IGFmdGVyV3JpdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljayA9IHVwZGF0ZVdyaXRlTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RPTkUpICE9PSAwXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBpZiAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyaykge1xuICAgICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1FVRVVFRFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORURcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1FVRVVFRFxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zdHJlYW0ub25jZSgnZmluaXNoJywgZGF0YSlcbiAgICBlbHNlIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlID0gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFdSSVRFX0ZJTklTSElORykgJiBXUklURV9OT05fUFJJTUFSWVxuICB9XG5cbiAgYXV0b0JhdGNoIChkYXRhLCBjYikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEX0FORF9BQ1RJVkUpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIE9QRU5fU1RBVFVTKSAhPT0gMCkgcmV0dXJuIGNiKG51bGwpXG4gICAgc3RyZWFtLl93cml0ZXYoYnVmZmVyLCBjYilcbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NUQVRVUykgPT09IFdSSVRFX1FVRVVFRCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1NZTkNcbiAgICAgIHN0cmVhbS5fd3JpdGUoZGF0YSwgdGhpcy5hZnRlcldyaXRlKVxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfU1lOQ1xuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRklOSVNISU5HX1NUQVRVUykgPT09IFdSSVRFX0ZJTklTSElORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfQUNUSVZFKSAmIFdSSVRFX05PVF9GSU5JU0hJTkdcbiAgICAgIHN0cmVhbS5fZmluYWwoYWZ0ZXJGaW5hbC5iaW5kKHRoaXMpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX05FWFRfVElDSykgIT09IDApIHJldHVyblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ORVhUX1RJQ0tcbiAgICBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFJlYWRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwUmVhZGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhSZWFkYWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhSZWFkYWJsZSB8fCBieXRlTGVuZ3RoIHx8IGRlZmF1bHRCeXRlTGVuZ3RoXG4gICAgdGhpcy5tYXAgPSBtYXBSZWFkYWJsZSB8fCBtYXBcbiAgICB0aGlzLnBpcGVUbyA9IG51bGxcbiAgICB0aGlzLmFmdGVyUmVhZCA9IGFmdGVyUmVhZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlUmVhZE5ULmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBlbmRlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpICE9PSAwXG4gIH1cblxuICBwaXBlIChwaXBlVG8sIGNiKSB7XG4gICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBpcGUgdG8gb25lIGRlc3RpbmF0aW9uJylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG51bGxcblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICAgIHRoaXMucGlwZVRvID0gcGlwZVRvXG4gICAgdGhpcy5waXBlbGluZSA9IG5ldyBQaXBlbGluZSh0aGlzLnN0cmVhbSwgcGlwZVRvLCBjYilcblxuICAgIGlmIChjYikgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcblxuICAgIGlmIChpc1N0cmVhbXgocGlwZVRvKSkge1xuICAgICAgcGlwZVRvLl93cml0YWJsZVN0YXRlLnBpcGVsaW5lID0gdGhpcy5waXBlbGluZVxuICAgICAgaWYgKGNiKSBwaXBlVG8ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcbiAgICAgIHBpcGVUby5vbignZmluaXNoJywgdGhpcy5waXBlbGluZS5maW5pc2hlZC5iaW5kKHRoaXMucGlwZWxpbmUpKSAvLyBUT0RPOiBqdXN0IGNhbGwgZmluaXNoZWQgZnJvbSBwaXBlVG8gaXRzZWxmXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9uZXJyb3IgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8pXG4gICAgICBjb25zdCBvbmNsb3NlID0gdGhpcy5waXBlbGluZS5kb25lLmJpbmQodGhpcy5waXBlbGluZSwgcGlwZVRvLCBudWxsKSAvLyBvbmNsb3NlIGhhcyBhIHdlaXJkIGJvb2wgYXJnXG4gICAgICBwaXBlVG8ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIHBpcGVUby5vbignY2xvc2UnLCBvbmNsb3NlKVxuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpXG4gICAgfVxuXG4gICAgcGlwZVRvLm9uKCdkcmFpbicsIGFmdGVyRHJhaW4uYmluZCh0aGlzKSlcbiAgICB0aGlzLnN0cmVhbS5lbWl0KCdwaXBpbmcnLCBwaXBlVG8pXG4gICAgcGlwZVRvLmVtaXQoJ3BpcGUnLCB0aGlzLnN0cmVhbSlcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRU5ESU5HKSAmIFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIHRoaXMucXVldWUucHVzaChkYXRhKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9RVUVVRUQpICYgUkVBRF9QVVNIRURcblxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrXG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucXVldWUuc2hpZnQoKVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICBpZiAodGhpcy5idWZmZXJlZCA9PT0gMCkgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX1FVRVVFRFxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgbGV0IHRhaWxcbiAgICBjb25zdCBwZW5kaW5nID0gW11cblxuICAgIHdoaWxlICgodGFpbCA9IHRoaXMucXVldWUuc2hpZnQoKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGVuZGluZy5wdXNoKHRhaWwpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKGRhdGEpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucXVldWUucHVzaChwZW5kaW5nW2ldKVxuICAgIH1cbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkcmFpbiAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0ZMT1dJTkcpICE9PSAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgdGhpcy5kcmFpbigpXG5cbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyayAmJiAoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFNIT1VMRF9OT1RfUkVBRCkgPT09IDApIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX1NZTkNfQU5EX05FRURTX1BVU0hcbiAgICAgIHN0cmVhbS5fcmVhZCh0aGlzLmFmdGVyUmVhZClcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfU1lOQ1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkUpID09PSAwKSB0aGlzLmRyYWluKClcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFQURBQkxFX1NUQVRVUykgPT09IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJylcbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTkRJTkdfU1RBVFVTKSA9PT0gUkVBRF9FTkRJTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRE9ORSkgJiBSRUFEX05PVF9FTkRJTkdcbiAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZSU5HXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRoaXMucGlwZVRvLmVuZCgpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU5leHRUaWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfTkVYVF9USUNLKSAhPT0gMCkgcmV0dXJuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfTkVYVF9USUNLXG4gICAgcXVldWVUaWNrKHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljaylcbiAgfVxufVxuXG5jbGFzcyBUcmFuc2Zvcm1TdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0pIHtcbiAgICB0aGlzLmRhdGEgPSBudWxsXG4gICAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGFmdGVyVHJhbnNmb3JtLmJpbmQoc3RyZWFtKVxuICAgIHRoaXMuYWZ0ZXJGaW5hbCA9IG51bGxcbiAgfVxufVxuXG5jbGFzcyBQaXBlbGluZSB7XG4gIGNvbnN0cnVjdG9yIChzcmMsIGRzdCwgY2IpIHtcbiAgICB0aGlzLmZyb20gPSBzcmNcbiAgICB0aGlzLnRvID0gZHN0XG4gICAgdGhpcy5hZnRlclBpcGUgPSBjYlxuICAgIHRoaXMuZXJyb3IgPSBudWxsXG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IGZhbHNlXG4gIH1cblxuICBmaW5pc2hlZCAoKSB7XG4gICAgdGhpcy5waXBlVG9GaW5pc2hlZCA9IHRydWVcbiAgfVxuXG4gIGRvbmUgKHN0cmVhbSwgZXJyKSB7XG4gICAgaWYgKGVycikgdGhpcy5lcnJvciA9IGVyclxuXG4gICAgaWYgKHN0cmVhbSA9PT0gdGhpcy50bykge1xuICAgICAgdGhpcy50byA9IG51bGxcblxuICAgICAgaWYgKHRoaXMuZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHRoaXMuZnJvbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwIHx8ICF0aGlzLnBpcGVUb0ZpbmlzaGVkKSB7XG4gICAgICAgICAgdGhpcy5mcm9tLmRlc3Ryb3kodGhpcy5lcnJvciB8fCBuZXcgRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLmZyb20pIHtcbiAgICAgIHRoaXMuZnJvbSA9IG51bGxcblxuICAgICAgaWYgKHRoaXMudG8gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ET05FKSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMudG8uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignUmVhZGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgZW5kaW5nJykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWZ0ZXJQaXBlICE9PSBudWxsKSB0aGlzLmFmdGVyUGlwZSh0aGlzLmVycm9yKVxuICAgIHRoaXMudG8gPSB0aGlzLmZyb20gPSB0aGlzLmFmdGVyUGlwZSA9IG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlckRyYWluICgpIHtcbiAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9BQ1RJVkVfQU5EX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgZWxzZSB0aGlzLmRyYWluKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJGaW5hbCAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gIGlmIChlcnIpIHN0cmVhbS5kZXN0cm95KGVycilcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ET05FXG4gICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpXG4gIH1cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICB9XG5cbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQUNUSVZFXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZXN0cm95IChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoIWVyciAmJiB0aGlzLmVycm9yICE9PSBTVFJFQU1fREVTVFJPWUVEKSBlcnIgPSB0aGlzLmVycm9yXG4gIGlmIChlcnIpIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZRURcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcblxuICBjb25zdCBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuXG4gIGlmIChycyAhPT0gbnVsbCAmJiBycy5waXBlbGluZSAhPT0gbnVsbCkgcnMucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcbiAgaWYgKHdzICE9PSBudWxsICYmIHdzLnBpcGVsaW5lICE9PSBudWxsKSB3cy5waXBlbGluZS5kb25lKHN0cmVhbSwgZXJyKVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RSQUlOX1NUQVRVUykgPT09IFdSSVRFX1VORFJBSU5FRCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfRFJBSU5FRFxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0VNSVRfRFJBSU4pID09PSBXUklURV9FTUlUX0RSQUlOKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICAgIH1cbiAgfVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NZTkMpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9TWU5DKSA9PT0gMCkgdGhpcy51cGRhdGUoKVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWFkTlQgKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JpdGVOVCAoKSB7XG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gIHRoaXMudXBkYXRlKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJPcGVuIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUlORykgPT09IDApIHtcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfU1RBVFVTKSA9PT0gMCkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BSSU1BUllcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUFJJTUFSWVxuICAgIHN0cmVhbS5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gTk9UX0FDVElWRVxuXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybSAoZXJyLCBkYXRhKSB7XG4gIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuYWZ0ZXJXcml0ZShlcnIpXG59XG5cbmNsYXNzIFN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSAwXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG51bGxcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbnVsbFxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLm9wZW4pIHRoaXMuX29wZW4gPSBvcHRzLm9wZW5cbiAgICAgIGlmIChvcHRzLmRlc3Ryb3kpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRzLmRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnByZWRlc3Ryb3kpIHRoaXMuX3ByZWRlc3Ryb3kgPSBvcHRzLnByZWRlc3Ryb3lcbiAgICAgIGlmIChvcHRzLnNpZ25hbCkge1xuICAgICAgICBvcHRzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcblxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUFJFREVTVFJPWUlOR1xuICAgICAgdGhpcy5fcHJlZGVzdHJveSgpXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSAmPSBOT1RfUFJFREVTVFJPWUlOR1xuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgfVxuICB9XG5cbiAgb24gKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChuYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gKFJFQURfRU1JVF9EQVRBIHwgUkVBRF9SRVNVTUVEKVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVF9SRUFEQUJMRVxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkcmFpbicpIHtcbiAgICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRU1JVF9EUkFJTlxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgZm4pXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnJlYWQpIHRoaXMuX3JlYWQgPSBvcHRzLnJlYWRcbiAgICAgIGlmIChvcHRzLmVhZ2VyT3BlbikgdGhpcy5yZXN1bWUoKS5wYXVzZSgpXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHBpcGUgKGRlc3QsIGNiKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5waXBlKGRlc3QsIGNiKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiBkZXN0XG4gIH1cblxuICByZWFkICgpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkKClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUudW5zaGlmdChkYXRhKVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFU1VNRURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfUEFVU0VEXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHN0YXRpYyBpc0JhY2twcmVzc3VyZWQgKHdzKSB7XG4gICAgcmV0dXJuICh3cy5fZHVwbGV4U3RhdGUgJiBXUklURV9CQUNLUFJFU1NVUkVfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgRHVwbGV4IGV4dGVuZHMgUmVhZGFibGUgeyAvLyBhbmQgV3JpdGFibGVcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSBPUEVOSU5HXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgZGVzdC5vbignZmluaXNoJywgKCkgPT4geyBmaW4gPSB0cnVlIH0pXG4gICAgZGVzdC5vbignZXJyb3InLCBlcnIgPT4geyBlcnJvciA9IGVycm9yIHx8IGVyciB9KVxuICAgIGRlc3Qub24oJ2Nsb3NlJywgKCkgPT4gZG9uZShlcnJvciB8fCAoZmluID8gbnVsbCA6IFBSRU1BVFVSRV9DTE9TRSkpKVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSAoc3RyZWFtKSB7XG4gIHJldHVybiAhIXN0cmVhbS5fcmVhZGFibGVTdGF0ZSB8fCAhIXN0cmVhbS5fd3JpdGFibGVTdGF0ZVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gdHlwZW9mIHN0cmVhbS5fZHVwbGV4U3RhdGUgPT09ICdudW1iZXInICYmIGlzU3RyZWFtKHN0cmVhbSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtRXJyb3IgKHN0cmVhbSkge1xuICByZXR1cm4gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRTdHJlYW14IChzdHJlYW0pIHtcbiAgcmV0dXJuIGlzU3RyZWFteChzdHJlYW0pICYmIHN0cmVhbS5yZWFkYWJsZVxufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkgKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhLmJ5dGVMZW5ndGggPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRCeXRlTGVuZ3RoIChkYXRhKSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkoZGF0YSkgPyBkYXRhLmJ5dGVMZW5ndGggOiAxMDI0XG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gYWJvcnQgKCkge1xuICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZC4nKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBpcGVsaW5lLFxuICBwaXBlbGluZVByb21pc2UsXG4gIGlzU3RyZWFtLFxuICBpc1N0cmVhbXgsXG4gIGdldFN0cmVhbUVycm9yLFxuICBTdHJlYW0sXG4gIFdyaXRhYmxlLFxuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBUcmFuc2Zvcm0sXG4gIC8vIEV4cG9ydCBQYXNzVGhyb3VnaCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE5vZGUuanMgY29yZSdzIHN0cmVhbSBtb2R1bGVcbiAgUGFzc1Rocm91Z2hcbn1cbiIsImZ1bmN0aW9uIGlzQnVmZmVyICh2YWx1ZSkge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblxuZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZVNsb3cgKHNpemUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3coc2l6ZSlcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYSwgYilcbn1cblxuZnVuY3Rpb24gY29uY2F0IChidWZmZXJzLCB0b3RhbExlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzLCB0b3RhbExlbmd0aClcbn1cblxuZnVuY3Rpb24gY29weSAoc291cmNlLCB0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihzb3VyY2UpLmNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gZXF1YWxzIChhLCBiKSB7XG4gIHJldHVybiB0b0J1ZmZlcihhKS5lcXVhbHMoYilcbn1cblxuZnVuY3Rpb24gZmlsbCAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmZpbGwodmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXMgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluY2x1ZGVzKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5kZXhPZih2YWx1ZSwgYnlmZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGxhc3RJbmRleE9mIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5sYXN0SW5kZXhPZih2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHN3YXAxNiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAxNigpXG59XG5cbmZ1bmN0aW9uIHN3YXAzMiAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXAzMigpXG59XG5cbmZ1bmN0aW9uIHN3YXA2NCAoYnVmZmVyKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnN3YXA2NCgpXG59XG5cbmZ1bmN0aW9uIHRvQnVmZmVyIChidWZmZXIpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKSByZXR1cm4gYnVmZmVyXG4gIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nIChidWZmZXIsIGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnRvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdExFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVGbG9hdExFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWREb3VibGVMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdExFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRmxvYXRMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRVSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZFVJbnQzMkxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRJbnQzMkxFKG9mZnNldClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQnVmZmVyLFxuICBpc0VuY29kaW5nLFxuICBhbGxvYyxcbiAgYWxsb2NVbnNhZmUsXG4gIGFsbG9jVW5zYWZlU2xvdyxcbiAgYnl0ZUxlbmd0aCxcbiAgY29tcGFyZSxcbiAgY29uY2F0LFxuICBjb3B5LFxuICBlcXVhbHMsXG4gIGZpbGwsXG4gIGZyb20sXG4gIGluY2x1ZGVzLFxuICBpbmRleE9mLFxuICBsYXN0SW5kZXhPZixcbiAgc3dhcDE2LFxuICBzd2FwMzIsXG4gIHN3YXA2NCxcbiAgdG9CdWZmZXIsXG4gIHRvU3RyaW5nLFxuICB3cml0ZSxcbiAgd3JpdGVEb3VibGVMRSxcbiAgd3JpdGVGbG9hdExFLFxuICB3cml0ZVVJbnQzMkxFLFxuICB3cml0ZUludDMyTEUsXG4gIHJlYWREb3VibGVMRSxcbiAgcmVhZEZsb2F0TEUsXG4gIHJlYWRVSW50MzJMRSxcbiAgcmVhZEludDMyTEVcbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MDAnLCAnYmluYXJ5JylcbmNvbnN0IFVTVEFSX1ZFUiA9IGI0YS5mcm9tKCcwMCcsICdiaW5hcnknKVxuY29uc3QgR05VX01BR0lDID0gYjRhLmZyb20oJ3VzdGFyXFx4MjAnLCAnYmluYXJ5JylcbmNvbnN0IEdOVV9WRVIgPSBiNGEuZnJvbSgnXFx4MjBcXHgwMCcsICdiaW5hcnknKVxuY29uc3QgTUFTSyA9IDBvNzc3N1xuY29uc3QgTUFHSUNfT0ZGU0VUID0gMjU3XG5jb25zdCBWRVJTSU9OX09GRlNFVCA9IDI2M1xuXG5jb25zdCBjbGFtcCA9IGZ1bmN0aW9uIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4IC8vIENvZXJjZSB0byBpbnRlZ2VyLlxuICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm4gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgaW5kZXggKz0gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgdG9UeXBlID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCB0b1R5cGVmbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAnZmlsZSc6XG4gICAgICByZXR1cm4gMFxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgcmV0dXJuIDFcbiAgICBjYXNlICdzeW1saW5rJzpcbiAgICAgIHJldHVybiAyXG4gICAgY2FzZSAnY2hhcmFjdGVyLWRldmljZSc6XG4gICAgICByZXR1cm4gM1xuICAgIGNhc2UgJ2Jsb2NrLWRldmljZSc6XG4gICAgICByZXR1cm4gNFxuICAgIGNhc2UgJ2RpcmVjdG9yeSc6XG4gICAgICByZXR1cm4gNVxuICAgIGNhc2UgJ2ZpZm8nOlxuICAgICAgcmV0dXJuIDZcbiAgICBjYXNlICdjb250aWd1b3VzLWZpbGUnOlxuICAgICAgcmV0dXJuIDdcbiAgICBjYXNlICdwYXgtaGVhZGVyJzpcbiAgICAgIHJldHVybiA3MlxuICB9XG5cbiAgcmV0dXJuIDBcbn1cblxuY29uc3QgaW5kZXhPZiA9IGZ1bmN0aW9uIChibG9jaywgbnVtLCBvZmZzZXQsIGVuZCkge1xuICBmb3IgKDsgb2Zmc2V0IDwgZW5kOyBvZmZzZXQrKykge1xuICAgIGlmIChibG9ja1tvZmZzZXRdID09PSBudW0pIHJldHVybiBvZmZzZXRcbiAgfVxuICByZXR1cm4gZW5kXG59XG5cbmNvbnN0IGNrc3VtID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuY29uc3QgZW5jb2RlT2N0ID0gZnVuY3Rpb24gKHZhbCwgbikge1xuICB2YWwgPSB2YWwudG9TdHJpbmcoOClcbiAgaWYgKHZhbC5sZW5ndGggPiBuKSByZXR1cm4gU0VWRU5TLnNsaWNlKDAsIG4pICsgJyAnXG4gIGVsc2UgcmV0dXJuIFpFUk9TLnNsaWNlKDAsIG4gLSB2YWwubGVuZ3RoKSArIHZhbCArICcgJ1xufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmNvbnN0IGRlY29kZU9jdCA9IGZ1bmN0aW9uICh2YWwsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHZhbCA9IHZhbC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aClcbiAgb2Zmc2V0ID0gMFxuXG4gIC8vIElmIHByZWZpeGVkIHdpdGggMHg4MCB0aGVuIHBhcnNlIGFzIGEgYmFzZS0yNTYgaW50ZWdlclxuICBpZiAodmFsW29mZnNldF0gJiAweDgwKSB7XG4gICAgcmV0dXJuIHBhcnNlMjU2KHZhbClcbiAgfSBlbHNlIHtcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiB0YXIgY2FuIHByZWZpeCB3aXRoIHNwYWNlc1xuICAgIHdoaWxlIChvZmZzZXQgPCB2YWwubGVuZ3RoICYmIHZhbFtvZmZzZXRdID09PSAzMikgb2Zmc2V0KytcbiAgICBjb25zdCBlbmQgPSBjbGFtcChpbmRleE9mKHZhbCwgMzIsIG9mZnNldCwgdmFsLmxlbmd0aCksIHZhbC5sZW5ndGgsIHZhbC5sZW5ndGgpXG4gICAgd2hpbGUgKG9mZnNldCA8IGVuZCAmJiB2YWxbb2Zmc2V0XSA9PT0gMCkgb2Zmc2V0KytcbiAgICBpZiAoZW5kID09PSBvZmZzZXQpIHJldHVybiAwXG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbC5zbGljZShvZmZzZXQsIGVuZCkudG9TdHJpbmcoKSwgOClcbiAgfVxufVxuXG5jb25zdCBkZWNvZGVTdHIgPSBmdW5jdGlvbiAodmFsLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHZhbC5zbGljZShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLnRvU3RyaW5nKGVuY29kaW5nKVxufVxuXG5jb25zdCBhZGRMZW5ndGggPSBmdW5jdGlvbiAoc3RyKSB7XG4gIGNvbnN0IGxlbiA9IGI0YS5ieXRlTGVuZ3RoKHN0cilcbiAgbGV0IGRpZ2l0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIE1hdGgubG9nKDEwKSkgKyAxXG4gIGlmIChsZW4gKyBkaWdpdHMgPj0gTWF0aC5wb3coMTAsIGRpZ2l0cykpIGRpZ2l0cysrXG5cbiAgcmV0dXJuIChsZW4gKyBkaWdpdHMpICsgc3RyXG59XG5cbmV4cG9ydHMuZGVjb2RlTG9uZ1BhdGggPSBmdW5jdGlvbiAoYnVmLCBlbmNvZGluZykge1xuICByZXR1cm4gZGVjb2RlU3RyKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmV4cG9ydHMuZW5jb2RlUGF4ID0gZnVuY3Rpb24gKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgY29uc3QgcmVzdWx0ID0ge31cblxuICB3aGlsZSAoYnVmLmxlbmd0aCkge1xuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChpIDwgYnVmLmxlbmd0aCAmJiBidWZbaV0gIT09IDMyKSBpKytcbiAgICBjb25zdCBsZW4gPSBwYXJzZUludChidWYuc2xpY2UoMCwgaSkudG9TdHJpbmcoKSwgMTApXG4gICAgaWYgKCFsZW4pIHJldHVybiByZXN1bHRcblxuICAgIGNvbnN0IGIgPSBidWYuc2xpY2UoaSArIDEsIGxlbiAtIDEpLnRvU3RyaW5nKClcbiAgICBjb25zdCBrZXlJbmRleCA9IGIuaW5kZXhPZignPScpXG4gICAgaWYgKGtleUluZGV4ID09PSAtMSkgcmV0dXJuIHJlc3VsdFxuICAgIHJlc3VsdFtiLnNsaWNlKDAsIGtleUluZGV4KV0gPSBiLnNsaWNlKGtleUluZGV4ICsgMSlcblxuICAgIGJ1ZiA9IGJ1Zi5zbGljZShsZW4pXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgYnVmID0gYjRhLmFsbG9jKDUxMilcbiAgbGV0IG5hbWUgPSBvcHRzLm5hbWVcbiAgbGV0IHByZWZpeCA9ICcnXG5cbiAgaWYgKG9wdHMudHlwZWZsYWcgPT09IDUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdICE9PSAnLycpIG5hbWUgKz0gJy8nXG4gIGlmIChiNGEuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHJldHVybiBudWxsIC8vIHV0Zi04XG5cbiAgd2hpbGUgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwKSB7XG4gICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZignLycpXG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4gbnVsbFxuICAgIHByZWZpeCArPSBwcmVmaXggPyAnLycgKyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZS5zbGljZSgwLCBpKVxuICAgIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKVxuICB9XG5cbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwIHx8IGI0YS5ieXRlTGVuZ3RoKHByZWZpeCkgPiAxNTUpIHJldHVybiBudWxsXG4gIGlmIChvcHRzLmxpbmtuYW1lICYmIGI0YS5ieXRlTGVuZ3RoKG9wdHMubGlua25hbWUpID4gMTAwKSByZXR1cm4gbnVsbFxuXG4gIGI0YS53cml0ZShidWYsIG5hbWUpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLm1vZGUgJiBNQVNLLCA2KSwgMTAwKVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy51aWQsIDYpLCAxMDgpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLmdpZCwgNiksIDExNilcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuc2l6ZSwgMTEpLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoYnVmLCBmaWxlbmFtZUVuY29kaW5nLCBhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgbGV0IHR5cGVmbGFnID0gYnVmWzE1Nl0gPT09IDAgPyAwIDogYnVmWzE1Nl0gLSBaRVJPX09GRlNFVFxuXG4gIGxldCBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMCwgMTAwLCBmaWxlbmFtZUVuY29kaW5nKVxuICBjb25zdCBtb2RlID0gZGVjb2RlT2N0KGJ1ZiwgMTAwLCA4KVxuICBjb25zdCB1aWQgPSBkZWNvZGVPY3QoYnVmLCAxMDgsIDgpXG4gIGNvbnN0IGdpZCA9IGRlY29kZU9jdChidWYsIDExNiwgOClcbiAgY29uc3Qgc2l6ZSA9IGRlY29kZU9jdChidWYsIDEyNCwgMTIpXG4gIGNvbnN0IG10aW1lID0gZGVjb2RlT2N0KGJ1ZiwgMTM2LCAxMilcbiAgY29uc3QgdHlwZSA9IHRvVHlwZSh0eXBlZmxhZylcbiAgY29uc3QgbGlua25hbWUgPSBidWZbMTU3XSA9PT0gMCA/IG51bGwgOiBkZWNvZGVTdHIoYnVmLCAxNTcsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgdW5hbWUgPSBkZWNvZGVTdHIoYnVmLCAyNjUsIDMyKVxuICBjb25zdCBnbmFtZSA9IGRlY29kZVN0cihidWYsIDI5NywgMzIpXG4gIGNvbnN0IGRldm1ham9yID0gZGVjb2RlT2N0KGJ1ZiwgMzI5LCA4KVxuICBjb25zdCBkZXZtaW5vciA9IGRlY29kZU9jdChidWYsIDMzNywgOClcblxuICBjb25zdCBjID0gY2tzdW0oYnVmKVxuXG4gIC8vIGNoZWNrc3VtIGlzIHN0aWxsIGluaXRpYWwgdmFsdWUgaWYgaGVhZGVyIHdhcyBudWxsLlxuICBpZiAoYyA9PT0gOCAqIDMyKSByZXR1cm4gbnVsbFxuXG4gIC8vIHZhbGlkIGNoZWNrc3VtXG4gIGlmIChjICE9PSBkZWNvZGVPY3QoYnVmLCAxNDgsIDgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyIGhlYWRlci4gTWF5YmUgdGhlIHRhciBpcyBjb3JydXB0ZWQgb3IgaXQgbmVlZHMgdG8gYmUgZ3VuemlwcGVkPycpXG5cbiAgaWYgKFVTVEFSX01BR0lDLmNvbXBhcmUoYnVmLCBNQUdJQ19PRkZTRVQsIE1BR0lDX09GRlNFVCArIDYpID09PSAwKSB7XG4gICAgLy8gdXN0YXIgKHBvc2l4KSBmb3JtYXQuXG4gICAgLy8gcHJlcGVuZCBwcmVmaXgsIGlmIHByZXNlbnQuXG4gICAgaWYgKGJ1ZlszNDVdKSBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMzQ1LCAxNTUsIGZpbGVuYW1lRW5jb2RpbmcpICsgJy8nICsgbmFtZVxuICB9IGVsc2UgaWYgKEdOVV9NQUdJQy5jb21wYXJlKGJ1ZiwgTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSA9PT0gMCAmJlxuICAgICAgICAgICAgIEdOVV9WRVIuY29tcGFyZShidWYsIFZFUlNJT05fT0ZGU0VULCBWRVJTSU9OX09GRlNFVCArIDIpID09PSAwKSB7XG4gICAgLy8gJ2dudScvJ29sZGdudScgZm9ybWF0LiBTaW1pbGFyIHRvIHVzdGFyLCBidXQgaGFzIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGFuZFxuICAgIC8vIG11bHRpLXZvbHVtZSB0YXJiYWxscy5cbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFsbG93VW5rbm93bkZvcm1hdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXI6IHVua25vd24gZm9ybWF0LicpXG4gICAgfVxuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBvbGQgdGFyIHZlcnNpb25zIHRoYXQgdXNlIHRyYWlsaW5nIC8gdG8gaW5kaWNhdGUgZGlyc1xuICBpZiAodHlwZWZsYWcgPT09IDAgJiYgbmFtZSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcvJykgdHlwZWZsYWcgPSA1XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIG1vZGUsXG4gICAgdWlkLFxuICAgIGdpZCxcbiAgICBzaXplLFxuICAgIG10aW1lOiBuZXcgRGF0ZSgxMDAwICogbXRpbWUpLFxuICAgIHR5cGUsXG4gICAgbGlua25hbWUsXG4gICAgdW5hbWUsXG4gICAgZ25hbWUsXG4gICAgZGV2bWFqb3IsXG4gICAgZGV2bWlub3JcbiAgfVxufVxuIiwiY29uc3QgeyBjb25zdGFudHMgfSA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IERNT0RFID0gMG83NTVcbmNvbnN0IEZNT0RFID0gMG82NDRcblxuY29uc3QgRU5EX09GX1RBUiA9IGI0YS5hbGxvYygxMDI0KVxuXG5jb25zdCBub29wID0gZnVuY3Rpb24gKCkge31cblxuY29uc3Qgb3ZlcmZsb3cgPSBmdW5jdGlvbiAoc2VsZiwgc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICBpZiAoc2l6ZSkgc2VsZi5wdXNoKEVORF9PRl9UQVIuc3ViYXJyYXkoMCwgNTEyIC0gc2l6ZSkpXG59XG5cbmZ1bmN0aW9uIG1vZGVUb1R5cGUgKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlICYgY29uc3RhbnRzLlNfSUZNVCkge1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZCTEs6IHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZDSFI6IHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGRElSOiByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGSUZPOiByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkxOSzogcmV0dXJuICdzeW1saW5rJ1xuICB9XG5cbiAgcmV0dXJuICdmaWxlJ1xufVxuXG5jbGFzcyBTaW5rIGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAodG8pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy53cml0dGVuID0gMFxuICAgIHRoaXMuX3RvID0gdG9cbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLndyaXR0ZW4gKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgaWYgKHRoaXMuX3RvLnB1c2goZGF0YSkpIHJldHVybiBjYigpXG4gICAgdGhpcy5fdG8uX2RyYWluID0gY2JcbiAgfVxufVxuXG5jbGFzcyBMaW5rU2luayBleHRlbmRzIFdyaXRhYmxlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmxpbmtuYW1lID0gJydcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ3V0Zi04JylcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLmxpbmtuYW1lICs9IHRoaXMuX2RlY29kZXIud3JpdGUoZGF0YSlcbiAgICBjYigpXG4gIH1cbn1cblxuY2xhc3MgVm9pZCBleHRlbmRzIFdyaXRhYmxlIHtcbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIGNiKG5ldyBFcnJvcignTm8gYm9keSBhbGxvd2VkIGZvciB0aGlzIGVudHJ5JykpXG4gIH1cbn1cblxuY2xhc3MgUGFjayBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5fZmluYWxpemluZyA9IGZhbHNlXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICB9XG5cbiAgZW50cnkgKGhlYWRlciwgYnVmZmVyLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBwaXBpbmcgYW4gZW50cnknKVxuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVyblxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYnVmZmVyXG4gICAgICBidWZmZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wXG5cbiAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgaWYgKCFoZWFkZXIuc2l6ZSB8fCBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnKSBoZWFkZXIuc2l6ZSA9IDBcbiAgICBpZiAoIWhlYWRlci50eXBlKSBoZWFkZXIudHlwZSA9IG1vZGVUb1R5cGUoaGVhZGVyLm1vZGUpXG4gICAgaWYgKCFoZWFkZXIubW9kZSkgaGVhZGVyLm1vZGUgPSBoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScgPyBETU9ERSA6IEZNT0RFXG4gICAgaWYgKCFoZWFkZXIudWlkKSBoZWFkZXIudWlkID0gMFxuICAgIGlmICghaGVhZGVyLmdpZCkgaGVhZGVyLmdpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5tdGltZSkgaGVhZGVyLm10aW1lID0gbmV3IERhdGUoKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSBidWZmZXIgPSBiNGEuZnJvbShidWZmZXIpXG4gICAgaWYgKGI0YS5pc0J1ZmZlcihidWZmZXIpKSB7XG4gICAgICBoZWFkZXIuc2l6ZSA9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuICAgICAgY29uc3Qgb2sgPSB0aGlzLnB1c2goYnVmZmVyKVxuICAgICAgb3ZlcmZsb3coc2VsZiwgaGVhZGVyLnNpemUpXG4gICAgICBpZiAob2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG4gICAgICBlbHNlIHRoaXMuX2RyYWluID0gY2FsbGJhY2tcbiAgICAgIHJldHVybiBuZXcgVm9pZCgpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnc3ltbGluaycgJiYgIWhlYWRlci5saW5rbmFtZSkge1xuICAgICAgY29uc3QgbGlua1NpbmsgPSBuZXcgTGlua1NpbmsoKVxuICAgICAgbGlua1NpbmtcbiAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBzZWxmLmRlc3Ryb3koKVxuICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBoZWFkZXIubGlua25hbWUgPSBsaW5rU2luay5saW5rbmFtZVxuICAgICAgICAgIHNlbGYuX2VuY29kZShoZWFkZXIpXG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9KVxuXG4gICAgICByZXR1cm4gbGlua1NpbmtcbiAgICB9XG5cbiAgICB0aGlzLl9lbmNvZGUoaGVhZGVyKVxuXG4gICAgaWYgKGhlYWRlci50eXBlICE9PSAnZmlsZScgJiYgaGVhZGVyLnR5cGUgIT09ICdjb250aWd1b3VzLWZpbGUnKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBWb2lkKClcbiAgICB9XG5cbiAgICBjb25zdCBzaW5rID0gbmV3IFNpbmsodGhpcylcbiAgICBzaW5rXG4gICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG4gICAgICAgIHNlbGYuZGVzdHJveSgpXG4gICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9zdHJlYW0gPSBudWxsXG5cbiAgICAgICAgaWYgKHNpbmsud3JpdHRlbiAhPT0gaGVhZGVyLnNpemUpIHsgLy8gY29ycnVwdGluZyB0YXJcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJmbG93KHNlbGYsIGhlYWRlci5zaXplKVxuICAgICAgICBpZiAoc2VsZi5fZmluYWxpemluZykgeyBzZWxmLmZpbmFsaXplKCkgfVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9KVxuXG4gICAgdGhpcy5fc3RyZWFtID0gc2lua1xuXG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtKSB7XG4gICAgICB0aGlzLl9maW5hbGl6aW5nID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMucHVzaChFTkRfT0ZfVEFSKVxuICAgIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgX2VuY29kZSAoaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIucGF4KSB7XG4gICAgICBjb25zdCBidWYgPSBoZWFkZXJzLmVuY29kZShoZWFkZXIpXG4gICAgICBpZiAoYnVmKSB7XG4gICAgICAgIHRoaXMucHVzaChidWYpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbmNvZGVQYXgoaGVhZGVyKVxuICB9XG5cbiAgX2VuY29kZVBheCAoaGVhZGVyKSB7XG4gICAgY29uc3QgcGF4SGVhZGVyID0gaGVhZGVycy5lbmNvZGVQYXgoe1xuICAgICAgbmFtZTogaGVhZGVyLm5hbWUsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lLFxuICAgICAgcGF4OiBoZWFkZXIucGF4XG4gICAgfSlcblxuICAgIGNvbnN0IG5ld0hlYWRlciA9IHtcbiAgICAgIG5hbWU6ICdQYXhIZWFkZXInLFxuICAgICAgbW9kZTogaGVhZGVyLm1vZGUsXG4gICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICBzaXplOiBwYXhIZWFkZXIuYnl0ZUxlbmd0aCxcbiAgICAgIG10aW1lOiBoZWFkZXIubXRpbWUsXG4gICAgICB0eXBlOiAncGF4LWhlYWRlcicsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lICYmICdQYXhIZWFkZXInLFxuICAgICAgdW5hbWU6IGhlYWRlci51bmFtZSxcbiAgICAgIGduYW1lOiBoZWFkZXIuZ25hbWUsXG4gICAgICBkZXZtYWpvcjogaGVhZGVyLmRldm1ham9yLFxuICAgICAgZGV2bWlub3I6IGhlYWRlci5kZXZtaW5vclxuICAgIH1cblxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICAgIHRoaXMucHVzaChwYXhIZWFkZXIpXG4gICAgb3ZlcmZsb3codGhpcywgcGF4SGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICBuZXdIZWFkZXIuc2l6ZSA9IGhlYWRlci5zaXplXG4gICAgbmV3SGVhZGVyLnR5cGUgPSBoZWFkZXIudHlwZVxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY29uc3QgZHJhaW4gPSB0aGlzLl9kcmFpblxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIGRyYWluKClcbiAgICBjYigpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrIChvcHRzKSB7XG4gIHJldHVybiBuZXcgUGFjayhvcHRzKVxufVxuIiwiZXhwb3J0cy5leHRyYWN0ID0gcmVxdWlyZSgnLi9leHRyYWN0JylcbmV4cG9ydHMucGFjayA9IHJlcXVpcmUoJy4vcGFjaycpXG4iLG51bGxdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJwcm9jZXNzIiwiZ2xvYmFsIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwiZW5kT2ZTdHJlYW1Nb2R1bGUiLCJlbmRPZlN0cmVhbSIsInJlcXVpcmUkJDYiLCJyZXF1aXJlJCQ3IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDE1Iiwic3RyZWFtTW9kdWxlIiwicmVxdWlyZSQkMTMiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsIkJ1ZmZlciIsIkJ1ZmZlckxpc3QiLCJibE1vZHVsZSIsImJsIiwibm9vcCIsIlJlYWRhYmxlIiwiV3JpdGFibGUiLCJpbmRleE9mIiwiYjRhIiwiaGVhZGVycyIsInBhY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFdBQWMsR0FBRztHQUNmLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDckIsS0FBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzNCO0FBQ0gsR0FBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQ25DLEtBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN6QjtBQUNILEdBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNsQyxLQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDeEI7QUFDSCxHQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDaEMsS0FBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ3RCO0FBQ0gsR0FBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQzlCLEtBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNwQjtBQUNILEdBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUM5QixLQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEI7QUFD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QUFFO0FBQ3hDLElBQUksT0FBTyxTQUFTO0FBQ3BCLEdBQUc7QUFDSDtBQUNBLEVBQUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUM7QUFDcEM7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDekQsRUFBRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQzlDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFNO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtBQUMxQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTTtBQUN0QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdkMsRUFBQztBQUNEO0FBQ0FBLFlBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtBQUM1RSxFQUFFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7QUFDcEQsSUFBSSxRQUFRLEdBQUcsRUFBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzFELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFNO0FBQ3hC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SUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDMUIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztBQUNwQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQztBQUNwQixFQUFDO0FBQ0Q7QUFDQSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUN0RCxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFDO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUk7QUFDekIsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtBQUNsRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDakIsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFDO0FBQ1QsRUFBQztBQUNEO0FBQ0EsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxTQUFTLGFBQWEsRUFBRSxDQUFDLEVBQUU7QUFDdEUsRUFBRSxPQUFPLENBQUMsWUFBWSxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksVUFBVSxJQUFJLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENB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QUFRLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ2xDLENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUN6QixFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDekIsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDbEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLEVBQUUsTUFBTSxFQUFFO0FBQzNCLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTTtBQUM1QyxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDakQsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDeEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtBQUMxRCxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7QUFDakUsQ0FBQztBQUNEO0FBQ0EsU0FBUyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUN0RCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUM5QyxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQ3JELENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9DLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDOUMsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUM5QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLEVBQUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBQ0Q7QUFD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QUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBQztBQUNuRixJQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sR0FBRTtBQUN0RCxJQUFJLElBQUksR0FBRyxLQUFLLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDaEMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQzNELEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUN2RixFQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRTtBQUNqQyxFQUFFLE1BQU0sR0FBRyxHQUFHQSxLQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBQztBQUNqQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBQztBQUMzRCxFQUFFLElBQUksR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUU7QUFDcEQ7QUFDQSxF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QUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUc7QUFDdkUsRUFBRSxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ3ZEO0FBQ0EsRUFBRSxPQUFPQSxLQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtBQUNyQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQzdCLElBQUksTUFBTSxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBQztBQUM1QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJQSxLQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDN0UsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUlBLEtBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLElBQUk7QUFDdkU7QUFDQSxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDdEIsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUNyRCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUM7QUFDN0MsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQzdDLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUMvQyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZFO0FBQ0EsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDO0FBQ2hEO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRUEsS0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBQztBQUMxQyxFQUFFQSxLQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFDO0FBQzFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQztBQUNqRCxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUM7QUFDakQsRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQztBQUN2RCxFQUFFQSxLQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQ3ZEO0FBQ0EsRUFBRSxJQUFJLE1BQU0sRUFBRUEsS0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQztBQUN6QztBQUNBLEVBQUVBLEtBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFDO0FBQy9DO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixFQUFDO0FBQ0Q7QUFDQUMsU0FBQSxDQUFBLE1BQWMsR0FBRyxVQUFVLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRTtBQUN0RSxFQUFFLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFXO0FBQzVEO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUM7QUFDckQsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDckMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7QUFDcEMsRUFBRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdEMsRUFBRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUM7QUFDdkMsRUFBRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFDO0FBQy9CLEVBQUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFDO0FBQ3JGLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFDO0FBQ3ZDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDLEVBQUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDO0FBQ3pDO0FBQ0EsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFDO0FBQ3RCO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxJQUFJO0FBQy9CO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUM7QUFDbEk7QUFDQSxFQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsS0FB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
+await split()
diff --git a/js/private/js_run_binary.bzl b/js/private/js_run_binary.bzl
index abc3612e8..dc98bd864 100644
--- a/js/private/js_run_binary.bzl
+++ b/js/private/js_run_binary.bzl
@@ -13,7 +13,6 @@ load("@aspect_rules_js//js:defs.bzl", "js_run_binary")
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@aspect_bazel_lib//lib:run_binary.bzl", _run_binary = "run_binary")
load("@aspect_bazel_lib//lib:utils.bzl", bazel_lib_utils = "utils")
-load("@bazel_skylib//lib:dicts.bzl", "dicts")
load(":js_helpers.bzl", _envs_for_log_level = "envs_for_log_level")
load(":js_info_files.bzl", _js_info_files = "js_info_files")
load(":js_library.bzl", _js_library = "js_library")
@@ -401,7 +400,7 @@ See https://github.com/aspect-build/rules_js/tree/main/docs#using-binaries-publi
_run_binary(
name = name,
tool = tool,
- env = dicts.add(fixed_env, env),
+ env = fixed_env | env,
srcs = srcs + extra_srcs,
outs = outs + extra_outs,
out_dirs = out_dirs,
diff --git a/js/private/test/image/BUILD.bazel b/js/private/test/image/BUILD.bazel
index 5f5f3351d..1d1b66828 100644
--- a/js/private/test/image/BUILD.bazel
+++ b/js/private/test/image/BUILD.bazel
@@ -18,6 +18,7 @@ platform(
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
+ visibility = ["//js/private/test/image:__subpackages__"],
)
# All these golden files can be updated with
@@ -44,6 +45,7 @@ assert_checksum(
)
# Case 1: Defaults
+# bazel run :default_test_update_all
make_js_image_layer(
name = "default",
binary = ":bin",
@@ -57,6 +59,7 @@ assert_js_image_layer_listings(
)
# Case 2: Change owner
+# bazel run :custom_owner_test_update_all
make_js_image_layer(
name = "custom_owner",
binary = ":bin",
diff --git a/js/private/test/image/asserts.bzl b/js/private/test/image/asserts.bzl
index 749d139f4..22eb1d3af 100644
--- a/js/private/test/image/asserts.bzl
+++ b/js/private/test/image/asserts.bzl
@@ -12,7 +12,10 @@ def assert_tar_listing(name, actual, expected):
srcs = [actual],
testonly = True,
outs = ["_{}.listing".format(name)],
- cmd = 'TZ="UTC" LC_ALL="en_US.UTF-8" $(BSDTAR_BIN) -tvf $(execpath {}) >$@'.format(actual),
+ # TODO: now that app layer has repo_mapping file in it which is not stable between different operating systems
+ # we need to exlude it from checksums
+ # See: https://github.com/aspect-build/rules_js/actions/runs/11749187598/job/32734931009?pr=2011
+ cmd = 'TZ="UTC" LC_ALL="en_US.UTF-8" $(BSDTAR_BIN) -tvf $(execpath {}) --exclude "**/_repo_mapping" >$@'.format(actual),
toolchains = ["@bsd_tar_toolchains//:resolved_toolchain"],
)
@@ -29,15 +32,13 @@ layers = [
"package_store_1p",
"package_store_3p",
"node_modules",
- # TODO: now that app layer has repo_mapping file in it which is not stable between different operating systems
- # we need to exlude it from checksums
- # See: https://github.com/aspect-build/rules_js/actions/runs/11749187598/job/32734931009?pr=2011
- # "app",
+ "app",
]
# buildifier: disable=function-docstring
-def assert_js_image_layer_listings(name, js_image_layer):
- for layer in layers:
+def assert_js_image_layer_listings(name, js_image_layer, additional_layers = []):
+ all_layers = layers + additional_layers
+ for layer in all_layers:
assert_tar_listing(
name = "assert_{}_{}".format(name, layer),
actual = "{}_{}".format(js_image_layer, layer),
@@ -48,14 +49,14 @@ def assert_js_image_layer_listings(name, js_image_layer):
name = name + "_update_all",
additional_update_targets = [
"assert_{}_{}".format(name, layer)
- for layer in layers
+ for layer in all_layers
],
tags = ["skip-on-bazel6"],
testonly = True,
)
# buildifier: disable=function-docstring
-def make_js_image_layer(name, **kwargs):
+def make_js_image_layer(name, layer_groups = {}, **kwargs):
js_image_layer(
name = name,
testonly = 1,
@@ -64,10 +65,11 @@ def make_js_image_layer(name, **kwargs):
# we don't care about unstable inputs because it's not our responsibility to keep them stable which would expand api surface for js_image_layer
"no-remote-exec",
],
+ layer_groups = layer_groups,
**kwargs
)
- for layer in layers:
+ for layer in layers + layer_groups.keys():
native.filegroup(
name = name + "_" + layer,
srcs = [name],
@@ -79,7 +81,7 @@ def assert_checksum(name, image_layer):
native.genrule(
name = name,
testonly = True,
- srcs = [image_layer],
+ srcs = ["{}_{}".format(image_layer, layer) for layer in layers],
outs = [name + ".checksums"],
# TODO: now that app layer has repo_mapping file in it which is not stable between different operating systems
# we need to exlude it from checksums
diff --git a/js/private/test/image/checksum_test.bzlmod.expected b/js/private/test/image/checksum_test.bzlmod.expected
index 81fc407c2..73596bc2d 100644
--- a/js/private/test/image/checksum_test.bzlmod.expected
+++ b/js/private/test/image/checksum_test.bzlmod.expected
@@ -1,4 +1,4 @@
-c603eafdacc184f3df28ef966704cd580bf5f53c7d599f77132abaac45c110fc js/private/test/image/cksum_node.tar
-eec022801c54978ece38859f525f6f7114dcf743ea5e4564ef2a8a522d51aeab js/private/test/image/cksum_package_store_3p.tar
-9395e137de4767edfdd663bc6010a597844bdb68663f8b3ecb036175122bcb2f js/private/test/image/cksum_package_store_1p.tar
-fbd40000f29527fb494ba83172bf55ecb01e01b29a8ff4727ead46e4ebf745f1 js/private/test/image/cksum_node_modules.tar
+30d68ec624b56b9ed26b8c4158e763ef426755a58eb75243717e4425f4d78f76 js/private/test/image/cksum_node
+457b4233e0d41c0c0d24f1c4d553a18f1195f5b380628e2465943c600af37278 js/private/test/image/cksum_package_store_1p
+9cfeb34dbf744301fa25468020c94c34c5ac6d7c861bd787a4e46a4f9824c7fd js/private/test/image/cksum_package_store_3p
+64cd949f79838b5175573341bd2f3915134c13721f019aa774ddb25849b4d266 js/private/test/image/cksum_node_modules
diff --git a/js/private/test/image/custom_owner_test_app.bzlmod.listing b/js/private/test/image/custom_owner_test_app.bzlmod.listing
new file mode 100644
index 000000000..8cd5dcc30
--- /dev/null
+++ b/js/private/test/image/custom_owner_test_app.bzlmod.listing
@@ -0,0 +1,23 @@
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/
+-r-xr-xr-x 0 100 0 23981 Jan 1 1970 ./app/js/private/test/image/bin
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/
+-r-xr-xr-x 0 100 0 387 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/index.js
+-r-xr-xr-x 0 100 0 164 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_/
+-r-xr-xr-x 0 100 0 23981 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_/bin
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_node_bin/
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_node_bin/node
+-r-xr-xr-x 0 100 0 20 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/main.js
diff --git a/js/private/test/image/custom_owner_test_node.bzlmod.listing b/js/private/test/image/custom_owner_test_node.bzlmod.listing
index 95aca90b9..e3af15db0 100644
--- a/js/private/test/image/custom_owner_test_node.bzlmod.listing
+++ b/js/private/test/image/custom_owner_test_node.bzlmod.listing
@@ -1,17 +1,17 @@
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches
--r-xr-xr-x 0 100 0 32555 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/fs.cjs
--r-xr-xr-x 0 100 0 1702 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/register.cjs
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin
--r-xr-xr-x 0 100 0 80316256 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/
+-r-xr-xr-x 0 100 0 32555 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/fs.cjs
+-r-xr-xr-x 0 100 0 1702 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/register.cjs
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/
+-r-xr-xr-x 0 100 0 80316256 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
diff --git a/js/private/test/image/custom_owner_test_node_modules.bzlmod.listing b/js/private/test/image/custom_owner_test_node_modules.bzlmod.listing
index 091d30f3d..6c3915e60 100644
--- a/js/private/test/image/custom_owner_test_node_modules.bzlmod.listing
+++ b/js/private/test/image/custom_owner_test_node_modules.bzlmod.listing
@@ -1,22 +1,22 @@
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules
-lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
-lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp
-lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
-lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
diff --git a/js/private/test/image/custom_owner_test_package_store_1p.bzlmod.listing b/js/private/test/image/custom_owner_test_package_store_1p.bzlmod.listing
index 4ff7720f9..9cd8e787f 100644
--- a/js/private/test/image/custom_owner_test_package_store_1p.bzlmod.listing
+++ b/js/private/test/image/custom_owner_test_package_store_1p.bzlmod.listing
@@ -1,13 +1,13 @@
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp
-lrwxrwxr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/
+lrwxrwxr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
diff --git a/js/private/test/image/custom_owner_test_package_store_3p.bzlmod.listing b/js/private/test/image/custom_owner_test_package_store_3p.bzlmod.listing
index 1b0eca088..5da47fa67 100644
--- a/js/private/test/image/custom_owner_test_package_store_3p.bzlmod.listing
+++ b/js/private/test/image/custom_owner_test_package_store_3p.bzlmod.listing
@@ -1,113 +1,113 @@
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
--r-xr-xr-x 0 100 0 22267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 0 100 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/LICENSE
--r-xr-xr-x 0 100 0 10799 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/README.md
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin
--r-xr-xr-x 0 100 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/acorn
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist
--r-xr-xr-x 0 100 0 21301 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.mts
--r-xr-xr-x 0 100 0 21301 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 0 100 0 233938 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 0 100 0 222515 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 0 100 0 3261 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/bin.js
--r-xr-xr-x 0 100 0 1061 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/package.json
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
--r-xr-xr-x 0 100 0 19126 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 0 100 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
--r-xr-xr-x 0 100 0 10341 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin
--r-xr-xr-x 0 100 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist
--r-xr-xr-x 0 100 0 6190 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 0 100 0 217950 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 0 100 0 207263 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 0 100 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
--r-xr-xr-x 0 100 0 3285 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
--r-xr-xr-x 0 100 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
--r-xr-xr-x 0 100 0 12680 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
--r-xr-xr-x 0 100 0 513 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
--r-xr-xr-x 0 100 0 1109 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
--r-xr-xr-x 0 100 0 16564 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin
--r-xr-xr-x 0 100 0 44 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser
--r-xr-xr-x 0 100 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
--r-xr-xr-x 0 100 0 6852 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
--r-xr-xr-x 0 100 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
--r-xr-xr-x 0 100 0 1104 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
--r-xr-xr-x 0 100 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
--r-xr-xr-x 0 100 0 1040 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
--r-xr-xr-x 0 100 0 2488 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
--r-xr-xr-x 0 100 0 1463 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
--r-xr-xr-x 0 100 0 3296 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
--r-xr-xr-x 0 100 0 105 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
--r-xr-xr-x 0 100 0 1657 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
--r-xr-xr-x 0 100 0 544 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
--r-xr-xr-x 0 100 0 108 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
--r-xr-xr-x 0 100 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
--r-xr-xr-x 0 100 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node
--r-xr-xr-x 0 100 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
--r-xr-xr-x 0 100 0 281 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
--r-xr-xr-x 0 100 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
--r-xr-xr-x 0 100 0 1106 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
--r-xr-xr-x 0 100 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
--r-xr-xr-x 0 100 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
--r-xr-xr-x 0 100 0 284 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
--r-xr-xr-x 0 100 0 1393 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
--r-xr-xr-x 0 100 0 3306 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
--r-xr-xr-x 0 100 0 107 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
--r-xr-xr-x 0 100 0 1663 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
--r-xr-xr-x 0 100 0 546 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
--r-xr-xr-x 0 100 0 110 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
--r-xr-xr-x 0 100 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
--r-xr-xr-x 0 100 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
--r-xr-xr-x 0 100 0 1765 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
--r-xr-xr-x 0 100 0 7015 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
--r-xr-xr-x 0 100 0 550 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
--r-xr-xr-x 0 100 0 188 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
--r-xr-xr-x 0 100 0 1380 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
--r-xr-xr-x 0 100 0 267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
--r-xr-xr-x 0 100 0 1131 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
--r-xr-xr-x 0 100 0 549 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
--r-xr-xr-x 0 100 0 2609 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
--r-xr-xr-x 0 100 0 553 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
--r-xr-xr-x 0 100 0 1667 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
-drwxr-xr-x 0 100 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd
--r-xr-xr-x 0 100 0 8160 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
--r-xr-xr-x 0 100 0 280 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
--r-xr-xr-x 0 100 0 883 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
--r-xr-xr-x 0 100 0 829 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
--r-xr-xr-x 0 100 0 420 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
--r-xr-xr-x 0 100 0 506 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
--r-xr-xr-x 0 100 0 2020 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
--r-xr-xr-x 0 100 0 5145 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
--r-xr-xr-x 0 100 0 1366 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
--r-xr-xr-x 0 100 0 3267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
--r-xr-xr-x 0 100 0 2030 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
--r-xr-xr-x 0 100 0 3618 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
--r-xr-xr-x 0 100 0 414 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
--r-xr-xr-x 0 100 0 2008 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
--r-xr-xr-x 0 100 0 860 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
--r-xr-xr-x 0 100 0 417 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
--r-xr-xr-x 0 100 0 410 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
--r-xr-xr-x 0 100 0 474 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
--r-xr-xr-x 0 100 0 4428 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
--r-xr-xr-x 0 100 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/
+-r-xr-xr-x 0 100 0 22267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 100 0 1099 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 100 0 10799 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/
+-r-xr-xr-x 0 100 0 60 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/
+-r-xr-xr-x 0 100 0 21301 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.mts
+-r-xr-xr-x 0 100 0 21301 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 100 0 233938 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 100 0 222515 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 100 0 3261 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 100 0 1061 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/
+-r-xr-xr-x 0 100 0 19126 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 100 0 1099 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 100 0 10341 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/
+-r-xr-xr-x 0 100 0 60 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/
+-r-xr-xr-x 0 100 0 6190 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 100 0 217950 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 100 0 207263 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 100 0 49 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 100 0 3285 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 100 0 1058 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/
+-r-xr-xr-x 0 100 0 12680 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
+-r-xr-xr-x 0 100 0 513 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
+-r-xr-xr-x 0 100 0 1109 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
+-r-xr-xr-x 0 100 0 16564 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/
+-r-xr-xr-x 0 100 0 44 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/
+-r-xr-xr-x 0 100 0 412 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
+-r-xr-xr-x 0 100 0 6852 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
+-r-xr-xr-x 0 100 0 54 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
+-r-xr-xr-x 0 100 0 1104 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
+-r-xr-xr-x 0 100 0 1040 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
+-r-xr-xr-x 0 100 0 2488 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
+-r-xr-xr-x 0 100 0 1463 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
+-r-xr-xr-x 0 100 0 3296 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
+-r-xr-xr-x 0 100 0 105 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
+-r-xr-xr-x 0 100 0 1657 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
+-r-xr-xr-x 0 100 0 544 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
+-r-xr-xr-x 0 100 0 108 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
+-r-xr-xr-x 0 100 0 141 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
+-r-xr-xr-x 0 100 0 200 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/
+-r-xr-xr-x 0 100 0 412 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
+-r-xr-xr-x 0 100 0 281 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
+-r-xr-xr-x 0 100 0 54 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
+-r-xr-xr-x 0 100 0 1106 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
+-r-xr-xr-x 0 100 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
+-r-xr-xr-x 0 100 0 323 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
+-r-xr-xr-x 0 100 0 284 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
+-r-xr-xr-x 0 100 0 1393 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
+-r-xr-xr-x 0 100 0 3306 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
+-r-xr-xr-x 0 100 0 107 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
+-r-xr-xr-x 0 100 0 1663 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
+-r-xr-xr-x 0 100 0 546 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
+-r-xr-xr-x 0 100 0 110 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
+-r-xr-xr-x 0 100 0 141 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
+-r-xr-xr-x 0 100 0 200 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
+-r-xr-xr-x 0 100 0 1765 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
+-r-xr-xr-x 0 100 0 7015 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
+-r-xr-xr-x 0 100 0 550 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
+-r-xr-xr-x 0 100 0 188 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
+-r-xr-xr-x 0 100 0 1380 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
+-r-xr-xr-x 0 100 0 267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
+-r-xr-xr-x 0 100 0 1131 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
+-r-xr-xr-x 0 100 0 549 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
+-r-xr-xr-x 0 100 0 2609 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
+-r-xr-xr-x 0 100 0 553 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
+-r-xr-xr-x 0 100 0 1667 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
+drwxr-xr-x 0 100 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/
+-r-xr-xr-x 0 100 0 8160 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
+-r-xr-xr-x 0 100 0 280 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
+-r-xr-xr-x 0 100 0 883 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
+-r-xr-xr-x 0 100 0 829 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
+-r-xr-xr-x 0 100 0 420 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
+-r-xr-xr-x 0 100 0 506 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
+-r-xr-xr-x 0 100 0 2020 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
+-r-xr-xr-x 0 100 0 5145 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
+-r-xr-xr-x 0 100 0 1366 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
+-r-xr-xr-x 0 100 0 3267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
+-r-xr-xr-x 0 100 0 2030 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
+-r-xr-xr-x 0 100 0 3618 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
+-r-xr-xr-x 0 100 0 414 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
+-r-xr-xr-x 0 100 0 2008 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
+-r-xr-xr-x 0 100 0 860 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
+-r-xr-xr-x 0 100 0 417 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
+-r-xr-xr-x 0 100 0 410 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
+-r-xr-xr-x 0 100 0 474 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
+-r-xr-xr-x 0 100 0 4428 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
+-r-xr-xr-x 0 100 0 323 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
diff --git a/js/private/test/image/default_test_app.bzlmod.listing b/js/private/test/image/default_test_app.bzlmod.listing
new file mode 100644
index 000000000..1743a02cd
--- /dev/null
+++ b/js/private/test/image/default_test_app.bzlmod.listing
@@ -0,0 +1,23 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+-r-xr-xr-x 0 0 0 23981 Jan 1 1970 ./app/js/private/test/image/bin
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/
+-r-xr-xr-x 0 0 0 387 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/index.js
+-r-xr-xr-x 0 0 0 164 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_/
+-r-xr-xr-x 0 0 0 23981 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_/bin
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_node_bin/
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/bin_node_bin/node
+-r-xr-xr-x 0 0 0 20 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/main.js
diff --git a/js/private/test/image/default_test_node.bzlmod.listing b/js/private/test/image/default_test_node.bzlmod.listing
index 5bd7fc5c8..fa83251ce 100644
--- a/js/private/test/image/default_test_node.bzlmod.listing
+++ b/js/private/test/image/default_test_node.bzlmod.listing
@@ -1,17 +1,17 @@
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches
--r-xr-xr-x 0 0 0 32555 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/fs.cjs
--r-xr-xr-x 0 0 0 1702 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/register.cjs
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin
--r-xr-xr-x 0 0 0 80316256 Jan 1 1970 app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/
+-r-xr-xr-x 0 0 0 32555 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/fs.cjs
+-r-xr-xr-x 0 0 0 1702 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/node-patches/register.cjs
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/
+-r-xr-xr-x 0 0 0 80316256 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
diff --git a/js/private/test/image/default_test_node_modules.bzlmod.listing b/js/private/test/image/default_test_node_modules.bzlmod.listing
index 16bd00952..722582df2 100644
--- a/js/private/test/image/default_test_node_modules.bzlmod.listing
+++ b/js/private/test/image/default_test_node_modules.bzlmod.listing
@@ -1,22 +1,22 @@
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules
-lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
-lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp
-lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
-lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/examples/npm_package/packages/pkg_d/node_modules/uuid -> ../../../../../node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/@mycorp/pkg-d -> ../../../../../../node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/js/private/test/image/node_modules/acorn -> ../../../../../node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
diff --git a/js/private/test/image/default_test_package_store_1p.bzlmod.listing b/js/private/test/image/default_test_package_store_1p.bzlmod.listing
index 5a3376d34..ab8371224 100644
--- a/js/private/test/image/default_test_package_store_1p.bzlmod.listing
+++ b/js/private/test/image/default_test_package_store_1p.bzlmod.listing
@@ -1,13 +1,13 @@
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp
-lrwxrwxr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/
+lrwxrwxr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/@mycorp+pkg-d@0.0.0/node_modules/@mycorp/pkg-d -> ../../../../../examples/npm_package/packages/pkg_d
diff --git a/js/private/test/image/default_test_package_store_3p.bzlmod.listing b/js/private/test/image/default_test_package_store_3p.bzlmod.listing
index f177eee25..4e474dc56 100644
--- a/js/private/test/image/default_test_package_store_3p.bzlmod.listing
+++ b/js/private/test/image/default_test_package_store_3p.bzlmod.listing
@@ -1,113 +1,113 @@
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn
--r-xr-xr-x 0 0 0 22267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 0 0 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/LICENSE
--r-xr-xr-x 0 0 0 10799 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/README.md
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin
--r-xr-xr-x 0 0 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/acorn
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist
--r-xr-xr-x 0 0 0 21301 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.mts
--r-xr-xr-x 0 0 0 21301 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 0 0 0 233938 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 0 0 0 222515 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 0 0 0 3261 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/bin.js
--r-xr-xr-x 0 0 0 1061 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/package.json
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn
--r-xr-xr-x 0 0 0 19126 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
--r-xr-xr-x 0 0 0 1099 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
--r-xr-xr-x 0 0 0 10341 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin
--r-xr-xr-x 0 0 0 60 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist
--r-xr-xr-x 0 0 0 6190 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
--r-xr-xr-x 0 0 0 217950 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
--r-xr-xr-x 0 0 0 207263 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
--r-xr-xr-x 0 0 0 49 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
--r-xr-xr-x 0 0 0 3285 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
--r-xr-xr-x 0 0 0 1058 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid
--r-xr-xr-x 0 0 0 12680 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
--r-xr-xr-x 0 0 0 513 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
--r-xr-xr-x 0 0 0 1109 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
--r-xr-xr-x 0 0 0 16564 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin
--r-xr-xr-x 0 0 0 44 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser
--r-xr-xr-x 0 0 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
--r-xr-xr-x 0 0 0 6852 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
--r-xr-xr-x 0 0 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
--r-xr-xr-x 0 0 0 1104 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
--r-xr-xr-x 0 0 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
--r-xr-xr-x 0 0 0 1040 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
--r-xr-xr-x 0 0 0 2488 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
--r-xr-xr-x 0 0 0 1463 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
--r-xr-xr-x 0 0 0 3296 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
--r-xr-xr-x 0 0 0 105 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
--r-xr-xr-x 0 0 0 1657 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
--r-xr-xr-x 0 0 0 544 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
--r-xr-xr-x 0 0 0 108 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
--r-xr-xr-x 0 0 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
--r-xr-xr-x 0 0 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node
--r-xr-xr-x 0 0 0 412 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
--r-xr-xr-x 0 0 0 281 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
--r-xr-xr-x 0 0 0 54 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
--r-xr-xr-x 0 0 0 1106 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
--r-xr-xr-x 0 0 0 133 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
--r-xr-xr-x 0 0 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
--r-xr-xr-x 0 0 0 284 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
--r-xr-xr-x 0 0 0 1393 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
--r-xr-xr-x 0 0 0 3306 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
--r-xr-xr-x 0 0 0 107 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
--r-xr-xr-x 0 0 0 1663 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
--r-xr-xr-x 0 0 0 546 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
--r-xr-xr-x 0 0 0 110 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
--r-xr-xr-x 0 0 0 141 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
--r-xr-xr-x 0 0 0 200 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
--r-xr-xr-x 0 0 0 1765 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
--r-xr-xr-x 0 0 0 7015 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
--r-xr-xr-x 0 0 0 550 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
--r-xr-xr-x 0 0 0 188 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
--r-xr-xr-x 0 0 0 1380 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
--r-xr-xr-x 0 0 0 267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
--r-xr-xr-x 0 0 0 1131 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
--r-xr-xr-x 0 0 0 549 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
--r-xr-xr-x 0 0 0 2609 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
--r-xr-xr-x 0 0 0 553 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
--r-xr-xr-x 0 0 0 1667 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
-drwxr-xr-x 0 0 0 0 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd
--r-xr-xr-x 0 0 0 8160 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
--r-xr-xr-x 0 0 0 280 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
--r-xr-xr-x 0 0 0 883 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
--r-xr-xr-x 0 0 0 829 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
--r-xr-xr-x 0 0 0 420 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
--r-xr-xr-x 0 0 0 506 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
--r-xr-xr-x 0 0 0 2020 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
--r-xr-xr-x 0 0 0 5145 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
--r-xr-xr-x 0 0 0 1366 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
--r-xr-xr-x 0 0 0 3267 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
--r-xr-xr-x 0 0 0 2030 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
--r-xr-xr-x 0 0 0 3618 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
--r-xr-xr-x 0 0 0 414 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
--r-xr-xr-x 0 0 0 2008 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
--r-xr-xr-x 0 0 0 860 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
--r-xr-xr-x 0 0 0 417 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
--r-xr-xr-x 0 0 0 410 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
--r-xr-xr-x 0 0 0 474 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
--r-xr-xr-x 0 0 0 4428 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
--r-xr-xr-x 0 0 0 323 Jan 1 1970 app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/
+-r-xr-xr-x 0 0 0 22267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 0 0 1099 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 0 0 10799 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/
+-r-xr-xr-x 0 0 0 60 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/
+-r-xr-xr-x 0 0 0 21301 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.mts
+-r-xr-xr-x 0 0 0 21301 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 0 0 233938 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 0 0 222515 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 0 0 3261 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 0 0 1061 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.12.1/node_modules/acorn/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/
+-r-xr-xr-x 0 0 0 19126 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/CHANGELOG.md
+-r-xr-xr-x 0 0 0 1099 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/LICENSE
+-r-xr-xr-x 0 0 0 10341 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/
+-r-xr-xr-x 0 0 0 60 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/bin/acorn
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/
+-r-xr-xr-x 0 0 0 6190 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.d.ts
+-r-xr-xr-x 0 0 0 217950 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.js
+-r-xr-xr-x 0 0 0 207263 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs
+-r-xr-xr-x 0 0 0 49 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/acorn.mjs.d.ts
+-r-xr-xr-x 0 0 0 3285 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/dist/bin.js
+-r-xr-xr-x 0 0 0 1058 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/acorn@8.7.1/node_modules/acorn/package.json
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/
+-r-xr-xr-x 0 0 0 12680 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CHANGELOG.md
+-r-xr-xr-x 0 0 0 513 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/CONTRIBUTING.md
+-r-xr-xr-x 0 0 0 1109 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/LICENSE.md
+-r-xr-xr-x 0 0 0 16564 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/README.md
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/
+-r-xr-xr-x 0 0 0 44 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/bin/uuid
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/
+-r-xr-xr-x 0 0 0 412 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/index.js
+-r-xr-xr-x 0 0 0 6852 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/md5.js
+-r-xr-xr-x 0 0 0 54 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/nil.js
+-r-xr-xr-x 0 0 0 1104 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/parse.js
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js
+-r-xr-xr-x 0 0 0 1040 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js
+-r-xr-xr-x 0 0 0 2488 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/sha1.js
+-r-xr-xr-x 0 0 0 1463 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js
+-r-xr-xr-x 0 0 0 3296 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v1.js
+-r-xr-xr-x 0 0 0 105 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v3.js
+-r-xr-xr-x 0 0 0 1657 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v35.js
+-r-xr-xr-x 0 0 0 544 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js
+-r-xr-xr-x 0 0 0 108 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v5.js
+-r-xr-xr-x 0 0 0 141 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js
+-r-xr-xr-x 0 0 0 200 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-browser/version.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/
+-r-xr-xr-x 0 0 0 412 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/index.js
+-r-xr-xr-x 0 0 0 281 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/md5.js
+-r-xr-xr-x 0 0 0 54 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/nil.js
+-r-xr-xr-x 0 0 0 1106 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/parse.js
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/regex.js
+-r-xr-xr-x 0 0 0 323 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/rng.js
+-r-xr-xr-x 0 0 0 284 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/sha1.js
+-r-xr-xr-x 0 0 0 1393 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/stringify.js
+-r-xr-xr-x 0 0 0 3306 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v1.js
+-r-xr-xr-x 0 0 0 107 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v3.js
+-r-xr-xr-x 0 0 0 1663 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v35.js
+-r-xr-xr-x 0 0 0 546 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v4.js
+-r-xr-xr-x 0 0 0 110 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/v5.js
+-r-xr-xr-x 0 0 0 141 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/validate.js
+-r-xr-xr-x 0 0 0 200 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/esm-node/version.js
+-r-xr-xr-x 0 0 0 1765 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/index.js
+-r-xr-xr-x 0 0 0 7015 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5-browser.js
+-r-xr-xr-x 0 0 0 550 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/md5.js
+-r-xr-xr-x 0 0 0 188 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/nil.js
+-r-xr-xr-x 0 0 0 1380 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/parse.js
+-r-xr-xr-x 0 0 0 267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/regex.js
+-r-xr-xr-x 0 0 0 1131 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng-browser.js
+-r-xr-xr-x 0 0 0 549 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/rng.js
+-r-xr-xr-x 0 0 0 2609 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1-browser.js
+-r-xr-xr-x 0 0 0 553 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/sha1.js
+-r-xr-xr-x 0 0 0 1667 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/stringify.js
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/
+-r-xr-xr-x 0 0 0 8160 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuid.min.js
+-r-xr-xr-x 0 0 0 280 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidNIL.min.js
+-r-xr-xr-x 0 0 0 883 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidParse.min.js
+-r-xr-xr-x 0 0 0 829 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidStringify.min.js
+-r-xr-xr-x 0 0 0 420 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidValidate.min.js
+-r-xr-xr-x 0 0 0 506 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidVersion.min.js
+-r-xr-xr-x 0 0 0 2020 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv1.min.js
+-r-xr-xr-x 0 0 0 5145 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv3.min.js
+-r-xr-xr-x 0 0 0 1366 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv4.min.js
+-r-xr-xr-x 0 0 0 3267 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/umd/uuidv5.min.js
+-r-xr-xr-x 0 0 0 2030 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/uuid-bin.js
+-r-xr-xr-x 0 0 0 3618 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v1.js
+-r-xr-xr-x 0 0 0 414 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v3.js
+-r-xr-xr-x 0 0 0 2008 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v35.js
+-r-xr-xr-x 0 0 0 860 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v4.js
+-r-xr-xr-x 0 0 0 417 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/v5.js
+-r-xr-xr-x 0 0 0 410 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/validate.js
+-r-xr-xr-x 0 0 0 474 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/dist/version.js
+-r-xr-xr-x 0 0 0 4428 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/package.json
+-r-xr-xr-x 0 0 0 323 Jan 1 1970 ./app/js/private/test/image/bin.runfiles/_main/node_modules/.aspect_rules_js/uuid@8.3.2/node_modules/uuid/wrapper.mjs
diff --git a/js/private/test/image/non_ascii/BUILD.bazel b/js/private/test/image/non_ascii/BUILD.bazel
new file mode 100644
index 000000000..cfe334387
--- /dev/null
+++ b/js/private/test/image/non_ascii/BUILD.bazel
@@ -0,0 +1,29 @@
+load("//js:defs.bzl", "js_binary")
+load("//js/private/test/image:asserts.bzl", "assert_js_image_layer_listings", "make_js_image_layer")
+
+# Case 3: Layer groups
+# bazel run //js/private/test/image/non_ascii:custom_layer_groups_test_update_all
+js_binary(
+ name = "bin2",
+ data = [
+ "empty empty.ã„´ã……",
+ "ㅑㅕㅣㅇ.ㄴㅅ",
+ ],
+ entry_point = "main.js",
+)
+
+make_js_image_layer(
+ name = "custom_layer_groups",
+ binary = ":bin2",
+ layer_groups = {
+ "just_the_fs_patch": ".*js\\/private\\/node-patches\\/fs\\.cjs",
+ },
+ platform = "//js/private/test/image:linux_amd64",
+ root = "/app",
+)
+
+assert_js_image_layer_listings(
+ name = "custom_layer_groups_test",
+ additional_layers = ["just_the_fs_patch"],
+ js_image_layer = ":custom_layer_groups",
+)
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_app.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_app.bzlmod.listing
new file mode 100644
index 000000000..46846288d
--- /dev/null
+++ b/js/private/test/image/non_ascii/custom_layer_groups_test_app.bzlmod.listing
@@ -0,0 +1,21 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/
+-r-xr-xr-x 0 0 0 24076 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/
+-r-xr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/ㅑㅕㅣㅇ.ㄴㅅ
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/bin2_/
+-r-xr-xr-x 0 0 0 24076 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/bin2_/bin2
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/bin2_node_bin/
+-r-xr-xr-x 0 0 0 133 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/bin2_node_bin/node
+-r-xr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/empty empty.ã„´ã……
+-r-xr-xr-x 0 0 0 20 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/test/image/non_ascii/main.js
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_just_the_fs_patch.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_just_the_fs_patch.bzlmod.listing
new file mode 100644
index 000000000..81c983a36
--- /dev/null
+++ b/js/private/test/image/non_ascii/custom_layer_groups_test_just_the_fs_patch.bzlmod.listing
@@ -0,0 +1,12 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/node-patches/
+-r-xr-xr-x 0 0 0 32555 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/node-patches/fs.cjs
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_node.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_node.bzlmod.listing
new file mode 100644
index 000000000..e2e666fff
--- /dev/null
+++ b/js/private/test/image/non_ascii/custom_layer_groups_test_node.bzlmod.listing
@@ -0,0 +1,17 @@
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/node-patches/
+-r-xr-xr-x 0 0 0 1702 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/_main/js/private/node-patches/register.cjs
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/rules_nodejs~~node~nodejs_linux_amd64/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/
+drwxr-xr-x 0 0 0 0 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/
+-r-xr-xr-x 0 0 0 80316256 Jan 1 1970 ./app/js/private/test/image/non_ascii/bin2.runfiles/rules_nodejs~~node~nodejs_linux_amd64/bin/nodejs/bin/node
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_node_modules.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_node_modules.bzlmod.listing
new file mode 100644
index 000000000..e69de29bb
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_package_store_1p.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_package_store_1p.bzlmod.listing
new file mode 100644
index 000000000..e69de29bb
diff --git a/js/private/test/image/non_ascii/custom_layer_groups_test_package_store_3p.bzlmod.listing b/js/private/test/image/non_ascii/custom_layer_groups_test_package_store_3p.bzlmod.listing
new file mode 100644
index 000000000..e69de29bb
diff --git "a/js/private/test/image/non_ascii/empty empty.\343\204\264\343\205\205" "b/js/private/test/image/non_ascii/empty empty.\343\204\264\343\205\205"
new file mode 100644
index 000000000..e69de29bb
diff --git a/js/private/test/image/non_ascii/main.js b/js/private/test/image/non_ascii/main.js
new file mode 100644
index 000000000..4b2e66372
--- /dev/null
+++ b/js/private/test/image/non_ascii/main.js
@@ -0,0 +1 @@
+console.log('test')
diff --git "a/js/private/test/image/non_ascii/\343\205\221\343\205\225\343\205\243\343\205\207.\343\204\264\343\205\205" "b/js/private/test/image/non_ascii/\343\205\221\343\205\225\343\205\243\343\205\207.\343\204\264\343\205\205"
new file mode 100644
index 000000000..e69de29bb
diff --git a/js/repositories.bzl b/js/repositories.bzl
index 40eb11b86..7fb58a57f 100644
--- a/js/repositories.bzl
+++ b/js/repositories.bzl
@@ -23,7 +23,7 @@ def rules_js_dependencies():
http_archive(
name = "aspect_bazel_lib",
- sha256 = "f93d386d8d0b0149031175e81df42a488be4267c3ca2249ba5321c23c60bc1f0",
- strip_prefix = "bazel-lib-2.9.1",
- url = "https://github.com/bazel-contrib/bazel-lib/releases/download/v2.9.1/bazel-lib-v2.9.1.tar.gz",
+ sha256 = "40ba9d0f62deac87195723f0f891a9803a7b720d7b89206981ca5570ef9df15b",
+ strip_prefix = "bazel-lib-2.14.0",
+ url = "https://github.com/bazel-contrib/bazel-lib/releases/download/v2.14.0/bazel-lib-v2.14.0.tar.gz",
)
diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl
index 335d6cdaa..a9cc8bb16 100644
--- a/npm/private/npm_import.bzl
+++ b/npm/private/npm_import.bzl
@@ -72,9 +72,8 @@ def npm_imported_package_store(name):
name = "{{}}/ref".format(store_target_name),
package = "{package}",
version = "{version}",
- exclude_package_contents = {exclude_package_contents},
dev = {dev},
- tags = ["manual"],
+ tags = ["manual"],{maybe_exclude_package_contents}
)
# post-lifecycle target with reference deps for use in terminal target with transitive closure
@@ -83,10 +82,9 @@ def npm_imported_package_store(name):
src = "{{}}/pkg_lc".format(store_target_name) if {has_lifecycle_build_target} else "{npm_package_target}",
package = "{package}",
version = "{version}",
- exclude_package_contents = {exclude_package_contents},
dev = {dev},
deps = ref_deps,
- tags = ["manual"],
+ tags = ["manual"],{maybe_exclude_package_contents}
)
# package store target with transitive closure of all npm package dependencies
@@ -95,11 +93,10 @@ def npm_imported_package_store(name):
src = None if {transitive_closure_pattern} else "{npm_package_target}",
package = "{package}",
version = "{version}",
- exclude_package_contents = {exclude_package_contents},
dev = {dev},
deps = deps,
visibility = ["//visibility:public"],
- tags = ["manual"],
+ tags = ["manual"],{maybe_exclude_package_contents}
)
# filegroup target that provides a single file which is
@@ -121,10 +118,9 @@ _LINK_JS_PACKAGE_LIFECYCLE_TMPL = """\
name = "{{}}/pkg_pre_lc_lite".format(store_target_name),
package = "{package}",
version = "{version}",
- exclude_package_contents = {exclude_package_contents},
dev = {dev},
deps = ref_deps,
- tags = ["manual"],
+ tags = ["manual"],{maybe_exclude_package_contents}
)
# terminal pre-lifecycle target for use in lifecycle build target below
@@ -132,10 +128,9 @@ _LINK_JS_PACKAGE_LIFECYCLE_TMPL = """\
name = "{{}}/pkg_pre_lc".format(store_target_name),
package = "{package}",
version = "{version}",
- exclude_package_contents = {exclude_package_contents},
dev = {dev},
deps = lc_deps,
- tags = ["manual"],
+ tags = ["manual"],{maybe_exclude_package_contents}
)
# lifecycle build action
@@ -455,9 +450,16 @@ def _download_and_extract_archive(rctx, package_json_only):
msg = "Failed to create package directory. '{}' exited with {}: \nSTDOUT:\n{}\nSTDERR:\n{}".format(" ".join(mkdir_args), result.return_code, result.stdout, result.stderr)
fail(msg)
+ exclude_pattern_args = []
+ if rctx.attr.exclude_package_contents:
+ for pattern in rctx.attr.exclude_package_contents:
+ if pattern == "":
+ continue
+ exclude_pattern_args.append("--exclude")
+ exclude_pattern_args.append(pattern)
+
# npm packages are always published with one top-level directory inside the tarball, tho the name is not predictable
# so we use tar here which takes a --strip-components N argument instead of rctx.download_and_extract
- exclude_pattern_args = ["--exclude", rctx.attr.exclude_package_contents] if rctx.attr.exclude_package_contents else []
tar_args = ["tar", "-xf", _TARBALL_FILENAME] + ["--strip-components", "1", "-C", _EXTRACT_TO_DIRNAME, "--no-same-owner", "--no-same-permissions"] + exclude_pattern_args
system_tar = detect_system_tar(rctx) if rctx.attr.system_tar == "auto" else rctx.attr.system_tar
@@ -754,6 +756,12 @@ def _npm_import_links_rule_impl(rctx):
public_visibility = ("//visibility:public" in rctx.attr.package_visibility)
+ maybe_exclude_package_contents = ""
+ if rctx.attr.exclude_package_contents == []:
+ maybe_exclude_package_contents = ""
+ elif rctx.attr.exclude_package_contents != None:
+ maybe_exclude_package_contents = "\n exclude_package_contents = " + starlark_codegen_utils.to_list_attr(rctx.attr.exclude_package_contents) + ","
+
npm_link_pkg_bzl_vars = dict(
deps = starlark_codegen_utils.to_dict_attr(deps, 1, quote_key = False),
link_default = "None" if rctx.attr.link_packages else "True",
@@ -779,7 +787,7 @@ def _npm_import_links_rule_impl(rctx):
maybe_bins = maybe_bins,
dev = rctx.attr.dev,
use_default_shell_env = rctx.attr.lifecycle_hooks_use_default_shell_env,
- exclude_package_contents = starlark_codegen_utils.to_list_attr(rctx.attr.exclude_package_contents),
+ maybe_exclude_package_contents = maybe_exclude_package_contents,
)
npm_link_package_bzl = [
@@ -819,7 +827,7 @@ _ATTRS_LINKS = dicts.add(_COMMON_ATTRS, {
"transitive_closure": attr.string_list_dict(),
"package_visibility": attr.string_list(),
"replace_package": attr.string(),
- "exclude_package_contents": attr.string_list(),
+ "exclude_package_contents": attr.string_list(default = []),
})
_ATTRS = dicts.add(_COMMON_ATTRS, {
@@ -827,7 +835,7 @@ _ATTRS = dicts.add(_COMMON_ATTRS, {
"custom_postinstall": attr.string(),
"extra_build_content": attr.string(),
"extract_full_archive": attr.bool(),
- "exclude_package_contents": attr.string(),
+ "exclude_package_contents": attr.string_list(default = []),
"generate_bzl_library_targets": attr.bool(),
"integrity": attr.string(),
"lifecycle_hooks": attr.string_list(),
@@ -934,6 +942,19 @@ def npm_import(
)
```
+ In `MODULE.bazel` the same would look like so:
+
+ ```starlark
+ npm.npm_import(
+ name = "npm__at_types_node__15.12.2",
+ package = "@types/node",
+ version = "15.12.2",
+ integrity = "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",v
+ )
+ use_repo(npm, "npm__at_types_node__15.12.2")
+ use_repo(npm, "npm__at_types_node__15.12.2__links")
+ ```
+
> This is similar to Bazel rules in other ecosystems named "_import" like
> `apple_bundle_import`, `scala_import`, `java_import`, and `py_import`.
> `go_repository` is also a model for this rule.
@@ -1204,6 +1225,7 @@ def npm_import(
),
generate_bzl_library_targets = generate_bzl_library_targets,
extract_full_archive = extract_full_archive,
+ exclude_package_contents = exclude_package_contents,
system_tar = system_tar,
)
diff --git a/npm/private/npm_package_store.bzl b/npm/private/npm_package_store.bzl
index 22923fa97..5c14c9c19 100644
--- a/npm/private/npm_package_store.bzl
+++ b/npm/private/npm_package_store.bzl
@@ -112,6 +112,7 @@ _ATTRS = {
The exclude patterns are relative to the package store directory.
""",
+ default = [],
),
"package": attr.string(
doc = """The package name to link to.
@@ -154,7 +155,6 @@ If set, takes precendance over the package version in the NpmPackageInfo src.
"verbose": attr.bool(
doc = """If true, prints out verbose logs to stdout""",
),
- "_macos_constraint": attr.label(default = "@platforms//os:macos"),
}
def _npm_package_store_impl(ctx):
@@ -230,8 +230,15 @@ def _npm_package_store_impl(ctx):
# tar to strip one directory level. Some packages have directory permissions missing
# executable which make the directories not listable (pngjs@5.0.0 for example).
bsdtar = ctx.toolchains["@aspect_bazel_lib//lib:tar_toolchain_type"]
- is_macos = ctx.target_platform_has_constraint(ctx.attr._macos_constraint[platform_common.ConstraintValueInfo])
- tar_exclude_package_contents = (["--exclude"] + ctx.attr.exclude_package_contents) if ctx.attr.exclude_package_contents else []
+
+ tar_exclude_package_contents = []
+ if ctx.attr.exclude_package_contents:
+ for pattern in ctx.attr.exclude_package_contents:
+ if pattern == "":
+ continue
+ tar_exclude_package_contents.append("--exclude")
+ tar_exclude_package_contents.append(pattern)
+
ctx.actions.run(
executable = bsdtar.tarinfo.binary,
inputs = depset(direct = [src], transitive = [bsdtar.default.files]),
@@ -250,17 +257,10 @@ def _npm_package_store_impl(ctx):
],
mnemonic = "NpmPackageExtract",
progress_message = "Extracting npm package {}@{}".format(package, version),
- # Workaround https://github.com/bazelbuild/bazel-central-registry/issues/2256
+
# Always override the locale to give better hermeticity.
- # See https://github.com/bazelbuild/rules_java/blob/767e4410850453a10ccf89aa1cededf9de05c72e/toolchains/utf8_environment.bzl
- # and https://github.com/libarchive/libarchive/blob/65196fdd1a385f22114f245a9002ee8dc899f2c4/tar/bsdtar.c#L192
- env = {
- "LC_ALL":
- # # macOS doesn't have the C.UTF-8 locale, but en_US.UTF-8 is available and works the same way.
- "en_US.UTF-8" if is_macos else
- # The default UTF-8 locale on all recent Linux distributions. It is also available in Cygwin and MSYS2.
- "C.UTF-8",
- },
+ # See https://github.com/aspect-build/rules_js/issues/2039
+ env = getattr(bsdtar.tarinfo, "default_env", {}),
)
else:
copy_directory_bin_action(
diff --git a/npm/private/npm_translate_lock_generate.bzl b/npm/private/npm_translate_lock_generate.bzl
index db9d2d194..1da2c68c0 100644
--- a/npm/private/npm_translate_lock_generate.bzl
+++ b/npm/private/npm_translate_lock_generate.bzl
@@ -550,7 +550,7 @@ def _gen_npm_import(rctx, system_tar, _import, link_workspace):
maybe_replace_package = ("""
replace_package = "%s",""" % _import.replace_package) if _import.replace_package else ""
maybe_exclude_package_contents = ("""
- exclude_package_contents = %s,""" % _import.exclude_package_contents) if len(_import.exclude_package_contents) > 0 else ""
+ exclude_package_contents = %s,""" % _import.exclude_package_contents) if _import.exclude_package_contents != None else ""
return _NPM_IMPORT_TMPL.format(
link_packages = starlark_codegen_utils.to_dict_attr(_import.link_packages, 2, quote_value = False),
diff --git a/npm/private/npm_translate_lock_helpers.bzl b/npm/private/npm_translate_lock_helpers.bzl
index 270cef4be..f9f4a40d1 100644
--- a/npm/private/npm_translate_lock_helpers.bzl
+++ b/npm/private/npm_translate_lock_helpers.bzl
@@ -47,6 +47,28 @@ Check the public_hoist_packages attribute for duplicates.
)
fail(msg)
+################################################################################
+def _gather_package_content_excludes(keyed_lists, *names):
+ keys = []
+ result = {}
+ for name in names:
+ if name and (name in keyed_lists or "*" in keyed_lists):
+ keys.append(name)
+ v = keyed_lists[name] if name in keyed_lists else keyed_lists["*"]
+ if type(v) == "list":
+ for item in v:
+ result[item] = []
+ elif type(v) == "string":
+ result[v] = []
+ else:
+ fail("expected value to be list or string")
+
+ # in case the key has not been met even once, we return None, instead of empty list as empty list is a valid value
+ if not keys:
+ return None
+
+ return result.keys()
+
################################################################################
def _gather_values_from_matching_names(additive, keyed_lists, *names):
keys = []
@@ -361,7 +383,7 @@ ERROR: can not apply both `pnpm.patchedDependencies` and `npm_translate_lock(pat
patches = [("@" if patch.startswith("//") else "") + patch for patch in patches]
# gather exclude patterns
- exclude_package_contents, _ = _gather_values_from_matching_names(True, attr.exclude_package_contents, name, friendly_name, unfriendly_name)
+ exclude_package_contents = _gather_package_content_excludes(attr.exclude_package_contents, name, friendly_name, unfriendly_name)
# gather replace packages
replace_packages, _ = _gather_values_from_matching_names(True, attr.replace_packages, name, friendly_name, unfriendly_name)
@@ -649,4 +671,5 @@ helpers = struct(
# exported for unit testing
helpers_testonly = struct(
find_missing_bazel_ignores = _find_missing_bazel_ignores,
+ gather_package_content_excludes = _gather_package_content_excludes,
)
diff --git a/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl b/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl
index 1b4903bfb..08fcbb3f0 100644
--- a/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl
+++ b/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl
@@ -36,7 +36,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -47,7 +46,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if True else "@@_main~npm~npm__fsevents__2.3.2//:pkg",
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -59,7 +57,6 @@ def npm_imported_package_store(name):
src = None if True else "@@_main~npm~npm__fsevents__2.3.2//:pkg",
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
@@ -85,7 +82,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc_lite".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -96,7 +92,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = lc_deps,
tags = ["manual"],
diff --git a/npm/private/test/snapshots/bzlmod/npm_defs.bzl b/npm/private/test/snapshots/bzlmod/npm_defs.bzl
index 77a49b330..27e3d9eca 100644
--- a/npm/private/test/snapshots/bzlmod/npm_defs.bzl
+++ b/npm/private/test/snapshots/bzlmod/npm_defs.bzl
@@ -1,1021 +1,1006 @@
"""@generated by npm_translate_lock(name = "npm", pnpm_lock = "@@//:pnpm-lock.yaml")"""
load("@@_main~npm~npm__abbrev__1.1.1__links//:defs.bzl", store_0 = "npm_imported_package_store")
-load("@@_main~npm~npm__abort-controller__3.0.0__links//:defs.bzl", store_1 = "npm_imported_package_store")
-load("@@_main~npm~npm__abortcontroller-polyfill__1.7.5__links//:defs.bzl", link_2 = "npm_link_imported_package_store", store_2 = "npm_imported_package_store")
-load("@@_main~npm~npm__abs-svg-path__0.1.1__links//:defs.bzl", store_3 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn-import-assertions__1.8.0_acorn_8.8.2__links//:defs.bzl", store_4 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn-walk__8.2.0__links//:defs.bzl", store_5 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn__7.4.1__links//:defs.bzl", store_6 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn__8.12.1__links//:defs.bzl", link_7 = "npm_link_imported_package_store", store_7 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn__8.7.1__links//:defs.bzl", link_8 = "npm_link_imported_package_store", store_8 = "npm_imported_package_store")
-load("@@_main~npm~npm__acorn__8.8.2__links//:defs.bzl", link_9 = "npm_link_imported_package_store", store_9 = "npm_imported_package_store")
-load("@@_main~npm~npm__agent-base__6.0.2__links//:defs.bzl", store_10 = "npm_imported_package_store")
-load("@@_main~npm~npm__agentkeepalive__4.2.1__links//:defs.bzl", store_11 = "npm_imported_package_store")
-load("@@_main~npm~npm__aggregate-error__3.1.0__links//:defs.bzl", store_12 = "npm_imported_package_store")
-load("@@_main~npm~npm__ahocorasick__1.0.2__links//:defs.bzl", store_13 = "npm_imported_package_store")
-load("@@_main~npm~npm__ajv-formats__2.1.1_ajv_8.12.0__links//:defs.bzl", store_14 = "npm_imported_package_store")
-load("@@_main~npm~npm__ajv-keywords__3.5.2_ajv_6.12.6__links//:defs.bzl", store_15 = "npm_imported_package_store")
-load("@@_main~npm~npm__ajv-keywords__5.1.0_ajv_8.12.0__links//:defs.bzl", store_16 = "npm_imported_package_store")
-load("@@_main~npm~npm__ajv__6.12.6__links//:defs.bzl", store_17 = "npm_imported_package_store")
-load("@@_main~npm~npm__ajv__8.12.0__links//:defs.bzl", store_18 = "npm_imported_package_store")
-load("@@_main~npm~npm__almost-equal__1.1.0__links//:defs.bzl", store_19 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-colors__4.1.1__links//:defs.bzl", store_20 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-regex__2.1.1__links//:defs.bzl", store_21 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-regex__5.0.1__links//:defs.bzl", store_22 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-regex__6.0.1__links//:defs.bzl", store_23 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-styles__3.2.1__links//:defs.bzl", store_24 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-styles__4.3.0__links//:defs.bzl", store_25 = "npm_imported_package_store")
-load("@@_main~npm~npm__ansi-styles__6.2.1__links//:defs.bzl", store_26 = "npm_imported_package_store")
-load("@@_main~npm~npm__anymatch__3.1.3__links//:defs.bzl", store_27 = "npm_imported_package_store")
-load("@@_main~npm~npm__aproba__1.2.0__links//:defs.bzl", store_28 = "npm_imported_package_store")
-load("@@_main~npm~npm__aproba__2.0.0__links//:defs.bzl", store_29 = "npm_imported_package_store")
-load("@@_main~npm~npm__are-we-there-yet__1.1.7__links//:defs.bzl", store_30 = "npm_imported_package_store")
-load("@@_main~npm~npm__are-we-there-yet__2.0.0__links//:defs.bzl", store_31 = "npm_imported_package_store")
-load("@@_main~npm~npm__are-we-there-yet__3.0.1__links//:defs.bzl", store_32 = "npm_imported_package_store")
-load("@@_main~npm~npm__argparse__2.0.1__links//:defs.bzl", store_33 = "npm_imported_package_store")
-load("@@_main~npm~npm__array-bounds__1.0.1__links//:defs.bzl", store_34 = "npm_imported_package_store")
-load("@@_main~npm~npm__array-find-index__1.0.2__links//:defs.bzl", store_35 = "npm_imported_package_store")
-load("@@_main~npm~npm__array-normalize__1.1.4__links//:defs.bzl", store_36 = "npm_imported_package_store")
-load("@@_main~npm~npm__array-range__1.0.1__links//:defs.bzl", store_37 = "npm_imported_package_store")
-load("@@_main~npm~npm__array-rearrange__2.2.2__links//:defs.bzl", store_38 = "npm_imported_package_store")
-load("@@_main~npm~npm__asn1__0.2.6__links//:defs.bzl", store_39 = "npm_imported_package_store")
-load("@@_main~npm~npm__assert-plus__1.0.0__links//:defs.bzl", store_40 = "npm_imported_package_store")
-load("@@_main~npm~npm__asynckit__0.4.0__links//:defs.bzl", store_41 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_ampproject_remapping__2.2.0__links//:defs.bzl", store_42 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_a__5.0.2__links//:defs.bzl", link_43 = "npm_link_imported_package_store", store_43 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_b__5.0.2__links//:defs.bzl", store_44 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_c__2.0.2__links//:defs.bzl", link_45 = "npm_link_imported_package_store", store_45 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_d__2.0.0_at_aspect-test_c_2.0.2__links//:defs.bzl", store_46 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_e__1.0.0__links//:defs.bzl", link_47 = "npm_link_imported_package_store", store_47 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_aspect-test_f__1.0.0__links//:defs.bzl", link_48 = "npm_link_imported_package_store", store_48 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_code-frame__7.18.6__links//:defs.bzl", store_49 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_compat-data__7.21.0__links//:defs.bzl", store_50 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_core__7.21.0__links//:defs.bzl", store_51 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_generator__7.21.1__links//:defs.bzl", store_52 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-compilation-targets__7.20.7_at_babel_core_7.21.0__links//:defs.bzl", store_53 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-environment-visitor__7.18.9__links//:defs.bzl", store_54 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-function-name__7.21.0__links//:defs.bzl", store_55 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-hoist-variables__7.18.6__links//:defs.bzl", store_56 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-module-imports__7.18.6__links//:defs.bzl", store_57 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-module-transforms__7.21.2__links//:defs.bzl", store_58 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-plugin-utils__7.20.2__links//:defs.bzl", store_59 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-simple-access__7.20.2__links//:defs.bzl", store_60 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-split-export-declaration__7.18.6__links//:defs.bzl", store_61 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-string-parser__7.19.4__links//:defs.bzl", store_62 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-validator-identifier__7.19.1__links//:defs.bzl", store_63 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helper-validator-option__7.21.0__links//:defs.bzl", store_64 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_helpers__7.21.0__links//:defs.bzl", store_65 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_highlight__7.18.6__links//:defs.bzl", store_66 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_parser__7.21.2__links//:defs.bzl", store_67 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_plugin-syntax-typescript__7.20.0_at_babel_core_7.21.0__links//:defs.bzl", store_68 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_runtime__7.21.0__links//:defs.bzl", store_69 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_template__7.20.7__links//:defs.bzl", store_70 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_traverse__7.21.2__links//:defs.bzl", store_71 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_babel_types__7.21.2__links//:defs.bzl", store_72 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_bazel_runfiles__6.3.0__links//:defs.bzl", link_73 = "npm_link_imported_package_store", store_73 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_bcoe_v8-coverage__0.2.3__links//:defs.bzl", store_74 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_choojs_findup__0.2.1__links//:defs.bzl", store_75 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_discoveryjs_json-ext__0.5.7__links//:defs.bzl", store_76 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_emotion_hash__0.9.0__links//:defs.bzl", store_77 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_aix-ppc64__0.24.0__links//:defs.bzl", store_78 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-arm64__0.16.17__links//:defs.bzl", store_79 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-arm64__0.24.0__links//:defs.bzl", store_80 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-arm__0.16.17__links//:defs.bzl", store_81 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-arm__0.24.0__links//:defs.bzl", store_82 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-x64__0.16.17__links//:defs.bzl", store_83 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_android-x64__0.24.0__links//:defs.bzl", store_84 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_darwin-arm64__0.16.17__links//:defs.bzl", store_85 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_darwin-arm64__0.24.0__links//:defs.bzl", store_86 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_darwin-x64__0.16.17__links//:defs.bzl", store_87 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_darwin-x64__0.24.0__links//:defs.bzl", store_88 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_freebsd-arm64__0.16.17__links//:defs.bzl", store_89 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_freebsd-arm64__0.24.0__links//:defs.bzl", store_90 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_freebsd-x64__0.16.17__links//:defs.bzl", store_91 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_freebsd-x64__0.24.0__links//:defs.bzl", store_92 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-arm64__0.16.17__links//:defs.bzl", store_93 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-arm64__0.24.0__links//:defs.bzl", store_94 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-arm__0.16.17__links//:defs.bzl", store_95 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-arm__0.24.0__links//:defs.bzl", store_96 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-ia32__0.16.17__links//:defs.bzl", store_97 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-ia32__0.24.0__links//:defs.bzl", store_98 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-loong64__0.16.17__links//:defs.bzl", store_99 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-loong64__0.24.0__links//:defs.bzl", store_100 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-mips64el__0.16.17__links//:defs.bzl", store_101 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-mips64el__0.24.0__links//:defs.bzl", store_102 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-ppc64__0.16.17__links//:defs.bzl", store_103 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-ppc64__0.24.0__links//:defs.bzl", store_104 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-riscv64__0.16.17__links//:defs.bzl", store_105 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-riscv64__0.24.0__links//:defs.bzl", store_106 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-s390x__0.16.17__links//:defs.bzl", store_107 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-s390x__0.24.0__links//:defs.bzl", store_108 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-x64__0.16.17__links//:defs.bzl", store_109 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_linux-x64__0.24.0__links//:defs.bzl", store_110 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_netbsd-x64__0.16.17__links//:defs.bzl", store_111 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_netbsd-x64__0.24.0__links//:defs.bzl", store_112 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_openbsd-arm64__0.24.0__links//:defs.bzl", store_113 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_openbsd-x64__0.16.17__links//:defs.bzl", store_114 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_openbsd-x64__0.24.0__links//:defs.bzl", store_115 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_sunos-x64__0.16.17__links//:defs.bzl", store_116 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_sunos-x64__0.24.0__links//:defs.bzl", store_117 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-arm64__0.16.17__links//:defs.bzl", store_118 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-arm64__0.24.0__links//:defs.bzl", store_119 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-ia32__0.16.17__links//:defs.bzl", store_120 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-ia32__0.24.0__links//:defs.bzl", store_121 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-x64__0.16.17__links//:defs.bzl", store_122 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_esbuild_win32-x64__0.24.0__links//:defs.bzl", store_123 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_fastify_send__3.3.0__links//:defs.bzl", link_124 = "npm_link_imported_package_store", store_124 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_figma_nodegit__0.28.0-figma.2__links//:defs.bzl", link_125 = "npm_link_imported_package_store", store_125 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_foo_jsonify__at_github.com_aspect-build_test-packages_releases_download_0.0.0_at_foo-jsonify-0.0.0.tgz__links//:defs.bzl", store_126 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_gar_promisify__1.1.3__links//:defs.bzl", store_127 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_gregmagolan_test-a__0.0.1__links//:defs.bzl", store_128 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_gregmagolan_test-b__0.0.2__links//:defs.bzl", link_129 = "npm_link_imported_package_store", store_129 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_isaacs_cliui__8.0.2__links//:defs.bzl", store_130 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_isaacs_fs-minipass__4.0.1__links//:defs.bzl", store_131 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_istanbuljs_schema__0.1.3__links//:defs.bzl", store_132 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.1.1__links//:defs.bzl", store_133 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.3.2__links//:defs.bzl", store_134 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.3.5__links//:defs.bzl", store_135 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_resolve-uri__3.1.0__links//:defs.bzl", store_136 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_set-array__1.1.2__links//:defs.bzl", store_137 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_set-array__1.2.1__links//:defs.bzl", store_138 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_source-map__0.3.2__links//:defs.bzl", store_139 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_source-map__0.3.6__links//:defs.bzl", store_140 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_sourcemap-codec__1.4.14__links//:defs.bzl", store_141 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_trace-mapping__0.3.17__links//:defs.bzl", store_142 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jridgewell_trace-mapping__0.3.25__links//:defs.bzl", store_143 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jsep-plugin_assignment__1.2.1_jsep_1.3.9__links//:defs.bzl", store_144 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_jsep-plugin_regex__1.0.3_jsep_1.3.9__links//:defs.bzl", store_145 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_kubernetes_client-node__github.com_kubernetes-client_javascript_bd6ab5810d013103d244ddaebe0304649c012b38_bufferutil_4.0.8__links//:defs.bzl", link_146 = "npm_link_imported_package_store", store_146 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_lukeed_ms__2.0.2__links//:defs.bzl", store_147 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_geojson-rewind__0.5.2__links//:defs.bzl", store_148 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_geojson-types__1.0.2__links//:defs.bzl", store_149 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_jsonlint-lines-primitives__2.0.2__links//:defs.bzl", store_150 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_mapbox-gl-supported__1.5.0_mapbox-gl_1.10.1__links//:defs.bzl", store_151 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_node-pre-gyp__1.0.10__links//:defs.bzl", store_152 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_point-geometry__0.1.0__links//:defs.bzl", store_153 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_tiny-sdf__1.2.5__links//:defs.bzl", store_154 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_unitbezier__0.0.0__links//:defs.bzl", store_155 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_vector-tile__1.3.1__links//:defs.bzl", store_156 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_mapbox_whoots-js__3.1.0__links//:defs.bzl", store_157 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_npmcli_fs__2.1.2__links//:defs.bzl", store_158 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_npmcli_move-file__2.0.1__links//:defs.bzl", store_159 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_pkgjs_parseargs__0.11.0__links//:defs.bzl", store_160 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_plotly_d3-sankey-circular__0.33.1__links//:defs.bzl", store_161 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_plotly_d3-sankey__0.7.2__links//:defs.bzl", store_162 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_plotly_d3__3.8.1__links//:defs.bzl", store_163 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_plotly_point-cluster__3.1.9__links//:defs.bzl", store_164 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_plotly_regl__2.1.2__links//:defs.bzl", link_165 = "npm_link_imported_package_store", store_165 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_polka_url__1.0.0-next.21__links//:defs.bzl", store_166 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_puppeteer_browsers__0.5.0_typescript_4.9.5__links//:defs.bzl", store_167 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-commonjs__21.1.0_rollup_2.70.2__links//:defs.bzl", link_168 = "npm_link_imported_package_store", store_168 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-commonjs__23.0.7_rollup_2.79.2__links//:defs.bzl", link_169 = "npm_link_imported_package_store", store_169 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-commonjs__23.0.7_rollup_3.29.5__links//:defs.bzl", link_170 = "npm_link_imported_package_store", store_170 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-json__5.0.2_rollup_2.79.2__links//:defs.bzl", link_171 = "npm_link_imported_package_store", store_171 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-json__5.0.2_rollup_3.29.5__links//:defs.bzl", link_172 = "npm_link_imported_package_store", store_172 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-node-resolve__15.3.0_rollup_2.79.2__links//:defs.bzl", link_173 = "npm_link_imported_package_store", store_173 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-node-resolve__15.3.0_rollup_3.29.5__links//:defs.bzl", link_174 = "npm_link_imported_package_store", store_174 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-terser__0.4.4_rollup_2.79.2__links//:defs.bzl", link_175 = "npm_link_imported_package_store", store_175 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_plugin-typescript__10.0.1_574194173__links//:defs.bzl", link_176 = "npm_link_imported_package_store", store_176 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_pluginutils__3.1.0_rollup_2.70.2__links//:defs.bzl", store_177 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_pluginutils__5.0.2_rollup_2.79.2__links//:defs.bzl", store_178 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_rollup_pluginutils__5.0.2_rollup_3.29.5__links//:defs.bzl", store_179 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_sindresorhus_is__2.1.1__links//:defs.bzl", store_180 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_szmarczak_http-timer__4.0.6__links//:defs.bzl", store_181 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_tootallnate_once__2.0.0__links//:defs.bzl", store_182 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_turf_area__6.5.0__links//:defs.bzl", store_183 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_turf_bbox__6.5.0__links//:defs.bzl", store_184 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_turf_centroid__6.5.0__links//:defs.bzl", store_185 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_turf_helpers__6.5.0__links//:defs.bzl", store_186 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_turf_meta__6.5.0__links//:defs.bzl", store_187 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_archiver__5.3.4__links//:defs.bzl", link_188 = "npm_link_imported_package_store", store_188 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_cacheable-request__6.0.3__links//:defs.bzl", store_189 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_caseless__0.12.2__links//:defs.bzl", store_190 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_eslint-scope__3.7.4__links//:defs.bzl", store_191 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_eslint__8.21.1__links//:defs.bzl", store_192 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_estree__0.0.39__links//:defs.bzl", store_193 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_estree__0.0.51__links//:defs.bzl", store_194 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_estree__1.0.0__links//:defs.bzl", store_195 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_google-protobuf__3.15.12__links//:defs.bzl", link_196 = "npm_link_imported_package_store", store_196 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_http-cache-semantics__4.0.1__links//:defs.bzl", store_197 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_istanbul-lib-coverage__2.0.4__links//:defs.bzl", store_198 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_js-yaml__4.0.5__links//:defs.bzl", store_199 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_json-schema__7.0.11__links//:defs.bzl", store_200 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_keyv__3.1.4__links//:defs.bzl", store_201 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_node__16.18.112__links//:defs.bzl", link_202 = "npm_link_imported_package_store", store_202 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_node__18.13.0__links//:defs.bzl", link_203 = "npm_link_imported_package_store", store_203 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_node__18.19.54__links//:defs.bzl", link_204 = "npm_link_imported_package_store", store_204 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_node__22.7.4__links//:defs.bzl", store_205 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_readdir-glob__1.1.5__links//:defs.bzl", store_206 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_request__2.48.8__links//:defs.bzl", store_207 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_resolve__1.20.2__links//:defs.bzl", store_208 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_responselike__1.0.0__links//:defs.bzl", store_209 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_tar-stream__2.2.3__links//:defs.bzl", link_210 = "npm_link_imported_package_store", store_210 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_tough-cookie__4.0.2__links//:defs.bzl", store_211 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_underscore__1.11.4__links//:defs.bzl", store_212 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_ws__8.5.5__links//:defs.bzl", store_213 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_types_yauzl__2.10.0__links//:defs.bzl", store_214 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_babel-plugin-debug-ids__1.0.1__links//:defs.bzl", store_215 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_css__1.9.2__links//:defs.bzl", link_216 = "npm_link_imported_package_store", store_216 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_css__1.9.5__links//:defs.bzl", store_217 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_integration__6.1.0__links//:defs.bzl", store_218 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_private__1.0.3__links//:defs.bzl", store_219 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_vanilla-extract_webpack-plugin__2.2.0_webpack_5.76.3__links//:defs.bzl", link_220 = "npm_link_imported_package_store", store_220 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_ast__1.11.1__links//:defs.bzl", store_221 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_floating-point-hex-parser__1.11.1__links//:defs.bzl", store_222 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_helper-api-error__1.11.1__links//:defs.bzl", store_223 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_helper-buffer__1.11.1__links//:defs.bzl", store_224 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_helper-numbers__1.11.1__links//:defs.bzl", store_225 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_helper-wasm-bytecode__1.11.1__links//:defs.bzl", store_226 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_helper-wasm-section__1.11.1__links//:defs.bzl", store_227 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_ieee754__1.11.1__links//:defs.bzl", store_228 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_leb128__1.11.1__links//:defs.bzl", store_229 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_utf8__1.11.1__links//:defs.bzl", store_230 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_wasm-edit__1.11.1__links//:defs.bzl", store_231 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_wasm-gen__1.11.1__links//:defs.bzl", store_232 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_wasm-opt__1.11.1__links//:defs.bzl", store_233 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_wasm-parser__1.11.1__links//:defs.bzl", store_234 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webassemblyjs_wast-printer__1.11.1__links//:defs.bzl", store_235 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webpack-cli_configtest__2.0.1_1256213976__links//:defs.bzl", store_236 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webpack-cli_info__2.0.1_1256213976__links//:defs.bzl", store_237 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_webpack-cli_serve__2.0.1_1256213976__links//:defs.bzl", store_238 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_xtuc_ieee754__1.2.0__links//:defs.bzl", store_239 = "npm_imported_package_store")
-load("@@_main~npm~npm__at_xtuc_long__4.2.2__links//:defs.bzl", store_240 = "npm_imported_package_store")
-load("@@_main~npm~npm__aws-sign2__0.7.0__links//:defs.bzl", store_241 = "npm_imported_package_store")
-load("@@_main~npm~npm__aws4__1.12.0__links//:defs.bzl", store_242 = "npm_imported_package_store")
-load("@@_main~npm~npm__b4a__1.6.1__links//:defs.bzl", store_243 = "npm_imported_package_store")
-load("@@_main~npm~npm__balanced-match__1.0.2__links//:defs.bzl", store_244 = "npm_imported_package_store")
-load("@@_main~npm~npm__base64-js__1.5.1__links//:defs.bzl", store_245 = "npm_imported_package_store")
-load("@@_main~npm~npm__bcrypt-pbkdf__1.0.2__links//:defs.bzl", store_246 = "npm_imported_package_store")
-load("@@_main~npm~npm__big.js__5.2.2__links//:defs.bzl", store_247 = "npm_imported_package_store")
-load("@@_main~npm~npm__binary-extensions__2.2.0__links//:defs.bzl", store_248 = "npm_imported_package_store")
-load("@@_main~npm~npm__binary-search-bounds__2.0.5__links//:defs.bzl", store_249 = "npm_imported_package_store")
-load("@@_main~npm~npm__bindings__1.5.0__links//:defs.bzl", store_250 = "npm_imported_package_store")
-load("@@_main~npm~npm__bit-twiddle__1.0.2__links//:defs.bzl", store_251 = "npm_imported_package_store")
-load("@@_main~npm~npm__bitmap-sdf__1.0.4__links//:defs.bzl", store_252 = "npm_imported_package_store")
-load("@@_main~npm~npm__bl__1.2.3__links//:defs.bzl", store_253 = "npm_imported_package_store")
-load("@@_main~npm~npm__bl__2.2.1__links//:defs.bzl", store_254 = "npm_imported_package_store")
-load("@@_main~npm~npm__bl__4.1.0__links//:defs.bzl", store_255 = "npm_imported_package_store")
-load("@@_main~npm~npm__bl__6.0.0__links//:defs.bzl", store_256 = "npm_imported_package_store")
-load("@@_main~npm~npm__brace-expansion__1.1.11__links//:defs.bzl", store_257 = "npm_imported_package_store")
-load("@@_main~npm~npm__brace-expansion__2.0.1__links//:defs.bzl", store_258 = "npm_imported_package_store")
-load("@@_main~npm~npm__braces__3.0.2__links//:defs.bzl", store_259 = "npm_imported_package_store")
-load("@@_main~npm~npm__browser-stdout__1.3.1__links//:defs.bzl", store_260 = "npm_imported_package_store")
-load("@@_main~npm~npm__browserslist__4.21.5__links//:defs.bzl", store_261 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer-alloc-unsafe__1.1.0__links//:defs.bzl", store_262 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer-alloc__1.2.0__links//:defs.bzl", store_263 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer-crc32__0.2.13__links//:defs.bzl", store_264 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer-fill__1.0.0__links//:defs.bzl", store_265 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer-from__1.1.2__links//:defs.bzl", store_266 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer__5.7.1__links//:defs.bzl", store_267 = "npm_imported_package_store")
-load("@@_main~npm~npm__buffer__6.0.3__links//:defs.bzl", store_268 = "npm_imported_package_store")
-load("@@_main~npm~npm__bufferutil__4.0.8__links//:defs.bzl", link_269 = "npm_link_imported_package_store", store_269 = "npm_imported_package_store")
-load("@@_main~npm~npm__byline__5.0.0__links//:defs.bzl", store_270 = "npm_imported_package_store")
-load("@@_main~npm~npm__c8__7.13.0__links//:defs.bzl", link_271 = "npm_link_imported_package_store", store_271 = "npm_imported_package_store")
-load("@@_main~npm~npm__cacache__16.1.3__links//:defs.bzl", store_272 = "npm_imported_package_store")
-load("@@_main~npm~npm__cacheable-lookup__2.0.1__links//:defs.bzl", store_273 = "npm_imported_package_store")
-load("@@_main~npm~npm__cacheable-request__7.0.2__links//:defs.bzl", store_274 = "npm_imported_package_store")
-load("@@_main~npm~npm__callsites__3.1.0__links//:defs.bzl", store_275 = "npm_imported_package_store")
-load("@@_main~npm~npm__camelcase__6.3.0__links//:defs.bzl", store_276 = "npm_imported_package_store")
-load("@@_main~npm~npm__caniuse-lite__1.0.30001458__links//:defs.bzl", store_277 = "npm_imported_package_store")
-load("@@_main~npm~npm__canvas-fit__1.5.0__links//:defs.bzl", store_278 = "npm_imported_package_store")
-load("@@_main~npm~npm__caseless__0.12.0__links//:defs.bzl", store_279 = "npm_imported_package_store")
-load("@@_main~npm~npm__chalk__2.4.2__links//:defs.bzl", store_280 = "npm_imported_package_store")
-load("@@_main~npm~npm__chalk__4.1.2__links//:defs.bzl", store_281 = "npm_imported_package_store")
-load("@@_main~npm~npm__chalk__5.0.1__links//:defs.bzl", link_282 = "npm_link_imported_package_store", store_282 = "npm_imported_package_store")
-load("@@_main~npm~npm__chalk__5.1.1__links//:defs.bzl", link_283 = "npm_link_imported_package_store", store_283 = "npm_imported_package_store")
-load("@@_main~npm~npm__charenc__0.0.2__links//:defs.bzl", store_284 = "npm_imported_package_store")
-load("@@_main~npm~npm__chokidar__3.5.3__links//:defs.bzl", store_285 = "npm_imported_package_store")
-load("@@_main~npm~npm__chownr__1.1.4__links//:defs.bzl", store_286 = "npm_imported_package_store")
-load("@@_main~npm~npm__chownr__2.0.0__links//:defs.bzl", store_287 = "npm_imported_package_store")
-load("@@_main~npm~npm__chownr__3.0.0__links//:defs.bzl", store_288 = "npm_imported_package_store")
-load("@@_main~npm~npm__chrome-trace-event__1.0.3__links//:defs.bzl", store_289 = "npm_imported_package_store")
-load("@@_main~npm~npm__chromium-bidi__0.4.7_devtools-protocol_0.0.1107588__links//:defs.bzl", store_290 = "npm_imported_package_store")
-load("@@_main~npm~npm__clamp__1.0.1__links//:defs.bzl", store_291 = "npm_imported_package_store")
-load("@@_main~npm~npm__clean-stack__2.2.0__links//:defs.bzl", store_292 = "npm_imported_package_store")
-load("@@_main~npm~npm__cliui__7.0.4__links//:defs.bzl", store_293 = "npm_imported_package_store")
-load("@@_main~npm~npm__cliui__8.0.1__links//:defs.bzl", store_294 = "npm_imported_package_store")
-load("@@_main~npm~npm__clone-deep__4.0.1__links//:defs.bzl", store_295 = "npm_imported_package_store")
-load("@@_main~npm~npm__clone-response__1.0.3__links//:defs.bzl", store_296 = "npm_imported_package_store")
-load("@@_main~npm~npm__code-point-at__1.1.0__links//:defs.bzl", store_297 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-alpha__1.0.4__links//:defs.bzl", store_298 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-convert__1.9.3__links//:defs.bzl", store_299 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-convert__2.0.1__links//:defs.bzl", store_300 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-id__1.1.0__links//:defs.bzl", store_301 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-name__1.1.3__links//:defs.bzl", store_302 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-name__1.1.4__links//:defs.bzl", store_303 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-normalize__1.5.0__links//:defs.bzl", store_304 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-parse__1.3.8__links//:defs.bzl", store_305 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-rgba__2.1.1__links//:defs.bzl", store_306 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-space__1.16.0__links//:defs.bzl", store_307 = "npm_imported_package_store")
-load("@@_main~npm~npm__color-support__1.1.3__links//:defs.bzl", store_308 = "npm_imported_package_store")
-load("@@_main~npm~npm__colorette__2.0.19__links//:defs.bzl", store_309 = "npm_imported_package_store")
-load("@@_main~npm~npm__combined-stream__1.0.8__links//:defs.bzl", store_310 = "npm_imported_package_store")
-load("@@_main~npm~npm__commander__10.0.1__links//:defs.bzl", store_311 = "npm_imported_package_store")
-load("@@_main~npm~npm__commander__2.20.3__links//:defs.bzl", store_312 = "npm_imported_package_store")
-load("@@_main~npm~npm__commander__7.2.0__links//:defs.bzl", store_313 = "npm_imported_package_store")
-load("@@_main~npm~npm__commander__9.5.0__links//:defs.bzl", store_314 = "npm_imported_package_store")
-load("@@_main~npm~npm__commondir__1.0.1__links//:defs.bzl", store_315 = "npm_imported_package_store")
-load("@@_main~npm~npm__complex.js__2.1.1__links//:defs.bzl", store_316 = "npm_imported_package_store")
-load("@@_main~npm~npm__concat-map__0.0.1__links//:defs.bzl", store_317 = "npm_imported_package_store")
-load("@@_main~npm~npm__concat-stream__1.6.2__links//:defs.bzl", store_318 = "npm_imported_package_store")
-load("@@_main~npm~npm__console-control-strings__1.1.0__links//:defs.bzl", store_319 = "npm_imported_package_store")
-load("@@_main~npm~npm__convert-source-map__1.9.0__links//:defs.bzl", store_320 = "npm_imported_package_store")
-load("@@_main~npm~npm__core-util-is__1.0.2__links//:defs.bzl", store_321 = "npm_imported_package_store")
-load("@@_main~npm~npm__core-util-is__1.0.3__links//:defs.bzl", store_322 = "npm_imported_package_store")
-load("@@_main~npm~npm__cosmiconfig__8.1.3__links//:defs.bzl", store_323 = "npm_imported_package_store")
-load("@@_main~npm~npm__country-regex__1.1.0__links//:defs.bzl", store_324 = "npm_imported_package_store")
-load("@@_main~npm~npm__cross-fetch__3.1.5__links//:defs.bzl", store_325 = "npm_imported_package_store")
-load("@@_main~npm~npm__cross-spawn__7.0.3__links//:defs.bzl", store_326 = "npm_imported_package_store")
-load("@@_main~npm~npm__crypt__0.0.2__links//:defs.bzl", store_327 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-font-size-keywords__1.0.0__links//:defs.bzl", store_328 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-font-stretch-keywords__1.0.1__links//:defs.bzl", store_329 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-font-style-keywords__1.0.1__links//:defs.bzl", store_330 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-font-weight-keywords__1.0.0__links//:defs.bzl", store_331 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-font__1.2.0__links//:defs.bzl", store_332 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-global-keywords__1.0.1__links//:defs.bzl", store_333 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-loader__6.7.3_webpack_5.76.3__links//:defs.bzl", link_334 = "npm_link_imported_package_store", store_334 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-system-font-keywords__1.0.0__links//:defs.bzl", store_335 = "npm_imported_package_store")
-load("@@_main~npm~npm__css-what__5.1.0__links//:defs.bzl", store_336 = "npm_imported_package_store")
-load("@@_main~npm~npm__csscolorparser__1.0.3__links//:defs.bzl", store_337 = "npm_imported_package_store")
-load("@@_main~npm~npm__cssesc__3.0.0__links//:defs.bzl", store_338 = "npm_imported_package_store")
-load("@@_main~npm~npm__csstype__3.1.1__links//:defs.bzl", store_339 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-array__1.2.4__links//:defs.bzl", store_340 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-collection__1.0.7__links//:defs.bzl", store_341 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-color__1.4.1__links//:defs.bzl", store_342 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-dispatch__1.0.6__links//:defs.bzl", store_343 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-force__1.2.1__links//:defs.bzl", store_344 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-format__1.4.5__links//:defs.bzl", store_345 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-geo-projection__2.9.0__links//:defs.bzl", store_346 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-geo__1.12.1__links//:defs.bzl", store_347 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-hierarchy__1.1.9__links//:defs.bzl", store_348 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-interpolate__3.0.1__links//:defs.bzl", store_349 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-path__1.0.9__links//:defs.bzl", store_350 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-quadtree__1.0.7__links//:defs.bzl", store_351 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-shape__1.3.7__links//:defs.bzl", store_352 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-time-format__2.3.0__links//:defs.bzl", store_353 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-time__1.1.0__links//:defs.bzl", store_354 = "npm_imported_package_store")
-load("@@_main~npm~npm__d3-timer__1.0.10__links//:defs.bzl", store_355 = "npm_imported_package_store")
-load("@@_main~npm~npm__d__1.0.1__links//:defs.bzl", store_356 = "npm_imported_package_store")
-load("@@_main~npm~npm__dashdash__1.14.1__links//:defs.bzl", store_357 = "npm_imported_package_store")
-load("@@_main~npm~npm__date.js__0.3.3__links//:defs.bzl", store_358 = "npm_imported_package_store")
-load("@@_main~npm~npm__debug__2.6.9__links//:defs.bzl", store_359 = "npm_imported_package_store")
-load("@@_main~npm~npm__debug__3.1.0__links//:defs.bzl", store_360 = "npm_imported_package_store")
-load("@@_main~npm~npm__debug__3.2.7__links//:defs.bzl", link_361 = "npm_link_imported_package_store", store_361 = "npm_imported_package_store")
-load("@@_main~npm~npm__debug__4.3.4_supports-color_8.1.1__links//:defs.bzl", store_362 = "npm_imported_package_store")
-load("@@_main~npm~npm__debug__github.com_ngokevin_debug_9742c5f383a6f8046241920156236ade8ec30d53__links//:defs.bzl", link_363 = "npm_link_imported_package_store", store_363 = "npm_imported_package_store")
-load("@@_main~npm~npm__decamelize__4.0.0__links//:defs.bzl", store_364 = "npm_imported_package_store")
-load("@@_main~npm~npm__decimal.js__10.4.3__links//:defs.bzl", store_365 = "npm_imported_package_store")
-load("@@_main~npm~npm__decompress-response__5.0.0__links//:defs.bzl", store_366 = "npm_imported_package_store")
-load("@@_main~npm~npm__deep-extend__0.6.0__links//:defs.bzl", store_367 = "npm_imported_package_store")
-load("@@_main~npm~npm__deep-is__0.1.4__links//:defs.bzl", store_368 = "npm_imported_package_store")
-load("@@_main~npm~npm__deep-object-diff__1.1.9__links//:defs.bzl", store_369 = "npm_imported_package_store")
-load("@@_main~npm~npm__deepmerge__4.3.0__links//:defs.bzl", store_370 = "npm_imported_package_store")
-load("@@_main~npm~npm__defer-to-connect__2.0.1__links//:defs.bzl", store_371 = "npm_imported_package_store")
-load("@@_main~npm~npm__defined__1.0.1__links//:defs.bzl", store_372 = "npm_imported_package_store")
-load("@@_main~npm~npm__delayed-stream__1.0.0__links//:defs.bzl", store_373 = "npm_imported_package_store")
-load("@@_main~npm~npm__delegates__1.0.0__links//:defs.bzl", store_374 = "npm_imported_package_store")
-load("@@_main~npm~npm__depd__1.1.2__links//:defs.bzl", store_375 = "npm_imported_package_store")
-load("@@_main~npm~npm__depd__2.0.0__links//:defs.bzl", store_376 = "npm_imported_package_store")
-load("@@_main~npm~npm__dequal__2.0.3__links//:defs.bzl", store_377 = "npm_imported_package_store")
-load("@@_main~npm~npm__detect-kerning__2.1.2__links//:defs.bzl", store_378 = "npm_imported_package_store")
-load("@@_main~npm~npm__detect-libc__1.0.3__links//:defs.bzl", store_379 = "npm_imported_package_store")
-load("@@_main~npm~npm__detect-libc__2.0.1__links//:defs.bzl", store_380 = "npm_imported_package_store")
-load("@@_main~npm~npm__devtools-protocol__0.0.1107588__links//:defs.bzl", store_381 = "npm_imported_package_store")
-load("@@_main~npm~npm__diff__5.0.0__links//:defs.bzl", store_382 = "npm_imported_package_store")
-load("@@_main~npm~npm__diff__5.1.0__links//:defs.bzl", store_383 = "npm_imported_package_store")
-load("@@_main~npm~npm__draw-svg-path__1.0.0__links//:defs.bzl", store_384 = "npm_imported_package_store")
-load("@@_main~npm~npm__dtype__2.0.0__links//:defs.bzl", store_385 = "npm_imported_package_store")
-load("@@_main~npm~npm__dup__1.0.0__links//:defs.bzl", store_386 = "npm_imported_package_store")
-load("@@_main~npm~npm__duplexer3__0.1.5__links//:defs.bzl", store_387 = "npm_imported_package_store")
-load("@@_main~npm~npm__duplexer__0.1.2__links//:defs.bzl", store_388 = "npm_imported_package_store")
-load("@@_main~npm~npm__duplexify__3.7.1__links//:defs.bzl", store_389 = "npm_imported_package_store")
-load("@@_main~npm~npm__earcut__2.2.4__links//:defs.bzl", store_390 = "npm_imported_package_store")
-load("@@_main~npm~npm__eastasianwidth__0.2.0__links//:defs.bzl", store_391 = "npm_imported_package_store")
-load("@@_main~npm~npm__ecc-jsbn__0.1.2__links//:defs.bzl", store_392 = "npm_imported_package_store")
-load("@@_main~npm~npm__electron-to-chromium__1.4.311__links//:defs.bzl", store_393 = "npm_imported_package_store")
-load("@@_main~npm~npm__element-size__1.1.1__links//:defs.bzl", store_394 = "npm_imported_package_store")
-load("@@_main~npm~npm__elementary-circuits-directed-graph__1.3.1__links//:defs.bzl", store_395 = "npm_imported_package_store")
-load("@@_main~npm~npm__emoji-regex__8.0.0__links//:defs.bzl", store_396 = "npm_imported_package_store")
-load("@@_main~npm~npm__emoji-regex__9.2.2__links//:defs.bzl", store_397 = "npm_imported_package_store")
-load("@@_main~npm~npm__emojis-list__3.0.0__links//:defs.bzl", store_398 = "npm_imported_package_store")
-load("@@_main~npm~npm__encoding__0.1.13__links//:defs.bzl", store_399 = "npm_imported_package_store")
-load("@@_main~npm~npm__end-of-stream__1.4.4__links//:defs.bzl", store_400 = "npm_imported_package_store")
-load("@@_main~npm~npm__enhanced-resolve__5.12.0__links//:defs.bzl", store_401 = "npm_imported_package_store")
-load("@@_main~npm~npm__env-paths__2.2.1__links//:defs.bzl", store_402 = "npm_imported_package_store")
-load("@@_main~npm~npm__envinfo__7.8.1__links//:defs.bzl", store_403 = "npm_imported_package_store")
-load("@@_main~npm~npm__err-code__2.0.3__links//:defs.bzl", store_404 = "npm_imported_package_store")
-load("@@_main~npm~npm__error-ex__1.3.2__links//:defs.bzl", store_405 = "npm_imported_package_store")
-load("@@_main~npm~npm__es-module-lexer__0.9.3__links//:defs.bzl", store_406 = "npm_imported_package_store")
-load("@@_main~npm~npm__es5-ext__0.10.62__links//:defs.bzl", store_407 = "npm_imported_package_store")
-load("@@_main~npm~npm__es6-iterator__2.0.3__links//:defs.bzl", store_408 = "npm_imported_package_store")
-load("@@_main~npm~npm__es6-symbol__3.1.3__links//:defs.bzl", store_409 = "npm_imported_package_store")
-load("@@_main~npm~npm__es6-weak-map__2.0.3__links//:defs.bzl", store_410 = "npm_imported_package_store")
-load("@@_main~npm~npm__esbuild__0.16.17__links//:defs.bzl", store_411 = "npm_imported_package_store")
-load("@@_main~npm~npm__esbuild__0.24.0__links//:defs.bzl", link_412 = "npm_link_imported_package_store", store_412 = "npm_imported_package_store")
-load("@@_main~npm~npm__escalade__3.1.1__links//:defs.bzl", store_413 = "npm_imported_package_store")
-load("@@_main~npm~npm__escape-html__1.0.3__links//:defs.bzl", store_414 = "npm_imported_package_store")
-load("@@_main~npm~npm__escape-latex__1.2.0__links//:defs.bzl", store_415 = "npm_imported_package_store")
-load("@@_main~npm~npm__escape-string-regexp__1.0.5__links//:defs.bzl", store_416 = "npm_imported_package_store")
-load("@@_main~npm~npm__escape-string-regexp__4.0.0__links//:defs.bzl", store_417 = "npm_imported_package_store")
-load("@@_main~npm~npm__escodegen__1.14.3__links//:defs.bzl", store_418 = "npm_imported_package_store")
-load("@@_main~npm~npm__eslint-scope__5.1.1__links//:defs.bzl", store_419 = "npm_imported_package_store")
-load("@@_main~npm~npm__esprima__1.0.0__links//:defs.bzl", store_420 = "npm_imported_package_store")
-load("@@_main~npm~npm__esprima__4.0.1__links//:defs.bzl", store_421 = "npm_imported_package_store")
-load("@@_main~npm~npm__esrecurse__4.3.0__links//:defs.bzl", store_422 = "npm_imported_package_store")
-load("@@_main~npm~npm__estraverse__4.3.0__links//:defs.bzl", store_423 = "npm_imported_package_store")
-load("@@_main~npm~npm__estraverse__5.3.0__links//:defs.bzl", store_424 = "npm_imported_package_store")
-load("@@_main~npm~npm__estree-walker__1.0.1__links//:defs.bzl", store_425 = "npm_imported_package_store")
-load("@@_main~npm~npm__estree-walker__2.0.2__links//:defs.bzl", store_426 = "npm_imported_package_store")
-load("@@_main~npm~npm__esutils__2.0.3__links//:defs.bzl", store_427 = "npm_imported_package_store")
-load("@@_main~npm~npm__eval__0.1.6__links//:defs.bzl", store_428 = "npm_imported_package_store")
-load("@@_main~npm~npm__event-target-shim__5.0.1__links//:defs.bzl", store_429 = "npm_imported_package_store")
-load("@@_main~npm~npm__events__3.3.0__links//:defs.bzl", store_430 = "npm_imported_package_store")
-load("@@_main~npm~npm__ext__1.7.0__links//:defs.bzl", store_431 = "npm_imported_package_store")
-load("@@_main~npm~npm__extend__3.0.2__links//:defs.bzl", store_432 = "npm_imported_package_store")
-load("@@_main~npm~npm__extract-zip__2.0.1__links//:defs.bzl", store_433 = "npm_imported_package_store")
-load("@@_main~npm~npm__extsprintf__1.3.0__links//:defs.bzl", store_434 = "npm_imported_package_store")
-load("@@_main~npm~npm__falafel__2.2.5__links//:defs.bzl", store_435 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-decode-uri-component__1.0.1__links//:defs.bzl", store_436 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-deep-equal__3.1.3__links//:defs.bzl", store_437 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-fifo__1.1.0__links//:defs.bzl", store_438 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-isnumeric__1.1.4__links//:defs.bzl", store_439 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-json-stable-stringify__2.1.0__links//:defs.bzl", store_440 = "npm_imported_package_store")
-load("@@_main~npm~npm__fast-levenshtein__2.0.6__links//:defs.bzl", store_441 = "npm_imported_package_store")
-load("@@_main~npm~npm__fastest-levenshtein__1.0.16__links//:defs.bzl", store_442 = "npm_imported_package_store")
-load("@@_main~npm~npm__fd-slicer__1.1.0__links//:defs.bzl", store_443 = "npm_imported_package_store")
-load("@@_main~npm~npm__file-uri-to-path__1.0.0__links//:defs.bzl", store_444 = "npm_imported_package_store")
-load("@@_main~npm~npm__fill-range__7.0.1__links//:defs.bzl", store_445 = "npm_imported_package_store")
-load("@@_main~npm~npm__find-up__4.1.0__links//:defs.bzl", store_446 = "npm_imported_package_store")
-load("@@_main~npm~npm__find-up__5.0.0__links//:defs.bzl", store_447 = "npm_imported_package_store")
-load("@@_main~npm~npm__flat__5.0.2__links//:defs.bzl", store_448 = "npm_imported_package_store")
-load("@@_main~npm~npm__flatten-vertex-data__1.0.2__links//:defs.bzl", store_449 = "npm_imported_package_store")
-load("@@_main~npm~npm__font-atlas__2.1.0__links//:defs.bzl", store_450 = "npm_imported_package_store")
-load("@@_main~npm~npm__font-measure__1.2.2__links//:defs.bzl", store_451 = "npm_imported_package_store")
-load("@@_main~npm~npm__foreground-child__2.0.0__links//:defs.bzl", store_452 = "npm_imported_package_store")
-load("@@_main~npm~npm__foreground-child__3.1.1__links//:defs.bzl", store_453 = "npm_imported_package_store")
-load("@@_main~npm~npm__forever-agent__0.6.1__links//:defs.bzl", store_454 = "npm_imported_package_store")
-load("@@_main~npm~npm__form-data__2.3.3__links//:defs.bzl", store_455 = "npm_imported_package_store")
-load("@@_main~npm~npm__form-data__2.5.1__links//:defs.bzl", store_456 = "npm_imported_package_store")
-load("@@_main~npm~npm__fraction.js__4.2.0__links//:defs.bzl", store_457 = "npm_imported_package_store")
-load("@@_main~npm~npm__from2__2.3.0__links//:defs.bzl", store_458 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs-constants__1.0.0__links//:defs.bzl", store_459 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs-extra__11.1.1__links//:defs.bzl", store_460 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs-extra__7.0.1__links//:defs.bzl", store_461 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs-minipass__1.2.7__links//:defs.bzl", store_462 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs-minipass__2.1.0__links//:defs.bzl", store_463 = "npm_imported_package_store")
-load("@@_main~npm~npm__fs.realpath__1.0.0__links//:defs.bzl", store_464 = "npm_imported_package_store")
-load("@@_main~npm~npm__fsevents__2.3.2__links//:defs.bzl", store_465 = "npm_imported_package_store")
-load("@@_main~npm~npm__function-bind__1.1.1__links//:defs.bzl", store_466 = "npm_imported_package_store")
-load("@@_main~npm~npm__gauge__2.7.4__links//:defs.bzl", store_467 = "npm_imported_package_store")
-load("@@_main~npm~npm__gauge__3.0.2__links//:defs.bzl", store_468 = "npm_imported_package_store")
-load("@@_main~npm~npm__gauge__4.0.4__links//:defs.bzl", store_469 = "npm_imported_package_store")
-load("@@_main~npm~npm__gensync__1.0.0-beta.2__links//:defs.bzl", store_470 = "npm_imported_package_store")
-load("@@_main~npm~npm__geojson-vt__3.2.1__links//:defs.bzl", store_471 = "npm_imported_package_store")
-load("@@_main~npm~npm__get-caller-file__2.0.5__links//:defs.bzl", store_472 = "npm_imported_package_store")
-load("@@_main~npm~npm__get-canvas-context__1.0.2__links//:defs.bzl", store_473 = "npm_imported_package_store")
-load("@@_main~npm~npm__get-stream__5.2.0__links//:defs.bzl", store_474 = "npm_imported_package_store")
-load("@@_main~npm~npm__get-stream__6.0.1__links//:defs.bzl", store_475 = "npm_imported_package_store")
-load("@@_main~npm~npm__getpass__0.1.7__links//:defs.bzl", store_476 = "npm_imported_package_store")
-load("@@_main~npm~npm__gl-mat4__1.2.0__links//:defs.bzl", store_477 = "npm_imported_package_store")
-load("@@_main~npm~npm__gl-matrix__3.4.3__links//:defs.bzl", store_478 = "npm_imported_package_store")
-load("@@_main~npm~npm__gl-text__1.3.1__links//:defs.bzl", store_479 = "npm_imported_package_store")
-load("@@_main~npm~npm__gl-util__3.1.3__links//:defs.bzl", store_480 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob-parent__5.1.2__links//:defs.bzl", store_481 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob-to-regexp__0.4.1__links//:defs.bzl", store_482 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob__10.3.3__links//:defs.bzl", store_483 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob__10.4.5__links//:defs.bzl", store_484 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob__7.2.0__links//:defs.bzl", store_485 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob__7.2.3__links//:defs.bzl", store_486 = "npm_imported_package_store")
-load("@@_main~npm~npm__glob__8.1.0__links//:defs.bzl", store_487 = "npm_imported_package_store")
-load("@@_main~npm~npm__globals__11.12.0__links//:defs.bzl", store_488 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-inject-defines__1.0.3__links//:defs.bzl", store_489 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-resolve__0.0.1__links//:defs.bzl", store_490 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-assignments__2.0.2__links//:defs.bzl", store_491 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-defines__1.0.0__links//:defs.bzl", store_492 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-depth__1.1.2__links//:defs.bzl", store_493 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-descope__1.0.2__links//:defs.bzl", store_494 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-inject-block__1.1.0__links//:defs.bzl", store_495 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-properties__1.0.1__links//:defs.bzl", store_496 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-scope__1.1.2__links//:defs.bzl", store_497 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-string__1.0.1__links//:defs.bzl", store_498 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-token-whitespace-trim__1.0.0__links//:defs.bzl", store_499 = "npm_imported_package_store")
-load("@@_main~npm~npm__glsl-tokenizer__2.1.5__links//:defs.bzl", store_500 = "npm_imported_package_store")
-load("@@_main~npm~npm__glslify-bundle__5.1.1__links//:defs.bzl", store_501 = "npm_imported_package_store")
-load("@@_main~npm~npm__glslify-deps__1.3.2__links//:defs.bzl", store_502 = "npm_imported_package_store")
-load("@@_main~npm~npm__glslify__7.1.1__links//:defs.bzl", store_503 = "npm_imported_package_store")
-load("@@_main~npm~npm__google-protobuf__3.21.4__links//:defs.bzl", link_504 = "npm_link_imported_package_store", store_504 = "npm_imported_package_store")
-load("@@_main~npm~npm__got__10.7.0__links//:defs.bzl", store_505 = "npm_imported_package_store")
-load("@@_main~npm~npm__graceful-fs__4.2.10__links//:defs.bzl", store_506 = "npm_imported_package_store")
-load("@@_main~npm~npm__grid-index__1.1.0__links//:defs.bzl", store_507 = "npm_imported_package_store")
-load("@@_main~npm~npm__gzip-size__6.0.0__links//:defs.bzl", store_508 = "npm_imported_package_store")
-load("@@_main~npm~npm__handlebars-utils__1.0.6__links//:defs.bzl", store_509 = "npm_imported_package_store")
-load("@@_main~npm~npm__har-schema__2.0.0__links//:defs.bzl", store_510 = "npm_imported_package_store")
-load("@@_main~npm~npm__har-validator__5.1.5__links//:defs.bzl", store_511 = "npm_imported_package_store")
-load("@@_main~npm~npm__has-flag__3.0.0__links//:defs.bzl", store_512 = "npm_imported_package_store")
-load("@@_main~npm~npm__has-flag__4.0.0__links//:defs.bzl", store_513 = "npm_imported_package_store")
-load("@@_main~npm~npm__has-hover__1.0.1__links//:defs.bzl", store_514 = "npm_imported_package_store")
-load("@@_main~npm~npm__has-passive-events__1.0.0__links//:defs.bzl", store_515 = "npm_imported_package_store")
-load("@@_main~npm~npm__has-unicode__2.0.1__links//:defs.bzl", store_516 = "npm_imported_package_store")
-load("@@_main~npm~npm__has__1.0.3__links//:defs.bzl", store_517 = "npm_imported_package_store")
-load("@@_main~npm~npm__he__1.2.0__links//:defs.bzl", store_518 = "npm_imported_package_store")
-load("@@_main~npm~npm__hello__at_gitpkg.vercel.app_EqualMa_gitpkg-hello_packages_hello__links//:defs.bzl", link_519 = "npm_link_imported_package_store", store_519 = "npm_imported_package_store")
-load("@@_main~npm~npm__helper-date__github.com_coda_helper-date_a2cb4284148cbba7d36173dff4c7c60ce59eae55__links//:defs.bzl", link_520 = "npm_link_imported_package_store", store_520 = "npm_imported_package_store")
-load("@@_main~npm~npm__hot-shots__10.0.0__links//:defs.bzl", link_521 = "npm_link_imported_package_store", store_521 = "npm_imported_package_store")
-load("@@_main~npm~npm__hsluv__0.0.3__links//:defs.bzl", store_522 = "npm_imported_package_store")
-load("@@_main~npm~npm__html-escaper__2.0.2__links//:defs.bzl", store_523 = "npm_imported_package_store")
-load("@@_main~npm~npm__http-cache-semantics__4.1.1__links//:defs.bzl", store_524 = "npm_imported_package_store")
-load("@@_main~npm~npm__http-errors__2.0.0__links//:defs.bzl", store_525 = "npm_imported_package_store")
-load("@@_main~npm~npm__http-proxy-agent__5.0.0__links//:defs.bzl", store_526 = "npm_imported_package_store")
-load("@@_main~npm~npm__http-signature__1.2.0__links//:defs.bzl", store_527 = "npm_imported_package_store")
-load("@@_main~npm~npm__https-proxy-agent__5.0.1__links//:defs.bzl", store_528 = "npm_imported_package_store")
-load("@@_main~npm~npm__humanize-ms__1.2.1__links//:defs.bzl", store_529 = "npm_imported_package_store")
-load("@@_main~npm~npm__iconv-lite__0.4.24__links//:defs.bzl", store_530 = "npm_imported_package_store")
-load("@@_main~npm~npm__iconv-lite__0.6.3__links//:defs.bzl", store_531 = "npm_imported_package_store")
-load("@@_main~npm~npm__icss-utils__5.1.0_postcss_8.4.21__links//:defs.bzl", store_532 = "npm_imported_package_store")
-load("@@_main~npm~npm__ieee754__1.2.1__links//:defs.bzl", store_533 = "npm_imported_package_store")
-load("@@_main~npm~npm__ignore-walk__3.0.4__links//:defs.bzl", store_534 = "npm_imported_package_store")
-load("@@_main~npm~npm__import-fresh__3.3.0__links//:defs.bzl", store_535 = "npm_imported_package_store")
-load("@@_main~npm~npm__import-local__3.1.0__links//:defs.bzl", store_536 = "npm_imported_package_store")
-load("@@_main~npm~npm__imurmurhash__0.1.4__links//:defs.bzl", store_537 = "npm_imported_package_store")
-load("@@_main~npm~npm__indent-string__4.0.0__links//:defs.bzl", store_538 = "npm_imported_package_store")
-load("@@_main~npm~npm__infer-owner__1.0.4__links//:defs.bzl", store_539 = "npm_imported_package_store")
-load("@@_main~npm~npm__inflight__1.0.6__links//:defs.bzl", store_540 = "npm_imported_package_store")
-load("@@_main~npm~npm__inherits__2.0.4__links//:defs.bzl", store_541 = "npm_imported_package_store")
-load("@@_main~npm~npm__ini__1.3.8__links//:defs.bzl", store_542 = "npm_imported_package_store")
-load("@@_main~npm~npm__inline-fixtures__1.1.0__links//:defs.bzl", link_543 = "npm_link_imported_package_store", store_543 = "npm_imported_package_store")
-load("@@_main~npm~npm__inline-fixtures__at_registry.yarnpkg.com_inline-fixtures_-_inline-fixtures-1.1.0.tgz_5f9edf644ac02a1322012dbbb9f0a4739831d662__links//:defs.bzl", link_544 = "npm_link_imported_package_store", store_544 = "npm_imported_package_store")
-load("@@_main~npm~npm__interpret__3.1.1__links//:defs.bzl", store_545 = "npm_imported_package_store")
-load("@@_main~npm~npm__ip__2.0.0__links//:defs.bzl", store_546 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-arrayish__0.2.1__links//:defs.bzl", store_547 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-binary-path__2.1.0__links//:defs.bzl", store_548 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-browser__2.1.0__links//:defs.bzl", store_549 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-buffer__1.1.6__links//:defs.bzl", store_550 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-core-module__2.11.0__links//:defs.bzl", store_551 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-extglob__2.1.1__links//:defs.bzl", store_552 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-finite__1.1.0__links//:defs.bzl", store_553 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-firefox__1.0.3__links//:defs.bzl", store_554 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-fullwidth-code-point__1.0.0__links//:defs.bzl", store_555 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-fullwidth-code-point__3.0.0__links//:defs.bzl", store_556 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-glob__4.0.3__links//:defs.bzl", store_557 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-iexplorer__1.0.0__links//:defs.bzl", store_558 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-lambda__1.0.1__links//:defs.bzl", store_559 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-mobile__4.0.0__links//:defs.bzl", store_560 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-module__1.0.0__links//:defs.bzl", store_561 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-number__6.0.0__links//:defs.bzl", store_562 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-number__7.0.0__links//:defs.bzl", store_563 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-obj__1.0.1__links//:defs.bzl", store_564 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-plain-obj__1.1.0__links//:defs.bzl", store_565 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-plain-obj__2.1.0__links//:defs.bzl", store_566 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-plain-object__2.0.4__links//:defs.bzl", store_567 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-reference__1.2.1__links//:defs.bzl", store_568 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-string-blank__1.0.1__links//:defs.bzl", store_569 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-svg-path__1.0.2__links//:defs.bzl", store_570 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-typedarray__1.0.0__links//:defs.bzl", store_571 = "npm_imported_package_store")
-load("@@_main~npm~npm__is-unicode-supported__0.1.0__links//:defs.bzl", store_572 = "npm_imported_package_store")
-load("@@_main~npm~npm__isarray__0.0.1__links//:defs.bzl", store_573 = "npm_imported_package_store")
-load("@@_main~npm~npm__isarray__1.0.0__links//:defs.bzl", store_574 = "npm_imported_package_store")
-load("@@_main~npm~npm__isarray__2.0.5__links//:defs.bzl", store_575 = "npm_imported_package_store")
-load("@@_main~npm~npm__isexe__2.0.0__links//:defs.bzl", store_576 = "npm_imported_package_store")
-load("@@_main~npm~npm__isobject__3.0.1__links//:defs.bzl", store_577 = "npm_imported_package_store")
-load("@@_main~npm~npm__isomorphic-ws__5.0.0_ws_8.18.0__links//:defs.bzl", store_578 = "npm_imported_package_store")
-load("@@_main~npm~npm__isstream__0.1.2__links//:defs.bzl", store_579 = "npm_imported_package_store")
-load("@@_main~npm~npm__istanbul-lib-coverage__3.2.0__links//:defs.bzl", store_580 = "npm_imported_package_store")
-load("@@_main~npm~npm__istanbul-lib-report__3.0.0__links//:defs.bzl", store_581 = "npm_imported_package_store")
-load("@@_main~npm~npm__istanbul-reports__3.1.5__links//:defs.bzl", store_582 = "npm_imported_package_store")
-load("@@_main~npm~npm__jackspeak__2.2.3__links//:defs.bzl", store_583 = "npm_imported_package_store")
-load("@@_main~npm~npm__jackspeak__3.4.3__links//:defs.bzl", store_584 = "npm_imported_package_store")
-load("@@_main~npm~npm__jasmine-core__5.1.0__links//:defs.bzl", store_585 = "npm_imported_package_store")
-load("@@_main~npm~npm__jasmine__5.1.0__links//:defs.bzl", link_586 = "npm_link_imported_package_store", store_586 = "npm_imported_package_store")
-load("@@_main~npm~npm__javascript-natural-sort__0.7.1__links//:defs.bzl", store_587 = "npm_imported_package_store")
-load("@@_main~npm~npm__javascript-stringify__2.1.0__links//:defs.bzl", store_588 = "npm_imported_package_store")
-load("@@_main~npm~npm__jest-worker__27.5.1__links//:defs.bzl", store_589 = "npm_imported_package_store")
-load("@@_main~npm~npm__jose__4.12.0__links//:defs.bzl", store_590 = "npm_imported_package_store")
-load("@@_main~npm~npm__js-tokens__4.0.0__links//:defs.bzl", store_591 = "npm_imported_package_store")
-load("@@_main~npm~npm__js-yaml__4.1.0__links//:defs.bzl", store_592 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsbn__0.1.1__links//:defs.bzl", store_593 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsep__1.3.9__links//:defs.bzl", store_594 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsesc__2.5.2__links//:defs.bzl", store_595 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-buffer__3.0.1__links//:defs.bzl", store_596 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-parse-even-better-errors__2.3.1__links//:defs.bzl", store_597 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-schema-traverse__0.4.1__links//:defs.bzl", store_598 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-schema-traverse__1.0.0__links//:defs.bzl", store_599 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-schema__0.4.0__links//:defs.bzl", store_600 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-stable-stringify__1.0.1__links//:defs.bzl", link_601 = "npm_link_imported_package_store", store_601 = "npm_imported_package_store")
-load("@@_main~npm~npm__json-stringify-safe__5.0.1__links//:defs.bzl", store_602 = "npm_imported_package_store")
-load("@@_main~npm~npm__json5__2.2.3__links//:defs.bzl", store_603 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsonc-parser__3.2.0__links//:defs.bzl", store_604 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsonfile__4.0.0__links//:defs.bzl", store_605 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsonfile__6.1.0__links//:defs.bzl", store_606 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsonpath-plus__7.2.0__links//:defs.bzl", link_607 = "npm_link_imported_package_store", store_607 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsonpath-plus__9.0.0__links//:defs.bzl", store_608 = "npm_imported_package_store")
-load("@@_main~npm~npm__jsprim__1.4.2__links//:defs.bzl", store_609 = "npm_imported_package_store")
-load("@@_main~npm~npm__kdbush__3.0.0__links//:defs.bzl", store_610 = "npm_imported_package_store")
-load("@@_main~npm~npm__keyv__4.5.2__links//:defs.bzl", store_611 = "npm_imported_package_store")
-load("@@_main~npm~npm__kind-of__3.2.2__links//:defs.bzl", store_612 = "npm_imported_package_store")
-load("@@_main~npm~npm__kind-of__6.0.3__links//:defs.bzl", store_613 = "npm_imported_package_store")
-load("@@_main~npm~npm__kleur__4.1.5__links//:defs.bzl", store_614 = "npm_imported_package_store")
-load("@@_main~npm~npm__levn__0.3.0__links//:defs.bzl", store_615 = "npm_imported_package_store")
-load("@@_main~npm~npm__lines-and-columns__1.2.4__links//:defs.bzl", store_616 = "npm_imported_package_store")
-load("@@_main~npm~npm__loader-runner__4.3.0__links//:defs.bzl", store_617 = "npm_imported_package_store")
-load("@@_main~npm~npm__loader-utils__2.0.4__links//:defs.bzl", store_618 = "npm_imported_package_store")
-load("@@_main~npm~npm__locate-path__5.0.0__links//:defs.bzl", store_619 = "npm_imported_package_store")
-load("@@_main~npm~npm__locate-path__6.0.0__links//:defs.bzl", store_620 = "npm_imported_package_store")
-load("@@_main~npm~npm__lodash.merge__4.6.2__links//:defs.bzl", store_621 = "npm_imported_package_store")
-load("@@_main~npm~npm__lodash__4.17.21__links//:defs.bzl", link_622 = "npm_link_imported_package_store", store_622 = "npm_imported_package_store")
-load("@@_main~npm~npm__log-symbols__4.1.0__links//:defs.bzl", store_623 = "npm_imported_package_store")
-load("@@_main~npm~npm__loose-envify__1.4.0__links//:defs.bzl", store_624 = "npm_imported_package_store")
-load("@@_main~npm~npm__lowercase-keys__2.0.0__links//:defs.bzl", store_625 = "npm_imported_package_store")
-load("@@_main~npm~npm__lru-cache__10.0.1__links//:defs.bzl", store_626 = "npm_imported_package_store")
-load("@@_main~npm~npm__lru-cache__10.4.3__links//:defs.bzl", store_627 = "npm_imported_package_store")
-load("@@_main~npm~npm__lru-cache__5.1.1__links//:defs.bzl", store_628 = "npm_imported_package_store")
-load("@@_main~npm~npm__lru-cache__6.0.0__links//:defs.bzl", store_629 = "npm_imported_package_store")
-load("@@_main~npm~npm__lru-cache__7.17.0__links//:defs.bzl", store_630 = "npm_imported_package_store")
-load("@@_main~npm~npm__magic-string__0.25.9__links//:defs.bzl", store_631 = "npm_imported_package_store")
-load("@@_main~npm~npm__magic-string__0.27.0__links//:defs.bzl", store_632 = "npm_imported_package_store")
-load("@@_main~npm~npm__make-dir__2.1.0__links//:defs.bzl", store_633 = "npm_imported_package_store")
-load("@@_main~npm~npm__make-dir__3.1.0__links//:defs.bzl", store_634 = "npm_imported_package_store")
-load("@@_main~npm~npm__make-fetch-happen__10.2.1__links//:defs.bzl", store_635 = "npm_imported_package_store")
-load("@@_main~npm~npm__map-limit__0.0.1__links//:defs.bzl", store_636 = "npm_imported_package_store")
-load("@@_main~npm~npm__mapbox-gl__1.10.1__links//:defs.bzl", store_637 = "npm_imported_package_store")
-load("@@_main~npm~npm__math-log2__1.0.1__links//:defs.bzl", store_638 = "npm_imported_package_store")
-load("@@_main~npm~npm__mathjs__11.4.0__links//:defs.bzl", link_639 = "npm_link_imported_package_store", store_639 = "npm_imported_package_store")
-load("@@_main~npm~npm__md5__2.3.0__links//:defs.bzl", store_640 = "npm_imported_package_store")
-load("@@_main~npm~npm__meaning-of-life__1.0.0_o3deharooos255qt5xdujc3cuq__links//:defs.bzl", link_641 = "npm_link_imported_package_store", store_641 = "npm_imported_package_store")
-load("@@_main~npm~npm__media-query-parser__2.0.2__links//:defs.bzl", store_642 = "npm_imported_package_store")
-load("@@_main~npm~npm__merge-stream__2.0.0__links//:defs.bzl", store_643 = "npm_imported_package_store")
-load("@@_main~npm~npm__mime-db__1.52.0__links//:defs.bzl", store_644 = "npm_imported_package_store")
-load("@@_main~npm~npm__mime-types__2.1.35__links//:defs.bzl", store_645 = "npm_imported_package_store")
-load("@@_main~npm~npm__mime__3.0.0__links//:defs.bzl", store_646 = "npm_imported_package_store")
-load("@@_main~npm~npm__mimic-response__1.0.1__links//:defs.bzl", store_647 = "npm_imported_package_store")
-load("@@_main~npm~npm__mimic-response__2.1.0__links//:defs.bzl", store_648 = "npm_imported_package_store")
-load("@@_main~npm~npm__mini-css-extract-plugin__2.7.5_webpack_5.76.3__links//:defs.bzl", link_649 = "npm_link_imported_package_store", store_649 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__3.1.2__links//:defs.bzl", store_650 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__5.0.1__links//:defs.bzl", store_651 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__5.1.6__links//:defs.bzl", store_652 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__6.2.0__links//:defs.bzl", store_653 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__9.0.3__links//:defs.bzl", store_654 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimatch__9.0.5__links//:defs.bzl", store_655 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimist__0.0.10__links//:defs.bzl", store_656 = "npm_imported_package_store")
-load("@@_main~npm~npm__minimist__1.2.8__links//:defs.bzl", store_657 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass-collect__1.0.2__links//:defs.bzl", store_658 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass-fetch__2.1.2__links//:defs.bzl", store_659 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass-flush__1.0.5__links//:defs.bzl", store_660 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass-pipeline__1.2.4__links//:defs.bzl", store_661 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass-sized__1.0.3__links//:defs.bzl", store_662 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass__2.9.0__links//:defs.bzl", store_663 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass__3.3.6__links//:defs.bzl", store_664 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass__4.2.4__links//:defs.bzl", store_665 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass__7.0.3__links//:defs.bzl", store_666 = "npm_imported_package_store")
-load("@@_main~npm~npm__minipass__7.1.2__links//:defs.bzl", store_667 = "npm_imported_package_store")
-load("@@_main~npm~npm__minizlib__1.3.3__links//:defs.bzl", store_668 = "npm_imported_package_store")
-load("@@_main~npm~npm__minizlib__2.1.2__links//:defs.bzl", store_669 = "npm_imported_package_store")
-load("@@_main~npm~npm__minizlib__3.0.1__links//:defs.bzl", store_670 = "npm_imported_package_store")
-load("@@_main~npm~npm__mitt__3.0.0__links//:defs.bzl", store_671 = "npm_imported_package_store")
-load("@@_main~npm~npm__mkdirp-classic__0.5.3__links//:defs.bzl", store_672 = "npm_imported_package_store")
-load("@@_main~npm~npm__mkdirp__0.5.6__links//:defs.bzl", store_673 = "npm_imported_package_store")
-load("@@_main~npm~npm__mkdirp__1.0.4__links//:defs.bzl", store_674 = "npm_imported_package_store")
-load("@@_main~npm~npm__mkdirp__3.0.1__links//:defs.bzl", store_675 = "npm_imported_package_store")
-load("@@_main~npm~npm__mlly__1.1.1__links//:defs.bzl", store_676 = "npm_imported_package_store")
-load("@@_main~npm~npm__mobx-react-lite__3.4.0_mobx_6.3.0_react_17.0.2__links//:defs.bzl", store_677 = "npm_imported_package_store")
-load("@@_main~npm~npm__mobx-react__7.3.0_mobx_6.3.0_react_17.0.2__links//:defs.bzl", link_678 = "npm_link_imported_package_store", store_678 = "npm_imported_package_store")
-load("@@_main~npm~npm__mobx__6.3.0__links//:defs.bzl", link_679 = "npm_link_imported_package_store", store_679 = "npm_imported_package_store")
-load("@@_main~npm~npm__mocha-junit-reporter__2.2.0_mocha_10.2.0__links//:defs.bzl", link_680 = "npm_link_imported_package_store", store_680 = "npm_imported_package_store")
-load("@@_main~npm~npm__mocha-multi-reporters__1.5.1_181752652__links//:defs.bzl", link_681 = "npm_link_imported_package_store", store_681 = "npm_imported_package_store")
-load("@@_main~npm~npm__mocha__10.2.0_mocha-multi-reporters_1.5.1__links//:defs.bzl", link_682 = "npm_link_imported_package_store", store_682 = "npm_imported_package_store")
-load("@@_main~npm~npm__moment-timezone__0.5.41__links//:defs.bzl", store_683 = "npm_imported_package_store")
-load("@@_main~npm~npm__moment__2.29.4__links//:defs.bzl", store_684 = "npm_imported_package_store")
-load("@@_main~npm~npm__mouse-change__1.4.0__links//:defs.bzl", store_685 = "npm_imported_package_store")
-load("@@_main~npm~npm__mouse-event-offset__3.0.2__links//:defs.bzl", store_686 = "npm_imported_package_store")
-load("@@_main~npm~npm__mouse-event__1.0.5__links//:defs.bzl", store_687 = "npm_imported_package_store")
-load("@@_main~npm~npm__mouse-wheel__1.2.0__links//:defs.bzl", store_688 = "npm_imported_package_store")
-load("@@_main~npm~npm__mri__1.2.0__links//:defs.bzl", store_689 = "npm_imported_package_store")
-load("@@_main~npm~npm__mrmime__1.0.1__links//:defs.bzl", store_690 = "npm_imported_package_store")
-load("@@_main~npm~npm__ms__0.7.3__links//:defs.bzl", store_691 = "npm_imported_package_store")
-load("@@_main~npm~npm__ms__2.0.0__links//:defs.bzl", store_692 = "npm_imported_package_store")
-load("@@_main~npm~npm__ms__2.1.2__links//:defs.bzl", store_693 = "npm_imported_package_store")
-load("@@_main~npm~npm__ms__2.1.3__links//:defs.bzl", link_694 = "npm_link_imported_package_store", store_694 = "npm_imported_package_store")
-load("@@_main~npm~npm__mumath__3.3.4__links//:defs.bzl", store_695 = "npm_imported_package_store")
-load("@@_main~npm~npm__murmurhash-js__1.0.0__links//:defs.bzl", store_696 = "npm_imported_package_store")
-load("@@_main~npm~npm__nan__2.17.0__links//:defs.bzl", store_697 = "npm_imported_package_store")
-load("@@_main~npm~npm__nanoid__3.3.3__links//:defs.bzl", store_698 = "npm_imported_package_store")
-load("@@_main~npm~npm__nanoid__3.3.4__links//:defs.bzl", store_699 = "npm_imported_package_store")
-load("@@_main~npm~npm__native-promise-only__0.8.1__links//:defs.bzl", store_700 = "npm_imported_package_store")
-load("@@_main~npm~npm__needle__2.9.1__links//:defs.bzl", store_701 = "npm_imported_package_store")
-load("@@_main~npm~npm__negotiator__0.6.3__links//:defs.bzl", store_702 = "npm_imported_package_store")
-load("@@_main~npm~npm__neo-async__2.6.2__links//:defs.bzl", store_703 = "npm_imported_package_store")
-load("@@_main~npm~npm__next-tick__1.1.0__links//:defs.bzl", store_704 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-fetch__2.6.12__links//:defs.bzl", store_705 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-fetch__2.6.7__links//:defs.bzl", store_706 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-gyp-build__4.6.0__links//:defs.bzl", store_707 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-gyp__7.1.2__links//:defs.bzl", store_708 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-gyp__9.3.0__links//:defs.bzl", link_709 = "npm_link_imported_package_store", store_709 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-pre-gyp__0.13.0__links//:defs.bzl", store_710 = "npm_imported_package_store")
-load("@@_main~npm~npm__node-releases__2.0.10__links//:defs.bzl", store_711 = "npm_imported_package_store")
-load("@@_main~npm~npm__nopt__4.0.3__links//:defs.bzl", store_712 = "npm_imported_package_store")
-load("@@_main~npm~npm__nopt__5.0.0__links//:defs.bzl", store_713 = "npm_imported_package_store")
-load("@@_main~npm~npm__nopt__6.0.0__links//:defs.bzl", store_714 = "npm_imported_package_store")
-load("@@_main~npm~npm__normalize-path__3.0.0__links//:defs.bzl", store_715 = "npm_imported_package_store")
-load("@@_main~npm~npm__normalize-svg-path__0.1.0__links//:defs.bzl", store_716 = "npm_imported_package_store")
-load("@@_main~npm~npm__normalize-svg-path__1.1.0__links//:defs.bzl", store_717 = "npm_imported_package_store")
-load("@@_main~npm~npm__normalize-url__6.1.0__links//:defs.bzl", store_718 = "npm_imported_package_store")
-load("@@_main~npm~npm__npm-bundled__1.1.2__links//:defs.bzl", store_719 = "npm_imported_package_store")
-load("@@_main~npm~npm__npm-normalize-package-bin__1.0.1__links//:defs.bzl", store_720 = "npm_imported_package_store")
-load("@@_main~npm~npm__npm-packlist__1.4.8__links//:defs.bzl", store_721 = "npm_imported_package_store")
-load("@@_main~npm~npm__npmlog__4.1.2__links//:defs.bzl", store_722 = "npm_imported_package_store")
-load("@@_main~npm~npm__npmlog__5.0.1__links//:defs.bzl", store_723 = "npm_imported_package_store")
-load("@@_main~npm~npm__npmlog__6.0.2__links//:defs.bzl", store_724 = "npm_imported_package_store")
-load("@@_main~npm~npm__number-is-integer__1.0.1__links//:defs.bzl", store_725 = "npm_imported_package_store")
-load("@@_main~npm~npm__number-is-nan__1.0.1__links//:defs.bzl", store_726 = "npm_imported_package_store")
-load("@@_main~npm~npm__oauth-sign__0.9.0__links//:defs.bzl", store_727 = "npm_imported_package_store")
-load("@@_main~npm~npm__object-assign__4.1.1__links//:defs.bzl", store_728 = "npm_imported_package_store")
-load("@@_main~npm~npm__object-hash__2.2.0__links//:defs.bzl", store_729 = "npm_imported_package_store")
-load("@@_main~npm~npm__oidc-token-hash__5.0.1__links//:defs.bzl", store_730 = "npm_imported_package_store")
-load("@@_main~npm~npm__once__1.3.3__links//:defs.bzl", store_731 = "npm_imported_package_store")
-load("@@_main~npm~npm__once__1.4.0__links//:defs.bzl", store_732 = "npm_imported_package_store")
-load("@@_main~npm~npm__opener__1.5.2__links//:defs.bzl", store_733 = "npm_imported_package_store")
-load("@@_main~npm~npm__openid-client__5.4.0__links//:defs.bzl", store_734 = "npm_imported_package_store")
-load("@@_main~npm~npm__optimist__0.6.0__links//:defs.bzl", store_735 = "npm_imported_package_store")
-load("@@_main~npm~npm__optionator__0.8.3__links//:defs.bzl", store_736 = "npm_imported_package_store")
-load("@@_main~npm~npm__os-homedir__1.0.2__links//:defs.bzl", store_737 = "npm_imported_package_store")
-load("@@_main~npm~npm__os-tmpdir__1.0.2__links//:defs.bzl", store_738 = "npm_imported_package_store")
-load("@@_main~npm~npm__osenv__0.1.5__links//:defs.bzl", store_739 = "npm_imported_package_store")
-load("@@_main~npm~npm__outdent__0.8.0__links//:defs.bzl", store_740 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-cancelable__2.1.1__links//:defs.bzl", store_741 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-event__4.2.0__links//:defs.bzl", store_742 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-finally__1.0.0__links//:defs.bzl", store_743 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-limit__2.3.0__links//:defs.bzl", store_744 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-limit__3.1.0__links//:defs.bzl", store_745 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-locate__4.1.0__links//:defs.bzl", store_746 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-locate__5.0.0__links//:defs.bzl", store_747 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-map__4.0.0__links//:defs.bzl", store_748 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-timeout__3.2.0__links//:defs.bzl", store_749 = "npm_imported_package_store")
-load("@@_main~npm~npm__p-try__2.2.0__links//:defs.bzl", store_750 = "npm_imported_package_store")
-load("@@_main~npm~npm__package-json-from-dist__1.0.1__links//:defs.bzl", store_751 = "npm_imported_package_store")
-load("@@_main~npm~npm__parent-module__1.0.1__links//:defs.bzl", store_752 = "npm_imported_package_store")
-load("@@_main~npm~npm__parenthesis__3.1.8__links//:defs.bzl", store_753 = "npm_imported_package_store")
-load("@@_main~npm~npm__parse-json__5.2.0__links//:defs.bzl", store_754 = "npm_imported_package_store")
-load("@@_main~npm~npm__parse-rect__1.2.0__links//:defs.bzl", store_755 = "npm_imported_package_store")
-load("@@_main~npm~npm__parse-svg-path__0.1.2__links//:defs.bzl", store_756 = "npm_imported_package_store")
-load("@@_main~npm~npm__parse-unit__1.0.1__links//:defs.bzl", store_757 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-exists__4.0.0__links//:defs.bzl", store_758 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-is-absolute__1.0.1__links//:defs.bzl", store_759 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-key__3.1.1__links//:defs.bzl", store_760 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-parse__1.0.7__links//:defs.bzl", store_761 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-scurry__1.10.1__links//:defs.bzl", store_762 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-scurry__1.11.1__links//:defs.bzl", store_763 = "npm_imported_package_store")
-load("@@_main~npm~npm__path-type__4.0.0__links//:defs.bzl", store_764 = "npm_imported_package_store")
-load("@@_main~npm~npm__pathe__1.1.0__links//:defs.bzl", store_765 = "npm_imported_package_store")
-load("@@_main~npm~npm__pbf__3.2.1__links//:defs.bzl", store_766 = "npm_imported_package_store")
-load("@@_main~npm~npm__pend__1.2.0__links//:defs.bzl", store_767 = "npm_imported_package_store")
-load("@@_main~npm~npm__performance-now__2.1.0__links//:defs.bzl", store_768 = "npm_imported_package_store")
-load("@@_main~npm~npm__pick-by-alias__1.2.0__links//:defs.bzl", store_769 = "npm_imported_package_store")
-load("@@_main~npm~npm__picocolors__1.0.0__links//:defs.bzl", store_770 = "npm_imported_package_store")
-load("@@_main~npm~npm__picomatch__2.3.1__links//:defs.bzl", store_771 = "npm_imported_package_store")
-load("@@_main~npm~npm__pify__4.0.1__links//:defs.bzl", store_772 = "npm_imported_package_store")
-load("@@_main~npm~npm__pkg-dir__4.2.0__links//:defs.bzl", store_773 = "npm_imported_package_store")
-load("@@_main~npm~npm__pkg-types__1.0.2__links//:defs.bzl", store_774 = "npm_imported_package_store")
-load("@@_main~npm~npm__plotly.js__2.25.2__links//:defs.bzl", link_775 = "npm_link_imported_package_store", store_775 = "npm_imported_package_store")
-load("@@_main~npm~npm__pngjs__5.0.0__links//:defs.bzl", link_776 = "npm_link_imported_package_store", store_776 = "npm_imported_package_store")
-load("@@_main~npm~npm__point-in-polygon__1.1.0__links//:defs.bzl", store_777 = "npm_imported_package_store")
-load("@@_main~npm~npm__polybooljs__1.2.0__links//:defs.bzl", store_778 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-modules-extract-imports__3.0.0_postcss_8.4.21__links//:defs.bzl", store_779 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-modules-local-by-default__4.0.0_postcss_8.4.21__links//:defs.bzl", store_780 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-modules-scope__3.0.0_postcss_8.4.21__links//:defs.bzl", store_781 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-modules-values__4.0.0_postcss_8.4.21__links//:defs.bzl", store_782 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-selector-parser__6.0.11__links//:defs.bzl", store_783 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss-value-parser__4.2.0__links//:defs.bzl", store_784 = "npm_imported_package_store")
-load("@@_main~npm~npm__postcss__8.4.21__links//:defs.bzl", store_785 = "npm_imported_package_store")
-load("@@_main~npm~npm__potpack__1.0.2__links//:defs.bzl", store_786 = "npm_imported_package_store")
-load("@@_main~npm~npm__prelude-ls__1.1.2__links//:defs.bzl", store_787 = "npm_imported_package_store")
-load("@@_main~npm~npm__probe-image-size__7.2.3__links//:defs.bzl", store_788 = "npm_imported_package_store")
-load("@@_main~npm~npm__process-nextick-args__2.0.1__links//:defs.bzl", store_789 = "npm_imported_package_store")
-load("@@_main~npm~npm__process__0.11.10__links//:defs.bzl", store_790 = "npm_imported_package_store")
-load("@@_main~npm~npm__progress__2.0.3__links//:defs.bzl", store_791 = "npm_imported_package_store")
-load("@@_main~npm~npm__promise-inflight__1.0.1__links//:defs.bzl", store_792 = "npm_imported_package_store")
-load("@@_main~npm~npm__promise-retry__2.0.1__links//:defs.bzl", store_793 = "npm_imported_package_store")
-load("@@_main~npm~npm__protoc-gen-grpc__github.com_gregmagolan-codaio_protoc-gen-grpc-ts_be5580b06348d3eb9b4610a4a94065154a0df41f__links//:defs.bzl", link_794 = "npm_link_imported_package_store", store_794 = "npm_imported_package_store")
-load("@@_main~npm~npm__protocol-buffers-schema__3.6.0__links//:defs.bzl", store_795 = "npm_imported_package_store")
-load("@@_main~npm~npm__proxy-from-env__1.1.0__links//:defs.bzl", store_796 = "npm_imported_package_store")
-load("@@_main~npm~npm__psl__1.9.0__links//:defs.bzl", store_797 = "npm_imported_package_store")
-load("@@_main~npm~npm__pump__1.0.3__links//:defs.bzl", store_798 = "npm_imported_package_store")
-load("@@_main~npm~npm__pump__3.0.0__links//:defs.bzl", store_799 = "npm_imported_package_store")
-load("@@_main~npm~npm__punycode__2.3.0__links//:defs.bzl", store_800 = "npm_imported_package_store")
-load("@@_main~npm~npm__puppeteer-core__19.11.1_777974123__links//:defs.bzl", store_801 = "npm_imported_package_store")
-load("@@_main~npm~npm__puppeteer__19.11.1_777974123__links//:defs.bzl", link_802 = "npm_link_imported_package_store", store_802 = "npm_imported_package_store")
-load("@@_main~npm~npm__qs__6.5.3__links//:defs.bzl", store_803 = "npm_imported_package_store")
-load("@@_main~npm~npm__queue-tick__1.0.1__links//:defs.bzl", store_804 = "npm_imported_package_store")
-load("@@_main~npm~npm__quickselect__2.0.0__links//:defs.bzl", store_805 = "npm_imported_package_store")
-load("@@_main~npm~npm__raf__3.4.1__links//:defs.bzl", store_806 = "npm_imported_package_store")
-load("@@_main~npm~npm__ramda__0.25.0__links//:defs.bzl", store_807 = "npm_imported_package_store")
-load("@@_main~npm~npm__randombytes__2.1.0__links//:defs.bzl", store_808 = "npm_imported_package_store")
-load("@@_main~npm~npm__rc__1.2.8__links//:defs.bzl", store_809 = "npm_imported_package_store")
-load("@@_main~npm~npm__react__17.0.2__links//:defs.bzl", link_810 = "npm_link_imported_package_store", store_810 = "npm_imported_package_store")
-load("@@_main~npm~npm__read-yaml-file__2.1.0__links//:defs.bzl", store_811 = "npm_imported_package_store")
-load("@@_main~npm~npm__readable-stream__1.0.34__links//:defs.bzl", store_812 = "npm_imported_package_store")
-load("@@_main~npm~npm__readable-stream__2.3.8__links//:defs.bzl", store_813 = "npm_imported_package_store")
-load("@@_main~npm~npm__readable-stream__3.6.1__links//:defs.bzl", store_814 = "npm_imported_package_store")
-load("@@_main~npm~npm__readable-stream__4.3.0__links//:defs.bzl", store_815 = "npm_imported_package_store")
-load("@@_main~npm~npm__readdirp__3.6.0__links//:defs.bzl", store_816 = "npm_imported_package_store")
-load("@@_main~npm~npm__rechoir__0.8.0__links//:defs.bzl", store_817 = "npm_imported_package_store")
-load("@@_main~npm~npm__regenerator-runtime__0.13.11__links//:defs.bzl", store_818 = "npm_imported_package_store")
-load("@@_main~npm~npm__regl-error2d__2.0.12__links//:defs.bzl", store_819 = "npm_imported_package_store")
-load("@@_main~npm~npm__regl-line2d__3.1.2__links//:defs.bzl", store_820 = "npm_imported_package_store")
-load("@@_main~npm~npm__regl-scatter2d__3.3.1__links//:defs.bzl", store_821 = "npm_imported_package_store")
-load("@@_main~npm~npm__regl-splom__1.0.14__links//:defs.bzl", store_822 = "npm_imported_package_store")
-load("@@_main~npm~npm__regl__2.1.0__links//:defs.bzl", store_823 = "npm_imported_package_store")
-load("@@_main~npm~npm__request__2.88.2__links//:defs.bzl", store_824 = "npm_imported_package_store")
-load("@@_main~npm~npm__require-directory__2.1.1__links//:defs.bzl", store_825 = "npm_imported_package_store")
-load("@@_main~npm~npm__require-from-string__2.0.2__links//:defs.bzl", store_826 = "npm_imported_package_store")
-load("@@_main~npm~npm__require-like__0.1.2__links//:defs.bzl", store_827 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve-cwd__3.0.0__links//:defs.bzl", store_828 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve-from__4.0.0__links//:defs.bzl", store_829 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve-from__5.0.0__links//:defs.bzl", store_830 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve-protobuf-schema__2.1.0__links//:defs.bzl", store_831 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve__0.6.3__links//:defs.bzl", store_832 = "npm_imported_package_store")
-load("@@_main~npm~npm__resolve__1.22.1__links//:defs.bzl", store_833 = "npm_imported_package_store")
-load("@@_main~npm~npm__responselike__2.0.1__links//:defs.bzl", store_834 = "npm_imported_package_store")
-load("@@_main~npm~npm__retry__0.12.0__links//:defs.bzl", store_835 = "npm_imported_package_store")
-load("@@_main~npm~npm__rfc4648__1.5.2__links//:defs.bzl", store_836 = "npm_imported_package_store")
-load("@@_main~npm~npm__right-now__1.0.0__links//:defs.bzl", store_837 = "npm_imported_package_store")
-load("@@_main~npm~npm__rimraf__2.7.1__links//:defs.bzl", store_838 = "npm_imported_package_store")
-load("@@_main~npm~npm__rimraf__3.0.2__links//:defs.bzl", store_839 = "npm_imported_package_store")
-load("@@_main~npm~npm__rimraf__5.0.10__links//:defs.bzl", store_840 = "npm_imported_package_store")
-load("@@_main~npm~npm__rollup__2.70.2__links//:defs.bzl", link_841 = "npm_link_imported_package_store", store_841 = "npm_imported_package_store")
-load("@@_main~npm~npm__rollup__2.79.2__links//:defs.bzl", link_842 = "npm_link_imported_package_store", store_842 = "npm_imported_package_store")
-load("@@_main~npm~npm__rollup__3.29.5__links//:defs.bzl", link_843 = "npm_link_imported_package_store", store_843 = "npm_imported_package_store")
-load("@@_main~npm~npm__rw__1.3.3__links//:defs.bzl", store_844 = "npm_imported_package_store")
-load("@@_main~npm~npm__sade__1.8.1__links//:defs.bzl", store_845 = "npm_imported_package_store")
-load("@@_main~npm~npm__safe-buffer__5.1.2__links//:defs.bzl", store_846 = "npm_imported_package_store")
-load("@@_main~npm~npm__safe-buffer__5.2.1__links//:defs.bzl", store_847 = "npm_imported_package_store")
-load("@@_main~npm~npm__safer-buffer__2.1.2__links//:defs.bzl", store_848 = "npm_imported_package_store")
-load("@@_main~npm~npm__sax__1.2.4__links//:defs.bzl", store_849 = "npm_imported_package_store")
-load("@@_main~npm~npm__schema-utils__3.1.1__links//:defs.bzl", store_850 = "npm_imported_package_store")
-load("@@_main~npm~npm__schema-utils__4.0.0__links//:defs.bzl", store_851 = "npm_imported_package_store")
-load("@@_main~npm~npm__seedrandom__3.0.5__links//:defs.bzl", store_852 = "npm_imported_package_store")
-load("@@_main~npm~npm__segfault-handler__1.3.0__links//:defs.bzl", link_853 = "npm_link_imported_package_store", store_853 = "npm_imported_package_store")
-load("@@_main~npm~npm__semver-first-satisfied__1.1.0__links//:defs.bzl", link_854 = "npm_link_imported_package_store", store_854 = "npm_imported_package_store")
-load("@@_main~npm~npm__semver__5.7.1__links//:defs.bzl", store_855 = "npm_imported_package_store")
-load("@@_main~npm~npm__semver__6.3.0__links//:defs.bzl", store_856 = "npm_imported_package_store")
-load("@@_main~npm~npm__semver__7.3.8__links//:defs.bzl", store_857 = "npm_imported_package_store")
-load("@@_main~npm~npm__semver__7.5.0__links//:defs.bzl", store_858 = "npm_imported_package_store")
-load("@@_main~npm~npm__serialize-javascript__6.0.0__links//:defs.bzl", store_859 = "npm_imported_package_store")
-load("@@_main~npm~npm__serialize-javascript__6.0.1__links//:defs.bzl", store_860 = "npm_imported_package_store")
-load("@@_main~npm~npm__set-blocking__2.0.0__links//:defs.bzl", store_861 = "npm_imported_package_store")
-load("@@_main~npm~npm__setprototypeof__1.2.0__links//:defs.bzl", store_862 = "npm_imported_package_store")
-load("@@_main~npm~npm__shallow-clone__3.0.1__links//:defs.bzl", store_863 = "npm_imported_package_store")
-load("@@_main~npm~npm__shallow-copy__0.0.1__links//:defs.bzl", store_864 = "npm_imported_package_store")
-load("@@_main~npm~npm__shebang-command__2.0.0__links//:defs.bzl", store_865 = "npm_imported_package_store")
-load("@@_main~npm~npm__shebang-regex__3.0.0__links//:defs.bzl", store_866 = "npm_imported_package_store")
-load("@@_main~npm~npm__signal-exit__3.0.7__links//:defs.bzl", store_867 = "npm_imported_package_store")
-load("@@_main~npm~npm__signal-exit__4.1.0__links//:defs.bzl", store_868 = "npm_imported_package_store")
-load("@@_main~npm~npm__signum__1.0.0__links//:defs.bzl", store_869 = "npm_imported_package_store")
-load("@@_main~npm~npm__sirv__1.0.19__links//:defs.bzl", store_870 = "npm_imported_package_store")
-load("@@_main~npm~npm__smart-buffer__4.2.0__links//:defs.bzl", store_871 = "npm_imported_package_store")
-load("@@_main~npm~npm__smob__1.5.0__links//:defs.bzl", store_872 = "npm_imported_package_store")
-load("@@_main~npm~npm__socks-proxy-agent__7.0.0__links//:defs.bzl", store_873 = "npm_imported_package_store")
-load("@@_main~npm~npm__socks__2.7.1__links//:defs.bzl", store_874 = "npm_imported_package_store")
-load("@@_main~npm~npm__source-map-js__1.0.2__links//:defs.bzl", store_875 = "npm_imported_package_store")
-load("@@_main~npm~npm__source-map-support__0.5.21__links//:defs.bzl", link_876 = "npm_link_imported_package_store", store_876 = "npm_imported_package_store")
-load("@@_main~npm~npm__source-map__0.6.1__links//:defs.bzl", store_877 = "npm_imported_package_store")
-load("@@_main~npm~npm__sourcemap-codec__1.4.8__links//:defs.bzl", store_878 = "npm_imported_package_store")
-load("@@_main~npm~npm__sshpk__1.17.0__links//:defs.bzl", store_879 = "npm_imported_package_store")
-load("@@_main~npm~npm__ssri__9.0.1__links//:defs.bzl", store_880 = "npm_imported_package_store")
-load("@@_main~npm~npm__stack-trace__0.0.9__links//:defs.bzl", store_881 = "npm_imported_package_store")
-load("@@_main~npm~npm__static-eval__2.1.0__links//:defs.bzl", store_882 = "npm_imported_package_store")
-load("@@_main~npm~npm__statuses__2.0.1__links//:defs.bzl", store_883 = "npm_imported_package_store")
-load("@@_main~npm~npm__stream-buffers__3.0.2__links//:defs.bzl", store_884 = "npm_imported_package_store")
-load("@@_main~npm~npm__stream-parser__0.3.1__links//:defs.bzl", store_885 = "npm_imported_package_store")
-load("@@_main~npm~npm__stream-shift__1.0.1__links//:defs.bzl", store_886 = "npm_imported_package_store")
-load("@@_main~npm~npm__streamx__2.13.2__links//:defs.bzl", store_887 = "npm_imported_package_store")
-load("@@_main~npm~npm__string-split-by__1.0.0__links//:defs.bzl", store_888 = "npm_imported_package_store")
-load("@@_main~npm~npm__string-width__1.0.2__links//:defs.bzl", store_889 = "npm_imported_package_store")
-load("@@_main~npm~npm__string-width__4.2.3__links//:defs.bzl", store_890 = "npm_imported_package_store")
-load("@@_main~npm~npm__string-width__5.1.2__links//:defs.bzl", store_891 = "npm_imported_package_store")
-load("@@_main~npm~npm__string_decoder__0.10.31__links//:defs.bzl", store_892 = "npm_imported_package_store")
-load("@@_main~npm~npm__string_decoder__1.1.1__links//:defs.bzl", store_893 = "npm_imported_package_store")
-load("@@_main~npm~npm__string_decoder__1.3.0__links//:defs.bzl", store_894 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-ansi__3.0.1__links//:defs.bzl", store_895 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-ansi__6.0.1__links//:defs.bzl", store_896 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-ansi__7.1.0__links//:defs.bzl", store_897 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-bom__4.0.0__links//:defs.bzl", store_898 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-json-comments__2.0.1__links//:defs.bzl", store_899 = "npm_imported_package_store")
-load("@@_main~npm~npm__strip-json-comments__3.1.1__links//:defs.bzl", store_900 = "npm_imported_package_store")
-load("@@_main~npm~npm__strongly-connected-components__1.0.1__links//:defs.bzl", store_901 = "npm_imported_package_store")
-load("@@_main~npm~npm__supercluster__7.1.5__links//:defs.bzl", store_902 = "npm_imported_package_store")
-load("@@_main~npm~npm__superscript-text__1.0.0__links//:defs.bzl", store_903 = "npm_imported_package_store")
-load("@@_main~npm~npm__supports-color__5.5.0__links//:defs.bzl", store_904 = "npm_imported_package_store")
-load("@@_main~npm~npm__supports-color__7.2.0__links//:defs.bzl", store_905 = "npm_imported_package_store")
-load("@@_main~npm~npm__supports-color__8.1.1__links//:defs.bzl", store_906 = "npm_imported_package_store")
-load("@@_main~npm~npm__supports-preserve-symlinks-flag__1.0.0__links//:defs.bzl", store_907 = "npm_imported_package_store")
-load("@@_main~npm~npm__svg-arc-to-cubic-bezier__3.2.0__links//:defs.bzl", store_908 = "npm_imported_package_store")
-load("@@_main~npm~npm__svg-path-bounds__1.0.2__links//:defs.bzl", store_909 = "npm_imported_package_store")
-load("@@_main~npm~npm__svg-path-sdf__1.1.3__links//:defs.bzl", store_910 = "npm_imported_package_store")
-load("@@_main~npm~npm__syncpack__github.com_JamieMason_syncpack_c245af8ea73ce3345d92bbda6c684092a841e262__links//:defs.bzl", link_911 = "npm_link_imported_package_store", store_911 = "npm_imported_package_store")
-load("@@_main~npm~npm__tapable__2.2.1__links//:defs.bzl", store_912 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar-fs__1.16.3__links//:defs.bzl", store_913 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar-fs__2.1.1__links//:defs.bzl", store_914 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar-stream__1.6.2__links//:defs.bzl", store_915 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar-stream__2.2.0__links//:defs.bzl", store_916 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar-stream__3.0.0__links//:defs.bzl", link_917 = "npm_link_imported_package_store", store_917 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar__4.4.19__links//:defs.bzl", store_918 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar__6.1.13__links//:defs.bzl", store_919 = "npm_imported_package_store")
-load("@@_main~npm~npm__tar__7.4.3__links//:defs.bzl", store_920 = "npm_imported_package_store")
-load("@@_main~npm~npm__terser-webpack-plugin__5.3.6_webpack_5.76.3__links//:defs.bzl", store_921 = "npm_imported_package_store")
-load("@@_main~npm~npm__terser__5.16.5__links//:defs.bzl", store_922 = "npm_imported_package_store")
-load("@@_main~npm~npm__terser__5.34.1__links//:defs.bzl", store_923 = "npm_imported_package_store")
-load("@@_main~npm~npm__test-exclude__6.0.0__links//:defs.bzl", store_924 = "npm_imported_package_store")
-load("@@_main~npm~npm__through2__0.6.5__links//:defs.bzl", store_925 = "npm_imported_package_store")
-load("@@_main~npm~npm__through2__2.0.5__links//:defs.bzl", store_926 = "npm_imported_package_store")
-load("@@_main~npm~npm__through__2.3.8__links//:defs.bzl", store_927 = "npm_imported_package_store")
-load("@@_main~npm~npm__tightrope__0.1.0__links//:defs.bzl", store_928 = "npm_imported_package_store")
-load("@@_main~npm~npm__tiny-emitter__2.1.0__links//:defs.bzl", store_929 = "npm_imported_package_store")
-load("@@_main~npm~npm__tinycolor2__1.6.0__links//:defs.bzl", store_930 = "npm_imported_package_store")
-load("@@_main~npm~npm__tinyqueue__2.0.3__links//:defs.bzl", store_931 = "npm_imported_package_store")
-load("@@_main~npm~npm__tmp__0.0.33__links//:defs.bzl", store_932 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-buffer__1.1.1__links//:defs.bzl", store_933 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-fast-properties__2.0.0__links//:defs.bzl", store_934 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-float32__1.1.0__links//:defs.bzl", store_935 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-px__1.0.1__links//:defs.bzl", store_936 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-readable-stream__2.1.0__links//:defs.bzl", store_937 = "npm_imported_package_store")
-load("@@_main~npm~npm__to-regex-range__5.0.1__links//:defs.bzl", store_938 = "npm_imported_package_store")
-load("@@_main~npm~npm__toidentifier__1.0.1__links//:defs.bzl", store_939 = "npm_imported_package_store")
-load("@@_main~npm~npm__topojson-client__3.1.0__links//:defs.bzl", store_940 = "npm_imported_package_store")
-load("@@_main~npm~npm__totalist__1.1.0__links//:defs.bzl", store_941 = "npm_imported_package_store")
-load("@@_main~npm~npm__tough-cookie__2.5.0__links//:defs.bzl", store_942 = "npm_imported_package_store")
-load("@@_main~npm~npm__tr46__0.0.3__links//:defs.bzl", store_943 = "npm_imported_package_store")
-load("@@_main~npm~npm__tslib__2.7.0__links//:defs.bzl", link_944 = "npm_link_imported_package_store", store_944 = "npm_imported_package_store")
-load("@@_main~npm~npm__tunnel-agent__0.6.0__links//:defs.bzl", store_945 = "npm_imported_package_store")
-load("@@_main~npm~npm__tweetnacl__0.14.5__links//:defs.bzl", store_946 = "npm_imported_package_store")
-load("@@_main~npm~npm__type-check__0.3.2__links//:defs.bzl", store_947 = "npm_imported_package_store")
-load("@@_main~npm~npm__type-fest__0.10.0__links//:defs.bzl", store_948 = "npm_imported_package_store")
-load("@@_main~npm~npm__type__1.2.0__links//:defs.bzl", store_949 = "npm_imported_package_store")
-load("@@_main~npm~npm__type__2.7.2__links//:defs.bzl", store_950 = "npm_imported_package_store")
-load("@@_main~npm~npm__typed-function__4.1.0__links//:defs.bzl", store_951 = "npm_imported_package_store")
-load("@@_main~npm~npm__typedarray-pool__1.2.0__links//:defs.bzl", store_952 = "npm_imported_package_store")
-load("@@_main~npm~npm__typedarray__0.0.6__links//:defs.bzl", store_953 = "npm_imported_package_store")
-load("@@_main~npm~npm__typeof-article__0.1.1__links//:defs.bzl", store_954 = "npm_imported_package_store")
-load("@@_main~npm~npm__typescript__4.9.5__links//:defs.bzl", link_955 = "npm_link_imported_package_store", store_955 = "npm_imported_package_store")
-load("@@_main~npm~npm__ufo__1.1.0__links//:defs.bzl", store_956 = "npm_imported_package_store")
-load("@@_main~npm~npm__unbzip2-stream__1.4.3__links//:defs.bzl", store_957 = "npm_imported_package_store")
-load("@@_main~npm~npm__undici-types__5.26.5__links//:defs.bzl", store_958 = "npm_imported_package_store")
-load("@@_main~npm~npm__undici-types__6.19.8__links//:defs.bzl", store_959 = "npm_imported_package_store")
-load("@@_main~npm~npm__unique-filename__2.0.1__links//:defs.bzl", store_960 = "npm_imported_package_store")
-load("@@_main~npm~npm__unique-slug__3.0.0__links//:defs.bzl", store_961 = "npm_imported_package_store")
-load("@@_main~npm~npm__universalify__0.1.2__links//:defs.bzl", store_962 = "npm_imported_package_store")
-load("@@_main~npm~npm__universalify__2.0.0__links//:defs.bzl", store_963 = "npm_imported_package_store")
-load("@@_main~npm~npm__unix-dgram__2.0.6__links//:defs.bzl", store_964 = "npm_imported_package_store")
-load("@@_main~npm~npm__unquote__1.1.1__links//:defs.bzl", store_965 = "npm_imported_package_store")
-load("@@_main~npm~npm__unused__0.2.2__links//:defs.bzl", link_966 = "npm_link_imported_package_store", store_966 = "npm_imported_package_store")
-load("@@_main~npm~npm__update-browserslist-db__1.0.10_browserslist_4.21.5__links//:defs.bzl", store_967 = "npm_imported_package_store")
-load("@@_main~npm~npm__update-diff__1.1.0__links//:defs.bzl", store_968 = "npm_imported_package_store")
-load("@@_main~npm~npm__uri-js__4.4.1__links//:defs.bzl", store_969 = "npm_imported_package_store")
-load("@@_main~npm~npm__util-deprecate__1.0.2__links//:defs.bzl", store_970 = "npm_imported_package_store")
-load("@@_main~npm~npm__uuid__3.4.0__links//:defs.bzl", store_971 = "npm_imported_package_store")
-load("@@_main~npm~npm__uuid__8.3.2__links//:defs.bzl", link_972 = "npm_link_imported_package_store", store_972 = "npm_imported_package_store")
-load("@@_main~npm~npm__uvu__0.5.3__links//:defs.bzl", link_973 = "npm_link_imported_package_store", store_973 = "npm_imported_package_store")
-load("@@_main~npm~npm__v8-to-istanbul__9.1.0__links//:defs.bzl", store_974 = "npm_imported_package_store")
-load("@@_main~npm~npm__verror__1.10.0__links//:defs.bzl", store_975 = "npm_imported_package_store")
-load("@@_main~npm~npm__vt-pbf__3.1.3__links//:defs.bzl", store_976 = "npm_imported_package_store")
-load("@@_main~npm~npm__watchpack__2.4.0__links//:defs.bzl", store_977 = "npm_imported_package_store")
-load("@@_main~npm~npm__weak-map__1.0.8__links//:defs.bzl", store_978 = "npm_imported_package_store")
-load("@@_main~npm~npm__webgl-context__2.2.0__links//:defs.bzl", store_979 = "npm_imported_package_store")
-load("@@_main~npm~npm__webidl-conversions__3.0.1__links//:defs.bzl", store_980 = "npm_imported_package_store")
-load("@@_main~npm~npm__webpack-bundle-analyzer__4.5.0_bufferutil_4.0.8__links//:defs.bzl", link_981 = "npm_link_imported_package_store", store_981 = "npm_imported_package_store")
-load("@@_main~npm~npm__webpack-cli__5.0.1_webpack_5.76.3__links//:defs.bzl", link_982 = "npm_link_imported_package_store", store_982 = "npm_imported_package_store")
-load("@@_main~npm~npm__webpack-merge__5.8.0__links//:defs.bzl", store_983 = "npm_imported_package_store")
-load("@@_main~npm~npm__webpack-sources__3.2.3__links//:defs.bzl", store_984 = "npm_imported_package_store")
-load("@@_main~npm~npm__webpack__5.76.3_webpack-cli_5.0.1__links//:defs.bzl", link_985 = "npm_link_imported_package_store", store_985 = "npm_imported_package_store")
-load("@@_main~npm~npm__whatwg-url__5.0.0__links//:defs.bzl", store_986 = "npm_imported_package_store")
-load("@@_main~npm~npm__which__2.0.2__links//:defs.bzl", store_987 = "npm_imported_package_store")
-load("@@_main~npm~npm__wide-align__1.1.5__links//:defs.bzl", store_988 = "npm_imported_package_store")
-load("@@_main~npm~npm__wildcard__2.0.0__links//:defs.bzl", store_989 = "npm_imported_package_store")
-load("@@_main~npm~npm__word-wrap__1.2.3__links//:defs.bzl", store_990 = "npm_imported_package_store")
-load("@@_main~npm~npm__wordwrap__0.0.3__links//:defs.bzl", store_991 = "npm_imported_package_store")
-load("@@_main~npm~npm__workerpool__6.2.1__links//:defs.bzl", store_992 = "npm_imported_package_store")
-load("@@_main~npm~npm__world-calendars__1.0.3__links//:defs.bzl", store_993 = "npm_imported_package_store")
-load("@@_main~npm~npm__wrap-ansi__7.0.0__links//:defs.bzl", store_994 = "npm_imported_package_store")
-load("@@_main~npm~npm__wrap-ansi__8.1.0__links//:defs.bzl", store_995 = "npm_imported_package_store")
-load("@@_main~npm~npm__wrappy__1.0.2__links//:defs.bzl", store_996 = "npm_imported_package_store")
-load("@@_main~npm~npm__ws__7.5.9_bufferutil_4.0.8__links//:defs.bzl", store_997 = "npm_imported_package_store")
-load("@@_main~npm~npm__ws__8.13.0_bufferutil_4.0.8__links//:defs.bzl", store_998 = "npm_imported_package_store")
-load("@@_main~npm~npm__ws__8.18.0_bufferutil_4.0.8__links//:defs.bzl", store_999 = "npm_imported_package_store")
-load("@@_main~npm~npm__xml__1.0.1__links//:defs.bzl", store_1000 = "npm_imported_package_store")
-load("@@_main~npm~npm__xtend__2.2.0__links//:defs.bzl", store_1001 = "npm_imported_package_store")
-load("@@_main~npm~npm__xtend__4.0.2__links//:defs.bzl", store_1002 = "npm_imported_package_store")
-load("@@_main~npm~npm__y18n__5.0.8__links//:defs.bzl", store_1003 = "npm_imported_package_store")
-load("@@_main~npm~npm__yallist__3.1.1__links//:defs.bzl", store_1004 = "npm_imported_package_store")
-load("@@_main~npm~npm__yallist__4.0.0__links//:defs.bzl", store_1005 = "npm_imported_package_store")
-load("@@_main~npm~npm__yallist__5.0.0__links//:defs.bzl", store_1006 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs-parser__20.2.4__links//:defs.bzl", store_1007 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs-parser__20.2.9__links//:defs.bzl", store_1008 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs-parser__21.1.1__links//:defs.bzl", store_1009 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs-unparser__2.0.0__links//:defs.bzl", store_1010 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs__16.2.0__links//:defs.bzl", store_1011 = "npm_imported_package_store")
-load("@@_main~npm~npm__yargs__17.7.1__links//:defs.bzl", store_1012 = "npm_imported_package_store")
-load("@@_main~npm~npm__yauzl__2.10.0__links//:defs.bzl", store_1013 = "npm_imported_package_store")
-load("@@_main~npm~npm__yocto-queue__0.1.0__links//:defs.bzl", store_1014 = "npm_imported_package_store")
-load("@@_main~npm~npm__zod__3.21.4__links//:defs.bzl", store_1015 = "npm_imported_package_store")
+load("@@_main~npm~npm__abortcontroller-polyfill__1.7.5__links//:defs.bzl", link_1 = "npm_link_imported_package_store", store_1 = "npm_imported_package_store")
+load("@@_main~npm~npm__abs-svg-path__0.1.1__links//:defs.bzl", store_2 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn-import-assertions__1.8.0_acorn_8.8.2__links//:defs.bzl", store_3 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn-walk__8.2.0__links//:defs.bzl", store_4 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn__7.4.1__links//:defs.bzl", store_5 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn__8.12.1__links//:defs.bzl", link_6 = "npm_link_imported_package_store", store_6 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn__8.7.1__links//:defs.bzl", link_7 = "npm_link_imported_package_store", store_7 = "npm_imported_package_store")
+load("@@_main~npm~npm__acorn__8.8.2__links//:defs.bzl", link_8 = "npm_link_imported_package_store", store_8 = "npm_imported_package_store")
+load("@@_main~npm~npm__agent-base__6.0.2__links//:defs.bzl", store_9 = "npm_imported_package_store")
+load("@@_main~npm~npm__agentkeepalive__4.2.1__links//:defs.bzl", store_10 = "npm_imported_package_store")
+load("@@_main~npm~npm__aggregate-error__3.1.0__links//:defs.bzl", store_11 = "npm_imported_package_store")
+load("@@_main~npm~npm__ahocorasick__1.0.2__links//:defs.bzl", store_12 = "npm_imported_package_store")
+load("@@_main~npm~npm__ajv-formats__2.1.1_ajv_8.12.0__links//:defs.bzl", store_13 = "npm_imported_package_store")
+load("@@_main~npm~npm__ajv-keywords__3.5.2_ajv_6.12.6__links//:defs.bzl", store_14 = "npm_imported_package_store")
+load("@@_main~npm~npm__ajv-keywords__5.1.0_ajv_8.12.0__links//:defs.bzl", store_15 = "npm_imported_package_store")
+load("@@_main~npm~npm__ajv__6.12.6__links//:defs.bzl", store_16 = "npm_imported_package_store")
+load("@@_main~npm~npm__ajv__8.12.0__links//:defs.bzl", store_17 = "npm_imported_package_store")
+load("@@_main~npm~npm__almost-equal__1.1.0__links//:defs.bzl", store_18 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-colors__4.1.1__links//:defs.bzl", store_19 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-regex__2.1.1__links//:defs.bzl", store_20 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-regex__5.0.1__links//:defs.bzl", store_21 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-regex__6.0.1__links//:defs.bzl", store_22 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-styles__3.2.1__links//:defs.bzl", store_23 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-styles__4.3.0__links//:defs.bzl", store_24 = "npm_imported_package_store")
+load("@@_main~npm~npm__ansi-styles__6.2.1__links//:defs.bzl", store_25 = "npm_imported_package_store")
+load("@@_main~npm~npm__anymatch__3.1.3__links//:defs.bzl", store_26 = "npm_imported_package_store")
+load("@@_main~npm~npm__aproba__1.2.0__links//:defs.bzl", store_27 = "npm_imported_package_store")
+load("@@_main~npm~npm__aproba__2.0.0__links//:defs.bzl", store_28 = "npm_imported_package_store")
+load("@@_main~npm~npm__are-we-there-yet__1.1.7__links//:defs.bzl", store_29 = "npm_imported_package_store")
+load("@@_main~npm~npm__are-we-there-yet__2.0.0__links//:defs.bzl", store_30 = "npm_imported_package_store")
+load("@@_main~npm~npm__are-we-there-yet__3.0.1__links//:defs.bzl", store_31 = "npm_imported_package_store")
+load("@@_main~npm~npm__argparse__2.0.1__links//:defs.bzl", store_32 = "npm_imported_package_store")
+load("@@_main~npm~npm__array-bounds__1.0.1__links//:defs.bzl", store_33 = "npm_imported_package_store")
+load("@@_main~npm~npm__array-find-index__1.0.2__links//:defs.bzl", store_34 = "npm_imported_package_store")
+load("@@_main~npm~npm__array-normalize__1.1.4__links//:defs.bzl", store_35 = "npm_imported_package_store")
+load("@@_main~npm~npm__array-range__1.0.1__links//:defs.bzl", store_36 = "npm_imported_package_store")
+load("@@_main~npm~npm__array-rearrange__2.2.2__links//:defs.bzl", store_37 = "npm_imported_package_store")
+load("@@_main~npm~npm__asn1__0.2.6__links//:defs.bzl", store_38 = "npm_imported_package_store")
+load("@@_main~npm~npm__assert-plus__1.0.0__links//:defs.bzl", store_39 = "npm_imported_package_store")
+load("@@_main~npm~npm__asynckit__0.4.0__links//:defs.bzl", store_40 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_ampproject_remapping__2.2.0__links//:defs.bzl", store_41 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_a__5.0.2__links//:defs.bzl", link_42 = "npm_link_imported_package_store", store_42 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_b__5.0.2__links//:defs.bzl", store_43 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_c__2.0.2__links//:defs.bzl", link_44 = "npm_link_imported_package_store", store_44 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_d__2.0.0_at_aspect-test_c_2.0.2__links//:defs.bzl", store_45 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_e__1.0.0__links//:defs.bzl", link_46 = "npm_link_imported_package_store", store_46 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_aspect-test_f__1.0.0__links//:defs.bzl", link_47 = "npm_link_imported_package_store", store_47 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_code-frame__7.18.6__links//:defs.bzl", store_48 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_compat-data__7.21.0__links//:defs.bzl", store_49 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_core__7.21.0__links//:defs.bzl", store_50 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_generator__7.21.1__links//:defs.bzl", store_51 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-compilation-targets__7.20.7_at_babel_core_7.21.0__links//:defs.bzl", store_52 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-environment-visitor__7.18.9__links//:defs.bzl", store_53 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-function-name__7.21.0__links//:defs.bzl", store_54 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-hoist-variables__7.18.6__links//:defs.bzl", store_55 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-module-imports__7.18.6__links//:defs.bzl", store_56 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-module-transforms__7.21.2__links//:defs.bzl", store_57 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-plugin-utils__7.20.2__links//:defs.bzl", store_58 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-simple-access__7.20.2__links//:defs.bzl", store_59 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-split-export-declaration__7.18.6__links//:defs.bzl", store_60 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-string-parser__7.19.4__links//:defs.bzl", store_61 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-validator-identifier__7.19.1__links//:defs.bzl", store_62 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helper-validator-option__7.21.0__links//:defs.bzl", store_63 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_helpers__7.21.0__links//:defs.bzl", store_64 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_highlight__7.18.6__links//:defs.bzl", store_65 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_parser__7.21.2__links//:defs.bzl", store_66 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_plugin-syntax-typescript__7.20.0_at_babel_core_7.21.0__links//:defs.bzl", store_67 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_runtime__7.21.0__links//:defs.bzl", store_68 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_template__7.20.7__links//:defs.bzl", store_69 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_traverse__7.21.2__links//:defs.bzl", store_70 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_babel_types__7.21.2__links//:defs.bzl", store_71 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_bazel_runfiles__6.3.0__links//:defs.bzl", link_72 = "npm_link_imported_package_store", store_72 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_bcoe_v8-coverage__0.2.3__links//:defs.bzl", store_73 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_choojs_findup__0.2.1__links//:defs.bzl", store_74 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_discoveryjs_json-ext__0.5.7__links//:defs.bzl", store_75 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_emotion_hash__0.9.0__links//:defs.bzl", store_76 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_aix-ppc64__0.24.0__links//:defs.bzl", store_77 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-arm64__0.16.17__links//:defs.bzl", store_78 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-arm64__0.24.0__links//:defs.bzl", store_79 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-arm__0.16.17__links//:defs.bzl", store_80 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-arm__0.24.0__links//:defs.bzl", store_81 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-x64__0.16.17__links//:defs.bzl", store_82 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_android-x64__0.24.0__links//:defs.bzl", store_83 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_darwin-arm64__0.16.17__links//:defs.bzl", store_84 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_darwin-arm64__0.24.0__links//:defs.bzl", store_85 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_darwin-x64__0.16.17__links//:defs.bzl", store_86 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_darwin-x64__0.24.0__links//:defs.bzl", store_87 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_freebsd-arm64__0.16.17__links//:defs.bzl", store_88 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_freebsd-arm64__0.24.0__links//:defs.bzl", store_89 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_freebsd-x64__0.16.17__links//:defs.bzl", store_90 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_freebsd-x64__0.24.0__links//:defs.bzl", store_91 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-arm64__0.16.17__links//:defs.bzl", store_92 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-arm64__0.24.0__links//:defs.bzl", store_93 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-arm__0.16.17__links//:defs.bzl", store_94 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-arm__0.24.0__links//:defs.bzl", store_95 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-ia32__0.16.17__links//:defs.bzl", store_96 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-ia32__0.24.0__links//:defs.bzl", store_97 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-loong64__0.16.17__links//:defs.bzl", store_98 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-loong64__0.24.0__links//:defs.bzl", store_99 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-mips64el__0.16.17__links//:defs.bzl", store_100 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-mips64el__0.24.0__links//:defs.bzl", store_101 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-ppc64__0.16.17__links//:defs.bzl", store_102 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-ppc64__0.24.0__links//:defs.bzl", store_103 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-riscv64__0.16.17__links//:defs.bzl", store_104 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-riscv64__0.24.0__links//:defs.bzl", store_105 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-s390x__0.16.17__links//:defs.bzl", store_106 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-s390x__0.24.0__links//:defs.bzl", store_107 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-x64__0.16.17__links//:defs.bzl", store_108 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_linux-x64__0.24.0__links//:defs.bzl", store_109 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_netbsd-x64__0.16.17__links//:defs.bzl", store_110 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_netbsd-x64__0.24.0__links//:defs.bzl", store_111 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_openbsd-arm64__0.24.0__links//:defs.bzl", store_112 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_openbsd-x64__0.16.17__links//:defs.bzl", store_113 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_openbsd-x64__0.24.0__links//:defs.bzl", store_114 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_sunos-x64__0.16.17__links//:defs.bzl", store_115 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_sunos-x64__0.24.0__links//:defs.bzl", store_116 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-arm64__0.16.17__links//:defs.bzl", store_117 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-arm64__0.24.0__links//:defs.bzl", store_118 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-ia32__0.16.17__links//:defs.bzl", store_119 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-ia32__0.24.0__links//:defs.bzl", store_120 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-x64__0.16.17__links//:defs.bzl", store_121 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_esbuild_win32-x64__0.24.0__links//:defs.bzl", store_122 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_fastify_send__3.3.0__links//:defs.bzl", link_123 = "npm_link_imported_package_store", store_123 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_figma_nodegit__0.28.0-figma.2__links//:defs.bzl", link_124 = "npm_link_imported_package_store", store_124 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_foo_jsonify__at_github.com_aspect-build_test-packages_releases_download_0.0.0_at_foo-jsonify-0.0.0.tgz__links//:defs.bzl", store_125 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_gar_promisify__1.1.3__links//:defs.bzl", store_126 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_gregmagolan_test-a__0.0.1__links//:defs.bzl", store_127 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_gregmagolan_test-b__0.0.2__links//:defs.bzl", link_128 = "npm_link_imported_package_store", store_128 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_isaacs_cliui__8.0.2__links//:defs.bzl", store_129 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_isaacs_fs-minipass__4.0.1__links//:defs.bzl", store_130 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_istanbuljs_schema__0.1.3__links//:defs.bzl", store_131 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.1.1__links//:defs.bzl", store_132 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.3.2__links//:defs.bzl", store_133 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_gen-mapping__0.3.5__links//:defs.bzl", store_134 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_resolve-uri__3.1.0__links//:defs.bzl", store_135 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_set-array__1.1.2__links//:defs.bzl", store_136 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_set-array__1.2.1__links//:defs.bzl", store_137 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_source-map__0.3.2__links//:defs.bzl", store_138 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_source-map__0.3.6__links//:defs.bzl", store_139 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_sourcemap-codec__1.4.14__links//:defs.bzl", store_140 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_trace-mapping__0.3.17__links//:defs.bzl", store_141 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jridgewell_trace-mapping__0.3.25__links//:defs.bzl", store_142 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jsep-plugin_assignment__1.2.1_jsep_1.3.9__links//:defs.bzl", store_143 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_jsep-plugin_regex__1.0.3_jsep_1.3.9__links//:defs.bzl", store_144 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_kubernetes_client-node__github.com_kubernetes-client_javascript_bd6ab5810d013103d244ddaebe0304649c012b38_bufferutil_4.0.8__links//:defs.bzl", link_145 = "npm_link_imported_package_store", store_145 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_lukeed_ms__2.0.2__links//:defs.bzl", store_146 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_geojson-rewind__0.5.2__links//:defs.bzl", store_147 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_geojson-types__1.0.2__links//:defs.bzl", store_148 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_jsonlint-lines-primitives__2.0.2__links//:defs.bzl", store_149 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_mapbox-gl-supported__1.5.0_mapbox-gl_1.10.1__links//:defs.bzl", store_150 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_node-pre-gyp__1.0.10__links//:defs.bzl", store_151 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_point-geometry__0.1.0__links//:defs.bzl", store_152 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_tiny-sdf__1.2.5__links//:defs.bzl", store_153 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_unitbezier__0.0.0__links//:defs.bzl", store_154 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_vector-tile__1.3.1__links//:defs.bzl", store_155 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_mapbox_whoots-js__3.1.0__links//:defs.bzl", store_156 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_npmcli_fs__2.1.2__links//:defs.bzl", store_157 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_npmcli_move-file__2.0.1__links//:defs.bzl", store_158 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_pkgjs_parseargs__0.11.0__links//:defs.bzl", store_159 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_plotly_d3-sankey-circular__0.33.1__links//:defs.bzl", store_160 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_plotly_d3-sankey__0.7.2__links//:defs.bzl", store_161 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_plotly_d3__3.8.1__links//:defs.bzl", store_162 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_plotly_point-cluster__3.1.9__links//:defs.bzl", store_163 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_plotly_regl__2.1.2__links//:defs.bzl", link_164 = "npm_link_imported_package_store", store_164 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_polka_url__1.0.0-next.21__links//:defs.bzl", store_165 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_puppeteer_browsers__0.5.0_typescript_4.9.5__links//:defs.bzl", store_166 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-commonjs__21.1.0_rollup_2.70.2__links//:defs.bzl", link_167 = "npm_link_imported_package_store", store_167 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-commonjs__23.0.7_rollup_2.79.2__links//:defs.bzl", link_168 = "npm_link_imported_package_store", store_168 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-commonjs__23.0.7_rollup_3.29.5__links//:defs.bzl", link_169 = "npm_link_imported_package_store", store_169 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-json__5.0.2_rollup_2.79.2__links//:defs.bzl", link_170 = "npm_link_imported_package_store", store_170 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-json__5.0.2_rollup_3.29.5__links//:defs.bzl", link_171 = "npm_link_imported_package_store", store_171 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-node-resolve__15.3.0_rollup_2.79.2__links//:defs.bzl", link_172 = "npm_link_imported_package_store", store_172 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-node-resolve__15.3.0_rollup_3.29.5__links//:defs.bzl", link_173 = "npm_link_imported_package_store", store_173 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-terser__0.4.4_rollup_2.79.2__links//:defs.bzl", link_174 = "npm_link_imported_package_store", store_174 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_plugin-typescript__10.0.1_574194173__links//:defs.bzl", link_175 = "npm_link_imported_package_store", store_175 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_pluginutils__3.1.0_rollup_2.70.2__links//:defs.bzl", store_176 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_pluginutils__5.0.2_rollup_2.79.2__links//:defs.bzl", store_177 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_rollup_pluginutils__5.0.2_rollup_3.29.5__links//:defs.bzl", store_178 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_sindresorhus_is__2.1.1__links//:defs.bzl", store_179 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_szmarczak_http-timer__4.0.6__links//:defs.bzl", store_180 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_tootallnate_once__2.0.0__links//:defs.bzl", store_181 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_turf_area__6.5.0__links//:defs.bzl", store_182 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_turf_bbox__6.5.0__links//:defs.bzl", store_183 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_turf_centroid__6.5.0__links//:defs.bzl", store_184 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_turf_helpers__6.5.0__links//:defs.bzl", store_185 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_turf_meta__6.5.0__links//:defs.bzl", store_186 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_cacheable-request__6.0.3__links//:defs.bzl", store_187 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_caseless__0.12.2__links//:defs.bzl", store_188 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_eslint-scope__3.7.4__links//:defs.bzl", store_189 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_eslint__8.21.1__links//:defs.bzl", store_190 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_estree__0.0.39__links//:defs.bzl", store_191 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_estree__0.0.51__links//:defs.bzl", store_192 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_estree__1.0.0__links//:defs.bzl", store_193 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_google-protobuf__3.15.12__links//:defs.bzl", link_194 = "npm_link_imported_package_store", store_194 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_http-cache-semantics__4.0.1__links//:defs.bzl", store_195 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_istanbul-lib-coverage__2.0.4__links//:defs.bzl", store_196 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_js-yaml__4.0.5__links//:defs.bzl", store_197 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_json-schema__7.0.11__links//:defs.bzl", store_198 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_keyv__3.1.4__links//:defs.bzl", store_199 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_node__16.18.112__links//:defs.bzl", link_200 = "npm_link_imported_package_store", store_200 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_node__18.13.0__links//:defs.bzl", link_201 = "npm_link_imported_package_store", store_201 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_node__18.19.54__links//:defs.bzl", link_202 = "npm_link_imported_package_store", store_202 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_node__22.7.4__links//:defs.bzl", store_203 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_request__2.48.8__links//:defs.bzl", store_204 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_resolve__1.20.2__links//:defs.bzl", store_205 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_responselike__1.0.0__links//:defs.bzl", store_206 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_tough-cookie__4.0.2__links//:defs.bzl", store_207 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_underscore__1.11.4__links//:defs.bzl", store_208 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_ws__8.5.5__links//:defs.bzl", store_209 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_types_yauzl__2.10.0__links//:defs.bzl", store_210 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_babel-plugin-debug-ids__1.0.1__links//:defs.bzl", store_211 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_css__1.9.2__links//:defs.bzl", link_212 = "npm_link_imported_package_store", store_212 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_css__1.9.5__links//:defs.bzl", store_213 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_integration__6.1.0__links//:defs.bzl", store_214 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_private__1.0.3__links//:defs.bzl", store_215 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_vanilla-extract_webpack-plugin__2.2.0_webpack_5.76.3__links//:defs.bzl", link_216 = "npm_link_imported_package_store", store_216 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_ast__1.11.1__links//:defs.bzl", store_217 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_floating-point-hex-parser__1.11.1__links//:defs.bzl", store_218 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_helper-api-error__1.11.1__links//:defs.bzl", store_219 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_helper-buffer__1.11.1__links//:defs.bzl", store_220 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_helper-numbers__1.11.1__links//:defs.bzl", store_221 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_helper-wasm-bytecode__1.11.1__links//:defs.bzl", store_222 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_helper-wasm-section__1.11.1__links//:defs.bzl", store_223 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_ieee754__1.11.1__links//:defs.bzl", store_224 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_leb128__1.11.1__links//:defs.bzl", store_225 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_utf8__1.11.1__links//:defs.bzl", store_226 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_wasm-edit__1.11.1__links//:defs.bzl", store_227 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_wasm-gen__1.11.1__links//:defs.bzl", store_228 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_wasm-opt__1.11.1__links//:defs.bzl", store_229 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_wasm-parser__1.11.1__links//:defs.bzl", store_230 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webassemblyjs_wast-printer__1.11.1__links//:defs.bzl", store_231 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webpack-cli_configtest__2.0.1_1256213976__links//:defs.bzl", store_232 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webpack-cli_info__2.0.1_1256213976__links//:defs.bzl", store_233 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_webpack-cli_serve__2.0.1_1256213976__links//:defs.bzl", store_234 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_xtuc_ieee754__1.2.0__links//:defs.bzl", store_235 = "npm_imported_package_store")
+load("@@_main~npm~npm__at_xtuc_long__4.2.2__links//:defs.bzl", store_236 = "npm_imported_package_store")
+load("@@_main~npm~npm__aws-sign2__0.7.0__links//:defs.bzl", store_237 = "npm_imported_package_store")
+load("@@_main~npm~npm__aws4__1.12.0__links//:defs.bzl", store_238 = "npm_imported_package_store")
+load("@@_main~npm~npm__balanced-match__1.0.2__links//:defs.bzl", store_239 = "npm_imported_package_store")
+load("@@_main~npm~npm__base64-js__1.5.1__links//:defs.bzl", store_240 = "npm_imported_package_store")
+load("@@_main~npm~npm__bcrypt-pbkdf__1.0.2__links//:defs.bzl", store_241 = "npm_imported_package_store")
+load("@@_main~npm~npm__big.js__5.2.2__links//:defs.bzl", store_242 = "npm_imported_package_store")
+load("@@_main~npm~npm__binary-extensions__2.2.0__links//:defs.bzl", store_243 = "npm_imported_package_store")
+load("@@_main~npm~npm__binary-search-bounds__2.0.5__links//:defs.bzl", store_244 = "npm_imported_package_store")
+load("@@_main~npm~npm__bindings__1.5.0__links//:defs.bzl", store_245 = "npm_imported_package_store")
+load("@@_main~npm~npm__bit-twiddle__1.0.2__links//:defs.bzl", store_246 = "npm_imported_package_store")
+load("@@_main~npm~npm__bitmap-sdf__1.0.4__links//:defs.bzl", store_247 = "npm_imported_package_store")
+load("@@_main~npm~npm__bl__1.2.3__links//:defs.bzl", store_248 = "npm_imported_package_store")
+load("@@_main~npm~npm__bl__2.2.1__links//:defs.bzl", store_249 = "npm_imported_package_store")
+load("@@_main~npm~npm__bl__4.1.0__links//:defs.bzl", store_250 = "npm_imported_package_store")
+load("@@_main~npm~npm__brace-expansion__1.1.11__links//:defs.bzl", store_251 = "npm_imported_package_store")
+load("@@_main~npm~npm__brace-expansion__2.0.1__links//:defs.bzl", store_252 = "npm_imported_package_store")
+load("@@_main~npm~npm__braces__3.0.2__links//:defs.bzl", store_253 = "npm_imported_package_store")
+load("@@_main~npm~npm__browser-stdout__1.3.1__links//:defs.bzl", store_254 = "npm_imported_package_store")
+load("@@_main~npm~npm__browserslist__4.21.5__links//:defs.bzl", store_255 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer-alloc-unsafe__1.1.0__links//:defs.bzl", store_256 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer-alloc__1.2.0__links//:defs.bzl", store_257 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer-crc32__0.2.13__links//:defs.bzl", store_258 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer-fill__1.0.0__links//:defs.bzl", store_259 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer-from__1.1.2__links//:defs.bzl", store_260 = "npm_imported_package_store")
+load("@@_main~npm~npm__buffer__5.7.1__links//:defs.bzl", store_261 = "npm_imported_package_store")
+load("@@_main~npm~npm__bufferutil__4.0.8__links//:defs.bzl", link_262 = "npm_link_imported_package_store", store_262 = "npm_imported_package_store")
+load("@@_main~npm~npm__byline__5.0.0__links//:defs.bzl", store_263 = "npm_imported_package_store")
+load("@@_main~npm~npm__c8__7.13.0__links//:defs.bzl", link_264 = "npm_link_imported_package_store", store_264 = "npm_imported_package_store")
+load("@@_main~npm~npm__cacache__16.1.3__links//:defs.bzl", store_265 = "npm_imported_package_store")
+load("@@_main~npm~npm__cacheable-lookup__2.0.1__links//:defs.bzl", store_266 = "npm_imported_package_store")
+load("@@_main~npm~npm__cacheable-request__7.0.2__links//:defs.bzl", store_267 = "npm_imported_package_store")
+load("@@_main~npm~npm__callsites__3.1.0__links//:defs.bzl", store_268 = "npm_imported_package_store")
+load("@@_main~npm~npm__camelcase__6.3.0__links//:defs.bzl", store_269 = "npm_imported_package_store")
+load("@@_main~npm~npm__caniuse-lite__1.0.30001458__links//:defs.bzl", store_270 = "npm_imported_package_store")
+load("@@_main~npm~npm__canvas-fit__1.5.0__links//:defs.bzl", store_271 = "npm_imported_package_store")
+load("@@_main~npm~npm__caseless__0.12.0__links//:defs.bzl", store_272 = "npm_imported_package_store")
+load("@@_main~npm~npm__chalk__2.4.2__links//:defs.bzl", store_273 = "npm_imported_package_store")
+load("@@_main~npm~npm__chalk__4.1.2__links//:defs.bzl", store_274 = "npm_imported_package_store")
+load("@@_main~npm~npm__chalk__5.0.1__links//:defs.bzl", link_275 = "npm_link_imported_package_store", store_275 = "npm_imported_package_store")
+load("@@_main~npm~npm__chalk__5.1.1__links//:defs.bzl", link_276 = "npm_link_imported_package_store", store_276 = "npm_imported_package_store")
+load("@@_main~npm~npm__charenc__0.0.2__links//:defs.bzl", store_277 = "npm_imported_package_store")
+load("@@_main~npm~npm__chokidar__3.5.3__links//:defs.bzl", store_278 = "npm_imported_package_store")
+load("@@_main~npm~npm__chownr__1.1.4__links//:defs.bzl", store_279 = "npm_imported_package_store")
+load("@@_main~npm~npm__chownr__2.0.0__links//:defs.bzl", store_280 = "npm_imported_package_store")
+load("@@_main~npm~npm__chownr__3.0.0__links//:defs.bzl", store_281 = "npm_imported_package_store")
+load("@@_main~npm~npm__chrome-trace-event__1.0.3__links//:defs.bzl", store_282 = "npm_imported_package_store")
+load("@@_main~npm~npm__chromium-bidi__0.4.7_devtools-protocol_0.0.1107588__links//:defs.bzl", store_283 = "npm_imported_package_store")
+load("@@_main~npm~npm__clamp__1.0.1__links//:defs.bzl", store_284 = "npm_imported_package_store")
+load("@@_main~npm~npm__clean-stack__2.2.0__links//:defs.bzl", store_285 = "npm_imported_package_store")
+load("@@_main~npm~npm__cliui__7.0.4__links//:defs.bzl", store_286 = "npm_imported_package_store")
+load("@@_main~npm~npm__cliui__8.0.1__links//:defs.bzl", store_287 = "npm_imported_package_store")
+load("@@_main~npm~npm__clone-deep__4.0.1__links//:defs.bzl", store_288 = "npm_imported_package_store")
+load("@@_main~npm~npm__clone-response__1.0.3__links//:defs.bzl", store_289 = "npm_imported_package_store")
+load("@@_main~npm~npm__code-point-at__1.1.0__links//:defs.bzl", store_290 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-alpha__1.0.4__links//:defs.bzl", store_291 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-convert__1.9.3__links//:defs.bzl", store_292 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-convert__2.0.1__links//:defs.bzl", store_293 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-id__1.1.0__links//:defs.bzl", store_294 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-name__1.1.3__links//:defs.bzl", store_295 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-name__1.1.4__links//:defs.bzl", store_296 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-normalize__1.5.0__links//:defs.bzl", store_297 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-parse__1.3.8__links//:defs.bzl", store_298 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-rgba__2.1.1__links//:defs.bzl", store_299 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-space__1.16.0__links//:defs.bzl", store_300 = "npm_imported_package_store")
+load("@@_main~npm~npm__color-support__1.1.3__links//:defs.bzl", store_301 = "npm_imported_package_store")
+load("@@_main~npm~npm__colorette__2.0.19__links//:defs.bzl", store_302 = "npm_imported_package_store")
+load("@@_main~npm~npm__combined-stream__1.0.8__links//:defs.bzl", store_303 = "npm_imported_package_store")
+load("@@_main~npm~npm__commander__10.0.1__links//:defs.bzl", store_304 = "npm_imported_package_store")
+load("@@_main~npm~npm__commander__2.20.3__links//:defs.bzl", store_305 = "npm_imported_package_store")
+load("@@_main~npm~npm__commander__7.2.0__links//:defs.bzl", store_306 = "npm_imported_package_store")
+load("@@_main~npm~npm__commander__9.5.0__links//:defs.bzl", store_307 = "npm_imported_package_store")
+load("@@_main~npm~npm__commondir__1.0.1__links//:defs.bzl", store_308 = "npm_imported_package_store")
+load("@@_main~npm~npm__complex.js__2.1.1__links//:defs.bzl", store_309 = "npm_imported_package_store")
+load("@@_main~npm~npm__concat-map__0.0.1__links//:defs.bzl", store_310 = "npm_imported_package_store")
+load("@@_main~npm~npm__concat-stream__1.6.2__links//:defs.bzl", store_311 = "npm_imported_package_store")
+load("@@_main~npm~npm__console-control-strings__1.1.0__links//:defs.bzl", store_312 = "npm_imported_package_store")
+load("@@_main~npm~npm__convert-source-map__1.9.0__links//:defs.bzl", store_313 = "npm_imported_package_store")
+load("@@_main~npm~npm__core-util-is__1.0.2__links//:defs.bzl", store_314 = "npm_imported_package_store")
+load("@@_main~npm~npm__core-util-is__1.0.3__links//:defs.bzl", store_315 = "npm_imported_package_store")
+load("@@_main~npm~npm__cosmiconfig__8.1.3__links//:defs.bzl", store_316 = "npm_imported_package_store")
+load("@@_main~npm~npm__country-regex__1.1.0__links//:defs.bzl", store_317 = "npm_imported_package_store")
+load("@@_main~npm~npm__cross-fetch__3.1.5__links//:defs.bzl", store_318 = "npm_imported_package_store")
+load("@@_main~npm~npm__cross-spawn__7.0.3__links//:defs.bzl", store_319 = "npm_imported_package_store")
+load("@@_main~npm~npm__crypt__0.0.2__links//:defs.bzl", store_320 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-font-size-keywords__1.0.0__links//:defs.bzl", store_321 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-font-stretch-keywords__1.0.1__links//:defs.bzl", store_322 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-font-style-keywords__1.0.1__links//:defs.bzl", store_323 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-font-weight-keywords__1.0.0__links//:defs.bzl", store_324 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-font__1.2.0__links//:defs.bzl", store_325 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-global-keywords__1.0.1__links//:defs.bzl", store_326 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-loader__6.7.3_webpack_5.76.3__links//:defs.bzl", link_327 = "npm_link_imported_package_store", store_327 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-system-font-keywords__1.0.0__links//:defs.bzl", store_328 = "npm_imported_package_store")
+load("@@_main~npm~npm__css-what__5.1.0__links//:defs.bzl", store_329 = "npm_imported_package_store")
+load("@@_main~npm~npm__csscolorparser__1.0.3__links//:defs.bzl", store_330 = "npm_imported_package_store")
+load("@@_main~npm~npm__cssesc__3.0.0__links//:defs.bzl", store_331 = "npm_imported_package_store")
+load("@@_main~npm~npm__csstype__3.1.1__links//:defs.bzl", store_332 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-array__1.2.4__links//:defs.bzl", store_333 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-collection__1.0.7__links//:defs.bzl", store_334 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-color__1.4.1__links//:defs.bzl", store_335 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-dispatch__1.0.6__links//:defs.bzl", store_336 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-force__1.2.1__links//:defs.bzl", store_337 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-format__1.4.5__links//:defs.bzl", store_338 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-geo-projection__2.9.0__links//:defs.bzl", store_339 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-geo__1.12.1__links//:defs.bzl", store_340 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-hierarchy__1.1.9__links//:defs.bzl", store_341 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-interpolate__3.0.1__links//:defs.bzl", store_342 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-path__1.0.9__links//:defs.bzl", store_343 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-quadtree__1.0.7__links//:defs.bzl", store_344 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-shape__1.3.7__links//:defs.bzl", store_345 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-time-format__2.3.0__links//:defs.bzl", store_346 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-time__1.1.0__links//:defs.bzl", store_347 = "npm_imported_package_store")
+load("@@_main~npm~npm__d3-timer__1.0.10__links//:defs.bzl", store_348 = "npm_imported_package_store")
+load("@@_main~npm~npm__d__1.0.1__links//:defs.bzl", store_349 = "npm_imported_package_store")
+load("@@_main~npm~npm__dashdash__1.14.1__links//:defs.bzl", store_350 = "npm_imported_package_store")
+load("@@_main~npm~npm__date.js__0.3.3__links//:defs.bzl", store_351 = "npm_imported_package_store")
+load("@@_main~npm~npm__debug__2.6.9__links//:defs.bzl", store_352 = "npm_imported_package_store")
+load("@@_main~npm~npm__debug__3.1.0__links//:defs.bzl", store_353 = "npm_imported_package_store")
+load("@@_main~npm~npm__debug__3.2.7__links//:defs.bzl", link_354 = "npm_link_imported_package_store", store_354 = "npm_imported_package_store")
+load("@@_main~npm~npm__debug__4.3.4_supports-color_8.1.1__links//:defs.bzl", store_355 = "npm_imported_package_store")
+load("@@_main~npm~npm__debug__github.com_ngokevin_debug_9742c5f383a6f8046241920156236ade8ec30d53__links//:defs.bzl", link_356 = "npm_link_imported_package_store", store_356 = "npm_imported_package_store")
+load("@@_main~npm~npm__decamelize__4.0.0__links//:defs.bzl", store_357 = "npm_imported_package_store")
+load("@@_main~npm~npm__decimal.js__10.4.3__links//:defs.bzl", store_358 = "npm_imported_package_store")
+load("@@_main~npm~npm__decompress-response__5.0.0__links//:defs.bzl", store_359 = "npm_imported_package_store")
+load("@@_main~npm~npm__deep-extend__0.6.0__links//:defs.bzl", store_360 = "npm_imported_package_store")
+load("@@_main~npm~npm__deep-is__0.1.4__links//:defs.bzl", store_361 = "npm_imported_package_store")
+load("@@_main~npm~npm__deep-object-diff__1.1.9__links//:defs.bzl", store_362 = "npm_imported_package_store")
+load("@@_main~npm~npm__deepmerge__4.3.0__links//:defs.bzl", store_363 = "npm_imported_package_store")
+load("@@_main~npm~npm__defer-to-connect__2.0.1__links//:defs.bzl", store_364 = "npm_imported_package_store")
+load("@@_main~npm~npm__defined__1.0.1__links//:defs.bzl", store_365 = "npm_imported_package_store")
+load("@@_main~npm~npm__delayed-stream__1.0.0__links//:defs.bzl", store_366 = "npm_imported_package_store")
+load("@@_main~npm~npm__delegates__1.0.0__links//:defs.bzl", store_367 = "npm_imported_package_store")
+load("@@_main~npm~npm__depd__1.1.2__links//:defs.bzl", store_368 = "npm_imported_package_store")
+load("@@_main~npm~npm__depd__2.0.0__links//:defs.bzl", store_369 = "npm_imported_package_store")
+load("@@_main~npm~npm__dequal__2.0.3__links//:defs.bzl", store_370 = "npm_imported_package_store")
+load("@@_main~npm~npm__detect-kerning__2.1.2__links//:defs.bzl", store_371 = "npm_imported_package_store")
+load("@@_main~npm~npm__detect-libc__1.0.3__links//:defs.bzl", store_372 = "npm_imported_package_store")
+load("@@_main~npm~npm__detect-libc__2.0.1__links//:defs.bzl", store_373 = "npm_imported_package_store")
+load("@@_main~npm~npm__devtools-protocol__0.0.1107588__links//:defs.bzl", store_374 = "npm_imported_package_store")
+load("@@_main~npm~npm__diff__5.0.0__links//:defs.bzl", store_375 = "npm_imported_package_store")
+load("@@_main~npm~npm__diff__5.1.0__links//:defs.bzl", store_376 = "npm_imported_package_store")
+load("@@_main~npm~npm__draw-svg-path__1.0.0__links//:defs.bzl", store_377 = "npm_imported_package_store")
+load("@@_main~npm~npm__dtype__2.0.0__links//:defs.bzl", store_378 = "npm_imported_package_store")
+load("@@_main~npm~npm__dup__1.0.0__links//:defs.bzl", store_379 = "npm_imported_package_store")
+load("@@_main~npm~npm__duplexer3__0.1.5__links//:defs.bzl", store_380 = "npm_imported_package_store")
+load("@@_main~npm~npm__duplexer__0.1.2__links//:defs.bzl", store_381 = "npm_imported_package_store")
+load("@@_main~npm~npm__duplexify__3.7.1__links//:defs.bzl", store_382 = "npm_imported_package_store")
+load("@@_main~npm~npm__earcut__2.2.4__links//:defs.bzl", store_383 = "npm_imported_package_store")
+load("@@_main~npm~npm__eastasianwidth__0.2.0__links//:defs.bzl", store_384 = "npm_imported_package_store")
+load("@@_main~npm~npm__ecc-jsbn__0.1.2__links//:defs.bzl", store_385 = "npm_imported_package_store")
+load("@@_main~npm~npm__electron-to-chromium__1.4.311__links//:defs.bzl", store_386 = "npm_imported_package_store")
+load("@@_main~npm~npm__element-size__1.1.1__links//:defs.bzl", store_387 = "npm_imported_package_store")
+load("@@_main~npm~npm__elementary-circuits-directed-graph__1.3.1__links//:defs.bzl", store_388 = "npm_imported_package_store")
+load("@@_main~npm~npm__emoji-regex__8.0.0__links//:defs.bzl", store_389 = "npm_imported_package_store")
+load("@@_main~npm~npm__emoji-regex__9.2.2__links//:defs.bzl", store_390 = "npm_imported_package_store")
+load("@@_main~npm~npm__emojis-list__3.0.0__links//:defs.bzl", store_391 = "npm_imported_package_store")
+load("@@_main~npm~npm__encoding__0.1.13__links//:defs.bzl", store_392 = "npm_imported_package_store")
+load("@@_main~npm~npm__end-of-stream__1.4.4__links//:defs.bzl", store_393 = "npm_imported_package_store")
+load("@@_main~npm~npm__enhanced-resolve__5.12.0__links//:defs.bzl", store_394 = "npm_imported_package_store")
+load("@@_main~npm~npm__env-paths__2.2.1__links//:defs.bzl", store_395 = "npm_imported_package_store")
+load("@@_main~npm~npm__envinfo__7.8.1__links//:defs.bzl", store_396 = "npm_imported_package_store")
+load("@@_main~npm~npm__err-code__2.0.3__links//:defs.bzl", store_397 = "npm_imported_package_store")
+load("@@_main~npm~npm__error-ex__1.3.2__links//:defs.bzl", store_398 = "npm_imported_package_store")
+load("@@_main~npm~npm__es-module-lexer__0.9.3__links//:defs.bzl", store_399 = "npm_imported_package_store")
+load("@@_main~npm~npm__es5-ext__0.10.62__links//:defs.bzl", store_400 = "npm_imported_package_store")
+load("@@_main~npm~npm__es6-iterator__2.0.3__links//:defs.bzl", store_401 = "npm_imported_package_store")
+load("@@_main~npm~npm__es6-symbol__3.1.3__links//:defs.bzl", store_402 = "npm_imported_package_store")
+load("@@_main~npm~npm__es6-weak-map__2.0.3__links//:defs.bzl", store_403 = "npm_imported_package_store")
+load("@@_main~npm~npm__esbuild__0.16.17__links//:defs.bzl", store_404 = "npm_imported_package_store")
+load("@@_main~npm~npm__esbuild__0.24.0__links//:defs.bzl", link_405 = "npm_link_imported_package_store", store_405 = "npm_imported_package_store")
+load("@@_main~npm~npm__escalade__3.1.1__links//:defs.bzl", store_406 = "npm_imported_package_store")
+load("@@_main~npm~npm__escape-html__1.0.3__links//:defs.bzl", store_407 = "npm_imported_package_store")
+load("@@_main~npm~npm__escape-latex__1.2.0__links//:defs.bzl", store_408 = "npm_imported_package_store")
+load("@@_main~npm~npm__escape-string-regexp__1.0.5__links//:defs.bzl", store_409 = "npm_imported_package_store")
+load("@@_main~npm~npm__escape-string-regexp__4.0.0__links//:defs.bzl", store_410 = "npm_imported_package_store")
+load("@@_main~npm~npm__escodegen__1.14.3__links//:defs.bzl", store_411 = "npm_imported_package_store")
+load("@@_main~npm~npm__eslint-scope__5.1.1__links//:defs.bzl", store_412 = "npm_imported_package_store")
+load("@@_main~npm~npm__esprima__1.0.0__links//:defs.bzl", store_413 = "npm_imported_package_store")
+load("@@_main~npm~npm__esprima__4.0.1__links//:defs.bzl", store_414 = "npm_imported_package_store")
+load("@@_main~npm~npm__esrecurse__4.3.0__links//:defs.bzl", store_415 = "npm_imported_package_store")
+load("@@_main~npm~npm__estraverse__4.3.0__links//:defs.bzl", store_416 = "npm_imported_package_store")
+load("@@_main~npm~npm__estraverse__5.3.0__links//:defs.bzl", store_417 = "npm_imported_package_store")
+load("@@_main~npm~npm__estree-walker__1.0.1__links//:defs.bzl", store_418 = "npm_imported_package_store")
+load("@@_main~npm~npm__estree-walker__2.0.2__links//:defs.bzl", store_419 = "npm_imported_package_store")
+load("@@_main~npm~npm__esutils__2.0.3__links//:defs.bzl", store_420 = "npm_imported_package_store")
+load("@@_main~npm~npm__eval__0.1.6__links//:defs.bzl", store_421 = "npm_imported_package_store")
+load("@@_main~npm~npm__events__3.3.0__links//:defs.bzl", store_422 = "npm_imported_package_store")
+load("@@_main~npm~npm__ext__1.7.0__links//:defs.bzl", store_423 = "npm_imported_package_store")
+load("@@_main~npm~npm__extend__3.0.2__links//:defs.bzl", store_424 = "npm_imported_package_store")
+load("@@_main~npm~npm__extract-zip__2.0.1__links//:defs.bzl", store_425 = "npm_imported_package_store")
+load("@@_main~npm~npm__extsprintf__1.3.0__links//:defs.bzl", store_426 = "npm_imported_package_store")
+load("@@_main~npm~npm__falafel__2.2.5__links//:defs.bzl", store_427 = "npm_imported_package_store")
+load("@@_main~npm~npm__fast-decode-uri-component__1.0.1__links//:defs.bzl", store_428 = "npm_imported_package_store")
+load("@@_main~npm~npm__fast-deep-equal__3.1.3__links//:defs.bzl", store_429 = "npm_imported_package_store")
+load("@@_main~npm~npm__fast-isnumeric__1.1.4__links//:defs.bzl", store_430 = "npm_imported_package_store")
+load("@@_main~npm~npm__fast-json-stable-stringify__2.1.0__links//:defs.bzl", store_431 = "npm_imported_package_store")
+load("@@_main~npm~npm__fast-levenshtein__2.0.6__links//:defs.bzl", store_432 = "npm_imported_package_store")
+load("@@_main~npm~npm__fastest-levenshtein__1.0.16__links//:defs.bzl", store_433 = "npm_imported_package_store")
+load("@@_main~npm~npm__fd-slicer__1.1.0__links//:defs.bzl", store_434 = "npm_imported_package_store")
+load("@@_main~npm~npm__file-uri-to-path__1.0.0__links//:defs.bzl", store_435 = "npm_imported_package_store")
+load("@@_main~npm~npm__fill-range__7.0.1__links//:defs.bzl", store_436 = "npm_imported_package_store")
+load("@@_main~npm~npm__find-up__4.1.0__links//:defs.bzl", store_437 = "npm_imported_package_store")
+load("@@_main~npm~npm__find-up__5.0.0__links//:defs.bzl", store_438 = "npm_imported_package_store")
+load("@@_main~npm~npm__flat__5.0.2__links//:defs.bzl", store_439 = "npm_imported_package_store")
+load("@@_main~npm~npm__flatten-vertex-data__1.0.2__links//:defs.bzl", store_440 = "npm_imported_package_store")
+load("@@_main~npm~npm__font-atlas__2.1.0__links//:defs.bzl", store_441 = "npm_imported_package_store")
+load("@@_main~npm~npm__font-measure__1.2.2__links//:defs.bzl", store_442 = "npm_imported_package_store")
+load("@@_main~npm~npm__foreground-child__2.0.0__links//:defs.bzl", store_443 = "npm_imported_package_store")
+load("@@_main~npm~npm__foreground-child__3.1.1__links//:defs.bzl", store_444 = "npm_imported_package_store")
+load("@@_main~npm~npm__forever-agent__0.6.1__links//:defs.bzl", store_445 = "npm_imported_package_store")
+load("@@_main~npm~npm__form-data__2.3.3__links//:defs.bzl", store_446 = "npm_imported_package_store")
+load("@@_main~npm~npm__form-data__2.5.1__links//:defs.bzl", store_447 = "npm_imported_package_store")
+load("@@_main~npm~npm__fraction.js__4.2.0__links//:defs.bzl", store_448 = "npm_imported_package_store")
+load("@@_main~npm~npm__from2__2.3.0__links//:defs.bzl", store_449 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs-constants__1.0.0__links//:defs.bzl", store_450 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs-extra__11.1.1__links//:defs.bzl", store_451 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs-extra__7.0.1__links//:defs.bzl", store_452 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs-minipass__1.2.7__links//:defs.bzl", store_453 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs-minipass__2.1.0__links//:defs.bzl", store_454 = "npm_imported_package_store")
+load("@@_main~npm~npm__fs.realpath__1.0.0__links//:defs.bzl", store_455 = "npm_imported_package_store")
+load("@@_main~npm~npm__fsevents__2.3.2__links//:defs.bzl", store_456 = "npm_imported_package_store")
+load("@@_main~npm~npm__function-bind__1.1.1__links//:defs.bzl", store_457 = "npm_imported_package_store")
+load("@@_main~npm~npm__gauge__2.7.4__links//:defs.bzl", store_458 = "npm_imported_package_store")
+load("@@_main~npm~npm__gauge__3.0.2__links//:defs.bzl", store_459 = "npm_imported_package_store")
+load("@@_main~npm~npm__gauge__4.0.4__links//:defs.bzl", store_460 = "npm_imported_package_store")
+load("@@_main~npm~npm__gensync__1.0.0-beta.2__links//:defs.bzl", store_461 = "npm_imported_package_store")
+load("@@_main~npm~npm__geojson-vt__3.2.1__links//:defs.bzl", store_462 = "npm_imported_package_store")
+load("@@_main~npm~npm__get-caller-file__2.0.5__links//:defs.bzl", store_463 = "npm_imported_package_store")
+load("@@_main~npm~npm__get-canvas-context__1.0.2__links//:defs.bzl", store_464 = "npm_imported_package_store")
+load("@@_main~npm~npm__get-stream__5.2.0__links//:defs.bzl", store_465 = "npm_imported_package_store")
+load("@@_main~npm~npm__get-stream__6.0.1__links//:defs.bzl", store_466 = "npm_imported_package_store")
+load("@@_main~npm~npm__getpass__0.1.7__links//:defs.bzl", store_467 = "npm_imported_package_store")
+load("@@_main~npm~npm__gl-mat4__1.2.0__links//:defs.bzl", store_468 = "npm_imported_package_store")
+load("@@_main~npm~npm__gl-matrix__3.4.3__links//:defs.bzl", store_469 = "npm_imported_package_store")
+load("@@_main~npm~npm__gl-text__1.3.1__links//:defs.bzl", store_470 = "npm_imported_package_store")
+load("@@_main~npm~npm__gl-util__3.1.3__links//:defs.bzl", store_471 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob-parent__5.1.2__links//:defs.bzl", store_472 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob-to-regexp__0.4.1__links//:defs.bzl", store_473 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob__10.3.3__links//:defs.bzl", store_474 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob__10.4.5__links//:defs.bzl", store_475 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob__7.2.0__links//:defs.bzl", store_476 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob__7.2.3__links//:defs.bzl", store_477 = "npm_imported_package_store")
+load("@@_main~npm~npm__glob__8.1.0__links//:defs.bzl", store_478 = "npm_imported_package_store")
+load("@@_main~npm~npm__globals__11.12.0__links//:defs.bzl", store_479 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-inject-defines__1.0.3__links//:defs.bzl", store_480 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-resolve__0.0.1__links//:defs.bzl", store_481 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-assignments__2.0.2__links//:defs.bzl", store_482 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-defines__1.0.0__links//:defs.bzl", store_483 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-depth__1.1.2__links//:defs.bzl", store_484 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-descope__1.0.2__links//:defs.bzl", store_485 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-inject-block__1.1.0__links//:defs.bzl", store_486 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-properties__1.0.1__links//:defs.bzl", store_487 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-scope__1.1.2__links//:defs.bzl", store_488 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-string__1.0.1__links//:defs.bzl", store_489 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-token-whitespace-trim__1.0.0__links//:defs.bzl", store_490 = "npm_imported_package_store")
+load("@@_main~npm~npm__glsl-tokenizer__2.1.5__links//:defs.bzl", store_491 = "npm_imported_package_store")
+load("@@_main~npm~npm__glslify-bundle__5.1.1__links//:defs.bzl", store_492 = "npm_imported_package_store")
+load("@@_main~npm~npm__glslify-deps__1.3.2__links//:defs.bzl", store_493 = "npm_imported_package_store")
+load("@@_main~npm~npm__glslify__7.1.1__links//:defs.bzl", store_494 = "npm_imported_package_store")
+load("@@_main~npm~npm__google-protobuf__3.21.4__links//:defs.bzl", link_495 = "npm_link_imported_package_store", store_495 = "npm_imported_package_store")
+load("@@_main~npm~npm__got__10.7.0__links//:defs.bzl", store_496 = "npm_imported_package_store")
+load("@@_main~npm~npm__graceful-fs__4.2.10__links//:defs.bzl", store_497 = "npm_imported_package_store")
+load("@@_main~npm~npm__grid-index__1.1.0__links//:defs.bzl", store_498 = "npm_imported_package_store")
+load("@@_main~npm~npm__gzip-size__6.0.0__links//:defs.bzl", store_499 = "npm_imported_package_store")
+load("@@_main~npm~npm__handlebars-utils__1.0.6__links//:defs.bzl", store_500 = "npm_imported_package_store")
+load("@@_main~npm~npm__har-schema__2.0.0__links//:defs.bzl", store_501 = "npm_imported_package_store")
+load("@@_main~npm~npm__har-validator__5.1.5__links//:defs.bzl", store_502 = "npm_imported_package_store")
+load("@@_main~npm~npm__has-flag__3.0.0__links//:defs.bzl", store_503 = "npm_imported_package_store")
+load("@@_main~npm~npm__has-flag__4.0.0__links//:defs.bzl", store_504 = "npm_imported_package_store")
+load("@@_main~npm~npm__has-hover__1.0.1__links//:defs.bzl", store_505 = "npm_imported_package_store")
+load("@@_main~npm~npm__has-passive-events__1.0.0__links//:defs.bzl", store_506 = "npm_imported_package_store")
+load("@@_main~npm~npm__has-unicode__2.0.1__links//:defs.bzl", store_507 = "npm_imported_package_store")
+load("@@_main~npm~npm__has__1.0.3__links//:defs.bzl", store_508 = "npm_imported_package_store")
+load("@@_main~npm~npm__he__1.2.0__links//:defs.bzl", store_509 = "npm_imported_package_store")
+load("@@_main~npm~npm__hello__at_gitpkg.vercel.app_EqualMa_gitpkg-hello_packages_hello__links//:defs.bzl", link_510 = "npm_link_imported_package_store", store_510 = "npm_imported_package_store")
+load("@@_main~npm~npm__helper-date__github.com_coda_helper-date_a2cb4284148cbba7d36173dff4c7c60ce59eae55__links//:defs.bzl", link_511 = "npm_link_imported_package_store", store_511 = "npm_imported_package_store")
+load("@@_main~npm~npm__hot-shots__10.0.0__links//:defs.bzl", link_512 = "npm_link_imported_package_store", store_512 = "npm_imported_package_store")
+load("@@_main~npm~npm__hsluv__0.0.3__links//:defs.bzl", store_513 = "npm_imported_package_store")
+load("@@_main~npm~npm__html-escaper__2.0.2__links//:defs.bzl", store_514 = "npm_imported_package_store")
+load("@@_main~npm~npm__http-cache-semantics__4.1.1__links//:defs.bzl", store_515 = "npm_imported_package_store")
+load("@@_main~npm~npm__http-errors__2.0.0__links//:defs.bzl", store_516 = "npm_imported_package_store")
+load("@@_main~npm~npm__http-proxy-agent__5.0.0__links//:defs.bzl", store_517 = "npm_imported_package_store")
+load("@@_main~npm~npm__http-signature__1.2.0__links//:defs.bzl", store_518 = "npm_imported_package_store")
+load("@@_main~npm~npm__https-proxy-agent__5.0.1__links//:defs.bzl", store_519 = "npm_imported_package_store")
+load("@@_main~npm~npm__humanize-ms__1.2.1__links//:defs.bzl", store_520 = "npm_imported_package_store")
+load("@@_main~npm~npm__iconv-lite__0.4.24__links//:defs.bzl", store_521 = "npm_imported_package_store")
+load("@@_main~npm~npm__iconv-lite__0.6.3__links//:defs.bzl", store_522 = "npm_imported_package_store")
+load("@@_main~npm~npm__icss-utils__5.1.0_postcss_8.4.21__links//:defs.bzl", store_523 = "npm_imported_package_store")
+load("@@_main~npm~npm__ieee754__1.2.1__links//:defs.bzl", store_524 = "npm_imported_package_store")
+load("@@_main~npm~npm__ignore-walk__3.0.4__links//:defs.bzl", store_525 = "npm_imported_package_store")
+load("@@_main~npm~npm__import-fresh__3.3.0__links//:defs.bzl", store_526 = "npm_imported_package_store")
+load("@@_main~npm~npm__import-local__3.1.0__links//:defs.bzl", store_527 = "npm_imported_package_store")
+load("@@_main~npm~npm__imurmurhash__0.1.4__links//:defs.bzl", store_528 = "npm_imported_package_store")
+load("@@_main~npm~npm__indent-string__4.0.0__links//:defs.bzl", store_529 = "npm_imported_package_store")
+load("@@_main~npm~npm__infer-owner__1.0.4__links//:defs.bzl", store_530 = "npm_imported_package_store")
+load("@@_main~npm~npm__inflight__1.0.6__links//:defs.bzl", store_531 = "npm_imported_package_store")
+load("@@_main~npm~npm__inherits__2.0.4__links//:defs.bzl", store_532 = "npm_imported_package_store")
+load("@@_main~npm~npm__ini__1.3.8__links//:defs.bzl", store_533 = "npm_imported_package_store")
+load("@@_main~npm~npm__inline-fixtures__1.1.0__links//:defs.bzl", link_534 = "npm_link_imported_package_store", store_534 = "npm_imported_package_store")
+load("@@_main~npm~npm__inline-fixtures__at_registry.yarnpkg.com_inline-fixtures_-_inline-fixtures-1.1.0.tgz_5f9edf644ac02a1322012dbbb9f0a4739831d662__links//:defs.bzl", link_535 = "npm_link_imported_package_store", store_535 = "npm_imported_package_store")
+load("@@_main~npm~npm__interpret__3.1.1__links//:defs.bzl", store_536 = "npm_imported_package_store")
+load("@@_main~npm~npm__ip__2.0.0__links//:defs.bzl", store_537 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-arrayish__0.2.1__links//:defs.bzl", store_538 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-binary-path__2.1.0__links//:defs.bzl", store_539 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-browser__2.1.0__links//:defs.bzl", store_540 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-buffer__1.1.6__links//:defs.bzl", store_541 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-core-module__2.11.0__links//:defs.bzl", store_542 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-extglob__2.1.1__links//:defs.bzl", store_543 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-finite__1.1.0__links//:defs.bzl", store_544 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-firefox__1.0.3__links//:defs.bzl", store_545 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-fullwidth-code-point__1.0.0__links//:defs.bzl", store_546 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-fullwidth-code-point__3.0.0__links//:defs.bzl", store_547 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-glob__4.0.3__links//:defs.bzl", store_548 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-iexplorer__1.0.0__links//:defs.bzl", store_549 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-lambda__1.0.1__links//:defs.bzl", store_550 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-mobile__4.0.0__links//:defs.bzl", store_551 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-module__1.0.0__links//:defs.bzl", store_552 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-number__6.0.0__links//:defs.bzl", store_553 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-number__7.0.0__links//:defs.bzl", store_554 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-obj__1.0.1__links//:defs.bzl", store_555 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-plain-obj__1.1.0__links//:defs.bzl", store_556 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-plain-obj__2.1.0__links//:defs.bzl", store_557 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-plain-object__2.0.4__links//:defs.bzl", store_558 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-reference__1.2.1__links//:defs.bzl", store_559 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-string-blank__1.0.1__links//:defs.bzl", store_560 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-svg-path__1.0.2__links//:defs.bzl", store_561 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-typedarray__1.0.0__links//:defs.bzl", store_562 = "npm_imported_package_store")
+load("@@_main~npm~npm__is-unicode-supported__0.1.0__links//:defs.bzl", store_563 = "npm_imported_package_store")
+load("@@_main~npm~npm__isarray__0.0.1__links//:defs.bzl", store_564 = "npm_imported_package_store")
+load("@@_main~npm~npm__isarray__1.0.0__links//:defs.bzl", store_565 = "npm_imported_package_store")
+load("@@_main~npm~npm__isarray__2.0.5__links//:defs.bzl", store_566 = "npm_imported_package_store")
+load("@@_main~npm~npm__isexe__2.0.0__links//:defs.bzl", store_567 = "npm_imported_package_store")
+load("@@_main~npm~npm__isobject__3.0.1__links//:defs.bzl", store_568 = "npm_imported_package_store")
+load("@@_main~npm~npm__isomorphic-ws__5.0.0_ws_8.18.0__links//:defs.bzl", store_569 = "npm_imported_package_store")
+load("@@_main~npm~npm__isstream__0.1.2__links//:defs.bzl", store_570 = "npm_imported_package_store")
+load("@@_main~npm~npm__istanbul-lib-coverage__3.2.0__links//:defs.bzl", store_571 = "npm_imported_package_store")
+load("@@_main~npm~npm__istanbul-lib-report__3.0.0__links//:defs.bzl", store_572 = "npm_imported_package_store")
+load("@@_main~npm~npm__istanbul-reports__3.1.5__links//:defs.bzl", store_573 = "npm_imported_package_store")
+load("@@_main~npm~npm__jackspeak__2.2.3__links//:defs.bzl", store_574 = "npm_imported_package_store")
+load("@@_main~npm~npm__jackspeak__3.4.3__links//:defs.bzl", store_575 = "npm_imported_package_store")
+load("@@_main~npm~npm__jasmine-core__5.1.0__links//:defs.bzl", store_576 = "npm_imported_package_store")
+load("@@_main~npm~npm__jasmine__5.1.0__links//:defs.bzl", link_577 = "npm_link_imported_package_store", store_577 = "npm_imported_package_store")
+load("@@_main~npm~npm__javascript-natural-sort__0.7.1__links//:defs.bzl", store_578 = "npm_imported_package_store")
+load("@@_main~npm~npm__javascript-stringify__2.1.0__links//:defs.bzl", store_579 = "npm_imported_package_store")
+load("@@_main~npm~npm__jest-worker__27.5.1__links//:defs.bzl", store_580 = "npm_imported_package_store")
+load("@@_main~npm~npm__jose__4.12.0__links//:defs.bzl", store_581 = "npm_imported_package_store")
+load("@@_main~npm~npm__js-tokens__4.0.0__links//:defs.bzl", store_582 = "npm_imported_package_store")
+load("@@_main~npm~npm__js-yaml__4.1.0__links//:defs.bzl", store_583 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsbn__0.1.1__links//:defs.bzl", store_584 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsep__1.3.9__links//:defs.bzl", store_585 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsesc__2.5.2__links//:defs.bzl", store_586 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-buffer__3.0.1__links//:defs.bzl", store_587 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-parse-even-better-errors__2.3.1__links//:defs.bzl", store_588 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-schema-traverse__0.4.1__links//:defs.bzl", store_589 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-schema-traverse__1.0.0__links//:defs.bzl", store_590 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-schema__0.4.0__links//:defs.bzl", store_591 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-stable-stringify__1.0.1__links//:defs.bzl", link_592 = "npm_link_imported_package_store", store_592 = "npm_imported_package_store")
+load("@@_main~npm~npm__json-stringify-safe__5.0.1__links//:defs.bzl", store_593 = "npm_imported_package_store")
+load("@@_main~npm~npm__json5__2.2.3__links//:defs.bzl", store_594 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsonc-parser__3.2.0__links//:defs.bzl", store_595 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsonfile__4.0.0__links//:defs.bzl", store_596 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsonfile__6.1.0__links//:defs.bzl", store_597 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsonpath-plus__7.2.0__links//:defs.bzl", link_598 = "npm_link_imported_package_store", store_598 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsonpath-plus__9.0.0__links//:defs.bzl", store_599 = "npm_imported_package_store")
+load("@@_main~npm~npm__jsprim__1.4.2__links//:defs.bzl", store_600 = "npm_imported_package_store")
+load("@@_main~npm~npm__kdbush__3.0.0__links//:defs.bzl", store_601 = "npm_imported_package_store")
+load("@@_main~npm~npm__keyv__4.5.2__links//:defs.bzl", store_602 = "npm_imported_package_store")
+load("@@_main~npm~npm__kind-of__3.2.2__links//:defs.bzl", store_603 = "npm_imported_package_store")
+load("@@_main~npm~npm__kind-of__6.0.3__links//:defs.bzl", store_604 = "npm_imported_package_store")
+load("@@_main~npm~npm__kleur__4.1.5__links//:defs.bzl", store_605 = "npm_imported_package_store")
+load("@@_main~npm~npm__levn__0.3.0__links//:defs.bzl", store_606 = "npm_imported_package_store")
+load("@@_main~npm~npm__lines-and-columns__1.2.4__links//:defs.bzl", store_607 = "npm_imported_package_store")
+load("@@_main~npm~npm__loader-runner__4.3.0__links//:defs.bzl", store_608 = "npm_imported_package_store")
+load("@@_main~npm~npm__loader-utils__2.0.4__links//:defs.bzl", store_609 = "npm_imported_package_store")
+load("@@_main~npm~npm__locate-path__5.0.0__links//:defs.bzl", store_610 = "npm_imported_package_store")
+load("@@_main~npm~npm__locate-path__6.0.0__links//:defs.bzl", store_611 = "npm_imported_package_store")
+load("@@_main~npm~npm__lodash.merge__4.6.2__links//:defs.bzl", store_612 = "npm_imported_package_store")
+load("@@_main~npm~npm__lodash__4.17.21__links//:defs.bzl", link_613 = "npm_link_imported_package_store", store_613 = "npm_imported_package_store")
+load("@@_main~npm~npm__log-symbols__4.1.0__links//:defs.bzl", store_614 = "npm_imported_package_store")
+load("@@_main~npm~npm__loose-envify__1.4.0__links//:defs.bzl", store_615 = "npm_imported_package_store")
+load("@@_main~npm~npm__lowercase-keys__2.0.0__links//:defs.bzl", store_616 = "npm_imported_package_store")
+load("@@_main~npm~npm__lru-cache__10.4.3__links//:defs.bzl", store_617 = "npm_imported_package_store")
+load("@@_main~npm~npm__lru-cache__5.1.1__links//:defs.bzl", store_618 = "npm_imported_package_store")
+load("@@_main~npm~npm__lru-cache__6.0.0__links//:defs.bzl", store_619 = "npm_imported_package_store")
+load("@@_main~npm~npm__lru-cache__7.17.0__links//:defs.bzl", store_620 = "npm_imported_package_store")
+load("@@_main~npm~npm__magic-string__0.25.9__links//:defs.bzl", store_621 = "npm_imported_package_store")
+load("@@_main~npm~npm__magic-string__0.27.0__links//:defs.bzl", store_622 = "npm_imported_package_store")
+load("@@_main~npm~npm__make-dir__2.1.0__links//:defs.bzl", store_623 = "npm_imported_package_store")
+load("@@_main~npm~npm__make-dir__3.1.0__links//:defs.bzl", store_624 = "npm_imported_package_store")
+load("@@_main~npm~npm__make-fetch-happen__10.2.1__links//:defs.bzl", store_625 = "npm_imported_package_store")
+load("@@_main~npm~npm__map-limit__0.0.1__links//:defs.bzl", store_626 = "npm_imported_package_store")
+load("@@_main~npm~npm__mapbox-gl__1.10.1__links//:defs.bzl", store_627 = "npm_imported_package_store")
+load("@@_main~npm~npm__math-log2__1.0.1__links//:defs.bzl", store_628 = "npm_imported_package_store")
+load("@@_main~npm~npm__mathjs__11.4.0__links//:defs.bzl", link_629 = "npm_link_imported_package_store", store_629 = "npm_imported_package_store")
+load("@@_main~npm~npm__md5__2.3.0__links//:defs.bzl", store_630 = "npm_imported_package_store")
+load("@@_main~npm~npm__meaning-of-life__1.0.0_o3deharooos255qt5xdujc3cuq__links//:defs.bzl", link_631 = "npm_link_imported_package_store", store_631 = "npm_imported_package_store")
+load("@@_main~npm~npm__media-query-parser__2.0.2__links//:defs.bzl", store_632 = "npm_imported_package_store")
+load("@@_main~npm~npm__merge-stream__2.0.0__links//:defs.bzl", store_633 = "npm_imported_package_store")
+load("@@_main~npm~npm__mime-db__1.52.0__links//:defs.bzl", store_634 = "npm_imported_package_store")
+load("@@_main~npm~npm__mime-types__2.1.35__links//:defs.bzl", store_635 = "npm_imported_package_store")
+load("@@_main~npm~npm__mime__3.0.0__links//:defs.bzl", store_636 = "npm_imported_package_store")
+load("@@_main~npm~npm__mimic-response__1.0.1__links//:defs.bzl", store_637 = "npm_imported_package_store")
+load("@@_main~npm~npm__mimic-response__2.1.0__links//:defs.bzl", store_638 = "npm_imported_package_store")
+load("@@_main~npm~npm__mini-css-extract-plugin__2.7.5_webpack_5.76.3__links//:defs.bzl", link_639 = "npm_link_imported_package_store", store_639 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__3.1.2__links//:defs.bzl", store_640 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__5.0.1__links//:defs.bzl", store_641 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__5.1.6__links//:defs.bzl", store_642 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__6.2.0__links//:defs.bzl", store_643 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__9.0.3__links//:defs.bzl", store_644 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimatch__9.0.5__links//:defs.bzl", store_645 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimist__0.0.10__links//:defs.bzl", store_646 = "npm_imported_package_store")
+load("@@_main~npm~npm__minimist__1.2.8__links//:defs.bzl", store_647 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass-collect__1.0.2__links//:defs.bzl", store_648 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass-fetch__2.1.2__links//:defs.bzl", store_649 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass-flush__1.0.5__links//:defs.bzl", store_650 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass-pipeline__1.2.4__links//:defs.bzl", store_651 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass-sized__1.0.3__links//:defs.bzl", store_652 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass__2.9.0__links//:defs.bzl", store_653 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass__3.3.6__links//:defs.bzl", store_654 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass__4.2.4__links//:defs.bzl", store_655 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass__7.0.3__links//:defs.bzl", store_656 = "npm_imported_package_store")
+load("@@_main~npm~npm__minipass__7.1.2__links//:defs.bzl", store_657 = "npm_imported_package_store")
+load("@@_main~npm~npm__minizlib__1.3.3__links//:defs.bzl", store_658 = "npm_imported_package_store")
+load("@@_main~npm~npm__minizlib__2.1.2__links//:defs.bzl", store_659 = "npm_imported_package_store")
+load("@@_main~npm~npm__minizlib__3.0.1__links//:defs.bzl", store_660 = "npm_imported_package_store")
+load("@@_main~npm~npm__mitt__3.0.0__links//:defs.bzl", store_661 = "npm_imported_package_store")
+load("@@_main~npm~npm__mkdirp-classic__0.5.3__links//:defs.bzl", store_662 = "npm_imported_package_store")
+load("@@_main~npm~npm__mkdirp__0.5.6__links//:defs.bzl", store_663 = "npm_imported_package_store")
+load("@@_main~npm~npm__mkdirp__1.0.4__links//:defs.bzl", store_664 = "npm_imported_package_store")
+load("@@_main~npm~npm__mkdirp__3.0.1__links//:defs.bzl", store_665 = "npm_imported_package_store")
+load("@@_main~npm~npm__mlly__1.1.1__links//:defs.bzl", store_666 = "npm_imported_package_store")
+load("@@_main~npm~npm__mobx-react-lite__3.4.0_mobx_6.3.0_react_17.0.2__links//:defs.bzl", store_667 = "npm_imported_package_store")
+load("@@_main~npm~npm__mobx-react__7.3.0_mobx_6.3.0_react_17.0.2__links//:defs.bzl", link_668 = "npm_link_imported_package_store", store_668 = "npm_imported_package_store")
+load("@@_main~npm~npm__mobx__6.3.0__links//:defs.bzl", link_669 = "npm_link_imported_package_store", store_669 = "npm_imported_package_store")
+load("@@_main~npm~npm__mocha-junit-reporter__2.2.0_mocha_10.2.0__links//:defs.bzl", link_670 = "npm_link_imported_package_store", store_670 = "npm_imported_package_store")
+load("@@_main~npm~npm__mocha-multi-reporters__1.5.1_181752652__links//:defs.bzl", link_671 = "npm_link_imported_package_store", store_671 = "npm_imported_package_store")
+load("@@_main~npm~npm__mocha__10.2.0_mocha-multi-reporters_1.5.1__links//:defs.bzl", link_672 = "npm_link_imported_package_store", store_672 = "npm_imported_package_store")
+load("@@_main~npm~npm__moment-timezone__0.5.41__links//:defs.bzl", store_673 = "npm_imported_package_store")
+load("@@_main~npm~npm__moment__2.29.4__links//:defs.bzl", store_674 = "npm_imported_package_store")
+load("@@_main~npm~npm__mouse-change__1.4.0__links//:defs.bzl", store_675 = "npm_imported_package_store")
+load("@@_main~npm~npm__mouse-event-offset__3.0.2__links//:defs.bzl", store_676 = "npm_imported_package_store")
+load("@@_main~npm~npm__mouse-event__1.0.5__links//:defs.bzl", store_677 = "npm_imported_package_store")
+load("@@_main~npm~npm__mouse-wheel__1.2.0__links//:defs.bzl", store_678 = "npm_imported_package_store")
+load("@@_main~npm~npm__mri__1.2.0__links//:defs.bzl", store_679 = "npm_imported_package_store")
+load("@@_main~npm~npm__mrmime__1.0.1__links//:defs.bzl", store_680 = "npm_imported_package_store")
+load("@@_main~npm~npm__ms__0.7.3__links//:defs.bzl", store_681 = "npm_imported_package_store")
+load("@@_main~npm~npm__ms__2.0.0__links//:defs.bzl", store_682 = "npm_imported_package_store")
+load("@@_main~npm~npm__ms__2.1.2__links//:defs.bzl", store_683 = "npm_imported_package_store")
+load("@@_main~npm~npm__ms__2.1.3__links//:defs.bzl", link_684 = "npm_link_imported_package_store", store_684 = "npm_imported_package_store")
+load("@@_main~npm~npm__mumath__3.3.4__links//:defs.bzl", store_685 = "npm_imported_package_store")
+load("@@_main~npm~npm__murmurhash-js__1.0.0__links//:defs.bzl", store_686 = "npm_imported_package_store")
+load("@@_main~npm~npm__nan__2.17.0__links//:defs.bzl", store_687 = "npm_imported_package_store")
+load("@@_main~npm~npm__nanoid__3.3.3__links//:defs.bzl", store_688 = "npm_imported_package_store")
+load("@@_main~npm~npm__nanoid__3.3.4__links//:defs.bzl", store_689 = "npm_imported_package_store")
+load("@@_main~npm~npm__native-promise-only__0.8.1__links//:defs.bzl", store_690 = "npm_imported_package_store")
+load("@@_main~npm~npm__needle__2.9.1__links//:defs.bzl", store_691 = "npm_imported_package_store")
+load("@@_main~npm~npm__negotiator__0.6.3__links//:defs.bzl", store_692 = "npm_imported_package_store")
+load("@@_main~npm~npm__neo-async__2.6.2__links//:defs.bzl", store_693 = "npm_imported_package_store")
+load("@@_main~npm~npm__next-tick__1.1.0__links//:defs.bzl", store_694 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-fetch__2.6.12__links//:defs.bzl", store_695 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-fetch__2.6.7__links//:defs.bzl", store_696 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-gyp-build__4.6.0__links//:defs.bzl", store_697 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-gyp__7.1.2__links//:defs.bzl", store_698 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-gyp__9.3.0__links//:defs.bzl", link_699 = "npm_link_imported_package_store", store_699 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-pre-gyp__0.13.0__links//:defs.bzl", store_700 = "npm_imported_package_store")
+load("@@_main~npm~npm__node-releases__2.0.10__links//:defs.bzl", store_701 = "npm_imported_package_store")
+load("@@_main~npm~npm__nopt__4.0.3__links//:defs.bzl", store_702 = "npm_imported_package_store")
+load("@@_main~npm~npm__nopt__5.0.0__links//:defs.bzl", store_703 = "npm_imported_package_store")
+load("@@_main~npm~npm__nopt__6.0.0__links//:defs.bzl", store_704 = "npm_imported_package_store")
+load("@@_main~npm~npm__normalize-path__3.0.0__links//:defs.bzl", store_705 = "npm_imported_package_store")
+load("@@_main~npm~npm__normalize-svg-path__0.1.0__links//:defs.bzl", store_706 = "npm_imported_package_store")
+load("@@_main~npm~npm__normalize-svg-path__1.1.0__links//:defs.bzl", store_707 = "npm_imported_package_store")
+load("@@_main~npm~npm__normalize-url__6.1.0__links//:defs.bzl", store_708 = "npm_imported_package_store")
+load("@@_main~npm~npm__npm-bundled__1.1.2__links//:defs.bzl", store_709 = "npm_imported_package_store")
+load("@@_main~npm~npm__npm-normalize-package-bin__1.0.1__links//:defs.bzl", store_710 = "npm_imported_package_store")
+load("@@_main~npm~npm__npm-packlist__1.4.8__links//:defs.bzl", store_711 = "npm_imported_package_store")
+load("@@_main~npm~npm__npmlog__4.1.2__links//:defs.bzl", store_712 = "npm_imported_package_store")
+load("@@_main~npm~npm__npmlog__5.0.1__links//:defs.bzl", store_713 = "npm_imported_package_store")
+load("@@_main~npm~npm__npmlog__6.0.2__links//:defs.bzl", store_714 = "npm_imported_package_store")
+load("@@_main~npm~npm__number-is-integer__1.0.1__links//:defs.bzl", store_715 = "npm_imported_package_store")
+load("@@_main~npm~npm__number-is-nan__1.0.1__links//:defs.bzl", store_716 = "npm_imported_package_store")
+load("@@_main~npm~npm__oauth-sign__0.9.0__links//:defs.bzl", store_717 = "npm_imported_package_store")
+load("@@_main~npm~npm__object-assign__4.1.1__links//:defs.bzl", store_718 = "npm_imported_package_store")
+load("@@_main~npm~npm__object-hash__2.2.0__links//:defs.bzl", store_719 = "npm_imported_package_store")
+load("@@_main~npm~npm__oidc-token-hash__5.0.1__links//:defs.bzl", store_720 = "npm_imported_package_store")
+load("@@_main~npm~npm__once__1.3.3__links//:defs.bzl", store_721 = "npm_imported_package_store")
+load("@@_main~npm~npm__once__1.4.0__links//:defs.bzl", store_722 = "npm_imported_package_store")
+load("@@_main~npm~npm__opener__1.5.2__links//:defs.bzl", store_723 = "npm_imported_package_store")
+load("@@_main~npm~npm__openid-client__5.4.0__links//:defs.bzl", store_724 = "npm_imported_package_store")
+load("@@_main~npm~npm__optimist__0.6.0__links//:defs.bzl", store_725 = "npm_imported_package_store")
+load("@@_main~npm~npm__optionator__0.8.3__links//:defs.bzl", store_726 = "npm_imported_package_store")
+load("@@_main~npm~npm__os-homedir__1.0.2__links//:defs.bzl", store_727 = "npm_imported_package_store")
+load("@@_main~npm~npm__os-tmpdir__1.0.2__links//:defs.bzl", store_728 = "npm_imported_package_store")
+load("@@_main~npm~npm__osenv__0.1.5__links//:defs.bzl", store_729 = "npm_imported_package_store")
+load("@@_main~npm~npm__outdent__0.8.0__links//:defs.bzl", store_730 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-cancelable__2.1.1__links//:defs.bzl", store_731 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-event__4.2.0__links//:defs.bzl", store_732 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-finally__1.0.0__links//:defs.bzl", store_733 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-limit__2.3.0__links//:defs.bzl", store_734 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-limit__3.1.0__links//:defs.bzl", store_735 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-locate__4.1.0__links//:defs.bzl", store_736 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-locate__5.0.0__links//:defs.bzl", store_737 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-map__4.0.0__links//:defs.bzl", store_738 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-timeout__3.2.0__links//:defs.bzl", store_739 = "npm_imported_package_store")
+load("@@_main~npm~npm__p-try__2.2.0__links//:defs.bzl", store_740 = "npm_imported_package_store")
+load("@@_main~npm~npm__package-json-from-dist__1.0.1__links//:defs.bzl", store_741 = "npm_imported_package_store")
+load("@@_main~npm~npm__parent-module__1.0.1__links//:defs.bzl", store_742 = "npm_imported_package_store")
+load("@@_main~npm~npm__parenthesis__3.1.8__links//:defs.bzl", store_743 = "npm_imported_package_store")
+load("@@_main~npm~npm__parse-json__5.2.0__links//:defs.bzl", store_744 = "npm_imported_package_store")
+load("@@_main~npm~npm__parse-rect__1.2.0__links//:defs.bzl", store_745 = "npm_imported_package_store")
+load("@@_main~npm~npm__parse-svg-path__0.1.2__links//:defs.bzl", store_746 = "npm_imported_package_store")
+load("@@_main~npm~npm__parse-unit__1.0.1__links//:defs.bzl", store_747 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-exists__4.0.0__links//:defs.bzl", store_748 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-is-absolute__1.0.1__links//:defs.bzl", store_749 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-key__3.1.1__links//:defs.bzl", store_750 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-parse__1.0.7__links//:defs.bzl", store_751 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-scurry__1.10.1__links//:defs.bzl", store_752 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-scurry__1.11.1__links//:defs.bzl", store_753 = "npm_imported_package_store")
+load("@@_main~npm~npm__path-type__4.0.0__links//:defs.bzl", store_754 = "npm_imported_package_store")
+load("@@_main~npm~npm__pathe__1.1.0__links//:defs.bzl", store_755 = "npm_imported_package_store")
+load("@@_main~npm~npm__pbf__3.2.1__links//:defs.bzl", store_756 = "npm_imported_package_store")
+load("@@_main~npm~npm__pend__1.2.0__links//:defs.bzl", store_757 = "npm_imported_package_store")
+load("@@_main~npm~npm__performance-now__2.1.0__links//:defs.bzl", store_758 = "npm_imported_package_store")
+load("@@_main~npm~npm__pick-by-alias__1.2.0__links//:defs.bzl", store_759 = "npm_imported_package_store")
+load("@@_main~npm~npm__picocolors__1.0.0__links//:defs.bzl", store_760 = "npm_imported_package_store")
+load("@@_main~npm~npm__picomatch__2.3.1__links//:defs.bzl", store_761 = "npm_imported_package_store")
+load("@@_main~npm~npm__pify__4.0.1__links//:defs.bzl", store_762 = "npm_imported_package_store")
+load("@@_main~npm~npm__pkg-dir__4.2.0__links//:defs.bzl", store_763 = "npm_imported_package_store")
+load("@@_main~npm~npm__pkg-types__1.0.2__links//:defs.bzl", store_764 = "npm_imported_package_store")
+load("@@_main~npm~npm__plotly.js__2.25.2__links//:defs.bzl", link_765 = "npm_link_imported_package_store", store_765 = "npm_imported_package_store")
+load("@@_main~npm~npm__pngjs__5.0.0__links//:defs.bzl", link_766 = "npm_link_imported_package_store", store_766 = "npm_imported_package_store")
+load("@@_main~npm~npm__point-in-polygon__1.1.0__links//:defs.bzl", store_767 = "npm_imported_package_store")
+load("@@_main~npm~npm__polybooljs__1.2.0__links//:defs.bzl", store_768 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-modules-extract-imports__3.0.0_postcss_8.4.21__links//:defs.bzl", store_769 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-modules-local-by-default__4.0.0_postcss_8.4.21__links//:defs.bzl", store_770 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-modules-scope__3.0.0_postcss_8.4.21__links//:defs.bzl", store_771 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-modules-values__4.0.0_postcss_8.4.21__links//:defs.bzl", store_772 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-selector-parser__6.0.11__links//:defs.bzl", store_773 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss-value-parser__4.2.0__links//:defs.bzl", store_774 = "npm_imported_package_store")
+load("@@_main~npm~npm__postcss__8.4.21__links//:defs.bzl", store_775 = "npm_imported_package_store")
+load("@@_main~npm~npm__potpack__1.0.2__links//:defs.bzl", store_776 = "npm_imported_package_store")
+load("@@_main~npm~npm__prelude-ls__1.1.2__links//:defs.bzl", store_777 = "npm_imported_package_store")
+load("@@_main~npm~npm__probe-image-size__7.2.3__links//:defs.bzl", store_778 = "npm_imported_package_store")
+load("@@_main~npm~npm__process-nextick-args__2.0.1__links//:defs.bzl", store_779 = "npm_imported_package_store")
+load("@@_main~npm~npm__progress__2.0.3__links//:defs.bzl", store_780 = "npm_imported_package_store")
+load("@@_main~npm~npm__promise-inflight__1.0.1__links//:defs.bzl", store_781 = "npm_imported_package_store")
+load("@@_main~npm~npm__promise-retry__2.0.1__links//:defs.bzl", store_782 = "npm_imported_package_store")
+load("@@_main~npm~npm__protoc-gen-grpc__github.com_gregmagolan-codaio_protoc-gen-grpc-ts_be5580b06348d3eb9b4610a4a94065154a0df41f__links//:defs.bzl", link_783 = "npm_link_imported_package_store", store_783 = "npm_imported_package_store")
+load("@@_main~npm~npm__protocol-buffers-schema__3.6.0__links//:defs.bzl", store_784 = "npm_imported_package_store")
+load("@@_main~npm~npm__proxy-from-env__1.1.0__links//:defs.bzl", store_785 = "npm_imported_package_store")
+load("@@_main~npm~npm__psl__1.9.0__links//:defs.bzl", store_786 = "npm_imported_package_store")
+load("@@_main~npm~npm__pump__1.0.3__links//:defs.bzl", store_787 = "npm_imported_package_store")
+load("@@_main~npm~npm__pump__3.0.0__links//:defs.bzl", store_788 = "npm_imported_package_store")
+load("@@_main~npm~npm__punycode__2.3.0__links//:defs.bzl", store_789 = "npm_imported_package_store")
+load("@@_main~npm~npm__puppeteer-core__19.11.1_777974123__links//:defs.bzl", store_790 = "npm_imported_package_store")
+load("@@_main~npm~npm__puppeteer__19.11.1_777974123__links//:defs.bzl", link_791 = "npm_link_imported_package_store", store_791 = "npm_imported_package_store")
+load("@@_main~npm~npm__qs__6.5.3__links//:defs.bzl", store_792 = "npm_imported_package_store")
+load("@@_main~npm~npm__quickselect__2.0.0__links//:defs.bzl", store_793 = "npm_imported_package_store")
+load("@@_main~npm~npm__raf__3.4.1__links//:defs.bzl", store_794 = "npm_imported_package_store")
+load("@@_main~npm~npm__ramda__0.25.0__links//:defs.bzl", store_795 = "npm_imported_package_store")
+load("@@_main~npm~npm__randombytes__2.1.0__links//:defs.bzl", store_796 = "npm_imported_package_store")
+load("@@_main~npm~npm__rc__1.2.8__links//:defs.bzl", store_797 = "npm_imported_package_store")
+load("@@_main~npm~npm__react__17.0.2__links//:defs.bzl", link_798 = "npm_link_imported_package_store", store_798 = "npm_imported_package_store")
+load("@@_main~npm~npm__read-yaml-file__2.1.0__links//:defs.bzl", store_799 = "npm_imported_package_store")
+load("@@_main~npm~npm__readable-stream__1.0.34__links//:defs.bzl", store_800 = "npm_imported_package_store")
+load("@@_main~npm~npm__readable-stream__2.3.8__links//:defs.bzl", store_801 = "npm_imported_package_store")
+load("@@_main~npm~npm__readable-stream__3.6.1__links//:defs.bzl", store_802 = "npm_imported_package_store")
+load("@@_main~npm~npm__readdirp__3.6.0__links//:defs.bzl", store_803 = "npm_imported_package_store")
+load("@@_main~npm~npm__rechoir__0.8.0__links//:defs.bzl", store_804 = "npm_imported_package_store")
+load("@@_main~npm~npm__regenerator-runtime__0.13.11__links//:defs.bzl", store_805 = "npm_imported_package_store")
+load("@@_main~npm~npm__regl-error2d__2.0.12__links//:defs.bzl", store_806 = "npm_imported_package_store")
+load("@@_main~npm~npm__regl-line2d__3.1.2__links//:defs.bzl", store_807 = "npm_imported_package_store")
+load("@@_main~npm~npm__regl-scatter2d__3.3.1__links//:defs.bzl", store_808 = "npm_imported_package_store")
+load("@@_main~npm~npm__regl-splom__1.0.14__links//:defs.bzl", store_809 = "npm_imported_package_store")
+load("@@_main~npm~npm__regl__2.1.0__links//:defs.bzl", store_810 = "npm_imported_package_store")
+load("@@_main~npm~npm__request__2.88.2__links//:defs.bzl", store_811 = "npm_imported_package_store")
+load("@@_main~npm~npm__require-directory__2.1.1__links//:defs.bzl", store_812 = "npm_imported_package_store")
+load("@@_main~npm~npm__require-from-string__2.0.2__links//:defs.bzl", store_813 = "npm_imported_package_store")
+load("@@_main~npm~npm__require-like__0.1.2__links//:defs.bzl", store_814 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve-cwd__3.0.0__links//:defs.bzl", store_815 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve-from__4.0.0__links//:defs.bzl", store_816 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve-from__5.0.0__links//:defs.bzl", store_817 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve-protobuf-schema__2.1.0__links//:defs.bzl", store_818 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve__0.6.3__links//:defs.bzl", store_819 = "npm_imported_package_store")
+load("@@_main~npm~npm__resolve__1.22.1__links//:defs.bzl", store_820 = "npm_imported_package_store")
+load("@@_main~npm~npm__responselike__2.0.1__links//:defs.bzl", store_821 = "npm_imported_package_store")
+load("@@_main~npm~npm__retry__0.12.0__links//:defs.bzl", store_822 = "npm_imported_package_store")
+load("@@_main~npm~npm__rfc4648__1.5.2__links//:defs.bzl", store_823 = "npm_imported_package_store")
+load("@@_main~npm~npm__right-now__1.0.0__links//:defs.bzl", store_824 = "npm_imported_package_store")
+load("@@_main~npm~npm__rimraf__2.7.1__links//:defs.bzl", store_825 = "npm_imported_package_store")
+load("@@_main~npm~npm__rimraf__3.0.2__links//:defs.bzl", store_826 = "npm_imported_package_store")
+load("@@_main~npm~npm__rimraf__5.0.10__links//:defs.bzl", store_827 = "npm_imported_package_store")
+load("@@_main~npm~npm__rollup__2.70.2__links//:defs.bzl", link_828 = "npm_link_imported_package_store", store_828 = "npm_imported_package_store")
+load("@@_main~npm~npm__rollup__2.79.2__links//:defs.bzl", link_829 = "npm_link_imported_package_store", store_829 = "npm_imported_package_store")
+load("@@_main~npm~npm__rollup__3.29.5__links//:defs.bzl", link_830 = "npm_link_imported_package_store", store_830 = "npm_imported_package_store")
+load("@@_main~npm~npm__rw__1.3.3__links//:defs.bzl", store_831 = "npm_imported_package_store")
+load("@@_main~npm~npm__sade__1.8.1__links//:defs.bzl", store_832 = "npm_imported_package_store")
+load("@@_main~npm~npm__safe-buffer__5.1.2__links//:defs.bzl", store_833 = "npm_imported_package_store")
+load("@@_main~npm~npm__safe-buffer__5.2.1__links//:defs.bzl", store_834 = "npm_imported_package_store")
+load("@@_main~npm~npm__safer-buffer__2.1.2__links//:defs.bzl", store_835 = "npm_imported_package_store")
+load("@@_main~npm~npm__sax__1.2.4__links//:defs.bzl", store_836 = "npm_imported_package_store")
+load("@@_main~npm~npm__schema-utils__3.1.1__links//:defs.bzl", store_837 = "npm_imported_package_store")
+load("@@_main~npm~npm__schema-utils__4.0.0__links//:defs.bzl", store_838 = "npm_imported_package_store")
+load("@@_main~npm~npm__seedrandom__3.0.5__links//:defs.bzl", store_839 = "npm_imported_package_store")
+load("@@_main~npm~npm__segfault-handler__1.3.0__links//:defs.bzl", link_840 = "npm_link_imported_package_store", store_840 = "npm_imported_package_store")
+load("@@_main~npm~npm__semver-first-satisfied__1.1.0__links//:defs.bzl", link_841 = "npm_link_imported_package_store", store_841 = "npm_imported_package_store")
+load("@@_main~npm~npm__semver__5.7.1__links//:defs.bzl", store_842 = "npm_imported_package_store")
+load("@@_main~npm~npm__semver__6.3.0__links//:defs.bzl", store_843 = "npm_imported_package_store")
+load("@@_main~npm~npm__semver__7.3.8__links//:defs.bzl", store_844 = "npm_imported_package_store")
+load("@@_main~npm~npm__semver__7.5.0__links//:defs.bzl", store_845 = "npm_imported_package_store")
+load("@@_main~npm~npm__serialize-javascript__6.0.0__links//:defs.bzl", store_846 = "npm_imported_package_store")
+load("@@_main~npm~npm__serialize-javascript__6.0.1__links//:defs.bzl", store_847 = "npm_imported_package_store")
+load("@@_main~npm~npm__set-blocking__2.0.0__links//:defs.bzl", store_848 = "npm_imported_package_store")
+load("@@_main~npm~npm__setprototypeof__1.2.0__links//:defs.bzl", store_849 = "npm_imported_package_store")
+load("@@_main~npm~npm__shallow-clone__3.0.1__links//:defs.bzl", store_850 = "npm_imported_package_store")
+load("@@_main~npm~npm__shallow-copy__0.0.1__links//:defs.bzl", store_851 = "npm_imported_package_store")
+load("@@_main~npm~npm__shebang-command__2.0.0__links//:defs.bzl", store_852 = "npm_imported_package_store")
+load("@@_main~npm~npm__shebang-regex__3.0.0__links//:defs.bzl", store_853 = "npm_imported_package_store")
+load("@@_main~npm~npm__signal-exit__3.0.7__links//:defs.bzl", store_854 = "npm_imported_package_store")
+load("@@_main~npm~npm__signal-exit__4.1.0__links//:defs.bzl", store_855 = "npm_imported_package_store")
+load("@@_main~npm~npm__signum__1.0.0__links//:defs.bzl", store_856 = "npm_imported_package_store")
+load("@@_main~npm~npm__sirv__1.0.19__links//:defs.bzl", store_857 = "npm_imported_package_store")
+load("@@_main~npm~npm__smart-buffer__4.2.0__links//:defs.bzl", store_858 = "npm_imported_package_store")
+load("@@_main~npm~npm__smob__1.5.0__links//:defs.bzl", store_859 = "npm_imported_package_store")
+load("@@_main~npm~npm__socks-proxy-agent__7.0.0__links//:defs.bzl", store_860 = "npm_imported_package_store")
+load("@@_main~npm~npm__socks__2.7.1__links//:defs.bzl", store_861 = "npm_imported_package_store")
+load("@@_main~npm~npm__source-map-js__1.0.2__links//:defs.bzl", store_862 = "npm_imported_package_store")
+load("@@_main~npm~npm__source-map-support__0.5.21__links//:defs.bzl", link_863 = "npm_link_imported_package_store", store_863 = "npm_imported_package_store")
+load("@@_main~npm~npm__source-map__0.6.1__links//:defs.bzl", store_864 = "npm_imported_package_store")
+load("@@_main~npm~npm__sourcemap-codec__1.4.8__links//:defs.bzl", store_865 = "npm_imported_package_store")
+load("@@_main~npm~npm__sshpk__1.17.0__links//:defs.bzl", store_866 = "npm_imported_package_store")
+load("@@_main~npm~npm__ssri__9.0.1__links//:defs.bzl", store_867 = "npm_imported_package_store")
+load("@@_main~npm~npm__stack-trace__0.0.9__links//:defs.bzl", store_868 = "npm_imported_package_store")
+load("@@_main~npm~npm__static-eval__2.1.0__links//:defs.bzl", store_869 = "npm_imported_package_store")
+load("@@_main~npm~npm__statuses__2.0.1__links//:defs.bzl", store_870 = "npm_imported_package_store")
+load("@@_main~npm~npm__stream-buffers__3.0.2__links//:defs.bzl", store_871 = "npm_imported_package_store")
+load("@@_main~npm~npm__stream-parser__0.3.1__links//:defs.bzl", store_872 = "npm_imported_package_store")
+load("@@_main~npm~npm__stream-shift__1.0.1__links//:defs.bzl", store_873 = "npm_imported_package_store")
+load("@@_main~npm~npm__string-split-by__1.0.0__links//:defs.bzl", store_874 = "npm_imported_package_store")
+load("@@_main~npm~npm__string-width__1.0.2__links//:defs.bzl", store_875 = "npm_imported_package_store")
+load("@@_main~npm~npm__string-width__4.2.3__links//:defs.bzl", store_876 = "npm_imported_package_store")
+load("@@_main~npm~npm__string-width__5.1.2__links//:defs.bzl", store_877 = "npm_imported_package_store")
+load("@@_main~npm~npm__string_decoder__0.10.31__links//:defs.bzl", store_878 = "npm_imported_package_store")
+load("@@_main~npm~npm__string_decoder__1.1.1__links//:defs.bzl", store_879 = "npm_imported_package_store")
+load("@@_main~npm~npm__string_decoder__1.3.0__links//:defs.bzl", store_880 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-ansi__3.0.1__links//:defs.bzl", store_881 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-ansi__6.0.1__links//:defs.bzl", store_882 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-ansi__7.1.0__links//:defs.bzl", store_883 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-bom__4.0.0__links//:defs.bzl", store_884 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-json-comments__2.0.1__links//:defs.bzl", store_885 = "npm_imported_package_store")
+load("@@_main~npm~npm__strip-json-comments__3.1.1__links//:defs.bzl", store_886 = "npm_imported_package_store")
+load("@@_main~npm~npm__strongly-connected-components__1.0.1__links//:defs.bzl", store_887 = "npm_imported_package_store")
+load("@@_main~npm~npm__supercluster__7.1.5__links//:defs.bzl", store_888 = "npm_imported_package_store")
+load("@@_main~npm~npm__superscript-text__1.0.0__links//:defs.bzl", store_889 = "npm_imported_package_store")
+load("@@_main~npm~npm__supports-color__5.5.0__links//:defs.bzl", store_890 = "npm_imported_package_store")
+load("@@_main~npm~npm__supports-color__7.2.0__links//:defs.bzl", store_891 = "npm_imported_package_store")
+load("@@_main~npm~npm__supports-color__8.1.1__links//:defs.bzl", store_892 = "npm_imported_package_store")
+load("@@_main~npm~npm__supports-preserve-symlinks-flag__1.0.0__links//:defs.bzl", store_893 = "npm_imported_package_store")
+load("@@_main~npm~npm__svg-arc-to-cubic-bezier__3.2.0__links//:defs.bzl", store_894 = "npm_imported_package_store")
+load("@@_main~npm~npm__svg-path-bounds__1.0.2__links//:defs.bzl", store_895 = "npm_imported_package_store")
+load("@@_main~npm~npm__svg-path-sdf__1.1.3__links//:defs.bzl", store_896 = "npm_imported_package_store")
+load("@@_main~npm~npm__syncpack__github.com_JamieMason_syncpack_c245af8ea73ce3345d92bbda6c684092a841e262__links//:defs.bzl", link_897 = "npm_link_imported_package_store", store_897 = "npm_imported_package_store")
+load("@@_main~npm~npm__tapable__2.2.1__links//:defs.bzl", store_898 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar-fs__1.16.3__links//:defs.bzl", store_899 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar-fs__2.1.1__links//:defs.bzl", store_900 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar-stream__1.6.2__links//:defs.bzl", store_901 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar-stream__2.2.0__links//:defs.bzl", store_902 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar__4.4.19__links//:defs.bzl", store_903 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar__6.1.13__links//:defs.bzl", store_904 = "npm_imported_package_store")
+load("@@_main~npm~npm__tar__7.4.3__links//:defs.bzl", store_905 = "npm_imported_package_store")
+load("@@_main~npm~npm__terser-webpack-plugin__5.3.6_webpack_5.76.3__links//:defs.bzl", store_906 = "npm_imported_package_store")
+load("@@_main~npm~npm__terser__5.16.5__links//:defs.bzl", store_907 = "npm_imported_package_store")
+load("@@_main~npm~npm__terser__5.34.1__links//:defs.bzl", store_908 = "npm_imported_package_store")
+load("@@_main~npm~npm__test-exclude__6.0.0__links//:defs.bzl", store_909 = "npm_imported_package_store")
+load("@@_main~npm~npm__through2__0.6.5__links//:defs.bzl", store_910 = "npm_imported_package_store")
+load("@@_main~npm~npm__through2__2.0.5__links//:defs.bzl", store_911 = "npm_imported_package_store")
+load("@@_main~npm~npm__through__2.3.8__links//:defs.bzl", store_912 = "npm_imported_package_store")
+load("@@_main~npm~npm__tightrope__0.1.0__links//:defs.bzl", store_913 = "npm_imported_package_store")
+load("@@_main~npm~npm__tiny-emitter__2.1.0__links//:defs.bzl", store_914 = "npm_imported_package_store")
+load("@@_main~npm~npm__tinycolor2__1.6.0__links//:defs.bzl", store_915 = "npm_imported_package_store")
+load("@@_main~npm~npm__tinyqueue__2.0.3__links//:defs.bzl", store_916 = "npm_imported_package_store")
+load("@@_main~npm~npm__tmp__0.0.33__links//:defs.bzl", store_917 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-buffer__1.1.1__links//:defs.bzl", store_918 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-fast-properties__2.0.0__links//:defs.bzl", store_919 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-float32__1.1.0__links//:defs.bzl", store_920 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-px__1.0.1__links//:defs.bzl", store_921 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-readable-stream__2.1.0__links//:defs.bzl", store_922 = "npm_imported_package_store")
+load("@@_main~npm~npm__to-regex-range__5.0.1__links//:defs.bzl", store_923 = "npm_imported_package_store")
+load("@@_main~npm~npm__toidentifier__1.0.1__links//:defs.bzl", store_924 = "npm_imported_package_store")
+load("@@_main~npm~npm__topojson-client__3.1.0__links//:defs.bzl", store_925 = "npm_imported_package_store")
+load("@@_main~npm~npm__totalist__1.1.0__links//:defs.bzl", store_926 = "npm_imported_package_store")
+load("@@_main~npm~npm__tough-cookie__2.5.0__links//:defs.bzl", store_927 = "npm_imported_package_store")
+load("@@_main~npm~npm__tr46__0.0.3__links//:defs.bzl", store_928 = "npm_imported_package_store")
+load("@@_main~npm~npm__tslib__2.7.0__links//:defs.bzl", link_929 = "npm_link_imported_package_store", store_929 = "npm_imported_package_store")
+load("@@_main~npm~npm__tunnel-agent__0.6.0__links//:defs.bzl", store_930 = "npm_imported_package_store")
+load("@@_main~npm~npm__tweetnacl__0.14.5__links//:defs.bzl", store_931 = "npm_imported_package_store")
+load("@@_main~npm~npm__type-check__0.3.2__links//:defs.bzl", store_932 = "npm_imported_package_store")
+load("@@_main~npm~npm__type-fest__0.10.0__links//:defs.bzl", store_933 = "npm_imported_package_store")
+load("@@_main~npm~npm__type__1.2.0__links//:defs.bzl", store_934 = "npm_imported_package_store")
+load("@@_main~npm~npm__type__2.7.2__links//:defs.bzl", store_935 = "npm_imported_package_store")
+load("@@_main~npm~npm__typed-function__4.1.0__links//:defs.bzl", store_936 = "npm_imported_package_store")
+load("@@_main~npm~npm__typedarray-pool__1.2.0__links//:defs.bzl", store_937 = "npm_imported_package_store")
+load("@@_main~npm~npm__typedarray__0.0.6__links//:defs.bzl", store_938 = "npm_imported_package_store")
+load("@@_main~npm~npm__typeof-article__0.1.1__links//:defs.bzl", store_939 = "npm_imported_package_store")
+load("@@_main~npm~npm__typescript__4.9.5__links//:defs.bzl", link_940 = "npm_link_imported_package_store", store_940 = "npm_imported_package_store")
+load("@@_main~npm~npm__ufo__1.1.0__links//:defs.bzl", store_941 = "npm_imported_package_store")
+load("@@_main~npm~npm__unbzip2-stream__1.4.3__links//:defs.bzl", store_942 = "npm_imported_package_store")
+load("@@_main~npm~npm__undici-types__5.26.5__links//:defs.bzl", store_943 = "npm_imported_package_store")
+load("@@_main~npm~npm__undici-types__6.19.8__links//:defs.bzl", store_944 = "npm_imported_package_store")
+load("@@_main~npm~npm__unique-filename__2.0.1__links//:defs.bzl", store_945 = "npm_imported_package_store")
+load("@@_main~npm~npm__unique-slug__3.0.0__links//:defs.bzl", store_946 = "npm_imported_package_store")
+load("@@_main~npm~npm__universalify__0.1.2__links//:defs.bzl", store_947 = "npm_imported_package_store")
+load("@@_main~npm~npm__universalify__2.0.0__links//:defs.bzl", store_948 = "npm_imported_package_store")
+load("@@_main~npm~npm__unix-dgram__2.0.6__links//:defs.bzl", store_949 = "npm_imported_package_store")
+load("@@_main~npm~npm__unquote__1.1.1__links//:defs.bzl", store_950 = "npm_imported_package_store")
+load("@@_main~npm~npm__unused__0.2.2__links//:defs.bzl", link_951 = "npm_link_imported_package_store", store_951 = "npm_imported_package_store")
+load("@@_main~npm~npm__update-browserslist-db__1.0.10_browserslist_4.21.5__links//:defs.bzl", store_952 = "npm_imported_package_store")
+load("@@_main~npm~npm__update-diff__1.1.0__links//:defs.bzl", store_953 = "npm_imported_package_store")
+load("@@_main~npm~npm__uri-js__4.4.1__links//:defs.bzl", store_954 = "npm_imported_package_store")
+load("@@_main~npm~npm__util-deprecate__1.0.2__links//:defs.bzl", store_955 = "npm_imported_package_store")
+load("@@_main~npm~npm__uuid__3.4.0__links//:defs.bzl", store_956 = "npm_imported_package_store")
+load("@@_main~npm~npm__uuid__8.3.2__links//:defs.bzl", link_957 = "npm_link_imported_package_store", store_957 = "npm_imported_package_store")
+load("@@_main~npm~npm__uvu__0.5.3__links//:defs.bzl", link_958 = "npm_link_imported_package_store", store_958 = "npm_imported_package_store")
+load("@@_main~npm~npm__v8-to-istanbul__9.1.0__links//:defs.bzl", store_959 = "npm_imported_package_store")
+load("@@_main~npm~npm__verror__1.10.0__links//:defs.bzl", store_960 = "npm_imported_package_store")
+load("@@_main~npm~npm__vt-pbf__3.1.3__links//:defs.bzl", store_961 = "npm_imported_package_store")
+load("@@_main~npm~npm__watchpack__2.4.0__links//:defs.bzl", store_962 = "npm_imported_package_store")
+load("@@_main~npm~npm__weak-map__1.0.8__links//:defs.bzl", store_963 = "npm_imported_package_store")
+load("@@_main~npm~npm__webgl-context__2.2.0__links//:defs.bzl", store_964 = "npm_imported_package_store")
+load("@@_main~npm~npm__webidl-conversions__3.0.1__links//:defs.bzl", store_965 = "npm_imported_package_store")
+load("@@_main~npm~npm__webpack-bundle-analyzer__4.5.0_bufferutil_4.0.8__links//:defs.bzl", link_966 = "npm_link_imported_package_store", store_966 = "npm_imported_package_store")
+load("@@_main~npm~npm__webpack-cli__5.0.1_webpack_5.76.3__links//:defs.bzl", link_967 = "npm_link_imported_package_store", store_967 = "npm_imported_package_store")
+load("@@_main~npm~npm__webpack-merge__5.8.0__links//:defs.bzl", store_968 = "npm_imported_package_store")
+load("@@_main~npm~npm__webpack-sources__3.2.3__links//:defs.bzl", store_969 = "npm_imported_package_store")
+load("@@_main~npm~npm__webpack__5.76.3_webpack-cli_5.0.1__links//:defs.bzl", link_970 = "npm_link_imported_package_store", store_970 = "npm_imported_package_store")
+load("@@_main~npm~npm__whatwg-url__5.0.0__links//:defs.bzl", store_971 = "npm_imported_package_store")
+load("@@_main~npm~npm__which__2.0.2__links//:defs.bzl", store_972 = "npm_imported_package_store")
+load("@@_main~npm~npm__wide-align__1.1.5__links//:defs.bzl", store_973 = "npm_imported_package_store")
+load("@@_main~npm~npm__wildcard__2.0.0__links//:defs.bzl", store_974 = "npm_imported_package_store")
+load("@@_main~npm~npm__word-wrap__1.2.3__links//:defs.bzl", store_975 = "npm_imported_package_store")
+load("@@_main~npm~npm__wordwrap__0.0.3__links//:defs.bzl", store_976 = "npm_imported_package_store")
+load("@@_main~npm~npm__workerpool__6.2.1__links//:defs.bzl", store_977 = "npm_imported_package_store")
+load("@@_main~npm~npm__world-calendars__1.0.3__links//:defs.bzl", store_978 = "npm_imported_package_store")
+load("@@_main~npm~npm__wrap-ansi__7.0.0__links//:defs.bzl", store_979 = "npm_imported_package_store")
+load("@@_main~npm~npm__wrap-ansi__8.1.0__links//:defs.bzl", store_980 = "npm_imported_package_store")
+load("@@_main~npm~npm__wrappy__1.0.2__links//:defs.bzl", store_981 = "npm_imported_package_store")
+load("@@_main~npm~npm__ws__7.5.9_bufferutil_4.0.8__links//:defs.bzl", store_982 = "npm_imported_package_store")
+load("@@_main~npm~npm__ws__8.13.0_bufferutil_4.0.8__links//:defs.bzl", store_983 = "npm_imported_package_store")
+load("@@_main~npm~npm__ws__8.18.0_bufferutil_4.0.8__links//:defs.bzl", store_984 = "npm_imported_package_store")
+load("@@_main~npm~npm__xml__1.0.1__links//:defs.bzl", store_985 = "npm_imported_package_store")
+load("@@_main~npm~npm__xtend__2.2.0__links//:defs.bzl", store_986 = "npm_imported_package_store")
+load("@@_main~npm~npm__xtend__4.0.2__links//:defs.bzl", store_987 = "npm_imported_package_store")
+load("@@_main~npm~npm__y18n__5.0.8__links//:defs.bzl", store_988 = "npm_imported_package_store")
+load("@@_main~npm~npm__yallist__3.1.1__links//:defs.bzl", store_989 = "npm_imported_package_store")
+load("@@_main~npm~npm__yallist__4.0.0__links//:defs.bzl", store_990 = "npm_imported_package_store")
+load("@@_main~npm~npm__yallist__5.0.0__links//:defs.bzl", store_991 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs-parser__20.2.4__links//:defs.bzl", store_992 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs-parser__20.2.9__links//:defs.bzl", store_993 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs-parser__21.1.1__links//:defs.bzl", store_994 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs-unparser__2.0.0__links//:defs.bzl", store_995 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs__16.2.0__links//:defs.bzl", store_996 = "npm_imported_package_store")
+load("@@_main~npm~npm__yargs__17.7.1__links//:defs.bzl", store_997 = "npm_imported_package_store")
+load("@@_main~npm~npm__yauzl__2.10.0__links//:defs.bzl", store_998 = "npm_imported_package_store")
+load("@@_main~npm~npm__yocto-queue__0.1.0__links//:defs.bzl", store_999 = "npm_imported_package_store")
+load("@@_main~npm~npm__zod__3.21.4__links//:defs.bzl", store_1000 = "npm_imported_package_store")
# buildifier: disable=bzl-visibility
load("@aspect_rules_js//js:defs.bzl", _js_library = "js_library")
@@ -1026,7 +1011,7 @@ load("@aspect_rules_js//npm/private:npm_link_package_store.bzl", _npm_link_packa
# buildifier: disable=bzl-visibility
load("@aspect_rules_js//npm/private:npm_package_store.bzl", _npm_package_store = "npm_package_store")
-_LINK_PACKAGES = ["", "examples/js_binary", "examples/js_lib_pkg/a", "examples/js_lib_pkg/b", "examples/linked_consumer", "examples/linked_empty_node_modules", "examples/linked_lib", "examples/linked_pkg", "examples/macro", "examples/npm_deps", "examples/npm_package/libs/lib_a", "examples/npm_package/packages/pkg_a", "examples/npm_package/packages/pkg_b", "examples/npm_package/packages/pkg_d", "examples/npm_package/packages/pkg_e", "examples/runfiles", "examples/stack_traces", "examples/webpack_cli", "js/private/coverage/bundle", "js/private/image", "js/private/test/image", "js/private/test/js_run_devserver", "js/private/worker/src", "npm/private/test", "npm/private/test/npm_package", "npm/private/test/npm_package_publish"]
+_LINK_PACKAGES = ["", "examples/js_binary", "examples/js_lib_pkg/a", "examples/js_lib_pkg/b", "examples/linked_consumer", "examples/linked_empty_node_modules", "examples/linked_lib", "examples/linked_pkg", "examples/macro", "examples/npm_deps", "examples/npm_package/libs/lib_a", "examples/npm_package/packages/pkg_a", "examples/npm_package/packages/pkg_b", "examples/npm_package/packages/pkg_d", "examples/npm_package/packages/pkg_e", "examples/runfiles", "examples/stack_traces", "examples/webpack_cli", "js/private/coverage/bundle", "js/private/test/image", "js/private/test/js_run_devserver", "js/private/worker/src", "npm/private/test", "npm/private/test/npm_package", "npm/private/test/npm_package_publish"]
# buildifier: disable=function-docstring
def npm_link_all_packages(name = "node_modules", imported_links = []):
@@ -1050,1397 +1035,1337 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
if is_root:
store_0(name = "{}/abbrev".format(name))
- store_1(name = "{}/abort-controller".format(name))
- store_2(name = "{}/abortcontroller-polyfill".format(name))
- store_3(name = "{}/abs-svg-path".format(name))
- store_4(name = "{}/acorn-import-assertions".format(name))
- store_5(name = "{}/acorn-walk".format(name))
+ store_1(name = "{}/abortcontroller-polyfill".format(name))
+ store_2(name = "{}/abs-svg-path".format(name))
+ store_3(name = "{}/acorn-import-assertions".format(name))
+ store_4(name = "{}/acorn-walk".format(name))
+ store_5(name = "{}/acorn".format(name))
store_6(name = "{}/acorn".format(name))
store_7(name = "{}/acorn".format(name))
store_8(name = "{}/acorn".format(name))
- store_9(name = "{}/acorn".format(name))
- store_10(name = "{}/agent-base".format(name))
- store_11(name = "{}/agentkeepalive".format(name))
- store_12(name = "{}/aggregate-error".format(name))
- store_13(name = "{}/ahocorasick".format(name))
- store_14(name = "{}/ajv-formats".format(name))
+ store_9(name = "{}/agent-base".format(name))
+ store_10(name = "{}/agentkeepalive".format(name))
+ store_11(name = "{}/aggregate-error".format(name))
+ store_12(name = "{}/ahocorasick".format(name))
+ store_13(name = "{}/ajv-formats".format(name))
+ store_14(name = "{}/ajv-keywords".format(name))
store_15(name = "{}/ajv-keywords".format(name))
- store_16(name = "{}/ajv-keywords".format(name))
+ store_16(name = "{}/ajv".format(name))
store_17(name = "{}/ajv".format(name))
- store_18(name = "{}/ajv".format(name))
- store_19(name = "{}/almost-equal".format(name))
- store_20(name = "{}/ansi-colors".format(name))
+ store_18(name = "{}/almost-equal".format(name))
+ store_19(name = "{}/ansi-colors".format(name))
+ store_20(name = "{}/ansi-regex".format(name))
store_21(name = "{}/ansi-regex".format(name))
store_22(name = "{}/ansi-regex".format(name))
- store_23(name = "{}/ansi-regex".format(name))
+ store_23(name = "{}/ansi-styles".format(name))
store_24(name = "{}/ansi-styles".format(name))
store_25(name = "{}/ansi-styles".format(name))
- store_26(name = "{}/ansi-styles".format(name))
- store_27(name = "{}/anymatch".format(name))
+ store_26(name = "{}/anymatch".format(name))
+ store_27(name = "{}/aproba".format(name))
store_28(name = "{}/aproba".format(name))
- store_29(name = "{}/aproba".format(name))
+ store_29(name = "{}/are-we-there-yet".format(name))
store_30(name = "{}/are-we-there-yet".format(name))
store_31(name = "{}/are-we-there-yet".format(name))
- store_32(name = "{}/are-we-there-yet".format(name))
- store_33(name = "{}/argparse".format(name))
- store_34(name = "{}/array-bounds".format(name))
- store_35(name = "{}/array-find-index".format(name))
- store_36(name = "{}/array-normalize".format(name))
- store_37(name = "{}/array-range".format(name))
- store_38(name = "{}/array-rearrange".format(name))
- store_39(name = "{}/asn1".format(name))
- store_40(name = "{}/assert-plus".format(name))
- store_41(name = "{}/asynckit".format(name))
- store_42(name = "{}/@ampproject/remapping".format(name))
- store_43(name = "{}/@aspect-test/a".format(name))
- store_44(name = "{}/@aspect-test/b".format(name))
- store_45(name = "{}/@aspect-test/c".format(name))
- store_46(name = "{}/@aspect-test/d".format(name))
- store_47(name = "{}/@aspect-test/e".format(name))
- store_48(name = "{}/@aspect-test/f".format(name))
- store_49(name = "{}/@babel/code-frame".format(name))
- store_50(name = "{}/@babel/compat-data".format(name))
- store_51(name = "{}/@babel/core".format(name))
- store_52(name = "{}/@babel/generator".format(name))
- store_53(name = "{}/@babel/helper-compilation-targets".format(name))
- store_54(name = "{}/@babel/helper-environment-visitor".format(name))
- store_55(name = "{}/@babel/helper-function-name".format(name))
- store_56(name = "{}/@babel/helper-hoist-variables".format(name))
- store_57(name = "{}/@babel/helper-module-imports".format(name))
- store_58(name = "{}/@babel/helper-module-transforms".format(name))
- store_59(name = "{}/@babel/helper-plugin-utils".format(name))
- store_60(name = "{}/@babel/helper-simple-access".format(name))
- store_61(name = "{}/@babel/helper-split-export-declaration".format(name))
- store_62(name = "{}/@babel/helper-string-parser".format(name))
- store_63(name = "{}/@babel/helper-validator-identifier".format(name))
- store_64(name = "{}/@babel/helper-validator-option".format(name))
- store_65(name = "{}/@babel/helpers".format(name))
- store_66(name = "{}/@babel/highlight".format(name))
- store_67(name = "{}/@babel/parser".format(name))
- store_68(name = "{}/@babel/plugin-syntax-typescript".format(name))
- store_69(name = "{}/@babel/runtime".format(name))
- store_70(name = "{}/@babel/template".format(name))
- store_71(name = "{}/@babel/traverse".format(name))
- store_72(name = "{}/@babel/types".format(name))
- store_73(name = "{}/@bazel/runfiles".format(name))
- store_74(name = "{}/@bcoe/v8-coverage".format(name))
- store_75(name = "{}/@choojs/findup".format(name))
- store_76(name = "{}/@discoveryjs/json-ext".format(name))
- store_77(name = "{}/@emotion/hash".format(name))
- store_78(name = "{}/@esbuild/aix-ppc64".format(name))
+ store_32(name = "{}/argparse".format(name))
+ store_33(name = "{}/array-bounds".format(name))
+ store_34(name = "{}/array-find-index".format(name))
+ store_35(name = "{}/array-normalize".format(name))
+ store_36(name = "{}/array-range".format(name))
+ store_37(name = "{}/array-rearrange".format(name))
+ store_38(name = "{}/asn1".format(name))
+ store_39(name = "{}/assert-plus".format(name))
+ store_40(name = "{}/asynckit".format(name))
+ store_41(name = "{}/@ampproject/remapping".format(name))
+ store_42(name = "{}/@aspect-test/a".format(name))
+ store_43(name = "{}/@aspect-test/b".format(name))
+ store_44(name = "{}/@aspect-test/c".format(name))
+ store_45(name = "{}/@aspect-test/d".format(name))
+ store_46(name = "{}/@aspect-test/e".format(name))
+ store_47(name = "{}/@aspect-test/f".format(name))
+ store_48(name = "{}/@babel/code-frame".format(name))
+ store_49(name = "{}/@babel/compat-data".format(name))
+ store_50(name = "{}/@babel/core".format(name))
+ store_51(name = "{}/@babel/generator".format(name))
+ store_52(name = "{}/@babel/helper-compilation-targets".format(name))
+ store_53(name = "{}/@babel/helper-environment-visitor".format(name))
+ store_54(name = "{}/@babel/helper-function-name".format(name))
+ store_55(name = "{}/@babel/helper-hoist-variables".format(name))
+ store_56(name = "{}/@babel/helper-module-imports".format(name))
+ store_57(name = "{}/@babel/helper-module-transforms".format(name))
+ store_58(name = "{}/@babel/helper-plugin-utils".format(name))
+ store_59(name = "{}/@babel/helper-simple-access".format(name))
+ store_60(name = "{}/@babel/helper-split-export-declaration".format(name))
+ store_61(name = "{}/@babel/helper-string-parser".format(name))
+ store_62(name = "{}/@babel/helper-validator-identifier".format(name))
+ store_63(name = "{}/@babel/helper-validator-option".format(name))
+ store_64(name = "{}/@babel/helpers".format(name))
+ store_65(name = "{}/@babel/highlight".format(name))
+ store_66(name = "{}/@babel/parser".format(name))
+ store_67(name = "{}/@babel/plugin-syntax-typescript".format(name))
+ store_68(name = "{}/@babel/runtime".format(name))
+ store_69(name = "{}/@babel/template".format(name))
+ store_70(name = "{}/@babel/traverse".format(name))
+ store_71(name = "{}/@babel/types".format(name))
+ store_72(name = "{}/@bazel/runfiles".format(name))
+ store_73(name = "{}/@bcoe/v8-coverage".format(name))
+ store_74(name = "{}/@choojs/findup".format(name))
+ store_75(name = "{}/@discoveryjs/json-ext".format(name))
+ store_76(name = "{}/@emotion/hash".format(name))
+ store_77(name = "{}/@esbuild/aix-ppc64".format(name))
+ store_78(name = "{}/@esbuild/android-arm64".format(name))
store_79(name = "{}/@esbuild/android-arm64".format(name))
- store_80(name = "{}/@esbuild/android-arm64".format(name))
+ store_80(name = "{}/@esbuild/android-arm".format(name))
store_81(name = "{}/@esbuild/android-arm".format(name))
- store_82(name = "{}/@esbuild/android-arm".format(name))
+ store_82(name = "{}/@esbuild/android-x64".format(name))
store_83(name = "{}/@esbuild/android-x64".format(name))
- store_84(name = "{}/@esbuild/android-x64".format(name))
+ store_84(name = "{}/@esbuild/darwin-arm64".format(name))
store_85(name = "{}/@esbuild/darwin-arm64".format(name))
- store_86(name = "{}/@esbuild/darwin-arm64".format(name))
+ store_86(name = "{}/@esbuild/darwin-x64".format(name))
store_87(name = "{}/@esbuild/darwin-x64".format(name))
- store_88(name = "{}/@esbuild/darwin-x64".format(name))
+ store_88(name = "{}/@esbuild/freebsd-arm64".format(name))
store_89(name = "{}/@esbuild/freebsd-arm64".format(name))
- store_90(name = "{}/@esbuild/freebsd-arm64".format(name))
+ store_90(name = "{}/@esbuild/freebsd-x64".format(name))
store_91(name = "{}/@esbuild/freebsd-x64".format(name))
- store_92(name = "{}/@esbuild/freebsd-x64".format(name))
+ store_92(name = "{}/@esbuild/linux-arm64".format(name))
store_93(name = "{}/@esbuild/linux-arm64".format(name))
- store_94(name = "{}/@esbuild/linux-arm64".format(name))
+ store_94(name = "{}/@esbuild/linux-arm".format(name))
store_95(name = "{}/@esbuild/linux-arm".format(name))
- store_96(name = "{}/@esbuild/linux-arm".format(name))
+ store_96(name = "{}/@esbuild/linux-ia32".format(name))
store_97(name = "{}/@esbuild/linux-ia32".format(name))
- store_98(name = "{}/@esbuild/linux-ia32".format(name))
+ store_98(name = "{}/@esbuild/linux-loong64".format(name))
store_99(name = "{}/@esbuild/linux-loong64".format(name))
- store_100(name = "{}/@esbuild/linux-loong64".format(name))
+ store_100(name = "{}/@esbuild/linux-mips64el".format(name))
store_101(name = "{}/@esbuild/linux-mips64el".format(name))
- store_102(name = "{}/@esbuild/linux-mips64el".format(name))
+ store_102(name = "{}/@esbuild/linux-ppc64".format(name))
store_103(name = "{}/@esbuild/linux-ppc64".format(name))
- store_104(name = "{}/@esbuild/linux-ppc64".format(name))
+ store_104(name = "{}/@esbuild/linux-riscv64".format(name))
store_105(name = "{}/@esbuild/linux-riscv64".format(name))
- store_106(name = "{}/@esbuild/linux-riscv64".format(name))
+ store_106(name = "{}/@esbuild/linux-s390x".format(name))
store_107(name = "{}/@esbuild/linux-s390x".format(name))
- store_108(name = "{}/@esbuild/linux-s390x".format(name))
+ store_108(name = "{}/@esbuild/linux-x64".format(name))
store_109(name = "{}/@esbuild/linux-x64".format(name))
- store_110(name = "{}/@esbuild/linux-x64".format(name))
+ store_110(name = "{}/@esbuild/netbsd-x64".format(name))
store_111(name = "{}/@esbuild/netbsd-x64".format(name))
- store_112(name = "{}/@esbuild/netbsd-x64".format(name))
- store_113(name = "{}/@esbuild/openbsd-arm64".format(name))
+ store_112(name = "{}/@esbuild/openbsd-arm64".format(name))
+ store_113(name = "{}/@esbuild/openbsd-x64".format(name))
store_114(name = "{}/@esbuild/openbsd-x64".format(name))
- store_115(name = "{}/@esbuild/openbsd-x64".format(name))
+ store_115(name = "{}/@esbuild/sunos-x64".format(name))
store_116(name = "{}/@esbuild/sunos-x64".format(name))
- store_117(name = "{}/@esbuild/sunos-x64".format(name))
+ store_117(name = "{}/@esbuild/win32-arm64".format(name))
store_118(name = "{}/@esbuild/win32-arm64".format(name))
- store_119(name = "{}/@esbuild/win32-arm64".format(name))
+ store_119(name = "{}/@esbuild/win32-ia32".format(name))
store_120(name = "{}/@esbuild/win32-ia32".format(name))
- store_121(name = "{}/@esbuild/win32-ia32".format(name))
+ store_121(name = "{}/@esbuild/win32-x64".format(name))
store_122(name = "{}/@esbuild/win32-x64".format(name))
- store_123(name = "{}/@esbuild/win32-x64".format(name))
- store_124(name = "{}/@fastify/send".format(name))
- store_125(name = "{}/@figma/nodegit".format(name))
- store_126(name = "{}/@foo/jsonify".format(name))
- store_127(name = "{}/@gar/promisify".format(name))
- store_128(name = "{}/@gregmagolan/test-a".format(name))
- store_129(name = "{}/@gregmagolan/test-b".format(name))
- store_130(name = "{}/@isaacs/cliui".format(name))
- store_131(name = "{}/@isaacs/fs-minipass".format(name))
- store_132(name = "{}/@istanbuljs/schema".format(name))
+ store_123(name = "{}/@fastify/send".format(name))
+ store_124(name = "{}/@figma/nodegit".format(name))
+ store_125(name = "{}/@foo/jsonify".format(name))
+ store_126(name = "{}/@gar/promisify".format(name))
+ store_127(name = "{}/@gregmagolan/test-a".format(name))
+ store_128(name = "{}/@gregmagolan/test-b".format(name))
+ store_129(name = "{}/@isaacs/cliui".format(name))
+ store_130(name = "{}/@isaacs/fs-minipass".format(name))
+ store_131(name = "{}/@istanbuljs/schema".format(name))
+ store_132(name = "{}/@jridgewell/gen-mapping".format(name))
store_133(name = "{}/@jridgewell/gen-mapping".format(name))
store_134(name = "{}/@jridgewell/gen-mapping".format(name))
- store_135(name = "{}/@jridgewell/gen-mapping".format(name))
- store_136(name = "{}/@jridgewell/resolve-uri".format(name))
+ store_135(name = "{}/@jridgewell/resolve-uri".format(name))
+ store_136(name = "{}/@jridgewell/set-array".format(name))
store_137(name = "{}/@jridgewell/set-array".format(name))
- store_138(name = "{}/@jridgewell/set-array".format(name))
+ store_138(name = "{}/@jridgewell/source-map".format(name))
store_139(name = "{}/@jridgewell/source-map".format(name))
- store_140(name = "{}/@jridgewell/source-map".format(name))
- store_141(name = "{}/@jridgewell/sourcemap-codec".format(name))
+ store_140(name = "{}/@jridgewell/sourcemap-codec".format(name))
+ store_141(name = "{}/@jridgewell/trace-mapping".format(name))
store_142(name = "{}/@jridgewell/trace-mapping".format(name))
- store_143(name = "{}/@jridgewell/trace-mapping".format(name))
- store_144(name = "{}/@jsep-plugin/assignment".format(name))
- store_145(name = "{}/@jsep-plugin/regex".format(name))
- store_146(name = "{}/@kubernetes/client-node".format(name))
- store_147(name = "{}/@lukeed/ms".format(name))
- store_148(name = "{}/@mapbox/geojson-rewind".format(name))
- store_149(name = "{}/@mapbox/geojson-types".format(name))
- store_150(name = "{}/@mapbox/jsonlint-lines-primitives".format(name))
- store_151(name = "{}/@mapbox/mapbox-gl-supported".format(name))
- store_152(name = "{}/@mapbox/node-pre-gyp".format(name))
- store_153(name = "{}/@mapbox/point-geometry".format(name))
- store_154(name = "{}/@mapbox/tiny-sdf".format(name))
- store_155(name = "{}/@mapbox/unitbezier".format(name))
- store_156(name = "{}/@mapbox/vector-tile".format(name))
- store_157(name = "{}/@mapbox/whoots-js".format(name))
- store_158(name = "{}/@npmcli/fs".format(name))
- store_159(name = "{}/@npmcli/move-file".format(name))
- store_160(name = "{}/@pkgjs/parseargs".format(name))
- store_161(name = "{}/@plotly/d3-sankey-circular".format(name))
- store_162(name = "{}/@plotly/d3-sankey".format(name))
- store_163(name = "{}/@plotly/d3".format(name))
- store_164(name = "{}/@plotly/point-cluster".format(name))
- store_165(name = "{}/@plotly/regl".format(name))
- store_166(name = "{}/@polka/url".format(name))
- store_167(name = "{}/@puppeteer/browsers".format(name))
+ store_143(name = "{}/@jsep-plugin/assignment".format(name))
+ store_144(name = "{}/@jsep-plugin/regex".format(name))
+ store_145(name = "{}/@kubernetes/client-node".format(name))
+ store_146(name = "{}/@lukeed/ms".format(name))
+ store_147(name = "{}/@mapbox/geojson-rewind".format(name))
+ store_148(name = "{}/@mapbox/geojson-types".format(name))
+ store_149(name = "{}/@mapbox/jsonlint-lines-primitives".format(name))
+ store_150(name = "{}/@mapbox/mapbox-gl-supported".format(name))
+ store_151(name = "{}/@mapbox/node-pre-gyp".format(name))
+ store_152(name = "{}/@mapbox/point-geometry".format(name))
+ store_153(name = "{}/@mapbox/tiny-sdf".format(name))
+ store_154(name = "{}/@mapbox/unitbezier".format(name))
+ store_155(name = "{}/@mapbox/vector-tile".format(name))
+ store_156(name = "{}/@mapbox/whoots-js".format(name))
+ store_157(name = "{}/@npmcli/fs".format(name))
+ store_158(name = "{}/@npmcli/move-file".format(name))
+ store_159(name = "{}/@pkgjs/parseargs".format(name))
+ store_160(name = "{}/@plotly/d3-sankey-circular".format(name))
+ store_161(name = "{}/@plotly/d3-sankey".format(name))
+ store_162(name = "{}/@plotly/d3".format(name))
+ store_163(name = "{}/@plotly/point-cluster".format(name))
+ store_164(name = "{}/@plotly/regl".format(name))
+ store_165(name = "{}/@polka/url".format(name))
+ store_166(name = "{}/@puppeteer/browsers".format(name))
+ store_167(name = "{}/@rollup/plugin-commonjs".format(name))
store_168(name = "{}/@rollup/plugin-commonjs".format(name))
store_169(name = "{}/@rollup/plugin-commonjs".format(name))
- store_170(name = "{}/@rollup/plugin-commonjs".format(name))
+ store_170(name = "{}/@rollup/plugin-json".format(name))
store_171(name = "{}/@rollup/plugin-json".format(name))
- store_172(name = "{}/@rollup/plugin-json".format(name))
+ store_172(name = "{}/@rollup/plugin-node-resolve".format(name))
store_173(name = "{}/@rollup/plugin-node-resolve".format(name))
- store_174(name = "{}/@rollup/plugin-node-resolve".format(name))
- store_175(name = "{}/@rollup/plugin-terser".format(name))
- store_176(name = "{}/@rollup/plugin-typescript".format(name))
+ store_174(name = "{}/@rollup/plugin-terser".format(name))
+ store_175(name = "{}/@rollup/plugin-typescript".format(name))
+ store_176(name = "{}/@rollup/pluginutils".format(name))
store_177(name = "{}/@rollup/pluginutils".format(name))
store_178(name = "{}/@rollup/pluginutils".format(name))
- store_179(name = "{}/@rollup/pluginutils".format(name))
- store_180(name = "{}/@sindresorhus/is".format(name))
- store_181(name = "{}/@szmarczak/http-timer".format(name))
- store_182(name = "{}/@tootallnate/once".format(name))
- store_183(name = "{}/@turf/area".format(name))
- store_184(name = "{}/@turf/bbox".format(name))
- store_185(name = "{}/@turf/centroid".format(name))
- store_186(name = "{}/@turf/helpers".format(name))
- store_187(name = "{}/@turf/meta".format(name))
- store_188(name = "{}/@types/archiver".format(name))
- store_189(name = "{}/@types/cacheable-request".format(name))
- store_190(name = "{}/@types/caseless".format(name))
- store_191(name = "{}/@types/eslint-scope".format(name))
- store_192(name = "{}/@types/eslint".format(name))
+ store_179(name = "{}/@sindresorhus/is".format(name))
+ store_180(name = "{}/@szmarczak/http-timer".format(name))
+ store_181(name = "{}/@tootallnate/once".format(name))
+ store_182(name = "{}/@turf/area".format(name))
+ store_183(name = "{}/@turf/bbox".format(name))
+ store_184(name = "{}/@turf/centroid".format(name))
+ store_185(name = "{}/@turf/helpers".format(name))
+ store_186(name = "{}/@turf/meta".format(name))
+ store_187(name = "{}/@types/cacheable-request".format(name))
+ store_188(name = "{}/@types/caseless".format(name))
+ store_189(name = "{}/@types/eslint-scope".format(name))
+ store_190(name = "{}/@types/eslint".format(name))
+ store_191(name = "{}/@types/estree".format(name))
+ store_192(name = "{}/@types/estree".format(name))
store_193(name = "{}/@types/estree".format(name))
- store_194(name = "{}/@types/estree".format(name))
- store_195(name = "{}/@types/estree".format(name))
- store_196(name = "{}/@types/google-protobuf".format(name))
- store_197(name = "{}/@types/http-cache-semantics".format(name))
- store_198(name = "{}/@types/istanbul-lib-coverage".format(name))
- store_199(name = "{}/@types/js-yaml".format(name))
- store_200(name = "{}/@types/json-schema".format(name))
- store_201(name = "{}/@types/keyv".format(name))
+ store_194(name = "{}/@types/google-protobuf".format(name))
+ store_195(name = "{}/@types/http-cache-semantics".format(name))
+ store_196(name = "{}/@types/istanbul-lib-coverage".format(name))
+ store_197(name = "{}/@types/js-yaml".format(name))
+ store_198(name = "{}/@types/json-schema".format(name))
+ store_199(name = "{}/@types/keyv".format(name))
+ store_200(name = "{}/@types/node".format(name))
+ store_201(name = "{}/@types/node".format(name))
store_202(name = "{}/@types/node".format(name))
store_203(name = "{}/@types/node".format(name))
- store_204(name = "{}/@types/node".format(name))
- store_205(name = "{}/@types/node".format(name))
- store_206(name = "{}/@types/readdir-glob".format(name))
- store_207(name = "{}/@types/request".format(name))
- store_208(name = "{}/@types/resolve".format(name))
- store_209(name = "{}/@types/responselike".format(name))
- store_210(name = "{}/@types/tar-stream".format(name))
- store_211(name = "{}/@types/tough-cookie".format(name))
- store_212(name = "{}/@types/underscore".format(name))
- store_213(name = "{}/@types/ws".format(name))
- store_214(name = "{}/@types/yauzl".format(name))
- store_215(name = "{}/@vanilla-extract/babel-plugin-debug-ids".format(name))
- store_216(name = "{}/@vanilla-extract/css".format(name))
- store_217(name = "{}/@vanilla-extract/css".format(name))
- store_218(name = "{}/@vanilla-extract/integration".format(name))
- store_219(name = "{}/@vanilla-extract/private".format(name))
- store_220(name = "{}/@vanilla-extract/webpack-plugin".format(name))
- store_221(name = "{}/@webassemblyjs/ast".format(name))
- store_222(name = "{}/@webassemblyjs/floating-point-hex-parser".format(name))
- store_223(name = "{}/@webassemblyjs/helper-api-error".format(name))
- store_224(name = "{}/@webassemblyjs/helper-buffer".format(name))
- store_225(name = "{}/@webassemblyjs/helper-numbers".format(name))
- store_226(name = "{}/@webassemblyjs/helper-wasm-bytecode".format(name))
- store_227(name = "{}/@webassemblyjs/helper-wasm-section".format(name))
- store_228(name = "{}/@webassemblyjs/ieee754".format(name))
- store_229(name = "{}/@webassemblyjs/leb128".format(name))
- store_230(name = "{}/@webassemblyjs/utf8".format(name))
- store_231(name = "{}/@webassemblyjs/wasm-edit".format(name))
- store_232(name = "{}/@webassemblyjs/wasm-gen".format(name))
- store_233(name = "{}/@webassemblyjs/wasm-opt".format(name))
- store_234(name = "{}/@webassemblyjs/wasm-parser".format(name))
- store_235(name = "{}/@webassemblyjs/wast-printer".format(name))
- store_236(name = "{}/@webpack-cli/configtest".format(name))
- store_237(name = "{}/@webpack-cli/info".format(name))
- store_238(name = "{}/@webpack-cli/serve".format(name))
- store_239(name = "{}/@xtuc/ieee754".format(name))
- store_240(name = "{}/@xtuc/long".format(name))
- store_241(name = "{}/aws-sign2".format(name))
- store_242(name = "{}/aws4".format(name))
- store_243(name = "{}/b4a".format(name))
- store_244(name = "{}/balanced-match".format(name))
- store_245(name = "{}/base64-js".format(name))
- store_246(name = "{}/bcrypt-pbkdf".format(name))
- store_247(name = "{}/big.js".format(name))
- store_248(name = "{}/binary-extensions".format(name))
- store_249(name = "{}/binary-search-bounds".format(name))
- store_250(name = "{}/bindings".format(name))
- store_251(name = "{}/bit-twiddle".format(name))
- store_252(name = "{}/bitmap-sdf".format(name))
- store_253(name = "{}/bl".format(name))
- store_254(name = "{}/bl".format(name))
- store_255(name = "{}/bl".format(name))
- store_256(name = "{}/bl".format(name))
- store_257(name = "{}/brace-expansion".format(name))
- store_258(name = "{}/brace-expansion".format(name))
- store_259(name = "{}/braces".format(name))
- store_260(name = "{}/browser-stdout".format(name))
- store_261(name = "{}/browserslist".format(name))
- store_262(name = "{}/buffer-alloc-unsafe".format(name))
- store_263(name = "{}/buffer-alloc".format(name))
- store_264(name = "{}/buffer-crc32".format(name))
- store_265(name = "{}/buffer-fill".format(name))
- store_266(name = "{}/buffer-from".format(name))
- store_267(name = "{}/buffer".format(name))
- store_268(name = "{}/buffer".format(name))
- store_269(name = "{}/bufferutil".format(name))
- store_270(name = "{}/byline".format(name))
- store_271(name = "{}/c8".format(name))
- store_272(name = "{}/cacache".format(name))
- store_273(name = "{}/cacheable-lookup".format(name))
- store_274(name = "{}/cacheable-request".format(name))
- store_275(name = "{}/callsites".format(name))
- store_276(name = "{}/camelcase".format(name))
- store_277(name = "{}/caniuse-lite".format(name))
- store_278(name = "{}/canvas-fit".format(name))
- store_279(name = "{}/caseless".format(name))
- store_280(name = "{}/chalk".format(name))
- store_281(name = "{}/chalk".format(name))
- store_282(name = "{}/chalk".format(name))
- store_283(name = "{}/chalk".format(name))
- store_284(name = "{}/charenc".format(name))
- store_285(name = "{}/chokidar".format(name))
- store_286(name = "{}/chownr".format(name))
- store_287(name = "{}/chownr".format(name))
- store_288(name = "{}/chownr".format(name))
- store_289(name = "{}/chrome-trace-event".format(name))
- store_290(name = "{}/chromium-bidi".format(name))
- store_291(name = "{}/clamp".format(name))
- store_292(name = "{}/clean-stack".format(name))
- store_293(name = "{}/cliui".format(name))
- store_294(name = "{}/cliui".format(name))
- store_295(name = "{}/clone-deep".format(name))
- store_296(name = "{}/clone-response".format(name))
- store_297(name = "{}/code-point-at".format(name))
- store_298(name = "{}/color-alpha".format(name))
- store_299(name = "{}/color-convert".format(name))
- store_300(name = "{}/color-convert".format(name))
- store_301(name = "{}/color-id".format(name))
- store_302(name = "{}/color-name".format(name))
- store_303(name = "{}/color-name".format(name))
- store_304(name = "{}/color-normalize".format(name))
- store_305(name = "{}/color-parse".format(name))
- store_306(name = "{}/color-rgba".format(name))
- store_307(name = "{}/color-space".format(name))
- store_308(name = "{}/color-support".format(name))
- store_309(name = "{}/colorette".format(name))
- store_310(name = "{}/combined-stream".format(name))
- store_311(name = "{}/commander".format(name))
- store_312(name = "{}/commander".format(name))
- store_313(name = "{}/commander".format(name))
- store_314(name = "{}/commander".format(name))
- store_315(name = "{}/commondir".format(name))
- store_316(name = "{}/complex.js".format(name))
- store_317(name = "{}/concat-map".format(name))
- store_318(name = "{}/concat-stream".format(name))
- store_319(name = "{}/console-control-strings".format(name))
- store_320(name = "{}/convert-source-map".format(name))
- store_321(name = "{}/core-util-is".format(name))
- store_322(name = "{}/core-util-is".format(name))
- store_323(name = "{}/cosmiconfig".format(name))
- store_324(name = "{}/country-regex".format(name))
- store_325(name = "{}/cross-fetch".format(name))
- store_326(name = "{}/cross-spawn".format(name))
- store_327(name = "{}/crypt".format(name))
- store_328(name = "{}/css-font-size-keywords".format(name))
- store_329(name = "{}/css-font-stretch-keywords".format(name))
- store_330(name = "{}/css-font-style-keywords".format(name))
- store_331(name = "{}/css-font-weight-keywords".format(name))
- store_332(name = "{}/css-font".format(name))
- store_333(name = "{}/css-global-keywords".format(name))
- store_334(name = "{}/css-loader".format(name))
- store_335(name = "{}/css-system-font-keywords".format(name))
- store_336(name = "{}/css-what".format(name))
- store_337(name = "{}/csscolorparser".format(name))
- store_338(name = "{}/cssesc".format(name))
- store_339(name = "{}/csstype".format(name))
- store_340(name = "{}/d3-array".format(name))
- store_341(name = "{}/d3-collection".format(name))
- store_342(name = "{}/d3-color".format(name))
- store_343(name = "{}/d3-dispatch".format(name))
- store_344(name = "{}/d3-force".format(name))
- store_345(name = "{}/d3-format".format(name))
- store_346(name = "{}/d3-geo-projection".format(name))
- store_347(name = "{}/d3-geo".format(name))
- store_348(name = "{}/d3-hierarchy".format(name))
- store_349(name = "{}/d3-interpolate".format(name))
- store_350(name = "{}/d3-path".format(name))
- store_351(name = "{}/d3-quadtree".format(name))
- store_352(name = "{}/d3-shape".format(name))
- store_353(name = "{}/d3-time-format".format(name))
- store_354(name = "{}/d3-time".format(name))
- store_355(name = "{}/d3-timer".format(name))
- store_356(name = "{}/d".format(name))
- store_357(name = "{}/dashdash".format(name))
- store_358(name = "{}/date.js".format(name))
- store_359(name = "{}/debug".format(name))
- store_360(name = "{}/debug".format(name))
- store_361(name = "{}/debug".format(name))
- store_362(name = "{}/debug".format(name))
- store_363(name = "{}/debug".format(name))
- store_364(name = "{}/decamelize".format(name))
- store_365(name = "{}/decimal.js".format(name))
- store_366(name = "{}/decompress-response".format(name))
- store_367(name = "{}/deep-extend".format(name))
- store_368(name = "{}/deep-is".format(name))
- store_369(name = "{}/deep-object-diff".format(name))
- store_370(name = "{}/deepmerge".format(name))
- store_371(name = "{}/defer-to-connect".format(name))
- store_372(name = "{}/defined".format(name))
- store_373(name = "{}/delayed-stream".format(name))
- store_374(name = "{}/delegates".format(name))
- store_375(name = "{}/depd".format(name))
- store_376(name = "{}/depd".format(name))
- store_377(name = "{}/dequal".format(name))
- store_378(name = "{}/detect-kerning".format(name))
- store_379(name = "{}/detect-libc".format(name))
- store_380(name = "{}/detect-libc".format(name))
- store_381(name = "{}/devtools-protocol".format(name))
- store_382(name = "{}/diff".format(name))
- store_383(name = "{}/diff".format(name))
- store_384(name = "{}/draw-svg-path".format(name))
- store_385(name = "{}/dtype".format(name))
- store_386(name = "{}/dup".format(name))
- store_387(name = "{}/duplexer3".format(name))
- store_388(name = "{}/duplexer".format(name))
- store_389(name = "{}/duplexify".format(name))
- store_390(name = "{}/earcut".format(name))
- store_391(name = "{}/eastasianwidth".format(name))
- store_392(name = "{}/ecc-jsbn".format(name))
- store_393(name = "{}/electron-to-chromium".format(name))
- store_394(name = "{}/element-size".format(name))
- store_395(name = "{}/elementary-circuits-directed-graph".format(name))
- store_396(name = "{}/emoji-regex".format(name))
- store_397(name = "{}/emoji-regex".format(name))
- store_398(name = "{}/emojis-list".format(name))
- store_399(name = "{}/encoding".format(name))
- store_400(name = "{}/end-of-stream".format(name))
- store_401(name = "{}/enhanced-resolve".format(name))
- store_402(name = "{}/env-paths".format(name))
- store_403(name = "{}/envinfo".format(name))
- store_404(name = "{}/err-code".format(name))
- store_405(name = "{}/error-ex".format(name))
- store_406(name = "{}/es-module-lexer".format(name))
- store_407(name = "{}/es5-ext".format(name))
- store_408(name = "{}/es6-iterator".format(name))
- store_409(name = "{}/es6-symbol".format(name))
- store_410(name = "{}/es6-weak-map".format(name))
- store_411(name = "{}/esbuild".format(name))
- store_412(name = "{}/esbuild".format(name))
- store_413(name = "{}/escalade".format(name))
- store_414(name = "{}/escape-html".format(name))
- store_415(name = "{}/escape-latex".format(name))
- store_416(name = "{}/escape-string-regexp".format(name))
- store_417(name = "{}/escape-string-regexp".format(name))
- store_418(name = "{}/escodegen".format(name))
- store_419(name = "{}/eslint-scope".format(name))
- store_420(name = "{}/esprima".format(name))
- store_421(name = "{}/esprima".format(name))
- store_422(name = "{}/esrecurse".format(name))
- store_423(name = "{}/estraverse".format(name))
- store_424(name = "{}/estraverse".format(name))
- store_425(name = "{}/estree-walker".format(name))
- store_426(name = "{}/estree-walker".format(name))
- store_427(name = "{}/esutils".format(name))
- store_428(name = "{}/eval".format(name))
- store_429(name = "{}/event-target-shim".format(name))
- store_430(name = "{}/events".format(name))
- store_431(name = "{}/ext".format(name))
- store_432(name = "{}/extend".format(name))
- store_433(name = "{}/extract-zip".format(name))
- store_434(name = "{}/extsprintf".format(name))
- store_435(name = "{}/falafel".format(name))
- store_436(name = "{}/fast-decode-uri-component".format(name))
- store_437(name = "{}/fast-deep-equal".format(name))
- store_438(name = "{}/fast-fifo".format(name))
- store_439(name = "{}/fast-isnumeric".format(name))
- store_440(name = "{}/fast-json-stable-stringify".format(name))
- store_441(name = "{}/fast-levenshtein".format(name))
- store_442(name = "{}/fastest-levenshtein".format(name))
- store_443(name = "{}/fd-slicer".format(name))
- store_444(name = "{}/file-uri-to-path".format(name))
- store_445(name = "{}/fill-range".format(name))
- store_446(name = "{}/find-up".format(name))
- store_447(name = "{}/find-up".format(name))
- store_448(name = "{}/flat".format(name))
- store_449(name = "{}/flatten-vertex-data".format(name))
- store_450(name = "{}/font-atlas".format(name))
- store_451(name = "{}/font-measure".format(name))
- store_452(name = "{}/foreground-child".format(name))
- store_453(name = "{}/foreground-child".format(name))
- store_454(name = "{}/forever-agent".format(name))
- store_455(name = "{}/form-data".format(name))
- store_456(name = "{}/form-data".format(name))
- store_457(name = "{}/fraction.js".format(name))
- store_458(name = "{}/from2".format(name))
- store_459(name = "{}/fs-constants".format(name))
- store_460(name = "{}/fs-extra".format(name))
- store_461(name = "{}/fs-extra".format(name))
- store_462(name = "{}/fs-minipass".format(name))
- store_463(name = "{}/fs-minipass".format(name))
- store_464(name = "{}/fs.realpath".format(name))
- store_465(name = "{}/fsevents".format(name))
- store_466(name = "{}/function-bind".format(name))
- store_467(name = "{}/gauge".format(name))
- store_468(name = "{}/gauge".format(name))
- store_469(name = "{}/gauge".format(name))
- store_470(name = "{}/gensync".format(name))
- store_471(name = "{}/geojson-vt".format(name))
- store_472(name = "{}/get-caller-file".format(name))
- store_473(name = "{}/get-canvas-context".format(name))
- store_474(name = "{}/get-stream".format(name))
- store_475(name = "{}/get-stream".format(name))
- store_476(name = "{}/getpass".format(name))
- store_477(name = "{}/gl-mat4".format(name))
- store_478(name = "{}/gl-matrix".format(name))
- store_479(name = "{}/gl-text".format(name))
- store_480(name = "{}/gl-util".format(name))
- store_481(name = "{}/glob-parent".format(name))
- store_482(name = "{}/glob-to-regexp".format(name))
- store_483(name = "{}/glob".format(name))
- store_484(name = "{}/glob".format(name))
- store_485(name = "{}/glob".format(name))
- store_486(name = "{}/glob".format(name))
- store_487(name = "{}/glob".format(name))
- store_488(name = "{}/globals".format(name))
- store_489(name = "{}/glsl-inject-defines".format(name))
- store_490(name = "{}/glsl-resolve".format(name))
- store_491(name = "{}/glsl-token-assignments".format(name))
- store_492(name = "{}/glsl-token-defines".format(name))
- store_493(name = "{}/glsl-token-depth".format(name))
- store_494(name = "{}/glsl-token-descope".format(name))
- store_495(name = "{}/glsl-token-inject-block".format(name))
- store_496(name = "{}/glsl-token-properties".format(name))
- store_497(name = "{}/glsl-token-scope".format(name))
- store_498(name = "{}/glsl-token-string".format(name))
- store_499(name = "{}/glsl-token-whitespace-trim".format(name))
- store_500(name = "{}/glsl-tokenizer".format(name))
- store_501(name = "{}/glslify-bundle".format(name))
- store_502(name = "{}/glslify-deps".format(name))
- store_503(name = "{}/glslify".format(name))
- store_504(name = "{}/google-protobuf".format(name))
- store_505(name = "{}/got".format(name))
- store_506(name = "{}/graceful-fs".format(name))
- store_507(name = "{}/grid-index".format(name))
- store_508(name = "{}/gzip-size".format(name))
- store_509(name = "{}/handlebars-utils".format(name))
- store_510(name = "{}/har-schema".format(name))
- store_511(name = "{}/har-validator".format(name))
- store_512(name = "{}/has-flag".format(name))
- store_513(name = "{}/has-flag".format(name))
- store_514(name = "{}/has-hover".format(name))
- store_515(name = "{}/has-passive-events".format(name))
- store_516(name = "{}/has-unicode".format(name))
- store_517(name = "{}/has".format(name))
- store_518(name = "{}/he".format(name))
- store_519(name = "{}/hello".format(name))
- store_520(name = "{}/helper-date".format(name))
- store_521(name = "{}/hot-shots".format(name))
- store_522(name = "{}/hsluv".format(name))
- store_523(name = "{}/html-escaper".format(name))
- store_524(name = "{}/http-cache-semantics".format(name))
- store_525(name = "{}/http-errors".format(name))
- store_526(name = "{}/http-proxy-agent".format(name))
- store_527(name = "{}/http-signature".format(name))
- store_528(name = "{}/https-proxy-agent".format(name))
- store_529(name = "{}/humanize-ms".format(name))
- store_530(name = "{}/iconv-lite".format(name))
- store_531(name = "{}/iconv-lite".format(name))
- store_532(name = "{}/icss-utils".format(name))
- store_533(name = "{}/ieee754".format(name))
- store_534(name = "{}/ignore-walk".format(name))
- store_535(name = "{}/import-fresh".format(name))
- store_536(name = "{}/import-local".format(name))
- store_537(name = "{}/imurmurhash".format(name))
- store_538(name = "{}/indent-string".format(name))
- store_539(name = "{}/infer-owner".format(name))
- store_540(name = "{}/inflight".format(name))
- store_541(name = "{}/inherits".format(name))
- store_542(name = "{}/ini".format(name))
- store_543(name = "{}/inline-fixtures".format(name))
- store_544(name = "{}/inline-fixtures".format(name))
- store_545(name = "{}/interpret".format(name))
- store_546(name = "{}/ip".format(name))
- store_547(name = "{}/is-arrayish".format(name))
- store_548(name = "{}/is-binary-path".format(name))
- store_549(name = "{}/is-browser".format(name))
- store_550(name = "{}/is-buffer".format(name))
- store_551(name = "{}/is-core-module".format(name))
- store_552(name = "{}/is-extglob".format(name))
- store_553(name = "{}/is-finite".format(name))
- store_554(name = "{}/is-firefox".format(name))
- store_555(name = "{}/is-fullwidth-code-point".format(name))
- store_556(name = "{}/is-fullwidth-code-point".format(name))
- store_557(name = "{}/is-glob".format(name))
- store_558(name = "{}/is-iexplorer".format(name))
- store_559(name = "{}/is-lambda".format(name))
- store_560(name = "{}/is-mobile".format(name))
- store_561(name = "{}/is-module".format(name))
- store_562(name = "{}/is-number".format(name))
- store_563(name = "{}/is-number".format(name))
- store_564(name = "{}/is-obj".format(name))
- store_565(name = "{}/is-plain-obj".format(name))
- store_566(name = "{}/is-plain-obj".format(name))
- store_567(name = "{}/is-plain-object".format(name))
- store_568(name = "{}/is-reference".format(name))
- store_569(name = "{}/is-string-blank".format(name))
- store_570(name = "{}/is-svg-path".format(name))
- store_571(name = "{}/is-typedarray".format(name))
- store_572(name = "{}/is-unicode-supported".format(name))
- store_573(name = "{}/isarray".format(name))
- store_574(name = "{}/isarray".format(name))
- store_575(name = "{}/isarray".format(name))
- store_576(name = "{}/isexe".format(name))
- store_577(name = "{}/isobject".format(name))
- store_578(name = "{}/isomorphic-ws".format(name))
- store_579(name = "{}/isstream".format(name))
- store_580(name = "{}/istanbul-lib-coverage".format(name))
- store_581(name = "{}/istanbul-lib-report".format(name))
- store_582(name = "{}/istanbul-reports".format(name))
- store_583(name = "{}/jackspeak".format(name))
- store_584(name = "{}/jackspeak".format(name))
- store_585(name = "{}/jasmine-core".format(name))
- store_586(name = "{}/jasmine".format(name))
- store_587(name = "{}/javascript-natural-sort".format(name))
- store_588(name = "{}/javascript-stringify".format(name))
- store_589(name = "{}/jest-worker".format(name))
- store_590(name = "{}/jose".format(name))
- store_591(name = "{}/js-tokens".format(name))
- store_592(name = "{}/js-yaml".format(name))
- store_593(name = "{}/jsbn".format(name))
- store_594(name = "{}/jsep".format(name))
- store_595(name = "{}/jsesc".format(name))
- store_596(name = "{}/json-buffer".format(name))
- store_597(name = "{}/json-parse-even-better-errors".format(name))
- store_598(name = "{}/json-schema-traverse".format(name))
- store_599(name = "{}/json-schema-traverse".format(name))
- store_600(name = "{}/json-schema".format(name))
- store_601(name = "{}/json-stable-stringify".format(name))
- store_602(name = "{}/json-stringify-safe".format(name))
- store_603(name = "{}/json5".format(name))
- store_604(name = "{}/jsonc-parser".format(name))
- store_605(name = "{}/jsonfile".format(name))
- store_606(name = "{}/jsonfile".format(name))
- store_607(name = "{}/jsonpath-plus".format(name))
- store_608(name = "{}/jsonpath-plus".format(name))
- store_609(name = "{}/jsprim".format(name))
- store_610(name = "{}/kdbush".format(name))
- store_611(name = "{}/keyv".format(name))
- store_612(name = "{}/kind-of".format(name))
- store_613(name = "{}/kind-of".format(name))
- store_614(name = "{}/kleur".format(name))
- store_615(name = "{}/levn".format(name))
- store_616(name = "{}/lines-and-columns".format(name))
- store_617(name = "{}/loader-runner".format(name))
- store_618(name = "{}/loader-utils".format(name))
- store_619(name = "{}/locate-path".format(name))
- store_620(name = "{}/locate-path".format(name))
- store_621(name = "{}/lodash.merge".format(name))
- store_622(name = "{}/lodash".format(name))
- store_623(name = "{}/log-symbols".format(name))
- store_624(name = "{}/loose-envify".format(name))
- store_625(name = "{}/lowercase-keys".format(name))
- store_626(name = "{}/lru-cache".format(name))
- store_627(name = "{}/lru-cache".format(name))
- store_628(name = "{}/lru-cache".format(name))
- store_629(name = "{}/lru-cache".format(name))
- store_630(name = "{}/lru-cache".format(name))
- store_631(name = "{}/magic-string".format(name))
- store_632(name = "{}/magic-string".format(name))
- store_633(name = "{}/make-dir".format(name))
- store_634(name = "{}/make-dir".format(name))
- store_635(name = "{}/make-fetch-happen".format(name))
- store_636(name = "{}/map-limit".format(name))
- store_637(name = "{}/mapbox-gl".format(name))
- store_638(name = "{}/math-log2".format(name))
- store_639(name = "{}/mathjs".format(name))
- store_640(name = "{}/md5".format(name))
- store_641(name = "{}/meaning-of-life".format(name))
- store_642(name = "{}/media-query-parser".format(name))
- store_643(name = "{}/merge-stream".format(name))
- store_644(name = "{}/mime-db".format(name))
- store_645(name = "{}/mime-types".format(name))
- store_646(name = "{}/mime".format(name))
- store_647(name = "{}/mimic-response".format(name))
- store_648(name = "{}/mimic-response".format(name))
- store_649(name = "{}/mini-css-extract-plugin".format(name))
- store_650(name = "{}/minimatch".format(name))
- store_651(name = "{}/minimatch".format(name))
- store_652(name = "{}/minimatch".format(name))
- store_653(name = "{}/minimatch".format(name))
- store_654(name = "{}/minimatch".format(name))
- store_655(name = "{}/minimatch".format(name))
- store_656(name = "{}/minimist".format(name))
- store_657(name = "{}/minimist".format(name))
- store_658(name = "{}/minipass-collect".format(name))
- store_659(name = "{}/minipass-fetch".format(name))
- store_660(name = "{}/minipass-flush".format(name))
- store_661(name = "{}/minipass-pipeline".format(name))
- store_662(name = "{}/minipass-sized".format(name))
- store_663(name = "{}/minipass".format(name))
- store_664(name = "{}/minipass".format(name))
- store_665(name = "{}/minipass".format(name))
- store_666(name = "{}/minipass".format(name))
- store_667(name = "{}/minipass".format(name))
- store_668(name = "{}/minizlib".format(name))
- store_669(name = "{}/minizlib".format(name))
- store_670(name = "{}/minizlib".format(name))
- store_671(name = "{}/mitt".format(name))
- store_672(name = "{}/mkdirp-classic".format(name))
- store_673(name = "{}/mkdirp".format(name))
- store_674(name = "{}/mkdirp".format(name))
- store_675(name = "{}/mkdirp".format(name))
- store_676(name = "{}/mlly".format(name))
- store_677(name = "{}/mobx-react-lite".format(name))
- store_678(name = "{}/mobx-react".format(name))
- store_679(name = "{}/mobx".format(name))
- store_680(name = "{}/mocha-junit-reporter".format(name))
- store_681(name = "{}/mocha-multi-reporters".format(name))
- store_682(name = "{}/mocha".format(name))
- store_683(name = "{}/moment-timezone".format(name))
- store_684(name = "{}/moment".format(name))
- store_685(name = "{}/mouse-change".format(name))
- store_686(name = "{}/mouse-event-offset".format(name))
- store_687(name = "{}/mouse-event".format(name))
- store_688(name = "{}/mouse-wheel".format(name))
- store_689(name = "{}/mri".format(name))
- store_690(name = "{}/mrmime".format(name))
- store_691(name = "{}/ms".format(name))
- store_692(name = "{}/ms".format(name))
- store_693(name = "{}/ms".format(name))
- store_694(name = "{}/ms".format(name))
- store_695(name = "{}/mumath".format(name))
- store_696(name = "{}/murmurhash-js".format(name))
- store_697(name = "{}/nan".format(name))
- store_698(name = "{}/nanoid".format(name))
- store_699(name = "{}/nanoid".format(name))
- store_700(name = "{}/native-promise-only".format(name))
- store_701(name = "{}/needle".format(name))
- store_702(name = "{}/negotiator".format(name))
- store_703(name = "{}/neo-async".format(name))
- store_704(name = "{}/next-tick".format(name))
- store_705(name = "{}/node-fetch".format(name))
- store_706(name = "{}/node-fetch".format(name))
- store_707(name = "{}/node-gyp-build".format(name))
- store_708(name = "{}/node-gyp".format(name))
- store_709(name = "{}/node-gyp".format(name))
- store_710(name = "{}/node-pre-gyp".format(name))
- store_711(name = "{}/node-releases".format(name))
- store_712(name = "{}/nopt".format(name))
- store_713(name = "{}/nopt".format(name))
- store_714(name = "{}/nopt".format(name))
- store_715(name = "{}/normalize-path".format(name))
- store_716(name = "{}/normalize-svg-path".format(name))
- store_717(name = "{}/normalize-svg-path".format(name))
- store_718(name = "{}/normalize-url".format(name))
- store_719(name = "{}/npm-bundled".format(name))
- store_720(name = "{}/npm-normalize-package-bin".format(name))
- store_721(name = "{}/npm-packlist".format(name))
- store_722(name = "{}/npmlog".format(name))
- store_723(name = "{}/npmlog".format(name))
- store_724(name = "{}/npmlog".format(name))
- store_725(name = "{}/number-is-integer".format(name))
- store_726(name = "{}/number-is-nan".format(name))
- store_727(name = "{}/oauth-sign".format(name))
- store_728(name = "{}/object-assign".format(name))
- store_729(name = "{}/object-hash".format(name))
- store_730(name = "{}/oidc-token-hash".format(name))
- store_731(name = "{}/once".format(name))
- store_732(name = "{}/once".format(name))
- store_733(name = "{}/opener".format(name))
- store_734(name = "{}/openid-client".format(name))
- store_735(name = "{}/optimist".format(name))
- store_736(name = "{}/optionator".format(name))
- store_737(name = "{}/os-homedir".format(name))
- store_738(name = "{}/os-tmpdir".format(name))
- store_739(name = "{}/osenv".format(name))
- store_740(name = "{}/outdent".format(name))
- store_741(name = "{}/p-cancelable".format(name))
- store_742(name = "{}/p-event".format(name))
- store_743(name = "{}/p-finally".format(name))
- store_744(name = "{}/p-limit".format(name))
- store_745(name = "{}/p-limit".format(name))
- store_746(name = "{}/p-locate".format(name))
- store_747(name = "{}/p-locate".format(name))
- store_748(name = "{}/p-map".format(name))
- store_749(name = "{}/p-timeout".format(name))
- store_750(name = "{}/p-try".format(name))
- store_751(name = "{}/package-json-from-dist".format(name))
- store_752(name = "{}/parent-module".format(name))
- store_753(name = "{}/parenthesis".format(name))
- store_754(name = "{}/parse-json".format(name))
- store_755(name = "{}/parse-rect".format(name))
- store_756(name = "{}/parse-svg-path".format(name))
- store_757(name = "{}/parse-unit".format(name))
- store_758(name = "{}/path-exists".format(name))
- store_759(name = "{}/path-is-absolute".format(name))
- store_760(name = "{}/path-key".format(name))
- store_761(name = "{}/path-parse".format(name))
- store_762(name = "{}/path-scurry".format(name))
- store_763(name = "{}/path-scurry".format(name))
- store_764(name = "{}/path-type".format(name))
- store_765(name = "{}/pathe".format(name))
- store_766(name = "{}/pbf".format(name))
- store_767(name = "{}/pend".format(name))
- store_768(name = "{}/performance-now".format(name))
- store_769(name = "{}/pick-by-alias".format(name))
- store_770(name = "{}/picocolors".format(name))
- store_771(name = "{}/picomatch".format(name))
- store_772(name = "{}/pify".format(name))
- store_773(name = "{}/pkg-dir".format(name))
- store_774(name = "{}/pkg-types".format(name))
- store_775(name = "{}/plotly.js".format(name))
- store_776(name = "{}/pngjs".format(name))
- store_777(name = "{}/point-in-polygon".format(name))
- store_778(name = "{}/polybooljs".format(name))
- store_779(name = "{}/postcss-modules-extract-imports".format(name))
- store_780(name = "{}/postcss-modules-local-by-default".format(name))
- store_781(name = "{}/postcss-modules-scope".format(name))
- store_782(name = "{}/postcss-modules-values".format(name))
- store_783(name = "{}/postcss-selector-parser".format(name))
- store_784(name = "{}/postcss-value-parser".format(name))
- store_785(name = "{}/postcss".format(name))
- store_786(name = "{}/potpack".format(name))
- store_787(name = "{}/prelude-ls".format(name))
- store_788(name = "{}/probe-image-size".format(name))
- store_789(name = "{}/process-nextick-args".format(name))
- store_790(name = "{}/process".format(name))
- store_791(name = "{}/progress".format(name))
- store_792(name = "{}/promise-inflight".format(name))
- store_793(name = "{}/promise-retry".format(name))
- store_794(name = "{}/protoc-gen-grpc".format(name))
- store_795(name = "{}/protocol-buffers-schema".format(name))
- store_796(name = "{}/proxy-from-env".format(name))
- store_797(name = "{}/psl".format(name))
- store_798(name = "{}/pump".format(name))
- store_799(name = "{}/pump".format(name))
- store_800(name = "{}/punycode".format(name))
- store_801(name = "{}/puppeteer-core".format(name))
- store_802(name = "{}/puppeteer".format(name))
- store_803(name = "{}/qs".format(name))
- store_804(name = "{}/queue-tick".format(name))
- store_805(name = "{}/quickselect".format(name))
- store_806(name = "{}/raf".format(name))
- store_807(name = "{}/ramda".format(name))
- store_808(name = "{}/randombytes".format(name))
- store_809(name = "{}/rc".format(name))
- store_810(name = "{}/react".format(name))
- store_811(name = "{}/read-yaml-file".format(name))
- store_812(name = "{}/readable-stream".format(name))
- store_813(name = "{}/readable-stream".format(name))
- store_814(name = "{}/readable-stream".format(name))
- store_815(name = "{}/readable-stream".format(name))
- store_816(name = "{}/readdirp".format(name))
- store_817(name = "{}/rechoir".format(name))
- store_818(name = "{}/regenerator-runtime".format(name))
- store_819(name = "{}/regl-error2d".format(name))
- store_820(name = "{}/regl-line2d".format(name))
- store_821(name = "{}/regl-scatter2d".format(name))
- store_822(name = "{}/regl-splom".format(name))
- store_823(name = "{}/regl".format(name))
- store_824(name = "{}/request".format(name))
- store_825(name = "{}/require-directory".format(name))
- store_826(name = "{}/require-from-string".format(name))
- store_827(name = "{}/require-like".format(name))
- store_828(name = "{}/resolve-cwd".format(name))
- store_829(name = "{}/resolve-from".format(name))
- store_830(name = "{}/resolve-from".format(name))
- store_831(name = "{}/resolve-protobuf-schema".format(name))
- store_832(name = "{}/resolve".format(name))
- store_833(name = "{}/resolve".format(name))
- store_834(name = "{}/responselike".format(name))
- store_835(name = "{}/retry".format(name))
- store_836(name = "{}/rfc4648".format(name))
- store_837(name = "{}/right-now".format(name))
- store_838(name = "{}/rimraf".format(name))
- store_839(name = "{}/rimraf".format(name))
- store_840(name = "{}/rimraf".format(name))
- store_841(name = "{}/rollup".format(name))
- store_842(name = "{}/rollup".format(name))
- store_843(name = "{}/rollup".format(name))
- store_844(name = "{}/rw".format(name))
- store_845(name = "{}/sade".format(name))
- store_846(name = "{}/safe-buffer".format(name))
- store_847(name = "{}/safe-buffer".format(name))
- store_848(name = "{}/safer-buffer".format(name))
- store_849(name = "{}/sax".format(name))
- store_850(name = "{}/schema-utils".format(name))
- store_851(name = "{}/schema-utils".format(name))
- store_852(name = "{}/seedrandom".format(name))
- store_853(name = "{}/segfault-handler".format(name))
- store_854(name = "{}/semver-first-satisfied".format(name))
- store_855(name = "{}/semver".format(name))
- store_856(name = "{}/semver".format(name))
- store_857(name = "{}/semver".format(name))
- store_858(name = "{}/semver".format(name))
- store_859(name = "{}/serialize-javascript".format(name))
- store_860(name = "{}/serialize-javascript".format(name))
- store_861(name = "{}/set-blocking".format(name))
- store_862(name = "{}/setprototypeof".format(name))
- store_863(name = "{}/shallow-clone".format(name))
- store_864(name = "{}/shallow-copy".format(name))
- store_865(name = "{}/shebang-command".format(name))
- store_866(name = "{}/shebang-regex".format(name))
- store_867(name = "{}/signal-exit".format(name))
- store_868(name = "{}/signal-exit".format(name))
- store_869(name = "{}/signum".format(name))
- store_870(name = "{}/sirv".format(name))
- store_871(name = "{}/smart-buffer".format(name))
- store_872(name = "{}/smob".format(name))
- store_873(name = "{}/socks-proxy-agent".format(name))
- store_874(name = "{}/socks".format(name))
- store_875(name = "{}/source-map-js".format(name))
- store_876(name = "{}/source-map-support".format(name))
- store_877(name = "{}/source-map".format(name))
- store_878(name = "{}/sourcemap-codec".format(name))
- store_879(name = "{}/sshpk".format(name))
- store_880(name = "{}/ssri".format(name))
- store_881(name = "{}/stack-trace".format(name))
- store_882(name = "{}/static-eval".format(name))
- store_883(name = "{}/statuses".format(name))
- store_884(name = "{}/stream-buffers".format(name))
- store_885(name = "{}/stream-parser".format(name))
- store_886(name = "{}/stream-shift".format(name))
- store_887(name = "{}/streamx".format(name))
- store_888(name = "{}/string-split-by".format(name))
- store_889(name = "{}/string-width".format(name))
- store_890(name = "{}/string-width".format(name))
- store_891(name = "{}/string-width".format(name))
- store_892(name = "{}/string_decoder".format(name))
- store_893(name = "{}/string_decoder".format(name))
- store_894(name = "{}/string_decoder".format(name))
- store_895(name = "{}/strip-ansi".format(name))
- store_896(name = "{}/strip-ansi".format(name))
- store_897(name = "{}/strip-ansi".format(name))
- store_898(name = "{}/strip-bom".format(name))
- store_899(name = "{}/strip-json-comments".format(name))
- store_900(name = "{}/strip-json-comments".format(name))
- store_901(name = "{}/strongly-connected-components".format(name))
- store_902(name = "{}/supercluster".format(name))
- store_903(name = "{}/superscript-text".format(name))
- store_904(name = "{}/supports-color".format(name))
- store_905(name = "{}/supports-color".format(name))
- store_906(name = "{}/supports-color".format(name))
- store_907(name = "{}/supports-preserve-symlinks-flag".format(name))
- store_908(name = "{}/svg-arc-to-cubic-bezier".format(name))
- store_909(name = "{}/svg-path-bounds".format(name))
- store_910(name = "{}/svg-path-sdf".format(name))
- store_911(name = "{}/syncpack".format(name))
- store_912(name = "{}/tapable".format(name))
- store_913(name = "{}/tar-fs".format(name))
- store_914(name = "{}/tar-fs".format(name))
- store_915(name = "{}/tar-stream".format(name))
- store_916(name = "{}/tar-stream".format(name))
- store_917(name = "{}/tar-stream".format(name))
- store_918(name = "{}/tar".format(name))
- store_919(name = "{}/tar".format(name))
- store_920(name = "{}/tar".format(name))
- store_921(name = "{}/terser-webpack-plugin".format(name))
- store_922(name = "{}/terser".format(name))
- store_923(name = "{}/terser".format(name))
- store_924(name = "{}/test-exclude".format(name))
- store_925(name = "{}/through2".format(name))
- store_926(name = "{}/through2".format(name))
- store_927(name = "{}/through".format(name))
- store_928(name = "{}/tightrope".format(name))
- store_929(name = "{}/tiny-emitter".format(name))
- store_930(name = "{}/tinycolor2".format(name))
- store_931(name = "{}/tinyqueue".format(name))
- store_932(name = "{}/tmp".format(name))
- store_933(name = "{}/to-buffer".format(name))
- store_934(name = "{}/to-fast-properties".format(name))
- store_935(name = "{}/to-float32".format(name))
- store_936(name = "{}/to-px".format(name))
- store_937(name = "{}/to-readable-stream".format(name))
- store_938(name = "{}/to-regex-range".format(name))
- store_939(name = "{}/toidentifier".format(name))
- store_940(name = "{}/topojson-client".format(name))
- store_941(name = "{}/totalist".format(name))
- store_942(name = "{}/tough-cookie".format(name))
- store_943(name = "{}/tr46".format(name))
- store_944(name = "{}/tslib".format(name))
- store_945(name = "{}/tunnel-agent".format(name))
- store_946(name = "{}/tweetnacl".format(name))
- store_947(name = "{}/type-check".format(name))
- store_948(name = "{}/type-fest".format(name))
- store_949(name = "{}/type".format(name))
- store_950(name = "{}/type".format(name))
- store_951(name = "{}/typed-function".format(name))
- store_952(name = "{}/typedarray-pool".format(name))
- store_953(name = "{}/typedarray".format(name))
- store_954(name = "{}/typeof-article".format(name))
- store_955(name = "{}/typescript".format(name))
- store_956(name = "{}/ufo".format(name))
- store_957(name = "{}/unbzip2-stream".format(name))
- store_958(name = "{}/undici-types".format(name))
- store_959(name = "{}/undici-types".format(name))
- store_960(name = "{}/unique-filename".format(name))
- store_961(name = "{}/unique-slug".format(name))
- store_962(name = "{}/universalify".format(name))
- store_963(name = "{}/universalify".format(name))
- store_964(name = "{}/unix-dgram".format(name))
- store_965(name = "{}/unquote".format(name))
- store_966(name = "{}/unused".format(name))
- store_967(name = "{}/update-browserslist-db".format(name))
- store_968(name = "{}/update-diff".format(name))
- store_969(name = "{}/uri-js".format(name))
- store_970(name = "{}/util-deprecate".format(name))
- store_971(name = "{}/uuid".format(name))
- store_972(name = "{}/uuid".format(name))
- store_973(name = "{}/uvu".format(name))
- store_974(name = "{}/v8-to-istanbul".format(name))
- store_975(name = "{}/verror".format(name))
- store_976(name = "{}/vt-pbf".format(name))
- store_977(name = "{}/watchpack".format(name))
- store_978(name = "{}/weak-map".format(name))
- store_979(name = "{}/webgl-context".format(name))
- store_980(name = "{}/webidl-conversions".format(name))
- store_981(name = "{}/webpack-bundle-analyzer".format(name))
- store_982(name = "{}/webpack-cli".format(name))
- store_983(name = "{}/webpack-merge".format(name))
- store_984(name = "{}/webpack-sources".format(name))
- store_985(name = "{}/webpack".format(name))
- store_986(name = "{}/whatwg-url".format(name))
- store_987(name = "{}/which".format(name))
- store_988(name = "{}/wide-align".format(name))
- store_989(name = "{}/wildcard".format(name))
- store_990(name = "{}/word-wrap".format(name))
- store_991(name = "{}/wordwrap".format(name))
- store_992(name = "{}/workerpool".format(name))
- store_993(name = "{}/world-calendars".format(name))
- store_994(name = "{}/wrap-ansi".format(name))
- store_995(name = "{}/wrap-ansi".format(name))
- store_996(name = "{}/wrappy".format(name))
- store_997(name = "{}/ws".format(name))
- store_998(name = "{}/ws".format(name))
- store_999(name = "{}/ws".format(name))
- store_1000(name = "{}/xml".format(name))
- store_1001(name = "{}/xtend".format(name))
- store_1002(name = "{}/xtend".format(name))
- store_1003(name = "{}/y18n".format(name))
- store_1004(name = "{}/yallist".format(name))
- store_1005(name = "{}/yallist".format(name))
- store_1006(name = "{}/yallist".format(name))
- store_1007(name = "{}/yargs-parser".format(name))
- store_1008(name = "{}/yargs-parser".format(name))
- store_1009(name = "{}/yargs-parser".format(name))
- store_1010(name = "{}/yargs-unparser".format(name))
- store_1011(name = "{}/yargs".format(name))
- store_1012(name = "{}/yargs".format(name))
- store_1013(name = "{}/yauzl".format(name))
- store_1014(name = "{}/yocto-queue".format(name))
- store_1015(name = "{}/zod".format(name))
+ store_204(name = "{}/@types/request".format(name))
+ store_205(name = "{}/@types/resolve".format(name))
+ store_206(name = "{}/@types/responselike".format(name))
+ store_207(name = "{}/@types/tough-cookie".format(name))
+ store_208(name = "{}/@types/underscore".format(name))
+ store_209(name = "{}/@types/ws".format(name))
+ store_210(name = "{}/@types/yauzl".format(name))
+ store_211(name = "{}/@vanilla-extract/babel-plugin-debug-ids".format(name))
+ store_212(name = "{}/@vanilla-extract/css".format(name))
+ store_213(name = "{}/@vanilla-extract/css".format(name))
+ store_214(name = "{}/@vanilla-extract/integration".format(name))
+ store_215(name = "{}/@vanilla-extract/private".format(name))
+ store_216(name = "{}/@vanilla-extract/webpack-plugin".format(name))
+ store_217(name = "{}/@webassemblyjs/ast".format(name))
+ store_218(name = "{}/@webassemblyjs/floating-point-hex-parser".format(name))
+ store_219(name = "{}/@webassemblyjs/helper-api-error".format(name))
+ store_220(name = "{}/@webassemblyjs/helper-buffer".format(name))
+ store_221(name = "{}/@webassemblyjs/helper-numbers".format(name))
+ store_222(name = "{}/@webassemblyjs/helper-wasm-bytecode".format(name))
+ store_223(name = "{}/@webassemblyjs/helper-wasm-section".format(name))
+ store_224(name = "{}/@webassemblyjs/ieee754".format(name))
+ store_225(name = "{}/@webassemblyjs/leb128".format(name))
+ store_226(name = "{}/@webassemblyjs/utf8".format(name))
+ store_227(name = "{}/@webassemblyjs/wasm-edit".format(name))
+ store_228(name = "{}/@webassemblyjs/wasm-gen".format(name))
+ store_229(name = "{}/@webassemblyjs/wasm-opt".format(name))
+ store_230(name = "{}/@webassemblyjs/wasm-parser".format(name))
+ store_231(name = "{}/@webassemblyjs/wast-printer".format(name))
+ store_232(name = "{}/@webpack-cli/configtest".format(name))
+ store_233(name = "{}/@webpack-cli/info".format(name))
+ store_234(name = "{}/@webpack-cli/serve".format(name))
+ store_235(name = "{}/@xtuc/ieee754".format(name))
+ store_236(name = "{}/@xtuc/long".format(name))
+ store_237(name = "{}/aws-sign2".format(name))
+ store_238(name = "{}/aws4".format(name))
+ store_239(name = "{}/balanced-match".format(name))
+ store_240(name = "{}/base64-js".format(name))
+ store_241(name = "{}/bcrypt-pbkdf".format(name))
+ store_242(name = "{}/big.js".format(name))
+ store_243(name = "{}/binary-extensions".format(name))
+ store_244(name = "{}/binary-search-bounds".format(name))
+ store_245(name = "{}/bindings".format(name))
+ store_246(name = "{}/bit-twiddle".format(name))
+ store_247(name = "{}/bitmap-sdf".format(name))
+ store_248(name = "{}/bl".format(name))
+ store_249(name = "{}/bl".format(name))
+ store_250(name = "{}/bl".format(name))
+ store_251(name = "{}/brace-expansion".format(name))
+ store_252(name = "{}/brace-expansion".format(name))
+ store_253(name = "{}/braces".format(name))
+ store_254(name = "{}/browser-stdout".format(name))
+ store_255(name = "{}/browserslist".format(name))
+ store_256(name = "{}/buffer-alloc-unsafe".format(name))
+ store_257(name = "{}/buffer-alloc".format(name))
+ store_258(name = "{}/buffer-crc32".format(name))
+ store_259(name = "{}/buffer-fill".format(name))
+ store_260(name = "{}/buffer-from".format(name))
+ store_261(name = "{}/buffer".format(name))
+ store_262(name = "{}/bufferutil".format(name))
+ store_263(name = "{}/byline".format(name))
+ store_264(name = "{}/c8".format(name))
+ store_265(name = "{}/cacache".format(name))
+ store_266(name = "{}/cacheable-lookup".format(name))
+ store_267(name = "{}/cacheable-request".format(name))
+ store_268(name = "{}/callsites".format(name))
+ store_269(name = "{}/camelcase".format(name))
+ store_270(name = "{}/caniuse-lite".format(name))
+ store_271(name = "{}/canvas-fit".format(name))
+ store_272(name = "{}/caseless".format(name))
+ store_273(name = "{}/chalk".format(name))
+ store_274(name = "{}/chalk".format(name))
+ store_275(name = "{}/chalk".format(name))
+ store_276(name = "{}/chalk".format(name))
+ store_277(name = "{}/charenc".format(name))
+ store_278(name = "{}/chokidar".format(name))
+ store_279(name = "{}/chownr".format(name))
+ store_280(name = "{}/chownr".format(name))
+ store_281(name = "{}/chownr".format(name))
+ store_282(name = "{}/chrome-trace-event".format(name))
+ store_283(name = "{}/chromium-bidi".format(name))
+ store_284(name = "{}/clamp".format(name))
+ store_285(name = "{}/clean-stack".format(name))
+ store_286(name = "{}/cliui".format(name))
+ store_287(name = "{}/cliui".format(name))
+ store_288(name = "{}/clone-deep".format(name))
+ store_289(name = "{}/clone-response".format(name))
+ store_290(name = "{}/code-point-at".format(name))
+ store_291(name = "{}/color-alpha".format(name))
+ store_292(name = "{}/color-convert".format(name))
+ store_293(name = "{}/color-convert".format(name))
+ store_294(name = "{}/color-id".format(name))
+ store_295(name = "{}/color-name".format(name))
+ store_296(name = "{}/color-name".format(name))
+ store_297(name = "{}/color-normalize".format(name))
+ store_298(name = "{}/color-parse".format(name))
+ store_299(name = "{}/color-rgba".format(name))
+ store_300(name = "{}/color-space".format(name))
+ store_301(name = "{}/color-support".format(name))
+ store_302(name = "{}/colorette".format(name))
+ store_303(name = "{}/combined-stream".format(name))
+ store_304(name = "{}/commander".format(name))
+ store_305(name = "{}/commander".format(name))
+ store_306(name = "{}/commander".format(name))
+ store_307(name = "{}/commander".format(name))
+ store_308(name = "{}/commondir".format(name))
+ store_309(name = "{}/complex.js".format(name))
+ store_310(name = "{}/concat-map".format(name))
+ store_311(name = "{}/concat-stream".format(name))
+ store_312(name = "{}/console-control-strings".format(name))
+ store_313(name = "{}/convert-source-map".format(name))
+ store_314(name = "{}/core-util-is".format(name))
+ store_315(name = "{}/core-util-is".format(name))
+ store_316(name = "{}/cosmiconfig".format(name))
+ store_317(name = "{}/country-regex".format(name))
+ store_318(name = "{}/cross-fetch".format(name))
+ store_319(name = "{}/cross-spawn".format(name))
+ store_320(name = "{}/crypt".format(name))
+ store_321(name = "{}/css-font-size-keywords".format(name))
+ store_322(name = "{}/css-font-stretch-keywords".format(name))
+ store_323(name = "{}/css-font-style-keywords".format(name))
+ store_324(name = "{}/css-font-weight-keywords".format(name))
+ store_325(name = "{}/css-font".format(name))
+ store_326(name = "{}/css-global-keywords".format(name))
+ store_327(name = "{}/css-loader".format(name))
+ store_328(name = "{}/css-system-font-keywords".format(name))
+ store_329(name = "{}/css-what".format(name))
+ store_330(name = "{}/csscolorparser".format(name))
+ store_331(name = "{}/cssesc".format(name))
+ store_332(name = "{}/csstype".format(name))
+ store_333(name = "{}/d3-array".format(name))
+ store_334(name = "{}/d3-collection".format(name))
+ store_335(name = "{}/d3-color".format(name))
+ store_336(name = "{}/d3-dispatch".format(name))
+ store_337(name = "{}/d3-force".format(name))
+ store_338(name = "{}/d3-format".format(name))
+ store_339(name = "{}/d3-geo-projection".format(name))
+ store_340(name = "{}/d3-geo".format(name))
+ store_341(name = "{}/d3-hierarchy".format(name))
+ store_342(name = "{}/d3-interpolate".format(name))
+ store_343(name = "{}/d3-path".format(name))
+ store_344(name = "{}/d3-quadtree".format(name))
+ store_345(name = "{}/d3-shape".format(name))
+ store_346(name = "{}/d3-time-format".format(name))
+ store_347(name = "{}/d3-time".format(name))
+ store_348(name = "{}/d3-timer".format(name))
+ store_349(name = "{}/d".format(name))
+ store_350(name = "{}/dashdash".format(name))
+ store_351(name = "{}/date.js".format(name))
+ store_352(name = "{}/debug".format(name))
+ store_353(name = "{}/debug".format(name))
+ store_354(name = "{}/debug".format(name))
+ store_355(name = "{}/debug".format(name))
+ store_356(name = "{}/debug".format(name))
+ store_357(name = "{}/decamelize".format(name))
+ store_358(name = "{}/decimal.js".format(name))
+ store_359(name = "{}/decompress-response".format(name))
+ store_360(name = "{}/deep-extend".format(name))
+ store_361(name = "{}/deep-is".format(name))
+ store_362(name = "{}/deep-object-diff".format(name))
+ store_363(name = "{}/deepmerge".format(name))
+ store_364(name = "{}/defer-to-connect".format(name))
+ store_365(name = "{}/defined".format(name))
+ store_366(name = "{}/delayed-stream".format(name))
+ store_367(name = "{}/delegates".format(name))
+ store_368(name = "{}/depd".format(name))
+ store_369(name = "{}/depd".format(name))
+ store_370(name = "{}/dequal".format(name))
+ store_371(name = "{}/detect-kerning".format(name))
+ store_372(name = "{}/detect-libc".format(name))
+ store_373(name = "{}/detect-libc".format(name))
+ store_374(name = "{}/devtools-protocol".format(name))
+ store_375(name = "{}/diff".format(name))
+ store_376(name = "{}/diff".format(name))
+ store_377(name = "{}/draw-svg-path".format(name))
+ store_378(name = "{}/dtype".format(name))
+ store_379(name = "{}/dup".format(name))
+ store_380(name = "{}/duplexer3".format(name))
+ store_381(name = "{}/duplexer".format(name))
+ store_382(name = "{}/duplexify".format(name))
+ store_383(name = "{}/earcut".format(name))
+ store_384(name = "{}/eastasianwidth".format(name))
+ store_385(name = "{}/ecc-jsbn".format(name))
+ store_386(name = "{}/electron-to-chromium".format(name))
+ store_387(name = "{}/element-size".format(name))
+ store_388(name = "{}/elementary-circuits-directed-graph".format(name))
+ store_389(name = "{}/emoji-regex".format(name))
+ store_390(name = "{}/emoji-regex".format(name))
+ store_391(name = "{}/emojis-list".format(name))
+ store_392(name = "{}/encoding".format(name))
+ store_393(name = "{}/end-of-stream".format(name))
+ store_394(name = "{}/enhanced-resolve".format(name))
+ store_395(name = "{}/env-paths".format(name))
+ store_396(name = "{}/envinfo".format(name))
+ store_397(name = "{}/err-code".format(name))
+ store_398(name = "{}/error-ex".format(name))
+ store_399(name = "{}/es-module-lexer".format(name))
+ store_400(name = "{}/es5-ext".format(name))
+ store_401(name = "{}/es6-iterator".format(name))
+ store_402(name = "{}/es6-symbol".format(name))
+ store_403(name = "{}/es6-weak-map".format(name))
+ store_404(name = "{}/esbuild".format(name))
+ store_405(name = "{}/esbuild".format(name))
+ store_406(name = "{}/escalade".format(name))
+ store_407(name = "{}/escape-html".format(name))
+ store_408(name = "{}/escape-latex".format(name))
+ store_409(name = "{}/escape-string-regexp".format(name))
+ store_410(name = "{}/escape-string-regexp".format(name))
+ store_411(name = "{}/escodegen".format(name))
+ store_412(name = "{}/eslint-scope".format(name))
+ store_413(name = "{}/esprima".format(name))
+ store_414(name = "{}/esprima".format(name))
+ store_415(name = "{}/esrecurse".format(name))
+ store_416(name = "{}/estraverse".format(name))
+ store_417(name = "{}/estraverse".format(name))
+ store_418(name = "{}/estree-walker".format(name))
+ store_419(name = "{}/estree-walker".format(name))
+ store_420(name = "{}/esutils".format(name))
+ store_421(name = "{}/eval".format(name))
+ store_422(name = "{}/events".format(name))
+ store_423(name = "{}/ext".format(name))
+ store_424(name = "{}/extend".format(name))
+ store_425(name = "{}/extract-zip".format(name))
+ store_426(name = "{}/extsprintf".format(name))
+ store_427(name = "{}/falafel".format(name))
+ store_428(name = "{}/fast-decode-uri-component".format(name))
+ store_429(name = "{}/fast-deep-equal".format(name))
+ store_430(name = "{}/fast-isnumeric".format(name))
+ store_431(name = "{}/fast-json-stable-stringify".format(name))
+ store_432(name = "{}/fast-levenshtein".format(name))
+ store_433(name = "{}/fastest-levenshtein".format(name))
+ store_434(name = "{}/fd-slicer".format(name))
+ store_435(name = "{}/file-uri-to-path".format(name))
+ store_436(name = "{}/fill-range".format(name))
+ store_437(name = "{}/find-up".format(name))
+ store_438(name = "{}/find-up".format(name))
+ store_439(name = "{}/flat".format(name))
+ store_440(name = "{}/flatten-vertex-data".format(name))
+ store_441(name = "{}/font-atlas".format(name))
+ store_442(name = "{}/font-measure".format(name))
+ store_443(name = "{}/foreground-child".format(name))
+ store_444(name = "{}/foreground-child".format(name))
+ store_445(name = "{}/forever-agent".format(name))
+ store_446(name = "{}/form-data".format(name))
+ store_447(name = "{}/form-data".format(name))
+ store_448(name = "{}/fraction.js".format(name))
+ store_449(name = "{}/from2".format(name))
+ store_450(name = "{}/fs-constants".format(name))
+ store_451(name = "{}/fs-extra".format(name))
+ store_452(name = "{}/fs-extra".format(name))
+ store_453(name = "{}/fs-minipass".format(name))
+ store_454(name = "{}/fs-minipass".format(name))
+ store_455(name = "{}/fs.realpath".format(name))
+ store_456(name = "{}/fsevents".format(name))
+ store_457(name = "{}/function-bind".format(name))
+ store_458(name = "{}/gauge".format(name))
+ store_459(name = "{}/gauge".format(name))
+ store_460(name = "{}/gauge".format(name))
+ store_461(name = "{}/gensync".format(name))
+ store_462(name = "{}/geojson-vt".format(name))
+ store_463(name = "{}/get-caller-file".format(name))
+ store_464(name = "{}/get-canvas-context".format(name))
+ store_465(name = "{}/get-stream".format(name))
+ store_466(name = "{}/get-stream".format(name))
+ store_467(name = "{}/getpass".format(name))
+ store_468(name = "{}/gl-mat4".format(name))
+ store_469(name = "{}/gl-matrix".format(name))
+ store_470(name = "{}/gl-text".format(name))
+ store_471(name = "{}/gl-util".format(name))
+ store_472(name = "{}/glob-parent".format(name))
+ store_473(name = "{}/glob-to-regexp".format(name))
+ store_474(name = "{}/glob".format(name))
+ store_475(name = "{}/glob".format(name))
+ store_476(name = "{}/glob".format(name))
+ store_477(name = "{}/glob".format(name))
+ store_478(name = "{}/glob".format(name))
+ store_479(name = "{}/globals".format(name))
+ store_480(name = "{}/glsl-inject-defines".format(name))
+ store_481(name = "{}/glsl-resolve".format(name))
+ store_482(name = "{}/glsl-token-assignments".format(name))
+ store_483(name = "{}/glsl-token-defines".format(name))
+ store_484(name = "{}/glsl-token-depth".format(name))
+ store_485(name = "{}/glsl-token-descope".format(name))
+ store_486(name = "{}/glsl-token-inject-block".format(name))
+ store_487(name = "{}/glsl-token-properties".format(name))
+ store_488(name = "{}/glsl-token-scope".format(name))
+ store_489(name = "{}/glsl-token-string".format(name))
+ store_490(name = "{}/glsl-token-whitespace-trim".format(name))
+ store_491(name = "{}/glsl-tokenizer".format(name))
+ store_492(name = "{}/glslify-bundle".format(name))
+ store_493(name = "{}/glslify-deps".format(name))
+ store_494(name = "{}/glslify".format(name))
+ store_495(name = "{}/google-protobuf".format(name))
+ store_496(name = "{}/got".format(name))
+ store_497(name = "{}/graceful-fs".format(name))
+ store_498(name = "{}/grid-index".format(name))
+ store_499(name = "{}/gzip-size".format(name))
+ store_500(name = "{}/handlebars-utils".format(name))
+ store_501(name = "{}/har-schema".format(name))
+ store_502(name = "{}/har-validator".format(name))
+ store_503(name = "{}/has-flag".format(name))
+ store_504(name = "{}/has-flag".format(name))
+ store_505(name = "{}/has-hover".format(name))
+ store_506(name = "{}/has-passive-events".format(name))
+ store_507(name = "{}/has-unicode".format(name))
+ store_508(name = "{}/has".format(name))
+ store_509(name = "{}/he".format(name))
+ store_510(name = "{}/hello".format(name))
+ store_511(name = "{}/helper-date".format(name))
+ store_512(name = "{}/hot-shots".format(name))
+ store_513(name = "{}/hsluv".format(name))
+ store_514(name = "{}/html-escaper".format(name))
+ store_515(name = "{}/http-cache-semantics".format(name))
+ store_516(name = "{}/http-errors".format(name))
+ store_517(name = "{}/http-proxy-agent".format(name))
+ store_518(name = "{}/http-signature".format(name))
+ store_519(name = "{}/https-proxy-agent".format(name))
+ store_520(name = "{}/humanize-ms".format(name))
+ store_521(name = "{}/iconv-lite".format(name))
+ store_522(name = "{}/iconv-lite".format(name))
+ store_523(name = "{}/icss-utils".format(name))
+ store_524(name = "{}/ieee754".format(name))
+ store_525(name = "{}/ignore-walk".format(name))
+ store_526(name = "{}/import-fresh".format(name))
+ store_527(name = "{}/import-local".format(name))
+ store_528(name = "{}/imurmurhash".format(name))
+ store_529(name = "{}/indent-string".format(name))
+ store_530(name = "{}/infer-owner".format(name))
+ store_531(name = "{}/inflight".format(name))
+ store_532(name = "{}/inherits".format(name))
+ store_533(name = "{}/ini".format(name))
+ store_534(name = "{}/inline-fixtures".format(name))
+ store_535(name = "{}/inline-fixtures".format(name))
+ store_536(name = "{}/interpret".format(name))
+ store_537(name = "{}/ip".format(name))
+ store_538(name = "{}/is-arrayish".format(name))
+ store_539(name = "{}/is-binary-path".format(name))
+ store_540(name = "{}/is-browser".format(name))
+ store_541(name = "{}/is-buffer".format(name))
+ store_542(name = "{}/is-core-module".format(name))
+ store_543(name = "{}/is-extglob".format(name))
+ store_544(name = "{}/is-finite".format(name))
+ store_545(name = "{}/is-firefox".format(name))
+ store_546(name = "{}/is-fullwidth-code-point".format(name))
+ store_547(name = "{}/is-fullwidth-code-point".format(name))
+ store_548(name = "{}/is-glob".format(name))
+ store_549(name = "{}/is-iexplorer".format(name))
+ store_550(name = "{}/is-lambda".format(name))
+ store_551(name = "{}/is-mobile".format(name))
+ store_552(name = "{}/is-module".format(name))
+ store_553(name = "{}/is-number".format(name))
+ store_554(name = "{}/is-number".format(name))
+ store_555(name = "{}/is-obj".format(name))
+ store_556(name = "{}/is-plain-obj".format(name))
+ store_557(name = "{}/is-plain-obj".format(name))
+ store_558(name = "{}/is-plain-object".format(name))
+ store_559(name = "{}/is-reference".format(name))
+ store_560(name = "{}/is-string-blank".format(name))
+ store_561(name = "{}/is-svg-path".format(name))
+ store_562(name = "{}/is-typedarray".format(name))
+ store_563(name = "{}/is-unicode-supported".format(name))
+ store_564(name = "{}/isarray".format(name))
+ store_565(name = "{}/isarray".format(name))
+ store_566(name = "{}/isarray".format(name))
+ store_567(name = "{}/isexe".format(name))
+ store_568(name = "{}/isobject".format(name))
+ store_569(name = "{}/isomorphic-ws".format(name))
+ store_570(name = "{}/isstream".format(name))
+ store_571(name = "{}/istanbul-lib-coverage".format(name))
+ store_572(name = "{}/istanbul-lib-report".format(name))
+ store_573(name = "{}/istanbul-reports".format(name))
+ store_574(name = "{}/jackspeak".format(name))
+ store_575(name = "{}/jackspeak".format(name))
+ store_576(name = "{}/jasmine-core".format(name))
+ store_577(name = "{}/jasmine".format(name))
+ store_578(name = "{}/javascript-natural-sort".format(name))
+ store_579(name = "{}/javascript-stringify".format(name))
+ store_580(name = "{}/jest-worker".format(name))
+ store_581(name = "{}/jose".format(name))
+ store_582(name = "{}/js-tokens".format(name))
+ store_583(name = "{}/js-yaml".format(name))
+ store_584(name = "{}/jsbn".format(name))
+ store_585(name = "{}/jsep".format(name))
+ store_586(name = "{}/jsesc".format(name))
+ store_587(name = "{}/json-buffer".format(name))
+ store_588(name = "{}/json-parse-even-better-errors".format(name))
+ store_589(name = "{}/json-schema-traverse".format(name))
+ store_590(name = "{}/json-schema-traverse".format(name))
+ store_591(name = "{}/json-schema".format(name))
+ store_592(name = "{}/json-stable-stringify".format(name))
+ store_593(name = "{}/json-stringify-safe".format(name))
+ store_594(name = "{}/json5".format(name))
+ store_595(name = "{}/jsonc-parser".format(name))
+ store_596(name = "{}/jsonfile".format(name))
+ store_597(name = "{}/jsonfile".format(name))
+ store_598(name = "{}/jsonpath-plus".format(name))
+ store_599(name = "{}/jsonpath-plus".format(name))
+ store_600(name = "{}/jsprim".format(name))
+ store_601(name = "{}/kdbush".format(name))
+ store_602(name = "{}/keyv".format(name))
+ store_603(name = "{}/kind-of".format(name))
+ store_604(name = "{}/kind-of".format(name))
+ store_605(name = "{}/kleur".format(name))
+ store_606(name = "{}/levn".format(name))
+ store_607(name = "{}/lines-and-columns".format(name))
+ store_608(name = "{}/loader-runner".format(name))
+ store_609(name = "{}/loader-utils".format(name))
+ store_610(name = "{}/locate-path".format(name))
+ store_611(name = "{}/locate-path".format(name))
+ store_612(name = "{}/lodash.merge".format(name))
+ store_613(name = "{}/lodash".format(name))
+ store_614(name = "{}/log-symbols".format(name))
+ store_615(name = "{}/loose-envify".format(name))
+ store_616(name = "{}/lowercase-keys".format(name))
+ store_617(name = "{}/lru-cache".format(name))
+ store_618(name = "{}/lru-cache".format(name))
+ store_619(name = "{}/lru-cache".format(name))
+ store_620(name = "{}/lru-cache".format(name))
+ store_621(name = "{}/magic-string".format(name))
+ store_622(name = "{}/magic-string".format(name))
+ store_623(name = "{}/make-dir".format(name))
+ store_624(name = "{}/make-dir".format(name))
+ store_625(name = "{}/make-fetch-happen".format(name))
+ store_626(name = "{}/map-limit".format(name))
+ store_627(name = "{}/mapbox-gl".format(name))
+ store_628(name = "{}/math-log2".format(name))
+ store_629(name = "{}/mathjs".format(name))
+ store_630(name = "{}/md5".format(name))
+ store_631(name = "{}/meaning-of-life".format(name))
+ store_632(name = "{}/media-query-parser".format(name))
+ store_633(name = "{}/merge-stream".format(name))
+ store_634(name = "{}/mime-db".format(name))
+ store_635(name = "{}/mime-types".format(name))
+ store_636(name = "{}/mime".format(name))
+ store_637(name = "{}/mimic-response".format(name))
+ store_638(name = "{}/mimic-response".format(name))
+ store_639(name = "{}/mini-css-extract-plugin".format(name))
+ store_640(name = "{}/minimatch".format(name))
+ store_641(name = "{}/minimatch".format(name))
+ store_642(name = "{}/minimatch".format(name))
+ store_643(name = "{}/minimatch".format(name))
+ store_644(name = "{}/minimatch".format(name))
+ store_645(name = "{}/minimatch".format(name))
+ store_646(name = "{}/minimist".format(name))
+ store_647(name = "{}/minimist".format(name))
+ store_648(name = "{}/minipass-collect".format(name))
+ store_649(name = "{}/minipass-fetch".format(name))
+ store_650(name = "{}/minipass-flush".format(name))
+ store_651(name = "{}/minipass-pipeline".format(name))
+ store_652(name = "{}/minipass-sized".format(name))
+ store_653(name = "{}/minipass".format(name))
+ store_654(name = "{}/minipass".format(name))
+ store_655(name = "{}/minipass".format(name))
+ store_656(name = "{}/minipass".format(name))
+ store_657(name = "{}/minipass".format(name))
+ store_658(name = "{}/minizlib".format(name))
+ store_659(name = "{}/minizlib".format(name))
+ store_660(name = "{}/minizlib".format(name))
+ store_661(name = "{}/mitt".format(name))
+ store_662(name = "{}/mkdirp-classic".format(name))
+ store_663(name = "{}/mkdirp".format(name))
+ store_664(name = "{}/mkdirp".format(name))
+ store_665(name = "{}/mkdirp".format(name))
+ store_666(name = "{}/mlly".format(name))
+ store_667(name = "{}/mobx-react-lite".format(name))
+ store_668(name = "{}/mobx-react".format(name))
+ store_669(name = "{}/mobx".format(name))
+ store_670(name = "{}/mocha-junit-reporter".format(name))
+ store_671(name = "{}/mocha-multi-reporters".format(name))
+ store_672(name = "{}/mocha".format(name))
+ store_673(name = "{}/moment-timezone".format(name))
+ store_674(name = "{}/moment".format(name))
+ store_675(name = "{}/mouse-change".format(name))
+ store_676(name = "{}/mouse-event-offset".format(name))
+ store_677(name = "{}/mouse-event".format(name))
+ store_678(name = "{}/mouse-wheel".format(name))
+ store_679(name = "{}/mri".format(name))
+ store_680(name = "{}/mrmime".format(name))
+ store_681(name = "{}/ms".format(name))
+ store_682(name = "{}/ms".format(name))
+ store_683(name = "{}/ms".format(name))
+ store_684(name = "{}/ms".format(name))
+ store_685(name = "{}/mumath".format(name))
+ store_686(name = "{}/murmurhash-js".format(name))
+ store_687(name = "{}/nan".format(name))
+ store_688(name = "{}/nanoid".format(name))
+ store_689(name = "{}/nanoid".format(name))
+ store_690(name = "{}/native-promise-only".format(name))
+ store_691(name = "{}/needle".format(name))
+ store_692(name = "{}/negotiator".format(name))
+ store_693(name = "{}/neo-async".format(name))
+ store_694(name = "{}/next-tick".format(name))
+ store_695(name = "{}/node-fetch".format(name))
+ store_696(name = "{}/node-fetch".format(name))
+ store_697(name = "{}/node-gyp-build".format(name))
+ store_698(name = "{}/node-gyp".format(name))
+ store_699(name = "{}/node-gyp".format(name))
+ store_700(name = "{}/node-pre-gyp".format(name))
+ store_701(name = "{}/node-releases".format(name))
+ store_702(name = "{}/nopt".format(name))
+ store_703(name = "{}/nopt".format(name))
+ store_704(name = "{}/nopt".format(name))
+ store_705(name = "{}/normalize-path".format(name))
+ store_706(name = "{}/normalize-svg-path".format(name))
+ store_707(name = "{}/normalize-svg-path".format(name))
+ store_708(name = "{}/normalize-url".format(name))
+ store_709(name = "{}/npm-bundled".format(name))
+ store_710(name = "{}/npm-normalize-package-bin".format(name))
+ store_711(name = "{}/npm-packlist".format(name))
+ store_712(name = "{}/npmlog".format(name))
+ store_713(name = "{}/npmlog".format(name))
+ store_714(name = "{}/npmlog".format(name))
+ store_715(name = "{}/number-is-integer".format(name))
+ store_716(name = "{}/number-is-nan".format(name))
+ store_717(name = "{}/oauth-sign".format(name))
+ store_718(name = "{}/object-assign".format(name))
+ store_719(name = "{}/object-hash".format(name))
+ store_720(name = "{}/oidc-token-hash".format(name))
+ store_721(name = "{}/once".format(name))
+ store_722(name = "{}/once".format(name))
+ store_723(name = "{}/opener".format(name))
+ store_724(name = "{}/openid-client".format(name))
+ store_725(name = "{}/optimist".format(name))
+ store_726(name = "{}/optionator".format(name))
+ store_727(name = "{}/os-homedir".format(name))
+ store_728(name = "{}/os-tmpdir".format(name))
+ store_729(name = "{}/osenv".format(name))
+ store_730(name = "{}/outdent".format(name))
+ store_731(name = "{}/p-cancelable".format(name))
+ store_732(name = "{}/p-event".format(name))
+ store_733(name = "{}/p-finally".format(name))
+ store_734(name = "{}/p-limit".format(name))
+ store_735(name = "{}/p-limit".format(name))
+ store_736(name = "{}/p-locate".format(name))
+ store_737(name = "{}/p-locate".format(name))
+ store_738(name = "{}/p-map".format(name))
+ store_739(name = "{}/p-timeout".format(name))
+ store_740(name = "{}/p-try".format(name))
+ store_741(name = "{}/package-json-from-dist".format(name))
+ store_742(name = "{}/parent-module".format(name))
+ store_743(name = "{}/parenthesis".format(name))
+ store_744(name = "{}/parse-json".format(name))
+ store_745(name = "{}/parse-rect".format(name))
+ store_746(name = "{}/parse-svg-path".format(name))
+ store_747(name = "{}/parse-unit".format(name))
+ store_748(name = "{}/path-exists".format(name))
+ store_749(name = "{}/path-is-absolute".format(name))
+ store_750(name = "{}/path-key".format(name))
+ store_751(name = "{}/path-parse".format(name))
+ store_752(name = "{}/path-scurry".format(name))
+ store_753(name = "{}/path-scurry".format(name))
+ store_754(name = "{}/path-type".format(name))
+ store_755(name = "{}/pathe".format(name))
+ store_756(name = "{}/pbf".format(name))
+ store_757(name = "{}/pend".format(name))
+ store_758(name = "{}/performance-now".format(name))
+ store_759(name = "{}/pick-by-alias".format(name))
+ store_760(name = "{}/picocolors".format(name))
+ store_761(name = "{}/picomatch".format(name))
+ store_762(name = "{}/pify".format(name))
+ store_763(name = "{}/pkg-dir".format(name))
+ store_764(name = "{}/pkg-types".format(name))
+ store_765(name = "{}/plotly.js".format(name))
+ store_766(name = "{}/pngjs".format(name))
+ store_767(name = "{}/point-in-polygon".format(name))
+ store_768(name = "{}/polybooljs".format(name))
+ store_769(name = "{}/postcss-modules-extract-imports".format(name))
+ store_770(name = "{}/postcss-modules-local-by-default".format(name))
+ store_771(name = "{}/postcss-modules-scope".format(name))
+ store_772(name = "{}/postcss-modules-values".format(name))
+ store_773(name = "{}/postcss-selector-parser".format(name))
+ store_774(name = "{}/postcss-value-parser".format(name))
+ store_775(name = "{}/postcss".format(name))
+ store_776(name = "{}/potpack".format(name))
+ store_777(name = "{}/prelude-ls".format(name))
+ store_778(name = "{}/probe-image-size".format(name))
+ store_779(name = "{}/process-nextick-args".format(name))
+ store_780(name = "{}/progress".format(name))
+ store_781(name = "{}/promise-inflight".format(name))
+ store_782(name = "{}/promise-retry".format(name))
+ store_783(name = "{}/protoc-gen-grpc".format(name))
+ store_784(name = "{}/protocol-buffers-schema".format(name))
+ store_785(name = "{}/proxy-from-env".format(name))
+ store_786(name = "{}/psl".format(name))
+ store_787(name = "{}/pump".format(name))
+ store_788(name = "{}/pump".format(name))
+ store_789(name = "{}/punycode".format(name))
+ store_790(name = "{}/puppeteer-core".format(name))
+ store_791(name = "{}/puppeteer".format(name))
+ store_792(name = "{}/qs".format(name))
+ store_793(name = "{}/quickselect".format(name))
+ store_794(name = "{}/raf".format(name))
+ store_795(name = "{}/ramda".format(name))
+ store_796(name = "{}/randombytes".format(name))
+ store_797(name = "{}/rc".format(name))
+ store_798(name = "{}/react".format(name))
+ store_799(name = "{}/read-yaml-file".format(name))
+ store_800(name = "{}/readable-stream".format(name))
+ store_801(name = "{}/readable-stream".format(name))
+ store_802(name = "{}/readable-stream".format(name))
+ store_803(name = "{}/readdirp".format(name))
+ store_804(name = "{}/rechoir".format(name))
+ store_805(name = "{}/regenerator-runtime".format(name))
+ store_806(name = "{}/regl-error2d".format(name))
+ store_807(name = "{}/regl-line2d".format(name))
+ store_808(name = "{}/regl-scatter2d".format(name))
+ store_809(name = "{}/regl-splom".format(name))
+ store_810(name = "{}/regl".format(name))
+ store_811(name = "{}/request".format(name))
+ store_812(name = "{}/require-directory".format(name))
+ store_813(name = "{}/require-from-string".format(name))
+ store_814(name = "{}/require-like".format(name))
+ store_815(name = "{}/resolve-cwd".format(name))
+ store_816(name = "{}/resolve-from".format(name))
+ store_817(name = "{}/resolve-from".format(name))
+ store_818(name = "{}/resolve-protobuf-schema".format(name))
+ store_819(name = "{}/resolve".format(name))
+ store_820(name = "{}/resolve".format(name))
+ store_821(name = "{}/responselike".format(name))
+ store_822(name = "{}/retry".format(name))
+ store_823(name = "{}/rfc4648".format(name))
+ store_824(name = "{}/right-now".format(name))
+ store_825(name = "{}/rimraf".format(name))
+ store_826(name = "{}/rimraf".format(name))
+ store_827(name = "{}/rimraf".format(name))
+ store_828(name = "{}/rollup".format(name))
+ store_829(name = "{}/rollup".format(name))
+ store_830(name = "{}/rollup".format(name))
+ store_831(name = "{}/rw".format(name))
+ store_832(name = "{}/sade".format(name))
+ store_833(name = "{}/safe-buffer".format(name))
+ store_834(name = "{}/safe-buffer".format(name))
+ store_835(name = "{}/safer-buffer".format(name))
+ store_836(name = "{}/sax".format(name))
+ store_837(name = "{}/schema-utils".format(name))
+ store_838(name = "{}/schema-utils".format(name))
+ store_839(name = "{}/seedrandom".format(name))
+ store_840(name = "{}/segfault-handler".format(name))
+ store_841(name = "{}/semver-first-satisfied".format(name))
+ store_842(name = "{}/semver".format(name))
+ store_843(name = "{}/semver".format(name))
+ store_844(name = "{}/semver".format(name))
+ store_845(name = "{}/semver".format(name))
+ store_846(name = "{}/serialize-javascript".format(name))
+ store_847(name = "{}/serialize-javascript".format(name))
+ store_848(name = "{}/set-blocking".format(name))
+ store_849(name = "{}/setprototypeof".format(name))
+ store_850(name = "{}/shallow-clone".format(name))
+ store_851(name = "{}/shallow-copy".format(name))
+ store_852(name = "{}/shebang-command".format(name))
+ store_853(name = "{}/shebang-regex".format(name))
+ store_854(name = "{}/signal-exit".format(name))
+ store_855(name = "{}/signal-exit".format(name))
+ store_856(name = "{}/signum".format(name))
+ store_857(name = "{}/sirv".format(name))
+ store_858(name = "{}/smart-buffer".format(name))
+ store_859(name = "{}/smob".format(name))
+ store_860(name = "{}/socks-proxy-agent".format(name))
+ store_861(name = "{}/socks".format(name))
+ store_862(name = "{}/source-map-js".format(name))
+ store_863(name = "{}/source-map-support".format(name))
+ store_864(name = "{}/source-map".format(name))
+ store_865(name = "{}/sourcemap-codec".format(name))
+ store_866(name = "{}/sshpk".format(name))
+ store_867(name = "{}/ssri".format(name))
+ store_868(name = "{}/stack-trace".format(name))
+ store_869(name = "{}/static-eval".format(name))
+ store_870(name = "{}/statuses".format(name))
+ store_871(name = "{}/stream-buffers".format(name))
+ store_872(name = "{}/stream-parser".format(name))
+ store_873(name = "{}/stream-shift".format(name))
+ store_874(name = "{}/string-split-by".format(name))
+ store_875(name = "{}/string-width".format(name))
+ store_876(name = "{}/string-width".format(name))
+ store_877(name = "{}/string-width".format(name))
+ store_878(name = "{}/string_decoder".format(name))
+ store_879(name = "{}/string_decoder".format(name))
+ store_880(name = "{}/string_decoder".format(name))
+ store_881(name = "{}/strip-ansi".format(name))
+ store_882(name = "{}/strip-ansi".format(name))
+ store_883(name = "{}/strip-ansi".format(name))
+ store_884(name = "{}/strip-bom".format(name))
+ store_885(name = "{}/strip-json-comments".format(name))
+ store_886(name = "{}/strip-json-comments".format(name))
+ store_887(name = "{}/strongly-connected-components".format(name))
+ store_888(name = "{}/supercluster".format(name))
+ store_889(name = "{}/superscript-text".format(name))
+ store_890(name = "{}/supports-color".format(name))
+ store_891(name = "{}/supports-color".format(name))
+ store_892(name = "{}/supports-color".format(name))
+ store_893(name = "{}/supports-preserve-symlinks-flag".format(name))
+ store_894(name = "{}/svg-arc-to-cubic-bezier".format(name))
+ store_895(name = "{}/svg-path-bounds".format(name))
+ store_896(name = "{}/svg-path-sdf".format(name))
+ store_897(name = "{}/syncpack".format(name))
+ store_898(name = "{}/tapable".format(name))
+ store_899(name = "{}/tar-fs".format(name))
+ store_900(name = "{}/tar-fs".format(name))
+ store_901(name = "{}/tar-stream".format(name))
+ store_902(name = "{}/tar-stream".format(name))
+ store_903(name = "{}/tar".format(name))
+ store_904(name = "{}/tar".format(name))
+ store_905(name = "{}/tar".format(name))
+ store_906(name = "{}/terser-webpack-plugin".format(name))
+ store_907(name = "{}/terser".format(name))
+ store_908(name = "{}/terser".format(name))
+ store_909(name = "{}/test-exclude".format(name))
+ store_910(name = "{}/through2".format(name))
+ store_911(name = "{}/through2".format(name))
+ store_912(name = "{}/through".format(name))
+ store_913(name = "{}/tightrope".format(name))
+ store_914(name = "{}/tiny-emitter".format(name))
+ store_915(name = "{}/tinycolor2".format(name))
+ store_916(name = "{}/tinyqueue".format(name))
+ store_917(name = "{}/tmp".format(name))
+ store_918(name = "{}/to-buffer".format(name))
+ store_919(name = "{}/to-fast-properties".format(name))
+ store_920(name = "{}/to-float32".format(name))
+ store_921(name = "{}/to-px".format(name))
+ store_922(name = "{}/to-readable-stream".format(name))
+ store_923(name = "{}/to-regex-range".format(name))
+ store_924(name = "{}/toidentifier".format(name))
+ store_925(name = "{}/topojson-client".format(name))
+ store_926(name = "{}/totalist".format(name))
+ store_927(name = "{}/tough-cookie".format(name))
+ store_928(name = "{}/tr46".format(name))
+ store_929(name = "{}/tslib".format(name))
+ store_930(name = "{}/tunnel-agent".format(name))
+ store_931(name = "{}/tweetnacl".format(name))
+ store_932(name = "{}/type-check".format(name))
+ store_933(name = "{}/type-fest".format(name))
+ store_934(name = "{}/type".format(name))
+ store_935(name = "{}/type".format(name))
+ store_936(name = "{}/typed-function".format(name))
+ store_937(name = "{}/typedarray-pool".format(name))
+ store_938(name = "{}/typedarray".format(name))
+ store_939(name = "{}/typeof-article".format(name))
+ store_940(name = "{}/typescript".format(name))
+ store_941(name = "{}/ufo".format(name))
+ store_942(name = "{}/unbzip2-stream".format(name))
+ store_943(name = "{}/undici-types".format(name))
+ store_944(name = "{}/undici-types".format(name))
+ store_945(name = "{}/unique-filename".format(name))
+ store_946(name = "{}/unique-slug".format(name))
+ store_947(name = "{}/universalify".format(name))
+ store_948(name = "{}/universalify".format(name))
+ store_949(name = "{}/unix-dgram".format(name))
+ store_950(name = "{}/unquote".format(name))
+ store_951(name = "{}/unused".format(name))
+ store_952(name = "{}/update-browserslist-db".format(name))
+ store_953(name = "{}/update-diff".format(name))
+ store_954(name = "{}/uri-js".format(name))
+ store_955(name = "{}/util-deprecate".format(name))
+ store_956(name = "{}/uuid".format(name))
+ store_957(name = "{}/uuid".format(name))
+ store_958(name = "{}/uvu".format(name))
+ store_959(name = "{}/v8-to-istanbul".format(name))
+ store_960(name = "{}/verror".format(name))
+ store_961(name = "{}/vt-pbf".format(name))
+ store_962(name = "{}/watchpack".format(name))
+ store_963(name = "{}/weak-map".format(name))
+ store_964(name = "{}/webgl-context".format(name))
+ store_965(name = "{}/webidl-conversions".format(name))
+ store_966(name = "{}/webpack-bundle-analyzer".format(name))
+ store_967(name = "{}/webpack-cli".format(name))
+ store_968(name = "{}/webpack-merge".format(name))
+ store_969(name = "{}/webpack-sources".format(name))
+ store_970(name = "{}/webpack".format(name))
+ store_971(name = "{}/whatwg-url".format(name))
+ store_972(name = "{}/which".format(name))
+ store_973(name = "{}/wide-align".format(name))
+ store_974(name = "{}/wildcard".format(name))
+ store_975(name = "{}/word-wrap".format(name))
+ store_976(name = "{}/wordwrap".format(name))
+ store_977(name = "{}/workerpool".format(name))
+ store_978(name = "{}/world-calendars".format(name))
+ store_979(name = "{}/wrap-ansi".format(name))
+ store_980(name = "{}/wrap-ansi".format(name))
+ store_981(name = "{}/wrappy".format(name))
+ store_982(name = "{}/ws".format(name))
+ store_983(name = "{}/ws".format(name))
+ store_984(name = "{}/ws".format(name))
+ store_985(name = "{}/xml".format(name))
+ store_986(name = "{}/xtend".format(name))
+ store_987(name = "{}/xtend".format(name))
+ store_988(name = "{}/y18n".format(name))
+ store_989(name = "{}/yallist".format(name))
+ store_990(name = "{}/yallist".format(name))
+ store_991(name = "{}/yallist".format(name))
+ store_992(name = "{}/yargs-parser".format(name))
+ store_993(name = "{}/yargs-parser".format(name))
+ store_994(name = "{}/yargs-parser".format(name))
+ store_995(name = "{}/yargs-unparser".format(name))
+ store_996(name = "{}/yargs".format(name))
+ store_997(name = "{}/yargs".format(name))
+ store_998(name = "{}/yauzl".format(name))
+ store_999(name = "{}/yocto-queue".format(name))
+ store_1000(name = "{}/zod".format(name))
if link:
if bazel_package == "js/private/worker/src":
- link_2(name = "{}/abortcontroller-polyfill".format(name))
+ link_1(name = "{}/abortcontroller-polyfill".format(name))
link_targets.append(":{}/abortcontroller-polyfill".format(name))
- link_169(name = "{}/@rollup/plugin-commonjs".format(name))
+ link_168(name = "{}/@rollup/plugin-commonjs".format(name))
link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_171(name = "{}/@rollup/plugin-json".format(name))
+ link_170(name = "{}/@rollup/plugin-json".format(name))
link_targets.append(":{}/@rollup/plugin-json".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_173(name = "{}/@rollup/plugin-node-resolve".format(name))
+ link_172(name = "{}/@rollup/plugin-node-resolve".format(name))
link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_175(name = "{}/@rollup/plugin-terser".format(name))
+ link_174(name = "{}/@rollup/plugin-terser".format(name))
link_targets.append(":{}/@rollup/plugin-terser".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_176(name = "{}/@rollup/plugin-typescript".format(name))
+ link_175(name = "{}/@rollup/plugin-typescript".format(name))
link_targets.append(":{}/@rollup/plugin-typescript".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_196(name = "{}/@types/google-protobuf".format(name))
+ link_194(name = "{}/@types/google-protobuf".format(name))
link_targets.append(":{}/@types/google-protobuf".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
- link_204(name = "{}/@types/node".format(name))
+ link_202(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
- link_504(name = "{}/google-protobuf".format(name))
+ link_495(name = "{}/google-protobuf".format(name))
link_targets.append(":{}/google-protobuf".format(name))
- link_842(name = "{}/rollup".format(name))
+ link_829(name = "{}/rollup".format(name))
link_targets.append(":{}/rollup".format(name))
- link_944(name = "{}/tslib".format(name))
+ link_929(name = "{}/tslib".format(name))
link_targets.append(":{}/tslib".format(name))
- link_955(name = "{}/typescript".format(name))
+ link_940(name = "{}/typescript".format(name))
link_targets.append(":{}/typescript".format(name))
elif bazel_package == "js/private/test/image":
- link_7(name = "{}/acorn".format(name))
+ link_6(name = "{}/acorn".format(name))
link_targets.append(":{}/acorn".format(name))
elif bazel_package == "examples/npm_deps":
- link_8(name = "{}/acorn".format(name))
+ link_7(name = "{}/acorn".format(name))
link_targets.append(":{}/acorn".format(name))
- link_43(name = "{}/@aspect-test/a".format(name))
+ link_42(name = "{}/@aspect-test/a".format(name))
link_targets.append(":{}/@aspect-test/a".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_45(name = "{}/@aspect-test/c".format(name))
+ link_44(name = "{}/@aspect-test/c".format(name))
link_targets.append(":{}/@aspect-test/c".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_129(name = "{}/@gregmagolan/test-b".format(name))
+ link_128(name = "{}/@gregmagolan/test-b".format(name))
link_targets.append(":{}/@gregmagolan/test-b".format(name))
if "@gregmagolan" not in scope_targets:
scope_targets["@gregmagolan"] = [link_targets[-1]]
else:
scope_targets["@gregmagolan"].append(link_targets[-1])
- link_168(name = "{}/@rollup/plugin-commonjs".format(name))
+ link_167(name = "{}/@rollup/plugin-commonjs".format(name))
link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_361(name = "{}/debug".format(name))
+ link_354(name = "{}/debug".format(name))
link_targets.append(":{}/debug".format(name))
- link_641(name = "{}/meaning-of-life".format(name))
+ link_631(name = "{}/meaning-of-life".format(name))
link_targets.append(":{}/meaning-of-life".format(name))
- link_678(name = "{}/mobx-react".format(name))
+ link_668(name = "{}/mobx-react".format(name))
link_targets.append(":{}/mobx-react".format(name))
- link_679(name = "{}/mobx".format(name))
+ link_669(name = "{}/mobx".format(name))
link_targets.append(":{}/mobx".format(name))
- link_694(name = "{}/ms".format(name))
+ link_684(name = "{}/ms".format(name))
link_targets.append(":{}/ms".format(name))
- link_810(name = "{}/react".format(name))
+ link_798(name = "{}/react".format(name))
link_targets.append(":{}/react".format(name))
- link_841(name = "{}/rollup".format(name))
+ link_828(name = "{}/rollup".format(name))
link_targets.append(":{}/rollup".format(name))
- link_973(name = "{}/uvu".format(name))
+ link_958(name = "{}/uvu".format(name))
link_targets.append(":{}/uvu".format(name))
elif bazel_package == "examples/npm_package/packages/pkg_a":
- link_8(name = "{}/acorn".format(name))
+ link_7(name = "{}/acorn".format(name))
link_targets.append(":{}/acorn".format(name))
- link_972(name = "{}/uuid".format(name))
+ link_957(name = "{}/uuid".format(name))
link_targets.append(":{}/uuid".format(name))
elif bazel_package == "examples/npm_package/packages/pkg_d":
- link_8(name = "{}/acorn".format(name))
+ link_7(name = "{}/acorn".format(name))
link_targets.append(":{}/acorn".format(name))
- link_972(name = "{}/uuid".format(name))
+ link_957(name = "{}/uuid".format(name))
link_targets.append(":{}/uuid".format(name))
elif bazel_package == "examples/npm_package/packages/pkg_b":
- link_9(name = "{}/acorn".format(name))
+ link_8(name = "{}/acorn".format(name))
link_targets.append(":{}/acorn".format(name))
- link_972(name = "{}/uuid".format(name))
+ link_957(name = "{}/uuid".format(name))
link_targets.append(":{}/uuid".format(name))
elif bazel_package == "examples/linked_lib":
- link_47(name = "{}/@aspect-test/e".format(name))
+ link_46(name = "{}/@aspect-test/e".format(name))
link_targets.append(":{}/@aspect-test/e".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_47(name = "{}/alias-e".format(name))
+ link_46(name = "{}/alias-e".format(name))
link_targets.append(":{}/alias-e".format(name))
- link_48(name = "{}/@aspect-test/f".format(name))
+ link_47(name = "{}/@aspect-test/f".format(name))
link_targets.append(":{}/@aspect-test/f".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_203(name = "{}/@types/node".format(name))
+ link_201(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
elif bazel_package == "examples/linked_pkg":
- link_47(name = "{}/@aspect-test/e".format(name))
+ link_46(name = "{}/@aspect-test/e".format(name))
link_targets.append(":{}/@aspect-test/e".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_47(name = "{}/alias-e".format(name))
+ link_46(name = "{}/alias-e".format(name))
link_targets.append(":{}/alias-e".format(name))
- link_48(name = "{}/@aspect-test/f".format(name))
+ link_47(name = "{}/@aspect-test/f".format(name))
link_targets.append(":{}/@aspect-test/f".format(name))
if "@aspect-test" not in scope_targets:
scope_targets["@aspect-test"] = [link_targets[-1]]
else:
scope_targets["@aspect-test"].append(link_targets[-1])
- link_203(name = "{}/@types/node".format(name))
+ link_201(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
elif bazel_package == "examples/runfiles":
- link_73(name = "{}/@bazel/runfiles".format(name))
+ link_72(name = "{}/@bazel/runfiles".format(name))
link_targets.append(":{}/@bazel/runfiles".format(name))
if "@bazel" not in scope_targets:
scope_targets["@bazel"] = [link_targets[-1]]
else:
scope_targets["@bazel"].append(link_targets[-1])
elif bazel_package == "npm/private/test":
- link_124(name = "{}/@fastify/send".format(name))
+ link_123(name = "{}/@fastify/send".format(name))
link_targets.append(":{}/@fastify/send".format(name))
if "@fastify" not in scope_targets:
scope_targets["@fastify"] = [link_targets[-1]]
else:
scope_targets["@fastify"].append(link_targets[-1])
- link_125(name = "{}/@figma/nodegit".format(name))
+ link_124(name = "{}/@figma/nodegit".format(name))
link_targets.append(":{}/@figma/nodegit".format(name))
if "@figma" not in scope_targets:
scope_targets["@figma"] = [link_targets[-1]]
else:
scope_targets["@figma"].append(link_targets[-1])
- link_146(name = "{}/@kubernetes/client-node".format(name))
+ link_145(name = "{}/@kubernetes/client-node".format(name))
link_targets.append(":{}/@kubernetes/client-node".format(name))
if "@kubernetes" not in scope_targets:
scope_targets["@kubernetes"] = [link_targets[-1]]
else:
scope_targets["@kubernetes"].append(link_targets[-1])
- link_165(name = "{}/@plotly/regl".format(name))
+ link_164(name = "{}/@plotly/regl".format(name))
link_targets.append(":{}/@plotly/regl".format(name))
if "@plotly" not in scope_targets:
scope_targets["@plotly"] = [link_targets[-1]]
else:
scope_targets["@plotly"].append(link_targets[-1])
- link_165(name = "{}/regl".format(name))
+ link_164(name = "{}/regl".format(name))
link_targets.append(":{}/regl".format(name))
- link_269(name = "{}/bufferutil".format(name))
+ link_262(name = "{}/bufferutil".format(name))
link_targets.append(":{}/bufferutil".format(name))
- link_363(name = "{}/debug".format(name))
+ link_356(name = "{}/debug".format(name))
link_targets.append(":{}/debug".format(name))
- link_412(name = "{}/esbuild".format(name))
+ link_405(name = "{}/esbuild".format(name))
link_targets.append(":{}/esbuild".format(name))
- link_519(name = "{}/hello".format(name))
+ link_510(name = "{}/hello".format(name))
link_targets.append(":{}/hello".format(name))
- link_520(name = "{}/handlebars-helpers/helper-date".format(name))
+ link_511(name = "{}/handlebars-helpers/helper-date".format(name))
link_targets.append(":{}/handlebars-helpers/helper-date".format(name))
- link_521(name = "{}/hot-shots".format(name))
+ link_512(name = "{}/hot-shots".format(name))
link_targets.append(":{}/hot-shots".format(name))
- link_544(name = "{}/inline-fixtures".format(name))
+ link_535(name = "{}/inline-fixtures".format(name))
link_targets.append(":{}/inline-fixtures".format(name))
- link_601(name = "{}/json-stable-stringify".format(name))
+ link_592(name = "{}/json-stable-stringify".format(name))
link_targets.append(":{}/json-stable-stringify".format(name))
- link_622(name = "{}/lodash".format(name))
+ link_613(name = "{}/lodash".format(name))
link_targets.append(":{}/lodash".format(name))
- link_709(name = "{}/node-gyp".format(name))
+ link_699(name = "{}/node-gyp".format(name))
link_targets.append(":{}/node-gyp".format(name))
- link_775(name = "{}/plotly.js".format(name))
+ link_765(name = "{}/plotly.js".format(name))
link_targets.append(":{}/plotly.js".format(name))
- link_776(name = "{}/pngjs".format(name))
+ link_766(name = "{}/pngjs".format(name))
link_targets.append(":{}/pngjs".format(name))
- link_794(name = "{}/protoc-gen-grpc".format(name))
+ link_783(name = "{}/protoc-gen-grpc".format(name))
link_targets.append(":{}/protoc-gen-grpc".format(name))
- link_802(name = "{}/puppeteer".format(name))
+ link_791(name = "{}/puppeteer".format(name))
link_targets.append(":{}/puppeteer".format(name))
- link_853(name = "{}/segfault-handler".format(name))
+ link_840(name = "{}/segfault-handler".format(name))
link_targets.append(":{}/segfault-handler".format(name))
- link_854(name = "{}/semver-first-satisfied".format(name))
+ link_841(name = "{}/semver-first-satisfied".format(name))
link_targets.append(":{}/semver-first-satisfied".format(name))
- link_911(name = "{}/syncpack".format(name))
+ link_897(name = "{}/syncpack".format(name))
link_targets.append(":{}/syncpack".format(name))
- link_955(name = "{}/typescript".format(name))
+ link_940(name = "{}/typescript".format(name))
link_targets.append(":{}/typescript".format(name))
- link_966(name = "{}/unused".format(name))
- link_981(name = "{}/webpack-bundle-analyzer".format(name))
+ link_951(name = "{}/unused".format(name))
+ link_966(name = "{}/webpack-bundle-analyzer".format(name))
link_targets.append(":{}/webpack-bundle-analyzer".format(name))
- elif bazel_package == "js/private/image":
- link_169(name = "{}/@rollup/plugin-commonjs".format(name))
- link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
- if "@rollup" not in scope_targets:
- scope_targets["@rollup"] = [link_targets[-1]]
- else:
- scope_targets["@rollup"].append(link_targets[-1])
- link_173(name = "{}/@rollup/plugin-node-resolve".format(name))
- link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
- if "@rollup" not in scope_targets:
- scope_targets["@rollup"] = [link_targets[-1]]
- else:
- scope_targets["@rollup"].append(link_targets[-1])
- link_176(name = "{}/@rollup/plugin-typescript".format(name))
- link_targets.append(":{}/@rollup/plugin-typescript".format(name))
- if "@rollup" not in scope_targets:
- scope_targets["@rollup"] = [link_targets[-1]]
- else:
- scope_targets["@rollup"].append(link_targets[-1])
- link_188(name = "{}/@types/archiver".format(name))
- link_targets.append(":{}/@types/archiver".format(name))
- if "@types" not in scope_targets:
- scope_targets["@types"] = [link_targets[-1]]
- else:
- scope_targets["@types"].append(link_targets[-1])
- link_204(name = "{}/@types/node".format(name))
- link_targets.append(":{}/@types/node".format(name))
- if "@types" not in scope_targets:
- scope_targets["@types"] = [link_targets[-1]]
- else:
- scope_targets["@types"].append(link_targets[-1])
- link_210(name = "{}/@types/tar-stream".format(name))
- link_targets.append(":{}/@types/tar-stream".format(name))
- if "@types" not in scope_targets:
- scope_targets["@types"] = [link_targets[-1]]
- else:
- scope_targets["@types"].append(link_targets[-1])
- link_842(name = "{}/rollup".format(name))
- link_targets.append(":{}/rollup".format(name))
- link_917(name = "{}/tar-stream".format(name))
- link_targets.append(":{}/tar-stream".format(name))
- link_944(name = "{}/tslib".format(name))
- link_targets.append(":{}/tslib".format(name))
- link_955(name = "{}/typescript".format(name))
- link_targets.append(":{}/typescript".format(name))
elif bazel_package == "js/private/coverage/bundle":
- link_170(name = "{}/@rollup/plugin-commonjs".format(name))
+ link_169(name = "{}/@rollup/plugin-commonjs".format(name))
link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_172(name = "{}/@rollup/plugin-json".format(name))
+ link_171(name = "{}/@rollup/plugin-json".format(name))
link_targets.append(":{}/@rollup/plugin-json".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_174(name = "{}/@rollup/plugin-node-resolve".format(name))
+ link_173(name = "{}/@rollup/plugin-node-resolve".format(name))
link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
if "@rollup" not in scope_targets:
scope_targets["@rollup"] = [link_targets[-1]]
else:
scope_targets["@rollup"].append(link_targets[-1])
- link_271(name = "{}/c8".format(name))
+ link_264(name = "{}/c8".format(name))
link_targets.append(":{}/c8".format(name))
- link_843(name = "{}/rollup".format(name))
+ link_830(name = "{}/rollup".format(name))
link_targets.append(":{}/rollup".format(name))
elif bazel_package == "":
- link_202(name = "{}/@types/node".format(name))
+ link_200(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
- link_283(name = "{}/chalk".format(name))
+ link_276(name = "{}/chalk".format(name))
link_targets.append(":{}/chalk".format(name))
- link_543(name = "{}/inline-fixtures".format(name))
+ link_534(name = "{}/inline-fixtures".format(name))
link_targets.append(":{}/inline-fixtures".format(name))
- link_607(name = "{}/jsonpath-plus".format(name))
+ link_598(name = "{}/jsonpath-plus".format(name))
link_targets.append(":{}/jsonpath-plus".format(name))
- link_955(name = "{}/typescript".format(name))
+ link_940(name = "{}/typescript".format(name))
link_targets.append(":{}/typescript".format(name))
elif bazel_package == "js/private/test/js_run_devserver":
- link_202(name = "{}/@types/node".format(name))
+ link_200(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
- link_586(name = "{}/jasmine".format(name))
+ link_577(name = "{}/jasmine".format(name))
link_targets.append(":{}/jasmine".format(name))
elif bazel_package == "examples/js_lib_pkg/a":
- link_204(name = "{}/@types/node".format(name))
+ link_202(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
elif bazel_package == "examples/js_lib_pkg/b":
- link_204(name = "{}/@types/node".format(name))
+ link_202(name = "{}/@types/node".format(name))
link_targets.append(":{}/@types/node".format(name))
if "@types" not in scope_targets:
scope_targets["@types"] = [link_targets[-1]]
else:
scope_targets["@types"].append(link_targets[-1])
elif bazel_package == "examples/webpack_cli":
- link_216(name = "{}/@vanilla-extract/css".format(name))
+ link_212(name = "{}/@vanilla-extract/css".format(name))
link_targets.append(":{}/@vanilla-extract/css".format(name))
if "@vanilla-extract" not in scope_targets:
scope_targets["@vanilla-extract"] = [link_targets[-1]]
else:
scope_targets["@vanilla-extract"].append(link_targets[-1])
- link_220(name = "{}/@vanilla-extract/webpack-plugin".format(name))
+ link_216(name = "{}/@vanilla-extract/webpack-plugin".format(name))
link_targets.append(":{}/@vanilla-extract/webpack-plugin".format(name))
if "@vanilla-extract" not in scope_targets:
scope_targets["@vanilla-extract"] = [link_targets[-1]]
else:
scope_targets["@vanilla-extract"].append(link_targets[-1])
- link_334(name = "{}/css-loader".format(name))
+ link_327(name = "{}/css-loader".format(name))
link_targets.append(":{}/css-loader".format(name))
- link_639(name = "{}/mathjs".format(name))
+ link_629(name = "{}/mathjs".format(name))
link_targets.append(":{}/mathjs".format(name))
- link_649(name = "{}/mini-css-extract-plugin".format(name))
+ link_639(name = "{}/mini-css-extract-plugin".format(name))
link_targets.append(":{}/mini-css-extract-plugin".format(name))
- link_982(name = "{}/webpack-cli".format(name))
+ link_967(name = "{}/webpack-cli".format(name))
link_targets.append(":{}/webpack-cli".format(name))
- link_985(name = "{}/webpack".format(name))
+ link_970(name = "{}/webpack".format(name))
link_targets.append(":{}/webpack".format(name))
elif bazel_package == "examples/npm_package/libs/lib_a":
- link_282(name = "{}/chalk".format(name))
+ link_275(name = "{}/chalk".format(name))
link_targets.append(":{}/chalk".format(name))
elif bazel_package == "npm/private/test/npm_package":
- link_282(name = "{}/chalk".format(name))
+ link_275(name = "{}/chalk".format(name))
link_targets.append(":{}/chalk".format(name))
- link_283(name = "{}/chalk-alt".format(name))
+ link_276(name = "{}/chalk-alt".format(name))
link_targets.append(":{}/chalk-alt".format(name))
elif bazel_package == "examples/macro":
- link_680(name = "{}/mocha-junit-reporter".format(name))
+ link_670(name = "{}/mocha-junit-reporter".format(name))
link_targets.append(":{}/mocha-junit-reporter".format(name))
- link_681(name = "{}/mocha-multi-reporters".format(name))
+ link_671(name = "{}/mocha-multi-reporters".format(name))
link_targets.append(":{}/mocha-multi-reporters".format(name))
- link_682(name = "{}/mocha".format(name))
+ link_672(name = "{}/mocha".format(name))
link_targets.append(":{}/mocha".format(name))
elif bazel_package == "examples/stack_traces":
- link_876(name = "{}/source-map-support".format(name))
+ link_863(name = "{}/source-map-support".format(name))
link_targets.append(":{}/source-map-support".format(name))
if is_root:
@@ -2815,17 +2740,6 @@ def npm_link_targets(name = "node_modules", package = None):
link_targets.append(":{}/syncpack".format(name))
link_targets.append(":{}/typescript".format(name))
link_targets.append(":{}/webpack-bundle-analyzer".format(name))
- elif bazel_package == "js/private/image":
- link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
- link_targets.append(":{}/@rollup/plugin-node-resolve".format(name))
- link_targets.append(":{}/@rollup/plugin-typescript".format(name))
- link_targets.append(":{}/@types/archiver".format(name))
- link_targets.append(":{}/@types/node".format(name))
- link_targets.append(":{}/@types/tar-stream".format(name))
- link_targets.append(":{}/rollup".format(name))
- link_targets.append(":{}/tar-stream".format(name))
- link_targets.append(":{}/tslib".format(name))
- link_targets.append(":{}/typescript".format(name))
elif bazel_package == "js/private/coverage/bundle":
link_targets.append(":{}/@rollup/plugin-commonjs".format(name))
link_targets.append(":{}/@rollup/plugin-json".format(name))
diff --git a/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl b/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl
index 05fcc7787..e5943e6ff 100644
--- a/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl
+++ b/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@_main~npm~npm__rollup__2.70.2//:pkg",
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@_main~npm~npm__rollup__2.70.2//:pkg",
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl b/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl
index 98b5bf225..6d0ac704d 100644
--- a/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl
+++ b/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl
@@ -39,7 +39,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -50,7 +49,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@_main~npm~npm__unused__0.2.2//:pkg",
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -62,7 +60,6 @@ def npm_imported_package_store(name):
src = None if True else "@@_main~npm~npm__unused__0.2.2//:pkg",
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl b/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl
index 19008a474..02f46ce6d 100644
--- a/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl
+++ b/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl
@@ -36,7 +36,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -47,7 +46,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if True else "@@npm__fsevents__2.3.2//:pkg",
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -59,7 +57,6 @@ def npm_imported_package_store(name):
src = None if True else "@@npm__fsevents__2.3.2//:pkg",
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
@@ -85,7 +82,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc_lite".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -96,7 +92,6 @@ def npm_imported_package_store(name):
name = "{}/pkg_pre_lc".format(store_target_name),
package = "fsevents",
version = "2.3.2",
- exclude_package_contents = [],
dev = True,
deps = lc_deps,
tags = ["manual"],
diff --git a/npm/private/test/snapshots/wksp/rollup_links_defs.bzl b/npm/private/test/snapshots/wksp/rollup_links_defs.bzl
index 553dfa436..75c09880b 100644
--- a/npm/private/test/snapshots/wksp/rollup_links_defs.bzl
+++ b/npm/private/test/snapshots/wksp/rollup_links_defs.bzl
@@ -35,7 +35,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -46,7 +45,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@npm__rollup__2.70.2//:pkg",
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -58,7 +56,6 @@ def npm_imported_package_store(name):
src = None if True else "@@npm__rollup__2.70.2//:pkg",
package = "rollup",
version = "2.70.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/npm/private/test/snapshots/wksp/unused_links_defs.bzl b/npm/private/test/snapshots/wksp/unused_links_defs.bzl
index bec8dcc16..da468e8a1 100644
--- a/npm/private/test/snapshots/wksp/unused_links_defs.bzl
+++ b/npm/private/test/snapshots/wksp/unused_links_defs.bzl
@@ -39,7 +39,6 @@ def npm_imported_package_store(name):
name = "{}/ref".format(store_target_name),
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
tags = ["manual"],
)
@@ -50,7 +49,6 @@ def npm_imported_package_store(name):
src = "{}/pkg_lc".format(store_target_name) if False else "@@npm__unused__0.2.2//:pkg",
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
deps = ref_deps,
tags = ["manual"],
@@ -62,7 +60,6 @@ def npm_imported_package_store(name):
src = None if True else "@@npm__unused__0.2.2//:pkg",
package = "unused",
version = "0.2.2",
- exclude_package_contents = [],
dev = True,
deps = deps,
visibility = ["//visibility:public"],
diff --git a/npm/private/test/translate_lock_helpers_tests.bzl b/npm/private/test/translate_lock_helpers_tests.bzl
index 76f446507..b7abc44d4 100644
--- a/npm/private/test/translate_lock_helpers_tests.bzl
+++ b/npm/private/test/translate_lock_helpers_tests.bzl
@@ -65,5 +65,76 @@ def test_verify_ignores_in_subdir(ctx):
t0_test = unittest.make(test_verify_ignores_in_root)
t1_test = unittest.make(test_verify_ignores_in_subdir)
+# buildifier: disable=function-docstring
+def test_verify_gather_package_content_works_with_simple_name(ctx):
+ env = unittest.begin(ctx)
+ actual = helpers_testonly.gather_package_content_excludes(
+ {
+ "packageA": ["pattern1", "pattern2"],
+ },
+ "packageA",
+ )
+ expected = ["pattern1", "pattern2"]
+ asserts.equals(env, expected, actual)
+ return unittest.end(env)
+
+# buildifier: disable=function-docstring
+def test_verify_gather_package_content_works_with_star_pattern(ctx):
+ env = unittest.begin(ctx)
+ actual = helpers_testonly.gather_package_content_excludes(
+ {
+ "*": ["pattern1", "pattern2"],
+ },
+ "packageA",
+ )
+ expected = ["pattern1", "pattern2"]
+ asserts.equals(env, expected, actual)
+ return unittest.end(env)
+
+# buildifier: disable=function-docstring
+def test_verify_gather_package_content_works_with_simple_name_and_single_pattern(ctx):
+ env = unittest.begin(ctx)
+ actual = helpers_testonly.gather_package_content_excludes(
+ {
+ "packageA": "pattern1",
+ },
+ "packageA",
+ )
+ expected = ["pattern1"]
+ asserts.equals(env, expected, actual)
+ return unittest.end(env)
+
+# buildifier: disable=function-docstring
+def test_verify_gather_package_content_works_with_star_pattern_and_only_one_exclude_pattern(ctx):
+ env = unittest.begin(ctx)
+ actual = helpers_testonly.gather_package_content_excludes(
+ {
+ "*": "pattern1",
+ },
+ "packageA",
+ )
+ expected = ["pattern1"]
+ asserts.equals(env, expected, actual)
+ return unittest.end(env)
+
+# buildifier: disable=function-docstring
+def test_verify_gather_package_content_returns_none_when_no_matches(ctx):
+ env = unittest.begin(ctx)
+ actual = helpers_testonly.gather_package_content_excludes(
+ {
+ "packageB": "pattern1",
+ },
+ "packageA",
+ )
+ expected = None
+ asserts.equals(env, expected, actual)
+ return unittest.end(env)
+
+t2_test = unittest.make(test_verify_gather_package_content_works_with_simple_name)
+t3_test = unittest.make(test_verify_gather_package_content_works_with_star_pattern)
+t4_test = unittest.make(test_verify_gather_package_content_works_with_simple_name_and_single_pattern)
+t5_test = unittest.make(test_verify_gather_package_content_works_with_star_pattern_and_only_one_exclude_pattern)
+t6_test = unittest.make(test_verify_gather_package_content_returns_none_when_no_matches)
+
def translate_lock_helpers_tests(name):
- unittest.suite(name, t0_test, t1_test)
+ unittest.suite(name, t0_test, t1_test, t2_test, t3_test, t4_test, t5_test, t6_test)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 07108d13d..c0b976222 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -256,40 +256,6 @@ importers:
specifier: 3.29.5
version: 3.29.5
- js/private/image:
- dependencies:
- tar-stream:
- specifier: 3.0.0
- version: 3.0.0
- devDependencies:
- '@rollup/plugin-commonjs':
- specifier: 23.0.7
- version: 23.0.7(rollup@2.79.2)
- '@rollup/plugin-node-resolve':
- specifier: 15.3.0
- version: 15.3.0(rollup@2.79.2)
- '@rollup/plugin-typescript':
- specifier: 10.0.1
- version: 10.0.1(rollup@2.79.2)(tslib@2.7.0)(typescript@4.9.5)
- '@types/archiver':
- specifier: 5.3.4
- version: 5.3.4
- '@types/node':
- specifier: 18.19.54
- version: 18.19.54
- '@types/tar-stream':
- specifier: 2.2.3
- version: 2.2.3
- rollup:
- specifier: 2.79.2
- version: 2.79.2
- tslib:
- specifier: 2.7.0
- version: 2.7.0
- typescript:
- specifier: 4.9.5
- version: 4.9.5
-
js/private/test/image:
dependencies:
'@mycorp/pkg-a':
@@ -1696,12 +1662,6 @@ packages:
'@turf/helpers': 6.5.0
dev: true
- /@types/archiver@5.3.4:
- resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==, tarball: https://registry.npmjs.org/@types/archiver/-/archiver-5.3.4.tgz}
- dependencies:
- '@types/readdir-glob': 1.1.5
- dev: true
-
/@types/estree@1.0.0:
resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz}
@@ -1722,22 +1682,10 @@ packages:
undici-types: 5.26.5
dev: true
- /@types/readdir-glob@1.1.5:
- resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==, tarball: https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz}
- dependencies:
- '@types/node': registry.npmjs.org/@types/node@18.19.54
- dev: true
-
/@types/resolve@1.20.2:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, tarball: https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz}
dev: true
- /@types/tar-stream@2.2.3:
- resolution: {integrity: sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==, tarball: https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.3.tgz}
- dependencies:
- '@types/node': registry.npmjs.org/@types/node@18.19.54
- dev: true
-
/@vanilla-extract/babel-plugin-debug-ids@1.0.1:
resolution: {integrity: sha512-ynyKqsJiMzM1/yiIJ6QdqpWKlK4IMJJWREpPtaemZrE1xG1B4E/Nfa6YazuDWjDkCJC1tRIpEGnVs+pMIjUxyw==}
dependencies:
@@ -1948,13 +1896,6 @@ packages:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
dev: true
- /abort-controller@3.0.0:
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
- engines: {node: '>=6.5'}
- dependencies:
- event-target-shim: 5.0.1
- dev: false
-
/abortcontroller-polyfill@1.7.5:
resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==}
dev: true
@@ -2201,15 +2142,12 @@ packages:
resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
dev: true
- /b4a@1.6.1:
- resolution: {integrity: sha512-AsKjNhz72yxteo/0EtQEiwkMUgk/tGmycXlbG4g3Ard2/ULtNLUykGOkeK0egmN27h0xMAhb76jYccW+XTBExA==}
- dev: false
-
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
/base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
/bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
@@ -2266,14 +2204,6 @@ packages:
readable-stream: 3.6.1
dev: true
- /bl@6.0.0:
- resolution: {integrity: sha512-Ik9BVIMdcWzSOCpzDv2XpQ4rJ4oZBuk3ck6MgiOv0EopdgtohN2uSCrrLlkH1Jf0KnpZZMBA3D0bUMbCdj/jgA==}
- dependencies:
- buffer: 6.0.3
- inherits: 2.0.4
- readable-stream: 4.3.0
- dev: false
-
/brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@@ -2335,13 +2265,6 @@ packages:
ieee754: 1.2.1
dev: true
- /buffer@6.0.3:
- resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
- dev: false
-
/bufferutil@4.0.8:
resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==}
engines: {node: '>=6.14.2'}
@@ -3339,11 +3262,6 @@ packages:
require-like: 0.1.2
dev: true
- /event-target-shim@5.0.1:
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
- engines: {node: '>=6'}
- dev: false
-
/events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
@@ -3392,10 +3310,6 @@ packages:
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- /fast-fifo@1.1.0:
- resolution: {integrity: sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==}
- dev: false
-
/fast-isnumeric@1.1.4:
resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==}
dependencies:
@@ -4064,6 +3978,7 @@ packages:
/ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
/ignore-walk@3.0.4:
resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
@@ -4557,14 +4472,8 @@ packages:
engines: {node: '>=8'}
dev: true
- /lru-cache@10.0.1:
- resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==}
- engines: {node: 14 || >=16.14}
- dev: false
-
/lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
- dev: true
/lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -5532,7 +5441,7 @@ packages:
resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
- lru-cache: 10.0.1
+ lru-cache: 10.4.3
minipass: 7.0.3
dev: false
@@ -5754,11 +5663,6 @@ packages:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
- /process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
- dev: false
-
/progress@2.0.3:
resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
engines: {node: '>=0.4.0'}
@@ -5863,10 +5767,6 @@ packages:
engines: {node: '>=0.6'}
dev: true
- /queue-tick@1.0.1:
- resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
- dev: false
-
/quickselect@2.0.0:
resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
dev: true
@@ -5942,16 +5842,6 @@ packages:
util-deprecate: 1.0.2
dev: true
- /readable-stream@4.3.0:
- resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- abort-controller: 3.0.0
- buffer: 6.0.3
- events: 3.3.0
- process: 0.11.10
- dev: false
-
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -6424,13 +6314,6 @@ packages:
resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==}
dev: true
- /streamx@2.13.2:
- resolution: {integrity: sha512-+TWqixPhGDXEG9L/XczSbhfkmwAtGs3BJX5QNU6cvno+pOLKeszByWcnaTu6dg8efsTYqR8ZZuXWHhZfgrxMvA==}
- dependencies:
- fast-fifo: 1.1.0
- queue-tick: 1.0.1
- dev: false
-
/string-split-by@1.0.0:
resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==}
dependencies:
@@ -6618,14 +6501,6 @@ packages:
readable-stream: 3.6.1
dev: true
- /tar-stream@3.0.0:
- resolution: {integrity: sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==}
- dependencies:
- b4a: 1.6.1
- bl: 6.0.0
- streamx: 2.13.2
- dev: false
-
/tar@4.4.19:
resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
engines: {node: '>=4.5'}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f3a9928c8..bb2f78266 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -5,7 +5,6 @@ packages:
- 'examples/npm_package/packages/*'
- 'js/private/coverage/bundle'
- 'js/private/worker/src'
- - 'js/private/image'
- 'js/private/test/*'
- 'npm/private/test'
- 'npm/private/test/*'