ec2-instance-running-scheduler 0.3.6 → 0.4.1
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/.devcontainer/devcontainer.json +4 -3
- package/.jsii +298 -41
- package/API.md +239 -6
- package/README.md +76 -11
- package/assets/funcs/running-scheduler.lambda/index.js +355 -54
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +105 -3
- package/lib/constructs/ec2-instance-running-scheduler.js +101 -17
- package/lib/constructs/running-scheduler-failure-detection.js +1 -1
- package/lib/funcs/running-scheduler-predicates.d.ts +4 -0
- package/lib/funcs/running-scheduler-predicates.js +5 -2
- package/lib/funcs/running-scheduler-wait-config.d.ts +13 -1
- package/lib/funcs/running-scheduler-wait-config.js +15 -3
- package/lib/funcs/running-scheduler-wait-env.d.ts +8 -2
- package/lib/funcs/running-scheduler-wait-env.js +29 -27
- package/lib/funcs/running-scheduler.lambda.d.ts +8 -5
- package/lib/funcs/running-scheduler.lambda.js +44 -21
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +6 -3
- package/lib/stacks/ec2-instance-running-schedule-stack.js +6 -4
- package/package.json +14 -14
|
@@ -1,54 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseResourceWaitLimitsFromEnv = void 0;
|
|
3
|
+
exports.parseMaxConcurrencyFromEnv = exports.parseResourceWaitLimitsFromEnv = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* Lambda-only environment parsing for
|
|
5
|
+
* Lambda-only environment parsing for running scheduler handler configuration.
|
|
6
6
|
*
|
|
7
7
|
* Bundled into the running scheduler function; not imported from CDK constructs.
|
|
8
8
|
*/
|
|
9
9
|
const strict_env_resolver_1 = require("strict-env-resolver");
|
|
10
10
|
const running_scheduler_predicates_1 = require("./running-scheduler-predicates");
|
|
11
11
|
const running_scheduler_wait_config_1 = require("./running-scheduler-wait-config");
|
|
12
|
-
/**
|
|
13
|
-
* Ensures a parsed env integer is strictly positive.
|
|
14
|
-
*
|
|
15
|
-
* `StrictEnvType.Number` accepts any finite number (including zero and negatives);
|
|
16
|
-
* wait limits require values greater than zero.
|
|
17
|
-
*
|
|
18
|
-
* @param key - Environment variable name used in error messages.
|
|
19
|
-
* @param value - Parsed number from {@link StrictEnvResolver.resolveAll}.
|
|
20
|
-
* @returns `value` when it is greater than zero.
|
|
21
|
-
* @throws {Error} When `value` is zero or negative.
|
|
22
|
-
*/
|
|
23
|
-
const assertPositiveEnvInt = (key, value) => {
|
|
24
|
-
if (value <= 0) {
|
|
25
|
-
const raw = process.env[key];
|
|
26
|
-
throw new Error(`Invalid ${key}: must be a positive integer (got "${raw ?? ''}")`);
|
|
27
|
-
}
|
|
28
|
-
return value;
|
|
29
|
-
};
|
|
30
12
|
/**
|
|
31
13
|
* Reads per-instance wait limits from Lambda environment variables set by the CDK construct.
|
|
32
14
|
*
|
|
33
15
|
* @returns Parsed limits, using {@link DEFAULT_RESOURCE_WAIT_LIMITS} when variables are unset.
|
|
34
|
-
* @throws {import('strict-env-resolver').StrictEnvValidationError} When a set variable is not a
|
|
35
|
-
* @throws {Error} When a set variable is zero or negative.
|
|
16
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When a set variable is not a positive integer.
|
|
36
17
|
*/
|
|
37
18
|
const parseResourceWaitLimitsFromEnv = () => {
|
|
38
19
|
const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
|
|
39
20
|
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV]: [
|
|
40
|
-
strict_env_resolver_1.StrictEnvType.
|
|
21
|
+
strict_env_resolver_1.StrictEnvType.PositiveInt,
|
|
41
22
|
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxLoopCount },
|
|
42
23
|
],
|
|
43
24
|
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV]: [
|
|
44
|
-
strict_env_resolver_1.StrictEnvType.
|
|
25
|
+
strict_env_resolver_1.StrictEnvType.PositiveInt,
|
|
45
26
|
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxElapsedSeconds },
|
|
46
27
|
],
|
|
28
|
+
[running_scheduler_wait_config_1.PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS_ENV]: [
|
|
29
|
+
strict_env_resolver_1.StrictEnvType.PositiveInt,
|
|
30
|
+
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.statusChangeWaitSeconds },
|
|
31
|
+
],
|
|
47
32
|
});
|
|
48
33
|
return {
|
|
49
|
-
maxLoopCount:
|
|
50
|
-
maxElapsedSeconds:
|
|
34
|
+
maxLoopCount: parsed[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV],
|
|
35
|
+
maxElapsedSeconds: parsed[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV],
|
|
36
|
+
statusChangeWaitSeconds: parsed[running_scheduler_wait_config_1.PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS_ENV],
|
|
51
37
|
};
|
|
52
38
|
};
|
|
53
39
|
exports.parseResourceWaitLimitsFromEnv = parseResourceWaitLimitsFromEnv;
|
|
54
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Reads durable `map` bounded concurrency from the Lambda environment.
|
|
42
|
+
*
|
|
43
|
+
* @returns Parsed concurrency, using {@link DEFAULT_MAX_CONCURRENCY} when unset.
|
|
44
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When a set variable is not a positive integer.
|
|
45
|
+
*/
|
|
46
|
+
const parseMaxConcurrencyFromEnv = () => {
|
|
47
|
+
const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
|
|
48
|
+
[running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV]: [
|
|
49
|
+
strict_env_resolver_1.StrictEnvType.PositiveInt,
|
|
50
|
+
{ default: running_scheduler_predicates_1.DEFAULT_MAX_CONCURRENCY },
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
return parsed[running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV];
|
|
54
|
+
};
|
|
55
|
+
exports.parseMaxConcurrencyFromEnv = parseMaxConcurrencyFromEnv;
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNILDZEQUF1RTtBQUN2RSxpRkFJd0M7QUFDeEMsbUZBS3lDO0FBRXpDOzs7OztHQUtHO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxHQUF1QixFQUFFO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLG1FQUFtQyxDQUFDLEVBQUU7WUFDckMsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLFlBQVksRUFBRTtTQUN2RDtRQUNELENBQUMsd0VBQXdDLENBQUMsRUFBRTtZQUMxQyxtQ0FBYSxDQUFDLFdBQVc7WUFDekIsRUFBRSxPQUFPLEVBQUUsMkRBQTRCLENBQUMsaUJBQWlCLEVBQUU7U0FDNUQ7UUFDRCxDQUFDLCtFQUErQyxDQUFDLEVBQUU7WUFDakQsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLHVCQUF1QixFQUFFO1NBQ2xFO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsbUVBQW1DLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLHdFQUF3QyxDQUFDO1FBQ25FLHVCQUF1QixFQUFFLE1BQU0sQ0FBQywrRUFBK0MsQ0FBQztLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBckJXLFFBQUEsOEJBQThCLGtDQXFCekM7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsR0FBVyxFQUFFO0lBQ3JELE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLHFFQUFxQyxDQUFDLEVBQUU7WUFDdkMsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLHNEQUF1QixFQUFFO1NBQ3JDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMscUVBQXFDLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFUVyxRQUFBLDBCQUEwQiw4QkFTckMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhbWJkYS1vbmx5IGVudmlyb25tZW50IHBhcnNpbmcgZm9yIHJ1bm5pbmcgc2NoZWR1bGVyIGhhbmRsZXIgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBCdW5kbGVkIGludG8gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uOyBub3QgaW1wb3J0ZWQgZnJvbSBDREsgY29uc3RydWN0cy5cbiAqL1xuaW1wb3J0IHsgU3RyaWN0RW52UmVzb2x2ZXIsIFN0cmljdEVudlR5cGUgfSBmcm9tICdzdHJpY3QtZW52LXJlc29sdmVyJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZLFxuICBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLFxuICB0eXBlIFJlc291cmNlV2FpdExpbWl0cyxcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci1wcmVkaWNhdGVzJztcbmltcG9ydCB7XG4gIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFX1NUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVixcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWNvbmZpZyc7XG5cbi8qKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHdhaXQgbGltaXRzIGZyb20gTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYnkgdGhlIENESyBjb25zdHJ1Y3QuXG4gKlxuICogQHJldHVybnMgUGFyc2VkIGxpbWl0cywgdXNpbmcge0BsaW5rIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFN9IHdoZW4gdmFyaWFibGVzIGFyZSB1bnNldC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnc3RyaWN0LWVudi1yZXNvbHZlcicpLlN0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBhIHNldCB2YXJpYWJsZSBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52ID0gKCk6IFJlc291cmNlV2FpdExpbWl0cyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmVBbGwoe1xuICAgIFtQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50IH0sXG4gICAgXSxcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4RWxhcHNlZFNlY29uZHMgfSxcbiAgICBdLFxuICAgIFtQUk9DRVNTX1JFU09VUkNFX1NUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMgfSxcbiAgICBdLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1heExvb3BDb3VudDogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WXSxcbiAgICBtYXhFbGFwc2VkU2Vjb25kczogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlZdLFxuICAgIHN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzOiBwYXJzZWRbUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlZdLFxuICB9O1xufTtcblxuLyoqXG4gKiBSZWFkcyBkdXJhYmxlIGBtYXBgIGJvdW5kZWQgY29uY3VycmVuY3kgZnJvbSB0aGUgTGFtYmRhIGVudmlyb25tZW50LlxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBjb25jdXJyZW5jeSwgdXNpbmcge0BsaW5rIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZfSB3aGVuIHVuc2V0LlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIGEgc2V0IHZhcmlhYmxlIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZU1heENvbmN1cnJlbmN5RnJvbUVudiA9ICgpOiBudW1iZXIgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAgICBbUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFU19NQVhfQ09OQ1VSUkVOQ1lfRU5WXTtcbn07XG4iXX0=
|
|
@@ -29,8 +29,10 @@ export interface SchedulerEvent {
|
|
|
29
29
|
* in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
|
|
30
30
|
* and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
|
|
31
31
|
*
|
|
32
|
-
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT
|
|
33
|
-
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS
|
|
32
|
+
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT`,
|
|
33
|
+
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS`, and `PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS`
|
|
34
|
+
* via {@link parseResourceWaitLimitsFromEnv}, and map concurrency from
|
|
35
|
+
* `PROCESS_RESOURCES_MAX_CONCURRENCY` via {@link parseMaxConcurrencyFromEnv}.
|
|
34
36
|
* Loads the Slack secret via {@link secretFetcher} (Parameters and Secrets Lambda Extension).
|
|
35
37
|
* Slack API failures are logged as `running-scheduler: Slack post failed` for CloudWatch log filters.
|
|
36
38
|
*
|
|
@@ -39,12 +41,13 @@ export interface SchedulerEvent {
|
|
|
39
41
|
* @returns
|
|
40
42
|
* - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
|
|
41
43
|
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
|
|
42
|
-
* @throws {Error} If `Params` is invalid,
|
|
43
|
-
*
|
|
44
|
+
* @throws {Error} If `Params` is invalid, the Slack secret is incomplete or not JSON with `token` and `channel`,
|
|
45
|
+
* instance processing fails (including `ResourceWaitFailed:*` errors),
|
|
44
46
|
* or the secret cannot be read from the extension (e.g. outside Lambda or missing `AWS_SESSION_TOKEN`).
|
|
45
|
-
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not
|
|
47
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not positive integers.
|
|
46
48
|
* @throws {import('fetch-retrier').FetchRetrierHttpError} When the extension returns a non-retriable HTTP error.
|
|
47
49
|
* @throws {import('fetch-retrier').FetchRetrierNetworkError} When extension requests fail at the network level.
|
|
48
50
|
* @throws {import('fetch-retrier').FetchRetrierAbortError} When extension requests time out after all retries.
|
|
51
|
+
* @throws {import('fetch-retrier').FetchRetrierInvalidOptionsError} When secret-fetch retry options are invalid.
|
|
49
52
|
*/
|
|
50
53
|
export declare const handler: import("@aws/durable-execution-sdk-js").DurableLambdaHandler;
|
|
@@ -22,12 +22,6 @@ const STATE_LIST = [
|
|
|
22
22
|
{ name: 'RUNNING', emoji: '😆', state: 'running' },
|
|
23
23
|
{ name: 'STOPPED', emoji: '😴', state: 'stopped' },
|
|
24
24
|
];
|
|
25
|
-
/**
|
|
26
|
-
* Seconds to wait between describe iterations after start/stop or while transitioning.
|
|
27
|
-
*
|
|
28
|
-
* Used with {@link processOneResource} durable `wait` calls between describe iterations.
|
|
29
|
-
*/
|
|
30
|
-
const STATUS_CHANGE_WAIT_SECONDS = 20;
|
|
31
25
|
/**
|
|
32
26
|
* Options passed to {@link secretFetcher.getSecretValue} when loading the Slack secret.
|
|
33
27
|
*
|
|
@@ -39,6 +33,30 @@ const SLACK_SECRET_FETCH_OPTIONS = {
|
|
|
39
33
|
retries: 5,
|
|
40
34
|
baseBackoffMs: 300,
|
|
41
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* Whether a secret payload is a JSON object with non-empty Slack `token` and `channel`.
|
|
38
|
+
*
|
|
39
|
+
* `aws-lambda-secret-fetcher` ^0.7 parses JSON with quiet-json-parser; invalid or empty
|
|
40
|
+
* JSON falls back to the original string instead of throwing.
|
|
41
|
+
*
|
|
42
|
+
* @param value - Value returned by {@link secretFetcher.getSecretValue}.
|
|
43
|
+
* @returns `true` when `value` is a {@link SlackSecret}.
|
|
44
|
+
*/
|
|
45
|
+
const isSlackSecret = (value) => {
|
|
46
|
+
if (typeof value !== 'object' || value === null) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (!('token' in value) || !('channel' in value)) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value.token !== 'string' || value.token === '') {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value.channel !== 'string' || value.channel === '') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
};
|
|
42
60
|
/**
|
|
43
61
|
* Returns display name and emoji for an EC2 instance state.
|
|
44
62
|
*
|
|
@@ -80,6 +98,7 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
80
98
|
mode: params.Mode,
|
|
81
99
|
maxLoopCount: waitLimits.maxLoopCount,
|
|
82
100
|
maxElapsedSeconds: waitLimits.maxElapsedSeconds,
|
|
101
|
+
statusChangeWaitSeconds: waitLimits.statusChangeWaitSeconds,
|
|
83
102
|
});
|
|
84
103
|
const startedAtMs = await ctx.step(`${stepPrefix}-wait-started-at`, async () => Date.now());
|
|
85
104
|
let loopCount = 0;
|
|
@@ -124,9 +143,9 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
124
143
|
});
|
|
125
144
|
ctx.logger.info('processOneResource: wait after start', {
|
|
126
145
|
identifier,
|
|
127
|
-
seconds:
|
|
146
|
+
seconds: waitLimits.statusChangeWaitSeconds,
|
|
128
147
|
});
|
|
129
|
-
await ctx.wait({ seconds:
|
|
148
|
+
await ctx.wait({ seconds: waitLimits.statusChangeWaitSeconds });
|
|
130
149
|
loopCount += 1;
|
|
131
150
|
continue;
|
|
132
151
|
}
|
|
@@ -138,9 +157,9 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
138
157
|
});
|
|
139
158
|
ctx.logger.info('processOneResource: wait after stop', {
|
|
140
159
|
identifier,
|
|
141
|
-
seconds:
|
|
160
|
+
seconds: waitLimits.statusChangeWaitSeconds,
|
|
142
161
|
});
|
|
143
|
-
await ctx.wait({ seconds:
|
|
162
|
+
await ctx.wait({ seconds: waitLimits.statusChangeWaitSeconds });
|
|
144
163
|
loopCount += 1;
|
|
145
164
|
continue;
|
|
146
165
|
}
|
|
@@ -151,9 +170,9 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
151
170
|
loopCount,
|
|
152
171
|
currentState,
|
|
153
172
|
mode,
|
|
154
|
-
seconds:
|
|
173
|
+
seconds: waitLimits.statusChangeWaitSeconds,
|
|
155
174
|
});
|
|
156
|
-
await ctx.wait({ seconds:
|
|
175
|
+
await ctx.wait({ seconds: waitLimits.statusChangeWaitSeconds });
|
|
157
176
|
loopCount += 1;
|
|
158
177
|
continue;
|
|
159
178
|
}
|
|
@@ -194,8 +213,10 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
194
213
|
* in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
|
|
195
214
|
* and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
|
|
196
215
|
*
|
|
197
|
-
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT
|
|
198
|
-
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS
|
|
216
|
+
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT`,
|
|
217
|
+
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS`, and `PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS`
|
|
218
|
+
* via {@link parseResourceWaitLimitsFromEnv}, and map concurrency from
|
|
219
|
+
* `PROCESS_RESOURCES_MAX_CONCURRENCY` via {@link parseMaxConcurrencyFromEnv}.
|
|
199
220
|
* Loads the Slack secret via {@link secretFetcher} (Parameters and Secrets Lambda Extension).
|
|
200
221
|
* Slack API failures are logged as `running-scheduler: Slack post failed` for CloudWatch log filters.
|
|
201
222
|
*
|
|
@@ -204,13 +225,14 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, wa
|
|
|
204
225
|
* @returns
|
|
205
226
|
* - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
|
|
206
227
|
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
|
|
207
|
-
* @throws {Error} If `Params` is invalid,
|
|
208
|
-
*
|
|
228
|
+
* @throws {Error} If `Params` is invalid, the Slack secret is incomplete or not JSON with `token` and `channel`,
|
|
229
|
+
* instance processing fails (including `ResourceWaitFailed:*` errors),
|
|
209
230
|
* or the secret cannot be read from the extension (e.g. outside Lambda or missing `AWS_SESSION_TOKEN`).
|
|
210
|
-
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not
|
|
231
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not positive integers.
|
|
211
232
|
* @throws {import('fetch-retrier').FetchRetrierHttpError} When the extension returns a non-retriable HTTP error.
|
|
212
233
|
* @throws {import('fetch-retrier').FetchRetrierNetworkError} When extension requests fail at the network level.
|
|
213
234
|
* @throws {import('fetch-retrier').FetchRetrierAbortError} When extension requests time out after all retries.
|
|
235
|
+
* @throws {import('fetch-retrier').FetchRetrierInvalidOptionsError} When secret-fetch retry options are invalid.
|
|
214
236
|
*/
|
|
215
237
|
exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (event, ctx) => {
|
|
216
238
|
const params = event.Params;
|
|
@@ -223,13 +245,14 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
223
245
|
throw new Error('Invalid event: Params.TagKey, Params.TagValues, Params.Mode are required.');
|
|
224
246
|
}
|
|
225
247
|
const waitLimits = (0, running_scheduler_wait_env_1.parseResourceWaitLimitsFromEnv)();
|
|
248
|
+
const maxConcurrency = (0, running_scheduler_wait_env_1.parseMaxConcurrencyFromEnv)();
|
|
226
249
|
const slackSecretName = strict_env_resolver_1.StrictEnvResolver.resolve('SLACK_SECRET_NAME', strict_env_resolver_1.StrictEnvType.String);
|
|
227
250
|
const slackSecretValue = await ctx.step('fetch-slack-secret', async () => {
|
|
228
251
|
ctx.logger.info('running-scheduler: fetching Slack secret', { secretName: slackSecretName });
|
|
229
252
|
return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName, SLACK_SECRET_FETCH_OPTIONS);
|
|
230
253
|
});
|
|
231
254
|
ctx.logger.info('running-scheduler: Slack secret loaded');
|
|
232
|
-
if (!slackSecretValue
|
|
255
|
+
if (!isSlackSecret(slackSecretValue)) {
|
|
233
256
|
throw new Error('Slack secret must contain token and channel.');
|
|
234
257
|
}
|
|
235
258
|
const targetResources = await ctx.step('get-target-resources', async () => {
|
|
@@ -275,7 +298,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
275
298
|
});
|
|
276
299
|
ctx.logger.info('running-scheduler: starting parallel instance processing', {
|
|
277
300
|
count: targetResources.length,
|
|
278
|
-
maxConcurrency
|
|
301
|
+
maxConcurrency,
|
|
279
302
|
});
|
|
280
303
|
const results = await ctx.map(targetResources,
|
|
281
304
|
// async (ctx: DurableContext, targetResource: string, index: number) =>
|
|
@@ -326,7 +349,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
326
349
|
});
|
|
327
350
|
return result;
|
|
328
351
|
});
|
|
329
|
-
}, { maxConcurrency
|
|
352
|
+
}, { maxConcurrency });
|
|
330
353
|
const resultList = Array.isArray(results) ? results : [];
|
|
331
354
|
ctx.logger.info('running-scheduler: completed', {
|
|
332
355
|
processed: targetResources.length,
|
|
@@ -338,4 +361,4 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
338
361
|
results: resultList,
|
|
339
362
|
};
|
|
340
363
|
});
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUFzRjtBQUN0Riw2REFBdUU7QUFDdkUsaUZBTXdDO0FBQ3hDLDZFQUE4RTtBQUU5RSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7O0dBS0c7QUFDSCxNQUFNLDBCQUEwQixHQUEwQjtJQUN4RCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxDQUFDO0lBQ1YsYUFBYSxFQUFFLEdBQUc7Q0FDbkIsQ0FBQztBQTJCRjs7Ozs7R0FLRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUErQyxFQUFFO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDMUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3RFLENBQUMs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QUNwQixDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVDMiBSdW5uaW5nIFNjaGVkdWxlciDigJMgRHVyYWJsZSBGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogSW1wbGVtZW50cyB0aGUgcnVubmluZy1jb250cm9sIGZsb3cgdXNpbmcgQVdTIExhbWJkYSBEdXJhYmxlIEV4ZWN1dGlvbi5cbiAqIFN0ZXAgY2hlY2twb2ludHMsIHdhaXQgKG5vIGNoYXJnZSksIGFuZCBwYXJhbGxlbCBtYXAgcHJvdmlkZSBhIGZsb3cgZXF1aXZhbGVudCB0byBTdGVwIEZ1bmN0aW9ucy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2R1cmFibGUtZXhlY3V0aW9uLXNkay5odG1sXG4gKi9cblxuaW1wb3J0IHsgd2l0aER1cmFibGVFeGVjdXRpb24sIHR5cGUgRHVyYWJsZUNvbnRleHQgfSBmcm9tICdAYXdzL2R1cmFibGUtZXhlY3V0aW9uLXNkay1qcyc7XG5pbXBvcnQge1xuICBFQzJDbGllbnQsXG4gIERlc2NyaWJlSW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RhcnRJbnN0YW5jZXNDb21tYW5kLFxuICBTdG9wSW5zdGFuY2VzQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgeyBHZXRSZXNvdXJjZXNDb21tYW5kLCBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtcmVzb3VyY2UtZ3JvdXBzLXRhZ2dpbmctYXBpJztcbmltcG9ydCB7IFdlYkNsaWVudCB9IGZyb20gJ0BzbGFjay93ZWItYXBpJztcbmltcG9ydCB7IHNlY3JldEZldGNoZXIsIHR5cGUgR2V0U2VjcmV0VmFsdWVPcHRpb25zIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTdHJpY3RFbnZSZXNvbHZlciwgU3RyaWN0RW52VHlwZSB9IGZyb20gJ3N0cmljdC1lbnYtcmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZSxcbiAgZ2V0V2FpdEFib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VXYWl0TGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52IH0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWVudic7XG5cbi8qKiBNYXBwaW5nIG9mIEVDMiBpbnN0YW5jZSBzdGF0ZSB0byBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBTbGFjay4gKi9cbmNvbnN0IFNUQVRFX0xJU1QgPSBbXG4gIHsgbmFtZTogJ1JVTk5JTkcnLCBlbW9qaTogJ/CfmIYnLCBzdGF0ZTogJ3J1bm5pbmcnIH0sXG4gIHsgbmFtZTogJ1NUT1BQRUQnLCBlbW9qaTogJ/CfmLQnLCBzdGF0ZTogJ3N0b3BwZWQnIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMgYWZ0ZXIgc3RhcnQvc3RvcCBvciB3aGlsZSB0cmFuc2l0aW9uaW5nLlxuICpcbiAqIFVzZWQgd2l0aCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSBkdXJhYmxlIGB3YWl0YCBjYWxscyBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMuXG4gKi9cbmNvbnN0IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTID0gMjA7XG5cbi8qKlxuICogT3B0aW9ucyBwYXNzZWQgdG8ge0BsaW5rIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWV9IHdoZW4gbG9hZGluZyB0aGUgU2xhY2sgc2VjcmV0LlxuICpcbiAqIFJldHJpZXMgY292ZXIgdHJhbnNpZW50IGV4dGVuc2lvbiBIVFRQIGVycm9ycyAoNXh4LCA0MjkpIGFuZCB0aGUgZXh0ZW5zaW9uXG4gKiBcIm5vdCByZWFkeSB0byBzZXJ2ZSB0cmFmZmljXCIgcmVzcG9uc2UgZHVyaW5nIGNvbGQgc3RhcnRzLlxuICovXG5jb25zdCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUzogR2V0U2VjcmV0VmFsdWVPcHRpb25zID0ge1xuICB0aW1lb3V0TXM6IDMwMDAsXG4gIHJldHJpZXM6IDUsXG4gIGJhc2VCYWNrb2ZmTXM6IDMwMCxcbn07XG5cbi8qKlxuICogRXZlbnQgcGF5bG9hZCBmcm9tIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBpbnZva2luZyB0aGlzIExhbWJkYS5cbiAqXG4gKiBAc2VlIHtAbGluayBoYW5kbGVyfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckV2ZW50IHtcbiAgLyoqIFNjaGVkdWxlciBpbnZvY2F0aW9uIHBhcmFtZXRlcnMgKHRhZyBmaWx0ZXIgYW5kIHN0YXJ0L3N0b3AgbW9kZSkuICovXG4gIFBhcmFtczoge1xuICAgIC8qKiBUYWcga2V5IHVzZWQgdG8gc2VsZWN0IEVDMiBpbnN0YW5jZXMuICovXG4gICAgVGFnS2V5OiBzdHJpbmc7XG4gICAgLyoqIFRhZyB2YWx1ZXMgdG8gbWF0Y2guICovXG4gICAgVGFnVmFsdWVzOiBzdHJpbmdbXTtcbiAgICAvKiogV2hldGhlciB0byBzdGFydCBvciBzdG9wIGluc3RhbmNlcy4gKi9cbiAgICBNb2RlOiAnU3RhcnQnIHwgJ1N0b3AnO1xuICB9O1xufVxuXG4vKiogU2xhY2sgY3JlZGVudGlhbHMgYW5kIGRlZmF1bHQgY2hhbm5lbCBsb2FkZWQgZnJvbSBTZWNyZXRzIE1hbmFnZXIgKGBTTEFDS19TRUNSRVRfTkFNRWApLiAqL1xuaW50ZXJmYWNlIFNsYWNrU2VjcmV0IHtcbiAgLyoqIFNsYWNrIGJvdCB0b2tlbiBmb3IgdGhlIFNsYWNrIGBXZWJDbGllbnRgLiAqL1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogQ2hhbm5lbCBJRCBvciBuYW1lIHBhc3NlZCB0byBgY2hhdC5wb3N0TWVzc2FnZWAuICovXG4gIGNoYW5uZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRpc3BsYXkgbmFtZSBhbmQgZW1vamkgZm9yIGFuIEVDMiBpbnN0YW5jZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgaW5zdGFuY2Ugc3RhdGUgKGUuZy4gJ3J1bm5pbmcnLCAnc3RvcHBlZCcpLlxuICogQHJldHVybnMgRGlzcGxheSBpbmZvIG9yIHVuZGVmaW5lZCBpZiBzdGF0ZSBpcyBub3QgaW4gU1RBVEVfTElTVC5cbiAqL1xuY29uc3QgZ2V0U3RhdGVEaXNwbGF5ID0gKGN1cnJlbnQ6IHN0cmluZyk6IHsgZW1vamk6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmb3VuZCA9IFNUQVRFX0xJU1QuZmluZCgocykgPT4gcy5zdGF0ZSA9PT0gY3VycmVudCk7XG4gIHJldHVybiBmb3VuZCA/IHsgZW1vamk6IGZvdW5kLmVtb2ppLCBuYW1lOiBmb3VuZC5uYW1lIH0gOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBvbmUgRUMyIGluc3RhbmNlOiBkZXNjcmliZXMgc3RhdGUsIGlzc3VlcyBzdGFydC9zdG9wIHdoZW4gbmVlZGVkLCB0aGVuIHdhaXRzIHVudGlsXG4gKiB7QGxpbmsgaXNEZXNpcmVkU3RhYmxlU3RhdGV9IGlzIHNhdGlzZmllZCAoZHVyYWJsZSBgc3RlcGAgLyBgd2FpdGAgYmV0d2VlbiBhdHRlbXB0cykuXG4gKlxuICogRWFjaCBsb29wIGl0ZXJhdGlvbiBjaGVja3Mge0BsaW5rIGdldFdhaXRBYm9ydFJlYXNvbn0gYmVmb3JlIGRlc2NyaWJlLiBGYWlsdXJlcyB1c2VcbiAqIHtAbGluayBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlfSAoYFJlc291cmNlV2FpdEZhaWxlZDoqYCBtZXNzYWdlIHByZWZpeCkuXG4gKlxuICogQHBhcmFtIGN0eCAtIER1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQgKGNoaWxkIGNvbnRleHQgcGVyIGluc3RhbmNlIHJlY29tbWVuZGVkKS5cbiAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSAtIEVDMiBpbnN0YW5jZSBBUk4uXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2NoZWR1bGVyIHBhcmFtcyAoYFRhZ0tleWAsIGBUYWdWYWx1ZXNgLCBgTW9kZWApLlxuICogQHBhcmFtIHJlc291cmNlSW5kZXggLSBJbmRleCB1c2VkIGluIGR1cmFibGUgc3RlcCBuYW1lcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwYXJhbSB3YWl0TGltaXRzIC0gUGVyLWluc3RhbmNlIGNhcHMgZnJvbSB7QGxpbmsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52fSAoc2V0IGJ5IHRoZSBDREsgY29uc3RydWN0KS5cbiAqIEByZXR1cm5zIEZpbmFsIHJlc291cmNlIEFSTiwgRUMyIHN0YXRlIG5hbWUsIHBhcnNlZCBhY2NvdW50LCByZWdpb24sIGFuZCBpbnN0YW5jZSBpZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHdhaXQgbGltaXRzIGFyZSBleGNlZWRlZCAoYE1heExvb3BDb3VudEV4Y2VlZGVkYCwgYE1heEVsYXBzZWRUaW1lRXhjZWVkZWRgKSxcbiAqICAgdGhlIGluc3RhbmNlIGlzIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKGBVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZWApLCBvciB0aGUgbG9vcCBleGl0cyB3aXRob3V0IGEgc3RhYmxlIGdvYWwgc3RhdGUuXG4gKi9cbmNvbnN0IHByb2Nlc3NPbmVSZXNvdXJjZSA9IGFzeW5jIChcbiAgY3R4OiBEdXJhYmxlQ29udGV4dCxcbiAgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZyxcbiAgcGFyYW1zOiBTY2hlZHVsZXJFdmVudFsnUGFyYW1zJ10sXG4gIHJlc291cmNlSW5kZXg6IG51bWJlcixcbiAgd2FpdExpbWl0czogUmVzb3VyY2VXYWl0TGltaXRzLFxuKTogUHJvbWlzZTx7IHJlc291cmNlOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfT4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCcvJyk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA/PyAndW5rbm93bic7XG4gIGNvbnN0IGFyblBhcnRzID0gdGFyZ2V0UmVzb3VyY2Uuc3BsaXQoJzonKTtcbiAgY29uc3QgYWNjb3VudCA9IGFyblBhcnRzWzRdID8/ICcnO1xuICBjb25zdCByZWdpb24gPSBhcm5QYXJ0c1szXSA/PyAnJztcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGByZXNvdXJjZS0ke3Jlc291cmNlSW5kZXh9LSR7aWRlbnRpZmllcn1gO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydCcsIHtcbiAgICByZXNvdXJjZUluZGV4LFxuICAgIGlkZW50aWZpZXIsXG4gICAgcmVnaW9uLFxuICAgIGFjY291bnQsXG4gICAgbW9kZTogcGFyYW1zLk1vZGUsXG4gICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICBtYXhFbGFwc2VkU2Vjb25kczogd2FpdExpbWl0cy5tYXhFbGFwc2VkU2Vjb25kcyxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhcnRlZEF0TXMgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LXN0YXJ0ZWQtYXRgLCBhc3luYyAoKSA9PiBEYXRlLm5vdygpKTtcblxuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9ICcnO1xuICBkbyB7XG4gICAgY29uc3QgYWJvcnRSZWFzb24gPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LWxpbWl0LWNoZWNrLSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+XG4gICAgICBnZXRXYWl0QWJvcnRSZWFzb24obG9vcENvdW50LCBzdGFydGVkQXRNcywgRGF0ZS5ub3coKSwgd2FpdExpbWl0cyksXG4gICAgKTtcbiAgICBpZiAoYWJvcnRSZWFzb24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlKGFib3J0UmVhc29uLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGU6IGN1cnJlbnRTdGF0ZSB8fCAndW5rbm93bicsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgbGltaXQgZXhjZWVkZWQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFib3J0UmVhc29uLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICAgICAgbWF4RWxhcHNlZFNlY29uZHM6IHdhaXRMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50U3RhdGUgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1kZXNjcmliZS0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIHJldHVybiBvdXQuUmVzZXJ2YXRpb25zPy5bMF0/Lkluc3RhbmNlcz8uWzBdPy5TdGF0ZT8uTmFtZSA/PyAndW5rbm93bic7XG4gICAgfSk7XG5cbiAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogZGVzY3JpYmVkJywge1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGxvb3BDb3VudCxcbiAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5Nb2RlO1xuXG4gICAgaWYgKG1vZGUgPT09ICdTdGFydCcgJiYgY3VycmVudFN0YXRlID09PSAnc3RvcHBlZCcpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RhcnQtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogd2FpdCBhZnRlciBzdGFydCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtb2RlID09PSAnU3RvcCcgJiYgY3VycmVudFN0YXRlID09PSAncnVubmluZycpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdG9wcGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RvcC0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVjMiA9IG5ldyBFQzJDbGllbnQoe30pO1xuICAgICAgICBhd2FpdCBlYzIuc2VuZChuZXcgU3RvcEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RvcCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNEZXNpcmVkU3RhYmxlU3RhdGUobW9kZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgaWYgKGlzVHJhbnNpdGlvbmluZ1N0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgd2hpbGUgdHJhbnNpdGlvbmluZycsIHtcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBzZWNvbmRzOiBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICAgIGxvb3BDb3VudCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdFJlc291cmNlV2FpdEZhaWx1cmUoJ1VuZXhwZWN0ZWRJbnN0YW5jZVN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHVuZXhwZWN0ZWQgc3RhdGUnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9IHdoaWxlICghaXNEZXNpcmVkU3RhYmxlU3RhdGUocGFyYW1zLk1vZGUsIGN1cnJlbnRTdGF0ZSkpO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiByZWFjaGVkIGRlc2lyZWQgc3RhYmxlIHN0YXRlJywge1xuICAgIGlkZW50aWZpZXIsXG4gICAgZmluYWxTdGF0ZTogY3VycmVudFN0YXRlLFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIGxvb3BDb3VudCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGFjY291bnQsXG4gICAgcmVnaW9uLFxuICAgIHJlc291cmNlOiB0YXJnZXRSZXNvdXJjZSxcbiAgICBzdGF0dXM6IGN1cnJlbnRTdGF0ZSxcbiAgfTtcbn07XG5cbi8qKlxuICogRHVyYWJsZSBMYW1iZGEgZW50cnkgcG9pbnQgZm9yIHRoZSBFQzIgcnVubmluZyBzY2hlZHVsZXIuXG4gKlxuICogUmVzb2x2ZXMgaW5zdGFuY2VzIHZpYSBSZXNvdXJjZSBHcm91cHMgVGFnZ2luZyBBUEksIHJ1bnMge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZm9yIGVhY2ggQVJOXG4gKiBpbiBwYXJhbGxlbCAoYm91bmRlZCBjb25jdXJyZW5jeSksIHBvc3RzIGEgcGFyZW50IFNsYWNrIG1lc3NhZ2UgYW5kIHBlci1pbnN0YW5jZSB0aHJlYWQgcmVwbGllcyxcbiAqIGFuZCB1c2VzIGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIC8gYG1hcGAgc28gdGhlIHJ1biBjYW4gcmVzdW1lIGFjcm9zcyBzdXNwZW5zaW9ucy5cbiAqXG4gKiBSZWFkcyBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZnJvbSBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVGAgYW5kXG4gKiBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTYCB2aWEge0BsaW5rIHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudn0uXG4gKiBMb2FkcyB0aGUgU2xhY2sgc2VjcmV0IHZpYSB7QGxpbmsgc2VjcmV0RmV0Y2hlcn0gKFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbikuXG4gKiBTbGFjayBBUEkgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyBgcnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkYCBmb3IgQ2xvdWRXYXRjaCBsb2cgZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBQYXlsb2FkIGZyb20gRXZlbnRCcmlkZ2UgU2NoZWR1bGVyOyBtdXN0IGluY2x1ZGUgYFBhcmFtcy5UYWdLZXlgLCBgUGFyYW1zLlRhZ1ZhbHVlc2AsIGBQYXJhbXMuTW9kZWAuXG4gKiBAcGFyYW0gY3R4IC0gUm9vdCBkdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICogQHJldHVybnNcbiAqIC0gYHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIH1gIHdoZW4gbm8gaW5zdGFuY2VzIG1hdGNoIHRoZSB0YWcgZmlsdGVyLlxuICogLSBgeyBzdGF0dXM6ICdDb21wbGV0ZWQnLCBwcm9jZXNzZWQsIHJlc3VsdHMgfWAgd2hlbiBpbnN0YW5jZXMgd2VyZSBoYW5kbGVkIChgcmVzdWx0c2AgZW50cmllcyBtYXRjaCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSByZXR1cm4gc2hhcGUpLlxuICogQHRocm93cyB7RXJyb3J9IElmIGBQYXJhbXNgIGlzIGludmFsaWQsIHdhaXQgZW52IHZhcnMgYXJlIG5vdCBwb3NpdGl2ZSBpbnRlZ2VycyxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlV2FpdEZhaWxlZDoqYCBlcnJvcnMpLFxuICogICBvciB0aGUgc2VjcmV0IGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGV4dGVuc2lvbiAoZS5nLiBvdXRzaWRlIExhbWJkYSBvciBtaXNzaW5nIGBBV1NfU0VTU0lPTl9UT0tFTmApLlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHJlcXVpcmVkIGVudiB2YXJzIGFyZSBtaXNzaW5nIG9yIG5vdCB2YWxpZCBudW1iZXJzLlxuICogQHRocm93cyB7aW1wb3J0KCdmZXRjaC1yZXRyaWVyJykuRmV0Y2hSZXRyaWVySHR0cEVycm9yfSBXaGVuIHRoZSBleHRlbnNpb24gcmV0dXJucyBhIG5vbi1yZXRyaWFibGUgSFRUUCBlcnJvci5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllck5ldHdvcmtFcnJvcn0gV2hlbiBleHRlbnNpb24gcmVxdWVzdHMgZmFpbCBhdCB0aGUgbmV0d29yayBsZXZlbC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllckFib3J0RXJyb3J9IFdoZW4gZXh0ZW5zaW9uIHJlcXVlc3RzIHRpbWUgb3V0IGFmdGVyIGFsbCByZXRyaWVzLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHdhaXRMaW1pdHMgPSBwYXJzZVJlc291cmNlV2FpdExpbWl0c0Zyb21FbnYoKTtcblxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdTTEFDS19TRUNSRVRfTkFNRScsIFN0cmljdEVudlR5cGUuU3RyaW5nKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lLCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHNlY3JldCBsb2FkZWQnKTtcblxuICBpZiAoIXNsYWNrU2VjcmV0VmFsdWU/LnRva2VuIHx8ICFzbGFja1NlY3JldFZhbHVlPy5jaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTbGFjayBzZWNyZXQgbXVzdCBjb250YWluIHRva2VuIGFuZCBjaGFubmVsLicpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0UmVzb3VyY2VzID0gYXdhaXQgY3R4LnN0ZXAoJ2dldC10YXJnZXQtcmVzb3VyY2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQoe30pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFJlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBSZXNvdXJjZVR5cGVGaWx0ZXJzOiBbJ2VjMjppbnN0YW5jZSddLFxuICAgICAgICBUYWdGaWx0ZXJzOiBbeyBLZXk6IHBhcmFtcy5UYWdLZXksIFZhbHVlczogcGFyYW1zLlRhZ1ZhbHVlcyB9XSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgYXJucyA9IChyZXN1bHQuUmVzb3VyY2VUYWdNYXBwaW5nTGlzdCA/PyBbXSlcbiAgICAgIC5tYXAoKG06IHsgUmVzb3VyY2VBUk4/OiBzdHJpbmcgfSkgPT4gbS5SZXNvdXJjZUFSTilcbiAgICAgIC5maWx0ZXIoKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYXJuIGlzIHN0cmluZyA9PiBhcm4gIT0gbnVsbCk7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZ2V0LXRhcmdldC1yZXNvdXJjZXMgZG9uZScsIHsgY291bnQ6IGFybnMubGVuZ3RoIH0pO1xuICAgIHJldHVybiBhcm5zO1xuICB9KTtcblxuICBpZiAodGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IG5vIG1hdGNoaW5nIGluc3RhbmNlcycsIHsgdGFnS2V5OiBwYXJhbXMuVGFnS2V5IH0pO1xuICAgIHJldHVybiB7IHN0YXR1czogJ1RhcmdldFJlc291cmNlc05vdEZvdW5kJyBhcyBjb25zdCB9O1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFdlYkNsaWVudChzbGFja1NlY3JldFZhbHVlLnRva2VuKTtcbiAgY29uc3QgY2hhbm5lbCA9IHNsYWNrU2VjcmV0VmFsdWUuY2hhbm5lbDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHBhcmVudCBTbGFjayBtZXNzYWdlJywge1xuICAgIGluc3RhbmNlQ291bnQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gIH0pO1xuXG4gIC8vIHNlbmQgc2xhY2sgbWVzc2FnZVxuICBjb25zdCBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQgPSBhd2FpdCBjdHguc3RlcCgncG9zdC1zbGFjay1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stbWVzc2FnZXMnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHdhaXRMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgdGhyZWFkX3RzOiBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQ/LnRzLFxuICAgICAgICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM2YTY0ZicsXG4gICAgICAgICAgICAgICAgICBwcmV0ZXh0OiBgJHtkaXNwbGF5Py5lbW9qaX0gVGhlIHN0YXR1cyBvZiB0aGUgRUMyIEluc3RhbmNlICR7cmVzdWx0LmlkZW50aWZpZXJ9IGNoYW5nZWQgdG8gJHtkaXNwbGF5Py5uYW1lfSBkdWUgdG8gdGhlIHNjaGVkdWxlLmAsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQnLCB2YWx1ZTogcmVzdWx0LmFjY291bnQsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdSZWdpb24nLCB2YWx1ZTogcmVzdWx0LnJlZ2lvbiwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdTdGF0dXMnLCB2YWx1ZTogKGRpc3BsYXk/Lm5hbWUgPz8gJ1Vua25vd24nKSwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjaGlsZEN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stY2hpbGQtbWVzc2FnZXMnLFxuICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiByZXN1bHQuaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgbWF4Q29uY3VycmVuY3k6IDEwIH0sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0TGlzdCA9IEFycmF5LmlzQXJyYXkocmVzdWx0cykgPyByZXN1bHRzIDogW107XG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IGNvbXBsZXRlZCcsIHtcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0Q291bnQ6IHJlc3VsdExpc3QubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6ICdDb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgIHByb2Nlc3NlZDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICByZXN1bHRzOiByZXN1bHRMaXN0LFxuICB9O1xufSk7XG4iXX0=
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUFzRjtBQUN0Riw2REFBdUU7QUFDdkUsaUZBTXdDO0FBQ3hDLDZFQUEwRztBQUUxRyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7Ozs7R0FLRztBQUNILE1BQU0sMEJBQTBCLEdBQTBCO0lBQ3hELFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLENBQUM7SUFDVixhQUFhLEVBQUUsR0FBRztDQUNuQixDQUFDO0FBMkJGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXdCLEVBQUU7SUFDN0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFB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VSxFQUFFLE1BQU0sQ0FBQyxVQUFVO3dCQUM3QixZQUFZLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDckUsQ0FBQyxDQUFDO29CQUNILE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUNELEVBQUUsY0FBYyxFQUFFLENBQ25CLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRTtRQUM5QyxTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDakMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNO0tBQy9CLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxNQUFNLEVBQUUsV0FBb0I7UUFDNUIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxNQUFNO1FBQ2pDLE9BQU8sRUFBRSxVQUFVO0tBQ3BCLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRUMyIFJ1bm5pbmcgU2NoZWR1bGVyIOKAkyBEdXJhYmxlIEZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBJbXBsZW1lbnRzIHRoZSBydW5uaW5nLWNvbnRyb2wgZmxvdyB1c2luZyBBV1MgTGFtYmRhIER1cmFibGUgRXhlY3V0aW9uLlxuICogU3RlcCBjaGVja3BvaW50cywgd2FpdCAobm8gY2hhcmdlKSwgYW5kIHBhcmFsbGVsIG1hcCBwcm92aWRlIGEgZmxvdyBlcXVpdmFsZW50IHRvIFN0ZXAgRnVuY3Rpb25zLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZHVyYWJsZS1leGVjdXRpb24tc2RrLmh0bWxcbiAqL1xuXG5pbXBvcnQgeyB3aXRoRHVyYWJsZUV4ZWN1dGlvbiwgdHlwZSBEdXJhYmxlQ29udGV4dCB9IGZyb20gJ0Bhd3MvZHVyYWJsZS1leGVjdXRpb24tc2RrLWpzJztcbmltcG9ydCB7XG4gIEVDMkNsaWVudCxcbiAgRGVzY3JpYmVJbnN0YW5jZXNDb21tYW5kLFxuICBTdGFydEluc3RhbmNlc0NvbW1hbmQsXG4gIFN0b3BJbnN0YW5jZXNDb21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWMyJztcbmltcG9ydCB7IEdldFJlc291cmNlc0NvbW1hbmQsIFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1yZXNvdXJjZS1ncm91cHMtdGFnZ2luZy1hcGknO1xuaW1wb3J0IHsgV2ViQ2xpZW50IH0gZnJvbSAnQHNsYWNrL3dlYi1hcGknO1xuaW1wb3J0IHsgc2VjcmV0RmV0Y2hlciwgdHlwZSBHZXRTZWNyZXRWYWx1ZU9wdGlvbnMgfSBmcm9tICdhd3MtbGFtYmRhLXNlY3JldC1mZXRjaGVyJztcbmltcG9ydCB7IFN0cmljdEVudlJlc29sdmVyLCBTdHJpY3RFbnZUeXBlIH0gZnJvbSAnc3RyaWN0LWVudi1yZXNvbHZlcic7XG5pbXBvcnQge1xuICBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlLFxuICBnZXRXYWl0QWJvcnRSZWFzb24sXG4gIGlzRGVzaXJlZFN0YWJsZVN0YXRlLFxuICBpc1RyYW5zaXRpb25pbmdTdGF0ZSxcbiAgdHlwZSBSZXNvdXJjZVdhaXRMaW1pdHMsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcHJlZGljYXRlcyc7XG5pbXBvcnQgeyBwYXJzZU1heENvbmN1cnJlbmN5RnJvbUVudiwgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52IH0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWVudic7XG5cbi8qKiBNYXBwaW5nIG9mIEVDMiBpbnN0YW5jZSBzdGF0ZSB0byBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBTbGFjay4gKi9cbmNvbnN0IFNUQVRFX0xJU1QgPSBbXG4gIHsgbmFtZTogJ1JVTk5JTkcnLCBlbW9qaTogJ/CfmIYnLCBzdGF0ZTogJ3J1bm5pbmcnIH0sXG4gIHsgbmFtZTogJ1NUT1BQRUQnLCBlbW9qaTogJ/CfmLQnLCBzdGF0ZTogJ3N0b3BwZWQnIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE9wdGlvbnMgcGFzc2VkIHRvIHtAbGluayBzZWNyZXRGZXRjaGVyLmdldFNlY3JldFZhbHVlfSB3aGVuIGxvYWRpbmcgdGhlIFNsYWNrIHNlY3JldC5cbiAqXG4gKiBSZXRyaWVzIGNvdmVyIHRyYW5zaWVudCBleHRlbnNpb24gSFRUUCBlcnJvcnMgKDV4eCwgNDI5KSBhbmQgdGhlIGV4dGVuc2lvblxuICogXCJub3QgcmVhZHkgdG8gc2VydmUgdHJhZmZpY1wiIHJlc3BvbnNlIGR1cmluZyBjb2xkIHN0YXJ0cy5cbiAqL1xuY29uc3QgU0xBQ0tfU0VDUkVUX0ZFVENIX09QVElPTlM6IEdldFNlY3JldFZhbHVlT3B0aW9ucyA9IHtcbiAgdGltZW91dE1zOiAzMDAwLFxuICByZXRyaWVzOiA1LFxuICBiYXNlQmFja29mZk1zOiAzMDAsXG59O1xuXG4vKipcbiAqIEV2ZW50IHBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgaW52b2tpbmcgdGhpcyBMYW1iZGEuXG4gKlxuICogQHNlZSB7QGxpbmsgaGFuZGxlcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudCB7XG4gIC8qKiBTY2hlZHVsZXIgaW52b2NhdGlvbiBwYXJhbWV0ZXJzICh0YWcgZmlsdGVyIGFuZCBzdGFydC9zdG9wIG1vZGUpLiAqL1xuICBQYXJhbXM6IHtcbiAgICAvKiogVGFnIGtleSB1c2VkIHRvIHNlbGVjdCBFQzIgaW5zdGFuY2VzLiAqL1xuICAgIFRhZ0tleTogc3RyaW5nO1xuICAgIC8qKiBUYWcgdmFsdWVzIHRvIG1hdGNoLiAqL1xuICAgIFRhZ1ZhbHVlczogc3RyaW5nW107XG4gICAgLyoqIFdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcCBpbnN0YW5jZXMuICovXG4gICAgTW9kZTogJ1N0YXJ0JyB8ICdTdG9wJztcbiAgfTtcbn1cblxuLyoqIFNsYWNrIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0IGNoYW5uZWwgbG9hZGVkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIChgU0xBQ0tfU0VDUkVUX05BTUVgKS4gKi9cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIC8qKiBTbGFjayBib3QgdG9rZW4gZm9yIHRoZSBTbGFjayBgV2ViQ2xpZW50YC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIENoYW5uZWwgSUQgb3IgbmFtZSBwYXNzZWQgdG8gYGNoYXQucG9zdE1lc3NhZ2VgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHNlY3JldCBwYXlsb2FkIGlzIGEgSlNPTiBvYmplY3Qgd2l0aCBub24tZW1wdHkgU2xhY2sgYHRva2VuYCBhbmQgYGNoYW5uZWxgLlxuICpcbiAqIGBhd3MtbGFtYmRhLXNlY3JldC1mZXRjaGVyYCBeMC43IHBhcnNlcyBKU09OIHdpdGggcXVpZXQtanNvbi1wYXJzZXI7IGludmFsaWQgb3IgZW1wdHlcbiAqIEpTT04gZmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgc3RyaW5nIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWV9LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gYHZhbHVlYCBpcyBhIHtAbGluayBTbGFja1NlY3JldH0uXG4gKi9cbmNvbnN0IGlzU2xhY2tTZWNyZXQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTbGFja1NlY3JldCA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKCd0b2tlbicgaW4gdmFsdWUpIHx8ICEoJ2NoYW5uZWwnIGluIHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLnRva2VuICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS50b2tlbiA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZS5jaGFubmVsICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5jaGFubmVsID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgb25lIEVDMiBpbnN0YW5jZTogZGVzY3JpYmVzIHN0YXRlLCBpc3N1ZXMgc3RhcnQvc3RvcCB3aGVuIG5lZWRlZCwgdGhlbiB3YWl0cyB1bnRpbFxuICoge0BsaW5rIGlzRGVzaXJlZFN0YWJsZVN0YXRlfSBpcyBzYXRpc2ZpZWQgKGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIGJldHdlZW4gYXR0ZW1wdHMpLlxuICpcbiAqIEVhY2ggbG9vcCBpdGVyYXRpb24gY2hlY2tzIHtAbGluayBnZXRXYWl0QWJvcnRSZWFzb259IGJlZm9yZSBkZXNjcmliZS4gRmFpbHVyZXMgdXNlXG4gKiB7QGxpbmsgZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZX0gKGBSZXNvdXJjZVdhaXRGYWlsZWQ6KmAgbWVzc2FnZSBwcmVmaXgpLlxuICpcbiAqIEBwYXJhbSBjdHggLSBEdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0IChjaGlsZCBjb250ZXh0IHBlciBpbnN0YW5jZSByZWNvbW1lbmRlZCkuXG4gKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgLSBFQzIgaW5zdGFuY2UgQVJOLlxuICogQHBhcmFtIHBhcmFtcyAtIFNjaGVkdWxlciBwYXJhbXMgKGBUYWdLZXlgLCBgVGFnVmFsdWVzYCwgYE1vZGVgKS5cbiAqIEBwYXJhbSByZXNvdXJjZUluZGV4IC0gSW5kZXggdXNlZCBpbiBkdXJhYmxlIHN0ZXAgbmFtZXMgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcGFyYW0gd2FpdExpbWl0cyAtIFBlci1pbnN0YW5jZSBjYXBzIGZyb20ge0BsaW5rIHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudn0gKHNldCBieSB0aGUgQ0RLIGNvbnN0cnVjdCkuXG4gKiBAcmV0dXJucyBGaW5hbCByZXNvdXJjZSBBUk4sIEVDMiBzdGF0ZSBuYW1lLCBwYXJzZWQgYWNjb3VudCwgcmVnaW9uLCBhbmQgaW5zdGFuY2UgaWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiB3YWl0IGxpbWl0cyBhcmUgZXhjZWVkZWQgKGBNYXhMb29wQ291bnRFeGNlZWRlZGAsIGBNYXhFbGFwc2VkVGltZUV4Y2VlZGVkYCksXG4gKiAgIHRoZSBpbnN0YW5jZSBpcyBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlIChgVW5leHBlY3RlZEluc3RhbmNlU3RhdGVgKSwgb3IgdGhlIGxvb3AgZXhpdHMgd2l0aG91dCBhIHN0YWJsZSBnb2FsIHN0YXRlLlxuICovXG5jb25zdCBwcm9jZXNzT25lUmVzb3VyY2UgPSBhc3luYyAoXG4gIGN0eDogRHVyYWJsZUNvbnRleHQsXG4gIHRhcmdldFJlc291cmNlOiBzdHJpbmcsXG4gIHBhcmFtczogU2NoZWR1bGVyRXZlbnRbJ1BhcmFtcyddLFxuICByZXNvdXJjZUluZGV4OiBudW1iZXIsXG4gIHdhaXRMaW1pdHM6IFJlc291cmNlV2FpdExpbWl0cyxcbik6IFByb21pc2U8eyByZXNvdXJjZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyByZWdpb246IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH0+ID0+IHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXRSZXNvdXJjZS5zcGxpdCgnLycpO1xuICBjb25zdCBpZGVudGlmaWVyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPz8gJ3Vua25vd24nO1xuICBjb25zdCBhcm5QYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGFjY291bnQgPSBhcm5QYXJ0c1s0XSA/PyAnJztcbiAgY29uc3QgcmVnaW9uID0gYXJuUGFydHNbM10gPz8gJyc7XG4gIGNvbnN0IHN0ZXBQcmVmaXggPSBgcmVzb3VyY2UtJHtyZXNvdXJjZUluZGV4fS0ke2lkZW50aWZpZXJ9YDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnQnLCB7XG4gICAgcmVzb3VyY2VJbmRleCxcbiAgICBpZGVudGlmaWVyLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIG1heExvb3BDb3VudDogd2FpdExpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHdhaXRMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gICAgc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHM6IHdhaXRMaW1pdHMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMsXG4gIH0pO1xuXG4gIGNvbnN0IHN0YXJ0ZWRBdE1zID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0td2FpdC1zdGFydGVkLWF0YCwgYXN5bmMgKCkgPT4gRGF0ZS5ub3coKSk7XG5cbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50U3RhdGUgPSAnJztcbiAgZG8ge1xuICAgIGNvbnN0IGFib3J0UmVhc29uID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0td2FpdC1saW1pdC1jaGVjay0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PlxuICAgICAgZ2V0V2FpdEFib3J0UmVhc29uKGxvb3BDb3VudCwgc3RhcnRlZEF0TXMsIERhdGUubm93KCksIHdhaXRMaW1pdHMpLFxuICAgICk7XG4gICAgaWYgKGFib3J0UmVhc29uKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZShhYm9ydFJlYXNvbiwge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlOiBjdXJyZW50U3RhdGUgfHwgJ3Vua25vd24nLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogd2FpdExpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IGxpbWl0IGV4Y2VlZGVkJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhYm9ydFJlYXNvbixcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIG1heExvb3BDb3VudDogd2FpdExpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgICAgIG1heEVsYXBzZWRTZWNvbmRzOiB3YWl0TGltaXRzLm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFN0YXRlID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tZGVzY3JpYmUtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBlYzIuc2VuZChuZXcgRGVzY3JpYmVJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICByZXR1cm4gb3V0LlJlc2VydmF0aW9ucz8uWzBdPy5JbnN0YW5jZXM/LlswXT8uU3RhdGU/Lk5hbWUgPz8gJ3Vua25vd24nO1xuICAgIH0pO1xuXG4gICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IGRlc2NyaWJlZCcsIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBsb29wQ291bnQsXG4gICAgICBjdXJyZW50U3RhdGUsXG4gICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGUgPSBwYXJhbXMuTW9kZTtcblxuICAgIGlmIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnRpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0YXJ0LSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICAgIGF3YWl0IGVjMi5zZW5kKG5ldyBTdGFydEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RhcnQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IHdhaXRMaW1pdHMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogd2FpdExpbWl0cy5zdGF0dXNDaGFuZ2VXYWl0U2Vjb25kcyB9KTtcbiAgICAgIGxvb3BDb3VudCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG1vZGUgPT09ICdTdG9wJyAmJiBjdXJyZW50U3RhdGUgPT09ICdydW5uaW5nJykge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHN0b3BwaW5nIGluc3RhbmNlJywgeyBpZGVudGlmaWVyLCBsb29wQ291bnQgfSk7XG4gICAgICBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1zdG9wLSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICAgIGF3YWl0IGVjMi5zZW5kKG5ldyBTdG9wSW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogd2FpdCBhZnRlciBzdG9wJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBzZWNvbmRzOiB3YWl0TGltaXRzLnN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IHdhaXRMaW1pdHMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNEZXNpcmVkU3RhYmxlU3RhdGUobW9kZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgaWYgKGlzVHJhbnNpdGlvbmluZ1N0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgd2hpbGUgdHJhbnNpdGlvbmluZycsIHtcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBzZWNvbmRzOiB3YWl0TGltaXRzLnN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgY3R4LndhaXQoeyBzZWNvbmRzOiB3YWl0TGltaXRzLnN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzIH0pO1xuICAgICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlKCdVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZScsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgbW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogd2FpdExpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB1bmV4cGVjdGVkIHN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfSB3aGlsZSAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKHBhcmFtcy5Nb2RlLCBjdXJyZW50U3RhdGUpKTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogcmVhY2hlZCBkZXNpcmVkIHN0YWJsZSBzdGF0ZScsIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGZpbmFsU3RhdGU6IGN1cnJlbnRTdGF0ZSxcbiAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICBsb29wQ291bnQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaWRlbnRpZmllcixcbiAgICBhY2NvdW50LFxuICAgIHJlZ2lvbixcbiAgICByZXNvdXJjZTogdGFyZ2V0UmVzb3VyY2UsXG4gICAgc3RhdHVzOiBjdXJyZW50U3RhdGUsXG4gIH07XG59O1xuXG4vKipcbiAqIER1cmFibGUgTGFtYmRhIGVudHJ5IHBvaW50IGZvciB0aGUgRUMyIHJ1bm5pbmcgc2NoZWR1bGVyLlxuICpcbiAqIFJlc29sdmVzIGluc3RhbmNlcyB2aWEgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJLCBydW5zIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IGZvciBlYWNoIEFSTlxuICogaW4gcGFyYWxsZWwgKGJvdW5kZWQgY29uY3VycmVuY3kpLCBwb3N0cyBhIHBhcmVudCBTbGFjayBtZXNzYWdlIGFuZCBwZXItaW5zdGFuY2UgdGhyZWFkIHJlcGxpZXMsXG4gKiBhbmQgdXNlcyBkdXJhYmxlIGBzdGVwYCAvIGB3YWl0YCAvIGBtYXBgIHNvIHRoZSBydW4gY2FuIHJlc3VtZSBhY3Jvc3Mgc3VzcGVuc2lvbnMuXG4gKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHdhaXQgbGltaXRzIGZyb20gYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRgLFxuICogYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU2AsIGFuZCBgUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU2BcbiAqIHZpYSB7QGxpbmsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52fSwgYW5kIG1hcCBjb25jdXJyZW5jeSBmcm9tXG4gKiBgUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZYCB2aWEge0BsaW5rIHBhcnNlTWF4Q29uY3VycmVuY3lGcm9tRW52fS5cbiAqIExvYWRzIHRoZSBTbGFjayBzZWNyZXQgdmlhIHtAbGluayBzZWNyZXRGZXRjaGVyfSAoUGFyYW1ldGVycyBhbmQgU2VjcmV0cyBMYW1iZGEgRXh0ZW5zaW9uKS5cbiAqIFNsYWNrIEFQSSBmYWlsdXJlcyBhcmUgbG9nZ2VkIGFzIGBydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgcG9zdCBmYWlsZWRgIGZvciBDbG91ZFdhdGNoIGxvZyBmaWx0ZXJzLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXI7IG11c3QgaW5jbHVkZSBgUGFyYW1zLlRhZ0tleWAsIGBQYXJhbXMuVGFnVmFsdWVzYCwgYFBhcmFtcy5Nb2RlYC5cbiAqIEBwYXJhbSBjdHggLSBSb290IGR1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJuc1xuICogLSBgeyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgfWAgd2hlbiBubyBpbnN0YW5jZXMgbWF0Y2ggdGhlIHRhZyBmaWx0ZXIuXG4gKiAtIGB7IHN0YXR1czogJ0NvbXBsZXRlZCcsIHByb2Nlc3NlZCwgcmVzdWx0cyB9YCB3aGVuIGluc3RhbmNlcyB3ZXJlIGhhbmRsZWQgKGByZXN1bHRzYCBlbnRyaWVzIG1hdGNoIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IHJldHVybiBzaGFwZSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYFBhcmFtc2AgaXMgaW52YWxpZCwgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlIG9yIG5vdCBKU09OIHdpdGggYHRva2VuYCBhbmQgYGNoYW5uZWxgLFxuICogICBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlV2FpdEZhaWxlZDoqYCBlcnJvcnMpLFxuICogICBvciB0aGUgc2VjcmV0IGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGV4dGVuc2lvbiAoZS5nLiBvdXRzaWRlIExhbWJkYSBvciBtaXNzaW5nIGBBV1NfU0VTU0lPTl9UT0tFTmApLlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHJlcXVpcmVkIGVudiB2YXJzIGFyZSBtaXNzaW5nIG9yIG5vdCBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllckh0dHBFcnJvcn0gV2hlbiB0aGUgZXh0ZW5zaW9uIHJldHVybnMgYSBub24tcmV0cmlhYmxlIEhUVFAgZXJyb3IuXG4gKiBAdGhyb3dzIHtpbXBvcnQoJ2ZldGNoLXJldHJpZXInKS5GZXRjaFJldHJpZXJOZXR3b3JrRXJyb3J9IFdoZW4gZXh0ZW5zaW9uIHJlcXVlc3RzIGZhaWwgYXQgdGhlIG5ldHdvcmsgbGV2ZWwuXG4gKiBAdGhyb3dzIHtpbXBvcnQoJ2ZldGNoLXJldHJpZXInKS5GZXRjaFJldHJpZXJBYm9ydEVycm9yfSBXaGVuIGV4dGVuc2lvbiByZXF1ZXN0cyB0aW1lIG91dCBhZnRlciBhbGwgcmV0cmllcy5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllckludmFsaWRPcHRpb25zRXJyb3J9IFdoZW4gc2VjcmV0LWZldGNoIHJldHJ5IG9wdGlvbnMgYXJlIGludmFsaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gd2l0aER1cmFibGVFeGVjdXRpb24oYXN5bmMgKGV2ZW50OiBTY2hlZHVsZXJFdmVudCwgY3R4OiBEdXJhYmxlQ29udGV4dCkgPT4ge1xuXG4gIGNvbnN0IHBhcmFtcyA9IGV2ZW50LlBhcmFtcztcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBpbnZvY2F0aW9uJywge1xuICAgIG1vZGU6IHBhcmFtcz8uTW9kZSxcbiAgICB0YWdLZXk6IHBhcmFtcz8uVGFnS2V5LFxuICAgIHRhZ1ZhbHVlQ291bnQ6IHBhcmFtcz8uVGFnVmFsdWVzPy5sZW5ndGggPz8gMCxcbiAgfSk7XG5cbiAgaWYgKCFwYXJhbXM/LlRhZ0tleSB8fCAhcGFyYW1zPy5UYWdWYWx1ZXMgfHwgIXBhcmFtcz8uTW9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBldmVudDogUGFyYW1zLlRhZ0tleSwgUGFyYW1zLlRhZ1ZhbHVlcywgUGFyYW1zLk1vZGUgYXJlIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgY29uc3Qgd2FpdExpbWl0cyA9IHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudigpO1xuICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHBhcnNlTWF4Q29uY3VycmVuY3lGcm9tRW52KCk7XG5cbiAgY29uc3Qgc2xhY2tTZWNyZXROYW1lID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnU0xBQ0tfU0VDUkVUX05BTUUnLCBTdHJpY3RFbnZUeXBlLlN0cmluZyk7XG5cbiAgY29uc3Qgc2xhY2tTZWNyZXRWYWx1ZTogdW5rbm93biA9IGF3YWl0IGN0eC5zdGVwKCdmZXRjaC1zbGFjay1zZWNyZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZmV0Y2hpbmcgU2xhY2sgc2VjcmV0JywgeyBzZWNyZXROYW1lOiBzbGFja1NlY3JldE5hbWUgfSk7XG4gICAgcmV0dXJuIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWUoc2xhY2tTZWNyZXROYW1lLCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHNlY3JldCBsb2FkZWQnKTtcblxuICBpZiAoIWlzU2xhY2tTZWNyZXQoc2xhY2tTZWNyZXRWYWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsYWNrIHNlY3JldCBtdXN0IGNvbnRhaW4gdG9rZW4gYW5kIGNoYW5uZWwuJyk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRSZXNvdXJjZXMgPSBhd2FpdCBjdHguc3RlcCgnZ2V0LXRhcmdldC1yZXNvdXJjZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnZWMyOmluc3RhbmNlJ10sXG4gICAgICAgIFRhZ0ZpbHRlcnM6IFt7IEtleTogcGFyYW1zLlRhZ0tleSwgVmFsdWVzOiBwYXJhbXMuVGFnVmFsdWVzIH1dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBhcm5zID0gKHJlc3VsdC5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID8/IFtdKVxuICAgICAgLm1hcCgobTogeyBSZXNvdXJjZUFSTj86IHN0cmluZyB9KSA9PiBtLlJlc291cmNlQVJOKVxuICAgICAgLmZpbHRlcigoYXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhcm4gaXMgc3RyaW5nID0+IGFybiAhPSBudWxsKTtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBnZXQtdGFyZ2V0LXJlc291cmNlcyBkb25lJywgeyBjb3VudDogYXJucy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGFybnM7XG4gIH0pO1xuXG4gIGlmICh0YXJnZXRSZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogbm8gbWF0Y2hpbmcgaW5zdGFuY2VzJywgeyB0YWdLZXk6IHBhcmFtcy5UYWdLZXkgfSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIGFzIGNvbnN0IH07XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViQ2xpZW50KHNsYWNrU2VjcmV0VmFsdWUudG9rZW4pO1xuICBjb25zdCBjaGFubmVsID0gc2xhY2tTZWNyZXRWYWx1ZS5jaGFubmVsO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgcGFyZW50IFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgaW5zdGFuY2VDb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgfSk7XG5cbiAgLy8gc2VuZCBzbGFjayBtZXNzYWdlXG4gIGNvbnN0IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdCA9IGF3YWl0IGN0eC5zdGVwKCdwb3N0LXNsYWNrLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0ZXh0OiBgJHtwYXJhbXMuTW9kZSA9PT0gJ1N0YXJ0JyA/ICfwn5iGIFN0YXJ0cycgOiAn8J+lsSBTdG9wcyd9IHRoZSBzY2hlZHVsZWQgRUMyIEluc3RhbmNlLmAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkJywge1xuICAgICAgICBzdGVwOiAncG9zdC1zbGFjay1tZXNzYWdlcycsXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBhcmVudCBTbGFjayBtZXNzYWdlIHBvc3RlZCcsIHtcbiAgICB0aHJlYWRUczogc2xhY2tQYXJlbnRNZXNzYWdlUmVzdWx0Py50cyA/PyBudWxsLFxuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBzdGFydGluZyBwYXJhbGxlbCBpbnN0YW5jZSBwcm9jZXNzaW5nJywge1xuICAgIGNvdW50OiB0YXJnZXRSZXNvdXJjZXMubGVuZ3RoLFxuICAgIG1heENvbmN1cnJlbmN5LFxuICB9KTtcblxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgY3R4Lm1hcChcbiAgICB0YXJnZXRSZXNvdXJjZXMsXG4gICAgLy8gYXN5bmMgKGN0eDogRHVyYWJsZUNvbnRleHQsIHRhcmdldFJlc291cmNlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+XG4gICAgLy8gICBjdHguc3RlcChgcHJvY2Vzcy1yZXNvdXJjZS0ke2luZGV4fWAsIGFzeW5jICgpID0+XG4gICAgLy8gICAgIHByb2Nlc3NPbmVSZXNvdXJjZShjdHgsIHRhcmdldFJlc291cmNlLCBwYXJhbXMsIGluZGV4KSxcbiAgICAvLyAgICksXG4gICAgYXN5bmMgKG1hcEN0eDogRHVyYWJsZUNvbnRleHQsIHRhcmdldFJlc291cmNlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBtYXBDdHgucnVuSW5DaGlsZENvbnRleHQoYHJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKGNoaWxkQ3R4OiBEdXJhYmxlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzT25lUmVzb3VyY2UoY2hpbGRDdHgsIHRhcmdldFJlc291cmNlLCBwYXJhbXMsIGluZGV4LCB3YWl0TGltaXRzKTtcbiAgICAgICAgLy8gaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdza2lwcGVkJykge1xuICAgICAgICAvLyAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIC8vIH1cbiAgICAgICAgY2hpbGRDdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHRocmVhZCBTbGFjayBtZXNzYWdlJywge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGlkZW50aWZpZXI6IHJlc3VsdC5pZGVudGlmaWVyLFxuICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHNlbmQgc2xhY2sgdGhyZWFkIG1lc3NhZ2VcbiAgICAgICAgYXdhaXQgY2hpbGRDdHguc3RlcCgncG9zdC1zbGFjay1jaGlsZC1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5ID0gZ2V0U3RhdGVEaXNwbGF5KHJlc3VsdC5zdGF0dXMpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuY2hhdC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIHRocmVhZF90czogc2xhY2tQYXJlbnRNZXNzYWdlUmVzdWx0Py50cyxcbiAgICAgICAgICAgICAgYXR0YWNobWVudHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyMzNmE2NGYnLFxuICAgICAgICAgICAgICAgICAgcHJldGV4dDogYCR7ZGlzcGxheT8uZW1vaml9IFRoZSBzdGF0dXMgb2YgdGhlIEVDMiBJbnN0YW5jZSAke3Jlc3VsdC5pZGVudGlmaWVyfSBjaGFuZ2VkIHRvICR7ZGlzcGxheT8ubmFtZX0gZHVlIHRvIHRoZSBzY2hlZHVsZS5gLFxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdBY2NvdW50JywgdmFsdWU6IHJlc3VsdC5hY2NvdW50LCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnUmVnaW9uJywgdmFsdWU6IHJlc3VsdC5yZWdpb24sIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdJZGVudGlmaWVyJywgdmFsdWU6IHJlc3VsdC5pZGVudGlmaWVyLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnU3RhdHVzJywgdmFsdWU6IChkaXNwbGF5Py5uYW1lID8/ICdVbmtub3duJyksIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgY2hpbGRDdHgubG9nZ2VyLmVycm9yKCdydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgcG9zdCBmYWlsZWQnLCB7XG4gICAgICAgICAgICAgIHN0ZXA6ICdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJyxcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IG1heENvbmN1cnJlbmN5IH0sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0TGlzdCA9IEFycmF5LmlzQXJyYXkocmVzdWx0cykgPyByZXN1bHRzIDogW107XG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IGNvbXBsZXRlZCcsIHtcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0Q291bnQ6IHJlc3VsdExpc3QubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6ICdDb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgIHByb2Nlc3NlZDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICByZXN1bHRzOiByZXN1bHRMaXN0LFxuICB9O1xufSk7XG4iXX0=
|
|
@@ -4,7 +4,8 @@ import { TargetResource, Secrets, Schedule, type FailureDetectionAlarms } from '
|
|
|
4
4
|
/**
|
|
5
5
|
* Props for the EC2 instance running schedule CDK stack.
|
|
6
6
|
*
|
|
7
|
-
* @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here
|
|
7
|
+
* @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here
|
|
8
|
+
* (e.g. `resourceWait`, `runtime`, `durable`, `logGroup`).
|
|
8
9
|
*/
|
|
9
10
|
export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
10
11
|
/** Tag-based target resource for EC2 instances to start/stop. */
|
|
@@ -24,8 +25,10 @@ export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
|
24
25
|
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
25
26
|
*
|
|
26
27
|
* Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
|
|
27
|
-
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}
|
|
28
|
-
*
|
|
28
|
+
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits},
|
|
29
|
+
* {@link RunningSchedulerRuntimeProps}, {@link RunningSchedulerDurableProps}, or
|
|
30
|
+
* {@link RunningSchedulerLogGroupProps}; use the construct directly when custom runtime,
|
|
31
|
+
* wait, durable, or log group settings are required.
|
|
29
32
|
*/
|
|
30
33
|
export declare class EC2InstanceRunningScheduleStack extends Stack {
|
|
31
34
|
/**
|
|
@@ -8,11 +8,13 @@ const ec2_instance_running_scheduler_1 = require("../constructs/ec2-instance-run
|
|
|
8
8
|
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
9
9
|
*
|
|
10
10
|
* Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
|
|
11
|
-
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}
|
|
12
|
-
*
|
|
11
|
+
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits},
|
|
12
|
+
* {@link RunningSchedulerRuntimeProps}, {@link RunningSchedulerDurableProps}, or
|
|
13
|
+
* {@link RunningSchedulerLogGroupProps}; use the construct directly when custom runtime,
|
|
14
|
+
* wait, durable, or log group settings are required.
|
|
13
15
|
*/
|
|
14
16
|
class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
15
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.4.1" };
|
|
16
18
|
/**
|
|
17
19
|
* Creates the stack and wires {@link EC2InstanceRunningScheduler}.
|
|
18
20
|
*
|
|
@@ -33,4 +35,4 @@ class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
exports.EC2InstanceRunningScheduleStack = EC2InstanceRunningScheduleStack;
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBZ0Q7QUFFaEQsaUdBQTJKO0FBdUIzSjs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsK0JBQWdDLFNBQVEsbUJBQUs7O0lBQ3hEOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkM7UUFDbkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDbkUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQW5CSCwwRUFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyLCBUYXJnZXRSZXNvdXJjZSwgU2VjcmV0cywgU2NoZWR1bGUsIHR5cGUgRmFpbHVyZURldGVjdGlvbkFsYXJtcyB9IGZyb20gJy4uL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlIENESyBzdGFjay5cbiAqXG4gKiBAc2VlIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wc30gZm9yIGNvbnN0cnVjdC1sZXZlbCBvcHRpb25zIG5vdCBleHBvc2VkIGhlcmVcbiAqIChlLmcuIGByZXNvdXJjZVdhaXRgLCBgcnVudGltZWAsIGBkdXJhYmxlYCwgYGxvZ0dyb3VwYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIC8qKiBUYWctYmFzZWQgdGFyZ2V0IHJlc291cmNlIGZvciBFQzIgaW5zdGFuY2VzIHRvIHN0YXJ0L3N0b3AuICovXG4gIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBUYXJnZXRSZXNvdXJjZTtcbiAgLyoqIFdoZXRoZXIgc2NoZWR1bGluZyBpcyBlbmFibGVkLiBEZWZhdWx0cyB0byB0cnVlIGlmIG9taXR0ZWQuICovXG4gIHJlYWRvbmx5IGVuYWJsZVNjaGVkdWxpbmc/OiBib29sZWFuO1xuICAvKiogU2VjcmV0cyAoZS5nLiBTbGFjaykgZm9yIHRoZSBzY2hlZHVsZXIuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIC8qKiBPcHRpb25hbCBDbG91ZFdhdGNoIGZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcyBhbmQgbG9nLWJhc2VkIG1ldHJpY3MuICovXG4gIHJlYWRvbmx5IGZhaWx1cmVEZXRlY3Rpb24/OiBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zO1xufVxuXG4vKipcbiAqIENESyBzdGFjayB0aGF0IGRlcGxveXMgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlciAoRXZlbnRCcmlkZ2UgU2NoZWR1bGVyICsgRHVyYWJsZSBMYW1iZGEpLlxuICpcbiAqIFdpcmVzIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9IHdpdGggdGFyZ2V0aW5nLCBzY2hlZHVsZXMsIHNlY3JldHMsIHNjaGVkdWxpbmcgdG9nZ2xlLFxuICogYW5kIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zfS4gRG9lcyBub3QgZXhwb3NlIHtAbGluayBSZXNvdXJjZVdhaXRMaW1pdHN9LFxuICoge0BsaW5rIFJ1bm5pbmdTY2hlZHVsZXJSdW50aW1lUHJvcHN9LCB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckR1cmFibGVQcm9wc30sIG9yXG4gKiB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckxvZ0dyb3VwUHJvcHN9OyB1c2UgdGhlIGNvbnN0cnVjdCBkaXJlY3RseSB3aGVuIGN1c3RvbSBydW50aW1lLFxuICogd2FpdCwgZHVyYWJsZSwgb3IgbG9nIGdyb3VwIHNldHRpbmdzIGFyZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBzdGFjayBhbmQgd2lyZXMge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcn0uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3Qgb3IgYXBwLlxuICAgKiBAcGFyYW0gaWQgLSBTdGFjayBpZC5cbiAgICogQHBhcmFtIHByb3BzIC0gVGFyZ2V0IHJlc291cmNlLCBzY2hlZHVsZXMsIHNlY3JldHMsIG9wdGlvbmFsIGZhaWx1cmUgZGV0ZWN0aW9uLCBhbmQgc3RhbmRhcmQgc3RhY2sgcHJvcHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyKHRoaXMsICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInLCB7XG4gICAgICB0YXJnZXRSZXNvdXJjZTogcHJvcHMudGFyZ2V0UmVzb3VyY2UsXG4gICAgICBlbmFibGVTY2hlZHVsaW5nOiBwcm9wcy5lbmFibGVTY2hlZHVsaW5nLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHN0b3BTY2hlZHVsZTogcHJvcHMuc3RvcFNjaGVkdWxlLFxuICAgICAgc3RhcnRTY2hlZHVsZTogcHJvcHMuc3RhcnRTY2hlZHVsZSxcbiAgICAgIGZhaWx1cmVEZXRlY3Rpb246IHByb3BzLmZhaWx1cmVEZXRlY3Rpb24sXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
package/package.json
CHANGED
|
@@ -39,20 +39,20 @@
|
|
|
39
39
|
"organization": false
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@aws-sdk/client-ec2": "^3",
|
|
43
|
-
"@aws-sdk/client-resource-groups-tagging-api": "^3",
|
|
44
|
-
"@aws/durable-execution-sdk-js": "^1",
|
|
45
|
-
"@slack/web-api": "^6",
|
|
42
|
+
"@aws-sdk/client-ec2": "^3.1111.0",
|
|
43
|
+
"@aws-sdk/client-resource-groups-tagging-api": "^3.1111.0",
|
|
44
|
+
"@aws/durable-execution-sdk-js": "^1.1.7",
|
|
45
|
+
"@slack/web-api": "^6.13.0",
|
|
46
46
|
"@stylistic/eslint-plugin": "^2",
|
|
47
|
-
"@types/aws-lambda": "^8",
|
|
47
|
+
"@types/aws-lambda": "^8.10.162",
|
|
48
48
|
"@types/jest": "^29.5.14",
|
|
49
49
|
"@types/node": "^20",
|
|
50
50
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
51
51
|
"@typescript-eslint/parser": "^8",
|
|
52
52
|
"aws-cdk-lib": "2.232.0",
|
|
53
|
-
"aws-lambda-secret-fetcher": "^0.
|
|
54
|
-
"aws-sdk-client-mock": "^2",
|
|
55
|
-
"aws-sdk-client-mock-jest": "^2",
|
|
53
|
+
"aws-lambda-secret-fetcher": "^0.7.2",
|
|
54
|
+
"aws-sdk-client-mock": "^2.2.0",
|
|
55
|
+
"aws-sdk-client-mock-jest": "^2.2.0",
|
|
56
56
|
"commit-and-tag-version": "^12",
|
|
57
57
|
"constructs": "10.5.1",
|
|
58
58
|
"esbuild": "^0.28.2",
|
|
@@ -61,16 +61,16 @@
|
|
|
61
61
|
"eslint-plugin-import": "^2.32.0",
|
|
62
62
|
"jest": "^29.7.0",
|
|
63
63
|
"jest-junit": "^17",
|
|
64
|
-
"jsii": "
|
|
64
|
+
"jsii": "6.0.x",
|
|
65
65
|
"jsii-diff": "^1.139.0",
|
|
66
66
|
"jsii-docgen": "^10.5.0",
|
|
67
67
|
"jsii-pacmak": "^1.139.0",
|
|
68
|
-
"jsii-rosetta": "
|
|
69
|
-
"projen": "^0.
|
|
70
|
-
"strict-env-resolver": "^0.
|
|
68
|
+
"jsii-rosetta": "6.0.x",
|
|
69
|
+
"projen": "^0.103.1",
|
|
70
|
+
"strict-env-resolver": "^0.6.2",
|
|
71
71
|
"ts-jest": "^29.4.12",
|
|
72
72
|
"ts-node": "^10.9.2",
|
|
73
|
-
"typescript": "
|
|
73
|
+
"typescript": "6.0.x"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"aws-cdk-lib": "^2.232.0",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"publishConfig": {
|
|
101
101
|
"access": "public"
|
|
102
102
|
},
|
|
103
|
-
"version": "0.
|
|
103
|
+
"version": "0.4.1",
|
|
104
104
|
"jest": {
|
|
105
105
|
"coverageProvider": "v8",
|
|
106
106
|
"testMatch": [
|