projen 0.100.7 → 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 (157) hide show
  1. package/.jsii +602 -95
  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 +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.js +115 -104
  34. package/lib/common.d.ts +1 -1
  35. package/lib/common.js +2 -2
  36. package/lib/component.js +1 -1
  37. package/lib/dependencies.js +1 -1
  38. package/lib/dev-env.js +1 -1
  39. package/lib/docker-compose/docker-compose-service.js +1 -1
  40. package/lib/docker-compose/docker-compose.js +1 -1
  41. package/lib/file.js +1 -1
  42. package/lib/gitattributes.js +1 -1
  43. package/lib/github/actions-provider.js +1 -1
  44. package/lib/github/auto-approve.js +1 -1
  45. package/lib/github/auto-merge.js +1 -1
  46. package/lib/github/auto-queue.js +1 -1
  47. package/lib/github/dependabot.js +1 -1
  48. package/lib/github/dependency-review.js +1 -1
  49. package/lib/github/github-credentials.js +1 -1
  50. package/lib/github/github-project.js +1 -1
  51. package/lib/github/github.js +1 -1
  52. package/lib/github/merge-queue.js +1 -1
  53. package/lib/github/mergify.js +1 -1
  54. package/lib/github/pr-template.js +1 -1
  55. package/lib/github/pull-request-backport.js +1 -1
  56. package/lib/github/pull-request-lint.js +1 -1
  57. package/lib/github/stale.js +1 -1
  58. package/lib/github/task-workflow-job.js +1 -1
  59. package/lib/github/task-workflow.js +1 -1
  60. package/lib/github/workflow-actions.js +1 -1
  61. package/lib/github/workflow-jobs.js +1 -1
  62. package/lib/github/workflow-steps.js +1 -1
  63. package/lib/github/workflows.js +1 -1
  64. package/lib/gitlab/configuration.js +1 -1
  65. package/lib/gitlab/gitlab-configuration.js +1 -1
  66. package/lib/gitlab/nested-configuration.js +1 -1
  67. package/lib/gitpod.js +1 -1
  68. package/lib/ignore-file.js +1 -1
  69. package/lib/index.d.ts +1 -0
  70. package/lib/index.js +2 -1
  71. package/lib/ini.js +1 -1
  72. package/lib/java/java-project.js +1 -1
  73. package/lib/java/junit.js +1 -1
  74. package/lib/java/maven-compile.js +1 -1
  75. package/lib/java/maven-packaging.js +1 -1
  76. package/lib/java/maven-sample.js +1 -1
  77. package/lib/java/pom.js +2 -2
  78. package/lib/java/projenrc.js +1 -1
  79. package/lib/javascript/biome/biome.js +1 -1
  80. package/lib/javascript/bundler.js +1 -1
  81. package/lib/javascript/eslint.js +1 -1
  82. package/lib/javascript/jest.js +4 -4
  83. package/lib/javascript/license-checker.js +1 -1
  84. package/lib/javascript/node-package.js +1 -1
  85. package/lib/javascript/node-project.js +1 -1
  86. package/lib/javascript/npm-config.js +1 -1
  87. package/lib/javascript/prettier.js +1 -1
  88. package/lib/javascript/projenrc.js +1 -1
  89. package/lib/javascript/typescript-config.js +2 -2
  90. package/lib/javascript/upgrade-dependencies.js +2 -2
  91. package/lib/javascript/yarnrc.js +1 -1
  92. package/lib/json-patch.js +1 -1
  93. package/lib/json.js +1 -1
  94. package/lib/license.js +1 -1
  95. package/lib/logger.js +1 -1
  96. package/lib/makefile.js +1 -1
  97. package/lib/object-file.js +1 -1
  98. package/lib/project-build.js +1 -1
  99. package/lib/project-tree.js +1 -1
  100. package/lib/project.js +1 -1
  101. package/lib/projects.js +1 -1
  102. package/lib/projenrc-json.js +1 -1
  103. package/lib/projenrc.js +1 -1
  104. package/lib/python/pip.js +1 -1
  105. package/lib/python/poetry.js +2 -2
  106. package/lib/python/projenrc.js +1 -1
  107. package/lib/python/pyproject-toml-file.js +1 -1
  108. package/lib/python/pytest-sample.js +1 -1
  109. package/lib/python/pytest.js +1 -1
  110. package/lib/python/python-project.js +1 -1
  111. package/lib/python/python-sample.js +1 -1
  112. package/lib/python/requirements-file.js +1 -1
  113. package/lib/python/setuppy.js +1 -1
  114. package/lib/python/setuptools.js +1 -1
  115. package/lib/python/uv.js +1 -1
  116. package/lib/python/venv.js +1 -1
  117. package/lib/readme.js +1 -1
  118. package/lib/release/bump-version.d.ts +1 -1
  119. package/lib/release/bump-version.js +6 -2
  120. package/lib/release/publisher.js +1 -1
  121. package/lib/release/release-trigger.js +1 -1
  122. package/lib/release/release.js +1 -1
  123. package/lib/renovatebot.js +1 -1
  124. package/lib/run-task.cjs +107 -131
  125. package/lib/sample-file.js +2 -2
  126. package/lib/source-code.js +1 -1
  127. package/lib/task-model.d.ts +119 -3
  128. package/lib/task-model.js +1 -1
  129. package/lib/task-shell.d.ts +63 -0
  130. package/lib/task-shell.js +87 -0
  131. package/lib/task.d.ts +19 -2
  132. package/lib/task.js +46 -11
  133. package/lib/tasks.d.ts +13 -0
  134. package/lib/tasks.js +19 -2
  135. package/lib/testing.js +1 -1
  136. package/lib/textfile.js +1 -1
  137. package/lib/toml.js +1 -1
  138. package/lib/typescript/projenrc-ts.js +1 -1
  139. package/lib/typescript/projenrc.js +1 -1
  140. package/lib/typescript/typescript-typedoc.js +1 -1
  141. package/lib/typescript/typescript.js +5 -5
  142. package/lib/util/exec.d.ts +33 -69
  143. package/lib/util/exec.js +57 -51
  144. package/lib/version.d.ts +1 -1
  145. package/lib/version.js +5 -5
  146. package/lib/vscode/devcontainer.js +1 -1
  147. package/lib/vscode/extensions.js +1 -1
  148. package/lib/vscode/launch-config.js +1 -1
  149. package/lib/vscode/settings.js +1 -1
  150. package/lib/vscode/vscode.js +1 -1
  151. package/lib/web/next.js +3 -3
  152. package/lib/web/postcss.js +1 -1
  153. package/lib/web/react.js +3 -3
  154. package/lib/web/tailwind.js +1 -1
  155. package/lib/xmlfile.js +1 -1
  156. package/lib/yaml.js +1 -1
  157. package/package.json +1 -1
package/lib/run-task.cjs CHANGED
@@ -1733,7 +1733,7 @@ var require_package = __commonJS({
1733
1733
  publishConfig: {
1734
1734
  access: "public"
1735
1735
  },
1736
- version: "0.100.7",
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 = 2;
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,7 +14643,7 @@ 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
  }
@@ -14704,13 +14664,12 @@ var RunTask = class {
14704
14664
  execs.push(argv);
14705
14665
  }
14706
14666
  for (const exec of execs) {
14707
- let hasError = false;
14708
14667
  let command = exec;
14709
14668
  if (typeof command === "string") {
14710
14669
  if (command.includes(QUOTED_ARGS_MARKER)) {
14711
14670
  command = command.replace(
14712
14671
  QUOTED_ARGS_MARKER,
14713
- argsList.map((arg) => `'${arg}'`).join(" ")
14672
+ argsList.map(quoteArg).join(" ")
14714
14673
  );
14715
14674
  } else if (command.includes(ARGS_MARKER)) {
14716
14675
  command = command.replace(ARGS_MARKER, argsList.join(" "));
@@ -14719,20 +14678,13 @@ var RunTask = class {
14719
14678
  }
14720
14679
  }
14721
14680
  const cwd2 = step.cwd;
14722
- try {
14723
- const result = await this.shell({
14724
- command,
14725
- cwd: cwd2,
14726
- extraEnv: env
14727
- });
14728
- hasError = result.status !== 0;
14729
- } catch (e) {
14730
- if (e?.message?.startsWith("non-zero exit code:")) {
14731
- hasError = true;
14732
- }
14733
- throw e;
14734
- }
14735
- if (hasError) {
14681
+ const result = await this.shell({
14682
+ command,
14683
+ cwd: cwd2,
14684
+ extraEnv: env,
14685
+ shell: stepShell
14686
+ });
14687
+ if (result.status !== 0) {
14736
14688
  throw new Error(
14737
14689
  `Task "${this.fullname}" failed when executing "${Array.isArray(command) ? command.join(" ") : command}" (cwd: ${(0, import_path.resolve)(cwd2 ?? this.workdir)})`
14738
14690
  );
@@ -14747,15 +14699,15 @@ var RunTask = class {
14747
14699
  * evaluates to false (exits with non-zero), indicating that the task should
14748
14700
  * be skipped.
14749
14701
  */
14750
- async evalCondition(taskOrStep) {
14702
+ async evalCondition(taskOrStep, shell) {
14751
14703
  if (!taskOrStep.condition) {
14752
14704
  return true;
14753
14705
  }
14754
14706
  this.log((0, import_chalk2.gray)(`${(0, import_chalk2.underline)("condition")}: ${taskOrStep.condition}`));
14755
14707
  const result = await this.shell({
14756
14708
  command: taskOrStep.condition,
14757
- logprefix: "condition: ",
14758
- quiet: true
14709
+ quiet: true,
14710
+ shell
14759
14711
  });
14760
14712
  if (result.status === 0) {
14761
14713
  return true;
@@ -14766,12 +14718,17 @@ var RunTask = class {
14766
14718
  /**
14767
14719
  * Evaluates environment variables from shell commands (e.g. `$(xx)`)
14768
14720
  */
14769
- async evalEnvironment(env) {
14721
+ async evalEnvironment(env, shell) {
14770
14722
  const output = {};
14771
14723
  for (const [key, value] of Object.entries(env ?? {})) {
14772
14724
  if (String(value).startsWith("$(") && String(value).endsWith(")")) {
14773
14725
  const query = value.substring(2, value.length - 1);
14774
- 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
+ });
14775
14732
  if (result.status !== 0) {
14776
14733
  const error = result.error ? result.error.stack : result.stderr?.toString().trim() || result.stdout?.toString().trim() || `command exited with code ${result.status}`;
14777
14734
  warn(
@@ -14794,7 +14751,7 @@ var RunTask = class {
14794
14751
  * `$(xx)` for allowing environment to be evaluated by executing a shell
14795
14752
  * command and obtaining its result.
14796
14753
  */
14797
- async resolveEnvironment(envParam, parents) {
14754
+ async resolveEnvironment(envParam, parents, shell) {
14798
14755
  let env = this.runtime.manifest.env ?? {};
14799
14756
  for (const parent of parents) {
14800
14757
  env = {
@@ -14807,7 +14764,14 @@ var RunTask = class {
14807
14764
  ...this.task.env ?? {},
14808
14765
  ...envParam
14809
14766
  };
14810
- 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";
14811
14775
  }
14812
14776
  /**
14813
14777
  * Returns the "full name" of the task which includes all it's parent task names concatenated by chevrons.
@@ -14828,9 +14792,6 @@ var RunTask = class {
14828
14792
  const quiet = options.quiet ?? false;
14829
14793
  if (!quiet) {
14830
14794
  const log2 = new Array();
14831
- if (options.logprefix) {
14832
- log2.push(options.logprefix);
14833
- }
14834
14795
  log2.push(
14835
14796
  Array.isArray(options.command) ? options.command.join(" ") : options.command
14836
14797
  );
@@ -14845,48 +14806,63 @@ var RunTask = class {
14845
14806
  `invalid workdir (cwd): ${cwd2} must be an existing directory`
14846
14807
  );
14847
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;
14848
14819
  const env = {
14849
14820
  ...process.env,
14850
14821
  ...this.env,
14851
14822
  ...options.extraEnv
14852
14823
  };
14853
- const capture2 = Array.isArray(options.spawnOptions?.stdio);
14854
- const command = options.command;
14855
- if (process.platform === "win32") {
14856
- const cmd = Array.isArray(command) ? $2`${command[0]} ${command.slice(1)}` : $2.raw`${command}`;
14857
- const result = await cmd.cwd(cwd2).env(env).stdout(capture2 ? "piped" : "inherit").stderr(capture2 ? "piped" : "inherit").noThrow();
14858
- return {
14859
- status: result.code,
14860
- stdout: capture2 ? Buffer.from(result.stdoutBytes) : null,
14861
- stderr: capture2 ? Buffer.from(result.stderrBytes) : null
14862
- };
14863
- }
14864
- if (!Array.isArray(command)) {
14865
- return rawShell.exec(command, { cwd: cwd2, env, capture: capture2 });
14866
- }
14867
- const [file, ...args] = command;
14868
- try {
14869
- tool(file).run(args, {
14870
- cwd: cwd2,
14871
- env,
14872
- inheritStdio: true
14873
- });
14874
- return { status: 0 };
14875
- } catch (e) {
14876
- if (typeof e?.status === "number") {
14877
- return { status: e.status };
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
+ }
14878
14836
  }
14879
- throw e;
14837
+ return systemShell(command, { cwd: cwd2, env, capture: capture2 });
14880
14838
  }
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
+ };
14881
14846
  }
14882
- async shellEval(options) {
14883
- return this.shell({
14884
- quiet: true,
14885
- ...options,
14886
- spawnOptions: {
14887
- stdio: ["inherit", "pipe", "pipe"]
14888
- }
14889
- });
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
+ );
14890
14866
  }
14891
14867
  renderBuiltin(builtin) {
14892
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.7" };
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.7" };
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.7" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.SourceCode", version: "0.101.0" };
13
13
  file;
14
14
  indentLevel = 0;
15
15
  indent;
@@ -1,3 +1,4 @@
1
+ import type { TaskShell } from "./task-shell";
1
2
  /**
2
3
  * Schema for `tasks.json`.
3
4
  */
@@ -24,6 +25,12 @@ export interface TasksManifest {
24
25
  readonly env?: {
25
26
  [name: string]: string;
26
27
  };
28
+ /**
29
+ * The default task shell, in `tasks.json` form: a keyword (`"projen"` or
30
+ * `"system"`) or an invocation argument list. See
31
+ * {@link TaskCommonOptions.shell}.
32
+ */
33
+ readonly shell?: string | string[];
27
34
  }
28
35
  export interface TaskCommonOptions {
29
36
  /**
@@ -57,15 +64,65 @@ export interface TaskCommonOptions {
57
64
  * @default - process.cwd()
58
65
  */
59
66
  readonly cwd?: string;
67
+ /**
68
+ * The shell used to run this task's commands, including its `condition` and
69
+ * `$(...)` environment evaluation. Use {@link TaskShell} to pick a built-in
70
+ * or an explicit invocation. Set at project, task or step level; the nearest
71
+ * declared level wins.
72
+ *
73
+ * @default - inherited from the task/project, otherwise the built-in projen shell
74
+ */
75
+ readonly shell?: TaskShell;
60
76
  }
61
77
  /**
62
78
  * Specification of a single task.
79
+ *
80
+ * The `tasks.json` (manifest) form of a task. {@link TaskCommonOptions} is the
81
+ * form used to define one; they differ only in the rendered `shell` field.
63
82
  */
64
- export interface TaskSpec extends TaskCommonOptions {
83
+ export interface TaskSpec {
65
84
  /**
66
85
  * Task name.
67
86
  */
68
87
  readonly name: string;
88
+ /**
89
+ * The description of this build command.
90
+ * @default - the task name
91
+ */
92
+ readonly description?: string;
93
+ /**
94
+ * Defines environment variables for the execution of this task.
95
+ * Values in this map will be evaluated in a shell, so you can do stuff like `$(echo "foo")`.
96
+ * @default {}
97
+ */
98
+ readonly env?: {
99
+ [name: string]: string;
100
+ };
101
+ /**
102
+ * A set of environment variables that must be defined in order to execute
103
+ * this task. Task execution will fail if one of these is not defined.
104
+ */
105
+ readonly requiredEnv?: string[];
106
+ /**
107
+ * A shell command which determines if the this task should be executed. If
108
+ * the program exits with a zero exit code, steps will be executed. A non-zero
109
+ * code means that task will be skipped.
110
+ */
111
+ readonly condition?: string;
112
+ /**
113
+ * The working directory for all steps in this task (unless overridden by the
114
+ * step).
115
+ *
116
+ * @default - process.cwd()
117
+ */
118
+ readonly cwd?: string;
119
+ /**
120
+ * The task shell in `tasks.json` form: a keyword (`"projen"` or `"system"`)
121
+ * or an invocation argument list.
122
+ *
123
+ * @default - the built-in projen shell
124
+ */
125
+ readonly shell?: string | string[];
69
126
  /**
70
127
  * Task steps.
71
128
  */
@@ -99,7 +156,7 @@ export interface TaskStepOptions {
99
156
  * If `true`, args are passed through at the end of the `exec` shell command.\
100
157
  * The position of the args can be changed by including the marker `$@` inside the command string.
101
158
  *
102
- * If the marker is explicitly double-quoted ("$@") arguments will be wrapped in single quotes, approximating
159
+ * If the marker is explicitly double-quoted ("$@") arguments will be wrapped in double quotes, approximating
103
160
  * the whitespace preserving behavior of bash variable expansion.
104
161
  *
105
162
  * If the step spawns a subtask, args are passed to the subtask.
@@ -142,12 +199,71 @@ export interface TaskStepOptions {
142
199
  readonly env?: {
143
200
  [name: string]: string;
144
201
  };
202
+ /**
203
+ * The shell used to run this step, overriding the task/project shell.
204
+ *
205
+ * @see {@link TaskCommonOptions.shell}
206
+ * @default - the task's (or project's) shell
207
+ */
208
+ readonly shell?: TaskShell;
145
209
  }
146
210
  /**
147
211
  * A single step within a task. The step could either be the execution of a
148
212
  * shell command or execution of a sub-task, by name.
213
+ *
214
+ * The `tasks.json` (manifest) form of a step. {@link TaskStepOptions} is the
215
+ * form used to define steps (via `task.exec()` etc.); they differ only in the
216
+ * rendered `shell` field.
149
217
  */
150
- export interface TaskStep extends TaskStepOptions {
218
+ export interface TaskStep {
219
+ /**
220
+ * Step name
221
+ *
222
+ * @default - no name
223
+ */
224
+ readonly name?: string;
225
+ /**
226
+ * The working directory for this step.
227
+ *
228
+ * @default - determined by the task
229
+ */
230
+ readonly cwd?: string;
231
+ /**
232
+ * A shell command which determines if the this step should be executed. If
233
+ * the program exits with a zero exit code, the step will be executed. A non-zero
234
+ * code means the step will be skipped (subsequent task steps will still be evaluated/executed).
235
+ */
236
+ readonly condition?: string;
237
+ /**
238
+ * Should this step receive args passed to the task.
239
+ *
240
+ * @see {@link TaskStepOptions.receiveArgs}
241
+ * @default false
242
+ */
243
+ readonly receiveArgs?: boolean;
244
+ /**
245
+ * A list of fixed arguments always passed to the step.
246
+ *
247
+ * @see {@link TaskStepOptions.args}
248
+ * @default - no arguments are passed to the step
249
+ */
250
+ readonly args?: string[];
251
+ /**
252
+ * Defines environment variables for the execution of this step (`exec` and `builtin` only).
253
+ *
254
+ * @see {@link TaskStepOptions.env}
255
+ * @default - no environment variables defined in step
256
+ */
257
+ readonly env?: {
258
+ [name: string]: string;
259
+ };
260
+ /**
261
+ * The step shell in `tasks.json` form: a keyword (`"projen"` or `"system"`)
262
+ * or an invocation argument list.
263
+ *
264
+ * @default - the task's (or project's) shell
265
+ */
266
+ readonly shell?: string | string[];
151
267
  /**
152
268
  * Shell command to execute.
153
269
  *
package/lib/task-model.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YXNrLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjaGVtYSBmb3IgYHRhc2tzLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tzTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHRhc2tzIG1hbmlmZXN0IHNjaGVtYS5cbiAgICpcbiAgICogVXNlZCBieSB0aGUgdGFzayBydW50aW1lIHRvIGRldGVjdCBtYW5pZmVzdHMgcHJvZHVjZWQgYnkgYSBuZXdlciB2ZXJzaW9uXG4gICAqIG9mIHByb2plbi4gTWFuaWZlc3RzIGdlbmVyYXRlZCBieSBvbGRlciB2ZXJzaW9ucyBvZiBwcm9qZW4gb21pdCB0aGlzIGZpZWxkXG4gICAqIGFuZCBhcmUgdHJlYXRlZCBhcyBcImxlZ2FjeVwiIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWFuaWZlc3QgaXMgdHJlYXRlZCBhcyBhIGxlZ2FjeSAodW52ZXJzaW9uZWQpIG1hbmlmZXN0XG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsbCB0YXNrcyBhdmFpbGFibGUgZm9yIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tzPzogeyBbbmFtZTogc3RyaW5nXTogVGFza1NwZWMgfTtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgZm9yIGFsbCB0YXNrcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGJ1aWxkIGNvbW1hbmQuXG4gICAqIEBkZWZhdWx0IC0gdGhlIHRhc2sgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgdGFzay5cbiAgICogVmFsdWVzIGluIHRoaXMgbWFwIHdpbGwgYmUgZXZhbHVhdGVkIGluIGEgc2hlbGwsIHNvIHlvdSBjYW4gZG8gc3R1ZmYgbGlrZSBgJChlY2hvIFwiZm9vXCIpYC5cbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZXhlY3V0ZVxuICAgKiB0aGlzIHRhc2suIFRhc2sgZXhlY3V0aW9uIHdpbGwgZmFpbCBpZiBvbmUgb2YgdGhlc2UgaXMgbm90IGRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlZEVudj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIHNoZWxsIGNvbW1hbmQgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgdGhpcyB0YXNrIHNob3VsZCBiZSBleGVjdXRlZC4gSWZcbiAgICogdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBhIHplcm8gZXhpdCBjb2RlLCBzdGVwcyB3aWxsIGJlIGV4ZWN1dGVkLiBBIG5vbi16ZXJvXG4gICAqIGNvZGUgbWVhbnMgdGhhdCB0YXNrIHdpbGwgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmRpdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBhbGwgc3RlcHMgaW4gdGhpcyB0YXNrICh1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGVcbiAgICogc3RlcCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNwZWNpZmljYXRpb24gb2YgYSBzaW5nbGUgdGFzay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrU3BlYyBleHRlbmRzIFRhc2tDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRhc2sgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBzdGVwcy5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBzPzogVGFza1N0ZXBbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0YXNrIHN0ZXBzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGVwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGVwIG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoaXMgc3RlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlcm1pbmVkIGJ5IHRoZSB0YXNrXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSB0aGlzIHN0ZXAgc2hvdWxkIGJlIGV4ZWN1dGVkLiBJZlxuICAgKiB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIGEgemVybyBleGl0IGNvZGUsIHRoZSBzdGVwIHdpbGwgYmUgZXhlY3V0ZWQuIEEgbm9uLXplcm9cbiAgICogY29kZSBtZWFucyB0aGUgc3RlcCB3aWxsIGJlIHNraXBwZWQgKHN1YnNlcXVlbnQgdGFzayBzdGVwcyB3aWxsIHN0aWxsIGJlIGV2YWx1YXRlZC9leGVjdXRlZCkuXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGlzIHN0ZXAgcmVjZWl2ZSBhcmdzIHBhc3NlZCB0byB0aGUgdGFzay5cbiAgICpcbiAgICogSWYgYHRydWVgLCBhcmdzIGFyZSBwYXNzZWQgdGhyb3VnaCBhdCB0aGUgZW5kIG9mIHRoZSBgZXhlY2Agc2hlbGwgY29tbWFuZC5cXFxuICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGFyZ3MgY2FuIGJlIGNoYW5nZWQgYnkgaW5jbHVkaW5nIHRoZSBtYXJrZXIgYCRAYCBpbnNpZGUgdGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKlxuICAgKiBJZiB0aGUgbWFya2VyIGlzIGV4cGxpY2l0bHkgZG91YmxlLXF1b3RlZCAoXCIkQFwiKSBhcmd1bWVudHMgd2lsbCBiZSB3cmFwcGVkIGluIHNpbmdsZSBxdW90ZXMsIGFwcHJveGltYXRpbmdcbiAgICogdGhlIHdoaXRlc3BhY2UgcHJlc2VydmluZyBiZWhhdmlvciBvZiBiYXNoIHZhcmlhYmxlIGV4cGFuc2lvbi5cbiAgICpcbiAgICogSWYgdGhlIHN0ZXAgc3Bhd25zIGEgc3VidGFzaywgYXJncyBhcmUgcGFzc2VkIHRvIHRoZSBzdWJ0YXNrLlxuICAgKiBUaGUgc3VidGFzayBtdXN0IGRlZmluZSBzdGVwcyByZWNlaXZpbmcgYXJncyBmb3IgdGhpcyB0byBoYXZlIGFueSBlZmZlY3QuXG4gICAqXG4gICAqIEBleGFtcGxlIHRhc2suZXhlYyhcImVjaG8gSGVsbG8gJEAgV29ybGQhXCIsIHsgcmVjZWl2ZUFyZ3M6IHRydWUgfSk7XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlQXJncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBmaXhlZCBhcmd1bWVudHMgYWx3YXlzIHBhc3NlZCB0byB0aGUgc3RlcC5cbiAgICpcbiAgICogVXNlZnVsIHRvIHJlLXVzZSBleGlzdGluZyB0YXNrcyB3aXRob3V0IGhhdmluZyB0byByZS1kZWZpbmUgdGhlIHdob2xlIHRhc2suXFxcbiAgICogRml4ZWQgYXJncyBhcmUgYWx3YXlzIHBhc3NlZCB0byB0aGUgc3RlcCwgZXZlbiBpZiBgcmVjZWl2ZUFyZ3NgIGlzIGBmYWxzZWBcbiAgICogYW5kIGFyZSBhbHdheXMgcGFzc2VkIGJlZm9yZSBhbnkgYXJncyB0aGUgdGFzayBpcyBjYWxsZWQgd2l0aC5cbiAgICpcbiAgICogSWYgdGhlIHN0ZXAgZXhlY3V0ZXMgYSBzaGVsbCBjb21tYW5kcywgYXJncyBhcmUgcGFzc2VkIHRocm91Z2ggYXQgdGhlIGVuZCBvZiB0aGUgYGV4ZWNgIHNoZWxsIGNvbW1hbmQuXFxcbiAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBhcmdzIGNhbiBiZSBjaGFuZ2VkIGJ5IGluY2x1ZGluZyB0aGUgbWFya2VyIGAkQGAgaW5zaWRlIHRoZSBjb21tYW5kIHN0cmluZy5cbiAgICpcbiAgICogSWYgdGhlIHN0ZXAgc3Bhd25zIGEgc3VidGFzaywgYXJncyBhcmUgcGFzc2VkIHRvIHRoZSBzdWJ0YXNrLlxuICAgKiBUaGUgc3VidGFzayBtdXN0IGRlZmluZSBzdGVwcyByZWNlaXZpbmcgYXJncyBmb3IgdGhpcyB0byBoYXZlIGFueSBlZmZlY3QuXG4gICAqXG4gICAqIElmIHRoZSBzdGVwIGNhbGxzIGEgYnVpbHRpbiBzY3JpcHQsIGFyZ3MgYXJlIHBhc3NlZCB0byB0aGUgc2NyaXB0LlxuICAgKiBJdCBpcyB1cCB0byB0aGUgc2NyaXB0IHRvIHVzZSBvciBkaXNjYXJkIHRoZSBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBleGFtcGxlIHRhc2suc3Bhd24oXCJkZXBsb3lcIiwgeyBhcmdzOiBbXCItLWZvcmNlXCJdIH0pO1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBzdGVwXG4gICAqL1xuICByZWFkb25seSBhcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIERlZmluZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgc3RlcCAoYGV4ZWNgIGFuZCBgYnVpbHRpbmAgb25seSkuXG4gICAqIFZhbHVlcyBpbiB0aGlzIG1hcCBjYW4gYmUgc2ltcGxlLCBsaXRlcmFsIHZhbHVlcyBvciBzaGVsbCBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgZS5nLiBgJChlY2hvIFwiZm9vXCIpYC5cbiAgICpcbiAgICogQGV4YW1wbGUgeyBcImZvb1wiOiBcImJhclwiLCBcImJvb1wiOiBcIiQoZWNobyBiYXopXCIgfVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGluIHN0ZXBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIHN0ZXAgd2l0aGluIGEgdGFzay4gVGhlIHN0ZXAgY291bGQgZWl0aGVyIGJlICB0aGUgZXhlY3V0aW9uIG9mIGFcbiAqIHNoZWxsIGNvbW1hbmQgb3IgZXhlY3V0aW9uIG9mIGEgc3ViLXRhc2ssIGJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1N0ZXAgZXh0ZW5kcyBUYXNrU3RlcE9wdGlvbnMge1xuICAvKipcbiAgICogU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLlxuICAgKlxuICAgKiBUaGUgd2hvbGUgY29tbWFuZCBpcyBhIHNpbmdsZSBzaGVsbCBzdHJpbmcuIFRvIHBhc3MgYXJndW1lbnRzIGFzIGEgbGlzdFxuICAgKiBpbnN0ZWFkIC0gd2l0aG91dCBoYXZpbmcgdG8gcXVvdGUgc3BhY2VzIG9yIG90aGVyIGNoYXJhY3RlcnMgeW91cnNlbGYgLVxuICAgKiB1c2UgYGV4ZWNBcmdzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkb24ndCBleGVjdXRlIGEgc2hlbGwgY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlYz86IHN0cmluZztcblxuICAvKipcbiAgICogU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLCBwcm92aWRlZCBhcyBhIGxpc3Qgb2YgdGhlIHByb2dyYW0gZm9sbG93ZWQgYnlcbiAgICogaXRzIGFyZ3VtZW50cyAoYW4gXCJhcmd2XCIpLlxuICAgKlxuICAgKiBPZnRlbiBtb3JlIGNvbnZlbmllbnQgdGhhbiBgZXhlY2A6IGVhY2ggZWxlbWVudCBpcyBwYXNzZWQgdG8gdGhlXG4gICAqIHByb2dyYW0gYXMtaXMsIHNvIGFyZ3VtZW50cyB3aXRoIHNwYWNlcyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgZG9uJ3QgbmVlZFxuICAgKiBxdW90aW5nLiBGaXhlZCAoYGFyZ3NgKSBvciByZWNlaXZlZCAoYHJlY2VpdmVBcmdzYCkgYXJndW1lbnRzIGFyZSBpbnNlcnRlZFxuICAgKiB3aGVyZXZlciBhIGAkQGAgZWxlbWVudCBhcHBlYXJzLCBvciBhcHBlbmRlZCBhdCB0aGUgZW5kIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqXG4gICAqIFRoZSBlbGVtZW50cyBhcmUgbm90IHJ1biB0aHJvdWdoIGEgc2hlbGwsIHNvIGVudmlyb25tZW50IHZhcmlhYmxlcyAoYCRGT09gKVxuICAgKiBhcmUgbm90IGV4cGFuZGVkIGFuZCBvdGhlciBzaGVsbCBmZWF0dXJlcyBhcmUgdW5hdmFpbGFibGUuIFVzZSBgZXhlY2BcbiAgICogaWYgeW91IG5lZWQgdGhlbS5cbiAgICpcbiAgICogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGV4ZWNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSB7IGV4ZWNBcmdzOiBbXCJlY2hvXCIsIFwiaGVsbG8gd29ybGRcIl0gfVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvbid0IGV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kXG4gICAqL1xuICByZWFkb25seSBleGVjQXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdWJ0YXNrIHRvIGV4ZWN1dGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkb24ndCBzcGF3biBhIHN1YnRhc2tcbiAgICovXG4gIHJlYWRvbmx5IHNwYXduPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmludCBhIG1lc3NhZ2UuXG4gICAqIEBkZWZhdWx0IC0gZG9uJ3Qgc2F5IGFueXRoaW5nXG4gICAqL1xuICByZWFkb25seSBzYXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gdGFzayB0byBleGVjdXRlLlxuICAgKlxuICAgKiBCdWlsdC1pbiB0YXNrcyBhcmUgbm9kZS5qcyBwcm9ncmFtcyBiYWtlZCBpbnRvIHRoZSBwcm9qZW4gbW9kdWxlIGFuZCBhc1xuICAgKiBjb21wb25lbnQgcnVudGltZSBoZWxwZXJzLlxuICAgKlxuICAgKiBUaGUgbmFtZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plbiBsaWIvIGRpcmVjdG9yeSAod2l0aG91dCB0aGUgLnRhc2suanMgZXh0ZW5zaW9uKS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgYnVpbHQgaW4gYnVpbHRpbiB0YXNrIGlzIHVuZGVyIGBzcmMvcmVsZWFzZS9yZXNvbHZlLXZlcnNpb24udGFzay50c2AsXG4gICAqIHRoZW4gdGhpcyB3b3VsZCBiZSBgcmVsZWFzZS9yZXNvbHZlLXZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCBleGVjdXRlIGEgYnVpbHRpbiB0YXNrXG4gICAqL1xuICByZWFkb25seSBidWlsdGluPzogc3RyaW5nO1xufVxuIl19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YXNrLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRhc2tTaGVsbCB9IGZyb20gXCIuL3Rhc2stc2hlbGxcIjtcblxuLyoqXG4gKiBTY2hlbWEgZm9yIGB0YXNrcy5qc29uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrc01hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSB0YXNrcyBtYW5pZmVzdCBzY2hlbWEuXG4gICAqXG4gICAqIFVzZWQgYnkgdGhlIHRhc2sgcnVudGltZSB0byBkZXRlY3QgbWFuaWZlc3RzIHByb2R1Y2VkIGJ5IGEgbmV3ZXIgdmVyc2lvblxuICAgKiBvZiBwcm9qZW4uIE1hbmlmZXN0cyBnZW5lcmF0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgb2YgcHJvamVuIG9taXQgdGhpcyBmaWVsZFxuICAgKiBhbmQgYXJlIHRyZWF0ZWQgYXMgXCJsZWdhY3lcIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1hbmlmZXN0IGlzIHRyZWF0ZWQgYXMgYSBsZWdhY3kgKHVudmVyc2lvbmVkKSBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbGwgdGFza3MgYXZhaWxhYmxlIGZvciB0aGlzIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSB0YXNrcz86IHsgW25hbWU6IHN0cmluZ106IFRhc2tTcGVjIH07XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IGZvciBhbGwgdGFza3MuXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGFzayBzaGVsbCwgaW4gYHRhc2tzLmpzb25gIGZvcm06IGEga2V5d29yZCAoYFwicHJvamVuXCJgIG9yXG4gICAqIGBcInN5c3RlbVwiYCkgb3IgYW4gaW52b2NhdGlvbiBhcmd1bWVudCBsaXN0LiBTZWVcbiAgICoge0BsaW5rIFRhc2tDb21tb25PcHRpb25zLnNoZWxsfS5cbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0NvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYnVpbGQgY29tbWFuZC5cbiAgICogQGRlZmF1bHQgLSB0aGUgdGFzayBuYW1lXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGVmaW5lcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhpcyB0YXNrLlxuICAgKiBWYWx1ZXMgaW4gdGhpcyBtYXAgd2lsbCBiZSBldmFsdWF0ZWQgaW4gYSBzaGVsbCwgc28geW91IGNhbiBkbyBzdHVmZiBsaWtlIGAkKGVjaG8gXCJmb29cIilgLlxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBleGVjdXRlXG4gICAqIHRoaXMgdGFzay4gVGFzayBleGVjdXRpb24gd2lsbCBmYWlsIGlmIG9uZSBvZiB0aGVzZSBpcyBub3QgZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRW52Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgc2hlbGwgY29tbWFuZCB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSB0aGlzIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkLiBJZlxuICAgKiB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIGEgemVybyBleGl0IGNvZGUsIHN0ZXBzIHdpbGwgYmUgZXhlY3V0ZWQuIEEgbm9uLXplcm9cbiAgICogY29kZSBtZWFucyB0aGF0IHRhc2sgd2lsbCBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIGFsbCBzdGVwcyBpbiB0aGlzIHRhc2sgKHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZVxuICAgKiBzdGVwKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzaGVsbCB1c2VkIHRvIHJ1biB0aGlzIHRhc2sncyBjb21tYW5kcywgaW5jbHVkaW5nIGl0cyBgY29uZGl0aW9uYCBhbmRcbiAgICogYCQoLi4uKWAgZW52aXJvbm1lbnQgZXZhbHVhdGlvbi4gVXNlIHtAbGluayBUYXNrU2hlbGx9IHRvIHBpY2sgYSBidWlsdC1pblxuICAgKiBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLiBTZXQgYXQgcHJvamVjdCwgdGFzayBvciBzdGVwIGxldmVsOyB0aGUgbmVhcmVzdFxuICAgKiBkZWNsYXJlZCBsZXZlbCB3aW5zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGluaGVyaXRlZCBmcm9tIHRoZSB0YXNrL3Byb2plY3QsIG90aGVyd2lzZSB0aGUgYnVpbHQtaW4gcHJvamVuIHNoZWxsXG4gICAqL1xuICByZWFkb25seSBzaGVsbD86IFRhc2tTaGVsbDtcbn1cblxuLyoqXG4gKiBTcGVjaWZpY2F0aW9uIG9mIGEgc2luZ2xlIHRhc2suXG4gKlxuICogVGhlIGB0YXNrcy5qc29uYCAobWFuaWZlc3QpIGZvcm0gb2YgYSB0YXNrLiB7QGxpbmsgVGFza0NvbW1vbk9wdGlvbnN9IGlzIHRoZVxuICogZm9ybSB1c2VkIHRvIGRlZmluZSBvbmU7IHRoZXkgZGlmZmVyIG9ubHkgaW4gdGhlIHJlbmRlcmVkIGBzaGVsbGAgZmllbGQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1NwZWMge1xuICAvKipcbiAgICogVGFzayBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyBidWlsZCBjb21tYW5kLlxuICAgKiBAZGVmYXVsdCAtIHRoZSB0YXNrIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHRhc2suXG4gICAqIFZhbHVlcyBpbiB0aGlzIG1hcCB3aWxsIGJlIGV2YWx1YXRlZCBpbiBhIHNoZWxsLCBzbyB5b3UgY2FuIGRvIHN0dWZmIGxpa2UgYCQoZWNobyBcImZvb1wiKWAuXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQSBzZXQgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGV4ZWN1dGVcbiAgICogdGhpcyB0YXNrLiBUYXNrIGV4ZWN1dGlvbiB3aWxsIGZhaWwgaWYgb25lIG9mIHRoZXNlIGlzIG5vdCBkZWZpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWRFbnY/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBzaGVsbCBjb21tYW5kIHdoaWNoIGRldGVybWluZXMgaWYgdGhlIHRoaXMgdGFzayBzaG91bGQgYmUgZXhlY3V0ZWQuIElmXG4gICAqIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggYSB6ZXJvIGV4aXQgY29kZSwgc3RlcHMgd2lsbCBiZSBleGVjdXRlZC4gQSBub24temVyb1xuICAgKiBjb2RlIG1lYW5zIHRoYXQgdGFzayB3aWxsIGJlIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYWxsIHN0ZXBzIGluIHRoaXMgdGFzayAodW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlXG4gICAqIHN0ZXApLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHByb2Nlc3MuY3dkKClcbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhc2sgc2hlbGwgaW4gYHRhc2tzLmpzb25gIGZvcm06IGEga2V5d29yZCAoYFwicHJvamVuXCJgIG9yIGBcInN5c3RlbVwiYClcbiAgICogb3IgYW4gaW52b2NhdGlvbiBhcmd1bWVudCBsaXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBidWlsdC1pbiBwcm9qZW4gc2hlbGxcbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRhc2sgc3RlcHMuXG4gICAqL1xuICByZWFkb25seSBzdGVwcz86IFRhc2tTdGVwW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGFzayBzdGVwcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrU3RlcE9wdGlvbnMge1xuICAvKipcbiAgICogU3RlcCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIHN0ZXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBieSB0aGUgdGFza1xuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHNoZWxsIGNvbW1hbmQgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgdGhpcyBzdGVwIHNob3VsZCBiZSBleGVjdXRlZC4gSWZcbiAgICogdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBhIHplcm8gZXhpdCBjb2RlLCB0aGUgc3RlcCB3aWxsIGJlIGV4ZWN1dGVkLiBBIG5vbi16ZXJvXG4gICAqIGNvZGUgbWVhbnMgdGhlIHN0ZXAgd2lsbCBiZSBza2lwcGVkIChzdWJzZXF1ZW50IHRhc2sgc3RlcHMgd2lsbCBzdGlsbCBiZSBldmFsdWF0ZWQvZXhlY3V0ZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhpcyBzdGVwIHJlY2VpdmUgYXJncyBwYXNzZWQgdG8gdGhlIHRhc2suXG4gICAqXG4gICAqIElmIGB0cnVlYCwgYXJncyBhcmUgcGFzc2VkIHRocm91Z2ggYXQgdGhlIGVuZCBvZiB0aGUgYGV4ZWNgIHNoZWxsIGNvbW1hbmQuXFxcbiAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBhcmdzIGNhbiBiZSBjaGFuZ2VkIGJ5IGluY2x1ZGluZyB0aGUgbWFya2VyIGAkQGAgaW5zaWRlIHRoZSBjb21tYW5kIHN0cmluZy5cbiAgICpcbiAgICogSWYgdGhlIG1hcmtlciBpcyBleHBsaWNpdGx5IGRvdWJsZS1xdW90ZWQgKFwiJEBcIikgYXJndW1lbnRzIHdpbGwgYmUgd3JhcHBlZCBpbiBkb3VibGUgcXVvdGVzLCBhcHByb3hpbWF0aW5nXG4gICAqIHRoZSB3aGl0ZXNwYWNlIHByZXNlcnZpbmcgYmVoYXZpb3Igb2YgYmFzaCB2YXJpYWJsZSBleHBhbnNpb24uXG4gICAqXG4gICAqIElmIHRoZSBzdGVwIHNwYXducyBhIHN1YnRhc2ssIGFyZ3MgYXJlIHBhc3NlZCB0byB0aGUgc3VidGFzay5cbiAgICogVGhlIHN1YnRhc2sgbXVzdCBkZWZpbmUgc3RlcHMgcmVjZWl2aW5nIGFyZ3MgZm9yIHRoaXMgdG8gaGF2ZSBhbnkgZWZmZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZSB0YXNrLmV4ZWMoXCJlY2hvIEhlbGxvICRAIFdvcmxkIVwiLCB7IHJlY2VpdmVBcmdzOiB0cnVlIH0pO1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZUFyZ3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZml4ZWQgYXJndW1lbnRzIGFsd2F5cyBwYXNzZWQgdG8gdGhlIHN0ZXAuXG4gICAqXG4gICAqIFVzZWZ1bCB0byByZS11c2UgZXhpc3RpbmcgdGFza3Mgd2l0aG91dCBoYXZpbmcgdG8gcmUtZGVmaW5lIHRoZSB3aG9sZSB0YXNrLlxcXG4gICAqIEZpeGVkIGFyZ3MgYXJlIGFsd2F5cyBwYXNzZWQgdG8gdGhlIHN0ZXAsIGV2ZW4gaWYgYHJlY2VpdmVBcmdzYCBpcyBgZmFsc2VgXG4gICAqIGFuZCBhcmUgYWx3YXlzIHBhc3NlZCBiZWZvcmUgYW55IGFyZ3MgdGhlIHRhc2sgaXMgY2FsbGVkIHdpdGguXG4gICAqXG4gICAqIElmIHRoZSBzdGVwIGV4ZWN1dGVzIGEgc2hlbGwgY29tbWFuZHMsIGFyZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIGF0IHRoZSBlbmQgb2YgdGhlIGBleGVjYCBzaGVsbCBjb21tYW5kLlxcXG4gICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgYXJncyBjYW4gYmUgY2hhbmdlZCBieSBpbmNsdWRpbmcgdGhlIG1hcmtlciBgJEBgIGluc2lkZSB0aGUgY29tbWFuZCBzdHJpbmcuXG4gICAqXG4gICAqIElmIHRoZSBzdGVwIHNwYXducyBhIHN1YnRhc2ssIGFyZ3MgYXJlIHBhc3NlZCB0byB0aGUgc3VidGFzay5cbiAgICogVGhlIHN1YnRhc2sgbXVzdCBkZWZpbmUgc3RlcHMgcmVjZWl2aW5nIGFyZ3MgZm9yIHRoaXMgdG8gaGF2ZSBhbnkgZWZmZWN0LlxuICAgKlxuICAgKiBJZiB0aGUgc3RlcCBjYWxscyBhIGJ1aWx0aW4gc2NyaXB0LCBhcmdzIGFyZSBwYXNzZWQgdG8gdGhlIHNjcmlwdC5cbiAgICogSXQgaXMgdXAgdG8gdGhlIHNjcmlwdCB0byB1c2Ugb3IgZGlzY2FyZCB0aGUgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAZXhhbXBsZSB0YXNrLnNwYXduKFwiZGVwbG95XCIsIHsgYXJnczogW1wiLS1mb3JjZVwiXSB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgc3RlcFxuICAgKi9cbiAgcmVhZG9ubHkgYXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHN0ZXAgKGBleGVjYCBhbmQgYGJ1aWx0aW5gIG9ubHkpLlxuICAgKiBWYWx1ZXMgaW4gdGhpcyBtYXAgY2FuIGJlIHNpbXBsZSwgbGl0ZXJhbCB2YWx1ZXMgb3Igc2hlbGwgZXhwcmVzc2lvbnMgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBhdCBydW50aW1lIGUuZy4gYCQoZWNobyBcImZvb1wiKWAuXG4gICAqXG4gICAqIEBleGFtcGxlIHsgXCJmb29cIjogXCJiYXJcIiwgXCJib29cIjogXCIkKGVjaG8gYmF6KVwiIH1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBpbiBzdGVwXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIHNoZWxsIHVzZWQgdG8gcnVuIHRoaXMgc3RlcCwgb3ZlcnJpZGluZyB0aGUgdGFzay9wcm9qZWN0IHNoZWxsLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBUYXNrQ29tbW9uT3B0aW9ucy5zaGVsbH1cbiAgICogQGRlZmF1bHQgLSB0aGUgdGFzaydzIChvciBwcm9qZWN0J3MpIHNoZWxsXG4gICAqL1xuICByZWFkb25seSBzaGVsbD86IFRhc2tTaGVsbDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBzdGVwIHdpdGhpbiBhIHRhc2suIFRoZSBzdGVwIGNvdWxkIGVpdGhlciBiZSAgdGhlIGV4ZWN1dGlvbiBvZiBhXG4gKiBzaGVsbCBjb21tYW5kIG9yIGV4ZWN1dGlvbiBvZiBhIHN1Yi10YXNrLCBieSBuYW1lLlxuICpcbiAqIFRoZSBgdGFza3MuanNvbmAgKG1hbmlmZXN0KSBmb3JtIG9mIGEgc3RlcC4ge0BsaW5rIFRhc2tTdGVwT3B0aW9uc30gaXMgdGhlXG4gKiBmb3JtIHVzZWQgdG8gZGVmaW5lIHN0ZXBzICh2aWEgYHRhc2suZXhlYygpYCBldGMuKTsgdGhleSBkaWZmZXIgb25seSBpbiB0aGVcbiAqIHJlbmRlcmVkIGBzaGVsbGAgZmllbGQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1N0ZXAge1xuICAvKipcbiAgICogU3RlcCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIHN0ZXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBieSB0aGUgdGFza1xuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHNoZWxsIGNvbW1hbmQgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgdGhpcyBzdGVwIHNob3VsZCBiZSBleGVjdXRlZC4gSWZcbiAgICogdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBhIHplcm8gZXhpdCBjb2RlLCB0aGUgc3RlcCB3aWxsIGJlIGV4ZWN1dGVkLiBBIG5vbi16ZXJvXG4gICAqIGNvZGUgbWVhbnMgdGhlIHN0ZXAgd2lsbCBiZSBza2lwcGVkIChzdWJzZXF1ZW50IHRhc2sgc3RlcHMgd2lsbCBzdGlsbCBiZSBldmFsdWF0ZWQvZXhlY3V0ZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhpcyBzdGVwIHJlY2VpdmUgYXJncyBwYXNzZWQgdG8gdGhlIHRhc2suXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIFRhc2tTdGVwT3B0aW9ucy5yZWNlaXZlQXJnc31cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVBcmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGZpeGVkIGFyZ3VtZW50cyBhbHdheXMgcGFzc2VkIHRvIHRoZSBzdGVwLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBUYXNrU3RlcE9wdGlvbnMuYXJnc31cbiAgICogQGRlZmF1bHQgLSBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgc3RlcFxuICAgKi9cbiAgcmVhZG9ubHkgYXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHN0ZXAgKGBleGVjYCBhbmQgYGJ1aWx0aW5gIG9ubHkpLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBUYXNrU3RlcE9wdGlvbnMuZW52fVxuICAgKiBAZGVmYXVsdCAtIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGluIHN0ZXBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RlcCBzaGVsbCBpbiBgdGFza3MuanNvbmAgZm9ybTogYSBrZXl3b3JkIChgXCJwcm9qZW5cImAgb3IgYFwic3lzdGVtXCJgKVxuICAgKiBvciBhbiBpbnZvY2F0aW9uIGFyZ3VtZW50IGxpc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHRhc2sncyAob3IgcHJvamVjdCdzKSBzaGVsbFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlbGw/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLlxuICAgKlxuICAgKiBUaGUgd2hvbGUgY29tbWFuZCBpcyBhIHNpbmdsZSBzaGVsbCBzdHJpbmcuIFRvIHBhc3MgYXJndW1lbnRzIGFzIGEgbGlzdFxuICAgKiBpbnN0ZWFkIC0gd2l0aG91dCBoYXZpbmcgdG8gcXVvdGUgc3BhY2VzIG9yIG90aGVyIGNoYXJhY3RlcnMgeW91cnNlbGYgLVxuICAgKiB1c2UgYGV4ZWNBcmdzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkb24ndCBleGVjdXRlIGEgc2hlbGwgY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlYz86IHN0cmluZztcblxuICAvKipcbiAgICogU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLCBwcm92aWRlZCBhcyBhIGxpc3Qgb2YgdGhlIHByb2dyYW0gZm9sbG93ZWQgYnlcbiAgICogaXRzIGFyZ3VtZW50cyAoYW4gXCJhcmd2XCIpLlxuICAgKlxuICAgKiBPZnRlbiBtb3JlIGNvbnZlbmllbnQgdGhhbiBgZXhlY2A6IGVhY2ggZWxlbWVudCBpcyBwYXNzZWQgdG8gdGhlXG4gICAqIHByb2dyYW0gYXMtaXMsIHNvIGFyZ3VtZW50cyB3aXRoIHNwYWNlcyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgZG9uJ3QgbmVlZFxuICAgKiBxdW90aW5nLiBGaXhlZCAoYGFyZ3NgKSBvciByZWNlaXZlZCAoYHJlY2VpdmVBcmdzYCkgYXJndW1lbnRzIGFyZSBpbnNlcnRlZFxuICAgKiB3aGVyZXZlciBhIGAkQGAgZWxlbWVudCBhcHBlYXJzLCBvciBhcHBlbmRlZCBhdCB0aGUgZW5kIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqXG4gICAqIFRoZSBlbGVtZW50cyBhcmUgbm90IHJ1biB0aHJvdWdoIGEgc2hlbGwsIHNvIGVudmlyb25tZW50IHZhcmlhYmxlcyAoYCRGT09gKVxuICAgKiBhcmUgbm90IGV4cGFuZGVkIGFuZCBvdGhlciBzaGVsbCBmZWF0dXJlcyBhcmUgdW5hdmFpbGFibGUuIFVzZSBgZXhlY2BcbiAgICogaWYgeW91IG5lZWQgdGhlbS5cbiAgICpcbiAgICogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGV4ZWNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSB7IGV4ZWNBcmdzOiBbXCJlY2hvXCIsIFwiaGVsbG8gd29ybGRcIl0gfVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvbid0IGV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kXG4gICAqL1xuICByZWFkb25seSBleGVjQXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdWJ0YXNrIHRvIGV4ZWN1dGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkb24ndCBzcGF3biBhIHN1YnRhc2tcbiAgICovXG4gIHJlYWRvbmx5IHNwYXduPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmludCBhIG1lc3NhZ2UuXG4gICAqIEBkZWZhdWx0IC0gZG9uJ3Qgc2F5IGFueXRoaW5nXG4gICAqL1xuICByZWFkb25seSBzYXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gdGFzayB0byBleGVjdXRlLlxuICAgKlxuICAgKiBCdWlsdC1pbiB0YXNrcyBhcmUgbm9kZS5qcyBwcm9ncmFtcyBiYWtlZCBpbnRvIHRoZSBwcm9qZW4gbW9kdWxlIGFuZCBhc1xuICAgKiBjb21wb25lbnQgcnVudGltZSBoZWxwZXJzLlxuICAgKlxuICAgKiBUaGUgbmFtZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plbiBsaWIvIGRpcmVjdG9yeSAod2l0aG91dCB0aGUgLnRhc2suanMgZXh0ZW5zaW9uKS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgYnVpbHQgaW4gYnVpbHRpbiB0YXNrIGlzIHVuZGVyIGBzcmMvcmVsZWFzZS9yZXNvbHZlLXZlcnNpb24udGFzay50c2AsXG4gICAqIHRoZW4gdGhpcyB3b3VsZCBiZSBgcmVsZWFzZS9yZXNvbHZlLXZlcnNpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCBleGVjdXRlIGEgYnVpbHRpbiB0YXNrXG4gICAqL1xuICByZWFkb25seSBidWlsdGluPzogc3RyaW5nO1xufVxuIl19