@cdklabs/multi-az-observability 0.0.1-alpha.5 → 0.0.1-alpha.7
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 +77 -26
- package/API.md +48 -0
- package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
- package/lib/basic_observability/BasicServiceDashboard.js +4 -1
- package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +6 -0
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +97 -55
- package/lib/basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.d.ts +18 -0
- package/lib/basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.js +23 -0
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +6 -0
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
- package/lib/canaries/CanaryFunction.js +7 -6
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -2
- package/lib/metrics/ApplicationLoadBalancerMetrics.js +4 -4
- package/lib/monitoring/src/monitoring-layer.zip +0 -0
- package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
- package/lib/outlier-detection/src/outlier-detection.zip +0 -0
- package/lib/outlier-detection/src/scipy-layer.zip +0 -0
- package/lib/services/CanaryMetrics.js +1 -1
- package/lib/services/CanaryTestMetricsOverride.js +1 -1
- package/lib/services/ContributorInsightRuleDetails.js +1 -1
- package/lib/services/InstrumentedServiceMultiAZObservability.js +1 -1
- package/lib/services/Operation.js +1 -1
- package/lib/services/OperationMetricDetails.js +1 -1
- package/lib/services/Service.js +1 -1
- package/lib/services/ServiceMetricDetails.js +1 -1
- package/lib/services/props/MetricDimensions.js +1 -1
- package/lib/utilities/MetricsHelper.d.ts +2 -0
- package/lib/utilities/MetricsHelper.js +3 -1
- package/package.json +3 -3
|
@@ -13,6 +13,7 @@ const BasicServiceDashboard_1 = require("./BasicServiceDashboard");
|
|
|
13
13
|
const ApplicationLoadBalancerMetrics_1 = require("../metrics/ApplicationLoadBalancerMetrics");
|
|
14
14
|
const AvailabilityMetricType_1 = require("../utilities/AvailabilityMetricType");
|
|
15
15
|
const MetricsHelper_1 = require("../utilities/MetricsHelper");
|
|
16
|
+
const ApplicationLoadBalancerLatencyOutlierCalculation_1 = require("./props/ApplicationLoadBalancerLatencyOutlierCalculation");
|
|
16
17
|
/**
|
|
17
18
|
* Basic observability for a service using metrics from
|
|
18
19
|
* ALBs and NAT Gateways
|
|
@@ -39,18 +40,17 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
39
40
|
}
|
|
40
41
|
// Look through all of the per AZ ALB alarms, if there's also a NAT GW alarm
|
|
41
42
|
// create a composite alarm if either of them trigger
|
|
42
|
-
Object.keys(this.albZonalIsolatedImpactAlarms).forEach((
|
|
43
|
-
let azLetter = az.substring(az.length - 1);
|
|
43
|
+
Object.keys(this.albZonalIsolatedImpactAlarms).forEach((azLetter) => {
|
|
44
44
|
let availabilityZoneId = this._azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
45
|
-
if (
|
|
46
|
-
this.aggregateZonalIsolatedImpactAlarms[
|
|
47
|
-
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.albZonalIsolatedImpactAlarms[
|
|
45
|
+
if (azLetter in this.natGWZonalIsolatedImpactAlarms) {
|
|
46
|
+
this.aggregateZonalIsolatedImpactAlarms[azLetter] = new aws_cloudwatch_1.CompositeAlarm(this, azLetter + "-isolated-impact-alarm", {
|
|
47
|
+
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.albZonalIsolatedImpactAlarms[azLetter], this.natGWZonalIsolatedImpactAlarms[azLetter]),
|
|
48
48
|
compositeAlarmName: availabilityZoneId + "-isolated-impact-alarm"
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
52
|
-
this.aggregateZonalIsolatedImpactAlarms[
|
|
53
|
-
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.albZonalIsolatedImpactAlarms[
|
|
52
|
+
this.aggregateZonalIsolatedImpactAlarms[azLetter] = new aws_cloudwatch_1.CompositeAlarm(this, azLetter + "-isolated-impact-alarm", {
|
|
53
|
+
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.albZonalIsolatedImpactAlarms[azLetter]),
|
|
54
54
|
compositeAlarmName: availabilityZoneId + "-isolated-impact-alarm"
|
|
55
55
|
});
|
|
56
56
|
}
|
|
@@ -58,12 +58,11 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
58
58
|
// Look through all of the per AZ NAT GW alarms. If there's an AZ we haven't seen in the ALB
|
|
59
59
|
// alarms yet, then it will just be a NAT GW alarm that we'll turn into the same kind of
|
|
60
60
|
// composite alarm
|
|
61
|
-
Object.keys(this.natGWZonalIsolatedImpactAlarms).forEach((
|
|
62
|
-
if (!(
|
|
63
|
-
let azLetter = az.substring(az.length - 1);
|
|
61
|
+
Object.keys(this.natGWZonalIsolatedImpactAlarms).forEach((azLetter) => {
|
|
62
|
+
if (!(azLetter in this.aggregateZonalIsolatedImpactAlarms)) {
|
|
64
63
|
let availabilityZoneId = this._azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
65
|
-
this.aggregateZonalIsolatedImpactAlarms[
|
|
66
|
-
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.natGWZonalIsolatedImpactAlarms[
|
|
64
|
+
this.aggregateZonalIsolatedImpactAlarms[azLetter] = new aws_cloudwatch_1.CompositeAlarm(this, azLetter + "-isolated-impact-alarm", {
|
|
65
|
+
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(this.natGWZonalIsolatedImpactAlarms[azLetter]),
|
|
67
66
|
compositeAlarmName: availabilityZoneId + "-isolated-impact-alarm"
|
|
68
67
|
});
|
|
69
68
|
}
|
|
@@ -156,42 +155,85 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
156
155
|
treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
|
|
157
156
|
});
|
|
158
157
|
}
|
|
159
|
-
static isAZAnOutlierForLatencyAlb(scope, alb, availabilityZoneId, availabilityZone, statistic, period, evaluationPeriods, datapointsToAlarm, keyprefix) {
|
|
158
|
+
static isAZAnOutlierForLatencyAlb(scope, alb, algorithm, availabilityZoneId, availabilityZone, statistic, threshold, period, evaluationPeriods, datapointsToAlarm, keyprefix) {
|
|
160
159
|
let usingMetrics = {};
|
|
161
160
|
let azMetricId = "";
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
alb
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
161
|
+
switch (algorithm) {
|
|
162
|
+
case ApplicationLoadBalancerLatencyOutlierCalculation_1.ApplicationLoadBalancerLatencyOutlierCalculation.Z_SCORE:
|
|
163
|
+
default:
|
|
164
|
+
alb.vpc.availabilityZones.forEach((az, index) => {
|
|
165
|
+
// Target response time
|
|
166
|
+
let targetResponseTime = ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.getPerAZLatencyMetric({
|
|
167
|
+
alb: alb,
|
|
168
|
+
availabilityZone: az,
|
|
169
|
+
label: az + "-target-response-time",
|
|
170
|
+
statistic: statistic,
|
|
171
|
+
period: period
|
|
172
|
+
});
|
|
173
|
+
if (az == availabilityZone) {
|
|
174
|
+
azMetricId = `a${index}`;
|
|
175
|
+
usingMetrics[`a${index}`] = targetResponseTime;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
usingMetrics[`b${index}`] = targetResponseTime;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return new aws_cloudwatch_1.Alarm(scope, keyprefix + "-latency-outlier-alarm", {
|
|
182
|
+
alarmName: availabilityZoneId + '-' + alb.loadBalancerArn + '-latency-impact-outlier',
|
|
183
|
+
actionsEnabled: false,
|
|
184
|
+
metric: new aws_cloudwatch_1.MathExpression({
|
|
185
|
+
expression: `(${azMetricId} - AVG(METRICS("b"))) / AVG(STDDEV(METRICS("b")))`,
|
|
186
|
+
usingMetrics: usingMetrics,
|
|
187
|
+
label: availabilityZoneId + '-' + alb.loadBalancerArn + '-latency-z-score',
|
|
188
|
+
period: period,
|
|
189
|
+
}),
|
|
190
|
+
evaluationPeriods: evaluationPeriods,
|
|
191
|
+
datapointsToAlarm: datapointsToAlarm,
|
|
192
|
+
threshold: threshold,
|
|
193
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
194
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
|
|
195
|
+
});
|
|
196
|
+
case ApplicationLoadBalancerLatencyOutlierCalculation_1.ApplicationLoadBalancerLatencyOutlierCalculation.STATIC:
|
|
197
|
+
alb.vpc.availabilityZones.forEach((az, index) => {
|
|
198
|
+
// Target response time
|
|
199
|
+
let targetResponseTime = ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.getPerAZLatencyMetric({
|
|
200
|
+
alb: alb,
|
|
201
|
+
availabilityZone: az,
|
|
202
|
+
label: az + "-target-response-time",
|
|
203
|
+
statistic: `TC(${threshold}:)`,
|
|
204
|
+
period: period
|
|
205
|
+
});
|
|
206
|
+
if (az == availabilityZone) {
|
|
207
|
+
azMetricId = `a${index}`;
|
|
208
|
+
usingMetrics[`a${index}`] = targetResponseTime;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
usingMetrics[`b${index}`] = targetResponseTime;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return new aws_cloudwatch_1.Alarm(scope, keyprefix + "-latency-outlier-alarm", {
|
|
215
|
+
alarmName: availabilityZoneId + '-' + alb.loadBalancerArn + '-latency-impact-outlier',
|
|
216
|
+
actionsEnabled: false,
|
|
217
|
+
metric: new aws_cloudwatch_1.MathExpression({
|
|
218
|
+
expression: `${azMetricId}/(${Object.keys(usingMetrics).join("+")})`,
|
|
219
|
+
usingMetrics: usingMetrics,
|
|
220
|
+
label: availabilityZoneId + '-' + alb.loadBalancerArn + '-latency-static',
|
|
221
|
+
period: period,
|
|
222
|
+
}),
|
|
223
|
+
evaluationPeriods: evaluationPeriods,
|
|
224
|
+
datapointsToAlarm: datapointsToAlarm,
|
|
225
|
+
threshold: .66,
|
|
226
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
227
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.IGNORE
|
|
228
|
+
});
|
|
229
|
+
}
|
|
194
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
*
|
|
233
|
+
* @param props
|
|
234
|
+
* @returns A composite alarm per AZ to indicate isolated zonal impact. The dictionary
|
|
235
|
+
* is keyed by the az letter, like "a", "b", "c".
|
|
236
|
+
*/
|
|
195
237
|
doAlbMetrics(props) {
|
|
196
238
|
// Create impact alarms per AZ, with each ALB providing
|
|
197
239
|
// an alarm for its AZs
|
|
@@ -215,9 +257,9 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
215
257
|
// Is the AZ an outlier for faults
|
|
216
258
|
let availabilityOutlier = BasicServiceMultiAZObservability.isAZAnOutlierForAvailabilityAlb(this, alb, availabilityZoneId, az, props.faultCountPercentageThreshold ? props.faultCountPercentageThreshold : 0.05, keyPrefix, props.period ? props.period : aws_cdk_lib_1.Duration.minutes(1), props.evaluationPeriods, props.datapointsToAlarm);
|
|
217
259
|
// Is the AZ an outlier for latency
|
|
218
|
-
let latencyOutlier = BasicServiceMultiAZObservability.isAZAnOutlierForLatencyAlb(this, alb, availabilityZoneId, az, props.latencyStatistic, props.period ? props.period : aws_cdk_lib_1.Duration.minutes(1), props.evaluationPeriods, props.datapointsToAlarm, azLetter);
|
|
260
|
+
let latencyOutlier = BasicServiceMultiAZObservability.isAZAnOutlierForLatencyAlb(this, alb, props.latencyOutlierCalculation ? props.latencyOutlierCalculation : ApplicationLoadBalancerLatencyOutlierCalculation_1.ApplicationLoadBalancerLatencyOutlierCalculation.Z_SCORE, availabilityZoneId, az, props.latencyStatistic, props.latencyOutlierCalculation == ApplicationLoadBalancerLatencyOutlierCalculation_1.ApplicationLoadBalancerLatencyOutlierCalculation.Z_SCORE ? 3 : props.latencyThreshold, props.period ? props.period : aws_cdk_lib_1.Duration.minutes(1), props.evaluationPeriods, props.datapointsToAlarm, azLetter);
|
|
219
261
|
// Alarm if the AZ shows impact and is an outlier
|
|
220
|
-
let azImpactAlarm = new aws_cloudwatch_1.CompositeAlarm(this,
|
|
262
|
+
let azImpactAlarm = new aws_cloudwatch_1.CompositeAlarm(this, azLetter + "-composite-impact-alarm", {
|
|
221
263
|
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(aws_cloudwatch_1.AlarmRule.allOf(availabilityImpact, availabilityOutlier), aws_cloudwatch_1.AlarmRule.allOf(latencyImpact, latencyOutlier)),
|
|
222
264
|
compositeAlarmName: availabilityZoneId + "-" +
|
|
223
265
|
alb.loadBalancerName +
|
|
@@ -236,7 +278,7 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
236
278
|
Object.keys(perAZImpactAlarms).forEach((az) => {
|
|
237
279
|
let azLetter = az.substring(az.length - 1);
|
|
238
280
|
let availabilityZoneId = this._azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
239
|
-
azCompositeAlarms[
|
|
281
|
+
azCompositeAlarms[azLetter] = new aws_cloudwatch_1.CompositeAlarm(this, azLetter + "-alb-impact-composite-alarm", {
|
|
240
282
|
alarmRule: aws_cloudwatch_1.AlarmRule.anyOf(...perAZImpactAlarms[az]),
|
|
241
283
|
compositeAlarmName: availabilityZoneId + "-alb-impact-composite-alarm"
|
|
242
284
|
});
|
|
@@ -379,7 +421,7 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
379
421
|
let packetLossImpact = BasicServiceMultiAZObservability.isThereAnAZPacketLossImpactNATGW(this, this.natGateways[az], availabilityZoneId, az, props.packetLossImpactPercentageThreshold ? props.packetLossImpactPercentageThreshold : 0.01, props.period ? props.period : aws_cdk_lib_1.Duration.minutes(1), props.evaluationPeriods, props.datapointsToAlarm);
|
|
380
422
|
// Is this AZ an outlier for this NATGW?
|
|
381
423
|
let packetLossOutlier = BasicServiceMultiAZObservability.isAZAnOutlierForPacketLossNATGW(this, this.natGateways, availabilityZoneId, az, 0.66, props.period ? props.period : aws_cdk_lib_1.Duration.minutes(1), props.evaluationPeriods, props.datapointsToAlarm);
|
|
382
|
-
packetLossPerAZAlarms[
|
|
424
|
+
packetLossPerAZAlarms[azLetter] = new aws_cloudwatch_1.CompositeAlarm(this, az.substring(az.length - 1) + "-packet-loss-composite-alarm", {
|
|
383
425
|
alarmRule: aws_cloudwatch_1.AlarmRule.allOf(packetLossImpact, packetLossOutlier),
|
|
384
426
|
compositeAlarmName: availabilityZoneId + "-packet-loss-composite-alarm"
|
|
385
427
|
});
|
|
@@ -393,11 +435,11 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
393
435
|
Object.keys(natgws).forEach((availabilityZone) => {
|
|
394
436
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
395
437
|
let availabilityZoneId = this._azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
396
|
-
if (!(
|
|
397
|
-
metricsPerAZ[
|
|
438
|
+
if (!(azLetter in metricsPerAZ)) {
|
|
439
|
+
metricsPerAZ[azLetter] = [];
|
|
398
440
|
}
|
|
399
441
|
natgws[availabilityZone].forEach((natgw) => {
|
|
400
|
-
metricsPerAZ[
|
|
442
|
+
metricsPerAZ[azLetter].push(new aws_cloudwatch_1.Metric({
|
|
401
443
|
metricName: 'PacketsDropCount',
|
|
402
444
|
namespace: 'AWS/NATGateway',
|
|
403
445
|
statistic: aws_cloudwatch_1.Stats.SUM,
|
|
@@ -414,7 +456,7 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
414
456
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
415
457
|
let availabilityZoneId = this._azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
416
458
|
let usingMetrics = {};
|
|
417
|
-
metricsPerAZ[
|
|
459
|
+
metricsPerAZ[azLetter].forEach((metric) => {
|
|
418
460
|
usingMetrics[`${keyprefix}1`] = metric;
|
|
419
461
|
keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
|
|
420
462
|
});
|
|
@@ -430,5 +472,5 @@ class BasicServiceMultiAZObservability extends constructs_1.Construct {
|
|
|
430
472
|
}
|
|
431
473
|
exports.BasicServiceMultiAZObservability = BasicServiceMultiAZObservability;
|
|
432
474
|
_a = JSII_RTTI_SYMBOL_1;
|
|
433
|
-
BasicServiceMultiAZObservability[_a] = { fqn: "@cdklabs/multi-az-observability.BasicServiceMultiAZObservability", version: "0.0.1-alpha.
|
|
434
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzaWNfb2JzZXJ2YWJpbGl0eS9CYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkNBQXVDO0FBQ3ZDLCtEQWFvQztBQU9wQywyQ0FBbUQ7QUFHbkQsK0VBQTRFO0FBRTVFLG1FQUFnRTtBQUNoRSw4RkFBMkY7QUFDM0YsZ0ZBQTZFO0FBQzdFLDhEQUEyRDtBQUUzRDs7O0dBR0c7QUFDSCxNQUFhLGdDQUNYLFNBQVEsc0JBQVM7SUE4Q2pCLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQTRDO1FBRTVDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLHdCQUF3QixDQUFDO1FBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUVyQyxJQUFJLENBQUMsa0NBQWtDLEdBQUcsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLDhCQUE4QixHQUFHLEVBQUUsQ0FBQztRQUV6Qyw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLCtDQUFzQixDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBRTlFLHVDQUF1QztRQUN2QyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FB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QUFDLENBQUM7WUFFSCxZQUFZLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLCtCQUFjLENBQUM7Z0JBQ2xELFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9DLFlBQVksRUFBRSxZQUFZO2dCQUMxQixLQUFLLEVBQUUsa0JBQWtCLEdBQUcscUJBQXFCO2dCQUNqRCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7QUF6dEJILDRFQTB0QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQWxhcm0sXG4gIEFsYXJtUnVsZSxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBDb21wb3NpdGVBbGFybSxcbiAgRGFzaGJvYXJkLFxuICBJQWxhcm0sXG4gIElNZXRyaWMsXG4gIE1hdGhFeHByZXNzaW9uLFxuICBNZXRyaWMsXG4gIFN0YXRzLFxuICBUcmVhdE1pc3NpbmdEYXRhLFxuICBVbml0LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDZm5OYXRHYXRld2F5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQge1xuICBCYXNlTG9hZEJhbGFuY2VyLFxuICBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gIElMb2FkQmFsYW5jZXJWMixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkgfSBmcm9tICcuL0lCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eSc7XG5pbXBvcnQgeyBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzIH0gZnJvbSAnLi9wcm9wcy9CYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcbmltcG9ydCB7IElBdmFpbGFiaWxpdHlab25lTWFwcGVyIH0gZnJvbSAnLi4vYXptYXBwZXIvSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXInO1xuaW1wb3J0IHsgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkIH0gZnJvbSAnLi9CYXNpY1NlcnZpY2VEYXNoYm9hcmQnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9BcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9BdmFpbGFiaWxpdHlNZXRyaWNUeXBlJztcbmltcG9ydCB7IE1ldHJpY3NIZWxwZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvTWV0cmljc0hlbHBlcic7XG5cbi8qKlxuICogQmFzaWMgb2JzZXJ2YWJpbGl0eSBmb3IgYSBzZXJ2aWNlIHVzaW5nIG1ldHJpY3MgZnJvbVxuICogQUxCcyBhbmQgTkFUIEdhdGV3YXlzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgTkFUIEdhdGV3YXlzIGJlaW5nIHVzZWQgaW4gdGhlIHNlcnZpY2UsIGVhY2ggc2V0IG9mIE5BVCBHYXRld2F5c1xuICAgKiBhcmUga2V5ZWQgYnkgdGhlaXIgQXZhaWxhYmlsaXR5IFpvbmUgSWRcbiAgICovXG4gIG5hdEdhdGV3YXlzPzogeyBba2V5OiBzdHJpbmddOiBDZm5OYXRHYXRld2F5W10gfTtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXJzIGJlaW5nIHVzZWQgYnkgdGhlIHNlcnZpY2VcbiAgICovXG4gIGFwcGxpY2F0aW9uTG9hZEJhbGFuY2Vycz86IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZVxuICAgKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyBpbmRpY2F0aW5nIGlmIGFuIEFaIGlzIGFuIG91dGxpZXIgZm9yIE5BVCBHV1xuICAgKiBwYWNrZXQgbG9zcyBhbmQgaGFzIGlzb2xhdGVkIGltcGFjdFxuICAgKi9cbiAgbmF0R1dab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zPzogeyBba2V5OiBzdHJpbmddOiBJQWxhcm0gfTtcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyBpbmRpY2F0aW5nIGlmIGFuIEFaIGlzIGFuIG91dGxpZXIgZm9yIEFMQlxuICAgKiBmYXVsdHMgYW5kIGhhcyBpc29sYXRlZCBpbXBhY3RcbiAgICovXG4gIGFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXM/OiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYWxhcm1zIGluZGljYXRpbmcgaWYgYW4gQVogaGFzIGlzb2xhdGVkIGltcGFjdFxuICAgKiBmcm9tIGVpdGhlciBBTEIgb3IgTkFUIEdXIG1ldHJpY3NcbiAgICovXG4gIGFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXM6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH07XG5cbiAgLyoqXG4gICAqIFRoZSBkYXNoYm9hcmQgdGhhdCBpcyBvcHRpb25hbGx5IGNyZWF0ZWRcbiAgICovXG4gIGRhc2hib2FyZD86IERhc2hib2FyZDtcblxuICAvKipcbiAgICogVGhlIEFaIG1hcHBlciByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBfYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHlQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEluaXRpYWxpemUgY2xhc3MgcHJvcGVydGllc1xuICAgIHRoaXMuc2VydmljZU5hbWUgPSBwcm9wcy5zZXJ2aWNlTmFtZTtcbiAgICB0aGlzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycyA9IHByb3BzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycztcbiAgICB0aGlzLm5hdEdhdGV3YXlzID0gcHJvcHMubmF0R2F0ZXdheXM7XG5cbiAgICB0aGlzLmFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB7fTtcbiAgICB0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB7fTtcbiAgICB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyA9IHt9O1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBBWiBtYXBwZXIgcmVzb3VyY2UgdG8gdHJhbnNsYXRlIEFaIG5hbWVzIHRvIGlkc1xuICAgIHRoaXMuX2F6TWFwcGVyID0gbmV3IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIodGhpcywgJ2F2YWlsYWJpbGl0eS16b25lLW1hcHBlcicpO1xuXG4gICAgLy8gQ3JlYXRlIEFMQiBtZXRyaWNzIGFuZCBhbGFybXMgcGVyIEFaXG4gICAgaWYgKHRoaXMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXJzKSB7XG4gICAgICB0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB0aGlzLmRvQWxiTWV0cmljcyhwcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE5BVCBHYXRld2F5IG1ldHJpY3MgYW5kIGFsYXJtcyBwZXIgQVpcbiAgICBpZiAodGhpcy5uYXRHYXRld2F5cykge1xuICAgICAgdGhpcy5uYXRHV1pvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB0aGlzLmRvTmF0R2F0ZXdheU1ldHJpY3MocHJvcHMpO1xuICAgIH1cblxuICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgb2YgdGhlIHBlciBBWiBBTEIgYWxhcm1zLCBpZiB0aGVyZSdzIGFsc28gYSBOQVQgR1cgYWxhcm1cbiAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgYWxhcm0gaWYgZWl0aGVyIG9mIHRoZW0gdHJpZ2dlclxuICAgIE9iamVjdC5rZXlzKHRoaXMuYWxiWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcykuZm9yRWFjaCgoYXo6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGF6TGV0dGVyID0gYXouc3Vic3RyaW5nKGF6Lmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IHRoaXMuX2F6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgIGlmIChheiBpbiB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyEpIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zW2F6XSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLCBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSkgKyBcIi1pc29sYXRlZC1pbXBhY3QtYWxhcm1cIiwge1xuICAgICAgICAgIGFsYXJtUnVsZTogQWxhcm1SdWxlLmFueU9mKHRoaXMuYWxiWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyFbYXpdLCB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyFbYXpdKSxcbiAgICAgICAgICBjb21wb3NpdGVBbGFybU5hbWU6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiLWlzb2xhdGVkLWltcGFjdC1hbGFybVwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuYWdncmVnYXRlWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtc1thel0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcywgYXouc3Vic3RyaW5nKGF6Lmxlbmd0aCAtIDEpICsgXCItaXNvbGF0ZWQtaW1wYWN0LWFsYXJtXCIsIHtcbiAgICAgICAgICBhbGFybVJ1bGU6IEFsYXJtUnVsZS5hbnlPZih0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMhW2F6XSksXG4gICAgICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1pc29sYXRlZC1pbXBhY3QtYWxhcm1cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgb2YgdGhlIHBlciBBWiBOQVQgR1cgYWxhcm1zLiBJZiB0aGVyZSdzIGFuIEFaIHdlIGhhdmVuJ3Qgc2VlbiBpbiB0aGUgQUxCXG4gICAgLy8gYWxhcm1zIHlldCwgdGhlbiBpdCB3aWxsIGp1c3QgYmUgYSBOQVQgR1cgYWxhcm0gdGhhdCB3ZSdsbCB0dXJuIGludG8gdGhlIHNhbWUga2luZCBvZlxuICAgIC8vIGNvbXBvc2l0ZSBhbGFybVxuICAgIE9iamVjdC5rZXlzKHRoaXMubmF0R1dab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zKS5mb3JFYWNoKChhejogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIShheiBpbiB0aGlzLmFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMpKSB7XG4gICAgICAgIGxldCBhekxldHRlciA9IGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKTtcbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IHRoaXMuX2F6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICB0aGlzLmFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXNbYXpdID0gbmV3IENvbXBvc2l0ZUFsYXJtKHRoaXMsIGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKSArIFwiLWlzb2xhdGVkLWltcGFjdC1hbGFybVwiLCB7XG4gICAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYW55T2YodGhpcy5uYXRHV1pvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMhW2F6XSksXG4gICAgICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1pc29sYXRlZC1pbXBhY3QtYWxhcm1cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBTaG91bGQgd2UgY3JlYXRlIHRoZSBkYXNoYm9hcmRcbiAgICBpZiAocHJvcHMuY3JlYXRlRGFzaGJvYXJkID09IHRydWUpIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkID0gbmV3IEJhc2ljU2VydmljZURhc2hib2FyZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ0Jhc2ljU2VydmljZURhc2hib2FyZCcsXG4gICAgICAgIHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICB6b25hbEFnZ3JlZ2F0ZUlzb2xhdGVkSW1wYWN0QWxhcm1zOlxuICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zLFxuICAgICAgICAgIHpvbmFsTG9hZEJhbGFuY2VySXNvbGF0ZWRJbXBhY3RBbGFybXM6XG4gICAgICAgICAgICB0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMsXG4gICAgICAgICAgem9uYWxOYXRHYXRld2F5SXNvbGF0ZWRJbXBhY3RBbGFybXM6XG4gICAgICAgICAgICB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICAgICAgem9uYWxMb2FkQmFsYW5jZXJGYXVsdFJhdGVNZXRyaWNzOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0VG90YWxBbGJGYXVsdENvdW50UGVyWm9uZShcbiAgICAgICAgICAgIHByb3BzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycyA/IHByb3BzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycyA6IFtdLCBcbiAgICAgICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICB0aGlzLl9hek1hcHBlclxuICAgICAgICAgICksXG4gICAgICAgICAgem9uYWxOYXRHYXRld2F5UGFja2V0RHJvcE1ldHJpY3M6IHRoaXMuZ2V0VG90YWxQYWNrZXREcm9wc1BlclpvbmUoXG4gICAgICAgICAgICBwcm9wcy5uYXRHYXRld2F5cyA/IHByb3BzLm5hdEdhdGV3YXlzIDoge30sXG4gICAgICAgICAgICBwcm9wcy5wZXJpb2QgPyBwcm9wcy5wZXJpb2QgOiBEdXJhdGlvbi5taW51dGVzKDEpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhek1hcHBlcjogdGhpcy5fYXpNYXBwZXIsXG4gICAgICAgIH0sXG4gICAgICApLmRhc2hib2FyZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1RoZXJlQW5BWkF2YWlsYWJpbGl0eUltcGFjdEFsYihcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBhbGI6IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciwgXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIGtleXByZWZpeDogc3RyaW5nLFxuICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyXG4gICkgOiBJQWxhcm0ge1xuICAgXG4gICAgLy8gQ3JlYXRlIGEgZmF1bHQgcmF0ZSBhbGFybSBmb3IgdGhlIEFMQiBpbiB0aGUgc3BlY2lmaWVkIEFaXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLFxuICAgICAga2V5cHJlZml4ICsgJy1mYXVsdC1yYXRlLWFsYXJtJyxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICctJyArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyAnLWZhdWx0LXJhdGUnLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG1ldHJpYzogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmdldFBlckFaQXZhaWxhYmlsaXR5TWV0cmljKGFsYiwge1xuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1mYXVsdC1yYXRlJyxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfUkFURVxuICAgICAgICB9KSxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1RoZXJlQVpMYXRlbmN5SW1wYWN0QWxiKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIGFsYjogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLCBcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgc3RhdGlzdGljOiBzdHJpbmcsXG4gICAga2V5cHJlZml4OiBzdHJpbmcsXG4gICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXJcbiAgKTogSUFsYXJtIHtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBmYXVsdCByYXRlIGFsYXJtIGZvciB0aGUgQUxCIGluIHRoZSBzcGVjaWZpZWQgQVpcbiAgICByZXR1cm4gbmV3IEFsYXJtKFxuICAgICAgc2NvcGUsXG4gICAgICBrZXlwcmVmaXggKyAnLWxhdGVuY3ktYWxhcm0nLFxuICAgICAge1xuICAgICAgICBhbGFybU5hbWU6XG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkICsgJy0nICsgYWxiLmxvYWRCYWxhbmNlckFybiArICctbGF0ZW5jeScsXG4gICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbWV0cmljOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UGVyQVpMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICBhbGI6IGFsYixcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1cIiArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyBcIi10YXJnZXQtbGF0ZW5jeVwiLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljXG4gICAgICAgIH0pLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGEuSUdOT1JFXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQVpBbk91dGxpZXJGb3JBdmFpbGFiaWxpdHlBbGIoXG4gICAgc2NvcGU6IElDb25zdHJ1Y3QsXG4gICAgYWxiOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsIFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICBrZXlwcmVmaXg6IHN0cmluZyxcbiAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgZGF0YXBvaW50c1RvQWxhcm06IG51bWJlclxuICApIDogSUFsYXJtIHtcblxuICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgbGV0IGF6TWV0cmljSWQ6IHN0cmluZyA9IFwiXCI7XG5cbiAgICBhbGIudnBjIS5hdmFpbGFiaWxpdHlab25lcy5mb3JFYWNoKChhejogc3RyaW5nKSA9PiB7XG5cbiAgICAgIGxldCBhekZhdWx0Q291bnQgPSBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UGVyQVpBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgICAgIGFsYixcbiAgICAgICAge1xuICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItXCIgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgXCItZmF1bHQtY291bnRcIixcbiAgICAgICAgICBrZXlwcmVmaXg6IGtleXByZWZpeFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG5cbiAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9MWBdID0gYXpGYXVsdENvdW50O1xuXG4gICAgICBpZiAoYXogPT0gYXZhaWxhYmlsaXR5Wm9uZSkge1xuICAgICAgICBhek1ldHJpY0lkID0gYCR7a2V5cHJlZml4fTFgO1xuICAgICAgfVxuXG4gICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEFsYXJtKFxuICAgICAgc2NvcGUsXG4gICAgICBrZXlwcmVmaXggKyAnLWF2YWlsYWJpbGl0eS1vdXRsaWVyLWFsYXJtJyxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICctJyArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyAnLWF2YWlsYWJpbGl0eS1pbXBhY3Qtb3V0bGllcicsXG4gICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbWV0cmljOiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgIGV4cHJlc3Npb246IGAke2F6TWV0cmljSWQhfS8oJHtPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oXCIrXCIpfSlgLFxuICAgICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1wZXJjZW50LW9mLWZhdWx0cycsXG4gICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgIH0pLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGEuSUdOT1JFXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQVpBbk91dGxpZXJGb3JMYXRlbmN5QWxiKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIGFsYjogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLCBcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBzdHJpbmcsXG4gICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXIsXG4gICAga2V5cHJlZml4OiBzdHJpbmdcbiAgKSA6IElBbGFybSB7XG5cbiAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuICAgIGxldCBhek1ldHJpY0lkOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgYWxiLnZwYyEuYXZhaWxhYmlsaXR5Wm9uZXMuZm9yRWFjaCgoYXo6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuXG4gICAgICAvLyBUYXJnZXQgcmVzcG9uc2UgdGltZVxuICAgICAgbGV0IHRhcmdldFJlc3BvbnNlVGltZTogSU1ldHJpYyA9IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5nZXRQZXJBWkxhdGVuY3lNZXRyaWMoe1xuICAgICAgICBhbGI6IGFsYixcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXosXG4gICAgICAgIGxhYmVsOiBheiArIFwiLXRhcmdldC1yZXNwb25zZS10aW1lXCIsXG4gICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljLFxuICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChheiA9PSBhdmFpbGFiaWxpdHlab25lKSB7ICAgICAgIFxuICAgICAgICBhek1ldHJpY0lkID0gYGEke2luZGV4fWBcbiAgICAgICAgdXNpbmdNZXRyaWNzW2BhJHtpbmRleH1gXSA9IHRhcmdldFJlc3BvbnNlVGltZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB1c2luZ01ldHJpY3NbYGIke2luZGV4fWBdID0gdGFyZ2V0UmVzcG9uc2VUaW1lO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLFxuICAgICAga2V5cHJlZml4ICsgXCItbGF0ZW5jeS1vdXRsaWVyLWFsYXJtXCIsXG4gICAgICB7XG4gICAgICAgIGFsYXJtTmFtZTpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1sYXRlbmN5LWltcGFjdC1vdXRsaWVyJyxcbiAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBtZXRyaWM6IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgZXhwcmVzc2lvbjogYCgke2F6TWV0cmljSWQhfSAtIEFWRyhNRVRSSUNTKFwiYlwiKSkpIC8gQVZHKFNURERFVihNRVRSSUNTKFwiYlwiKSkpYCxcbiAgICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJy0nICsgYWxiLmxvYWRCYWxhbmNlckFybiArICctbGF0ZW5jeS16LXNjb3JlJyxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgfSksXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICB0aHJlc2hvbGQ6IDMsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGEuSUdOT1JFXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZG9BbGJNZXRyaWNzKFxuICAgIHByb3BzOiBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzXG4gICkgOiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9IHtcblxuICAgIC8vIENyZWF0ZSBpbXBhY3QgYWxhcm1zIHBlciBBWiwgd2l0aCBlYWNoIEFMQiBwcm92aWRpbmdcbiAgICAvLyBhbiBhbGFybSBmb3IgaXRzIEFac1xuICAgIGxldCBwZXJBWkltcGFjdEFsYXJtczogeyBba2V5OiBzdHJpbmddOiBJQWxhcm1bXSB9ID0ge307XG5cbiAgICBsZXQga2V5UHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICAvLyBJdGVyYXRlIGVhY2ggQUxCXG4gICAgdGhpcy5hcHBsaWNhdGlvbkxvYWRCYWxhbmNlcnMhLmZvckVhY2goKGFsYikgPT4ge1xuICAgICAgXG4gICAgICAvLyBJdGVyYXRlIGVhY2ggQVogaW4gdGhlIFZQQ1xuICAgICAgYWxiLnZwYz8uYXZhaWxhYmlsaXR5Wm9uZXMuZm9yRWFjaCgoYXopID0+IHtcblxuICAgICAgICBpZiAoIShheiBpbiBwZXJBWkltcGFjdEFsYXJtcykpIHtcbiAgICAgICAgICBwZXJBWkltcGFjdEFsYXJtc1thel0gPSBbXTtcbiAgICAgICAgfVxuICAgICBcbiAgICAgICAgLy8gR2V0IEFaIGxldHRlclxuICAgICAgICBsZXQgYXpMZXR0ZXIgPSBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgLy8gTWFwIGxldHRlciB0byBBWiBJRFxuICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICAgIHRoaXMuX2F6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAvLyBJcyB0aGVyZSBhdmFpbGFiaWxpdHkgaW1wYWN0IGluIHRoaXMgQVo/XG4gICAgICAgIGxldCBhdmFpbGFiaWxpdHlJbXBhY3Q6IElBbGFybSA9IEJhc2ljU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5LmlzVGhlcmVBbkFaQXZhaWxhYmlsaXR5SW1wYWN0QWxiKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYWxiLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBheixcbiAgICAgICAgICBwcm9wcy5mYXVsdENvdW50UGVyY2VudGFnZVRocmVzaG9sZCA/IHByb3BzLmZhdWx0Q291bnRQZXJjZW50YWdlVGhyZXNob2xkIDogMC4wNSxcbiAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgICBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElzIHRoZXJlIGxhdGVuY3kgaW1wYWN0IGluIHRoaXMgQVo/XG4gICAgICAgIGxldCBsYXRlbmN5SW1wYWN0OiBJQWxhcm0gPSBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS5pc1RoZXJlQVpMYXRlbmN5SW1wYWN0QWxiKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYWxiLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBheixcbiAgICAgICAgICBwcm9wcy5sYXRlbmN5VGhyZXNob2xkLFxuICAgICAgICAgIHByb3BzLmxhdGVuY3lTdGF0aXN0aWMsXG4gICAgICAgICAga2V5UHJlZml4LFxuICAgICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgcHJvcHMuZGF0YXBvaW50c1RvQWxhcm1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJcyB0aGUgQVogYW4gb3V0bGllciBmb3IgZmF1bHRzXG4gICAgICAgIGxldCBhdmFpbGFiaWxpdHlPdXRsaWVyID0gQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuaXNBWkFuT3V0bGllckZvckF2YWlsYWJpbGl0eUFsYihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGFsYixcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgYXosXG4gICAgICAgICAgcHJvcHMuZmF1bHRDb3VudFBlcmNlbnRhZ2VUaHJlc2hvbGQgPyBwcm9wcy5mYXVsdENvdW50UGVyY2VudGFnZVRocmVzaG9sZCA6IDAuMDUsXG4gICAgICAgICAga2V5UHJlZml4LFxuICAgICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgcHJvcHMuZGF0YXBvaW50c1RvQWxhcm1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJcyB0aGUgQVogYW4gb3V0bGllciBmb3IgbGF0ZW5jeVxuICAgICAgICBsZXQgbGF0ZW5jeU91dGxpZXIgPSBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS5pc0FaQW5PdXRsaWVyRm9yTGF0ZW5jeUFsYihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGFsYixcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgYXosXG4gICAgICAgICAgcHJvcHMubGF0ZW5jeVN0YXRpc3RpYyxcbiAgICAgICAgICBwcm9wcy5wZXJpb2QgPyBwcm9wcy5wZXJpb2QgOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICAgIHByb3BzLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICAgIGF6TGV0dGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWxhcm0gaWYgdGhlIEFaIHNob3dzIGltcGFjdCBhbmQgaXMgYW4gb3V0bGllclxuICAgICAgICBsZXQgYXpJbXBhY3RBbGFybTogSUFsYXJtID0gbmV3IENvbXBvc2l0ZUFsYXJtKHRoaXMsIFxuICAgICAgICAgIGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKSArICBcIi1jb21wb3NpdGUtaW1wYWN0LWFsYXJtXCIsIFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsYXJtUnVsZTogQWxhcm1SdWxlLmFueU9mKFxuICAgICAgICAgICAgICBBbGFybVJ1bGUuYWxsT2YoYXZhaWxhYmlsaXR5SW1wYWN0LCBhdmFpbGFiaWxpdHlPdXRsaWVyKSwgXG4gICAgICAgICAgICAgIEFsYXJtUnVsZS5hbGxPZihsYXRlbmN5SW1wYWN0LCBsYXRlbmN5T3V0bGllcilcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjb21wb3NpdGVBbGFybU5hbWU6IFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1cIiArIFxuICAgICAgICAgICAgICAoYWxiIGFzIElMb2FkQmFsYW5jZXJWMiBhcyBCYXNlTG9hZEJhbGFuY2VyKS5sb2FkQmFsYW5jZXJOYW1lICsgXG4gICAgICAgICAgICAgIFwiLWxhdGVuY3ktb3ItYXZhaWxhYmlsaXR5LWltcGFjdFwiLFxuICAgICAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFkZCB0aGlzIEFMQidzIGZhdWx0IHJhdGUgYWxhcm1cbiAgICAgICAgcGVyQVpJbXBhY3RBbGFybXNbYXpdLnB1c2goYXpJbXBhY3RBbGFybSk7XG5cbiAgICAgICAgLy8gR2V0IG5leHQgdW5pcXVlIGtleVxuICAgICAgICBrZXlQcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCBhekNvbXBvc2l0ZUFsYXJtczoge1trZXk6IHN0cmluZ106IElBbGFybX0gPSB7fTtcblxuICAgIC8vIEl0ZXJhdGUgQVpzIGZvciB0aGUgQUxCIGltcGFjdCBhbGFybXMgc28gd2UgY2FuIGpvaW4gdGhlbVxuICAgIC8vIGludG8gYSBzaW5nbGUgY29tcG9zaXRlIGFsYXJtIGZvciBlYWNoIEFaXG4gICAgT2JqZWN0LmtleXMocGVyQVpJbXBhY3RBbGFybXMpLmZvckVhY2goKGF6KSA9PiB7XG4gICAgICBsZXQgYXpMZXR0ZXIgPSBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSk7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSB0aGlzLl9hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgIGF6Q29tcG9zaXRlQWxhcm1zW2F6XSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLCBhekxldHRlciArIFwiLWFsYi1pbXBhY3QtY29tcG9zaXRlLWFsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYW55T2YoLi4ucGVyQVpJbXBhY3RBbGFybXNbYXpdKSxcbiAgICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIi1hbGItaW1wYWN0LWNvbXBvc2l0ZS1hbGFybVwiXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhekNvbXBvc2l0ZUFsYXJtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzVGhlcmVBbkFaUGFja2V0TG9zc0ltcGFjdE5BVEdXKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIG5hdGd3czogQ2ZuTmF0R2F0ZXdheVtdLCBcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXJcbiAgKSA6IElBbGFybSB7XG4gICAgXG4gICAgbGV0IGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgIGxldCBwYWNrZXREcm9wQ291bnRNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICBsZXQgcGFja2V0c0luRnJvbVNvdXJjZU1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgIGxldCBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25NZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgIFxuICAgIG5hdGd3cy5mb3JFYWNoKChuYXRndzogQ2ZuTmF0R2F0ZXdheSk9PiB7XG5cbiAgICAgIHBhY2tldERyb3BDb3VudE1ldHJpY3NbYCR7a2V5cHJlZml4fTFgXSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0Ryb3BDb3VudCcsXG4gICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldCBkcm9wcycsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgfSk7XG4gIFxuICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBzb3VyY2VcbiAgICAgIHBhY2tldHNJbkZyb21Tb3VyY2VNZXRyaWNzW2Ake2tleXByZWZpeH0yYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNJbkZyb21Tb3VyY2UnLFxuICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXRzIGluIGZyb20gc291cmNlJyxcbiAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICB9KTtcbiAgXG4gICAgICAvLyBDYWxjdWxhdGUgcGFja2V0cyBpbiBmcm9tIGRlc3RpbmF0aW9uXG4gICAgICBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25NZXRyaWNzW2Ake2tleXByZWZpeH0zYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNJbkZyb21EZXN0aW5hdGlvbicsXG4gICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldHMgaW4gZnJvbSBkZXN0aW5hdGlvbicsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgfSk7XG5cbiAgICAgIGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5cHJlZml4KTtcbiAgICB9KTtcblxuICAgIGxldCBwYWNrZXREcm9wVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0RHJvcENvdW50TWV0cmljcykuam9pbihcIitcIiksXG4gICAgICB1c2luZ01ldHJpY3M6IHBhY2tldERyb3BDb3VudE1ldHJpY3MsXG4gICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgIH0pO1xuXG4gICAgbGV0IHBhY2tldHNJbkZyb21Tb3VyY2VUb3RhbDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyhwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICB1c2luZ01ldHJpY3M6IHBhY2tldHNJbkZyb21Tb3VyY2VNZXRyaWNzLFxuICAgICAgcGVyaW9kOiBwZXJpb2RcbiAgICB9KTtcblxuICAgIGxldCBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25Ub3RhbDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyhwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25NZXRyaWNzKS5qb2luKFwiK1wiKSxcbiAgICAgIHVzaW5nTWV0cmljczogcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljcyxcbiAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgfSk7XG4gICAgXG4gICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcbiAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTFgXSA9IHBhY2tldERyb3BUb3RhbDtcbiAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTJgXSA9IHBhY2tldHNJbkZyb21Tb3VyY2VUb3RhbDtcbiAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTNgXSA9IHBhY2tldHNJbkZyb21EZXN0aW5hdGlvblRvdGFsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGEgcGVyY2VudGFnZSBvZiBkcm9wcGVkIHBhY2tldHMgZm9yIHRoZSBOQVQgR1dcbiAgICBsZXQgcGFja2V0RHJvcFBlcmNlbnRhZ2U6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogYCgke2tleXByZWZpeH0xIC8gKCR7a2V5cHJlZml4fTIgKyAke2tleXByZWZpeH0zKSlgLFxuICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXQgZHJvcCBwZXJjZW50YWdlJyxcbiAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFsYXJtIGZvciB0aGlzIE5BVCBHVyBpZiBwYWNrZXQgZHJvcHMgZXhjZWVkIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKSArIFwiLXBhY2tldC1kcm9wLWltcGFjdC1hbGFybVwiLFxuICAgICAge1xuICAgICAgICBhbGFybU5hbWU6XG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkICtcbiAgICAgICAgICAnLXBhY2tldC1kcm9wLWltcGFjdCcsXG4gICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbWV0cmljOiBwYWNrZXREcm9wUGVyY2VudGFnZSxcbiAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0FaQW5PdXRsaWVyRm9yUGFja2V0TG9zc05BVEdXKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sIFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgZGF0YXBvaW50c1RvQWxhcm06IG51bWJlclxuICApIDogSUFsYXJtIHtcblxuICAgIGxldCBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG4gICAgbGV0IGF6UGFja2V0RHJvcENvdW50TWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgbGV0IGF6S2V5OiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgT2JqZWN0LmtleXMobmF0Z3dzKS5mb3JFYWNoKChhejogc3RyaW5nKSA9PiB7XG4gICAgICBcbiAgICAgIGxldCBwYWNrZXREcm9wQ291bnRNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcblxuICAgICAgXG5cbiAgICAgIG5hdGd3c1thel0uZm9yRWFjaCgobmF0Z3c6IENmbk5hdEdhdGV3YXksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcGFja2V0RHJvcENvdW50TWV0cmljc1tgJHtrZXlwcmVmaXh9JHtpbmRleH1gXSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzRHJvcENvdW50JyxcbiAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXQgZHJvcHMnLFxuICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICB9KTtcbiAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgICAgfSk7XG5cbiAgICAgIGF6UGFja2V0RHJvcENvdW50TWV0cmljc1tgJHtrZXlwcmVmaXh9JHtuYXRnd3NbYXpdLmxlbmd0aH1gXSA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldERyb3BDb3VudE1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgICB1c2luZ01ldHJpY3M6IHBhY2tldERyb3BDb3VudE1ldHJpY3MsXG4gICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICB9KTtcblxuICAgICAgaWYgKGF6ID09IGF2YWlsYWJpbGl0eVpvbmUpIHtcbiAgICAgICAgYXpLZXkgPSBgJHtrZXlwcmVmaXh9JHtuYXRnd3NbYXpdLmxlbmd0aH1gO1xuICAgICAgfVxuXG4gICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEFsYXJtKFxuICAgICAgc2NvcGUsIFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKSArIFwiLXBhY2tldC1sb3NzLW91dGxpZXJcIiwgXG4gICAgICB7XG4gICAgICAgICBtZXRyaWM6IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgICBleHByZXNzaW9uOiBgJHthektleX0gLyAoJHtPYmplY3Qua2V5cyhhelBhY2tldERyb3BDb3VudE1ldHJpY3MpLmpvaW4oXCIrXCIpfSlgLFxuICAgICAgICAgICAgdXNpbmdNZXRyaWNzOiBhelBhY2tldERyb3BDb3VudE1ldHJpY3MsXG4gICAgICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgICAgfSksXG4gICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRvTmF0R2F0ZXdheU1ldHJpY3MoXG4gICAgcHJvcHM6IEJhc2ljU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5UHJvcHNcbiAgKToge1trZXk6IHN0cmluZ106IElBbGFybX0ge1xuXG4gICAgLy8gQ29sbGVjdCBhbGFybXMgZm9yIHBhY2tldCBkcm9wcyBleGNlZWRpbmcgYSB0aHJlc2hvbGQgcGVyIE5BVCBHV1xuICAgIGxldCBwYWNrZXRMb3NzUGVyQVpBbGFybXM6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH0gPSB7fTtcblxuICAgIC8vIEZvciBlYWNoIEFaLCBjcmVhdGUgbWV0cmljcyBmb3IgZWFjaCBOQVQgR1dcbiAgICBPYmplY3Qua2V5cyh0aGlzLm5hdEdhdGV3YXlzISkuZm9yRWFjaCgoYXo6IHN0cmluZykgPT4ge1xuXG4gICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKTtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPVxuICAgICAgICB0aGlzLl9hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgIC8vIElzIHRoZXJlIHBhY2tldCBsb3NzIGltcGFjdD9cbiAgICAgIGxldCBwYWNrZXRMb3NzSW1wYWN0OiBJQWxhcm0gPSBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS5pc1RoZXJlQW5BWlBhY2tldExvc3NJbXBhY3ROQVRHVyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5uYXRHYXRld2F5cyFbYXpdLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgIGF6LFxuICAgICAgICBwcm9wcy5wYWNrZXRMb3NzSW1wYWN0UGVyY2VudGFnZVRocmVzaG9sZCA/IHByb3BzLnBhY2tldExvc3NJbXBhY3RQZXJjZW50YWdlVGhyZXNob2xkIDogMC4wMSxcbiAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtXG4gICAgICApO1xuICAgICAgLy8gSXMgdGhpcyBBWiBhbiBvdXRsaWVyIGZvciB0aGlzIE5BVEdXP1xuICAgICAgbGV0IHBhY2tldExvc3NPdXRsaWVyOiBJQWxhcm0gPSBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS5pc0FaQW5PdXRsaWVyRm9yUGFja2V0TG9zc05BVEdXKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLm5hdEdhdGV3YXlzISxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICBheixcbiAgICAgICAgMC42NixcbiAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtXG4gICAgICApO1xuICAgICAgcGFja2V0TG9zc1BlckFaQWxhcm1zW2F6XSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLCBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSkgKyBcIi1wYWNrZXQtbG9zcy1jb21wb3NpdGUtYWxhcm1cIiwge1xuICAgICAgICBhbGFybVJ1bGU6IEFsYXJtUnVsZS5hbGxPZihwYWNrZXRMb3NzSW1wYWN0LCBwYWNrZXRMb3NzT3V0bGllciksXG4gICAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItcGFja2V0LWxvc3MtY29tcG9zaXRlLWFsYXJtXCJcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhY2tldExvc3NQZXJBWkFsYXJtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG90YWxQYWNrZXREcm9wc1BlclpvbmUoXG4gICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSxcbiAgICBwZXJpb2Q6IER1cmF0aW9uXG4gICkgOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY31cbiAge1xuICAgIGxldCBkcm9wc1BlclpvbmU6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgIGxldCBtZXRyaWNzUGVyQVo6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljW119ID0ge307XG4gICAgbGV0IGtleXByZWZpeDogc3RyaW5nID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuXG4gICAgT2JqZWN0LmtleXMobmF0Z3dzKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcpID0+IHtcblxuICAgICAgbGV0IGF6TGV0dGVyID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSB0aGlzLl9hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgIGlmICghKGF2YWlsYWJpbGl0eVpvbmUgaW4gbWV0cmljc1BlckFaKSkge1xuICAgICAgICBtZXRyaWNzUGVyQVpbYXZhaWxhYmlsaXR5Wm9uZV0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgbmF0Z3dzW2F2YWlsYWJpbGl0eVpvbmVdLmZvckVhY2goKG5hdGd3OiBDZm5OYXRHYXRld2F5KSA9PiB7XG5cbiAgICAgICAgbWV0cmljc1BlckFaW2F2YWlsYWJpbGl0eVpvbmVdLnB1c2gobmV3IE1ldHJpYyh7XG4gICAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNEcm9wQ291bnQnLFxuICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9OQVRHYXRld2F5JyxcbiAgICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIHBhY2tldCBkcm9wcycsXG4gICAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgIH0pKTtcbiAgICAgIH0pOyAgIFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmtleXMobWV0cmljc1BlckFaKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhekxldHRlciA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkID0gdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcblxuICAgICAgbWV0cmljc1BlckFaW2F2YWlsYWJpbGl0eVpvbmVdLmZvckVhY2goKG1ldHJpYzogSU1ldHJpYykgPT4ge1xuICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTFgXSA9IG1ldHJpYztcbiAgICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgICAgfSk7XG5cbiAgICAgIGRyb3BzUGVyWm9uZVthdmFpbGFiaWxpdHlab25lXSA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgdG90YWwgcGFja2V0IGRyb3BzXCIsXG4gICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkcm9wc1BlclpvbmU7XG4gIH1cbn1cbiJdfQ==
|
|
475
|
+
BasicServiceMultiAZObservability[_a] = { fqn: "@cdklabs/multi-az-observability.BasicServiceMultiAZObservability", version: "0.0.1-alpha.7" };
|
|
476
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzaWNfb2JzZXJ2YWJpbGl0eS9CYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkNBQXVDO0FBQ3ZDLCtEQWFvQztBQU9wQywyQ0FBbUQ7QUFHbkQsK0VBQTRFO0FBRTVFLG1FQUFnRTtBQUNoRSw4RkFBMkY7QUFDM0YsZ0ZBQTZFO0FBQzdFLDhEQUEyRDtBQUMzRCwrSEFBNEg7QUFFNUg7OztHQUdHO0FBQ0gsTUFBYSxnQ0FDWCxTQUFRLHNCQUFTO0lBOENqQixZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE0QztRQUU1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFFckMsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7UUFFekMsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwrQ0FBc0IsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUU5RSx1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFL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SSxZQUFZLEdBQTZCLEVBQUUsQ0FBQztZQUVoRCxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBZSxFQUFFLEVBQUU7Z0JBQ2pELFlBQVksQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUN2QyxTQUFTLEdBQUcsNkJBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxZQUFZLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLCtCQUFjLENBQUM7Z0JBQ2xELFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9DLFlBQVksRUFBRSxZQUFZO2dCQUMxQixLQUFLLEVBQUUsa0JBQWtCLEdBQUcscUJBQXFCO2dCQUNqRCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7QUFqeEJILDRFQWt4QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQWxhcm0sXG4gIEFsYXJtUnVsZSxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBDb21wb3NpdGVBbGFybSxcbiAgRGFzaGJvYXJkLFxuICBJQWxhcm0sXG4gIElNZXRyaWMsXG4gIE1hdGhFeHByZXNzaW9uLFxuICBNZXRyaWMsXG4gIFN0YXRzLFxuICBUcmVhdE1pc3NpbmdEYXRhLFxuICBVbml0LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDZm5OYXRHYXRld2F5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQge1xuICBCYXNlTG9hZEJhbGFuY2VyLFxuICBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gIElMb2FkQmFsYW5jZXJWMixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkgfSBmcm9tICcuL0lCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eSc7XG5pbXBvcnQgeyBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzIH0gZnJvbSAnLi9wcm9wcy9CYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcbmltcG9ydCB7IElBdmFpbGFiaWxpdHlab25lTWFwcGVyIH0gZnJvbSAnLi4vYXptYXBwZXIvSUF2YWlsYWJpbGl0eVpvbmVNYXBwZXInO1xuaW1wb3J0IHsgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkIH0gZnJvbSAnLi9CYXNpY1NlcnZpY2VEYXNoYm9hcmQnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9BcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9BdmFpbGFiaWxpdHlNZXRyaWNUeXBlJztcbmltcG9ydCB7IE1ldHJpY3NIZWxwZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvTWV0cmljc0hlbHBlcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlckxhdGVuY3lPdXRsaWVyQ2FsY3VsYXRpb24gfSBmcm9tICcuL3Byb3BzL0FwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTGF0ZW5jeU91dGxpZXJDYWxjdWxhdGlvbic7XG5cbi8qKlxuICogQmFzaWMgb2JzZXJ2YWJpbGl0eSBmb3IgYSBzZXJ2aWNlIHVzaW5nIG1ldHJpY3MgZnJvbVxuICogQUxCcyBhbmQgTkFUIEdhdGV3YXlzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgTkFUIEdhdGV3YXlzIGJlaW5nIHVzZWQgaW4gdGhlIHNlcnZpY2UsIGVhY2ggc2V0IG9mIE5BVCBHYXRld2F5c1xuICAgKiBhcmUga2V5ZWQgYnkgdGhlaXIgQXZhaWxhYmlsaXR5IFpvbmUgSWRcbiAgICovXG4gIG5hdEdhdGV3YXlzPzogeyBba2V5OiBzdHJpbmddOiBDZm5OYXRHYXRld2F5W10gfTtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXJzIGJlaW5nIHVzZWQgYnkgdGhlIHNlcnZpY2VcbiAgICovXG4gIGFwcGxpY2F0aW9uTG9hZEJhbGFuY2Vycz86IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZVxuICAgKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyBpbmRpY2F0aW5nIGlmIGFuIEFaIGlzIGFuIG91dGxpZXIgZm9yIE5BVCBHV1xuICAgKiBwYWNrZXQgbG9zcyBhbmQgaGFzIGlzb2xhdGVkIGltcGFjdFxuICAgKi9cbiAgbmF0R1dab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zPzogeyBba2V5OiBzdHJpbmddOiBJQWxhcm0gfTtcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyBpbmRpY2F0aW5nIGlmIGFuIEFaIGlzIGFuIG91dGxpZXIgZm9yIEFMQlxuICAgKiBmYXVsdHMgYW5kIGhhcyBpc29sYXRlZCBpbXBhY3RcbiAgICovXG4gIGFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXM/OiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYWxhcm1zIGluZGljYXRpbmcgaWYgYW4gQVogaGFzIGlzb2xhdGVkIGltcGFjdFxuICAgKiBmcm9tIGVpdGhlciBBTEIgb3IgTkFUIEdXIG1ldHJpY3NcbiAgICovXG4gIGFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXM6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH07XG5cbiAgLyoqXG4gICAqIFRoZSBkYXNoYm9hcmQgdGhhdCBpcyBvcHRpb25hbGx5IGNyZWF0ZWRcbiAgICovXG4gIGRhc2hib2FyZD86IERhc2hib2FyZDtcblxuICAvKipcbiAgICogVGhlIEFaIG1hcHBlciByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBfYXpNYXBwZXI6IElBdmFpbGFiaWxpdHlab25lTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHlQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEluaXRpYWxpemUgY2xhc3MgcHJvcGVydGllc1xuICAgIHRoaXMuc2VydmljZU5hbWUgPSBwcm9wcy5zZXJ2aWNlTmFtZTtcbiAgICB0aGlzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycyA9IHByb3BzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycztcbiAgICB0aGlzLm5hdEdhdGV3YXlzID0gcHJvcHMubmF0R2F0ZXdheXM7XG5cbiAgICB0aGlzLmFnZ3JlZ2F0ZVpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB7fTtcbiAgICB0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB7fTtcbiAgICB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyA9IHt9O1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBBWiBtYXBwZXIgcmVzb3VyY2UgdG8gdHJhbnNsYXRlIEFaIG5hbWVzIHRvIGlkc1xuICAgIHRoaXMuX2F6TWFwcGVyID0gbmV3IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIodGhpcywgJ2F2YWlsYWJpbGl0eS16b25lLW1hcHBlcicpO1xuXG4gICAgLy8gQ3JlYXRlIEFMQiBtZXRyaWNzIGFuZCBhbGFybXMgcGVyIEFaXG4gICAgaWYgKHRoaXMuYXBwbGljYXRpb25Mb2FkQmFsYW5jZXJzKSB7XG4gICAgICB0aGlzLmFsYlpvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB0aGlzLmRvQWxiTWV0cmljcyhwcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE5BVCBHYXRld2F5IG1ldHJpY3MgYW5kIGFsYXJtcyBwZXIgQVpcbiAgICBpZiAodGhpcy5uYXRHYXRld2F5cykge1xuICAgICAgdGhpcy5uYXRHV1pvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMgPSB0aGlzLmRvTmF0R2F0ZXdheU1ldHJpY3MocHJvcHMpO1xuICAgIH1cblxuICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgb2YgdGhlIHBlciBBWiBBTEIgYWxhcm1zLCBpZiB0aGVyZSdzIGFsc28gYSBOQVQgR1cgYWxhcm1cbiAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgYWxhcm0gaWYgZWl0aGVyIG9mIHRoZW0gdHJpZ2dlclxuICAgIE9iamVjdC5rZXlzKHRoaXMuYWxiWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcykuZm9yRWFjaCgoYXpMZXR0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IHRoaXMuX2F6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgIGlmIChhekxldHRlciBpbiB0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyEpIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zW2F6TGV0dGVyXSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLCBhekxldHRlciArIFwiLWlzb2xhdGVkLWltcGFjdC1hbGFybVwiLCB7XG4gICAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYW55T2YodGhpcy5hbGJab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zIVthekxldHRlcl0sIHRoaXMubmF0R1dab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zIVthekxldHRlcl0pLFxuICAgICAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItaXNvbGF0ZWQtaW1wYWN0LWFsYXJtXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zW2F6TGV0dGVyXSA9IG5ldyBDb21wb3NpdGVBbGFybSh0aGlzLCBhekxldHRlciArIFwiLWlzb2xhdGVkLWltcGFjdC1hbGFybVwiLCB7XG4gICAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYW55T2YodGhpcy5hbGJab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zIVthekxldHRlcl0pLFxuICAgICAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItaXNvbGF0ZWQtaW1wYWN0LWFsYXJtXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMb29rIHRocm91Z2ggYWxsIG9mIHRoZSBwZXIgQVogTkFUIEdXIGFsYXJtcy4gSWYgdGhlcmUncyBhbiBBWiB3ZSBoYXZlbid0IHNlZW4gaW4gdGhlIEFMQlxuICAgIC8vIGFsYXJtcyB5ZXQsIHRoZW4gaXQgd2lsbCBqdXN0IGJlIGEgTkFUIEdXIGFsYXJtIHRoYXQgd2UnbGwgdHVybiBpbnRvIHRoZSBzYW1lIGtpbmQgb2ZcbiAgICAvLyBjb21wb3NpdGUgYWxhcm1cbiAgICBPYmplY3Qua2V5cyh0aGlzLm5hdEdXWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcykuZm9yRWFjaCgoYXpMZXR0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEoYXpMZXR0ZXIgaW4gdGhpcy5hZ2dyZWdhdGVab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zKSkge1xuICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkID0gdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgIHRoaXMuYWdncmVnYXRlWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtc1thekxldHRlcl0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcywgYXpMZXR0ZXIgKyBcIi1pc29sYXRlZC1pbXBhY3QtYWxhcm1cIiwge1xuICAgICAgICAgIGFsYXJtUnVsZTogQWxhcm1SdWxlLmFueU9mKHRoaXMubmF0R1dab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zIVthekxldHRlcl0pLFxuICAgICAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItaXNvbGF0ZWQtaW1wYWN0LWFsYXJtXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2hvdWxkIHdlIGNyZWF0ZSB0aGUgZGFzaGJvYXJkXG4gICAgaWYgKHByb3BzLmNyZWF0ZURhc2hib2FyZCA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBCYXNpY1NlcnZpY2VEYXNoYm9hcmQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgICdCYXNpY1NlcnZpY2VEYXNoYm9hcmQnLFxuICAgICAgICB7XG4gICAgICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgem9uYWxBZ2dyZWdhdGVJc29sYXRlZEltcGFjdEFsYXJtczpcbiAgICAgICAgICAgIHRoaXMuYWdncmVnYXRlWm9uYWxJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgICB6b25hbExvYWRCYWxhbmNlcklzb2xhdGVkSW1wYWN0QWxhcm1zOlxuICAgICAgICAgICAgdGhpcy5hbGJab25hbElzb2xhdGVkSW1wYWN0QWxhcm1zLFxuICAgICAgICAgIHpvbmFsTmF0R2F0ZXdheUlzb2xhdGVkSW1wYWN0QWxhcm1zOlxuICAgICAgICAgICAgdGhpcy5uYXRHV1pvbmFsSXNvbGF0ZWRJbXBhY3RBbGFybXMsXG4gICAgICAgICAgaW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgICAgIHpvbmFsTG9hZEJhbGFuY2VyRmF1bHRSYXRlTWV0cmljczogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmdldFRvdGFsQWxiRmF1bHRDb3VudFBlclpvbmUoXG4gICAgICAgICAgICBwcm9wcy5hcHBsaWNhdGlvbkxvYWRCYWxhbmNlcnMgPyBwcm9wcy5hcHBsaWNhdGlvbkxvYWRCYWxhbmNlcnMgOiBbXSwgXG4gICAgICAgICAgICBwcm9wcy5wZXJpb2QgPyBwcm9wcy5wZXJpb2QgOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICAgICAgdGhpcy5fYXpNYXBwZXJcbiAgICAgICAgICApLFxuICAgICAgICAgIHpvbmFsTmF0R2F0ZXdheVBhY2tldERyb3BNZXRyaWNzOiB0aGlzLmdldFRvdGFsUGFja2V0RHJvcHNQZXJab25lKFxuICAgICAgICAgICAgcHJvcHMubmF0R2F0ZXdheXMgPyBwcm9wcy5uYXRHYXRld2F5cyA6IHt9LFxuICAgICAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKVxuICAgICAgICAgICksXG4gICAgICAgICAgYXpNYXBwZXI6IHRoaXMuX2F6TWFwcGVyLFxuICAgICAgICB9LFxuICAgICAgKS5kYXNoYm9hcmQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNUaGVyZUFuQVpBdmFpbGFiaWxpdHlJbXBhY3RBbGIoXG4gICAgc2NvcGU6IElDb25zdHJ1Y3QsXG4gICAgYWxiOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsIFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICBrZXlwcmVmaXg6IHN0cmluZyxcbiAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgZGF0YXBvaW50c1RvQWxhcm06IG51bWJlclxuICApIDogSUFsYXJtIHtcbiAgIFxuICAgIC8vIENyZWF0ZSBhIGZhdWx0IHJhdGUgYWxhcm0gZm9yIHRoZSBBTEIgaW4gdGhlIHNwZWNpZmllZCBBWlxuICAgIHJldHVybiBuZXcgQWxhcm0oXG4gICAgICBzY29wZSxcbiAgICAgIGtleXByZWZpeCArICctZmF1bHQtcmF0ZS1hbGFybScsXG4gICAgICB7XG4gICAgICAgIGFsYXJtTmFtZTpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1mYXVsdC1yYXRlJyxcbiAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBtZXRyaWM6IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5nZXRQZXJBWkF2YWlsYWJpbGl0eU1ldHJpYyhhbGIsIHtcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJy0nICsgYWxiLmxvYWRCYWxhbmNlckFybiArICctZmF1bHQtcmF0ZScsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX1JBVEVcbiAgICAgICAgfSksXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgZGF0YXBvaW50c1RvQWxhcm06IGRhdGFwb2ludHNUb0FsYXJtLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5JR05PUkVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNUaGVyZUFaTGF0ZW5jeUltcGFjdEFsYihcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBhbGI6IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciwgXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHN0YXRpc3RpYzogc3RyaW5nLFxuICAgIGtleXByZWZpeDogc3RyaW5nLFxuICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyXG4gICk6IElBbGFybSB7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgZmF1bHQgcmF0ZSBhbGFybSBmb3IgdGhlIEFMQiBpbiB0aGUgc3BlY2lmaWVkIEFaXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLFxuICAgICAga2V5cHJlZml4ICsgJy1sYXRlbmN5LWFsYXJtJyxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICctJyArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyAnLWxhdGVuY3knLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG1ldHJpYzogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmdldFBlckFaTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgYWxiOiBhbGIsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItXCIgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgXCItdGFyZ2V0LWxhdGVuY3lcIixcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgICBzdGF0aXN0aWM6IHN0YXRpc3RpY1xuICAgICAgICB9KSxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0FaQW5PdXRsaWVyRm9yQXZhaWxhYmlsaXR5QWxiKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIGFsYjogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLCBcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAga2V5cHJlZml4OiBzdHJpbmcsXG4gICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXJcbiAgKSA6IElBbGFybSB7XG5cbiAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuICAgIGxldCBhek1ldHJpY0lkOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgYWxiLnZwYyEuYXZhaWxhYmlsaXR5Wm9uZXMuZm9yRWFjaCgoYXo6IHN0cmluZykgPT4ge1xuXG4gICAgICBsZXQgYXpGYXVsdENvdW50ID0gQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmdldFBlckFaQXZhaWxhYmlsaXR5TWV0cmljKFxuICAgICAgICBhbGIsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgcGVyaW9kOiBwZXJpb2QsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiLVwiICsgYWxiLmxvYWRCYWxhbmNlckFybiArIFwiLWZhdWx0LWNvdW50XCIsXG4gICAgICAgICAga2V5cHJlZml4OiBrZXlwcmVmaXhcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuXG4gICAgICB1c2luZ01ldHJpY3NbYCR7a2V5cHJlZml4fTFgXSA9IGF6RmF1bHRDb3VudDtcblxuICAgICAgaWYgKGF6ID09IGF2YWlsYWJpbGl0eVpvbmUpIHtcbiAgICAgICAgYXpNZXRyaWNJZCA9IGAke2tleXByZWZpeH0xYDtcbiAgICAgIH1cblxuICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLFxuICAgICAga2V5cHJlZml4ICsgJy1hdmFpbGFiaWxpdHktb3V0bGllci1hbGFybScsXG4gICAgICB7XG4gICAgICAgIGFsYXJtTmFtZTpcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1hdmFpbGFiaWxpdHktaW1wYWN0LW91dGxpZXInLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG1ldHJpYzogbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICBleHByZXNzaW9uOiBgJHthek1ldHJpY0lkIX0vKCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKFwiK1wiKX0pYCxcbiAgICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJy0nICsgYWxiLmxvYWRCYWxhbmNlckFybiArICctcGVyY2VudC1vZi1mYXVsdHMnLFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICB9KSxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0FaQW5PdXRsaWVyRm9yTGF0ZW5jeUFsYihcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBhbGI6IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciwgXG4gICAgYWxnb3JpdGhtOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlckxhdGVuY3lPdXRsaWVyQ2FsY3VsYXRpb24sXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyLFxuICAgIGtleXByZWZpeDogc3RyaW5nXG4gICkgOiBJQWxhcm0ge1xuXG4gICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcbiAgICBsZXQgYXpNZXRyaWNJZDogc3RyaW5nID0gXCJcIjtcblxuICAgIHN3aXRjaCAoYWxnb3JpdGhtKVxuICAgIHtcbiAgICAgIGNhc2UgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJMYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uLlpfU0NPUkU6XG4gICAgICBkZWZhdWx0OlxuXG4gICAgICAgIGFsYi52cGMhLmF2YWlsYWJpbGl0eVpvbmVzLmZvckVhY2goKGF6OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcblxuICAgICAgICAgIC8vIFRhcmdldCByZXNwb25zZSB0aW1lXG4gICAgICAgICAgbGV0IHRhcmdldFJlc3BvbnNlVGltZTogSU1ldHJpYyA9IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5nZXRQZXJBWkxhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgYWxiOiBhbGIsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBheixcbiAgICAgICAgICAgIGxhYmVsOiBheiArIFwiLXRhcmdldC1yZXNwb25zZS10aW1lXCIsXG4gICAgICAgICAgICBzdGF0aXN0aWM6IHN0YXRpc3RpYyxcbiAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoYXogPT0gYXZhaWxhYmlsaXR5Wm9uZSkgeyAgICAgICBcbiAgICAgICAgICAgIGF6TWV0cmljSWQgPSBgYSR7aW5kZXh9YFxuICAgICAgICAgICAgdXNpbmdNZXRyaWNzW2BhJHtpbmRleH1gXSA9IHRhcmdldFJlc3BvbnNlVGltZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1c2luZ01ldHJpY3NbYGIke2luZGV4fWBdID0gdGFyZ2V0UmVzcG9uc2VUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBrZXlwcmVmaXggKyBcIi1sYXRlbmN5LW91dGxpZXItYWxhcm1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGFybU5hbWU6XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICctJyArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyAnLWxhdGVuY3ktaW1wYWN0LW91dGxpZXInLFxuICAgICAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWV0cmljOiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiBgKCR7YXpNZXRyaWNJZCF9IC0gQVZHKE1FVFJJQ1MoXCJiXCIpKSkgLyBBVkcoU1REREVWKE1FVFJJQ1MoXCJiXCIpKSlgLFxuICAgICAgICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICctJyArIGFsYi5sb2FkQmFsYW5jZXJBcm4gKyAnLWxhdGVuY3ktei1zY29yZScsXG4gICAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJMYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uLlNUQVRJQzpcbiAgICAgICAgXG4gICAgICAgIGFsYi52cGMhLmF2YWlsYWJpbGl0eVpvbmVzLmZvckVhY2goKGF6OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBUYXJnZXQgcmVzcG9uc2UgdGltZVxuICAgICAgICAgIGxldCB0YXJnZXRSZXNwb25zZVRpbWU6IElNZXRyaWMgPSBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UGVyQVpMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgIGFsYjogYWxiLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXosXG4gICAgICAgICAgICBsYWJlbDogYXogKyBcIi10YXJnZXQtcmVzcG9uc2UtdGltZVwiLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBgVEMoJHt0aHJlc2hvbGR9OilgLFxuICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2RcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChheiA9PSBhdmFpbGFiaWxpdHlab25lKSB7ICAgICAgIFxuICAgICAgICAgICAgYXpNZXRyaWNJZCA9IGBhJHtpbmRleH1gXG4gICAgICAgICAgICB1c2luZ01ldHJpY3NbYGEke2luZGV4fWBdID0gdGFyZ2V0UmVzcG9uc2VUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVzaW5nTWV0cmljc1tgYiR7aW5kZXh9YF0gPSB0YXJnZXRSZXNwb25zZVRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgQWxhcm0oXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAga2V5cHJlZml4ICsgXCItbGF0ZW5jeS1vdXRsaWVyLWFsYXJtXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1sYXRlbmN5LWltcGFjdC1vdXRsaWVyJyxcbiAgICAgICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIG1ldHJpYzogbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogYCR7YXpNZXRyaWNJZH0vKCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKFwiK1wiKX0pYCxcbiAgICAgICAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnLScgKyBhbGIubG9hZEJhbGFuY2VyQXJuICsgJy1sYXRlbmN5LXN0YXRpYycsXG4gICAgICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IC42NixcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLklHTk9SRVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqIEBwYXJhbSBwcm9wcyBcbiAgICogQHJldHVybnMgQSBjb21wb3NpdGUgYWxhcm0gcGVyIEFaIHRvIGluZGljYXRlIGlzb2xhdGVkIHpvbmFsIGltcGFjdC4gVGhlIGRpY3Rpb25hcnlcbiAgICogaXMga2V5ZWQgYnkgdGhlIGF6IGxldHRlciwgbGlrZSBcImFcIiwgXCJiXCIsIFwiY1wiLlxuICAgKi9cbiAgcHJpdmF0ZSBkb0FsYk1ldHJpY3MoXG4gICAgcHJvcHM6IEJhc2ljU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5UHJvcHNcbiAgKSA6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH0ge1xuXG4gICAgLy8gQ3JlYXRlIGltcGFjdCBhbGFybXMgcGVyIEFaLCB3aXRoIGVhY2ggQUxCIHByb3ZpZGluZ1xuICAgIC8vIGFuIGFsYXJtIGZvciBpdHMgQVpzXG4gICAgbGV0IHBlckFaSW1wYWN0QWxhcm1zOiB7IFtrZXk6IHN0cmluZ106IElBbGFybVtdIH0gPSB7fTtcblxuICAgIGxldCBrZXlQcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgIC8vIEl0ZXJhdGUgZWFjaCBBTEJcbiAgICB0aGlzLmFwcGxpY2F0aW9uTG9hZEJhbGFuY2VycyEuZm9yRWFjaCgoYWxiKSA9PiB7XG4gICAgICBcbiAgICAgIC8vIEl0ZXJhdGUgZWFjaCBBWiBpbiB0aGUgVlBDXG4gICAgICBhbGIudnBjPy5hdmFpbGFiaWxpdHlab25lcy5mb3JFYWNoKChheikgPT4ge1xuXG4gICAgICAgIGlmICghKGF6IGluIHBlckFaSW1wYWN0QWxhcm1zKSkge1xuICAgICAgICAgIHBlckFaSW1wYWN0QWxhcm1zW2F6XSA9IFtdO1xuICAgICAgICB9XG4gICAgIFxuICAgICAgICAvLyBHZXQgQVogbGV0dGVyXG4gICAgICAgIGxldCBhekxldHRlciA9IGF6LnN1YnN0cmluZyhhei5sZW5ndGggLSAxKTtcblxuICAgICAgICAvLyBNYXAgbGV0dGVyIHRvIEFaIElEXG4gICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9XG4gICAgICAgICAgdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgIC8vIElzIHRoZXJlIGF2YWlsYWJpbGl0eSBpbXBhY3QgaW4gdGhpcyBBWj9cbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eUltcGFjdDogSUFsYXJtID0gQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuaXNUaGVyZUFuQVpBdmFpbGFiaWxpdHlJbXBhY3RBbGIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBhbGIsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIGF6LFxuICAgICAgICAgIHByb3BzLmZhdWx0Q291bnRQZXJjZW50YWdlVGhyZXNob2xkID8gcHJvcHMuZmF1bHRDb3VudFBlcmNlbnRhZ2VUaHJlc2hvbGQgOiAwLjA1LFxuICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICBwcm9wcy5wZXJpb2QgPyBwcm9wcy5wZXJpb2QgOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICAgIHByb3BzLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgIHByb3BzLmRhdGFwb2ludHNUb0FsYXJtXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXMgdGhlcmUgbGF0ZW5jeSBpbXBhY3QgaW4gdGhpcyBBWj9cbiAgICAgICAgbGV0IGxhdGVuY3lJbXBhY3Q6IElBbGFybSA9IEJhc2ljU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5LmlzVGhlcmVBWkxhdGVuY3lJbXBhY3RBbGIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBhbGIsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIGF6LFxuICAgICAgICAgIHByb3BzLmxhdGVuY3lUaHJlc2hvbGQsXG4gICAgICAgICAgcHJvcHMubGF0ZW5jeVN0YXRpc3RpYyxcbiAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgICBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElzIHRoZSBBWiBhbiBvdXRsaWVyIGZvciBmYXVsdHNcbiAgICAgICAgbGV0IGF2YWlsYWJpbGl0eU91dGxpZXIgPSBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eS5pc0FaQW5PdXRsaWVyRm9yQXZhaWxhYmlsaXR5QWxiKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYWxiLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBheixcbiAgICAgICAgICBwcm9wcy5mYXVsdENvdW50UGVyY2VudGFnZVRocmVzaG9sZCA/IHByb3BzLmZhdWx0Q291bnRQZXJjZW50YWdlVGhyZXNob2xkIDogMC4wNSxcbiAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgcHJvcHMucGVyaW9kID8gcHJvcHMucGVyaW9kIDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgICBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElzIHRoZSBBWiBhbiBvdXRsaWVyIGZvciBsYXRlbmN5XG4gICAgICAgIGxldCBsYXRlbmN5T3V0bGllciA9IEJhc2ljU2VydmljZU11bHRpQVpPYnNlcnZhYmlsaXR5LmlzQVpBbk91dGxpZXJGb3JMYXRlbmN5QWxiKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYWxiLFxuICAgICAgICAgIHByb3BzLmxhdGVuY3lPdXRsaWVyQ2FsY3VsYXRpb24gPyBwcm9wcy5sYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uIDogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJMYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uLlpfU0NPUkUsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgIGF6LFxuICAgICAgICAgIHByb3BzLmxhdGVuY3lTdGF0aXN0aWMsXG4gICAgICAgICAgcHJvcHMubGF0ZW5jeU91dGxpZXJDYWxjdWxhdGlvbiA9PSBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlckxhdGVuY3lPdXRsaWVyQ2FsY3VsYXRpb24uWl9TQ09SRSA/IDMgOiBwcm9wcy5sYXRlbmN5VGhyZXNob2xkLFxuICAgICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgcHJvcHMuZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgcHJvcHMuZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgYXpMZXR0ZXJcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBbGFybSBpZiB0aGUgQVogc2hvd3MgaW1wYWN0IGFuZCBpcyBhbiBvdXRsaWVyXG4gICAgICAgIGxldCBhekltcGFjdEFsYXJtOiBJQWxhcm0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcywgXG4gICAgICAgICAgYXpMZXR0ZXIgKyAgXCItY29tcG9zaXRlLWltcGFjdC1hbGFybVwiLCBcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGFybVJ1bGU6IEFsYXJtUnVsZS5hbnlPZihcbiAgICAgICAgICAgICAgQWxhcm1SdWxlLmFsbE9mKGF2YWlsYWJpbGl0eUltcGFjdCwgYXZhaWxhYmlsaXR5T3V0bGllciksIFxuICAgICAgICAgICAgICBBbGFybVJ1bGUuYWxsT2YobGF0ZW5jeUltcGFjdCwgbGF0ZW5jeU91dGxpZXIpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY29tcG9zaXRlQWxhcm1OYW1lOiBcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItXCIgKyBcbiAgICAgICAgICAgICAgKGFsYiBhcyBJTG9hZEJhbGFuY2VyVjIgYXMgQmFzZUxvYWRCYWxhbmNlcikubG9hZEJhbGFuY2VyTmFtZSArIFxuICAgICAgICAgICAgICBcIi1sYXRlbmN5LW9yLWF2YWlsYWJpbGl0eS1pbXBhY3RcIixcbiAgICAgICAgICAgIGFjdGlvbnNFbmFibGVkOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZGQgdGhpcyBBTEIncyBmYXVsdCByYXRlIGFsYXJtXG4gICAgICAgIHBlckFaSW1wYWN0QWxhcm1zW2F6XS5wdXNoKGF6SW1wYWN0QWxhcm0pO1xuXG4gICAgICAgIC8vIEdldCBuZXh0IHVuaXF1ZSBrZXlcbiAgICAgICAga2V5UHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBsZXQgYXpDb21wb3NpdGVBbGFybXM6IHtba2V5OiBzdHJpbmddOiBJQWxhcm19ID0ge307XG5cbiAgICAvLyBJdGVyYXRlIEFacyBmb3IgdGhlIEFMQiBpbXBhY3QgYWxhcm1zIHNvIHdlIGNhbiBqb2luIHRoZW1cbiAgICAvLyBpbnRvIGEgc2luZ2xlIGNvbXBvc2l0ZSBhbGFybSBmb3IgZWFjaCBBWlxuICAgIE9iamVjdC5rZXlzKHBlckFaSW1wYWN0QWxhcm1zKS5mb3JFYWNoKChheikgPT4ge1xuICAgICAgbGV0IGF6TGV0dGVyID0gYXouc3Vic3RyaW5nKGF6Lmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICBhekNvbXBvc2l0ZUFsYXJtc1thekxldHRlcl0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcywgYXpMZXR0ZXIgKyBcIi1hbGItaW1wYWN0LWNvbXBvc2l0ZS1hbGFybVwiLCB7XG4gICAgICAgIGFsYXJtUnVsZTogQWxhcm1SdWxlLmFueU9mKC4uLnBlckFaSW1wYWN0QWxhcm1zW2F6XSksXG4gICAgICAgIGNvbXBvc2l0ZUFsYXJtTmFtZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCItYWxiLWltcGFjdC1jb21wb3NpdGUtYWxhcm1cIlxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXpDb21wb3NpdGVBbGFybXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1RoZXJlQW5BWlBhY2tldExvc3NJbXBhY3ROQVRHVyhcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBuYXRnd3M6IENmbk5hdEdhdGV3YXlbXSwgXG4gICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgIHRocmVzaG9sZDogbnVtYmVyLFxuICAgIHBlcmlvZDogRHVyYXRpb24sXG4gICAgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcixcbiAgICBkYXRhcG9pbnRzVG9BbGFybTogbnVtYmVyXG4gICkgOiBJQWxhcm0ge1xuICAgIFxuICAgIGxldCBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCk7XG5cbiAgICBsZXQgcGFja2V0RHJvcENvdW50TWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICAgbGV0IHBhY2tldHNJbkZyb21Tb3VyY2VNZXRyaWNzOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICBsZXQgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG4gICBcbiAgICBuYXRnd3MuZm9yRWFjaCgobmF0Z3c6IENmbk5hdEdhdGV3YXkpPT4ge1xuXG4gICAgICBwYWNrZXREcm9wQ291bnRNZXRyaWNzW2Ake2tleXByZWZpeH0xYF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgbWV0cmljTmFtZTogJ1BhY2tldHNEcm9wQ291bnQnLFxuICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXQgZHJvcHMnLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgIH0pO1xuICBcbiAgICAgIC8vIENhbGN1bGF0ZSBwYWNrZXRzIGluIGZyb20gc291cmNlXG4gICAgICBwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljc1tgJHtrZXlwcmVmaXh9MmBdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tU291cmNlJyxcbiAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0cyBpbiBmcm9tIHNvdXJjZScsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgfSk7XG4gIFxuICAgICAgLy8gQ2FsY3VsYXRlIHBhY2tldHMgaW4gZnJvbSBkZXN0aW5hdGlvblxuICAgICAgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljc1tgJHtrZXlwcmVmaXh9M2BdID0gbmV3IE1ldHJpYyh7XG4gICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzSW5Gcm9tRGVzdGluYXRpb24nLFxuICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXRzIGluIGZyb20gZGVzdGluYXRpb24nLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgTmF0R2F0ZXdheUlkOiBuYXRndy5hdHRyTmF0R2F0ZXdheUlkLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgIH0pO1xuXG4gICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcGFja2V0RHJvcFRvdGFsOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHBhY2tldERyb3BDb3VudE1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgcGVyaW9kOiBwZXJpb2RcbiAgICB9KTtcblxuICAgIGxldCBwYWNrZXRzSW5Gcm9tU291cmNlVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0c0luRnJvbVNvdXJjZU1ldHJpY3MpLmpvaW4oXCIrXCIpLFxuICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXRzSW5Gcm9tU291cmNlTWV0cmljcyxcbiAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgfSk7XG5cbiAgICBsZXQgcGFja2V0c0luRnJvbURlc3RpbmF0aW9uVG90YWw6IElNZXRyaWMgPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXMocGFja2V0c0luRnJvbURlc3RpbmF0aW9uTWV0cmljcykuam9pbihcIitcIiksXG4gICAgICB1c2luZ01ldHJpY3M6IHBhY2tldHNJbkZyb21EZXN0aW5hdGlvbk1ldHJpY3MsXG4gICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgIH0pO1xuICAgIFxuICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG4gICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0xYF0gPSBwYWNrZXREcm9wVG90YWw7XG4gICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0yYF0gPSBwYWNrZXRzSW5Gcm9tU291cmNlVG90YWw7XG4gICAgdXNpbmdNZXRyaWNzW2Ake2tleXByZWZpeH0zYF0gPSBwYWNrZXRzSW5Gcm9tRGVzdGluYXRpb25Ub3RhbDtcblxuICAgIC8vIENhbGN1bGF0ZSBhIHBlcmNlbnRhZ2Ugb2YgZHJvcHBlZCBwYWNrZXRzIGZvciB0aGUgTkFUIEdXXG4gICAgbGV0IHBhY2tldERyb3BQZXJjZW50YWdlOiBJTWV0cmljID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgIGV4cHJlc3Npb246IGAoJHtrZXlwcmVmaXh9MSAvICgke2tleXByZWZpeH0yICsgJHtrZXlwcmVmaXh9MykpYCxcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0IGRyb3AgcGVyY2VudGFnZScsXG4gICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiBhbGFybSBmb3IgdGhpcyBOQVQgR1cgaWYgcGFja2V0IGRyb3BzIGV4Y2VlZCB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZFxuICAgIHJldHVybiBuZXcgQWxhcm0oXG4gICAgICBzY29wZSxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSkgKyBcIi1wYWNrZXQtZHJvcC1pbXBhY3QtYWxhcm1cIixcbiAgICAgIHtcbiAgICAgICAgYWxhcm1OYW1lOlxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArXG4gICAgICAgICAgJy1wYWNrZXQtZHJvcC1pbXBhY3QnLFxuICAgICAgICBhY3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG1ldHJpYzogcGFja2V0RHJvcFBlcmNlbnRhZ2UsXG4gICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBkYXRhcG9pbnRzVG9BbGFybSxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5JR05PUkVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNBWkFuT3V0bGllckZvclBhY2tldExvc3NOQVRHVyhcbiAgICBzY29wZTogSUNvbnN0cnVjdCxcbiAgICBuYXRnd3M6IHtba2V5OiBzdHJpbmddOiBDZm5OYXRHYXRld2F5W119LCBcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcGVyaW9kOiBEdXJhdGlvbixcbiAgICBldmFsdWF0aW9uUGVyaW9kczogbnVtYmVyLFxuICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXJcbiAgKSA6IElBbGFybSB7XG5cbiAgICBsZXQga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcigpO1xuICAgIGxldCBhelBhY2tldERyb3BDb3VudE1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IHt9O1xuICAgIGxldCBhektleTogc3RyaW5nID0gXCJcIjtcblxuICAgIE9iamVjdC5rZXlzKG5hdGd3cykuZm9yRWFjaCgoYXo6IHN0cmluZykgPT4ge1xuICAgICAgXG4gICAgICBsZXQgcGFja2V0RHJvcENvdW50TWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG5cbiAgICAgIFxuXG4gICAgICBuYXRnd3NbYXpdLmZvckVhY2goKG5hdGd3OiBDZm5OYXRHYXRld2F5LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHBhY2tldERyb3BDb3VudE1ldHJpY3NbYCR7a2V5cHJlZml4fSR7aW5kZXh9YF0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICBtZXRyaWNOYW1lOiAnUGFja2V0c0Ryb3BDb3VudCcsXG4gICAgICAgICAgbmFtZXNwYWNlOiAnQVdTL05BVEdhdGV3YXknLFxuICAgICAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgcGFja2V0IGRyb3BzJyxcbiAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgICBOYXRHYXRld2F5SWQ6IG5hdGd3LmF0dHJOYXRHYXRld2F5SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJpb2Q6IHBlcmlvZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGtleXByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5cHJlZml4KTtcbiAgICAgIH0pO1xuXG4gICAgICBhelBhY2tldERyb3BDb3VudE1ldHJpY3NbYCR7a2V5cHJlZml4fSR7bmF0Z3dzW2F6XS5sZW5ndGh9YF0gPSBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyhwYWNrZXREcm9wQ291bnRNZXRyaWNzKS5qb2luKFwiK1wiKSxcbiAgICAgICAgdXNpbmdNZXRyaWNzOiBwYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChheiA9PSBhdmFpbGFiaWxpdHlab25lKSB7XG4gICAgICAgIGF6S2V5ID0gYCR7a2V5cHJlZml4fSR7bmF0Z3dzW2F6XS5sZW5ndGh9YDtcbiAgICAgIH1cblxuICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBBbGFybShcbiAgICAgIHNjb3BlLCBcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSkgKyBcIi1wYWNrZXQtbG9zcy1vdXRsaWVyXCIsIFxuICAgICAge1xuICAgICAgICAgbWV0cmljOiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgICAgZXhwcmVzc2lvbjogYCR7YXpLZXl9IC8gKCR7T2JqZWN0LmtleXMoYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzKS5qb2luKFwiK1wiKX0pYCxcbiAgICAgICAgICAgIHVzaW5nTWV0cmljczogYXpQYWNrZXREcm9wQ291bnRNZXRyaWNzLFxuICAgICAgICAgICAgcGVyaW9kOiBwZXJpb2RcbiAgICAgICAgIH0pLFxuICAgICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5JR05PUkVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkb05hdEdhdGV3YXlNZXRyaWNzKFxuICAgIHByb3BzOiBCYXNpY1NlcnZpY2VNdWx0aUFaT2JzZXJ2YWJpbGl0eVByb3BzXG4gICk6IHtba2V5OiBzdHJpbmddOiBJQWxhcm19IHtcblxuICAgIC8vIENvbGxlY3QgYWxhcm1zIGZvciBwYWNrZXQgZHJvcHMgZXhjZWVkaW5nIGEgdGhyZXNob2xkIHBlciBOQVQgR1dcbiAgICBsZXQgcGFja2V0TG9zc1BlckFaQWxhcm1zOiB7IFtrZXk6IHN0cmluZ106IElBbGFybSB9ID0ge307XG5cbiAgICAvLyBGb3IgZWFjaCBBWiwgY3JlYXRlIG1ldHJpY3MgZm9yIGVhY2ggTkFUIEdXXG4gICAgT2JqZWN0LmtleXModGhpcy5uYXRHYXRld2F5cyEpLmZvckVhY2goKGF6OiBzdHJpbmcpID0+IHtcblxuICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhei5zdWJzdHJpbmcoYXoubGVuZ3RoIC0gMSk7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkID1cbiAgICAgICAgdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAvLyBJcyB0aGVyZSBwYWNrZXQgbG9zcyBpbXBhY3Q/XG4gICAgICBsZXQgcGFja2V0TG9zc0ltcGFjdDogSUFsYXJtID0gQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuaXNUaGVyZUFuQVpQYWNrZXRMb3NzSW1wYWN0TkFUR1coXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMubmF0R2F0ZXdheXMhW2F6XSxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICBheixcbiAgICAgICAgcHJvcHMucGFja2V0TG9zc0ltcGFjdFBlcmNlbnRhZ2VUaHJlc2hvbGQgPyBwcm9wcy5wYWNrZXRMb3NzSW1wYWN0UGVyY2VudGFnZVRocmVzaG9sZCA6IDAuMDEsXG4gICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgIHByb3BzLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybVxuICAgICAgKTtcbiAgICAgIC8vIElzIHRoaXMgQVogYW4gb3V0bGllciBmb3IgdGhpcyBOQVRHVz9cbiAgICAgIGxldCBwYWNrZXRMb3NzT3V0bGllcjogSUFsYXJtID0gQmFzaWNTZXJ2aWNlTXVsdGlBWk9ic2VydmFiaWxpdHkuaXNBWkFuT3V0bGllckZvclBhY2tldExvc3NOQVRHVyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5uYXRHYXRld2F5cyEsXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgYXosXG4gICAgICAgIDAuNjYsXG4gICAgICAgIHByb3BzLnBlcmlvZCA/IHByb3BzLnBlcmlvZCA6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgIHByb3BzLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybVxuICAgICAgKTtcbiAgICAgIHBhY2tldExvc3NQZXJBWkFsYXJtc1thekxldHRlcl0gPSBuZXcgQ29tcG9zaXRlQWxhcm0odGhpcywgYXouc3Vic3RyaW5nKGF6Lmxlbmd0aCAtIDEpICsgXCItcGFja2V0LWxvc3MtY29tcG9zaXRlLWFsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1SdWxlOiBBbGFybVJ1bGUuYWxsT2YocGFja2V0TG9zc0ltcGFjdCwgcGFja2V0TG9zc091dGxpZXIpLFxuICAgICAgICBjb21wb3NpdGVBbGFybU5hbWU6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiLXBhY2tldC1sb3NzLWNvbXBvc2l0ZS1hbGFybVwiXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwYWNrZXRMb3NzUGVyQVpBbGFybXM7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsUGFja2V0RHJvcHNQZXJab25lKFxuICAgIG5hdGd3czoge1trZXk6IHN0cmluZ106IENmbk5hdEdhdGV3YXlbXX0sXG4gICAgcGVyaW9kOiBEdXJhdGlvblxuICApIDoge1trZXk6IHN0cmluZ106IElNZXRyaWN9XG4gIHtcbiAgICBsZXQgZHJvcHNQZXJab25lOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY30gPSB7fTtcbiAgICBsZXQgbWV0cmljc1BlckFaOiB7W2tleTogc3RyaW5nXTogSU1ldHJpY1tdfSA9IHt9O1xuICAgIGxldCBrZXlwcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcblxuICAgIE9iamVjdC5rZXlzKG5hdGd3cykuZm9yRWFjaCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nKSA9PiB7XG5cbiAgICAgIGxldCBhekxldHRlciA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkID0gdGhpcy5fYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICBpZiAoIShhekxldHRlciBpbiBtZXRyaWNzUGVyQVopKSB7XG4gICAgICAgIG1ldHJpY3NQZXJBWlthekxldHRlcl0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgbmF0Z3dzW2F2YWlsYWJpbGl0eVpvbmVdLmZvckVhY2goKG5hdGd3OiBDZm5OYXRHYXRld2F5KSA9PiB7XG5cbiAgICAgICAgbWV0cmljc1BlckFaW2F6TGV0dGVyXS5wdXNoKG5ldyBNZXRyaWMoe1xuICAgICAgICAgIG1ldHJpY05hbWU6ICdQYWNrZXRzRHJvcENvdW50JyxcbiAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvTkFUR2F0ZXdheScsXG4gICAgICAgICAgc3RhdGlzdGljOiBTdGF0cy5TVU0sXG4gICAgICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBwYWNrZXQgZHJvcHMnLFxuICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICAgIE5hdEdhdGV3YXlJZDogbmF0Z3cuYXR0ck5hdEdhdGV3YXlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBlcmlvZDogcGVyaW9kLFxuICAgICAgICB9KSk7XG4gICAgICB9KTsgICBcbiAgICB9KTtcblxuICAgIE9iamVjdC5rZXlzKG1ldHJpY3NQZXJBWikuZm9yRWFjaCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXpMZXR0ZXIgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZCA9IHRoaXMuX2F6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgbGV0IHVzaW5nTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0ge307XG5cbiAgICAgIG1ldHJpY3NQZXJBWlthekxldHRlcl0uZm9yRWFjaCgobWV0cmljOiBJTWV0cmljKSA9PiB7XG4gICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlwcmVmaXh9MWBdID0gbWV0cmljO1xuICAgICAgICBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleXByZWZpeCk7XG4gICAgICB9KTtcblxuICAgICAgZHJvcHNQZXJab25lW2F2YWlsYWJpbGl0eVpvbmVdID0gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKFwiK1wiKSxcbiAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiB0b3RhbCBwYWNrZXQgZHJvcHNcIixcbiAgICAgICAgcGVyaW9kOiBwZXJpb2RcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRyb3BzUGVyWm9uZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The options for calculating if an AZ is an outlier for latency for ALBs
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ApplicationLoadBalancerLatencyOutlierCalculation {
|
|
5
|
+
/**
|
|
6
|
+
* This will take the latency threshold and count the number of requests per AZ
|
|
7
|
+
* that exceed this threshold and then calculate the percentage of requests
|
|
8
|
+
* exceeding this threshold belong to each AZ. This provides a static comparison
|
|
9
|
+
* of the number of high latency requests in one AZ versus the others
|
|
10
|
+
*/
|
|
11
|
+
STATIC = "STATIC",
|
|
12
|
+
/**
|
|
13
|
+
* This calculates the z score of latency in one AZ against the other AZs. It uses
|
|
14
|
+
* the target response time of all requests to calculate the standard deviation and
|
|
15
|
+
* average for all AZs. This is the default.
|
|
16
|
+
*/
|
|
17
|
+
Z_SCORE = "Z_SCORE"
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApplicationLoadBalancerLatencyOutlierCalculation = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The options for calculating if an AZ is an outlier for latency for ALBs
|
|
6
|
+
*/
|
|
7
|
+
var ApplicationLoadBalancerLatencyOutlierCalculation;
|
|
8
|
+
(function (ApplicationLoadBalancerLatencyOutlierCalculation) {
|
|
9
|
+
/**
|
|
10
|
+
* This will take the latency threshold and count the number of requests per AZ
|
|
11
|
+
* that exceed this threshold and then calculate the percentage of requests
|
|
12
|
+
* exceeding this threshold belong to each AZ. This provides a static comparison
|
|
13
|
+
* of the number of high latency requests in one AZ versus the others
|
|
14
|
+
*/
|
|
15
|
+
ApplicationLoadBalancerLatencyOutlierCalculation["STATIC"] = "STATIC";
|
|
16
|
+
/**
|
|
17
|
+
* This calculates the z score of latency in one AZ against the other AZs. It uses
|
|
18
|
+
* the target response time of all requests to calculate the standard deviation and
|
|
19
|
+
* average for all AZs. This is the default.
|
|
20
|
+
*/
|
|
21
|
+
ApplicationLoadBalancerLatencyOutlierCalculation["Z_SCORE"] = "Z_SCORE";
|
|
22
|
+
})(ApplicationLoadBalancerLatencyOutlierCalculation || (exports.ApplicationLoadBalancerLatencyOutlierCalculation = ApplicationLoadBalancerLatencyOutlierCalculation = {}));
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJMYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jhc2ljX29ic2VydmFiaWxpdHkvcHJvcHMvQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJMYXRlbmN5T3V0bGllckNhbGN1bGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxnREFnQlg7QUFoQkQsV0FBWSxnREFBZ0Q7SUFFeEQ7Ozs7O09BS0c7SUFDSCxxRUFBaUIsQ0FBQTtJQUVqQjs7OztPQUlHO0lBQ0gsdUVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQWhCVyxnREFBZ0QsZ0VBQWhELGdEQUFnRCxRQWdCM0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBvcHRpb25zIGZvciBjYWxjdWxhdGluZyBpZiBhbiBBWiBpcyBhbiBvdXRsaWVyIGZvciBsYXRlbmN5IGZvciBBTEJzXG4gKi9cbmV4cG9ydCBlbnVtIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTGF0ZW5jeU91dGxpZXJDYWxjdWxhdGlvblxue1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCB0YWtlIHRoZSBsYXRlbmN5IHRocmVzaG9sZCBhbmQgY291bnQgdGhlIG51bWJlciBvZiByZXF1ZXN0cyBwZXIgQVogXG4gICAgICogdGhhdCBleGNlZWQgdGhpcyB0aHJlc2hvbGQgYW5kIHRoZW4gY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzXG4gICAgICogZXhjZWVkaW5nIHRoaXMgdGhyZXNob2xkIGJlbG9uZyB0byBlYWNoIEFaLiBUaGlzIHByb3ZpZGVzIGEgc3RhdGljIGNvbXBhcmlzb25cbiAgICAgKiBvZiB0aGUgbnVtYmVyIG9mIGhpZ2ggbGF0ZW5jeSByZXF1ZXN0cyBpbiBvbmUgQVogdmVyc3VzIHRoZSBvdGhlcnNcbiAgICAgKi9cbiAgICBTVEFUSUMgPSBcIlNUQVRJQ1wiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBjYWxjdWxhdGVzIHRoZSB6IHNjb3JlIG9mIGxhdGVuY3kgaW4gb25lIEFaIGFnYWluc3QgdGhlIG90aGVyIEFacy4gSXQgdXNlc1xuICAgICAqIHRoZSB0YXJnZXQgcmVzcG9uc2UgdGltZSBvZiBhbGwgcmVxdWVzdHMgdG8gY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gYW5kXG4gICAgICogYXZlcmFnZSBmb3IgYWxsIEFacy4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBaX1NDT1JFPSBcIlpfU0NPUkVcIlxufSJdfQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Duration } from 'aws-cdk-lib';
|
|
2
2
|
import { CfnNatGateway } from 'aws-cdk-lib/aws-ec2';
|
|
3
3
|
import { IApplicationLoadBalancer } from 'aws-cdk-lib/aws-elasticloadbalancingv2';
|
|
4
|
+
import { ApplicationLoadBalancerLatencyOutlierCalculation } from './ApplicationLoadBalancerLatencyOutlierCalculation';
|
|
4
5
|
/**
|
|
5
6
|
* Properties for creating basic multi-AZ observability
|
|
6
7
|
*/
|
|
@@ -106,4 +107,9 @@ export interface BasicServiceMultiAZObservabilityProps {
|
|
|
106
107
|
* The number of datapoints to alarm on for latency and availability alarms
|
|
107
108
|
*/
|
|
108
109
|
readonly datapointsToAlarm: number;
|
|
110
|
+
/**
|
|
111
|
+
* The method used to determine if an AZ is an outlier for latency for Application Load Balancer metrics.
|
|
112
|
+
* @default Z_SCORE
|
|
113
|
+
*/
|
|
114
|
+
readonly latencyOutlierCalculation?: ApplicationLoadBalancerLatencyOutlierCalculation;
|
|
109
115
|
}
|