aws-cdk 2.3.0 → 2.7.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/LICENSE +1 -1
- package/NOTICE +1 -1
- package/README.md +4 -1
- package/bin/cdk.js +7 -6
- package/build-info.json +2 -2
- package/lib/api/aws-auth/sdk-provider.d.ts +26 -1
- package/lib/api/aws-auth/sdk-provider.js +14 -24
- package/lib/api/aws-auth/sdk.d.ts +2 -0
- package/lib/api/aws-auth/sdk.js +4 -1
- package/lib/api/bootstrap/bootstrap-template.yaml +3 -1
- package/lib/api/bootstrap/deploy-bootstrap.js +2 -2
- package/lib/api/cloudformation-deployments.d.ts +63 -1
- package/lib/api/cloudformation-deployments.js +66 -3
- package/lib/api/cxapp/cloud-assembly.js +5 -5
- package/lib/api/deploy-stack.js +10 -4
- package/lib/api/hotswap/code-build-projects.d.ts +3 -0
- package/lib/api/hotswap/code-build-projects.js +53 -0
- package/lib/api/hotswap/common.d.ts +17 -1
- package/lib/api/hotswap/common.js +30 -6
- package/lib/api/hotswap/ecs-services.js +4 -18
- package/lib/api/hotswap/lambda-functions.js +169 -44
- package/lib/api/hotswap/s3-bucket-deployments.js +3 -10
- package/lib/api/hotswap/stepfunctions-state-machines.js +2 -1
- package/lib/api/hotswap-deployments.d.ts +0 -7
- package/lib/api/hotswap-deployments.js +85 -13
- package/lib/api/toolkit-info.d.ts +5 -5
- package/lib/api/toolkit-info.js +10 -10
- package/lib/api/util/cloudformation/stack-activity-monitor.js +22 -22
- package/lib/assets.js +3 -3
- package/lib/cdk-toolkit.js +66 -32
- package/lib/commands/context.js +7 -7
- package/lib/commands/docs.js +5 -5
- package/lib/commands/doctor.js +6 -6
- package/lib/context-providers/ami.js +2 -2
- package/lib/context-providers/availability-zones.js +2 -2
- package/lib/context-providers/endpoint-service-availability-zones.js +2 -2
- package/lib/context-providers/hosted-zones.js +2 -2
- package/lib/context-providers/keys.js +2 -2
- package/lib/context-providers/load-balancers.js +3 -3
- package/lib/context-providers/security-groups.js +2 -2
- package/lib/context-providers/ssm-parameters.js +2 -2
- package/lib/context-providers/vpcs.js +2 -2
- package/lib/diff.js +3 -3
- package/lib/init.js +15 -14
- package/lib/logging.js +7 -7
- package/lib/os.js +3 -3
- package/lib/plugin.js +4 -4
- package/lib/util/asset-publishing.js +3 -3
- package/lib/util/console-formatters.js +4 -3
- package/lib/util/npm.d.ts +1 -0
- package/lib/util/npm.js +21 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +23 -20
- package/npm-shrinkwrap.json +229 -101
- package/package.json +19 -18
- package/test/api/cloudformation-deployments.test.js +2 -2
- package/test/api/hotswap/{lambda-hotswap-deployments.test.d.ts → code-build-projects-hotswap-deployments.test.d.ts} +0 -0
- package/test/api/hotswap/code-build-projects-hotswap-deployments.test.js +576 -0
- package/test/api/hotswap/hotswap-deployments.test.js +4 -2
- package/test/api/hotswap/hotswap-test-setup.d.ts +3 -1
- package/test/api/hotswap/hotswap-test-setup.js +7 -4
- package/test/api/hotswap/lambda-functions-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-functions-hotswap-deployments.test.js +502 -0
- package/test/api/hotswap/lambda-versions-aliases-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-versions-aliases-hotswap-deployments.test.js +197 -0
- package/test/api/sdk-provider.test.js +11 -11
- package/test/api/stack-activity-monitor.test.js +13 -13
- package/test/cdk-toolkit.test.js +240 -13
- package/test/context-providers/load-balancers.test.js +4 -4
- package/test/init.test.js +5 -4
- package/test/util/cloudformation.test.js +2 -2
- package/test/util/console-formatters.test.js +6 -6
- package/test/util/mock-sdk.d.ts +4 -2
- package/test/util/mock-sdk.js +6 -2
- package/test/util/mock-toolkitinfo.js +2 -2
- package/test/version.test.js +45 -3
- package/test/api/hotswap/lambda-hotswap-deployments.test.js +0 -418
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const setup = require("./hotswap-test-setup");
|
|
4
|
+
let mockUpdateLambdaCode;
|
|
5
|
+
let mockTagResource;
|
|
6
|
+
let mockUntagResource;
|
|
7
|
+
let hotswapMockSdkProvider;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
hotswapMockSdkProvider = setup.setupHotswapTests();
|
|
10
|
+
mockUpdateLambdaCode = jest.fn();
|
|
11
|
+
mockTagResource = jest.fn();
|
|
12
|
+
mockUntagResource = jest.fn();
|
|
13
|
+
hotswapMockSdkProvider.stubLambda({
|
|
14
|
+
updateFunctionCode: mockUpdateLambdaCode,
|
|
15
|
+
tagResource: mockTagResource,
|
|
16
|
+
untagResource: mockUntagResource,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
test('returns undefined when a new Lambda function is added to the Stack', async () => {
|
|
20
|
+
// GIVEN
|
|
21
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
22
|
+
template: {
|
|
23
|
+
Resources: {
|
|
24
|
+
Func: {
|
|
25
|
+
Type: 'AWS::Lambda::Function',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
// WHEN
|
|
31
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
32
|
+
// THEN
|
|
33
|
+
expect(deployStackResult).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
test('calls the updateLambdaCode() API when it receives only a code difference in a Lambda function', async () => {
|
|
36
|
+
// GIVEN
|
|
37
|
+
setup.setCurrentCfnStackTemplate({
|
|
38
|
+
Resources: {
|
|
39
|
+
Func: {
|
|
40
|
+
Type: 'AWS::Lambda::Function',
|
|
41
|
+
Properties: {
|
|
42
|
+
Code: {
|
|
43
|
+
S3Bucket: 'current-bucket',
|
|
44
|
+
S3Key: 'current-key',
|
|
45
|
+
},
|
|
46
|
+
FunctionName: 'my-function',
|
|
47
|
+
},
|
|
48
|
+
Metadata: {
|
|
49
|
+
'aws:asset:path': 'old-path',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
55
|
+
template: {
|
|
56
|
+
Resources: {
|
|
57
|
+
Func: {
|
|
58
|
+
Type: 'AWS::Lambda::Function',
|
|
59
|
+
Properties: {
|
|
60
|
+
Code: {
|
|
61
|
+
S3Bucket: 'current-bucket',
|
|
62
|
+
S3Key: 'new-key',
|
|
63
|
+
},
|
|
64
|
+
FunctionName: 'my-function',
|
|
65
|
+
},
|
|
66
|
+
Metadata: {
|
|
67
|
+
'aws:asset:path': 'new-path',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// WHEN
|
|
74
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
75
|
+
// THEN
|
|
76
|
+
expect(deployStackResult).not.toBeUndefined();
|
|
77
|
+
expect(mockUpdateLambdaCode).toHaveBeenCalledWith({
|
|
78
|
+
FunctionName: 'my-function',
|
|
79
|
+
S3Bucket: 'current-bucket',
|
|
80
|
+
S3Key: 'new-key',
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
test('calls the tagResource() API when it receives only a tag difference in a Lambda function', async () => {
|
|
84
|
+
// GIVEN
|
|
85
|
+
const currentTemplate = {
|
|
86
|
+
Resources: {
|
|
87
|
+
Func: {
|
|
88
|
+
Type: 'AWS::Lambda::Function',
|
|
89
|
+
Properties: {
|
|
90
|
+
Code: {
|
|
91
|
+
S3Bucket: 'current-bucket',
|
|
92
|
+
S3Key: 'current-key',
|
|
93
|
+
},
|
|
94
|
+
FunctionName: 'my-function',
|
|
95
|
+
Tags: [
|
|
96
|
+
{
|
|
97
|
+
Key: 'to-be-deleted',
|
|
98
|
+
Value: 'a-value',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
Key: 'to-be-changed',
|
|
102
|
+
Value: 'current-tag-value',
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
Metadata: {
|
|
107
|
+
'aws:asset:path': 'old-path',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
setup.setCurrentCfnStackTemplate(currentTemplate);
|
|
113
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
114
|
+
template: {
|
|
115
|
+
Resources: {
|
|
116
|
+
Func: {
|
|
117
|
+
Type: 'AWS::Lambda::Function',
|
|
118
|
+
Properties: {
|
|
119
|
+
Code: {
|
|
120
|
+
S3Bucket: 'current-bucket',
|
|
121
|
+
S3Key: 'current-key',
|
|
122
|
+
},
|
|
123
|
+
FunctionName: 'my-function',
|
|
124
|
+
Tags: [
|
|
125
|
+
{
|
|
126
|
+
Key: 'to-be-changed',
|
|
127
|
+
Value: 'new-tag-value',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
Key: 'to-be-added',
|
|
131
|
+
Value: 'added-tag-value',
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
Metadata: {
|
|
136
|
+
'aws:asset:path': 'old-path',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
// WHEN
|
|
143
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
144
|
+
// THEN
|
|
145
|
+
expect(deployStackResult).not.toBeUndefined();
|
|
146
|
+
expect(mockUntagResource).toHaveBeenCalledWith({
|
|
147
|
+
Resource: 'arn:aws:lambda:here:123456789012:function:my-function',
|
|
148
|
+
TagKeys: ['to-be-deleted'],
|
|
149
|
+
});
|
|
150
|
+
expect(mockTagResource).toHaveBeenCalledWith({
|
|
151
|
+
Resource: 'arn:aws:lambda:here:123456789012:function:my-function',
|
|
152
|
+
Tags: {
|
|
153
|
+
'to-be-changed': 'new-tag-value',
|
|
154
|
+
'to-be-added': 'added-tag-value',
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
expect(mockUpdateLambdaCode).not.toHaveBeenCalled();
|
|
158
|
+
});
|
|
159
|
+
test("correctly evaluates the function's name when it references a different resource from the template", async () => {
|
|
160
|
+
// GIVEN
|
|
161
|
+
setup.setCurrentCfnStackTemplate({
|
|
162
|
+
Resources: {
|
|
163
|
+
Bucket: {
|
|
164
|
+
Type: 'AWS::S3::Bucket',
|
|
165
|
+
},
|
|
166
|
+
Func: {
|
|
167
|
+
Type: 'AWS::Lambda::Function',
|
|
168
|
+
Properties: {
|
|
169
|
+
Code: {
|
|
170
|
+
S3Bucket: 'current-bucket',
|
|
171
|
+
S3Key: 'current-key',
|
|
172
|
+
},
|
|
173
|
+
FunctionName: {
|
|
174
|
+
'Fn::Join': ['-', [
|
|
175
|
+
'lambda',
|
|
176
|
+
{ Ref: 'Bucket' },
|
|
177
|
+
'function',
|
|
178
|
+
]],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
Metadata: {
|
|
182
|
+
'aws:asset:path': 'old-path',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
setup.pushStackResourceSummaries(setup.stackSummaryOf('Bucket', 'AWS::S3::Bucket', 'mybucket'));
|
|
188
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
189
|
+
template: {
|
|
190
|
+
Resources: {
|
|
191
|
+
Bucket: {
|
|
192
|
+
Type: 'AWS::S3::Bucket',
|
|
193
|
+
},
|
|
194
|
+
Func: {
|
|
195
|
+
Type: 'AWS::Lambda::Function',
|
|
196
|
+
Properties: {
|
|
197
|
+
Code: {
|
|
198
|
+
S3Bucket: 'current-bucket',
|
|
199
|
+
S3Key: 'new-key',
|
|
200
|
+
},
|
|
201
|
+
FunctionName: {
|
|
202
|
+
'Fn::Join': ['-', [
|
|
203
|
+
'lambda',
|
|
204
|
+
{ Ref: 'Bucket' },
|
|
205
|
+
'function',
|
|
206
|
+
]],
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
Metadata: {
|
|
210
|
+
'aws:asset:path': 'old-path',
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
// WHEN
|
|
217
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
218
|
+
// THEN
|
|
219
|
+
expect(deployStackResult).not.toBeUndefined();
|
|
220
|
+
expect(mockUpdateLambdaCode).toHaveBeenCalledWith({
|
|
221
|
+
FunctionName: 'lambda-mybucket-function',
|
|
222
|
+
S3Bucket: 'current-bucket',
|
|
223
|
+
S3Key: 'new-key',
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
test("correctly falls back to taking the function's name from the current stack if it can't evaluate it in the template", async () => {
|
|
227
|
+
// GIVEN
|
|
228
|
+
setup.setCurrentCfnStackTemplate({
|
|
229
|
+
Parameters: {
|
|
230
|
+
Param1: { Type: 'String' },
|
|
231
|
+
AssetBucketParam: { Type: 'String' },
|
|
232
|
+
},
|
|
233
|
+
Resources: {
|
|
234
|
+
Func: {
|
|
235
|
+
Type: 'AWS::Lambda::Function',
|
|
236
|
+
Properties: {
|
|
237
|
+
Code: {
|
|
238
|
+
S3Bucket: { Ref: 'AssetBucketParam' },
|
|
239
|
+
S3Key: 'current-key',
|
|
240
|
+
},
|
|
241
|
+
FunctionName: { Ref: 'Param1' },
|
|
242
|
+
},
|
|
243
|
+
Metadata: {
|
|
244
|
+
'aws:asset:path': 'old-path',
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
setup.pushStackResourceSummaries(setup.stackSummaryOf('Func', 'AWS::Lambda::Function', 'my-function'));
|
|
250
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
251
|
+
template: {
|
|
252
|
+
Parameters: {
|
|
253
|
+
Param1: { Type: 'String' },
|
|
254
|
+
AssetBucketParam: { Type: 'String' },
|
|
255
|
+
},
|
|
256
|
+
Resources: {
|
|
257
|
+
Func: {
|
|
258
|
+
Type: 'AWS::Lambda::Function',
|
|
259
|
+
Properties: {
|
|
260
|
+
Code: {
|
|
261
|
+
S3Bucket: { Ref: 'AssetBucketParam' },
|
|
262
|
+
S3Key: 'new-key',
|
|
263
|
+
},
|
|
264
|
+
FunctionName: { Ref: 'Param1' },
|
|
265
|
+
},
|
|
266
|
+
Metadata: {
|
|
267
|
+
'aws:asset:path': 'new-path',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
// WHEN
|
|
274
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact, { AssetBucketParam: 'asset-bucket' });
|
|
275
|
+
// THEN
|
|
276
|
+
expect(deployStackResult).not.toBeUndefined();
|
|
277
|
+
expect(mockUpdateLambdaCode).toHaveBeenCalledWith({
|
|
278
|
+
FunctionName: 'my-function',
|
|
279
|
+
S3Bucket: 'asset-bucket',
|
|
280
|
+
S3Key: 'new-key',
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
test("will not perform a hotswap deployment if it cannot find a Ref target (outside the function's name)", async () => {
|
|
284
|
+
// GIVEN
|
|
285
|
+
setup.setCurrentCfnStackTemplate({
|
|
286
|
+
Parameters: {
|
|
287
|
+
Param1: { Type: 'String' },
|
|
288
|
+
},
|
|
289
|
+
Resources: {
|
|
290
|
+
Func: {
|
|
291
|
+
Type: 'AWS::Lambda::Function',
|
|
292
|
+
Properties: {
|
|
293
|
+
Code: {
|
|
294
|
+
S3Bucket: { 'Fn::Sub': '${Param1}' },
|
|
295
|
+
S3Key: 'current-key',
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
Metadata: {
|
|
299
|
+
'aws:asset:path': 'old-path',
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
setup.pushStackResourceSummaries(setup.stackSummaryOf('Func', 'AWS::Lambda::Function', 'my-func'));
|
|
305
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
306
|
+
template: {
|
|
307
|
+
Parameters: {
|
|
308
|
+
Param1: { Type: 'String' },
|
|
309
|
+
},
|
|
310
|
+
Resources: {
|
|
311
|
+
Func: {
|
|
312
|
+
Type: 'AWS::Lambda::Function',
|
|
313
|
+
Properties: {
|
|
314
|
+
Code: {
|
|
315
|
+
S3Bucket: { 'Fn::Sub': '${Param1}' },
|
|
316
|
+
S3Key: 'new-key',
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
Metadata: {
|
|
320
|
+
'aws:asset:path': 'new-path',
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
// THEN
|
|
327
|
+
await expect(() => hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact)).rejects.toThrow(/Parameter or resource 'Param1' could not be found for evaluation/);
|
|
328
|
+
});
|
|
329
|
+
test("will not perform a hotswap deployment if it doesn't know how to handle a specific attribute (outside the function's name)", async () => {
|
|
330
|
+
// GIVEN
|
|
331
|
+
setup.setCurrentCfnStackTemplate({
|
|
332
|
+
Resources: {
|
|
333
|
+
Bucket: {
|
|
334
|
+
Type: 'AWS::S3::Bucket',
|
|
335
|
+
},
|
|
336
|
+
Func: {
|
|
337
|
+
Type: 'AWS::Lambda::Function',
|
|
338
|
+
Properties: {
|
|
339
|
+
Code: {
|
|
340
|
+
S3Bucket: { 'Fn::GetAtt': ['Bucket', 'UnknownAttribute'] },
|
|
341
|
+
S3Key: 'current-key',
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
Metadata: {
|
|
345
|
+
'aws:asset:path': 'old-path',
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
setup.pushStackResourceSummaries(setup.stackSummaryOf('Func', 'AWS::Lambda::Function', 'my-func'), setup.stackSummaryOf('Bucket', 'AWS::S3::Bucket', 'my-bucket'));
|
|
351
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
352
|
+
template: {
|
|
353
|
+
Resources: {
|
|
354
|
+
Bucket: {
|
|
355
|
+
Type: 'AWS::S3::Bucket',
|
|
356
|
+
},
|
|
357
|
+
Func: {
|
|
358
|
+
Type: 'AWS::Lambda::Function',
|
|
359
|
+
Properties: {
|
|
360
|
+
Code: {
|
|
361
|
+
S3Bucket: { 'Fn::GetAtt': ['Bucket', 'UnknownAttribute'] },
|
|
362
|
+
S3Key: 'new-key',
|
|
363
|
+
},
|
|
364
|
+
},
|
|
365
|
+
Metadata: {
|
|
366
|
+
'aws:asset:path': 'new-path',
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
// THEN
|
|
373
|
+
await expect(() => hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact)).rejects.toThrow("We don't support the 'UnknownAttribute' attribute of the 'AWS::S3::Bucket' resource. This is a CDK limitation. Please report it at https://github.com/aws/aws-cdk/issues/new/choose");
|
|
374
|
+
});
|
|
375
|
+
test('calls the updateLambdaCode() API when it receives a code difference in a Lambda function with no name', async () => {
|
|
376
|
+
// GIVEN
|
|
377
|
+
setup.setCurrentCfnStackTemplate({
|
|
378
|
+
Resources: {
|
|
379
|
+
Func: {
|
|
380
|
+
Type: 'AWS::Lambda::Function',
|
|
381
|
+
Properties: {
|
|
382
|
+
Code: {
|
|
383
|
+
S3Bucket: 'current-bucket',
|
|
384
|
+
S3Key: 'current-key',
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
Metadata: {
|
|
388
|
+
'aws:asset:path': 'current-path',
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
394
|
+
template: {
|
|
395
|
+
Resources: {
|
|
396
|
+
Func: {
|
|
397
|
+
Type: 'AWS::Lambda::Function',
|
|
398
|
+
Properties: {
|
|
399
|
+
Code: {
|
|
400
|
+
S3Bucket: 'current-bucket',
|
|
401
|
+
S3Key: 'new-key',
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
Metadata: {
|
|
405
|
+
'aws:asset:path': 'current-path',
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
});
|
|
411
|
+
// WHEN
|
|
412
|
+
setup.pushStackResourceSummaries(setup.stackSummaryOf('Func', 'AWS::Lambda::Function', 'mock-function-resource-id'));
|
|
413
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
414
|
+
// THEN
|
|
415
|
+
expect(deployStackResult).not.toBeUndefined();
|
|
416
|
+
expect(mockUpdateLambdaCode).toHaveBeenCalledWith({
|
|
417
|
+
FunctionName: 'mock-function-resource-id',
|
|
418
|
+
S3Bucket: 'current-bucket',
|
|
419
|
+
S3Key: 'new-key',
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
test('does not call the updateLambdaCode() API when it receives a change that is not a code difference in a Lambda function', async () => {
|
|
423
|
+
// GIVEN
|
|
424
|
+
setup.setCurrentCfnStackTemplate({
|
|
425
|
+
Resources: {
|
|
426
|
+
Func: {
|
|
427
|
+
Type: 'AWS::Lambda::Function',
|
|
428
|
+
Properties: {
|
|
429
|
+
Code: {
|
|
430
|
+
S3Bucket: 'current-bucket',
|
|
431
|
+
S3Key: 'current-key',
|
|
432
|
+
},
|
|
433
|
+
PackageType: 'Zip',
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
});
|
|
438
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
439
|
+
template: {
|
|
440
|
+
Resources: {
|
|
441
|
+
Func: {
|
|
442
|
+
Type: 'AWS::Lambda::Function',
|
|
443
|
+
Properties: {
|
|
444
|
+
Code: {
|
|
445
|
+
S3Bucket: 'current-bucket',
|
|
446
|
+
S3Key: 'current-key',
|
|
447
|
+
},
|
|
448
|
+
PackageType: 'Image',
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
});
|
|
454
|
+
// WHEN
|
|
455
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
456
|
+
// THEN
|
|
457
|
+
expect(deployStackResult).toBeUndefined();
|
|
458
|
+
expect(mockUpdateLambdaCode).not.toHaveBeenCalled();
|
|
459
|
+
});
|
|
460
|
+
test('does not call the updateLambdaCode() API when a resource with type that is not AWS::Lambda::Function but has the same properties is changed', async () => {
|
|
461
|
+
// GIVEN
|
|
462
|
+
setup.setCurrentCfnStackTemplate({
|
|
463
|
+
Resources: {
|
|
464
|
+
Func: {
|
|
465
|
+
Type: 'AWS::NotLambda::NotAFunction',
|
|
466
|
+
Properties: {
|
|
467
|
+
Code: {
|
|
468
|
+
S3Bucket: 'current-bucket',
|
|
469
|
+
S3Key: 'current-key',
|
|
470
|
+
},
|
|
471
|
+
},
|
|
472
|
+
Metadata: {
|
|
473
|
+
'aws:asset:path': 'old-path',
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
const cdkStackArtifact = setup.cdkStackArtifactOf({
|
|
479
|
+
template: {
|
|
480
|
+
Resources: {
|
|
481
|
+
Func: {
|
|
482
|
+
Type: 'AWS::NotLambda::NotAFunction',
|
|
483
|
+
Properties: {
|
|
484
|
+
Code: {
|
|
485
|
+
S3Bucket: 'current-bucket',
|
|
486
|
+
S3Key: 'new-key',
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
Metadata: {
|
|
490
|
+
'aws:asset:path': 'old-path',
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
},
|
|
495
|
+
});
|
|
496
|
+
// WHEN
|
|
497
|
+
const deployStackResult = await hotswapMockSdkProvider.tryHotswapDeployment(cdkStackArtifact);
|
|
498
|
+
// THEN
|
|
499
|
+
expect(deployStackResult).toBeUndefined();
|
|
500
|
+
expect(mockUpdateLambdaCode).not.toHaveBeenCalled();
|
|
501
|
+
});
|
|
502
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZ1bmN0aW9ucy1ob3Rzd2FwLWRlcGxveW1lbnRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJsYW1iZGEtZnVuY3Rpb25zLWhvdHN3YXAtZGVwbG95bWVudHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDhDQUE4QztBQUU5QyxJQUFJLG9CQUE0RyxDQUFDO0FBQ2pILElBQUksZUFBZ0UsQ0FBQztBQUNyRSxJQUFJLGlCQUFvRSxDQUFDO0FBQ3pFLElBQUksc0JBQW9ELENBQUM7QUFFekQsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ25ELG9CQUFvQixHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNqQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzVCLGlCQUFpQixHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUM5QixzQkFBc0IsQ0FBQyxVQUFVLENBQUM7UUFDaEMsa0JBQWtCLEVBQUUsb0JBQW9CO1FBQ3hDLFdBQVcsRUFBRSxlQUFlO1FBQzVCLGFBQWEsRUFBRSxpQkFBaUI7S0FDakMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsb0VBQW9FLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDcEYsUUFBUTtJQUNSLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQ2hELFFBQVEsRUFBRTtZQUNSLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLHVCQUF1QjtpQkFDOUI7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztJQUNQLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTlGLE9BQU87SUFDUCxNQUFNLENB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N0I7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDaEQsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsOEJBQThCO29CQUNwQyxVQUFVLEVBQUU7d0JBQ1YsSUFBSSxFQUFFOzRCQUNKLFFBQVEsRUFBRSxnQkFBZ0I7NEJBQzFCLEtBQUssRUFBRSxTQUFTO3lCQUNqQjtxQkFDRjtvQkFDRCxRQUFRLEVBQUU7d0JBQ1IsZ0JBQWdCLEVBQUUsVUFBVTtxQkFDN0I7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztJQUNQLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTlGLE9BQU87SUFDUCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUN0RCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExhbWJkYSB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgc2V0dXAgZnJvbSAnLi9ob3Rzd2FwLXRlc3Qtc2V0dXAnO1xuXG5sZXQgbW9ja1VwZGF0ZUxhbWJkYUNvZGU6IChwYXJhbXM6IExhbWJkYS5UeXBlcy5VcGRhdGVGdW5jdGlvbkNvZGVSZXF1ZXN0KSA9PiBMYW1iZGEuVHlwZXMuRnVuY3Rpb25Db25maWd1cmF0aW9uO1xubGV0IG1vY2tUYWdSZXNvdXJjZTogKHBhcmFtczogTGFtYmRhLlR5cGVzLlRhZ1Jlc291cmNlUmVxdWVzdCkgPT4ge307XG5sZXQgbW9ja1VudGFnUmVzb3VyY2U6IChwYXJhbXM6IExhbWJkYS5UeXBlcy5VbnRhZ1Jlc291cmNlUmVxdWVzdCkgPT4ge307XG5sZXQgaG90c3dhcE1vY2tTZGtQcm92aWRlcjogc2V0dXAuSG90c3dhcE1vY2tTZGtQcm92aWRlcjtcblxuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIGhvdHN3YXBNb2NrU2RrUHJvdmlkZXIgPSBzZXR1cC5zZXR1cEhvdHN3YXBUZXN0cygpO1xuICBtb2NrVXBkYXRlTGFtYmRhQ29kZSA9IGplc3QuZm4oKTtcbiAgbW9ja1RhZ1Jlc291cmNlID0gamVzdC5mbigpO1xuICBtb2NrVW50YWdSZXNvdXJjZSA9IGplc3QuZm4oKTtcbiAgaG90c3dhcE1vY2tTZGtQcm92aWRlci5zdHViTGFtYmRhKHtcbiAgICB1cGRhdGVGdW5jdGlvbkNvZGU6IG1vY2tVcGRhdGVMYW1iZGFDb2RlLFxuICAgIHRhZ1Jlc291cmNlOiBtb2NrVGFnUmVzb3VyY2UsXG4gICAgdW50YWdSZXNvdXJjZTogbW9ja1VudGFnUmVzb3VyY2UsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ3JldHVybnMgdW5kZWZpbmVkIHdoZW4gYSBuZXcgTGFtYmRhIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIHRoZSBTdGFjaycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IHNldHVwLmNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgZGVwbG95U3RhY2tSZXN1bHQgPSBhd2FpdCBob3Rzd2FwTW9ja1Nka1Byb3ZpZGVyLnRyeUhvdHN3YXBEZXBsb3ltZW50KGNka1N0YWNrQXJ0aWZhY3QpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGRlcGxveVN0YWNrUmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG59KTtcblxudGVzdCgnY2FsbHMgdGhlIHVwZGF0ZUxhbWJkYUNvZGUoKSBBUEkgd2hlbiBpdCByZWNlaXZlcyBvbmx5IGEgY29kZSBkaWZmZXJlbmNlIGluIGEgTGFtYmRhIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBzZXR1cC5zZXRDdXJyZW50Q2ZuU3RhY2tUZW1wbGF0ZSh7XG4gICAgUmVzb3VyY2VzOiB7XG4gICAgICBGdW5jOiB7XG4gICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgUzNCdWNrZXQ6ICdjdXJyZW50LWJ1Y2tldCcsXG4gICAgICAgICAgICBTM0tleTogJ2N1cnJlbnQta2V5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEZ1bmN0aW9uTmFtZTogJ215LWZ1bmN0aW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnb2xkLXBhdGgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IHNldHVwLmNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICAgICAgICAgICAgUzNLZXk6ICduZXcta2V5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6ICdteS1mdW5jdGlvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ25ldy1wYXRoJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGRlcGxveVN0YWNrUmVzdWx0ID0gYXdhaXQgaG90c3dhcE1vY2tTZGtQcm92aWRlci50cnlIb3Rzd2FwRGVwbG95bWVudChjZGtTdGFja0FydGlmYWN0KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChkZXBsb3lTdGFja1Jlc3VsdCkubm90LnRvQmVVbmRlZmluZWQoKTtcbiAgZXhwZWN0KG1vY2tVcGRhdGVMYW1iZGFDb2RlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgRnVuY3Rpb25OYW1lOiAnbXktZnVuY3Rpb24nLFxuICAgIFMzQnVja2V0OiAnY3VycmVudC1idWNrZXQnLFxuICAgIFMzS2V5OiAnbmV3LWtleScsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ2NhbGxzIHRoZSB0YWdSZXNvdXJjZSgpIEFQSSB3aGVuIGl0IHJlY2VpdmVzIG9ubHkgYSB0YWcgZGlmZmVyZW5jZSBpbiBhIExhbWJkYSBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY3VycmVudFRlbXBsYXRlID0ge1xuICAgIFJlc291cmNlczoge1xuICAgICAgRnVuYzoge1xuICAgICAgICBUeXBlOiAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIENvZGU6IHtcbiAgICAgICAgICAgIFMzQnVja2V0OiAnY3VycmVudC1idWNrZXQnLFxuICAgICAgICAgICAgUzNLZXk6ICdjdXJyZW50LWtleScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBGdW5jdGlvbk5hbWU6ICdteS1mdW5jdGlvbicsXG4gICAgICAgICAgVGFnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBLZXk6ICd0by1iZS1kZWxldGVkJyxcbiAgICAgICAgICAgICAgVmFsdWU6ICdhLXZhbHVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEtleTogJ3RvLWJlLWNoYW5nZWQnLFxuICAgICAgICAgICAgICBWYWx1ZTogJ2N1cnJlbnQtdGFnLXZhbHVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnb2xkLXBhdGgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHNldHVwLnNldEN1cnJlbnRDZm5TdGFja1RlbXBsYXRlKGN1cnJlbnRUZW1wbGF0ZSk7XG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBzZXR1cC5jZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgRnVuYzoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIENvZGU6IHtcbiAgICAgICAgICAgICAgUzNCdWNrZXQ6ICdjdXJyZW50LWJ1Y2tldCcsXG4gICAgICAgICAgICAgIFMzS2V5OiAnY3VycmVudC1rZXknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogJ215LWZ1bmN0aW9uJyxcbiAgICAgICAgICAgIFRhZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEtleTogJ3RvLWJlLWNoYW5nZWQnLFxuICAgICAgICAgICAgICAgIFZhbHVlOiAnbmV3LXRhZy12YWx1ZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBLZXk6ICd0by1iZS1hZGRlZCcsXG4gICAgICAgICAgICAgICAgVmFsdWU6ICdhZGRlZC10YWctdmFsdWUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnb2xkLXBhdGgnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgZGVwbG95U3RhY2tSZXN1bHQgPSBhd2FpdCBob3Rzd2FwTW9ja1Nka1Byb3ZpZGVyLnRyeUhvdHN3YXBEZXBsb3ltZW50KGNka1N0YWNrQXJ0aWZhY3QpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGRlcGxveVN0YWNrUmVzdWx0KS5ub3QudG9CZVVuZGVmaW5lZCgpO1xuXG4gIGV4cGVjdChtb2NrVW50YWdSZXNvdXJjZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgIFJlc291cmNlOiAnYXJuOmF3czpsYW1iZGE6aGVyZToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246bXktZnVuY3Rpb24nLFxuICAgIFRhZ0tleXM6IFsndG8tYmUtZGVsZXRlZCddLFxuICB9KTtcblxuICBleHBlY3QobW9ja1RhZ1Jlc291cmNlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgUmVzb3VyY2U6ICdhcm46YXdzOmxhbWJkYTpoZXJlOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgVGFnczoge1xuICAgICAgJ3RvLWJlLWNoYW5nZWQnOiAnbmV3LXRhZy12YWx1ZScsXG4gICAgICAndG8tYmUtYWRkZWQnOiAnYWRkZWQtdGFnLXZhbHVlJyxcbiAgICB9LFxuICB9KTtcblxuICBleHBlY3QobW9ja1VwZGF0ZUxhbWJkYUNvZGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG59KTtcblxudGVzdChcImNvcnJlY3RseSBldmFsdWF0ZXMgdGhlIGZ1bmN0aW9uJ3MgbmFtZSB3aGVuIGl0IHJlZmVyZW5jZXMgYSBkaWZmZXJlbnQgcmVzb3VyY2UgZnJvbSB0aGUgdGVtcGxhdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBzZXR1cC5zZXRDdXJyZW50Q2ZuU3RhY2tUZW1wbGF0ZSh7XG4gICAgUmVzb3VyY2VzOiB7XG4gICAgICBCdWNrZXQ6IHtcbiAgICAgICAgVHlwZTogJ0FXUzo6UzM6OkJ1Y2tldCcsXG4gICAgICB9LFxuICAgICAgRnVuYzoge1xuICAgICAgICBUeXBlOiAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIENvZGU6IHtcbiAgICAgICAgICAgIFMzQnVja2V0OiAnY3VycmVudC1idWNrZXQnLFxuICAgICAgICAgICAgUzNLZXk6ICdjdXJyZW50LWtleScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBGdW5jdGlvbk5hbWU6IHtcbiAgICAgICAgICAgICdGbjo6Sm9pbic6IFsnLScsIFtcbiAgICAgICAgICAgICAgJ2xhbWJkYScsXG4gICAgICAgICAgICAgIHsgUmVmOiAnQnVja2V0JyB9LFxuICAgICAgICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgXV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnb2xkLXBhdGgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgc2V0dXAucHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoc2V0dXAuc3RhY2tTdW1tYXJ5T2YoJ0J1Y2tldCcsICdBV1M6OlMzOjpCdWNrZXQnLCAnbXlidWNrZXQnKSk7XG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBzZXR1cC5jZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgQnVja2V0OiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6UzM6OkJ1Y2tldCcsXG4gICAgICAgIH0sXG4gICAgICAgIEZ1bmM6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBDb2RlOiB7XG4gICAgICAgICAgICAgIFMzQnVja2V0OiAnY3VycmVudC1idWNrZXQnLFxuICAgICAgICAgICAgICBTM0tleTogJ25ldy1rZXknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZToge1xuICAgICAgICAgICAgICAnRm46OkpvaW4nOiBbJy0nLCBbXG4gICAgICAgICAgICAgICAgJ2xhbWJkYScsXG4gICAgICAgICAgICAgICAgeyBSZWY6ICdCdWNrZXQnIH0sXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICdhd3M6YXNzZXQ6cGF0aCc6ICdvbGQtcGF0aCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBkZXBsb3lTdGFja1Jlc3VsdCA9IGF3YWl0IGhvdHN3YXBNb2NrU2RrUHJvdmlkZXIudHJ5SG90c3dhcERlcGxveW1lbnQoY2RrU3RhY2tBcnRpZmFjdCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZGVwbG95U3RhY2tSZXN1bHQpLm5vdC50b0JlVW5kZWZpbmVkKCk7XG4gIGV4cGVjdChtb2NrVXBkYXRlTGFtYmRhQ29kZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgIEZ1bmN0aW9uTmFtZTogJ2xhbWJkYS1teWJ1Y2tldC1mdW5jdGlvbicsXG4gICAgUzNCdWNrZXQ6ICdjdXJyZW50LWJ1Y2tldCcsXG4gICAgUzNLZXk6ICduZXcta2V5JyxcbiAgfSk7XG59KTtcblxudGVzdChcImNvcnJlY3RseSBmYWxscyBiYWNrIHRvIHRha2luZyB0aGUgZnVuY3Rpb24ncyBuYW1lIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgaWYgaXQgY2FuJ3QgZXZhbHVhdGUgaXQgaW4gdGhlIHRlbXBsYXRlXCIsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgc2V0dXAuc2V0Q3VycmVudENmblN0YWNrVGVtcGxhdGUoe1xuICAgIFBhcmFtZXRlcnM6IHtcbiAgICAgIFBhcmFtMTogeyBUeXBlOiAnU3RyaW5nJyB9LFxuICAgICAgQXNzZXRCdWNrZXRQYXJhbTogeyBUeXBlOiAnU3RyaW5nJyB9LFxuICAgIH0sXG4gICAgUmVzb3VyY2VzOiB7XG4gICAgICBGdW5jOiB7XG4gICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgUzNCdWNrZXQ6IHsgUmVmOiAnQXNzZXRCdWNrZXRQYXJhbScgfSxcbiAgICAgICAgICAgIFMzS2V5OiAnY3VycmVudC1rZXknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRnVuY3Rpb25OYW1lOiB7IFJlZjogJ1BhcmFtMScgfSxcbiAgICAgICAgfSxcbiAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnb2xkLXBhdGgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgc2V0dXAucHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoc2V0dXAuc3RhY2tTdW1tYXJ5T2YoJ0Z1bmMnLCAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywgJ215LWZ1bmN0aW9uJykpO1xuICBjb25zdCBjZGtTdGFja0FydGlmYWN0ID0gc2V0dXAuY2RrU3RhY2tBcnRpZmFjdE9mKHtcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgUGFyYW1ldGVyczoge1xuICAgICAgICBQYXJhbTE6IHsgVHlwZTogJ1N0cmluZycgfSxcbiAgICAgICAgQXNzZXRCdWNrZXRQYXJhbTogeyBUeXBlOiAnU3RyaW5nJyB9LFxuICAgICAgfSxcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgICBTM0J1Y2tldDogeyBSZWY6ICdBc3NldEJ1Y2tldFBhcmFtJyB9LFxuICAgICAgICAgICAgICBTM0tleTogJ25ldy1rZXknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogeyBSZWY6ICdQYXJhbTEnIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ25ldy1wYXRoJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGRlcGxveVN0YWNrUmVzdWx0ID0gYXdhaXQgaG90c3dhcE1vY2tTZGtQcm92aWRlci50cnlIb3Rzd2FwRGVwbG95bWVudChjZGtTdGFja0FydGlmYWN0LCB7IEFzc2V0QnVja2V0UGFyYW06ICdhc3NldC1idWNrZXQnIH0pO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGRlcGxveVN0YWNrUmVzdWx0KS5ub3QudG9CZVVuZGVmaW5lZCgpO1xuICBleHBlY3QobW9ja1VwZGF0ZUxhbWJkYUNvZGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICBGdW5jdGlvbk5hbWU6ICdteS1mdW5jdGlvbicsXG4gICAgUzNCdWNrZXQ6ICdhc3NldC1idWNrZXQnLFxuICAgIFMzS2V5OiAnbmV3LWtleScsXG4gIH0pO1xufSk7XG5cbnRlc3QoXCJ3aWxsIG5vdCBwZXJmb3JtIGEgaG90c3dhcCBkZXBsb3ltZW50IGlmIGl0IGNhbm5vdCBmaW5kIGEgUmVmIHRhcmdldCAob3V0c2lkZSB0aGUgZnVuY3Rpb24ncyBuYW1lKVwiLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIHNldHVwLnNldEN1cnJlbnRDZm5TdGFja1RlbXBsYXRlKHtcbiAgICBQYXJhbWV0ZXJzOiB7XG4gICAgICBQYXJhbTE6IHsgVHlwZTogJ1N0cmluZycgfSxcbiAgICB9LFxuICAgIFJlc291cmNlczoge1xuICAgICAgRnVuYzoge1xuICAgICAgICBUeXBlOiAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIENvZGU6IHtcbiAgICAgICAgICAgIFMzQnVja2V0OiB7ICdGbjo6U3ViJzogJyR7UGFyYW0xfScgfSxcbiAgICAgICAgICAgIFMzS2V5OiAnY3VycmVudC1rZXknLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIE1ldGFkYXRhOiB7XG4gICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ29sZC1wYXRoJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIHNldHVwLnB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKHNldHVwLnN0YWNrU3VtbWFyeU9mKCdGdW5jJywgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsICdteS1mdW5jJykpO1xuICBjb25zdCBjZGtTdGFja0FydGlmYWN0ID0gc2V0dXAuY2RrU3RhY2tBcnRpZmFjdE9mKHtcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgUGFyYW1ldGVyczoge1xuICAgICAgICBQYXJhbTE6IHsgVHlwZTogJ1N0cmluZycgfSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgRnVuYzoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIENvZGU6IHtcbiAgICAgICAgICAgICAgUzNCdWNrZXQ6IHsgJ0ZuOjpTdWInOiAnJHtQYXJhbTF9JyB9LFxuICAgICAgICAgICAgICBTM0tleTogJ25ldy1rZXknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAnYXdzOmFzc2V0OnBhdGgnOiAnbmV3LXBhdGgnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgYXdhaXQgZXhwZWN0KCgpID0+XG4gICAgaG90c3dhcE1vY2tTZGtQcm92aWRlci50cnlIb3Rzd2FwRGVwbG95bWVudChjZGtTdGFja0FydGlmYWN0KSxcbiAgKS5yZWplY3RzLnRvVGhyb3coL1BhcmFtZXRlciBvciByZXNvdXJjZSAnUGFyYW0xJyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb24vKTtcbn0pO1xuXG50ZXN0KFwid2lsbCBub3QgcGVyZm9ybSBhIGhvdHN3YXAgZGVwbG95bWVudCBpZiBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBhIHNwZWNpZmljIGF0dHJpYnV0ZSAob3V0c2lkZSB0aGUgZnVuY3Rpb24ncyBuYW1lKVwiLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIHNldHVwLnNldEN1cnJlbnRDZm5TdGFja1RlbXBsYXRlKHtcbiAgICBSZXNvdXJjZXM6IHtcbiAgICAgIEJ1Y2tldDoge1xuICAgICAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0JyxcbiAgICAgIH0sXG4gICAgICBGdW5jOiB7XG4gICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgUzNCdWNrZXQ6IHsgJ0ZuOjpHZXRBdHQnOiBbJ0J1Y2tldCcsICdVbmtub3duQXR0cmlidXRlJ10gfSxcbiAgICAgICAgICAgIFMzS2V5OiAnY3VycmVudC1rZXknLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIE1ldGFkYXRhOiB7XG4gICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ29sZC1wYXRoJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIHNldHVwLnB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKFxuICAgIHNldHVwLnN0YWNrU3VtbWFyeU9mKCdGdW5jJywgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsICdteS1mdW5jJyksXG4gICAgc2V0dXAuc3RhY2tTdW1tYXJ5T2YoJ0J1Y2tldCcsICdBV1M6OlMzOjpCdWNrZXQnLCAnbXktYnVja2V0JyksXG4gICk7XG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBzZXR1cC5jZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgQnVja2V0OiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6UzM6OkJ1Y2tldCcsXG4gICAgICAgIH0sXG4gICAgICAgIEZ1bmM6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBDb2RlOiB7XG4gICAgICAgICAgICAgIFMzQnVja2V0OiB7ICdGbjo6R2V0QXR0JzogWydCdWNrZXQnLCAnVW5rbm93bkF0dHJpYnV0ZSddIH0sXG4gICAgICAgICAgICAgIFMzS2V5OiAnbmV3LWtleScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICdhd3M6YXNzZXQ6cGF0aCc6ICduZXctcGF0aCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBhd2FpdCBleHBlY3QoKCkgPT5cbiAgICBob3Rzd2FwTW9ja1Nka1Byb3ZpZGVyLnRyeUhvdHN3YXBEZXBsb3ltZW50KGNka1N0YWNrQXJ0aWZhY3QpLFxuICApLnJlamVjdHMudG9UaHJvdyhcIldlIGRvbid0IHN1cHBvcnQgdGhlICdVbmtub3duQXR0cmlidXRlJyBhdHRyaWJ1dGUgb2YgdGhlICdBV1M6OlMzOjpCdWNrZXQnIHJlc291cmNlLiBUaGlzIGlzIGEgQ0RLIGxpbWl0YXRpb24uIFBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlXCIpO1xufSk7XG5cbnRlc3QoJ2NhbGxzIHRoZSB1cGRhdGVMYW1iZGFDb2RlKCkgQVBJIHdoZW4gaXQgcmVjZWl2ZXMgYSBjb2RlIGRpZmZlcmVuY2UgaW4gYSBMYW1iZGEgZnVuY3Rpb24gd2l0aCBubyBuYW1lJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBzZXR1cC5zZXRDdXJyZW50Q2ZuU3RhY2tUZW1wbGF0ZSh7XG4gICAgUmVzb3VyY2VzOiB7XG4gICAgICBGdW5jOiB7XG4gICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgUzNCdWNrZXQ6ICdjdXJyZW50LWJ1Y2tldCcsXG4gICAgICAgICAgICBTM0tleTogJ2N1cnJlbnQta2V5JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICdhd3M6YXNzZXQ6cGF0aCc6ICdjdXJyZW50LXBhdGgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IHNldHVwLmNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICAgICAgICAgICAgUzNLZXk6ICduZXcta2V5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ2N1cnJlbnQtcGF0aCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBzZXR1cC5wdXNoU3RhY2tSZXNvdXJjZVN1bW1hcmllcyhzZXR1cC5zdGFja1N1bW1hcnlPZignRnVuYycsICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCAnbW9jay1mdW5jdGlvbi1yZXNvdXJjZS1pZCcpKTtcbiAgY29uc3QgZGVwbG95U3RhY2tSZXN1bHQgPSBhd2FpdCBob3Rzd2FwTW9ja1Nka1Byb3ZpZGVyLnRyeUhvdHN3YXBEZXBsb3ltZW50KGNka1N0YWNrQXJ0aWZhY3QpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGRlcGxveVN0YWNrUmVzdWx0KS5ub3QudG9CZVVuZGVmaW5lZCgpO1xuICBleHBlY3QobW9ja1VwZGF0ZUxhbWJkYUNvZGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICBGdW5jdGlvbk5hbWU6ICdtb2NrLWZ1bmN0aW9uLXJlc291cmNlLWlkJyxcbiAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICBTM0tleTogJ25ldy1rZXknLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdkb2VzIG5vdCBjYWxsIHRoZSB1cGRhdGVMYW1iZGFDb2RlKCkgQVBJIHdoZW4gaXQgcmVjZWl2ZXMgYSBjaGFuZ2UgdGhhdCBpcyBub3QgYSBjb2RlIGRpZmZlcmVuY2UgaW4gYSBMYW1iZGEgZnVuY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIHNldHVwLnNldEN1cnJlbnRDZm5TdGFja1RlbXBsYXRlKHtcbiAgICBSZXNvdXJjZXM6IHtcbiAgICAgIEZ1bmM6IHtcbiAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBDb2RlOiB7XG4gICAgICAgICAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICAgICAgICAgIFMzS2V5OiAnY3VycmVudC1rZXknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUGFja2FnZVR5cGU6ICdaaXAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IHNldHVwLmNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICAgICAgICAgICAgUzNLZXk6ICdjdXJyZW50LWtleScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgUGFja2FnZVR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBkZXBsb3lTdGFja1Jlc3VsdCA9IGF3YWl0IGhvdHN3YXBNb2NrU2RrUHJvdmlkZXIudHJ5SG90c3dhcERlcGxveW1lbnQoY2RrU3RhY2tBcnRpZmFjdCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZGVwbG95U3RhY2tSZXN1bHQpLnRvQmVVbmRlZmluZWQoKTtcbiAgZXhwZWN0KG1vY2tVcGRhdGVMYW1iZGFDb2RlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xufSk7XG5cbnRlc3QoJ2RvZXMgbm90IGNhbGwgdGhlIHVwZGF0ZUxhbWJkYUNvZGUoKSBBUEkgd2hlbiBhIHJlc291cmNlIHdpdGggdHlwZSB0aGF0IGlzIG5vdCBBV1M6OkxhbWJkYTo6RnVuY3Rpb24gYnV0IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGlzIGNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIHNldHVwLnNldEN1cnJlbnRDZm5TdGFja1RlbXBsYXRlKHtcbiAgICBSZXNvdXJjZXM6IHtcbiAgICAgIEZ1bmM6IHtcbiAgICAgICAgVHlwZTogJ0FXUzo6Tm90TGFtYmRhOjpOb3RBRnVuY3Rpb24nLFxuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgUzNCdWNrZXQ6ICdjdXJyZW50LWJ1Y2tldCcsXG4gICAgICAgICAgICBTM0tleTogJ2N1cnJlbnQta2V5JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICdhd3M6YXNzZXQ6cGF0aCc6ICdvbGQtcGF0aCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBjZGtTdGFja0FydGlmYWN0ID0gc2V0dXAuY2RrU3RhY2tBcnRpZmFjdE9mKHtcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgUmVzb3VyY2VzOiB7XG4gICAgICAgIEZ1bmM6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpOb3RMYW1iZGE6Ok5vdEFGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgQ29kZToge1xuICAgICAgICAgICAgICBTM0J1Y2tldDogJ2N1cnJlbnQtYnVja2V0JyxcbiAgICAgICAgICAgICAgUzNLZXk6ICduZXcta2V5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBNZXRhZGF0YToge1xuICAgICAgICAgICAgJ2F3czphc3NldDpwYXRoJzogJ29sZC1wYXRoJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGRlcGxveVN0YWNrUmVzdWx0ID0gYXdhaXQgaG90c3dhcE1vY2tTZGtQcm92aWRlci50cnlIb3Rzd2FwRGVwbG95bWVudChjZGtTdGFja0FydGlmYWN0KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChkZXBsb3lTdGFja1Jlc3VsdCkudG9CZVVuZGVmaW5lZCgpO1xuICBleHBlY3QobW9ja1VwZGF0ZUxhbWJkYUNvZGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|