@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.177.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +5851 -3571
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +525 -235
- package/README.md +422 -159
- package/awslint.json +5 -5
- package/lib/code.js +4 -4
- package/lib/connection.js +3 -3
- package/lib/constants.d.ts +261 -0
- package/lib/constants.js +281 -0
- package/lib/data-format.js +5 -5
- package/lib/data-quality-ruleset.js +2 -2
- package/lib/database.js +2 -2
- package/lib/external-table.js +1 -1
- package/lib/index.d.ts +13 -2
- package/lib/index.js +14 -3
- package/lib/jobs/job.d.ts +393 -0
- package/lib/jobs/job.js +299 -0
- package/lib/jobs/pyspark-etl-job.d.ts +81 -0
- package/lib/jobs/pyspark-etl-job.js +127 -0
- package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
- package/lib/jobs/pyspark-flex-etl-job.js +134 -0
- package/lib/jobs/pyspark-streaming-job.d.ts +82 -0
- package/lib/jobs/pyspark-streaming-job.js +128 -0
- package/lib/jobs/python-shell-job.d.ts +55 -0
- package/lib/jobs/python-shell-job.js +96 -0
- package/lib/jobs/ray-job.d.ts +44 -0
- package/lib/jobs/ray-job.js +87 -0
- package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
- package/lib/jobs/scala-spark-etl-job.js +131 -0
- package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
- package/lib/jobs/scala-spark-flex-etl-job.js +140 -0
- package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
- package/lib/jobs/scala-spark-streaming-job.js +128 -0
- package/lib/jobs/spark-ui-utils.d.ts +53 -0
- package/lib/jobs/spark-ui-utils.js +26 -0
- package/lib/s3-table.d.ts +4 -4
- package/lib/s3-table.js +2 -2
- package/lib/schema.d.ts +1 -1
- package/lib/schema.js +2 -2
- package/lib/security-configuration.js +2 -2
- package/lib/storage-parameter.js +1 -1
- package/lib/table-base.js +2 -2
- package/lib/table-deprecated.js +1 -1
- package/lib/triggers/trigger-options.d.ts +205 -0
- package/lib/triggers/trigger-options.js +39 -0
- package/lib/triggers/workflow.d.ts +203 -0
- package/lib/triggers/workflow.js +368 -0
- package/package.json +8 -8
- package/rosetta/default.ts-fixture +1 -1
- package/lib/job-executable.d.ts +0 -384
- package/lib/job-executable.js +0 -348
- package/lib/job.d.ts +0 -574
- package/lib/job.js +0 -531
package/lib/jobs/job.js
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Job = exports.JobBase = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
|
+
const events = require("aws-cdk-lib/aws-events");
|
|
9
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
10
|
+
const cdk = require("aws-cdk-lib/core");
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
/**
|
|
13
|
+
* A base class is needed to be able to import existing Jobs into a CDK app to
|
|
14
|
+
* reference as part of a larger stack or construct. JobBase has the subset
|
|
15
|
+
* of attribtues required to idenitfy and reference an existing Glue Job,
|
|
16
|
+
* as well as some CloudWatch metric conveneince functions to configure an
|
|
17
|
+
* event-driven flow using the job.
|
|
18
|
+
*/
|
|
19
|
+
class JobBase extends cdk.Resource {
|
|
20
|
+
/**
|
|
21
|
+
* Create a CloudWatch Event Rule for this Glue Job when it's in a given state
|
|
22
|
+
*
|
|
23
|
+
* @param id construct id
|
|
24
|
+
* @param options event options. Note that some values are overridden if provided, these are
|
|
25
|
+
* - eventPattern.source = ['aws.glue']
|
|
26
|
+
* - eventPattern.detailType = ['Glue Job State Change', 'Glue Job Run Status']
|
|
27
|
+
* - eventPattern.detail.jobName = [this.jobName]
|
|
28
|
+
*
|
|
29
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types
|
|
30
|
+
*/
|
|
31
|
+
onEvent(id, options = {}) {
|
|
32
|
+
const rule = new events.Rule(this, id, options);
|
|
33
|
+
rule.addTarget(options.target);
|
|
34
|
+
rule.addEventPattern({
|
|
35
|
+
source: ['aws.glue'],
|
|
36
|
+
detailType: ['Glue Job State Change', 'Glue Job Run Status'],
|
|
37
|
+
detail: {
|
|
38
|
+
jobName: [this.jobName],
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
return rule;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a CloudWatch Event Rule for the transition into the input jobState.
|
|
45
|
+
*
|
|
46
|
+
* @param id construct id.
|
|
47
|
+
* @param jobState the job state.
|
|
48
|
+
* @param options optional event options.
|
|
49
|
+
*/
|
|
50
|
+
onStateChange(id, jobState, options = {}) {
|
|
51
|
+
try {
|
|
52
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_JobState(jobState);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
56
|
+
Error.captureStackTrace(error, this.onStateChange);
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
const rule = this.onEvent(id, {
|
|
61
|
+
description: `Rule triggered when Glue job ${this.jobName} is in ${jobState} state`,
|
|
62
|
+
...options,
|
|
63
|
+
});
|
|
64
|
+
rule.addEventPattern({
|
|
65
|
+
detail: {
|
|
66
|
+
state: [jobState],
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
return rule;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a CloudWatch Event Rule matching JobState.SUCCEEDED.
|
|
73
|
+
*
|
|
74
|
+
* @param id construct id.
|
|
75
|
+
* @param options optional event options. default is {}.
|
|
76
|
+
*/
|
|
77
|
+
onSuccess(id, options = {}) {
|
|
78
|
+
return this.onStateChange(id, constants_1.JobState.SUCCEEDED, options);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Return a CloudWatch Event Rule matching FAILED state.
|
|
82
|
+
*
|
|
83
|
+
* @param id construct id.
|
|
84
|
+
* @param options optional event options. default is {}.
|
|
85
|
+
*/
|
|
86
|
+
onFailure(id, options = {}) {
|
|
87
|
+
return this.onStateChange(id, constants_1.JobState.FAILED, options);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Return a CloudWatch Event Rule matching TIMEOUT state.
|
|
91
|
+
*
|
|
92
|
+
* @param id construct id.
|
|
93
|
+
* @param options optional event options. default is {}.
|
|
94
|
+
*/
|
|
95
|
+
onTimeout(id, options = {}) {
|
|
96
|
+
return this.onStateChange(id, constants_1.JobState.TIMEOUT, options);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a CloudWatch metric.
|
|
100
|
+
*
|
|
101
|
+
* @param metricName name of the metric typically prefixed with `glue.driver.`, `glue.<executorId>.` or `glue.ALL.`.
|
|
102
|
+
* @param type the metric type.
|
|
103
|
+
* @param props metric options.
|
|
104
|
+
*
|
|
105
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html
|
|
106
|
+
*/
|
|
107
|
+
metric(metricName, type, props) {
|
|
108
|
+
try {
|
|
109
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_MetricType(type);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
113
|
+
Error.captureStackTrace(error, this.metric);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
return new cloudwatch.Metric({
|
|
118
|
+
metricName,
|
|
119
|
+
namespace: 'Glue',
|
|
120
|
+
dimensionsMap: {
|
|
121
|
+
JobName: this.jobName,
|
|
122
|
+
JobRunId: 'ALL',
|
|
123
|
+
Type: type,
|
|
124
|
+
},
|
|
125
|
+
...props,
|
|
126
|
+
}).attachTo(this);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Return a CloudWatch Metric indicating job success.
|
|
130
|
+
*
|
|
131
|
+
* This metric is based on the Rule returned by no-args onSuccess() call.
|
|
132
|
+
*/
|
|
133
|
+
metricSuccess(props) {
|
|
134
|
+
return metricRule(this.metricJobStateRule('SuccessMetricRule', constants_1.JobState.SUCCEEDED), props);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Return a CloudWatch Metric indicating job failure.
|
|
138
|
+
*
|
|
139
|
+
* This metric is based on the Rule returned by no-args onFailure() call.
|
|
140
|
+
*/
|
|
141
|
+
metricFailure(props) {
|
|
142
|
+
return metricRule(this.metricJobStateRule('FailureMetricRule', constants_1.JobState.FAILED), props);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Return a CloudWatch Metric indicating job timeout.
|
|
146
|
+
*
|
|
147
|
+
* This metric is based on the Rule returned by no-args onTimeout() call.
|
|
148
|
+
*/
|
|
149
|
+
metricTimeout(props) {
|
|
150
|
+
return metricRule(this.metricJobStateRule('TimeoutMetricRule', constants_1.JobState.TIMEOUT), props);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Creates or retrieves a singleton event rule for the input job state for use with the metric JobState methods.
|
|
154
|
+
*
|
|
155
|
+
* @param id construct id.
|
|
156
|
+
* @param jobState the job state.
|
|
157
|
+
*/
|
|
158
|
+
metricJobStateRule(id, jobState) {
|
|
159
|
+
return this.node.tryFindChild(id) ?? this.onStateChange(id, jobState);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Returns the job arn
|
|
163
|
+
*/
|
|
164
|
+
buildJobArn(scope, jobName) {
|
|
165
|
+
return cdk.Stack.of(scope).formatArn({
|
|
166
|
+
service: 'glue',
|
|
167
|
+
resource: 'job',
|
|
168
|
+
resourceName: jobName,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.JobBase = JobBase;
|
|
173
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
174
|
+
JobBase[_a] = { fqn: "@aws-cdk/aws-glue-alpha.JobBase", version: "2.177.0-alpha.0" };
|
|
175
|
+
/**
|
|
176
|
+
* A Glue Job.
|
|
177
|
+
* @resource AWS::Glue::Job
|
|
178
|
+
*/
|
|
179
|
+
class Job extends JobBase {
|
|
180
|
+
/**
|
|
181
|
+
* Identifies an existing Glue Job from a subset of attributes that can
|
|
182
|
+
* be referenced from within another Stack or Construct.
|
|
183
|
+
*
|
|
184
|
+
* @param scope The scope creating construct (usually `this`)
|
|
185
|
+
* @param id The construct's id.
|
|
186
|
+
* @param attrs Attributes for the Glue Job we want to import
|
|
187
|
+
*/
|
|
188
|
+
static fromJobAttributes(scope, id, attrs) {
|
|
189
|
+
try {
|
|
190
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_JobImportAttributes(attrs);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
194
|
+
Error.captureStackTrace(error, this.fromJobAttributes);
|
|
195
|
+
}
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
class Import extends JobBase {
|
|
199
|
+
constructor() {
|
|
200
|
+
super(...arguments);
|
|
201
|
+
this.jobName = attrs.jobName;
|
|
202
|
+
this.jobArn = this.buildJobArn(scope, attrs.jobName);
|
|
203
|
+
this.grantPrincipal = attrs.role ?? new iam.UnknownPrincipal({ resource: this });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return new Import(scope, id);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check no usage of reserved arguments.
|
|
210
|
+
*
|
|
211
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
212
|
+
*/
|
|
213
|
+
checkNoReservedArgs(defaultArguments) {
|
|
214
|
+
if (defaultArguments) {
|
|
215
|
+
const reservedArgs = new Set(['--debug', '--mode', '--JOB_NAME']);
|
|
216
|
+
Object.keys(defaultArguments).forEach((arg) => {
|
|
217
|
+
if (reservedArgs.has(arg)) {
|
|
218
|
+
throw new Error(`The ${arg} argument is reserved by Glue. Don't set it`);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return defaultArguments;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Setup Continuous Loggiung Properties
|
|
226
|
+
* @param role The IAM role to use for continuous logging
|
|
227
|
+
* @param props The properties for continuous logging configuration
|
|
228
|
+
* @returns String containing the args for the continuous logging command
|
|
229
|
+
*/
|
|
230
|
+
setupContinuousLogging(role, props) {
|
|
231
|
+
try {
|
|
232
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ContinuousLoggingProps(props);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
236
|
+
Error.captureStackTrace(error, this.setupContinuousLogging);
|
|
237
|
+
}
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
// If the developer has explicitly disabled continuous logging return no args
|
|
241
|
+
if (props && !props.enabled) {
|
|
242
|
+
return {};
|
|
243
|
+
}
|
|
244
|
+
// Else we turn on continuous logging by default. Determine what log group to use.
|
|
245
|
+
const args = {
|
|
246
|
+
'--enable-continuous-cloudwatch-log': 'true',
|
|
247
|
+
};
|
|
248
|
+
if (props?.quiet) {
|
|
249
|
+
args['--enable-continuous-log-filter'] = 'true';
|
|
250
|
+
}
|
|
251
|
+
;
|
|
252
|
+
// If the developer provided a log group, add its name to the args and update the role.
|
|
253
|
+
if (props?.logGroup) {
|
|
254
|
+
args['--continuous-log-logGroup'] = props.logGroup.logGroupName;
|
|
255
|
+
props.logGroup.grantWrite(role);
|
|
256
|
+
}
|
|
257
|
+
if (props?.logStreamPrefix) {
|
|
258
|
+
args['--continuous-log-logStreamPrefix'] = props.logStreamPrefix;
|
|
259
|
+
}
|
|
260
|
+
if (props?.conversionPattern) {
|
|
261
|
+
args['--continuous-log-conversionPattern'] = props.conversionPattern;
|
|
262
|
+
}
|
|
263
|
+
return args;
|
|
264
|
+
}
|
|
265
|
+
codeS3ObjectUrl(code) {
|
|
266
|
+
try {
|
|
267
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_Code(code);
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
271
|
+
Error.captureStackTrace(error, this.codeS3ObjectUrl);
|
|
272
|
+
}
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
const s3Location = code.bind(this, this.role).s3Location;
|
|
276
|
+
return `s3://${s3Location.bucketName}/${s3Location.objectKey}`;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.Job = Job;
|
|
280
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
281
|
+
Job[_b] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.177.0-alpha.0" };
|
|
282
|
+
/**
|
|
283
|
+
* Create a CloudWatch Metric that's based on Glue Job events
|
|
284
|
+
* {@see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html#glue-event-types}
|
|
285
|
+
* The metric has namespace = 'AWS/Events', metricName = 'TriggeredRules' and RuleName = rule.ruleName dimension.
|
|
286
|
+
*
|
|
287
|
+
* @param rule for use in setting RuleName dimension value
|
|
288
|
+
* @param props metric properties
|
|
289
|
+
*/
|
|
290
|
+
function metricRule(rule, props) {
|
|
291
|
+
return new cloudwatch.Metric({
|
|
292
|
+
namespace: 'AWS/Events',
|
|
293
|
+
metricName: 'TriggeredRules',
|
|
294
|
+
dimensionsMap: { RuleName: rule.ruleName },
|
|
295
|
+
statistic: cloudwatch.Statistic.SUM,
|
|
296
|
+
...props,
|
|
297
|
+
}).attachTo(rule);
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCxpREFBaUQ7QUFDakQsMkNBQTJDO0FBRTNDLHdDQUF3QztBQUd4Qyw0Q0FBNkU7QUFzSDdFOzs7Ozs7R0FNRztBQUNILE1BQXNCLE9BQVEsU0FBUSxHQUFHLENBQUMsUUFBUTtJQUtoRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksT0FBTyxDQUFDLEVBQVUsRUFBRSxVQUFpQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkIsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDO1lBQzVELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVEOzs7Ozs7T0FNRztJQUNPLGFBQWEsQ0FBQyxFQUFVLEVBQUUsUUFBa0IsRUFBRSxVQUFpQyxFQUFFOzs7Ozs7Ozs7O1FBQ3pGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzVCLFdBQVcsRUFBRSxnQ0FBZ0MsSUFBSSxDQUFDLE9BQU8sVUFBVSxRQUFRLFFBQVE7WUFDbkYsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUNuQixNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQ2xCO1NBQ0YsQ0FBQyxD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QkFBMkIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsa0NBQWtDLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQ25FLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUN2RSxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVTLGVBQWUsQ0FBQyxJQUFVOzs7Ozs7Ozs7O1FBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDekQsT0FBTyxRQUFRLFVBQVUsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ2hFOztBQWxGSCxrQkFtRkM7OztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFrQixFQUFFLEtBQWdDO0lBQ3RFLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNCLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDMUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRztRQUNuQyxHQUFHLEtBQUs7S0FDVCxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvZGUgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBNZXRyaWNUeXBlLCBKb2JTdGF0ZSwgV29ya2VyVHlwZSwgR2x1ZVZlcnNpb24gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9jb25uZWN0aW9uJztcbmltcG9ydCB7IElTZWN1cml0eUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZWN1cml0eS1jb25maWd1cmF0aW9uJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgbmV3IG9yIGFuIGltcG9ydGVkIEdsdWUgSm9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUpvYiBleHRlbmRzIGNkay5JUmVzb3VyY2UsIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBqb2IuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgam9iLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBqb2JBcm46IHN0cmluZztcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiBzb21ldGhpbmcgaGFwcGVucyB3aXRoIHRoaXMgam9iLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uRXZlbnQoaWQ6IHN0cmluZywgb3B0aW9ucz86IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyk6IGV2ZW50cy5SdWxlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgQ2xvdWRXYXRjaCBldmVudCBydWxlIHRyaWdnZXJlZCB3aGVuIHRoaXMgam9iIG1vdmVzIHRvIHRoZSBTVUNDRUVERUQgc3RhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc1xuICAgKi9cbiAgb25TdWNjZXNzKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogRGVmaW5lcyBhIENsb3VkV2F0Y2ggZXZlbnQgcnVsZSB0cmlnZ2VyZWQgd2hlbiB0aGlzIGpvYiBtb3ZlcyB0byB0aGUgRkFJTEVEIHN0YXRlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIG9uRmFpbHVyZShpZDogc3RyaW5nLCBvcHRpb25zPzogZXZlbnRzLk9uRXZlbnRPcHRpb25zKTogZXZlbnRzLlJ1bGU7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBDbG91ZFdhdGNoIGV2ZW50IHJ1bGUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBqb2IgbW92ZXMgdG8gdGhlIFRJTUVPVVQgc3RhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc1xuICAgKi9cbiAgb25UaW1lb3V0KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBldmVudHMuT25FdmVudE9wdGlvbnMpOiBldmVudHMuUnVsZTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYyB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aCBgZ2x1ZS5kcml2ZXIuYCwgYGdsdWUuPGV4ZWN1dG9ySWQ+LmAgb3IgYGdsdWUuQUxMLmAuXG4gICAqIEBwYXJhbSB0eXBlIHRoZSBtZXRyaWMgdHlwZS5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yaW5nLWF3c2dsdWUtd2l0aC1jbG91ZHdhdGNoLW1ldHJpY3MuaHRtbFxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgdHlwZTogTWV0cmljVHlwZSwgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2Igc3VjY2Vzcy5cbiAgICovXG4gIG1ldHJpY1N1Y2Nlc3MocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgZmFpbHVyZS5cbiAgICovXG4gIG1ldHJpY0ZhaWx1cmUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgdGltZW91dC5cbiAgICovXG4gIG1ldHJpY1RpbWVvdXQocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBlbmFibGluZyBDb250aW51b3VzIExvZ2dpbmcgZm9yIEdsdWUgSm9icy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLWNvbnRpbnVvdXMtbG9nZ2luZy1lbmFibGUuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51b3VzTG9nZ2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBjb250aW5vdW91cyBsb2dnaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBDbG91ZFdhdGNoIGxvZyBncm91cCBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbG9nIGdyb3VwIGlzIGNyZWF0ZWQgd2l0aCBuYW1lIGAvYXdzLWdsdWUvam9icy9sb2dzLXYyL2AuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIENsb3VkV2F0Y2ggbG9nIHN0cmVhbSBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGpvYiBydW4gSUQuXG4gICAqL1xuICByZWFkb25seSBsb2dTdHJlYW1QcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBvdXQgbm9uLXVzZWZ1bCBBcGFjaGUgU3BhcmsgZHJpdmVyL2V4ZWN1dG9yIGFuZCBBcGFjaGUgSGFkb29wIFlBUk4gaGVhcnRiZWF0IGxvZyBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgcHJvdmlkZWQgY29udmVyc2lvbiBwYXR0ZXJuLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgTG9nNGogQ29udmVyc2lvbiBQYXR0ZXJuIHRvIGN1c3RvbWl6ZSBkcml2ZXIgYW5kIGV4ZWN1dG9yIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAlZHt5eS9NTS9kZCBISDptbTpzc30gJXAgJWN7MX06ICVtJW5gXG4gICAqL1xuICByZWFkb25seSBjb252ZXJzaW9uUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgaXMgbmVlZGVkIHRvIGJlIGFibGUgdG8gaW1wb3J0IGV4aXN0aW5nIEpvYnMgaW50byBhIENESyBhcHAgdG9cbiAqIHJlZmVyZW5jZSBhcyBwYXJ0IG9mIGEgbGFyZ2VyIHN0YWNrIG9yIGNvbnN0cnVjdC4gSm9iQmFzZSBoYXMgdGhlIHN1YnNldFxuICogb2YgYXR0cmlidHVlcyByZXF1aXJlZCB0byBpZGVuaXRmeSBhbmQgcmVmZXJlbmNlIGFuIGV4aXN0aW5nIEdsdWUgSm9iLFxuICogYXMgd2VsbCBhcyBzb21lIENsb3VkV2F0Y2ggbWV0cmljIGNvbnZlbmVpbmNlIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5cbiAqIGV2ZW50LWRyaXZlbiBmbG93IHVzaW5nIHRoZSBqb2IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2JCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUpvYiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBqb2JBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGlzIEdsdWUgSm9iIHdoZW4gaXQncyBpbiBhIGdpdmVuIHN0YXRlXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIG9wdGlvbnMgZXZlbnQgb3B0aW9ucy4gTm90ZSB0aGF0IHNvbWUgdmFsdWVzIGFyZSBvdmVycmlkZGVuIGlmIHByb3ZpZGVkLCB0aGVzZSBhcmVcbiAgICogIC0gZXZlbnRQYXR0ZXJuLnNvdXJjZSA9IFsnYXdzLmdsdWUnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsVHlwZSA9IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXVxuICAgKiAgLSBldmVudFBhdHRlcm4uZGV0YWlsLmpvYk5hbWUgPSBbdGhpcy5qb2JOYW1lXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9ldmVudHMvRXZlbnRUeXBlcy5odG1sI2dsdWUtZXZlbnQtdHlwZXNcbiAgICovXG4gIHB1YmxpYyBvbkV2ZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgaWQsIG9wdGlvbnMpO1xuICAgIHJ1bGUuYWRkVGFyZ2V0KG9wdGlvbnMudGFyZ2V0KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBzb3VyY2U6IFsnYXdzLmdsdWUnXSxcbiAgICAgIGRldGFpbFR5cGU6IFsnR2x1ZSBKb2IgU3RhdGUgQ2hhbmdlJywgJ0dsdWUgSm9iIFJ1biBTdGF0dXMnXSxcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBqb2JOYW1lOiBbdGhpcy5qb2JOYW1lXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIGZvciB0aGUgdHJhbnNpdGlvbiBpbnRvIHRoZSBpbnB1dCBqb2JTdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIGpvYlN0YXRlIHRoZSBqb2Igc3RhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25TdGF0ZUNoYW5nZShpZDogc3RyaW5nLCBqb2JTdGF0ZTogSm9iU3RhdGUsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLm9uRXZlbnQoaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgUnVsZSB0cmlnZ2VyZWQgd2hlbiBHbHVlIGpvYiAke3RoaXMuam9iTmFtZX0gaXMgaW4gJHtqb2JTdGF0ZX0gc3RhdGVgLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgICBydWxlLmFkZEV2ZW50UGF0dGVybih7XG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgc3RhdGU6IFtqb2JTdGF0ZV0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBydWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggRXZlbnQgUnVsZSBtYXRjaGluZyBKb2JTdGF0ZS5TVUNDRUVERUQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbmFsIGV2ZW50IG9wdGlvbnMuIGRlZmF1bHQgaXMge30uXG4gICAqL1xuICBwdWJsaWMgb25TdWNjZXNzKGlkOiBzdHJpbmcsIG9wdGlvbnM6IGV2ZW50cy5PbkV2ZW50T3B0aW9ucyA9IHt9KTogZXZlbnRzLlJ1bGUge1xuICAgIHJldHVybiB0aGlzLm9uU3RhdGVDaGFuZ2UoaWQsIEpvYlN0YXRlLlNVQ0NFRURFRCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBFdmVudCBSdWxlIG1hdGNoaW5nIEZBSUxFRCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvbkZhaWx1cmUoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuRkFJTEVELCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIEV2ZW50IFJ1bGUgbWF0Y2hpbmcgVElNRU9VVCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgZXZlbnQgb3B0aW9ucy4gZGVmYXVsdCBpcyB7fS5cbiAgICovXG4gIHB1YmxpYyBvblRpbWVvdXQoaWQ6IHN0cmluZywgb3B0aW9uczogZXZlbnRzLk9uRXZlbnRPcHRpb25zID0ge30pOiBldmVudHMuUnVsZSB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZUNoYW5nZShpZCwgSm9iU3RhdGUuVElNRU9VVCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYyB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aCBgZ2x1ZS5kcml2ZXIuYCwgYGdsdWUuPGV4ZWN1dG9ySWQ+LmAgb3IgYGdsdWUuQUxMLmAuXG4gICAqIEBwYXJhbSB0eXBlIHRoZSBtZXRyaWMgdHlwZS5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yaW5nLWF3c2dsdWUtd2l0aC1jbG91ZHdhdGNoLW1ldHJpY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHR5cGU6IE1ldHJpY1R5cGUsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0dsdWUnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBKb2JOYW1lOiB0aGlzLmpvYk5hbWUsXG4gICAgICAgIEpvYlJ1bklkOiAnQUxMJyxcbiAgICAgICAgVHlwZTogdHlwZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBDbG91ZFdhdGNoIE1ldHJpYyBpbmRpY2F0aW5nIGpvYiBzdWNjZXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBiYXNlZCBvbiB0aGUgUnVsZSByZXR1cm5lZCBieSBuby1hcmdzIG9uU3VjY2VzcygpIGNhbGwuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU3VjY2Vzcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbWV0cmljUnVsZSh0aGlzLm1ldHJpY0pvYlN0YXRlUnVsZSgnU3VjY2Vzc01ldHJpY1J1bGUnLCBKb2JTdGF0ZS5TVUNDRUVERUQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgQ2xvdWRXYXRjaCBNZXRyaWMgaW5kaWNhdGluZyBqb2IgZmFpbHVyZS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaXMgYmFzZWQgb24gdGhlIFJ1bGUgcmV0dXJuZWQgYnkgbm8tYXJncyBvbkZhaWx1cmUoKSBjYWxsLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZhaWx1cmUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG1ldHJpY1J1bGUodGhpcy5tZXRyaWNKb2JTdGF0ZVJ1bGUoJ0ZhaWx1cmVNZXRyaWNSdWxlJywgSm9iU3RhdGUuRkFJTEVEKSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIENsb3VkV2F0Y2ggTWV0cmljIGluZGljYXRpbmcgam9iIHRpbWVvdXQuXG4gICAqXG4gICAqIFRoaXMgbWV0cmljIGlzIGJhc2VkIG9uIHRoZSBSdWxlIHJldHVybmVkIGJ5IG5vLWFyZ3Mgb25UaW1lb3V0KCkgY2FsbC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUaW1lb3V0KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBtZXRyaWNSdWxlKHRoaXMubWV0cmljSm9iU3RhdGVSdWxlKCdUaW1lb3V0TWV0cmljUnVsZScsIEpvYlN0YXRlLlRJTUVPVVQpLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciByZXRyaWV2ZXMgYSBzaW5nbGV0b24gZXZlbnQgcnVsZSBmb3IgdGhlIGlucHV0IGpvYiBzdGF0ZSBmb3IgdXNlIHdpdGggdGhlIG1ldHJpYyBKb2JTdGF0ZSBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gam9iU3RhdGUgdGhlIGpvYiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgbWV0cmljSm9iU3RhdGVSdWxlKGlkOiBzdHJpbmcsIGpvYlN0YXRlOiBKb2JTdGF0ZSk6IGV2ZW50cy5SdWxlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgZXZlbnRzLlJ1bGUgPz8gdGhpcy5vblN0YXRlQ2hhbmdlKGlkLCBqb2JTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgam9iIGFyblxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkSm9iQXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgam9iTmFtZTogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAnam9iJyxcbiAgICAgIHJlc291cmNlTmFtZTogam9iTmFtZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3Vic2V0IG9mIEpvYiBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZCBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIGpvYlxuICogaW50byBhIENESyBwcm9qZWN0LiBUaGlzIGlzIGlvbmx5IHVzZWQgd2hlbiB1c2luZyBmcm9tSm9iQXR0cmlidXRlc1xuICogdG8gaWRlbnRpZnkgYW5kIHJlZmVyZW5jZSB0aGUgZXhpc3Rpbmcgam9iLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkltcG9ydEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGpvYi5cbiAgICovXG4gIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGFzc3VtZWQgYnkgR2x1ZSB0byBydW4gdGhpcyBqb2IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG59XG5cbi8qKlxuICogSm9iUHJvcGVydGllcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBHbHVlIEpvYnMgdXNpbmcgdGhpcyBMMiBDb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iUHJvcGVydGllcyB7XG4gIC8qKlxuICAgKiBTY3JpcHQgQ29kZSBMb2NhdGlvbiAocmVxdWlyZWQpXG4gICAqIFNjcmlwdCB0byBydW4gd2hlbiB0aGUgR2x1ZSBqb2IgZXhlY3V0ZXMuIENhbiBiZSB1cGxvYWRlZFxuICAgKiBmcm9tIHRoZSBsb2NhbCBkaXJlY3Rvcnkgc3RydWN0dXJlIHVzaW5nIGZyb21Bc3NldFxuICAgKiBvciByZWZlcmVuY2VkIHZpYSBTMyBsb2NhdGlvbiB1c2luZyBmcm9tQnVja2V0XG4gICAqL1xuICByZWFkb25seSBzY3JpcHQ6IENvZGU7XG5cbiAgLyoqXG4gICAqIElBTSBSb2xlIChyZXF1aXJlZClcbiAgICogSUFNIFJvbGUgdG8gdXNlIGZvciBHbHVlIGpvYiBleGVjdXRpb25cbiAgICogTXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIGRldmVsb3BlciBiZWNhdXNlIHRoZSBMMiBkb2Vzbid0IGhhdmUgdmlzaWJpbGl0eVxuICAgKiBpbnRvIHRoZSBhY3Rpb25zIHRoZSBzY3JpcHQocykgdGFrZXMgZHVyaW5nIHRoZSBqb2IgZXhlY3V0aW9uXG4gICAqIFRoZSByb2xlIG11c3QgdHJ1c3QgdGhlIEdsdWUgc2VydmljZSBwcmluY2lwYWwgKGdsdWUuYW1hem9uYXdzLmNvbSlcbiAgICogYW5kIGJlIGdyYW50ZWQgc3VmZmljaWVudCBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvZ2V0dGluZy1zdGFydGVkLWFjY2Vzcy5odG1sXG4gICAqL1xuICByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIEdsdWUgam9iIChvcHRpb25hbClcbiAgICogRGV2ZWxvcGVyLXNwZWNpZmllZCBuYW1lIG9mIHRoZSBHbHVlIGpvYlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmFtZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgam9iTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gKG9wdGlvbmFsKVxuICAgKiBEZXZlbG9wZXItc3BlY2lmaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSBHbHVlIGpvYlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTnVtYmVyIG9mIFdvcmtlcnMgKG9wdGlvbmFsKVxuICAgKiBOdW1iZXIgb2Ygd29ya2VycyBmb3IgR2x1ZSB0byB1c2UgZHVyaW5nIGpvYiBleGVjdXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcblxuICAvKipcbiAgICogV29ya2VyIFR5cGUgKG9wdGlvbmFsKVxuICAgKiBUeXBlIG9mIFdvcmtlciBmb3IgR2x1ZSB0byB1c2UgZHVyaW5nIGpvYiBleGVjdXRpb25cbiAgICogRW51bSBvcHRpb25zOiBTdGFuZGFyZCwgR18xWCwgR18yWCwgR18wMjVYLiBHXzRYLCBHXzhYLCBaXzJYXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtlclR5cGUuR18xWFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2VyVHlwZT86IFdvcmtlclR5cGU7XG5cbiAgLyoqXG4gICAqIE1heCBDb25jdXJyZW50IFJ1bnMgKG9wdGlvbmFsKVxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcnVucyB0aGlzIEdsdWUgam9iIGNhbiBjb25jdXJyZW50bHkgcnVuXG4gICAqXG4gICAqIEFuIGVycm9yIGlzIHJldHVybmVkIHdoZW4gdGhpcyB0aHJlc2hvbGQgaXMgcmVhY2hlZC4gVGhlIG1heGltdW0gdmFsdWVcbiAgICogeW91IGNhbiBzcGVjaWZ5IGlzIGNvbnRyb2xsZWQgYnkgYSBzZXJ2aWNlIGxpbWl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW50UnVucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBBcmd1bWVudHMgKG9wdGlvbmFsKVxuICAgKiBUaGUgZGVmYXVsdCBhcmd1bWVudHMgZm9yIGV2ZXJ5IHJ1biBvZiB0aGlzIEdsdWUgam9iLFxuICAgKiBzcGVjaWZpZWQgYXMgbmFtZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICogZm9yIGEgbGlzdCBvZiByZXNlcnZlZCBwYXJhbWV0ZXJzXG4gICAqIEBkZWZhdWx0IC0gbm8gYXJndW1lbnRzXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QXJndW1lbnRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQ29ubmVjdGlvbnMgKG9wdGlvbmFsKVxuICAgKiBMaXN0IG9mIGNvbm5lY3Rpb25zIHRvIHVzZSBmb3IgdGhpcyBHbHVlIGpvYlxuICAgKiBDb25uZWN0aW9ucyBhcmUgdXNlZCB0byBjb25uZWN0IHRvIG90aGVyIEFXUyBTZXJ2aWNlIG9yIHJlc291cmNlcyB3aXRoaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdIC0gbm8gY29ubmVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBqb2JcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25zPzogSUNvbm5lY3Rpb25bXTtcblxuICAvKipcbiAgICogTWF4IFJldHJpZXMgKG9wdGlvbmFsKVxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBHbHVlIHBlcmZvcm1zIGlmIHRoZSBqb2IgZmFpbHNcbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCAob3B0aW9uYWwpXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgdGhhdCBhIGpvYiBydW4gY2FuIGNvbnN1bWUgcmVzb3VyY2VzIGJlZm9yZSBpdCBpc1xuICAgKiB0ZXJtaW5hdGVkIGFuZCBlbnRlcnMgVElNRU9VVCBzdGF0dXMuIFNwZWNpZmllZCBpbiBtaW51dGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyODgwICgyIGRheXMgZm9yIG5vbi1zdHJlYW1pbmcpXG4gICAqXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogY2RrLkR1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBDb25maWd1cmF0aW9uIChvcHRpb25hbClcbiAgICogRGVmaW5lcyB0aGUgZW5jcnlwdGlvbiBvcHRpb25zIGZvciB0aGUgR2x1ZSBqb2JcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWN1cml0eSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlDb25maWd1cmF0aW9uPzogSVNlY3VyaXR5Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGFncyAob3B0aW9uYWwpXG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIEdsdWUgam9iIHJlc291cmNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBHbHVlIFZlcnNpb25cbiAgICogVGhlIHZlcnNpb24gb2YgR2x1ZSB0byB1c2UgdG8gZXhlY3V0ZSB0aGlzIGpvYlxuICAgKlxuICAgKiBAZGVmYXVsdCAzLjAgZm9yIEVUTFxuICAgKi9cbiAgcmVhZG9ubHkgZ2x1ZVZlcnNpb24/OiBHbHVlVmVyc2lvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgY29sbGVjdGlvbiBvZiBtZXRyaWNzIGZvciBqb2IgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGluZyBtZXRyaWNzIGVtaXR0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQcm9maWxpbmdNZXRyaWNzPyA6Ym9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBjb250aW51b3VzIGxvZ2dpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNvbnRpbnVvdXMgbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLWNvbnRpbnVvdXMtbG9nZ2luZy1lbmFibGUuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKiovXG4gIHJlYWRvbmx5IGNvbnRpbnVvdXNMb2dnaW5nPzogQ29udGludW91c0xvZ2dpbmdQcm9wcztcbn1cblxuLyoqXG4gKiBBIEdsdWUgSm9iLlxuICogQHJlc291cmNlIEFXUzo6R2x1ZTo6Sm9iXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKb2IgZXh0ZW5kcyBKb2JCYXNlIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgYW4gZXhpc3RpbmcgR2x1ZSBKb2IgZnJvbSBhIHN1YnNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgY2FuXG4gICAqIGJlIHJlZmVyZW5jZWQgZnJvbSB3aXRoaW4gYW5vdGhlciBTdGFjayBvciBDb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYClcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZm9yIHRoZSBHbHVlIEpvYiB3ZSB3YW50IHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSm9iQXR0cmlidXRlcyhzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBKb2JJbXBvcnRBdHRyaWJ1dGVzKTogSUpvYiB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgSm9iQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgam9iTmFtZSA9IGF0dHJzLmpvYk5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuID0gdGhpcy5idWlsZEpvYkFybihzY29wZSwgYXR0cnMuam9iTmFtZSk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWwgPSBhdHRycy5yb2xlID8/IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIEdsdWUgYXNzdW1lcyB0byBydW4gdGhpcyBqb2IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Qgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBDaGVjayBubyB1c2FnZSBvZiByZXNlcnZlZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hlY2tOb1Jlc2VydmVkQXJncyhkZWZhdWx0QXJndW1lbnRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmIChkZWZhdWx0QXJndW1lbnRzKSB7XG4gICAgICBjb25zdCByZXNlcnZlZEFyZ3MgPSBuZXcgU2V0KFsnLS1kZWJ1ZycsICctLW1vZGUnLCAnLS1KT0JfTkFNRSddKTtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRBcmd1bWVudHMpLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzZXJ2ZWRBcmdzLmhhcyhhcmcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHthcmd9IGFyZ3VtZW50IGlzIHJlc2VydmVkIGJ5IEdsdWUuIERvbid0IHNldCBpdGApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRBcmd1bWVudHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgQ29udGludW91cyBMb2dnaXVuZyBQcm9wZXJ0aWVzXG4gICAqIEBwYXJhbSByb2xlIFRoZSBJQU0gcm9sZSB0byB1c2UgZm9yIGNvbnRpbnVvdXMgbG9nZ2luZ1xuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIGNvbnRpbnVvdXMgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIFN0cmluZyBjb250YWluaW5nIHRoZSBhcmdzIGZvciB0aGUgY29udGludW91cyBsb2dnaW5nIGNvbW1hbmRcbiAgICovXG4gIHB1YmxpYyBzZXR1cENvbnRpbnVvdXNMb2dnaW5nKHJvbGU6IGlhbS5JUm9sZSwgcHJvcHM6IENvbnRpbnVvdXNMb2dnaW5nUHJvcHMgfCB1bmRlZmluZWQpIDogYW55IHtcbiAgICAvLyBJZiB0aGUgZGV2ZWxvcGVyIGhhcyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbnRpbnVvdXMgbG9nZ2luZyByZXR1cm4gbm8gYXJnc1xuICAgIGlmIChwcm9wcyAmJiAhcHJvcHMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8vIEVsc2Ugd2UgdHVybiBvbiBjb250aW51b3VzIGxvZ2dpbmcgYnkgZGVmYXVsdC4gRGV0ZXJtaW5lIHdoYXQgbG9nIGdyb3VwIHRvIHVzZS5cbiAgICBjb25zdCBhcmdzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHtcbiAgICAgICctLWVuYWJsZS1jb250aW51b3VzLWNsb3Vkd2F0Y2gtbG9nJzogJ3RydWUnLFxuICAgIH07XG5cbiAgICBpZiAocHJvcHM/LnF1aWV0KSB7XG4gICAgICBhcmdzWyctLWVuYWJsZS1jb250aW51b3VzLWxvZy1maWx0ZXInXSA9ICd0cnVlJztcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlIGRldmVsb3BlciBwcm92aWRlZCBhIGxvZyBncm91cCwgYWRkIGl0cyBuYW1lIHRvIHRoZSBhcmdzIGFuZCB1cGRhdGUgdGhlIHJvbGUuXG4gICAgaWYgKHByb3BzPy5sb2dHcm91cCkge1xuICAgICAgYXJnc1snLS1jb250aW51b3VzLWxvZy1sb2dHcm91cCddID0gcHJvcHMubG9nR3JvdXAubG9nR3JvdXBOYW1lO1xuICAgICAgcHJvcHMubG9nR3JvdXAuZ3JhbnRXcml0ZShyb2xlKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmxvZ1N0cmVhbVByZWZpeCkge1xuICAgICAgYXJnc1snLS1jb250aW51b3VzLWxvZy1sb2dTdHJlYW1QcmVmaXgnXSA9IHByb3BzLmxvZ1N0cmVhbVByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmNvbnZlcnNpb25QYXR0ZXJuKSB7XG4gICAgICBhcmdzWyctLWNvbnRpbnVvdXMtbG9nLWNvbnZlcnNpb25QYXR0ZXJuJ10gPSBwcm9wcy5jb252ZXJzaW9uUGF0dGVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2RlUzNPYmplY3RVcmwoY29kZTogQ29kZSkge1xuICAgIGNvbnN0IHMzTG9jYXRpb24gPSBjb2RlLmJpbmQodGhpcywgdGhpcy5yb2xlKS5zM0xvY2F0aW9uO1xuICAgIHJldHVybiBgczM6Ly8ke3MzTG9jYXRpb24uYnVja2V0TmFtZX0vJHtzM0xvY2F0aW9uLm9iamVjdEtleX1gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBNZXRyaWMgdGhhdCdzIGJhc2VkIG9uIEdsdWUgSm9iIGV2ZW50c1xuICoge0BzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9FdmVudFR5cGVzLmh0bWwjZ2x1ZS1ldmVudC10eXBlc31cbiAqIFRoZSBtZXRyaWMgaGFzIG5hbWVzcGFjZSA9ICdBV1MvRXZlbnRzJywgbWV0cmljTmFtZSA9ICdUcmlnZ2VyZWRSdWxlcycgYW5kIFJ1bGVOYW1lID0gcnVsZS5ydWxlTmFtZSBkaW1lbnNpb24uXG4gKlxuICogQHBhcmFtIHJ1bGUgZm9yIHVzZSBpbiBzZXR0aW5nIFJ1bGVOYW1lIGRpbWVuc2lvbiB2YWx1ZVxuICogQHBhcmFtIHByb3BzIG1ldHJpYyBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1ldHJpY1J1bGUocnVsZTogZXZlbnRzLklSdWxlLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgbmFtZXNwYWNlOiAnQVdTL0V2ZW50cycsXG4gICAgbWV0cmljTmFtZTogJ1RyaWdnZXJlZFJ1bGVzJyxcbiAgICBkaW1lbnNpb25zTWFwOiB7IFJ1bGVOYW1lOiBydWxlLnJ1bGVOYW1lIH0sXG4gICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRpc3RpYy5TVU0sXG4gICAgLi4ucHJvcHMsXG4gIH0pLmF0dGFjaFRvKHJ1bGUpO1xufVxuXG4iXX0=
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import { Job, JobProperties } from './job';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { SparkUIProps, SparkUILoggingLocation } from './spark-ui-utils';
|
|
5
|
+
import { Code } from '../code';
|
|
6
|
+
/**
|
|
7
|
+
* Properties for creating a Python Spark ETL job
|
|
8
|
+
*/
|
|
9
|
+
export interface PySparkEtlJobProps extends JobProperties {
|
|
10
|
+
/**
|
|
11
|
+
* Enables the Spark UI debugging and monitoring with the specified props.
|
|
12
|
+
*
|
|
13
|
+
* @default - Spark UI debugging and monitoring is disabled.
|
|
14
|
+
*
|
|
15
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
16
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
17
|
+
*/
|
|
18
|
+
readonly sparkUI?: SparkUIProps;
|
|
19
|
+
/**
|
|
20
|
+
* Extra Python Files S3 URL (optional)
|
|
21
|
+
* S3 URL where additional python dependencies are located
|
|
22
|
+
*
|
|
23
|
+
* @default - no extra files
|
|
24
|
+
*/
|
|
25
|
+
readonly extraPythonFiles?: Code[];
|
|
26
|
+
/**
|
|
27
|
+
* Additional files, such as configuration files that AWS Glue copies to the working directory of your script before executing it.
|
|
28
|
+
*
|
|
29
|
+
* @default - no extra files specified.
|
|
30
|
+
*
|
|
31
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
32
|
+
*/
|
|
33
|
+
readonly extraFiles?: Code[];
|
|
34
|
+
/**
|
|
35
|
+
* Specifies whether job run queuing is enabled for the job runs for this job.
|
|
36
|
+
* A value of true means job run queuing is enabled for the job runs.
|
|
37
|
+
* If false or not populated, the job runs will not be considered for queueing.
|
|
38
|
+
* If this field does not match the value set in the job run, then the value from
|
|
39
|
+
* the job run field will be used. This property must be set to false for flex jobs.
|
|
40
|
+
* If this property is enabled, maxRetries must be set to zero.
|
|
41
|
+
*
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
readonly jobRunQueuingEnabled?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PySpark ETL Jobs class
|
|
48
|
+
*
|
|
49
|
+
* ETL jobs support pySpark and Scala languages, for which there are separate
|
|
50
|
+
* but similar constructors. ETL jobs default to the G2 worker type, but you
|
|
51
|
+
* can override this default with other supported worker type values
|
|
52
|
+
* (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
|
|
53
|
+
* override to 3.0. The following ETL features are enabled by default:
|
|
54
|
+
* —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
|
|
55
|
+
* You can find more details about version, worker type and other features
|
|
56
|
+
* in Glue's public documentation.
|
|
57
|
+
*/
|
|
58
|
+
export declare class PySparkEtlJob extends Job {
|
|
59
|
+
readonly jobArn: string;
|
|
60
|
+
readonly jobName: string;
|
|
61
|
+
readonly role: iam.IRole;
|
|
62
|
+
readonly grantPrincipal: iam.IPrincipal;
|
|
63
|
+
/**
|
|
64
|
+
* The Spark UI logs location if Spark UI monitoring and debugging is enabled.
|
|
65
|
+
*
|
|
66
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
67
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
68
|
+
*/
|
|
69
|
+
readonly sparkUILoggingLocation?: SparkUILoggingLocation;
|
|
70
|
+
/**
|
|
71
|
+
* PySparkEtlJob constructor
|
|
72
|
+
*/
|
|
73
|
+
constructor(scope: Construct, id: string, props: PySparkEtlJobProps);
|
|
74
|
+
/**
|
|
75
|
+
* Set the executable arguments with best practices enabled by default
|
|
76
|
+
*
|
|
77
|
+
* @returns An array of arguments for Glue to use on execution
|
|
78
|
+
*/
|
|
79
|
+
private executableArguments;
|
|
80
|
+
private setupSparkUI;
|
|
81
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PySparkEtlJob = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
9
|
+
const aws_glue_1 = require("aws-cdk-lib/aws-glue");
|
|
10
|
+
const job_1 = require("./job");
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
const spark_ui_utils_1 = require("./spark-ui-utils");
|
|
13
|
+
/**
|
|
14
|
+
* PySpark ETL Jobs class
|
|
15
|
+
*
|
|
16
|
+
* ETL jobs support pySpark and Scala languages, for which there are separate
|
|
17
|
+
* but similar constructors. ETL jobs default to the G2 worker type, but you
|
|
18
|
+
* can override this default with other supported worker type values
|
|
19
|
+
* (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
|
|
20
|
+
* override to 3.0. The following ETL features are enabled by default:
|
|
21
|
+
* —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
|
|
22
|
+
* You can find more details about version, worker type and other features
|
|
23
|
+
* in Glue's public documentation.
|
|
24
|
+
*/
|
|
25
|
+
class PySparkEtlJob extends job_1.Job {
|
|
26
|
+
/**
|
|
27
|
+
* PySparkEtlJob constructor
|
|
28
|
+
*/
|
|
29
|
+
constructor(scope, id, props) {
|
|
30
|
+
super(scope, id, {
|
|
31
|
+
physicalName: props.jobName,
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PySparkEtlJobProps(props);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
38
|
+
Error.captureStackTrace(error, PySparkEtlJob);
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
// Set up role and permissions for principal
|
|
43
|
+
this.role = props.role, {
|
|
44
|
+
assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
|
|
45
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
|
|
46
|
+
};
|
|
47
|
+
this.grantPrincipal = this.role;
|
|
48
|
+
// Enable SparkUI by default as a best practice
|
|
49
|
+
const sparkUIArgs = props.sparkUI?.bucket ? this.setupSparkUI(this.role, props.sparkUI) : undefined;
|
|
50
|
+
this.sparkUILoggingLocation = sparkUIArgs?.location;
|
|
51
|
+
// Enable CloudWatch metrics and continuous logging by default as a best practice
|
|
52
|
+
const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
|
|
53
|
+
const profilingMetricsArgs = { '--enable-metrics': '' };
|
|
54
|
+
const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
|
|
55
|
+
// Gather executable arguments
|
|
56
|
+
const execuatbleArgs = this.executableArguments(props);
|
|
57
|
+
// Conbine command line arguments into a single line item
|
|
58
|
+
const defaultArguments = {
|
|
59
|
+
...execuatbleArgs,
|
|
60
|
+
...continuousLoggingArgs,
|
|
61
|
+
...profilingMetricsArgs,
|
|
62
|
+
...observabilityMetricsArgs,
|
|
63
|
+
...sparkUIArgs?.args,
|
|
64
|
+
...this.checkNoReservedArgs(props.defaultArguments),
|
|
65
|
+
};
|
|
66
|
+
const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
|
|
67
|
+
name: props.jobName,
|
|
68
|
+
description: props.description,
|
|
69
|
+
role: this.role.roleArn,
|
|
70
|
+
command: {
|
|
71
|
+
name: constants_1.JobType.ETL,
|
|
72
|
+
scriptLocation: this.codeS3ObjectUrl(props.script),
|
|
73
|
+
pythonVersion: constants_1.PythonVersion.THREE,
|
|
74
|
+
},
|
|
75
|
+
glueVersion: props.glueVersion ?? constants_1.GlueVersion.V4_0,
|
|
76
|
+
workerType: props.workerType ?? constants_1.WorkerType.G_1X,
|
|
77
|
+
numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 10,
|
|
78
|
+
maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
|
|
79
|
+
jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
|
|
80
|
+
executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
|
|
81
|
+
timeout: props.timeout?.toMinutes(),
|
|
82
|
+
connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
|
|
83
|
+
securityConfiguration: props.securityConfiguration?.securityConfigurationName,
|
|
84
|
+
tags: props.tags,
|
|
85
|
+
defaultArguments,
|
|
86
|
+
});
|
|
87
|
+
const resourceName = this.getResourceNameAttribute(jobResource.ref);
|
|
88
|
+
this.jobArn = this.buildJobArn(this, resourceName);
|
|
89
|
+
this.jobName = resourceName;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Set the executable arguments with best practices enabled by default
|
|
93
|
+
*
|
|
94
|
+
* @returns An array of arguments for Glue to use on execution
|
|
95
|
+
*/
|
|
96
|
+
executableArguments(props) {
|
|
97
|
+
const args = {};
|
|
98
|
+
args['--job-language'] = constants_1.JobLanguage.PYTHON;
|
|
99
|
+
if (props.extraPythonFiles && props.extraPythonFiles.length > 0) {
|
|
100
|
+
args['--extra-py-files'] = props.extraPythonFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
|
|
101
|
+
}
|
|
102
|
+
if (props.extraFiles && props.extraFiles.length > 0) {
|
|
103
|
+
args['--extra-files'] = props.extraFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
|
|
104
|
+
}
|
|
105
|
+
return args;
|
|
106
|
+
}
|
|
107
|
+
setupSparkUI(role, sparkUiProps) {
|
|
108
|
+
(0, spark_ui_utils_1.validateSparkUiPrefix)(sparkUiProps.prefix);
|
|
109
|
+
const bucket = sparkUiProps.bucket ?? new aws_s3_1.Bucket(this, 'SparkUIBucket', { enforceSSL: true, encryption: aws_s3_1.BucketEncryption.S3_MANAGED });
|
|
110
|
+
bucket.grantReadWrite(role, (0, spark_ui_utils_1.cleanSparkUiPrefixForGrant)(sparkUiProps.prefix));
|
|
111
|
+
const args = {
|
|
112
|
+
'--enable-spark-ui': 'true',
|
|
113
|
+
'--spark-event-logs-path': bucket.s3UrlForObject(sparkUiProps.prefix).replace(/\/?$/, '/'), // path will always end with a slash
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
location: {
|
|
117
|
+
prefix: sparkUiProps.prefix,
|
|
118
|
+
bucket,
|
|
119
|
+
},
|
|
120
|
+
args,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.PySparkEtlJob = PySparkEtlJob;
|
|
125
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
126
|
+
PySparkEtlJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkEtlJob", version: "2.177.0-alpha.0" };
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlzcGFyay1ldGwtam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHlzcGFyay1ldGwtam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJDQUEyQztBQUMzQywrQ0FBOEQ7QUFDOUQsbURBQThDO0FBQzlDLCtCQUEyQztBQUUzQyw0Q0FBNEY7QUFDNUYscURBQTJIO0FBK0MzSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsYUFBYyxTQUFRLFNBQUc7SUFjcEM7O09BRUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQzVCLENBQUMsQ0FBQzs7Ozs7OytDQXBCTSxhQUFhOzs7O1FBc0J0Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN6RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDakcsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQywrQ0FBK0M7UUFDL0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUVwRCxpRkFBaUY7UUFDakYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMs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QyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLG9DQUFvQztTQUNqSSxDQUFDO1FBRUYsT0FBTztZQUNMLFFBQVEsRUFBRTtnQkFDUixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQzNCLE1BQU07YUFDUDtZQUNELElBQUk7U0FDTCxDQUFDO0tBQ0g7O0FBakhILHNDQWtIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEJ1Y2tldCwgQnVja2V0RW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDZm5Kb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgeyBKb2IsIEpvYlByb3BlcnRpZXMgfSBmcm9tICcuL2pvYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEpvYlR5cGUsIEdsdWVWZXJzaW9uLCBKb2JMYW5ndWFnZSwgUHl0aG9uVmVyc2lvbiwgV29ya2VyVHlwZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTcGFya1VJUHJvcHMsIFNwYXJrVUlMb2dnaW5nTG9jYXRpb24sIHZhbGlkYXRlU3BhcmtVaVByZWZpeCwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQgfSBmcm9tICcuL3NwYXJrLXVpLXV0aWxzJztcbmltcG9ydCB7IENvZGUgfSBmcm9tICcuLi9jb2RlJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFB5dGhvbiBTcGFyayBFVEwgam9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHlTcGFya0V0bEpvYlByb3BzIGV4dGVuZHMgSm9iUHJvcGVydGllcyB7XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3Jpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNwYXJrIFVJIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZyBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHNwYXJrVUk/OiBTcGFya1VJUHJvcHM7XG5cbiAgLyoqXG4gICAqIEV4dHJhIFB5dGhvbiBGaWxlcyBTMyBVUkwgKG9wdGlvbmFsKVxuICAgKiBTMyBVUkwgd2hlcmUgYWRkaXRpb25hbCBweXRob24gZGVwZW5kZW5jaWVzIGFyZSBsb2NhdGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhUHl0aG9uRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZmlsZXMsIHN1Y2ggYXMgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IEFXUyBHbHVlIGNvcGllcyB0byB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgeW91ciBzY3JpcHQgYmVmb3JlIGV4ZWN1dGluZyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBmaWxlcyBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBleHRyYUZpbGVzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zIGZvciB0aGlzIGpvYi5cbiAgICogQSB2YWx1ZSBvZiB0cnVlIG1lYW5zIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMuXG4gICAqIElmIGZhbHNlIG9yIG5vdCBwb3B1bGF0ZWQsIHRoZSBqb2IgcnVucyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGZvciBxdWV1ZWluZy5cbiAgICogSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgc2V0IGluIHRoZSBqb2IgcnVuLCB0aGVuIHRoZSB2YWx1ZSBmcm9tXG4gICAqIHRoZSBqb2IgcnVuIGZpZWxkIHdpbGwgYmUgdXNlZC4gVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBmYWxzZSBmb3IgZmxleCBqb2JzLlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGVuYWJsZWQsIG1heFJldHJpZXMgbXVzdCBiZSBzZXQgdG8gemVyby5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGpvYlJ1blF1ZXVpbmdFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQeVNwYXJrIEVUTCBKb2JzIGNsYXNzXG4gKlxuICogRVRMIGpvYnMgc3VwcG9ydCBweVNwYXJrIGFuZCBTY2FsYSBsYW5ndWFnZXMsIGZvciB3aGljaCB0aGVyZSBhcmUgc2VwYXJhdGVcbiAqIGJ1dCBzaW1pbGFyIGNvbnN0cnVjdG9ycy4gRVRMIGpvYnMgZGVmYXVsdCB0byB0aGUgRzIgd29ya2VyIHR5cGUsIGJ1dCB5b3VcbiAqIGNhbiBvdmVycmlkZSB0aGlzIGRlZmF1bHQgd2l0aCBvdGhlciBzdXBwb3J0ZWQgd29ya2VyIHR5cGUgdmFsdWVzXG4gKiAoRzEsIEcyLCBHNCBhbmQgRzgpLiBFVEwgam9icyBkZWZhdWx0cyB0byBHbHVlIHZlcnNpb24gNC4wLCB3aGljaCB5b3UgY2FuXG4gKiBvdmVycmlkZSB0byAzLjAuIFRoZSBmb2xsb3dpbmcgRVRMIGZlYXR1cmVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQ6XG4gKiDigJRlbmFibGUtbWV0cmljcywg4oCUZW5hYmxlLXNwYXJrLXVpLCDigJRlbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZy5cbiAqIFlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMgYWJvdXQgdmVyc2lvbiwgd29ya2VyIHR5cGUgYW5kIG90aGVyIGZlYXR1cmVzXG4gKiBpbiBHbHVlJ3MgcHVibGljIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQeVNwYXJrRXRsSm9iIGV4dGVuZHMgSm9iIHtcbiAgcHVibGljIHJlYWRvbmx5IGpvYkFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgU3BhcmsgVUkgbG9ncyBsb2NhdGlvbiBpZiBTcGFyayBVSSBtb25pdG9yaW5nIGFuZCBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcGFya1VJTG9nZ2luZ0xvY2F0aW9uPzogU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbjtcblxuICAvKipcbiAgICogUHlTcGFya0V0bEpvYiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB5U3BhcmtFdGxKb2JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIFNwYXJrVUkgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBzcGFya1VJQXJncyA9IHByb3BzLnNwYXJrVUk/LmJ1Y2tldCA/IHRoaXMuc2V0dXBTcGFya1VJKHRoaXMucm9sZSwgcHJvcHMuc3BhcmtVSSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID0gc3BhcmtVSUFyZ3M/LmxvY2F0aW9uO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBHYXRoZXIgZXhlY3V0YWJsZSBhcmd1bWVudHNcbiAgICBjb25zdCBleGVjdWF0YmxlQXJncyA9IHRoaXMuZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wcyk7XG5cbiAgICAvLyBDb25iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4uZXhlY3VhdGJsZUFyZ3MsXG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnNwYXJrVUlBcmdzPy5hcmdzLFxuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgIH07XG5cbiAgICBjb25zdCBqb2JSZXNvdXJjZSA9IG5ldyBDZm5Kb2IodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogcHJvcHMuam9iTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGU6IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBKb2JUeXBlLkVUTCxcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IHRoaXMuY29kZVMzT2JqZWN0VXJsKHByb3BzLnNjcmlwdCksXG4gICAgICAgIHB5dGhvblZlcnNpb246IFB5dGhvblZlcnNpb24uVEhSRUUsXG4gICAgICB9LFxuICAgICAgZ2x1ZVZlcnNpb246IHByb3BzLmdsdWVWZXJzaW9uID8/IEdsdWVWZXJzaW9uLlY0XzAsXG4gICAgICB3b3JrZXJUeXBlOiBwcm9wcy53b3JrZXJUeXBlID8/IFdvcmtlclR5cGUuR18xWCxcbiAgICAgIG51bWJlck9mV29ya2VyczogcHJvcHMubnVtYmVyT2ZXb3JrZXJzID8gcHJvcHMubnVtYmVyT2ZXb3JrZXJzIDogMTAsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IDAgOiBwcm9wcy5tYXhSZXRyaWVzLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyA/IHsgbWF4Q29uY3VycmVudFJ1bnM6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShqb2JSZXNvdXJjZS5yZWYpO1xuICAgIHRoaXMuam9iQXJuID0gdGhpcy5idWlsZEpvYkFybih0aGlzLCByZXNvdXJjZU5hbWUpO1xuICAgIHRoaXMuam9iTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnRzIHdpdGggYmVzdCBwcmFjdGljZXMgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgR2x1ZSB0byB1c2Ugb24gZXhlY3V0aW9uXG4gICAqL1xuICBwcml2YXRlIGV4ZWN1dGFibGVBcmd1bWVudHMocHJvcHM6IFB5U3BhcmtFdGxKb2JQcm9wcykge1xuICAgIGNvbnN0IGFyZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBhcmdzWyctLWpvYi1sYW5ndWFnZSddID0gSm9iTGFuZ3VhZ2UuUFlUSE9OO1xuXG4gICAgaWYgKHByb3BzLmV4dHJhUHl0aG9uRmlsZXMgJiYgcHJvcHMuZXh0cmFQeXRob25GaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBwcm9wcy5leHRyYVB5dGhvbkZpbGVzLm1hcChjb2RlID0+IHRoaXMuY29kZVMzT2JqZWN0VXJsKGNvZGUpKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5leHRyYUZpbGVzICYmIHByb3BzLmV4dHJhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXJnc1snLS1leHRyYS1maWxlcyddID0gcHJvcHMuZXh0cmFGaWxlcy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNwYXJrVUkocm9sZTogaWFtLklSb2xlLCBzcGFya1VpUHJvcHM6IFNwYXJrVUlQcm9wcykge1xuICAgIHZhbGlkYXRlU3BhcmtVaVByZWZpeChzcGFya1VpUHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBzcGFya1VpUHJvcHMuYnVja2V0ID8/IG5ldyBCdWNrZXQodGhpcywgJ1NwYXJrVUlCdWNrZXQnLCB7IGVuZm9yY2VTU0w6IHRydWUsIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCB9KTtcbiAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUocm9sZSwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQoc3BhcmtVaVByb3BzLnByZWZpeCkpO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnLS1lbmFibGUtc3BhcmstdWknOiAndHJ1ZScsXG4gICAgICAnLS1zcGFyay1ldmVudC1sb2dzLXBhdGgnOiBidWNrZXQuczNVcmxGb3JPYmplY3Qoc3BhcmtVaVByb3BzLnByZWZpeCkucmVwbGFjZSgvXFwvPyQvLCAnLycpLCAvLyBwYXRoIHdpbGwgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHByZWZpeDogc3BhcmtVaVByb3BzLnByZWZpeCxcbiAgICAgICAgYnVja2V0LFxuICAgICAgfSxcbiAgICAgIGFyZ3MsXG4gICAgfTtcbiAgfVxufVxuIl19
|