aws-cdk 2.10.0 → 2.11.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.
package/test/diff.test.js CHANGED
@@ -9,109 +9,228 @@ const util_1 = require("./util");
9
9
  let cloudExecutable;
10
10
  let cloudFormation;
11
11
  let toolkit;
12
- beforeEach(() => {
13
- cloudExecutable = new util_1.MockCloudExecutable({
14
- stacks: [{
15
- stackName: 'A',
16
- template: { resource: 'A' },
17
- },
18
- {
19
- stackName: 'B',
20
- depends: ['A'],
21
- template: { resource: 'B' },
22
- },
23
- {
24
- stackName: 'C',
25
- depends: ['A'],
26
- template: { resource: 'C' },
27
- metadata: {
28
- '/resource': [
29
- {
30
- type: cxschema.ArtifactMetadataEntryType.ERROR,
31
- data: 'this is an error',
32
- },
33
- ],
12
+ describe('non-nested stacks', () => {
13
+ beforeEach(() => {
14
+ cloudExecutable = new util_1.MockCloudExecutable({
15
+ stacks: [{
16
+ stackName: 'A',
17
+ template: { resource: 'A' },
18
+ },
19
+ {
20
+ stackName: 'B',
21
+ depends: ['A'],
22
+ template: { resource: 'B' },
34
23
  },
35
- },
36
- {
37
- stackName: 'D',
38
- template: { resource: 'D' },
39
- }],
24
+ {
25
+ stackName: 'C',
26
+ depends: ['A'],
27
+ template: { resource: 'C' },
28
+ metadata: {
29
+ '/resource': [
30
+ {
31
+ type: cxschema.ArtifactMetadataEntryType.ERROR,
32
+ data: 'this is an error',
33
+ },
34
+ ],
35
+ },
36
+ },
37
+ {
38
+ stackName: 'D',
39
+ template: { resource: 'D' },
40
+ }],
41
+ });
42
+ cloudFormation = util_1.instanceMockFrom(cloudformation_deployments_1.CloudFormationDeployments);
43
+ toolkit = new cdk_toolkit_1.CdkToolkit({
44
+ cloudExecutable,
45
+ cloudFormation,
46
+ configuration: cloudExecutable.configuration,
47
+ sdkProvider: cloudExecutable.sdkProvider,
48
+ });
49
+ // Default implementations
50
+ cloudFormation.readCurrentTemplateWithNestedStacks.mockImplementation((stackArtifact) => {
51
+ if (stackArtifact.stackName === 'D') {
52
+ return Promise.resolve({ resource: 'D' });
53
+ }
54
+ return Promise.resolve({});
55
+ });
56
+ cloudFormation.deployStack.mockImplementation((options) => Promise.resolve({
57
+ noOp: true,
58
+ outputs: {},
59
+ stackArn: '',
60
+ stackArtifact: options.stack,
61
+ }));
40
62
  });
41
- cloudFormation = util_1.instanceMockFrom(cloudformation_deployments_1.CloudFormationDeployments);
42
- toolkit = new cdk_toolkit_1.CdkToolkit({
43
- cloudExecutable,
44
- cloudFormation,
45
- configuration: cloudExecutable.configuration,
46
- sdkProvider: cloudExecutable.sdkProvider,
63
+ test('diff can diff multiple stacks', async () => {
64
+ // GIVEN
65
+ const buffer = new StringWritable();
66
+ // WHEN
67
+ const exitCode = await toolkit.diff({
68
+ stackNames: ['B'],
69
+ stream: buffer,
70
+ });
71
+ // THEN
72
+ const plainTextOutput = buffer.data.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
73
+ expect(plainTextOutput).toContain('Stack A');
74
+ expect(plainTextOutput).toContain('Stack B');
75
+ expect(exitCode).toBe(0);
47
76
  });
48
- // Default implementations
49
- cloudFormation.readCurrentTemplate.mockImplementation((stackArtifact) => {
50
- if (stackArtifact.stackName === 'D') {
51
- return Promise.resolve({ resource: 'D' });
52
- }
53
- return Promise.resolve({});
77
+ test('exits with 1 with diffs and fail set to true', async () => {
78
+ // GIVEN
79
+ const buffer = new StringWritable();
80
+ // WHEN
81
+ const exitCode = await toolkit.diff({
82
+ stackNames: ['A'],
83
+ stream: buffer,
84
+ fail: true,
85
+ });
86
+ // THEN
87
+ expect(exitCode).toBe(1);
54
88
  });
55
- cloudFormation.deployStack.mockImplementation((options) => Promise.resolve({
56
- noOp: true,
57
- outputs: {},
58
- stackArn: '',
59
- stackArtifact: options.stack,
60
- }));
61
- });
62
- test('diff can diff multiple stacks', async () => {
63
- // GIVEN
64
- const buffer = new StringWritable();
65
- // WHEN
66
- const exitCode = await toolkit.diff({
67
- stackNames: ['B'],
68
- stream: buffer,
89
+ test('throws an error if no valid stack names given', async () => {
90
+ const buffer = new StringWritable();
91
+ // WHEN
92
+ await expect(() => toolkit.diff({
93
+ stackNames: ['X', 'Y', 'Z'],
94
+ stream: buffer,
95
+ })).rejects.toThrow('No stacks match the name(s) X,Y,Z');
69
96
  });
70
- // THEN
71
- const plainTextOutput = buffer.data.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
72
- expect(plainTextOutput).toContain('Stack A');
73
- expect(plainTextOutput).toContain('Stack B');
74
- expect(exitCode).toBe(0);
75
- });
76
- test('exits with 1 with diffs and fail set to true', async () => {
77
- // GIVEN
78
- const buffer = new StringWritable();
79
- // WHEN
80
- const exitCode = await toolkit.diff({
81
- stackNames: ['A'],
82
- stream: buffer,
83
- fail: true,
97
+ test('exits with 1 with diff in first stack, but not in second stack and fail set to true', async () => {
98
+ // GIVEN
99
+ const buffer = new StringWritable();
100
+ // WHEN
101
+ const exitCode = await toolkit.diff({
102
+ stackNames: ['A', 'D'],
103
+ stream: buffer,
104
+ fail: true,
105
+ });
106
+ // THEN
107
+ expect(exitCode).toBe(1);
84
108
  });
85
- // THEN
86
- expect(exitCode).toBe(1);
87
- });
88
- test('throws an error if no valid stack names given', async () => {
89
- const buffer = new StringWritable();
90
- // WHEN
91
- await expect(() => toolkit.diff({
92
- stackNames: ['X', 'Y', 'Z'],
93
- stream: buffer,
94
- })).rejects.toThrow('No stacks match the name(s) X,Y,Z');
95
- });
96
- test('exits with 1 with diff in first stack, but not in second stack and fail set to true', async () => {
97
- // GIVEN
98
- const buffer = new StringWritable();
99
- // WHEN
100
- const exitCode = await toolkit.diff({
101
- stackNames: ['A', 'D'],
102
- stream: buffer,
103
- fail: true,
109
+ test('throws an error during diffs on stack with error metadata', async () => {
110
+ const buffer = new StringWritable();
111
+ // WHEN
112
+ await expect(() => toolkit.diff({
113
+ stackNames: ['C'],
114
+ stream: buffer,
115
+ })).rejects.toThrow(/Found errors/);
104
116
  });
105
- // THEN
106
- expect(exitCode).toBe(1);
107
117
  });
108
- test('throws an error during diffs on stack with error metadata', async () => {
109
- const buffer = new StringWritable();
110
- // WHEN
111
- await expect(() => toolkit.diff({
112
- stackNames: ['C'],
113
- stream: buffer,
114
- })).rejects.toThrow(/Found errors/);
118
+ describe('nested stacks', () => {
119
+ beforeEach(() => {
120
+ cloudExecutable = new util_1.MockCloudExecutable({
121
+ stacks: [{
122
+ stackName: 'Parent',
123
+ template: {},
124
+ }],
125
+ });
126
+ cloudFormation = util_1.instanceMockFrom(cloudformation_deployments_1.CloudFormationDeployments);
127
+ toolkit = new cdk_toolkit_1.CdkToolkit({
128
+ cloudExecutable,
129
+ cloudFormation,
130
+ configuration: cloudExecutable.configuration,
131
+ sdkProvider: cloudExecutable.sdkProvider,
132
+ });
133
+ cloudFormation.readCurrentTemplateWithNestedStacks.mockImplementation((stackArtifact) => {
134
+ if (stackArtifact.stackName === 'Parent') {
135
+ stackArtifact.template.Resources = {
136
+ AdditionChild: {
137
+ Type: 'AWS::CloudFormation::Stack',
138
+ Resources: {
139
+ SomeResource: {
140
+ Type: 'AWS::Something',
141
+ Properties: {
142
+ Prop: 'added-value',
143
+ },
144
+ },
145
+ },
146
+ },
147
+ DeletionChild: {
148
+ Type: 'AWS::CloudFormation::Stack',
149
+ Resources: {
150
+ SomeResource: {
151
+ Type: 'AWS::Something',
152
+ },
153
+ },
154
+ },
155
+ ChangedChild: {
156
+ Type: 'AWS::CloudFormation::Stack',
157
+ Resources: {
158
+ SomeResource: {
159
+ Type: 'AWS::Something',
160
+ Properties: {
161
+ Prop: 'new-value',
162
+ },
163
+ },
164
+ },
165
+ },
166
+ };
167
+ return Promise.resolve({
168
+ Resources: {
169
+ AdditionChild: {
170
+ Type: 'AWS::CloudFormation::Stack',
171
+ Resources: {
172
+ SomeResource: {
173
+ Type: 'AWS::Something',
174
+ },
175
+ },
176
+ },
177
+ DeletionChild: {
178
+ Type: 'AWS::CloudFormation::Stack',
179
+ Resources: {
180
+ SomeResource: {
181
+ Type: 'AWS::Something',
182
+ Properties: {
183
+ Prop: 'value-to-be-removed',
184
+ },
185
+ },
186
+ },
187
+ },
188
+ ChangedChild: {
189
+ Type: 'AWS::CloudFormation::Stack',
190
+ Resources: {
191
+ SomeResource: {
192
+ Type: 'AWS::Something',
193
+ Properties: {
194
+ Prop: 'old-value',
195
+ },
196
+ },
197
+ },
198
+ },
199
+ },
200
+ });
201
+ }
202
+ return Promise.resolve({});
203
+ });
204
+ });
205
+ test('diff can diff nested stacks', async () => {
206
+ // GIVEN
207
+ const buffer = new StringWritable();
208
+ // WHEN
209
+ const exitCode = await toolkit.diff({
210
+ stackNames: ['Parent'],
211
+ stream: buffer,
212
+ });
213
+ // THEN
214
+ const plainTextOutput = buffer.data.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
215
+ expect(plainTextOutput.trim()).toEqual(`Stack Parent
216
+ Resources
217
+ [~] AWS::CloudFormation::Stack AdditionChild
218
+ └─ [~] Resources
219
+ └─ [~] .SomeResource:
220
+ └─ [+] Added: .Properties
221
+ [~] AWS::CloudFormation::Stack DeletionChild
222
+ └─ [~] Resources
223
+ └─ [~] .SomeResource:
224
+ └─ [-] Removed: .Properties
225
+ [~] AWS::CloudFormation::Stack ChangedChild
226
+ └─ [~] Resources
227
+ └─ [~] .SomeResource:
228
+ └─ [~] .Properties:
229
+ └─ [~] .Prop:
230
+ ├─ [-] old-value
231
+ └─ [+] new-value`);
232
+ expect(exitCode).toBe(0);
233
+ });
115
234
  });
116
235
  class StringWritable extends stream_1.Writable {
117
236
  constructor(options = {}) {
@@ -131,4 +250,4 @@ class StringWritable extends stream_1.Writable {
131
250
  callback();
132
251
  }
133
252
  }
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQWtDO0FBQ2xDLG1EQUFrRTtBQUNsRSwyREFBMkQ7QUFFM0Qsc0ZBQWtGO0FBQ2xGLG9EQUFnRDtBQUNoRCxpQ0FBK0Q7QUFFL0QsSUFBSSxlQUFvQyxDQUFDO0FBQ3pDLElBQUksY0FBc0QsQ0FBQztBQUMzRCxJQUFJLE9BQW1CLENBQUM7QUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLGVBQWUsR0FBRyxJQUFJLDBCQUFtQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDO2dCQUNQLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7YUFDNUI7WUFDRDtnQkFDRSxTQUFTLEVBQUUsR0FBRztnQkFDZCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTthQUM1QjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxHQUFHO2dCQUNkLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDZCxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUMzQixRQUFRLEVBQUU7b0JBQ1IsV0FBVyxFQUFFO3dCQUNYOzRCQUNFLElBQUksRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsS0FBSzs0QkFDOUMsSUFBSSxFQUFFLGtCQUFrQjt5QkFDekI7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7YUFDNUIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILGNBQWMsR0FBRyx1QkFBZ0IsQ0FBQyxzREFBeUIsQ0FBQyxDQUFDO0lBRTdELE9BQU8sR0FBRyxJQUFJLHdCQUFVLENBQUM7UUFDdkIs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QyxRQUF3QztRQUNwRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBOb2RlU3RyaW5nRGVjb2RlciwgU3RyaW5nRGVjb2RlciB9IGZyb20gJ3N0cmluZ19kZWNvZGVyJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cyB9IGZyb20gJy4uL2xpYi9hcGkvY2xvdWRmb3JtYXRpb24tZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgQ2RrVG9vbGtpdCB9IGZyb20gJy4uL2xpYi9jZGstdG9vbGtpdCc7XG5pbXBvcnQgeyBpbnN0YW5jZU1vY2tGcm9tLCBNb2NrQ2xvdWRFeGVjdXRhYmxlIH0gZnJvbSAnLi91dGlsJztcblxubGV0IGNsb3VkRXhlY3V0YWJsZTogTW9ja0Nsb3VkRXhlY3V0YWJsZTtcbmxldCBjbG91ZEZvcm1hdGlvbjogamVzdC5Nb2NrZWQ8Q2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cz47XG5sZXQgdG9vbGtpdDogQ2RrVG9vbGtpdDtcbmJlZm9yZUVhY2goKCkgPT4ge1xuICBjbG91ZEV4ZWN1dGFibGUgPSBuZXcgTW9ja0Nsb3VkRXhlY3V0YWJsZSh7XG4gICAgc3RhY2tzOiBbe1xuICAgICAgc3RhY2tOYW1lOiAnQScsXG4gICAgICB0ZW1wbGF0ZTogeyByZXNvdXJjZTogJ0EnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGFja05hbWU6ICdCJyxcbiAgICAgIGRlcGVuZHM6IFsnQSddLFxuICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdCJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhY2tOYW1lOiAnQycsXG4gICAgICBkZXBlbmRzOiBbJ0EnXSxcbiAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnQycgfSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICcvcmVzb3VyY2UnOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5FUlJPUixcbiAgICAgICAgICAgIGRhdGE6ICd0aGlzIGlzIGFuIGVycm9yJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YWNrTmFtZTogJ0QnLFxuICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdEJyB9LFxuICAgIH1dLFxuICB9KTtcblxuICBjbG91ZEZvcm1hdGlvbiA9IGluc3RhbmNlTW9ja0Zyb20oQ2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cyk7XG5cbiAgdG9vbGtpdCA9IG5ldyBDZGtUb29sa2l0KHtcbiAgICBjbG91ZEV4ZWN1dGFibGUsXG4gICAgY2xvdWRGb3JtYXRpb24sXG4gICAgY29uZmlndXJhdGlvbjogY2xvdWRFeGVjdXRhYmxlLmNvbmZpZ3VyYXRpb24sXG4gICAgc2RrUHJvdmlkZXI6IGNsb3VkRXhlY3V0YWJsZS5zZGtQcm92aWRlcixcbiAgfSk7XG5cbiAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnNcbiAgY2xvdWRGb3JtYXRpb24ucmVhZEN1cnJlbnRUZW1wbGF0ZS5tb2NrSW1wbGVtZW50YXRpb24oKHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkgPT4ge1xuICAgIGlmIChzdGFja0FydGlmYWN0LnN0YWNrTmFtZSA9PT0gJ0QnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgcmVzb3VyY2U6ICdEJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH0pO1xuICBjbG91ZEZvcm1hdGlvbi5kZXBsb3lTdGFjay5tb2NrSW1wbGVtZW50YXRpb24oKG9wdGlvbnMpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgbm9PcDogdHJ1ZSxcbiAgICBvdXRwdXRzOiB7fSxcbiAgICBzdGFja0FybjogJycsXG4gICAgc3RhY2tBcnRpZmFjdDogb3B0aW9ucy5zdGFjayxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ2RpZmYgY2FuIGRpZmYgbXVsdGlwbGUgc3RhY2tzJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdG9vbGtpdC5kaWZmKHtcbiAgICBzdGFja05hbWVzOiBbJ0InXSxcbiAgICBzdHJlYW06IGJ1ZmZlcixcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBjb25zdCBwbGFpblRleHRPdXRwdXQgPSBidWZmZXIuZGF0YS5yZXBsYWNlKC9cXHgxQlxcW1swLT9dKlsgLS9dKltALX5dL2csICcnKTtcbiAgZXhwZWN0KHBsYWluVGV4dE91dHB1dCkudG9Db250YWluKCdTdGFjayBBJyk7XG4gIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQicpO1xuXG4gIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbn0pO1xuXG50ZXN0KCdleGl0cyB3aXRoIDEgd2l0aCBkaWZmcyBhbmQgZmFpbCBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRhYmxlKCk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgc3RhY2tOYW1lczogWydBJ10sXG4gICAgc3RyZWFtOiBidWZmZXIsXG4gICAgZmFpbDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG59KTtcblxudGVzdCgndGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHN0YWNrIG5hbWVzIGdpdmVuJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnWCcsICdZJywgJ1onXSxcbiAgICBzdHJlYW06IGJ1ZmZlcixcbiAgfSkpLnJlamVjdHMudG9UaHJvdygnTm8gc3RhY2tzIG1hdGNoIHRoZSBuYW1lKHMpIFgsWSxaJyk7XG59KTtcblxudGVzdCgnZXhpdHMgd2l0aCAxIHdpdGggZGlmZiBpbiBmaXJzdCBzdGFjaywgYnV0IG5vdCBpbiBzZWNvbmQgc3RhY2sgYW5kIGZhaWwgc2V0IHRvIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnQScsICdEJ10sXG4gICAgc3RyZWFtOiBidWZmZXIsXG4gICAgZmFpbDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG59KTtcblxudGVzdCgndGhyb3dzIGFuIGVycm9yIGR1cmluZyBkaWZmcyBvbiBzdGFjayB3aXRoIGVycm9yIG1ldGFkYXRhJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnQyddLFxuICAgIHN0cmVhbTogYnVmZmVyLFxuICB9KSkucmVqZWN0cy50b1Rocm93KC9Gb3VuZCBlcnJvcnMvKTtcbn0pO1xuXG5jbGFzcyBTdHJpbmdXcml0YWJsZSBleHRlbmRzIFdyaXRhYmxlIHtcbiAgcHVibGljIGRhdGE6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVjb2RlcjogTm9kZVN0cmluZ0RlY29kZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogYW55ID0ge30pIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cblxuICBwdWJsaWMgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IHVuZGVmaW5lZCkgPT4gdm9pZCkge1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ2J1ZmZlcicpIHtcbiAgICAgIGNodW5rID0gdGhpcy5fZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgfVxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgcHVibGljIF9maW5hbChjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5kYXRhICs9IHRoaXMuX2RlY29kZXIuZW5kKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIl19
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQWtDO0FBQ2xDLG1EQUFrRTtBQUNsRSwyREFBMkQ7QUFFM0Qsc0ZBQWtGO0FBQ2xGLG9EQUFnRDtBQUNoRCxpQ0FBK0Q7QUFFL0QsSUFBSSxlQUFvQyxDQUFDO0FBQ3pDLElBQUksY0FBc0QsQ0FBQztBQUMzRCxJQUFJLE9BQW1CLENBQUM7QUFFeEIsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsZUFBZSxHQUFHLElBQUksMEJBQW1CLENBQUM7WUFDeEMsTUFBTSxFQUFFLENBQUM7b0JBQ1AsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtpQkFDNUI7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7aUJBQzVCO2dCQUNEO29CQUNFLFNBQVMsRUFBRSxHQUFHO29CQUNkLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDZCxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUMzQixRQUFRLEVBQUU7d0JBQ1IsV0FBVyxFQUFFOzRCQUNYO2dDQUNFLElBQUksRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsS0FBSztnQ0FDOUMsSUFBSSxFQUFFLGtCQUFrQjs2QkFDekI7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtpQkFDNUIsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILGNBQWMsR0FBRyx1QkFBZ0IsQ0FBQyxzREFBeUIsQ0FB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QUMsZUFBZSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFVLEVBQUUsUUFBZ0IsRUFBRSxRQUE2QztRQUN2RixJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDekIsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQXdDO1FBQ3BELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IE5vZGVTdHJpbmdEZWNvZGVyLCBTdHJpbmdEZWNvZGVyIH0gZnJvbSAnc3RyaW5nX2RlY29kZXInO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzIH0gZnJvbSAnLi4vbGliL2FwaS9jbG91ZGZvcm1hdGlvbi1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBDZGtUb29sa2l0IH0gZnJvbSAnLi4vbGliL2Nkay10b29sa2l0JztcbmltcG9ydCB7IGluc3RhbmNlTW9ja0Zyb20sIE1vY2tDbG91ZEV4ZWN1dGFibGUgfSBmcm9tICcuL3V0aWwnO1xuXG5sZXQgY2xvdWRFeGVjdXRhYmxlOiBNb2NrQ2xvdWRFeGVjdXRhYmxlO1xubGV0IGNsb3VkRm9ybWF0aW9uOiBqZXN0Lk1vY2tlZDxDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzPjtcbmxldCB0b29sa2l0OiBDZGtUb29sa2l0O1xuXG5kZXNjcmliZSgnbm9uLW5lc3RlZCBzdGFja3MnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNsb3VkRXhlY3V0YWJsZSA9IG5ldyBNb2NrQ2xvdWRFeGVjdXRhYmxlKHtcbiAgICAgIHN0YWNrczogW3tcbiAgICAgICAgc3RhY2tOYW1lOiAnQScsXG4gICAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnQScgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0YWNrTmFtZTogJ0InLFxuICAgICAgICBkZXBlbmRzOiBbJ0EnXSxcbiAgICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdCJyB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhY2tOYW1lOiAnQycsXG4gICAgICAgIGRlcGVuZHM6IFsnQSddLFxuICAgICAgICB0ZW1wbGF0ZTogeyByZXNvdXJjZTogJ0MnIH0sXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgJy9yZXNvdXJjZSc6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5FUlJPUixcbiAgICAgICAgICAgICAgZGF0YTogJ3RoaXMgaXMgYW4gZXJyb3InLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhY2tOYW1lOiAnRCcsXG4gICAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnRCcgfSxcbiAgICAgIH1dLFxuICAgIH0pO1xuXG4gICAgY2xvdWRGb3JtYXRpb24gPSBpbnN0YW5jZU1vY2tGcm9tKENsb3VkRm9ybWF0aW9uRGVwbG95bWVudHMpO1xuXG4gICAgdG9vbGtpdCA9IG5ldyBDZGtUb29sa2l0KHtcbiAgICAgIGNsb3VkRXhlY3V0YWJsZSxcbiAgICAgIGNsb3VkRm9ybWF0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogY2xvdWRFeGVjdXRhYmxlLmNvbmZpZ3VyYXRpb24sXG4gICAgICBzZGtQcm92aWRlcjogY2xvdWRFeGVjdXRhYmxlLnNka1Byb3ZpZGVyLFxuICAgIH0pO1xuXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnNcbiAgICBjbG91ZEZvcm1hdGlvbi5yZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcy5tb2NrSW1wbGVtZW50YXRpb24oKHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkgPT4ge1xuICAgICAgaWYgKHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lID09PSAnRCcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHJlc291cmNlOiAnRCcgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KTtcbiAgICBjbG91ZEZvcm1hdGlvbi5kZXBsb3lTdGFjay5tb2NrSW1wbGVtZW50YXRpb24oKG9wdGlvbnMpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBub09wOiB0cnVlLFxuICAgICAgb3V0cHV0czoge30sXG4gICAgICBzdGFja0FybjogJycsXG4gICAgICBzdGFja0FydGlmYWN0OiBvcHRpb25zLnN0YWNrLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGlmZiBjYW4gZGlmZiBtdWx0aXBsZSBzdGFja3MnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgICBzdGFja05hbWVzOiBbJ0InXSxcbiAgICAgIHN0cmVhbTogYnVmZmVyLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGNvbnN0IHBsYWluVGV4dE91dHB1dCA9IGJ1ZmZlci5kYXRhLnJlcGxhY2UoL1xceDFCXFxbWzAtP10qWyAtL10qW0Atfl0vZywgJycpO1xuICAgIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQScpO1xuICAgIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQicpO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICB9KTtcblxuICB0ZXN0KCdleGl0cyB3aXRoIDEgd2l0aCBkaWZmcyBhbmQgZmFpbCBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdG9vbGtpdC5kaWZmKHtcbiAgICAgIHN0YWNrTmFtZXM6IFsnQSddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgICBmYWlsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHN0YWNrIG5hbWVzIGdpdmVuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gICAgLy8gV0hFTlxuICAgIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgICAgc3RhY2tOYW1lczogWydYJywgJ1knLCAnWiddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSkpLnJlamVjdHMudG9UaHJvdygnTm8gc3RhY2tzIG1hdGNoIHRoZSBuYW1lKHMpIFgsWSxaJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2V4aXRzIHdpdGggMSB3aXRoIGRpZmYgaW4gZmlyc3Qgc3RhY2ssIGJ1dCBub3QgaW4gc2Vjb25kIHN0YWNrIGFuZCBmYWlsIHNldCB0byB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRhYmxlKCk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0b29sa2l0LmRpZmYoe1xuICAgICAgc3RhY2tOYW1lczogWydBJywgJ0QnXSxcbiAgICAgIHN0cmVhbTogYnVmZmVyLFxuICAgICAgZmFpbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Rocm93cyBhbiBlcnJvciBkdXJpbmcgZGlmZnMgb24gc3RhY2sgd2l0aCBlcnJvciBtZXRhZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBleHBlY3QoKCkgPT4gdG9vbGtpdC5kaWZmKHtcbiAgICAgIHN0YWNrTmFtZXM6IFsnQyddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSkpLnJlamVjdHMudG9UaHJvdygvRm91bmQgZXJyb3JzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCduZXN0ZWQgc3RhY2tzJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjbG91ZEV4ZWN1dGFibGUgPSBuZXcgTW9ja0Nsb3VkRXhlY3V0YWJsZSh7XG4gICAgICBzdGFja3M6IFt7XG4gICAgICAgIHN0YWNrTmFtZTogJ1BhcmVudCcsXG4gICAgICAgIHRlbXBsYXRlOiB7IH0sXG4gICAgICB9XSxcbiAgICB9KTtcblxuICAgIGNsb3VkRm9ybWF0aW9uID0gaW5zdGFuY2VNb2NrRnJvbShDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzKTtcblxuICAgIHRvb2xraXQgPSBuZXcgQ2RrVG9vbGtpdCh7XG4gICAgICBjbG91ZEV4ZWN1dGFibGUsXG4gICAgICBjbG91ZEZvcm1hdGlvbixcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNsb3VkRXhlY3V0YWJsZS5jb25maWd1cmF0aW9uLFxuICAgICAgc2RrUHJvdmlkZXI6IGNsb3VkRXhlY3V0YWJsZS5zZGtQcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNsb3VkRm9ybWF0aW9uLnJlYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLm1vY2tJbXBsZW1lbnRhdGlvbigoc3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KSA9PiB7XG4gICAgICBpZiAoc3RhY2tBcnRpZmFjdC5zdGFja05hbWUgPT09ICdQYXJlbnQnKSB7XG4gICAgICAgIHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUuUmVzb3VyY2VzID0ge1xuICAgICAgICAgIEFkZGl0aW9uQ2hpbGQ6IHtcbiAgICAgICAgICAgIFR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgU29tZVJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgVHlwZTogJ0FXUzo6U29tZXRoaW5nJyxcbiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBQcm9wOiAnYWRkZWQtdmFsdWUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRGVsZXRpb25DaGlsZDoge1xuICAgICAgICAgICAgVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpTb21ldGhpbmcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIENoYW5nZWRDaGlsZDoge1xuICAgICAgICAgICAgVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpTb21ldGhpbmcnLFxuICAgICAgICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIFByb3A6ICduZXctdmFsdWUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgQWRkaXRpb25DaGlsZDoge1xuICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgIFR5cGU6ICdBV1M6OlNvbWV0aGluZycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBEZWxldGlvbkNoaWxkOiB7XG4gICAgICAgICAgICAgIFR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICAgIFNvbWVSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgVHlwZTogJ0FXUzo6U29tZXRoaW5nJyxcbiAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgUHJvcDogJ3ZhbHVlLXRvLWJlLXJlbW92ZWQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENoYW5nZWRDaGlsZDoge1xuICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgIFR5cGU6ICdBV1M6OlNvbWV0aGluZycsXG4gICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIFByb3A6ICdvbGQtdmFsdWUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkaWZmIGNhbiBkaWZmIG5lc3RlZCBzdGFja3MnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgICBzdGFja05hbWVzOiBbJ1BhcmVudCddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgY29uc3QgcGxhaW5UZXh0T3V0cHV0ID0gYnVmZmVyLmRhdGEucmVwbGFjZSgvXFx4MUJcXFtbMC0/XSpbIC0vXSpbQC1+XS9nLCAnJyk7XG4gICAgZXhwZWN0KHBsYWluVGV4dE91dHB1dC50cmltKCkpLnRvRXF1YWwoYFN0YWNrIFBhcmVudFxuUmVzb3VyY2VzXG5bfl0gQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgQWRkaXRpb25DaGlsZCBcbiDilJTilIAgW35dIFJlc291cmNlc1xuICAgICDilJTilIAgW35dIC5Tb21lUmVzb3VyY2U6XG4gICAgICAgICDilJTilIAgWytdIEFkZGVkOiAuUHJvcGVydGllc1xuW35dIEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIERlbGV0aW9uQ2hpbGQgXG4g4pSU4pSAIFt+XSBSZXNvdXJjZXNcbiAgICAg4pSU4pSAIFt+XSAuU29tZVJlc291cmNlOlxuICAgICAgICAg4pSU4pSAIFstXSBSZW1vdmVkOiAuUHJvcGVydGllc1xuW35dIEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIENoYW5nZWRDaGlsZCBcbiDilJTilIAgW35dIFJlc291cmNlc1xuICAgICDilJTilIAgW35dIC5Tb21lUmVzb3VyY2U6XG4gICAgICAgICDilJTilIAgW35dIC5Qcm9wZXJ0aWVzOlxuICAgICAgICAgICAgIOKUlOKUgCBbfl0gLlByb3A6XG4gICAgICAgICAgICAgICAgIOKUnOKUgCBbLV0gb2xkLXZhbHVlXG4gICAgICAgICAgICAgICAgIOKUlOKUgCBbK10gbmV3LXZhbHVlYCk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gIH0pO1xufSk7XG5cbmNsYXNzIFN0cmluZ1dyaXRhYmxlIGV4dGVuZHMgV3JpdGFibGUge1xuICBwdWJsaWMgZGF0YTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvZGVyOiBOb2RlU3RyaW5nRGVjb2RlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKTtcbiAgICB0aGlzLmRhdGEgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBfd3JpdGUoY2h1bms6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB7XG4gICAgaWYgKGVuY29kaW5nID09PSAnYnVmZmVyJykge1xuICAgICAgY2h1bmsgPSB0aGlzLl9kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhICs9IGNodW5rO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iXX0=
package/test/util.js CHANGED
@@ -32,6 +32,7 @@ function addAttributes(assembly, builder) {
32
32
  const templateFile = `${stack.stackName}.template.json`;
33
33
  const template = (_a = stack.template) !== null && _a !== void 0 ? _a : exports.DEFAULT_FAKE_TEMPLATE;
34
34
  fs.writeFileSync(path.join(builder.outdir, templateFile), JSON.stringify(template, undefined, 2));
35
+ addNestedStacks(templateFile, builder.outdir, template);
35
36
  // we call patchStackTags here to simulate the tags formatter
36
37
  // that is used when building real manifest files.
37
38
  const metadata = patchStackTags({ ...stack.metadata });
@@ -57,6 +58,22 @@ function addAttributes(assembly, builder) {
57
58
  });
58
59
  }
59
60
  }
61
+ function addNestedStacks(templatePath, outdir, rootStackTemplate) {
62
+ let template = rootStackTemplate;
63
+ if (!template) {
64
+ const templatePathWithDir = path.join('diff-nested-stacks-templates', templatePath);
65
+ template = JSON.parse(fs.readFileSync(path.join(__dirname, templatePathWithDir)).toString());
66
+ fs.writeFileSync(path.join(outdir, templatePath), JSON.stringify(template, undefined, 2));
67
+ }
68
+ for (const logicalId in template.Resources) {
69
+ if (template.Resources[logicalId].Type === 'AWS::CloudFormation::Stack') {
70
+ if (template.Resources[logicalId].Metadata && template.Resources[logicalId].Metadata['aws:asset:path']) {
71
+ const nestedTemplatePath = template.Resources[logicalId].Metadata['aws:asset:path'];
72
+ addNestedStacks(nestedTemplatePath, outdir);
73
+ }
74
+ }
75
+ }
76
+ }
60
77
  function testAssembly(assembly) {
61
78
  var _a;
62
79
  const builder = new cxapi.CloudAssemblyBuilder();
@@ -161,4 +178,4 @@ exports.withMocked = withMocked;
161
178
  function isPromise(object) {
162
179
  return Promise.resolve(object) === object;
163
180
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QseUNBQXlDO0FBQ3pDLHdFQUFvRTtBQUNwRSw4Q0FBZ0Q7QUFDaEQsOENBQWtEO0FBRXJDLFFBQUEscUJBQXFCLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFvQnpELE1BQWEsbUJBQW9CLFNBQVEsa0NBQWU7SUFJdEQsWUFBWSxRQUFzQjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLHdCQUFhLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLDBCQUFlLEVBQUUsQ0FBQztRQUUxQyxLQUFLLENBQUM7WUFDSixhQUFhO1lBQ2IsV0FBVztZQUNYLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFqQkQsa0RBaUJDO0FBRUQsU0FBUyxLQUFLLENBQUMsR0FBUTtJQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFzQixFQUFFLE9BQW1DOztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDbkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztRQUN4RCxNQUFNLFFBQVEsU0FBRyxLQUFLLENBQUMsUUFBUSxtQ0FBSSw2QkFBcUIsQ0FBQztRQUN6RCxF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QyxHQUFHLFFBQVEsQ0FBQztLQUNyQjtBQUNILENBQUM7QUFmRCw0REFlQztBQUVELFNBQWdCLFVBQVUsQ0FBeUMsR0FBTSxFQUFFLEdBQU0sRUFBRSxLQUFtQztJQUNwSCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hCLEdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7SUFFM0IsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQ2xDLElBQUk7UUFDRixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBYSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLE9BQU8sR0FBRyxDQUFDO1NBQUU7UUFFcEMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDO0tBQzNEO1lBQVM7UUFDUixJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7U0FDckI7S0FDRjtBQUNILENBQUM7QUFqQkQsZ0NBaUJDO0FBRUQsU0FBUyxTQUFTLENBQUksTUFBVztJQUMvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBDbG91ZEV4ZWN1dGFibGUgfSBmcm9tICcuLi9saWIvYXBpL2N4YXBwL2Nsb3VkLWV4ZWN1dGFibGUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2xpYi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBNb2NrU2RrUHJvdmlkZXIgfSBmcm9tICcuL3V0aWwvbW9jay1zZGsnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQUtFX1RFTVBMQVRFID0geyBObzogJ1Jlc291cmNlcycgfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0U3RhY2tBcnRpZmFjdCB7XG4gIHN0YWNrTmFtZTogc3RyaW5nO1xuICB0ZW1wbGF0ZT86IGFueTtcbiAgZW52Pzogc3RyaW5nLFxuICBkZXBlbmRzPzogc3RyaW5nW107XG4gIG1ldGFkYXRhPzogY3hhcGkuU3RhY2tNZXRhZGF0YTtcbiAgYXNzZXRzPzogY3hzY2hlbWEuQXNzZXRNZXRhZGF0YUVudHJ5W107XG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPGN4c2NoZW1hLkF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzPjtcbiAgdGVybWluYXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEFzc2VtYmx5IHtcbiAgc3RhY2tzOiBUZXN0U3RhY2tBcnRpZmFjdFtdO1xuICBtaXNzaW5nPzogY3hzY2hlbWEuTWlzc2luZ0NvbnRleHRbXTtcbiAgbmVzdGVkQXNzZW1ibGllcz86IFRlc3RBc3NlbWJseVtdO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0Nsb3VkRXhlY3V0YWJsZSBleHRlbmRzIENsb3VkRXhlY3V0YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IE1vY2tTZGtQcm92aWRlcjtcblxuICBjb25zdHJ1Y3Rvcihhc3NlbWJseTogVGVzdEFzc2VtYmx5KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBuZXcgTW9ja1Nka1Byb3ZpZGVyKCk7XG5cbiAgICBzdXBlcih7XG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgc2RrUHJvdmlkZXIsXG4gICAgICBzeW50aGVzaXplcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRlc3RBc3NlbWJseShhc3NlbWJseSkpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICB0aGlzLnNka1Byb3ZpZGVyID0gc2RrUHJvdmlkZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqOiBhbnkpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG5cbmZ1bmN0aW9uIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgYnVpbGRlcjogY3hhcGkuQ2xvdWRBc3NlbWJseUJ1aWxkZXIpIHtcbiAgZm9yIChjb25zdCBzdGFjayBvZiBhc3NlbWJseS5zdGFja3MpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGUgPSBgJHtzdGFjay5zdGFja05hbWV9LnRlbXBsYXRlLmpzb25gO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc3RhY2sudGVtcGxhdGUgPz8gREVGQVVMVF9GQUtFX1RFTVBMQVRFO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0ZW1wbGF0ZUZpbGUpLCBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZSwgdW5kZWZpbmVkLCAyKSk7XG5cbiAgICAvLyB3ZSBjYWxsIHBhdGNoU3RhY2tUYWdzIGhlcmUgdG8gc2ltdWxhdGUgdGhlIHRhZ3MgZm9ybWF0dGVyXG4gICAgLy8gdGhhdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcmVhbCBtYW5pZmVzdCBmaWxlcy5cbiAgICBjb25zdCBtZXRhZGF0YTogeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH0gPSBwYXRjaFN0YWNrVGFncyh7IC4uLnN0YWNrLm1ldGFkYXRhIH0pO1xuICAgIGZvciAoY29uc3QgYXNzZXQgb2Ygc3RhY2suYXNzZXRzIHx8IFtdKSB7XG4gICAgICBtZXRhZGF0YVthc3NldC5pZF0gPSBbXG4gICAgICAgIHsgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVCwgZGF0YTogYXNzZXQgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIGFzc2VtYmx5Lm1pc3NpbmcgfHwgW10pIHtcbiAgICAgIGJ1aWxkZXIuYWRkTWlzc2luZyhtaXNzaW5nKTtcbiAgICB9XG5cbiAgICBidWlsZGVyLmFkZEFydGlmYWN0KHN0YWNrLnN0YWNrTmFtZSwge1xuICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RUeXBlLkFXU19DTE9VREZPUk1BVElPTl9TVEFDSyxcbiAgICAgIGVudmlyb25tZW50OiBzdGFjay5lbnYgfHwgJ2F3czovLzEyMzQ1Njc4OTAxMi9oZXJlJyxcblxuICAgICAgZGVwZW5kZW5jaWVzOiBzdGFjay5kZXBlbmRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLnN0YWNrLnByb3BlcnRpZXMsXG4gICAgICAgIHRlbXBsYXRlRmlsZSxcbiAgICAgICAgdGVybWluYXRpb25Qcm90ZWN0aW9uOiBzdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QXNzZW1ibHkoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSk6IGN4YXBpLkNsb3VkQXNzZW1ibHkge1xuICBjb25zdCBidWlsZGVyID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKCk7XG4gIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHksIGJ1aWxkZXIpO1xuXG4gIGlmIChhc3NlbWJseS5uZXN0ZWRBc3NlbWJsaWVzICE9IG51bGwgJiYgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcy5sZW5ndGggPiAwKSB7XG4gICAgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcz8uZm9yRWFjaCgobmVzdGVkQXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIgPSBidWlsZGVyLmNyZWF0ZU5lc3RlZEFzc2VtYmx5KGBuZXN0ZWQke2l9YCwgYG5lc3RlZCR7aX1gKTtcbiAgICAgIGFkZEF0dHJpYnV0ZXMobmVzdGVkQXNzZW1ibHksIG5lc3RlZEFzc2VtYmx5QnVpbGRlcik7XG4gICAgICBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBzdGFjayB0YWdzIGZyb20gaG93IHRoZXkgYXJlIGRlY2FscmVkIGluIHNvdXJjZSBjb2RlIChsb3dlciBjYXNlZClcbiAqIHRvIGhvdyB0aGV5IGFyZSBzdG9yZWQgb24gZGlzayAodXBwZXIgY2FzZWQpLiBJbiByZWFsIHN5bnRoZXNpcyB0aGlzIGlzIGRvbmVcbiAqIGJ5IGEgc3BlY2lhbCB0YWdzIGZvcm1hdHRlci5cbiAqXG4gKiBAc2VlIEBhd3MtY2RrL2NvcmUvbGliL3N0YWNrLnRzXG4gKi9cbmZ1bmN0aW9uIHBhdGNoU3RhY2tUYWdzKG1ldGFkYXRhOiB7IFtwYXRoOiBzdHJpbmddOiBjeHNjaGVtYS5NZXRhZGF0YUVudHJ5W10gfSk6IHsgW3BhdGg6IHN0cmluZ106IGN4c2NoZW1hLk1ldGFkYXRhRW50cnlbXSB9IHtcblxuICBjb25zdCBjbG9uZWQgPSBjbG9uZShtZXRhZGF0YSkgYXMgeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH07XG5cbiAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJpZXMgb2YgT2JqZWN0LnZhbHVlcyhjbG9uZWQpKSB7XG4gICAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJ5IG9mIG1ldGFkYXRhRW50cmllcykge1xuICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSA9PT0gY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTICYmIG1ldGFkYXRhRW50cnkuZGF0YSkge1xuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQW55ID0gbWV0YWRhdGFFbnRyeSBhcyBhbnk7XG5cbiAgICAgICAgbWV0YWRhdGFBbnkuZGF0YSA9IG1ldGFkYXRhQW55LmRhdGEubWFwKCh0OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBLZXk6IHQua2V5LCBWYWx1ZTogdC52YWx1ZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RTdGFjayhzdGFjazogVGVzdFN0YWNrQXJ0aWZhY3QpOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICBjb25zdCBhc3NlbWJseSA9IHRlc3RBc3NlbWJseSh7IHN0YWNrczogW3N0YWNrXSB9KTtcbiAgcmV0dXJuIGFzc2VtYmx5LmdldFN0YWNrQnlOYW1lKHN0YWNrLnN0YWNrTmFtZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbW9ja2VkIGluc3RhbmNlIG9mIGEgY2xhc3MsIGdpdmVuIGl0cyBjb25zdHJ1Y3RvclxuICpcbiAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgamVzdCBkb2Vzbid0IHByb3ZpZGUgdGhpcyBieSBkZWZhdWx0LFxuICogYnV0IHRoZXJlIHlvdSBnby5cbiAqXG4gKiBGSVhNRTogQ3VycmVudGx5IHZlcnkgbGltaXRlZC4gRG9lc24ndCBzdXBwb3J0IGluaGVyaXRhbmNlLCBnZXR0ZXJzIG9yXG4gKiBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHByb3BlcnRpZXMgKGFzIHRob3NlIGV4aXN0IG9uIGluc3RhbmNlcywgbm90XG4gKiBjbGFzc2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlTW9ja0Zyb208QT4oY3RyOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBBKTogamVzdC5Nb2NrZWQ8QT4ge1xuICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3RyLnByb3RvdHlwZSkpIHtcbiAgICByZXRbbWV0aG9kTmFtZV0gPSBqZXN0LmZuKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSdW4gYW4gYXN5bmMgYmxvY2sgd2l0aCBhIGNsYXNzIChjb25zdHJ1Y3RvcikgcmVwbGFjZWQgd2l0aCBhIG1vY2tcbiAqXG4gKiBUaGUgY2xhc3MgY29uc3RydWN0b3Igd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zXG4gKiBhIHNpbmdsZXRvbiwgYW5kIHRoZSBzaW5nbGV0b24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGJsb2NrIHNvIHRoYXQgaXRzXG4gKiBtZXRob2RzIGNhbiBiZSBtb2NrZWQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFVzZXMgYGluc3RhbmNlTW9ja0Zyb21gIHNvIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgdGhhdCBob2xkXG4gKiBmb3IgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhNb2NrZWRDbGFzc1NpbmdsZXRvbjxBIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgQSwgQj4oXG4gIG9iajogQSxcbiAga2V5OiBLLFxuICBjYjogKG1vY2s6IEFbS10gZXh0ZW5kcyBqZXN0LkNvbnN0cnVjdGFibGUgPyBqZXN0Lk1vY2tlZDxJbnN0YW5jZVR5cGU8QVtLXT4+IDogbmV2ZXIpID0+IFByb21pc2U8Qj4sXG4pOiBQcm9taXNlPEI+IHtcblxuICBjb25zdCBvcmlnaW5hbCA9IG9ialtrZXldO1xuICB0cnkge1xuICAgIGNvbnN0IG1vY2sgPSBpbnN0YW5jZU1vY2tGcm9tKG9yaWdpbmFsIGFzIGFueSk7XG4gICAgb2JqW2tleV0gPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2spIGFzIGFueTtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBjYihtb2NrIGFzIGFueSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSBmaW5hbGx5IHtcbiAgICBvYmpba2V5XSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTW9ja2VkPEEgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBBLCBCPihvYmo6IEEsIGtleTogSywgYmxvY2s6IChmbjogamVzdC5Nb2NrZWQ8QT5bS10pID0+IEIpOiBCIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBvYmpba2V5XTtcbiAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpO1xuICAob2JqIGFzIGFueSlba2V5XSA9IG1vY2tGbjtcblxuICBsZXQgYXN5bmNGaW5hbGx5OiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgcmV0ID0gYmxvY2sobW9ja0ZuIGFzIGFueSk7XG4gICAgaWYgKCFpc1Byb21pc2UocmV0KSkgeyByZXR1cm4gcmV0OyB9XG5cbiAgICBhc3luY0ZpbmFsbHkgPSB0cnVlO1xuICAgIHJldHVybiByZXQuZmluYWxseSgoKSA9PiB7IG9ialtrZXldID0gb3JpZ2luYWw7IH0pIGFzIGFueTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWFzeW5jRmluYWxseSkge1xuICAgICAgb2JqW2tleV0gPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlPEE+KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFByb21pc2U8QT4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9iamVjdCkgPT09IG9iamVjdDtcbn1cbiJdfQ==
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QseUNBQXlDO0FBQ3pDLHdFQUFvRTtBQUNwRSw4Q0FBZ0Q7QUFDaEQsOENBQWtEO0FBRXJDLFFBQUEscUJBQXFCLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFvQnpELE1BQWEsbUJBQW9CLFNBQVEsa0NBQWU7SUFJdEQsWUFBWSxRQUFzQjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLHdCQUFhLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLDBCQUFlLEVBQUUsQ0FBQztRQUUxQyxLQUFLLENBQUM7WUFDSixhQUFhO1lBQ2IsV0FBVztZQUNYLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFqQkQsa0RBaUJDO0FBRUQsU0FBUyxLQUFLLENBQUMsR0FBUTtJQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFzQixFQUFFLE9BQW1DOztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDbkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztRQUN4RCxNQUFNLFFBQVEsU0FBRyxLQUFLLENBQUMsUUFBUSxtQ0FBSSw2QkFBcUIsQ0FBQztRQUN6RCxF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LENBQUM7S0FDckI7QUFDSCxDQUFDO0FBZkQsNERBZUM7QUFFRCxTQUFnQixVQUFVLENBQXlDLEdBQU0sRUFBRSxHQUFNLEVBQUUsS0FBbUM7SUFDcEgsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN4QixHQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBRTNCLElBQUksWUFBWSxHQUFZLEtBQUssQ0FBQztJQUNsQyxJQUFJO1FBQ0YsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQWEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztTQUFFO1FBRXBDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQztLQUMzRDtZQUFTO1FBQ1IsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ3JCO0tBQ0Y7QUFDSCxDQUFDO0FBakJELGdDQWlCQztBQUVELFNBQVMsU0FBUyxDQUFJLE1BQVc7SUFDL0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgQ2xvdWRFeGVjdXRhYmxlIH0gZnJvbSAnLi4vbGliL2FwaS9jeGFwcC9jbG91ZC1leGVjdXRhYmxlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9saWIvc2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9ja1Nka1Byb3ZpZGVyIH0gZnJvbSAnLi91dGlsL21vY2stc2RrJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkFLRV9URU1QTEFURSA9IHsgTm86ICdSZXNvdXJjZXMnIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFN0YWNrQXJ0aWZhY3Qge1xuICBzdGFja05hbWU6IHN0cmluZztcbiAgdGVtcGxhdGU/OiBhbnk7XG4gIGVudj86IHN0cmluZyxcbiAgZGVwZW5kcz86IHN0cmluZ1tdO1xuICBtZXRhZGF0YT86IGN4YXBpLlN0YWNrTWV0YWRhdGE7XG4gIGFzc2V0cz86IGN4c2NoZW1hLkFzc2V0TWV0YWRhdGFFbnRyeVtdO1xuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxjeHNjaGVtYS5Bd3NDbG91ZEZvcm1hdGlvblN0YWNrUHJvcGVydGllcz47XG4gIHRlcm1pbmF0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RBc3NlbWJseSB7XG4gIHN0YWNrczogVGVzdFN0YWNrQXJ0aWZhY3RbXTtcbiAgbWlzc2luZz86IGN4c2NoZW1hLk1pc3NpbmdDb250ZXh0W107XG4gIG5lc3RlZEFzc2VtYmxpZXM/OiBUZXN0QXNzZW1ibHlbXTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDbG91ZEV4ZWN1dGFibGUgZXh0ZW5kcyBDbG91ZEV4ZWN1dGFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBNb2NrU2RrUHJvdmlkZXI7XG5cbiAgY29uc3RydWN0b3IoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gbmV3IE1vY2tTZGtQcm92aWRlcigpO1xuXG4gICAgc3VwZXIoe1xuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIHNka1Byb3ZpZGVyLFxuICAgICAgc3ludGhlc2l6ZXI6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0ZXN0QXNzZW1ibHkoYXNzZW1ibHkpKSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5zZGtQcm92aWRlciA9IHNka1Byb3ZpZGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lKG9iajogYW55KSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRyaWJ1dGVzKGFzc2VtYmx5OiBUZXN0QXNzZW1ibHksIGJ1aWxkZXI6IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKSB7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2YgYXNzZW1ibHkuc3RhY2tzKSB7XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlID0gYCR7c3RhY2suc3RhY2tOYW1lfS50ZW1wbGF0ZS5qc29uYDtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHN0YWNrLnRlbXBsYXRlID8/IERFRkFVTFRfRkFLRV9URU1QTEFURTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihidWlsZGVyLm91dGRpciwgdGVtcGxhdGVGaWxlKSwgSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUsIHVuZGVmaW5lZCwgMikpO1xuICAgIGFkZE5lc3RlZFN0YWNrcyh0ZW1wbGF0ZUZpbGUsIGJ1aWxkZXIub3V0ZGlyLCB0ZW1wbGF0ZSk7XG5cbiAgICAvLyB3ZSBjYWxsIHBhdGNoU3RhY2tUYWdzIGhlcmUgdG8gc2ltdWxhdGUgdGhlIHRhZ3MgZm9ybWF0dGVyXG4gICAgLy8gdGhhdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcmVhbCBtYW5pZmVzdCBmaWxlcy5cbiAgICBjb25zdCBtZXRhZGF0YTogeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH0gPSBwYXRjaFN0YWNrVGFncyh7IC4uLnN0YWNrLm1ldGFkYXRhIH0pO1xuICAgIGZvciAoY29uc3QgYXNzZXQgb2Ygc3RhY2suYXNzZXRzIHx8IFtdKSB7XG4gICAgICBtZXRhZGF0YVthc3NldC5pZF0gPSBbXG4gICAgICAgIHsgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVCwgZGF0YTogYXNzZXQgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIGFzc2VtYmx5Lm1pc3NpbmcgfHwgW10pIHtcbiAgICAgIGJ1aWxkZXIuYWRkTWlzc2luZyhtaXNzaW5nKTtcbiAgICB9XG5cbiAgICBidWlsZGVyLmFkZEFydGlmYWN0KHN0YWNrLnN0YWNrTmFtZSwge1xuICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RUeXBlLkFXU19DTE9VREZPUk1BVElPTl9TVEFDSyxcbiAgICAgIGVudmlyb25tZW50OiBzdGFjay5lbnYgfHwgJ2F3czovLzEyMzQ1Njc4OTAxMi9oZXJlJyxcblxuICAgICAgZGVwZW5kZW5jaWVzOiBzdGFjay5kZXBlbmRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLnN0YWNrLnByb3BlcnRpZXMsXG4gICAgICAgIHRlbXBsYXRlRmlsZSxcbiAgICAgICAgdGVybWluYXRpb25Qcm90ZWN0aW9uOiBzdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5lc3RlZFN0YWNrcyh0ZW1wbGF0ZVBhdGg6IHN0cmluZywgb3V0ZGlyOiBzdHJpbmcsIHJvb3RTdGFja1RlbXBsYXRlPzogYW55KSB7XG4gIGxldCB0ZW1wbGF0ZSA9IHJvb3RTdGFja1RlbXBsYXRlO1xuXG4gIGlmICghdGVtcGxhdGUpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGhXaXRoRGlyID0gcGF0aC5qb2luKCdkaWZmLW5lc3RlZC1zdGFja3MtdGVtcGxhdGVzJywgdGVtcGxhdGVQYXRoKTtcbiAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsIHRlbXBsYXRlUGF0aFdpdGhEaXIpKS50b1N0cmluZygpKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRkaXIsIHRlbXBsYXRlUGF0aCksIEpTT04uc3RyaW5naWZ5KHRlbXBsYXRlLCB1bmRlZmluZWQsIDIpKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbG9naWNhbElkIGluIHRlbXBsYXRlLlJlc291cmNlcykge1xuICAgIGlmICh0ZW1wbGF0ZS5SZXNvdXJjZXNbbG9naWNhbElkXS5UeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snKSB7XG4gICAgICBpZiAodGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGEgJiYgdGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGFbJ2F3czphc3NldDpwYXRoJ10pIHtcbiAgICAgICAgY29uc3QgbmVzdGVkVGVtcGxhdGVQYXRoID0gdGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGFbJ2F3czphc3NldDpwYXRoJ107XG4gICAgICAgIGFkZE5lc3RlZFN0YWNrcyhuZXN0ZWRUZW1wbGF0ZVBhdGgsIG91dGRpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QXNzZW1ibHkoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSk6IGN4YXBpLkNsb3VkQXNzZW1ibHkge1xuICBjb25zdCBidWlsZGVyID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKCk7XG4gIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHksIGJ1aWxkZXIpO1xuXG4gIGlmIChhc3NlbWJseS5uZXN0ZWRBc3NlbWJsaWVzICE9IG51bGwgJiYgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcy5sZW5ndGggPiAwKSB7XG4gICAgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcz8uZm9yRWFjaCgobmVzdGVkQXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIgPSBidWlsZGVyLmNyZWF0ZU5lc3RlZEFzc2VtYmx5KGBuZXN0ZWQke2l9YCwgYG5lc3RlZCR7aX1gKTtcbiAgICAgIGFkZEF0dHJpYnV0ZXMobmVzdGVkQXNzZW1ibHksIG5lc3RlZEFzc2VtYmx5QnVpbGRlcik7XG4gICAgICBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBzdGFjayB0YWdzIGZyb20gaG93IHRoZXkgYXJlIGRlY2FscmVkIGluIHNvdXJjZSBjb2RlIChsb3dlciBjYXNlZClcbiAqIHRvIGhvdyB0aGV5IGFyZSBzdG9yZWQgb24gZGlzayAodXBwZXIgY2FzZWQpLiBJbiByZWFsIHN5bnRoZXNpcyB0aGlzIGlzIGRvbmVcbiAqIGJ5IGEgc3BlY2lhbCB0YWdzIGZvcm1hdHRlci5cbiAqXG4gKiBAc2VlIEBhd3MtY2RrL2NvcmUvbGliL3N0YWNrLnRzXG4gKi9cbmZ1bmN0aW9uIHBhdGNoU3RhY2tUYWdzKG1ldGFkYXRhOiB7IFtwYXRoOiBzdHJpbmddOiBjeHNjaGVtYS5NZXRhZGF0YUVudHJ5W10gfSk6IHsgW3BhdGg6IHN0cmluZ106IGN4c2NoZW1hLk1ldGFkYXRhRW50cnlbXSB9IHtcblxuICBjb25zdCBjbG9uZWQgPSBjbG9uZShtZXRhZGF0YSkgYXMgeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH07XG5cbiAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJpZXMgb2YgT2JqZWN0LnZhbHVlcyhjbG9uZWQpKSB7XG4gICAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJ5IG9mIG1ldGFkYXRhRW50cmllcykge1xuICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSA9PT0gY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTICYmIG1ldGFkYXRhRW50cnkuZGF0YSkge1xuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQW55ID0gbWV0YWRhdGFFbnRyeSBhcyBhbnk7XG5cbiAgICAgICAgbWV0YWRhdGFBbnkuZGF0YSA9IG1ldGFkYXRhQW55LmRhdGEubWFwKCh0OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBLZXk6IHQua2V5LCBWYWx1ZTogdC52YWx1ZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RTdGFjayhzdGFjazogVGVzdFN0YWNrQXJ0aWZhY3QpOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICBjb25zdCBhc3NlbWJseSA9IHRlc3RBc3NlbWJseSh7IHN0YWNrczogW3N0YWNrXSB9KTtcbiAgcmV0dXJuIGFzc2VtYmx5LmdldFN0YWNrQnlOYW1lKHN0YWNrLnN0YWNrTmFtZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbW9ja2VkIGluc3RhbmNlIG9mIGEgY2xhc3MsIGdpdmVuIGl0cyBjb25zdHJ1Y3RvclxuICpcbiAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgamVzdCBkb2Vzbid0IHByb3ZpZGUgdGhpcyBieSBkZWZhdWx0LFxuICogYnV0IHRoZXJlIHlvdSBnby5cbiAqXG4gKiBGSVhNRTogQ3VycmVudGx5IHZlcnkgbGltaXRlZC4gRG9lc24ndCBzdXBwb3J0IGluaGVyaXRhbmNlLCBnZXR0ZXJzIG9yXG4gKiBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHByb3BlcnRpZXMgKGFzIHRob3NlIGV4aXN0IG9uIGluc3RhbmNlcywgbm90XG4gKiBjbGFzc2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlTW9ja0Zyb208QT4oY3RyOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBBKTogamVzdC5Nb2NrZWQ8QT4ge1xuICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3RyLnByb3RvdHlwZSkpIHtcbiAgICByZXRbbWV0aG9kTmFtZV0gPSBqZXN0LmZuKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSdW4gYW4gYXN5bmMgYmxvY2sgd2l0aCBhIGNsYXNzIChjb25zdHJ1Y3RvcikgcmVwbGFjZWQgd2l0aCBhIG1vY2tcbiAqXG4gKiBUaGUgY2xhc3MgY29uc3RydWN0b3Igd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zXG4gKiBhIHNpbmdsZXRvbiwgYW5kIHRoZSBzaW5nbGV0b24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGJsb2NrIHNvIHRoYXQgaXRzXG4gKiBtZXRob2RzIGNhbiBiZSBtb2NrZWQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFVzZXMgYGluc3RhbmNlTW9ja0Zyb21gIHNvIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgdGhhdCBob2xkXG4gKiBmb3IgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhNb2NrZWRDbGFzc1NpbmdsZXRvbjxBIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgQSwgQj4oXG4gIG9iajogQSxcbiAga2V5OiBLLFxuICBjYjogKG1vY2s6IEFbS10gZXh0ZW5kcyBqZXN0LkNvbnN0cnVjdGFibGUgPyBqZXN0Lk1vY2tlZDxJbnN0YW5jZVR5cGU8QVtLXT4+IDogbmV2ZXIpID0+IFByb21pc2U8Qj4sXG4pOiBQcm9taXNlPEI+IHtcblxuICBjb25zdCBvcmlnaW5hbCA9IG9ialtrZXldO1xuICB0cnkge1xuICAgIGNvbnN0IG1vY2sgPSBpbnN0YW5jZU1vY2tGcm9tKG9yaWdpbmFsIGFzIGFueSk7XG4gICAgb2JqW2tleV0gPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2spIGFzIGFueTtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBjYihtb2NrIGFzIGFueSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSBmaW5hbGx5IHtcbiAgICBvYmpba2V5XSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTW9ja2VkPEEgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBBLCBCPihvYmo6IEEsIGtleTogSywgYmxvY2s6IChmbjogamVzdC5Nb2NrZWQ8QT5bS10pID0+IEIpOiBCIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBvYmpba2V5XTtcbiAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpO1xuICAob2JqIGFzIGFueSlba2V5XSA9IG1vY2tGbjtcblxuICBsZXQgYXN5bmNGaW5hbGx5OiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgcmV0ID0gYmxvY2sobW9ja0ZuIGFzIGFueSk7XG4gICAgaWYgKCFpc1Byb21pc2UocmV0KSkgeyByZXR1cm4gcmV0OyB9XG5cbiAgICBhc3luY0ZpbmFsbHkgPSB0cnVlO1xuICAgIHJldHVybiByZXQuZmluYWxseSgoKSA9PiB7IG9ialtrZXldID0gb3JpZ2luYWw7IH0pIGFzIGFueTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWFzeW5jRmluYWxseSkge1xuICAgICAgb2JqW2tleV0gPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlPEE+KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFByb21pc2U8QT4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9iamVjdCkgPT09IG9iamVjdDtcbn1cbiJdfQ==