projen 0.100.6 → 0.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/.jsii +714 -116
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +9 -9
  14. package/lib/awscdk/integ-runner.js +9 -3
  15. package/lib/awscdk/integration-test.js +12 -6
  16. package/lib/awscdk/lambda-extension.js +1 -1
  17. package/lib/awscdk/lambda-function.js +2 -2
  18. package/lib/build/build-workflow.js +1 -1
  19. package/lib/cdk/auto-discover-base.js +2 -2
  20. package/lib/cdk/construct-lib.js +1 -1
  21. package/lib/cdk/integration-test-base.js +1 -1
  22. package/lib/cdk/jsii-build.js +5 -5
  23. package/lib/cdk/jsii-docgen.js +3 -3
  24. package/lib/cdk/jsii-project.js +1 -1
  25. package/lib/cdk8s/auto-discover.js +2 -2
  26. package/lib/cdk8s/cdk8s-app-py.js +3 -3
  27. package/lib/cdk8s/cdk8s-app-ts.js +4 -4
  28. package/lib/cdk8s/cdk8s-construct.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  30. package/lib/cdk8s/cdk8s-deps.js +1 -1
  31. package/lib/cdk8s/integration-test.js +17 -10
  32. package/lib/cdktf/cdktf-construct.js +1 -1
  33. package/lib/circleci/circleci.js +1 -1
  34. package/lib/cli/cmds/run-task.js +4 -1
  35. package/lib/cli/task-runtime.js +152 -78
  36. package/lib/common.d.ts +1 -1
  37. package/lib/common.js +2 -2
  38. package/lib/component.js +1 -1
  39. package/lib/dependencies.js +1 -1
  40. package/lib/dev-env.js +1 -1
  41. package/lib/docker-compose/docker-compose-service.js +1 -1
  42. package/lib/docker-compose/docker-compose.js +1 -1
  43. package/lib/file.js +1 -1
  44. package/lib/gitattributes.js +1 -1
  45. package/lib/github/actions-provider.js +1 -1
  46. package/lib/github/auto-approve.js +1 -1
  47. package/lib/github/auto-merge.js +1 -1
  48. package/lib/github/auto-queue.js +1 -1
  49. package/lib/github/dependabot.js +1 -1
  50. package/lib/github/dependency-review.js +1 -1
  51. package/lib/github/github-credentials.js +1 -1
  52. package/lib/github/github-project.js +1 -1
  53. package/lib/github/github.js +1 -1
  54. package/lib/github/merge-queue.js +1 -1
  55. package/lib/github/mergify.js +1 -1
  56. package/lib/github/pr-template.js +1 -1
  57. package/lib/github/pull-request-backport.js +1 -1
  58. package/lib/github/pull-request-lint.js +1 -1
  59. package/lib/github/stale.js +1 -1
  60. package/lib/github/task-workflow-job.js +1 -1
  61. package/lib/github/task-workflow.js +1 -1
  62. package/lib/github/workflow-actions.js +1 -1
  63. package/lib/github/workflow-jobs.js +1 -1
  64. package/lib/github/workflow-steps.js +1 -1
  65. package/lib/github/workflows.js +1 -1
  66. package/lib/gitlab/configuration.js +1 -1
  67. package/lib/gitlab/gitlab-configuration.js +1 -1
  68. package/lib/gitlab/nested-configuration.js +1 -1
  69. package/lib/gitpod.js +1 -1
  70. package/lib/ignore-file.js +1 -1
  71. package/lib/index.d.ts +1 -0
  72. package/lib/index.js +2 -1
  73. package/lib/ini.js +1 -1
  74. package/lib/java/java-project.js +1 -1
  75. package/lib/java/junit.js +3 -3
  76. package/lib/java/maven-compile.js +3 -3
  77. package/lib/java/maven-packaging.js +3 -3
  78. package/lib/java/maven-sample.js +1 -1
  79. package/lib/java/pom.js +2 -2
  80. package/lib/java/projenrc.js +3 -3
  81. package/lib/javascript/biome/biome.js +1 -1
  82. package/lib/javascript/bundler.js +3 -3
  83. package/lib/javascript/eslint.js +1 -1
  84. package/lib/javascript/jest.js +4 -4
  85. package/lib/javascript/license-checker.js +5 -5
  86. package/lib/javascript/node-package.js +1 -1
  87. package/lib/javascript/node-project.js +13 -4
  88. package/lib/javascript/npm-config.js +1 -1
  89. package/lib/javascript/prettier.js +1 -1
  90. package/lib/javascript/projenrc.js +3 -3
  91. package/lib/javascript/typescript-config.js +2 -2
  92. package/lib/javascript/upgrade-dependencies.js +4 -4
  93. package/lib/javascript/yarnrc.js +1 -1
  94. package/lib/json-patch.js +1 -1
  95. package/lib/json.js +1 -1
  96. package/lib/license.js +1 -1
  97. package/lib/logger.js +1 -1
  98. package/lib/makefile.js +1 -1
  99. package/lib/object-file.js +1 -1
  100. package/lib/project-build.js +1 -1
  101. package/lib/project-tree.js +1 -1
  102. package/lib/project.js +1 -1
  103. package/lib/projects.js +1 -1
  104. package/lib/projenrc-json.js +1 -1
  105. package/lib/projenrc.js +1 -1
  106. package/lib/python/pip.js +17 -5
  107. package/lib/python/poetry.js +7 -7
  108. package/lib/python/projenrc.js +3 -3
  109. package/lib/python/pyproject-toml-file.js +1 -1
  110. package/lib/python/pytest-sample.js +1 -1
  111. package/lib/python/pytest.js +1 -1
  112. package/lib/python/python-project.js +1 -1
  113. package/lib/python/python-sample.js +1 -1
  114. package/lib/python/requirements-file.js +1 -1
  115. package/lib/python/setuppy.js +1 -1
  116. package/lib/python/setuptools.js +8 -3
  117. package/lib/python/uv.js +6 -6
  118. package/lib/python/venv.js +1 -1
  119. package/lib/readme.js +1 -1
  120. package/lib/release/bump-version.d.ts +1 -1
  121. package/lib/release/bump-version.js +6 -2
  122. package/lib/release/publisher.js +1 -1
  123. package/lib/release/release-trigger.js +1 -1
  124. package/lib/release/release.js +1 -1
  125. package/lib/renovatebot.js +1 -1
  126. package/lib/run-task.cjs +141 -129
  127. package/lib/sample-file.js +2 -2
  128. package/lib/source-code.js +1 -1
  129. package/lib/task-model.d.ts +144 -4
  130. package/lib/task-model.js +1 -1
  131. package/lib/task-shell.d.ts +63 -0
  132. package/lib/task-shell.js +87 -0
  133. package/lib/task.d.ts +52 -2
  134. package/lib/task.js +71 -10
  135. package/lib/tasks.d.ts +13 -0
  136. package/lib/tasks.js +19 -2
  137. package/lib/testing.js +1 -1
  138. package/lib/textfile.js +1 -1
  139. package/lib/toml.js +1 -1
  140. package/lib/typescript/projenrc-ts.js +1 -1
  141. package/lib/typescript/projenrc.js +1 -1
  142. package/lib/typescript/typescript-typedoc.js +9 -3
  143. package/lib/typescript/typescript.js +8 -10
  144. package/lib/util/exec.d.ts +34 -70
  145. package/lib/util/exec.js +57 -51
  146. package/lib/version.d.ts +1 -1
  147. package/lib/version.js +5 -5
  148. package/lib/vscode/devcontainer.js +1 -1
  149. package/lib/vscode/extensions.js +1 -1
  150. package/lib/vscode/launch-config.js +1 -1
  151. package/lib/vscode/settings.js +1 -1
  152. package/lib/vscode/vscode.js +1 -1
  153. package/lib/web/next.js +9 -9
  154. package/lib/web/postcss.js +1 -1
  155. package/lib/web/react.js +7 -7
  156. package/lib/web/tailwind.js +1 -1
  157. package/lib/xmlfile.js +1 -1
  158. package/lib/yaml.js +1 -1
  159. package/package.json +4 -4
@@ -180,9 +180,13 @@ async function bump(cwd, options) {
180
180
  * Determine based on releaseable commits whether we should release or not
181
181
  */
182
182
  async function hasNewInterestingCommits(options) {
183
- const findCommits = (options.releasableCommits ?? version_1.ReleasableCommits.everyCommit().cmd).replace("$LATEST_TAG", options.latestTag);
183
+ // `$LATEST_TAG` is provided to the command as an environment variable
184
+ // (rather than interpolated into the command string), consistent with how
185
+ // `nextVersionCommand` receives it.
186
+ const findCommits = options.releasableCommits ?? version_1.ReleasableCommits.everyCommit().cmd;
184
187
  const commitsSinceLastTag = (await exec_1.rawShell.tryCapture(findCommits, {
185
188
  cwd: options.cwd,
189
+ env: { LATEST_TAG: options.latestTag },
186
190
  }))?.split("\n");
187
191
  const numCommitsSinceLastTag = commitsSinceLastTag?.length ?? 0;
188
192
  logging.info(`Number of commits since ${options.latestTag}: ${numCommitsSinceLastTag}`);
@@ -285,4 +289,4 @@ function determineLatestTag(options) {
285
289
  }
286
290
  return { latestVersion, latestTag, isFirstRelease };
287
291
  }
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcC12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvYnVtcC12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0pBLG9CQTBKQztBQTlTRCwyQkFBZ0Q7QUFDaEQsK0JBQXFDO0FBRXJDLG1DQUFpQztBQUNqQyxvREFBc0M7QUFFdEMsMkNBS3FCO0FBQ3JCLHVDQUE2QztBQUM3Qyx3Q0FBK0M7QUFDL0MsNkRBQTJEO0FBNkgzRDs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQW9CO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6RCxJQUFJLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLDJE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SUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFN0IsbUVBQW1FO0lBQ25FLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLFNBQVMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwQixTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzlCLElBQUksTUFBTSxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzLCBleGlzdHNTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29uZmlnLXNwZWNcIjtcbmltcG9ydCB7IGNvbXBhcmUgfSBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEJ1bXBUeXBlIH0gZnJvbSBcIi4vYnVtcC10eXBlXCI7XG5pbXBvcnQge1xuICBwYXJzZUJ1bXBUeXBlLFxuICBwZXJmb3JtQnVtcCxcbiAgcmVsYXRpdmVCdW1wVHlwZSxcbiAgcmVuZGVyQnVtcFR5cGUsXG59IGZyb20gXCIuL2J1bXAtdHlwZVwiO1xuaW1wb3J0IHsgZ2l0LCByYXdTaGVsbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcbmltcG9ydCB7IFJlbGVhc2FibGVDb21taXRzIH0gZnJvbSBcIi4uL3ZlcnNpb25cIjtcbmltcG9ydCB7IENvbW1pdEFuZFRhZ1ZlcnNpb24gfSBmcm9tIFwiLi9jb21taXQtdGFnLXZlcnNpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdW1wT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIC5qc29uIGZpbGUgdG8gc2V0IGB2ZXJzaW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25GaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSB0byBnZW5lcmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHZlcnNpb25pbmdcbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG1ham9yIHZlcnNpb24gbGluZS4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgICogYW5kIGFsc28gZW5mb3JjZSB0aGF0IG5ldyBtYWpvciB2ZXJzaW9ucyBhcmUgbm90IHJlbGVhc2VkIGFjY2lkZW50YWxseS5cbiAgICpcbiAgICogQ2FuIG5vdCBiZSBzZXQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbnkgdmVyc2lvbiBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgbWluaW1hbCBtYWpvciB2ZXJzaW9uLiBUaGlzIGlzIHVzZWQgaWYgeW91IHdhbnQgdG8gc3RhcnQgd2l0aFxuICAgKiBhIHNwZWNpZmljIG1ham9yIHZlcnNpb24sIGFuZCBpbmNyZW1lbnQgZnJvbSB0aGVyZSBvbi5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHNldCB0byAxLCBhcyBicmVha2luZyBjaGFuZ2VzIGJlZm9yZSB0aGUgMS54IG1ham9yXG4gICAqIHJlbGVhc2UgYXJlIG5vdCBpbmNyZW1lbnRpbmcgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLlxuICAgKlxuICAgKiBDYW4gbm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBtYWpvclZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1pbmltdW0gdmVyc2lvbiBpcyBiZWluZyBlbmZvcmNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWFqb3JWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBtaW5vciB2ZXJzaW9uIGxpbmUuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAqIGFuZCBhbHNvIGVuZm9yY2UgdGhhdCBuZXcgbWlub3IgdmVyc2lvbnMgYXJlIG5vdCByZWxlYXNlZCBhY2NpZGVudGFsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW55IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCB3aWxsIGluY2x1ZGUgdGhlIG91dHB1dCB2ZXJzaW9uIG51bWJlciAoYSB0ZXh0IGZpbGUpLlxuICAgKlxuICAgKiBSZWxhdGl2ZSB0byBjd2QuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLnZlcnNpb24udHh0XCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBGaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGUgcmVsZWFzZSB0YWcgKGEgdGV4dCBmaWxlKS5cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi5yZWxlYXNldGFnLnR4dFwiXG4gICAqL1xuICByZWFkb25seSByZWxlYXNlVGFnRmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IGFwcGxpZWQgdG8gcmVsZWFzZSB0YWdzLiBCdW1wcyB3aWxsIGJlIG1hZGUgYmFzZWQgb24gdGhlIGxhdGVzdFxuICAgKiB2ZXJzaW9uIGZvdW5kIHdpdGggdGhpcyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIHRoYXQgd291bGQgYXBwZW5kIHRvIHZlcnNpb25yYyBmaWxlIG9yIG92ZXJ3cml0ZSB2YWx1ZXNcbiAgICogY29taW5nIHRvIHRoYXQgZnJvbSBkZWZhdWx0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB0byBsaXN0IGFsbCByZWxlYXNlIGNvbW1pdHMgc2luY2UgdGhlIGxhdGVzdCB0YWcuXG4gICAqXG4gICAqIEEgbmV3IHJlbGVhc2Ugd2lsbCBiZSBpbml0aWF0ZWQsIGlmIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgY29tbWl0cyBpcyBncmVhdGVyIHRoYW4gemVyby5cbiAgICpcbiAgICogYCRMQVRFU1RfVEFHYCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBsYXRlc3QgdGFnIGZvciB0aGUgZ2l2ZW4gcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImdpdCBsb2cgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEXCJcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25gIGNvbXBhdGlibGUgcGFja2FnZSB1c2VkIHRvIGJ1bXAgdGhlIHBhY2thZ2UgdmVyc2lvbiwgYXMgYSBkZXBlbmRlbmN5IHN0cmluZy5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgYW55IGNvbXBhdGlibGUgcGFja2FnZSB2ZXJzaW9uLCBpbmNsdWRpbmcgdGhlIGRlcHJlY2F0ZWQgYHN0YW5kYXJkLXZlcnNpb25AOWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkAxMlwiXG4gICAqL1xuICByZWFkb25seSBidW1wUGFja2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaGVsbCBjb21tYW5kIHRvIGNvbnRyb2wgdGhlIG5leHQgdmVyc2lvbiB0byByZWxlYXNlLlxuICAgKlxuICAgKiBJZiBwcmVzZW50LCB0aGlzIHNoZWxsIGNvbW1hbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBidW1wIGlzIGV4ZWN1dGVkLCBhbmRcbiAgICogaXQgZGV0ZXJtaW5lcyB3aGF0IHZlcnNpb24gdG8gcmVsZWFzZS4gSXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIGVudmlyb25tZW50OlxuICAgKlxuICAgKiAtIFdvcmtpbmcgZGlyZWN0b3J5OiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAqIC0gYCRWRVJTSU9OYDogdGhlIGN1cnJlbnQgdmVyc2lvbi4gTG9va3MgbGlrZSBgMS4yLjNgLlxuICAgKiAtIGAkTEFURVNUX1RBR2A6IHRoZSBtb3N0IHJlY2VudCB0YWcuIExvb2tzIGxpa2UgYHByZWZpeC12MS4yLjNgLCBvciBtYXkgYmUgdW5zZXQuXG4gICAqXG4gICAqIFRoZSBjb21tYW5kIHNob3VsZCBwcmludCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBgc3Rkb3V0YDpcbiAgICpcbiAgICogLSBOb3RoaW5nOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gY29tbWl0IGhpc3RvcnkuXG4gICAqIC0gYHgueS56YDogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBgeC55LnpgLlxuICAgKiAtIGBtYWpvcnxtaW5vcnxwYXRjaGA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJcbiAgICogICB3aXRoIHRoZSBpbmRpY2F0ZWQgY29tcG9uZW50IGJ1bXBlZC5cbiAgICpcbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYDsgdGhlIGludm9rZWRcbiAgICogc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIGVmZmVjdHMgb2YgYG1pbk1ham9yVmVyc2lvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIGdpdCB0YWdzIGFuZCB1c2VzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBidW1wXG4gKiB0byB0aGUgbmV4dCB2ZXJzaW9uIGJhc2VkIG9uIGNvbW1pdHMuXG4gKlxuICogVGhpcyBleHBlY3RzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHBhdGguXG4gKlxuICogQHBhcmFtIGN3ZCB3b3JraW5nIGRpcmVjdG9yeSAoZ2l0IHJlcG9zaXRvcnkpXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW1wKGN3ZDogc3RyaW5nLCBvcHRpb25zOiBCdW1wT3B0aW9ucykge1xuICBjb25zdCB2ZXJzaW9uRmlsZSA9IGpvaW4oY3dkLCBvcHRpb25zLnZlcnNpb25GaWxlKTtcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMucHJlcmVsZWFzZTtcbiAgY29uc3QgbWFqb3IgPSBvcHRpb25zLm1ham9yVmVyc2lvbjtcbiAgY29uc3QgbWlub3IgPSBvcHRpb25zLm1pbm9yVmVyc2lvbjtcbiAgY29uc3QgbWluTWFqb3JWZXJzaW9uID0gb3B0aW9ucy5taW5NYWpvclZlcnNpb247XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IG9wdGlvbnMudGFnUHJlZml4ID8/IFwiXCI7XG4gIGNvbnN0IGJ1bXBGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuYnVtcEZpbGUpO1xuICBjb25zdCBjaGFuZ2Vsb2dGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuY2hhbmdlbG9nKTtcbiAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBqb2luKGN3ZCwgb3B0aW9ucy5yZWxlYXNlVGFnRmlsZSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG1ham9yVmVyc2lvbiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG1pbm9yICYmICFtYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWlub3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gbXVzdCBiZSB1c2VkIHRvZ2V0aGVyLmApO1xuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShidW1wRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5ta2RpcihkaXJuYW1lKGNoYW5nZWxvZ0ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShyZWxlYXNlVGFnRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHsgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0VGFnLCBpc0ZpcnN0UmVsZWFzZSB9ID0gZGV0ZXJtaW5lTGF0ZXN0VGFnKHtcbiAgICBjd2QsXG4gICAgbWFqb3IsXG4gICAgbWlub3IsXG4gICAgcHJlcmVsZWFzZSxcbiAgICBwcmVmaXg6IHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV3JpdGUgdGhlIGN1cnJlbnQgdmVyc2lvbiBpbnRvIHRoZSB2ZXJzaW9uIGZpbGUgc28gdGhhdCBDQVRWIHdpbGwga25vdyB0aGUgY3VycmVudCB2ZXJzaW9uXG4gIGNvbnN0IHsgY29udGVudHMsIG5ld2xpbmUgfSA9IGF3YWl0IHRyeVJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uRmlsZSk7XG4gIGNvbnRlbnRzLnZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYFVwZGF0ZSAke3ZlcnNpb25GaWxlfSB0byBsYXRlc3QgcmVzb2x2ZWQgdmVyc2lvbjogJHtsYXRlc3RWZXJzaW9ufWAsXG4gICk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShjb250ZW50cywgdW5kZWZpbmVkLCAyKSArIChuZXdsaW5lID8gXCJcXG5cIiA6IFwiXCIpLFxuICApO1xuXG4gIC8vIERldGVybWluZSB0aGUgaW5pdGlhbCBidW1wIHN0YXR1cy4gQ0FUViB3aWxsIGFsd2F5cyBkbyBhIHBhdGNoIGV2ZW4gaWZcbiAgLy8gdGhlcmUgYXJlIG5vIGNvbW1pdHMsIHNvIGxvb2sgYXQgY29tbWl0cyBvdXJzZWx2ZXMgZmlyc3QgdG8gZGVjaWRlXG4gIC8vIGlmIHdlIGV2ZW4gc2hvdWxkIGRvIG5vdGhpbmcgYXQgYWxsLlxuICBjb25zdCBzaG91bGRSZWxlYXNlID0gaXNGaXJzdFJlbGVhc2VcbiAgICA/IHRydWVcbiAgICA6IGF3YWl0IGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyh7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgbGF0ZXN0VGFnLFxuICAgICAgICByZWxlYXNhYmxlQ29tbWl0czogb3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cyxcbiAgICAgIH0pO1xuXG4gIGNvbnN0IGNhdHYgPSBuZXcgQ29tbWl0QW5kVGFnVmVyc2lvbihvcHRpb25zLmJ1bXBQYWNrYWdlLCBjd2QsIHtcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBjaGFuZ2Vsb2dGaWxlLFxuICAgIHByZXJlbGVhc2UsXG4gICAgY29uZmlnT3B0aW9uczogb3B0aW9ucy52ZXJzaW9ucmNPcHRpb25zLFxuICAgIHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV2UgdXNlZCB0byB0cmFuc2xhdGUgYGlzRmlyc3RSZWxlYXNlYCB0byB0aGUgYC0tZmlyc3QtcmVsZWFzZWAgZmxhZyBvZiBDQVRWLlxuICAvLyBXaGF0IHRoYXQgZG9lcyBpcyBza2lwIGEgYnVtcCwgb25seSBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nLlxuICAvL1xuICAvLyBPdXIgYHsgYnVtcDogbm9uZSB9YCBkb2VzIHRoZSBzYW1lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IG92ZXIgdGhpc1xuICAvLyBmbGFnIGFueW1vcmUuXG4gIGxldCBidW1wVHlwZTogQnVtcFR5cGUgPVxuICAgIHNob3VsZFJlbGVhc2UgJiYgIWlzRmlyc3RSZWxlYXNlXG4gICAgICA/IHJlbGF0aXZlQnVtcFR5cGUobGF0ZXN0VmVyc2lvbiwgYXdhaXQgY2F0di5kcnlSdW4oKSlcbiAgICAgIDogeyBidW1wOiBcIm5vbmVcIiB9O1xuXG4gIGxvZ2dpbmcuaW5mbyhgQnVtcCBmcm9tIGNvbW1pdHM6ICR7cmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpfWApO1xuICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IGF3YWl0IHJhd1NoZWxsLmNhcHR1cmUob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBWRVJTSU9OOiBsYXRlc3RWZXJzaW9uLFxuICAgICAgICBTVUdHRVNURURfQlVNUDogcmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpLFxuICAgICAgICAuLi4obGF0ZXN0VGFnID8geyBMQVRFU1RfVEFHOiBsYXRlc3RUYWcgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobmV4dFZlcnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1bXBUeXBlID0gcGFyc2VCdW1wVHlwZShuZXh0VmVyc2lvbik7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyhcbiAgICAgICAgICBgQnVtcCBmcm9tIG5leHRWZXJzaW9uQ29tbWFuZDogJHtyZW5kZXJCdW1wVHlwZShidW1wVHlwZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBuZXh0VmVyc2lvbkNvbW1hbmQgXCIke29wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kfVwiIHJldHVybmVkIGludmFsaWQgb3V0cHV0OiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNwZWN0IG1pbk1ham9yVmVyc2lvbiB0byBjb3JyZWN0IHRoZSByZXN1bHQgb2YgdGhlIG5leHRWZXJzaW9uQ29tbWFuZFxuICBpZiAobWluTWFqb3JWZXJzaW9uKSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHBlcmZvcm1CdW1wKGxhdGVzdFZlcnNpb24sIGJ1bXBUeXBlKTtcbiAgICBjb25zdCBbbWFqb3JWZXJzaW9uXSA9IGJ1bXBlZFZlcnNpb24uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IG1ham9yVmVyc2lvbk51bWJlciA9IHBhcnNlSW50KG1ham9yVmVyc2lvbiwgMTApO1xuICAgIGlmIChtYWpvclZlcnNpb25OdW1iZXIgPCBtaW5NYWpvclZlcnNpb24pIHtcbiAgICAgIGJ1bXBUeXBlID0geyBidW1wOiBcImFic29sdXRlXCIsIGFic29sdXRlOiBgJHttaW5NYWpvclZlcnNpb259LjAuMGAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgQ0FUViB3aXRoIHRoZSBvcHRpb25zIHdlIGxhbmRlZCBvbi4gSWYgd2UgZGVjaWRlZCBub3QgdG8gZG8gYSBidW1wLFxuICAvLyB3ZSB3aWxsIHVzZSB0aGlzIHRvIHJlZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbi5cbiAgY29uc3QgbmV3UmVsZWFzZSA9IGJ1bXBUeXBlLmJ1bXAgIT09IFwibm9uZVwiO1xuXG4gIC8vIElmIHdlJ3JlIG5vdCBkb2luZyBhIG5ldyByZWxlYXNlIGFuZCB0aGlzIGlzIG5vdCB0aGVcbiAgLy8gZmlyc3QgcmVsZWFzZSwgd2UncmUganVzdCByZWdlbmVyYXRpbmcgdGhlIHByZXZpb3VzIGNoYW5nZWxvZyBhZ2Fpbi5cbiAgaWYgKCFuZXdSZWxlYXNlICYmICFpc0ZpcnN0UmVsZWFzZSkge1xuICAgIGF3YWl0IGNhdHYucmVnZW5lcmF0ZVByZXZpb3VzQ2hhbmdlTG9nKGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHdlJ3JlIGVpdGhlciBkb2luZyBhIGJ1bXAgKyByZWxlYXNlLCBvciB3ZSdyZSByZWxlYXNpbmcgdGhlXG4gICAgLy8gZmlyc3QgdmVyc2lvbiBhcyAwLjAuMCAod2hpY2ggaXMgYWxyZWFkeSB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIHNvIHdlXG4gICAgLy8gc2tpcCBidW1waW5nKS5cbiAgICBhd2FpdCBjYXR2Lmludm9rZSh7XG4gICAgICByZWxlYXNlQXM6IG5ld1JlbGVhc2UgPyByZW5kZXJCdW1wVHlwZShidW1wVHlwZSkgOiB1bmRlZmluZWQsXG4gICAgICBza2lwQnVtcDogIW5ld1JlbGVhc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiB0aGF0IHdlIGVuZGVkIHVwIHdpdGhcbiAgY29uc3QgbmV3VmVyc2lvbiA9IChhd2FpdCB0cnlSZWFkVmVyc2lvbkZpbGUodmVyc2lvbkZpbGUpKS52ZXJzaW9uO1xuICBpZiAoIW5ld1ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bXAgZmFpbGVkOiAke3ZlcnNpb25GaWxlfSBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbiBzZXRgKTtcbiAgfVxuICBpZiAobWFqb3IpIHtcbiAgICBpZiAoIW5ld1ZlcnNpb24uc3RhcnRzV2l0aChgJHttYWpvcn0uYCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pbm9yKSB7XG4gICAgaWYgKCFuZXdWZXJzaW9uLnN0YXJ0c1dpdGgoYCR7bWFqb3J9LiR7bWlub3J9YCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0uJHttaW5vcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBvcnQgY3VyZW50IHN0YXR1cyBpbnRvIHRoZSBkaXN0LyBkaXJlY3RvcnlcbiAgY29uc3QgbmV3VGFnID0gYCR7dGFnUHJlZml4fXYke25ld1ZlcnNpb259YDtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1bXBGaWxlLCBuZXdWZXJzaW9uKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlbGVhc2VUYWdGaWxlLCBuZXdUYWcpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBiYXNlZCBvbiByZWxlYXNlYWJsZSBjb21taXRzIHdoZXRoZXIgd2Ugc2hvdWxkIHJlbGVhc2Ugb3Igbm90XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyhvcHRpb25zOiB7XG4gIHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuICBsYXRlc3RUYWc6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbmRDb21taXRzID0gKFxuICAgIG9wdGlvbnMucmVsZWFzYWJsZUNvbW1pdHMgPz8gUmVsZWFzYWJsZUNvbW1pdHMuZXZlcnlDb21taXQoKS5jbWRcbiAgKS5yZXBsYWNlKFwiJExBVEVTVF9UQUdcIiwgb3B0aW9ucy5sYXRlc3RUYWcpO1xuXG4gIGNvbnN0IGNvbW1pdHNTaW5jZUxhc3RUYWcgPSAoXG4gICAgYXdhaXQgcmF3U2hlbGwudHJ5Q2FwdHVyZShmaW5kQ29tbWl0cywge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICB9KVxuICApPy5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgbnVtQ29tbWl0c1NpbmNlTGFzdFRhZyA9IGNvbW1pdHNTaW5jZUxhc3RUYWc/Lmxlbmd0aCA/PyAwO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYE51bWJlciBvZiBjb21taXRzIHNpbmNlICR7b3B0aW9ucy5sYXRlc3RUYWd9OiAke251bUNvbW1pdHNTaW5jZUxhc3RUYWd9YCxcbiAgKTtcblxuICAvLyBOb3RoaW5nIHRvIHJlbGVhc2UgcmlnaHQgbm93XG4gIGlmIChudW1Db21taXRzU2luY2VMYXN0VGFnID09PSAwKSB7XG4gICAgbG9nZ2luZy5pbmZvKFwiTm8gbmV3IGludGVyZXN0aW5nIGNvbW1pdHMuXCIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0cnlSZWFkVmVyc2lvbkZpbGUoXG4gIHZlcnNpb25GaWxlOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgY29udGVudHM6IGFueTsgdmVyc2lvbj86IHN0cmluZzsgbmV3bGluZTogYm9vbGVhbiB9PiB7XG4gIGlmICghZXhpc3RzU3luYyh2ZXJzaW9uRmlsZSkpIHtcbiAgICByZXR1cm4geyBjb250ZW50czoge30sIG5ld2xpbmU6IHRydWUgfTtcbiAgfVxuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZSh2ZXJzaW9uRmlsZSwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgY29udGVudHMgPSBKU09OLnBhcnNlKHJhdyk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50cyxcbiAgICB2ZXJzaW9uOiBjb250ZW50cy52ZXJzaW9uLFxuICAgIG5ld2xpbmU6IHJhdy5lbmRzV2l0aChcIlxcblwiKSxcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExhdGVzdFRhZ09wdGlvbnMge1xuICAvKipcbiAgICogV29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGdpdCByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYWpvciB2ZXJzaW9uIHRvIHNlbGVjdCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFqb3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNaW5vciB2ZXJzaW9uIHRvIHNlbGVjdCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlub3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBIHByZS1yZWxlYXNlIHN1ZmZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHByZWZpeCBhcHBsaWVkIHRvIGFsbCB0YWdzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgbGF0ZXN0IHJlbGVhc2UgdGFnLlxuICogQHBhcmFtIG1ham9yIChvcHRpb25hbCkgQSBtYWpvciB2ZXJzaW9uIGxpbmUgdG8gc2VsZWN0IGZyb21cbiAqIEBwYXJhbSBwcmVyZWxlYXNlIChvcHRpb25hbCkgQSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gKiBAcmV0dXJucyB0aGUgbGF0ZXN0IHRhZywgYW5kIHdoZXRoZXIgaXQgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZUxhdGVzdFRhZyhvcHRpb25zOiBMYXRlc3RUYWdPcHRpb25zKToge1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGxhdGVzdFRhZzogc3RyaW5nO1xuICBpc0ZpcnN0UmVsZWFzZTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCB7IGN3ZCwgbWFqb3IsIG1pbm9yLCBwcmVyZWxlYXNlLCBwcmVmaXggfSA9IG9wdGlvbnM7XG5cbiAgLy8gZmlsdGVyIG9ubHkgdGFncyBmb3IgdGhpcyBwcmVmaXggYW5kIG1ham9yIHZlcnNpb24gaWYgc3BlY2lmaWVkIChzdGFydCB3aXRoIFwidk5OLlwiKS5cbiAgbGV0IHByZWZpeEZpbHRlcjogc3RyaW5nO1xuICBpZiAobWFqb3IgIT09IHVuZGVmaW5lZCAmJiBtaW5vciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHJlZml4RmlsdGVyID0gYCR7cHJlZml4fXYke21ham9yfS4ke21pbm9yfS4qYDtcbiAgfSBlbHNlIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHJlZml4RmlsdGVyID0gYCR7cHJlZml4fXYke21ham9yfS4qYDtcbiAgfSBlbHNlIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9dipgO1xuICB9XG5cbiAgY29uc3Qgc3Rkb3V0ID0gZ2l0LmNhcHR1cmUoXG4gICAgW1xuICAgICAgXCItY1wiLFxuICAgICAgXCJ2ZXJzaW9uc29ydC5zdWZmaXg9LVwiLCAvLyBtYWtlcyBzdXJlIHByZS1yZWxlYXNlIHZlcnNpb25zIGFyZSBsaXN0ZWQgYWZ0ZXIgdGhlIHByaW1hcnkgdmVyc2lvblxuICAgICAgXCJ0YWdcIixcbiAgICAgIFwiLS1zb3J0PS12ZXJzaW9uOnJlZm5hbWVcIiwgLy8gc29ydCBhcyB2ZXJzaW9ucyBhbmQgbm90IGxleGljb2dyYXBoaWNhbGx5XG4gICAgICBcIi0tbGlzdFwiLFxuICAgICAgcHJlZml4RmlsdGVyLFxuICAgIF0sXG4gICAgeyBjd2QgfSxcbiAgKTtcblxuICBsZXQgdGFncyA9IHN0ZG91dD8uc3BsaXQoXCJcXG5cIik7XG5cbiAgLy8gaWYgcHJlcmVsZWFzZSBpcyBzZXQgYW5kIHRoZXJlIGFyZSBleGlzdGluZyBwcmVyZWxlYXNlIHRhZ3MsIGZpbHRlciB2ZXJzaW9ucyB0aGF0IGVuZCB3aXRoIFwiLVBSRS5kZGRcIi5cbiAgY29uc3QgcHJlcmVsZWFzZVRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT5cbiAgICBuZXcgUmVnRXhwKGAtJHtwcmVyZWxlYXNlfVxcXFwuWzAtOV0rJGApLnRlc3QoeCksXG4gICk7XG4gIGlmIChwcmVyZWxlYXNlICYmIHByZXJlbGVhc2VUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgcHJlcmVsZWFzZVRhZyA9IHByZXJlbGVhc2VUYWdzWzBdO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXIgdGhlIGZvbGxvd2luZyBjYXNlIHNwZWNpZmljYWxseVxuICAgICAqIDEgLSB2MS4wLjBcbiAgICAgKiAyIC0gdjEuMC4xLWJldGEuMFxuICAgICAqIDMgLSB2MS4wLjEtYmV0YS4xXG4gICAgICogNCAtIHYxLjAuMVxuICAgICAqIDUgLSBub3cgcHVibGlzaCBhIG5ldyByZWxlYXNlIG9uIHRoZSBwcmVyZWxlYXNlIGJyYW5jaFxuICAgICAqICAgIGJ5IHNldHRpbmcgdGhlIGxhdGVzdFRhZyBhcyB2MS4wLjEgaW5zdGVhZCBvZiB2MS4wLjEtYmV0YS4xXG4gICAgICovXG4gICAgY29uc3QgcmVsZWFzZVRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT5cbiAgICAgIG5ldyBSZWdFeHAoYF4ke3ByZWZpeH12KFswLTldKylcXFxcLihbMC05XSspXFxcXC4oWzAtOV0rKSRgKS50ZXN0KHgpLFxuICAgICk7XG5cbiAgICBsZXQgcmVsZWFzZVRhZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZWxlYXNlVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICByZWxlYXNlVGFnID0gcmVsZWFzZVRhZ3NbMF07XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgcmVsZWFzZVRhZyA9IHJlbGVhc2VUYWc/LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgICAgIHByZXJlbGVhc2VUYWcgPSBwcmVyZWxlYXNlVGFnLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAocmVsZWFzZVRhZyAmJiBjb21wYXJlKHJlbGVhc2VUYWcsIHByZXJlbGVhc2VUYWcpID09PSAxKSB7XG4gICAgICB0YWdzID0gcmVsZWFzZVRhZ3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ3MgPSBwcmVyZWxlYXNlVGFncztcbiAgICB9XG4gIH1cblxuICB0YWdzID0gdGFncy5maWx0ZXIoKHgpID0+IHgpO1xuXG4gIC8vIGlmIGEgcHJlLXJlbGVhc2UgdGFnIGlzIHVzZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBpbml0aWFsIHZlcnNpb25cbiAgbGV0IGlzRmlyc3RSZWxlYXNlID0gZmFsc2U7XG4gIGxldCBsYXRlc3RUYWc7XG5cbiAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgIGxhdGVzdFRhZyA9IHRhZ3NbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW5pdGlhbCA9IGAke3ByZWZpeH12JHttYWpvciA/PyAwfS4ke21pbm9yID8/IDB9LjBgO1xuICAgIGxhdGVzdFRhZyA9IHByZXJlbGVhc2UgPyBgJHtpbml0aWFsfS0ke3ByZXJlbGVhc2V9LjBgIDogaW5pdGlhbDtcbiAgICBpc0ZpcnN0UmVsZWFzZSA9IHRydWU7XG4gIH1cblxuICAvLyByZW1vdmUgdGFnIHByZWZpeCAoaWYgZXhpc3RzKVxuICBsZXQgbGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFRhZztcbiAgaWYgKHByZWZpeCAmJiBsYXRlc3RWZXJzaW9uLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIGxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBcInZcIiBwcmVmaXggKGlmIGV4aXN0cylcbiAgaWYgKGxhdGVzdFZlcnNpb24uc3RhcnRzV2l0aChcInZcIikpIHtcbiAgICBsYXRlc3RWZXJzaW9uID0gbGF0ZXN0VmVyc2lvbi5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICByZXR1cm4geyBsYXRlc3RWZXJzaW9uLCBsYXRlc3RUYWcsIGlzRmlyc3RSZWxlYXNlIH07XG59XG4iXX0=
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVtcC12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvYnVtcC12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0pBLG9CQTBKQztBQTlTRCwyQkFBZ0Q7QUFDaEQsK0JBQXFDO0FBRXJDLG1DQUFpQztBQUNqQyxvREFBc0M7QUFFdEMsMkNBS3FCO0FBQ3JCLHVDQUE2QztBQUM3Qyx3Q0FBK0M7QUFDL0MsNkRBQTJEO0FBNkgzRDs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQW9CO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsSUFBQSxXQUFJLEVBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6RCxJQUFJLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLDJE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XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29uZmlnLXNwZWNcIjtcbmltcG9ydCB7IGNvbXBhcmUgfSBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEJ1bXBUeXBlIH0gZnJvbSBcIi4vYnVtcC10eXBlXCI7XG5pbXBvcnQge1xuICBwYXJzZUJ1bXBUeXBlLFxuICBwZXJmb3JtQnVtcCxcbiAgcmVsYXRpdmVCdW1wVHlwZSxcbiAgcmVuZGVyQnVtcFR5cGUsXG59IGZyb20gXCIuL2J1bXAtdHlwZVwiO1xuaW1wb3J0IHsgZ2l0LCByYXdTaGVsbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcbmltcG9ydCB7IFJlbGVhc2FibGVDb21taXRzIH0gZnJvbSBcIi4uL3ZlcnNpb25cIjtcbmltcG9ydCB7IENvbW1pdEFuZFRhZ1ZlcnNpb24gfSBmcm9tIFwiLi9jb21taXQtdGFnLXZlcnNpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdW1wT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIC5qc29uIGZpbGUgdG8gc2V0IGB2ZXJzaW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25GaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSB0byBnZW5lcmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBwcmUtcmVsZWFzZSBzdWZmaXguXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHZlcnNpb25pbmdcbiAgICovXG4gIHJlYWRvbmx5IHByZXJlbGVhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG1ham9yIHZlcnNpb24gbGluZS4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgICogYW5kIGFsc28gZW5mb3JjZSB0aGF0IG5ldyBtYWpvciB2ZXJzaW9ucyBhcmUgbm90IHJlbGVhc2VkIGFjY2lkZW50YWxseS5cbiAgICpcbiAgICogQ2FuIG5vdCBiZSBzZXQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbnkgdmVyc2lvbiBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgbWluaW1hbCBtYWpvciB2ZXJzaW9uLiBUaGlzIGlzIHVzZWQgaWYgeW91IHdhbnQgdG8gc3RhcnQgd2l0aFxuICAgKiBhIHNwZWNpZmljIG1ham9yIHZlcnNpb24sIGFuZCBpbmNyZW1lbnQgZnJvbSB0aGVyZSBvbi5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHNldCB0byAxLCBhcyBicmVha2luZyBjaGFuZ2VzIGJlZm9yZSB0aGUgMS54IG1ham9yXG4gICAqIHJlbGVhc2UgYXJlIG5vdCBpbmNyZW1lbnRpbmcgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLlxuICAgKlxuICAgKiBDYW4gbm90IGJlIHNldCB0b2dldGhlciB3aXRoIGBtYWpvclZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1pbmltdW0gdmVyc2lvbiBpcyBiZWluZyBlbmZvcmNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWluTWFqb3JWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBtaW5vciB2ZXJzaW9uIGxpbmUuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAqIGFuZCBhbHNvIGVuZm9yY2UgdGhhdCBuZXcgbWlub3IgdmVyc2lvbnMgYXJlIG5vdCByZWxlYXNlZCBhY2NpZGVudGFsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW55IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCB3aWxsIGluY2x1ZGUgdGhlIG91dHB1dCB2ZXJzaW9uIG51bWJlciAoYSB0ZXh0IGZpbGUpLlxuICAgKlxuICAgKiBSZWxhdGl2ZSB0byBjd2QuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLnZlcnNpb24udHh0XCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBGaWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGUgcmVsZWFzZSB0YWcgKGEgdGV4dCBmaWxlKS5cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi5yZWxlYXNldGFnLnR4dFwiXG4gICAqL1xuICByZWFkb25seSByZWxlYXNlVGFnRmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IGFwcGxpZWQgdG8gcmVsZWFzZSB0YWdzLiBCdW1wcyB3aWxsIGJlIG1hZGUgYmFzZWQgb24gdGhlIGxhdGVzdFxuICAgKiB2ZXJzaW9uIGZvdW5kIHdpdGggdGhpcyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIHRoYXQgd291bGQgYXBwZW5kIHRvIHZlcnNpb25yYyBmaWxlIG9yIG92ZXJ3cml0ZSB2YWx1ZXNcbiAgICogY29taW5nIHRvIHRoYXQgZnJvbSBkZWZhdWx0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB0byBsaXN0IGFsbCByZWxlYXNlIGNvbW1pdHMgc2luY2UgdGhlIGxhdGVzdCB0YWcuXG4gICAqXG4gICAqIEEgbmV3IHJlbGVhc2Ugd2lsbCBiZSBpbml0aWF0ZWQsIGlmIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgY29tbWl0cyBpcyBncmVhdGVyIHRoYW4gemVyby5cbiAgICpcbiAgICogYCRMQVRFU1RfVEFHYCBpcyBhdmFpbGFibGUgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKHNldCB0byB0aGUgYWN0dWFsIGxhdGVzdCB0YWcgZm9yIHRoZSBnaXZlbiBwcmVmaXgpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImdpdCBsb2cgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEXCJcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25gIGNvbXBhdGlibGUgcGFja2FnZSB1c2VkIHRvIGJ1bXAgdGhlIHBhY2thZ2UgdmVyc2lvbiwgYXMgYSBkZXBlbmRlbmN5IHN0cmluZy5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgYW55IGNvbXBhdGlibGUgcGFja2FnZSB2ZXJzaW9uLCBpbmNsdWRpbmcgdGhlIGRlcHJlY2F0ZWQgYHN0YW5kYXJkLXZlcnNpb25AOWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkAxMlwiXG4gICAqL1xuICByZWFkb25seSBidW1wUGFja2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaGVsbCBjb21tYW5kIHRvIGNvbnRyb2wgdGhlIG5leHQgdmVyc2lvbiB0byByZWxlYXNlLlxuICAgKlxuICAgKiBJZiBwcmVzZW50LCB0aGlzIHNoZWxsIGNvbW1hbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBidW1wIGlzIGV4ZWN1dGVkLCBhbmRcbiAgICogaXQgZGV0ZXJtaW5lcyB3aGF0IHZlcnNpb24gdG8gcmVsZWFzZS4gSXQgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIGVudmlyb25tZW50OlxuICAgKlxuICAgKiAtIFdvcmtpbmcgZGlyZWN0b3J5OiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAqIC0gYCRWRVJTSU9OYDogdGhlIGN1cnJlbnQgdmVyc2lvbi4gTG9va3MgbGlrZSBgMS4yLjNgLlxuICAgKiAtIGAkTEFURVNUX1RBR2A6IHRoZSBtb3N0IHJlY2VudCB0YWcuIExvb2tzIGxpa2UgYHByZWZpeC12MS4yLjNgLCBvciBtYXkgYmUgdW5zZXQuXG4gICAqXG4gICAqIFRoZSBjb21tYW5kIHNob3VsZCBwcmludCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBgc3Rkb3V0YDpcbiAgICpcbiAgICogLSBOb3RoaW5nOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gY29tbWl0IGhpc3RvcnkuXG4gICAqIC0gYHgueS56YDogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBgeC55LnpgLlxuICAgKiAtIGBtYWpvcnxtaW5vcnxwYXRjaGA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJcbiAgICogICB3aXRoIHRoZSBpbmRpY2F0ZWQgY29tcG9uZW50IGJ1bXBlZC5cbiAgICpcbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCBgbWluTWFqb3JWZXJzaW9uYDsgdGhlIGludm9rZWRcbiAgICogc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIGVmZmVjdHMgb2YgYG1pbk1ham9yVmVyc2lvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIGdpdCB0YWdzIGFuZCB1c2VzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBidW1wXG4gKiB0byB0aGUgbmV4dCB2ZXJzaW9uIGJhc2VkIG9uIGNvbW1pdHMuXG4gKlxuICogVGhpcyBleHBlY3RzIGBjb21taXQtYW5kLXRhZy12ZXJzaW9uYCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHBhdGguXG4gKlxuICogQHBhcmFtIGN3ZCB3b3JraW5nIGRpcmVjdG9yeSAoZ2l0IHJlcG9zaXRvcnkpXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW1wKGN3ZDogc3RyaW5nLCBvcHRpb25zOiBCdW1wT3B0aW9ucykge1xuICBjb25zdCB2ZXJzaW9uRmlsZSA9IGpvaW4oY3dkLCBvcHRpb25zLnZlcnNpb25GaWxlKTtcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMucHJlcmVsZWFzZTtcbiAgY29uc3QgbWFqb3IgPSBvcHRpb25zLm1ham9yVmVyc2lvbjtcbiAgY29uc3QgbWlub3IgPSBvcHRpb25zLm1pbm9yVmVyc2lvbjtcbiAgY29uc3QgbWluTWFqb3JWZXJzaW9uID0gb3B0aW9ucy5taW5NYWpvclZlcnNpb247XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IG9wdGlvbnMudGFnUHJlZml4ID8/IFwiXCI7XG4gIGNvbnN0IGJ1bXBGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuYnVtcEZpbGUpO1xuICBjb25zdCBjaGFuZ2Vsb2dGaWxlID0gam9pbihjd2QsIG9wdGlvbnMuY2hhbmdlbG9nKTtcbiAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBqb2luKGN3ZCwgb3B0aW9ucy5yZWxlYXNlVGFnRmlsZSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG1ham9yVmVyc2lvbiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kICYmIG1pbk1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gLFxuICAgICk7XG4gIH1cbiAgaWYgKG1pbm9yICYmICFtYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWlub3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gbXVzdCBiZSB1c2VkIHRvZ2V0aGVyLmApO1xuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShidW1wRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5ta2RpcihkaXJuYW1lKGNoYW5nZWxvZ0ZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMubWtkaXIoZGlybmFtZShyZWxlYXNlVGFnRmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHsgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0VGFnLCBpc0ZpcnN0UmVsZWFzZSB9ID0gZGV0ZXJtaW5lTGF0ZXN0VGFnKHtcbiAgICBjd2QsXG4gICAgbWFqb3IsXG4gICAgbWlub3IsXG4gICAgcHJlcmVsZWFzZSxcbiAgICBwcmVmaXg6IHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV3JpdGUgdGhlIGN1cnJlbnQgdmVyc2lvbiBpbnRvIHRoZSB2ZXJzaW9uIGZpbGUgc28gdGhhdCBDQVRWIHdpbGwga25vdyB0aGUgY3VycmVudCB2ZXJzaW9uXG4gIGNvbnN0IHsgY29udGVudHMsIG5ld2xpbmUgfSA9IGF3YWl0IHRyeVJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uRmlsZSk7XG4gIGNvbnRlbnRzLnZlcnNpb24gPSBsYXRlc3RWZXJzaW9uO1xuICBsb2dnaW5nLmluZm8oXG4gICAgYFVwZGF0ZSAke3ZlcnNpb25GaWxlfSB0byBsYXRlc3QgcmVzb2x2ZWQgdmVyc2lvbjogJHtsYXRlc3RWZXJzaW9ufWAsXG4gICk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBKU09OLnN0cmluZ2lmeShjb250ZW50cywgdW5kZWZpbmVkLCAyKSArIChuZXdsaW5lID8gXCJcXG5cIiA6IFwiXCIpLFxuICApO1xuXG4gIC8vIERldGVybWluZSB0aGUgaW5pdGlhbCBidW1wIHN0YXR1cy4gQ0FUViB3aWxsIGFsd2F5cyBkbyBhIHBhdGNoIGV2ZW4gaWZcbiAgLy8gdGhlcmUgYXJlIG5vIGNvbW1pdHMsIHNvIGxvb2sgYXQgY29tbWl0cyBvdXJzZWx2ZXMgZmlyc3QgdG8gZGVjaWRlXG4gIC8vIGlmIHdlIGV2ZW4gc2hvdWxkIGRvIG5vdGhpbmcgYXQgYWxsLlxuICBjb25zdCBzaG91bGRSZWxlYXNlID0gaXNGaXJzdFJlbGVhc2VcbiAgICA/IHRydWVcbiAgICA6IGF3YWl0IGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyh7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgbGF0ZXN0VGFnLFxuICAgICAgICByZWxlYXNhYmxlQ29tbWl0czogb3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cyxcbiAgICAgIH0pO1xuXG4gIGNvbnN0IGNhdHYgPSBuZXcgQ29tbWl0QW5kVGFnVmVyc2lvbihvcHRpb25zLmJ1bXBQYWNrYWdlLCBjd2QsIHtcbiAgICB2ZXJzaW9uRmlsZSxcbiAgICBjaGFuZ2Vsb2dGaWxlLFxuICAgIHByZXJlbGVhc2UsXG4gICAgY29uZmlnT3B0aW9uczogb3B0aW9ucy52ZXJzaW9ucmNPcHRpb25zLFxuICAgIHRhZ1ByZWZpeCxcbiAgfSk7XG5cbiAgLy8gV2UgdXNlZCB0byB0cmFuc2xhdGUgYGlzRmlyc3RSZWxlYXNlYCB0byB0aGUgYC0tZmlyc3QtcmVsZWFzZWAgZmxhZyBvZiBDQVRWLlxuICAvLyBXaGF0IHRoYXQgZG9lcyBpcyBza2lwIGEgYnVtcCwgb25seSBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nLlxuICAvL1xuICAvLyBPdXIgYHsgYnVtcDogbm9uZSB9YCBkb2VzIHRoZSBzYW1lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IG92ZXIgdGhpc1xuICAvLyBmbGFnIGFueW1vcmUuXG4gIGxldCBidW1wVHlwZTogQnVtcFR5cGUgPVxuICAgIHNob3VsZFJlbGVhc2UgJiYgIWlzRmlyc3RSZWxlYXNlXG4gICAgICA/IHJlbGF0aXZlQnVtcFR5cGUobGF0ZXN0VmVyc2lvbiwgYXdhaXQgY2F0di5kcnlSdW4oKSlcbiAgICAgIDogeyBidW1wOiBcIm5vbmVcIiB9O1xuXG4gIGxvZ2dpbmcuaW5mbyhgQnVtcCBmcm9tIGNvbW1pdHM6ICR7cmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpfWApO1xuICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IGF3YWl0IHJhd1NoZWxsLmNhcHR1cmUob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBWRVJTSU9OOiBsYXRlc3RWZXJzaW9uLFxuICAgICAgICBTVUdHRVNURURfQlVNUDogcmVuZGVyQnVtcFR5cGUoYnVtcFR5cGUpLFxuICAgICAgICAuLi4obGF0ZXN0VGFnID8geyBMQVRFU1RfVEFHOiBsYXRlc3RUYWcgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobmV4dFZlcnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1bXBUeXBlID0gcGFyc2VCdW1wVHlwZShuZXh0VmVyc2lvbik7XG4gICAgICAgIGxvZ2dpbmcuaW5mbyhcbiAgICAgICAgICBgQnVtcCBmcm9tIG5leHRWZXJzaW9uQ29tbWFuZDogJHtyZW5kZXJCdW1wVHlwZShidW1wVHlwZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBuZXh0VmVyc2lvbkNvbW1hbmQgXCIke29wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kfVwiIHJldHVybmVkIGludmFsaWQgb3V0cHV0OiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNwZWN0IG1pbk1ham9yVmVyc2lvbiB0byBjb3JyZWN0IHRoZSByZXN1bHQgb2YgdGhlIG5leHRWZXJzaW9uQ29tbWFuZFxuICBpZiAobWluTWFqb3JWZXJzaW9uKSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHBlcmZvcm1CdW1wKGxhdGVzdFZlcnNpb24sIGJ1bXBUeXBlKTtcbiAgICBjb25zdCBbbWFqb3JWZXJzaW9uXSA9IGJ1bXBlZFZlcnNpb24uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IG1ham9yVmVyc2lvbk51bWJlciA9IHBhcnNlSW50KG1ham9yVmVyc2lvbiwgMTApO1xuICAgIGlmIChtYWpvclZlcnNpb25OdW1iZXIgPCBtaW5NYWpvclZlcnNpb24pIHtcbiAgICAgIGJ1bXBUeXBlID0geyBidW1wOiBcImFic29sdXRlXCIsIGFic29sdXRlOiBgJHttaW5NYWpvclZlcnNpb259LjAuMGAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgQ0FUViB3aXRoIHRoZSBvcHRpb25zIHdlIGxhbmRlZCBvbi4gSWYgd2UgZGVjaWRlZCBub3QgdG8gZG8gYSBidW1wLFxuICAvLyB3ZSB3aWxsIHVzZSB0aGlzIHRvIHJlZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbi5cbiAgY29uc3QgbmV3UmVsZWFzZSA9IGJ1bXBUeXBlLmJ1bXAgIT09IFwibm9uZVwiO1xuXG4gIC8vIElmIHdlJ3JlIG5vdCBkb2luZyBhIG5ldyByZWxlYXNlIGFuZCB0aGlzIGlzIG5vdCB0aGVcbiAgLy8gZmlyc3QgcmVsZWFzZSwgd2UncmUganVzdCByZWdlbmVyYXRpbmcgdGhlIHByZXZpb3VzIGNoYW5nZWxvZyBhZ2Fpbi5cbiAgaWYgKCFuZXdSZWxlYXNlICYmICFpc0ZpcnN0UmVsZWFzZSkge1xuICAgIGF3YWl0IGNhdHYucmVnZW5lcmF0ZVByZXZpb3VzQ2hhbmdlTG9nKGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHdlJ3JlIGVpdGhlciBkb2luZyBhIGJ1bXAgKyByZWxlYXNlLCBvciB3ZSdyZSByZWxlYXNpbmcgdGhlXG4gICAgLy8gZmlyc3QgdmVyc2lvbiBhcyAwLjAuMCAod2hpY2ggaXMgYWxyZWFkeSB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIHNvIHdlXG4gICAgLy8gc2tpcCBidW1waW5nKS5cbiAgICBhd2FpdCBjYXR2Lmludm9rZSh7XG4gICAgICByZWxlYXNlQXM6IG5ld1JlbGVhc2UgPyByZW5kZXJCdW1wVHlwZShidW1wVHlwZSkgOiB1bmRlZmluZWQsXG4gICAgICBza2lwQnVtcDogIW5ld1JlbGVhc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiB0aGF0IHdlIGVuZGVkIHVwIHdpdGhcbiAgY29uc3QgbmV3VmVyc2lvbiA9IChhd2FpdCB0cnlSZWFkVmVyc2lvbkZpbGUodmVyc2lvbkZpbGUpKS52ZXJzaW9uO1xuICBpZiAoIW5ld1ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bXAgZmFpbGVkOiAke3ZlcnNpb25GaWxlfSBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbiBzZXRgKTtcbiAgfVxuICBpZiAobWFqb3IpIHtcbiAgICBpZiAoIW5ld1ZlcnNpb24uc3RhcnRzV2l0aChgJHttYWpvcn0uYCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pbm9yKSB7XG4gICAgaWYgKCFuZXdWZXJzaW9uLnN0YXJ0c1dpdGgoYCR7bWFqb3J9LiR7bWlub3J9YCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1bXAgZmFpbGVkOiB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIG9ubHkgcHVibGlzaCB2JHttYWpvcn0uJHttaW5vcn0gcmVsZWFzZXMgLSBidW1wIHJlc3VsdGVkIGluICR7bmV3VmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBvcnQgY3VyZW50IHN0YXR1cyBpbnRvIHRoZSBkaXN0LyBkaXJlY3RvcnlcbiAgY29uc3QgbmV3VGFnID0gYCR7dGFnUHJlZml4fXYke25ld1ZlcnNpb259YDtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1bXBGaWxlLCBuZXdWZXJzaW9uKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlbGVhc2VUYWdGaWxlLCBuZXdUYWcpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBiYXNlZCBvbiByZWxlYXNlYWJsZSBjb21taXRzIHdoZXRoZXIgd2Ugc2hvdWxkIHJlbGVhc2Ugb3Igbm90XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhc05ld0ludGVyZXN0aW5nQ29tbWl0cyhvcHRpb25zOiB7XG4gIHJlbGVhc2FibGVDb21taXRzPzogc3RyaW5nO1xuICBsYXRlc3RUYWc6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIGAkTEFURVNUX1RBR2AgaXMgcHJvdmlkZWQgdG8gdGhlIGNvbW1hbmQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgLy8gKHJhdGhlciB0aGFuIGludGVycG9sYXRlZCBpbnRvIHRoZSBjb21tYW5kIHN0cmluZyksIGNvbnNpc3RlbnQgd2l0aCBob3dcbiAgLy8gYG5leHRWZXJzaW9uQ29tbWFuZGAgcmVjZWl2ZXMgaXQuXG4gIGNvbnN0IGZpbmRDb21taXRzID1cbiAgICBvcHRpb25zLnJlbGVhc2FibGVDb21taXRzID8/IFJlbGVhc2FibGVDb21taXRzLmV2ZXJ5Q29tbWl0KCkuY21kO1xuXG4gIGNvbnN0IGNvbW1pdHNTaW5jZUxhc3RUYWcgPSAoXG4gICAgYXdhaXQgcmF3U2hlbGwudHJ5Q2FwdHVyZShmaW5kQ29tbWl0cywge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyBMQVRFU1RfVEFHOiBvcHRpb25zLmxhdGVzdFRhZyB9LFxuICAgIH0pXG4gICk/LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBudW1Db21taXRzU2luY2VMYXN0VGFnID0gY29tbWl0c1NpbmNlTGFzdFRhZz8ubGVuZ3RoID8/IDA7XG4gIGxvZ2dpbmcuaW5mbyhcbiAgICBgTnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgJHtvcHRpb25zLmxhdGVzdFRhZ306ICR7bnVtQ29tbWl0c1NpbmNlTGFzdFRhZ31gLFxuICApO1xuXG4gIC8vIE5vdGhpbmcgdG8gcmVsZWFzZSByaWdodCBub3dcbiAgaWYgKG51bUNvbW1pdHNTaW5jZUxhc3RUYWcgPT09IDApIHtcbiAgICBsb2dnaW5nLmluZm8oXCJObyBuZXcgaW50ZXJlc3RpbmcgY29tbWl0cy5cIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeVJlYWRWZXJzaW9uRmlsZShcbiAgdmVyc2lvbkZpbGU6IHN0cmluZyxcbik6IFByb21pc2U8eyBjb250ZW50czogYW55OyB2ZXJzaW9uPzogc3RyaW5nOyBuZXdsaW5lOiBib29sZWFuIH0+IHtcbiAgaWYgKCFleGlzdHNTeW5jKHZlcnNpb25GaWxlKSkge1xuICAgIHJldHVybiB7IGNvbnRlbnRzOiB7fSwgbmV3bGluZTogdHJ1ZSB9O1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKHZlcnNpb25GaWxlLCBcInV0Zi04XCIpO1xuICBjb25zdCBjb250ZW50cyA9IEpTT04ucGFyc2UocmF3KTtcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnRzLFxuICAgIHZlcnNpb246IGNvbnRlbnRzLnZlcnNpb24sXG4gICAgbmV3bGluZTogcmF3LmVuZHNXaXRoKFwiXFxuXCIpLFxuICB9O1xufVxuXG5pbnRlcmZhY2UgTGF0ZXN0VGFnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgZ2l0IHJlcG9zaXRvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgLyoqXG4gICAqIE1ham9yIHZlcnNpb24gdG8gc2VsZWN0IGZyb20uXG4gICAqL1xuICByZWFkb25seSBtYWpvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1pbm9yIHZlcnNpb24gdG8gc2VsZWN0IGZyb20uXG4gICAqL1xuICByZWFkb25seSBtaW5vcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIEEgcHJlLXJlbGVhc2Ugc3VmZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIHRhZ3MuXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBsYXRlc3QgcmVsZWFzZSB0YWcuXG4gKiBAcGFyYW0gbWFqb3IgKG9wdGlvbmFsKSBBIG1ham9yIHZlcnNpb24gbGluZSB0byBzZWxlY3QgZnJvbVxuICogQHBhcmFtIHByZXJlbGVhc2UgKG9wdGlvbmFsKSBBIHByZS1yZWxlYXNlIHN1ZmZpeC5cbiAqIEByZXR1cm5zIHRoZSBsYXRlc3QgdGFnLCBhbmQgd2hldGhlciBpdCBpcyB0aGUgZmlyc3QgcmVsZWFzZSBvciBub3RcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lTGF0ZXN0VGFnKG9wdGlvbnM6IExhdGVzdFRhZ09wdGlvbnMpOiB7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VGFnOiBzdHJpbmc7XG4gIGlzRmlyc3RSZWxlYXNlOiBib29sZWFuO1xufSB7XG4gIGNvbnN0IHsgY3dkLCBtYWpvciwgbWlub3IsIHByZXJlbGVhc2UsIHByZWZpeCB9ID0gb3B0aW9ucztcblxuICAvLyBmaWx0ZXIgb25seSB0YWdzIGZvciB0aGlzIHByZWZpeCBhbmQgbWFqb3IgdmVyc2lvbiBpZiBzcGVjaWZpZWQgKHN0YXJ0IHdpdGggXCJ2Tk4uXCIpLlxuICBsZXQgcHJlZml4RmlsdGVyOiBzdHJpbmc7XG4gIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkICYmIG1pbm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9diR7bWFqb3J9LiR7bWlub3J9LipgO1xuICB9IGVsc2UgaWYgKG1ham9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXhGaWx0ZXIgPSBgJHtwcmVmaXh9diR7bWFqb3J9LipgO1xuICB9IGVsc2Uge1xuICAgIHByZWZpeEZpbHRlciA9IGAke3ByZWZpeH12KmA7XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBnaXQuY2FwdHVyZShcbiAgICBbXG4gICAgICBcIi1jXCIsXG4gICAgICBcInZlcnNpb25zb3J0LnN1ZmZpeD0tXCIsIC8vIG1ha2VzIHN1cmUgcHJlLXJlbGVhc2UgdmVyc2lvbnMgYXJlIGxpc3RlZCBhZnRlciB0aGUgcHJpbWFyeSB2ZXJzaW9uXG4gICAgICBcInRhZ1wiLFxuICAgICAgXCItLXNvcnQ9LXZlcnNpb246cmVmbmFtZVwiLCAvLyBzb3J0IGFzIHZlcnNpb25zIGFuZCBub3QgbGV4aWNvZ3JhcGhpY2FsbHlcbiAgICAgIFwiLS1saXN0XCIsXG4gICAgICBwcmVmaXhGaWx0ZXIsXG4gICAgXSxcbiAgICB7IGN3ZCB9LFxuICApO1xuXG4gIGxldCB0YWdzID0gc3Rkb3V0Py5zcGxpdChcIlxcblwiKTtcblxuICAvLyBpZiBwcmVyZWxlYXNlIGlzIHNldCBhbmQgdGhlcmUgYXJlIGV4aXN0aW5nIHByZXJlbGVhc2UgdGFncywgZmlsdGVyIHZlcnNpb25zIHRoYXQgZW5kIHdpdGggXCItUFJFLmRkZFwiLlxuICBjb25zdCBwcmVyZWxlYXNlVGFncyA9IHRhZ3MuZmlsdGVyKCh4KSA9PlxuICAgIG5ldyBSZWdFeHAoYC0ke3ByZXJlbGVhc2V9XFxcXC5bMC05XSskYCkudGVzdCh4KSxcbiAgKTtcbiAgaWYgKHByZXJlbGVhc2UgJiYgcHJlcmVsZWFzZVRhZ3MubGVuZ3RoID4gMCkge1xuICAgIGxldCBwcmVyZWxlYXNlVGFnID0gcHJlcmVsZWFzZVRhZ3NbMF07XG5cbiAgICAvKipcbiAgICAgKiBDb3ZlciB0aGUgZm9sbG93aW5nIGNhc2Ugc3BlY2lmaWNhbGx5XG4gICAgICogMSAtIHYxLjAuMFxuICAgICAqIDIgLSB2MS4wLjEtYmV0YS4wXG4gICAgICogMyAtIHYxLjAuMS1iZXRhLjFcbiAgICAgKiA0IC0gdjEuMC4xXG4gICAgICogNSAtIG5vdyBwdWJsaXNoIGEgbmV3IHJlbGVhc2Ugb24gdGhlIHByZXJlbGVhc2UgYnJhbmNoXG4gICAgICogICAgYnkgc2V0dGluZyB0aGUgbGF0ZXN0VGFnIGFzIHYxLjAuMSBpbnN0ZWFkIG9mIHYxLjAuMS1iZXRhLjFcbiAgICAgKi9cbiAgICBjb25zdCByZWxlYXNlVGFncyA9IHRhZ3MuZmlsdGVyKCh4KSA9PlxuICAgICAgbmV3IFJlZ0V4cChgXiR7cHJlZml4fXYoWzAtOV0rKVxcXFwuKFswLTldKylcXFxcLihbMC05XSspJGApLnRlc3QoeCksXG4gICAgKTtcblxuICAgIGxldCByZWxlYXNlVGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlbGVhc2VUYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbGVhc2VUYWcgPSByZWxlYXNlVGFnc1swXTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4KSB7XG4gICAgICByZWxlYXNlVGFnID0gcmVsZWFzZVRhZz8uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgcHJlcmVsZWFzZVRhZyA9IHByZXJlbGVhc2VUYWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChyZWxlYXNlVGFnICYmIGNvbXBhcmUocmVsZWFzZVRhZywgcHJlcmVsZWFzZVRhZykgPT09IDEpIHtcbiAgICAgIHRhZ3MgPSByZWxlYXNlVGFncztcbiAgICB9IGVsc2Uge1xuICAgICAgdGFncyA9IHByZXJlbGVhc2VUYWdzO1xuICAgIH1cbiAgfVxuXG4gIHRhZ3MgPSB0YWdzLmZpbHRlcigoeCkgPT4geCk7XG5cbiAgLy8gaWYgYSBwcmUtcmVsZWFzZSB0YWcgaXMgdXNlZCwgdGhlbiBhZGQgaXQgdG8gdGhlIGluaXRpYWwgdmVyc2lvblxuICBsZXQgaXNGaXJzdFJlbGVhc2UgPSBmYWxzZTtcbiAgbGV0IGxhdGVzdFRhZztcblxuICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgbGF0ZXN0VGFnID0gdGFnc1swXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbml0aWFsID0gYCR7cHJlZml4fXYke21ham9yID8/IDB9LiR7bWlub3IgPz8gMH0uMGA7XG4gICAgbGF0ZXN0VGFnID0gcHJlcmVsZWFzZSA/IGAke2luaXRpYWx9LSR7cHJlcmVsZWFzZX0uMGAgOiBpbml0aWFsO1xuICAgIGlzRmlyc3RSZWxlYXNlID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHJlbW92ZSB0YWcgcHJlZml4IChpZiBleGlzdHMpXG4gIGxldCBsYXRlc3RWZXJzaW9uID0gbGF0ZXN0VGFnO1xuICBpZiAocHJlZml4ICYmIGxhdGVzdFZlcnNpb24uc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgbGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFZlcnNpb24uc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIFwidlwiIHByZWZpeCAoaWYgZXhpc3RzKVxuICBpZiAobGF0ZXN0VmVyc2lvbi5zdGFydHNXaXRoKFwidlwiKSkge1xuICAgIGxhdGVzdFZlcnNpb24gPSBsYXRlc3RWZXJzaW9uLnN1YnN0cmluZygxKTtcbiAgfVxuXG4gIHJldHVybiB7IGxhdGVzdFZlcnNpb24sIGxhdGVzdFRhZywgaXNGaXJzdFJlbGVhc2UgfTtcbn1cbiJdfQ==
@@ -48,7 +48,7 @@ const PUBLISH_JOB_PREFIX = "release_";
48
48
  * Under the hood, it uses https://github.com/cdklabs/publib
49
49
  */
50
50
  class Publisher extends component_1.Component {
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Publisher", version: "0.100.6" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Publisher", version: "0.101.0" };
52
52
  static PUBLISH_GIT_TASK_NAME = "publish:git";
53
53
  buildJobId;
54
54
  artifactName;
@@ -7,7 +7,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
7
  * and release artifact automation
8
8
  */
9
9
  class ReleaseTrigger {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.ReleaseTrigger", version: "0.100.6" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.ReleaseTrigger", version: "0.101.0" };
11
11
  /**
12
12
  * Creates a manual release trigger.
13
13
  *
@@ -64,7 +64,7 @@ const DEPENDENT_JOB_CONDITIONAL = `needs.${BUILD_JOBID}.outputs.${TAG_EXISTS_OUT
64
64
  * By default, no branches are released. To add branches, call `addBranch()`.
65
65
  */
66
66
  class Release extends component_1.Component {
67
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Release", version: "0.100.6" };
67
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.release.Release", version: "0.101.0" };
68
68
  static ANTI_TAMPER_CMD = "git diff --ignore-space-at-eol --exit-code";
69
69
  /**
70
70
  * Returns the `Release` component of a project or `undefined` if the project
@@ -68,7 +68,7 @@ var RenovatebotMinimumReleaseAgeBehaviour;
68
68
  * Ignores the versions controlled by Projen.
69
69
  */
70
70
  class Renovatebot extends component_1.Component {
71
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Renovatebot", version: "0.100.6" };
71
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Renovatebot", version: "0.101.0" };
72
72
  /**
73
73
  * The file holding the renovatebot configuration
74
74
  */
package/lib/run-task.cjs CHANGED
@@ -1641,7 +1641,7 @@ var require_package = __commonJS({
1641
1641
  },
1642
1642
  devDependencies: {
1643
1643
  "@biomejs/biome": "^2",
1644
- "@jsii/check-node": "^1.136.0",
1644
+ "@jsii/check-node": "^1.137.0",
1645
1645
  "@types/conventional-changelog-config-spec": "^2.1.5",
1646
1646
  "@types/ini": "^1.3.34",
1647
1647
  "@types/jest": "^30",
@@ -1662,9 +1662,9 @@ var require_package = __commonJS({
1662
1662
  jest: "^30",
1663
1663
  "jest-junit": "^17",
1664
1664
  jsii: "6.0.x",
1665
- "jsii-diff": "^1.136.0",
1665
+ "jsii-diff": "^1.137.0",
1666
1666
  "jsii-docgen": "^10.5.0",
1667
- "jsii-pacmak": "^1.136.0",
1667
+ "jsii-pacmak": "^1.137.0",
1668
1668
  "jsii-rosetta": "6.0.x",
1669
1669
  json2jsii: "^0.5.19",
1670
1670
  "license-checker": "^25.0.1",
@@ -1733,7 +1733,7 @@ var require_package = __commonJS({
1733
1733
  publishConfig: {
1734
1734
  access: "public"
1735
1735
  },
1736
- version: "0.100.6",
1736
+ version: "0.101.0",
1737
1737
  jest: {
1738
1738
  coverageProvider: "v8",
1739
1739
  coverageReporters: [
@@ -14295,7 +14295,7 @@ function createPath(path62) {
14295
14295
 
14296
14296
  // src/common.ts
14297
14297
  var PROJEN_DIR = ".projen";
14298
- var TASKS_MANIFEST_VERSION = 1;
14298
+ var TASKS_MANIFEST_VERSION = 3;
14299
14299
  var IS_TEST_RUN = process.env.NODE_ENV === "test";
14300
14300
  var packageVersion = require_package().version;
14301
14301
 
@@ -14408,71 +14408,23 @@ function shimTool(file) {
14408
14408
  }
14409
14409
  var npm = shimTool("npm");
14410
14410
  var npx = shimTool("npx");
14411
- var rawShell = {
14412
- /**
14413
- * Runs a command line through the system shell and returns a normalized
14414
- * result. Never throws for a non-zero exit (that is reported via `status`);
14415
- * a spawn failure is reported via `error`.
14416
- *
14417
- * The caller is responsible for supplying the full `env`.
14418
- */
14419
- exec(command, options) {
14420
- debug(`${command} (cwd: ${options.cwd})`);
14421
- const result = child_process.spawnSync(command, {
14422
- cwd: options.cwd,
14423
- shell: true,
14424
- maxBuffer: MAX_BUFFER,
14425
- env: options.env,
14426
- // "pipe" for STDERR (when capturing) means it appears in exceptions.
14427
- stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit"
14428
- });
14429
- return {
14430
- status: result.status,
14431
- stdout: result.stdout ?? null,
14432
- stderr: result.stderr ?? null,
14433
- error: result.error
14434
- };
14435
- },
14436
- /**
14437
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT.
14438
- * Rejects if the command exits non-zero.
14439
- */
14440
- capture: async (command, options) => {
14441
- const result = rawShell.exec(command, {
14442
- cwd: options.cwd,
14443
- env: { ...process.env, ...options.env },
14444
- capture: true
14445
- });
14446
- if (result.error) {
14447
- throw result.error;
14448
- }
14449
- if (result.status !== 0) {
14450
- const error = new Error(
14451
- `Command failed (exit code ${result.status}): ${command}`
14452
- );
14453
- error.status = result.status;
14454
- error.stderr = result.stderr;
14455
- throw error;
14456
- }
14457
- return (result.stdout?.toString("utf-8") ?? "").trim();
14458
- },
14459
- /**
14460
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT,
14461
- * or `undefined` if the command failed or produced no output.
14462
- */
14463
- tryCapture: async (command, options) => {
14464
- const result = rawShell.exec(command, {
14465
- cwd: options.cwd,
14466
- env: { ...process.env, ...options.env },
14467
- capture: true
14468
- });
14469
- if (result.error || result.status !== 0) {
14470
- return void 0;
14471
- }
14472
- const out = (result.stdout?.toString("utf-8") ?? "").trim();
14473
- return out || void 0;
14474
- }
14475
- };
14411
+ function systemShell(command, options) {
14412
+ debug(`${command} (cwd: ${options.cwd})`);
14413
+ const result = child_process.spawnSync(command, {
14414
+ cwd: options.cwd,
14415
+ shell: true,
14416
+ maxBuffer: MAX_BUFFER,
14417
+ env: options.env,
14418
+ // "pipe" for STDERR (when capturing) means it appears in exceptions.
14419
+ stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit"
14420
+ });
14421
+ return {
14422
+ status: result.status,
14423
+ stdout: result.stdout ?? null,
14424
+ stderr: result.stderr ?? null,
14425
+ error: result.error
14426
+ };
14427
+ }
14476
14428
 
14477
14429
  // src/cli/task-runtime.ts
14478
14430
  var parseConflictJSONModule = require_lib2();
@@ -14480,6 +14432,9 @@ var parseConflictJSON = parseConflictJSONModule?.default ?? parseConflictJSONMod
14480
14432
  var ENV_TRIM_LEN = 20;
14481
14433
  var ARGS_MARKER = "$@";
14482
14434
  var QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
14435
+ function quoteArg(arg) {
14436
+ return '"' + arg.replace(/(["$`\\])/g, "\\$1") + '"';
14437
+ }
14483
14438
  var TaskRuntime = class _TaskRuntime {
14484
14439
  /**
14485
14440
  * The project-relative path of the tasks manifest file.
@@ -14636,7 +14591,11 @@ var RunTask = class {
14636
14591
  this.logDebug((0, import_chalk2.gray)("No actions have been specified for this task."));
14637
14592
  return;
14638
14593
  }
14639
- this.env = await this.resolveEnvironment(this.envParam, parents);
14594
+ this.env = await this.resolveEnvironment(
14595
+ this.envParam,
14596
+ parents,
14597
+ this.resolveShell()
14598
+ );
14640
14599
  const envlogs = [];
14641
14600
  for (const [k, v] of Object.entries(this.env)) {
14642
14601
  const vv = v ?? "";
@@ -14646,7 +14605,7 @@ var RunTask = class {
14646
14605
  if (envlogs.length) {
14647
14606
  this.logDebug((0, import_chalk2.gray)(`${(0, import_chalk2.underline)("env")}: ${envlogs.join(" ")}`));
14648
14607
  }
14649
- if (!await this.evalCondition(task)) {
14608
+ if (!await this.evalCondition(task, this.resolveShell())) {
14650
14609
  this.log("condition exited with non-zero - skipping");
14651
14610
  return;
14652
14611
  }
@@ -14663,7 +14622,8 @@ var RunTask = class {
14663
14622
  );
14664
14623
  }
14665
14624
  for (const step of task.steps) {
14666
- if (!await this.evalCondition(step)) {
14625
+ const stepShell = this.resolveShell(step);
14626
+ if (!await this.evalCondition(step, stepShell)) {
14667
14627
  this.log("condition exited with non-zero - skipping");
14668
14628
  continue;
14669
14629
  }
@@ -14683,42 +14643,50 @@ var RunTask = class {
14683
14643
  );
14684
14644
  }
14685
14645
  const execs = step.exec ? [step.exec] : [];
14686
- const env = await this.evalEnvironment(step.env ?? {});
14646
+ const env = await this.evalEnvironment(step.env ?? {}, stepShell);
14687
14647
  if (step.builtin) {
14688
14648
  execs.push(this.renderBuiltin(step.builtin));
14689
14649
  }
14650
+ if (step.execArgs) {
14651
+ const argv = [];
14652
+ let placed = false;
14653
+ for (const element of step.execArgs) {
14654
+ if (element === ARGS_MARKER) {
14655
+ argv.push(...argsList);
14656
+ placed = true;
14657
+ } else {
14658
+ argv.push(element);
14659
+ }
14660
+ }
14661
+ if (!placed) {
14662
+ argv.push(...argsList);
14663
+ }
14664
+ execs.push(argv);
14665
+ }
14690
14666
  for (const exec of execs) {
14691
- let hasError = false;
14692
14667
  let command = exec;
14693
- if (command.includes(QUOTED_ARGS_MARKER)) {
14694
- command = command.replace(
14695
- QUOTED_ARGS_MARKER,
14696
- argsList.map((arg) => `'${arg}'`).join(" ")
14697
- );
14698
- } else if (command.includes(ARGS_MARKER)) {
14699
- command = command.replace(ARGS_MARKER, argsList.join(" "));
14700
- } else {
14701
- command = [command, ...argsList].join(" ");
14702
- }
14703
- const cwd2 = step.cwd;
14704
- try {
14705
- const result = await this.shell({
14706
- command,
14707
- cwd: cwd2,
14708
- extraEnv: env
14709
- });
14710
- hasError = result.status !== 0;
14711
- } catch (e) {
14712
- if (e?.message?.startsWith("non-zero exit code:")) {
14713
- hasError = true;
14668
+ if (typeof command === "string") {
14669
+ if (command.includes(QUOTED_ARGS_MARKER)) {
14670
+ command = command.replace(
14671
+ QUOTED_ARGS_MARKER,
14672
+ argsList.map(quoteArg).join(" ")
14673
+ );
14674
+ } else if (command.includes(ARGS_MARKER)) {
14675
+ command = command.replace(ARGS_MARKER, argsList.join(" "));
14676
+ } else {
14677
+ command = [command, ...argsList].join(" ");
14714
14678
  }
14715
- throw e;
14716
14679
  }
14717
- if (hasError) {
14680
+ const cwd2 = step.cwd;
14681
+ const result = await this.shell({
14682
+ command,
14683
+ cwd: cwd2,
14684
+ extraEnv: env,
14685
+ shell: stepShell
14686
+ });
14687
+ if (result.status !== 0) {
14718
14688
  throw new Error(
14719
- `Task "${this.fullname}" failed when executing "${command}" (cwd: ${(0, import_path.resolve)(
14720
- cwd2 ?? this.workdir
14721
- )})`
14689
+ `Task "${this.fullname}" failed when executing "${Array.isArray(command) ? command.join(" ") : command}" (cwd: ${(0, import_path.resolve)(cwd2 ?? this.workdir)})`
14722
14690
  );
14723
14691
  }
14724
14692
  }
@@ -14731,15 +14699,15 @@ var RunTask = class {
14731
14699
  * evaluates to false (exits with non-zero), indicating that the task should
14732
14700
  * be skipped.
14733
14701
  */
14734
- async evalCondition(taskOrStep) {
14702
+ async evalCondition(taskOrStep, shell) {
14735
14703
  if (!taskOrStep.condition) {
14736
14704
  return true;
14737
14705
  }
14738
14706
  this.log((0, import_chalk2.gray)(`${(0, import_chalk2.underline)("condition")}: ${taskOrStep.condition}`));
14739
14707
  const result = await this.shell({
14740
14708
  command: taskOrStep.condition,
14741
- logprefix: "condition: ",
14742
- quiet: true
14709
+ quiet: true,
14710
+ shell
14743
14711
  });
14744
14712
  if (result.status === 0) {
14745
14713
  return true;
@@ -14750,12 +14718,17 @@ var RunTask = class {
14750
14718
  /**
14751
14719
  * Evaluates environment variables from shell commands (e.g. `$(xx)`)
14752
14720
  */
14753
- async evalEnvironment(env) {
14721
+ async evalEnvironment(env, shell) {
14754
14722
  const output = {};
14755
14723
  for (const [key, value] of Object.entries(env ?? {})) {
14756
14724
  if (String(value).startsWith("$(") && String(value).endsWith(")")) {
14757
14725
  const query = value.substring(2, value.length - 1);
14758
- const result = await this.shellEval({ command: query });
14726
+ const result = await this.shell({
14727
+ command: query,
14728
+ quiet: true,
14729
+ captureOutput: true,
14730
+ shell
14731
+ });
14759
14732
  if (result.status !== 0) {
14760
14733
  const error = result.error ? result.error.stack : result.stderr?.toString().trim() || result.stdout?.toString().trim() || `command exited with code ${result.status}`;
14761
14734
  warn(
@@ -14778,7 +14751,7 @@ var RunTask = class {
14778
14751
  * `$(xx)` for allowing environment to be evaluated by executing a shell
14779
14752
  * command and obtaining its result.
14780
14753
  */
14781
- async resolveEnvironment(envParam, parents) {
14754
+ async resolveEnvironment(envParam, parents, shell) {
14782
14755
  let env = this.runtime.manifest.env ?? {};
14783
14756
  for (const parent of parents) {
14784
14757
  env = {
@@ -14791,7 +14764,14 @@ var RunTask = class {
14791
14764
  ...this.task.env ?? {},
14792
14765
  ...envParam
14793
14766
  };
14794
- return this.evalEnvironment(env ?? {});
14767
+ return this.evalEnvironment(env, shell);
14768
+ }
14769
+ /**
14770
+ * Resolves the shell for a step's command (or the task's, when no step is
14771
+ * given): step, then task, then project default, then "projen".
14772
+ */
14773
+ resolveShell(step) {
14774
+ return step?.shell ?? this.task.shell ?? this.runtime.manifest.shell ?? "projen";
14795
14775
  }
14796
14776
  /**
14797
14777
  * Returns the "full name" of the task which includes all it's parent task names concatenated by chevrons.
@@ -14812,10 +14792,9 @@ var RunTask = class {
14812
14792
  const quiet = options.quiet ?? false;
14813
14793
  if (!quiet) {
14814
14794
  const log2 = new Array();
14815
- if (options.logprefix) {
14816
- log2.push(options.logprefix);
14817
- }
14818
- log2.push(options.command);
14795
+ log2.push(
14796
+ Array.isArray(options.command) ? options.command.join(" ") : options.command
14797
+ );
14819
14798
  if (options.cwd) {
14820
14799
  log2.push(`(cwd: ${options.cwd})`);
14821
14800
  }
@@ -14827,30 +14806,63 @@ var RunTask = class {
14827
14806
  `invalid workdir (cwd): ${cwd2} must be an existing directory`
14828
14807
  );
14829
14808
  }
14809
+ const shell = options.shell ?? "projen";
14810
+ if (typeof shell === "string" && shell !== "projen" && shell !== "system") {
14811
+ throw new Error(
14812
+ `unknown built-in shell ${JSON.stringify(
14813
+ shell
14814
+ )}; use the built-in "projen" or "system" shells, or a TaskShell.command([...]) invocation`
14815
+ );
14816
+ }
14817
+ const capture2 = options.captureOutput ?? false;
14818
+ const command = options.command;
14830
14819
  const env = {
14831
14820
  ...process.env,
14832
14821
  ...this.env,
14833
14822
  ...options.extraEnv
14834
14823
  };
14835
- const capture2 = Array.isArray(options.spawnOptions?.stdio);
14836
- if (process.platform === "win32") {
14837
- const result = await $2.raw`${options.command}`.cwd(cwd2).env(env).stdout(capture2 ? "piped" : "inherit").stderr(capture2 ? "piped" : "inherit").noThrow();
14838
- return {
14839
- status: result.code,
14840
- stdout: capture2 ? Buffer.from(result.stdoutBytes) : null,
14841
- stderr: capture2 ? Buffer.from(result.stderrBytes) : null
14842
- };
14824
+ if (shell === "system") {
14825
+ if (Array.isArray(command)) {
14826
+ const [program, ...args] = command;
14827
+ try {
14828
+ tool(program).run(args, { cwd: cwd2, env, inheritStdio: true });
14829
+ return { status: 0 };
14830
+ } catch (e) {
14831
+ if (typeof e?.status === "number") {
14832
+ return { status: e.status };
14833
+ }
14834
+ throw e;
14835
+ }
14836
+ }
14837
+ return systemShell(command, { cwd: cwd2, env, capture: capture2 });
14843
14838
  }
14844
- return rawShell.exec(options.command, { cwd: cwd2, env, capture: capture2 });
14839
+ const builder = this.buildDaxCommand(command, shell);
14840
+ const result = await builder.cwd(cwd2).env(env).stdout(capture2 ? "piped" : "inherit").stderr(capture2 ? "piped" : "inherit").noThrow();
14841
+ return {
14842
+ status: result.code,
14843
+ stdout: capture2 ? Buffer.from(result.stdoutBytes) : null,
14844
+ stderr: capture2 ? Buffer.from(result.stderrBytes) : null
14845
+ };
14845
14846
  }
14846
- async shellEval(options) {
14847
- return this.shell({
14848
- quiet: true,
14849
- ...options,
14850
- spawnOptions: {
14851
- stdio: ["inherit", "pipe", "pipe"]
14852
- }
14853
- });
14847
+ /**
14848
+ * Builds the dax command for the "projen" shell or an explicit invocation.
14849
+ * (The "system" shell is handled host-side, not here.) `command` is a shell
14850
+ * line (string) or an `execArgs` argv (string[]); `shell` is `"projen"` or an
14851
+ * invocation argv such as `["bash", "-c"]`.
14852
+ */
14853
+ buildDaxCommand(command, shell) {
14854
+ if (Array.isArray(shell)) {
14855
+ const [program, ...flags] = shell;
14856
+ const commandLine = Array.isArray(command) ? command.map(quoteArg).join(" ") : command;
14857
+ return $2`${program} ${[...flags, commandLine]}`;
14858
+ }
14859
+ return Array.isArray(command) ? (
14860
+ // execArgs: shell-free argv (each element escaped; `.cmd` shims resolved).
14861
+ $2`${command[0]} ${command.slice(1)}`
14862
+ ) : (
14863
+ // string command, parsed in-process by dax's cross-platform shell.
14864
+ $2.raw`${command}`
14865
+ );
14854
14866
  }
14855
14867
  renderBuiltin(builtin) {
14856
14868
  let moduleRoot = __dirname;
@@ -45,7 +45,7 @@ const util_1 = require("./util");
45
45
  * Use this for creating example code files or other resources.
46
46
  */
47
47
  class SampleFile extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleFile", version: "0.100.6" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleFile", version: "0.101.0" };
49
49
  filePath;
50
50
  options;
51
51
  /**
@@ -96,7 +96,7 @@ exports.SampleFile = SampleFile;
96
96
  * Renders the given files into the directory if the directory does not exist. Use this to create sample code files
97
97
  */
98
98
  class SampleDir extends component_1.Component {
99
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleDir", version: "0.100.6" };
99
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SampleDir", version: "0.101.0" };
100
100
  dir;
101
101
  options;
102
102
  /**
@@ -9,7 +9,7 @@ const textfile_1 = require("./textfile");
9
9
  */
10
10
  class SourceCode extends component_1.Component {
11
11
  filePath;
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SourceCode", version: "0.100.6" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SourceCode", version: "0.101.0" };
13
13
  file;
14
14
  indentLevel = 0;
15
15
  indent;