@pagopa/dx-cli 0.24.0 → 0.25.1

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 (32) hide show
  1. package/README.md +14 -0
  2. package/bin/index.js +13 -3
  3. package/dist/adapters/azure/cloud-account-service.js +169 -92
  4. package/dist/adapters/azure/locations.d.ts +5 -1
  5. package/dist/adapters/azure/locations.js +1 -1
  6. package/dist/adapters/azure-monitor/instrumentation.d.ts +26 -0
  7. package/dist/adapters/azure-monitor/instrumentation.js +84 -0
  8. package/dist/adapters/azure-monitor/telemetry.d.ts +19 -0
  9. package/dist/adapters/azure-monitor/telemetry.js +28 -0
  10. package/dist/adapters/commander/commands/add.d.ts +32 -7
  11. package/dist/adapters/commander/commands/add.js +197 -15
  12. package/dist/adapters/commander/commands/doctor.js +4 -1
  13. package/dist/adapters/commander/commands/init.js +64 -15
  14. package/dist/adapters/github/github-repo.js +20 -2
  15. package/dist/adapters/octokit/index.d.ts +12 -0
  16. package/dist/adapters/octokit/index.js +26 -2
  17. package/dist/adapters/plop/actions/setup-pnpm.js +5 -1
  18. package/dist/adapters/plop/actions/sync-repository-environments.d.ts +15 -0
  19. package/dist/adapters/plop/actions/sync-repository-environments.js +98 -0
  20. package/dist/adapters/plop/generators/environment/actions.js +4 -1
  21. package/dist/adapters/plop/generators/environment/index.d.ts +3 -3
  22. package/dist/adapters/plop/generators/environment/index.js +6 -3
  23. package/dist/adapters/plop/generators/environment/prompts.d.ts +38 -0
  24. package/dist/adapters/plop/generators/environment/prompts.js +236 -91
  25. package/dist/adapters/plop/index.d.ts +3 -3
  26. package/dist/adapters/plop/index.js +5 -5
  27. package/dist/domain/authorization.js +4 -4
  28. package/dist/domain/environment.d.ts +6 -1
  29. package/dist/domain/environment.js +1 -1
  30. package/dist/index.js +132 -8
  31. package/package.json +24 -16
  32. package/templates/environment/workflow/_release-terraform-apply-bootstrapper-{{env.name}}.yaml.hbs +145 -2
@@ -3,5 +3,9 @@ export declare const locations: readonly ["italynorth", "westeurope"];
3
3
  export type AzureLocation = (typeof locations)[number];
4
4
  export declare function isAzureLocation(location: string): location is AzureLocation;
5
5
  export declare const defaultLocation: "italynorth";
6
- export declare const locationShort: Record<AzureLocation, string>;
6
+ export declare const locationShort: {
7
+ readonly italynorth: "itn";
8
+ readonly westeurope: "weu";
9
+ };
10
+ export type LocationShortValue = (typeof locationShort)[keyof typeof locationShort];
7
11
  export declare const cloudRegions: CloudRegion[];
@@ -19,4 +19,4 @@ export const cloudRegions = locations.map((l) => ({
19
19
  name: l,
20
20
  short: locationShort[l],
21
21
  }));
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2xvY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFJekQsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUkvRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUF5QixDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELHdDQUF3QztBQUN4QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBa0M7SUFDMUQsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFrQztJQUNqRCxVQUFVLEVBQUUsYUFBYTtJQUN6QixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFrQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Q0FDeEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGVzZSBhcmUgdGhlIG9ubHkgcmVnaW9ucyB3ZSBjdXJyZW50bHkgc3VwcG9ydCBmb3IgRFhcblxuaW1wb3J0IHR5cGUgeyBDbG91ZFJlZ2lvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vY2xvdWQtYWNjb3VudC5qc1wiO1xuXG4vLyBPcmRlciBtYXR0ZXJzISB0aGV5IGdvIGZyb20gdGhlIHByZWZlcnJlZCB0byB0aGUgbGVzcyBwcmVmZXJyZWQgb25lc1xuZXhwb3J0IGNvbnN0IGxvY2F0aW9ucyA9IFtcIml0YWx5bm9ydGhcIiwgXCJ3ZXN0ZXVyb3BlXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBenVyZUxvY2F0aW9uID0gKHR5cGVvZiBsb2NhdGlvbnMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F6dXJlTG9jYXRpb24obG9jYXRpb246IHN0cmluZyk6IGxvY2F0aW9uIGlzIEF6dXJlTG9jYXRpb24ge1xuICByZXR1cm4gbG9jYXRpb25zLmluY2x1ZGVzKGxvY2F0aW9uIGFzIEF6dXJlTG9jYXRpb24pO1xufVxuXG4vLyBUaGUgZGVmYXVsdCBsb2NhdGlvbiBpcyB0aGUgZmlyc3Qgb25lXG5leHBvcnQgY29uc3QgZGVmYXVsdExvY2F0aW9uID0gbG9jYXRpb25zWzBdO1xuXG5leHBvcnQgY29uc3QgbG9jYXRpb25TaG9ydDogUmVjb3JkPEF6dXJlTG9jYXRpb24sIHN0cmluZz4gPSB7XG4gIGl0YWx5bm9ydGg6IFwiaXRuXCIsXG4gIHdlc3RldXJvcGU6IFwid2V1XCIsXG59O1xuXG5jb25zdCBkaXNwbGF5TmFtZTogUmVjb3JkPEF6dXJlTG9jYXRpb24sIHN0cmluZz4gPSB7XG4gIGl0YWx5bm9ydGg6IFwiSXRhbHkgTm9ydGhcIixcbiAgd2VzdGV1cm9wZTogXCJXZXN0IEV1cm9wZVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGNsb3VkUmVnaW9uczogQ2xvdWRSZWdpb25bXSA9IGxvY2F0aW9ucy5tYXAoKGwpID0+ICh7XG4gIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZVtsXSxcbiAgbmFtZTogbCxcbiAgc2hvcnQ6IGxvY2F0aW9uU2hvcnRbbF0sXG59KSk7XG4iXX0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2xvY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFJekQsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUkvRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUF5QixDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELHdDQUF3QztBQUN4QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixVQUFVLEVBQUUsS0FBSztJQUNqQixVQUFVLEVBQUUsS0FBSztDQUMrQixDQUFDO0FBS25ELE1BQU0sV0FBVyxHQUFrQztJQUNqRCxVQUFVLEVBQUUsYUFBYTtJQUN6QixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFrQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Q0FDeEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGVzZSBhcmUgdGhlIG9ubHkgcmVnaW9ucyB3ZSBjdXJyZW50bHkgc3VwcG9ydCBmb3IgRFhcblxuaW1wb3J0IHR5cGUgeyBDbG91ZFJlZ2lvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vY2xvdWQtYWNjb3VudC5qc1wiO1xuXG4vLyBPcmRlciBtYXR0ZXJzISB0aGV5IGdvIGZyb20gdGhlIHByZWZlcnJlZCB0byB0aGUgbGVzcyBwcmVmZXJyZWQgb25lc1xuZXhwb3J0IGNvbnN0IGxvY2F0aW9ucyA9IFtcIml0YWx5bm9ydGhcIiwgXCJ3ZXN0ZXVyb3BlXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBenVyZUxvY2F0aW9uID0gKHR5cGVvZiBsb2NhdGlvbnMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F6dXJlTG9jYXRpb24obG9jYXRpb246IHN0cmluZyk6IGxvY2F0aW9uIGlzIEF6dXJlTG9jYXRpb24ge1xuICByZXR1cm4gbG9jYXRpb25zLmluY2x1ZGVzKGxvY2F0aW9uIGFzIEF6dXJlTG9jYXRpb24pO1xufVxuXG4vLyBUaGUgZGVmYXVsdCBsb2NhdGlvbiBpcyB0aGUgZmlyc3Qgb25lXG5leHBvcnQgY29uc3QgZGVmYXVsdExvY2F0aW9uID0gbG9jYXRpb25zWzBdO1xuXG5leHBvcnQgY29uc3QgbG9jYXRpb25TaG9ydCA9IHtcbiAgaXRhbHlub3J0aDogXCJpdG5cIixcbiAgd2VzdGV1cm9wZTogXCJ3ZXVcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxBenVyZUxvY2F0aW9uLCBzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBMb2NhdGlvblNob3J0VmFsdWUgPVxuICAodHlwZW9mIGxvY2F0aW9uU2hvcnQpW2tleW9mIHR5cGVvZiBsb2NhdGlvblNob3J0XTtcblxuY29uc3QgZGlzcGxheU5hbWU6IFJlY29yZDxBenVyZUxvY2F0aW9uLCBzdHJpbmc+ID0ge1xuICBpdGFseW5vcnRoOiBcIkl0YWx5IE5vcnRoXCIsXG4gIHdlc3RldXJvcGU6IFwiV2VzdCBFdXJvcGVcIixcbn07XG5cbmV4cG9ydCBjb25zdCBjbG91ZFJlZ2lvbnM6IENsb3VkUmVnaW9uW10gPSBsb2NhdGlvbnMubWFwKChsKSA9PiAoe1xuICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWVbbF0sXG4gIG5hbWU6IGwsXG4gIHNob3J0OiBsb2NhdGlvblNob3J0W2xdLFxufSkpO1xuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * OTel preload module for the dx CLI.
3
+ *
4
+ * This module is a deliberate side-effect entrypoint. It MUST be the first
5
+ * module loaded by the process (via a sequential dynamic import in bin/index.js)
6
+ * so that import-in-the-middle can register its hook before any HTTP client
7
+ * libraries (undici/fetch, octokit, Azure SDKs) are loaded.
8
+ *
9
+ * Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
10
+ * so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
11
+ * members do). The import-in-the-middle hook is still registered eagerly at
12
+ * preload because it must run before any instrumented module is imported.
13
+ *
14
+ * Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
15
+ * the configuration boundary — no higher caller can inject config at this point
16
+ * in the process lifecycle.
17
+ */
18
+ /**
19
+ * Initialises the Azure Monitor exporter and registers HTTP instrumentation.
20
+ *
21
+ * Deferred (not run at preload) so the CLI only emits telemetry once it has
22
+ * confirmed the user is a PagoPA org member. Idempotent: safe to call more than
23
+ * once. Must be called before logging is configured so the logtape OTel sink
24
+ * binds to the real (rather than no-op) LoggerProvider.
25
+ */
26
+ export declare const enableAzureMonitor: () => void;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * OTel preload module for the dx CLI.
3
+ *
4
+ * This module is a deliberate side-effect entrypoint. It MUST be the first
5
+ * module loaded by the process (via a sequential dynamic import in bin/index.js)
6
+ * so that import-in-the-middle can register its hook before any HTTP client
7
+ * libraries (undici/fetch, octokit, Azure SDKs) are loaded.
8
+ *
9
+ * Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
10
+ * so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
11
+ * members do). The import-in-the-middle hook is still registered eagerly at
12
+ * preload because it must run before any instrumented module is imported.
13
+ *
14
+ * Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
15
+ * the configuration boundary — no higher caller can inject config at this point
16
+ * in the process lifecycle.
17
+ */
18
+ import { useAzureMonitor } from "@azure/monitor-opentelemetry";
19
+ import { metrics, trace } from "@opentelemetry/api";
20
+ import { registerInstrumentations } from "@opentelemetry/instrumentation";
21
+ import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
22
+ // import-in-the-middle and module must be the first imports so that
23
+ // createAddHookMessageChannel / register run as early as possible.
24
+ import { createAddHookMessageChannel } from "import-in-the-middle";
25
+ import { register } from "module";
26
+ import os from "node:os";
27
+ const { registerOptions, waitForAllMessagesAcknowledged } = createAddHookMessageChannel();
28
+ // Register the ESM module hook so that subsequent dynamic imports are
29
+ // intercepted by OpenTelemetry's module instrumentation.
30
+ register("import-in-the-middle/hook.mjs", import.meta.url, registerOptions);
31
+ // Set service name before useAzureMonitor() initialises the Resource so
32
+ // that Azure Monitor picks it up as the cloud_RoleName.
33
+ process.env["OTEL_SERVICE_NAME"] = "cli";
34
+ process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
35
+ process.env["OTEL_RESOURCE_ATTRIBUTES"],
36
+ "service.namespace=dx",
37
+ ]
38
+ .filter(Boolean)
39
+ .join(",");
40
+ // os.platform() returns "win32" on Windows; the OTel os.type enum uses "windows".
41
+ const osPlatform = os.platform();
42
+ const osType = osPlatform === "win32" ? "windows" : osPlatform;
43
+ process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
44
+ process.env["OTEL_RESOURCE_ATTRIBUTES"],
45
+ `os.type=${osType}`,
46
+ `os.version=${os.release()}`,
47
+ `os.machine=${os.machine()}`,
48
+ ]
49
+ .filter(Boolean)
50
+ .join(",");
51
+ let azureMonitorEnabled = false;
52
+ /**
53
+ * Initialises the Azure Monitor exporter and registers HTTP instrumentation.
54
+ *
55
+ * Deferred (not run at preload) so the CLI only emits telemetry once it has
56
+ * confirmed the user is a PagoPA org member. Idempotent: safe to call more than
57
+ * once. Must be called before logging is configured so the logtape OTel sink
58
+ * binds to the real (rather than no-op) LoggerProvider.
59
+ */
60
+ export const enableAzureMonitor = () => {
61
+ if (azureMonitorEnabled) {
62
+ return;
63
+ }
64
+ azureMonitorEnabled = true;
65
+ useAzureMonitor({
66
+ azureMonitorExporterOptions: {
67
+ connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING ||
68
+ "InstrumentationKey=e0ff8094-78fa-45e5-a21d-e62b453dc5d1;IngestionEndpoint=https://italynorth-0.in.applicationinsights.azure.com/;LiveEndpoint=https://italynorth.livediagnostics.monitor.azure.com/;ApplicationId=ce469d55-2ff7-4dfd-a249-cc787291e672",
69
+ },
70
+ enableLiveMetrics: true,
71
+ });
72
+ // Registered after useAzureMonitor() so the instrumentation binds to the
73
+ // real tracer/meter providers it installs (rather than the no-op defaults).
74
+ registerInstrumentations({
75
+ instrumentations: [new UndiciInstrumentation()],
76
+ meterProvider: metrics.getMeterProvider(),
77
+ tracerProvider: trace.getTracerProvider(),
78
+ });
79
+ };
80
+ // Block module evaluation until the hook is fully acknowledged.
81
+ // This ensures that when bin/index.js proceeds to import the CLI entry
82
+ // module, all transitive imports go through the registered hook.
83
+ await waitForAllMessagesAcknowledged();
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6QixNQUFNLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUFFLEdBQ3ZELDJCQUEyQixFQUFFLENBQUM7QUFFaEMsc0VBQXNFO0FBQ3RFLHlEQUF5RDtBQUN6RCxRQUFRLENBQUMsK0JBQStCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFFNUUsd0VBQXdFO0FBQ3hFLHdEQUF3RDtBQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLHNCQUFzQjtDQUN2QjtLQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFYixrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFHLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLFdBQVcsTUFBTSxFQUFFO0lBQ25CLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQzVCLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0NBQzdCO0tBQ0UsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUViLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFTLEVBQUU7SUFDM0MsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hCLE9BQU87SUFDVCxDQUFDO0lBQ0QsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRTNCLGVBQWUsQ0FBQztRQUNkLDJCQUEyQixFQUFFO1lBQzNCLGdCQUFnQixFQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDO2dCQUNqRCx3UEFBd1A7U0FDM1A7UUFDRCxpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsd0JBQXdCLENBQUM7UUFDdkIsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsYUFBYSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixFQUFFO0tBQzFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGdFQUFnRTtBQUNoRSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLE1BQU0sOEJBQThCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT1RlbCBwcmVsb2FkIG1vZHVsZSBmb3IgdGhlIGR4IENMSS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBhIGRlbGliZXJhdGUgc2lkZS1lZmZlY3QgZW50cnlwb2ludC4gSXQgTVVTVCBiZSB0aGUgZmlyc3RcbiAqIG1vZHVsZSBsb2FkZWQgYnkgdGhlIHByb2Nlc3MgKHZpYSBhIHNlcXVlbnRpYWwgZHluYW1pYyBpbXBvcnQgaW4gYmluL2luZGV4LmpzKVxuICogc28gdGhhdCBpbXBvcnQtaW4tdGhlLW1pZGRsZSBjYW4gcmVnaXN0ZXIgaXRzIGhvb2sgYmVmb3JlIGFueSBIVFRQIGNsaWVudFxuICogbGlicmFyaWVzICh1bmRpY2kvZmV0Y2gsIG9jdG9raXQsIEF6dXJlIFNES3MpIGFyZSBsb2FkZWQuXG4gKlxuICogSW5pdGlhbGlzaW5nIHRoZSBBenVyZSBNb25pdG9yIGV4cG9ydGVyIGlzIGRlZmVycmVkIHRvIGBlbmFibGVBenVyZU1vbml0b3IoKWBcbiAqIHNvIHRoZSBDTEkgY2FuIGRlY2lkZSBhdCBydW50aW1lIHdoZXRoZXIgdG8gZW1pdCB0ZWxlbWV0cnkgKG9ubHkgUGFnb1BBIG9yZ1xuICogbWVtYmVycyBkbykuIFRoZSBpbXBvcnQtaW4tdGhlLW1pZGRsZSBob29rIGlzIHN0aWxsIHJlZ2lzdGVyZWQgZWFnZXJseSBhdFxuICogcHJlbG9hZCBiZWNhdXNlIGl0IG11c3QgcnVuIGJlZm9yZSBhbnkgaW5zdHJ1bWVudGVkIG1vZHVsZSBpcyBpbXBvcnRlZC5cbiAqXG4gKiBSZWFkcyBBUFBMSUNBVElPTklOU0lHSFRTX0NPTk5FQ1RJT05fU1RSSU5HIGZyb20gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGlzIElTXG4gKiB0aGUgY29uZmlndXJhdGlvbiBib3VuZGFyeSDigJQgbm8gaGlnaGVyIGNhbGxlciBjYW4gaW5qZWN0IGNvbmZpZyBhdCB0aGlzIHBvaW50XG4gKiBpbiB0aGUgcHJvY2VzcyBsaWZlY3ljbGUuXG4gKi9cblxuaW1wb3J0IHsgdXNlQXp1cmVNb25pdG9yIH0gZnJvbSBcIkBhenVyZS9tb25pdG9yLW9wZW50ZWxlbWV0cnlcIjtcbmltcG9ydCB7IG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvblwiO1xuaW1wb3J0IHsgVW5kaWNpSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi11bmRpY2lcIjtcbi8vIGltcG9ydC1pbi10aGUtbWlkZGxlIGFuZCBtb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3QgaW1wb3J0cyBzbyB0aGF0XG4vLyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgLyByZWdpc3RlciBydW4gYXMgZWFybHkgYXMgcG9zc2libGUuXG5pbXBvcnQgeyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgfSBmcm9tIFwiaW1wb3J0LWluLXRoZS1taWRkbGVcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmNvbnN0IHsgcmVnaXN0ZXJPcHRpb25zLCB3YWl0Rm9yQWxsTWVzc2FnZXNBY2tub3dsZWRnZWQgfSA9XG4gIGNyZWF0ZUFkZEhvb2tNZXNzYWdlQ2hhbm5lbCgpO1xuXG4vLyBSZWdpc3RlciB0aGUgRVNNIG1vZHVsZSBob29rIHNvIHRoYXQgc3Vic2VxdWVudCBkeW5hbWljIGltcG9ydHMgYXJlXG4vLyBpbnRlcmNlcHRlZCBieSBPcGVuVGVsZW1ldHJ5J3MgbW9kdWxlIGluc3RydW1lbnRhdGlvbi5cbnJlZ2lzdGVyKFwiaW1wb3J0LWluLXRoZS1taWRkbGUvaG9vay5tanNcIiwgaW1wb3J0Lm1ldGEudXJsLCByZWdpc3Rlck9wdGlvbnMpO1xuXG4vLyBTZXQgc2VydmljZSBuYW1lIGJlZm9yZSB1c2VBenVyZU1vbml0b3IoKSBpbml0aWFsaXNlcyB0aGUgUmVzb3VyY2Ugc29cbi8vIHRoYXQgQXp1cmUgTW9uaXRvciBwaWNrcyBpdCB1cCBhcyB0aGUgY2xvdWRfUm9sZU5hbWUuXG5wcm9jZXNzLmVudltcIk9URUxfU0VSVklDRV9OQU1FXCJdID0gXCJjbGlcIjtcbnByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdID0gW1xuICBwcm9jZXNzLmVudltcIk9URUxfUkVTT1VSQ0VfQVRUUklCVVRFU1wiXSxcbiAgXCJzZXJ2aWNlLm5hbWVzcGFjZT1keFwiLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxuLy8gb3MucGxhdGZvcm0oKSByZXR1cm5zIFwid2luMzJcIiBvbiBXaW5kb3dzOyB0aGUgT1RlbCBvcy50eXBlIGVudW0gdXNlcyBcIndpbmRvd3NcIi5cbmNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuY29uc3Qgb3NUeXBlID0gb3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aW5kb3dzXCIgOiBvc1BsYXRmb3JtO1xucHJvY2Vzcy5lbnZbXCJPVEVMX1JFU09VUkNFX0FUVFJJQlVURVNcIl0gPSBbXG4gIHByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdLFxuICBgb3MudHlwZT0ke29zVHlwZX1gLFxuICBgb3MudmVyc2lvbj0ke29zLnJlbGVhc2UoKX1gLFxuICBgb3MubWFjaGluZT0ke29zLm1hY2hpbmUoKX1gLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxubGV0IGF6dXJlTW9uaXRvckVuYWJsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBJbml0aWFsaXNlcyB0aGUgQXp1cmUgTW9uaXRvciBleHBvcnRlciBhbmQgcmVnaXN0ZXJzIEhUVFAgaW5zdHJ1bWVudGF0aW9uLlxuICpcbiAqIERlZmVycmVkIChub3QgcnVuIGF0IHByZWxvYWQpIHNvIHRoZSBDTEkgb25seSBlbWl0cyB0ZWxlbWV0cnkgb25jZSBpdCBoYXNcbiAqIGNvbmZpcm1lZCB0aGUgdXNlciBpcyBhIFBhZ29QQSBvcmcgbWVtYmVyLiBJZGVtcG90ZW50OiBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuXG4gKiBvbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9nZ2luZyBpcyBjb25maWd1cmVkIHNvIHRoZSBsb2d0YXBlIE9UZWwgc2lua1xuICogYmluZHMgdG8gdGhlIHJlYWwgKHJhdGhlciB0aGFuIG5vLW9wKSBMb2dnZXJQcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZUF6dXJlTW9uaXRvciA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGF6dXJlTW9uaXRvckVuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXp1cmVNb25pdG9yRW5hYmxlZCA9IHRydWU7XG5cbiAgdXNlQXp1cmVNb25pdG9yKHtcbiAgICBhenVyZU1vbml0b3JFeHBvcnRlck9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmc6XG4gICAgICAgIHByb2Nlc3MuZW52LkFQUExJQ0FUSU9OSU5TSUdIVFNfQ09OTkVDVElPTl9TVFJJTkcgfHxcbiAgICAgICAgXCJJbnN0cnVtZW50YXRpb25LZXk9ZTBmZjgwOTQtNzhmYS00NWU1LWEyMWQtZTYyYjQ1M2RjNWQxO0luZ2VzdGlvbkVuZHBvaW50PWh0dHBzOi8vaXRhbHlub3J0aC0wLmluLmFwcGxpY2F0aW9uaW5zaWdodHMuYXp1cmUuY29tLztMaXZlRW5kcG9pbnQ9aHR0cHM6Ly9pdGFseW5vcnRoLmxpdmVkaWFnbm9zdGljcy5tb25pdG9yLmF6dXJlLmNvbS87QXBwbGljYXRpb25JZD1jZTQ2OWQ1NS0yZmY3LTRkZmQtYTI0OS1jYzc4NzI5MWU2NzJcIixcbiAgICB9LFxuICAgIGVuYWJsZUxpdmVNZXRyaWNzOiB0cnVlLFxuICB9KTtcblxuICAvLyBSZWdpc3RlcmVkIGFmdGVyIHVzZUF6dXJlTW9uaXRvcigpIHNvIHRoZSBpbnN0cnVtZW50YXRpb24gYmluZHMgdG8gdGhlXG4gIC8vIHJlYWwgdHJhY2VyL21ldGVyIHByb3ZpZGVycyBpdCBpbnN0YWxscyAocmF0aGVyIHRoYW4gdGhlIG5vLW9wIGRlZmF1bHRzKS5cbiAgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zKHtcbiAgICBpbnN0cnVtZW50YXRpb25zOiBbbmV3IFVuZGljaUluc3RydW1lbnRhdGlvbigpXSxcbiAgICBtZXRlclByb3ZpZGVyOiBtZXRyaWNzLmdldE1ldGVyUHJvdmlkZXIoKSxcbiAgICB0cmFjZXJQcm92aWRlcjogdHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKSxcbiAgfSk7XG59O1xuXG4vLyBCbG9jayBtb2R1bGUgZXZhbHVhdGlvbiB1bnRpbCB0aGUgaG9vayBpcyBmdWxseSBhY2tub3dsZWRnZWQuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGJpbi9pbmRleC5qcyBwcm9jZWVkcyB0byBpbXBvcnQgdGhlIENMSSBlbnRyeVxuLy8gbW9kdWxlLCBhbGwgdHJhbnNpdGl2ZSBpbXBvcnRzIGdvIHRocm91Z2ggdGhlIHJlZ2lzdGVyZWQgaG9vay5cbmF3YWl0IHdhaXRGb3JBbGxNZXNzYWdlc0Fja25vd2xlZGdlZCgpO1xuIl19
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Telemetry helpers for the dx CLI.
3
+ *
4
+ * All functions are no-ops when the OTel SDK has not been initialised (i.e.,
5
+ * when telemetry is disabled or the connection string is absent).
6
+ */
7
+ /**
8
+ * Flush pending telemetry before the process exits.
9
+ *
10
+ * Uses shutdownAzureMonitor() which force-flushes AND shuts down every
11
+ * provider (traces, logs, metrics). Flushing only the logger provider is not
12
+ * enough: the root span ends right before the process exits, so without a
13
+ * trace flush it would never be exported and would not appear in the
14
+ * Application Insights timeline.
15
+ *
16
+ * Safe to call unconditionally — swallows all errors and is a no-op when the
17
+ * SDK was never initialised (telemetry disabled or no connection string).
18
+ */
19
+ export declare const flushTelemetry: () => Promise<void>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Telemetry helpers for the dx CLI.
3
+ *
4
+ * All functions are no-ops when the OTel SDK has not been initialised (i.e.,
5
+ * when telemetry is disabled or the connection string is absent).
6
+ */
7
+ /**
8
+ * Flush pending telemetry before the process exits.
9
+ *
10
+ * Uses shutdownAzureMonitor() which force-flushes AND shuts down every
11
+ * provider (traces, logs, metrics). Flushing only the logger provider is not
12
+ * enough: the root span ends right before the process exits, so without a
13
+ * trace flush it would never be exported and would not appear in the
14
+ * Application Insights timeline.
15
+ *
16
+ * Safe to call unconditionally — swallows all errors and is a no-op when the
17
+ * SDK was never initialised (telemetry disabled or no connection string).
18
+ */
19
+ export const flushTelemetry = async () => {
20
+ try {
21
+ const { shutdownAzureMonitor } = await import("@azure/monitor-opentelemetry");
22
+ await shutdownAzureMonitor();
23
+ }
24
+ catch {
25
+ // Telemetry must never break the CLI.
26
+ }
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvdGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxJQUFtQixFQUFFO0lBQ3RELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUM1QixNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sb0JBQW9CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asc0NBQXNDO0lBQ3hDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbGVtZXRyeSBoZWxwZXJzIGZvciB0aGUgZHggQ0xJLlxuICpcbiAqIEFsbCBmdW5jdGlvbnMgYXJlIG5vLW9wcyB3aGVuIHRoZSBPVGVsIFNESyBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgKGkuZS4sXG4gKiB3aGVuIHRlbGVtZXRyeSBpcyBkaXNhYmxlZCBvciB0aGUgY29ubmVjdGlvbiBzdHJpbmcgaXMgYWJzZW50KS5cbiAqL1xuXG4vKipcbiAqIEZsdXNoIHBlbmRpbmcgdGVsZW1ldHJ5IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cy5cbiAqXG4gKiBVc2VzIHNodXRkb3duQXp1cmVNb25pdG9yKCkgd2hpY2ggZm9yY2UtZmx1c2hlcyBBTkQgc2h1dHMgZG93biBldmVyeVxuICogcHJvdmlkZXIgKHRyYWNlcywgbG9ncywgbWV0cmljcykuIEZsdXNoaW5nIG9ubHkgdGhlIGxvZ2dlciBwcm92aWRlciBpcyBub3RcbiAqIGVub3VnaDogdGhlIHJvb3Qgc3BhbiBlbmRzIHJpZ2h0IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cywgc28gd2l0aG91dCBhXG4gKiB0cmFjZSBmbHVzaCBpdCB3b3VsZCBuZXZlciBiZSBleHBvcnRlZCBhbmQgd291bGQgbm90IGFwcGVhciBpbiB0aGVcbiAqIEFwcGxpY2F0aW9uIEluc2lnaHRzIHRpbWVsaW5lLlxuICpcbiAqIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHkg4oCUIHN3YWxsb3dzIGFsbCBlcnJvcnMgYW5kIGlzIGEgbm8tb3Agd2hlbiB0aGVcbiAqIFNESyB3YXMgbmV2ZXIgaW5pdGlhbGlzZWQgKHRlbGVtZXRyeSBkaXNhYmxlZCBvciBubyBjb25uZWN0aW9uIHN0cmluZykuXG4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaFRlbGVtZXRyeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHNodXRkb3duQXp1cmVNb25pdG9yIH0gPVxuICAgICAgYXdhaXQgaW1wb3J0KFwiQGF6dXJlL21vbml0b3Itb3BlbnRlbGVtZXRyeVwiKTtcbiAgICBhd2FpdCBzaHV0ZG93bkF6dXJlTW9uaXRvcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgQ0xJLlxuICB9XG59O1xuIl19
@@ -1,20 +1,45 @@
1
1
  /**
2
- * Add command - Scaffold new components into existing workspaces
2
+ * Add command - Scaffold new components into existing workspaces.
3
3
  *
4
- * This module implements the `dx add` command which allows developers to scaffold
5
- * new components into their existing workspace following DevEx guidelines.
6
- *
7
- * Currently supported components:
8
- * - environment: Add a new deployment environment to the project
4
+ * This module implements the `dx add` command and keeps the CLI-specific flag
5
+ * parsing/validation close to the Commander adapter. It turns supported flags
6
+ * into prefilled answers for the plop generator so the command can run with a
7
+ * mix of non-interactive inputs and guided prompts.
9
8
  */
10
9
  import { Command } from "commander";
11
10
  import { ResultAsync } from "neverthrow";
12
- import type { Payload as EnvironmentPayload } from "../../plop/generators/environment/index.js";
11
+ import { z } from "zod/v4";
12
+ import type { InitialAnswers as DeploymentEnvironmentInitialAnswers, Payload as EnvironmentPayload } from "../../plop/generators/environment/index.js";
13
13
  import type { CliEnv } from "../env.js";
14
14
  import { AuthorizationResult, AuthorizationService } from "../../../domain/authorization.js";
15
15
  import { GitHubAuthFactory } from "../../../domain/dependencies.js";
16
+ declare const addEnvironmentCommandOptionsSchema: z.ZodObject<{
17
+ account: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ businessUnit: z.ZodOptional<z.ZodString>;
19
+ clientId: z.ZodOptional<z.ZodString>;
20
+ domain: z.ZodOptional<z.ZodString>;
21
+ installationId: z.ZodOptional<z.ZodString>;
22
+ location: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<{
23
+ accountId: string;
24
+ location: "italynorth" | "westeurope";
25
+ }, string>>>>;
26
+ managementTeam: z.ZodOptional<z.ZodString>;
27
+ name: z.ZodOptional<z.ZodEnum<{
28
+ dev: "dev";
29
+ prod: "prod";
30
+ uat: "uat";
31
+ }>>;
32
+ prefix: z.ZodOptional<z.ZodString>;
33
+ privateKeyPath: z.ZodOptional<z.ZodString>;
34
+ runnerAppId: z.ZodOptional<z.ZodString>;
35
+ yes: z.ZodOptional<z.ZodBoolean>;
36
+ }, z.core.$strip>;
37
+ export type AddEnvironmentCommandOptions = z.infer<typeof addEnvironmentCommandOptionsSchema>;
38
+ export declare const parseAddEnvironmentCommandOptions: (input: unknown) => AddEnvironmentCommandOptions;
39
+ export declare const getEnvironmentInitialAnswers: (options: AddEnvironmentCommandOptions) => Promise<DeploymentEnvironmentInitialAnswers>;
16
40
  /**
17
41
  * Authorize a Cloud Account (Azure Subscription, AWS Account, ...), creating a Pull Request for each account that requires authorization.
18
42
  */
19
43
  export declare const authorizeCloudAccounts: (authorizationService: AuthorizationService) => (envPayload: EnvironmentPayload) => ResultAsync<AuthorizationResult[], never>;
20
44
  export declare const makeAddCommand: (requireGitHubAuth: GitHubAuthFactory, env: CliEnv) => Command;
45
+ export {};
@@ -1,23 +1,180 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
  import chalk from "chalk";
3
3
  /**
4
- * Add command - Scaffold new components into existing workspaces
4
+ * Add command - Scaffold new components into existing workspaces.
5
5
  *
6
- * This module implements the `dx add` command which allows developers to scaffold
7
- * new components into their existing workspace following DevEx guidelines.
8
- *
9
- * Currently supported components:
10
- * - environment: Add a new deployment environment to the project
6
+ * This module implements the `dx add` command and keeps the CLI-specific flag
7
+ * parsing/validation close to the Commander adapter. It turns supported flags
8
+ * into prefilled answers for the plop generator so the command can run with a
9
+ * mix of non-interactive inputs and guided prompts.
11
10
  */
12
- import { Command } from "commander";
11
+ import { Command, Option } from "commander";
13
12
  import { okAsync, ResultAsync } from "neverthrow";
13
+ import { readFile } from "node:fs/promises";
14
+ import { z } from "zod/v4";
14
15
  import { requestAuthorizationInputSchema, } from "../../../domain/authorization.js";
15
- import { environmentShort } from "../../../domain/environment.js";
16
- import { isAzureLocation, locationShort } from "../../azure/locations.js";
16
+ import { environmentSchema, environmentShort, } from "../../../domain/environment.js";
17
+ import { isAzureLocation, locationShort, } from "../../azure/locations.js";
18
+ import { workspaceSchema } from "../../plop/generators/environment/prompts.js";
17
19
  import { collectDeploymentEnvironmentPayload, getPlopInstance, runDeploymentEnvironmentActions, } from "../../plop/index.js";
18
20
  import { asError, reportCommandError } from "../command-errors.js";
19
21
  import { createCommandPresenter, resolveOutputMode, } from "../presenters/index.js";
20
22
  import { runAddEnvironmentPreconditions } from "./init.js";
23
+ const appendOptionValue = (value, previous = []) => [...previous, value];
24
+ const locationOptionSchema = z
25
+ .string()
26
+ .trim()
27
+ .transform((value, ctx) => {
28
+ const [rawAccountId, ...rawLocationParts] = value.split("=");
29
+ const accountId = rawAccountId?.trim();
30
+ const location = rawLocationParts.join("=").trim();
31
+ if (!accountId || rawLocationParts.length === 0 || location.length === 0) {
32
+ ctx.addIssue({
33
+ code: z.ZodIssueCode.custom,
34
+ message: "Location must use the format <subscription-id=region>.",
35
+ });
36
+ return z.NEVER;
37
+ }
38
+ if (!isAzureLocation(location)) {
39
+ ctx.addIssue({
40
+ code: z.ZodIssueCode.custom,
41
+ message: `Unsupported Azure location "${location}".`,
42
+ });
43
+ return z.NEVER;
44
+ }
45
+ return { accountId, location };
46
+ });
47
+ const addEnvironmentCommandOptionsSchema = z
48
+ .object({
49
+ account: z
50
+ .array(z.string().trim().min(1, "Cloud account id cannot be empty"))
51
+ .optional(),
52
+ businessUnit: z
53
+ .string()
54
+ .trim()
55
+ .min(1, "Business unit cannot be empty")
56
+ .optional(),
57
+ clientId: z.string().trim().min(1, "Client id cannot be empty").optional(),
58
+ domain: workspaceSchema.shape.domain.optional(),
59
+ installationId: z
60
+ .string()
61
+ .trim()
62
+ .min(1, "Installation id cannot be empty")
63
+ .optional(),
64
+ location: z.array(locationOptionSchema).optional(),
65
+ managementTeam: z
66
+ .string()
67
+ .trim()
68
+ .min(1, "Management team cannot be empty")
69
+ .optional(),
70
+ name: environmentSchema.shape.name.optional(),
71
+ prefix: environmentSchema.shape.prefix.optional(),
72
+ privateKeyPath: z
73
+ .string()
74
+ .trim()
75
+ .min(1, "Private key path cannot be empty")
76
+ .optional(),
77
+ runnerAppId: z
78
+ .string()
79
+ .trim()
80
+ .min(1, "Runner app id cannot be empty")
81
+ .optional(),
82
+ yes: z.boolean().optional(),
83
+ })
84
+ .superRefine((value, ctx) => {
85
+ if (value.location && !value.account?.length) {
86
+ ctx.addIssue({
87
+ code: z.ZodIssueCode.custom,
88
+ message: "Location mappings require at least one --account flag.",
89
+ path: ["location"],
90
+ });
91
+ return;
92
+ }
93
+ if (value.account && value.location) {
94
+ const selectedAccounts = new Set(value.account);
95
+ for (const mapping of value.location) {
96
+ if (!selectedAccounts.has(mapping.accountId)) {
97
+ ctx.addIssue({
98
+ code: z.ZodIssueCode.custom,
99
+ message: `Location mapping references unknown account "${mapping.accountId}".`,
100
+ path: ["location"],
101
+ });
102
+ }
103
+ }
104
+ }
105
+ });
106
+ export const parseAddEnvironmentCommandOptions = (input) => {
107
+ const result = addEnvironmentCommandOptionsSchema.safeParse(input);
108
+ if (!result.success) {
109
+ throw new Error(`Invalid add environment command options:\n${z.prettifyError(result.error)}`, {
110
+ cause: result.error,
111
+ });
112
+ }
113
+ return result.data;
114
+ };
115
+ const buildBaseEnvironmentInitialAnswers = (options) => {
116
+ const env = {
117
+ ...(options.name && { name: options.name }),
118
+ ...(options.prefix && { prefix: options.prefix }),
119
+ ...(options.account?.length && {
120
+ cloudAccountIds: Array.from(new Set(options.account)),
121
+ }),
122
+ ...(options.location?.length && {
123
+ locations: Object.fromEntries(options.location.map(({ accountId, location }) => [
124
+ accountId,
125
+ location,
126
+ ])),
127
+ }),
128
+ };
129
+ const tags = {
130
+ ...(options.businessUnit && { BusinessUnit: options.businessUnit }),
131
+ ...(options.managementTeam && { ManagementTeam: options.managementTeam }),
132
+ };
133
+ return {
134
+ ...(Object.keys(env).length > 0 && { env }),
135
+ ...(Object.keys(tags).length > 0 && { tags }),
136
+ ...(options.domain && { workspace: { domain: options.domain } }),
137
+ };
138
+ };
139
+ export const getEnvironmentInitialAnswers = async (options) => {
140
+ const initialAnswers = buildBaseEnvironmentInitialAnswers(options);
141
+ const privateKey = options.privateKeyPath === undefined
142
+ ? undefined
143
+ : await readFile(options.privateKeyPath, "utf8").catch((cause) => {
144
+ throw new Error(`Failed to read private key file at "${options.privateKeyPath}".`, { cause });
145
+ });
146
+ // Fail fast on an empty (or whitespace-only) key file: the file contents are
147
+ // never trimmed, so an empty value would otherwise skip the recovery prompt
148
+ // and surface as an opaque schema error (or a silently invalid key) later.
149
+ if (privateKey !== undefined && privateKey.trim().length === 0) {
150
+ throw new Error(`Private key file at "${options.privateKeyPath}" is empty.`);
151
+ }
152
+ // Prefill runner-app credentials only when at least one credential flag was
153
+ // provided. Unspecified fields stay `undefined` on purpose so the generator
154
+ // prompts for the missing pieces and validates the complete set later. With
155
+ // no credential flag at all, leave this `undefined` to keep initialization
156
+ // fully interactive.
157
+ const runnerAppCredentials = options.runnerAppId === undefined &&
158
+ options.clientId === undefined &&
159
+ options.installationId === undefined &&
160
+ privateKey === undefined
161
+ ? undefined
162
+ : {
163
+ clientId: options.clientId,
164
+ id: options.runnerAppId,
165
+ installationId: options.installationId,
166
+ key: privateKey,
167
+ };
168
+ return {
169
+ ...initialAnswers,
170
+ ...((options.yes || runnerAppCredentials) && {
171
+ init: {
172
+ ...(options.yes && { confirm: true }),
173
+ ...(runnerAppCredentials && { runnerAppCredentials }),
174
+ },
175
+ }),
176
+ };
177
+ };
21
178
  /**
22
179
  * Authorize a Cloud Account (Azure Subscription, AWS Account, ...), creating a Pull Request for each account that requires authorization.
23
180
  */
@@ -88,27 +245,52 @@ const reportSummary = (presenter, outputMode) => (result) => {
88
245
  }
89
246
  };
90
247
  const trackStep = (presenter, name, task, mapError) => ResultAsync.fromPromise(presenter.trackStep(name, task), mapError);
91
- const addEnvironmentAction = (authorizationService, gitHubService, presenter) => runAddEnvironmentPreconditions(presenter)
248
+ const addEnvironmentAction = (authorizationService, gitHubService, presenter, initialAnswers = {}) => runAddEnvironmentPreconditions(presenter)
92
249
  .andThen(() => trackStep(presenter, "Initializing environment generator...", getPlopInstance, asError("Failed to initialize plop")))
93
250
  .andThen((plop) =>
94
251
  // The prompt phase must run outside trackStep: in text mode trackStep
95
252
  // renders a spinner that occupies the TTY and hides the prompts.
96
- ResultAsync.fromPromise(collectDeploymentEnvironmentPayload(plop, gitHubService), asError("Failed to run the deployment environment generator")))
253
+ ResultAsync.fromPromise(collectDeploymentEnvironmentPayload(plop, gitHubService, undefined, initialAnswers), asError("Failed to run the deployment environment generator")))
97
254
  .andThen(({ generator, payload }) => trackStep(presenter, "Creating environment...", () => runDeploymentEnvironmentActions(generator, payload), asError("Failed to create the deployment environment")))
98
255
  .andThen((payload) => authorizeCloudAccounts(authorizationService)(payload).map((authorizationPrs) => ({
99
256
  authorizationPrs,
257
+ payload,
100
258
  })));
101
259
  export const makeAddCommand = (requireGitHubAuth, env) => new Command()
102
260
  .name("add")
103
261
  .description("Add a new component to your workspace")
104
262
  .addCommand(new Command("environment")
105
263
  .description("Add a new deployment environment")
106
- .action(async function () {
264
+ .addOption(new Option("--name <name>", "Environment name").choices([
265
+ "dev",
266
+ "uat",
267
+ "prod",
268
+ ]))
269
+ .addOption(new Option("--account <subscription-id>", "Cloud account subscription id").argParser(appendOptionValue))
270
+ .addOption(new Option("--location <subscription-id=region>", "Default Azure location for a selected account").argParser(appendOptionValue))
271
+ .addOption(new Option("--prefix <prefix>", "Environment prefix"))
272
+ .addOption(new Option("--domain <domain>", "Workspace domain"))
273
+ .addOption(new Option("--business-unit <business-unit>", "Business unit tag"))
274
+ .addOption(new Option("--management-team <management-team>", "Management team tag"))
275
+ .addOption(new Option("-y, --yes", "Confirm environment initialization without prompting"))
276
+ .addOption(new Option("--runner-app-id <runner-app-id>", "GitHub Runner App ID"))
277
+ .addOption(new Option("--client-id <client-id>", "GitHub Runner App Client ID"))
278
+ .addOption(new Option("--installation-id <installation-id>", "GitHub Runner App Installation ID"))
279
+ .addOption(new Option("--private-key-path <private-key-path>", "Path to a local GitHub Runner App private key file"))
280
+ .action(async function (options) {
107
281
  const { output } = this.optsWithGlobals();
108
282
  const outputMode = resolveOutputMode(env, output);
109
283
  const presenter = createCommandPresenter(outputMode);
110
- await requireGitHubAuth()
111
- .andThen(({ authorizationService, gitHubService }) => addEnvironmentAction(authorizationService, gitHubService, presenter))
284
+ await ResultAsync.fromPromise(Promise.resolve().then(() => parseAddEnvironmentCommandOptions(options)), (cause) => cause instanceof Error
285
+ ? cause
286
+ : new Error("Failed to parse add environment command options", {
287
+ cause,
288
+ }))
289
+ .andThen((addEnvironmentOptions) => ResultAsync.fromPromise(getEnvironmentInitialAnswers(addEnvironmentOptions), (cause) => cause instanceof Error
290
+ ? cause
291
+ : new Error("Failed to load add environment initial answers", {
292
+ cause,
293
+ })).andThen((initialAnswers) => requireGitHubAuth().andThen(({ authorizationService, gitHubService }) => addEnvironmentAction(authorizationService, gitHubService, presenter, initialAnswers))))
112
294
  .match(reportSummary(presenter, outputMode), reportCommandError(this, presenter, outputMode));
113
295
  }));
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQjs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPbEQsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUUsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxlQUFlLEVBQ2YsK0JBQStCLEdBQ2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQ2pDLENBQUMsb0JBQTBDLEVBQUUsRUFBRSxDQUMvQyxDQUNFLFVBQThCLEVBQ2EsRUFBRTtJQUM3QyxNQUFNLG9CQUFvQixHQUN4QixVQUFVLENBQUMsSUFBSSxFQUFFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQztJQUVuRCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxP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QWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJELE1BQU0saUJBQWlCLEVBQUU7U0FDdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQ25ELG9CQUFvQixDQUNsQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUNGO1NBQ0EsS0FBSyxDQUNKLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQ3BDLGtCQUFrQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQ2hELENBQUM7QUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbi8qKlxuICogQWRkIGNvbW1hbmQgLSBTY2FmZm9sZCBuZXcgY29tcG9uZW50cyBpbnRvIGV4aXN0aW5nIHdvcmtzcGFjZXNcbiAqXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBgZHggYWRkYCBjb21tYW5kIHdoaWNoIGFsbG93cyBkZXZlbG9wZXJzIHRvIHNjYWZmb2xkXG4gKiBuZXcgY29tcG9uZW50cyBpbnRvIHRoZWlyIGV4aXN0aW5nIHdvcmtzcGFjZSBmb2xsb3dpbmcgRGV2RXggZ3VpZGVsaW5lcy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydGVkIGNvbXBvbmVudHM6XG4gKiAtIGVudmlyb25tZW50OiBBZGQgYSBuZXcgZGVwbG95bWVudCBlbnZpcm9ubWVudCB0byB0aGUgcHJvamVjdFxuICovXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRQcmVzZW50ZXIgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2NvbW1hbmQtcHJlc2VudGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgYXMgRW52aXJvbm1lbnRQYXlsb2FkIH0gZnJvbSBcIi4uLy4uL3Bsb3AvZ2VuZXJhdG9ycy9lbnZpcm9ubWVudC9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGlFbnYgfSBmcm9tIFwiLi4vZW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblJlc3VsdCxcbiAgQXV0aG9yaXphdGlvblNlcnZpY2UsXG4gIHJlcXVlc3RBdXRob3JpemF0aW9uSW5wdXRTY2hlbWEsXG59IGZyb20gXCIuLi8uLi8uLi9kb21haW4vYXV0aG9yaXphdGlvbi5qc1wiO1xuaW1wb3J0IHsgR2l0SHViQXV0aEZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRTaG9ydCB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZW52aXJvbm1lbnQuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0SHViU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQgeyBpc0F6dXJlTG9jYXRpb24sIGxvY2F0aW9uU2hvcnQgfSBmcm9tIFwiLi4vLi4vYXp1cmUvbG9jYXRpb25zLmpzXCI7XG5pbXBvcnQge1xuICBjb2xsZWN0RGVwbG95bWVudEVudmlyb25tZW50UGF5bG9hZCxcbiAgZ2V0UGxvcEluc3RhbmNlLFxuICBydW5EZXBsb3ltZW50RW52aXJvbm1lbnRBY3Rpb25zLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVDb21tYW5kUHJlc2VudGVyLFxuICByZXNvbHZlT3V0cHV0TW9kZSxcbn0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyB9IGZyb20gXCIuL2luaXQuanNcIjtcblxuLyoqXG4gKiBBdXRob3JpemUgYSBDbG91ZCBBY2NvdW50IChBenVyZSBTdWJzY3JpcHRpb24sIEFXUyBBY2NvdW50LCAuLi4pLCBjcmVhdGluZyBhIFB1bGwgUmVxdWVzdCBmb3IgZWFjaCBhY2NvdW50IHRoYXQgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNsb3VkQWNjb3VudHMgPVxuICAoYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlKSA9PlxuICAoXG4gICAgZW52UGF5bG9hZDogRW52aXJvbm1lbnRQYXlsb2FkLFxuICApOiBSZXN1bHRBc3luYzxBdXRob3JpemF0aW9uUmVzdWx0W10sIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgYWNjb3VudHNUb0luaXRpYWxpemUgPVxuICAgICAgZW52UGF5bG9hZC5pbml0Py5jbG91ZEFjY291bnRzVG9Jbml0aWFsaXplID8/IFtdO1xuXG4gICAgaWYgKGFjY291bnRzVG9Jbml0aWFsaXplLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJhZGQtZW52aXJvbm1lbnRcIl0pO1xuICAgIGNvbnN0IHsgbmFtZSwgcHJlZml4IH0gPSBlbnZQYXlsb2FkLmVudjtcbiAgICBjb25zdCBlbnZTaG9ydCA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCByZXF1ZXN0QWxsID0gYXN5bmMgKCk6IFByb21pc2U8QXV0aG9yaXphdGlvblJlc3VsdFtdPiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzOiBBdXRob3JpemF0aW9uUmVzdWx0W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzVG9Jbml0aWFsaXplKSB7XG4gICAgICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGFjY291bnQuZGVmYXVsdExvY2F0aW9uKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCJTa2lwcGluZyBhdXRob3JpemF0aW9uIGZvciB7YWNjb3VudH06IHVuc3VwcG9ydGVkIGxvY2F0aW9uXCIsXG4gICAgICAgICAgICB7IGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jU2hvcnQgPSBsb2NhdGlvblNob3J0W2FjY291bnQuZGVmYXVsdExvY2F0aW9uXTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSByZXF1ZXN0QXV0aG9yaXphdGlvbklucHV0U2NoZW1hLnNhZmVQYXJzZSh7XG4gICAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlJZDogYCR7cHJlZml4fS0ke2VudlNob3J0fS0ke2xvY1Nob3J0fS1ib290c3RyYXAtaWQtMDFgLFxuICAgICAgICAgIGVudlNob3J0LFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICByZXBvTmFtZTogZW52UGF5bG9hZC5naXRodWIucmVwbyxcbiAgICAgICAgICByZXBvT3duZXI6IGVudlBheWxvYWQuZ2l0aHViLm93bmVyLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbk5hbWU6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiU2tpcHBpbmcgYXV0aG9yaXphdGlvbiBmb3Ige2FjY291bnR9OiBpbnZhbGlkIGlucHV0XCIsIHtcbiAgICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRob3JpemF0aW9uU2VydmljZS5yZXF1ZXN0QXV0aG9yaXphdGlvbihcbiAgICAgICAgICBpbnB1dC5kYXRhLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3VsdC5tYXRjaChcbiAgICAgICAgICAoYXV0aFJlc3VsdCkgPT4gcmVzdWx0cy5wdXNoKGF1dGhSZXN1bHQpLFxuICAgICAgICAgIChlcnJvcikgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQXV0aG9yaXphdGlvbiByZXF1ZXN0IGZhaWxlZCBmb3Ige2FjY291bnR9OiB7ZXJyb3J9XCIsIHtcbiAgICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShyZXF1ZXN0QWxsKCksICgpID0+IFtdKS5vckVsc2UoKCkgPT5cbiAgICAgIG9rQXN5bmMoW10pLFxuICAgICk7XG4gIH07XG5cbnR5cGUgQWRkUmVzdWx0ID0ge1xuICBhdXRob3JpemF0aW9uUHJzOiBBdXRob3JpemF0aW9uUmVzdWx0W107XG59O1xuXG5jb25zdCBkaXNwbGF5U3VtbWFyeSA9IChyZXN1bHQ6IEFkZFJlc3VsdCkgPT4ge1xuICBjb25zdCB7IGF1dGhvcml6YXRpb25QcnMgfSA9IHJlc3VsdDtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChcIlxcbkNsb3VkIGVudmlyb25tZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKSk7XG5cbiAgbGV0IHN0ZXAgPSAxO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKFwiXFxuTmV4dCBTdGVwczpcIikpO1xuICBjb25zdCBwcnNXaXRoVXJsID0gYXV0aG9yaXphdGlvblBycy5maWx0ZXIoXG4gICAgKHByKTogcHIgaXMgQXV0aG9yaXphdGlvblJlc3VsdCAmIHsgdXJsOiBzdHJpbmcgfSA9PiBwci51cmwgIT0gbnVsbCxcbiAgKTtcbiAgaWYgKHByc1dpdGhVcmwubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGAke3N0ZXArK30uIFJldmlldyB0aGUgQXp1cmUgYXV0aG9yaXphdGlvbiBQdWxsIFJlcXVlc3Qocyk6YCk7XG4gICAgZm9yIChjb25zdCBhdXRoUHIgb2YgcHJzV2l0aFVybCkge1xuICAgICAgY29uc29sZS5sb2coYCAgIC0gJHtjaGFsay51bmRlcmxpbmUoYXV0aFByLnVybCl9YCk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUubG9nKFxuICAgIGAke3N0ZXB9LiBWaXNpdCAke2NoYWxrLnVuZGVybGluZShcImh0dHBzOi8vZHgucGFnb3BhLml0L2dldHRpbmctc3RhcnRlZFwiKX0gdG8gZGVwbG95IHlvdXIgZmlyc3QgcHJvamVjdFxcbmAsXG4gICk7XG59O1xuXG4vKipcbiAqIFJvdXRlcyB0aGUgc3VjY2Vzc2Z1bCBvdXRjb21lIHRocm91Z2ggdGhlIHByZXNlbnRlcjogSlNPTiBtb2RlIGVtaXRzIHRoZVxuICogc3RydWN0dXJlZCBlbnZlbG9wZSB3aGlsZSB0ZXh0IG1vZGUgcmVuZGVycyB0aGUgaHVtYW4tcmVhZGFibGUgc3VtbWFyeS5cbiAqL1xuY29uc3QgcmVwb3J0U3VtbWFyeSA9XG4gIChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsIG91dHB1dE1vZGU6IFwianNvblwiIHwgXCJ0ZXh0XCIpID0+XG4gIChyZXN1bHQ6IEFkZFJlc3VsdCk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRNb2RlID09PSBcImpzb25cIikge1xuICAgICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5U3VtbWFyeShyZXN1bHQpO1xuICAgIH1cbiAgfTtcblxuY29uc3QgdHJhY2tTdGVwID0gPFQsIEU+KFxuICBwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFzazogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWFwRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gRSxcbik6IFJlc3VsdEFzeW5jPFQsIEU+ID0+XG4gIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKHByZXNlbnRlci50cmFja1N0ZXAobmFtZSwgdGFzayksIG1hcEVycm9yKTtcblxuY29uc3QgYWRkRW52aXJvbm1lbnRBY3Rpb24gPSAoXG4gIGF1dGhvcml6YXRpb25TZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcbiAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgcHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyLFxuKTogUmVzdWx0QXN5bmM8QWRkUmVzdWx0LCBFcnJvcj4gPT5cbiAgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zKHByZXNlbnRlcilcbiAgICAuYW5kVGhlbigoKSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiSW5pdGlhbGl6aW5nIGVudmlyb25tZW50IGdlbmVyYXRvci4uLlwiLFxuICAgICAgICBnZXRQbG9wSW5zdGFuY2UsXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbG9wXCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHBsb3ApID0+XG4gICAgICAvLyBUaGUgcHJvbXB0IHBoYXNlIG11c3QgcnVuIG91dHNpZGUgdHJhY2tTdGVwOiBpbiB0ZXh0IG1vZGUgdHJhY2tTdGVwXG4gICAgICAvLyByZW5kZXJzIGEgc3Bpbm5lciB0aGF0IG9jY3VwaWVzIHRoZSBUVFkgYW5kIGhpZGVzIHRoZSBwcm9tcHRzLlxuICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkKHBsb3AsIGdpdEh1YlNlcnZpY2UpLFxuICAgICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIHJ1biB0aGUgZGVwbG95bWVudCBlbnZpcm9ubWVudCBnZW5lcmF0b3JcIiksXG4gICAgICApLFxuICAgIClcbiAgICAuYW5kVGhlbigoeyBnZW5lcmF0b3IsIHBheWxvYWQgfSkgPT5cbiAgICAgIHRyYWNrU3RlcChcbiAgICAgICAgcHJlc2VudGVyLFxuICAgICAgICBcIkNyZWF0aW5nIGVudmlyb25tZW50Li4uXCIsXG4gICAgICAgICgpID0+IHJ1bkRlcGxveW1lbnRFbnZpcm9ubWVudEFjdGlvbnMoZ2VuZXJhdG9yLCBwYXlsb2FkKSxcbiAgICAgICAgYXNFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnRcIiksXG4gICAgICApLFxuICAgIClcbiAgICAuYW5kVGhlbigocGF5bG9hZCkgPT5cbiAgICAgIGF1dGhvcml6ZUNsb3VkQWNjb3VudHMoYXV0aG9yaXphdGlvblNlcnZpY2UpKHBheWxvYWQpLm1hcChcbiAgICAgICAgKGF1dGhvcml6YXRpb25QcnMpID0+ICh7XG4gICAgICAgICAgYXV0aG9yaXphdGlvblBycyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG5cbmV4cG9ydCBjb25zdCBtYWtlQWRkQ29tbWFuZCA9IChcbiAgcmVxdWlyZUdpdEh1YkF1dGg6IEdpdEh1YkF1dGhGYWN0b3J5LFxuICBlbnY6IENsaUVudixcbik6IENvbW1hbmQgPT5cbiAgbmV3IENvbW1hbmQoKVxuICAgIC5uYW1lKFwiYWRkXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQWRkIGEgbmV3IGNvbXBvbmVudCB0byB5b3VyIHdvcmtzcGFjZVwiKVxuICAgIC5hZGRDb21tYW5kKFxuICAgICAgbmV3IENvbW1hbmQoXCJlbnZpcm9ubWVudFwiKVxuICAgICAgICAuZGVzY3JpcHRpb24oXCJBZGQgYSBuZXcgZGVwbG95bWVudCBlbnZpcm9ubWVudFwiKVxuICAgICAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgICAgICBjb25zdCBvdXRwdXRNb2RlID0gcmVzb2x2ZU91dHB1dE1vZGUoZW52LCBvdXRwdXQpO1xuICAgICAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIob3V0cHV0TW9kZSk7XG5cbiAgICAgICAgICBhd2FpdCByZXF1aXJlR2l0SHViQXV0aCgpXG4gICAgICAgICAgICAuYW5kVGhlbigoeyBhdXRob3JpemF0aW9uU2VydmljZSwgZ2l0SHViU2VydmljZSB9KSA9PlxuICAgICAgICAgICAgICBhZGRFbnZpcm9ubWVudEFjdGlvbihcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgcmVwb3J0U3VtbWFyeShwcmVzZW50ZXIsIG91dHB1dE1vZGUpLFxuICAgICAgICAgICAgICByZXBvcnRDb21tYW5kRXJyb3IodGhpcywgcHJlc2VudGVyLCBvdXRwdXRNb2RlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICk7XG4iXX0=
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQjs7Ozs7OztHQU9HO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFVM0IsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUVMLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxlQUFlLEVBQ2YsK0JBQStCLEdBQ2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTNELE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsS0FBYSxFQUNiLFdBQXFCLEVBQUUsRUFDYixFQUFFLENBQUMs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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuLyoqXG4gKiBBZGQgY29tbWFuZCAtIFNjYWZmb2xkIG5ldyBjb21wb25lbnRzIGludG8gZXhpc3Rpbmcgd29ya3NwYWNlcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBgZHggYWRkYCBjb21tYW5kIGFuZCBrZWVwcyB0aGUgQ0xJLXNwZWNpZmljIGZsYWdcbiAqIHBhcnNpbmcvdmFsaWRhdGlvbiBjbG9zZSB0byB0aGUgQ29tbWFuZGVyIGFkYXB0ZXIuIEl0IHR1cm5zIHN1cHBvcnRlZCBmbGFnc1xuICogaW50byBwcmVmaWxsZWQgYW5zd2VycyBmb3IgdGhlIHBsb3AgZ2VuZXJhdG9yIHNvIHRoZSBjb21tYW5kIGNhbiBydW4gd2l0aCBhXG4gKiBtaXggb2Ygbm9uLWludGVyYWN0aXZlIGlucHV0cyBhbmQgZ3VpZGVkIHByb21wdHMuXG4gKi9cbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kL3Y0XCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZFByZXNlbnRlciB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vY29tbWFuZC1wcmVzZW50ZXIuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgSW5pdGlhbEFuc3dlcnMgYXMgRGVwbG95bWVudEVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMsXG4gIFBheWxvYWQgYXMgRW52aXJvbm1lbnRQYXlsb2FkLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9nZW5lcmF0b3JzL2Vudmlyb25tZW50L2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUVudiB9IGZyb20gXCIuLi9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uUmVzdWx0LFxuICBBdXRob3JpemF0aW9uU2VydmljZSxcbiAgcmVxdWVzdEF1dGhvcml6YXRpb25JbnB1dFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9hdXRob3JpemF0aW9uLmpzXCI7XG5pbXBvcnQgeyBHaXRIdWJBdXRoRmFjdG9yeSB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZGVwZW5kZW5jaWVzLmpzXCI7XG5pbXBvcnQge1xuICBlbnZpcm9ubWVudFNjaGVtYSxcbiAgZW52aXJvbm1lbnRTaG9ydCxcbn0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXp1cmVMb2NhdGlvbixcbiAgaXNBenVyZUxvY2F0aW9uLFxuICBsb2NhdGlvblNob3J0LFxufSBmcm9tIFwiLi4vLi4vYXp1cmUvbG9jYXRpb25zLmpzXCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VTY2hlbWEgfSBmcm9tIFwiLi4vLi4vcGxvcC9nZW5lcmF0b3JzL2Vudmlyb25tZW50L3Byb21wdHMuanNcIjtcbmltcG9ydCB7XG4gIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkLFxuICBnZXRQbG9wSW5zdGFuY2UsXG4gIHJ1bkRlcGxveW1lbnRFbnZpcm9ubWVudEFjdGlvbnMsXG59IGZyb20gXCIuLi8uLi9wbG9wL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhc0Vycm9yLCByZXBvcnRDb21tYW5kRXJyb3IgfSBmcm9tIFwiLi4vY29tbWFuZC1lcnJvcnMuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIsXG4gIHJlc29sdmVPdXRwdXRNb2RlLFxufSBmcm9tIFwiLi4vcHJlc2VudGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zIH0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5jb25zdCBhcHBlbmRPcHRpb25WYWx1ZSA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgcHJldmlvdXM6IHN0cmluZ1tdID0gW10sXG4pOiBzdHJpbmdbXSA9PiBbLi4ucHJldmlvdXMsIHZhbHVlXTtcblxuY29uc3QgbG9jYXRpb25PcHRpb25TY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC50cmFuc2Zvcm0oKHZhbHVlLCBjdHgpID0+IHtcbiAgICBjb25zdCBbcmF3QWNjb3VudElkLCAuLi5yYXdMb2NhdGlvblBhcnRzXSA9IHZhbHVlLnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSByYXdBY2NvdW50SWQ/LnRyaW0oKTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHJhd0xvY2F0aW9uUGFydHMuam9pbihcIj1cIikudHJpbSgpO1xuXG4gICAgaWYgKCFhY2NvdW50SWQgfHwgcmF3TG9jYXRpb25QYXJ0cy5sZW5ndGggPT09IDAgfHwgbG9jYXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgIG1lc3NhZ2U6IFwiTG9jYXRpb24gbXVzdCB1c2UgdGhlIGZvcm1hdCA8c3Vic2NyaXB0aW9uLWlkPXJlZ2lvbj4uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgIH1cblxuICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGxvY2F0aW9uKSkge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICBtZXNzYWdlOiBgVW5zdXBwb3J0ZWQgQXp1cmUgbG9jYXRpb24gXCIke2xvY2F0aW9ufVwiLmAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgIH1cblxuICAgIHJldHVybiB7IGFjY291bnRJZCwgbG9jYXRpb24gfTtcbiAgfSk7XG5cbmNvbnN0IGFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGFjY291bnQ6IHpcbiAgICAgIC5hcnJheSh6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJDbG91ZCBhY2NvdW50IGlkIGNhbm5vdCBiZSBlbXB0eVwiKSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGJ1c2luZXNzVW5pdDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEsIFwiQnVzaW5lc3MgdW5pdCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGNsaWVudElkOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJDbGllbnQgaWQgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gICAgZG9tYWluOiB3b3Jrc3BhY2VTY2hlbWEuc2hhcGUuZG9tYWluLm9wdGlvbmFsKCksXG4gICAgaW5zdGFsbGF0aW9uSWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLm1pbigxLCBcIkluc3RhbGxhdGlvbiBpZCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGxvY2F0aW9uOiB6LmFycmF5KGxvY2F0aW9uT3B0aW9uU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIG1hbmFnZW1lbnRUZWFtOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oMSwgXCJNYW5hZ2VtZW50IHRlYW0gY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgICAub3B0aW9uYWwoKSxcbiAgICBuYW1lOiBlbnZpcm9ubWVudFNjaGVtYS5zaGFwZS5uYW1lLm9wdGlvbmFsKCksXG4gICAgcHJlZml4OiBlbnZpcm9ubWVudFNjaGVtYS5zaGFwZS5wcmVmaXgub3B0aW9uYWwoKSxcbiAgICBwcml2YXRlS2V5UGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEsIFwiUHJpdmF0ZSBrZXkgcGF0aCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIHJ1bm5lckFwcElkOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oMSwgXCJSdW5uZXIgYXBwIGlkIGNhbm5vdCBiZSBlbXB0eVwiKVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgeWVzOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3VwZXJSZWZpbmUoKHZhbHVlLCBjdHgpID0+IHtcbiAgICBpZiAodmFsdWUubG9jYXRpb24gJiYgIXZhbHVlLmFjY291bnQ/Lmxlbmd0aCkge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICBtZXNzYWdlOiBcIkxvY2F0aW9uIG1hcHBpbmdzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIC0tYWNjb3VudCBmbGFnLlwiLFxuICAgICAgICBwYXRoOiBbXCJsb2NhdGlvblwiXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5hY2NvdW50ICYmIHZhbHVlLmxvY2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEFjY291bnRzID0gbmV3IFNldCh2YWx1ZS5hY2NvdW50KTtcbiAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiB2YWx1ZS5sb2NhdGlvbikge1xuICAgICAgICBpZiAoIXNlbGVjdGVkQWNjb3VudHMuaGFzKG1hcHBpbmcuYWNjb3VudElkKSkge1xuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiBgTG9jYXRpb24gbWFwcGluZyByZWZlcmVuY2VzIHVua25vd24gYWNjb3VudCBcIiR7bWFwcGluZy5hY2NvdW50SWR9XCIuYCxcbiAgICAgICAgICAgIHBhdGg6IFtcImxvY2F0aW9uXCJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuZXhwb3J0IHR5cGUgQWRkRW52aXJvbm1lbnRDb21tYW5kT3B0aW9ucyA9IHouaW5mZXI8XG4gIHR5cGVvZiBhZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zU2NoZW1hXG4+O1xuXG5leHBvcnQgY29uc3QgcGFyc2VBZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zID0gKFxuICBpbnB1dDogdW5rbm93bixcbik6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zU2NoZW1hLnNhZmVQYXJzZShpbnB1dCk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBhZGQgZW52aXJvbm1lbnQgY29tbWFuZCBvcHRpb25zOlxcbiR7ei5wcmV0dGlmeUVycm9yKHJlc3VsdC5lcnJvcil9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2U6IHJlc3VsdC5lcnJvcixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuZGF0YTtcbn07XG5cbmNvbnN0IGJ1aWxkQmFzZUVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMgPSAoXG4gIG9wdGlvbnM6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMsXG4pOiBEZXBsb3ltZW50RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyA9PiB7XG4gIGNvbnN0IGVudiA9IHtcbiAgICAuLi4ob3B0aW9ucy5uYW1lICYmIHsgbmFtZTogb3B0aW9ucy5uYW1lIH0pLFxuICAgIC4uLihvcHRpb25zLnByZWZpeCAmJiB7IHByZWZpeDogb3B0aW9ucy5wcmVmaXggfSksXG4gICAgLi4uKG9wdGlvbnMuYWNjb3VudD8ubGVuZ3RoICYmIHtcbiAgICAgIGNsb3VkQWNjb3VudElkczogQXJyYXkuZnJvbShuZXcgU2V0KG9wdGlvbnMuYWNjb3VudCkpLFxuICAgIH0pLFxuICAgIC4uLihvcHRpb25zLmxvY2F0aW9uPy5sZW5ndGggJiYge1xuICAgICAgbG9jYXRpb25zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIG9wdGlvbnMubG9jYXRpb24ubWFwKCh7IGFjY291bnRJZCwgbG9jYXRpb24gfSkgPT4gW1xuICAgICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgICBsb2NhdGlvbiBhcyBBenVyZUxvY2F0aW9uLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSksXG4gIH07XG5cbiAgY29uc3QgdGFncyA9IHtcbiAgICAuLi4ob3B0aW9ucy5idXNpbmVzc1VuaXQgJiYgeyBCdXNpbmVzc1VuaXQ6IG9wdGlvbnMuYnVzaW5lc3NVbml0IH0pLFxuICAgIC4uLihvcHRpb25zLm1hbmFnZW1lbnRUZWFtICYmIHsgTWFuYWdlbWVudFRlYW06IG9wdGlvbnMubWFuYWdlbWVudFRlYW0gfSksXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oT2JqZWN0LmtleXMoZW52KS5sZW5ndGggPiAwICYmIHsgZW52IH0pLFxuICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwICYmIHsgdGFncyB9KSxcbiAgICAuLi4ob3B0aW9ucy5kb21haW4gJiYgeyB3b3Jrc3BhY2U6IHsgZG9tYWluOiBvcHRpb25zLmRvbWFpbiB9IH0pLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMgPSBhc3luYyAoXG4gIG9wdGlvbnM6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMsXG4pOiBQcm9taXNlPERlcGxveW1lbnRFbnZpcm9ubWVudEluaXRpYWxBbnN3ZXJzPiA9PiB7XG4gIGNvbnN0IGluaXRpYWxBbnN3ZXJzID0gYnVpbGRCYXNlRW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyhvcHRpb25zKTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgb3B0aW9ucy5wcml2YXRlS2V5UGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCByZWFkRmlsZShvcHRpb25zLnByaXZhdGVLZXlQYXRoLCBcInV0ZjhcIikuY2F0Y2goKGNhdXNlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHByaXZhdGUga2V5IGZpbGUgYXQgXCIke29wdGlvbnMucHJpdmF0ZUtleVBhdGh9XCIuYCxcbiAgICAgICAgICAgIHsgY2F1c2UgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAvLyBGYWlsIGZhc3Qgb24gYW4gZW1wdHkgKG9yIHdoaXRlc3BhY2Utb25seSkga2V5IGZpbGU6IHRoZSBmaWxlIGNvbnRlbnRzIGFyZVxuICAvLyBuZXZlciB0cmltbWVkLCBzbyBhbiBlbXB0eSB2YWx1ZSB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgcmVjb3ZlcnkgcHJvbXB0XG4gIC8vIGFuZCBzdXJmYWNlIGFzIGFuIG9wYXF1ZSBzY2hlbWEgZXJyb3IgKG9yIGEgc2lsZW50bHkgaW52YWxpZCBrZXkpIGxhdGVyLlxuICBpZiAocHJpdmF0ZUtleSAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVLZXkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQcml2YXRlIGtleSBmaWxlIGF0IFwiJHtvcHRpb25zLnByaXZhdGVLZXlQYXRofVwiIGlzIGVtcHR5LmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFByZWZpbGwgcnVubmVyLWFwcCBjcmVkZW50aWFscyBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIGNyZWRlbnRpYWwgZmxhZyB3YXNcbiAgLy8gcHJvdmlkZWQuIFVuc3BlY2lmaWVkIGZpZWxkcyBzdGF5IGB1bmRlZmluZWRgIG9uIHB1cnBvc2Ugc28gdGhlIGdlbmVyYXRvclxuICAvLyBwcm9tcHRzIGZvciB0aGUgbWlzc2luZyBwaWVjZXMgYW5kIHZhbGlkYXRlcyB0aGUgY29tcGxldGUgc2V0IGxhdGVyLiBXaXRoXG4gIC8vIG5vIGNyZWRlbnRpYWwgZmxhZyBhdCBhbGwsIGxlYXZlIHRoaXMgYHVuZGVmaW5lZGAgdG8ga2VlcCBpbml0aWFsaXphdGlvblxuICAvLyBmdWxseSBpbnRlcmFjdGl2ZS5cbiAgY29uc3QgcnVubmVyQXBwQ3JlZGVudGlhbHMgPVxuICAgIG9wdGlvbnMucnVubmVyQXBwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIG9wdGlvbnMuY2xpZW50SWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIHByaXZhdGVLZXkgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDoge1xuICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgIGlkOiBvcHRpb25zLnJ1bm5lckFwcElkLFxuICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBvcHRpb25zLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLmluaXRpYWxBbnN3ZXJzLFxuICAgIC4uLigob3B0aW9ucy55ZXMgfHwgcnVubmVyQXBwQ3JlZGVudGlhbHMpICYmIHtcbiAgICAgIGluaXQ6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMueWVzICYmIHsgY29uZmlybTogdHJ1ZSB9KSxcbiAgICAgICAgLi4uKHJ1bm5lckFwcENyZWRlbnRpYWxzICYmIHsgcnVubmVyQXBwQ3JlZGVudGlhbHMgfSksXG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xufTtcblxuLyoqXG4gKiBBdXRob3JpemUgYSBDbG91ZCBBY2NvdW50IChBenVyZSBTdWJzY3JpcHRpb24sIEFXUyBBY2NvdW50LCAuLi4pLCBjcmVhdGluZyBhIFB1bGwgUmVxdWVzdCBmb3IgZWFjaCBhY2NvdW50IHRoYXQgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNsb3VkQWNjb3VudHMgPVxuICAoYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlKSA9PlxuICAoXG4gICAgZW52UGF5bG9hZDogRW52aXJvbm1lbnRQYXlsb2FkLFxuICApOiBSZXN1bHRBc3luYzxBdXRob3JpemF0aW9uUmVzdWx0W10sIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgYWNjb3VudHNUb0luaXRpYWxpemUgPVxuICAgICAgZW52UGF5bG9hZC5pbml0Py5jbG91ZEFjY291bnRzVG9Jbml0aWFsaXplID8/IFtdO1xuXG4gICAgaWYgKGFjY291bnRzVG9Jbml0aWFsaXplLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJhZGQtZW52aXJvbm1lbnRcIl0pO1xuICAgIGNvbnN0IHsgbmFtZSwgcHJlZml4IH0gPSBlbnZQYXlsb2FkLmVudjtcbiAgICBjb25zdCBlbnZTaG9ydCA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCByZXF1ZXN0QWxsID0gYXN5bmMgKCk6IFByb21pc2U8QXV0aG9yaXphdGlvblJlc3VsdFtdPiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzOiBBdXRob3JpemF0aW9uUmVzdWx0W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzVG9Jbml0aWFsaXplKSB7XG4gICAgICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGFjY291bnQuZGVmYXVsdExvY2F0aW9uKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCJTa2lwcGluZyBhdXRob3JpemF0aW9uIGZvciB7YWNjb3VudH06IHVuc3VwcG9ydGVkIGxvY2F0aW9uXCIsXG4gICAgICAgICAgICB7IGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jU2hvcnQgPSBsb2NhdGlvblNob3J0W2FjY291bnQuZGVmYXVsdExvY2F0aW9uXTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSByZXF1ZXN0QXV0aG9yaXphdGlvbklucHV0U2NoZW1hLnNhZmVQYXJzZSh7XG4gICAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlJZDogYCR7cHJlZml4fS0ke2VudlNob3J0fS0ke2xvY1Nob3J0fS1ib290c3RyYXAtaWQtMDFgLFxuICAgICAgICAgIGVudlNob3J0LFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICByZXBvTmFtZTogZW52UGF5bG9hZC5naXRodWIucmVwbyxcbiAgICAgICAgICByZXBvT3duZXI6IGVudlBheWxvYWQuZ2l0aHViLm93bmVyLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbk5hbWU6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiU2tpcHBpbmcgYXV0aG9yaXphdGlvbiBmb3Ige2FjY291bnR9OiBpbnZhbGlkIGlucHV0XCIsIHtcbiAgICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRob3JpemF0aW9uU2VydmljZS5yZXF1ZXN0QXV0aG9yaXphdGlvbihcbiAgICAgICAgICBpbnB1dC5kYXRhLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3VsdC5tYXRjaChcbiAgICAgICAgICAoYXV0aFJlc3VsdCkgPT4gcmVzdWx0cy5wdXNoKGF1dGhSZXN1bHQpLFxuICAgICAgICAgIChlcnJvcikgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQXV0aG9yaXphdGlvbiByZXF1ZXN0IGZhaWxlZCBmb3Ige2FjY291bnR9OiB7ZXJyb3J9XCIsIHtcbiAgICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShyZXF1ZXN0QWxsKCksICgpID0+IFtdKS5vckVsc2UoKCkgPT5cbiAgICAgIG9rQXN5bmMoW10pLFxuICAgICk7XG4gIH07XG5cbnR5cGUgQWRkUmVzdWx0ID0ge1xuICBhdXRob3JpemF0aW9uUHJzOiBBdXRob3JpemF0aW9uUmVzdWx0W107XG4gIHBheWxvYWQ6IEVudmlyb25tZW50UGF5bG9hZDtcbn07XG5cbmNvbnN0IGRpc3BsYXlTdW1tYXJ5ID0gKHJlc3VsdDogQWRkUmVzdWx0KSA9PiB7XG4gIGNvbnN0IHsgYXV0aG9yaXphdGlvblBycyB9ID0gcmVzdWx0O1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKFwiXFxuQ2xvdWQgZW52aXJvbm1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpKTtcblxuICBsZXQgc3RlcCA9IDE7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5OZXh0IFN0ZXBzOlwiKSk7XG4gIGNvbnN0IHByc1dpdGhVcmwgPSBhdXRob3JpemF0aW9uUHJzLmZpbHRlcihcbiAgICAocHIpOiBwciBpcyBBdXRob3JpemF0aW9uUmVzdWx0ICYgeyB1cmw6IHN0cmluZyB9ID0+IHByLnVybCAhPSBudWxsLFxuICApO1xuICBpZiAocHJzV2l0aFVybC5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coYCR7c3RlcCsrfS4gUmV2aWV3IHRoZSBBenVyZSBhdXRob3JpemF0aW9uIFB1bGwgUmVxdWVzdChzKTpgKTtcbiAgICBmb3IgKGNvbnN0IGF1dGhQciBvZiBwcnNXaXRoVXJsKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAgLSAke2NoYWxrLnVuZGVybGluZShhdXRoUHIudXJsKX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2coXG4gICAgYCR7c3RlcH0uIFZpc2l0ICR7Y2hhbGsudW5kZXJsaW5lKFwiaHR0cHM6Ly9keC5wYWdvcGEuaXQvZ2V0dGluZy1zdGFydGVkXCIpfSB0byBkZXBsb3kgeW91ciBmaXJzdCBwcm9qZWN0XFxuYCxcbiAgKTtcbn07XG5cbi8qKlxuICogUm91dGVzIHRoZSBzdWNjZXNzZnVsIG91dGNvbWUgdGhyb3VnaCB0aGUgcHJlc2VudGVyOiBKU09OIG1vZGUgZW1pdHMgdGhlXG4gKiBzdHJ1Y3R1cmVkIGVudmVsb3BlIHdoaWxlIHRleHQgbW9kZSByZW5kZXJzIHRoZSBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5LlxuICovXG5jb25zdCByZXBvcnRTdW1tYXJ5ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogQWRkUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgaWYgKG91dHB1dE1vZGUgPT09IFwianNvblwiKSB7XG4gICAgICBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlTdW1tYXJ5KHJlc3VsdCk7XG4gICAgfVxuICB9O1xuXG5jb25zdCB0cmFja1N0ZXAgPSA8VCwgRT4oXG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcixcbiAgbmFtZTogc3RyaW5nLFxuICB0YXNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXBFcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiBFLFxuKTogUmVzdWx0QXN5bmM8VCwgRT4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJlc2VudGVyLnRyYWNrU3RlcChuYW1lLCB0YXNrKSwgbWFwRXJyb3IpO1xuXG5jb25zdCBhZGRFbnZpcm9ubWVudEFjdGlvbiA9IChcbiAgYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlLFxuICBnaXRIdWJTZXJ2aWNlOiBHaXRIdWJTZXJ2aWNlLFxuICBwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsXG4gIGluaXRpYWxBbnN3ZXJzOiBEZXBsb3ltZW50RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyA9IHt9LFxuKTogUmVzdWx0QXN5bmM8QWRkUmVzdWx0LCBFcnJvcj4gPT5cbiAgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zKHByZXNlbnRlcilcbiAgICAuYW5kVGhlbigoKSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiSW5pdGlhbGl6aW5nIGVudmlyb25tZW50IGdlbmVyYXRvci4uLlwiLFxuICAgICAgICBnZXRQbG9wSW5zdGFuY2UsXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbG9wXCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHBsb3ApID0+XG4gICAgICAvLyBUaGUgcHJvbXB0IHBoYXNlIG11c3QgcnVuIG91dHNpZGUgdHJhY2tTdGVwOiBpbiB0ZXh0IG1vZGUgdHJhY2tTdGVwXG4gICAgICAvLyByZW5kZXJzIGEgc3Bpbm5lciB0aGF0IG9jY3VwaWVzIHRoZSBUVFkgYW5kIGhpZGVzIHRoZSBwcm9tcHRzLlxuICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkKFxuICAgICAgICAgIHBsb3AsXG4gICAgICAgICAgZ2l0SHViU2VydmljZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgaW5pdGlhbEFuc3dlcnMsXG4gICAgICAgICksXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gcnVuIHRoZSBkZXBsb3ltZW50IGVudmlyb25tZW50IGdlbmVyYXRvclwiKSxcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKCh7IGdlbmVyYXRvciwgcGF5bG9hZCB9KSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiQ3JlYXRpbmcgZW52aXJvbm1lbnQuLi5cIixcbiAgICAgICAgKCkgPT4gcnVuRGVwbG95bWVudEVudmlyb25tZW50QWN0aW9ucyhnZW5lcmF0b3IsIHBheWxvYWQpLFxuICAgICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgZGVwbG95bWVudCBlbnZpcm9ubWVudFwiKSxcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKChwYXlsb2FkKSA9PlxuICAgICAgYXV0aG9yaXplQ2xvdWRBY2NvdW50cyhhdXRob3JpemF0aW9uU2VydmljZSkocGF5bG9hZCkubWFwKFxuICAgICAgICAoYXV0aG9yaXphdGlvblBycykgPT4gKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uUHJzLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuXG5leHBvcnQgY29uc3QgbWFrZUFkZENvbW1hbmQgPSAoXG4gIHJlcXVpcmVHaXRIdWJBdXRoOiBHaXRIdWJBdXRoRmFjdG9yeSxcbiAgZW52OiBDbGlFbnYsXG4pOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShcImFkZFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkFkZCBhIG5ldyBjb21wb25lbnQgdG8geW91ciB3b3Jrc3BhY2VcIilcbiAgICAuYWRkQ29tbWFuZChcbiAgICAgIG5ldyBDb21tYW5kKFwiZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiQWRkIGEgbmV3IGRlcGxveW1lbnQgZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmFkZE9wdGlvbihcbiAgICAgICAgICBuZXcgT3B0aW9uKFwiLS1uYW1lIDxuYW1lPlwiLCBcIkVudmlyb25tZW50IG5hbWVcIikuY2hvaWNlcyhbXG4gICAgICAgICAgICBcImRldlwiLFxuICAgICAgICAgICAgXCJ1YXRcIixcbiAgICAgICAgICAgIFwicHJvZFwiLFxuICAgICAgICAgIF0pLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLS1hY2NvdW50IDxzdWJzY3JpcHRpb24taWQ+XCIsXG4gICAgICAgICAgICBcIkNsb3VkIGFjY291bnQgc3Vic2NyaXB0aW9uIGlkXCIsXG4gICAgICAgICAgKS5hcmdQYXJzZXIoYXBwZW5kT3B0aW9uVmFsdWUpLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLS1sb2NhdGlvbiA8c3Vic2NyaXB0aW9uLWlkPXJlZ2lvbj5cIixcbiAgICAgICAgICAgIFwiRGVmYXVsdCBBenVyZSBsb2NhdGlvbiBmb3IgYSBzZWxlY3RlZCBhY2NvdW50XCIsXG4gICAgICAgICAgKS5hcmdQYXJzZXIoYXBwZW5kT3B0aW9uVmFsdWUpLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi0tcHJlZml4IDxwcmVmaXg+XCIsIFwiRW52aXJvbm1lbnQgcHJlZml4XCIpKVxuICAgICAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oXCItLWRvbWFpbiA8ZG9tYWluPlwiLCBcIldvcmtzcGFjZSBkb21haW5cIikpXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcIi0tYnVzaW5lc3MtdW5pdCA8YnVzaW5lc3MtdW5pdD5cIiwgXCJCdXNpbmVzcyB1bml0IHRhZ1wiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgICAgICBcIi0tbWFuYWdlbWVudC10ZWFtIDxtYW5hZ2VtZW50LXRlYW0+XCIsXG4gICAgICAgICAgICBcIk1hbmFnZW1lbnQgdGVhbSB0YWdcIixcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLXksIC0teWVzXCIsXG4gICAgICAgICAgICBcIkNvbmZpcm0gZW52aXJvbm1lbnQgaW5pdGlhbGl6YXRpb24gd2l0aG91dCBwcm9tcHRpbmdcIixcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcIi0tcnVubmVyLWFwcC1pZCA8cnVubmVyLWFwcC1pZD5cIiwgXCJHaXRIdWIgUnVubmVyIEFwcCBJRFwiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXCItLWNsaWVudC1pZCA8Y2xpZW50LWlkPlwiLCBcIkdpdEh1YiBSdW5uZXIgQXBwIENsaWVudCBJRFwiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgICAgICBcIi0taW5zdGFsbGF0aW9uLWlkIDxpbnN0YWxsYXRpb24taWQ+XCIsXG4gICAgICAgICAgICBcIkdpdEh1YiBSdW5uZXIgQXBwIEluc3RhbGxhdGlvbiBJRFwiLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLmFkZE9wdGlvbihcbiAgICAgICAgICBuZXcgT3B0aW9uKFxuICAgICAgICAgICAgXCItLXByaXZhdGUta2V5LXBhdGggPHByaXZhdGUta2V5LXBhdGg+XCIsXG4gICAgICAgICAgICBcIlBhdGggdG8gYSBsb2NhbCBHaXRIdWIgUnVubmVyIEFwcCBwcml2YXRlIGtleSBmaWxlXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHRoaXMub3B0c1dpdGhHbG9iYWxzPEdsb2JhbE9wdGlvbnM+KCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0TW9kZSA9IHJlc29sdmVPdXRwdXRNb2RlKGVudiwgb3V0cHV0KTtcbiAgICAgICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICAgICAgYXdhaXQgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+XG4gICAgICAgICAgICAgIHBhcnNlQWRkRW52aXJvbm1lbnRDb21tYW5kT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoY2F1c2UpID0+XG4gICAgICAgICAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IGNhdXNlXG4gICAgICAgICAgICAgICAgOiBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgYWRkIGVudmlyb25tZW50IGNvbW1hbmQgb3B0aW9uc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLmFuZFRoZW4oKGFkZEVudmlyb25tZW50T3B0aW9ucykgPT5cbiAgICAgICAgICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyhhZGRFbnZpcm9ubWVudE9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBjYXVzZVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgYWRkIGVudmlyb25tZW50IGluaXRpYWwgYW5zd2Vyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKS5hbmRUaGVuKChpbml0aWFsQW5zd2VycykgPT5cbiAgICAgICAgICAgICAgICByZXF1aXJlR2l0SHViQXV0aCgpLmFuZFRoZW4oXG4gICAgICAgICAgICAgICAgICAoeyBhdXRob3JpemF0aW9uU2VydmljZSwgZ2l0SHViU2VydmljZSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICBhZGRFbnZpcm9ubWVudEFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQW5zd2VycyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICByZXBvcnRTdW1tYXJ5KHByZXNlbnRlciwgb3V0cHV0TW9kZSksXG4gICAgICAgICAgICAgIHJlcG9ydENvbW1hbmRFcnJvcih0aGlzLCBwcmVzZW50ZXIsIG91dHB1dE1vZGUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgKTtcbiJdfQ==