@aws-cdk/toolkit-lib 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,451 +1,64 @@
1
1
  "use strict";
2
- /*
3
- * The Cloudformation refactoring API needs, in addition to the mappings, the
4
- * resulting templates for each affected stack. The resulting templates are
5
- * basically the synthesis produced, but with some differences:
6
- *
7
- * - Resources that exist in the local stacks, but not in the remote stacks, are
8
- * not included.
9
- * - Resources that exist in the remote stacks, but not in the local stacks, are
10
- * preserved.
11
- * - For resources that exist in both stacks, but have different properties, the
12
- * deployed properties are used, but the references may need to be updated, if
13
- * the resources they reference were moved in the refactoring.
14
- *
15
- * Why does the last difference exist, to begin with? By default, to establish
16
- * whether two given resources are the same, roughly speaking we compute the hash
17
- * of their properties and compare them. But there is a better source of resource
18
- * identity, that we can exploit when it is present: the physical name. In such
19
- * cases, we can track a resource move even if the properties are different, as
20
- * long as the physical name is the same.
21
- *
22
- * The process of computing the resulting templates consists in:
23
- *
24
- * 1. Computing a graph of deployed resources.
25
- * 2. Mapping edges and nodes according to the mappings (that we either
26
- * computed or got directly from the user).
27
- * 3. Computing the resulting templates by traversing the graph and
28
- * collecting the resources that are not mapped out, and updating the
29
- * references to the resources that were moved.
30
- */
31
2
  Object.defineProperty(exports, "__esModule", { value: true });
32
3
  exports.generateStackDefinitions = generateStackDefinitions;
33
- const cloudformation_1 = require("./cloudformation");
34
- const toolkit_error_1 = require("../../toolkit/toolkit-error");
4
+ // namespace object imports won't work in the bundle for function exports
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const deepEqual = require('fast-deep-equal');
35
7
  function generateStackDefinitions(mappings, deployedStacks, localStacks) {
36
- const localExports = indexExports(localStacks);
37
- const deployedExports = indexExports(deployedStacks);
38
- const edgeMapper = new EdgeMapper(mappings);
39
- // Build a graph of the deployed stacks
40
- const deployedGraph = graph(deployedStacks, deployedExports);
41
- // Map all the edges, including their endpoints, to their new locations.
42
- const edges = edgeMapper.mapEdges(deployedGraph.edges);
43
- // All the edges have been mapped, which means that isolated nodes were left behind. Map them too.
44
- const nodes = mapNodes(deployedGraph.isolatedNodes, mappings);
45
- // Now we can generate the templates for each stack
46
- const templates = generateTemplates(edges, nodes, edgeMapper.affectedStackNames, localExports, deployedStacks);
47
- // Finally, generate the stack definitions, to be included in the refactor request.
48
- return Object.entries(templates).map(([stackName, template]) => ({
49
- StackName: stackName,
50
- TemplateBody: JSON.stringify(template),
51
- }));
52
- }
53
- function graph(deployedStacks, deployedExports) {
54
- const deployedNodeMap = buildNodes(deployedStacks);
55
- const deployedNodes = Array.from(deployedNodeMap.values());
56
- const edges = buildEdges(deployedNodeMap, deployedExports);
57
- const isolatedNodes = deployedNodes.filter((node) => {
58
- return !edges.some((edge) => edge.source.location.equalTo(node.location) ||
59
- edge.targets.some((target) => target.location.equalTo(node.location)));
60
- });
61
- return { edges, isolatedNodes };
62
- }
63
- function buildNodes(stacks) {
64
- const result = new Map();
65
- for (const stack of stacks) {
66
- const template = stack.template;
67
- for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
68
- const location = new cloudformation_1.ResourceLocation(stack, logicalId);
69
- result.set(`${stack.stackName}.${logicalId}`, {
70
- location,
71
- rawValue: resource,
72
- });
73
- }
74
- }
75
- return result;
76
- }
77
- function buildEdges(nodeMap, exports) {
78
- const nodes = Array.from(nodeMap.values());
79
- return nodes.flatMap((node) => buildEdgesForResource(node, node.rawValue));
80
- function buildEdgesForResource(source, value, path = []) {
81
- if (!value || typeof value !== 'object')
82
- return [];
83
- if (Array.isArray(value)) {
84
- return value.flatMap((x, index) => buildEdgesForResource(source, x, path.concat(String(index))));
85
- }
86
- if ('Ref' in value) {
87
- return [makeRef(source.location.stack.stackName, value.Ref)];
88
- }
89
- if ('Fn::GetAtt' in value) {
90
- return [makeGetAtt(source.location.stack.stackName, value['Fn::GetAtt'])];
91
- }
92
- if ('Fn::ImportValue' in value) {
93
- const exportName = value['Fn::ImportValue'];
94
- const x = exports[exportName];
95
- if ('Ref' in x.value) {
96
- return [
97
- {
98
- ...makeRef(x.stackName, x.value.Ref),
99
- reference: new ImportValue(Ref.INSTANCE),
100
- },
101
- ];
102
- }
103
- if ('Fn::GetAtt' in x.value) {
104
- const getAtt = makeGetAtt(x.stackName, x.value['Fn::GetAtt']);
105
- return [
106
- {
107
- ...getAtt,
108
- reference: new ImportValue(getAtt.reference),
109
- },
110
- ];
111
- }
112
- return [];
113
- }
114
- if ('Fn::Sub' in value) {
115
- let inputString;
116
- let variables;
117
- const sub = value['Fn::Sub'];
118
- if (typeof sub === 'string') {
119
- inputString = sub;
120
- }
121
- else {
122
- [inputString, variables] = sub;
123
- }
124
- let varNames = Array.from(inputString.matchAll(/\${([a-zA-Z0-9_.]+)}/g))
125
- .map((x) => x[1])
126
- .filter((varName) => (value['Fn::Sub'][1] ?? {})[varName] == null);
127
- const edges = varNames.map((varName) => {
128
- return varName.includes('.')
129
- ? makeGetAtt(source.location.stack.stackName, varName)
130
- : makeRef(source.location.stack.stackName, varName);
131
- });
132
- const edgesFromInputString = [
133
- {
134
- source,
135
- targets: edges.flatMap((edge) => edge.targets),
136
- reference: new Sub(inputString, varNames),
137
- path: path.concat('Fn::Sub', '0'),
138
- },
139
- ];
140
- const edgesFromVariables = buildEdgesForResource(source, variables, path.concat('Fn::Sub', '1'));
141
- return [...edgesFromInputString, ...edgesFromVariables];
142
- }
143
- const edges = [];
144
- // DependsOn is only handled at the top level of the resource
145
- if ('DependsOn' in value && path.length === 0) {
146
- if (typeof value.DependsOn === 'string') {
147
- edges.push({
148
- ...makeRef(source.location.stack.stackName, value.DependsOn),
149
- reference: DependsOn.INSTANCE,
150
- });
151
- }
152
- else if (Array.isArray(value.DependsOn)) {
153
- edges.push({
154
- source,
155
- targets: value.DependsOn.flatMap((dependsOn) => makeRef(source.location.stack.stackName, dependsOn).targets),
156
- path: path.concat('DependsOn'),
157
- reference: DependsOn.INSTANCE,
158
- });
159
- }
160
- }
161
- edges.push(...Object.entries(value).flatMap(([k, v]) => buildEdgesForResource(source, v, path.concat(k))));
162
- return edges;
163
- function makeRef(stackName, logicalId) {
164
- const key = `${stackName}.${logicalId}`;
165
- const target = nodeMap.get(key);
166
- return {
167
- path,
168
- source,
169
- targets: [target],
170
- reference: Ref.INSTANCE,
171
- };
8
+ const deployedStackMap = new Map(deployedStacks.map((s) => [s.stackName, s]));
9
+ // For every local stack that is also deployed, update the local template,
10
+ // overwriting its CDKMetadata resource with the one from the deployed stack
11
+ for (const localStack of localStacks) {
12
+ const deployedStack = deployedStackMap.get(localStack.stackName);
13
+ const localTemplate = localStack.template;
14
+ const deployedTemplate = deployedStack?.template;
15
+ // The CDKMetadata resource is never part of a refactor. So at this point we need
16
+ // to adjust the template we will send to the API to make sure it has the same CDKMetadata
17
+ // as the deployed template. And if the deployed template doesn't have any, we cannot
18
+ // send any either.
19
+ if (deployedTemplate?.Resources?.CDKMetadata != null) {
20
+ localTemplate.Resources = localTemplate.Resources ?? {};
21
+ localTemplate.Resources.CDKMetadata = deployedTemplate.Resources.CDKMetadata;
172
22
  }
173
- function makeGetAtt(stackName, att) {
174
- let logicalId = '';
175
- let attributeName = '';
176
- if (typeof att === 'string') {
177
- [logicalId, attributeName] = att.split(/\.(.*)/s);
178
- }
179
- else if (Array.isArray(att) && att.length === 2) {
180
- [logicalId, attributeName] = att;
181
- }
182
- const key = `${stackName}.${logicalId}`;
183
- const target = nodeMap.get(key);
184
- return {
185
- path,
186
- source,
187
- targets: [target],
188
- reference: new GetAtt(attributeName),
189
- };
23
+ else {
24
+ delete localTemplate.Resources?.CDKMetadata;
190
25
  }
191
26
  }
192
- }
193
- function mapNodes(nodes, mappings) {
194
- return nodes.map((node) => {
195
- const newLocation = mapLocation(node.location, mappings);
196
- return {
197
- location: newLocation,
198
- rawValue: node.rawValue,
199
- };
200
- });
201
- }
202
- function generateTemplates(edges, nodes, stackNames, exports, deployedStacks) {
203
- updateReferences(edges, exports);
204
- const templates = {};
205
- // Take the CloudFormation raw value of each the node and put it into the appropriate template.
206
- const allNodes = unique(edges.flatMap((e) => [e.source, ...e.targets]).concat(nodes));
207
- allNodes.forEach((node) => {
208
- const stackName = node.location.stack.stackName;
209
- const logicalId = node.location.logicalResourceId;
210
- if (templates[stackName] === undefined) {
211
- templates[stackName] = {
212
- Resources: {},
213
- };
214
- }
215
- templates[stackName].Resources[logicalId] = node.rawValue;
27
+ const stacksToProcess = localStacks.filter((localStack) => {
28
+ const deployedStack = deployedStackMap.get(localStack.stackName);
29
+ return !deployedStack || !deepEqual(localStack.template, deployedStack.template);
216
30
  });
217
- // Add outputs to the templates
218
- edges.forEach((edge) => {
219
- if (edge.reference instanceof ImportValue) {
220
- const stackName = edge.targets[0].location.stack.stackName;
221
- const template = templates[stackName];
222
- template.Outputs = {
223
- ...(template.Outputs ?? {}),
224
- ...edge.reference.output,
225
- };
226
- }
227
- });
228
- // The freshly generated templates contain only resources and outputs.
229
- // Combine them with the existing templates to preserve metadata and other properties.
230
- return Object.fromEntries(stackNames.map((stackName) => {
231
- const oldTemplate = deployedStacks.find((s) => s.stackName === stackName)?.template ?? {};
232
- const newTemplate = templates[stackName] ?? { Resources: {} };
233
- const combinedTemplate = { ...oldTemplate, ...newTemplate };
234
- sanitizeDependencies(combinedTemplate);
235
- return [stackName, combinedTemplate];
236
- }));
237
- }
238
- /**
239
- * Update the CloudFormation resources based on information from the edges.
240
- * Each edge corresponds to a path in some resource object. The value at that
241
- * path is updated to the CloudFormation value represented by the edge's annotation.
242
- */
243
- function updateReferences(edges, exports) {
244
- edges.forEach((edge) => {
245
- const cfnValue = edge.reference.toCfn(edge.targets, exports);
246
- const obj = edge.path.slice(0, edge.path.length - 1).reduce(getPropValue, edge.source.rawValue);
247
- setPropValue(obj, edge.path[edge.path.length - 1], cfnValue);
248
- });
249
- function getPropValue(obj, prop) {
250
- const index = parseInt(prop);
251
- return obj[Number.isNaN(index) ? prop : index];
252
- }
253
- function setPropValue(obj, prop, value) {
254
- const index = parseInt(prop);
255
- obj[Number.isNaN(index) ? prop : index] = value;
256
- }
257
- }
258
- class EdgeMapper {
259
- mappings;
260
- affectedStacks = new Set();
261
- nodeMap = new Map();
262
- constructor(mappings) {
263
- this.mappings = mappings;
264
- }
265
- /**
266
- * For each input edge, produce an output edge such that:
267
- * - The source and targets are mapped to their new locations
268
- * - The annotation is converted between in-stack and cross-stack references, as appropriate
269
- */
270
- mapEdges(edges) {
271
- return edges
272
- .map((edge) => {
273
- const oldSource = edge.source;
274
- const oldTargets = edge.targets;
275
- const newSource = this.mapNode(oldSource);
276
- const newTargets = oldTargets.map((t) => this.mapNode(t));
277
- const oldSourceStackName = oldSource.location.stack.stackName;
278
- const oldTargetStackName = oldTargets[0].location.stack.stackName;
279
- const newSourceStackName = newSource.location.stack.stackName;
280
- const newTargetStackName = newTargets[0].location.stack.stackName;
281
- this.affectedStacks.add(newSourceStackName);
282
- this.affectedStacks.add(newTargetStackName);
283
- this.affectedStacks.add(oldSourceStackName);
284
- this.affectedStacks.add(oldTargetStackName);
285
- let reference = edge.reference;
286
- if (oldSourceStackName === oldTargetStackName && newSourceStackName !== newTargetStackName) {
287
- if (edge.reference instanceof DependsOn) {
288
- return undefined;
289
- }
290
- // in-stack reference to cross-stack reference: wrap the old annotation
291
- reference = new ImportValue(edge.reference);
292
- }
293
- else if (oldSourceStackName !== oldTargetStackName && newSourceStackName === newTargetStackName) {
294
- // cross-stack reference to in-stack reference: unwrap the old annotation
295
- if (edge.reference instanceof ImportValue) {
296
- reference = edge.reference.reference;
297
- }
31
+ // Now, for every stack name that appears in the mappings, but is not present in the local stacks,
32
+ // we need to take its (deployed) template and remove all the resources that appear in the sources
33
+ // part of the mappings. For example, if the mappings contains an entry like:
34
+ // - StackB.Foo -> StackA.Bar
35
+ // and StackB does not exist locally, we need to take StackB's template, and remove the resource Foo,
36
+ // and include this modified template for StackB in the stack definitions.
37
+ for (let mapping of mappings) {
38
+ const stackName = mapping.source.stackName;
39
+ if (!localStacks.some(s => s.stackName === stackName)) {
40
+ const deployedStack = deployedStackMap.get(stackName);
41
+ delete deployedStack?.template.Resources?.[mapping.source.logicalResourceId];
42
+ delete deployedStack?.template.Outputs;
43
+ if (deployedStack && !stacksToProcess.some(s => s.stackName === stackName)) {
44
+ stacksToProcess.push(deployedStack);
298
45
  }
299
- return {
300
- path: edge.path,
301
- source: newSource,
302
- targets: newTargets,
303
- reference,
304
- };
305
- })
306
- .filter((edge) => edge !== undefined);
307
- }
308
- get affectedStackNames() {
309
- const fromMappings = this.mappings.flatMap((m) => [m.source.stack.stackName, m.destination.stack.stackName]);
310
- return unique([...this.affectedStacks, ...fromMappings]);
311
- }
312
- mapNode(node) {
313
- const newLocation = mapLocation(node.location, this.mappings);
314
- const key = `${newLocation.stack.stackName}.${newLocation.logicalResourceId}`;
315
- if (!this.nodeMap.has(key)) {
316
- this.nodeMap.set(key, {
317
- location: newLocation,
318
- rawValue: node.rawValue,
319
- });
320
46
  }
321
- return this.nodeMap.get(key);
322
47
  }
323
- }
324
- function mapLocation(location, mappings) {
325
- const mapping = mappings.find((m) => m.source.equalTo(location));
326
- if (mapping) {
327
- return mapping.destination;
328
- }
329
- return location;
330
- }
331
- function indexExports(stacks) {
332
- return Object.fromEntries(stacks.flatMap((s) => Object.entries(s.template.Outputs ?? {})
333
- .filter(([_, o]) => typeof o.Export?.Name === 'string' && (o.Value.Ref != null || o.Value['Fn::GetAtt'] != null))
334
- .map(([name, o]) => [o.Export.Name, { stackName: s.stackName, outputName: name, value: o.Value }])));
335
- }
336
- function unique(arr) {
337
- return Array.from(new Set(arr));
338
- }
339
- /**
340
- * Updates the DependsOn property of all resources, removing references
341
- * to resources that do not exist in the template. Unlike Refs and GetAtts,
342
- * which get transformed to ImportValues when the referenced resource is
343
- * moved to another stack, DependsOn doesn't cross stack boundaries.
344
- */
345
- function sanitizeDependencies(template) {
346
- const resources = template.Resources ?? {};
347
- for (const resource of Object.values(resources)) {
348
- if (typeof resource.DependsOn === 'string' && resources[resource.DependsOn] == null) {
349
- delete resource.DependsOn;
350
- }
351
- if (Array.isArray(resource.DependsOn)) {
352
- resource.DependsOn = resource.DependsOn.filter((dep) => resources[dep] != null);
353
- if (resource.DependsOn.length === 0) {
354
- delete resource.DependsOn;
48
+ // For stacks created by the refactor, CloudFormation does not allow Rules or Parameters
49
+ for (const stack of stacksToProcess) {
50
+ if (!deployedStacks.some(deployed => deployed.stackName === stack.stackName)) {
51
+ if ('Rules' in stack.template) {
52
+ delete stack.template.Rules;
53
+ }
54
+ if ('Parameters' in stack.template) {
55
+ delete stack.template.Parameters;
355
56
  }
356
57
  }
357
58
  }
59
+ return stacksToProcess.map((stack) => ({
60
+ StackName: stack.stackName,
61
+ TemplateBody: JSON.stringify(stack.template),
62
+ }));
358
63
  }
359
- class Ref {
360
- static INSTANCE = new Ref();
361
- constructor() {
362
- }
363
- toCfn(targets) {
364
- return { Ref: targets[0].location.logicalResourceId };
365
- }
366
- }
367
- class GetAtt {
368
- attributeName;
369
- constructor(attributeName) {
370
- this.attributeName = attributeName;
371
- }
372
- toCfn(targets) {
373
- return {
374
- 'Fn::GetAtt': [targets[0].location.logicalResourceId, this.attributeName],
375
- };
376
- }
377
- }
378
- class ImportValue {
379
- reference;
380
- outputName;
381
- outputContent;
382
- constructor(reference) {
383
- this.reference = reference;
384
- }
385
- toCfn(targets, exports) {
386
- const exp = this.findExport(targets, exports);
387
- if (exp) {
388
- this.outputName = exp[1].outputName;
389
- this.outputContent = {
390
- Value: exp[1].value,
391
- Export: {
392
- Name: exp[0],
393
- },
394
- };
395
- return { 'Fn::ImportValue': exp[0] };
396
- }
397
- // TODO better message
398
- throw new toolkit_error_1.ToolkitError('Unknown export for ImportValue: ' + JSON.stringify(this.reference));
399
- }
400
- findExport(targets, exports) {
401
- const target = targets[0];
402
- if (this.reference instanceof Ref) {
403
- return Object.entries(exports).find(([_, exportValue]) => {
404
- return (exportValue.stackName === target.location.stack.stackName &&
405
- exportValue.value.Ref === target.location.logicalResourceId);
406
- });
407
- }
408
- else {
409
- return Object.entries(exports).find(([_, exportValue]) => {
410
- const getAtt = this.reference;
411
- return (exportValue.stackName === target.location.stack.stackName &&
412
- exportValue.value['Fn::GetAtt'] &&
413
- ((exportValue.value['Fn::GetAtt'][0] === target.location.logicalResourceId &&
414
- exportValue.value['Fn::GetAtt'][1] === getAtt.attributeName) ||
415
- exportValue.value['Fn::GetAtt'] === `${target.location.logicalResourceId}.${getAtt.attributeName}`));
416
- });
417
- }
418
- }
419
- get output() {
420
- if (this.outputName == null) {
421
- throw new toolkit_error_1.ToolkitError('Cannot access output before calling toCfn');
422
- }
423
- return { [this.outputName]: this.outputContent };
424
- }
425
- }
426
- class Sub {
427
- inputString;
428
- varNames;
429
- constructor(inputString, varNames) {
430
- this.inputString = inputString;
431
- this.varNames = varNames;
432
- }
433
- toCfn(targets) {
434
- let inputString = this.inputString;
435
- this.varNames.forEach((varName, index) => {
436
- const [_, attr] = varName.split(/\.(.*)/s);
437
- const target = targets[index];
438
- inputString = inputString.replace(`\${${varName}`, `\${${target.location.logicalResourceId}${attr ? `.${attr}` : ''}`);
439
- });
440
- return inputString;
441
- }
442
- }
443
- class DependsOn {
444
- static INSTANCE = new DependsOn();
445
- constructor() {
446
- }
447
- toCfn(targets) {
448
- return targets.map((t) => t.location.logicalResourceId);
449
- }
450
- }
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZGVmaW5pdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFjay1kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7O0FBT0gsNERBMEJDO0FBN0JELHFEQUFvRDtBQUNwRCwrREFBMkQ7QUFFM0QsU0FBZ0Isd0JBQXdCLENBQ3RDLFFBQTJCLEVBQzNCLGNBQXFDLEVBQ3JDLFdBQWtDO0lBRWxDLE1BQU0sWUFBWSxHQUFpQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0UsTUFBTSxlQUFlLEdBQWlDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1Qyx1Q0FBdUM7SUFDdkMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUU3RCx3RUFBd0U7SUFDeEUsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdkQsa0dBQWtHO0lBQ2xHLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTlELG1EQUFtRDtJQUNuRCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFL0csbUZBQW1GO0lBQ25GLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRCxTQUFTLEVBQUUsU0FBUztRQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFD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ZHMsIGluIGFkZGl0aW9uIHRvIHRoZSBtYXBwaW5ncywgdGhlXG4gKiByZXN1bHRpbmcgdGVtcGxhdGVzIGZvciBlYWNoIGFmZmVjdGVkIHN0YWNrLiBUaGUgcmVzdWx0aW5nIHRlbXBsYXRlcyBhcmVcbiAqIGJhc2ljYWxseSB0aGUgc3ludGhlc2lzIHByb2R1Y2VkLCBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzOlxuICpcbiAqIC0gUmVzb3VyY2VzIHRoYXQgZXhpc3QgaW4gdGhlIGxvY2FsIHN0YWNrcywgYnV0IG5vdCBpbiB0aGUgcmVtb3RlIHN0YWNrcywgYXJlXG4gKiAgIG5vdCBpbmNsdWRlZC5cbiAqIC0gUmVzb3VyY2VzIHRoYXQgZXhpc3QgaW4gdGhlIHJlbW90ZSBzdGFja3MsIGJ1dCBub3QgaW4gdGhlIGxvY2FsIHN0YWNrcywgYXJlXG4gKiAgIHByZXNlcnZlZC5cbiAqIC0gRm9yIHJlc291cmNlcyB0aGF0IGV4aXN0IGluIGJvdGggc3RhY2tzLCBidXQgaGF2ZSBkaWZmZXJlbnQgcHJvcGVydGllcywgdGhlXG4gKiAgIGRlcGxveWVkIHByb3BlcnRpZXMgYXJlIHVzZWQsIGJ1dCB0aGUgcmVmZXJlbmNlcyBtYXkgbmVlZCB0byBiZSB1cGRhdGVkLCBpZlxuICogICB0aGUgcmVzb3VyY2VzIHRoZXkgcmVmZXJlbmNlIHdlcmUgbW92ZWQgaW4gdGhlIHJlZmFjdG9yaW5nLlxuICpcbiAqIFdoeSBkb2VzIHRoZSBsYXN0IGRpZmZlcmVuY2UgZXhpc3QsIHRvIGJlZ2luIHdpdGg/IEJ5IGRlZmF1bHQsIHRvIGVzdGFibGlzaFxuICogd2hldGhlciB0d28gZ2l2ZW4gcmVzb3VyY2VzIGFyZSB0aGUgc2FtZSwgcm91Z2hseSBzcGVha2luZyB3ZSBjb21wdXRlIHRoZSBoYXNoXG4gKiBvZiB0aGVpciBwcm9wZXJ0aWVzIGFuZCBjb21wYXJlIHRoZW0uIEJ1dCB0aGVyZSBpcyBhIGJldHRlciBzb3VyY2Ugb2YgcmVzb3VyY2VcbiAqIGlkZW50aXR5LCB0aGF0IHdlIGNhbiBleHBsb2l0IHdoZW4gaXQgaXMgcHJlc2VudDogdGhlIHBoeXNpY2FsIG5hbWUuIEluIHN1Y2hcbiAqIGNhc2VzLCB3ZSBjYW4gdHJhY2sgYSByZXNvdXJjZSBtb3ZlIGV2ZW4gaWYgdGhlIHByb3BlcnRpZXMgYXJlIGRpZmZlcmVudCwgYXNcbiAqIGxvbmcgYXMgdGhlIHBoeXNpY2FsIG5hbWUgaXMgdGhlIHNhbWUuXG4gKlxuICogVGhlIHByb2Nlc3Mgb2YgY29tcHV0aW5nIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIGNvbnNpc3RzIGluOlxuICpcbiAqIDEuIENvbXB1dGluZyBhIGdyYXBoIG9mIGRlcGxveWVkIHJlc291cmNlcy5cbiAqIDIuIE1hcHBpbmcgZWRnZXMgYW5kIG5vZGVzIGFjY29yZGluZyB0byB0aGUgbWFwcGluZ3MgKHRoYXQgd2UgZWl0aGVyXG4gKiAgICBjb21wdXRlZCBvciBnb3QgZGlyZWN0bHkgZnJvbSB0aGUgdXNlcikuXG4gKiAzLiBDb21wdXRpbmcgdGhlIHJlc3VsdGluZyB0ZW1wbGF0ZXMgYnkgdHJhdmVyc2luZyB0aGUgZ3JhcGggYW5kXG4gKiAgICBjb2xsZWN0aW5nIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgbm90IG1hcHBlZCBvdXQsIGFuZCB1cGRhdGluZyB0aGVcbiAqICAgIHJlZmVyZW5jZXMgdG8gdGhlIHJlc291cmNlcyB0aGF0IHdlcmUgbW92ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFja0RlZmluaXRpb24gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblN0YWNrLCBDbG91ZEZvcm1hdGlvblRlbXBsYXRlLCBSZXNvdXJjZU1hcHBpbmcgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFJlc291cmNlTG9jYXRpb24gfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrRGVmaW5pdGlvbnMoXG4gIG1hcHBpbmdzOiBSZXNvdXJjZU1hcHBpbmdbXSxcbiAgZGVwbG95ZWRTdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSxcbiAgbG9jYWxTdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSxcbik6IFN0YWNrRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgbG9jYWxFeHBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBTY29wZWRFeHBvcnQ+ID0gaW5kZXhFeHBvcnRzKGxvY2FsU3RhY2tzKTtcbiAgY29uc3QgZGVwbG95ZWRFeHBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBTY29wZWRFeHBvcnQ+ID0gaW5kZXhFeHBvcnRzKGRlcGxveWVkU3RhY2tzKTtcbiAgY29uc3QgZWRnZU1hcHBlciA9IG5ldyBFZGdlTWFwcGVyKG1hcHBpbmdzKTtcblxuICAvLyBCdWlsZCBhIGdyYXBoIG9mIHRoZSBkZXBsb3llZCBzdGFja3NcbiAgY29uc3QgZGVwbG95ZWRHcmFwaCA9IGdyYXBoKGRlcGxveWVkU3RhY2tzLCBkZXBsb3llZEV4cG9ydHMpO1xuXG4gIC8vIE1hcCBhbGwgdGhlIGVkZ2VzLCBpbmNsdWRpbmcgdGhlaXIgZW5kcG9pbnRzLCB0byB0aGVpciBuZXcgbG9jYXRpb25zLlxuICBjb25zdCBlZGdlcyA9IGVkZ2VNYXBwZXIubWFwRWRnZXMoZGVwbG95ZWRHcmFwaC5lZGdlcyk7XG5cbiAgLy8gQWxsIHRoZSBlZGdlcyBoYXZlIGJlZW4gbWFwcGVkLCB3aGljaCBtZWFucyB0aGF0IGlzb2xhdGVkIG5vZGVzIHdlcmUgbGVmdCBiZWhpbmQuIE1hcCB0aGVtIHRvby5cbiAgY29uc3Qgbm9kZXMgPSBtYXBOb2RlcyhkZXBsb3llZEdyYXBoLmlzb2xhdGVkTm9kZXMsIG1hcHBpbmdzKTtcblxuICAvLyBOb3cgd2UgY2FuIGdlbmVyYXRlIHRoZSB0ZW1wbGF0ZXMgZm9yIGVhY2ggc3RhY2tcbiAgY29uc3QgdGVtcGxhdGVzID0gZ2VuZXJhdGVUZW1wbGF0ZXMoZWRnZXMsIG5vZGVzLCBlZGdlTWFwcGVyLmFmZmVjdGVkU3RhY2tOYW1lcywgbG9jYWxFeHBvcnRzLCBkZXBsb3llZFN0YWNrcyk7XG5cbiAgLy8gRmluYWxseSwgZ2VuZXJhdGUgdGhlIHN0YWNrIGRlZmluaXRpb25zLCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVmYWN0b3IgcmVxdWVzdC5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykubWFwKChbc3RhY2tOYW1lLCB0ZW1wbGF0ZV0pID0+ICh7XG4gICAgU3RhY2tOYW1lOiBzdGFja05hbWUsXG4gICAgVGVtcGxhdGVCb2R5OiBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ3JhcGgoZGVwbG95ZWRTdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSwgZGVwbG95ZWRFeHBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBTY29wZWRFeHBvcnQ+KTpcbnsgZWRnZXM6IFJlc291cmNlRWRnZVtdOyBpc29sYXRlZE5vZGVzOiBSZXNvdXJjZU5vZGVbXSB9IHtcbiAgY29uc3QgZGVwbG95ZWROb2RlTWFwOiBNYXA8c3RyaW5nLCBSZXNvdXJjZU5vZGU+ID0gYnVpbGROb2RlcyhkZXBsb3llZFN0YWNrcyk7XG4gIGNvbnN0IGRlcGxveWVkTm9kZXMgPSBBcnJheS5mcm9tKGRlcGxveWVkTm9kZU1hcC52YWx1ZXMoKSk7XG5cbiAgY29uc3QgZWRnZXMgPSBidWlsZEVkZ2VzKGRlcGxveWVkTm9kZU1hcCwgZGVwbG95ZWRFeHBvcnRzKTtcblxuICBjb25zdCBpc29sYXRlZE5vZGVzID0gZGVwbG95ZWROb2Rlcy5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICByZXR1cm4gIWVkZ2VzLnNvbWUoXG4gICAgICAoZWRnZSkgPT5cbiAgICAgICAgZWRnZS5zb3VyY2UubG9jYXRpb24uZXF1YWxUbyhub2RlLmxvY2F0aW9uKSB8fFxuICAgICAgICBlZGdlLnRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQubG9jYXRpb24uZXF1YWxUbyhub2RlLmxvY2F0aW9uKSksXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZWRnZXMsIGlzb2xhdGVkTm9kZXMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGROb2RlcyhzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IE1hcDxzdHJpbmcsIFJlc291cmNlTm9kZT4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgUmVzb3VyY2VOb2RlPigpO1xuXG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzdGFjay50ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIHJlc291cmNlXSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge30pKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKHN0YWNrLCBsb2dpY2FsSWQpO1xuICAgICAgcmVzdWx0LnNldChgJHtzdGFjay5zdGFja05hbWV9LiR7bG9naWNhbElkfWAsIHtcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJhd1ZhbHVlOiByZXNvdXJjZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWRnZXMoXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIFJlc291cmNlTm9kZT4sXG4gIGV4cG9ydHM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYW55O1xuICAgIH1cbiAgPixcbik6IFJlc291cmNlRWRnZVtdIHtcbiAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGVNYXAudmFsdWVzKCkpO1xuICByZXR1cm4gbm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gYnVpbGRFZGdlc0ZvclJlc291cmNlKG5vZGUsIG5vZGUucmF3VmFsdWUpKTtcblxuICBmdW5jdGlvbiBidWlsZEVkZ2VzRm9yUmVzb3VyY2Uoc291cmNlOiBSZXNvdXJjZU5vZGUsIHZhbHVlOiBhbnksIHBhdGg6IHN0cmluZ1tdID0gW10pOiBSZXNvdXJjZUVkZ2VbXSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZmxhdE1hcCgoeCwgaW5kZXgpID0+IGJ1aWxkRWRnZXNGb3JSZXNvdXJjZShzb3VyY2UsIHgsIHBhdGguY29uY2F0KFN0cmluZyhpbmRleCkpKSk7XG4gICAgfVxuXG4gICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gW21ha2VSZWYoc291cmNlLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZSwgdmFsdWUuUmVmKV07XG4gICAgfVxuXG4gICAgaWYgKCdGbjo6R2V0QXR0JyBpbiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFttYWtlR2V0QXR0KHNvdXJjZS5sb2NhdGlvbi5zdGFjay5zdGFja05hbWUsIHZhbHVlWydGbjo6R2V0QXR0J10pXTtcbiAgICB9XG5cbiAgICBpZiAoJ0ZuOjpJbXBvcnRWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAgIGNvbnN0IGV4cG9ydE5hbWUgPSB2YWx1ZVsnRm46OkltcG9ydFZhbHVlJ107XG4gICAgICBjb25zdCB4ID0gZXhwb3J0c1tleHBvcnROYW1lXSE7XG5cbiAgICAgIGlmICgnUmVmJyBpbiB4LnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ubWFrZVJlZih4LnN0YWNrTmFtZSwgeC52YWx1ZS5SZWYpLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiBuZXcgSW1wb3J0VmFsdWUoUmVmLklOU1RBTkNFKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHgudmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ2V0QXR0ID0gbWFrZUdldEF0dCh4LnN0YWNrTmFtZSwgeC52YWx1ZVsnRm46OkdldEF0dCddKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5nZXRBdHQsXG4gICAgICAgICAgICByZWZlcmVuY2U6IG5ldyBJbXBvcnRWYWx1ZShnZXRBdHQucmVmZXJlbmNlKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKCdGbjo6U3ViJyBpbiB2YWx1ZSkge1xuICAgICAgbGV0IGlucHV0U3RyaW5nOiBzdHJpbmc7XG4gICAgICBsZXQgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3ViID0gdmFsdWVbJ0ZuOjpTdWInXTtcbiAgICAgIGlmICh0eXBlb2Ygc3ViID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbnB1dFN0cmluZyA9IHN1YjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFtpbnB1dFN0cmluZywgdmFyaWFibGVzXSA9IHN1YjtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhck5hbWVzID0gQXJyYXkuZnJvbShpbnB1dFN0cmluZy5tYXRjaEFsbCgvXFwkeyhbYS16QS1aMC05Xy5dKyl9L2cpKVxuICAgICAgICAubWFwKCh4KSA9PiB4WzFdKVxuICAgICAgICAuZmlsdGVyKCh2YXJOYW1lKSA9PiAodmFsdWVbJ0ZuOjpTdWInXVsxXSA/PyB7fSlbdmFyTmFtZV0gPT0gbnVsbCk7XG5cbiAgICAgIGNvbnN0IGVkZ2VzID0gdmFyTmFtZXMubWFwKCh2YXJOYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiB2YXJOYW1lLmluY2x1ZGVzKCcuJylcbiAgICAgICAgICA/IG1ha2VHZXRBdHQoc291cmNlLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZSwgdmFyTmFtZSlcbiAgICAgICAgICA6IG1ha2VSZWYoc291cmNlLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZSwgdmFyTmFtZSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZWRnZXNGcm9tSW5wdXRTdHJpbmcgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0czogZWRnZXMuZmxhdE1hcCgoZWRnZSkgPT4gZWRnZS50YXJnZXRzKSxcbiAgICAgICAgICByZWZlcmVuY2U6IG5ldyBTdWIoaW5wdXRTdHJpbmcsIHZhck5hbWVzKSxcbiAgICAgICAgICBwYXRoOiBwYXRoLmNvbmNhdCgnRm46OlN1YicsICcwJyksXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBlZGdlc0Zyb21WYXJpYWJsZXMgPSBidWlsZEVkZ2VzRm9yUmVzb3VyY2Uoc291cmNlLCB2YXJpYWJsZXMsIHBhdGguY29uY2F0KCdGbjo6U3ViJywgJzEnKSk7XG5cbiAgICAgIHJldHVybiBbLi4uZWRnZXNGcm9tSW5wdXRTdHJpbmcsIC4uLmVkZ2VzRnJvbVZhcmlhYmxlc107XG4gICAgfVxuXG4gICAgY29uc3QgZWRnZXM6IFJlc291cmNlRWRnZVtdID0gW107XG5cbiAgICAvLyBEZXBlbmRzT24gaXMgb25seSBoYW5kbGVkIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHJlc291cmNlXG4gICAgaWYgKCdEZXBlbmRzT24nIGluIHZhbHVlICYmIHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLkRlcGVuZHNPbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgLi4ubWFrZVJlZihzb3VyY2UubG9jYXRpb24uc3RhY2suc3RhY2tOYW1lLCB2YWx1ZS5EZXBlbmRzT24pLFxuICAgICAgICAgIHJlZmVyZW5jZTogRGVwZW5kc09uLklOU1RBTkNFLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5EZXBlbmRzT24pKSB7XG4gICAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICB0YXJnZXRzOiB2YWx1ZS5EZXBlbmRzT24uZmxhdE1hcChcbiAgICAgICAgICAgIChkZXBlbmRzT246IHN0cmluZykgPT4gbWFrZVJlZihzb3VyY2UubG9jYXRpb24uc3RhY2suc3RhY2tOYW1lLCBkZXBlbmRzT24pLnRhcmdldHMsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBwYXRoOiBwYXRoLmNvbmNhdCgnRGVwZW5kc09uJyksXG4gICAgICAgICAgcmVmZXJlbmNlOiBEZXBlbmRzT24uSU5TVEFOQ0UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVkZ2VzLnB1c2goLi4uT2JqZWN0LmVudHJpZXModmFsdWUpLmZsYXRNYXAoKFtrLCB2XSkgPT4gYnVpbGRFZGdlc0ZvclJlc291cmNlKHNvdXJjZSwgdiwgcGF0aC5jb25jYXQoaykpKSk7XG5cbiAgICByZXR1cm4gZWRnZXM7XG5cbiAgICBmdW5jdGlvbiBtYWtlUmVmKHN0YWNrTmFtZTogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZyk6IFJlc291cmNlRWRnZSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtzdGFja05hbWV9LiR7bG9naWNhbElkfWA7XG4gICAgICBjb25zdCB0YXJnZXQgPSBub2RlTWFwLmdldChrZXkpITtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0YXJnZXRzOiBbdGFyZ2V0XSxcbiAgICAgICAgcmVmZXJlbmNlOiBSZWYuSU5TVEFOQ0UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRBdHQoc3RhY2tOYW1lOiBzdHJpbmcsIGF0dDogc3RyaW5nIHwgc3RyaW5nW10pOiBSZXNvdXJjZUVkZ2Uge1xuICAgICAgbGV0IGxvZ2ljYWxJZDogc3RyaW5nID0gJyc7XG4gICAgICBsZXQgYXR0cmlidXRlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgICBpZiAodHlwZW9mIGF0dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgW2xvZ2ljYWxJZCwgYXR0cmlidXRlTmFtZV0gPSBhdHQuc3BsaXQoL1xcLiguKikvcyk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXR0KSAmJiBhdHQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIFtsb2dpY2FsSWQsIGF0dHJpYnV0ZU5hbWVdID0gYXR0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtzdGFja05hbWV9LiR7bG9naWNhbElkfWA7XG4gICAgICBjb25zdCB0YXJnZXQgPSBub2RlTWFwLmdldChrZXkpITtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0YXJnZXRzOiBbdGFyZ2V0XSxcbiAgICAgICAgcmVmZXJlbmNlOiBuZXcgR2V0QXR0KGF0dHJpYnV0ZU5hbWUpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTm9kZXMobm9kZXM6IFJlc291cmNlTm9kZVtdLCBtYXBwaW5nczogUmVzb3VyY2VNYXBwaW5nW10pOiBSZXNvdXJjZU5vZGVbXSB7XG4gIHJldHVybiBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICBjb25zdCBuZXdMb2NhdGlvbiA9IG1hcExvY2F0aW9uKG5vZGUubG9jYXRpb24sIG1hcHBpbmdzKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5ld0xvY2F0aW9uLFxuICAgICAgcmF3VmFsdWU6IG5vZGUucmF3VmFsdWUsXG4gICAgfSBhcyBSZXNvdXJjZU5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVRlbXBsYXRlcyhcbiAgZWRnZXM6IFJlc291cmNlRWRnZVtdLFxuICBub2RlczogUmVzb3VyY2VOb2RlW10sXG4gIHN0YWNrTmFtZXM6IHN0cmluZ1tdLFxuICBleHBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBTY29wZWRFeHBvcnQ+LFxuICBkZXBsb3llZFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVjb3JkPHN0cmluZywgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZT4ge1xuICB1cGRhdGVSZWZlcmVuY2VzKGVkZ2VzLCBleHBvcnRzKTtcbiAgY29uc3QgdGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblRlbXBsYXRlPiA9IHt9O1xuXG4gIC8vIFRha2UgdGhlIENsb3VkRm9ybWF0aW9uIHJhdyB2YWx1ZSBvZiBlYWNoIHRoZSBub2RlIGFuZCBwdXQgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgdGVtcGxhdGUuXG4gIGNvbnN0IGFsbE5vZGVzID0gdW5pcXVlKGVkZ2VzLmZsYXRNYXAoKGUpID0+IFtlLnNvdXJjZSwgLi4uZS50YXJnZXRzXSkuY29uY2F0KG5vZGVzKSk7XG4gIGFsbE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBub2RlLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZTtcbiAgICBjb25zdCBsb2dpY2FsSWQgPSBub2RlLmxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgaWYgKHRlbXBsYXRlc1tzdGFja05hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlc1tzdGFja05hbWVdID0ge1xuICAgICAgICBSZXNvdXJjZXM6IHt9LFxuICAgICAgfTtcbiAgICB9XG4gICAgdGVtcGxhdGVzW3N0YWNrTmFtZV0uUmVzb3VyY2VzIVtsb2dpY2FsSWRdID0gbm9kZS5yYXdWYWx1ZTtcbiAgfSk7XG5cbiAgLy8gQWRkIG91dHB1dHMgdG8gdGhlIHRlbXBsYXRlc1xuICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgaWYgKGVkZ2UucmVmZXJlbmNlIGluc3RhbmNlb2YgSW1wb3J0VmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YWNrTmFtZSA9IGVkZ2UudGFyZ2V0c1swXS5sb2NhdGlvbi5zdGFjay5zdGFja05hbWU7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tzdGFja05hbWVdO1xuICAgICAgdGVtcGxhdGUuT3V0cHV0cyA9IHtcbiAgICAgICAgLi4uKHRlbXBsYXRlLk91dHB1dHMgPz8ge30pLFxuICAgICAgICAuLi5lZGdlLnJlZmVyZW5jZS5vdXRwdXQsXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVGhlIGZyZXNobHkgZ2VuZXJhdGVkIHRlbXBsYXRlcyBjb250YWluIG9ubHkgcmVzb3VyY2VzIGFuZCBvdXRwdXRzLlxuICAvLyBDb21iaW5lIHRoZW0gd2l0aCB0aGUgZXhpc3RpbmcgdGVtcGxhdGVzIHRvIHByZXNlcnZlIG1ldGFkYXRhIGFuZCBvdGhlciBwcm9wZXJ0aWVzLlxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHN0YWNrTmFtZXMubWFwKChzdGFja05hbWUpID0+IHtcbiAgICAgIGNvbnN0IG9sZFRlbXBsYXRlID0gZGVwbG95ZWRTdGFja3MuZmluZCgocykgPT4gcy5zdGFja05hbWUgPT09IHN0YWNrTmFtZSk/LnRlbXBsYXRlID8/IHt9O1xuICAgICAgY29uc3QgbmV3VGVtcGxhdGUgPSB0ZW1wbGF0ZXNbc3RhY2tOYW1lXSA/PyB7IFJlc291cmNlczoge30gfTtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVGVtcGxhdGUgPSB7IC4uLm9sZFRlbXBsYXRlLCAuLi5uZXdUZW1wbGF0ZSB9O1xuXG4gICAgICBzYW5pdGl6ZURlcGVuZGVuY2llcyhjb21iaW5lZFRlbXBsYXRlKTtcbiAgICAgIHJldHVybiBbc3RhY2tOYW1lLCBjb21iaW5lZFRlbXBsYXRlXTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlZGdlcy5cbiAqIEVhY2ggZWRnZSBjb3JyZXNwb25kcyB0byBhIHBhdGggaW4gc29tZSByZXNvdXJjZSBvYmplY3QuIFRoZSB2YWx1ZSBhdCB0aGF0XG4gKiBwYXRoIGlzIHVwZGF0ZWQgdG8gdGhlIENsb3VkRm9ybWF0aW9uIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBlZGdlJ3MgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUmVmZXJlbmNlcyhlZGdlczogUmVzb3VyY2VFZGdlW10sIGV4cG9ydHM6IFJlY29yZDxzdHJpbmcsIFNjb3BlZEV4cG9ydD4pIHtcbiAgZWRnZXMuZm9yRWFjaCgoZWRnZSkgPT4ge1xuICAgIGNvbnN0IGNmblZhbHVlID0gZWRnZS5yZWZlcmVuY2UudG9DZm4oZWRnZS50YXJnZXRzLCBleHBvcnRzKTtcbiAgICBjb25zdCBvYmogPSBlZGdlLnBhdGguc2xpY2UoMCwgZWRnZS5wYXRoLmxlbmd0aCAtIDEpLnJlZHVjZShnZXRQcm9wVmFsdWUsIGVkZ2Uuc291cmNlLnJhd1ZhbHVlKTtcbiAgICBzZXRQcm9wVmFsdWUob2JqLCBlZGdlLnBhdGhbZWRnZS5wYXRoLmxlbmd0aCAtIDFdLCBjZm5WYWx1ZSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFByb3BWYWx1ZShvYmo6IGFueSwgcHJvcDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHByb3ApO1xuICAgIHJldHVybiBvYmpbTnVtYmVyLmlzTmFOKGluZGV4KSA/IHByb3AgOiBpbmRleF07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRQcm9wVmFsdWUob2JqOiBhbnksIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocHJvcCk7XG4gICAgb2JqW051bWJlci5pc05hTihpbmRleCkgPyBwcm9wIDogaW5kZXhdID0gdmFsdWU7XG4gIH1cbn1cblxuY2xhc3MgRWRnZU1hcHBlciB7XG4gIHB1YmxpYyByZWFkb25seSBhZmZlY3RlZFN0YWNrczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZU1hcDogTWFwPHN0cmluZywgUmVzb3VyY2VOb2RlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZXNvdXJjZU1hcHBpbmdbXSkge1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIGlucHV0IGVkZ2UsIHByb2R1Y2UgYW4gb3V0cHV0IGVkZ2Ugc3VjaCB0aGF0OlxuICAgKiAgIC0gVGhlIHNvdXJjZSBhbmQgdGFyZ2V0cyBhcmUgbWFwcGVkIHRvIHRoZWlyIG5ldyBsb2NhdGlvbnNcbiAgICogICAtIFRoZSBhbm5vdGF0aW9uIGlzIGNvbnZlcnRlZCBiZXR3ZWVuIGluLXN0YWNrIGFuZCBjcm9zcy1zdGFjayByZWZlcmVuY2VzLCBhcyBhcHByb3ByaWF0ZVxuICAgKi9cbiAgbWFwRWRnZXMoZWRnZXM6IFJlc291cmNlRWRnZVtdKTogUmVzb3VyY2VFZGdlW10ge1xuICAgIHJldHVybiBlZGdlc1xuICAgICAgLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRTb3VyY2UgPSBlZGdlLnNvdXJjZTtcbiAgICAgICAgY29uc3Qgb2xkVGFyZ2V0cyA9IGVkZ2UudGFyZ2V0cztcbiAgICAgICAgY29uc3QgbmV3U291cmNlID0gdGhpcy5tYXBOb2RlKG9sZFNvdXJjZSk7XG4gICAgICAgIGNvbnN0IG5ld1RhcmdldHMgPSBvbGRUYXJnZXRzLm1hcCgodCkgPT4gdGhpcy5tYXBOb2RlKHQpKTtcblxuICAgICAgICBjb25zdCBvbGRTb3VyY2VTdGFja05hbWUgPSBvbGRTb3VyY2UubG9jYXRpb24uc3RhY2suc3RhY2tOYW1lO1xuICAgICAgICBjb25zdCBvbGRUYXJnZXRTdGFja05hbWUgPSBvbGRUYXJnZXRzWzBdLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZTtcblxuICAgICAgICBjb25zdCBuZXdTb3VyY2VTdGFja05hbWUgPSBuZXdTb3VyY2UubG9jYXRpb24uc3RhY2suc3RhY2tOYW1lO1xuICAgICAgICBjb25zdCBuZXdUYXJnZXRTdGFja05hbWUgPSBuZXdUYXJnZXRzWzBdLmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZTtcblxuICAgICAgICB0aGlzLmFmZmVjdGVkU3RhY2tzLmFkZChuZXdTb3VyY2VTdGFja05hbWUpO1xuICAgICAgICB0aGlzLmFmZmVjdGVkU3RhY2tzLmFkZChuZXdUYXJnZXRTdGFja05hbWUpO1xuICAgICAgICB0aGlzLmFmZmVjdGVkU3RhY2tzLmFkZChvbGRTb3VyY2VTdGFja05hbWUpO1xuICAgICAgICB0aGlzLmFmZmVjdGVkU3RhY2tzLmFkZChvbGRUYXJnZXRTdGFja05hbWUpO1xuXG4gICAgICAgIGxldCByZWZlcmVuY2U6IENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlID0gZWRnZS5yZWZlcmVuY2U7XG4gICAgICAgIGlmIChvbGRTb3VyY2VTdGFja05hbWUgPT09IG9sZFRhcmdldFN0YWNrTmFtZSAmJiBuZXdTb3VyY2VTdGFja05hbWUgIT09IG5ld1RhcmdldFN0YWNrTmFtZSkge1xuICAgICAgICAgIGlmIChlZGdlLnJlZmVyZW5jZSBpbnN0YW5jZW9mIERlcGVuZHNPbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbi1zdGFjayByZWZlcmVuY2UgdG8gY3Jvc3Mtc3RhY2sgcmVmZXJlbmNlOiB3cmFwIHRoZSBvbGQgYW5ub3RhdGlvblxuICAgICAgICAgIHJlZmVyZW5jZSA9IG5ldyBJbXBvcnRWYWx1ZShlZGdlLnJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkU291cmNlU3RhY2tOYW1lICE9PSBvbGRUYXJnZXRTdGFja05hbWUgJiYgbmV3U291cmNlU3RhY2tOYW1lID09PSBuZXdUYXJnZXRTdGFja05hbWUpIHtcbiAgICAgICAgICAvLyBjcm9zcy1zdGFjayByZWZlcmVuY2UgdG8gaW4tc3RhY2sgcmVmZXJlbmNlOiB1bndyYXAgdGhlIG9sZCBhbm5vdGF0aW9uXG4gICAgICAgICAgaWYgKGVkZ2UucmVmZXJlbmNlIGluc3RhbmNlb2YgSW1wb3J0VmFsdWUpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVkZ2UucmVmZXJlbmNlLnJlZmVyZW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhdGg6IGVkZ2UucGF0aCxcbiAgICAgICAgICBzb3VyY2U6IG5ld1NvdXJjZSxcbiAgICAgICAgICB0YXJnZXRzOiBuZXdUYXJnZXRzLFxuICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChlZGdlKSA9PiBlZGdlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgZ2V0IGFmZmVjdGVkU3RhY2tOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZnJvbU1hcHBpbmdzID0gdGhpcy5tYXBwaW5ncy5mbGF0TWFwKChtKSA9PiBbbS5zb3VyY2Uuc3RhY2suc3RhY2tOYW1lLCBtLmRlc3RpbmF0aW9uLnN0YWNrLnN0YWNrTmFtZV0pO1xuICAgIHJldHVybiB1bmlxdWUoWy4uLnRoaXMuYWZmZWN0ZWRTdGFja3MsIC4uLmZyb21NYXBwaW5nc10pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBOb2RlKG5vZGU6IFJlc291cmNlTm9kZSk6IFJlc291cmNlTm9kZSB7XG4gICAgY29uc3QgbmV3TG9jYXRpb24gPSBtYXBMb2NhdGlvbihub2RlLmxvY2F0aW9uLCB0aGlzLm1hcHBpbmdzKTtcbiAgICBjb25zdCBrZXkgPSBgJHtuZXdMb2NhdGlvbi5zdGFjay5zdGFja05hbWV9LiR7bmV3TG9jYXRpb24ubG9naWNhbFJlc291cmNlSWR9YDtcbiAgICBpZiAoIXRoaXMubm9kZU1hcC5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5ub2RlTWFwLnNldChrZXksIHtcbiAgICAgICAgbG9jYXRpb246IG5ld0xvY2F0aW9uLFxuICAgICAgICByYXdWYWx1ZTogbm9kZS5yYXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ub2RlTWFwLmdldChrZXkpITtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBMb2NhdGlvbihsb2NhdGlvbjogUmVzb3VyY2VMb2NhdGlvbiwgbWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ1tdKTogUmVzb3VyY2VMb2NhdGlvbiB7XG4gIGNvbnN0IG1hcHBpbmcgPSBtYXBwaW5ncy5maW5kKChtKSA9PiBtLnNvdXJjZS5lcXVhbFRvKGxvY2F0aW9uKSk7XG4gIGlmIChtYXBwaW5nKSB7XG4gICAgcmV0dXJuIG1hcHBpbmcuZGVzdGluYXRpb247XG4gIH1cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG5mdW5jdGlvbiBpbmRleEV4cG9ydHMoc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBSZWNvcmQ8c3RyaW5nLCBTY29wZWRFeHBvcnQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzdGFja3MuZmxhdE1hcCgocykgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKHMudGVtcGxhdGUuT3V0cHV0cyA/PyB7fSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoW18sIG9dKSA9PiB0eXBlb2Ygby5FeHBvcnQ/Lk5hbWUgPT09ICdzdHJpbmcnICYmIChvLlZhbHVlLlJlZiAhPSBudWxsIHx8IG8uVmFsdWVbJ0ZuOjpHZXRBdHQnXSAhPSBudWxsKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChbbmFtZSwgb10pID0+IFtvLkV4cG9ydC5OYW1lLCB7IHN0YWNrTmFtZTogcy5zdGFja05hbWUsIG91dHB1dE5hbWU6IG5hbWUsIHZhbHVlOiBvLlZhbHVlIH1dKSxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiB1bmlxdWU8VD4oYXJyOiBBcnJheTxUPikge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycikpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIERlcGVuZHNPbiBwcm9wZXJ0eSBvZiBhbGwgcmVzb3VyY2VzLCByZW1vdmluZyByZWZlcmVuY2VzXG4gKiB0byByZXNvdXJjZXMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHRlbXBsYXRlLiBVbmxpa2UgUmVmcyBhbmQgR2V0QXR0cyxcbiAqIHdoaWNoIGdldCB0cmFuc2Zvcm1lZCB0byBJbXBvcnRWYWx1ZXMgd2hlbiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSBpc1xuICogbW92ZWQgdG8gYW5vdGhlciBzdGFjaywgRGVwZW5kc09uIGRvZXNuJ3QgY3Jvc3Mgc3RhY2sgYm91bmRhcmllcy5cbiAqL1xuZnVuY3Rpb24gc2FuaXRpemVEZXBlbmRlbmNpZXModGVtcGxhdGU6IENsb3VkRm9ybWF0aW9uVGVtcGxhdGUpIHtcbiAgY29uc3QgcmVzb3VyY2VzID0gdGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9O1xuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIE9iamVjdC52YWx1ZXMocmVzb3VyY2VzKSkge1xuICAgIGlmICh0eXBlb2YgcmVzb3VyY2UuRGVwZW5kc09uID09PSAnc3RyaW5nJyAmJiByZXNvdXJjZXNbcmVzb3VyY2UuRGVwZW5kc09uXSA9PSBudWxsKSB7XG4gICAgICBkZWxldGUgcmVzb3VyY2UuRGVwZW5kc09uO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc291cmNlLkRlcGVuZHNPbikpIHtcbiAgICAgIHJlc291cmNlLkRlcGVuZHNPbiA9IHJlc291cmNlLkRlcGVuZHNPbi5maWx0ZXIoKGRlcCkgPT4gcmVzb3VyY2VzW2RlcF0gIT0gbnVsbCk7XG4gICAgICBpZiAocmVzb3VyY2UuRGVwZW5kc09uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgcmVzb3VyY2UuRGVwZW5kc09uO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgU2NvcGVkRXhwb3J0IHtcbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIG91dHB1dE5hbWU6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTm9kZSB7XG4gIGxvY2F0aW9uOiBSZXNvdXJjZUxvY2F0aW9uO1xuICByYXdWYWx1ZTogYW55O1xufVxuXG4vKipcbiAqIEFuIGVkZ2UgaW4gdGhlIHJlc291cmNlIGdyYXBoLCByZXByZXNlbnRpbmcgYSByZWZlcmVuY2UgZnJvbSBvbmUgcmVzb3VyY2VcbiAqIHRvIG9uZSBvciBtb3JlIHRhcmdldCByZXNvdXJjZXMuIChUZWNobmljYWxseSwgYSBoeXBlcmVkZ2UuKVxuICovXG5pbnRlcmZhY2UgUmVzb3VyY2VFZGdlIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcmVzb3VyY2Ugb2YgdGhlIGVkZ2UuXG4gICAqL1xuICBzb3VyY2U6IFJlc291cmNlTm9kZTtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCByZXNvdXJjZXMgb2YgdGhlIGVkZ2UuIEluIGNhc2Ugb2YgRGVwZW5kc09uLFxuICAgKiB0aGlzIGNhbiBiZSBtdWx0aXBsZSByZXNvdXJjZXMuXG4gICAqL1xuICB0YXJnZXRzOiBSZXNvdXJjZU5vZGVbXTtcblxuICAvKipcbiAgICogVGhlIHBhdGggaW4gdGhlIHNvdXJjZSByZXNvdXJjZSB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwYXRoOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIENsb3VkRm9ybWF0aW9uIHJlZmVyZW5jZSB0aGF0IHRoaXMgZWRnZSByZXByZXNlbnRzLlxuICAgKi9cbiAgcmVmZXJlbmNlOiBDbG91ZEZvcm1hdGlvblJlZmVyZW5jZTtcbn1cblxuaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlIHtcbiAgdG9DZm4odGFyZ2V0czogUmVzb3VyY2VOb2RlW10sIGV4cG9ydHM6IFJlY29yZDxzdHJpbmcsIFNjb3BlZEV4cG9ydD4pOiBhbnk7XG59XG5cbmNsYXNzIFJlZiBpbXBsZW1lbnRzIENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlIHtcbiAgcHVibGljIHN0YXRpYyBJTlNUQU5DRSA9IG5ldyBSZWYoKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgdG9DZm4odGFyZ2V0czogUmVzb3VyY2VOb2RlW10pOiBhbnkge1xuICAgIHJldHVybiB7IFJlZjogdGFyZ2V0c1swXS5sb2NhdGlvbi5sb2dpY2FsUmVzb3VyY2VJZCB9O1xuICB9XG59XG5cbmNsYXNzIEdldEF0dCBpbXBsZW1lbnRzIENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGF0dHJpYnV0ZU5hbWU6IHN0cmluZykge1xuICB9XG5cbiAgdG9DZm4odGFyZ2V0czogUmVzb3VyY2VOb2RlW10pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAnRm46OkdldEF0dCc6IFt0YXJnZXRzWzBdLmxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkLCB0aGlzLmF0dHJpYnV0ZU5hbWVdLFxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgSW1wb3J0VmFsdWUgaW1wbGVtZW50cyBDbG91ZEZvcm1hdGlvblJlZmVyZW5jZSB7XG4gIHByaXZhdGUgb3V0cHV0TmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBvdXRwdXRDb250ZW50PzogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSByZWZlcmVuY2U6IENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlKSB7XG4gIH1cblxuICB0b0Nmbih0YXJnZXRzOiBSZXNvdXJjZU5vZGVbXSwgZXhwb3J0czogUmVjb3JkPHN0cmluZywgU2NvcGVkRXhwb3J0Pik6IGFueSB7XG4gICAgY29uc3QgZXhwID0gdGhpcy5maW5kRXhwb3J0KHRhcmdldHMsIGV4cG9ydHMpO1xuICAgIGlmIChleHApIHtcbiAgICAgIHRoaXMub3V0cHV0TmFtZSA9IGV4cFsxXS5vdXRwdXROYW1lO1xuICAgICAgdGhpcy5vdXRwdXRDb250ZW50ID0ge1xuICAgICAgICBWYWx1ZTogZXhwWzFdLnZhbHVlLFxuICAgICAgICBFeHBvcnQ6IHtcbiAgICAgICAgICBOYW1lOiBleHBbMF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgJ0ZuOjpJbXBvcnRWYWx1ZSc6IGV4cFswXSB9O1xuICAgIH1cbiAgICAvLyBUT0RPIGJldHRlciBtZXNzYWdlXG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5rbm93biBleHBvcnQgZm9yIEltcG9ydFZhbHVlOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5yZWZlcmVuY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEV4cG9ydCh0YXJnZXRzOiBSZXNvdXJjZU5vZGVbXSwgZXhwb3J0czogUmVjb3JkPHN0cmluZywgU2NvcGVkRXhwb3J0Pikge1xuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbMF07XG4gICAgaWYgKHRoaXMucmVmZXJlbmNlIGluc3RhbmNlb2YgUmVmKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXhwb3J0cykuZmluZCgoW18sIGV4cG9ydFZhbHVlXSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGV4cG9ydFZhbHVlLnN0YWNrTmFtZSA9PT0gdGFyZ2V0LmxvY2F0aW9uLnN0YWNrLnN0YWNrTmFtZSAmJlxuICAgICAgICAgIGV4cG9ydFZhbHVlLnZhbHVlLlJlZiA9PT0gdGFyZ2V0LmxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGV4cG9ydHMpLmZpbmQoKFtfLCBleHBvcnRWYWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZ2V0QXR0ID0gdGhpcy5yZWZlcmVuY2UgYXMgR2V0QXR0O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZXhwb3J0VmFsdWUuc3RhY2tOYW1lID09PSB0YXJnZXQubG9jYXRpb24uc3RhY2suc3RhY2tOYW1lICYmXG4gICAgICAgICAgZXhwb3J0VmFsdWUudmFsdWVbJ0ZuOjpHZXRBdHQnXSAmJlxuICAgICAgICAgICgoZXhwb3J0VmFsdWUudmFsdWVbJ0ZuOjpHZXRBdHQnXVswXSA9PT0gdGFyZ2V0LmxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkICYmXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlLnZhbHVlWydGbjo6R2V0QXR0J11bMV0gPT09IGdldEF0dC5hdHRyaWJ1dGVOYW1lKSB8fFxuICAgICAgICAgICAgZXhwb3J0VmFsdWUudmFsdWVbJ0ZuOjpHZXRBdHQnXSA9PT0gYCR7dGFyZ2V0LmxvY2F0aW9uLmxvZ2ljYWxSZXNvdXJjZUlkfS4ke2dldEF0dC5hdHRyaWJ1dGVOYW1lfWApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgb3V0cHV0KCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICh0aGlzLm91dHB1dE5hbWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ2Fubm90IGFjY2VzcyBvdXRwdXQgYmVmb3JlIGNhbGxpbmcgdG9DZm4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgW3RoaXMub3V0cHV0TmFtZV06IHRoaXMub3V0cHV0Q29udGVudCB9O1xuICB9XG59XG5cbmNsYXNzIFN1YiBpbXBsZW1lbnRzIENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlucHV0U3RyaW5nOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSB2YXJOYW1lczogc3RyaW5nW10pIHtcbiAgfVxuXG4gIHRvQ2ZuKHRhcmdldHM6IFJlc291cmNlTm9kZVtdKTogYW55IHtcbiAgICBsZXQgaW5wdXRTdHJpbmcgPSB0aGlzLmlucHV0U3RyaW5nO1xuXG4gICAgdGhpcy52YXJOYW1lcy5mb3JFYWNoKCh2YXJOYW1lLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgW18sIGF0dHJdID0gdmFyTmFtZS5zcGxpdCgvXFwuKC4qKS9zKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbaW5kZXhdO1xuICAgICAgaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZy5yZXBsYWNlKGBcXCR7JHt2YXJOYW1lfWAsIGBcXCR7JHt0YXJnZXQubG9jYXRpb24ubG9naWNhbFJlc291cmNlSWR9JHthdHRyID8gYC4ke2F0dHJ9YCA6ICcnfWAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlucHV0U3RyaW5nO1xuICB9XG59XG5cbmNsYXNzIERlcGVuZHNPbiBpbXBsZW1lbnRzIENsb3VkRm9ybWF0aW9uUmVmZXJlbmNlIHtcbiAgcHVibGljIHN0YXRpYyBJTlNUQU5DRSA9IG5ldyBEZXBlbmRzT24oKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgdG9DZm4odGFyZ2V0czogUmVzb3VyY2VOb2RlW10pOiBhbnkge1xuICAgIHJldHVybiB0YXJnZXRzLm1hcCgodCkgPT4gdC5sb2NhdGlvbi5sb2dpY2FsUmVzb3VyY2VJZCk7XG4gIH1cbn1cbiJdfQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZGVmaW5pdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFjay1kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLDREQW1FQztBQXZFRCx5RUFBeUU7QUFDekUsaUVBQWlFO0FBQ2pFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTdDLFNBQWdCLHdCQUF3QixDQUN0QyxRQUEyQixFQUMzQixjQUFxQyxFQUNyQyxXQUFrQztJQUVsQyxNQUFNLGdCQUFnQixHQUFxQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhILDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLEVBQUUsUUFBUSxDQUFDO1FBRWpELGlGQUFpRjtRQUNqRiwwRkFBMEY7UUFDMUYscUZBQXFGO1FBQ3JGLG1CQUFtQjtRQUNuQixJQUFJLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckQsYUFBYSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQy9FLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUN4RCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFFSCxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLDZFQUE2RTtJQUM3RSw4QkFBOEI7SUFDOUIscUdBQXFHO0lBQ3JHLDBFQUEwRTtJQUMxRSxLQUFLLElBQUksT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RCxPQUFPLGFBQWEsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRTdFLE9BQU8sYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFFdkMsSUFBSSxhQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMzRSxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixLQUFLLE1BQU0sS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7S0FDN0MsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGFja0RlZmluaXRpb24gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblN0YWNrLCBSZXNvdXJjZU1hcHBpbmcgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbi8vIG5hbWVzcGFjZSBvYmplY3QgaW1wb3J0cyB3b24ndCB3b3JrIGluIHRoZSBidW5kbGUgZm9yIGZ1bmN0aW9uIGV4cG9ydHNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBkZWVwRXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tEZWZpbml0aW9ucyhcbiAgbWFwcGluZ3M6IFJlc291cmNlTWFwcGluZ1tdLFxuICBkZXBsb3llZFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdLFxuICBsb2NhbFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdLFxuKTogU3RhY2tEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZXBsb3llZFN0YWNrTWFwOiBNYXA8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblN0YWNrPiA9IG5ldyBNYXAoZGVwbG95ZWRTdGFja3MubWFwKChzKSA9PiBbcy5zdGFja05hbWUsIHNdKSk7XG5cbiAgLy8gRm9yIGV2ZXJ5IGxvY2FsIHN0YWNrIHRoYXQgaXMgYWxzbyBkZXBsb3llZCwgdXBkYXRlIHRoZSBsb2NhbCB0ZW1wbGF0ZSxcbiAgLy8gb3ZlcndyaXRpbmcgaXRzIENES01ldGFkYXRhIHJlc291cmNlIHdpdGggdGhlIG9uZSBmcm9tIHRoZSBkZXBsb3llZCBzdGFja1xuICBmb3IgKGNvbnN0IGxvY2FsU3RhY2sgb2YgbG9jYWxTdGFja3MpIHtcbiAgICBjb25zdCBkZXBsb3llZFN0YWNrID0gZGVwbG95ZWRTdGFja01hcC5nZXQobG9jYWxTdGFjay5zdGFja05hbWUpO1xuICAgIGNvbnN0IGxvY2FsVGVtcGxhdGUgPSBsb2NhbFN0YWNrLnRlbXBsYXRlO1xuICAgIGNvbnN0IGRlcGxveWVkVGVtcGxhdGUgPSBkZXBsb3llZFN0YWNrPy50ZW1wbGF0ZTtcblxuICAgIC8vIFRoZSBDREtNZXRhZGF0YSByZXNvdXJjZSBpcyBuZXZlciBwYXJ0IG9mIGEgcmVmYWN0b3IuIFNvIGF0IHRoaXMgcG9pbnQgd2UgbmVlZFxuICAgIC8vIHRvIGFkanVzdCB0aGUgdGVtcGxhdGUgd2Ugd2lsbCBzZW5kIHRvIHRoZSBBUEkgdG8gbWFrZSBzdXJlIGl0IGhhcyB0aGUgc2FtZSBDREtNZXRhZGF0YVxuICAgIC8vIGFzIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZS4gQW5kIGlmIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZSBkb2Vzbid0IGhhdmUgYW55LCB3ZSBjYW5ub3RcbiAgICAvLyBzZW5kIGFueSBlaXRoZXIuXG4gICAgaWYgKGRlcGxveWVkVGVtcGxhdGU/LlJlc291cmNlcz8uQ0RLTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgbG9jYWxUZW1wbGF0ZS5SZXNvdXJjZXMgPSBsb2NhbFRlbXBsYXRlLlJlc291cmNlcyA/PyB7fTtcbiAgICAgIGxvY2FsVGVtcGxhdGUuUmVzb3VyY2VzLkNES01ldGFkYXRhID0gZGVwbG95ZWRUZW1wbGF0ZS5SZXNvdXJjZXMuQ0RLTWV0YWRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBsb2NhbFRlbXBsYXRlLlJlc291cmNlcz8uQ0RLTWV0YWRhdGE7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RhY2tzVG9Qcm9jZXNzID0gbG9jYWxTdGFja3MuZmlsdGVyKChsb2NhbFN0YWNrKSA9PiB7XG4gICAgY29uc3QgZGVwbG95ZWRTdGFjayA9IGRlcGxveWVkU3RhY2tNYXAuZ2V0KGxvY2FsU3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gIWRlcGxveWVkU3RhY2sgfHwgIWRlZXBFcXVhbChsb2NhbFN0YWNrLnRlbXBsYXRlLCBkZXBsb3llZFN0YWNrLnRlbXBsYXRlKTtcbiAgfSk7XG5cbiAgLy8gTm93LCBmb3IgZXZlcnkgc3RhY2sgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlIG1hcHBpbmdzLCBidXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGxvY2FsIHN0YWNrcyxcbiAgLy8gd2UgbmVlZCB0byB0YWtlIGl0cyAoZGVwbG95ZWQpIHRlbXBsYXRlIGFuZCByZW1vdmUgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBhcHBlYXIgaW4gdGhlIHNvdXJjZXNcbiAgLy8gcGFydCBvZiB0aGUgbWFwcGluZ3MuIEZvciBleGFtcGxlLCBpZiB0aGUgbWFwcGluZ3MgY29udGFpbnMgYW4gZW50cnkgbGlrZTpcbiAgLy8gIC0gU3RhY2tCLkZvbyAtPiBTdGFja0EuQmFyXG4gIC8vIGFuZCBTdGFja0IgZG9lcyBub3QgZXhpc3QgbG9jYWxseSwgd2UgbmVlZCB0byB0YWtlIFN0YWNrQidzIHRlbXBsYXRlLCBhbmQgcmVtb3ZlIHRoZSByZXNvdXJjZSBGb28sXG4gIC8vIGFuZCBpbmNsdWRlIHRoaXMgbW9kaWZpZWQgdGVtcGxhdGUgZm9yIFN0YWNrQiBpbiB0aGUgc3RhY2sgZGVmaW5pdGlvbnMuXG4gIGZvciAobGV0IG1hcHBpbmcgb2YgbWFwcGluZ3MpIHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBtYXBwaW5nLnNvdXJjZS5zdGFja05hbWU7XG4gICAgaWYgKCFsb2NhbFN0YWNrcy5zb21lKHMgPT4gcy5zdGFja05hbWUgPT09IHN0YWNrTmFtZSkpIHtcbiAgICAgIGNvbnN0IGRlcGxveWVkU3RhY2sgPSBkZXBsb3llZFN0YWNrTWFwLmdldChzdGFja05hbWUpO1xuICAgICAgZGVsZXRlIGRlcGxveWVkU3RhY2s/LnRlbXBsYXRlLlJlc291cmNlcz8uW21hcHBpbmcuc291cmNlLmxvZ2ljYWxSZXNvdXJjZUlkXTtcblxuICAgICAgZGVsZXRlIGRlcGxveWVkU3RhY2s/LnRlbXBsYXRlLk91dHB1dHM7XG5cbiAgICAgIGlmIChkZXBsb3llZFN0YWNrICYmICFzdGFja3NUb1Byb2Nlc3Muc29tZShzID0+IHMuc3RhY2tOYW1lID09PSBzdGFja05hbWUpKSB7XG4gICAgICAgIHN0YWNrc1RvUHJvY2Vzcy5wdXNoKGRlcGxveWVkU3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZvciBzdGFja3MgY3JlYXRlZCBieSB0aGUgcmVmYWN0b3IsIENsb3VkRm9ybWF0aW9uIGRvZXMgbm90IGFsbG93IFJ1bGVzIG9yIFBhcmFtZXRlcnNcbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3NUb1Byb2Nlc3MpIHtcbiAgICBpZiAoIWRlcGxveWVkU3RhY2tzLnNvbWUoZGVwbG95ZWQgPT4gZGVwbG95ZWQuc3RhY2tOYW1lID09PSBzdGFjay5zdGFja05hbWUpKSB7XG4gICAgICBpZiAoJ1J1bGVzJyBpbiBzdGFjay50ZW1wbGF0ZSkge1xuICAgICAgICBkZWxldGUgc3RhY2sudGVtcGxhdGUuUnVsZXM7XG4gICAgICB9XG4gICAgICBpZiAoJ1BhcmFtZXRlcnMnIGluIHN0YWNrLnRlbXBsYXRlKSB7XG4gICAgICAgIGRlbGV0ZSBzdGFjay50ZW1wbGF0ZS5QYXJhbWV0ZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGFja3NUb1Byb2Nlc3MubWFwKChzdGFjaykgPT4gKHtcbiAgICBTdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICBUZW1wbGF0ZUJvZHk6IEpTT04uc3RyaW5naWZ5KHN0YWNrLnRlbXBsYXRlKSxcbiAgfSkpO1xufVxuIl19
package/lib/index_bg.wasm CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  import '../private/dispose-polyfill';
2
2
  import type { TemplateDiff } from '@aws-cdk/cloudformation-diff';
3
- import type { FeatureFlag, DeployResult, DestroyResult, RollbackResult } from './types';
3
+ import type { DeployResult, DestroyResult, FeatureFlag, RollbackResult } from './types';
4
4
  import type { BootstrapEnvironments, BootstrapOptions, BootstrapResult } from '../actions/bootstrap';
5
5
  import { type DeployOptions } from '../actions/deploy';
6
6
  import { type DestroyOptions } from '../actions/destroy';