@aws-mdaa/dataops-job-l3-construct 1.4.0 → 1.6.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 +117 -121
- package/README.md +5 -0
- package/lib/dataops-job-l3-construct.d.ts +37 -240
- package/lib/dataops-job-l3-construct.js +61 -34
- package/node_modules/@aws-mdaa/config/.npmignore +34 -0
- package/node_modules/@aws-mdaa/config/README.md +3 -0
- package/node_modules/@aws-mdaa/config/jest.config.js +5 -0
- package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.d.ts +20 -0
- package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.js +70 -0
- package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.ts +88 -0
- package/node_modules/@aws-mdaa/config/lib/config.d.ts +87 -0
- package/node_modules/@aws-mdaa/config/lib/config.js +7 -0
- package/node_modules/@aws-mdaa/config/lib/config.ts +92 -0
- package/node_modules/@aws-mdaa/config/lib/index.d.ts +11 -0
- package/node_modules/@aws-mdaa/config/lib/index.js +28 -0
- package/node_modules/@aws-mdaa/config/lib/index.ts +12 -0
- package/node_modules/@aws-mdaa/config/lib/param-transformer.d.ts +49 -0
- package/node_modules/@aws-mdaa/config/lib/param-transformer.js +160 -0
- package/node_modules/@aws-mdaa/config/lib/param-transformer.ts +159 -0
- package/node_modules/@aws-mdaa/config/lib/path-value-transformer.d.ts +10 -0
- package/node_modules/@aws-mdaa/config/lib/path-value-transformer.js +30 -0
- package/node_modules/@aws-mdaa/config/lib/path-value-transformer.ts +27 -0
- package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.d.ts +44 -0
- package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.js +243 -0
- package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.ts +302 -0
- package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.d.ts +8 -0
- package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.js +22 -0
- package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.ts +21 -0
- package/node_modules/@aws-mdaa/config/lib/transformer.d.ts +35 -0
- package/node_modules/@aws-mdaa/config/lib/transformer.js +66 -0
- package/node_modules/@aws-mdaa/config/lib/transformer.ts +74 -0
- package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper → config}/package.json +17 -17
- package/node_modules/@aws-mdaa/config/test/blueprint-value-transformer.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/blueprint-value-transformer.test.js +224 -0
- package/node_modules/@aws-mdaa/config/test/blueprint-value-transformer.test.ts +259 -0
- package/node_modules/@aws-mdaa/config/test/config-nt.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/config-nt.test.js +129 -0
- package/node_modules/@aws-mdaa/config/test/config-nt.test.ts +163 -0
- package/node_modules/@aws-mdaa/config/test/config.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/config.test.js +409 -0
- package/node_modules/@aws-mdaa/config/test/config.test.ts +517 -0
- package/node_modules/@aws-mdaa/config/test/param-transformer.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/param-transformer.test.js +216 -0
- package/node_modules/@aws-mdaa/config/test/param-transformer.test.ts +234 -0
- package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.js +59 -0
- package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.ts +68 -0
- package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.js +254 -0
- package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.ts +304 -0
- package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.d.ts +5 -0
- package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.js +66 -0
- package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.ts +79 -0
- package/node_modules/@aws-mdaa/config/tsconfig.json +40 -0
- package/node_modules/@aws-mdaa/config/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@aws-mdaa/config/typedoc.json +7 -0
- package/node_modules/lodash/README.md +2 -2
- package/node_modules/lodash/_baseOrderBy.js +1 -1
- package/node_modules/lodash/_baseUnset.js +7 -20
- package/node_modules/lodash/_setCacheHas.js +1 -1
- package/node_modules/lodash/compact.js +1 -1
- package/node_modules/lodash/core.js +3 -3
- package/node_modules/lodash/core.min.js +26 -25
- package/node_modules/lodash/fromPairs.js +3 -1
- package/node_modules/lodash/lodash.js +38 -27
- package/node_modules/lodash/lodash.min.js +125 -129
- package/node_modules/lodash/package.json +4 -2
- package/node_modules/lodash/random.js +9 -0
- package/node_modules/lodash/template.js +16 -4
- package/node_modules/lodash/templateSettings.js +4 -0
- package/package.json +27 -30
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/README.md +0 -185
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.d.ts +0 -57
- package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.js +0 -198
- package/node_modules/@aws-mdaa/s3-inventory-helper/README.md +0 -3
- package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.d.ts +0 -66
- package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.js +0 -222
- package/node_modules/@aws-mdaa/s3-inventory-helper/package.json +0 -42
|
@@ -31,43 +31,51 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
31
31
|
throw new Error('Deployment role ARN is required for job configuration');
|
|
32
32
|
}
|
|
33
33
|
const deploymentRole = iam_constructs_1.MdaaRole.fromRoleArn(this.scope, `deployment-role`, this.props.deploymentRoleArn);
|
|
34
|
-
if (!this.props.
|
|
34
|
+
if (!this.props.bucketName) {
|
|
35
35
|
throw new Error('Project bucket name is required for job configuration');
|
|
36
36
|
}
|
|
37
|
-
const
|
|
38
|
-
if (!this.props.
|
|
37
|
+
const bucket = s3_constructs_1.MdaaBucket.fromBucketName(this.scope, `project-bucket`, this.props.bucketName);
|
|
38
|
+
if (!this.props.kmsArn) {
|
|
39
39
|
throw new Error('Project KMS Key is required for job configuration');
|
|
40
40
|
}
|
|
41
|
-
this.
|
|
41
|
+
this.kmsKey = aws_kms_1.Key.fromKeyArn(this, this.props.projectName ?? 'kms-key', this.props.kmsArn);
|
|
42
42
|
// Build our jobs!
|
|
43
43
|
const allJobs = this.props.jobConfigs;
|
|
44
|
-
Object.keys(allJobs)
|
|
44
|
+
for (const jobName of Object.keys(allJobs)) {
|
|
45
45
|
const jobConfig = allJobs[jobName];
|
|
46
|
-
this.createJob(jobName, jobConfig, deploymentRole,
|
|
47
|
-
}
|
|
48
|
-
//
|
|
46
|
+
this.createJob(jobName, jobConfig, deploymentRole, bucket);
|
|
47
|
+
}
|
|
48
|
+
// BucketDeployment adds an inline policy to the imported deployment role,
|
|
49
|
+
// which CDK synthesizes as a standalone AWS::IAM::Policy resource.
|
|
50
|
+
// Because the policy name is derived from the construct path (not the stack name),
|
|
51
|
+
// multiple stacks importing the same role produce colliding physical names.
|
|
52
|
+
// Remove the inline policy node — the deployment role already has the necessary
|
|
53
|
+
// S3 permissions granted in the dataops-project construct that owns it.
|
|
54
|
+
for (const child of deploymentRole.node.children) {
|
|
55
|
+
if (child.node.id === 'Policy') {
|
|
56
|
+
deploymentRole.node.tryRemoveChild(child.node.id);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Suppress nag warnings on the imported deployment role node itself
|
|
61
|
+
// (remaining after inline policy removal, e.g. wildcard resource warnings)
|
|
49
62
|
this.scope.node.children.forEach(child => {
|
|
50
63
|
if (child.node.id.startsWith('deployment-role')) {
|
|
51
|
-
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [
|
|
52
|
-
{ id: 'AwsSolutions-IAM5', reason: 'Inline policy used only for deployment.' },
|
|
53
|
-
{ id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
54
|
-
{ id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
55
|
-
{ id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
|
|
56
|
-
], true);
|
|
64
|
+
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [{ id: 'AwsSolutions-IAM5', reason: 'Permissions granted on deployment role in owning stack.' }], true);
|
|
57
65
|
}
|
|
58
66
|
});
|
|
59
67
|
}
|
|
60
|
-
deployAdditionalFiles(additionalFilesSources,
|
|
68
|
+
deployAdditionalFiles(additionalFilesSources, bucket, deploymentRole, deploymentId, deploymentPath, extract) {
|
|
61
69
|
// Deploy Source asset(s) to /deployment/libs/<job> location.
|
|
62
70
|
return new aws_s3_deployment_1.BucketDeployment(this.scope, deploymentId, {
|
|
63
71
|
sources: additionalFilesSources,
|
|
64
|
-
destinationBucket:
|
|
72
|
+
destinationBucket: bucket,
|
|
65
73
|
destinationKeyPrefix: deploymentPath,
|
|
66
74
|
role: deploymentRole,
|
|
67
75
|
extract: extract,
|
|
68
76
|
});
|
|
69
77
|
}
|
|
70
|
-
addAdditionalScripts(jobName, jobConfig,
|
|
78
|
+
addAdditionalScripts(jobName, jobConfig, bucket, deploymentRole, defaultArguments) {
|
|
71
79
|
if (jobConfig.additionalScripts) {
|
|
72
80
|
/**
|
|
73
81
|
* Group all files at parent directory level. This will allow creating zip lib assests at various directory levels
|
|
@@ -88,7 +96,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
88
96
|
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', ...fileNames] });
|
|
89
97
|
});
|
|
90
98
|
const deploymentPath = `deployment/libs/${jobName}`;
|
|
91
|
-
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources,
|
|
99
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, bucket, deploymentRole, `job-deployment-${jobName}-additional-script`, deploymentPath, false);
|
|
92
100
|
// Extract zip name(s) for each source and create comma separated list of s3 locations
|
|
93
101
|
const libraryZipNames = [];
|
|
94
102
|
for (let i = 0; i < additionalFilesSources.length; i++) {
|
|
@@ -104,7 +112,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
104
112
|
}
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
|
-
addAdditionalJars(jobName, jobConfig,
|
|
115
|
+
addAdditionalJars(jobName, jobConfig, bucket, deploymentRole, defaultArguments) {
|
|
108
116
|
if (jobConfig.additionalJars) {
|
|
109
117
|
// Create Source asset for each directory
|
|
110
118
|
const additionalFilesSources = jobConfig.additionalJars.map(fullFileName => {
|
|
@@ -113,7 +121,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
113
121
|
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
|
|
114
122
|
});
|
|
115
123
|
const deploymentPath = `deployment/libs/${jobName}`;
|
|
116
|
-
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources,
|
|
124
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, bucket, deploymentRole, `job-deployment-${jobName}-additional-jar`, deploymentPath, true);
|
|
117
125
|
const extraJarNames = jobConfig.additionalJars.map(fullFileName => {
|
|
118
126
|
const fileName = path.basename(fullFileName.trim());
|
|
119
127
|
return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
|
|
@@ -127,7 +135,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
127
135
|
}
|
|
128
136
|
}
|
|
129
137
|
}
|
|
130
|
-
addAdditionalFiles(jobName, jobConfig,
|
|
138
|
+
addAdditionalFiles(jobName, jobConfig, bucket, deploymentRole, defaultArguments) {
|
|
131
139
|
if (jobConfig.additionalFiles) {
|
|
132
140
|
// Create Source asset for each directory
|
|
133
141
|
const additionalFilesSources = jobConfig.additionalFiles.map(fullFileName => {
|
|
@@ -136,7 +144,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
136
144
|
return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
|
|
137
145
|
});
|
|
138
146
|
const deploymentPath = `deployment/files/${jobName}`;
|
|
139
|
-
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources,
|
|
147
|
+
const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, bucket, deploymentRole, `job-deployment-${jobName}-additional-file`, deploymentPath, true);
|
|
140
148
|
const extraFileNames = jobConfig.additionalFiles.map(fullFileName => {
|
|
141
149
|
const fileName = path.basename(fullFileName.trim());
|
|
142
150
|
return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
|
|
@@ -150,22 +158,41 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
150
158
|
}
|
|
151
159
|
}
|
|
152
160
|
}
|
|
153
|
-
|
|
161
|
+
resolveAssetPath(jobName, location) {
|
|
162
|
+
if (location.startsWith('asset:')) {
|
|
163
|
+
const assetName = location.substring('asset:'.length);
|
|
164
|
+
if (!this.props.assetBasePath) {
|
|
165
|
+
throw new Error(`Job '${jobName}' uses asset: prefix but no assetBasePath is configured. ` +
|
|
166
|
+
`Set assetBasePath in the construct props.`);
|
|
167
|
+
}
|
|
168
|
+
return path.join(this.props.assetBasePath, assetName);
|
|
169
|
+
}
|
|
170
|
+
return location;
|
|
171
|
+
}
|
|
172
|
+
createJob(jobName, jobConfig, deploymentRole, bucket) {
|
|
154
173
|
const defaultArguments = jobConfig.defaultArguments ? jobConfig.defaultArguments : {};
|
|
155
|
-
|
|
156
|
-
const
|
|
174
|
+
let scriptLocation = this.resolveAssetPath(jobName, jobConfig.command.scriptLocation.trim());
|
|
175
|
+
const scriptPath = path.dirname(scriptLocation);
|
|
176
|
+
const scriptName = path.basename(scriptLocation);
|
|
157
177
|
const scriptSource = aws_s3_deployment_1.Source.asset(scriptPath, { exclude: ['**', `!${scriptName}`] });
|
|
158
178
|
const scriptDeploymentPath = `deployment/jobs/${jobName}`;
|
|
159
179
|
const scriptDeployment = new aws_s3_deployment_1.BucketDeployment(this.scope, `job-deployment-${jobName}`, {
|
|
160
180
|
sources: [scriptSource],
|
|
161
|
-
destinationBucket:
|
|
181
|
+
destinationBucket: bucket,
|
|
162
182
|
destinationKeyPrefix: scriptDeploymentPath,
|
|
163
183
|
role: deploymentRole,
|
|
164
184
|
extract: true,
|
|
165
185
|
});
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
186
|
+
// Resolve asset: prefixes in additionalScripts before processing
|
|
187
|
+
if (jobConfig.additionalScripts) {
|
|
188
|
+
jobConfig = {
|
|
189
|
+
...jobConfig,
|
|
190
|
+
additionalScripts: jobConfig.additionalScripts.map(s => this.resolveAssetPath(jobName, s.trim())),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
this.addAdditionalScripts(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
|
|
194
|
+
this.addAdditionalJars(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
|
|
195
|
+
this.addAdditionalFiles(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
|
|
169
196
|
construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(this.scope, [
|
|
170
197
|
{ id: 'AwsSolutions-L1', reason: 'Function is used only as custom resource during CDK deployment.' },
|
|
171
198
|
{
|
|
@@ -212,7 +239,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
212
239
|
connections: jobConfig.connections,
|
|
213
240
|
};
|
|
214
241
|
}
|
|
215
|
-
defaultArguments['--TempDir'] = `s3://${this.props.
|
|
242
|
+
defaultArguments['--TempDir'] = `s3://${this.props.bucketName}/temp/jobs/${jobName}`;
|
|
216
243
|
// add continuous logging unless explicitly disabled
|
|
217
244
|
if (jobConfig.continuousLogging) {
|
|
218
245
|
const logGroupName = jobName;
|
|
@@ -252,7 +279,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
252
279
|
workerType: jobConfig.workerType,
|
|
253
280
|
naming: this.props.naming,
|
|
254
281
|
});
|
|
255
|
-
if (job.name) {
|
|
282
|
+
if (job.name && this.props.projectName) {
|
|
256
283
|
dataops_project_l3_construct_1.DataOpsProjectUtils.createProjectSSMParam(this.scope, this.props.naming, this.props.projectName, `job/name/${jobName}`, job.name);
|
|
257
284
|
const eventRule = this.createJobMonitoringEventRule(`${jobName}-monitor`, [job.name]);
|
|
258
285
|
if (!this.props.notificationTopicArn) {
|
|
@@ -279,7 +306,7 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
279
306
|
naming: this.props.naming,
|
|
280
307
|
logGroupName: logGroupName,
|
|
281
308
|
logGroupNamePathPrefix: logGroupNamePathPrefix,
|
|
282
|
-
encryptionKey: this.
|
|
309
|
+
encryptionKey: this.kmsKey,
|
|
283
310
|
retention: logGroupRetentionDays,
|
|
284
311
|
};
|
|
285
312
|
new cloudwatch_constructs_1.MdaaLogGroup(this, logGroupName, logProps);
|
|
@@ -289,5 +316,5 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
|
|
|
289
316
|
}
|
|
290
317
|
exports.GlueJobL3Construct = GlueJobL3Construct;
|
|
291
318
|
_a = JSII_RTTI_SYMBOL_1;
|
|
292
|
-
GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHVGQUFpRjtBQThVakYsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsMEJBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUss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LElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixRQUFRLEVBQ1IsNkJBQTZCLEVBQzdCO1lBQ0UsT0FBTyxFQUFFLFFBQVE7WUFDakIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDeEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxzQkFBOEIsRUFBRSxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZHLElBQUkscUJBQW9DLENBQUM7UUFFekMsSUFBSSxhQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MscUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04scUJBQXFCLEdBQUcsd0JBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsWUFBWTtZQUMxQixzQkFBc0IsRUFBRSxzQkFBc0I7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLElBQUksb0NBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLDBEQUEwRDtRQUMxRCxPQUFPLElBQUEsNEJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxZQUFhLENBQUM7SUFDN0MsQ0FBQzs7QUF2V0gsZ0RBd1dDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGF0YU9wc1Byb2plY3RVdGlscyB9IGZyb20gJ0Bhd3MtbWRhYS9kYXRhb3BzLXByb2plY3QtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlSGVscGVyIH0gZnJvbSAnQGF3cy1tZGFhL2V2ZW50YnJpZGdlLWhlbHBlcic7XG5pbXBvcnQgeyBNZGFhQ2ZuSm9iIH0gZnJvbSAnQGF3cy1tZGFhL2dsdWUtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhQnVja2V0IH0gZnJvbSAnQGF3cy1tZGFhL3MzLWNvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWRhYUwzQ29uc3RydWN0LCBNZGFhTDNDb25zdHJ1Y3RQcm9wcyB9IGZyb20gJ0Bhd3MtbWRhYS9sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgSVNvdXJjZSwgU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgTWRhYU5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ0Bhd3MtbWRhYS9jb25zdHJ1Y3QnOyAvL05PU09OQVJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNuc1RvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1kYWFTbnNUb3BpYyB9IGZyb20gJ0Bhd3MtbWRhYS9zbnMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FbGVtZW50IH0gZnJvbSAnQGF3cy1tZGFhL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgTWRhYUxvZ0dyb3VwIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cy9saWIvbG9nZ3JvdXAtdXRpbHMnO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG5leHBvcnQgdHlwZSBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbiA9ICcyJyB8ICczJyB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmROYW1lID0gJ2dsdWVldGwnIHwgJ3B5dGhvbnNoZWxsJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGxvZ2dpbmcgd2l0aCBDbG91ZFdhdGNoIGxvZyByZXRlbnRpb24gbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgbG9nIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgZW5zdXJpbmcgcHJvcGVyIGxvZyBtYW5hZ2VtZW50LCBjb21wbGlhbmNlLCBhbmQgY29zdCBvcHRpbWl6YXRpb24gZm9yIERhdGFPcHMgam9iIG1vbml0b3JpbmcgYW5kIGF1ZGl0IHRyYWlscy5cbiAqXG4gKiBVc2UgY2FzZXM6IExvZyByZXRlbnRpb24gbWFuYWdlbWVudDsgQ29tcGxpYW5jZSByZXF1aXJlbWVudHM7IENvc3Qgb3B0aW1pemF0aW9uOyBBdWRpdCB0cmFpbCBtYW5hZ2VtZW50XG4gKlxuICogQVdTOiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBsb2dzIGFuZCBtb25pdG9yaW5nXG4gKlxuICogVmFsaWRhdGlvbjogbG9nR3JvdXBSZXRlbnRpb25EYXlzIGlzIHJlcXVpcmVkIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIHJldGVudGlvbiBwZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcmV0ZW50aW9uIHBlcmlvZCBpbiBkYXlzIGZvciBHbHVlIGpvYiBsb2cgbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgaG93IGxvbmcgam9iIGV4ZWN1dGlvbiBsb2dzIGFyZSByZXRhaW5lZCBpbiBDbG91ZFdhdGNoIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIGxvZyByZXRlbnRpb24sIGNvbXBsaWFuY2UgbWFuYWdlbWVudCwgYW5kIHN0b3JhZ2UgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogTG9nIHJldGVudGlvbiBtYW5hZ2VtZW50OyBDb21wbGlhbmNlIHJlcXVpcmVtZW50czsgU3RvcmFnZSBjb3N0IG9wdGltaXphdGlvbjsgQXVkaXQgdHJhaWwgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IENsb3VkV2F0Y2ggbG9nIGdyb3VwIHJldGVudGlvbiBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgYW5kIGF1ZGl0IHRyYWlsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSAxLDMsNSw3LDE0LDMwLDYwLDkwLDEyMCwxNTAsMTgwLDM2NSw0MDAsNTQ1LDczMSwxODI3LDM2NTMsIG9yIDA7IHJlcXVpcmVkIGZvciBsb2cgcmV0ZW50aW9uIGNvbmZpZ3VyYXRpb25cbiAgICoqL1xuICByZWFkb25seSBsb2dHcm91cFJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGNvbW1hbmQgc3BlY2lmaWNhdGlvbiB3aXRoIHNjcmlwdCBleGVjdXRpb24gYW5kIHJ1bnRpbWUgZW52aXJvbm1lbnQgc2V0dGluZ3MuIERlZmluZXMgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgam9iIHR5cGUsIFB5dGhvbiB2ZXJzaW9uLCBhbmQgc2NyaXB0IGxvY2F0aW9uIGZvciBHbHVlIEVUTCBhbmQgUHl0aG9uIHNoZWxsIGpvYiBleGVjdXRpb24gd2l0aGluIERhdGFPcHMgd29ya2Zsb3dzLlxuICpcbiAqIFVzZSBjYXNlczogSm9iIGNvbW1hbmQgY29uZmlndXJhdGlvbjsgU2NyaXB0IGV4ZWN1dGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRVRMIGpvYiBzZXR1cFxuICpcbiAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBjb25maWd1cmF0aW9uIGZvciBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50XG4gKlxuICogVmFsaWRhdGlvbjogbmFtZSBhbmQgc2NyaXB0TG9jYXRpb24gYXJlIHJlcXVpcmVkOyBweXRob25WZXJzaW9uIGlzIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb21tYW5kIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgbmFtZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xsaW5nIEdsdWUgam9iIGV4ZWN1dGlvbiB0eXBlIGFuZCBydW50aW1lIGVudmlyb25tZW50LiBEZWZpbmVzIHdoZXRoZXIgdG8gdXNlIGdsdWVldGwgZm9yIEVUTCBqb2JzIHdpdGggU3BhcmsgcnVudGltZSBvciBweXRob25zaGVsbCBmb3IgUHl0aG9uIHNjcmlwdCBleGVjdXRpb24gd2l0aCBkaWZmZXJlbnQgcmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgY2FwYWJpbGl0aWVzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiB0eXBlIHNlbGVjdGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRXhlY3V0aW9uIG1vZGVsOyBSZXNvdXJjZSBhbGxvY2F0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBuYW1lIGZvciBleGVjdXRpb24gdHlwZSBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBzZWxlY3Rpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBnbHVlZXRsIG9yIHB5dGhvbnNoZWxsOyByZXF1aXJlZCBmb3Igam9iIGNvbW1hbmQgdHlwZSBhbmQgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAqICAgKiovXG4gIHJlYWRvbmx5IG5hbWU6IEpvYkNvbW1hbmROYW1lO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBQeXRob24gdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBydW50aW1lIGVudmlyb25tZW50IGVuYWJsaW5nIHZlcnNpb24tc3BlY2lmaWMgc2NyaXB0IGV4ZWN1dGlvbiBhbmQgY29tcGF0aWJpbGl0eS4gV2hlbiBzcGVjaWZpZWQsIGNvbnRyb2xzIHRoZSBQeXRob24gcnVudGltZSB2ZXJzaW9uIGZvciBqb2IgZXhlY3V0aW9uIGVuc3VyaW5nIHNjcmlwdCBjb21wYXRpYmlsaXR5IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBQeXRob24gdmVyc2lvbiBjb250cm9sOyBSdW50aW1lIGNvbXBhdGliaWxpdHk7IFNjcmlwdCBleGVjdXRpb247IFZlcnNpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIFB5dGhvbiB2ZXJzaW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGFuZCBzY3JpcHQgY29tcGF0aWJpbGl0eVxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIDIgb3IgMyBpZiBwcm92aWRlZDsgY29udHJvbHMgUHl0aG9uIHJ1bnRpbWUgdmVyc2lvbiBmb3Igam9iIGV4ZWN1dGlvblxuICAgKiAgICoqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogSm9iQ29tbWFuZFB5dGhvblZlcnNpb247XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIFJlcXVpcmVkIHJlbGF0aXZlIHBhdGggdG8gR2x1ZSBzY3JpcHQgZm9yIGpvYiBleGVjdXRpb24gZW5hYmxpbmcgc2NyaXB0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gYW5kIGNvZGUgZGVwbG95bWVudC4gUHJvdmlkZXMgdGhlIFMzIHBhdGggb3IgcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIEdsdWUgc2NyaXB0IHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgam9iIGZvciBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgbG9jYXRpb247IENvZGUgZGVwbG95bWVudDsgSm9iIGV4ZWN1dGlvbjsgRVRMIHByb2Nlc3NpbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBzY3JpcHQgbG9jYXRpb24gZm9yIGNvZGUgZXhlY3V0aW9uIGFuZCBFVEwgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHNjcmlwdCBwYXRoOyByZXF1aXJlZCBmb3Igam9iIHNjcmlwdCBsb2NhdGlvbiBhbmQgY29kZSBleGVjdXRpb25cbiAgICoqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIHByb3BlcnRpZXMgcHJvdmlkaW5nIEVUTCBqb2IgY29uZmlndXJhdGlvbiBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuIERlZmluZXMgY29tcGxldGUgR2x1ZSBqb2Igc2V0dXAgaW5jbHVkaW5nIGV4ZWN1dGlvbiByb2xlcywgY29tbWFuZHMsIGNhcGFjaXR5IGFsbG9jYXRpb24sIHJldHJ5IHBvbGljaWVzLCBhbmQgbW9uaXRvcmluZyBmb3IgRGF0YU9wcyBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbiB3b3JrZmxvd3MuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBleGVjdXRpb24gcm9sZSBBUk4gZm9yIEdsdWUgam9iIHBlcm1pc3Npb25zIGVuYWJsaW5nIHNlY3VyZSBqb2IgZXhlY3V0aW9uIGFuZCBBV1Mgc2VydmljZSBhY2Nlc3MuIFByb3ZpZGVzIHRoZSBJQU0gcm9sZSB0aGF0IHRoZSBHbHVlIGpvYiB3aWxsIGFzc3VtZSBmb3IgZXhlY3V0aW5nIEVUTCBvcGVyYXRpb25zIGFuZCBhY2Nlc3NpbmcgQVdTIHNlcnZpY2VzIGR1cmluZyBkYXRhIHByb2Nlc3Npbmcgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBwZXJtaXNzaW9uczsgU2VydmljZSBhY2Nlc3M7IFNlY3VyZSBleGVjdXRpb247IElBTSByb2xlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBJQU0gcm9sZSBBUk4gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBwZXJtaXNzaW9ucyBhbmQgc2VydmljZSBhY2Nlc3NcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBJQU0gcm9sZSBBUk47IHJlcXVpcmVkIGZvciBqb2IgZXhlY3V0aW9uIHBlcm1pc3Npb25zIGFuZCBzZXJ2aWNlIGFjY2Vzc1xuICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBkZWZpbmluZyBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50IGZvciBHbHVlIGpvYiBwcm9jZXNzaW5nLiBQcm92aWRlcyB0aGUgY29tbWFuZCBzcGVjaWZpY2F0aW9uIGluY2x1ZGluZyBqb2IgdHlwZSwgUHl0aG9uIHZlcnNpb24sIGFuZCBzY3JpcHQgbG9jYXRpb24gZm9yIEVUTCBqb2IgZXhlY3V0aW9uIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFNjcmlwdCBleGVjdXRpb247IFJ1bnRpbWUgY29uZmlndXJhdGlvbjsgSm9iIGNvbW1hbmQgc2V0dXA7IEVUTCBwcm9jZXNzaW5nXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBmb3Igc2NyaXB0IGV4ZWN1dGlvbiBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgSm9iQ29tbWFuZDsgcmVxdWlyZWQgZm9yIGpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gYW5kIHNjcmlwdCBleGVjdXRpb25cbiAgICogICAqKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogSm9iQ29tbWFuZDtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciBqb2IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBlbmFibGluZyByZXVzYWJsZSBqb2IgY29uZmlndXJhdGlvbnMgYW5kIHN0YW5kYXJkaXplZCBzZXR1cHMuIFdoZW4gc3BlY2lmaWVkLCBpbmhlcml0cyBjb25maWd1cmF0aW9uIGZyb20gYSB0ZW1wbGF0ZSBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgY29uc2lzdGVudCBqb2Igc2V0dXAgYW5kIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uZmlndXJhdGlvbiBpbmhlcml0YW5jZTsgVGVtcGxhdGUgcmV1c2U7IFN0YW5kYXJkaXplZCBzZXR1cDsgQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50XG4gICAqXG4gICAqIEFXUzogSm9iIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBhbmQgc3RhbmRhcmRpemVkIGpvYiBzZXR1cFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHRlbXBsYXRlIG5hbWUgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBmcm9tIGRlZmluZWQgdGVtcGxhdGVzXG4gICAqKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFsbG9jYXRlZCBjYXBhY2l0eSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGNvbnRyb2xsaW5nIGpvYiBwZXJmb3JtYW5jZSBhbmQgY29zdCBtYW5hZ2VtZW50LiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IgZm9yIHByb2Nlc3NpbmcgcGVyZm9ybWFuY2UgYW5kIHJlc291cmNlIHV0aWxpemF0aW9uIG9wdGltaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBSZXNvdXJjZSBhbGxvY2F0aW9uOyBQZXJmb3JtYW5jZSB0dW5pbmc7IENvc3QgbWFuYWdlbWVudDsgQ2FwYWNpdHkgcGxhbm5pbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBhbGxvY2F0ZWQgY2FwYWNpdHkgZm9yIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZVxuICAgKiovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBjb25uZWN0aW9uIG5hbWVzIGZvciBHbHVlIGpvYiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBlbmFibGluZyBkYXRhYmFzZSBhbmQgZXh0ZXJuYWwgc3lzdGVtIGFjY2Vzcy4gUHJvdmlkZXMgbmV0d29yayBjb25uZWN0aW9ucyBmb3IgYWNjZXNzaW5nIGRhdGFiYXNlcywgVlBDIHJlc291cmNlcywgYW5kIGV4dGVybmFsIHN5c3RlbXMgZHVyaW5nIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIGludGVncmF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IERhdGFiYXNlIGNvbm5lY3Rpdml0eTsgVlBDIGFjY2VzczsgRXh0ZXJuYWwgc3lzdGVtIGludGVncmF0aW9uOyBOZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb25uZWN0aW9ucyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBjb25uZWN0aXZpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBjb25uZWN0aW9uIG5hbWVzIGlmIHByb3ZpZGVkOyBlbmFibGVzIGRhdGFiYXNlIGFuZCBleHRlcm5hbCBzeXN0ZW0gYWNjZXNzXG4gICAqKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgZGVmYXVsdCBhcmd1bWVudHMgbWFwIGZvciBHbHVlIGpvYiBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBlbmFibGluZyBqb2IgY3VzdG9taXphdGlvbiBhbmQgcnVudGltZSBiZWhhdmlvciBjb250cm9sLiBQcm92aWRlcyBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBqb2IgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBhbmQgYmVoYXZpb3IgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBKb2IgcGFyYW1ldGVyczsgUnVudGltZSBjb25maWd1cmF0aW9uOyBCZWhhdmlvciBjdXN0b21pemF0aW9uOyBQYXJhbWV0ZXIgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGRlZmF1bHQgYXJndW1lbnRzIGZvciBydW50aW1lIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlciBtYW5hZ2VtZW50XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgQ29uZmlndXJhdGlvbkVsZW1lbnQgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgam9iIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGFuZCBjdXN0b21pemF0aW9uXG4gICAqKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFyZ3VtZW50cz86IENvbmZpZ3VyYXRpb25FbGVtZW50O1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnQgZW5hYmxpbmcgam9iIGlkZW50aWZpY2F0aW9uIGFuZCBwdXJwb3NlIGRvY3VtZW50YXRpb24uIFByb3ZpZGVzIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBqb2IncyBwdXJwb3NlLCBmdW5jdGlvbmFsaXR5LCBhbmQgb3BlcmF0aW9uYWwgY2hhcmFjdGVyaXN0aWNzIGZvciBtYW5hZ2VtZW50IGFuZCBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBkb2N1bWVudGF0aW9uOyBPcGVyYXRpb25hbCBtYW5hZ2VtZW50OyBQdXJwb3NlIGlkZW50aWZpY2F0aW9uOyBNYW5hZ2VtZW50IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBkZXNjcmlwdGl2ZSB0ZXh0OyByZXF1aXJlZCBmb3Igam9iIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICoqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBleGVjdXRpb24gcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgR2x1ZSBqb2IgY29uY3VycmVuY3kgY29udHJvbCBlbmFibGluZyBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudCBhbmQgcmVzb3VyY2Ugb3B0aW1pemF0aW9uLiBEZWZpbmVzIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGluY2x1ZGluZyBtYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3Igam9iIHNjaGVkdWxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uY3VycmVuY3kgY29udHJvbDsgUGFyYWxsZWwgZXhlY3V0aW9uOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBKb2Igc2NoZWR1bGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGZvciBjb25jdXJyZW5jeSBjb250cm9sIGFuZCBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIEV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHkgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBjb25jdXJyZW5jeSBhbmQgcGFyYWxsZWwgZXhlY3V0aW9uXG4gICAqICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIEdsdWUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGNvbnRyb2wgZW5hYmxpbmcgdmVyc2lvbi1zcGVjaWZpYyBmZWF0dXJlcyBhbmQgY29tcGF0aWJpbGl0eS4gRGVmaW5lcyB0aGUgR2x1ZSBydW50aW1lIHZlcnNpb24gZm9yIGpvYiBleGVjdXRpb24gZW5zdXJpbmcgZmVhdHVyZSBhdmFpbGFiaWxpdHkgYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBqb2IgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFJ1bnRpbWUgdmVyc2lvbiBjb250cm9sOyBGZWF0dXJlIGF2YWlsYWJpbGl0eTsgQ29tcGF0aWJpbGl0eSBtYW5hZ2VtZW50OyBWZXJzaW9uIHNwZWNpZmljYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIHZlcnNpb24gZm9yIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGZlYXR1cmUgYXZhaWxhYmlsaXR5XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgR2x1ZSB2ZXJzaW9uIGlmIHByb3ZpZGVkOyBjb250cm9scyBydW50aW1lIGVudmlyb25tZW50IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGdsdWVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmljYXRpb24gZm9yIEdsdWUgam9iIHJlc291cmNlIGxpbWl0cyBjb250cm9sbGluZyBtYXhpbXVtIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIGNvc3QgbWFuYWdlbWVudC4gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgRFBVcyAoRGF0YSBQcm9jZXNzaW5nIFVuaXRzKSB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgdG8gdGhlIGpvYiBmb3IgcmVzb3VyY2UgY29udHJvbCBhbmQgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVzb3VyY2UgbGltaXRzOyBDb3N0IGNvbnRyb2w7IE1heGltdW0gYWxsb2NhdGlvbjsgUmVzb3VyY2UgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gY2FwYWNpdHkgZm9yIHJlc291cmNlIGxpbWl0cyBhbmQgY29zdCBjb250cm9sXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkOyBjb250cm9scyBtYXhpbXVtIERQVSBhbGxvY2F0aW9uIGFuZCByZXNvdXJjZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbWF4aW11bSByZXRyeSBjb3VudCBmb3IgR2x1ZSBqb2IgZmFpbHVyZSBoYW5kbGluZyBlbmFibGluZyBhdXRvbWF0aWMgcmV0cnkgYW5kIGVycm9yIHJlY292ZXJ5LiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBqb2IgZmFpbHVyZSBvY2N1cnMgZm9yIGF1dG9tYXRpYyBlcnJvciByZWNvdmVyeSBhbmQgam9iIHJlbGlhYmlsaXR5LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEVycm9yIHJlY292ZXJ5OyBBdXRvbWF0aWMgcmV0cnk7IEpvYiByZWxpYWJpbGl0eTsgRmFpbHVyZSBoYW5kbGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gcmV0cmllcyBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5IGFuZCBqb2IgcmVsaWFiaWxpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciBpZiBwcm92aWRlZDsgY29udHJvbHMgYXV0b21hdGljIHJldHJ5IGJlaGF2aW9yIGFuZCBlcnJvciByZWNvdmVyeVxuICAgKiovXG4gIHJlYWRvbmx5IG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIG5vdGlmaWNhdGlvbiBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBlbmFibGluZyBqb2Igc3RhdHVzIG5vdGlmaWNhdGlvbnMgYW5kIG9wZXJhdGlvbmFsIGF3YXJlbmVzcy4gRGVmaW5lcyBub3RpZmljYXRpb24gc2V0dGluZ3MgaW5jbHVkaW5nIG5vdGlmaWNhdGlvbiBkZWxheSBmb3Igam9iIG1vbml0b3JpbmcgYW5kIG9wZXJhdGlvbmFsIGFsZXJ0aW5nLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBtb25pdG9yaW5nOyBTdGF0dXMgbm90aWZpY2F0aW9uczsgT3BlcmF0aW9uYWwgYWxlcnRpbmc7IE1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG5vdGlmaWNhdGlvbiBwcm9wZXJ0aWVzIGZvciBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eSBpZiBwcm92aWRlZDsgZW5hYmxlcyBqb2IgbW9uaXRvcmluZyBhbmQgYWxlcnRpbmdcbiAgICogICAqKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uUHJvcGVydHk/OiBDZm5Kb2IuTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbnVtYmVyIG9mIHdvcmtlcnMgc3BlY2lmaWNhdGlvbiBmb3IgR2x1ZSBqb2IgcGFyYWxsZWwgcHJvY2Vzc2luZyBlbmFibGluZyBkaXN0cmlidXRlZCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIG51bWJlciBvZiB3b3JrZXJzIGFzc2lnbmVkIHRvIHRoZSBqb2IgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcgYW5kIGRpc3RyaWJ1dGVkIGRhdGEgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUGFyYWxsZWwgcHJvY2Vzc2luZzsgRGlzdHJpYnV0ZWQgcHJvY2Vzc2luZzsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBXb3JrZXIgYWxsb2NhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG51bWJlciBvZiB3b3JrZXJzIGZvciBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHByb3ZpZGVkOyBjb250cm9scyBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCB3b3JrZXIgYWxsb2NhdGlvblxuICAgKiovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGltZW91dCBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBleGVjdXRpb24gbGltaXRzIGVuYWJsaW5nIGpvYiBydW50aW1lIGNvbnRyb2wgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuIERlZmluZXMgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoZSBqb2IgaW4gbWludXRlcyBmb3IgcnVudGltZSBjb250cm9sIGFuZCByZXNvdXJjZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUnVudGltZSBjb250cm9sOyBFeGVjdXRpb24gbGltaXRzOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBUaW1lb3V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB0aW1lb3V0IGZvciBleGVjdXRpb24gdGltZSBsaW1pdHMgYW5kIHJlc291cmNlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGluIG1pbnV0ZXMgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBleGVjdXRpb24gdGltZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCB3b3JrZXIgdHlwZSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBjb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbiBlbmFibGluZyBwZXJmb3JtYW5jZSBhbmQgY29zdCBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIHR5cGUgb2Ygd29ya2VycyAoU3RhbmRhcmQsIEcuMVgsIEcuMlgpIGZvciBjb21wdXRlIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbjsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBDb3N0IG1hbmFnZW1lbnQ7IFdvcmtlciB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB3b3JrZXIgdHlwZSBmb3IgY29tcHV0ZSByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBTdGFuZGFyZCwgRy4xWCwgb3IgRy4yWCBpZiBwcm92aWRlZDsgY29udHJvbHMgY29tcHV0ZSByZXNvdXJjZSB0eXBlIGFuZCBwZXJmb3JtYW5jZVxuICAgKiAgICoqL1xuICByZWFkb25seSB3b3JrZXJUeXBlPzogSm9iV29ya2VyVHlwZTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgYWRkaXRpb25hbCBzY3JpcHQgcGF0aHMgZm9yIEdsdWUgam9iIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBlbmFibGluZyBtb2R1bGFyIEVUTCBkZXZlbG9wbWVudCBhbmQgY29kZSByZXVzZS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBHbHVlIHNjcmlwdHMgcmVmZXJlbmNlZCBieSB0aGUgbWFpbiBFVEwgc2NyaXB0IGZvciBtb2R1bGFyIGRldmVsb3BtZW50IGFuZCBjb2RlIG9yZ2FuaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgZGVwZW5kZW5jaWVzOyBNb2R1bGFyIGRldmVsb3BtZW50OyBDb2RlIHJldXNlOyBEZXBlbmRlbmN5IG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIEdsdWUgc2NyaXB0cyBmb3Igam9iIGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBFVEwgZGV2ZWxvcG1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBzY3JpcHQgcGF0aHMgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgc2NyaXB0IGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBkZXZlbG9wbWVudFxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxTY3JpcHRzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgSkFSIGZpbGUgcGF0aHMgZm9yIEdsdWUgam9iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gSkFSIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgcHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogSmF2YSBsaWJyYXJ5IGludGVncmF0aW9uOyBFeHRlbmRlZCBmdW5jdGlvbmFsaXR5OyBMaWJyYXJ5IGRlcGVuZGVuY2llczsgSkFSIGZpbGUgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciBHbHVlIGpvYiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBhbmQgSmF2YSBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIGFycmF5IG9mIHZhbGlkIEpBUiBmaWxlIHBhdGhzIGlmIHByb3ZpZGVkOyBlbmFibGVzIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxKYXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgZmlsZSBwYXRocyBmb3IgR2x1ZSBqb2IgcmVzb3VyY2UgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIGV4dGVybmFsIGZpbGUgYWNjZXNzIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LiBQcm92aWRlcyByZWxhdGl2ZSBwYXRocyB0byBhZGRpdGlvbmFsIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIGV4dGVybmFsIHJlc291cmNlIGFjY2VzcyBhbmQgZmlsZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRmlsZSBkZXBlbmRlbmNpZXM7IEV4dGVybmFsIHJlc291cmNlczsgUmVzb3VyY2UgbWFuYWdlbWVudDsgRmlsZSBhY2Nlc3NcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIGZpbGVzIGZvciBHbHVlIGpvYiByZXNvdXJjZSBkZXBlbmRlbmNpZXMgYW5kIGV4dGVybmFsIGZpbGUgYWNjZXNzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgZmlsZSBwYXRocyBpZiBwcm92aWRlZDsgZW5hYmxlcyBleHRlcm5hbCBmaWxlIGFjY2VzcyBhbmQgcmVzb3VyY2UgZGVwZW5kZW5jaWVzXG4gICAqKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGNvbnRpbnVvdXMgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiByZWFsLXRpbWUgbW9uaXRvcmluZyBlbmFibGluZyBsaXZlIGxvZyBzdHJlYW1pbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzdXBwb3J0LiBXaGVuIGVuYWJsZWQsIHN0cmVhbXMgam9iIGxvZ3MgdG8gQ2xvdWRXYXRjaCBMb2dzIGluIHJlYWwtdGltZSBmb3IgbGl2ZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcgZHVyaW5nIGpvYiBleGVjdXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVhbC10aW1lIG1vbml0b3Jpbmc7IExpdmUgbG9nIHN0cmVhbWluZzsgVHJvdWJsZXNob290aW5nIHN1cHBvcnQ7IE9wZXJhdGlvbmFsIHZpc2liaWxpdHlcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb250aW51b3VzIGxvZ2dpbmcgZm9yIHJlYWwtdGltZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmdcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBMb2dnaW5nQ29uZmlnIGlmIHByb3ZpZGVkOyBlbmFibGVzIHJlYWwtdGltZSBsb2cgc3RyZWFtaW5nIGFuZCBtb25pdG9yaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgY29udGludW91c0xvZ2dpbmc/OiBMb2dnaW5nQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdsdWVKb2JMM0NvbnN0cnVjdFByb3BzIGV4dGVuZHMgTWRhYUwzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogUm9sZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGVwbG95IHRoZSBKb2IgY29kZS4gU2hvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIERhdGFPcHMgUHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGVBcm4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgRGF0YSBPcHMgcHJvamVjdCBidWNrZXQgd2hlcmUgam9iIHJlc291cmNlcyB3aWxsIGJlIGRlcGxveWVkIGFuZCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgam9iIGxvY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0QnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gdG9waWMgQXJuXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpY0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YW9wcyBwcm9qZWN0IEtNUyBrZXkgQVJOLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEtNU0Fybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdsdWVKb2JMM0NvbnN0cnVjdCBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEttc0tleTogSUtleTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuZGVwbG95bWVudFJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwbG95bWVudCByb2xlIEFSTiBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudFJvbGUgPSBNZGFhUm9sZS5mcm9tUm9sZUFybih0aGlzLnNjb3BlLCBgZGVwbG95bWVudC1yb2xlYCwgdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybik7XG4gICAgaWYgKCF0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgYnVja2V0IG5hbWUgaXMgcmVxdWlyZWQgZm9yIGpvYiBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RCdWNrZXQgPSBNZGFhQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMuc2NvcGUsIGBwcm9qZWN0LWJ1Y2tldGAsIHRoaXMucHJvcHMucHJvamVjdEJ1Y2tldE5hbWUpO1xuICAgIGlmICghdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgS01TIEtleSBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy5wcm9qZWN0S21zS2V5ID0gS2V5LmZyb21LZXlBcm4odGhpcywgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSwgdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKTtcblxuICAgIC8vIEJ1aWxkIG91ciBqb2JzIVxuICAgIGNvbnN0IGFsbEpvYnMgPSB0aGlzLnByb3BzLmpvYkNvbmZpZ3M7XG4gICAgT2JqZWN0LmtleXMoYWxsSm9icykuZm9yRWFjaChqb2JOYW1lID0+IHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZyA9IGFsbEpvYnNbam9iTmFtZV07XG4gICAgICB0aGlzLmNyZWF0ZUpvYihqb2JOYW1lLCBqb2JDb25maWcsIGRlcGxveW1lbnRSb2xlLCBwcm9qZWN0QnVja2V0KTtcbiAgICB9KTtcbiAgICAvL0NESyBTMyBEZXBsb3ltZW50IGF1dG9tYXRpY2FsbHkgYWRkcyBpbmxpbmUgcG9saWN5IHRvIHByb2plY3QgZGVwbG95bWVudCByb2xlLlxuICAgIHRoaXMuc2NvcGUubm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmIChjaGlsZC5ub2RlLmlkLnN0YXJ0c1dpdGgoJ2RlcGxveW1lbnQtcm9sZScpKSB7XG4gICAgICAgIE1kYWFOYWdTdXBwcmVzc2lvbnMuYWRkQ29kZVJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdOSVNULjgwMC41My5SNS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ1BvbGljeSB1c2VkIG9ubHkgZm9yIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnUG9saWN5IHVzZWQgb25seSBmb3IgZGVwbG95bWVudC4nIH0sXG4gICAgICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdQb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzOiBJU291cmNlW10sXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gICAgZGVwbG95bWVudFBhdGg6IHN0cmluZyxcbiAgICBleHRyYWN0OiBib29sZWFuLFxuICApOiBCdWNrZXREZXBsb3ltZW50IHtcbiAgICAvLyBEZXBsb3kgU291cmNlIGFzc2V0KHMpIHRvIC9kZXBsb3ltZW50L2xpYnMvPGpvYj4gbG9jYXRpb24uXG4gICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGRlcGxveW1lbnRJZCwge1xuICAgICAgc291cmNlczogYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBwcm9qZWN0QnVja2V0LFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGRlcGxveW1lbnRQYXRoLFxuICAgICAgcm9sZTogZGVwbG95bWVudFJvbGUsXG4gICAgICBleHRyYWN0OiBleHRyYWN0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsU2NyaXB0cyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogR3JvdXAgYWxsIGZpbGVzIGF0IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBjcmVhdGluZyB6aXAgbGliIGFzc2VzdHMgYXQgdmFyaW91cyBkaXJlY3RvcnkgbGV2ZWxzXG4gICAgICAgKiBleC4gJy9tYWluL3NjcmlwdDEucHknICwgJy91dGlsL3NjcmlwdDIucHknICwgJy91dGlsL3NjcmlwdDMucHknIHdpbGwgY3JlYXRlIDIgemlwIGZpbGVzIHJlcHJlc2VudGluZyAnbWFpbicgYW5kICd1dGlscydcbiAgICAgICAqICAqL1xuICAgICAgY29uc3QgZGlyZWN0b3J5VG9GaWxlOiB7IFtmaWxlUGF0aDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgam9iQ29uZmlnLmFkZGl0aW9uYWxTY3JpcHRzLmZvckVhY2goZmlsZUxvY2F0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aCBpbiBkaXJlY3RvcnlUb0ZpbGUpIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdLnB1c2goYCEke3BhdGguYmFzZW5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0b3J5VG9GaWxlW2ZpbGVQYXRoXSA9IFtgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gT2JqZWN0LmVudHJpZXMoZGlyZWN0b3J5VG9GaWxlKS5tYXAoKFtmaWxlUGF0aCwgZmlsZU5hbWVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCAuLi5maWxlTmFtZXNdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgcHJvamVjdEJ1Y2tldCxcbiAgICAgICAgZGVwbG95bWVudFJvbGUsXG4gICAgICAgIGBqb2ItZGVwbG95bWVudC0ke2pvYk5hbWV9LWFkZGl0aW9uYWwtc2NyaXB0YCxcbiAgICAgICAgZGVwbG95bWVudFBhdGgsXG4gICAgICAgIGZhbHNlLCAvLyBHbHVlIGV4cGVjdHMgemlwIG9mIGFkZGl0aW9uYWwgc2NyaXB0cywgaGVuY2UgZGlzYWJsaW5nIHRoZSBleHRyYWN0aW9uXG4gICAgICApO1xuXG4gICAgICAvLyBFeHRyYWN0IHppcCBuYW1lKHMpIGZvciBlYWNoIHNvdXJjZSBhbmQgY3JlYXRlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHMzIGxvY2F0aW9uc1xuICAgICAgY29uc3QgbGlicmFyeVppcE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGliTmFtZSA9IEZuLnNlbGVjdChpLCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQub2JqZWN0S2V5cyk7IC8vIEV4dHJhY3QgZmlsZSBuYW1lIG9mIHppcCBjb250YWluaW5nIGFkZGl0aW9uYWwgc2NyaXB0c1xuICAgICAgICBsaWJyYXJ5WmlwTmFtZXMucHVzaChgczM6Ly8ke2FkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke2RlcGxveW1lbnRQYXRofS8ke2xpYk5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB6aXAgZmlsZSBuYW1lcyB0byBkZWZhdWx0IGFyZ3VtZW50cy5cbiAgICAgIGlmIChkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1weS1maWxlcyddICs9ICcsJyArIGxpYnJhcnlaaXBOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBsaWJyYXJ5WmlwTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEphcnMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIHByb2plY3RCdWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxKYXJzKSB7XG4gICAgICAvLyBDcmVhdGUgU291cmNlIGFzc2V0IGZvciBlYWNoIGRpcmVjdG9yeVxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVzU291cmNlcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBwcm9qZWN0QnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1qYXJgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dHJhSmFyTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10gKz0gJywnICsgZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSA9IGV4dHJhSmFyTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEZpbGVzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBwcm9qZWN0QnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMpIHtcbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gam9iQ29uZmlnLmFkZGl0aW9uYWxGaWxlcy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2ZpbGVzLyR7am9iTmFtZX1gO1xuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVEZXBsb3ltZW50ID0gdGhpcy5kZXBsb3lBZGRpdGlvbmFsRmlsZXMoXG4gICAgICAgIGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMsXG4gICAgICAgIHByb2plY3RCdWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLWZpbGVgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBleHRyYUZpbGVOYW1lcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddKSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSArPSAnLCcgKyBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gPSBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2Ioam9iTmFtZTogc3RyaW5nLCBqb2JDb25maWc6IEpvYkNvbmZpZywgZGVwbG95bWVudFJvbGU6IElSb2xlLCBwcm9qZWN0QnVja2V0OiBJQnVja2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdEFyZ3VtZW50cyA9IGpvYkNvbmZpZy5kZWZhdWx0QXJndW1lbnRzID8gam9iQ29uZmlnLmRlZmF1bHRBcmd1bWVudHMgOiB7fTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5kaXJuYW1lKGpvYkNvbmZpZy5jb21tYW5kLnNjcmlwdExvY2F0aW9uLnRyaW0oKSk7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IHBhdGguYmFzZW5hbWUoam9iQ29uZmlnLmNvbW1hbmQuc2NyaXB0TG9jYXRpb24udHJpbSgpKTtcbiAgICBjb25zdCBzY3JpcHRTb3VyY2UgPSBTb3VyY2UuYXNzZXQoc2NyaXB0UGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke3NjcmlwdE5hbWV9YF0gfSk7XG5cbiAgICBjb25zdCBzY3JpcHREZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2pvYnMvJHtqb2JOYW1lfWA7XG4gICAgY29uc3Qgc2NyaXB0RGVwbG95bWVudCA9IG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGBqb2ItZGVwbG95bWVudC0ke2pvYk5hbWV9YCwge1xuICAgICAgc291cmNlczogW3NjcmlwdFNvdXJjZV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcHJvamVjdEJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzY3JpcHREZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQWRkaXRpb25hbFNjcmlwdHMoam9iTmFtZSwgam9iQ29uZmlnLCBwcm9qZWN0QnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsSmFycyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxGaWxlcyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBbXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLCByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1BDSS5EU1MuMzIxLUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIC8vIENvbm5lY3Rpb25zIHdpbGwgcmVxdWlyZSBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHdoZXJlIHRoZXkgYXJlIGRlZmluZWRcbiAgICBsZXQgY29ubmVjdGlvbnNDb25maWd1cmVkOiBDb25maWd1cmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoam9iQ29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uc0NvbmZpZ3VyZWQgPSB7XG4gICAgICAgIGNvbm5lY3Rpb25zOiBqb2JDb25maWcuY29ubmVjdGlvbnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tVGVtcERpciddID0gYHMzOi8vJHt0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lfS90ZW1wL2pvYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAvLyBhZGQgY29udGludW91cyBsb2dnaW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYgKGpvYkNvbmZpZy5jb250aW51b3VzTG9nZ2luZykge1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lID0gam9iTmFtZTtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXggPSAnL2F3cy9nbHVlJztcbiAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tY29udGludW91cy1sb2ctbG9nR3JvdXAnXSA9IHRoaXMuY3JlYXRlTG9nR3JvdXAoXG4gICAgICAgIGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXgsXG4gICAgICAgIGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYENvbnRpbnVvdXMgbG9nZ2luZyBub3QgZW5hYmxlZCBmb3Igam9iOiAke2pvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddO1xuICAgIGlmIChpbnB1dFBhcmFtcykge1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1pbnB1dF9wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VjdXJpdHkgY29uZmlndXJhdGlvbiBuYW1lIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGpvYiA9IG5ldyBNZGFhQ2ZuSm9iKHRoaXMuc2NvcGUsIGAke2pvYk5hbWV9LWpvYmAsIHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogam9iQ29uZmlnLmNvbW1hbmQubmFtZSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogam9iQ29uZmlnLmNvbW1hbmQucHl0aG9uVmVyc2lvbixcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IGBzMzovLyR7c2NyaXB0RGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke3NjcmlwdERlcGxveW1lbnRQYXRofS8ke3NjcmlwdE5hbWV9YCxcbiAgICAgIH0sXG4gICAgICByb2xlOiBqb2JDb25maWcuZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIGFsbG9jYXRlZENhcGFjaXR5OiBqb2JDb25maWcuYWxsb2NhdGVkQ2FwYWNpdHksXG4gICAgICBjb25uZWN0aW9uczogY29ubmVjdGlvbnNDb25maWd1cmVkLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50czogZGVmYXVsdEFyZ3VtZW50cyxcbiAgICAgIGRlc2NyaXB0aW9uOiBqb2JDb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLmV4ZWN1dGlvblByb3BlcnR5LFxuICAgICAgZ2x1ZVZlcnNpb246IGpvYkNvbmZpZy5nbHVlVmVyc2lvbixcbiAgICAgIG1heENhcGFjaXR5OiBqb2JDb25maWcubWF4Q2FwYWNpdHksXG4gICAgICBtYXhSZXRyaWVzOiBqb2JDb25maWcubWF4UmV0cmllcyxcbiAgICAgIG5hbWU6IGpvYk5hbWUsXG4gICAgICBub3RpZmljYXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLm5vdGlmaWNhdGlvblByb3BlcnR5LFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBqb2JDb25maWcubnVtYmVyT2ZXb3JrZXJzLFxuICAgICAgc2VjdXJpdHlDb25maWd1cmF0aW9uOiB0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICB0aW1lb3V0OiBqb2JDb25maWcudGltZW91dCxcbiAgICAgIHdvcmtlclR5cGU6IGpvYkNvbmZpZy53b3JrZXJUeXBlLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICB9KTtcbiAgICBpZiAoam9iLm5hbWUpIHtcbiAgICAgIERhdGFPcHNQcm9qZWN0VXRpbHMuY3JlYXRlUHJvamVjdFNTTVBhcmFtKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgICAgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgYGpvYi9uYW1lLyR7am9iTmFtZX1gLFxuICAgICAgICBqb2IubmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV2ZW50UnVsZSA9IHRoaXMuY3JlYXRlSm9iTW9uaXRvcmluZ0V2ZW50UnVsZShgJHtqb2JOYW1lfS1tb25pdG9yYCwgW2pvYi5uYW1lXSk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gdG9waWMgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgICB9XG4gICAgICBldmVudFJ1bGUuYWRkVGFyZ2V0KFxuICAgICAgICBuZXcgU25zVG9waWMoTWRhYVNuc1RvcGljLmZyb21Ub3BpY0Fybih0aGlzLnNjb3BlLCBgJHtqb2JOYW1lfS10b3BpY2AsIHRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKHJ1bGVOYW1lOiBzdHJpbmcsIGpvYk5hbWVzOiBzdHJpbmdbXSk6IFJ1bGUge1xuICAgIHJldHVybiBFdmVudEJyaWRnZUhlbHBlci5jcmVhdGVHbHVlTW9uaXRvcmluZ0V2ZW50UnVsZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIHJ1bGVOYW1lLFxuICAgICAgJ1dvcmtmbG93IEpvYiBmYWlsdXJlIGV2ZW50cycsXG4gICAgICB7XG4gICAgICAgIGpvYk5hbWU6IGpvYk5hbWVzLFxuICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnVElNRU9VVCcsICdTVE9QUEVEJ10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvZ0dyb3VwKGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IHN0cmluZywgbG9nR3JvdXBOYW1lOiBzdHJpbmcsIGxvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBsb2dHcm91cFJldGVudGlvbkRheXM6IFJldGVudGlvbkRheXM7XG5cbiAgICBpZiAobG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXMgIT0gMCkge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gbG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyA9IFJldGVudGlvbkRheXMuSU5GSU5JVEU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nUHJvcHMgPSB7XG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICBsb2dHcm91cE5hbWVQYXRoUHJlZml4OiBsb2dHcm91cE5hbWVQYXRoUHJlZml4LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5wcm9qZWN0S21zS2V5LFxuICAgICAgcmV0ZW50aW9uOiBsb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgfTtcbiAgICBuZXcgTWRhYUxvZ0dyb3VwKHRoaXMsIGxvZ0dyb3VwTmFtZSwgbG9nUHJvcHMpO1xuICAgIC8vIGB1cGRhdGVQcm9wc2AgYWx3YXlzIHJldHVybnMgYSBwcm9wIHdpdGggYSBsb2dHcm91cE5hbWVcbiAgICByZXR1cm4gdXBkYXRlUHJvcHMobG9nUHJvcHMpLmxvZ0dyb3VwTmFtZSE7XG4gIH1cbn1cbiJdfQ==
|
|
319
|
+
GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.6.0" };
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHVGQUFpRjtBQW1JakYsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLDBCQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVB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akIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDeEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxzQkFBOEIsRUFBRSxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZHLElBQUkscUJBQW9DLENBQUM7UUFFekMsSUFBSSxhQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MscUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04scUJBQXFCLEdBQUcsd0JBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsWUFBWTtZQUMxQixzQkFBc0IsRUFBRSxzQkFBc0I7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQzFCLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLElBQUksb0NBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLDBEQUEwRDtRQUMxRCxPQUFPLElBQUEsNEJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxZQUFhLENBQUM7SUFDN0MsQ0FBQzs7QUExWUgsZ0RBMllDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGF0YU9wc1Byb2plY3RVdGlscyB9IGZyb20gJ0Bhd3MtbWRhYS9kYXRhb3BzLXByb2plY3QtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlSGVscGVyIH0gZnJvbSAnQGF3cy1tZGFhL2V2ZW50YnJpZGdlLWhlbHBlcic7XG5pbXBvcnQgeyBNZGFhQ2ZuSm9iIH0gZnJvbSAnQGF3cy1tZGFhL2dsdWUtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhQnVja2V0IH0gZnJvbSAnQGF3cy1tZGFhL3MzLWNvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWRhYUwzQ29uc3RydWN0LCBNZGFhTDNDb25zdHJ1Y3RQcm9wcyB9IGZyb20gJ0Bhd3MtbWRhYS9sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgSVNvdXJjZSwgU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgTWRhYU5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ0Bhd3MtbWRhYS9jb25zdHJ1Y3QnOyAvL05PU09OQVJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNuc1RvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1kYWFTbnNUb3BpYyB9IGZyb20gJ0Bhd3MtbWRhYS9zbnMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FbGVtZW50IH0gZnJvbSAnQGF3cy1tZGFhL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgTWRhYUxvZ0dyb3VwIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cy9saWIvbG9nZ3JvdXAtdXRpbHMnO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG5leHBvcnQgdHlwZSBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbiA9ICcyJyB8ICczJyB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmROYW1lID0gJ2dsdWVldGwnIHwgJ3B5dGhvbnNoZWxsJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiBsb2dnaW5nIHdpdGggQ2xvdWRXYXRjaCBsb2cgcmV0ZW50aW9uIG1hbmFnZW1lbnQuXG4gKlxuICogVXNlIGNhc2VzOiBMb2cgcmV0ZW50aW9uIG1hbmFnZW1lbnQ7IENvbXBsaWFuY2UgcmVxdWlyZW1lbnRzOyBDb3N0IG9wdGltaXphdGlvbjsgQXVkaXQgdHJhaWwgbWFuYWdlbWVudFxuICpcbiAqIEFXUzogQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcmV0ZW50aW9uIGZvciBHbHVlIGpvYiBleGVjdXRpb24gbG9ncyBhbmQgbW9uaXRvcmluZ1xuICpcbiAqIFZhbGlkYXRpb246IGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyBpcyByZXF1aXJlZCB3aXRoIHNwZWNpZmljIGFsbG93ZWQgdmFsdWVzIGZvciByZXRlbnRpb24gcGVyaW9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2luZ0NvbmZpZyB7XG4gIC8qKiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gaW4gZGF5cy4gQWxsb3dlZDogMSwzLDUsNywxNCwzMCw2MCw5MCwxMjAsMTUwLDE4MCwzNjUsNDAwLDU0NSw3MzEsMTgyNywzNjUzLCBvciAwLiAqL1xuICByZWFkb25seSBsb2dHcm91cFJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIEdsdWUgam9iIGNvbW1hbmQgc3BlY2lmeWluZyBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50LlxuICpcbiAqIFVzZSBjYXNlczogSm9iIGNvbW1hbmQgY29uZmlndXJhdGlvbjsgU2NyaXB0IGV4ZWN1dGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRVRMIGpvYiBzZXR1cFxuICpcbiAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBjb25maWd1cmF0aW9uIGZvciBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50XG4gKlxuICogVmFsaWRhdGlvbjogbmFtZSBhbmQgc2NyaXB0TG9jYXRpb24gYXJlIHJlcXVpcmVkOyBweXRob25WZXJzaW9uIGlzIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb21tYW5kIHtcbiAgLyoqIEpvYiB0eXBlOiAnZ2x1ZWV0bCcgZm9yIFNwYXJrIEVUTCBvciAncHl0aG9uc2hlbGwnIGZvciBQeXRob24gc2NyaXB0cy4gKi9cbiAgcmVhZG9ubHkgbmFtZTogSm9iQ29tbWFuZE5hbWU7XG4gIC8qKiBQeXRob24gdmVyc2lvbiBmb3Igam9iIHJ1bnRpbWUgKCcyJyBvciAnMycpLiAqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogSm9iQ29tbWFuZFB5dGhvblZlcnNpb247XG4gIC8qKiBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBHbHVlIHNjcmlwdCBmb3Igam9iIGV4ZWN1dGlvbiwgb3IgYGFzc2V0OjxmaWxlbmFtZT5gIHRvIHVzZSBhIHByZS1idWlsdCBzY3JpcHQgZnJvbSB0aGUgYXBwJ3MgYXNzZXRzIGRpcmVjdG9yeS4gQXZhaWxhYmxlIGFzc2V0czogZHEtbWFpbi5weSAoRFEgZXZhbHVhdGlvbiwgd2l0aCB1dGlscy8gYXMgYWRkaXRpb25hbFNjcmlwdHMpLiAqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIEdsdWUgam9iIGluY2x1ZGluZyBleGVjdXRpb24gcm9sZXMsIGNvbW1hbmRzLCBjYXBhY2l0eSwgYW5kIG1vbml0b3JpbmcuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKiogSUFNIHJvbGUgQVJOIGZvciBHbHVlIGpvYiBleGVjdXRpb24gcGVybWlzc2lvbnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqIEpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pbmcgc2NyaXB0IGFuZCBydW50aW1lIGVudmlyb25tZW50LiAqL1xuICByZWFkb25seSBjb21tYW5kOiBKb2JDb21tYW5kO1xuICAvKiogVGVtcGxhdGUgbmFtZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IuICovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogQ29ubmVjdGlvbiBuYW1lcyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBhY2Nlc3MuICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25zPzogc3RyaW5nW107XG4gIC8qKiBEZWZhdWx0IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGpvYiBhdCBydW50aW1lLiAqL1xuICByZWFkb25seSBkZWZhdWx0QXJndW1lbnRzPzogQ29uZmlndXJhdGlvbkVsZW1lbnQ7XG4gIC8qKiBKb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG1hbmFnZW1lbnQuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gcHJvcGVydGllcyBpbmNsdWRpbmcgbWF4aW11bSBjb25jdXJyZW50IHJ1bnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKiBHbHVlIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgZ2x1ZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIERQVSBjYXBhY2l0eSBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGNvdW50IGJlZm9yZSBqb2IgZmFpbHVyZS4gKi9cbiAgcmVhZG9ubHkgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3Igam9iIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nLiAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Qcm9wZXJ0eT86IENmbkpvYi5Ob3RpZmljYXRpb25Qcm9wZXJ0eVByb3BlcnR5O1xuICAvKiogTnVtYmVyIG9mIHdvcmtlcnMgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcuICovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqIEpvYiB0aW1lb3V0IGluIG1pbnV0ZXMuICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBXb3JrZXIgdHlwZTogJ1N0YW5kYXJkJywgJ0cuMVgnLCBvciAnRy4yWCcuICovXG4gIHJlYWRvbmx5IHdvcmtlclR5cGU/OiBKb2JXb3JrZXJUeXBlO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBQeXRob24gc2NyaXB0cyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFNjcmlwdHM/OiBzdHJpbmdbXTtcbiAgLyoqIFJlbGF0aXZlIHBhdGhzIHRvIGFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciB0aGUgam9iLiAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsSmFycz86IHN0cmluZ1tdO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBmaWxlcyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKiBDb250aW51b3VzIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgcmVhbC10aW1lIG1vbml0b3JpbmcuICovXG4gIHJlYWRvbmx5IGNvbnRpbnVvdXNMb2dnaW5nPzogTG9nZ2luZ0NvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbHVlSm9iTDNDb25zdHJ1Y3RQcm9wcyBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFJvbGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlcGxveSB0aGUgSm9iIGNvZGUuIFNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBEYXRhT3BzIFByb2plY3RcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlQXJuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIERhdGEgT3BzIHByb2plY3QgYnVja2V0IHdoZXJlIGpvYiByZXNvdXJjZXMgd2lsbCBiZSBkZXBsb3llZCBhbmQgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGpvYiBsb2NhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIHRvcGljIEFyblxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uVG9waWNBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFvcHMgcHJvamVjdCBLTVMga2V5IEFSTi5cbiAgICovXG4gIHJlYWRvbmx5IGttc0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIGZvciByZXNvbHZpbmcgYGFzc2V0OmAgcHJlZml4ZWQgc2NyaXB0IGxvY2F0aW9ucy5cbiAgICogV2hlbiBhIGpvYidzIHNjcmlwdExvY2F0aW9uIHN0YXJ0cyB3aXRoIGBhc3NldDpgLCBpdCBpcyByZXNvbHZlZFxuICAgKiByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0QmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHbHVlSm9iTDNDb25zdHJ1Y3QgZXh0ZW5kcyBNZGFhTDNDb25zdHJ1Y3Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcHM6IEdsdWVKb2JMM0NvbnN0cnVjdFByb3BzO1xuICBwcml2YXRlIHJlYWRvbmx5IGttc0tleTogSUtleTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuZGVwbG95bWVudFJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwbG95bWVudCByb2xlIEFSTiBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudFJvbGUgPSBNZGFhUm9sZS5mcm9tUm9sZUFybih0aGlzLnNjb3BlLCBgZGVwbG95bWVudC1yb2xlYCwgdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybik7XG4gICAgaWYgKCF0aGlzLnByb3BzLmJ1Y2tldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdCBidWNrZXQgbmFtZSBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgYnVja2V0ID0gTWRhYUJ1Y2tldC5mcm9tQnVja2V0TmFtZSh0aGlzLnNjb3BlLCBgcHJvamVjdC1idWNrZXRgLCB0aGlzLnByb3BzLmJ1Y2tldE5hbWUpO1xuICAgIGlmICghdGhpcy5wcm9wcy5rbXNBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdCBLTVMgS2V5IGlzIHJlcXVpcmVkIGZvciBqb2IgY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLmttc0tleSA9IEtleS5mcm9tS2V5QXJuKHRoaXMsIHRoaXMucHJvcHMucHJvamVjdE5hbWUgPz8gJ2ttcy1rZXknLCB0aGlzLnByb3BzLmttc0Fybik7XG5cbiAgICAvLyBCdWlsZCBvdXIgam9icyFcbiAgICBjb25zdCBhbGxKb2JzID0gdGhpcy5wcm9wcy5qb2JDb25maWdzO1xuICAgIGZvciAoY29uc3Qgam9iTmFtZSBvZiBPYmplY3Qua2V5cyhhbGxKb2JzKSkge1xuICAgICAgY29uc3Qgam9iQ29uZmlnID0gYWxsSm9ic1tqb2JOYW1lXTtcbiAgICAgIHRoaXMuY3JlYXRlSm9iKGpvYk5hbWUsIGpvYkNvbmZpZywgZGVwbG95bWVudFJvbGUsIGJ1Y2tldCk7XG4gICAgfVxuXG4gICAgLy8gQnVja2V0RGVwbG95bWVudCBhZGRzIGFuIGlubGluZSBwb2xpY3kgdG8gdGhlIGltcG9ydGVkIGRlcGxveW1lbnQgcm9sZSxcbiAgICAvLyB3aGljaCBDREsgc3ludGhlc2l6ZXMgYXMgYSBzdGFuZGFsb25lIEFXUzo6SUFNOjpQb2xpY3kgcmVzb3VyY2UuXG4gICAgLy8gQmVjYXVzZSB0aGUgcG9saWN5IG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3QgcGF0aCAobm90IHRoZSBzdGFjayBuYW1lKSxcbiAgICAvLyBtdWx0aXBsZSBzdGFja3MgaW1wb3J0aW5nIHRoZSBzYW1lIHJvbGUgcHJvZHVjZSBjb2xsaWRpbmcgcGh5c2ljYWwgbmFtZXMuXG4gICAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcG9saWN5IG5vZGUg4oCUIHRoZSBkZXBsb3ltZW50IHJvbGUgYWxyZWFkeSBoYXMgdGhlIG5lY2Vzc2FyeVxuICAgIC8vIFMzIHBlcm1pc3Npb25zIGdyYW50ZWQgaW4gdGhlIGRhdGFvcHMtcHJvamVjdCBjb25zdHJ1Y3QgdGhhdCBvd25zIGl0LlxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZGVwbG95bWVudFJvbGUubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKGNoaWxkLm5vZGUuaWQgPT09ICdQb2xpY3knKSB7XG4gICAgICAgIGRlcGxveW1lbnRSb2xlLm5vZGUudHJ5UmVtb3ZlQ2hpbGQoY2hpbGQubm9kZS5pZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIG5hZyB3YXJuaW5ncyBvbiB0aGUgaW1wb3J0ZWQgZGVwbG95bWVudCByb2xlIG5vZGUgaXRzZWxmXG4gICAgLy8gKHJlbWFpbmluZyBhZnRlciBpbmxpbmUgcG9saWN5IHJlbW92YWwsIGUuZy4gd2lsZGNhcmQgcmVzb3VyY2Ugd2FybmluZ3MpXG4gICAgdGhpcy5zY29wZS5ub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkLm5vZGUuaWQuc3RhcnRzV2l0aCgnZGVwbG95bWVudC1yb2xlJykpIHtcbiAgICAgICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgW3sgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ1Blcm1pc3Npb25zIGdyYW50ZWQgb24gZGVwbG95bWVudCByb2xlIGluIG93bmluZyBzdGFjay4nIH1dLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzOiBJU291cmNlW10sXG4gICAgYnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZXBsb3ltZW50SWQ6IHN0cmluZyxcbiAgICBkZXBsb3ltZW50UGF0aDogc3RyaW5nLFxuICAgIGV4dHJhY3Q6IGJvb2xlYW4sXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIC8vIERlcGxveSBTb3VyY2UgYXNzZXQocykgdG8gL2RlcGxveW1lbnQvbGlicy88am9iPiBsb2NhdGlvbi5cbiAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcy5zY29wZSwgZGVwbG95bWVudElkLCB7XG4gICAgICBzb3VyY2VzOiBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBkZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogZXh0cmFjdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbFNjcmlwdHMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIGJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogR3JvdXAgYWxsIGZpbGVzIGF0IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBjcmVhdGluZyB6aXAgbGliIGFzc2VzdHMgYXQgdmFyaW91cyBkaXJlY3RvcnkgbGV2ZWxzXG4gICAgICAgKiBleC4gJy9tYWluL3NjcmlwdDEucHknICwgJy91dGlsL3NjcmlwdDIucHknICwgJy91dGlsL3NjcmlwdDMucHknIHdpbGwgY3JlYXRlIDIgemlwIGZpbGVzIHJlcHJlc2VudGluZyAnbWFpbicgYW5kICd1dGlscydcbiAgICAgICAqICAqL1xuICAgICAgY29uc3QgZGlyZWN0b3J5VG9GaWxlOiB7IFtmaWxlUGF0aDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgam9iQ29uZmlnLmFkZGl0aW9uYWxTY3JpcHRzLmZvckVhY2goZmlsZUxvY2F0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aCBpbiBkaXJlY3RvcnlUb0ZpbGUpIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdLnB1c2goYCEke3BhdGguYmFzZW5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0b3J5VG9GaWxlW2ZpbGVQYXRoXSA9IFtgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gT2JqZWN0LmVudHJpZXMoZGlyZWN0b3J5VG9GaWxlKS5tYXAoKFtmaWxlUGF0aCwgZmlsZU5hbWVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCAuLi5maWxlTmFtZXNdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1zY3JpcHRgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgZmFsc2UsIC8vIEdsdWUgZXhwZWN0cyB6aXAgb2YgYWRkaXRpb25hbCBzY3JpcHRzLCBoZW5jZSBkaXNhYmxpbmcgdGhlIGV4dHJhY3Rpb25cbiAgICAgICk7XG5cbiAgICAgIC8vIEV4dHJhY3QgemlwIG5hbWUocykgZm9yIGVhY2ggc291cmNlIGFuZCBjcmVhdGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgczMgbG9jYXRpb25zXG4gICAgICBjb25zdCBsaWJyYXJ5WmlwTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbEZpbGVzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaWJOYW1lID0gRm4uc2VsZWN0KGksIGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5vYmplY3RLZXlzKTsgLy8gRXh0cmFjdCBmaWxlIG5hbWUgb2YgemlwIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBzY3JpcHRzXG4gICAgICAgIGxpYnJhcnlaaXBOYW1lcy5wdXNoKGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7bGliTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHppcCBmaWxlIG5hbWVzIHRvIGRlZmF1bHQgYXJndW1lbnRzLlxuICAgICAgaWYgKGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtcHktZmlsZXMnXSkge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10gKz0gJywnICsgbGlicmFyeVppcE5hbWVzLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtcHktZmlsZXMnXSA9IGxpYnJhcnlaaXBOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsSmFycyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgYnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycykge1xuICAgICAgLy8gQ3JlYXRlIFNvdXJjZSBhc3NldCBmb3IgZWFjaCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5kaXJuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBTb3VyY2UuYXNzZXQoZmlsZVBhdGgsIHsgZXhjbHVkZTogWycqKicsIGAhJHtmaWxlTmFtZX1gXSB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95bWVudFBhdGggPSBgZGVwbG95bWVudC9saWJzLyR7am9iTmFtZX1gO1xuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1qYXJgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dHJhSmFyTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10gKz0gJywnICsgZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSA9IGV4dHJhSmFyTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEZpbGVzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBidWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxGaWxlcykge1xuICAgICAgLy8gQ3JlYXRlIFNvdXJjZSBhc3NldCBmb3IgZWFjaCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEZpbGVzLm1hcChmdWxsRmlsZU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguZGlybmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCBgISR7ZmlsZU5hbWV9YF0gfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRQYXRoID0gYGRlcGxveW1lbnQvZmlsZXMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1maWxlYCxcbiAgICAgICAgZGVwbG95bWVudFBhdGgsXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgICAgY29uc3QgZXh0cmFGaWxlTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEZpbGVzLm1hcChmdWxsRmlsZU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBgczM6Ly8ke2FkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke2RlcGxveW1lbnRQYXRofS8ke2ZpbGVOYW1lfWA7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHppcCBmaWxlIG5hbWVzIHRvIGRlZmF1bHQgYXJndW1lbnRzLlxuICAgICAgaWYgKGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSkge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gKz0gJywnICsgZXh0cmFGaWxlTmFtZXMuam9pbignLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddID0gZXh0cmFGaWxlTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UGF0aChqb2JOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCdhc3NldDonKSkge1xuICAgICAgY29uc3QgYXNzZXROYW1lID0gbG9jYXRpb24uc3Vic3RyaW5nKCdhc3NldDonLmxlbmd0aCk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuYXNzZXRCYXNlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEpvYiAnJHtqb2JOYW1lfScgdXNlcyBhc3NldDogcHJlZml4IGJ1dCBubyBhc3NldEJhc2VQYXRoIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICAgICAgYFNldCBhc3NldEJhc2VQYXRoIGluIHRoZSBjb25zdHJ1Y3QgcHJvcHMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5wcm9wcy5hc3NldEJhc2VQYXRoLCBhc3NldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvYihqb2JOYW1lOiBzdHJpbmcsIGpvYkNvbmZpZzogSm9iQ29uZmlnLCBkZXBsb3ltZW50Um9sZTogSVJvbGUsIGJ1Y2tldDogSUJ1Y2tldCkge1xuICAgIGNvbnN0IGRlZmF1bHRBcmd1bWVudHMgPSBqb2JDb25maWcuZGVmYXVsdEFyZ3VtZW50cyA/IGpvYkNvbmZpZy5kZWZhdWx0QXJndW1lbnRzIDoge307XG4gICAgbGV0IHNjcmlwdExvY2F0aW9uID0gdGhpcy5yZXNvbHZlQXNzZXRQYXRoKGpvYk5hbWUsIGpvYkNvbmZpZy5jb21tYW5kLnNjcmlwdExvY2F0aW9uLnRyaW0oKSk7XG5cbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5kaXJuYW1lKHNjcmlwdExvY2F0aW9uKTtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gcGF0aC5iYXNlbmFtZShzY3JpcHRMb2NhdGlvbik7XG4gICAgY29uc3Qgc2NyaXB0U291cmNlID0gU291cmNlLmFzc2V0KHNjcmlwdFBhdGgsIHsgZXhjbHVkZTogWycqKicsIGAhJHtzY3JpcHROYW1lfWBdIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0RGVwbG95bWVudFBhdGggPSBgZGVwbG95bWVudC9qb2JzLyR7am9iTmFtZX1gO1xuICAgIGNvbnN0IHNjcmlwdERlcGxveW1lbnQgPSBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLnNjb3BlLCBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfWAsIHtcbiAgICAgIHNvdXJjZXM6IFtzY3JpcHRTb3VyY2VdLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzY3JpcHREZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFJlc29sdmUgYXNzZXQ6IHByZWZpeGVzIGluIGFkZGl0aW9uYWxTY3JpcHRzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsU2NyaXB0cykge1xuICAgICAgam9iQ29uZmlnID0ge1xuICAgICAgICAuLi5qb2JDb25maWcsXG4gICAgICAgIGFkZGl0aW9uYWxTY3JpcHRzOiBqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMubWFwKHMgPT4gdGhpcy5yZXNvbHZlQXNzZXRQYXRoKGpvYk5hbWUsIHMudHJpbSgpKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWRkQWRkaXRpb25hbFNjcmlwdHMoam9iTmFtZSwgam9iQ29uZmlnLCBidWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxKYXJzKGpvYk5hbWUsIGpvYkNvbmZpZywgYnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsRmlsZXMoam9iTmFtZSwgam9iQ29uZmlnLCBidWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBbXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLCByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1BDSS5EU1MuMzIxLUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIC8vIENvbm5lY3Rpb25zIHdpbGwgcmVxdWlyZSBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHdoZXJlIHRoZXkgYXJlIGRlZmluZWRcbiAgICBsZXQgY29ubmVjdGlvbnNDb25maWd1cmVkOiBDb25maWd1cmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoam9iQ29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uc0NvbmZpZ3VyZWQgPSB7XG4gICAgICAgIGNvbm5lY3Rpb25zOiBqb2JDb25maWcuY29ubmVjdGlvbnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tVGVtcERpciddID0gYHMzOi8vJHt0aGlzLnByb3BzLmJ1Y2tldE5hbWV9L3RlbXAvam9icy8ke2pvYk5hbWV9YDtcblxuICAgIC8vIGFkZCBjb250aW51b3VzIGxvZ2dpbmcgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAoam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nKSB7XG4gICAgICBjb25zdCBsb2dHcm91cE5hbWUgPSBqb2JOYW1lO1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lUGF0aFByZWZpeCA9ICcvYXdzL2dsdWUnO1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1jb250aW51b3VzLWxvZy1sb2dHcm91cCddID0gdGhpcy5jcmVhdGVMb2dHcm91cChcbiAgICAgICAgbG9nR3JvdXBOYW1lUGF0aFByZWZpeCxcbiAgICAgICAgbG9nR3JvdXBOYW1lLFxuICAgICAgICBqb2JDb25maWcuY29udGludW91c0xvZ2dpbmcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ29udGludW91cyBsb2dnaW5nIG5vdCBlbmFibGVkIGZvciBqb2I6ICR7am9iTmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFBhcmFtcyA9IGRlZmF1bHRBcmd1bWVudHNbJy0taW5wdXRfcGFyYW1zJ107XG4gICAgaWYgKGlucHV0UGFyYW1zKSB7XG4gICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddID0gSlNPTi5zdHJpbmdpZnkoaW5wdXRQYXJhbXMpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN1cml0eSBjb25maWd1cmF0aW9uIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGpvYiBtb25pdG9yaW5nIGV2ZW50IHJ1bGUnKTtcbiAgICB9XG4gICAgY29uc3Qgam9iID0gbmV3IE1kYWFDZm5Kb2IodGhpcy5zY29wZSwgYCR7am9iTmFtZX0tam9iYCwge1xuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBqb2JDb25maWcuY29tbWFuZC5uYW1lLFxuICAgICAgICBweXRob25WZXJzaW9uOiBqb2JDb25maWcuY29tbWFuZC5weXRob25WZXJzaW9uLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogYHMzOi8vJHtzY3JpcHREZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7c2NyaXB0RGVwbG95bWVudFBhdGh9LyR7c2NyaXB0TmFtZX1gLFxuICAgICAgfSxcbiAgICAgIHJvbGU6IGpvYkNvbmZpZy5leGVjdXRpb25Sb2xlQXJuLFxuICAgICAgYWxsb2NhdGVkQ2FwYWNpdHk6IGpvYkNvbmZpZy5hbGxvY2F0ZWRDYXBhY2l0eSxcbiAgICAgIGNvbm5lY3Rpb25zOiBjb25uZWN0aW9uc0NvbmZpZ3VyZWQsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzOiBkZWZhdWx0QXJndW1lbnRzLFxuICAgICAgZGVzY3JpcHRpb246IGpvYkNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBqb2JDb25maWcuZXhlY3V0aW9uUHJvcGVydHksXG4gICAgICBnbHVlVmVyc2lvbjogam9iQ29uZmlnLmdsdWVWZXJzaW9uLFxuICAgICAgbWF4Q2FwYWNpdHk6IGpvYkNvbmZpZy5tYXhDYXBhY2l0eSxcbiAgICAgIG1heFJldHJpZXM6IGpvYkNvbmZpZy5tYXhSZXRyaWVzLFxuICAgICAgbmFtZTogam9iTmFtZSxcbiAgICAgIG5vdGlmaWNhdGlvblByb3BlcnR5OiBqb2JDb25maWcubm90aWZpY2F0aW9uUHJvcGVydHksXG4gICAgICBudW1iZXJPZldvcmtlcnM6IGpvYkNvbmZpZy5udW1iZXJPZldvcmtlcnMsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHRoaXMucHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRpbWVvdXQ6IGpvYkNvbmZpZy50aW1lb3V0LFxuICAgICAgd29ya2VyVHlwZTogam9iQ29uZmlnLndvcmtlclR5cGUsXG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgIH0pO1xuXG4gICAgaWYgKGpvYi5uYW1lICYmIHRoaXMucHJvcHMucHJvamVjdE5hbWUpIHtcbiAgICAgIERhdGFPcHNQcm9qZWN0VXRpbHMuY3JlYXRlUHJvamVjdFNTTVBhcmFtKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgICAgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgYGpvYi9uYW1lLyR7am9iTmFtZX1gLFxuICAgICAgICBqb2IubmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV2ZW50UnVsZSA9IHRoaXMuY3JlYXRlSm9iTW9uaXRvcmluZ0V2ZW50UnVsZShgJHtqb2JOYW1lfS1tb25pdG9yYCwgW2pvYi5uYW1lXSk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gdG9waWMgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgICB9XG4gICAgICBldmVudFJ1bGUuYWRkVGFyZ2V0KFxuICAgICAgICBuZXcgU25zVG9waWMoTWRhYVNuc1RvcGljLmZyb21Ub3BpY0Fybih0aGlzLnNjb3BlLCBgJHtqb2JOYW1lfS10b3BpY2AsIHRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKHJ1bGVOYW1lOiBzdHJpbmcsIGpvYk5hbWVzOiBzdHJpbmdbXSk6IFJ1bGUge1xuICAgIHJldHVybiBFdmVudEJyaWRnZUhlbHBlci5jcmVhdGVHbHVlTW9uaXRvcmluZ0V2ZW50UnVsZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIHJ1bGVOYW1lLFxuICAgICAgJ1dvcmtmbG93IEpvYiBmYWlsdXJlIGV2ZW50cycsXG4gICAgICB7XG4gICAgICAgIGpvYk5hbWU6IGpvYk5hbWVzLFxuICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnVElNRU9VVCcsICdTVE9QUEVEJ10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvZ0dyb3VwKGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IHN0cmluZywgbG9nR3JvdXBOYW1lOiBzdHJpbmcsIGxvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBsb2dHcm91cFJldGVudGlvbkRheXM6IFJldGVudGlvbkRheXM7XG5cbiAgICBpZiAobG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXMgIT0gMCkge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gbG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyA9IFJldGVudGlvbkRheXMuSU5GSU5JVEU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nUHJvcHMgPSB7XG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICBsb2dHcm91cE5hbWVQYXRoUHJlZml4OiBsb2dHcm91cE5hbWVQYXRoUHJlZml4LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5rbXNLZXksXG4gICAgICByZXRlbnRpb246IGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyxcbiAgICB9O1xuICAgIG5ldyBNZGFhTG9nR3JvdXAodGhpcywgbG9nR3JvdXBOYW1lLCBsb2dQcm9wcyk7XG4gICAgLy8gYHVwZGF0ZVByb3BzYCBhbHdheXMgcmV0dXJucyBhIHByb3Agd2l0aCBhIGxvZ0dyb3VwTmFtZVxuICAgIHJldHVybiB1cGRhdGVQcm9wcyhsb2dQcm9wcykubG9nR3JvdXBOYW1lITtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Don't include original .ts files when doing `npm pack`
|
|
2
|
+
*.ts
|
|
3
|
+
*.tsbuildinfo
|
|
4
|
+
.eslintrc.js
|
|
5
|
+
tsconfig.json
|
|
6
|
+
typedoc.json
|
|
7
|
+
|
|
8
|
+
# dev-related files
|
|
9
|
+
coverage
|
|
10
|
+
test/
|
|
11
|
+
|
|
12
|
+
# pack output
|
|
13
|
+
*.tgz
|
|
14
|
+
|
|
15
|
+
dist
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#Exclude coverage reports for bundled deps
|
|
19
|
+
node_modules/**/coverage/*
|
|
20
|
+
# Exclude typescript source and config
|
|
21
|
+
#*.ts
|
|
22
|
+
#tsconfig.json
|
|
23
|
+
|
|
24
|
+
# Include javascript files and typescript declarations
|
|
25
|
+
!*.js
|
|
26
|
+
!*.d.ts
|
|
27
|
+
|
|
28
|
+
# Exclude jsii outdir
|
|
29
|
+
jsii-dist
|
|
30
|
+
|
|
31
|
+
# Include .jsii and .jsii.gz
|
|
32
|
+
!.jsii
|
|
33
|
+
!.jsii.gz
|
|
34
|
+
jest.config.js
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { Construct } from 'constructs';
|
|
6
|
+
import { IMdaaResourceNaming } from '@aws-mdaa/naming';
|
|
7
|
+
import { IMdaaConfigValueTransformer, TransformResult } from './transformer';
|
|
8
|
+
export interface MdaaConfigBlueprintRefValueTransformerProps {
|
|
9
|
+
readonly naming: IMdaaResourceNaming;
|
|
10
|
+
readonly scope: Construct;
|
|
11
|
+
}
|
|
12
|
+
export declare class MdaaConfigBlueprintRefValueTransformer implements IMdaaConfigValueTransformer {
|
|
13
|
+
protected props: MdaaConfigBlueprintRefValueTransformerProps;
|
|
14
|
+
constructor(props: MdaaConfigBlueprintRefValueTransformerProps);
|
|
15
|
+
transformValue(value: string): TransformResult;
|
|
16
|
+
protected parseBlueprintRef(value: string, refMatch: string[]): string | number | object;
|
|
17
|
+
private substituteBlueprintReferences;
|
|
18
|
+
private convertToString;
|
|
19
|
+
private resolveBlueprintReference;
|
|
20
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MdaaConfigBlueprintRefValueTransformer = void 0;
|
|
8
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
+
const XRegExp = require("xregexp");
|
|
10
|
+
class MdaaConfigBlueprintRefValueTransformer {
|
|
11
|
+
constructor(props) {
|
|
12
|
+
this.props = props;
|
|
13
|
+
}
|
|
14
|
+
transformValue(value) {
|
|
15
|
+
const refMatch = XRegExp.matchRecursive(value, '{{', '}}', 'g', {
|
|
16
|
+
unbalanced: 'skip',
|
|
17
|
+
});
|
|
18
|
+
if (refMatch.length > 0) {
|
|
19
|
+
return this.parseBlueprintRef(value, refMatch);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
parseBlueprintRef(value, refMatch) {
|
|
26
|
+
// Substitute all references in the string
|
|
27
|
+
return this.substituteBlueprintReferences(value, refMatch);
|
|
28
|
+
}
|
|
29
|
+
substituteBlueprintReferences(value, refMatch) {
|
|
30
|
+
return refMatch.reduce((result, ref) => {
|
|
31
|
+
const refInner = this.transformValue(ref).toString();
|
|
32
|
+
const resolvedValue = this.resolveBlueprintReference(refInner);
|
|
33
|
+
if (resolvedValue === undefined) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
const stringValue = this.convertToString(resolvedValue);
|
|
37
|
+
return result.replace(`{{${ref}}}`, stringValue);
|
|
38
|
+
}, value);
|
|
39
|
+
}
|
|
40
|
+
convertToString(value) {
|
|
41
|
+
if (typeof value === 'string') {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
45
|
+
return String(value);
|
|
46
|
+
}
|
|
47
|
+
// For objects, use JSON.stringify as a safe fallback
|
|
48
|
+
return JSON.stringify(value);
|
|
49
|
+
}
|
|
50
|
+
resolveBlueprintReference(refInner) {
|
|
51
|
+
if (refInner.startsWith('blueprint:')) {
|
|
52
|
+
if (!this.props.scope) {
|
|
53
|
+
throw new Error('Unable to resolve blueprint params outside of a Construct');
|
|
54
|
+
}
|
|
55
|
+
if (!this.props.naming) {
|
|
56
|
+
throw new Error('Unable to resolve blueprint params without a naming implementation');
|
|
57
|
+
}
|
|
58
|
+
const blueprintPath = refInner.replace(/^blueprint:/, '');
|
|
59
|
+
const ssmOrgPath = this.props.naming?.ssmOrgPath('', false);
|
|
60
|
+
const existingDzProjectParam = this.props.scope?.node.tryFindChild('datazoneEnvironmentProjectId');
|
|
61
|
+
const dzProjectParam = existingDzProjectParam ?? new aws_cdk_lib_1.CfnParameter(this.props.scope, 'datazoneEnvironmentProjectId');
|
|
62
|
+
const ssmPath = `{{resolve:ssm:${ssmOrgPath}${dzProjectParam.valueAsString}${blueprintPath}}}`;
|
|
63
|
+
console.log(`Resolving blueprint path: ${ssmPath}`);
|
|
64
|
+
return ssmPath;
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.MdaaConfigBlueprintRefValueTransformer = MdaaConfigBlueprintRefValueTransformer;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ZXByaW50LXZhbHVlLXRyYW5zZm9ybWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmx1ZXByaW50LXZhbHVlLXRyYW5zZm9ybWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDZDQUEyQztBQUkzQyxtQ0FBbUM7QUFRbkMsTUFBYSxzQ0FBc0M7SUFHakQsWUFBWSxLQUFrRDtRQUM1RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQWE7UUFDakMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDOUQsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQW9CLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFFBQWtCO1FBQzNELDBDQUEwQztRQUMxQyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLDZCQUE2QixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNyRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYztRQUNwQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxxREFBcUQ7UUFDckQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxRQUFnQjtRQUNoRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FDaEUsOEJBQThCLENBQ2YsQ0FBQztZQUNsQixNQUFNLGNBQWMsR0FDbEIsc0JBQXNCLElBQUksSUFBSSwwQkFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLDhCQUE4QixDQUFDLENBQUM7WUFDL0YsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLFVBQVUsR0FBRyxjQUFjLENBQUMsYUFBYSxHQUFHLGFBQWEsSUFBSSxDQUFDO1lBQy9GLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQXRFRCx3RkFzRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDZm5QYXJhbWV0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbi8vIG5vc2VtZ3JlcFxuaW1wb3J0IHsgSU1kYWFSZXNvdXJjZU5hbWluZyB9IGZyb20gJ0Bhd3MtbWRhYS9uYW1pbmcnO1xuaW1wb3J0ICogYXMgWFJlZ0V4cCBmcm9tICd4cmVnZXhwJztcbmltcG9ydCB7IElNZGFhQ29uZmlnVmFsdWVUcmFuc2Zvcm1lciwgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAnLi90cmFuc2Zvcm1lcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWRhYUNvbmZpZ0JsdWVwcmludFJlZlZhbHVlVHJhbnNmb3JtZXJQcm9wcyB7XG4gIHJlYWRvbmx5IG5hbWluZzogSU1kYWFSZXNvdXJjZU5hbWluZztcbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbn1cblxuZXhwb3J0IGNsYXNzIE1kYWFDb25maWdCbHVlcHJpbnRSZWZWYWx1ZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgSU1kYWFDb25maWdWYWx1ZVRyYW5zZm9ybWVyIHtcbiAgcHJvdGVjdGVkIHByb3BzOiBNZGFhQ29uZmlnQmx1ZXByaW50UmVmVmFsdWVUcmFuc2Zvcm1lclByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBNZGFhQ29uZmlnQmx1ZXByaW50UmVmVmFsdWVUcmFuc2Zvcm1lclByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgcHVibGljIHRyYW5zZm9ybVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBUcmFuc2Zvcm1SZXN1bHQge1xuICAgIGNvbnN0IHJlZk1hdGNoID0gWFJlZ0V4cC5tYXRjaFJlY3Vyc2l2ZSh2YWx1ZSwgJ3t7JywgJ319JywgJ2cnLCB7XG4gICAgICB1bmJhbGFuY2VkOiAnc2tpcCcsXG4gICAgfSk7XG4gICAgaWYgKHJlZk1hdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQmx1ZXByaW50UmVmKHZhbHVlLCByZWZNYXRjaCkgYXMgVHJhbnNmb3JtUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQmx1ZXByaW50UmVmKHZhbHVlOiBzdHJpbmcsIHJlZk1hdGNoOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB7XG4gICAgLy8gU3Vic3RpdHV0ZSBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc3RyaW5nXG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZUJsdWVwcmludFJlZmVyZW5jZXModmFsdWUsIHJlZk1hdGNoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic3RpdHV0ZUJsdWVwcmludFJlZmVyZW5jZXModmFsdWU6IHN0cmluZywgcmVmTWF0Y2g6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVmTWF0Y2gucmVkdWNlKChyZXN1bHQsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcmVmSW5uZXIgPSB0aGlzLnRyYW5zZm9ybVZhbHVlKHJlZikudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0aGlzLnJlc29sdmVCbHVlcHJpbnRSZWZlcmVuY2UocmVmSW5uZXIpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcocmVzb2x2ZWRWYWx1ZSk7XG4gICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UoYHt7JHtyZWZ9fX1gLCBzdHJpbmdWYWx1ZSk7XG4gICAgfSwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gRm9yIG9iamVjdHMsIHVzZSBKU09OLnN0cmluZ2lmeSBhcyBhIHNhZmUgZmFsbGJhY2tcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQmx1ZXByaW50UmVmZXJlbmNlKHJlZklubmVyOiBzdHJpbmcpIHtcbiAgICBpZiAocmVmSW5uZXIuc3RhcnRzV2l0aCgnYmx1ZXByaW50OicpKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuc2NvcGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBibHVlcHJpbnQgcGFyYW1zIG91dHNpZGUgb2YgYSBDb25zdHJ1Y3QnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5wcm9wcy5uYW1pbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBibHVlcHJpbnQgcGFyYW1zIHdpdGhvdXQgYSBuYW1pbmcgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsdWVwcmludFBhdGggPSByZWZJbm5lci5yZXBsYWNlKC9eYmx1ZXByaW50Oi8sICcnKTtcbiAgICAgIGNvbnN0IHNzbU9yZ1BhdGggPSB0aGlzLnByb3BzLm5hbWluZz8uc3NtT3JnUGF0aCgnJywgZmFsc2UpO1xuICAgICAgY29uc3QgZXhpc3RpbmdEelByb2plY3RQYXJhbSA9IHRoaXMucHJvcHMuc2NvcGU/Lm5vZGUudHJ5RmluZENoaWxkKFxuICAgICAgICAnZGF0YXpvbmVFbnZpcm9ubWVudFByb2plY3RJZCcsXG4gICAgICApIGFzIENmblBhcmFtZXRlcjtcbiAgICAgIGNvbnN0IGR6UHJvamVjdFBhcmFtID1cbiAgICAgICAgZXhpc3RpbmdEelByb2plY3RQYXJhbSA/PyBuZXcgQ2ZuUGFyYW1ldGVyKHRoaXMucHJvcHMuc2NvcGUsICdkYXRhem9uZUVudmlyb25tZW50UHJvamVjdElkJyk7XG4gICAgICBjb25zdCBzc21QYXRoID0gYHt7cmVzb2x2ZTpzc206JHtzc21PcmdQYXRofSR7ZHpQcm9qZWN0UGFyYW0udmFsdWVBc1N0cmluZ30ke2JsdWVwcmludFBhdGh9fX1gO1xuICAgICAgY29uc29sZS5sb2coYFJlc29sdmluZyBibHVlcHJpbnQgcGF0aDogJHtzc21QYXRofWApO1xuICAgICAgcmV0dXJuIHNzbVBhdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|