@pipeline-builder/pipeline-manager 4.5.2 → 4.5.4

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 (74) hide show
  1. package/README.md +62 -37
  2. package/dist/agent/post-steps.d.ts +5 -4
  3. package/dist/agent/post-steps.d.ts.map +1 -1
  4. package/dist/agent/post-steps.js +19 -7
  5. package/dist/agent/targets.d.ts +12 -2
  6. package/dist/agent/targets.d.ts.map +1 -1
  7. package/dist/agent/targets.js +20 -4
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +16 -7
  10. package/dist/commands/audit-stacks.d.ts +42 -1
  11. package/dist/commands/audit-stacks.d.ts.map +1 -1
  12. package/dist/commands/audit-stacks.js +104 -23
  13. package/dist/commands/audit-tokens.d.ts.map +1 -1
  14. package/dist/commands/audit-tokens.js +3 -4
  15. package/dist/commands/create-pat.d.ts.map +1 -1
  16. package/dist/commands/create-pat.js +9 -6
  17. package/dist/commands/deploy.d.ts.map +1 -1
  18. package/dist/commands/deploy.js +15 -2
  19. package/dist/commands/login.d.ts +3 -2
  20. package/dist/commands/login.d.ts.map +1 -1
  21. package/dist/commands/login.js +19 -10
  22. package/dist/commands/logout.d.ts +24 -0
  23. package/dist/commands/logout.d.ts.map +1 -0
  24. package/dist/commands/logout.js +105 -0
  25. package/dist/commands/new-plugin.js +5 -5
  26. package/dist/commands/org-export.js +2 -2
  27. package/dist/commands/pipeline-remove.d.ts +26 -0
  28. package/dist/commands/pipeline-remove.d.ts.map +1 -0
  29. package/dist/commands/pipeline-remove.js +84 -0
  30. package/dist/commands/provision-steps.d.ts.map +1 -1
  31. package/dist/commands/provision-steps.js +1 -2
  32. package/dist/commands/provision.d.ts.map +1 -1
  33. package/dist/commands/provision.js +6 -5
  34. package/dist/commands/register.d.ts.map +1 -1
  35. package/dist/commands/register.js +3 -4
  36. package/dist/commands/status.d.ts +5 -2
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +65 -25
  39. package/dist/commands/toolchain.d.ts +21 -0
  40. package/dist/commands/toolchain.d.ts.map +1 -0
  41. package/dist/commands/toolchain.js +70 -0
  42. package/dist/commands/validate-templates.d.ts.map +1 -1
  43. package/dist/commands/validate-templates.js +4 -5
  44. package/dist/config/cli.constants.d.ts +8 -0
  45. package/dist/config/cli.constants.d.ts.map +1 -1
  46. package/dist/config/cli.constants.js +21 -2
  47. package/dist/types/plugin.d.ts +0 -6
  48. package/dist/types/plugin.d.ts.map +1 -1
  49. package/dist/types/plugin.js +1 -1
  50. package/dist/utils/command-utils.d.ts +13 -0
  51. package/dist/utils/command-utils.d.ts.map +1 -1
  52. package/dist/utils/command-utils.js +31 -17
  53. package/dist/utils/config-loader.d.ts +2 -1
  54. package/dist/utils/config-loader.d.ts.map +1 -1
  55. package/dist/utils/config-loader.js +14 -4
  56. package/dist/utils/credential-store.d.ts +9 -1
  57. package/dist/utils/credential-store.d.ts.map +1 -1
  58. package/dist/utils/credential-store.js +21 -2
  59. package/dist/utils/error-handler.d.ts +10 -1
  60. package/dist/utils/error-handler.d.ts.map +1 -1
  61. package/dist/utils/error-handler.js +20 -8
  62. package/dist/utils/pipeline-config.d.ts +5 -2
  63. package/dist/utils/pipeline-config.d.ts.map +1 -1
  64. package/dist/utils/pipeline-config.js +12 -3
  65. package/dist/utils/plugin-resolver.d.ts +21 -6
  66. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  67. package/dist/utils/plugin-resolver.js +42 -9
  68. package/dist/utils/response-utils.d.ts +11 -0
  69. package/dist/utils/response-utils.d.ts.map +1 -1
  70. package/dist/utils/response-utils.js +23 -1
  71. package/dist/utils/toolchain.d.ts +78 -0
  72. package/dist/utils/toolchain.d.ts.map +1 -0
  73. package/dist/utils/toolchain.js +195 -0
  74. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"audit-stacks.d.ts","sources":["../../src/commands/audit-stacks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJlD"}
1
+ {"version":3,"file":"audit-stacks.d.ts","sources":["../../src/commands/audit-stacks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EACvF,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmMlD"}
@@ -2,14 +2,44 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation';
4
4
  import { Command } from 'commander';
5
+ import { decodeTokenPayload } from '../utils/auth-guard.js';
5
6
  import { applyAwsProfile, resolveAwsRegion } from '../utils/aws-env.js';
6
7
  import { createAuthenticatedClientAsync, printCommandHeader, printSslWarning, withProfileOption, withRegionOption, withSslOptions } from '../utils/command-utils.js';
7
- import { ERROR_CODES, handleError } from '../utils/error-handler.js';
8
+ import { ERROR_CODES, reportError, ValidationError } from '../utils/error-handler.js';
8
9
  import { printError, printInfo, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
10
+ import { extractListPage } from '../utils/response-utils.js';
9
11
  const ACTIVE_STATUSES = [
10
12
  'CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE',
11
13
  'IMPORT_COMPLETE', 'IMPORT_ROLLBACK_COMPLETE',
12
14
  ];
15
+ /** Registry rows fetched per request (the route caps `limit` at MAX_PAGE_LIMIT, 1000 by default). */
16
+ export const REGISTRY_PAGE_LIMIT = 500;
17
+ /** Default backstop on CloudFormation DescribeStacks pages (~100 stacks per page). */
18
+ const DEFAULT_MAX_STACK_PAGES = 200;
19
+ /**
20
+ * Read EVERY registry row the platform returns for this caller (`limit` +
21
+ * `offset` paging until `pagination.hasMore` is false). A partial registry is
22
+ * as bad as an empty one: each row left unread becomes a false orphaned-stack
23
+ * finding. `orgId` is sent when `--org` names an org — the platform scopes the
24
+ * list to the caller's org unless it honours that parameter (a system-org
25
+ * caller), and the caller checks which org it got back.
26
+ */
27
+ export async function fetchAllRegistryEntries(client, pipelineUrl, orgId) {
28
+ const entries = [];
29
+ for (let offset = 0;; offset += REGISTRY_PAGE_LIMIT) {
30
+ const res = await client.get(`${pipelineUrl}/registry`, {
31
+ limit: REGISTRY_PAGE_LIMIT,
32
+ offset,
33
+ ...(orgId ? { orgId } : {}),
34
+ });
35
+ const page = extractListPage(res, 'registry');
36
+ entries.push(...page.items);
37
+ // An empty page ends the walk even if the server claims more, so a
38
+ // misreporting server can't spin this forever.
39
+ if (!page.hasMore || page.items.length === 0)
40
+ return entries;
41
+ }
42
+ }
13
43
  /**
14
44
  * Registers the `audit-stacks` command with the CLI program.
15
45
  *
@@ -20,6 +50,13 @@ const ACTIVE_STATUSES = [
20
50
  * - **Missing stacks**: registry entries pointing to stacks that no longer exist
21
51
  * in CloudFormation (likely after a manual `aws cloudformation delete-stack`).
22
52
  *
53
+ * Scope: the registry of ONE org (yours, or `--org` when the platform lets the
54
+ * credential list that org) against the stacks of ONE region (`--region`) —
55
+ * registry rows of other regions are counted but not compared, and stacks
56
+ * tagged with another `OrgId` are skipped. Every finding carries the command
57
+ * that reconciles it (`pipeline deregister` for a missing stack; `pipeline
58
+ * register` or `aws cloudformation delete-stack` for an orphaned one).
59
+ *
23
60
  * Designed for cron use:
24
61
  * - Exits 0 when there are no findings.
25
62
  * - Exits 1 when at least one orphaned or missing stack is found.
@@ -28,14 +65,15 @@ const ACTIVE_STATUSES = [
28
65
  * @example
29
66
  * ```bash
30
67
  * pipeline-manager audit stacks --region us-east-1
31
- * pipeline-manager audit stacks --org acme --json
68
+ * pipeline-manager audit stacks --region eu-west-1 --json
32
69
  * ```
33
70
  */
34
71
  export function auditStacks(program) {
35
72
  withSslOptions(withProfileOption(withRegionOption(program
36
73
  .command('stacks')
37
74
  .description('Diff CloudFormation stacks vs pipeline_registry to find orphaned or missing CDK deployments')))
38
- .option('--org <orgId>', 'Filter both registry and stack scan to a single org')
75
+ .option('--org <orgId>', 'Audit this org (default: your own). Another org needs a credential the platform lets list it')
76
+ .option('--max-pages <n>', 'Safety cap on CloudFormation DescribeStacks pages (~100 stacks each)', String(DEFAULT_MAX_STACK_PAGES))
39
77
  .option('--json', 'Output results as JSON', false))
40
78
  .action(async (options) => {
41
79
  const executionId = printCommandHeader('Audit Stacks', undefined, { quiet: options.json });
@@ -45,16 +83,47 @@ export function auditStacks(program) {
45
83
  // scan always hit the default account and could diff the registry against
46
84
  // the WRONG account's stacks → bogus orphaned/missing findings).
47
85
  applyAwsProfile(options.profile);
86
+ const maxPages = Number.parseInt(String(options.maxPages), 10);
87
+ // Org ids are lowercase (the route lowercases `?orgId=` the same way).
88
+ const requestedOrg = typeof options.org === 'string' && options.org.trim()
89
+ ? options.org.trim().toLowerCase()
90
+ : undefined;
91
+ // Decided inside the try, exited on outside it: an exit inside would be
92
+ // caught as a scan failure wherever process.exit throws (tests, embedders).
93
+ let exitCode;
48
94
  try {
95
+ if (!Number.isInteger(maxPages) || maxPages < 1) {
96
+ throw new ValidationError('--max-pages must be a positive integer', 'max-pages', String(options.maxPages));
97
+ }
49
98
  // Fetch the platform's view of registered pipelines.
50
99
  // Progress goes to stdout, so suppress it in --json mode to keep the JSON payload clean for piping.
51
100
  if (!options.json)
52
- printInfo('Fetching pipeline registry from platform', { org: options.org ?? '(all)' });
101
+ printInfo('Fetching pipeline registry from platform', { org: options.org ?? '(your org)' });
53
102
  const client = await createAuthenticatedClientAsync(options);
54
- const registryRes = await client.get(`/api/pipelines/registry${options.org ? `?orgId=${encodeURIComponent(options.org)}` : ''}`);
55
- const entries = registryRes?.entries
56
- ?? registryRes?.data?.entries
57
- ?? [];
103
+ const allEntries = await fetchAllRegistryEntries(client, client.getConfig().api.pipelineUrl, requestedOrg);
104
+ // Which org this audit is about. `--org` is a request; the rows say what
105
+ // the platform actually answered for. A platform that scoped the list to
106
+ // the caller's own org instead would make every stack of the requested
107
+ // org read as orphaned — so a mismatch is an error, not a finding.
108
+ const answeredFor = new Set(allEntries.map((e) => e.orgId).filter((o) => !!o));
109
+ if (requestedOrg && [...answeredFor].some((o) => o !== requestedOrg)) {
110
+ throw new ValidationError(`The platform returned the registry of ${[...answeredFor].join(', ')}, not --org ${requestedOrg}. `
111
+ + 'Auditing another org needs a credential the platform lets list that org\'s registry.', 'org', requestedOrg);
112
+ }
113
+ const auditOrg = requestedOrg
114
+ ?? (answeredFor.size === 1 ? [...answeredFor][0] : undefined)
115
+ ?? decodeTokenPayload(process.env.PLATFORM_TOKEN ?? '')?.organizationId;
116
+ // The scan below covers ONE region, so only that region's rows can be
117
+ // compared — every other region's pipeline would otherwise be "missing".
118
+ // A row with no region can't be placed, so it is counted and left out.
119
+ const entries = allEntries.filter((e) => e.region === region);
120
+ const withoutRegion = allEntries.filter((e) => !e.region).length;
121
+ if (withoutRegion > 0 && !options.json) {
122
+ printWarning(`${withoutRegion} registry entr${withoutRegion === 1 ? 'y has' : 'ies have'} no region and ${withoutRegion === 1 ? 'is' : 'are'} not compared — re-register with "pipeline-manager pipeline register --id <pipelineId> --region <region>"`);
123
+ }
124
+ if (!auditOrg && !options.json) {
125
+ printWarning('Could not tell which org this credential belongs to — stacks of every org in the account are compared');
126
+ }
58
127
  // Fetch stacks from CloudFormation. DescribeStacks (no StackName) returns every
59
128
  // active stack WITH its tags in one paginated sweep — avoiding the N+1
60
129
  // DescribeStacks-per-stack a ListStacks path needs (ListStacks omits tags)
@@ -70,7 +139,6 @@ export function auditStacks(program) {
70
139
  // matters: truncating would diff the registry against an incomplete stack set and
71
140
  // report live stacks as `missing-stack`. So if this is ever hit, warn LOUDLY rather
72
141
  // than silently under-reporting (the previous code capped at 20 pages silently).
73
- const MAX_PAGES = 200;
74
142
  let truncated = false;
75
143
  do {
76
144
  const resp = await cfn.send(new DescribeStacksCommand({ NextToken: nextToken }));
@@ -81,29 +149,31 @@ export function auditStacks(program) {
81
149
  continue; // skip in-progress/rolled-back/deleted
82
150
  const tags = stack.Tags ?? [];
83
151
  const pbTag = tags.find((t) => t.Key === 'pipeline-builder')?.Value;
84
- const orgTag = tags.find((t) => t.Key === 'OrgId' || t.Key === 'orgId')?.Value;
152
+ const orgTag = tags.find((t) => t.Key === 'OrgId')?.Value;
85
153
  if (!pbTag)
86
154
  continue; // Not a pipeline-builder stack.
87
- if (options.org && orgTag && orgTag !== options.org)
88
- continue; // Wrong org filter.
155
+ // Another org's stack in the same account is not this org's drift.
156
+ if (auditOrg && orgTag && orgTag.toLowerCase() !== auditOrg.toLowerCase())
157
+ continue;
89
158
  stacks.push({
90
159
  stackName: stack.StackName,
91
160
  stackStatus: stack.StackStatus ?? 'UNKNOWN',
92
161
  region,
93
162
  pipelineBuilderTag: pbTag,
94
163
  orgIdTag: orgTag,
164
+ pipelineIdTag: tags.find((t) => t.Key === 'pb.pipeline-id')?.Value,
95
165
  creationTime: stack.CreationTime,
96
166
  });
97
167
  }
98
168
  nextToken = resp.NextToken;
99
169
  pages++;
100
- if (nextToken && pages >= MAX_PAGES) {
170
+ if (nextToken && pages >= maxPages) {
101
171
  truncated = true;
102
172
  break;
103
173
  }
104
174
  } while (nextToken);
105
175
  if (truncated) {
106
- printWarning(`Stack scan hit the ${MAX_PAGES}-page safety cap — results may be INCOMPLETE and 'missing-stack' findings could be false. Narrow by --region/--org, or raise MAX_PAGES.`);
176
+ printWarning(`Stack scan hit the ${maxPages}-page safety cap — results may be INCOMPLETE and 'missing-stack' findings could be false. Raise --max-pages.`);
107
177
  }
108
178
  // Diff.
109
179
  const registryStackNames = new Set(entries.map((e) => e.stackName).filter((n) => !!n));
@@ -114,7 +184,12 @@ export function auditStacks(program) {
114
184
  findings.push({
115
185
  type: 'orphaned-stack',
116
186
  stackName: stack.stackName,
187
+ ...(stack.pipelineIdTag ? { pipelineId: stack.pipelineIdTag } : {}),
117
188
  detail: `CloudFormation stack tagged pipeline-builder=${stack.pipelineBuilderTag ?? '(unset)'} has no matching pipeline_registry entry`,
189
+ // Still wanted → register it; a leftover → delete the stack.
190
+ fix: stack.pipelineIdTag
191
+ ? `pipeline-manager pipeline register --id ${stack.pipelineIdTag} --region ${region} # or, if unwanted: aws cloudformation delete-stack --stack-name ${stack.stackName} --region ${region}`
192
+ : `aws cloudformation delete-stack --stack-name ${stack.stackName} --region ${region}`,
118
193
  });
119
194
  }
120
195
  }
@@ -125,20 +200,24 @@ export function auditStacks(program) {
125
200
  stackName: entry.stackName,
126
201
  pipelineId: entry.pipelineId,
127
202
  pipelineName: entry.pipelineName,
128
- detail: `Registry entry references stack ${entry.stackName} but no such stack exists in CloudFormation`,
203
+ registryId: entry.id,
204
+ detail: `Registry entry references stack ${entry.stackName} but no such stack exists in CloudFormation (${region})`,
205
+ fix: `pipeline-manager pipeline deregister --id ${entry.id}`,
129
206
  });
130
207
  }
131
208
  }
132
209
  // A truncated (incomplete) scan is a finding in itself: it can both miss
133
210
  // real drift AND emit false missing-stack findings, so it must exit
134
211
  // non-zero and be visible in the JSON (mirrors audit-tokens).
135
- const exitCode = (findings.length > 0 || truncated) ? 1 : 0;
212
+ exitCode = (findings.length > 0 || truncated) ? 1 : 0;
136
213
  if (options.json) {
137
214
  console.log(JSON.stringify({
138
215
  scannedAt: new Date().toISOString(),
139
216
  region,
140
- orgFilter: options.org,
217
+ org: auditOrg,
141
218
  registryEntries: entries.length,
219
+ registryEntriesOtherRegions: allEntries.length - entries.length - withoutRegion,
220
+ registryEntriesWithoutRegion: withoutRegion,
142
221
  cfnStacks: stacks.length,
143
222
  truncated,
144
223
  findings,
@@ -148,7 +227,9 @@ export function auditStacks(program) {
148
227
  else {
149
228
  printSection('Audit Results');
150
229
  printInfo('Counts', {
230
+ region,
151
231
  registryEntries: String(entries.length),
232
+ registryEntriesOtherRegions: String(allEntries.length - entries.length - withoutRegion),
152
233
  cfnStacks: String(stacks.length),
153
234
  findings: String(findings.length),
154
235
  });
@@ -163,20 +244,20 @@ export function auditStacks(program) {
163
244
  else {
164
245
  printWarning(`MISSING ${f.stackName} (pipeline ${f.pipelineId ?? '?'}) — ${f.detail}`);
165
246
  }
247
+ console.log(` fix: ${f.fix}`);
166
248
  }
167
- printError(`${findings.length} drift finding${findings.length === 1 ? '' : 's'}. Review and reconcile manually.`);
249
+ printError(`${findings.length} drift finding${findings.length === 1 ? '' : 's'} — each is listed with the command that reconciles it.`);
168
250
  }
169
251
  }
170
- process.exit(exitCode);
171
252
  }
172
253
  catch (error) {
173
- handleError(error, ERROR_CODES.API_REQUEST, {
254
+ reportError(error, ERROR_CODES.API_REQUEST, {
174
255
  debug: program.opts().debug,
175
- exit: false,
176
256
  context: { command: 'audit-stacks', executionId },
177
257
  });
178
- process.exit(2);
258
+ exitCode = 2;
179
259
  }
260
+ process.exit(exitCode);
180
261
  });
181
262
  }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3RhY2tzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaXQtc3RhY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNySyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUEyQjNHLE1BQU0sZUFBZSxHQUFHO0lBQ3RCLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLDBCQUEwQjtJQUNoRSxpQkFBaUIsRUFBRSwwQkFBMEI7Q0FDOUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsT0FBZ0I7SUFDMUMsY0FBYyxDQUNaLGlCQUFpQixDQUNmLGdCQUFnQixDQUFDLE9BQU87U0FDckIsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsNkZBQTZGLENBQUMsQ0FBQyxDQUMvRztTQUNFLE1BQU0sQ0FBQyxlQUFlLEVBQUUscURBQXFELENBQUM7U0FDOUUsTUFBTSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FDckQ7U0FDRSxNQUFNLENBQUMsS0FB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QUFDO29CQUNILENBQUM7b0JBQ0QsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0saUJBQWlCLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0NBQWtDLENBQUMsQ0FBQztnQkFDcEgsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO2FBQ2xELENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgRGVzY3JpYmVTdGFja3NDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYXBwbHlBd3NQcm9maWxlLCByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMsIHByaW50Q29tbWFuZEhlYWRlciwgcHJpbnRTc2xXYXJuaW5nLCB3aXRoUHJvZmlsZU9wdGlvbiwgd2l0aFJlZ2lvbk9wdGlvbiwgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciwgcHJpbnRJbmZvLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcblxuaW50ZXJmYWNlIFJlZ2lzdHJ5RW50cnkge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lQXJuOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nO1xuICBzdGFja05hbWU/OiBzdHJpbmc7XG4gIHJlZ2lvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0YWNrSW5mbyB7XG4gIHN0YWNrTmFtZTogc3RyaW5nO1xuICBzdGFja1N0YXR1czogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcGlwZWxpbmVCdWlsZGVyVGFnPzogc3RyaW5nO1xuICBvcmdJZFRhZz86IHN0cmluZztcbiAgY3JlYXRpb25UaW1lPzogRGF0ZTtcbn1cblxuaW50ZXJmYWNlIEF1ZGl0RmluZGluZyB7XG4gIHR5cGU6ICdvcnBoYW5lZC1zdGFjaycgfCAnbWlzc2luZy1zdGFjayc7XG4gIHN0YWNrTmFtZT86IHN0cmluZztcbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuICBkZXRhaWw6IHN0cmluZztcbn1cblxuY29uc3QgQUNUSVZFX1NUQVRVU0VTID0gW1xuICAnQ1JFQVRFX0NPTVBMRVRFJywgJ1VQREFURV9DT01QTEVURScsICdVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAnSU1QT1JUX0NPTVBMRVRFJywgJ0lNUE9SVF9ST0xMQkFDS19DT01QTEVURScsXG5dO1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYGF1ZGl0LXN0YWNrc2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBEaWZmcyBDbG91ZEZvcm1hdGlvbiBzdGFja3MgKGZpbHRlcmVkIHRvIHRob3NlIHRhZ2dlZCB3aXRoIGBwaXBlbGluZS1idWlsZGVyYClcbiAqIGFnYWluc3QgdGhlIHBsYXRmb3JtJ3MgYHBpcGVsaW5lX3JlZ2lzdHJ5YCB0YWJsZS4gU3VyZmFjZXM6XG4gKiAgIC0gKipPcnBoYW5lZCBzdGFja3MqKjogdGFnZ2VkIHN0YWNrcyB3aXRoIG5vIERCIHJlY29yZCAobGlrZWx5IGxlZnRvdmVycyBhZnRlclxuICogICAgIGEgcGlwZWxpbmUgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgZGFzaGJvYXJkIGJ1dCB0aGUgQ0RLIHN0YWNrIHN0YXllZCBpbiBBV1MpLlxuICogICAtICoqTWlzc2luZyBzdGFja3MqKjogcmVnaXN0cnkgZW50cmllcyBwb2ludGluZyB0byBzdGFja3MgdGhhdCBubyBsb25nZXIgZXhpc3RcbiAqICAgICBpbiBDbG91ZEZvcm1hdGlvbiAobGlrZWx5IGFmdGVyIGEgbWFudWFsIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrYCkuXG4gKlxuICogRGVzaWduZWQgZm9yIGNyb24gdXNlOlxuICogICAtIEV4aXRzIDAgd2hlbiB0aGVyZSBhcmUgbm8gZmluZGluZ3MuXG4gKiAgIC0gRXhpdHMgMSB3aGVuIGF0IGxlYXN0IG9uZSBvcnBoYW5lZCBvciBtaXNzaW5nIHN0YWNrIGlzIGZvdW5kLlxuICogICAtIEV4aXRzIDIgb24gQVdTIGVycm9ycyAvIHNjYW4gZmFpbHVyZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgYXVkaXQgc3RhY2tzIC0tcmVnaW9uIHVzLWVhc3QtMVxuICogcGlwZWxpbmUtbWFuYWdlciBhdWRpdCBzdGFja3MgLS1vcmcgYWNtZSAtLWpzb25cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXVkaXRTdGFja3MocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RhY2tzJylcbiAgICAgICAgLmRlc2NyaXB0aW9uKCdEaWZmIENsb3VkRm9ybWF0aW9uIHN0YWNrcyB2cyBwaXBlbGluZV9yZWdpc3RyeSB0byBmaW5kIG9ycGhhbmVkIG9yIG1pc3NpbmcgQ0RLIGRlcGxveW1lbnRzJykpLFxuICAgIClcbiAgICAgIC5vcHRpb24oJy0tb3JnIDxvcmdJZD4nLCAnRmlsdGVyIGJvdGggcmVnaXN0cnkgYW5kIHN0YWNrIHNjYW4gdG8gYSBzaW5nbGUgb3JnJylcbiAgICAgIC5vcHRpb24oJy0tanNvbicsICdPdXRwdXQgcmVzdWx0cyBhcyBKU09OJywgZmFsc2UpLFxuICApXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ0F1ZGl0IFN0YWNrcycsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcblxuICAgICAgY29uc3QgcmVnaW9uID0gcmVzb2x2ZUF3c1JlZ2lvbihvcHRpb25zLnJlZ2lvbik7XG4gICAgICAvLyBIb25vciAtLXByb2ZpbGUgZm9yIHRoZSBTREsgQ2xvdWRGb3JtYXRpb24gY2xpZW50IGJlbG93ICh3aXRob3V0IHRoaXMsIHRoZVxuICAgICAgLy8gc2NhbiBhbHdheXMgaGl0IHRoZSBkZWZhdWx0IGFjY291bnQgYW5kIGNvdWxkIGRpZmYgdGhlIHJlZ2lzdHJ5IGFnYWluc3RcbiAgICAgIC8vIHRoZSBXUk9ORyBhY2NvdW50J3Mgc3RhY2tzIOKGkiBib2d1cyBvcnBoYW5lZC9taXNzaW5nIGZpbmRpbmdzKS5cbiAgICAgIGFwcGx5QXdzUHJvZmlsZShvcHRpb25zLnByb2ZpbGUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBGZXRjaCB0aGUgcGxhdGZvcm0ncyB2aWV3IG9mIHJlZ2lzdGVyZWQgcGlwZWxpbmVzLlxuICAgICAgICAvLyBQcm9ncmVzcyBnb2VzIHRvIHN0ZG91dCwgc28gc3VwcHJlc3MgaXQgaW4gLS1qc29uIG1vZGUgdG8ga2VlcCB0aGUgSlNPTiBwYXlsb2FkIGNsZWFuIGZvciBwaXBpbmcuXG4gICAgICAgIGlmICghb3B0aW9ucy5qc29uKSBwcmludEluZm8oJ0ZldGNoaW5nIHBpcGVsaW5lIHJlZ2lzdHJ5IGZyb20gcGxhdGZvcm0nLCB7IG9yZzogb3B0aW9ucy5vcmcgPz8gJyhhbGwpJyB9KTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWdpc3RyeVJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gfT4oXG4gICAgICAgICAgYC9hcGkvcGlwZWxpbmVzL3JlZ2lzdHJ5JHtvcHRpb25zLm9yZyA/IGA/b3JnSWQ9JHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5vcmcpfWAgOiAnJ31gLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSAocmVnaXN0cnlSZXMgYXMgeyBlbnRyaWVzPzogUmVnaXN0cnlFbnRyeVtdIH0pPy5lbnRyaWVzXG4gICAgICAgICAgPz8gKHJlZ2lzdHJ5UmVzIGFzIHsgZGF0YT86IHsgZW50cmllcz86IFJlZ2lzdHJ5RW50cnlbXSB9IH0pPy5kYXRhPy5lbnRyaWVzXG4gICAgICAgICAgPz8gW107XG5cbiAgICAgICAgLy8gRmV0Y2ggc3RhY2tzIGZyb20gQ2xvdWRGb3JtYXRpb24uIERlc2NyaWJlU3RhY2tzIChubyBTdGFja05hbWUpIHJldHVybnMgZXZlcnlcbiAgICAgICAgLy8gYWN0aXZlIHN0YWNrIFdJVEggaXRzIHRhZ3MgaW4gb25lIHBhZ2luYXRlZCBzd2VlcCDigJQgYXZvaWRpbmcgdGhlIE4rMVxuICAgICAgICAvLyBEZXNjcmliZVN0YWNrcy1wZXItc3RhY2sgYSBMaXN0U3RhY2tzIHBhdGggbmVlZHMgKExpc3RTdGFja3Mgb21pdHMgdGFncylcbiAgICAgICAgLy8gYW5kIHRoZSBBUEkgdGhyb3R0bGluZyB0aGF0IGNhdXNlcyBvbiBhY2NvdW50cyB3aXRoIG1hbnkgc3RhY2tzLlxuICAgICAgICBpZiAoIW9wdGlvbnMuanNvbikgcHJpbnRJbmZvKCdMaXN0aW5nIENsb3VkRm9ybWF0aW9uIHN0YWNrcycsIHsgcmVnaW9uIH0pO1xuICAgICAgICBjb25zdCBjZm4gPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7XG4gICAgICAgIGNvbnN0IHN0YWNrczogU3RhY2tJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3QgYWN0aXZlU3RhdHVzZXMgPSBuZXcgU2V0KEFDVElWRV9TVEFUVVNFUyk7XG4gICAgICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHBhZ2VzID0gMDtcbiAgICAgICAgLy8gQmFja3N0b3Agb25seSAofjIwayBzdGFja3MgYXQgfjEwMC9wYWdlKSwgbm90IGFuIGV4cGVjdGVkIGxpbWl0LiBBIEZVTEwgc2NhblxuICAgICAgICAvLyBtYXR0ZXJzOiB0cnVuY2F0aW5nIHdvdWxkIGRpZmYgdGhlIHJlZ2lzdHJ5IGFnYWluc3QgYW4gaW5jb21wbGV0ZSBzdGFjayBzZXQgYW5kXG4gICAgICAgIC8vIHJlcG9ydCBsaXZlIHN0YWNrcyBhcyBgbWlzc2luZy1zdGFja2AuIFNvIGlmIHRoaXMgaXMgZXZlciBoaXQsIHdhcm4gTE9VRExZIHJhdGhlclxuICAgICAgICAvLyB0aGFuIHNpbGVudGx5IHVuZGVyLXJlcG9ydGluZyAodGhlIHByZXZpb3VzIGNvZGUgY2FwcGVkIGF0IDIwIHBhZ2VzIHNpbGVudGx5KS5cbiAgICAgICAgY29uc3QgTUFYX1BBR0VTID0gMjAwO1xuICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgY2ZuLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7IE5leHRUb2tlbjogbmV4dFRva2VuIH0pKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHJlc3AuU3RhY2tzID8/IFtdKSB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrLlN0YWNrTmFtZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFjdGl2ZVN0YXR1c2VzLmhhcyhzdGFjay5TdGFja1N0YXR1cyA/PyAnJykpIGNvbnRpbnVlOyAvLyBza2lwIGluLXByb2dyZXNzL3JvbGxlZC1iYWNrL2RlbGV0ZWRcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBzdGFjay5UYWdzID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgcGJUYWcgPSB0YWdzLmZpbmQoKHQpID0+IHQuS2V5ID09PSAncGlwZWxpbmUtYnVpbGRlcicpPy5WYWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IG9yZ1RhZyA9IHRhZ3MuZmluZCgodCkgPT4gdC5LZXkgPT09ICdPcmdJZCcgfHwgdC5LZXkgPT09ICdvcmdJZCcpPy5WYWx1ZTtcbiAgICAgICAgICAgIGlmICghcGJUYWcpIGNvbnRpbnVlOyAvLyBOb3QgYSBwaXBlbGluZS1idWlsZGVyIHN0YWNrLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMub3JnICYmIG9yZ1RhZyAmJiBvcmdUYWcgIT09IG9wdGlvbnMub3JnKSBjb250aW51ZTsgLy8gV3Jvbmcgb3JnIGZpbHRlci5cbiAgICAgICAgICAgIHN0YWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5TdGFja05hbWUsXG4gICAgICAgICAgICAgIHN0YWNrU3RhdHVzOiBzdGFjay5TdGFja1N0YXR1cyA/PyAnVU5LTk9XTicsXG4gICAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgICAgcGlwZWxpbmVCdWlsZGVyVGFnOiBwYlRhZyxcbiAgICAgICAgICAgICAgb3JnSWRUYWc6IG9yZ1RhZyxcbiAgICAgICAgICAgICAgY3JlYXRpb25UaW1lOiBzdGFjay5DcmVhdGlvblRpbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFRva2VuID0gcmVzcC5OZXh0VG9rZW47XG4gICAgICAgICAgcGFnZXMrKztcbiAgICAgICAgICBpZiAobmV4dFRva2VuICYmIHBhZ2VzID49IE1BWF9QQUdFUykgeyB0cnVuY2F0ZWQgPSB0cnVlOyBicmVhazsgfVxuICAgICAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICAgICAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKGBTdGFjayBzY2FuIGhpdCB0aGUgJHtNQVhfUEFHRVN9LXBhZ2Ugc2FmZXR5IGNhcCDigJQgcmVzdWx0cyBtYXkgYmUgSU5DT01QTEVURSBhbmQgJ21pc3Npbmctc3RhY2snIGZpbmRpbmdzIGNvdWxkIGJlIGZhbHNlLiBOYXJyb3cgYnkgLS1yZWdpb24vLS1vcmcsIG9yIHJhaXNlIE1BWF9QQUdFUy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpZmYuXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5U3RhY2tOYW1lcyA9IG5ldyBTZXQoZW50cmllcy5tYXAoKGUpID0+IGUuc3RhY2tOYW1lKS5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiAhIW4pKTtcbiAgICAgICAgY29uc3QgY2ZuU3RhY2tOYW1lcyA9IG5ldyBTZXQoc3RhY2tzLm1hcCgocykgPT4gcy5zdGFja05hbWUpKTtcblxuICAgICAgICBjb25zdCBmaW5kaW5nczogQXVkaXRGaW5kaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgICAgICBpZiAoIXJlZ2lzdHJ5U3RhY2tOYW1lcy5oYXMoc3RhY2suc3RhY2tOYW1lKSkge1xuICAgICAgICAgICAgZmluZGluZ3MucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdvcnBoYW5lZC1zdGFjaycsXG4gICAgICAgICAgICAgIHN0YWNrTmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgICBkZXRhaWw6IGBDbG91ZEZvcm1hdGlvbiBzdGFjayB0YWdnZWQgcGlwZWxpbmUtYnVpbGRlcj0ke3N0YWNrLnBpcGVsaW5lQnVpbGRlclRhZyA/PyAnKHVuc2V0KSd9IGhhcyBubyBtYXRjaGluZyBwaXBlbGluZV9yZWdpc3RyeSBlbnRyeWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnN0YWNrTmFtZSAmJiAhY2ZuU3RhY2tOYW1lcy5oYXMoZW50cnkuc3RhY2tOYW1lKSkge1xuICAgICAgICAgICAgZmluZGluZ3MucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdtaXNzaW5nLXN0YWNrJyxcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBlbnRyeS5zdGFja05hbWUsXG4gICAgICAgICAgICAgIHBpcGVsaW5lSWQ6IGVudHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgICAgIHBpcGVsaW5lTmFtZTogZW50cnkucGlwZWxpbmVOYW1lLFxuICAgICAgICAgICAgICBkZXRhaWw6IGBSZWdpc3RyeSBlbnRyeSByZWZlcmVuY2VzIHN0YWNrICR7ZW50cnkuc3RhY2tOYW1lfSBidXQgbm8gc3VjaCBzdGFjayBleGlzdHMgaW4gQ2xvdWRGb3JtYXRpb25gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB0cnVuY2F0ZWQgKGluY29tcGxldGUpIHNjYW4gaXMgYSBmaW5kaW5nIGluIGl0c2VsZjogaXQgY2FuIGJvdGggbWlzc1xuICAgICAgICAvLyByZWFsIGRyaWZ0IEFORCBlbWl0IGZhbHNlIG1pc3Npbmctc3RhY2sgZmluZGluZ3MsIHNvIGl0IG11c3QgZXhpdFxuICAgICAgICAvLyBub24temVybyBhbmQgYmUgdmlzaWJsZSBpbiB0aGUgSlNPTiAobWlycm9ycyBhdWRpdC10b2tlbnMpLlxuICAgICAgICBjb25zdCBleGl0Q29kZSA9IChmaW5kaW5ncy5sZW5ndGggPiAwIHx8IHRydW5jYXRlZCkgPyAxIDogMDtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2Nhbm5lZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBvcmdGaWx0ZXI6IG9wdGlvbnMub3JnLFxuICAgICAgICAgICAgcmVnaXN0cnlFbnRyaWVzOiBlbnRyaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGNmblN0YWNrczogc3RhY2tzLmxlbmd0aCxcbiAgICAgICAgICAgIHRydW5jYXRlZCxcbiAgICAgICAgICAgIGZpbmRpbmdzLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50U2VjdGlvbignQXVkaXQgUmVzdWx0cycpO1xuICAgICAgICAgIHByaW50SW5mbygnQ291bnRzJywge1xuICAgICAgICAgICAgcmVnaXN0cnlFbnRyaWVzOiBTdHJpbmcoZW50cmllcy5sZW5ndGgpLFxuICAgICAgICAgICAgY2ZuU3RhY2tzOiBTdHJpbmcoc3RhY2tzLmxlbmd0aCksXG4gICAgICAgICAgICBmaW5kaW5nczogU3RyaW5nKGZpbmRpbmdzLmxlbmd0aCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcHJpbnRTdWNjZXNzKCdObyBkcmlmdCBiZXR3ZWVuIHBpcGVsaW5lX3JlZ2lzdHJ5IGFuZCBDbG91ZEZvcm1hdGlvbicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgaWYgKGYudHlwZSA9PT0gJ29ycGhhbmVkLXN0YWNrJykge1xuICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhgT1JQSEFORUQgICR7Zi5zdGFja05hbWV9IOKAlCAke2YuZGV0YWlsfWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhgTUlTU0lORyAgICR7Zi5zdGFja05hbWV9IChwaXBlbGluZSAke2YucGlwZWxpbmVJZCA/PyAnPyd9KSDigJQgJHtmLmRldGFpbH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpbnRFcnJvcihgJHtmaW5kaW5ncy5sZW5ndGh9IGRyaWZ0IGZpbmRpbmcke2ZpbmRpbmdzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfS4gUmV2aWV3IGFuZCByZWNvbmNpbGUgbWFudWFsbHkuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnYXVkaXQtc3RhY2tzJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3RhY2tzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaXQtc3RhY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNySyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQW1DN0QsTUFBTSxlQUFlLEdBQUc7SUFDdEIsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsMEJBQTBCO0lBQ2hFLGlCQUFpQixFQUFFLDBCQUEwQjtDQUM5QyxDQUFDO0FBRUYscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUV2QyxzRkFBc0Y7QUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLE1BQXVGLEVBQ3ZGLFdBQW1CLEVBQ25CLEtB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SUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgRGVzY3JpYmVTdGFja3NDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZGVjb2RlVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi4vdXRpbHMvYXV0aC1ndWFyZC5qcyc7XG5pbXBvcnQgeyBhcHBseUF3c1Byb2ZpbGUsIHJlc29sdmVBd3NSZWdpb24gfSBmcm9tICcuLi91dGlscy9hd3MtZW52LmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIHJlcG9ydEVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0TGlzdFBhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS11dGlscy5qcyc7XG5cbi8qKiBPbmUgYEdFVCAvYXBpL3BpcGVsaW5lcy9yZWdpc3RyeWAgcm93ICh0aGUgZmllbGRzIHRoaXMgYXVkaXQgcmVhZHMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeUVudHJ5IHtcbiAgLyoqIFJlZ2lzdHJ5IHJvdyBVVUlEIOKAlCB3aGF0IGBwaXBlbGluZSBkZXJlZ2lzdGVyIC0taWRgIHRha2VzLiAqL1xuICBpZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgc3RhY2tOYW1lPzogc3RyaW5nO1xuICByZWdpb24/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdGFja0luZm8ge1xuICBzdGFja05hbWU6IHN0cmluZztcbiAgc3RhY2tTdGF0dXM6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIHBpcGVsaW5lQnVpbGRlclRhZz86IHN0cmluZztcbiAgb3JnSWRUYWc/OiBzdHJpbmc7XG4gIHBpcGVsaW5lSWRUYWc/OiBzdHJpbmc7XG4gIGNyZWF0aW9uVGltZT86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRGaW5kaW5nIHtcbiAgdHlwZTogJ29ycGhhbmVkLXN0YWNrJyB8ICdtaXNzaW5nLXN0YWNrJztcbiAgc3RhY2tOYW1lPzogc3RyaW5nO1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBSZWdpc3RyeSByb3cgaWQgKG1pc3Npbmctc3RhY2sgb25seSkuICovXG4gIHJlZ2lzdHJ5SWQ/OiBzdHJpbmc7XG4gIGRldGFpbDogc3RyaW5nO1xuICAvKiogVGhlIGNvbW1hbmQgdGhhdCByZWNvbmNpbGVzIHRoaXMgZmluZGluZy4gKi9cbiAgZml4OiBzdHJpbmc7XG59XG5cbmNvbnN0IEFDVElWRV9TVEFUVVNFUyA9IFtcbiAgJ0NSRUFURV9DT01QTEVURScsICdVUERBVEVfQ09NUExFVEUnLCAnVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgJ0lNUE9SVF9DT01QTEVURScsICdJTVBPUlRfUk9MTEJBQ0tfQ09NUExFVEUnLFxuXTtcblxuLyoqIFJlZ2lzdHJ5IHJvd3MgZmV0Y2hlZCBwZXIgcmVxdWVzdCAodGhlIHJvdXRlIGNhcHMgYGxpbWl0YCBhdCBNQVhfUEFHRV9MSU1JVCwgMTAwMCBieSBkZWZhdWx0KS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9QQUdFX0xJTUlUID0gNTAwO1xuXG4vKiogRGVmYXVsdCBiYWNrc3RvcCBvbiBDbG91ZEZvcm1hdGlvbiBEZXNjcmliZVN0YWNrcyBwYWdlcyAofjEwMCBzdGFja3MgcGVyIHBhZ2UpLiAqL1xuY29uc3QgREVGQVVMVF9NQVhfU1RBQ0tfUEFHRVMgPSAyMDA7XG5cbi8qKlxuICogUmVhZCBFVkVSWSByZWdpc3RyeSByb3cgdGhlIHBsYXRmb3JtIHJldHVybnMgZm9yIHRoaXMgY2FsbGVyIChgbGltaXRgICtcbiAqIGBvZmZzZXRgIHBhZ2luZyB1bnRpbCBgcGFnaW5hdGlvbi5oYXNNb3JlYCBpcyBmYWxzZSkuIEEgcGFydGlhbCByZWdpc3RyeSBpc1xuICogYXMgYmFkIGFzIGFuIGVtcHR5IG9uZTogZWFjaCByb3cgbGVmdCB1bnJlYWQgYmVjb21lcyBhIGZhbHNlIG9ycGhhbmVkLXN0YWNrXG4gKiBmaW5kaW5nLiBgb3JnSWRgIGlzIHNlbnQgd2hlbiBgLS1vcmdgIG5hbWVzIGFuIG9yZyDigJQgdGhlIHBsYXRmb3JtIHNjb3BlcyB0aGVcbiAqIGxpc3QgdG8gdGhlIGNhbGxlcidzIG9yZyB1bmxlc3MgaXQgaG9ub3VycyB0aGF0IHBhcmFtZXRlciAoYSBzeXN0ZW0tb3JnXG4gKiBjYWxsZXIpLCBhbmQgdGhlIGNhbGxlciBjaGVja3Mgd2hpY2ggb3JnIGl0IGdvdCBiYWNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbGxSZWdpc3RyeUVudHJpZXMoXG4gIGNsaWVudDogeyBnZXQ8VCA9IHVua25vd24+KHVybDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8VD4gfSxcbiAgcGlwZWxpbmVVcmw6IHN0cmluZyxcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFJlZ2lzdHJ5RW50cnlbXT4ge1xuICBjb25zdCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSBbXTtcbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgOyBvZmZzZXQgKz0gUkVHSVNUUllfUEFHRV9MSU1JVCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQoYCR7cGlwZWxpbmVVcmx9L3JlZ2lzdHJ5YCwge1xuICAgICAgbGltaXQ6IFJFR0lTVFJZX1BBR0VfTElNSVQsXG4gICAgICBvZmZzZXQsXG4gICAgICAuLi4ob3JnSWQgPyB7IG9yZ0lkIH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgcGFnZSA9IGV4dHJhY3RMaXN0UGFnZTxSZWdpc3RyeUVudHJ5PihyZXMsICdyZWdpc3RyeScpO1xuICAgIGVudHJpZXMucHVzaCguLi5wYWdlLml0ZW1zKTtcbiAgICAvLyBBbiBlbXB0eSBwYWdlIGVuZHMgdGhlIHdhbGsgZXZlbiBpZiB0aGUgc2VydmVyIGNsYWltcyBtb3JlLCBzbyBhXG4gICAgLy8gbWlzcmVwb3J0aW5nIHNlcnZlciBjYW4ndCBzcGluIHRoaXMgZm9yZXZlci5cbiAgICBpZiAoIXBhZ2UuaGFzTW9yZSB8fCBwYWdlLml0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBhdWRpdC1zdGFja3NgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogRGlmZnMgQ2xvdWRGb3JtYXRpb24gc3RhY2tzIChmaWx0ZXJlZCB0byB0aG9zZSB0YWdnZWQgd2l0aCBgcGlwZWxpbmUtYnVpbGRlcmApXG4gKiBhZ2FpbnN0IHRoZSBwbGF0Zm9ybSdzIGBwaXBlbGluZV9yZWdpc3RyeWAgdGFibGUuIFN1cmZhY2VzOlxuICogICAtICoqT3JwaGFuZWQgc3RhY2tzKio6IHRhZ2dlZCBzdGFja3Mgd2l0aCBubyBEQiByZWNvcmQgKGxpa2VseSBsZWZ0b3ZlcnMgYWZ0ZXJcbiAqICAgICBhIHBpcGVsaW5lIHdhcyBkZWxldGVkIGZyb20gdGhlIGRhc2hib2FyZCBidXQgdGhlIENESyBzdGFjayBzdGF5ZWQgaW4gQVdTKS5cbiAqICAgLSAqKk1pc3Npbmcgc3RhY2tzKio6IHJlZ2lzdHJ5IGVudHJpZXMgcG9pbnRpbmcgdG8gc3RhY2tzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0XG4gKiAgICAgaW4gQ2xvdWRGb3JtYXRpb24gKGxpa2VseSBhZnRlciBhIG1hbnVhbCBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFja2ApLlxuICpcbiAqIFNjb3BlOiB0aGUgcmVnaXN0cnkgb2YgT05FIG9yZyAoeW91cnMsIG9yIGAtLW9yZ2Agd2hlbiB0aGUgcGxhdGZvcm0gbGV0cyB0aGVcbiAqIGNyZWRlbnRpYWwgbGlzdCB0aGF0IG9yZykgYWdhaW5zdCB0aGUgc3RhY2tzIG9mIE9ORSByZWdpb24gKGAtLXJlZ2lvbmApIOKAlFxuICogcmVnaXN0cnkgcm93cyBvZiBvdGhlciByZWdpb25zIGFyZSBjb3VudGVkIGJ1dCBub3QgY29tcGFyZWQsIGFuZCBzdGFja3NcbiAqIHRhZ2dlZCB3aXRoIGFub3RoZXIgYE9yZ0lkYCBhcmUgc2tpcHBlZC4gRXZlcnkgZmluZGluZyBjYXJyaWVzIHRoZSBjb21tYW5kXG4gKiB0aGF0IHJlY29uY2lsZXMgaXQgKGBwaXBlbGluZSBkZXJlZ2lzdGVyYCBmb3IgYSBtaXNzaW5nIHN0YWNrOyBgcGlwZWxpbmVcbiAqIHJlZ2lzdGVyYCBvciBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFja2AgZm9yIGFuIG9ycGhhbmVkIG9uZSkuXG4gKlxuICogRGVzaWduZWQgZm9yIGNyb24gdXNlOlxuICogICAtIEV4aXRzIDAgd2hlbiB0aGVyZSBhcmUgbm8gZmluZGluZ3MuXG4gKiAgIC0gRXhpdHMgMSB3aGVuIGF0IGxlYXN0IG9uZSBvcnBoYW5lZCBvciBtaXNzaW5nIHN0YWNrIGlzIGZvdW5kLlxuICogICAtIEV4aXRzIDIgb24gQVdTIGVycm9ycyAvIHNjYW4gZmFpbHVyZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgYXVkaXQgc3RhY2tzIC0tcmVnaW9uIHVzLWVhc3QtMVxuICogcGlwZWxpbmUtbWFuYWdlciBhdWRpdCBzdGFja3MgLS1yZWdpb24gZXUtd2VzdC0xIC0tanNvblxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdFN0YWNrcyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKFxuICAgIHdpdGhQcm9maWxlT3B0aW9uKFxuICAgICAgd2l0aFJlZ2lvbk9wdGlvbihwcm9ncmFtXG4gICAgICAgIC5jb21tYW5kKCdzdGFja3MnKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ0RpZmYgQ2xvdWRGb3JtYXRpb24gc3RhY2tzIHZzIHBpcGVsaW5lX3JlZ2lzdHJ5IHRvIGZpbmQgb3JwaGFuZWQgb3IgbWlzc2luZyBDREsgZGVwbG95bWVudHMnKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1vcmcgPG9yZ0lkPicsICdBdWRpdCB0aGlzIG9yZyAoZGVmYXVsdDogeW91ciBvd24pLiBBbm90aGVyIG9yZyBuZWVkcyBhIGNyZWRlbnRpYWwgdGhlIHBsYXRmb3JtIGxldHMgbGlzdCBpdCcpXG4gICAgICAub3B0aW9uKCctLW1heC1wYWdlcyA8bj4nLCAnU2FmZXR5IGNhcCBvbiBDbG91ZEZvcm1hdGlvbiBEZXNjcmliZVN0YWNrcyBwYWdlcyAofjEwMCBzdGFja3MgZWFjaCknLCBTdHJpbmcoREVGQVVMVF9NQVhfU1RBQ0tfUEFHRVMpKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHRzIGFzIEpTT04nLCBmYWxzZSksXG4gIClcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignQXVkaXQgU3RhY2tzJywgdW5kZWZpbmVkLCB7IHF1aWV0OiBvcHRpb25zLmpzb24gfSk7XG4gICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICBjb25zdCByZWdpb24gPSByZXNvbHZlQXdzUmVnaW9uKG9wdGlvbnMucmVnaW9uKTtcbiAgICAgIC8vIEhvbm9yIC0tcHJvZmlsZSBmb3IgdGhlIFNESyBDbG91ZEZvcm1hdGlvbiBjbGllbnQgYmVsb3cgKHdpdGhvdXQgdGhpcywgdGhlXG4gICAgICAvLyBzY2FuIGFsd2F5cyBoaXQgdGhlIGRlZmF1bHQgYWNjb3VudCBhbmQgY291bGQgZGlmZiB0aGUgcmVnaXN0cnkgYWdhaW5zdFxuICAgICAgLy8gdGhlIFdST05HIGFjY291bnQncyBzdGFja3Mg4oaSIGJvZ3VzIG9ycGhhbmVkL21pc3NpbmcgZmluZGluZ3MpLlxuICAgICAgYXBwbHlBd3NQcm9maWxlKG9wdGlvbnMucHJvZmlsZSk7XG4gICAgICBjb25zdCBtYXhQYWdlcyA9IE51bWJlci5wYXJzZUludChTdHJpbmcob3B0aW9ucy5tYXhQYWdlcyksIDEwKTtcbiAgICAgIC8vIE9yZyBpZHMgYXJlIGxvd2VyY2FzZSAodGhlIHJvdXRlIGxvd2VyY2FzZXMgYD9vcmdJZD1gIHRoZSBzYW1lIHdheSkuXG4gICAgICBjb25zdCByZXF1ZXN0ZWRPcmc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHR5cGVvZiBvcHRpb25zLm9yZyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5vcmcudHJpbSgpXG4gICAgICAgID8gb3B0aW9ucy5vcmcudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIERlY2lkZWQgaW5zaWRlIHRoZSB0cnksIGV4aXRlZCBvbiBvdXRzaWRlIGl0OiBhbiBleGl0IGluc2lkZSB3b3VsZCBiZVxuICAgICAgLy8gY2F1Z2h0IGFzIGEgc2NhbiBmYWlsdXJlIHdoZXJldmVyIHByb2Nlc3MuZXhpdCB0aHJvd3MgKHRlc3RzLCBlbWJlZGRlcnMpLlxuICAgICAgbGV0IGV4aXRDb2RlOiBudW1iZXI7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UGFnZXMpIHx8IG1heFBhZ2VzIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJy0tbWF4LXBhZ2VzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJywgJ21heC1wYWdlcycsIFN0cmluZyhvcHRpb25zLm1heFBhZ2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmV0Y2ggdGhlIHBsYXRmb3JtJ3MgdmlldyBvZiByZWdpc3RlcmVkIHBpcGVsaW5lcy5cbiAgICAgICAgLy8gUHJvZ3Jlc3MgZ29lcyB0byBzdGRvdXQsIHNvIHN1cHByZXNzIGl0IGluIC0tanNvbiBtb2RlIHRvIGtlZXAgdGhlIEpTT04gcGF5bG9hZCBjbGVhbiBmb3IgcGlwaW5nLlxuICAgICAgICBpZiAoIW9wdGlvbnMuanNvbikgcHJpbnRJbmZvKCdGZXRjaGluZyBwaXBlbGluZSByZWdpc3RyeSBmcm9tIHBsYXRmb3JtJywgeyBvcmc6IG9wdGlvbnMub3JnID8/ICcoeW91ciBvcmcpJyB9KTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBhbGxFbnRyaWVzID0gYXdhaXQgZmV0Y2hBbGxSZWdpc3RyeUVudHJpZXMoY2xpZW50LCBjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLnBpcGVsaW5lVXJsLCByZXF1ZXN0ZWRPcmcpO1xuXG4gICAgICAgIC8vIFdoaWNoIG9yZyB0aGlzIGF1ZGl0IGlzIGFib3V0LiBgLS1vcmdgIGlzIGEgcmVxdWVzdDsgdGhlIHJvd3Mgc2F5IHdoYXRcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIGFjdHVhbGx5IGFuc3dlcmVkIGZvci4gQSBwbGF0Zm9ybSB0aGF0IHNjb3BlZCB0aGUgbGlzdCB0b1xuICAgICAgICAvLyB0aGUgY2FsbGVyJ3Mgb3duIG9yZyBpbnN0ZWFkIHdvdWxkIG1ha2UgZXZlcnkgc3RhY2sgb2YgdGhlIHJlcXVlc3RlZFxuICAgICAgICAvLyBvcmcgcmVhZCBhcyBvcnBoYW5lZCDigJQgc28gYSBtaXNtYXRjaCBpcyBhbiBlcnJvciwgbm90IGEgZmluZGluZy5cbiAgICAgICAgY29uc3QgYW5zd2VyZWRGb3IgPSBuZXcgU2V0KGFsbEVudHJpZXMubWFwKChlKSA9PiBlLm9yZ0lkKS5maWx0ZXIoKG8pOiBvIGlzIHN0cmluZyA9PiAhIW8pKTtcbiAgICAgICAgaWYgKHJlcXVlc3RlZE9yZyAmJiBbLi4uYW5zd2VyZWRGb3JdLnNvbWUoKG8pID0+IG8gIT09IHJlcXVlc3RlZE9yZykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgYFRoZSBwbGF0Zm9ybSByZXR1cm5lZCB0aGUgcmVnaXN0cnkgb2YgJHtbLi4uYW5zd2VyZWRGb3JdLmpvaW4oJywgJyl9LCBub3QgLS1vcmcgJHtyZXF1ZXN0ZWRPcmd9LiBgXG4gICAgICAgICAgICArICdBdWRpdGluZyBhbm90aGVyIG9yZyBuZWVkcyBhIGNyZWRlbnRpYWwgdGhlIHBsYXRmb3JtIGxldHMgbGlzdCB0aGF0IG9yZ1xcJ3MgcmVnaXN0cnkuJyxcbiAgICAgICAgICAgICdvcmcnLFxuICAgICAgICAgICAgcmVxdWVzdGVkT3JnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXVkaXRPcmc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlcXVlc3RlZE9yZ1xuICAgICAgICAgID8/IChhbnN3ZXJlZEZvci5zaXplID09PSAxID8gWy4uLmFuc3dlcmVkRm9yXVswXSA6IHVuZGVmaW5lZClcbiAgICAgICAgICA/PyBkZWNvZGVUb2tlblBheWxvYWQocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4gPz8gJycpPy5vcmdhbml6YXRpb25JZDtcblxuICAgICAgICAvLyBUaGUgc2NhbiBiZWxvdyBjb3ZlcnMgT05FIHJlZ2lvbiwgc28gb25seSB0aGF0IHJlZ2lvbidzIHJvd3MgY2FuIGJlXG4gICAgICAgIC8vIGNvbXBhcmVkIOKAlCBldmVyeSBvdGhlciByZWdpb24ncyBwaXBlbGluZSB3b3VsZCBvdGhlcndpc2UgYmUgXCJtaXNzaW5nXCIuXG4gICAgICAgIC8vIEEgcm93IHdpdGggbm8gcmVnaW9uIGNhbid0IGJlIHBsYWNlZCwgc28gaXQgaXMgY291bnRlZCBhbmQgbGVmdCBvdXQuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhbGxFbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5yZWdpb24gPT09IHJlZ2lvbik7XG4gICAgICAgIGNvbnN0IHdpdGhvdXRSZWdpb24gPSBhbGxFbnRyaWVzLmZpbHRlcigoZSkgPT4gIWUucmVnaW9uKS5sZW5ndGg7XG4gICAgICAgIGlmICh3aXRob3V0UmVnaW9uID4gMCAmJiAhb3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKGAke3dpdGhvdXRSZWdpb259IHJlZ2lzdHJ5IGVudHIke3dpdGhvdXRSZWdpb24gPT09IDEgPyAneSBoYXMnIDogJ2llcyBoYXZlJ30gbm8gcmVnaW9uIGFuZCAke3dpdGhvdXRSZWdpb24gPT09IDEgPyAnaXMnIDogJ2FyZSd9IG5vdCBjb21wYXJlZCDigJQgcmUtcmVnaXN0ZXIgd2l0aCBcInBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgcmVnaXN0ZXIgLS1pZCA8cGlwZWxpbmVJZD4gLS1yZWdpb24gPHJlZ2lvbj5cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYXVkaXRPcmcgJiYgIW9wdGlvbnMuanNvbikge1xuICAgICAgICAgIHByaW50V2FybmluZygnQ291bGQgbm90IHRlbGwgd2hpY2ggb3JnIHRoaXMgY3JlZGVudGlhbCBiZWxvbmdzIHRvIOKAlCBzdGFja3Mgb2YgZXZlcnkgb3JnIGluIHRoZSBhY2NvdW50IGFyZSBjb21wYXJlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggc3RhY2tzIGZyb20gQ2xvdWRGb3JtYXRpb24uIERlc2NyaWJlU3RhY2tzIChubyBTdGFja05hbWUpIHJldHVybnMgZXZlcnlcbiAgICAgICAgLy8gYWN0aXZlIHN0YWNrIFdJVEggaXRzIHRhZ3MgaW4gb25lIHBhZ2luYXRlZCBzd2VlcCDigJQgYXZvaWRpbmcgdGhlIE4rMVxuICAgICAgICAvLyBEZXNjcmliZVN0YWNrcy1wZXItc3RhY2sgYSBMaXN0U3RhY2tzIHBhdGggbmVlZHMgKExpc3RTdGFja3Mgb21pdHMgdGFncylcbiAgICAgICAgLy8gYW5kIHRoZSBBUEkgdGhyb3R0bGluZyB0aGF0IGNhdXNlcyBvbiBhY2NvdW50cyB3aXRoIG1hbnkgc3RhY2tzLlxuICAgICAgICBpZiAoIW9wdGlvbnMuanNvbikgcHJpbnRJbmZvKCdMaXN0aW5nIENsb3VkRm9ybWF0aW9uIHN0YWNrcycsIHsgcmVnaW9uIH0pO1xuICAgICAgICBjb25zdCBjZm4gPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7XG4gICAgICAgIGNvbnN0IHN0YWNrczogU3RhY2tJbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3QgYWN0aXZlU3RhdHVzZXMgPSBuZXcgU2V0KEFDVElWRV9TVEFUVVNFUyk7XG4gICAgICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHBhZ2VzID0gMDtcbiAgICAgICAgLy8gQmFja3N0b3Agb25seSAofjIwayBzdGFja3MgYXQgfjEwMC9wYWdlKSwgbm90IGFuIGV4cGVjdGVkIGxpbWl0LiBBIEZVTEwgc2NhblxuICAgICAgICAvLyBtYXR0ZXJzOiB0cnVuY2F0aW5nIHdvdWxkIGRpZmYgdGhlIHJlZ2lzdHJ5IGFnYWluc3QgYW4gaW5jb21wbGV0ZSBzdGFjayBzZXQgYW5kXG4gICAgICAgIC8vIHJlcG9ydCBsaXZlIHN0YWNrcyBhcyBgbWlzc2luZy1zdGFja2AuIFNvIGlmIHRoaXMgaXMgZXZlciBoaXQsIHdhcm4gTE9VRExZIHJhdGhlclxuICAgICAgICAvLyB0aGFuIHNpbGVudGx5IHVuZGVyLXJlcG9ydGluZyAodGhlIHByZXZpb3VzIGNvZGUgY2FwcGVkIGF0IDIwIHBhZ2VzIHNpbGVudGx5KS5cbiAgICAgICAgbGV0IHRydW5jYXRlZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGNmbi5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoeyBOZXh0VG9rZW46IG5leHRUb2tlbiB9KSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdGFjayBvZiByZXNwLlN0YWNrcyA/PyBbXSkge1xuICAgICAgICAgICAgaWYgKCFzdGFjay5TdGFja05hbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhY3RpdmVTdGF0dXNlcy5oYXMoc3RhY2suU3RhY2tTdGF0dXMgPz8gJycpKSBjb250aW51ZTsgLy8gc2tpcCBpbi1wcm9ncmVzcy9yb2xsZWQtYmFjay9kZWxldGVkXG4gICAgICAgICAgICBjb25zdCB0YWdzID0gc3RhY2suVGFncyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHBiVGFnID0gdGFncy5maW5kKCh0KSA9PiB0LktleSA9PT0gJ3BpcGVsaW5lLWJ1aWxkZXInKT8uVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBvcmdUYWcgPSB0YWdzLmZpbmQoKHQpID0+IHQuS2V5ID09PSAnT3JnSWQnKT8uVmFsdWU7XG4gICAgICAgICAgICBpZiAoIXBiVGFnKSBjb250aW51ZTsgLy8gTm90IGEgcGlwZWxpbmUtYnVpbGRlciBzdGFjay5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgb3JnJ3Mgc3RhY2sgaW4gdGhlIHNhbWUgYWNjb3VudCBpcyBub3QgdGhpcyBvcmcncyBkcmlmdC5cbiAgICAgICAgICAgIGlmIChhdWRpdE9yZyAmJiBvcmdUYWcgJiYgb3JnVGFnLnRvTG93ZXJDYXNlKCkgIT09IGF1ZGl0T3JnLnRvTG93ZXJDYXNlKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc3RhY2tzLnB1c2goe1xuICAgICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLlN0YWNrTmFtZSxcbiAgICAgICAgICAgICAgc3RhY2tTdGF0dXM6IHN0YWNrLlN0YWNrU3RhdHVzID8/ICdVTktOT1dOJyxcbiAgICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgICBwaXBlbGluZUJ1aWxkZXJUYWc6IHBiVGFnLFxuICAgICAgICAgICAgICBvcmdJZFRhZzogb3JnVGFnLFxuICAgICAgICAgICAgICBwaXBlbGluZUlkVGFnOiB0YWdzLmZpbmQoKHQpID0+IHQuS2V5ID09PSAncGIucGlwZWxpbmUtaWQnKT8uVmFsdWUsXG4gICAgICAgICAgICAgIGNyZWF0aW9uVGltZTogc3RhY2suQ3JlYXRpb25UaW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHRUb2tlbiA9IHJlc3AuTmV4dFRva2VuO1xuICAgICAgICAgIHBhZ2VzKys7XG4gICAgICAgICAgaWYgKG5leHRUb2tlbiAmJiBwYWdlcyA+PSBtYXhQYWdlcykgeyB0cnVuY2F0ZWQgPSB0cnVlOyBicmVhazsgfVxuICAgICAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICAgICAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKGBTdGFjayBzY2FuIGhpdCB0aGUgJHttYXhQYWdlc30tcGFnZSBzYWZldHkgY2FwIOKAlCByZXN1bHRzIG1heSBiZSBJTkNPTVBMRVRFIGFuZCAnbWlzc2luZy1zdGFjaycgZmluZGluZ3MgY291bGQgYmUgZmFsc2UuIFJhaXNlIC0tbWF4LXBhZ2VzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlmZi5cbiAgICAgICAgY29uc3QgcmVnaXN0cnlTdGFja05hbWVzID0gbmV3IFNldChlbnRyaWVzLm1hcCgoZSkgPT4gZS5zdGFja05hbWUpLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+ICEhbikpO1xuICAgICAgICBjb25zdCBjZm5TdGFja05hbWVzID0gbmV3IFNldChzdGFja3MubWFwKChzKSA9PiBzLnN0YWNrTmFtZSkpO1xuXG4gICAgICAgIGNvbnN0IGZpbmRpbmdzOiBBdWRpdEZpbmRpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgICAgICAgIGlmICghcmVnaXN0cnlTdGFja05hbWVzLmhhcyhzdGFjay5zdGFja05hbWUpKSB7XG4gICAgICAgICAgICBmaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogJ29ycGhhbmVkLXN0YWNrJyxcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICAgIC4uLihzdGFjay5waXBlbGluZUlkVGFnID8geyBwaXBlbGluZUlkOiBzdGFjay5waXBlbGluZUlkVGFnIH0gOiB7fSksXG4gICAgICAgICAgICAgIGRldGFpbDogYENsb3VkRm9ybWF0aW9uIHN0YWNrIHRhZ2dlZCBwaXBlbGluZS1idWlsZGVyPSR7c3RhY2sucGlwZWxpbmVCdWlsZGVyVGFnID8/ICcodW5zZXQpJ30gaGFzIG5vIG1hdGNoaW5nIHBpcGVsaW5lX3JlZ2lzdHJ5IGVudHJ5YCxcbiAgICAgICAgICAgICAgLy8gU3RpbGwgd2FudGVkIOKGkiByZWdpc3RlciBpdDsgYSBsZWZ0b3ZlciDihpIgZGVsZXRlIHRoZSBzdGFjay5cbiAgICAgICAgICAgICAgZml4OiBzdGFjay5waXBlbGluZUlkVGFnXG4gICAgICAgICAgICAgICAgPyBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSByZWdpc3RlciAtLWlkICR7c3RhY2sucGlwZWxpbmVJZFRhZ30gLS1yZWdpb24gJHtyZWdpb259ICAgIyBvciwgaWYgdW53YW50ZWQ6IGF3cyBjbG91ZGZvcm1hdGlvbiBkZWxldGUtc3RhY2sgLS1zdGFjay1uYW1lICR7c3RhY2suc3RhY2tOYW1lfSAtLXJlZ2lvbiAke3JlZ2lvbn1gXG4gICAgICAgICAgICAgICAgOiBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJHtzdGFjay5zdGFja05hbWV9IC0tcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnN0YWNrTmFtZSAmJiAhY2ZuU3RhY2tOYW1lcy5oYXMoZW50cnkuc3RhY2tOYW1lKSkge1xuICAgICAgICAgICAgZmluZGluZ3MucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdtaXNzaW5nLXN0YWNrJyxcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBlbnRyeS5zdGFja05hbWUsXG4gICAgICAgICAgICAgIHBpcGVsaW5lSWQ6IGVudHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgICAgIHBpcGVsaW5lTmFtZTogZW50cnkucGlwZWxpbmVOYW1lLFxuICAgICAgICAgICAgICByZWdpc3RyeUlkOiBlbnRyeS5pZCxcbiAgICAgICAgICAgICAgZGV0YWlsOiBgUmVnaXN0cnkgZW50cnkgcmVmZXJlbmNlcyBzdGFjayAke2VudHJ5LnN0YWNrTmFtZX0gYnV0IG5vIHN1Y2ggc3RhY2sgZXhpc3RzIGluIENsb3VkRm9ybWF0aW9uICgke3JlZ2lvbn0pYCxcbiAgICAgICAgICAgICAgZml4OiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBkZXJlZ2lzdGVyIC0taWQgJHtlbnRyeS5pZH1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB0cnVuY2F0ZWQgKGluY29tcGxldGUpIHNjYW4gaXMgYSBmaW5kaW5nIGluIGl0c2VsZjogaXQgY2FuIGJvdGggbWlzc1xuICAgICAgICAvLyByZWFsIGRyaWZ0IEFORCBlbWl0IGZhbHNlIG1pc3Npbmctc3RhY2sgZmluZGluZ3MsIHNvIGl0IG11c3QgZXhpdFxuICAgICAgICAvLyBub24temVybyBhbmQgYmUgdmlzaWJsZSBpbiB0aGUgSlNPTiAobWlycm9ycyBhdWRpdC10b2tlbnMpLlxuICAgICAgICBleGl0Q29kZSA9IChmaW5kaW5ncy5sZW5ndGggPiAwIHx8IHRydW5jYXRlZCkgPyAxIDogMDtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2Nhbm5lZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBvcmc6IGF1ZGl0T3JnLFxuICAgICAgICAgICAgcmVnaXN0cnlFbnRyaWVzOiBlbnRyaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIHJlZ2lzdHJ5RW50cmllc090aGVyUmVnaW9uczogYWxsRW50cmllcy5sZW5ndGggLSBlbnRyaWVzLmxlbmd0aCAtIHdpdGhvdXRSZWdpb24sXG4gICAgICAgICAgICByZWdpc3RyeUVudHJpZXNXaXRob3V0UmVnaW9uOiB3aXRob3V0UmVnaW9uLFxuICAgICAgICAgICAgY2ZuU3RhY2tzOiBzdGFja3MubGVuZ3RoLFxuICAgICAgICAgICAgdHJ1bmNhdGVkLFxuICAgICAgICAgICAgZmluZGluZ3MsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdBdWRpdCBSZXN1bHRzJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKCdDb3VudHMnLCB7XG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICByZWdpc3RyeUVudHJpZXM6IFN0cmluZyhlbnRyaWVzLmxlbmd0aCksXG4gICAgICAgICAgICByZWdpc3RyeUVudHJpZXNPdGhlclJlZ2lvbnM6IFN0cmluZyhhbGxFbnRyaWVzLmxlbmd0aCAtIGVudHJpZXMubGVuZ3RoIC0gd2l0aG91dFJlZ2lvbiksXG4gICAgICAgICAgICBjZm5TdGFja3M6IFN0cmluZyhzdGFja3MubGVuZ3RoKSxcbiAgICAgICAgICAgIGZpbmRpbmdzOiBTdHJpbmcoZmluZGluZ3MubGVuZ3RoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoJ05vIGRyaWZ0IGJldHdlZW4gcGlwZWxpbmVfcmVnaXN0cnkgYW5kIENsb3VkRm9ybWF0aW9uJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBmaW5kaW5ncykge1xuICAgICAgICAgICAgICBpZiAoZi50eXBlID09PSAnb3JwaGFuZWQtc3RhY2snKSB7XG4gICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBPUlBIQU5FRCAgJHtmLnN0YWNrTmFtZX0g4oCUICR7Zi5kZXRhaWx9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBNSVNTSU5HICAgJHtmLnN0YWNrTmFtZX0gKHBpcGVsaW5lICR7Zi5waXBlbGluZUlkID8/ICc/J30pIOKAlCAke2YuZGV0YWlsfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAgICAgZml4OiAke2YuZml4fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpbnRFcnJvcihgJHtmaW5kaW5ncy5sZW5ndGh9IGRyaWZ0IGZpbmRpbmcke2ZpbmRpbmdzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfSDigJQgZWFjaCBpcyBsaXN0ZWQgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHJlY29uY2lsZXMgaXQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnYXVkaXQtc3RhY2tzJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4aXRDb2RlID0gMjtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"audit-tokens.d.ts","sources":["../../src/commands/audit-tokens.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2IlD"}
1
+ {"version":3,"file":"audit-tokens.d.ts","sources":["../../src/commands/audit-tokens.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0IlD"}
@@ -6,7 +6,7 @@ import { Command } from 'commander';
6
6
  import { resolveAwsRegion } from '../utils/aws-env.js';
7
7
  import { getSecretValue, listSecrets } from '../utils/aws-secrets.js';
8
8
  import { printCommandHeader, withProfileOption, withRegionOption } from '../utils/command-utils.js';
9
- import { ERROR_CODES, handleError } from '../utils/error-handler.js';
9
+ import { ERROR_CODES, reportError } from '../utils/error-handler.js';
10
10
  import { printError, printInfo, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
11
11
  /**
12
12
  * Registers the `audit-tokens` command with the CLI program.
@@ -152,13 +152,12 @@ export function auditTokens(program) {
152
152
  process.exit(exitCode);
153
153
  }
154
154
  catch (error) {
155
- handleError(error, ERROR_CODES.API_REQUEST, {
155
+ reportError(error, ERROR_CODES.API_REQUEST, {
156
156
  debug: program.opts().debug,
157
- exit: false,
158
157
  context: { command: 'audit-tokens', executionId },
159
158
  });
160
159
  process.exit(2);
161
160
  }
162
161
  });
163
162
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdG9rZW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaXQtdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVkzRzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQWdCO0lBQzFDLGlCQUFpQixDQUNmLGdCQUFnQixDQUFDLE9BQU87U0FDckIsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsb0ZBQW9GLENBQUMsQ0FBQyxDQUN0RztTQUNFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSwrQ0FBK0MsRUFBRSxHQUFHLENBQUM7U0FDbEYsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHFDQUFxQyxFQUFFLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixHQUFHLENBQUM7U0FDM0csTUFBTSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENB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QUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2pGLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztvQkFDRCxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcseUhBQXlILENBQUMsQ0FBQztnQkFDaE0sQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxLQUFLO2dCQUNYLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO2FBQ2xELENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UsIGlzT3BhcXVlQXBpS2V5IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBnZXRTZWNyZXRWYWx1ZSwgbGlzdFNlY3JldHMgfSBmcm9tICcuLi91dGlscy9hd3Mtc2VjcmV0cy5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmludGVyZmFjZSBUb2tlbkF1ZGl0RW50cnkge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGFybjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IERhdGU7XG4gIGRheXNVbnRpbEV4cGlyeTogbnVtYmVyO1xuICBzdGF0dXM6ICdleHBpcmVkJyB8ICdleHBpcmluZy1zb29uJyB8ICd1bnZlcmlmaWFibGUnIHwgJ29rJztcbiAgLyoqIFdoeSB0aGUgc3RvcmVkIHRva2VuIGZhaWxlZCB2ZXJpZmljYXRpb24sIHdoZW4gYHN0YXR1c2AgaXMgYHVudmVyaWZpYWJsZWAuICovXG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBhdWRpdC10b2tlbnNgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogU2NhbnMgQVdTIFNlY3JldHMgTWFuYWdlciBmb3Igc3RvcmVkIHBsYXRmb3JtIEpXVHMgKG1hdGNoaW5nIHRoZVxuICogYHBpcGVsaW5lLWJ1aWxkZXIvPG9yZ0lkPi9wbGF0Zm9ybWAgbmFtaW5nIGNvbnZlbnRpb24gdXNlZCBieSBgc3RvcmUtdG9rZW5gKVxuICogYW5kIHJlcG9ydHMgd2hpY2ggc2VjcmV0cyBhcmUgZXhwaXJlZCBvciBjbG9zZSB0byBleHBpcmluZy5cbiAqXG4gKiBEZXNpZ25lZCBmb3IgY3JvbiB1c2U6XG4gKiAgIC0gRXhpdHMgMCB3aGVuIG5vdGhpbmcgaXMgYXQtcmlzay5cbiAqICAgLSBFeGl0cyAxIHdoZW4gYXQgbGVhc3Qgb25lIHNlY3JldCBpcyBleHBpcmVkIG9yIGV4cGlyZXMgd2l0aGluIGAtLXdhcm4tZGF5c2AuXG4gKiAgIC0gRXhpdHMgMiBvbiBBV1MgZXJyb3JzIC8gc2NhbiBmYWlsdXJlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgYmFzaFxuICogcGlwZWxpbmUtbWFuYWdlciBhdWRpdCB0b2tlbnMgLS1yZWdpb24gdXMtZWFzdC0xIC0td2Fybi1kYXlzIDdcbiAqIHBpcGVsaW5lLW1hbmFnZXIgYXVkaXQgdG9rZW5zIC0tcmVnaW9uIHVzLWVhc3QtMSAtLWpzb25cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXVkaXRUb2tlbnMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICB3aXRoUmVnaW9uT3B0aW9uKHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCd0b2tlbnMnKVxuICAgICAgLmRlc2NyaXB0aW9uKCdTY2FuIHN0b3JlZCBwbGF0Zm9ybSB0b2tlbnMgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBhbmQgcmVwb3J0IHVwY29taW5nIGV4cGlyYXRpb25zJykpLFxuICApXG4gICAgLm9wdGlvbignLS13YXJuLWRheXMgPGRheXM+JywgJ0ZsYWcgdG9rZW5zIGV4cGlyaW5nIHdpdGhpbiBOIGRheXMgYXMgYXQtcmlzaycsICc3JylcbiAgICAub3B0aW9uKCctLXByZWZpeCA8cHJlZml4PicsICdTZWNyZXRzIE1hbmFnZXIgbmFtZSBwcmVmaXggdG8gc2NhbicsIGAke0NvcmVDb25zdGFudHMuU0VDUkVUU19QQVRIX1BSRUZJWH0vYClcbiAgICAub3B0aW9uKCctLWpzb24nLCAnT3V0cHV0IHJlc3VsdHMgYXMgSlNPTicsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdBdWRpdCBUb2tlbnMnLCB1bmRlZmluZWQsIHsgcXVpZXQ6IG9wdGlvbnMuanNvbiB9KTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgY29uc3Qgd2FybkRheXMgPSBwYXJzZUludChvcHRpb25zLndhcm5EYXlzLCAxMCk7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh3YXJuRGF5cykgfHwgd2FybkRheXMgPCAwKSB7XG4gICAgICAgIHByaW50RXJyb3IoJ0ludmFsaWQgLS13YXJuLWRheXMgdmFsdWUnLCB7IHByb3ZpZGVkOiBvcHRpb25zLndhcm5EYXlzIH0pO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFByb2dyZXNzIGdvZXMgdG8gc3Rkb3V0LCBzbyBzdXBwcmVzcyBpdCBpbiAtLWpzb24gbW9kZSB0byBrZWVwIHRoZSBKU09OIHBheWxvYWQgY2xlYW4gZm9yIHBpcGluZy5cbiAgICAgICAgaWYgKCFvcHRpb25zLmpzb24pIHByaW50SW5mbygnTGlzdGluZyBzZWNyZXRzJywgeyByZWdpb24sIHByZWZpeDogb3B0aW9ucy5wcmVmaXggfSk7XG4gICAgICAgIGNvbnN0IHsgc2VjcmV0cywgdHJ1bmNhdGVkIH0gPSBhd2FpdCBsaXN0U2VjcmV0cyhvcHRpb25zLnByZWZpeCwgeyByZWdpb24sIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9KTtcbiAgICAgICAgaWYgKHRydW5jYXRlZCkge1xuICAgICAgICAgIC8vIEEgdHJ1bmNhdGVkIHN3ZWVwIG1lYW5zIGFuIGV4cGlyaW5nIHRva2VuIHBhc3QgdGhlIGNhcCBjb3VsZCBiZSBtaXNzZWQg4oCUXG4gICAgICAgICAgLy8gbmV2ZXIgcmVwb3J0IFwiYWxsIGNsZWFyXCIgZnJvbSBhbiBpbmNvbXBsZXRlIHNjYW4gKG1pcnJvcnMgYXVkaXQtc3RhY2tzKS5cbiAgICAgICAgICBwcmludFdhcm5pbmcoJ1NlY3JldCBsaXN0aW5nIHdhcyBUUlVOQ0FURUQgKHBhZ2luZyBjYXAgaGl0KSDigJQgcmVzdWx0cyBtYXkgYmUgSU5DT01QTEVURSBhbmQgYW4gZXhwaXJpbmcgdG9rZW4gY291bGQgYmUgbWlzc2VkLiBOYXJyb3cgYnkgLS1wcmVmaXgvLS1yZWdpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdWRpdCBldmVyeSBzdG9yZWQgbWFjaGluZSBjcmVkZW50aWFsOiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0ga2V5XG4gICAgICAgIC8vIChgPHByZWZpeD4vPG9yZ0lkPi9wbGF0Zm9ybWApIGFuZCBlYWNoIFNDT1BFRCBvbmUgKGAuLi4vcmVwb3J0aW5nLWluZ2VzdGAsXG4gICAgICAgIC8vIGAuLi4vcmVnaXN0cnktcHVzaGAsIGZyb20gYHN0b3JlLXRva2VuIC0tc2NvcGUg4oCmYCkuIEFsbCBleHBpcmUgYW5kIGFsbFxuICAgICAgICAvLyBhcmUgYXV0by1yb3RhdGVkLCBzbyBhIHN0YWxsZWQgcm90YXRpb24gb24gYW55IG9mIHRoZW0gbXVzdCBzdXJmYWNlIGhlcmUuXG4gICAgICAgIGNvbnN0IENSRURFTlRJQUxfTEVBVkVTID0gWycvcGxhdGZvcm0nLCAnL3JlcG9ydGluZy1pbmdlc3QnLCAnL3JlZ2lzdHJ5LXB1c2gnXTtcbiAgICAgICAgY29uc3QgcGxhdGZvcm1TZWNyZXRzID0gc2VjcmV0cy5maWx0ZXIoKHMpID0+IENSRURFTlRJQUxfTEVBVkVTLnNvbWUoKGxlYWYpID0+IHMubmFtZS5lbmRzV2l0aChsZWFmKSkpO1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXM6IFRva2VuQXVkaXRFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHdhcm5DdXRvZmYgPSBub3cgKyB3YXJuRGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHBsYXRmb3JtU2VjcmV0cykge1xuICAgICAgICAgIGxldCByYXc6IHN0cmluZztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmF3ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUocy5uYW1lLCB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBDb3VsZCBub3QgcmVhZCAke3MubmFtZX06ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyc2VkOiB7IHBhc3N3b3JkPzogc3RyaW5nOyBleHBpcmVzQXQ/OiBzdHJpbmc7IHBsYXRmb3JtVXJsPzogc3RyaW5nIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgU2VjcmV0ICR7cy5uYW1lfSBpcyBub3QgdmFsaWQgSlNPTiwgc2tpcHBpbmdgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGBleHBpcmVzQXRgIGlzIHRoZSBPTkxZIGV4cGlyeSBzb3VyY2Ugbm93LiBUaGUgc3RvcmVkIGNyZWRlbnRpYWwgaXMgYW5cbiAgICAgICAgICAvLyBvcGFxdWUgc2VydmljZS1hY2NvdW50IGtleTogaXQgY2FycmllcyBubyBjbGFpbXMsIHNvIHRoZXJlIGlzIG5vIGBleHBgXG4gICAgICAgICAgLy8gdG8gZGVjb2RlIGFzIGEgZmFsbGJhY2sg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHN0b3JlLXRva2VuIGFuZCB0aGVcbiAgICAgICAgICAvLyByb3RhdG9yIGJvdGggd3JpdGUgdGhlIGZpZWxkLlxuICAgICAgICAgIGxldCBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHBhcnNlZC5leHBpcmVzQXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShwYXJzZWQuZXhwaXJlc0F0KTtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSkgZXhwaXJlc0F0ID0gZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFleHBpcmVzQXQpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgU2VjcmV0ICR7cy5uYW1lfSBoYXMgbm8gZXhwaXJ5IGluZm9ybWF0aW9uLCBza2lwcGluZ2ApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGF5c1VudGlsRXhwaXJ5ID0gTWF0aC5mbG9vcigoZXhwaXJlc0F0LmdldFRpbWUoKSAtIG5vdykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgIGxldCBzdGF0dXM6IFRva2VuQXVkaXRFbnRyeVsnc3RhdHVzJ10gPVxuICAgICAgICAgICAgZXhwaXJlc0F0LmdldFRpbWUoKSA8IG5vdyA/ICdleHBpcmVkJ1xuICAgICAgICAgICAgICA6IGV4cGlyZXNBdC5nZXRUaW1lKCkgPCB3YXJuQ3V0b2ZmID8gJ2V4cGlyaW5nLXNvb24nXG4gICAgICAgICAgICAgICAgOiAnb2snO1xuXG4gICAgICAgICAgLy8gQSBzZWNyZXQgdGhhdCBzdGlsbCBoYXMgbW9udGhzIG9mIGxpZmUgYnV0IGhvbGRzIHRoZSBXUk9ORyBLSU5EIG9mXG4gICAgICAgICAgLy8gY3JlZGVudGlhbCBpcyBqdXN0IGFzIGRlYWQgYXMgYW4gZXhwaXJlZCBvbmUuIEFmdGVyIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAgICAgICAvLyBjdXRvdmVyIHRoZSBzdG9yZWQgdmFsdWUgbXVzdCBiZSBhbiBvcGFxdWUgYHBiX3NhX+KApmAga2V5OyBhIHNlY3JldCBsZWZ0XG4gICAgICAgICAgLy8gaG9sZGluZyBhIHByZS1jdXRvdmVyIG1hY2hpbmUtc2Vzc2lvbiBKV1QgaXMgcmVmdXNlZCBieSBldmVyeSBjb25zdW1lcixcbiAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgc2NhbiB0aGF0IG5hbWVzIGl0IGluc3RlYWQgb2YgbGVhdmluZyB0aHJlZSBzZXJ2aWNlcyB0b1xuICAgICAgICAgIC8vIGZhaWwgd2l0aCBhbiBvcGFxdWUgNDAxLlxuICAgICAgICAgIGxldCByZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoc3RhdHVzICE9PSAnZXhwaXJlZCcgJiYgcGFyc2VkLnBhc3N3b3JkICYmICFpc09wYXF1ZUFwaUtleShwYXJzZWQucGFzc3dvcmQpKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSAndW52ZXJpZmlhYmxlJztcbiAgICAgICAgICAgIHJlYXNvbiA9IHBhcnNlZC5wYXNzd29yZC5zcGxpdCgnLicpLmxlbmd0aCA9PT0gM1xuICAgICAgICAgICAgICA/ICdob2xkcyBhIHByZS1jdXRvdmVyIEpXVCwgbm90IGEgc2VydmljZS1hY2NvdW50IGtleSDigJQgcmUtcnVuIFwicGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlblwiJ1xuICAgICAgICAgICAgICA6ICdkb2VzIG5vdCBob2xkIGFuIG9wYXF1ZSBzZXJ2aWNlLWFjY291bnQga2V5IChleHBlY3RlZCBhIFwicGJfc2Ff4oCmXCIgdmFsdWUpJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cmllcy5wdXNoKHsgc2VjcmV0TmFtZTogcy5uYW1lLCBhcm46IHMuYXJuLCBleHBpcmVzQXQsIGRheXNVbnRpbEV4cGlyeSwgc3RhdHVzLCAuLi4ocmVhc29uID8geyByZWFzb24gfSA6IHt9KSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0UmlzayA9IGVudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXR1cyAhPT0gJ29rJyk7XG4gICAgICAgIC8vIEEgdHJ1bmNhdGVkIHNjYW4gaXMgaXRzZWxmIGEgZmFpbHVyZSBjb25kaXRpb246IGV4aXQgbm9uLXplcm8gc28gY3JvblxuICAgICAgICAvLyBkb2Vzbid0IHJlYWQgYW4gaW5jb21wbGV0ZSBcImFsbCBjbGVhclwiIGFzIHN1Y2Nlc3MuXG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gKGF0Umlzay5sZW5ndGggPiAwIHx8IHRydW5jYXRlZCkgPyAxIDogMDtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2Nhbm5lZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICB3YXJuRGF5cyxcbiAgICAgICAgICAgIHRvdGFsU2Nhbm5lZDogZW50cmllcy5sZW5ndGgsXG4gICAgICAgICAgICBhdFJpc2tDb3VudDogYXRSaXNrLmxlbmd0aCxcbiAgICAgICAgICAgIHRydW5jYXRlZCxcbiAgICAgICAgICAgIGVudHJpZXM6IGVudHJpZXMubWFwKChlKSA9PiAoeyAuLi5lLCBleHBpcmVzQXQ6IGUuZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCkgfSkpLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50U2VjdGlvbignQXVkaXQgUmVzdWx0cycpO1xuICAgICAgICAgIHByaW50SW5mbyhgU2Nhbm5lZCAke2VudHJpZXMubGVuZ3RofSBwbGF0Zm9ybSBzZWNyZXQke2VudHJpZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9YCk7XG4gICAgICAgICAgaWYgKGF0Umlzay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0cnVuY2F0ZWQpIHtcbiAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBhdC1yaXNrIHRva2VucyBpbiB0aGUgc2Nhbm5lZCBwYWdlcywgYnV0IHRoZSBzY2FuIHdhcyB0cnVuY2F0ZWQg4oCUIHNvbWUgc2VjcmV0cyB3ZXJlIG5vdCBjaGVja2VkLicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGBBbGwgc3RvcmVkIGtleXMgdmFsaWQgZm9yIGF0IGxlYXN0ICR7d2FybkRheXN9IGRheXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGF0Umlzaykge1xuICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGUuc3RhdHVzID09PSAnZXhwaXJlZCdcbiAgICAgICAgICAgICAgICA/IGBFWFBJUkVEICR7TWF0aC5hYnMoZS5kYXlzVW50aWxFeHBpcnkpfSBkYXkke2UuZGF5c1VudGlsRXhwaXJ5ID09PSAtMSA/ICcnIDogJ3MnfSBhZ29gXG4gICAgICAgICAgICAgICAgOiBlLnN0YXR1cyA9PT0gJ3VudmVyaWZpYWJsZSdcbiAgICAgICAgICAgICAgICAgID8gYFVOVVNBQkxFIOKAlCAke2UucmVhc29ufWBcbiAgICAgICAgICAgICAgICAgIDogYGV4cGlyZXMgaW4gJHtlLmRheXNVbnRpbEV4cGlyeX0gZGF5JHtlLmRheXNVbnRpbEV4cGlyeSA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gICAgICAgICAgICAgIHByaW50V2FybmluZyhgJHtlLnNlY3JldE5hbWV9IOKAlCAke2xhYmVsfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpbnRFcnJvcihgJHthdFJpc2subGVuZ3RofSBzZWNyZXQke2F0Umlzay5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gbmVlZCByb3RhdGlvbi4gUnVuIFxcYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzIDxOPlxcYCAoYWRkIC0tc2NvcGUgZm9yIGEgc2NvcGVkIGNyZWRlbnRpYWwpIHRvIHJlaXNzdWUuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnYXVkaXQtdG9rZW5zJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdG9rZW5zLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaXQtdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVkzRzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQWdCO0lBQzFDLGlCQUFpQixDQUNmLGdCQUFnQixDQUFDLE9BQU87U0FDckIsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsb0ZBQW9GLENBQUMsQ0FBQyxDQUN0RztTQUNFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSwrQ0FBK0MsRUFBRSxHQUFHLENBQUM7U0FDbEYsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHFDQUFxQyxFQUFFLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixHQUFHLENBQUM7U0FDM0csTUFBTSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENB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QUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2pGLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztvQkFDRCxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcseUhBQXlILENBQUMsQ0FBQztnQkFDaE0sQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO2FBQ2xELENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UsIGlzT3BhcXVlQXBpS2V5IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBnZXRTZWNyZXRWYWx1ZSwgbGlzdFNlY3JldHMgfSBmcm9tICcuLi91dGlscy9hd3Mtc2VjcmV0cy5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgcmVwb3J0RXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmludGVyZmFjZSBUb2tlbkF1ZGl0RW50cnkge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGFybjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IERhdGU7XG4gIGRheXNVbnRpbEV4cGlyeTogbnVtYmVyO1xuICBzdGF0dXM6ICdleHBpcmVkJyB8ICdleHBpcmluZy1zb29uJyB8ICd1bnZlcmlmaWFibGUnIHwgJ29rJztcbiAgLyoqIFdoeSB0aGUgc3RvcmVkIHRva2VuIGZhaWxlZCB2ZXJpZmljYXRpb24sIHdoZW4gYHN0YXR1c2AgaXMgYHVudmVyaWZpYWJsZWAuICovXG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBhdWRpdC10b2tlbnNgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogU2NhbnMgQVdTIFNlY3JldHMgTWFuYWdlciBmb3Igc3RvcmVkIHBsYXRmb3JtIEpXVHMgKG1hdGNoaW5nIHRoZVxuICogYHBpcGVsaW5lLWJ1aWxkZXIvPG9yZ0lkPi9wbGF0Zm9ybWAgbmFtaW5nIGNvbnZlbnRpb24gdXNlZCBieSBgc3RvcmUtdG9rZW5gKVxuICogYW5kIHJlcG9ydHMgd2hpY2ggc2VjcmV0cyBhcmUgZXhwaXJlZCBvciBjbG9zZSB0byBleHBpcmluZy5cbiAqXG4gKiBEZXNpZ25lZCBmb3IgY3JvbiB1c2U6XG4gKiAgIC0gRXhpdHMgMCB3aGVuIG5vdGhpbmcgaXMgYXQtcmlzay5cbiAqICAgLSBFeGl0cyAxIHdoZW4gYXQgbGVhc3Qgb25lIHNlY3JldCBpcyBleHBpcmVkIG9yIGV4cGlyZXMgd2l0aGluIGAtLXdhcm4tZGF5c2AuXG4gKiAgIC0gRXhpdHMgMiBvbiBBV1MgZXJyb3JzIC8gc2NhbiBmYWlsdXJlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgYmFzaFxuICogcGlwZWxpbmUtbWFuYWdlciBhdWRpdCB0b2tlbnMgLS1yZWdpb24gdXMtZWFzdC0xIC0td2Fybi1kYXlzIDdcbiAqIHBpcGVsaW5lLW1hbmFnZXIgYXVkaXQgdG9rZW5zIC0tcmVnaW9uIHVzLWVhc3QtMSAtLWpzb25cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXVkaXRUb2tlbnMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICB3aXRoUmVnaW9uT3B0aW9uKHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCd0b2tlbnMnKVxuICAgICAgLmRlc2NyaXB0aW9uKCdTY2FuIHN0b3JlZCBwbGF0Zm9ybSB0b2tlbnMgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBhbmQgcmVwb3J0IHVwY29taW5nIGV4cGlyYXRpb25zJykpLFxuICApXG4gICAgLm9wdGlvbignLS13YXJuLWRheXMgPGRheXM+JywgJ0ZsYWcgdG9rZW5zIGV4cGlyaW5nIHdpdGhpbiBOIGRheXMgYXMgYXQtcmlzaycsICc3JylcbiAgICAub3B0aW9uKCctLXByZWZpeCA8cHJlZml4PicsICdTZWNyZXRzIE1hbmFnZXIgbmFtZSBwcmVmaXggdG8gc2NhbicsIGAke0NvcmVDb25zdGFudHMuU0VDUkVUU19QQVRIX1BSRUZJWH0vYClcbiAgICAub3B0aW9uKCctLWpzb24nLCAnT3V0cHV0IHJlc3VsdHMgYXMgSlNPTicsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdBdWRpdCBUb2tlbnMnLCB1bmRlZmluZWQsIHsgcXVpZXQ6IG9wdGlvbnMuanNvbiB9KTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgY29uc3Qgd2FybkRheXMgPSBwYXJzZUludChvcHRpb25zLndhcm5EYXlzLCAxMCk7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh3YXJuRGF5cykgfHwgd2FybkRheXMgPCAwKSB7XG4gICAgICAgIHByaW50RXJyb3IoJ0ludmFsaWQgLS13YXJuLWRheXMgdmFsdWUnLCB7IHByb3ZpZGVkOiBvcHRpb25zLndhcm5EYXlzIH0pO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFByb2dyZXNzIGdvZXMgdG8gc3Rkb3V0LCBzbyBzdXBwcmVzcyBpdCBpbiAtLWpzb24gbW9kZSB0byBrZWVwIHRoZSBKU09OIHBheWxvYWQgY2xlYW4gZm9yIHBpcGluZy5cbiAgICAgICAgaWYgKCFvcHRpb25zLmpzb24pIHByaW50SW5mbygnTGlzdGluZyBzZWNyZXRzJywgeyByZWdpb24sIHByZWZpeDogb3B0aW9ucy5wcmVmaXggfSk7XG4gICAgICAgIGNvbnN0IHsgc2VjcmV0cywgdHJ1bmNhdGVkIH0gPSBhd2FpdCBsaXN0U2VjcmV0cyhvcHRpb25zLnByZWZpeCwgeyByZWdpb24sIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9KTtcbiAgICAgICAgaWYgKHRydW5jYXRlZCkge1xuICAgICAgICAgIC8vIEEgdHJ1bmNhdGVkIHN3ZWVwIG1lYW5zIGFuIGV4cGlyaW5nIHRva2VuIHBhc3QgdGhlIGNhcCBjb3VsZCBiZSBtaXNzZWQg4oCUXG4gICAgICAgICAgLy8gbmV2ZXIgcmVwb3J0IFwiYWxsIGNsZWFyXCIgZnJvbSBhbiBpbmNvbXBsZXRlIHNjYW4gKG1pcnJvcnMgYXVkaXQtc3RhY2tzKS5cbiAgICAgICAgICBwcmludFdhcm5pbmcoJ1NlY3JldCBsaXN0aW5nIHdhcyBUUlVOQ0FURUQgKHBhZ2luZyBjYXAgaGl0KSDigJQgcmVzdWx0cyBtYXkgYmUgSU5DT01QTEVURSBhbmQgYW4gZXhwaXJpbmcgdG9rZW4gY291bGQgYmUgbWlzc2VkLiBOYXJyb3cgYnkgLS1wcmVmaXgvLS1yZWdpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdWRpdCBldmVyeSBzdG9yZWQgbWFjaGluZSBjcmVkZW50aWFsOiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0ga2V5XG4gICAgICAgIC8vIChgPHByZWZpeD4vPG9yZ0lkPi9wbGF0Zm9ybWApIGFuZCBlYWNoIFNDT1BFRCBvbmUgKGAuLi4vcmVwb3J0aW5nLWluZ2VzdGAsXG4gICAgICAgIC8vIGAuLi4vcmVnaXN0cnktcHVzaGAsIGZyb20gYHN0b3JlLXRva2VuIC0tc2NvcGUg4oCmYCkuIEFsbCBleHBpcmUgYW5kIGFsbFxuICAgICAgICAvLyBhcmUgYXV0by1yb3RhdGVkLCBzbyBhIHN0YWxsZWQgcm90YXRpb24gb24gYW55IG9mIHRoZW0gbXVzdCBzdXJmYWNlIGhlcmUuXG4gICAgICAgIGNvbnN0IENSRURFTlRJQUxfTEVBVkVTID0gWycvcGxhdGZvcm0nLCAnL3JlcG9ydGluZy1pbmdlc3QnLCAnL3JlZ2lzdHJ5LXB1c2gnXTtcbiAgICAgICAgY29uc3QgcGxhdGZvcm1TZWNyZXRzID0gc2VjcmV0cy5maWx0ZXIoKHMpID0+IENSRURFTlRJQUxfTEVBVkVTLnNvbWUoKGxlYWYpID0+IHMubmFtZS5lbmRzV2l0aChsZWFmKSkpO1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXM6IFRva2VuQXVkaXRFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHdhcm5DdXRvZmYgPSBub3cgKyB3YXJuRGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHBsYXRmb3JtU2VjcmV0cykge1xuICAgICAgICAgIGxldCByYXc6IHN0cmluZztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmF3ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUocy5uYW1lLCB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKGBDb3VsZCBub3QgcmVhZCAke3MubmFtZX06ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcGFyc2VkOiB7IHBhc3N3b3JkPzogc3RyaW5nOyBleHBpcmVzQXQ/OiBzdHJpbmc7IHBsYXRmb3JtVXJsPzogc3RyaW5nIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgU2VjcmV0ICR7cy5uYW1lfSBpcyBub3QgdmFsaWQgSlNPTiwgc2tpcHBpbmdgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGBleHBpcmVzQXRgIGlzIHRoZSBPTkxZIGV4cGlyeSBzb3VyY2Ugbm93LiBUaGUgc3RvcmVkIGNyZWRlbnRpYWwgaXMgYW5cbiAgICAgICAgICAvLyBvcGFxdWUgc2VydmljZS1hY2NvdW50IGtleTogaXQgY2FycmllcyBubyBjbGFpbXMsIHNvIHRoZXJlIGlzIG5vIGBleHBgXG4gICAgICAgICAgLy8gdG8gZGVjb2RlIGFzIGEgZmFsbGJhY2sg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHN0b3JlLXRva2VuIGFuZCB0aGVcbiAgICAgICAgICAvLyByb3RhdG9yIGJvdGggd3JpdGUgdGhlIGZpZWxkLlxuICAgICAgICAgIGxldCBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHBhcnNlZC5leHBpcmVzQXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShwYXJzZWQuZXhwaXJlc0F0KTtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSkgZXhwaXJlc0F0ID0gZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFleHBpcmVzQXQpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhgU2VjcmV0ICR7cy5uYW1lfSBoYXMgbm8gZXhwaXJ5IGluZm9ybWF0aW9uLCBza2lwcGluZ2ApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGF5c1VudGlsRXhwaXJ5ID0gTWF0aC5mbG9vcigoZXhwaXJlc0F0LmdldFRpbWUoKSAtIG5vdykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgIGxldCBzdGF0dXM6IFRva2VuQXVkaXRFbnRyeVsnc3RhdHVzJ10gPVxuICAgICAgICAgICAgZXhwaXJlc0F0LmdldFRpbWUoKSA8IG5vdyA/ICdleHBpcmVkJ1xuICAgICAgICAgICAgICA6IGV4cGlyZXNBdC5nZXRUaW1lKCkgPCB3YXJuQ3V0b2ZmID8gJ2V4cGlyaW5nLXNvb24nXG4gICAgICAgICAgICAgICAgOiAnb2snO1xuXG4gICAgICAgICAgLy8gQSBzZWNyZXQgdGhhdCBzdGlsbCBoYXMgbW9udGhzIG9mIGxpZmUgYnV0IGhvbGRzIHRoZSBXUk9ORyBLSU5EIG9mXG4gICAgICAgICAgLy8gY3JlZGVudGlhbCBpcyBqdXN0IGFzIGRlYWQgYXMgYW4gZXhwaXJlZCBvbmUuIEFmdGVyIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAgICAgICAvLyBjdXRvdmVyIHRoZSBzdG9yZWQgdmFsdWUgbXVzdCBiZSBhbiBvcGFxdWUgYHBiX3NhX+KApmAga2V5OyBhIHNlY3JldCBsZWZ0XG4gICAgICAgICAgLy8gaG9sZGluZyBhIHByZS1jdXRvdmVyIG1hY2hpbmUtc2Vzc2lvbiBKV1QgaXMgcmVmdXNlZCBieSBldmVyeSBjb25zdW1lcixcbiAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgc2NhbiB0aGF0IG5hbWVzIGl0IGluc3RlYWQgb2YgbGVhdmluZyB0aHJlZSBzZXJ2aWNlcyB0b1xuICAgICAgICAgIC8vIGZhaWwgd2l0aCBhbiBvcGFxdWUgNDAxLlxuICAgICAgICAgIGxldCByZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoc3RhdHVzICE9PSAnZXhwaXJlZCcgJiYgcGFyc2VkLnBhc3N3b3JkICYmICFpc09wYXF1ZUFwaUtleShwYXJzZWQucGFzc3dvcmQpKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSAndW52ZXJpZmlhYmxlJztcbiAgICAgICAgICAgIHJlYXNvbiA9IHBhcnNlZC5wYXNzd29yZC5zcGxpdCgnLicpLmxlbmd0aCA9PT0gM1xuICAgICAgICAgICAgICA/ICdob2xkcyBhIHByZS1jdXRvdmVyIEpXVCwgbm90IGEgc2VydmljZS1hY2NvdW50IGtleSDigJQgcmUtcnVuIFwicGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlblwiJ1xuICAgICAgICAgICAgICA6ICdkb2VzIG5vdCBob2xkIGFuIG9wYXF1ZSBzZXJ2aWNlLWFjY291bnQga2V5IChleHBlY3RlZCBhIFwicGJfc2Ff4oCmXCIgdmFsdWUpJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cmllcy5wdXNoKHsgc2VjcmV0TmFtZTogcy5uYW1lLCBhcm46IHMuYXJuLCBleHBpcmVzQXQsIGRheXNVbnRpbEV4cGlyeSwgc3RhdHVzLCAuLi4ocmVhc29uID8geyByZWFzb24gfSA6IHt9KSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0UmlzayA9IGVudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXR1cyAhPT0gJ29rJyk7XG4gICAgICAgIC8vIEEgdHJ1bmNhdGVkIHNjYW4gaXMgaXRzZWxmIGEgZmFpbHVyZSBjb25kaXRpb246IGV4aXQgbm9uLXplcm8gc28gY3JvblxuICAgICAgICAvLyBkb2Vzbid0IHJlYWQgYW4gaW5jb21wbGV0ZSBcImFsbCBjbGVhclwiIGFzIHN1Y2Nlc3MuXG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gKGF0Umlzay5sZW5ndGggPiAwIHx8IHRydW5jYXRlZCkgPyAxIDogMDtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2Nhbm5lZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICB3YXJuRGF5cyxcbiAgICAgICAgICAgIHRvdGFsU2Nhbm5lZDogZW50cmllcy5sZW5ndGgsXG4gICAgICAgICAgICBhdFJpc2tDb3VudDogYXRSaXNrLmxlbmd0aCxcbiAgICAgICAgICAgIHRydW5jYXRlZCxcbiAgICAgICAgICAgIGVudHJpZXM6IGVudHJpZXMubWFwKChlKSA9PiAoeyAuLi5lLCBleHBpcmVzQXQ6IGUuZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCkgfSkpLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50U2VjdGlvbignQXVkaXQgUmVzdWx0cycpO1xuICAgICAgICAgIHByaW50SW5mbyhgU2Nhbm5lZCAke2VudHJpZXMubGVuZ3RofSBwbGF0Zm9ybSBzZWNyZXQke2VudHJpZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9YCk7XG4gICAgICAgICAgaWYgKGF0Umlzay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0cnVuY2F0ZWQpIHtcbiAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBhdC1yaXNrIHRva2VucyBpbiB0aGUgc2Nhbm5lZCBwYWdlcywgYnV0IHRoZSBzY2FuIHdhcyB0cnVuY2F0ZWQg4oCUIHNvbWUgc2VjcmV0cyB3ZXJlIG5vdCBjaGVja2VkLicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHJpbnRTdWNjZXNzKGBBbGwgc3RvcmVkIGtleXMgdmFsaWQgZm9yIGF0IGxlYXN0ICR7d2FybkRheXN9IGRheXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGF0Umlzaykge1xuICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGUuc3RhdHVzID09PSAnZXhwaXJlZCdcbiAgICAgICAgICAgICAgICA/IGBFWFBJUkVEICR7TWF0aC5hYnMoZS5kYXlzVW50aWxFeHBpcnkpfSBkYXkke2UuZGF5c1VudGlsRXhwaXJ5ID09PSAtMSA/ICcnIDogJ3MnfSBhZ29gXG4gICAgICAgICAgICAgICAgOiBlLnN0YXR1cyA9PT0gJ3VudmVyaWZpYWJsZSdcbiAgICAgICAgICAgICAgICAgID8gYFVOVVNBQkxFIOKAlCAke2UucmVhc29ufWBcbiAgICAgICAgICAgICAgICAgIDogYGV4cGlyZXMgaW4gJHtlLmRheXNVbnRpbEV4cGlyeX0gZGF5JHtlLmRheXNVbnRpbEV4cGlyeSA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gICAgICAgICAgICAgIHByaW50V2FybmluZyhgJHtlLnNlY3JldE5hbWV9IOKAlCAke2xhYmVsfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpbnRFcnJvcihgJHthdFJpc2subGVuZ3RofSBzZWNyZXQke2F0Umlzay5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gbmVlZCByb3RhdGlvbi4gUnVuIFxcYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzIDxOPlxcYCAoYWRkIC0tc2NvcGUgZm9yIGEgc2NvcGVkIGNyZWRlbnRpYWwpIHRvIHJlaXNzdWUuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnYXVkaXQtdG9rZW5zJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"create-pat.d.ts","sources":["../../src/commands/create-pat.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiJhD"}
1
+ {"version":3,"file":"create-pat.d.ts","sources":["../../src/commands/create-pat.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJhD"}