@aws-cdk/aws-imagebuilder-alpha 2.228.0-alpha.0 → 2.229.1-alpha.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/.jsii +7485 -2916
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +157 -1
- package/README.md +603 -8
- package/awslint.json +6 -1
- package/lib/base-image.d.ts +119 -0
- package/lib/base-image.js +160 -0
- package/lib/component.js +8 -8
- package/lib/container-recipe.d.ts +337 -0
- package/lib/container-recipe.js +451 -0
- package/lib/distribution-configuration.d.ts +11 -0
- package/lib/distribution-configuration.js +14 -3
- package/lib/image-recipe.d.ts +238 -0
- package/lib/image-recipe.js +335 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +6 -1
- package/lib/infrastructure-configuration.js +1 -1
- package/lib/os-version.js +1 -1
- package/lib/recipe-base.d.ts +69 -0
- package/lib/recipe-base.js +27 -0
- package/lib/workflow.d.ts +491 -0
- package/lib/workflow.js +597 -0
- package/package.json +7 -7
package/lib/workflow.js
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
5
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
6
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
7
|
+
var _, done = false;
|
|
8
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
9
|
+
var context = {};
|
|
10
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
11
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
12
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
13
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
14
|
+
if (kind === "accessor") {
|
|
15
|
+
if (result === void 0) continue;
|
|
16
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
17
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
18
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
19
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
20
|
+
}
|
|
21
|
+
else if (_ = accept(result)) {
|
|
22
|
+
if (kind === "field") initializers.unshift(_);
|
|
23
|
+
else descriptor[key] = _;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
27
|
+
done = true;
|
|
28
|
+
};
|
|
29
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
30
|
+
var useValue = arguments.length > 2;
|
|
31
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
32
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
33
|
+
}
|
|
34
|
+
return useValue ? value : void 0;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.Workflow = exports.AwsManagedWorkflow = exports.S3WorkflowData = exports.WorkflowData = exports.WorkflowType = exports.WorkflowSchemaVersion = exports.WorkflowParameterType = exports.WorkflowOnFailure = exports.WorkflowAction = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const cdk = require("aws-cdk-lib");
|
|
41
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
42
|
+
const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
|
|
43
|
+
const s3assets = require("aws-cdk-lib/aws-s3-assets");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const yaml = require("yaml");
|
|
47
|
+
const WORKFLOW_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.Workflow');
|
|
48
|
+
/**
|
|
49
|
+
* Represents the latest version of a workflow. When using the workflow in a pipeline, the pipeline will use the
|
|
50
|
+
* latest workflow at the time of execution.
|
|
51
|
+
*
|
|
52
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
|
|
53
|
+
*/
|
|
54
|
+
const LATEST_VERSION = 'x.x.x';
|
|
55
|
+
/**
|
|
56
|
+
* The action for a step within the workflow document
|
|
57
|
+
*/
|
|
58
|
+
var WorkflowAction;
|
|
59
|
+
(function (WorkflowAction) {
|
|
60
|
+
/**
|
|
61
|
+
* Applies customizations and configurations to the input AMIs, such as publishing the AMI to SSM Parameter Store,
|
|
62
|
+
* or creating launch template versions with the AMI IDs provided in the input
|
|
63
|
+
*/
|
|
64
|
+
WorkflowAction["APPLY_IMAGE_CONFIGURATIONS"] = "ApplyImageConfigurations";
|
|
65
|
+
/**
|
|
66
|
+
* The BootstrapInstanceForContainer action runs a service script to bootstrap the instance with minimum requirements
|
|
67
|
+
* to run container workflows
|
|
68
|
+
*/
|
|
69
|
+
WorkflowAction["BOOTSTRAP_INSTANCE_FOR_CONTAINER"] = "BootstrapInstanceForContainer";
|
|
70
|
+
/**
|
|
71
|
+
* The CollectImageMetadata action collects additional information about the instance, such as the list of packages
|
|
72
|
+
* and their respective versions
|
|
73
|
+
*/
|
|
74
|
+
WorkflowAction["COLLECT_IMAGE_METADATA"] = "CollectImageMetadata";
|
|
75
|
+
/**
|
|
76
|
+
* The CollectImageScanFindings action collects findings reported by Amazon Inspector for the provided instance
|
|
77
|
+
*/
|
|
78
|
+
WorkflowAction["COLLECT_IMAGE_SCAN_FINDINGS"] = "CollectImageScanFindings";
|
|
79
|
+
/**
|
|
80
|
+
* The CreateImage action creates an AMI from a running instance with the ec2:CreateImage API
|
|
81
|
+
*/
|
|
82
|
+
WorkflowAction["CREATE_IMAGE"] = "CreateImage";
|
|
83
|
+
/**
|
|
84
|
+
* The DistributeImage action copies an AMI using the image's distribution configuration, or using the distribution
|
|
85
|
+
* settings in the step input
|
|
86
|
+
*/
|
|
87
|
+
WorkflowAction["DISTRIBUTE_IMAGE"] = "DistributeImage";
|
|
88
|
+
/**
|
|
89
|
+
* The ExecuteComponents action runs components that are specified in the recipe for the current image being built
|
|
90
|
+
*/
|
|
91
|
+
WorkflowAction["EXECUTE_COMPONENTS"] = "ExecuteComponents";
|
|
92
|
+
/**
|
|
93
|
+
* The ExecuteStateMachine action executes a the state machine provided and waits for completion as part of the
|
|
94
|
+
* workflow
|
|
95
|
+
*/
|
|
96
|
+
WorkflowAction["EXECUTE_STATE_MACHINE"] = "ExecuteStateMachine";
|
|
97
|
+
/**
|
|
98
|
+
* The LaunchInstance action launches an instance using the settings from your recipe and infrastructure configuration
|
|
99
|
+
* resources
|
|
100
|
+
*/
|
|
101
|
+
WorkflowAction["LAUNCH_INSTANCE"] = "LaunchInstance";
|
|
102
|
+
/**
|
|
103
|
+
* Applies attribute updates to the provided set of distributed images, such as launch permission updates
|
|
104
|
+
*/
|
|
105
|
+
WorkflowAction["MODIFY_IMAGE_ATTRIBUTES"] = "ModifyImageAttributes";
|
|
106
|
+
/**
|
|
107
|
+
* The RunCommand action runs a command document against the provided instance
|
|
108
|
+
*/
|
|
109
|
+
WorkflowAction["RUN_COMMAND"] = "RunCommand";
|
|
110
|
+
/**
|
|
111
|
+
* The RegisterImage action creates an AMI from a set of snapshots with the ec2:RegisterImage API
|
|
112
|
+
*/
|
|
113
|
+
WorkflowAction["REGISTER_IMAGE"] = "RegisterImage";
|
|
114
|
+
/**
|
|
115
|
+
* The RunSysprep action runs the Sysprep document on the provided Windows instance
|
|
116
|
+
*/
|
|
117
|
+
WorkflowAction["RUN_SYS_PREP"] = "RunSysPrep";
|
|
118
|
+
/**
|
|
119
|
+
* The SanitizeInstance action runs a recommended sanitization script on Linux instances
|
|
120
|
+
*/
|
|
121
|
+
WorkflowAction["SANITIZE_INSTANCE"] = "SanitizeInstance";
|
|
122
|
+
/**
|
|
123
|
+
* The TerminateInstance action terminates the provided instance
|
|
124
|
+
*/
|
|
125
|
+
WorkflowAction["TERMINATE_INSTANCE"] = "TerminateInstance";
|
|
126
|
+
/**
|
|
127
|
+
* The WaitForAction action pauses the workflow and waits to receive an external signal from the
|
|
128
|
+
* imagebuilder:SendWorkflowStepAction API
|
|
129
|
+
*/
|
|
130
|
+
WorkflowAction["WAIT_FOR_ACTION"] = "WaitForAction";
|
|
131
|
+
/**
|
|
132
|
+
* The WaitForSSMAgent action waits for the given instance to have connectivity with SSM before proceeding
|
|
133
|
+
*/
|
|
134
|
+
WorkflowAction["WAIT_FOR_SSM_AGENT"] = "WaitForSSMAgent";
|
|
135
|
+
})(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {}));
|
|
136
|
+
/**
|
|
137
|
+
* The action to take if the workflow fails
|
|
138
|
+
*/
|
|
139
|
+
var WorkflowOnFailure;
|
|
140
|
+
(function (WorkflowOnFailure) {
|
|
141
|
+
/**
|
|
142
|
+
* Fails the image build if the workflow fails
|
|
143
|
+
*/
|
|
144
|
+
WorkflowOnFailure["ABORT"] = "Abort";
|
|
145
|
+
/**
|
|
146
|
+
* Continues with the image build if the workflow fails
|
|
147
|
+
*/
|
|
148
|
+
WorkflowOnFailure["CONTINUE"] = "Continue";
|
|
149
|
+
})(WorkflowOnFailure || (exports.WorkflowOnFailure = WorkflowOnFailure = {}));
|
|
150
|
+
/**
|
|
151
|
+
* The parameter type for the workflow parameter
|
|
152
|
+
*/
|
|
153
|
+
var WorkflowParameterType;
|
|
154
|
+
(function (WorkflowParameterType) {
|
|
155
|
+
/**
|
|
156
|
+
* Indicates the workflow parameter has a boolean value
|
|
157
|
+
*/
|
|
158
|
+
WorkflowParameterType["BOOLEAN"] = "boolean";
|
|
159
|
+
/**
|
|
160
|
+
* Indicates the workflow parameter has an integer value
|
|
161
|
+
*/
|
|
162
|
+
WorkflowParameterType["INTEGER"] = "integer";
|
|
163
|
+
/**
|
|
164
|
+
* Indicates the workflow parameter has a string value
|
|
165
|
+
*/
|
|
166
|
+
WorkflowParameterType["STRING"] = "string";
|
|
167
|
+
/**
|
|
168
|
+
* Indicates the workflow parameter has a string list value
|
|
169
|
+
*/
|
|
170
|
+
WorkflowParameterType["STRING_LIST"] = "stringList";
|
|
171
|
+
})(WorkflowParameterType || (exports.WorkflowParameterType = WorkflowParameterType = {}));
|
|
172
|
+
/**
|
|
173
|
+
* The schema version of the workflow
|
|
174
|
+
*/
|
|
175
|
+
var WorkflowSchemaVersion;
|
|
176
|
+
(function (WorkflowSchemaVersion) {
|
|
177
|
+
/**
|
|
178
|
+
* Schema version 1.0 for the workflow document
|
|
179
|
+
*/
|
|
180
|
+
WorkflowSchemaVersion["V1_0"] = "1.0";
|
|
181
|
+
})(WorkflowSchemaVersion || (exports.WorkflowSchemaVersion = WorkflowSchemaVersion = {}));
|
|
182
|
+
/**
|
|
183
|
+
* The type of the workflow
|
|
184
|
+
*/
|
|
185
|
+
var WorkflowType;
|
|
186
|
+
(function (WorkflowType) {
|
|
187
|
+
/**
|
|
188
|
+
* Indicates the workflow is for building images
|
|
189
|
+
*/
|
|
190
|
+
WorkflowType["BUILD"] = "BUILD";
|
|
191
|
+
/**
|
|
192
|
+
* Indicates the workflow is for testing images
|
|
193
|
+
*/
|
|
194
|
+
WorkflowType["TEST"] = "TEST";
|
|
195
|
+
/**
|
|
196
|
+
* Indicates the workflow is for distributing images
|
|
197
|
+
*/
|
|
198
|
+
WorkflowType["DISTRIBUTION"] = "DISTRIBUTION";
|
|
199
|
+
})(WorkflowType || (exports.WorkflowType = WorkflowType = {}));
|
|
200
|
+
/**
|
|
201
|
+
* Helper class for referencing and uploading workflow data
|
|
202
|
+
*/
|
|
203
|
+
class WorkflowData {
|
|
204
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.WorkflowData", version: "2.229.1-alpha.0" };
|
|
205
|
+
/**
|
|
206
|
+
* Uploads workflow data from a local file to S3 to use as the workflow data
|
|
207
|
+
*
|
|
208
|
+
* @param scope The construct scope
|
|
209
|
+
* @param id Identifier of the construct
|
|
210
|
+
* @param path The local path to the workflow data file
|
|
211
|
+
* @param options S3 asset upload options
|
|
212
|
+
*/
|
|
213
|
+
static fromAsset(scope, id, path, options = {}) {
|
|
214
|
+
const asset = new s3assets.Asset(scope, id, { ...options, path });
|
|
215
|
+
return new S3WorkflowDataFromAsset(asset);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* References workflow data from a pre-existing S3 object
|
|
219
|
+
*
|
|
220
|
+
* @param bucket The S3 bucket where the workflow data is stored
|
|
221
|
+
* @param key The S3 key of the workflow data file
|
|
222
|
+
*/
|
|
223
|
+
static fromS3(bucket, key) {
|
|
224
|
+
return new S3WorkflowDataFromBucketKey(bucket, key);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Uses an inline JSON object as the workflow data
|
|
228
|
+
*
|
|
229
|
+
* @param data An inline JSON object representing the workflow data
|
|
230
|
+
*/
|
|
231
|
+
static fromJsonObject(data) {
|
|
232
|
+
const inlineData = yaml.stringify(data, { indent: 2 });
|
|
233
|
+
return new InlineWorkflowData(inlineData);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Uses an inline JSON or YAML string as the workflow data
|
|
237
|
+
*
|
|
238
|
+
* @param data An inline JSON or YAML string representing the workflow data
|
|
239
|
+
*/
|
|
240
|
+
static fromInline(data) {
|
|
241
|
+
return new InlineWorkflowData(data);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.WorkflowData = WorkflowData;
|
|
245
|
+
/**
|
|
246
|
+
* Helper class for S3-based workflow data references, containing additional permission grant methods on the S3 object
|
|
247
|
+
*/
|
|
248
|
+
class S3WorkflowData extends WorkflowData {
|
|
249
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.S3WorkflowData", version: "2.229.1-alpha.0" };
|
|
250
|
+
bucket;
|
|
251
|
+
key;
|
|
252
|
+
constructor(bucket, key) {
|
|
253
|
+
super();
|
|
254
|
+
this.bucket = bucket;
|
|
255
|
+
this.key = key;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* The rendered workflow data text, for use in CloudFormation
|
|
259
|
+
*/
|
|
260
|
+
render() {
|
|
261
|
+
return { uri: this.bucket.s3UrlForObject(this.key) };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Grant put permissions to the given grantee for the workflow data in S3
|
|
265
|
+
*
|
|
266
|
+
* @param grantee The principal
|
|
267
|
+
*/
|
|
268
|
+
grantPut(grantee) {
|
|
269
|
+
return this.bucket.grantPut(grantee, this.key);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Grant read permissions to the given grantee for the workflow data in S3
|
|
273
|
+
*
|
|
274
|
+
* @param grantee The principal
|
|
275
|
+
*/
|
|
276
|
+
grantRead(grantee) {
|
|
277
|
+
return this.bucket.grantRead(grantee, this.key);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.S3WorkflowData = S3WorkflowData;
|
|
281
|
+
class InlineWorkflowData extends WorkflowData {
|
|
282
|
+
data;
|
|
283
|
+
constructor(data) {
|
|
284
|
+
super();
|
|
285
|
+
this.data = data;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* The rendered workflow data text, for use in CloudFormation
|
|
289
|
+
*/
|
|
290
|
+
render() {
|
|
291
|
+
return { data: this.data };
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
class S3WorkflowDataFromBucketKey extends S3WorkflowData {
|
|
295
|
+
constructor(bucket, key) {
|
|
296
|
+
super(bucket, key);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
class S3WorkflowDataFromAsset extends S3WorkflowData {
|
|
300
|
+
constructor(asset) {
|
|
301
|
+
super(asset.bucket, asset.s3ObjectKey);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Helper class for working with AWS-managed workflows
|
|
306
|
+
*/
|
|
307
|
+
class AwsManagedWorkflow {
|
|
308
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.AwsManagedWorkflow", version: "2.229.1-alpha.0" };
|
|
309
|
+
/**
|
|
310
|
+
* Imports the build-container AWS-managed workflow
|
|
311
|
+
*
|
|
312
|
+
* @param scope The construct scope
|
|
313
|
+
* @param id Identifier of the construct
|
|
314
|
+
*/
|
|
315
|
+
static buildContainer(scope, id) {
|
|
316
|
+
return this.fromAwsManagedWorkflowAttributes(scope, id, {
|
|
317
|
+
workflowName: 'build-container',
|
|
318
|
+
workflowType: WorkflowType.BUILD,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Imports the build-image AWS-managed workflow
|
|
323
|
+
*
|
|
324
|
+
* @param scope The construct scope
|
|
325
|
+
* @param id Identifier of the construct
|
|
326
|
+
*/
|
|
327
|
+
static buildImage(scope, id) {
|
|
328
|
+
return this.fromAwsManagedWorkflowAttributes(scope, id, {
|
|
329
|
+
workflowName: 'build-image',
|
|
330
|
+
workflowType: WorkflowType.BUILD,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Imports the distribute-container AWS-managed workflow
|
|
335
|
+
*
|
|
336
|
+
* @param scope The construct scope
|
|
337
|
+
* @param id Identifier of the construct
|
|
338
|
+
*/
|
|
339
|
+
static distributeContainer(scope, id) {
|
|
340
|
+
return this.fromAwsManagedWorkflowAttributes(scope, id, {
|
|
341
|
+
workflowName: 'distribute-container',
|
|
342
|
+
workflowType: WorkflowType.DISTRIBUTION,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Imports the test-container AWS-managed workflow
|
|
347
|
+
*
|
|
348
|
+
* @param scope The construct scope
|
|
349
|
+
* @param id Identifier of the construct
|
|
350
|
+
*/
|
|
351
|
+
static testContainer(scope, id) {
|
|
352
|
+
return this.fromAwsManagedWorkflowAttributes(scope, id, {
|
|
353
|
+
workflowName: 'test-container',
|
|
354
|
+
workflowType: WorkflowType.TEST,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Imports the test-image AWS-managed workflow
|
|
359
|
+
*
|
|
360
|
+
* @param scope The construct scope
|
|
361
|
+
* @param id Identifier of the construct
|
|
362
|
+
*/
|
|
363
|
+
static testImage(scope, id) {
|
|
364
|
+
return this.fromAwsManagedWorkflowAttributes(scope, id, {
|
|
365
|
+
workflowName: 'test-image',
|
|
366
|
+
workflowType: WorkflowType.TEST,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Imports an AWS-managed workflow from its attributes
|
|
371
|
+
*
|
|
372
|
+
* @param scope The construct scope
|
|
373
|
+
* @param id Identifier of the construct
|
|
374
|
+
* @param attrs The attributes of the AWS-managed workflow
|
|
375
|
+
*/
|
|
376
|
+
static fromAwsManagedWorkflowAttributes(scope, id, attrs) {
|
|
377
|
+
try {
|
|
378
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedWorkflowAttributes(attrs);
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
382
|
+
Error.captureStackTrace(error, this.fromAwsManagedWorkflowAttributes);
|
|
383
|
+
}
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
if (cdk.Token.isUnresolved(attrs.workflowType)) {
|
|
387
|
+
throw new cdk.ValidationError('workflowType cannot be a token', scope);
|
|
388
|
+
}
|
|
389
|
+
return Workflow.fromWorkflowArn(scope, id, cdk.Stack.of(scope).formatArn({
|
|
390
|
+
service: 'imagebuilder',
|
|
391
|
+
account: 'aws',
|
|
392
|
+
resource: 'workflow',
|
|
393
|
+
resourceName: `${attrs.workflowType.toLowerCase()}/${attrs.workflowName}/${LATEST_VERSION}`,
|
|
394
|
+
}));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
exports.AwsManagedWorkflow = AwsManagedWorkflow;
|
|
398
|
+
/**
|
|
399
|
+
* A new or imported Workflow
|
|
400
|
+
*/
|
|
401
|
+
class WorkflowBase extends cdk.Resource {
|
|
402
|
+
/**
|
|
403
|
+
* Grant custom actions to the given grantee for the workflow
|
|
404
|
+
*
|
|
405
|
+
* @param grantee The principal
|
|
406
|
+
* @param actions The list of actions
|
|
407
|
+
*/
|
|
408
|
+
grant(grantee, ...actions) {
|
|
409
|
+
return iam.Grant.addToPrincipal({
|
|
410
|
+
grantee,
|
|
411
|
+
actions,
|
|
412
|
+
resourceArns: [this.workflowArn],
|
|
413
|
+
scope: this,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Grant read permissions to the given grantee for the workflow
|
|
418
|
+
*
|
|
419
|
+
* @param grantee The principal
|
|
420
|
+
*/
|
|
421
|
+
grantRead(grantee) {
|
|
422
|
+
return this.grant(grantee, 'imagebuilder:GetWorkflow');
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Represents an EC2 Image Builder Workflow.
|
|
427
|
+
*
|
|
428
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-image-workflows.html
|
|
429
|
+
*/
|
|
430
|
+
let Workflow = (() => {
|
|
431
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
432
|
+
let _classDescriptor;
|
|
433
|
+
let _classExtraInitializers = [];
|
|
434
|
+
let _classThis;
|
|
435
|
+
let _classSuper = WorkflowBase;
|
|
436
|
+
var Workflow = class extends _classSuper {
|
|
437
|
+
static { _classThis = this; }
|
|
438
|
+
static {
|
|
439
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
440
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
441
|
+
Workflow = _classThis = _classDescriptor.value;
|
|
442
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
443
|
+
}
|
|
444
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.Workflow", version: "2.229.1-alpha.0" };
|
|
445
|
+
/** Uniquely identifies this class. */
|
|
446
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.Workflow';
|
|
447
|
+
/**
|
|
448
|
+
* Import an existing workflow given its ARN.
|
|
449
|
+
*/
|
|
450
|
+
static fromWorkflowArn(scope, id, workflowArn) {
|
|
451
|
+
return this.fromWorkflowAttributes(scope, id, { workflowArn });
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Import an existing workflow by providing its attributes. The provided name must be normalized by converting
|
|
455
|
+
* all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens. You may not
|
|
456
|
+
* provide a dynamic expression for the workflowArn or workflowType
|
|
457
|
+
*/
|
|
458
|
+
static fromWorkflowAttributes(scope, id, attrs) {
|
|
459
|
+
try {
|
|
460
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_WorkflowAttributes(attrs);
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
464
|
+
Error.captureStackTrace(error, this.fromWorkflowAttributes);
|
|
465
|
+
}
|
|
466
|
+
throw error;
|
|
467
|
+
}
|
|
468
|
+
if (attrs.workflowArn !== undefined &&
|
|
469
|
+
(attrs.workflowName !== undefined || attrs.workflowType !== undefined || attrs.workflowVersion !== undefined)) {
|
|
470
|
+
throw new cdk.ValidationError('a workflowName, workflowType, or workflowVersion cannot be provided when a workflowArn is provided', scope);
|
|
471
|
+
}
|
|
472
|
+
if (attrs.workflowArn === undefined && (attrs.workflowName === undefined || attrs.workflowType === undefined)) {
|
|
473
|
+
throw new cdk.ValidationError('either workflowArn, or workflowName and workflowType is required', scope);
|
|
474
|
+
}
|
|
475
|
+
if (attrs.workflowType && cdk.Token.isUnresolved(attrs.workflowType)) {
|
|
476
|
+
throw new cdk.ValidationError('workflowType cannot be an unresolved token', scope);
|
|
477
|
+
}
|
|
478
|
+
const workflowArn = (() => {
|
|
479
|
+
if (attrs.workflowArn !== undefined) {
|
|
480
|
+
return attrs.workflowArn;
|
|
481
|
+
}
|
|
482
|
+
return cdk.Stack.of(scope).formatArn({
|
|
483
|
+
service: 'imagebuilder',
|
|
484
|
+
resource: 'workflow',
|
|
485
|
+
resourceName: `${attrs.workflowType.toLowerCase()}/${attrs.workflowName}/${attrs.workflowVersion ?? LATEST_VERSION}`,
|
|
486
|
+
});
|
|
487
|
+
})();
|
|
488
|
+
const [workflowType, workflowName, workflowVersion] = (() => {
|
|
489
|
+
if (attrs.workflowName !== undefined) {
|
|
490
|
+
return [attrs.workflowType.toUpperCase(), attrs.workflowName, attrs.workflowVersion ?? LATEST_VERSION];
|
|
491
|
+
}
|
|
492
|
+
const workflowNameTypeVersion = cdk.Stack.of(scope).splitArn(workflowArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
|
|
493
|
+
if (cdk.Token.isUnresolved(workflowNameTypeVersion)) {
|
|
494
|
+
throw new cdk.ValidationError('the workflowName, workflowType, and workflowVersion in the workflowArn cannot be an unresolved token', scope);
|
|
495
|
+
}
|
|
496
|
+
if (workflowNameTypeVersion.split('/').length < 3) {
|
|
497
|
+
throw new cdk.ValidationError('the workflow ARN must end with <workflow-type>/<workflow-name>/<workflow-version>', scope);
|
|
498
|
+
}
|
|
499
|
+
const workflowNameTypeVersionSplit = workflowNameTypeVersion.split('/');
|
|
500
|
+
const [workflowTypeFromArn, workflowNameFromArn, workflowVersionFromArn] = workflowNameTypeVersionSplit.slice(0, 3);
|
|
501
|
+
return [workflowTypeFromArn.toUpperCase(), workflowNameFromArn, workflowVersionFromArn];
|
|
502
|
+
})();
|
|
503
|
+
class Import extends WorkflowBase {
|
|
504
|
+
workflowArn = workflowArn;
|
|
505
|
+
workflowName = workflowName;
|
|
506
|
+
workflowType = workflowType;
|
|
507
|
+
workflowVersion = workflowVersion;
|
|
508
|
+
}
|
|
509
|
+
return new Import(scope, id);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Return whether the given object is a Workflow.
|
|
513
|
+
*/
|
|
514
|
+
static isWorkflow(x) {
|
|
515
|
+
return x !== null && typeof x === 'object' && WORKFLOW_SYMBOL in x;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* The ARN of the workflow
|
|
519
|
+
*/
|
|
520
|
+
workflowArn;
|
|
521
|
+
/**
|
|
522
|
+
* The name of the workflow
|
|
523
|
+
*/
|
|
524
|
+
workflowName;
|
|
525
|
+
/**
|
|
526
|
+
* The type of the workflow
|
|
527
|
+
*/
|
|
528
|
+
workflowType;
|
|
529
|
+
/**
|
|
530
|
+
* The version of the workflow
|
|
531
|
+
*/
|
|
532
|
+
workflowVersion;
|
|
533
|
+
constructor(scope, id, props) {
|
|
534
|
+
super(scope, id, {
|
|
535
|
+
physicalName: props.workflowName ??
|
|
536
|
+
cdk.Lazy.string({
|
|
537
|
+
produce: () => cdk.Names.uniqueResourceName(this, {
|
|
538
|
+
maxLength: 128,
|
|
539
|
+
separator: '-',
|
|
540
|
+
allowedSpecialCharacters: '-',
|
|
541
|
+
}).toLowerCase(), // Enforce lowercase for the auto-generated fallback
|
|
542
|
+
}),
|
|
543
|
+
});
|
|
544
|
+
try {
|
|
545
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_WorkflowProps(props);
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
549
|
+
Error.captureStackTrace(error, Workflow);
|
|
550
|
+
}
|
|
551
|
+
throw error;
|
|
552
|
+
}
|
|
553
|
+
// Enhanced CDK Analytics Telemetry
|
|
554
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
555
|
+
Object.defineProperty(this, WORKFLOW_SYMBOL, { value: true });
|
|
556
|
+
this.validateWorkflowName();
|
|
557
|
+
const workflowVersion = props.workflowVersion ?? '1.0.0';
|
|
558
|
+
const workflow = new aws_imagebuilder_1.CfnWorkflow(this, 'Resource', {
|
|
559
|
+
name: this.physicalName,
|
|
560
|
+
version: workflowVersion,
|
|
561
|
+
type: props.workflowType,
|
|
562
|
+
changeDescription: props.changeDescription,
|
|
563
|
+
description: props.description,
|
|
564
|
+
kmsKeyId: props.kmsKey?.keyArn,
|
|
565
|
+
tags: props.tags,
|
|
566
|
+
...props.data.render(),
|
|
567
|
+
});
|
|
568
|
+
this.workflowName = this.getResourceNameAttribute(workflow.getAtt('Name').toString());
|
|
569
|
+
this.workflowArn = workflow.attrArn;
|
|
570
|
+
this.workflowVersion = workflowVersion;
|
|
571
|
+
this.workflowType = props.workflowType;
|
|
572
|
+
}
|
|
573
|
+
validateWorkflowName() {
|
|
574
|
+
if (cdk.Token.isUnresolved(this.physicalName)) {
|
|
575
|
+
return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
|
|
576
|
+
}
|
|
577
|
+
if (this.physicalName.length > 128) {
|
|
578
|
+
throw new cdk.ValidationError('the workflowName cannot be longer than 128 characters', this);
|
|
579
|
+
}
|
|
580
|
+
if (this.physicalName.includes(' ')) {
|
|
581
|
+
throw new cdk.ValidationError('the workflowName cannot contain spaces', this);
|
|
582
|
+
}
|
|
583
|
+
if (this.physicalName.includes('_')) {
|
|
584
|
+
throw new cdk.ValidationError('the workflowName cannot contain underscores', this);
|
|
585
|
+
}
|
|
586
|
+
if (this.physicalName !== this.physicalName.toLowerCase()) {
|
|
587
|
+
throw new cdk.ValidationError('the workflowName must be lowercase', this);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
static {
|
|
591
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
return Workflow = _classThis;
|
|
595
|
+
})();
|
|
596
|
+
exports.Workflow = Workflow;
|
|
597
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLG1FQUEyRDtBQUczRCxzREFBc0Q7QUFDdEQsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUUxRSw2QkFBNkI7QUFFN0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBRS9FOzs7OztHQUtHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBNkovQjs7R0FFRztBQUNILElBQVksY0E0Rlg7QUE1RkQsV0FBWSxjQUFjO0lBQ3hCOzs7T0FHRztJQUNILHlFQUF1RCxDQUFBO0lBRXZEOzs7T0FHRztJQUNILG9GQUFrRSxDQUFBO0lBRWxFOzs7T0FHRztJQUNILGlFQUErQyxDQUFBO0lBRS9DOztPQUVHO0lBQ0gsMEVBQXdELENBQUE7SUFFeEQ7O09BRUc7SUFDSCw4Q0FBNEIsQ0FBQTtJQUU1Qjs7O09BR0c7SUFDSCxzREFBb0MsQ0FBQTtJQUVwQzs7T0FFRztJQUNILDBEQUF3QyxDQUFBO0lBRXhDOzs7T0FHRztJQUNILCtEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILG9EQUFrQyxDQUFBO0lBRWxDOztPQUVHO0lBQ0gsbUVBQWlELENBQUE7SUFFakQ7O09BRUc7SUFDSCw0Q0FBMEIsQ0FBQTtJQUUxQjs7T0FFRztJQUNILGtEQUFnQyxDQUFBO0lBRWhDOztPQUVHO0lBQ0gsNkNBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCx3REFBc0MsQ0FBQTtJQUV0Qzs7T0FFRztJQUNILDBEQUF3QyxDQUFBO0lBRXhDOzs7T0FHRztJQUNILG1EQUFpQyxDQUFBO0lBRWpDOztPQUVHO0lBQ0gsd0RBQXNDLENBQUE7QUFDeEMsQ0FBQyxFQTVGVyxjQUFjLDhCQUFkLGNBQWMsUUE0RnpCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGlCQVVYO0FBVkQsV0FBWSxpQkFBaUI7SUFDM0I7O09BRUc7SUFDSCxvQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCwwQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVlcsaUJBQWlCLGlDQUFqQixpQkFBaUIsUUFVNUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBb0JYO0FBcEJELFdBQVkscUJBQXFCO0lBQy9COztPQUVHO0lBQ0gsNENBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCw0Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILDBDQUFpQixDQUFBO0lBRWpCOztPQUVHO0lBQ0gsbURBQTBCLENBQUE7QUFDNUIsQ0FBQyxFQXBCVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQW9CaEM7QUFFRDs7R0FFRztBQUNILElBQVkscUJBS1g7QUFMRCxXQUFZLHFCQUFxQjtJQUMvQjs7T0FFRztJQUNILHFDQUFZLENBQUE7QUFDZCxDQUFDLEVBTFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFLaEM7QUFFRDs7R0FFRztBQUNILElBQVksWUFlWDtBQWZELFdBQVksWUFBWTtJQUN0Qjs7T0FFRztJQUNILCtCQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDZCQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILDZDQUE2QixDQUFBO0FBQy9CLENBQUMsRUFmVyxZQUFZLDRCQUFaLFlBQVksUUFldkI7QUF1QkQ7O0dBRUc7QUFDSCxNQUFzQixZQUFZOztJQUNoQzs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FDckIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLElBQVksRUFDWixVQUFpQyxFQUFFO1FBRW5DLE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDM0M7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBa0IsRUFBRSxHQUFXO1FBQ2xELE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDckQ7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUE0QjtRQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUMzQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JDOztBQTlDSCxvQ0FzREM7QUFFRDs7R0FFRztBQUNILE1BQXNCLGNBQWUsU0FBUSxZQUFZOztJQUNwQyxNQUFNLENBQWE7SUFDbkIsR0FBRyxDQUFTO0lBRS9CLFlBQXNCLE1BQWtCLEVBQUUsR0FBVztRQUNuRCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0tBQ2hCO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztLQUN0RDtJQUVEOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsT0FBdUI7UUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2hEO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxPQUF1QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDakQ7O0FBbENILHdDQW1DQztBQUVELE1BQU0sa0JBQW1CLFNBQVEsWUFBWTtJQUN4QixJQUFJLENBQVM7SUFFaEMsWUFBbUIsSUFBWTtRQUM3QixLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2xCO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDNUI7Q0FDRjtBQUVELE1BQU0sMkJBQTRCLFNBQVEsY0FBYztJQUN0RCxZQUFtQixNQUFrQixFQUFFLEdBQVc7UUFDaEQsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNwQjtDQUNGO0FBRUQsTUFBTSx1QkFBd0IsU0FBUSxjQUFjO0lBQ2xELFlBQW1CLEtBQXFCO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUN4QztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGtCQUFrQjs7SUFDN0I7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsRUFBVTtRQUN2RCxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFlBQVksRUFBRSxpQkFBaUI7WUFDL0IsWUFBWSxFQUFFLFlBQVksQ0FBQyxLQUFLO1NBQ2pDLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWdCLEVBQUUsRUFBVTtRQUNuRCxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFlBQVksRUFBRSxhQUFhO1lBQzNCLFlBQVksRUFBRSxZQUFZLENBQUMsS0FBSztTQUNqQyxDQUFDLENBQUM7S0FDSjtJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQWdCLEVBQUUsRUFBVTtRQUM1RCxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFlBQVksRUFBRSxzQkFBc0I7WUFDcEMsWUFBWSxFQUFFLFlBQVksQ0FBQyxZQUFZO1NBQ3hDLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQWdCLEVBQUUsRUFBVTtRQUN0RCxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsWUFBWSxFQUFFLFlBQVksQ0FBQyxJQUFJO1NBQ2hDLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWdCLEVBQUUsRUFBVTtRQUNsRCxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFlBQVksRUFBRSxZQUFZO1lBQzFCLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSTtTQUNoQyxDQUFDLENBQUM7S0FDSjtJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FDNUMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQW1DOzs7Ozs7Ozs7O1FBRW5DLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FDN0IsS0FBSyxFQUNMLEVBQUUsRUFDRixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUIsT0FBTyxFQUFFLGNBQWM7WUFDdkIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksY0FBYyxFQUFFO1NBQzVGLENBQUMsQ0FDSCxDQUFDO0tBQ0g7O0FBNUZILGdEQTZGQztBQUVEOztHQUVHO0FBQ0gsTUFBZSxZQUFhLFNBQVEsR0FBRyxDQUFDLFFBQVE7SUFxQjlDOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLE9BQXVCLEVBQUUsR0FBRyxPQUFpQjtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzlCLE9BQU87WUFDUCxPQUFPO1lBQ1AsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNoQyxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxPQUF1QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDBCQUEwQixDQUFDLENBQUM7S0FDeEQ7Q0FDRjtBQUVEOzs7O0dBSUc7SUFFVSxRQUFROzRCQURwQixvQ0FBa0I7Ozs7c0JBQ1csWUFBWTt3QkFBcEIsU0FBUSxXQUFZOzs7O1lBQTFDLDZLQWdMQzs7Ozs7UUEvS0Msc0NBQXNDO1FBQy9CLE1BQU0sQ0FBVSxxQkFBcUIsR0FBVywwQ0FBMEMsQ0FBQztRQUVsRzs7V0FFRztRQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsV0FBbUI7WUFDN0UsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDaEU7UUFFRDs7OztXQUlHO1FBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCOzs7Ozs7Ozs7O1lBQzFGLElBQ0UsS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTO2dCQUMvQixDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLEVBQzdHLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQzNCLG9HQUFvRyxFQUNwRyxLQUFLLENBQ04sQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM5RyxNQUFNLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxrRUFBa0UsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRyxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxNQUFNLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hCLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUMzQixDQUFDO2dCQUVELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNuQyxPQUFPLEVBQUUsY0FBYztvQkFDdkIsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFhLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLFlBQWEsSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLGNBQWMsRUFBRTtpQkFDdkgsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVMLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUMxRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSxjQUFjLENBQUMsQ0FBQztnQkFDMUcsQ0FBQztnQkFFRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FDMUQsV0FBVyxFQUNYLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQ2xDLENBQUMsWUFBYSxDQUFDO2dCQUVoQixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztvQkFDcEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQzNCLHNHQUFzRyxFQUN0RyxLQUFLLENBQ04sQ0FBQztnQkFDSixDQUFDO2dCQUVELElBQUksdUJBQXVCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQzNCLG1GQUFtRixFQUNuRixLQUFLLENBQ04sQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0sNEJBQTRCLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLENBQUMsR0FBRyw0QkFBNEIsQ0FBQyxLQUFLLENBQzNHLENBQUMsRUFDRCxDQUFDLENBQ0YsQ0FBQztnQkFFRixPQUFPLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUMxRixDQUFDLENBQUMsRUFBRSxDQUFDO1lBRUwsTUFBTSxNQUFPLFNBQVEsWUFBWTtnQkFDZixXQUFXLEdBQUcsV0FBVyxDQUFDO2dCQUMxQixZQUFZLEdBQUcsWUFBWSxDQUFDO2dCQUM1QixZQUFZLEdBQUcsWUFBWSxDQUFDO2dCQUM1QixlQUFlLEdBQUcsZUFBZSxDQUFDO2FBQ25EO1lBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUI7UUFFRDs7V0FFRztRQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBTTtZQUM3QixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUM7U0FDcEU7UUFFRDs7V0FFRztRQUNhLFdBQVcsQ0FBUztRQUVwQzs7V0FFRztRQUNhLFlBQVksQ0FBUztRQUVyQzs7V0FFRztRQUNhLFlBQVksQ0FBUztRQUVyQzs7V0FFRztRQUNhLGVBQWUsQ0FBUztRQUV4QyxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtZQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDZixZQUFZLEVBQ1YsS0FBSyxDQUFDLFlBQVk7b0JBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUNkLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTs0QkFDakMsU0FBUyxFQUFFLEdBQUc7NEJBQ2QsU0FBUyxFQUFFLEdBQUc7NEJBQ2Qsd0JBQXdCLEVBQUUsR0FBRzt5QkFDOUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLG9EQUFvRDtxQkFDekUsQ0FBQzthQUNMLENBQUMsQ0FBQzs7Ozs7O21EQWpJTSxRQUFROzs7O1lBa0lqQixtQ0FBbUM7WUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFOUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFNUIsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSw4QkFBVyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDdkIsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLElBQUksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDeEIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtnQkFDMUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNO2dCQUM5QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDeEM7UUFFTyxvQkFBb0I7WUFDMUIsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLDZGQUE2RjtZQUN2RyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsdURBQXVELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsd0NBQXdDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsNkNBQTZDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckYsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVFLENBQUM7U0FDRjs7WUEvS1UsdURBQVE7Ozs7O0FBQVIsNEJBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ2ZuV29ya2Zsb3cgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaW1hZ2VidWlsZGVyJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcblxuY29uc3QgV09SS0ZMT1dfU1lNQk9MID0gU3ltYm9sLmZvcignQGF3cy1jZGsvYXdzLWltYWdlYnVpbGRlci1hbHBoYS5Xb3JrZmxvdycpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgd29ya2Zsb3cuIFdoZW4gdXNpbmcgdGhlIHdvcmtmbG93IGluIGEgcGlwZWxpbmUsIHRoZSBwaXBlbGluZSB3aWxsIHVzZSB0aGVcbiAqIGxhdGVzdCB3b3JrZmxvdyBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW1hZ2VidWlsZGVyL2xhdGVzdC91c2VyZ3VpZGUvaWJob3ctc2VtYW50aWMtdmVyc2lvbmluZy5odG1sXG4gKi9cbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ3gueC54JztcblxuLyoqXG4gKiBBbiBFQzIgSW1hZ2UgQnVpbGRlciBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV29ya2Zsb3cgZXh0ZW5kcyBjZGsuSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgbGlzdCBvZiBhY3Rpb25zXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBXb3JrZmxvdyByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UHJvcHMge1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93IGRvY3VtZW50IGNvbnRlbnQgdGhhdCBkZWZpbmVzIHRoZSBpbWFnZSBjcmVhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogV29ya2Zsb3dEYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGhhc2UgaW4gdGhlIGltYWdlIGJ1aWxkIHByb2Nlc3MgZm9yIHdoaWNoIHRoZSB3b3JrZmxvdyByZXNvdXJjZSBpcyByZXNwb25zaWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogV29ya2Zsb3dUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIGlzIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEuMC4wXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbmdlIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrZmxvdy4gRGVzY3JpYmVzIHdoYXQgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSB3b3JrZmxvdywgb3JcbiAgICogd2hhdCBtYWtlcyB0aGlzIHZlcnNpb24gZGlmZmVyZW50IGZyb20gb3RoZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhpcyB3b3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbiBJbWFnZSBCdWlsZGVyIG93bmVkIGtleSB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIHRhZ3MgdG8gYXBwbHkgdG8gdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFuIEVDMiBJbWFnZSBCdWlsZGVyIFdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIEFSTiBpcyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdGVkIGlmIGEgd29ya2Zsb3dOYW1lIGFuZCB3b3JrZmxvd1R5cGUgaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBhXG4gICAqIHdvcmtmbG93QXJuIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG5hbWUgaXMgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBpZiBhIHdvcmtmbG93QXJuIGlzIHByb3ZpZGVkLCBvdGhlcndpc2UgYSB3b3JrZmxvd05hbWUgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHR5cGUgaXMgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBpZiBhIHdvcmtmbG93QXJuIGlzIHByb3ZpZGVkLCBvdGhlcndpc2UgYSB3b3JrZmxvd1R5cGUgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZT86IFdvcmtmbG93VHlwZTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IHgueC54XG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gRUMyIEltYWdlIEJ1aWxkZXIgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGU7XG59XG5cbi8qKlxuICogVGhlIGFjdGlvbiBmb3IgYSBzdGVwIHdpdGhpbiB0aGUgd29ya2Zsb3cgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dBY3Rpb24ge1xuICAvKipcbiAgICogQXBwbGllcyBjdXN0b21pemF0aW9ucyBhbmQgY29uZmlndXJhdGlvbnMgdG8gdGhlIGlucHV0IEFNSXMsIHN1Y2ggYXMgcHVibGlzaGluZyB0aGUgQU1JIHRvIFNTTSBQYXJhbWV0ZXIgU3RvcmUsXG4gICAqIG9yIGNyZWF0aW5nIGxhdW5jaCB0ZW1wbGF0ZSB2ZXJzaW9ucyB3aXRoIHRoZSBBTUkgSURzIHByb3ZpZGVkIGluIHRoZSBpbnB1dFxuICAgKi9cbiAgQVBQTFlfSU1BR0VfQ09ORklHVVJBVElPTlMgPSAnQXBwbHlJbWFnZUNvbmZpZ3VyYXRpb25zJyxcblxuICAvKipcbiAgICogVGhlIEJvb3RzdHJhcEluc3RhbmNlRm9yQ29udGFpbmVyIGFjdGlvbiBydW5zIGEgc2VydmljZSBzY3JpcHQgdG8gYm9vdHN0cmFwIHRoZSBpbnN0YW5jZSB3aXRoIG1pbmltdW0gcmVxdWlyZW1lbnRzXG4gICAqIHRvIHJ1biBjb250YWluZXIgd29ya2Zsb3dzXG4gICAqL1xuICBCT09UU1RSQVBfSU5TVEFOQ0VfRk9SX0NPTlRBSU5FUiA9ICdCb290c3RyYXBJbnN0YW5jZUZvckNvbnRhaW5lcicsXG5cbiAgLyoqXG4gICAqIFRoZSBDb2xsZWN0SW1hZ2VNZXRhZGF0YSBhY3Rpb24gY29sbGVjdHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGFuY2UsIHN1Y2ggYXMgdGhlIGxpc3Qgb2YgcGFja2FnZXNcbiAgICogYW5kIHRoZWlyIHJlc3BlY3RpdmUgdmVyc2lvbnNcbiAgICovXG4gIENPTExFQ1RfSU1BR0VfTUVUQURBVEEgPSAnQ29sbGVjdEltYWdlTWV0YWRhdGEnLFxuXG4gIC8qKlxuICAgKiBUaGUgQ29sbGVjdEltYWdlU2NhbkZpbmRpbmdzIGFjdGlvbiBjb2xsZWN0cyBmaW5kaW5ncyByZXBvcnRlZCBieSBBbWF6b24gSW5zcGVjdG9yIGZvciB0aGUgcHJvdmlkZWQgaW5zdGFuY2VcbiAgICovXG4gIENPTExFQ1RfSU1BR0VfU0NBTl9GSU5ESU5HUyA9ICdDb2xsZWN0SW1hZ2VTY2FuRmluZGluZ3MnLFxuXG4gIC8qKlxuICAgKiBUaGUgQ3JlYXRlSW1hZ2UgYWN0aW9uIGNyZWF0ZXMgYW4gQU1JIGZyb20gYSBydW5uaW5nIGluc3RhbmNlIHdpdGggdGhlIGVjMjpDcmVhdGVJbWFnZSBBUElcbiAgICovXG4gIENSRUFURV9JTUFHRSA9ICdDcmVhdGVJbWFnZScsXG5cbiAgLyoqXG4gICAqIFRoZSBEaXN0cmlidXRlSW1hZ2UgYWN0aW9uIGNvcGllcyBhbiBBTUkgdXNpbmcgdGhlIGltYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24sIG9yIHVzaW5nIHRoZSBkaXN0cmlidXRpb25cbiAgICogc2V0dGluZ3MgaW4gdGhlIHN0ZXAgaW5wdXRcbiAgICovXG4gIERJU1RSSUJVVEVfSU1BR0UgPSAnRGlzdHJpYnV0ZUltYWdlJyxcblxuICAvKipcbiAgICogVGhlIEV4ZWN1dGVDb21wb25lbnRzIGFjdGlvbiBydW5zIGNvbXBvbmVudHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSByZWNpcGUgZm9yIHRoZSBjdXJyZW50IGltYWdlIGJlaW5nIGJ1aWx0XG4gICAqL1xuICBFWEVDVVRFX0NPTVBPTkVOVFMgPSAnRXhlY3V0ZUNvbXBvbmVudHMnLFxuXG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0ZVN0YXRlTWFjaGluZSBhY3Rpb24gZXhlY3V0ZXMgYSB0aGUgc3RhdGUgbWFjaGluZSBwcm92aWRlZCBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24gYXMgcGFydCBvZiB0aGVcbiAgICogd29ya2Zsb3dcbiAgICovXG4gIEVYRUNVVEVfU1RBVEVfTUFDSElORSA9ICdFeGVjdXRlU3RhdGVNYWNoaW5lJyxcblxuICAvKipcbiAgICogVGhlIExhdW5jaEluc3RhbmNlIGFjdGlvbiBsYXVuY2hlcyBhbiBpbnN0YW5jZSB1c2luZyB0aGUgc2V0dGluZ3MgZnJvbSB5b3VyIHJlY2lwZSBhbmQgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKiByZXNvdXJjZXNcbiAgICovXG4gIExBVU5DSF9JTlNUQU5DRSA9ICdMYXVuY2hJbnN0YW5jZScsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXR0cmlidXRlIHVwZGF0ZXMgdG8gdGhlIHByb3ZpZGVkIHNldCBvZiBkaXN0cmlidXRlZCBpbWFnZXMsIHN1Y2ggYXMgbGF1bmNoIHBlcm1pc3Npb24gdXBkYXRlc1xuICAgKi9cbiAgTU9ESUZZX0lNQUdFX0FUVFJJQlVURVMgPSAnTW9kaWZ5SW1hZ2VBdHRyaWJ1dGVzJyxcblxuICAvKipcbiAgICogVGhlIFJ1bkNvbW1hbmQgYWN0aW9uIHJ1bnMgYSBjb21tYW5kIGRvY3VtZW50IGFnYWluc3QgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gICAqL1xuICBSVU5fQ09NTUFORCA9ICdSdW5Db21tYW5kJyxcblxuICAvKipcbiAgICogVGhlIFJlZ2lzdGVySW1hZ2UgYWN0aW9uIGNyZWF0ZXMgYW4gQU1JIGZyb20gYSBzZXQgb2Ygc25hcHNob3RzIHdpdGggdGhlIGVjMjpSZWdpc3RlckltYWdlIEFQSVxuICAgKi9cbiAgUkVHSVNURVJfSU1BR0UgPSAnUmVnaXN0ZXJJbWFnZScsXG5cbiAgLyoqXG4gICAqIFRoZSBSdW5TeXNwcmVwIGFjdGlvbiBydW5zIHRoZSBTeXNwcmVwIGRvY3VtZW50IG9uIHRoZSBwcm92aWRlZCBXaW5kb3dzIGluc3RhbmNlXG4gICAqL1xuICBSVU5fU1lTX1BSRVAgPSAnUnVuU3lzUHJlcCcsXG5cbiAgLyoqXG4gICAqIFRoZSBTYW5pdGl6ZUluc3RhbmNlIGFjdGlvbiBydW5zIGEgcmVjb21tZW5kZWQgc2FuaXRpemF0aW9uIHNjcmlwdCBvbiBMaW51eCBpbnN0YW5jZXNcbiAgICovXG4gIFNBTklUSVpFX0lOU1RBTkNFID0gJ1Nhbml0aXplSW5zdGFuY2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgVGVybWluYXRlSW5zdGFuY2UgYWN0aW9uIHRlcm1pbmF0ZXMgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gICAqL1xuICBURVJNSU5BVEVfSU5TVEFOQ0UgPSAnVGVybWluYXRlSW5zdGFuY2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgV2FpdEZvckFjdGlvbiBhY3Rpb24gcGF1c2VzIHRoZSB3b3JrZmxvdyBhbmQgd2FpdHMgdG8gcmVjZWl2ZSBhbiBleHRlcm5hbCBzaWduYWwgZnJvbSB0aGVcbiAgICogaW1hZ2VidWlsZGVyOlNlbmRXb3JrZmxvd1N0ZXBBY3Rpb24gQVBJXG4gICAqL1xuICBXQUlUX0ZPUl9BQ1RJT04gPSAnV2FpdEZvckFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBXYWl0Rm9yU1NNQWdlbnQgYWN0aW9uIHdhaXRzIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UgdG8gaGF2ZSBjb25uZWN0aXZpdHkgd2l0aCBTU00gYmVmb3JlIHByb2NlZWRpbmdcbiAgICovXG4gIFdBSVRfRk9SX1NTTV9BR0VOVCA9ICdXYWl0Rm9yU1NNQWdlbnQnLFxufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gdGFrZSBpZiB0aGUgd29ya2Zsb3cgZmFpbHNcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dPbkZhaWx1cmUge1xuICAvKipcbiAgICogRmFpbHMgdGhlIGltYWdlIGJ1aWxkIGlmIHRoZSB3b3JrZmxvdyBmYWlsc1xuICAgKi9cbiAgQUJPUlQgPSAnQWJvcnQnLFxuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgd2l0aCB0aGUgaW1hZ2UgYnVpbGQgaWYgdGhlIHdvcmtmbG93IGZhaWxzXG4gICAqL1xuICBDT05USU5VRSA9ICdDb250aW51ZScsXG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgd29ya2Zsb3cgcGFyYW1ldGVyXG4gKi9cbmV4cG9ydCBlbnVtIFdvcmtmbG93UGFyYW1ldGVyVHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IHBhcmFtZXRlciBoYXMgYSBib29sZWFuIHZhbHVlXG4gICAqL1xuICBCT09MRUFOID0gJ2Jvb2xlYW4nLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IHBhcmFtZXRlciBoYXMgYW4gaW50ZWdlciB2YWx1ZVxuICAgKi9cbiAgSU5URUdFUiA9ICdpbnRlZ2VyJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBwYXJhbWV0ZXIgaGFzIGEgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBTVFJJTkcgPSAnc3RyaW5nJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBwYXJhbWV0ZXIgaGFzIGEgc3RyaW5nIGxpc3QgdmFsdWVcbiAgICovXG4gIFNUUklOR19MSVNUID0gJ3N0cmluZ0xpc3QnLFxufVxuXG4vKipcbiAqIFRoZSBzY2hlbWEgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dTY2hlbWFWZXJzaW9uIHtcbiAgLyoqXG4gICAqIFNjaGVtYSB2ZXJzaW9uIDEuMCBmb3IgdGhlIHdvcmtmbG93IGRvY3VtZW50XG4gICAqL1xuICBWMV8wID0gJzEuMCcsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBlbnVtIFdvcmtmbG93VHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IGlzIGZvciBidWlsZGluZyBpbWFnZXNcbiAgICovXG4gIEJVSUxEID0gJ0JVSUxEJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBpcyBmb3IgdGVzdGluZyBpbWFnZXNcbiAgICovXG4gIFRFU1QgPSAnVEVTVCcsXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgd29ya2Zsb3cgaXMgZm9yIGRpc3RyaWJ1dGluZyBpbWFnZXNcbiAgICovXG4gIERJU1RSSUJVVElPTiA9ICdESVNUUklCVVRJT04nLFxufVxuXG4vKipcbiAqIFRoZSByZW5kZXJlZCB3b3JrZmxvdyBkYXRhIHZhbHVlLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uLlxuICogLSBGb3IgaW5saW5lIHdvcmtmbG93cywgZGF0YSBpcyB0aGUgd29ya2Zsb3cgdGV4dFxuICogLSBGb3IgUzMtYmFja2VkIHdvcmtmbG93cywgdXJpIGlzIHRoZSBTMyBVUkxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RhdGFDb25maWcge1xuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHdvcmtmbG93IGRhdGEsIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIHVyaSBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCB3b3JrZmxvdyBkYXRhIFVSSSwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgZGF0YSBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IHVyaT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHJlZmVyZW5jaW5nIGFuZCB1cGxvYWRpbmcgd29ya2Zsb3cgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya2Zsb3dEYXRhIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgd29ya2Zsb3cgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZSB0byBTMyB0byB1c2UgYXMgdGhlIHdvcmtmbG93IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gcGF0aCBUaGUgbG9jYWwgcGF0aCB0byB0aGUgd29ya2Zsb3cgZGF0YSBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIFMzIGFzc2V0IHVwbG9hZCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bc3NldChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHMzYXNzZXRzLkFzc2V0T3B0aW9ucyA9IHt9LFxuICApOiBTM1dvcmtmbG93RGF0YSB7XG4gICAgY29uc3QgYXNzZXQgPSBuZXcgczNhc3NldHMuQXNzZXQoc2NvcGUsIGlkLCB7IC4uLm9wdGlvbnMsIHBhdGggfSk7XG4gICAgcmV0dXJuIG5ldyBTM1dvcmtmbG93RGF0YUZyb21Bc3NldChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlcyB3b3JrZmxvdyBkYXRhIGZyb20gYSBwcmUtZXhpc3RpbmcgUzMgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBidWNrZXQgVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgd29ya2Zsb3cgZGF0YSBpcyBzdG9yZWRcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSB3b3JrZmxvdyBkYXRhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVMzKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpOiBTM1dvcmtmbG93RGF0YSB7XG4gICAgcmV0dXJuIG5ldyBTM1dvcmtmbG93RGF0YUZyb21CdWNrZXRLZXkoYnVja2V0LCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gaW5saW5lIEpTT04gb2JqZWN0IGFzIHRoZSB3b3JrZmxvdyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIEFuIGlubGluZSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHdvcmtmbG93IGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpzb25PYmplY3QoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IFdvcmtmbG93RGF0YSB7XG4gICAgY29uc3QgaW5saW5lRGF0YSA9IHlhbWwuc3RyaW5naWZ5KGRhdGEsIHsgaW5kZW50OiAyIH0pO1xuICAgIHJldHVybiBuZXcgSW5saW5lV29ya2Zsb3dEYXRhKGlubGluZURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gaW5saW5lIEpTT04gb3IgWUFNTCBzdHJpbmcgYXMgdGhlIHdvcmtmbG93IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgQW4gaW5saW5lIEpTT04gb3IgWUFNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB3b3JrZmxvdyBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoZGF0YTogc3RyaW5nKTogV29ya2Zsb3dEYXRhIHtcbiAgICByZXR1cm4gbmV3IElubGluZVdvcmtmbG93RGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB2YWx1ZSwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvbi5cbiAgICogLSBGb3IgaW5saW5lIHdvcmtmbG93cywgZGF0YSBpcyB0aGUgd29ya2Zsb3cgdGV4dFxuICAgKiAtIEZvciBTMy1iYWNrZWQgd29ya2Zsb3dzLCB1cmkgaXMgdGhlIFMzIFVSTFxuICAgKi9cbiAgYWJzdHJhY3QgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIFMzLWJhc2VkIHdvcmtmbG93IGRhdGEgcmVmZXJlbmNlcywgY29udGFpbmluZyBhZGRpdGlvbmFsIHBlcm1pc3Npb24gZ3JhbnQgbWV0aG9kcyBvbiB0aGUgUzMgb2JqZWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTM1dvcmtmbG93RGF0YSBleHRlbmRzIFdvcmtmbG93RGF0YSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBrZXk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IGJ1Y2tldDtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgdXJpOiB0aGlzLmJ1Y2tldC5zM1VybEZvck9iamVjdCh0aGlzLmtleSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwdXQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvdyBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgd29ya2Zsb3cgZGF0YSBpbiBTM1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxufVxuXG5jbGFzcyBJbmxpbmVXb3JrZmxvd0RhdGEgZXh0ZW5kcyBXb3JrZmxvd0RhdGEge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgZGF0YTogdGhpcy5kYXRhIH07XG4gIH1cbn1cblxuY2xhc3MgUzNXb3JrZmxvd0RhdGFGcm9tQnVja2V0S2V5IGV4dGVuZHMgUzNXb3JrZmxvd0RhdGEge1xuICBwdWJsaWMgY29uc3RydWN0b3IoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKGJ1Y2tldCwga2V5KTtcbiAgfVxufVxuXG5jbGFzcyBTM1dvcmtmbG93RGF0YUZyb21Bc3NldCBleHRlbmRzIFMzV29ya2Zsb3dEYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGFzc2V0OiBzM2Fzc2V0cy5Bc3NldCkge1xuICAgIHN1cGVyKGFzc2V0LmJ1Y2tldCwgYXNzZXQuczNPYmplY3RLZXkpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggQVdTLW1hbmFnZWQgd29ya2Zsb3dzXG4gKi9cbmV4cG9ydCBjbGFzcyBBd3NNYW5hZ2VkV29ya2Zsb3cge1xuICAvKipcbiAgICogSW1wb3J0cyB0aGUgYnVpbGQtY29udGFpbmVyIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRDb250YWluZXIoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyk6IElXb3JrZmxvdyB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUF3c01hbmFnZWRXb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB3b3JrZmxvd05hbWU6ICdidWlsZC1jb250YWluZXInLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuQlVJTEQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgYnVpbGQtaW1hZ2UgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsZEltYWdlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgd29ya2Zsb3dOYW1lOiAnYnVpbGQtaW1hZ2UnLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuQlVJTEQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgZGlzdHJpYnV0ZS1jb250YWluZXIgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkaXN0cmlidXRlQ29udGFpbmVyKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgd29ya2Zsb3dOYW1lOiAnZGlzdHJpYnV0ZS1jb250YWluZXInLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuRElTVFJJQlVUSU9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgdGhlIHRlc3QtY29udGFpbmVyIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGVzdENvbnRhaW5lcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogSVdvcmtmbG93IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIHdvcmtmbG93TmFtZTogJ3Rlc3QtY29udGFpbmVyJyxcbiAgICAgIHdvcmtmbG93VHlwZTogV29ya2Zsb3dUeXBlLlRFU1QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgdGVzdC1pbWFnZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRlc3RJbWFnZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogSVdvcmtmbG93IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIHdvcmtmbG93TmFtZTogJ3Rlc3QtaW1hZ2UnLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuVEVTVCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIEFXUy1tYW5hZ2VkIHdvcmtmbG93IGZyb20gaXRzIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyxcbiAgKTogSVdvcmtmbG93IHtcbiAgICBpZiAoY2RrLlRva2VuLmlzVW5yZXNvbHZlZChhdHRycy53b3JrZmxvd1R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignd29ya2Zsb3dUeXBlIGNhbm5vdCBiZSBhIHRva2VuJywgc2NvcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBXb3JrZmxvdy5mcm9tV29ya2Zsb3dBcm4oXG4gICAgICBzY29wZSxcbiAgICAgIGlkLFxuICAgICAgY2RrLlN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgICAgYWNjb3VudDogJ2F3cycsXG4gICAgICAgIHJlc291cmNlOiAnd29ya2Zsb3cnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAke2F0dHJzLndvcmtmbG93VHlwZS50b0xvd2VyQ2FzZSgpfS8ke2F0dHJzLndvcmtmbG93TmFtZX0vJHtMQVRFU1RfVkVSU0lPTn1gLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIFdvcmtmbG93XG4gKi9cbmFic3RyYWN0IGNsYXNzIFdvcmtmbG93QmFzZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElXb3JrZmxvdyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSB3b3JrZmxvd1xuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgd29ya2Zsb3dBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd1ZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgY3VzdG9tIGFjdGlvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBsaXN0IG9mIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLndvcmtmbG93QXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChncmFudGVlLCAnaW1hZ2VidWlsZGVyOkdldFdvcmtmbG93Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVDMiBJbWFnZSBCdWlsZGVyIFdvcmtmbG93LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL21hbmFnZS1pbWFnZS13b3JrZmxvd3MuaHRtbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgV29ya2Zsb3cgZXh0ZW5kcyBXb3JrZmxvd0Jhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1pbWFnZWJ1aWxkZXItYWxwaGEuV29ya2Zsb3cnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3Rpbmcgd29ya2Zsb3cgZ2l2ZW4gaXRzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdvcmtmbG93QXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdvcmtmbG93QXJuOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IHdvcmtmbG93QXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyB3b3JrZmxvdyBieSBwcm92aWRpbmcgaXRzIGF0dHJpYnV0ZXMuIFRoZSBwcm92aWRlZCBuYW1lIG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nXG4gICAqIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLiBZb3UgbWF5IG5vdFxuICAgKiBwcm92aWRlIGEgZHluYW1pYyBleHByZXNzaW9uIGZvciB0aGUgd29ya2Zsb3dBcm4gb3Igd29ya2Zsb3dUeXBlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdvcmtmbG93QXR0cmlidXRlcyk6IElXb3JrZmxvdyB7XG4gICAgaWYgKFxuICAgICAgYXR0cnMud29ya2Zsb3dBcm4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGF0dHJzLndvcmtmbG93TmFtZSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJzLndvcmtmbG93VHlwZSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJzLndvcmtmbG93VmVyc2lvbiAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdhIHdvcmtmbG93TmFtZSwgd29ya2Zsb3dUeXBlLCBvciB3b3JrZmxvd1ZlcnNpb24gY2Fubm90IGJlIHByb3ZpZGVkIHdoZW4gYSB3b3JrZmxvd0FybiBpcyBwcm92aWRlZCcsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cnMud29ya2Zsb3dBcm4gPT09IHVuZGVmaW5lZCAmJiAoYXR0cnMud29ya2Zsb3dOYW1lID09PSB1bmRlZmluZWQgfHwgYXR0cnMud29ya2Zsb3dUeXBlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignZWl0aGVyIHdvcmtmbG93QXJuLCBvciB3b3JrZmxvd05hbWUgYW5kIHdvcmtmbG93VHlwZSBpcyByZXF1aXJlZCcsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cnMud29ya2Zsb3dUeXBlICYmIGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoYXR0cnMud29ya2Zsb3dUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3dvcmtmbG93VHlwZSBjYW5ub3QgYmUgYW4gdW5yZXNvbHZlZCB0b2tlbicsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd0FybiA9ICgoKSA9PiB7XG4gICAgICBpZiAoYXR0cnMud29ya2Zsb3dBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXR0cnMud29ya2Zsb3dBcm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjZGsuU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICAgIHNlcnZpY2U6ICdpbWFnZWJ1aWxkZXInLFxuICAgICAgICByZXNvdXJjZTogJ3dvcmtmbG93JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBgJHthdHRycy53b3JrZmxvd1R5cGUhLnRvTG93ZXJDYXNlKCl9LyR7YXR0cnMud29ya2Zsb3dOYW1lIX0vJHthdHRycy53b3JrZmxvd1ZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT059YCxcbiAgICAgIH0pO1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBbd29ya2Zsb3dUeXBlLCB3b3JrZmxvd05hbWUsIHdvcmtmbG93VmVyc2lvbl0gPSAoKCkgPT4ge1xuICAgICAgaWYgKGF0dHJzLndvcmtmbG93TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbYXR0cnMud29ya2Zsb3dUeXBlIS50b1VwcGVyQ2FzZSgpLCBhdHRycy53b3JrZmxvd05hbWUsIGF0dHJzLndvcmtmbG93VmVyc2lvbiA/PyBMQVRFU1RfVkVSU0lPTl07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgICAgd29ya2Zsb3dBcm4sXG4gICAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICkucmVzb3VyY2VOYW1lITtcblxuICAgICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQod29ya2Zsb3dOYW1lVHlwZVZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICd0aGUgd29ya2Zsb3dOYW1lLCB3b3JrZmxvd1R5cGUsIGFuZCB3b3JrZmxvd1ZlcnNpb24gaW4gdGhlIHdvcmtmbG93QXJuIGNhbm5vdCBiZSBhbiB1bnJlc29sdmVkIHRva2VuJyxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uLnNwbGl0KCcvJykubGVuZ3RoIDwgMykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAndGhlIHdvcmtmbG93IEFSTiBtdXN0IGVuZCB3aXRoIDx3b3JrZmxvdy10eXBlPi88d29ya2Zsb3ctbmFtZT4vPHdvcmtmbG93LXZlcnNpb24+JyxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lVHlwZVZlcnNpb25TcGxpdCA9IHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBbd29ya2Zsb3dUeXBlRnJvbUFybiwgd29ya2Zsb3dOYW1lRnJvbUFybiwgd29ya2Zsb3dWZXJzaW9uRnJvbUFybl0gPSB3b3JrZmxvd05hbWVUeXBlVmVyc2lvblNwbGl0LnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAzLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIFt3b3JrZmxvd1R5cGVGcm9tQXJuLnRvVXBwZXJDYXNlKCksIHdvcmtmbG93TmFtZUZyb21Bcm4sIHdvcmtmbG93VmVyc2lvbkZyb21Bcm5dO1xuICAgIH0pKCk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBXb3JrZmxvd0Jhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93QXJuID0gd29ya2Zsb3dBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3dOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZSA9IHdvcmtmbG93VHlwZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24gPSB3b3JrZmxvd1ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgV29ya2Zsb3cuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzV29ya2Zsb3coeDogYW55KTogeCBpcyBXb3JrZmxvdyB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIFdPUktGTE9XX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSB3b3JrZmxvd1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1ZlcnNpb246IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdvcmtmbG93UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHMud29ya2Zsb3dOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSwgLy8gRW5mb3JjZSBsb3dlcmNhc2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBmYWxsYmFja1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBXT1JLRkxPV19TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlV29ya2Zsb3dOYW1lKCk7XG5cbiAgICBjb25zdCB3b3JrZmxvd1ZlcnNpb24gPSBwcm9wcy53b3JrZmxvd1ZlcnNpb24gPz8gJzEuMC4wJztcbiAgICBjb25zdCB3b3JrZmxvdyA9IG5ldyBDZm5Xb3JrZmxvdyh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHZlcnNpb246IHdvcmtmbG93VmVyc2lvbixcbiAgICAgIHR5cGU6IHByb3BzLndvcmtmbG93VHlwZSxcbiAgICAgIGNoYW5nZURlc2NyaXB0aW9uOiBwcm9wcy5jaGFuZ2VEZXNjcmlwdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGttc0tleUlkOiBwcm9wcy5rbXNLZXk/LmtleUFybixcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICAuLi5wcm9wcy5kYXRhLnJlbmRlcigpLFxuICAgIH0pO1xuXG4gICAgdGhpcy53b3JrZmxvd05hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh3b3JrZmxvdy5nZXRBdHQoJ05hbWUnKS50b1N0cmluZygpKTtcbiAgICB0aGlzLndvcmtmbG93QXJuID0gd29ya2Zsb3cuYXR0ckFybjtcbiAgICB0aGlzLndvcmtmbG93VmVyc2lvbiA9IHdvcmtmbG93VmVyc2lvbjtcbiAgICB0aGlzLndvcmtmbG93VHlwZSA9IHByb3BzLndvcmtmbG93VHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVXb3JrZmxvd05hbWUoKSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpKSB7XG4gICAgICByZXR1cm47IC8vIENhbm5vdCB2YWxpZGF0ZSB1bnJlc29sdmVkIHRva2VucywgZ2l2ZW4gdGhlaXIgYWN0dWFsIHZhbHVlIGlzIHJlbmRlcmVkIGF0IGRlcGxveW1lbnQgdGltZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd0aGUgd29ya2Zsb3dOYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnICcpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHdvcmtmbG93TmFtZSBjYW5ub3QgY29udGFpbiBzcGFjZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3RoZSB3b3JrZmxvd05hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd0aGUgd29ya2Zsb3dOYW1lIG11c3QgYmUgbG93ZXJjYXNlJywgdGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|