@aws-cdk/toolkit-lib 1.20.1 → 1.21.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.
@@ -11,39 +11,35 @@ const streams_1 = require("../streams");
11
11
  * Class for formatting the diff output
12
12
  */
13
13
  class DiffFormatter {
14
- oldTemplate;
15
- newTemplate;
14
+ templateInfo;
16
15
  stackName;
17
- changeSet;
18
- nestedStacks;
19
16
  isImport;
20
17
  mappings;
21
18
  /**
22
- * Stores the TemplateDiffs that get calculated in this DiffFormatter,
23
- * indexed by the stack name.
19
+ * Cache of computed TemplateDiffs, indexed by stack name.
24
20
  */
25
- _diffs = {};
21
+ cache = new Map();
26
22
  constructor(props) {
27
- this.oldTemplate = props.templateInfo.oldTemplate;
28
- this.newTemplate = props.templateInfo.newTemplate;
23
+ this.templateInfo = props.templateInfo;
29
24
  this.stackName = props.templateInfo.newTemplate.displayName ?? props.templateInfo.newTemplate.stackName;
30
- this.changeSet = props.templateInfo.changeSet;
31
- this.nestedStacks = props.templateInfo.nestedStacks;
32
25
  this.isImport = props.templateInfo.isImport ?? false;
33
26
  this.mappings = props.templateInfo.mappings ?? {};
34
27
  }
35
28
  get diffs() {
36
- return this._diffs;
29
+ return Object.fromEntries(this.cache);
37
30
  }
38
31
  /**
39
- * Get or creates the diff of a stack.
40
- * If it creates the diff, it stores the result in a map for
41
- * easier retrieval later.
32
+ * Compute the diff for a single stack. Results are cached by stack name.
33
+ *
34
+ * @param stackName - The name to cache the diff under
35
+ * @param oldTemplate - The deployed template
36
+ * @param newTemplate - The new/generated template (read from the artifact)
37
+ * @param changeSet - The CloudFormation changeset for this specific stack, if available
38
+ * @param mappings - Resource move mappings
42
39
  */
43
- diff(stackName, oldTemplate, mappings = {}) {
44
- const realStackName = stackName ?? this.stackName;
45
- if (!this._diffs[realStackName]) {
46
- const templateDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate ?? this.oldTemplate, this.newTemplate.template, this.changeSet, this.isImport);
40
+ computeDiff(stackName, oldTemplate, newTemplate, changeSet, mappings) {
41
+ if (!this.cache.has(stackName)) {
42
+ const templateDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, newTemplate, changeSet, this.isImport);
47
43
  const setMove = (change, direction, location) => {
48
44
  if (location != null) {
49
45
  const [sourceStackName, sourceLogicalId] = location.split('.');
@@ -55,7 +51,7 @@ class DiffFormatter {
55
51
  }
56
52
  };
57
53
  templateDiff.resources.forEachDifference((id, change) => {
58
- const location = `${realStackName}.${id}`;
54
+ const location = `${stackName}.${id}`;
59
55
  if (change.isAddition && Object.values(mappings).includes(location)) {
60
56
  setMove(change, 'from', Object.keys(mappings).find(k => mappings[k] === location));
61
57
  }
@@ -63,40 +59,27 @@ class DiffFormatter {
63
59
  setMove(change, 'to', mappings[location]);
64
60
  }
65
61
  });
66
- this._diffs[realStackName] = templateDiff;
67
- }
68
- return this._diffs[realStackName];
69
- }
70
- /**
71
- * Return whether the diff has security-impacting changes that need confirmation.
72
- *
73
- * If no stackName is given, then the root stack name is used.
74
- */
75
- permissionType() {
76
- const diff = this.diff();
77
- if (diff.permissionsBroadened) {
78
- return payloads_1.PermissionChangeType.BROADENING;
79
- }
80
- else if (diff.permissionsAnyChanges) {
81
- return payloads_1.PermissionChangeType.NON_BROADENING;
82
- }
83
- else {
84
- return payloads_1.PermissionChangeType.NONE;
62
+ this.cache.set(stackName, templateDiff);
85
63
  }
64
+ return this.cache.get(stackName);
86
65
  }
87
66
  /**
88
- * Format the stack diff
67
+ * Format the stack diff, including all nested stacks.
89
68
  */
90
69
  formatStackDiff(options = {}) {
91
- return this.formatStackDiffHelper(this.oldTemplate, this.stackName, this.nestedStacks, options, this.mappings);
70
+ return this.formatStackDiffHelper({
71
+ oldTemplate: this.templateInfo.oldTemplate,
72
+ newTemplate: this.templateInfo.newTemplate.template,
73
+ stackName: this.stackName,
74
+ nestedStacks: this.templateInfo.nestedStacks,
75
+ changeSet: this.templateInfo.changeSet,
76
+ mappings: this.mappings,
77
+ logicalIdMap: buildLogicalToPathMap(this.templateInfo.newTemplate),
78
+ }, options);
92
79
  }
93
- formatStackDiffHelper(oldTemplate, stackName, nestedStackTemplates, options, mappings = {}) {
94
- let diff = this.diff(stackName, oldTemplate, mappings);
95
- // The stack diff is formatted via `Formatter`, which takes in a stream
96
- // and sends its output directly to that stream. To facilitate use of the
97
- // global CliIoHost, we create our own stream to capture the output of
98
- // `Formatter` and return the output as a string for the consumer of
99
- // `formatStackDiff` to decide what to do with it.
80
+ formatStackDiffHelper(params, options = {}) {
81
+ const { oldTemplate, newTemplate, stackName, nestedStacks, changeSet, mappings, logicalIdMap } = params;
82
+ const diff = this.computeDiff(stackName, oldTemplate, newTemplate, changeSet, mappings);
100
83
  const stream = new streams_1.StringWriteStream();
101
84
  let numStacksWithChanges = 0;
102
85
  let formattedDiff = '';
@@ -110,25 +93,26 @@ class DiffFormatter {
110
93
  stream.write('Parameters and rules created during migration do not affect resource configuration.\n');
111
94
  }
112
95
  // detect and filter out mangled characters from the diff
96
+ let activeDiff = diff;
113
97
  if (diff.differenceCount && !options.strict) {
114
- const mangledNewTemplate = JSON.parse((0, cloudformation_diff_1.mangleLikeCloudFormation)(JSON.stringify(this.newTemplate.template)));
115
- const mangledDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, mangledNewTemplate, this.changeSet);
98
+ const mangledNewTemplate = JSON.parse((0, cloudformation_diff_1.mangleLikeCloudFormation)(JSON.stringify(newTemplate)));
99
+ const mangledDiff = (0, cloudformation_diff_1.fullDiff)(oldTemplate, mangledNewTemplate, changeSet);
116
100
  filteredChangesCount = Math.max(0, diff.differenceCount - mangledDiff.differenceCount);
117
101
  if (filteredChangesCount > 0) {
118
- diff = mangledDiff;
102
+ activeDiff = mangledDiff;
119
103
  }
120
104
  }
121
105
  // filter out 'AWS::CDK::Metadata' resources from the template
122
106
  // filter out 'CheckBootstrapVersion' rules from the template
123
107
  if (!options.strict) {
124
- obscureDiff(diff);
108
+ obscureDiff(activeDiff);
125
109
  }
126
- if (!diff.isEmpty) {
110
+ if (!activeDiff.isEmpty) {
127
111
  numStacksWithChanges++;
128
- // formatDifferences updates the stream with the formatted stack diff
129
- (0, cloudformation_diff_1.formatDifferences)(stream, diff, {
130
- ...logicalIdMapFromTemplate(this.oldTemplate),
131
- ...buildLogicalToPathMap(this.newTemplate),
112
+ (0, cloudformation_diff_1.formatDifferences)(stream, activeDiff, {
113
+ ...logicalIdMapFromTemplate(oldTemplate),
114
+ ...logicalIdMapFromTemplate(newTemplate),
115
+ ...logicalIdMap,
132
116
  }, options.contextLines);
133
117
  }
134
118
  else if (!options.quiet) {
@@ -139,50 +123,95 @@ class DiffFormatter {
139
123
  }
140
124
  }
141
125
  finally {
142
- // store the stream containing a formatted stack diff
143
126
  formattedDiff = stream.toString();
144
127
  stream.end();
145
128
  }
146
- for (const nestedStackLogicalId of Object.keys(nestedStackTemplates ?? {})) {
147
- if (!nestedStackTemplates) {
148
- break;
149
- }
150
- const nestedStack = nestedStackTemplates[nestedStackLogicalId];
151
- this.newTemplate._template = nestedStack.generatedTemplate;
152
- const nextDiff = this.formatStackDiffHelper(nestedStack.deployedTemplate, nestedStack.physicalName ?? nestedStackLogicalId, nestedStack.nestedStackTemplates, options, this.mappings);
129
+ // Recurse into nested stacks
130
+ for (const [logicalId, nestedStack] of Object.entries(nestedStacks ?? {})) {
131
+ const nextDiff = this.formatStackDiffHelper({
132
+ oldTemplate: nestedStack.deployedTemplate,
133
+ newTemplate: nestedStack.generatedTemplate,
134
+ stackName: nestedStack.physicalName ?? logicalId,
135
+ nestedStacks: nestedStack.nestedStackTemplates,
136
+ changeSet: nestedStack.changeSet,
137
+ mappings,
138
+ logicalIdMap: {},
139
+ }, options);
153
140
  numStacksWithChanges += nextDiff.numStacksWithChanges;
154
141
  formattedDiff += nextDiff.formattedDiff;
155
142
  }
156
- return {
157
- numStacksWithChanges,
158
- formattedDiff,
159
- };
143
+ return { numStacksWithChanges, formattedDiff };
160
144
  }
161
145
  /**
162
- * Format the security diff
146
+ * Format the security diff, including all nested stacks.
163
147
  */
164
- formatSecurityDiff() {
165
- const diff = this.diff();
166
- // The security diff is formatted via `Formatter`, which takes in a stream
167
- // and sends its output directly to that stream. To faciliate use of the
168
- // global CliIoHost, we create our own stream to capture the output of
169
- // `Formatter` and return the output as a string for the consumer of
170
- // `formatSecurityDiff` to decide what to do with it.
148
+ formatSecurityDiff(options = {}) {
149
+ const { formattedDiff, permissionChangeType, numStacksWithChanges } = this.formatSecurityDiffHelper({
150
+ oldTemplate: this.templateInfo.oldTemplate,
151
+ newTemplate: this.templateInfo.newTemplate.template,
152
+ stackName: this.stackName,
153
+ nestedStacks: this.templateInfo.nestedStacks,
154
+ changeSet: this.templateInfo.changeSet,
155
+ logicalIdMap: buildLogicalToPathMap(this.templateInfo.newTemplate),
156
+ }, options);
157
+ return { formattedDiff, permissionChangeType, numStacksWithChanges };
158
+ }
159
+ formatSecurityDiffHelper(params, options = {}) {
160
+ const { oldTemplate, newTemplate, stackName, nestedStacks, changeSet, logicalIdMap } = params;
161
+ const diff = this.computeDiff(stackName, oldTemplate, newTemplate, changeSet, this.mappings);
162
+ const permissionChangeType = permissionTypeFromDiff(diff);
171
163
  const stream = new streams_1.StringWriteStream();
172
- stream.write((0, node_util_1.format)(`Stack ${chalk.bold(this.stackName)}\n`));
164
+ if (!options.quiet || permissionChangeType !== payloads_1.PermissionChangeType.NONE) {
165
+ stream.write((0, node_util_1.format)(`Stack ${chalk.bold(stackName)}\n`));
166
+ }
173
167
  try {
174
- // formatSecurityChanges updates the stream with the formatted security diff
175
- (0, cloudformation_diff_1.formatSecurityChanges)(stream, diff, buildLogicalToPathMap(this.newTemplate));
168
+ (0, cloudformation_diff_1.formatSecurityChanges)(stream, diff, {
169
+ ...logicalIdMapFromTemplate(newTemplate),
170
+ ...logicalIdMap,
171
+ });
176
172
  }
177
173
  finally {
178
174
  stream.end();
179
175
  }
180
- // store the stream containing a formatted stack diff
181
- const formattedDiff = stream.toString();
182
- return { formattedDiff, permissionChangeType: this.permissionType() };
176
+ let formattedDiff = stream.toString();
177
+ if (!options.quiet && permissionChangeType === payloads_1.PermissionChangeType.NONE) {
178
+ formattedDiff += chalk.green('There were no security-related changes (limitations: https://github.com/aws/aws-cdk/issues/1299)\n');
179
+ }
180
+ let numStacksWithChanges = permissionChangeType !== payloads_1.PermissionChangeType.NONE ? 1 : 0;
181
+ let escalatedPermissionType = permissionChangeType;
182
+ // Recurse into nested stacks
183
+ for (const [logicalId, nestedStack] of Object.entries(nestedStacks ?? {})) {
184
+ const nestedResult = this.formatSecurityDiffHelper({
185
+ oldTemplate: nestedStack.deployedTemplate,
186
+ newTemplate: nestedStack.generatedTemplate,
187
+ stackName: nestedStack.physicalName ?? logicalId,
188
+ nestedStacks: nestedStack.nestedStackTemplates,
189
+ changeSet: nestedStack.changeSet,
190
+ }, options);
191
+ formattedDiff += nestedResult.formattedDiff ? '\n' + nestedResult.formattedDiff : '';
192
+ numStacksWithChanges += nestedResult.numStacksWithChanges;
193
+ // Escalate: if any nested stack broadens permissions, the whole thing broadens
194
+ if (nestedResult.permissionChangeType === payloads_1.PermissionChangeType.BROADENING) {
195
+ escalatedPermissionType = payloads_1.PermissionChangeType.BROADENING;
196
+ }
197
+ else if (nestedResult.permissionChangeType === payloads_1.PermissionChangeType.NON_BROADENING
198
+ && escalatedPermissionType === payloads_1.PermissionChangeType.NONE) {
199
+ escalatedPermissionType = payloads_1.PermissionChangeType.NON_BROADENING;
200
+ }
201
+ }
202
+ return { formattedDiff, permissionChangeType: escalatedPermissionType, numStacksWithChanges };
183
203
  }
184
204
  }
185
205
  exports.DiffFormatter = DiffFormatter;
206
+ function permissionTypeFromDiff(diff) {
207
+ if (diff.permissionsBroadened) {
208
+ return payloads_1.PermissionChangeType.BROADENING;
209
+ }
210
+ else if (diff.permissionsAnyChanges) {
211
+ return payloads_1.PermissionChangeType.NON_BROADENING;
212
+ }
213
+ return payloads_1.PermissionChangeType.NONE;
214
+ }
186
215
  function buildLogicalToPathMap(stack) {
187
216
  const map = {};
188
217
  for (const md of stack.findMetadataByType(cxschema.ArtifactMetadataEntryType.LOGICAL_ID)) {
@@ -192,7 +221,7 @@ function buildLogicalToPathMap(stack) {
192
221
  }
193
222
  function logicalIdMapFromTemplate(template) {
194
223
  const ret = {};
195
- for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
224
+ for (const [logicalId, resource] of Object.entries((template.Resources ?? {}))) {
196
225
  const path = resource?.Metadata?.['aws:cdk:path'];
197
226
  if (path) {
198
227
  ret[logicalId] = path;
@@ -237,4 +266,4 @@ function obscureDiff(diff) {
237
266
  });
238
267
  }
239
268
  }
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFFbkMsMkRBQTJEO0FBQzNELHNFQU9zQztBQUN0QywrQkFBK0I7QUFDL0IsNkNBQXNEO0FBRXRELHdDQUErQztBQXlIL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxXQUFXLENBQU07SUFDakIsV0FBVyxDQUFvQztJQUMvQyxTQUFTLENBQVM7SUFDbEIsU0FBUyxDQUFPO0lBQ2hCLFlBQVksQ0FBdUU7SUFDbkYsUUFBUSxDQUFVO0lBQ2xCLFFBQVEsQ0FBeUI7SUFFbEQ7OztPQUdHO0lBQ0ssTUFBTSxHQUFxQyxFQUFFLENBQUM7SUFFdEQsWUFBWSxLQUF5QjtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFB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aWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7XG4gIGZvcm1hdERpZmZlcmVuY2VzLFxuICBmb3JtYXRTZWN1cml0eUNoYW5nZXMsXG4gIGZ1bGxEaWZmLFxuICBtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24sXG4gIHR5cGUgUmVzb3VyY2VEaWZmZXJlbmNlLFxuICB0eXBlIFRlbXBsYXRlRGlmZixcbn0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2hhbmdlVHlwZSB9IGZyb20gJy4uLy4uL3BheWxvYWRzJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBTdHJpbmdXcml0ZVN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbXMnO1xuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTZWN1cml0eURpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgc2VjdXJpdHkgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwZXJtaXNzaW9uIGNoYW5nZXMgaW4gdGhlIHNlY3VyaXR5IGRpZmYuXG4gICAqIFRoZSBJb0hvc3Qgd2lsbCB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcHJpbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogUGVybWlzc2lvbkNoYW5nZVR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IG9mIGZvcm1hdFN0YWNrRGlmZlxuICovXG5pbnRlcmZhY2UgRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmIGNoYW5nZXNcbiAgICovXG4gIHJlYWRvbmx5IG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGZvcm1hdHRlZCBkaWZmXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZWREaWZmOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBEaWZmIEZvcm1hdHRlclxuICovXG5pbnRlcmZhY2UgRGlmZkZvcm1hdHRlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBmb3IgdGhlIFRlbXBsYXRlIHRoYXQgaXMgYmVpbmcgZGlmZmVkLlxuICAgKiBJbmNsdWRlcyB0aGUgb2xkL2N1cnJlbnQgc3RhdGUgb2YgdGhlIHN0YWNrIGFzIHdlbGwgYXMgdGhlIG5ldyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBsYXRlSW5mbzogVGVtcGxhdGVJbmZvO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgc3BlY2lmaWMgdG8gZm9ybWF0dGluZyB0aGUgc3RhY2sgZGlmZlxuICovXG5pbnRlcmZhY2UgRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBkbyBub3QgZmlsdGVyIG91dCBBV1M6OkNESzo6TWV0YWRhdGEgb3IgUnVsZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0cmljdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGxpbmVzIG9mIGNvbnRleHQgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmZcbiAgICpcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dExpbmVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBzaWxlbmNlcyBcXCdUaGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzXFwnIG1lc3NhZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMgZXh0ZW5kcyBGb3JtYXRTdGFja0RpZmZPcHRpb25zIHtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhIHRlbXBsYXRlJ3Mgb2xkL25ldyBzdGF0ZVxuICogdGhhdCBpcyB1c2VkIGZvciBkaWZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgb2xkL2V4aXN0aW5nIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvbGRUZW1wbGF0ZTogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBuZXdUZW1wbGF0ZTogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBBIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCB0byBoZWxwIHRoZSBkaWZmIG9wZXJhdGlvbi5cbiAgICogUHJvYmFibHkgY3JlYXRlZCB2aWEgYGNyZWF0ZURpZmZDaGFuZ2VTZXRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldD86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlcmUgYXJlIGFueSBpbXBvcnRlZCByZXNvdXJjZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzSW1wb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW55IG5lc3RlZCBzdGFja3MgaW5jbHVkZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAqXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBuZXN0ZWRTdGFja3M/OiB7XG4gICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgfTtcblxuICAvKipcbiAgICogTWFwcGluZ3Mgb2Ygb2xkIGxvY2F0aW9ucyB0byBuZXcgbG9jYXRpb25zLiBJZiB0aGVzZSBhcmUgcHJvdmlkZWQsXG4gICAqIGZvciBhbGwgcmVzb3VyY2VzIHRoYXQgd2VyZSBtb3ZlZCwgdGhlaXIgY29ycmVzcG9uZGluZyBhZGRpdGlvblxuICAgKiBhbmQgcmVtb3ZhbCBsaW5lcyB3aWxsIGJlIGF1Z21lbnRlZCB3aXRoIHRoZSBsb2NhdGlvbiB0aGV5IHdlcmVcbiAgICogbW92ZWQgZm9tIGFuZCB0bywgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFwcGluZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENsYXNzIGZvciBmb3JtYXR0aW5nIHRoZSBkaWZmIG91dHB1dFxuICovXG5leHBvcnQgY2xhc3MgRGlmZkZvcm1hdHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkVGVtcGxhdGU6IGFueTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdUZW1wbGF0ZTogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZVNldD86IGFueTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXN0ZWRTdGFja3M6IHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW1wb3J0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIFRlbXBsYXRlRGlmZnMgdGhhdCBnZXQgY2FsY3VsYXRlZCBpbiB0aGlzIERpZmZGb3JtYXR0ZXIsXG4gICAqIGluZGV4ZWQgYnkgdGhlIHN0YWNrIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIF9kaWZmczogeyBbbmFtZTogc3RyaW5nXTogVGVtcGxhdGVEaWZmIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlmZkZvcm1hdHRlclByb3BzKSB7XG4gICAgdGhpcy5vbGRUZW1wbGF0ZSA9IHByb3BzLnRlbXBsYXRlSW5mby5vbGRUZW1wbGF0ZTtcbiAgICB0aGlzLm5ld1RlbXBsYXRlID0gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLmRpc3BsYXlOYW1lID8/IHByb3BzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS5zdGFja05hbWU7XG4gICAgdGhpcy5jaGFuZ2VTZXQgPSBwcm9wcy50ZW1wbGF0ZUluZm8uY2hhbmdlU2V0O1xuICAgIHRoaXMubmVzdGVkU3RhY2tzID0gcHJvcHMudGVtcGxhdGVJbmZvLm5lc3RlZFN0YWNrcztcbiAgICB0aGlzLmlzSW1wb3J0ID0gcHJvcHMudGVtcGxhdGVJbmZvLmlzSW1wb3J0ID8/IGZhbHNlO1xuICAgIHRoaXMubWFwcGluZ3MgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubWFwcGluZ3MgPz8ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZzKCkge1xuICAgIHJldHVybiB0aGlzLl9kaWZmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlcyB0aGUgZGlmZiBvZiBhIHN0YWNrLlxuICAgKiBJZiBpdCBjcmVhdGVzIHRoZSBkaWZmLCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIG1hcCBmb3JcbiAgICogZWFzaWVyIHJldHJpZXZhbCBsYXRlci5cbiAgICovXG4gIHByaXZhdGUgZGlmZihzdGFja05hbWU/OiBzdHJpbmcsIG9sZFRlbXBsYXRlPzogYW55LCBtYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XG4gICAgY29uc3QgcmVhbFN0YWNrTmFtZSA9IHN0YWNrTmFtZSA/PyB0aGlzLnN0YWNrTmFtZTtcblxuICAgIGlmICghdGhpcy5fZGlmZnNbcmVhbFN0YWNrTmFtZV0pIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGlmZiA9IGZ1bGxEaWZmKFxuICAgICAgICBvbGRUZW1wbGF0ZSA/PyB0aGlzLm9sZFRlbXBsYXRlLFxuICAgICAgICB0aGlzLm5ld1RlbXBsYXRlLnRlbXBsYXRlLFxuICAgICAgICB0aGlzLmNoYW5nZVNldCxcbiAgICAgICAgdGhpcy5pc0ltcG9ydCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNldE1vdmUgPSAoY2hhbmdlOiBSZXNvdXJjZURpZmZlcmVuY2UsIGRpcmVjdGlvbjogJ2Zyb20nIHwgJ3RvJywgbG9jYXRpb24/OiBzdHJpbmcpPT4ge1xuICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IFtzb3VyY2VTdGFja05hbWUsIHNvdXJjZUxvZ2ljYWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICAgIGNoYW5nZS5tb3ZlID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiBzb3VyY2VTdGFja05hbWUsXG4gICAgICAgICAgICByZXNvdXJjZUxvZ2ljYWxJZDogc291cmNlTG9naWNhbElkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGlkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtyZWFsU3RhY2tOYW1lfS4ke2lkfWA7XG4gICAgICAgIGlmIChjaGFuZ2UuaXNBZGRpdGlvbiAmJiBPYmplY3QudmFsdWVzKG1hcHBpbmdzKS5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgICBzZXRNb3ZlKGNoYW5nZSwgJ2Zyb20nLCBPYmplY3Qua2V5cyhtYXBwaW5ncykuZmluZChrID0+IG1hcHBpbmdzW2tdID09PSBsb2NhdGlvbikpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc1JlbW92YWwgJiYgT2JqZWN0LmtleXMobWFwcGluZ3MpLmluY2x1ZGVzKGxvY2F0aW9uKSkge1xuICAgICAgICAgIHNldE1vdmUoY2hhbmdlLCAndG8nLCBtYXBwaW5nc1tsb2NhdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZGlmZnNbcmVhbFN0YWNrTmFtZV0gPSB0ZW1wbGF0ZURpZmY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaWZmc1tyZWFsU3RhY2tOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZGlmZiBoYXMgc2VjdXJpdHktaW1wYWN0aW5nIGNoYW5nZXMgdGhhdCBuZWVkIGNvbmZpcm1hdGlvbi5cbiAgICpcbiAgICogSWYgbm8gc3RhY2tOYW1lIGlzIGdpdmVuLCB0aGVuIHRoZSByb290IHN0YWNrIG5hbWUgaXMgdXNlZC5cbiAgICovXG4gIHByaXZhdGUgcGVybWlzc2lvblR5cGUoKTogUGVybWlzc2lvbkNoYW5nZVR5cGUge1xuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmRpZmYoKTtcblxuICAgIGlmIChkaWZmLnBlcm1pc3Npb25zQnJvYWRlbmVkKSB7XG4gICAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgICB9IGVsc2UgaWYgKGRpZmYucGVybWlzc2lvbnNBbnlDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9OX0JST0FERU5JTkc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIHN0YWNrIGRpZmZcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRTdGFja0RpZmYob3B0aW9uczogRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyA9IHt9KTogRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRTdGFja0RpZmZIZWxwZXIoXG4gICAgICB0aGlzLm9sZFRlbXBsYXRlLFxuICAgICAgdGhpcy5zdGFja05hbWUsXG4gICAgICB0aGlzLm5lc3RlZFN0YWNrcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICB0aGlzLm1hcHBpbmdzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFN0YWNrRGlmZkhlbHBlcihcbiAgICBvbGRUZW1wbGF0ZTogYW55LFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG5lc3RlZFN0YWNrVGVtcGxhdGVzOiB7IFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgKSB7XG4gICAgbGV0IGRpZmYgPSB0aGlzLmRpZmYoc3RhY2tOYW1lLCBvbGRUZW1wbGF0ZSwgbWFwcGluZ3MpO1xuXG4gICAgLy8gVGhlIHN0YWNrIGRpZmYgaXMgZm9ybWF0dGVkIHZpYSBgRm9ybWF0dGVyYCwgd2hpY2ggdGFrZXMgaW4gYSBzdHJlYW1cbiAgICAvLyBhbmQgc2VuZHMgaXRzIG91dHB1dCBkaXJlY3RseSB0byB0aGF0IHN0cmVhbS4gVG8gZmFjaWxpdGF0ZSB1c2Ugb2YgdGhlXG4gICAgLy8gZ2xvYmFsIENsaUlvSG9zdCwgd2UgY3JlYXRlIG91ciBvd24gc3RyZWFtIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZlxuICAgIC8vIGBGb3JtYXR0ZXJgIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZyBmb3IgdGhlIGNvbnN1bWVyIG9mXG4gICAgLy8gYGZvcm1hdFN0YWNrRGlmZmAgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdC5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcblxuICAgIGxldCBudW1TdGFja3NXaXRoQ2hhbmdlcyA9IDA7XG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSAnJztcbiAgICBsZXQgZmlsdGVyZWRDaGFuZ2VzQ291bnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICAvLyBtdXN0IG91dHB1dCB0aGUgc3RhY2sgbmFtZSBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgcXVpZXRcbiAgICAgIGlmIChzdGFja05hbWUgJiYgKCFvcHRpb25zLnF1aWV0IHx8ICFkaWZmLmlzRW1wdHkpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShmb3JtYXQoYFN0YWNrICR7Y2hhbGsuYm9sZChzdGFja05hbWUpfVxcbmApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnF1aWV0ICYmIHRoaXMuaXNJbXBvcnQpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKCdQYXJhbWV0ZXJzIGFuZCBydWxlcyBjcmVhdGVkIGR1cmluZyBtaWdyYXRpb24gZG8gbm90IGFmZmVjdCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxcbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBkZXRlY3QgYW5kIGZpbHRlciBvdXQgbWFuZ2xlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGRpZmZcbiAgICAgIGlmIChkaWZmLmRpZmZlcmVuY2VDb3VudCAmJiAhb3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgICAgY29uc3QgbWFuZ2xlZE5ld1RlbXBsYXRlID0gSlNPTi5wYXJzZShtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24oSlNPTi5zdHJpbmdpZnkodGhpcy5uZXdUZW1wbGF0ZS50ZW1wbGF0ZSkpKTtcbiAgICAgICAgY29uc3QgbWFuZ2xlZERpZmYgPSBmdWxsRGlmZihvbGRUZW1wbGF0ZSwgbWFuZ2xlZE5ld1RlbXBsYXRlLCB0aGlzLmNoYW5nZVNldCk7XG4gICAgICAgIGZpbHRlcmVkQ2hhbmdlc0NvdW50ID0gTWF0aC5tYXgoMCwgZGlmZi5kaWZmZXJlbmNlQ291bnQgLSBtYW5nbGVkRGlmZi5kaWZmZXJlbmNlQ291bnQpO1xuICAgICAgICBpZiAoZmlsdGVyZWRDaGFuZ2VzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZGlmZiA9IG1hbmdsZWREaWZmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbHRlciBvdXQgJ0FXUzo6Q0RLOjpNZXRhZGF0YScgcmVzb3VyY2VzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICAvLyBmaWx0ZXIgb3V0ICdDaGVja0Jvb3RzdHJhcFZlcnNpb24nIHJ1bGVzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIG9ic2N1cmVEaWZmKGRpZmYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZmYuaXNFbXB0eSkge1xuICAgICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcysrO1xuXG4gICAgICAgIC8vIGZvcm1hdERpZmZlcmVuY2VzIHVwZGF0ZXMgdGhlIHN0cmVhbSB3aXRoIHRoZSBmb3JtYXR0ZWQgc3RhY2sgZGlmZlxuICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyhzdHJlYW0sIGRpZmYsIHtcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUodGhpcy5vbGRUZW1wbGF0ZSksXG4gICAgICAgICAgLi4uYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHRoaXMubmV3VGVtcGxhdGUpLFxuICAgICAgICB9LCBvcHRpb25zLmNvbnRleHRMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGBPbWl0dGVkICR7ZmlsdGVyZWRDaGFuZ2VzQ291bnR9IGNoYW5nZXMgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgbWFuZ2xlZCBub24tQVNDSUkgY2hhcmFjdGVycy4gVXNlIC0tc3RyaWN0IHRvIHByaW50IHRoZW0uXFxuYCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBzdG9yZSB0aGUgc3RyZWFtIGNvbnRhaW5pbmcgYSBmb3JtYXR0ZWQgc3RhY2sgZGlmZlxuICAgICAgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgICAgc3RyZWFtLmVuZCgpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkU3RhY2tMb2dpY2FsSWQgb2YgT2JqZWN0LmtleXMobmVzdGVkU3RhY2tUZW1wbGF0ZXMgPz8ge30pKSB7XG4gICAgICBpZiAoIW5lc3RlZFN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkU3RhY2sgPSBuZXN0ZWRTdGFja1RlbXBsYXRlc1tuZXN0ZWRTdGFja0xvZ2ljYWxJZF07XG5cbiAgICAgICh0aGlzLm5ld1RlbXBsYXRlIGFzIGFueSkuX3RlbXBsYXRlID0gbmVzdGVkU3RhY2suZ2VuZXJhdGVkVGVtcGxhdGU7XG4gICAgICBjb25zdCBuZXh0RGlmZiA9IHRoaXMuZm9ybWF0U3RhY2tEaWZmSGVscGVyKFxuICAgICAgICBuZXN0ZWRTdGFjay5kZXBsb3llZFRlbXBsYXRlLFxuICAgICAgICBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbmVzdGVkU3RhY2tMb2dpY2FsSWQsXG4gICAgICAgIG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICB0aGlzLm1hcHBpbmdzLFxuICAgICAgKTtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5leHREaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXh0RGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcyxcbiAgICAgIGZvcm1hdHRlZERpZmYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIHNlY3VyaXR5IGRpZmZcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRTZWN1cml0eURpZmYoKTogRm9ybWF0U2VjdXJpdHlEaWZmT3V0cHV0IHtcbiAgICBjb25zdCBkaWZmID0gdGhpcy5kaWZmKCk7XG5cbiAgICAvLyBUaGUgc2VjdXJpdHkgZGlmZiBpcyBmb3JtYXR0ZWQgdmlhIGBGb3JtYXR0ZXJgLCB3aGljaCB0YWtlcyBpbiBhIHN0cmVhbVxuICAgIC8vIGFuZCBzZW5kcyBpdHMgb3V0cHV0IGRpcmVjdGx5IHRvIHRoYXQgc3RyZWFtLiBUbyBmYWNpbGlhdGUgdXNlIG9mIHRoZVxuICAgIC8vIGdsb2JhbCBDbGlJb0hvc3QsIHdlIGNyZWF0ZSBvdXIgb3duIHN0cmVhbSB0byBjYXB0dXJlIHRoZSBvdXRwdXQgb2ZcbiAgICAvLyBgRm9ybWF0dGVyYCBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgYXMgYSBzdHJpbmcgZm9yIHRoZSBjb25zdW1lciBvZlxuICAgIC8vIGBmb3JtYXRTZWN1cml0eURpZmZgIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG5cbiAgICBzdHJlYW0ud3JpdGUoZm9ybWF0KGBTdGFjayAke2NoYWxrLmJvbGQodGhpcy5zdGFja05hbWUpfVxcbmApKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBmb3JtYXRTZWN1cml0eUNoYW5nZXMgdXBkYXRlcyB0aGUgc3RyZWFtIHdpdGggdGhlIGZvcm1hdHRlZCBzZWN1cml0eSBkaWZmXG4gICAgICBmb3JtYXRTZWN1cml0eUNoYW5nZXMoc3RyZWFtLCBkaWZmLCBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy5uZXdUZW1wbGF0ZSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBzdHJlYW0gY29udGFpbmluZyBhIGZvcm1hdHRlZCBzdGFjayBkaWZmXG4gICAgY29uc3QgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgIHJldHVybiB7IGZvcm1hdHRlZERpZmYsIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiB0aGlzLnBlcm1pc3Npb25UeXBlKCkgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZExvZ2ljYWxUb1BhdGhNYXAoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkge1xuICBjb25zdCBtYXA6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBmb3IgKGNvbnN0IG1kIG9mIHN0YWNrLmZpbmRNZXRhZGF0YUJ5VHlwZShjeHNjaGVtYS5BcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLkxPR0lDQUxfSUQpKSB7XG4gICAgbWFwW21kLmRhdGEgYXMgc3RyaW5nXSA9IG1kLnBhdGg7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gbG9naWNhbElkTWFwRnJvbVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpIHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBbbG9naWNhbElkLCByZXNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KSkge1xuICAgIGNvbnN0IHBhdGggPSAocmVzb3VyY2UgYXMgYW55KT8uTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ107XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHJldFtsb2dpY2FsSWRdID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW55IHRlbXBsYXRlIGVsZW1lbnRzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBzaG93IHVzZXJzLlxuICogVGhpcyBpcyBjdXJyZW50bHk6XG4gKiAtIEFXUzo6Q0RLOjpNZXRhZGF0YSByZXNvdXJjZVxuICogLSBDaGVja0Jvb3RzdHJhcFZlcnNpb24gUnVsZVxuICovXG5mdW5jdGlvbiBvYnNjdXJlRGlmZihkaWZmOiBUZW1wbGF0ZURpZmYpIHtcbiAgaWYgKGRpZmYudW5rbm93bikge1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE3OTQyXG4gICAgZGlmZi51bmtub3duID0gZGlmZi51bmtub3duLmZpbHRlcihjaGFuZ2UgPT4ge1xuICAgICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm5ld1ZhbHVlPy5DaGVja0Jvb3RzdHJhcFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5vbGRWYWx1ZT8uQ2hlY2tCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRpZmYucmVzb3VyY2VzKSB7XG4gICAgZGlmZi5yZXNvdXJjZXMgPSBkaWZmLnJlc291cmNlcy5maWx0ZXIoY2hhbmdlID0+IHtcbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5uZXdSZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2Uub2xkUmVzb3VyY2VUeXBlID09PSAnQVdTOjpDREs6Ok1ldGFkYXRhJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxufVxuIl19
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFFbkMsMkRBQTJEO0FBQzNELHNFQVFzQztBQUN0QywrQkFBK0I7QUFDL0IsNkNBQXNEO0FBRXRELHdDQUErQztBQTBJL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxZQUFZLENBQWU7SUFDM0IsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsQ0FBVTtJQUNsQixRQUFRLENBQXlCO0lBRWxEOztPQUVHO0lBQ2MsS0FBSyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRXpELFlBQVksS0FBeUI7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxXQUFXLENBQ2pCLFNBQWlCLEVBQ2pCLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLFNBQThDLEVBQzlDLFFBQWdDO1FBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sWUFBWSxHQUFHLElB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QU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3BELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgdHlwZSAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHtcbiAgZm9ybWF0RGlmZmVyZW5jZXMsXG4gIGZvcm1hdFNlY3VyaXR5Q2hhbmdlcyxcbiAgZnVsbERpZmYsXG4gIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbixcbiAgdHlwZSBEZXNjcmliZUNoYW5nZVNldE91dHB1dCxcbiAgdHlwZSBSZXNvdXJjZURpZmZlcmVuY2UsXG4gIHR5cGUgVGVtcGxhdGVEaWZmLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IFBlcm1pc3Npb25DaGFuZ2VUeXBlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRTdGFja1RlbXBsYXRlcywgVGVtcGxhdGUgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBTdHJpbmdXcml0ZVN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbXMnO1xuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTZWN1cml0eURpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgc2VjdXJpdHkgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwZXJtaXNzaW9uIGNoYW5nZXMgaW4gdGhlIHNlY3VyaXR5IGRpZmYuXG4gICAqIFRoZSBJb0hvc3Qgd2lsbCB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcHJpbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogUGVybWlzc2lvbkNoYW5nZVR5cGU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFja3Mgd2l0aCBzZWN1cml0eSBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTdGFja0RpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggZGlmZiBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRGlmZiBGb3JtYXR0ZXJcbiAqL1xuaW50ZXJmYWNlIERpZmZGb3JtYXR0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBUZW1wbGF0ZSB0aGF0IGlzIGJlaW5nIGRpZmZlZC5cbiAgICogSW5jbHVkZXMgdGhlIG9sZC9jdXJyZW50IHN0YXRlIG9mIHRoZSBzdGFjayBhcyB3ZWxsIGFzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZUluZm86IFRlbXBsYXRlSW5mbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHNwZWNpZmljIHRvIGZvcm1hdHRpbmcgdGhlIHN0YWNrIGRpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk9wdGlvbnMge1xuICAvKipcbiAgICogZG8gbm90IGZpbHRlciBvdXQgQVdTOjpDREs6Ok1ldGFkYXRhIG9yIFJ1bGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBsaW5lcyBvZiBjb250ZXh0IHRvIHVzZSBpbiBhcmJpdHJhcnkgSlNPTiBkaWZmXG4gICAqXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRMaW5lcz86IG51bWJlcjtcblxuICAvKipcbiAgICogc2lsZW5jZXMgXFwnVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcJyBtZXNzYWdlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmV1c2FibGVTdGFja0RpZmZPcHRpb25zIGV4dGVuZHMgRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyB7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBzcGVjaWZpYyB0byBmb3JtYXR0aW5nIHRoZSBzZWN1cml0eSBkaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zIHtcbiAgLyoqXG4gICAqIHNpbGVuY2VzIHN0YWNrIG5hbWVzIGFuZCAnbm8gY2hhbmdlcycgbWVzc2FnZXMgZm9yIHN0YWNrcyB3aXRob3V0IHNlY3VyaXR5IGNoYW5nZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhIHRlbXBsYXRlJ3Mgb2xkL25ldyBzdGF0ZVxuICogdGhhdCBpcyB1c2VkIGZvciBkaWZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgb2xkL2V4aXN0aW5nIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IG5ld1RlbXBsYXRlOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEEgQ2xvdWRGb3JtYXRpb24gQ2hhbmdlU2V0IHRvIGhlbHAgdGhlIGRpZmYgb3BlcmF0aW9uLlxuICAgKiBQcm9iYWJseSBjcmVhdGVkIHZpYSBgY3JlYXRlRGlmZkNoYW5nZVNldGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0PzogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkgaW1wb3J0ZWQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc0ltcG9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFueSBuZXN0ZWQgc3RhY2tzIGluY2x1ZGVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tzPzoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcHBpbmdzIG9mIG9sZCBsb2NhdGlvbnMgdG8gbmV3IGxvY2F0aW9ucy4gSWYgdGhlc2UgYXJlIHByb3ZpZGVkLFxuICAgKiBmb3IgYWxsIHJlc291cmNlcyB0aGF0IHdlcmUgbW92ZWQsIHRoZWlyIGNvcnJlc3BvbmRpbmcgYWRkaXRpb25cbiAgICogYW5kIHJlbW92YWwgbGluZXMgd2lsbCBiZSBhdWdtZW50ZWQgd2l0aCB0aGUgbG9jYXRpb24gdGhleSB3ZXJlXG4gICAqIG1vdmVkIGZvbSBhbmQgdG8sIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIHJlYWRvbmx5IG1hcHBpbmdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgZm9ybWF0dGluZyB0aGUgZGlmZiBvdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIERpZmZGb3JtYXR0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlSW5mbzogVGVtcGxhdGVJbmZvO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW1wb3J0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDYWNoZSBvZiBjb21wdXRlZCBUZW1wbGF0ZURpZmZzLCBpbmRleGVkIGJ5IHN0YWNrIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlRGlmZj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlmZkZvcm1hdHRlclByb3BzKSB7XG4gICAgdGhpcy50ZW1wbGF0ZUluZm8gPSBwcm9wcy50ZW1wbGF0ZUluZm87XG4gICAgdGhpcy5zdGFja05hbWUgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUuZGlzcGxheU5hbWUgPz8gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLnN0YWNrTmFtZTtcbiAgICB0aGlzLmlzSW1wb3J0ID0gcHJvcHMudGVtcGxhdGVJbmZvLmlzSW1wb3J0ID8/IGZhbHNlO1xuICAgIHRoaXMubWFwcGluZ3MgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubWFwcGluZ3MgPz8ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZzKCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgZGlmZiBmb3IgYSBzaW5nbGUgc3RhY2suIFJlc3VsdHMgYXJlIGNhY2hlZCBieSBzdGFjayBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gVGhlIG5hbWUgdG8gY2FjaGUgdGhlIGRpZmYgdW5kZXJcbiAgICogQHBhcmFtIG9sZFRlbXBsYXRlIC0gVGhlIGRlcGxveWVkIHRlbXBsYXRlXG4gICAqIEBwYXJhbSBuZXdUZW1wbGF0ZSAtIFRoZSBuZXcvZ2VuZXJhdGVkIHRlbXBsYXRlIChyZWFkIGZyb20gdGhlIGFydGlmYWN0KVxuICAgKiBAcGFyYW0gY2hhbmdlU2V0IC0gVGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldCBmb3IgdGhpcyBzcGVjaWZpYyBzdGFjaywgaWYgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBtYXBwaW5ncyAtIFJlc291cmNlIG1vdmUgbWFwcGluZ3NcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZURpZmYoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IHwgdW5kZWZpbmVkLFxuICAgIG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBUZW1wbGF0ZURpZmYge1xuICAgIGlmICghdGhpcy5jYWNoZS5oYXMoc3RhY2tOYW1lKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZnVsbERpZmYob2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIHRoaXMuaXNJbXBvcnQpO1xuXG4gICAgICBjb25zdCBzZXRNb3ZlID0gKGNoYW5nZTogUmVzb3VyY2VEaWZmZXJlbmNlLCBkaXJlY3Rpb246ICdmcm9tJyB8ICd0bycsIGxvY2F0aW9uPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgW3NvdXJjZVN0YWNrTmFtZSwgc291cmNlTG9naWNhbElkXSA9IGxvY2F0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY2hhbmdlLm1vdmUgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgICBzdGFja05hbWU6IHNvdXJjZVN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGVtcGxhdGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGNoYW5nZSkgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3N0YWNrTmFtZX0uJHtpZH1gO1xuICAgICAgICBpZiAoY2hhbmdlLmlzQWRkaXRpb24gJiYgT2JqZWN0LnZhbHVlcyhtYXBwaW5ncykuaW5jbHVkZXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgc2V0TW92ZShjaGFuZ2UsICdmcm9tJywgT2JqZWN0LmtleXMobWFwcGluZ3MpLmZpbmQoayA9PiBtYXBwaW5nc1trXSA9PT0gbG9jYXRpb24pKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNSZW1vdmFsICYmIE9iamVjdC5rZXlzKG1hcHBpbmdzKS5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgICBzZXRNb3ZlKGNoYW5nZSwgJ3RvJywgbWFwcGluZ3NbbG9jYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FjaGUuc2V0KHN0YWNrTmFtZSwgdGVtcGxhdGVEaWZmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHN0YWNrTmFtZSkhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgc3RhY2sgZGlmZiwgaW5jbHVkaW5nIGFsbCBuZXN0ZWQgc3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFN0YWNrRGlmZihvcHRpb25zOiBGb3JtYXRTdGFja0RpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTdGFja0RpZmZPdXRwdXQge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFN0YWNrRGlmZkhlbHBlcih7XG4gICAgICBvbGRUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ub2xkVGVtcGxhdGUsXG4gICAgICBuZXdUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUudGVtcGxhdGUsXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgbmVzdGVkU3RhY2tzOiB0aGlzLnRlbXBsYXRlSW5mby5uZXN0ZWRTdGFja3MsXG4gICAgICBjaGFuZ2VTZXQ6IHRoaXMudGVtcGxhdGVJbmZvLmNoYW5nZVNldCxcbiAgICAgIG1hcHBpbmdzOiB0aGlzLm1hcHBpbmdzLFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLFxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTdGFja0RpZmZIZWxwZXIocGFyYW1zOiB7XG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICBzdGFja05hbWU6IHN0cmluZztcbiAgICBuZXN0ZWRTdGFja3M6IHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9IHwgdW5kZWZpbmVkO1xuICAgIGNoYW5nZVNldDogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbG9naWNhbElkTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9LCBvcHRpb25zOiBSZXVzYWJsZVN0YWNrRGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFN0YWNrRGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBvbGRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUsIHN0YWNrTmFtZSwgbmVzdGVkU3RhY2tzLCBjaGFuZ2VTZXQsIG1hcHBpbmdzLCBsb2dpY2FsSWRNYXAgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbXB1dGVEaWZmKHN0YWNrTmFtZSwgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIG1hcHBpbmdzKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICAgIGxldCBudW1TdGFja3NXaXRoQ2hhbmdlcyA9IDA7XG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSAnJztcbiAgICBsZXQgZmlsdGVyZWRDaGFuZ2VzQ291bnQgPSAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIG11c3Qgb3V0cHV0IHRoZSBzdGFjayBuYW1lIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcywgZXZlbiBpZiBxdWlldFxuICAgICAgaWYgKHN0YWNrTmFtZSAmJiAoIW9wdGlvbnMucXVpZXQgfHwgIWRpZmYuaXNFbXB0eSkpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKGZvcm1hdChgU3RhY2sgJHtjaGFsay5ib2xkKHN0YWNrTmFtZSl9XFxuYCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMucXVpZXQgJiYgdGhpcy5pc0ltcG9ydCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoJ1BhcmFtZXRlcnMgYW5kIHJ1bGVzIGNyZWF0ZWQgZHVyaW5nIG1pZ3JhdGlvbiBkbyBub3QgYWZmZWN0IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRldGVjdCBhbmQgZmlsdGVyIG91dCBtYW5nbGVkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZGlmZlxuICAgICAgbGV0IGFjdGl2ZURpZmYgPSBkaWZmO1xuICAgICAgaWYgKGRpZmYuZGlmZmVyZW5jZUNvdW50ICYmICFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBjb25zdCBtYW5nbGVkTmV3VGVtcGxhdGUgPSBKU09OLnBhcnNlKG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbihKU09OLnN0cmluZ2lmeShuZXdUZW1wbGF0ZSkpKTtcbiAgICAgICAgY29uc3QgbWFuZ2xlZERpZmYgPSBmdWxsRGlmZihvbGRUZW1wbGF0ZSwgbWFuZ2xlZE5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQpO1xuICAgICAgICBmaWx0ZXJlZENoYW5nZXNDb3VudCA9IE1hdGgubWF4KDAsIGRpZmYuZGlmZmVyZW5jZUNvdW50IC0gbWFuZ2xlZERpZmYuZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICAgIGFjdGl2ZURpZmYgPSBtYW5nbGVkRGlmZjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmaWx0ZXIgb3V0ICdBV1M6OkNESzo6TWV0YWRhdGEnIHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gZmlsdGVyIG91dCAnQ2hlY2tCb290c3RyYXBWZXJzaW9uJyBydWxlcyBmcm9tIHRoZSB0ZW1wbGF0ZVxuICAgICAgaWYgKCFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBvYnNjdXJlRGlmZihhY3RpdmVEaWZmKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhY3RpdmVEaWZmLmlzRW1wdHkpIHtcbiAgICAgICAgbnVtU3RhY2tzV2l0aENoYW5nZXMrKztcblxuICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyhzdHJlYW0sIGFjdGl2ZURpZmYsIHtcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUob2xkVGVtcGxhdGUpLFxuICAgICAgICAgIC4uLmxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZShuZXdUZW1wbGF0ZSksXG4gICAgICAgICAgLi4ubG9naWNhbElkTWFwLFxuICAgICAgICB9LCBvcHRpb25zLmNvbnRleHRMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGBPbWl0dGVkICR7ZmlsdGVyZWRDaGFuZ2VzQ291bnR9IGNoYW5nZXMgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgbWFuZ2xlZCBub24tQVNDSUkgY2hhcmFjdGVycy4gVXNlIC0tc3RyaWN0IHRvIHByaW50IHRoZW0uXFxuYCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtYXR0ZWREaWZmID0gc3RyZWFtLnRvU3RyaW5nKCk7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuXG4gICAgLy8gUmVjdXJzZSBpbnRvIG5lc3RlZCBzdGFja3NcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIG5lc3RlZFN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRTdGFja3MgPz8ge30pKSB7XG4gICAgICBjb25zdCBuZXh0RGlmZiA9IHRoaXMuZm9ybWF0U3RhY2tEaWZmSGVscGVyKHtcbiAgICAgICAgb2xkVGVtcGxhdGU6IG5lc3RlZFN0YWNrLmRlcGxveWVkVGVtcGxhdGUsXG4gICAgICAgIG5ld1RlbXBsYXRlOiBuZXN0ZWRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgICAgc3RhY2tOYW1lOiBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbG9naWNhbElkLFxuICAgICAgICBuZXN0ZWRTdGFja3M6IG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBjaGFuZ2VTZXQ6IG5lc3RlZFN0YWNrLmNoYW5nZVNldCxcbiAgICAgICAgbWFwcGluZ3MsXG4gICAgICAgIGxvZ2ljYWxJZE1hcDoge30sXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5leHREaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXh0RGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgIH1cblxuICAgIHJldHVybiB7IG51bVN0YWNrc1dpdGhDaGFuZ2VzLCBmb3JtYXR0ZWREaWZmIH07XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBzZWN1cml0eSBkaWZmLCBpbmNsdWRpbmcgYWxsIG5lc3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgZm9ybWF0U2VjdXJpdHlEaWZmKG9wdGlvbnM6IEZvcm1hdFNlY3VyaXR5RGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBmb3JtYXR0ZWREaWZmLCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfSA9IHRoaXMuZm9ybWF0U2VjdXJpdHlEaWZmSGVscGVyKHtcbiAgICAgIG9sZFRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5vbGRUZW1wbGF0ZSxcbiAgICAgIG5ld1RlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS50ZW1wbGF0ZSxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICBuZXN0ZWRTdGFja3M6IHRoaXMudGVtcGxhdGVJbmZvLm5lc3RlZFN0YWNrcyxcbiAgICAgIGNoYW5nZVNldDogdGhpcy50ZW1wbGF0ZUluZm8uY2hhbmdlU2V0LFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLFxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHsgZm9ybWF0dGVkRGlmZiwgcGVybWlzc2lvbkNoYW5nZVR5cGUsIG51bVN0YWNrc1dpdGhDaGFuZ2VzIH07XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFNlY3VyaXR5RGlmZkhlbHBlcihwYXJhbXM6IHtcbiAgICBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgbmV3VGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIHN0YWNrTmFtZTogc3RyaW5nO1xuICAgIG5lc3RlZFN0YWNrczogeyBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gfCB1bmRlZmluZWQ7XG4gICAgY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldE91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsb2dpY2FsSWRNYXA/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9LCBvcHRpb25zOiBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTZWN1cml0eURpZmZPdXRwdXQge1xuICAgIGNvbnN0IHsgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBzdGFja05hbWUsIG5lc3RlZFN0YWNrcywgY2hhbmdlU2V0LCBsb2dpY2FsSWRNYXAgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbXB1dGVEaWZmKHN0YWNrTmFtZSwgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIHRoaXMubWFwcGluZ3MpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25DaGFuZ2VUeXBlID0gcGVybWlzc2lvblR5cGVGcm9tRGlmZihkaWZmKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICAgIGlmICghb3B0aW9ucy5xdWlldCB8fCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSkge1xuICAgICAgc3RyZWFtLndyaXRlKGZvcm1hdChgU3RhY2sgJHtjaGFsay5ib2xkKHN0YWNrTmFtZSl9XFxuYCkpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBmb3JtYXRTZWN1cml0eUNoYW5nZXMoc3RyZWFtLCBkaWZmLCB7XG4gICAgICAgIC4uLmxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZShuZXdUZW1wbGF0ZSksXG4gICAgICAgIC4uLmxvZ2ljYWxJZE1hcCxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdHRlZERpZmYgPSBzdHJlYW0udG9TdHJpbmcoKTtcbiAgICBpZiAoIW9wdGlvbnMucXVpZXQgJiYgcGVybWlzc2lvbkNoYW5nZVR5cGUgPT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUpIHtcbiAgICAgIGZvcm1hdHRlZERpZmYgKz0gY2hhbGsuZ3JlZW4oJ1RoZXJlIHdlcmUgbm8gc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIChsaW1pdGF0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xMjk5KVxcbicpO1xuICAgIH1cbiAgICBsZXQgbnVtU3RhY2tzV2l0aENoYW5nZXMgPSBwZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSA/IDEgOiAwO1xuICAgIGxldCBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9IHBlcm1pc3Npb25DaGFuZ2VUeXBlO1xuXG4gICAgLy8gUmVjdXJzZSBpbnRvIG5lc3RlZCBzdGFja3NcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIG5lc3RlZFN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRTdGFja3MgPz8ge30pKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSB0aGlzLmZvcm1hdFNlY3VyaXR5RGlmZkhlbHBlcih7XG4gICAgICAgIG9sZFRlbXBsYXRlOiBuZXN0ZWRTdGFjay5kZXBsb3llZFRlbXBsYXRlLFxuICAgICAgICBuZXdUZW1wbGF0ZTogbmVzdGVkU3RhY2suZ2VuZXJhdGVkVGVtcGxhdGUsXG4gICAgICAgIHN0YWNrTmFtZTogbmVzdGVkU3RhY2sucGh5c2ljYWxOYW1lID8/IGxvZ2ljYWxJZCxcbiAgICAgICAgbmVzdGVkU3RhY2tzOiBuZXN0ZWRTdGFjay5uZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICAgY2hhbmdlU2V0OiBuZXN0ZWRTdGFjay5jaGFuZ2VTZXQsXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIGZvcm1hdHRlZERpZmYgKz0gbmVzdGVkUmVzdWx0LmZvcm1hdHRlZERpZmYgPyAnXFxuJyArIG5lc3RlZFJlc3VsdC5mb3JtYXR0ZWREaWZmIDogJyc7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcyArPSBuZXN0ZWRSZXN1bHQubnVtU3RhY2tzV2l0aENoYW5nZXM7XG4gICAgICAvLyBFc2NhbGF0ZTogaWYgYW55IG5lc3RlZCBzdGFjayBicm9hZGVucyBwZXJtaXNzaW9ucywgdGhlIHdob2xlIHRoaW5nIGJyb2FkZW5zXG4gICAgICBpZiAobmVzdGVkUmVzdWx0LnBlcm1pc3Npb25DaGFuZ2VUeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5CUk9BREVOSU5HKSB7XG4gICAgICAgIGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlID0gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgICAgIH0gZWxzZSBpZiAobmVzdGVkUmVzdWx0LnBlcm1pc3Npb25DaGFuZ2VUeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05fQlJPQURFTklOR1xuICAgICAgICAmJiBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9PT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSkge1xuICAgICAgICBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTl9CUk9BREVOSU5HO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGZvcm1hdHRlZERpZmYsIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJtaXNzaW9uVHlwZUZyb21EaWZmKGRpZmY6IFRlbXBsYXRlRGlmZik6IFBlcm1pc3Npb25DaGFuZ2VUeXBlIHtcbiAgaWYgKGRpZmYucGVybWlzc2lvbnNCcm9hZGVuZWQpIHtcbiAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORztcbiAgfSBlbHNlIGlmIChkaWZmLnBlcm1pc3Npb25zQW55Q2hhbmdlcykge1xuICAgIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05fQlJPQURFTklORztcbiAgfVxuICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpIHtcbiAgY29uc3QgbWFwOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtZCBvZiBzdGFjay5maW5kTWV0YWRhdGFCeVR5cGUoY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5MT0dJQ0FMX0lEKSkge1xuICAgIG1hcFttZC5kYXRhIGFzIHN0cmluZ10gPSBtZC5wYXRoO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbmZ1bmN0aW9uIGxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBbbG9naWNhbElkLCByZXNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXMoKHRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PikpIHtcbiAgICBjb25zdCBwYXRoID0gcmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICByZXRbbG9naWNhbElkXSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUmVtb3ZlIGFueSB0ZW1wbGF0ZSBlbGVtZW50cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2hvdyB1c2Vycy5cbiAqIFRoaXMgaXMgY3VycmVudGx5OlxuICogLSBBV1M6OkNESzo6TWV0YWRhdGEgcmVzb3VyY2VcbiAqIC0gQ2hlY2tCb290c3RyYXBWZXJzaW9uIFJ1bGVcbiAqL1xuZnVuY3Rpb24gb2JzY3VyZURpZmYoZGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmIChkaWZmLnVua25vd24pIHtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNzk0MlxuICAgIGRpZmYudW5rbm93biA9IGRpZmYudW5rbm93bi5maWx0ZXIoY2hhbmdlID0+IHtcbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5uZXdWYWx1ZT8uQ2hlY2tCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2Uub2xkVmFsdWU/LkNoZWNrQm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaWZmLnJlc291cmNlcykge1xuICAgIGRpZmYucmVzb3VyY2VzID0gZGlmZi5yZXNvdXJjZXMuZmlsdGVyKGNoYW5nZSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UubmV3UmVzb3VyY2VUeXBlID09PSAnQVdTOjpDREs6Ok1ldGFkYXRhJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm9sZFJlc291cmNlVHlwZSA9PT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -12,6 +12,7 @@ import type { HotswapDeploymentDetails, HotswapDeploymentAttempt, HotswappableCh
12
12
  import type { ResourceIdentificationRequest, ResourceImportRequest } from '../../../payloads/import';
13
13
  import type { StackDetailsPayload } from '../../../payloads/list';
14
14
  import type { CloudWatchLogEvent, CloudWatchLogMonitorControlEvent } from '../../../payloads/logs-monitor';
15
+ import type { AssetsPayload } from '../../../payloads/publish-assets';
15
16
  import type { RefactorResult } from '../../../payloads/refactor';
16
17
  import type { StackRollbackProgress } from '../../../payloads/rollback';
17
18
  import type { MfaTokenRequest, SdkTrace } from '../../../payloads/sdk';
@@ -106,6 +107,9 @@ export declare const IO: {
106
107
  }>;
107
108
  CDK_TOOLKIT_E9900: make.IoMessageMaker<ErrorPayload>;
108
109
  CDK_TOOLKIT_I9300: make.IoMessageMaker<FeatureFlagChangeRequest>;
110
+ CDK_TOOLKIT_I9400: make.IoMessageMaker<void>;
111
+ CDK_TOOLKIT_I9401: make.IoMessageMaker<AssetsPayload>;
112
+ CDK_TOOLKIT_I9402: make.IoMessageMaker<AssetsPayload>;
109
113
  CDK_TOOLKIT_I0100: make.IoMessageMaker<void>;
110
114
  CDK_TOOLKIT_W0101: make.IoMessageMaker<void>;
111
115
  CDK_TOOLKIT_E0101: make.IoMessageMaker<void>;