ec2-instance-running-scheduler 0.4.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +12 -0
- package/.jsii +561 -117
- package/API.md +613 -54
- package/README.md +46 -64
- package/assets/funcs/running-scheduler.lambda/index.js +668 -335
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +5 -4
- package/lib/constructs/ec2-instance-running-scheduler.js +8 -4
- package/lib/constructs/lambda-failure-detector/lambda-failure-detection.d.ts +26 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detection.js +9 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detector.d.ts +99 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detector.js +172 -0
- package/lib/constructs/lambda-failure-detector/log-failure-filter.d.ts +22 -0
- package/lib/constructs/lambda-failure-detector/log-failure-filter.js +3 -0
- package/lib/constructs/running-scheduler-failure-detection.d.ts +21 -36
- package/lib/constructs/running-scheduler-failure-detection.js +54 -132
- package/lib/funcs/running-scheduler-wait-env.js +5 -5
- package/lib/funcs/running-scheduler.lambda.js +4 -3
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +3 -3
- package/lib/stacks/ec2-instance-running-schedule-stack.js +3 -3
- package/package.json +5 -4
|
@@ -3,53 +3,42 @@ import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
|
3
3
|
import * as logs from 'aws-cdk-lib/aws-logs';
|
|
4
4
|
import * as sns from 'aws-cdk-lib/aws-sns';
|
|
5
5
|
import { Construct } from 'constructs';
|
|
6
|
+
import { LambdaFailureDetector, type LambdaFailureDetection } from './lambda-failure-detector/lambda-failure-detector';
|
|
6
7
|
/**
|
|
7
8
|
* Props accepted by {@link createRunningSchedulerFailureDetection}.
|
|
8
9
|
*/
|
|
9
10
|
interface CreateRunningSchedulerFailureDetectionProps {
|
|
10
|
-
/** Failure detection options; alarms are created only when {@link
|
|
11
|
-
readonly failureDetection?:
|
|
11
|
+
/** Failure detection options; alarms are created only when {@link RunningSchedulerFailureDetectionProps.enabled} is true. */
|
|
12
|
+
readonly failureDetection?: RunningSchedulerFailureDetectionProps;
|
|
12
13
|
/** Running scheduler Lambda to monitor. */
|
|
13
14
|
readonly runningScheduleFunction: lambda.IFunction;
|
|
14
15
|
/** Application log group for the running scheduler Lambda. */
|
|
15
16
|
readonly logGroup: logs.ILogGroup;
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
*
|
|
19
|
+
* Opt-in failure detection for `EC2InstanceRunningScheduler`.
|
|
19
20
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* Pass as `EC2InstanceRunningSchedulerProps.failureDetection`. Extends
|
|
22
|
+
* {@link LambdaFailureDetection} (`enabled` / `alarmTopic`). Which log failures are
|
|
23
|
+
* monitored is defined in this module and applied by {@link RunningSchedulerFailureDetection}.
|
|
23
24
|
*/
|
|
24
|
-
export interface
|
|
25
|
-
/**
|
|
26
|
-
* When true, creates failure detection alarms and log-based metrics.
|
|
27
|
-
*
|
|
28
|
-
* @default false when omitted
|
|
29
|
-
*/
|
|
30
|
-
readonly enabled?: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* SNS topic for alarm notifications.
|
|
33
|
-
*
|
|
34
|
-
* When omitted, alarms are created without SNS actions.
|
|
35
|
-
*/
|
|
36
|
-
readonly alarmTopic?: sns.ITopic;
|
|
25
|
+
export interface RunningSchedulerFailureDetectionProps extends LambdaFailureDetection {
|
|
37
26
|
}
|
|
38
27
|
/**
|
|
39
|
-
*
|
|
28
|
+
* Lambda and log group monitored by {@link RunningSchedulerFailureDetection}.
|
|
29
|
+
*
|
|
30
|
+
* Normally `EC2InstanceRunningScheduler` creates this binding. Use directly only when
|
|
31
|
+
* composing failure detection outside the scheduler construct.
|
|
40
32
|
*/
|
|
41
|
-
export interface
|
|
42
|
-
|
|
43
|
-
readonly failureDetection: FailureDetectionAlarms;
|
|
44
|
-
/** Running scheduler Lambda to monitor. */
|
|
33
|
+
export interface RunningSchedulerFailureDetectionResourcesProps {
|
|
34
|
+
readonly alarmTopic?: sns.ITopic;
|
|
45
35
|
readonly runningScheduleFunction: lambda.IFunction;
|
|
46
|
-
/** Application log group for the running scheduler Lambda. */
|
|
47
36
|
readonly logGroup: logs.ILogGroup;
|
|
48
37
|
}
|
|
49
38
|
/**
|
|
50
|
-
* CloudWatch alarms and log-based metrics for the running scheduler
|
|
39
|
+
* CloudWatch alarms and log-based metrics for the EC2 instance running scheduler.
|
|
51
40
|
*
|
|
52
|
-
*
|
|
41
|
+
* Extends {@link LambdaFailureDetector} with scheduler-specific log filters:
|
|
53
42
|
* - `lambdaErrorsAlarm` – `AWS/Lambda` `Errors` metric.
|
|
54
43
|
* - `instanceStatusFailureAlarm` – log filter for `ResourceWaitFailed:*`.
|
|
55
44
|
* - `slackPostFailureAlarm` – log filter for `running-scheduler: Slack post failed`.
|
|
@@ -57,23 +46,19 @@ export interface RunningSchedulerFailureDetectionProps {
|
|
|
57
46
|
*
|
|
58
47
|
* Custom metrics are published under the `EC2InstanceRunningScheduler` namespace.
|
|
59
48
|
*/
|
|
60
|
-
export declare class RunningSchedulerFailureDetection extends
|
|
61
|
-
/** SNS topic used for alarm actions, when configured. */
|
|
62
|
-
readonly alarmTopic?: sns.ITopic;
|
|
63
|
-
/** Fires when the Lambda `Errors` metric is non-zero. */
|
|
64
|
-
readonly lambdaErrorsAlarm: cloudwatch.Alarm;
|
|
65
|
-
/** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
|
|
66
|
-
readonly durableExecutionFailureAlarm: cloudwatch.Alarm;
|
|
49
|
+
export declare class RunningSchedulerFailureDetection extends LambdaFailureDetector {
|
|
67
50
|
/** Fires when instance stable-state waiting fails (`ResourceWaitFailed:*`). */
|
|
68
51
|
readonly instanceStatusFailureAlarm: cloudwatch.Alarm;
|
|
69
52
|
/** Fires when Slack `chat.postMessage` fails. */
|
|
70
53
|
readonly slackPostFailureAlarm: cloudwatch.Alarm;
|
|
54
|
+
/** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
|
|
55
|
+
readonly durableExecutionFailureAlarm: cloudwatch.Alarm;
|
|
71
56
|
/**
|
|
72
57
|
* @param scope - Parent construct.
|
|
73
58
|
* @param id - Construct id.
|
|
74
|
-
* @param props - Lambda, log group, and
|
|
59
|
+
* @param props - Lambda, log group, and optional alarm notification topic.
|
|
75
60
|
*/
|
|
76
|
-
constructor(scope: Construct, id: string, props:
|
|
61
|
+
constructor(scope: Construct, id: string, props: RunningSchedulerFailureDetectionResourcesProps);
|
|
77
62
|
}
|
|
78
63
|
/**
|
|
79
64
|
* Creates failure detection alarms when enabled in props.
|
|
@@ -1,85 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.createRunningSchedulerFailureDetection = exports.RunningSchedulerFailureDetection = void 0;
|
|
37
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
const cloudwatch_actions = __importStar(require("aws-cdk-lib/aws-cloudwatch-actions"));
|
|
41
|
-
const logs = __importStar(require("aws-cdk-lib/aws-logs"));
|
|
42
|
-
const constructs_1 = require("constructs");
|
|
43
|
-
/** CloudWatch custom metric namespace for log-based failure detection metrics. */
|
|
5
|
+
const lambda_failure_detector_1 = require("./lambda-failure-detector/lambda-failure-detector");
|
|
6
|
+
/** CloudWatch custom metric namespace for running-scheduler log-based failure metrics. */
|
|
44
7
|
const METRIC_NAMESPACE = 'EC2InstanceRunningScheduler';
|
|
45
|
-
const
|
|
8
|
+
const INSTANCE_STATUS_FAILURE_ID = 'InstanceStatusFailure';
|
|
9
|
+
const SLACK_POST_FAILURE_ID = 'SlackPostFailure';
|
|
10
|
+
const DURABLE_EXECUTION_FAILURE_ID = 'DurableExecutionFailure';
|
|
46
11
|
/**
|
|
47
|
-
*
|
|
12
|
+
* Log-based failure filters for the EC2 running scheduler Lambda.
|
|
48
13
|
*
|
|
49
|
-
*
|
|
50
|
-
* @param alarmTopic - Optional SNS topic from {@link FailureDetectionAlarms.alarmTopic}.
|
|
14
|
+
* Defined in one place for this construct; passed into {@link LambdaFailureDetector}.
|
|
51
15
|
*/
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
16
|
+
const RUNNING_SCHEDULER_LOG_FILTERS = [
|
|
17
|
+
{
|
|
18
|
+
id: INSTANCE_STATUS_FAILURE_ID,
|
|
19
|
+
filterPattern: '"ResourceWaitFailed"',
|
|
20
|
+
metricNamespace: METRIC_NAMESPACE,
|
|
21
|
+
metricName: 'InstanceStatusFailure',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: SLACK_POST_FAILURE_ID,
|
|
25
|
+
filterPattern: '"running-scheduler: Slack post failed"',
|
|
26
|
+
metricNamespace: METRIC_NAMESPACE,
|
|
27
|
+
metricName: 'SlackPostFailure',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: DURABLE_EXECUTION_FAILURE_ID,
|
|
31
|
+
filterPattern: '"ERROR" - "processOneResource" - "ResourceWaitFailed" - "running-scheduler: Slack post failed"',
|
|
32
|
+
metricNamespace: METRIC_NAMESPACE,
|
|
33
|
+
metricName: 'DurableExecutionFailure',
|
|
34
|
+
},
|
|
35
|
+
];
|
|
58
36
|
/**
|
|
59
|
-
*
|
|
37
|
+
* Resolves a required log-filter alarm created from the scheduler log filters.
|
|
60
38
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* @
|
|
64
|
-
* @
|
|
65
|
-
* @param props - Metric to alarm on and optional SNS topic.
|
|
66
|
-
* @returns Configured CloudWatch alarm.
|
|
39
|
+
* @param detector - Detector that owns the log-filter alarms.
|
|
40
|
+
* @param id - {@link LogFailureFilter} id.
|
|
41
|
+
* @returns The CloudWatch alarm for that filter.
|
|
42
|
+
* @throws {Error} When no alarm exists for the given id.
|
|
67
43
|
*/
|
|
68
|
-
const
|
|
69
|
-
const alarm =
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
evaluationPeriods: 1,
|
|
74
|
-
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
75
|
-
});
|
|
76
|
-
attachAlarmActions(alarm, props.alarmTopic);
|
|
44
|
+
const requireLogFilterAlarm = (detector, id) => {
|
|
45
|
+
const alarm = detector.findLogFilterAlarm(id);
|
|
46
|
+
if (!alarm) {
|
|
47
|
+
throw new Error(`RunningSchedulerFailureDetection: missing log filter alarm for id "${id}".`);
|
|
48
|
+
}
|
|
77
49
|
return alarm;
|
|
78
50
|
};
|
|
79
51
|
/**
|
|
80
|
-
* CloudWatch alarms and log-based metrics for the running scheduler
|
|
52
|
+
* CloudWatch alarms and log-based metrics for the EC2 instance running scheduler.
|
|
81
53
|
*
|
|
82
|
-
*
|
|
54
|
+
* Extends {@link LambdaFailureDetector} with scheduler-specific log filters:
|
|
83
55
|
* - `lambdaErrorsAlarm` – `AWS/Lambda` `Errors` metric.
|
|
84
56
|
* - `instanceStatusFailureAlarm` – log filter for `ResourceWaitFailed:*`.
|
|
85
57
|
* - `slackPostFailureAlarm` – log filter for `running-scheduler: Slack post failed`.
|
|
@@ -87,79 +59,29 @@ const createLogSumAlarm = (scope, id, props) => {
|
|
|
87
59
|
*
|
|
88
60
|
* Custom metrics are published under the `EC2InstanceRunningScheduler` namespace.
|
|
89
61
|
*/
|
|
90
|
-
class RunningSchedulerFailureDetection extends
|
|
91
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.RunningSchedulerFailureDetection", version: "0.
|
|
92
|
-
/** SNS topic used for alarm actions, when configured. */
|
|
93
|
-
alarmTopic;
|
|
94
|
-
/** Fires when the Lambda `Errors` metric is non-zero. */
|
|
95
|
-
lambdaErrorsAlarm;
|
|
96
|
-
/** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
|
|
97
|
-
durableExecutionFailureAlarm;
|
|
62
|
+
class RunningSchedulerFailureDetection extends lambda_failure_detector_1.LambdaFailureDetector {
|
|
63
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.RunningSchedulerFailureDetection", version: "0.5.0" };
|
|
98
64
|
/** Fires when instance stable-state waiting fails (`ResourceWaitFailed:*`). */
|
|
99
65
|
instanceStatusFailureAlarm;
|
|
100
66
|
/** Fires when Slack `chat.postMessage` fails. */
|
|
101
67
|
slackPostFailureAlarm;
|
|
68
|
+
/** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
|
|
69
|
+
durableExecutionFailureAlarm;
|
|
102
70
|
/**
|
|
103
71
|
* @param scope - Parent construct.
|
|
104
72
|
* @param id - Construct id.
|
|
105
|
-
* @param props - Lambda, log group, and
|
|
73
|
+
* @param props - Lambda, log group, and optional alarm notification topic.
|
|
106
74
|
*/
|
|
107
75
|
constructor(scope, id, props) {
|
|
108
|
-
super(scope, id
|
|
109
|
-
|
|
110
|
-
this.alarmTopic = alarmTopic;
|
|
111
|
-
this.lambdaErrorsAlarm = createLogSumAlarm(this, 'LambdaErrorsAlarm', {
|
|
112
|
-
metric: props.runningScheduleFunction.metricErrors({
|
|
113
|
-
period: aws_cdk_lib_1.Duration.minutes(5),
|
|
114
|
-
statistic: 'Sum',
|
|
115
|
-
}),
|
|
116
|
-
alarmTopic,
|
|
117
|
-
});
|
|
118
|
-
const instanceStatusFailureMetric = new logs.MetricFilter(this, 'InstanceStatusFailureMetric', {
|
|
119
|
-
logGroup: props.logGroup,
|
|
120
|
-
filterPattern: logs.FilterPattern.literal('"ResourceWaitFailed"'),
|
|
121
|
-
metricNamespace: METRIC_NAMESPACE,
|
|
122
|
-
metricName: 'InstanceStatusFailure',
|
|
123
|
-
metricValue: '1',
|
|
124
|
-
defaultValue: 0,
|
|
125
|
-
});
|
|
126
|
-
this.instanceStatusFailureAlarm = createLogSumAlarm(this, 'InstanceStatusFailureAlarm', {
|
|
127
|
-
metric: instanceStatusFailureMetric.metric({
|
|
128
|
-
period: aws_cdk_lib_1.Duration.minutes(5),
|
|
129
|
-
statistic: 'Sum',
|
|
130
|
-
}),
|
|
131
|
-
alarmTopic,
|
|
132
|
-
});
|
|
133
|
-
const slackPostFailureMetric = new logs.MetricFilter(this, 'SlackPostFailureMetric', {
|
|
76
|
+
super(scope, id, {
|
|
77
|
+
lambdaFunction: props.runningScheduleFunction,
|
|
134
78
|
logGroup: props.logGroup,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
metricName: 'SlackPostFailure',
|
|
138
|
-
metricValue: '1',
|
|
139
|
-
defaultValue: 0,
|
|
140
|
-
});
|
|
141
|
-
this.slackPostFailureAlarm = createLogSumAlarm(this, 'SlackPostFailureAlarm', {
|
|
142
|
-
metric: slackPostFailureMetric.metric({
|
|
143
|
-
period: aws_cdk_lib_1.Duration.minutes(5),
|
|
144
|
-
statistic: 'Sum',
|
|
145
|
-
}),
|
|
146
|
-
alarmTopic,
|
|
147
|
-
});
|
|
148
|
-
const durableExecutionFailureMetric = new logs.MetricFilter(this, 'DurableExecutionFailureMetric', {
|
|
149
|
-
logGroup: props.logGroup,
|
|
150
|
-
filterPattern: logs.FilterPattern.literal('"ERROR" - "processOneResource" - "ResourceWaitFailed" - "running-scheduler: Slack post failed"'),
|
|
151
|
-
metricNamespace: METRIC_NAMESPACE,
|
|
152
|
-
metricName: 'DurableExecutionFailure',
|
|
153
|
-
metricValue: '1',
|
|
154
|
-
defaultValue: 0,
|
|
155
|
-
});
|
|
156
|
-
this.durableExecutionFailureAlarm = createLogSumAlarm(this, 'DurableExecutionFailureAlarm', {
|
|
157
|
-
metric: durableExecutionFailureMetric.metric({
|
|
158
|
-
period: aws_cdk_lib_1.Duration.minutes(5),
|
|
159
|
-
statistic: 'Sum',
|
|
160
|
-
}),
|
|
161
|
-
alarmTopic,
|
|
79
|
+
alarmTopic: props.alarmTopic,
|
|
80
|
+
logFilters: RUNNING_SCHEDULER_LOG_FILTERS,
|
|
162
81
|
});
|
|
82
|
+
this.instanceStatusFailureAlarm = requireLogFilterAlarm(this, INSTANCE_STATUS_FAILURE_ID);
|
|
83
|
+
this.slackPostFailureAlarm = requireLogFilterAlarm(this, SLACK_POST_FAILURE_ID);
|
|
84
|
+
this.durableExecutionFailureAlarm = requireLogFilterAlarm(this, DURABLE_EXECUTION_FAILURE_ID);
|
|
163
85
|
}
|
|
164
86
|
}
|
|
165
87
|
exports.RunningSchedulerFailureDetection = RunningSchedulerFailureDetection;
|
|
@@ -172,14 +94,14 @@ exports.RunningSchedulerFailureDetection = RunningSchedulerFailureDetection;
|
|
|
172
94
|
* @returns Failure detection construct, or undefined when disabled.
|
|
173
95
|
*/
|
|
174
96
|
const createRunningSchedulerFailureDetection = (scope, id, props) => {
|
|
175
|
-
if (!props.failureDetection || !
|
|
97
|
+
if (!props.failureDetection || !(0, lambda_failure_detector_1.isLambdaFailureDetectionEnabled)(props.failureDetection)) {
|
|
176
98
|
return undefined;
|
|
177
99
|
}
|
|
178
100
|
return new RunningSchedulerFailureDetection(scope, id, {
|
|
179
|
-
|
|
101
|
+
alarmTopic: props.failureDetection.alarmTopic,
|
|
180
102
|
runningScheduleFunction: props.runningScheduleFunction,
|
|
181
103
|
logGroup: props.logGroup,
|
|
182
104
|
});
|
|
183
105
|
};
|
|
184
106
|
exports.createRunningSchedulerFailureDetection = createRunningSchedulerFailureDetection;
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLHVFQUF5RDtBQUN6RCx1RkFBeUU7QUFFekUsMkRBQTZDO0FBRTdDLDJDQUF1QztBQUV2QyxrRkFBa0Y7QUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQztBQWdEdkQsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLGdCQUF3QyxFQUFXLEVBQUUsQ0FDdEYsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztBQUVwQzs7Ozs7R0FLRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUF1QixFQUFFLFVBQXVCLEVBQVEsRUFBRTtJQUNwRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTztJQUNULENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FHQyxFQUNpQixFQUFFO0lBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzVDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixTQUFTLEVBQUUsQ0FBQztRQUNaLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0M7UUFDcEYsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixnQkFBZ0Is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QUFhLENBQUMsT0FBTyxDQUFDLGdHQUFnRyxDQUFDO1lBQzNJLGVBQWUsRUFBRSxnQkFBZ0I7WUFDakMsVUFBVSxFQUFFLHlCQUF5QjtZQUNyQyxXQUFXLEVBQUUsR0FBRztZQUNoQixZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLDhCQUE4QixFQUFFO1lBQzFGLE1BQU0sRUFBRSw2QkFBNkIsQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7WUFDRixVQUFVO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE5RUgsNEVBK0VDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtELEVBQ0osRUFBRTtJQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNsRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDckQsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4Qyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO1FBQ3RELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFkVyxRQUFBLHNDQUFzQywwQ0FjakQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaF9hY3Rpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqIENsb3VkV2F0Y2ggY3VzdG9tIG1ldHJpYyBuYW1lc3BhY2UgZm9yIGxvZy1iYXNlZCBmYWlsdXJlIGRldGVjdGlvbiBtZXRyaWNzLiAqL1xuY29uc3QgTUVUUklDX05BTUVTUEFDRSA9ICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInO1xuXG4vKipcbiAqIFByb3BzIGFjY2VwdGVkIGJ5IHtAbGluayBjcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzIHtcbiAgLyoqIEZhaWx1cmUgZGV0ZWN0aW9uIG9wdGlvbnM7IGFsYXJtcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4ge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMuZW5hYmxlZH0gaXMgdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZURldGVjdGlvbj86IEZhaWx1cmVEZXRlY3Rpb25BbGFybXM7XG4gIC8qKiBSdW5uaW5nIHNjaGVkdWxlciBMYW1iZGEgdG8gbW9uaXRvci4gKi9cbiAgcmVhZG9ubHkgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIC8qKiBBcHBsaWNhdGlvbiBsb2cgZ3JvdXAgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBDbG91ZFdhdGNoIGFsYXJtcyBhbmQgbG9nLWJhc2VkIG1ldHJpY3MgZm9yIG9wZXJhdGlvbmFsIGZhaWx1cmUgZGV0ZWN0aW9uLlxuICpcbiAqIFdoZW4ge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMuZW5hYmxlZH0gaXMgdHJ1ZSwgdGhlIGNvbnN0cnVjdCBjcmVhdGVzIGFsYXJtcyBmb3IgTGFtYmRhXG4gKiBlcnJvcnMsIER1cmFibGUgaGFuZGxlciBmYWlsdXJlcywgRUMyIGluc3RhbmNlIHN0YXR1cyB3YWl0IGZhaWx1cmVzLCBhbmQgU2xhY2sgcG9zdCBmYWlsdXJlcy5cbiAqIEFsYXJtcyBjYW4gb3B0aW9uYWxseSBub3RpZnkgYW4gU05TIHRvcGljIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZURldGVjdGlvbkFsYXJtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZmFpbHVyZSBkZXRlY3Rpb24gYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2Ugd2hlbiBvbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNOUyB0b3BpYyBmb3IgYWxhcm0gbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBhbGFybXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBTTlMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMge1xuICAvKiogQWxhcm0gY29uZmlndXJhdGlvbiAobXVzdCBoYXZlIHtAbGluayBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zLmVuYWJsZWR9IHRydWUpLiAqL1xuICByZWFkb25seSBmYWlsdXJlRGV0ZWN0aW9uOiBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zO1xuICAvKiogUnVubmluZyBzY2hlZHVsZXIgTGFtYmRhIHRvIG1vbml0b3IuICovXG4gIHJlYWRvbmx5IHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uO1xuICAvKiogQXBwbGljYXRpb24gbG9nIGdyb3VwIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLiAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG59XG5cbmNvbnN0IGlzRmFpbHVyZURldGVjdGlvbkVuYWJsZWQgPSAoZmFpbHVyZURldGVjdGlvbjogRmFpbHVyZURldGVjdGlvbkFsYXJtcyk6IGJvb2xlYW4gPT5cbiAgZmFpbHVyZURldGVjdGlvbi5lbmFibGVkID09PSB0cnVlO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBTTlMgYWxhcm0gYWN0aW9uIHdoZW4gYSB0b3BpYyBpcyBjb25maWd1cmVkLlxuICpcbiAqIEBwYXJhbSBhbGFybSAtIENsb3VkV2F0Y2ggYWxhcm0gdG8gbm90aWZ5LlxuICogQHBhcmFtIGFsYXJtVG9waWMgLSBPcHRpb25hbCBTTlMgdG9waWMgZnJvbSB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtcy5hbGFybVRvcGljfS5cbiAqL1xuY29uc3QgYXR0YWNoQWxhcm1BY3Rpb25zID0gKGFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtLCBhbGFybVRvcGljPzogc25zLklUb3BpYyk6IHZvaWQgPT4ge1xuICBpZiAoIWFsYXJtVG9waWMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhbGFybS5hZGRBbGFybUFjdGlvbihuZXcgY2xvdWR3YXRjaF9hY3Rpb25zLlNuc0FjdGlvbihhbGFybVRvcGljKSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIGFsYXJtIHRoYXQgZmlyZXMgd2hlbiBhIHN1bSBtZXRyaWMgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuXG4gKlxuICogVXNlcyBgdHJlYXRNaXNzaW5nRGF0YTogbm90QnJlYWNoaW5nYCBzbyBzY2hlZHVsZWQgaW52b2NhdGlvbnMgZG8gbm90IGFsYXJtIGJldHdlZW4gcnVucy5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICogQHBhcmFtIGlkIC0gQWxhcm0gY29uc3RydWN0IGlkLlxuICogQHBhcmFtIHByb3BzIC0gTWV0cmljIHRvIGFsYXJtIG9uIGFuZCBvcHRpb25hbCBTTlMgdG9waWMuXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIENsb3VkV2F0Y2ggYWxhcm0uXG4gKi9cbmNvbnN0IGNyZWF0ZUxvZ1N1bUFsYXJtID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogc3RyaW5nLFxuICBwcm9wczoge1xuICAgIG1ldHJpYzogY2xvdWR3YXRjaC5JTWV0cmljO1xuICAgIGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICB9LFxuKTogY2xvdWR3YXRjaC5BbGFybSA9PiB7XG4gIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgbWV0cmljOiBwcm9wcy5tZXRyaWMsXG4gICAgdGhyZXNob2xkOiAxLFxuICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgfSBhcyBjbG91ZHdhdGNoLkFsYXJtUHJvcHMpO1xuICBhdHRhY2hBbGFybUFjdGlvbnMoYWxhcm0sIHByb3BzLmFsYXJtVG9waWMpO1xuICByZXR1cm4gYWxhcm07XG59O1xuXG4vKipcbiAqIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcyBmb3IgdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIExhbWJkYS5cbiAqXG4gKiBXaGVuIGVuYWJsZWQsIGNyZWF0ZXMgZm91ciBhbGFybXM6XG4gKiAtIGBsYW1iZGFFcnJvcnNBbGFybWAg4oCTIGBBV1MvTGFtYmRhYCBgRXJyb3JzYCBtZXRyaWMuXG4gKiAtIGBpbnN0YW5jZVN0YXR1c0ZhaWx1cmVBbGFybWAg4oCTIGxvZyBmaWx0ZXIgZm9yIGBSZXNvdXJjZVdhaXRGYWlsZWQ6KmAuXG4gKiAtIGBzbGFja1Bvc3RGYWlsdXJlQWxhcm1gIOKAkyBsb2cgZmlsdGVyIGZvciBgcnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkYC5cbiAqIC0gYGR1cmFibGVFeGVjdXRpb25GYWlsdXJlQWxhcm1gIOKAkyBvdGhlciBoYW5kbGVyLWxldmVsIGBFUlJPUmAgbG9ncyAoZXhjbHVkaW5nIHRoZSBhYm92ZSkuXG4gKlxuICogQ3VzdG9tIG1ldHJpY3MgYXJlIHB1Ymxpc2hlZCB1bmRlciB0aGUgYEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcmAgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKiogU05TIHRvcGljIHVzZWQgZm9yIGFsYXJtIGFjdGlvbnMsIHdoZW4gY29uZmlndXJlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgTGFtYmRhIGBFcnJvcnNgIG1ldHJpYyBpcyBub24temVyby4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYUVycm9yc0FsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuICAvKiogRmlyZXMgb24gaGFuZGxlci1sZXZlbCBFUlJPUiBsb2dzIG91dHNpZGUgaW5zdGFuY2Ugd2FpdGluZyBhbmQgU2xhY2sgcG9zdCBmYWlsdXJlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGR1cmFibGVFeGVjdXRpb25GYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG4gIC8qKiBGaXJlcyB3aGVuIGluc3RhbmNlIHN0YWJsZS1zdGF0ZSB3YWl0aW5nIGZhaWxzIChgUmVzb3VyY2VXYWl0RmFpbGVkOipgKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlU3RhdHVzRmFpbHVyZUFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuICAvKiogRmlyZXMgd2hlbiBTbGFjayBgY2hhdC5wb3N0TWVzc2FnZWAgZmFpbHMuICovXG4gIHB1YmxpYyByZWFkb25seSBzbGFja1Bvc3RGYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3QuXG4gICAqIEBwYXJhbSBpZCAtIENvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIHByb3BzIC0gTGFtYmRhLCBsb2cgZ3JvdXAsIGFuZCB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtc30gKG11c3QgaGF2ZSBgZW5hYmxlZDogdHJ1ZWApLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgYWxhcm1Ub3BpYyA9IHByb3BzLmZhaWx1cmVEZXRlY3Rpb24uYWxhcm1Ub3BpYztcbiAgICB0aGlzLmFsYXJtVG9waWMgPSBhbGFybVRvcGljO1xuXG4gICAgdGhpcy5sYW1iZGFFcnJvcnNBbGFybSA9IGNyZWF0ZUxvZ1N1bUFsYXJtKHRoaXMsICdMYW1iZGFFcnJvcnNBbGFybScsIHtcbiAgICAgIG1ldHJpYzogcHJvcHMucnVubmluZ1NjaGVkdWxlRnVuY3Rpb24ubWV0cmljRXJyb3JzKHtcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgfSksXG4gICAgICBhbGFybVRvcGljLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5zdGFuY2VTdGF0dXNGYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmVNZXRyaWMnLCB7XG4gICAgICBsb2dHcm91cDogcHJvcHMubG9nR3JvdXAsXG4gICAgICBmaWx0ZXJQYXR0ZXJuOiBsb2dzLkZpbHRlclBhdHRlcm4ubGl0ZXJhbCgnXCJSZXNvdXJjZVdhaXRGYWlsZWRcIicpLFxuICAgICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZTogJ0luc3RhbmNlU3RhdHVzRmFpbHVyZScsXG4gICAgICBtZXRyaWNWYWx1ZTogJzEnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0gPSBjcmVhdGVMb2dTdW1BbGFybSh0aGlzLCAnSW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0nLCB7XG4gICAgICBtZXRyaWM6IGluc3RhbmNlU3RhdHVzRmFpbHVyZU1ldHJpYy5tZXRyaWMoe1xuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICB9KSxcbiAgICAgIGFsYXJtVG9waWMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzbGFja1Bvc3RGYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdTbGFja1Bvc3RGYWlsdXJlTWV0cmljJywge1xuICAgICAgbG9nR3JvdXA6IHByb3BzLmxvZ0dyb3VwLFxuICAgICAgZmlsdGVyUGF0dGVybjogbG9ncy5GaWx0ZXJQYXR0ZXJuLmxpdGVyYWwoJ1wicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInKSxcbiAgICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWU6ICdTbGFja1Bvc3RGYWlsdXJlJyxcbiAgICAgIG1ldHJpY1ZhbHVlOiAnMScsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSk7XG4gICAgdGhpcy5zbGFja1Bvc3RGYWlsdXJlQWxhcm0gPSBjcmVhdGVMb2dTdW1BbGFybSh0aGlzLCAnU2xhY2tQb3N0RmFpbHVyZUFsYXJtJywge1xuICAgICAgbWV0cmljOiBzbGFja1Bvc3RGYWlsdXJlTWV0cmljLm1ldHJpYyh7XG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgIH0pLFxuICAgICAgYWxhcm1Ub3BpYyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGR1cmFibGVFeGVjdXRpb25GYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZU1ldHJpYycsIHtcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGZpbHRlclBhdHRlcm46IGxvZ3MuRmlsdGVyUGF0dGVybi5saXRlcmFsKCdcIkVSUk9SXCIgLSBcInByb2Nlc3NPbmVSZXNvdXJjZVwiIC0gXCJSZXNvdXJjZVdhaXRGYWlsZWRcIiAtIFwicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInKSxcbiAgICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWU6ICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZScsXG4gICAgICBtZXRyaWNWYWx1ZTogJzEnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuZHVyYWJsZUV4ZWN1dGlvbkZhaWx1cmVBbGFybSA9IGNyZWF0ZUxvZ1N1bUFsYXJtKHRoaXMsICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtJywge1xuICAgICAgbWV0cmljOiBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZU1ldHJpYy5tZXRyaWMoe1xuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICB9KSxcbiAgICAgIGFsYXJtVG9waWMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcyB3aGVuIGVuYWJsZWQgaW4gcHJvcHMuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdC5cbiAqIEBwYXJhbSBpZCAtIENvbnN0cnVjdCBpZC5cbiAqIEBwYXJhbSBwcm9wcyAtIExhbWJkYSwgbG9nIGdyb3VwLCBhbmQgb3B0aW9uYWwgYWxhcm0gY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIEZhaWx1cmUgZGV0ZWN0aW9uIGNvbnN0cnVjdCwgb3IgdW5kZWZpbmVkIHdoZW4gZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbiA9IChcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgcHJvcHM6IENyZWF0ZVJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMsXG4pOiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghcHJvcHMuZmFpbHVyZURldGVjdGlvbiB8fCAhaXNGYWlsdXJlRGV0ZWN0aW9uRW5hYmxlZChwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uKHNjb3BlLCBpZCwge1xuICAgIGZhaWx1cmVEZXRlY3Rpb246IHByb3BzLmZhaWx1cmVEZXRlY3Rpb24sXG4gICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IHByb3BzLnJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgfSk7XG59O1xuIl19
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBS0EsK0ZBSzJEO0FBRTNELDBGQUEwRjtBQUMxRixNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsdUJBQXVCLENBQUM7QUFDM0QsTUFBTSxxQkFBcUIsR0FBRyxrQkFBa0IsQ0FBQztBQUNqRCxNQUFNLDRCQUE0QixHQUFHLHlCQUF5QixDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLDZCQUE2QixHQUF1QjtJQUN4RDtRQUNFLEVBQUUsRUFBRSwwQkFBMEI7UUFDOUIsYUFBYSxFQUFFLHNCQUFzQjtRQUNyQyxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSx1QkFBdUI7S0FDcEM7SUFDRDtRQUNFLEVBQUUsRUFBRSxxQkFBcUI7UUFDekIsYUFBYSxFQUFFLHdDQUF3QztRQUN2RCxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSxrQkFBa0I7S0FDL0I7SUFDRDtRQUNFLEVBQUUsRUFBRSw0QkFBNEI7UUFDaEMsYUFBYSxFQUFFLGdHQUFnRztRQUMvRyxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSx5QkFBeUI7S0FDdEM7Q0FDRixDQUFDO0FBbUNGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQzVCLFFBQStCLEVBQy9CLEVBQVUsRUFDUSxFQUFFO0lBQ3BCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGdDQUFpQyxTQUFRLCtDQUFxQjs7SUFDekUsK0VBQStFO0lBQy9ELDBCQUEwQixDQUFtQjtJQUM3RCxpREFBaUQ7SUFDakMscUJBQXFCLENBQW1CO0lBQ3hELDBGQUEwRjtJQUMxRSw0QkFBNEIsQ0FBbUI7SUFFL0Q7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUQ7UUFDN0YsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsS0FBSyxDQUFDLHVCQUF1QjtZQUM3QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLFVBQVUsRUFBRSw2QkFBNkI7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHFCQUFxQixDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsNEJBQTRCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDaEcsQ0FBQzs7QUF4QkgsNEVBeUJDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtELEVBQ0osRUFBRTtJQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBQSx5REFBK0IsRUFBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3hGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLElBQUksZ0NBQWdDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUNyRCxVQUFVLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVU7UUFDN0MsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLHVCQUF1QjtRQUN0RCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDekIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBZFcsUUFBQSxzQ0FBc0MsMENBY2pEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgaXNMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uRW5hYmxlZCxcbiAgTGFtYmRhRmFpbHVyZURldGVjdG9yLFxuICB0eXBlIExhbWJkYUZhaWx1cmVEZXRlY3Rpb24sXG4gIHR5cGUgTG9nRmFpbHVyZUZpbHRlcixcbn0gZnJvbSAnLi9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvci9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvcic7XG5cbi8qKiBDbG91ZFdhdGNoIGN1c3RvbSBtZXRyaWMgbmFtZXNwYWNlIGZvciBydW5uaW5nLXNjaGVkdWxlciBsb2ctYmFzZWQgZmFpbHVyZSBtZXRyaWNzLiAqL1xuY29uc3QgTUVUUklDX05BTUVTUEFDRSA9ICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInO1xuXG5jb25zdCBJTlNUQU5DRV9TVEFUVVNfRkFJTFVSRV9JRCA9ICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmUnO1xuY29uc3QgU0xBQ0tfUE9TVF9GQUlMVVJFX0lEID0gJ1NsYWNrUG9zdEZhaWx1cmUnO1xuY29uc3QgRFVSQUJMRV9FWEVDVVRJT05fRkFJTFVSRV9JRCA9ICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZSc7XG5cbi8qKlxuICogTG9nLWJhc2VkIGZhaWx1cmUgZmlsdGVycyBmb3IgdGhlIEVDMiBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuXG4gKlxuICogRGVmaW5lZCBpbiBvbmUgcGxhY2UgZm9yIHRoaXMgY29uc3RydWN0OyBwYXNzZWQgaW50byB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdG9yfS5cbiAqL1xuY29uc3QgUlVOTklOR19TQ0hFRFVMRVJfTE9HX0ZJTFRFUlM6IExvZ0ZhaWx1cmVGaWx0ZXJbXSA9IFtcbiAge1xuICAgIGlkOiBJTlNUQU5DRV9TVEFUVVNfRkFJTFVSRV9JRCxcbiAgICBmaWx0ZXJQYXR0ZXJuOiAnXCJSZXNvdXJjZVdhaXRGYWlsZWRcIicsXG4gICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgIG1ldHJpY05hbWU6ICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmUnLFxuICB9LFxuICB7XG4gICAgaWQ6IFNMQUNLX1BPU1RfRkFJTFVSRV9JRCxcbiAgICBmaWx0ZXJQYXR0ZXJuOiAnXCJydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgcG9zdCBmYWlsZWRcIicsXG4gICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgIG1ldHJpY05hbWU6ICdTbGFja1Bvc3RGYWlsdXJlJyxcbiAgfSxcbiAge1xuICAgIGlkOiBEVVJBQkxFX0VYRUNVVElPTl9GQUlMVVJFX0lELFxuICAgIGZpbHRlclBhdHRlcm46ICdcIkVSUk9SXCIgLSBcInByb2Nlc3NPbmVSZXNvdXJjZVwiIC0gXCJSZXNvdXJjZVdhaXRGYWlsZWRcIiAtIFwicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInLFxuICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICBtZXRyaWNOYW1lOiAnRHVyYWJsZUV4ZWN1dGlvbkZhaWx1cmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBQcm9wcyBhY2NlcHRlZCBieSB7QGxpbmsgY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5pbnRlcmZhY2UgQ3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb25Qcm9wcyB7XG4gIC8qKiBGYWlsdXJlIGRldGVjdGlvbiBvcHRpb25zOyBhbGFybXMgYXJlIGNyZWF0ZWQgb25seSB3aGVuIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzLmVuYWJsZWR9IGlzIHRydWUuICovXG4gIHJlYWRvbmx5IGZhaWx1cmVEZXRlY3Rpb24/OiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzO1xuICAvKiogUnVubmluZyBzY2hlZHVsZXIgTGFtYmRhIHRvIG1vbml0b3IuICovXG4gIHJlYWRvbmx5IHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uO1xuICAvKiogQXBwbGljYXRpb24gbG9nIGdyb3VwIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLiAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG59XG5cbi8qKlxuICogT3B0LWluIGZhaWx1cmUgZGV0ZWN0aW9uIGZvciBgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyYC5cbiAqXG4gKiBQYXNzIGFzIGBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcy5mYWlsdXJlRGV0ZWN0aW9uYC4gRXh0ZW5kc1xuICoge0BsaW5rIExhbWJkYUZhaWx1cmVEZXRlY3Rpb259IChgZW5hYmxlZGAgLyBgYWxhcm1Ub3BpY2ApLiBXaGljaCBsb2cgZmFpbHVyZXMgYXJlXG4gKiBtb25pdG9yZWQgaXMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBhbmQgYXBwbGllZCBieSB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMgZXh0ZW5kcyBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uIHt9XG5cbi8qKlxuICogTGFtYmRhIGFuZCBsb2cgZ3JvdXAgbW9uaXRvcmVkIGJ5IHtAbGluayBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbn0uXG4gKlxuICogTm9ybWFsbHkgYEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcmAgY3JlYXRlcyB0aGlzIGJpbmRpbmcuIFVzZSBkaXJlY3RseSBvbmx5IHdoZW5cbiAqIGNvbXBvc2luZyBmYWlsdXJlIGRldGVjdGlvbiBvdXRzaWRlIHRoZSBzY2hlZHVsZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUmVzb3VyY2VzUHJvcHMge1xuICByZWFkb25seSBhbGFybVRvcGljPzogc25zLklUb3BpYztcbiAgcmVhZG9ubHkgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHJlcXVpcmVkIGxvZy1maWx0ZXIgYWxhcm0gY3JlYXRlZCBmcm9tIHRoZSBzY2hlZHVsZXIgbG9nIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIGRldGVjdG9yIC0gRGV0ZWN0b3IgdGhhdCBvd25zIHRoZSBsb2ctZmlsdGVyIGFsYXJtcy5cbiAqIEBwYXJhbSBpZCAtIHtAbGluayBMb2dGYWlsdXJlRmlsdGVyfSBpZC5cbiAqIEByZXR1cm5zIFRoZSBDbG91ZFdhdGNoIGFsYXJtIGZvciB0aGF0IGZpbHRlci5cbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG5vIGFsYXJtIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGlkLlxuICovXG5jb25zdCByZXF1aXJlTG9nRmlsdGVyQWxhcm0gPSAoXG4gIGRldGVjdG9yOiBMYW1iZGFGYWlsdXJlRGV0ZWN0b3IsXG4gIGlkOiBzdHJpbmcsXG4pOiBjbG91ZHdhdGNoLkFsYXJtID0+IHtcbiAgY29uc3QgYWxhcm0gPSBkZXRlY3Rvci5maW5kTG9nRmlsdGVyQWxhcm0oaWQpO1xuICBpZiAoIWFsYXJtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbjogbWlzc2luZyBsb2cgZmlsdGVyIGFsYXJtIGZvciBpZCBcIiR7aWR9XCIuYCk7XG4gIH1cblxuICByZXR1cm4gYWxhcm07XG59O1xuXG4vKipcbiAqIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcyBmb3IgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlci5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0b3J9IHdpdGggc2NoZWR1bGVyLXNwZWNpZmljIGxvZyBmaWx0ZXJzOlxuICogLSBgbGFtYmRhRXJyb3JzQWxhcm1gIOKAkyBgQVdTL0xhbWJkYWAgYEVycm9yc2AgbWV0cmljLlxuICogLSBgaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm1gIOKAkyBsb2cgZmlsdGVyIGZvciBgUmVzb3VyY2VXYWl0RmFpbGVkOipgLlxuICogLSBgc2xhY2tQb3N0RmFpbHVyZUFsYXJtYCDigJMgbG9nIGZpbHRlciBmb3IgYHJ1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZGAuXG4gKiAtIGBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtYCDigJMgb3RoZXIgaGFuZGxlci1sZXZlbCBgRVJST1JgIGxvZ3MgKGV4Y2x1ZGluZyB0aGUgYWJvdmUpLlxuICpcbiAqIEN1c3RvbSBtZXRyaWNzIGFyZSBwdWJsaXNoZWQgdW5kZXIgdGhlIGBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJgIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uIGV4dGVuZHMgTGFtYmRhRmFpbHVyZURldGVjdG9yIHtcbiAgLyoqIEZpcmVzIHdoZW4gaW5zdGFuY2Ugc3RhYmxlLXN0YXRlIHdhaXRpbmcgZmFpbHMgKGBSZXNvdXJjZVdhaXRGYWlsZWQ6KmApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG4gIC8qKiBGaXJlcyB3aGVuIFNsYWNrIGBjaGF0LnBvc3RNZXNzYWdlYCBmYWlscy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNsYWNrUG9zdEZhaWx1cmVBbGFybTogY2xvdWR3YXRjaC5BbGFybTtcbiAgLyoqIEZpcmVzIG9uIGhhbmRsZXItbGV2ZWwgRVJST1IgbG9ncyBvdXRzaWRlIGluc3RhbmNlIHdhaXRpbmcgYW5kIFNsYWNrIHBvc3QgZmFpbHVyZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICAgKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIExhbWJkYSwgbG9nIGdyb3VwLCBhbmQgb3B0aW9uYWwgYWxhcm0gbm90aWZpY2F0aW9uIHRvcGljLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUmVzb3VyY2VzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBwcm9wcy5ydW5uaW5nU2NoZWR1bGVGdW5jdGlvbixcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGFsYXJtVG9waWM6IHByb3BzLmFsYXJtVG9waWMsXG4gICAgICBsb2dGaWx0ZXJzOiBSVU5OSU5HX1NDSEVEVUxFUl9MT0dfRklMVEVSUyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0gPSByZXF1aXJlTG9nRmlsdGVyQWxhcm0odGhpcywgSU5TVEFOQ0VfU1RBVFVTX0ZBSUxVUkVfSUQpO1xuICAgIHRoaXMuc2xhY2tQb3N0RmFpbHVyZUFsYXJtID0gcmVxdWlyZUxvZ0ZpbHRlckFsYXJtKHRoaXMsIFNMQUNLX1BPU1RfRkFJTFVSRV9JRCk7XG4gICAgdGhpcy5kdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtID0gcmVxdWlyZUxvZ0ZpbHRlckFsYXJtKHRoaXMsIERVUkFCTEVfRVhFQ1VUSU9OX0ZBSUxVUkVfSUQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBmYWlsdXJlIGRldGVjdGlvbiBhbGFybXMgd2hlbiBlbmFibGVkIGluIHByb3BzLlxuICpcbiAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3QuXG4gKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gKiBAcGFyYW0gcHJvcHMgLSBMYW1iZGEsIGxvZyBncm91cCwgYW5kIG9wdGlvbmFsIGFsYXJtIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyBGYWlsdXJlIGRldGVjdGlvbiBjb25zdHJ1Y3QsIG9yIHVuZGVmaW5lZCB3aGVuIGRpc2FibGVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gPSAoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHByb3BzOiBDcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzLFxuKTogUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXByb3BzLmZhaWx1cmVEZXRlY3Rpb24gfHwgIWlzTGFtYmRhRmFpbHVyZURldGVjdGlvbkVuYWJsZWQocHJvcHMuZmFpbHVyZURldGVjdGlvbikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbihzY29wZSwgaWQsIHtcbiAgICBhbGFybVRvcGljOiBwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uLmFsYXJtVG9waWMsXG4gICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IHByb3BzLnJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgfSk7XG59O1xuIl19
|
|
@@ -18,15 +18,15 @@ const running_scheduler_wait_config_1 = require("./running-scheduler-wait-config
|
|
|
18
18
|
const parseResourceWaitLimitsFromEnv = () => {
|
|
19
19
|
const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
|
|
20
20
|
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV]: [
|
|
21
|
-
strict_env_resolver_1.StrictEnvType.
|
|
21
|
+
strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
|
|
22
22
|
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxLoopCount },
|
|
23
23
|
],
|
|
24
24
|
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV]: [
|
|
25
|
-
strict_env_resolver_1.StrictEnvType.
|
|
25
|
+
strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
|
|
26
26
|
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxElapsedSeconds },
|
|
27
27
|
],
|
|
28
28
|
[running_scheduler_wait_config_1.PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS_ENV]: [
|
|
29
|
-
strict_env_resolver_1.StrictEnvType.
|
|
29
|
+
strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
|
|
30
30
|
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.statusChangeWaitSeconds },
|
|
31
31
|
],
|
|
32
32
|
});
|
|
@@ -46,11 +46,11 @@ exports.parseResourceWaitLimitsFromEnv = parseResourceWaitLimitsFromEnv;
|
|
|
46
46
|
const parseMaxConcurrencyFromEnv = () => {
|
|
47
47
|
const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
|
|
48
48
|
[running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV]: [
|
|
49
|
-
strict_env_resolver_1.StrictEnvType.
|
|
49
|
+
strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
|
|
50
50
|
{ default: running_scheduler_predicates_1.DEFAULT_MAX_CONCURRENCY },
|
|
51
51
|
],
|
|
52
52
|
});
|
|
53
53
|
return parsed[running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV];
|
|
54
54
|
};
|
|
55
55
|
exports.parseMaxConcurrencyFromEnv = parseMaxConcurrencyFromEnv;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNILDZEQUF1RTtBQUN2RSxpRkFJd0M7QUFDeEMsbUZBS3lDO0FBRXpDOzs7OztHQUtHO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxHQUF1QixFQUFFO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLG1FQUFtQyxDQUFDLEVBQUU7WUFDckMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSwyREFBNEIsQ0FBQyxZQUFZLEVBQUU7U0FDdkQ7UUFDRCxDQUFDLHdFQUF3QyxDQUFDLEVBQUU7WUFDMUMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSwyREFBNEIsQ0FBQyxpQkFBaUIsRUFBRTtTQUM1RDtRQUNELENBQUMsK0VBQStDLENBQUMsRUFBRTtZQUNqRCxtQ0FBYSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQ3BDLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLHVCQUF1QixFQUFFO1NBQ2xFO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsbUVBQW1DLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLHdFQUF3QyxDQUFDO1FBQ25FLHVCQUF1QixFQUFFLE1BQU0sQ0FBQywrRUFBK0MsQ0FBQztLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBckJXLFFBQUEsOEJBQThCLGtDQXFCekM7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsR0FBVyxFQUFFO0lBQ3JELE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLHFFQUFxQyxDQUFDLEVBQUU7WUFDdkMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSxzREFBdUIsRUFBRTtTQUNyQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLHFFQUFxQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBVFcsUUFBQSwwQkFBMEIsOEJBU3JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYW1iZGEtb25seSBlbnZpcm9ubWVudCBwYXJzaW5nIGZvciBydW5uaW5nIHNjaGVkdWxlciBoYW5kbGVyIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQnVuZGxlZCBpbnRvIHRoZSBydW5uaW5nIHNjaGVkdWxlciBmdW5jdGlvbjsgbm90IGltcG9ydGVkIGZyb20gQ0RLIGNvbnN0cnVjdHMuXG4gKi9cbmltcG9ydCB7IFN0cmljdEVudlJlc29sdmVyLCBTdHJpY3RFbnZUeXBlIH0gZnJvbSAnc3RyaWN0LWVudi1yZXNvbHZlcic7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9DT05DVVJSRU5DWSxcbiAgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUyxcbiAgdHlwZSBSZXNvdXJjZVdhaXRMaW1pdHMsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcHJlZGljYXRlcyc7XG5pbXBvcnQge1xuICBQUk9DRVNTX1JFU09VUkNFX01BWF9FTEFQU0VEX1NFQ09ORFNfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VTX01BWF9DT05DVVJSRU5DWV9FTlYsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItd2FpdC1jb25maWcnO1xuXG4vKipcbiAqIFJlYWRzIHBlci1pbnN0YW5jZSB3YWl0IGxpbWl0cyBmcm9tIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBDREsgY29uc3RydWN0LlxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBsaW1pdHMsIHVzaW5nIHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTfSB3aGVuIHZhcmlhYmxlcyBhcmUgdW5zZXQuXG4gKiBAdGhyb3dzIHtpbXBvcnQoJ3N0cmljdC1lbnYtcmVzb2x2ZXInKS5TdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3J9IFdoZW4gYSBzZXQgdmFyaWFibGUgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudiA9ICgpOiBSZXNvdXJjZVdhaXRMaW1pdHMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlZdOiBbXG4gICAgICBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXIsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50IH0sXG4gICAgXSxcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuTnVtYmVyLlBvc2l0aXZlSW50ZWdlcixcbiAgICAgIHsgZGVmYXVsdDogREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5tYXhFbGFwc2VkU2Vjb25kcyB9LFxuICAgIF0sXG4gICAgW1BST0NFU1NfUkVTT1VSQ0VfU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFNfRU5WXTogW1xuICAgICAgU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9zaXRpdmVJbnRlZ2VyLFxuICAgICAgeyBkZWZhdWx0OiBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLnN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXhMb29wQ291bnQ6IHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVl0sXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFX01BWF9FTEFQU0VEX1NFQ09ORFNfRU5WXSxcbiAgICBzdGF0dXNDaGFuZ2VXYWl0U2Vjb25kczogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFNfRU5WXSxcbiAgfTtcbn07XG5cbi8qKlxuICogUmVhZHMgZHVyYWJsZSBgbWFwYCBib3VuZGVkIGNvbmN1cnJlbmN5IGZyb20gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmV0dXJucyBQYXJzZWQgY29uY3VycmVuY3ksIHVzaW5nIHtAbGluayBERUZBVUxUX01BWF9DT05DVVJSRU5DWX0gd2hlbiB1bnNldC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnc3RyaWN0LWVudi1yZXNvbHZlcicpLlN0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBhIHNldCB2YXJpYWJsZSBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VNYXhDb25jdXJyZW5jeUZyb21FbnYgPSAoKTogbnVtYmVyID0+IHtcbiAgY29uc3QgcGFyc2VkID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZUFsbCh7XG4gICAgW1BST0NFU1NfUkVTT1VSQ0VTX01BWF9DT05DVVJSRU5DWV9FTlZdOiBbXG4gICAgICBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXIsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFU19NQVhfQ09OQ1VSUkVOQ1lfRU5WXTtcbn07XG4iXX0=
|