@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.2

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.
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebFunctionRevision = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const constructs_1 = require("constructs");
6
+ /**
7
+ * A revision of a Web Function.
8
+ *
9
+ * `WebFunction` creates its current revision (`fn.currentRevision`) from its code and configuration.
10
+ * Use `fromRevisionAttributes` to route an endpoint to an earlier one, which must still exist:
11
+ * only revisions within `revisionRetention`, or that an endpoint routes to, are kept.
12
+ */
13
+ class WebFunctionRevision extends constructs_1.Construct {
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision", version: "0.1.2" };
15
+ /**
16
+ * References an existing revision of `webFunction`, e.g. to pin an endpoint to it or split traffic with it.
17
+ */
18
+ static fromRevisionAttributes(scope, id, attrs) {
19
+ return new WebFunctionRevision(scope, id, attrs.webFunction, attrs.revisionId, `${attrs.webFunction.webFunctionRef.functionArn}/revision/${attrs.revisionId}`);
20
+ }
21
+ /**
22
+ * The revision `WebFunction` creates.
23
+ *
24
+ * @internal
25
+ */
26
+ static _current(scope, id, webFunction, revisionId, revisionArn) {
27
+ return new WebFunctionRevision(scope, id, webFunction, revisionId, revisionArn);
28
+ }
29
+ webFunction;
30
+ revisionId;
31
+ revisionArn;
32
+ constructor(scope, id, webFunction, revisionId, revisionArn) {
33
+ super(scope, id);
34
+ this.webFunction = webFunction;
35
+ this.revisionId = revisionId;
36
+ this.revisionArn = revisionArn;
37
+ }
38
+ }
39
+ exports.WebFunctionRevision = WebFunctionRevision;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLXJldmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1yZXZpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsMkNBQXdEO0FBMkJ4RDs7Ozs7O0dBTUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQztRQUNyRyxPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLGFBQWEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDakssQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixLQUFnQixFQUFFLEVBQVUsRUFBRSxXQUFtQyxFQUFFLFVBQWtCLEVBQUUsV0FBbUI7UUFFMUcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRWUsV0FBVyxDQUF5QjtJQUNwQyxVQUFVLENBQVM7SUFDbkIsV0FBVyxDQUFTO0lBRXBDLFlBQW9CLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFdBQW1DLEVBQUUsVUFBa0IsRUFBRSxXQUFtQjtRQUM1SCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7O0FBNUJILGtEQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCB0eXBlIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBBIHJldmlzaW9uIG9mIGEgV2ViIEZ1bmN0aW9uOiBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgaXRzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkZ1bmN0aW9uUmV2aXNpb24gZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqIFRoZSByZXZpc2lvbidzIElELCBlLmcuIGByZXYtYTFiMmNgLiAqL1xuICByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSByZXZpc2lvbidzIEFSTi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25Bcm46IHN0cmluZztcblxuICAvKiogVGhlIGZ1bmN0aW9uIHRoZSByZXZpc2lvbiBiZWxvbmdzIHRvLiAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbjogbGFtYmRhLklXZWJGdW5jdGlvblJlZjtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIG9mIGFuIGV4aXN0aW5nIHJldmlzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUmV2aXNpb25BdHRyaWJ1dGVzIHtcbiAgLyoqIFRoZSBmdW5jdGlvbiB0aGUgcmV2aXNpb24gYmVsb25ncyB0by4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IGxhbWJkYS5JV2ViRnVuY3Rpb25SZWY7XG5cbiAgLyoqIFRoZSByZXZpc2lvbidzIElELCBlLmcuIGByZXYtYTFiMmNgICh0aGUgYHJldmlzaW9uSWRgIG9mIGFuIGVhcmxpZXIgZGVwbG95bWVudCkuICovXG4gIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJldmlzaW9uIG9mIGEgV2ViIEZ1bmN0aW9uLlxuICpcbiAqIGBXZWJGdW5jdGlvbmAgY3JlYXRlcyBpdHMgY3VycmVudCByZXZpc2lvbiAoYGZuLmN1cnJlbnRSZXZpc2lvbmApIGZyb20gaXRzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gKiBVc2UgYGZyb21SZXZpc2lvbkF0dHJpYnV0ZXNgIHRvIHJvdXRlIGFuIGVuZHBvaW50IHRvIGFuIGVhcmxpZXIgb25lLCB3aGljaCBtdXN0IHN0aWxsIGV4aXN0OlxuICogb25seSByZXZpc2lvbnMgd2l0aGluIGByZXZpc2lvblJldGVudGlvbmAsIG9yIHRoYXQgYW4gZW5kcG9pbnQgcm91dGVzIHRvLCBhcmUga2VwdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uUmV2aXNpb24gZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb25SZXZpc2lvbiB7XG4gIC8qKlxuICAgKiBSZWZlcmVuY2VzIGFuIGV4aXN0aW5nIHJldmlzaW9uIG9mIGB3ZWJGdW5jdGlvbmAsIGUuZy4gdG8gcGluIGFuIGVuZHBvaW50IHRvIGl0IG9yIHNwbGl0IHRyYWZmaWMgd2l0aCBpdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJldmlzaW9uQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25SZXZpc2lvbkF0dHJpYnV0ZXMpOiBJV2ViRnVuY3Rpb25SZXZpc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvblJldmlzaW9uKHNjb3BlLCBpZCwgYXR0cnMud2ViRnVuY3Rpb24sIGF0dHJzLnJldmlzaW9uSWQsIGAke2F0dHJzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uUmVmLmZ1bmN0aW9uQXJufS9yZXZpc2lvbi8ke2F0dHJzLnJldmlzaW9uSWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldmlzaW9uIGBXZWJGdW5jdGlvbmAgY3JlYXRlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9jdXJyZW50KFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uOiBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmLCByZXZpc2lvbklkOiBzdHJpbmcsIHJldmlzaW9uQXJuOiBzdHJpbmcsXG4gICk6IFdlYkZ1bmN0aW9uUmV2aXNpb24ge1xuICAgIHJldHVybiBuZXcgV2ViRnVuY3Rpb25SZXZpc2lvbihzY29wZSwgaWQsIHdlYkZ1bmN0aW9uLCByZXZpc2lvbklkLCByZXZpc2lvbkFybik7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb246IGxhbWJkYS5JV2ViRnVuY3Rpb25SZWY7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbkFybjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgd2ViRnVuY3Rpb246IGxhbWJkYS5JV2ViRnVuY3Rpb25SZWYsIHJldmlzaW9uSWQ6IHN0cmluZywgcmV2aXNpb25Bcm46IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy53ZWJGdW5jdGlvbiA9IHdlYkZ1bmN0aW9uO1xuICAgIHRoaXMucmV2aXNpb25JZCA9IHJldmlzaW9uSWQ7XG4gICAgdGhpcy5yZXZpc2lvbkFybiA9IHJldmlzaW9uQXJuO1xuICB9XG59XG4iXX0=
@@ -4,39 +4,36 @@ import * as lambda from 'aws-cdk-lib/aws-lambda';
4
4
  import * as logs from 'aws-cdk-lib/aws-logs';
5
5
  import { Construct } from 'constructs';
6
6
  import { WebFunctionAuthType } from './enums';
7
- import { WebFunctionEndpoint, type WebFunctionEndpointOptions } from './web-function-endpoint';
7
+ import { WebFunctionEndpoint, type AddWebFunctionEndpointOptions, type WebFunctionEndpointOptions } from './web-function-endpoint';
8
8
  import { WebFunctionGrants } from './web-function-grants';
9
+ import { type IWebFunctionRevision } from './web-function-revision';
9
10
  /**
10
- * Properties for a `WebFunction`.
11
+ * Options shared by `WebFunction` and `NodejsWebFunction`: everything except how the code is supplied.
11
12
  */
12
- export interface WebFunctionProps {
13
- /**
14
- * The Node.js runtime, e.g. `lambda.Runtime.NODEJS_24_X`.
15
- */
16
- readonly runtime: lambda.Runtime;
17
- /**
18
- * The code: a zip in S3 (`Code.fromAsset`, `Code.fromBucket`, `Code.fromCustomCommand`, `Code.fromDockerBuild`).
19
- * Inline code and container images aren't supported.
20
- *
21
- * The code is copied into the stack's code bucket, which Lambda Web Functions can read.
22
- */
23
- readonly code: lambda.Code;
13
+ export interface WebFunctionOptions {
24
14
  /**
25
15
  * How callers of the endpoint are authenticated.
26
16
  */
27
17
  readonly authType: WebFunctionAuthType;
28
18
  /**
29
- * The endpoint: where it serves from, and its name.
19
+ * The default endpoint (`fn.endpoint`): where it serves from, its name and limits.
20
+ * It serves the current revision; route it elsewhere with `fn.endpoint.routeTraffic()`.
21
+ * Add more endpoints with `addEndpoint`.
30
22
  *
31
- * @default - a HOME_REGION endpoint
23
+ * @default - a HOME_REGION endpoint serving the current revision
32
24
  */
33
25
  readonly endpoint?: WebFunctionEndpointOptions;
34
26
  /**
35
- * The file that starts your server, relative to the root of the code.
27
+ * How many of the newest revisions to keep (1-50). Each deployment that changes the code or
28
+ * configuration creates a revision; older ones stay available to roll back to or route traffic to,
29
+ * and the oldest beyond this count are deleted after each deployment.
36
30
  *
37
- * @default 'index.js'
31
+ * Revisions that an endpoint routes to are never deleted, and neither are those the previous
32
+ * deployment used (a rollback returns to them).
33
+ *
34
+ * @default 20
38
35
  */
39
- readonly entrypoint?: string;
36
+ readonly revisionRetention?: number;
40
37
  /**
41
38
  * The function's name. Renaming a function replaces it, and its endpoint gets a new URL.
42
39
  *
@@ -105,6 +102,28 @@ export interface WebFunctionProps {
105
102
  */
106
103
  readonly systemLogLevelV2?: lambda.SystemLogLevel;
107
104
  }
105
+ /**
106
+ * Properties for a `WebFunction`.
107
+ */
108
+ export interface WebFunctionProps extends WebFunctionOptions {
109
+ /**
110
+ * The Node.js runtime, e.g. `lambda.Runtime.NODEJS_24_X`.
111
+ */
112
+ readonly runtime: lambda.Runtime;
113
+ /**
114
+ * The code: a zip in S3 (`Code.fromAsset`, `Code.fromBucket`, `Code.fromCustomCommand`, `Code.fromDockerBuild`).
115
+ * Inline code and container images aren't supported.
116
+ *
117
+ * The code is copied into the stack's code bucket, which Lambda Web Functions can read.
118
+ */
119
+ readonly code: lambda.Code;
120
+ /**
121
+ * The file that starts your server, relative to the root of the code.
122
+ *
123
+ * @default 'index.js'
124
+ */
125
+ readonly entrypoint?: string;
126
+ }
108
127
  /**
109
128
  * A Lambda Web Function.
110
129
  */
@@ -125,8 +144,9 @@ export interface IWebFunction extends IResource, lambda.IWebFunctionRef {
125
144
  /**
126
145
  * A Node.js HTTP server running as an AWS Lambda Web Function, served from one or more regions.
127
146
  *
128
- * Creates the function, its current revision (code and configuration; any change replaces it),
129
- * an HTTPS endpoint, an execution role, and owns the function's log groups in every region.
147
+ * Creates the function, its current revision (code and configuration; any change creates a new one,
148
+ * and the newest `revisionRetention` are kept), a default HTTPS endpoint, an execution role, and owns
149
+ * the function's log groups in every region its endpoints serve from.
130
150
  *
131
151
  * Importing existing functions (`fromXxx` methods) is planned after 0.1.
132
152
  *
@@ -135,11 +155,13 @@ export interface IWebFunction extends IResource, lambda.IWebFunctionRef {
135
155
  export declare class WebFunction extends Resource implements IWebFunction, iam.IGrantable {
136
156
  readonly webFunctionName: string;
137
157
  readonly webFunctionArn: string;
138
- /** The ID of the current revision. */
158
+ /** The ID of the current revision. Same as `currentRevision.revisionId`. */
139
159
  readonly revisionId: string;
140
- /** The function's endpoint. */
160
+ /** The revision built from the current code and configuration. */
161
+ readonly currentRevision: IWebFunctionRevision;
162
+ /** The default endpoint. Add more with `addEndpoint`. */
141
163
  readonly endpoint: WebFunctionEndpoint;
142
- /** Grants on the function (e.g. `grants.invoke(principal)`). */
164
+ /** Grants on the default endpoint (e.g. `grants.invoke(principal)`). Other endpoints have their own `grants`. */
143
165
  readonly grants: WebFunctionGrants;
144
166
  /** The execution role. */
145
167
  readonly role: iam.IRole;
@@ -151,9 +173,22 @@ export declare class WebFunction extends Resource implements IWebFunction, iam.I
151
173
  */
152
174
  readonly logGroup: logs.ILogGroup;
153
175
  private readonly environment;
176
+ private readonly endpoints;
177
+ private readonly remoteLogGroups;
178
+ private readonly logGroupName;
179
+ private readonly logOptions;
180
+ private readonly resource;
181
+ private readonly revisionCleanup;
154
182
  /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
155
183
  get webFunctionRef(): lambda.WebFunctionReference;
156
184
  constructor(scope: Construct, id: string, props: WebFunctionProps);
185
+ /**
186
+ * Adds an endpoint (up to 10 per function), e.g. a public one next to an IAM-only one, or one pinned to an
187
+ * earlier revision. Each endpoint has its own URL, authentication, regions and limits.
188
+ *
189
+ * @param id the endpoint's construct ID, also used in its generated name (`<id>-<hash>`)
190
+ */
191
+ addEndpoint(id: string, options: AddWebFunctionEndpointOptions): WebFunctionEndpoint;
157
192
  /**
158
193
  * Adds an environment variable. Names starting with `AWS_` are reserved.
159
194
  */
@@ -167,7 +202,7 @@ export declare class WebFunction extends Resource implements IWebFunction, iam.I
167
202
  * [disable-awslint:no-grants]
168
203
  */
169
204
  grantInvoke(grantee: iam.IGrantable): iam.Grant;
205
+ private createEndpoint;
170
206
  private createLogGroups;
171
- private createRemoteLogGroups;
172
207
  private logGroupIn;
173
208
  }
@@ -41,28 +41,34 @@ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
41
41
  const logs = __importStar(require("aws-cdk-lib/aws-logs"));
42
42
  const code_1 = require("./private/code");
43
43
  const log_group_1 = require("./private/log-group");
44
+ const revision_cleanup_1 = require("./private/revision-cleanup");
44
45
  const validation_1 = require("./private/validation");
45
46
  const web_function_endpoint_1 = require("./web-function-endpoint");
46
- const web_function_grants_1 = require("./web-function-grants");
47
+ const web_function_revision_1 = require("./web-function-revision");
48
+ /** Endpoints per function (service quota, not adjustable). */
49
+ const MAX_ENDPOINTS = 10;
47
50
  /**
48
51
  * A Node.js HTTP server running as an AWS Lambda Web Function, served from one or more regions.
49
52
  *
50
- * Creates the function, its current revision (code and configuration; any change replaces it),
51
- * an HTTPS endpoint, an execution role, and owns the function's log groups in every region.
53
+ * Creates the function, its current revision (code and configuration; any change creates a new one,
54
+ * and the newest `revisionRetention` are kept), a default HTTPS endpoint, an execution role, and owns
55
+ * the function's log groups in every region its endpoints serve from.
52
56
  *
53
57
  * Importing existing functions (`fromXxx` methods) is planned after 0.1.
54
58
  *
55
59
  * @resource AWS::Lambda::WebFunction
56
60
  */
57
61
  class WebFunction extends aws_cdk_lib_1.Resource {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.0" };
62
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.2" };
59
63
  webFunctionName;
60
64
  webFunctionArn;
61
- /** The ID of the current revision. */
65
+ /** The ID of the current revision. Same as `currentRevision.revisionId`. */
62
66
  revisionId;
63
- /** The function's endpoint. */
67
+ /** The revision built from the current code and configuration. */
68
+ currentRevision;
69
+ /** The default endpoint. Add more with `addEndpoint`. */
64
70
  endpoint;
65
- /** Grants on the function (e.g. `grants.invoke(principal)`). */
71
+ /** Grants on the default endpoint (e.g. `grants.invoke(principal)`). Other endpoints have their own `grants`. */
66
72
  grants;
67
73
  /** The execution role. */
68
74
  role;
@@ -74,6 +80,12 @@ class WebFunction extends aws_cdk_lib_1.Resource {
74
80
  */
75
81
  logGroup;
76
82
  environment = {};
83
+ endpoints = [];
84
+ remoteLogGroups = new Map();
85
+ logGroupName;
86
+ logOptions;
87
+ resource;
88
+ revisionCleanup;
77
89
  /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
78
90
  get webFunctionRef() {
79
91
  return { functionArn: this.webFunctionArn };
@@ -92,6 +104,10 @@ class WebFunction extends aws_cdk_lib_1.Resource {
92
104
  if (maxConcurrency !== undefined && !aws_cdk_lib_1.Token.isUnresolved(maxConcurrency) && !validConcurrency(maxConcurrency)) {
93
105
  throw new Error(`${this.node.path}: maxConcurrencyPerEnvironment must be an integer from 1 to 128, got ${maxConcurrency}`);
94
106
  }
107
+ const revisionRetention = props.revisionRetention ?? 20;
108
+ if (!aws_cdk_lib_1.Token.isUnresolved(revisionRetention) && (!Number.isInteger(revisionRetention) || revisionRetention < 1 || revisionRetention > 50)) {
109
+ throw new Error(`${this.node.path}: revisionRetention must be an integer from 1 to 50, got ${revisionRetention}`);
110
+ }
95
111
  const systemLogLevels = [lambda.SystemLogLevel.DEBUG, lambda.SystemLogLevel.INFO, lambda.SystemLogLevel.WARN];
96
112
  if (props.systemLogLevelV2 !== undefined && !systemLogLevels.includes(props.systemLogLevelV2)) {
97
113
  throw new Error(`${this.node.path}: systemLogLevelV2 must be DEBUG, INFO or WARN for Lambda Web Functions`);
@@ -111,7 +127,9 @@ class WebFunction extends aws_cdk_lib_1.Resource {
111
127
  this.grantPrincipal = this.role;
112
128
  // Log groups first: the service would otherwise create them without retention.
113
129
  const logGroupName = `/aws/lambda/web/${this.webFunctionName}`;
114
- const logGroups = this.createLogGroups(logGroupName, props);
130
+ this.logGroupName = logGroupName;
131
+ this.logOptions = { logRetention: props.logRetention, logRemovalPolicy: props.logRemovalPolicy };
132
+ const logGroups = this.createLogGroups(logGroupName);
115
133
  this.logGroup = logs.LogGroup.fromLogGroupName(this, 'LogGroup', logGroupName);
116
134
  const code = new code_1.WebFunctionCode(this, 'Code', props.code).location;
117
135
  const fn = new lambda.CfnWebFunction(this, 'Resource', { functionName: this.webFunctionName });
@@ -119,6 +137,7 @@ class WebFunction extends aws_cdk_lib_1.Resource {
119
137
  for (const group of logGroups)
120
138
  fn.node.addDependency(group.resource);
121
139
  aws_cdk_lib_1.Validations.of(fn).acknowledge(validation_1.CFN_VALIDATE_UNKNOWN_TYPE);
140
+ this.resource = fn;
122
141
  this.webFunctionArn = fn.attrFunctionArn;
123
142
  const revision = new lambda.CfnWebFunctionRevision(this, 'Revision', {
124
143
  functionName: fn.attrFunctionArn,
@@ -144,18 +163,28 @@ class WebFunction extends aws_cdk_lib_1.Resource {
144
163
  // Wait for the role's policies, so the first environment starts with its permissions.
145
164
  revision.node.addDependency(this.role);
146
165
  aws_cdk_lib_1.Validations.of(revision).acknowledge(validation_1.CFN_VALIDATE_UNKNOWN_TYPE);
166
+ // Replaced revisions stay as rollback targets; RevisionCleanup deletes the oldest. Deleting the function deletes them all.
167
+ revision.applyRemovalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN);
147
168
  this.revisionId = revision.attrRevisionId;
148
- this.endpoint = web_function_endpoint_1.WebFunctionEndpoint._create(this, 'Endpoint', {
149
- ...props.endpoint,
169
+ this.currentRevision = web_function_revision_1.WebFunctionRevision._current(this, 'CurrentRevision', this, revision.attrRevisionId, revision.attrRevisionArn);
170
+ this.revisionCleanup = new revision_cleanup_1.RevisionCleanup(this, 'RevisionCleanup', {
150
171
  functionName: this.webFunctionName,
151
172
  functionArn: fn.attrFunctionArn,
152
- revisionId: revision.attrRevisionId,
153
- authType: props.authType,
173
+ keep: revisionRetention,
174
+ revisionIds: () => [this.currentRevision.revisionId, ...this.endpoints.flatMap((e) => e._revisionIds())],
154
175
  });
155
- this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this.endpoint);
156
- // Remote regions' .local groups can only be created once the regions are known.
157
- for (const group of this.createRemoteLogGroups(logGroupName, props))
158
- fn.node.addDependency(group.resource);
176
+ this.endpoint = this.createEndpoint('Endpoint', { ...props.endpoint, authType: props.authType }, 'default');
177
+ this.grants = this.endpoint.grants;
178
+ }
179
+ /**
180
+ * Adds an endpoint (up to 10 per function), e.g. a public one next to an IAM-only one, or one pinned to an
181
+ * earlier revision. Each endpoint has its own URL, authentication, regions and limits.
182
+ *
183
+ * @param id the endpoint's construct ID, also used in its generated name (`<id>-<hash>`)
184
+ */
185
+ addEndpoint(id, options) {
186
+ const prefix = id.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+/, '').slice(0, 55).replace(/-+$/, '') || 'endpoint';
187
+ return this.createEndpoint(id, options, prefix, id);
159
188
  }
160
189
  /**
161
190
  * Adds an environment variable. Names starting with `AWS_` are reserved.
@@ -180,24 +209,49 @@ class WebFunction extends aws_cdk_lib_1.Resource {
180
209
  grantInvoke(grantee) {
181
210
  return this.grants.invoke(grantee);
182
211
  }
183
- createLogGroups(logGroupName, props) {
212
+ createEndpoint(id, options, namePrefix, nameSeed) {
213
+ if (this.endpoints.length >= MAX_ENDPOINTS) {
214
+ throw new Error(`${this.node.path}: a Web Function can have at most ${MAX_ENDPOINTS} endpoints`);
215
+ }
216
+ const endpoint = web_function_endpoint_1.WebFunctionEndpoint._create(this, id, {
217
+ ...options,
218
+ webFunction: this,
219
+ currentRevision: this.currentRevision,
220
+ namePrefix,
221
+ nameSeed,
222
+ });
223
+ const clash = this.endpoints.find((e) => !aws_cdk_lib_1.Token.isUnresolved(e.endpointName) && e.endpointName === endpoint.endpointName);
224
+ if (clash) {
225
+ throw new Error(`${endpoint.node.path}: endpointName '${endpoint.endpointName}' is already used by ${clash.node.path}`);
226
+ }
227
+ this.endpoints.push(endpoint);
228
+ // Revisions an endpoint stops routing to only become deletable once it's updated.
229
+ this.revisionCleanup.node.addDependency(endpoint);
230
+ // Each serving region's .local group must exist before traffic, and outlive the function.
231
+ for (const region of endpoint.regions.slice(1)) {
232
+ if (this.remoteLogGroups.has(region))
233
+ continue;
234
+ const group = this.logGroupIn(`LocalLogs-${region}`, region, `${this.logGroupName}.local`);
235
+ this.remoteLogGroups.set(region, group);
236
+ this.resource.node.addDependency(group.resource);
237
+ }
238
+ return endpoint;
239
+ }
240
+ createLogGroups(logGroupName) {
184
241
  const home = aws_cdk_lib_1.Stack.of(this).region;
185
242
  return [
186
- this.logGroupIn('Logs', home, logGroupName, props),
187
- this.logGroupIn('LocalLogs', home, `${logGroupName}.local`, props),
243
+ this.logGroupIn('Logs', home, logGroupName),
244
+ this.logGroupIn('LocalLogs', home, `${logGroupName}.local`),
188
245
  ];
189
246
  }
190
- createRemoteLogGroups(logGroupName, props) {
191
- return this.endpoint.regions.slice(1).map((region) => this.logGroupIn(`LocalLogs-${region}`, region, `${logGroupName}.local`, props));
192
- }
193
- logGroupIn(id, region, name, props) {
247
+ logGroupIn(id, region, name) {
194
248
  return new log_group_1.WebFunctionLogGroup(this, id, {
195
249
  region,
196
250
  logGroupName: name,
197
- retention: props.logRetention ?? logs.RetentionDays.ONE_MONTH,
198
- removalPolicy: props.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN,
251
+ retention: this.logOptions.logRetention ?? logs.RetentionDays.ONE_MONTH,
252
+ removalPolicy: this.logOptions.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN,
199
253
  });
200
254
  }
201
255
  }
202
256
  exports.WebFunction = WebFunction;
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdIO0FBQ3hILHlEQUEyQztBQUMzQywrREFBaUQ7QUFDakQsMkRBQTZDO0FBRzdDLHlDQUFpRDtBQUNqRCxtREFBMEQ7QUFDMUQscURBQXFGO0FBQ3JGLG1FQUErRjtBQUMvRiwrREFBMEQ7QUFxSTFEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFROztJQUN2QixlQUFlLENBQVM7SUFDeEIsY0FBYyxDQUFTO0lBRXZDLHNDQUFzQztJQUN0QixVQUFVLENBQVM7SUFFbkMsK0JBQStCO0lBQ2YsUUFBUSxDQUFzQjtJQUU5QyxnRUFBZ0U7SUFDaEQsTUFBTSxDQUFvQjtJQUUxQywwQkFBMEI7SUFDVixJQUFJLENBQVk7SUFFaEMsa0VBQWtFO0lBQ2xELGNBQWMsQ0FBaUI7SUFFL0M7OztPQUdHO0lBQ2EsUUFBUSxDQUFpQjtJQUV4QixXQUFXLEdBQThCLEVBQUUsQ0FBQztJQUU3RCxtRkFBbUY7SUFDbkYsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksZ0RBQWdELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6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QUFFLFlBQVksRUFBRSxLQUFLLENBQUM7WUFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxRQUFRLEVBQUUsS0FBSyxDQUFDO1NBQ25FLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMsWUFBb0IsRUFBRSxLQUF1QjtRQUN6RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFZLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFFTyxVQUFVLENBQUMsRUFBVSxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBdUI7UUFDbEYsT0FBTyxJQUFJLCtCQUFtQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7WUFDdkMsTUFBTTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUM3RCxhQUFhLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixJQUFJLDJCQUFhLENBQUMsTUFBTTtTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXRLSCxrQ0F1S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgdHlwZSBJUmVzb3VyY2UsIExhenksIE5hbWVzLCBSZW1vdmFsUG9saWN5LCBSZXNvdXJjZSwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkNvZGUgfSBmcm9tICcuL3ByaXZhdGUvY29kZSc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkxvZ0dyb3VwIH0gZnJvbSAnLi9wcml2YXRlL2xvZy1ncm91cCc7XG5pbXBvcnQgeyBDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFLCBhc3NlcnRSZXNvdXJjZU5hbWUgfSBmcm9tICcuL3ByaXZhdGUvdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkVuZHBvaW50LCB0eXBlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25HcmFudHMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1ncmFudHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludDogd2hlcmUgaXQgc2VydmVzIGZyb20sIGFuZCBpdHMgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIEhPTUVfUkVHSU9OIGVuZHBvaW50XG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludD86IFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IHN0YXJ0cyB5b3VyIHNlcnZlciwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdpbmRleC5qcydcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuIFJlbmFtaW5nIGEgZnVuY3Rpb24gcmVwbGFjZXMgaXQsIGFuZCBpdHMgZW5kcG9pbnQgZ2V0cyBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgbmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uc3RydWN0IHBhdGggKG1vdmluZyB0aGUgY29uc3RydWN0IGNoYW5nZXMgaXQpXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgY29kZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogQW4gYGlhbS5JUm9sZWAgKG5vdCBgSVJvbGVSZWZgKSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBhZGRzIHN0YXRlbWVudHMgdG8gaXQgYW5kIGdyYW50cyB0aHJvdWdoIGl0LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSB0cnVzdGluZyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdpdGggYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWBcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogSG93IGxvbmcgYSBzaW5nbGUgcmVxdWVzdCBtYXkgcnVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBvbmUgZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZXMgYXQgdGhlIHNhbWUgdGltZSAoMS0xMjgpLlxuICAgKiBSZXF1ZXN0cyBzaGFyZSBtb2R1bGUtbGV2ZWwgc3RhdGUsIHNvIGhhbmRsZXJzIG11c3QgYmUgY29uY3VycmVuY3ktc2FmZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNjRcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldGVudGlvbiBmb3IgZXZlcnkgbG9nIGdyb3VwIG9mIHRoZSBmdW5jdGlvbiwgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVucyB0byB0aGUgbG9nIGdyb3VwcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyByZW1vdmVkOiBSRVRBSU4gb3IgREVTVFJPWS5cbiAgICogV2l0aCBERVNUUk9ZLCBkZWxldGlvbiB3YWl0cyBhYm91dCBhIG1pbnV0ZSBmb3IgZW52aXJvbm1lbnRzIHRvIGZsdXNoIHRoZWlyIGxhc3QgbGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgYXBwbGljYXRpb24gbG9ncyB0byBrZWVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkxvZ0xldmVsVjI/OiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgcGxhdGZvcm0gbG9ncyB0byBrZWVwIChERUJVRywgSU5GTyBvciBXQVJOKS5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk9cbiAgICovXG4gIHJlYWRvbmx5IHN5c3RlbUxvZ0xldmVsVjI/OiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWw7XG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXZWJGdW5jdGlvbiBleHRlbmRzIElSZXNvdXJjZSwgbGFtYmRhLklXZWJGdW5jdGlvblJlZiB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgTm9kZS5qcyBIVFRQIHNlcnZlciBydW5uaW5nIGFzIGFuIEFXUyBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBzZXJ2ZWQgZnJvbSBvbmUgb3IgbW9yZSByZWdpb25zLlxuICpcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uLCBpdHMgY3VycmVudCByZXZpc2lvbiAoY29kZSBhbmQgY29uZmlndXJhdGlvbjsgYW55IGNoYW5nZSByZXBsYWNlcyBpdCksXG4gKiBhbiBIVFRQUyBlbmRwb2ludCwgYW4gZXhlY3V0aW9uIHJvbGUsIGFuZCBvd25zIHRoZSBmdW5jdGlvbidzIGxvZyBncm91cHMgaW4gZXZlcnkgcmVnaW9uLlxuICpcbiAqIEltcG9ydGluZyBleGlzdGluZyBmdW5jdGlvbnMgKGBmcm9tWHh4YCBtZXRob2RzKSBpcyBwbGFubmVkIGFmdGVyIDAuMS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpMYW1iZGE6OldlYkZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVdlYkZ1bmN0aW9uLCBpYW0uSUdyYW50YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBJRCBvZiB0aGUgY3VycmVudCByZXZpc2lvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKiogR3JhbnRzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBgZ3JhbnRzLmludm9rZShwcmluY2lwYWwpYCkuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFdlYkZ1bmN0aW9uR3JhbnRzO1xuXG4gIC8qKiBUaGUgZXhlY3V0aW9uIHJvbGUuICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG8gKHRoZSBleGVjdXRpb24gcm9sZSkuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBob21lLXJlZ2lvbiBsb2cgZ3JvdXAgdGhhdCByZWNlaXZlcyB0aGUgbG9ncyBvZiBldmVyeSByZWdpb24gdGhlIGZ1bmN0aW9uIHNlcnZlcyBmcm9tLlxuICAgKiBTdWJzY3JpYmUgdG8gdGhpcyBvbmUgb25seTogZWFjaCByZWdpb24ncyBgLmxvY2FsYCBncm91cCBob2xkcyBhIGNvcHkgb2YgdGhlIHNhbWUgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoaXMgZnVuY3Rpb24sIGZvciBBUElzIHRoYXQgYWNjZXB0IGBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmYC4gKi9cbiAgcHVibGljIGdldCB3ZWJGdW5jdGlvblJlZigpOiBsYW1iZGEuV2ViRnVuY3Rpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uQXJuIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHN5c3RlbUxvZ0xldmVscyA9IFtsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuREVCVUcsIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLCBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuV0FSTl07XG4gICAgaWYgKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIgIT09IHVuZGVmaW5lZCAmJiAhc3lzdGVtTG9nTGV2ZWxzLmluY2x1ZGVzKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBzeXN0ZW1Mb2dMZXZlbFYyIG11c3QgYmUgREVCVUcsIElORk8gb3IgV0FSTiBmb3IgTGFtYmRhIFdlYiBGdW5jdGlvbnNgKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYkZ1bmN0aW9uTmFtZSA9IHByb3BzLndlYkZ1bmN0aW9uTmFtZSA/PyBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDY0LCBzZXBhcmF0b3I6ICctJyB9KTtcbiAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ3dlYkZ1bmN0aW9uTmFtZScsIHRoaXMud2ViRnVuY3Rpb25OYW1lKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLmVudmlyb25tZW50ID8/IHt9KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVudHJ5cG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudC5BV1NfTEFNQkRBX05PREVKU19FTlRSWVBPSU5UID0gcHJvcHMuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlID8/IG5ldyBpYW0uUm9sZSh0aGlzLCAnU2VydmljZVJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpXSxcbiAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gTG9nIGdyb3VwcyBmaXJzdDogdGhlIHNlcnZpY2Ugd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSB0aGVtIHdpdGhvdXQgcmV0ZW50aW9uLlxuICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGAvYXdzL2xhbWJkYS93ZWIvJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX1gO1xuICAgIGNvbnN0IGxvZ0dyb3VwcyA9IHRoaXMuY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZSwgcHJvcHMpO1xuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLkxvZ0dyb3VwLmZyb21Mb2dHcm91cE5hbWUodGhpcywgJ0xvZ0dyb3VwJywgbG9nR3JvdXBOYW1lKTtcblxuICAgIGNvbnN0IGNvZGUgPSBuZXcgV2ViRnVuY3Rpb25Db2RlKHRoaXMsICdDb2RlJywgcHJvcHMuY29kZSkubG9jYXRpb247XG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb24odGhpcywgJ1Jlc291cmNlJywgeyBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lIH0pO1xuICAgIC8vIFRoZSBmdW5jdGlvbiBpcyBkZWxldGVkIGJlZm9yZSBpdHMgbG9nIGdyb3Vwcywgd2hpY2ggdGhlbiB3YWl0IGZvciBsYXRlIGZsdXNoZXMuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2dHcm91cHMpIGZuLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgVmFsaWRhdGlvbnMub2YoZm4pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBmbi5hdHRyRnVuY3Rpb25Bcm47XG5cbiAgICBjb25zdCByZXZpc2lvbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25SZXZpc2lvbih0aGlzLCAnUmV2aXNpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXZpc2lvbklkID0gcmV2aXNpb24uYXR0clJldmlzaW9uSWQ7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gV2ViRnVuY3Rpb25FbmRwb2ludC5fY3JlYXRlKHRoaXMsICdFbmRwb2ludCcsIHtcbiAgICAgIC4uLnByb3BzLmVuZHBvaW50LFxuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICByZXZpc2lvbklkOiByZXZpc2lvbi5hdHRyUmV2aXNpb25JZCxcbiAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZ3JhbnRzID0gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50KHRoaXMuZW5kcG9pbnQpO1xuXG4gICAgLy8gUmVtb3RlIHJlZ2lvbnMnIC5sb2NhbCBncm91cHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBvbmNlIHRoZSByZWdpb25zIGFyZSBrbm93bi5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuY3JlYXRlUmVtb3RlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZSwgcHJvcHMpKSBmbi5ub2RlLmFkZERlcGVuZGVuY3koZ3JvdXAucmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFdlYkZ1bmN0aW9uIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0FXU18nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogZW52aXJvbm1lbnQgdmFyaWFibGUgJHtrZXl9IGlzIHJlc2VydmVkIChuYW1lcyBzdGFydGluZyB3aXRoIEFXU18gYXJlIHNldCBieSB0aGUgcnVudGltZSkke2tleSA9PT0gJ0FXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQnID8gJzsgdXNlIHRoZSBlbnRyeXBvaW50IHByb3BlcnR5JyA6ICcnfWApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBleGVjdXRpb24gcm9sZSdzIHBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBlbmRwb2ludC4gU2hvcnRjdXQgZm9yIGBncmFudHMuaW52b2tlKGdyYW50ZWUpYCwgYXMgb24gYGxhbWJkYS5GdW5jdGlvbmAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICBjb25zdCBob21lID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvZ3MnLCBob21lLCBsb2dHcm91cE5hbWUsIHByb3BzKSxcbiAgICAgIHRoaXMubG9nR3JvdXBJbignTG9jYWxMb2dzJywgaG9tZSwgYCR7bG9nR3JvdXBOYW1lfS5sb2NhbGAsIHByb3BzKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZW1vdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICByZXR1cm4gdGhpcy5lbmRwb2ludC5yZWdpb25zLnNsaWNlKDEpLm1hcCgocmVnaW9uKSA9PiB0aGlzLmxvZ0dyb3VwSW4oYExvY2FsTG9ncy0ke3JlZ2lvbn1gLCByZWdpb24sIGAke2xvZ0dyb3VwTmFtZX0ubG9jYWxgLCBwcm9wcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dHcm91cEluKGlkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKTogV2ViRnVuY3Rpb25Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkxvZ0dyb3VwKHRoaXMsIGlkLCB7XG4gICAgICByZWdpb24sXG4gICAgICBsb2dHcm91cE5hbWU6IG5hbWUsXG4gICAgICByZXRlbnRpb246IHByb3BzLmxvZ1JldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMubG9nUmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICB9KTtcbiAgfVxufVxuIl19
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdIO0FBQ3hILHlEQUEyQztBQUMzQywrREFBaUQ7QUFDakQsMkRBQTZDO0FBRzdDLHlDQUFpRDtBQUNqRCxtREFBMEQ7QUFDMUQsaUVBQTZEO0FBQzdELHFEQUFxRjtBQUNyRixtRUFBbUk7QUFFbkksbUVBQXlGO0FBRXpGLDhEQUE4RDtBQUM5RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUF5SnpCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLFdBQVksU0FBUSxzQkFBUTs7SUFDdkIsZUFBZSxDQUFTO0lBQ3hCLGNBQWMsQ0FBUztJQUV2Qyw0RUFBNEU7SUFDNUQsVUFBVSxDQUFTO0lBRW5DLGtFQUFrRTtJQUNsRCxlQUFlLENBQXVCO0lBRXRELHlEQUF5RDtJQUN6QyxRQUFRLENBQXNCO0lBRTlDLGlIQUFpSDtJQUNqRyxNQUFNLENBQW9CO0lBRTFDLDBCQUEwQjtJQUNWLElBQUksQ0FBWTtJQUVoQyxrRUFBa0U7SUFDbEQsY0FBYyxDQUFpQjtJQUUvQzs7O09BR0c7SUFDYSxRQUFRLENBQWlCO0lBRXhCLFdBQVcsR0FBOEIsRUFBRSxDQUFDO0lBQzVDLFNBQVMsR0FBMEIsRUFBRSxDQUFDO0lBQ3RDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUN6RCxZQUFZLENBQVM7SUFDckIsVUFBVSxDQUE4RDtJQUN4RSxRQUFRLENBQXdCO0lBQ2hDLGVBQWUsQ0FBa0I7SUFFbEQsbUZBQW1GO0lBQ25GLElBQVcsY0FBYztRQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMv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RUFBRTtZQUN2QyxNQUFNO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUN2RSxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSwyQkFBYSxDQUFDLE1BQU07U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF6Tkgsa0NBME5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIHR5cGUgSVJlc291cmNlLCBMYXp5LCBOYW1lcywgUmVtb3ZhbFBvbGljeSwgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVmFsaWRhdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Db2RlIH0gZnJvbSAnLi9wcml2YXRlL2NvZGUnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Mb2dHcm91cCB9IGZyb20gJy4vcHJpdmF0ZS9sb2ctZ3JvdXAnO1xuaW1wb3J0IHsgUmV2aXNpb25DbGVhbnVwIH0gZnJvbSAnLi9wcml2YXRlL3JldmlzaW9uLWNsZWFudXAnO1xuaW1wb3J0IHsgQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSwgYXNzZXJ0UmVzb3VyY2VOYW1lIH0gZnJvbSAnLi9wcml2YXRlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25FbmRwb2ludCwgdHlwZSBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgdHlwZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uUmV2aXNpb24sIHR5cGUgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKiBFbmRwb2ludHMgcGVyIGZ1bmN0aW9uIChzZXJ2aWNlIHF1b3RhLCBub3QgYWRqdXN0YWJsZSkuICovXG5jb25zdCBNQVhfRU5EUE9JTlRTID0gMTA7XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgYFdlYkZ1bmN0aW9uYCBhbmQgYE5vZGVqc1dlYkZ1bmN0aW9uYDogZXZlcnl0aGluZyBleGNlcHQgaG93IHRoZSBjb2RlIGlzIHN1cHBsaWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGUgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kcG9pbnQgKGBmbi5lbmRwb2ludGApOiB3aGVyZSBpdCBzZXJ2ZXMgZnJvbSwgaXRzIG5hbWUgYW5kIGxpbWl0cy5cbiAgICogSXQgc2VydmVzIHRoZSBjdXJyZW50IHJldmlzaW9uOyByb3V0ZSBpdCBlbHNld2hlcmUgd2l0aCBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKClgLlxuICAgKiBBZGQgbW9yZSBlbmRwb2ludHMgd2l0aCBgYWRkRW5kcG9pbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmluZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucztcblxuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhlIG5ld2VzdCByZXZpc2lvbnMgdG8ga2VlcCAoMS01MCkuIEVhY2ggZGVwbG95bWVudCB0aGF0IGNoYW5nZXMgdGhlIGNvZGUgb3JcbiAgICogY29uZmlndXJhdGlvbiBjcmVhdGVzIGEgcmV2aXNpb247IG9sZGVyIG9uZXMgc3RheSBhdmFpbGFibGUgdG8gcm9sbCBiYWNrIHRvIG9yIHJvdXRlIHRyYWZmaWMgdG8sXG4gICAqIGFuZCB0aGUgb2xkZXN0IGJleW9uZCB0aGlzIGNvdW50IGFyZSBkZWxldGVkIGFmdGVyIGVhY2ggZGVwbG95bWVudC5cbiAgICpcbiAgICogUmV2aXNpb25zIHRoYXQgYW4gZW5kcG9pbnQgcm91dGVzIHRvIGFyZSBuZXZlciBkZWxldGVkLCBhbmQgbmVpdGhlciBhcmUgdGhvc2UgdGhlIHByZXZpb3VzXG4gICAqIGRlcGxveW1lbnQgdXNlZCAoYSByb2xsYmFjayByZXR1cm5zIHRvIHRoZW0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25SZXRlbnRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuIFJlbmFtaW5nIGEgZnVuY3Rpb24gcmVwbGFjZXMgaXQsIGFuZCBpdHMgZW5kcG9pbnQgZ2V0cyBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgbmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uc3RydWN0IHBhdGggKG1vdmluZyB0aGUgY29uc3RydWN0IGNoYW5nZXMgaXQpXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgY29kZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogQW4gYGlhbS5JUm9sZWAgKG5vdCBgSVJvbGVSZWZgKSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBhZGRzIHN0YXRlbWVudHMgdG8gaXQgYW5kIGdyYW50cyB0aHJvdWdoIGl0LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSB0cnVzdGluZyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdpdGggYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWBcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogSG93IGxvbmcgYSBzaW5nbGUgcmVxdWVzdCBtYXkgcnVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBvbmUgZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZXMgYXQgdGhlIHNhbWUgdGltZSAoMS0xMjgpLlxuICAgKiBSZXF1ZXN0cyBzaGFyZSBtb2R1bGUtbGV2ZWwgc3RhdGUsIHNvIGhhbmRsZXJzIG11c3QgYmUgY29uY3VycmVuY3ktc2FmZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNjRcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldGVudGlvbiBmb3IgZXZlcnkgbG9nIGdyb3VwIG9mIHRoZSBmdW5jdGlvbiwgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVucyB0byB0aGUgbG9nIGdyb3VwcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyByZW1vdmVkOiBSRVRBSU4gb3IgREVTVFJPWS5cbiAgICogV2l0aCBERVNUUk9ZLCBkZWxldGlvbiB3YWl0cyBhYm91dCBhIG1pbnV0ZSBmb3IgZW52aXJvbm1lbnRzIHRvIGZsdXNoIHRoZWlyIGxhc3QgbGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgYXBwbGljYXRpb24gbG9ncyB0byBrZWVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkxvZ0xldmVsVjI/OiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgcGxhdGZvcm0gbG9ncyB0byBrZWVwIChERUJVRywgSU5GTyBvciBXQVJOKS5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk9cbiAgICovXG4gIHJlYWRvbmx5IHN5c3RlbUxvZ0xldmVsVjI/OiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWw7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBgV2ViRnVuY3Rpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE5vZGUuanMgcnVudGltZSwgZS5nLiBgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzI0X1hgLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZTogbGFtYmRhLlJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2RlOiBhIHppcCBpbiBTMyAoYENvZGUuZnJvbUFzc2V0YCwgYENvZGUuZnJvbUJ1Y2tldGAsIGBDb2RlLmZyb21DdXN0b21Db21tYW5kYCwgYENvZGUuZnJvbURvY2tlckJ1aWxkYCkuXG4gICAqIElubGluZSBjb2RlIGFuZCBjb250YWluZXIgaW1hZ2VzIGFyZW4ndCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIFRoZSBjb2RlIGlzIGNvcGllZCBpbnRvIHRoZSBzdGFjaydzIGNvZGUgYnVja2V0LCB3aGljaCBMYW1iZGEgV2ViIEZ1bmN0aW9ucyBjYW4gcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IGxhbWJkYS5Db2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IHN0YXJ0cyB5b3VyIHNlcnZlciwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdpbmRleC5qcydcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBBIExhbWJkYSBXZWIgRnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkZ1bmN0aW9uIGV4dGVuZHMgSVJlc291cmNlLCBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBBUk4uXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBOb2RlLmpzIEhUVFAgc2VydmVyIHJ1bm5pbmcgYXMgYW4gQVdTIExhbWJkYSBXZWIgRnVuY3Rpb24sIHNlcnZlZCBmcm9tIG9uZSBvciBtb3JlIHJlZ2lvbnMuXG4gKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24sIGl0cyBjdXJyZW50IHJldmlzaW9uIChjb2RlIGFuZCBjb25maWd1cmF0aW9uOyBhbnkgY2hhbmdlIGNyZWF0ZXMgYSBuZXcgb25lLFxuICogYW5kIHRoZSBuZXdlc3QgYHJldmlzaW9uUmV0ZW50aW9uYCBhcmUga2VwdCksIGEgZGVmYXVsdCBIVFRQUyBlbmRwb2ludCwgYW4gZXhlY3V0aW9uIHJvbGUsIGFuZCBvd25zXG4gKiB0aGUgZnVuY3Rpb24ncyBsb2cgZ3JvdXBzIGluIGV2ZXJ5IHJlZ2lvbiBpdHMgZW5kcG9pbnRzIHNlcnZlIGZyb20uXG4gKlxuICogSW1wb3J0aW5nIGV4aXN0aW5nIGZ1bmN0aW9ucyAoYGZyb21YeHhgIG1ldGhvZHMpIGlzIHBsYW5uZWQgYWZ0ZXIgMC4xLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkxhbWJkYTo6V2ViRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb24sIGlhbS5JR3JhbnRhYmxlIHtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKiogVGhlIElEIG9mIHRoZSBjdXJyZW50IHJldmlzaW9uLiBTYW1lIGFzIGBjdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZGAuICovXG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSByZXZpc2lvbiBidWlsdCBmcm9tIHRoZSBjdXJyZW50IGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBUaGUgZGVmYXVsdCBlbmRwb2ludC4gQWRkIG1vcmUgd2l0aCBgYWRkRW5kcG9pbnRgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQ7XG5cbiAgLyoqIEdyYW50cyBvbiB0aGUgZGVmYXVsdCBlbmRwb2ludCAoZS5nLiBgZ3JhbnRzLmludm9rZShwcmluY2lwYWwpYCkuIE90aGVyIGVuZHBvaW50cyBoYXZlIHRoZWlyIG93biBgZ3JhbnRzYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50czogV2ViRnVuY3Rpb25HcmFudHM7XG5cbiAgLyoqIFRoZSBleGVjdXRpb24gcm9sZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvKiogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0byAodGhlIGV4ZWN1dGlvbiByb2xlKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGhvbWUtcmVnaW9uIGxvZyBncm91cCB0aGF0IHJlY2VpdmVzIHRoZSBsb2dzIG9mIGV2ZXJ5IHJlZ2lvbiB0aGUgZnVuY3Rpb24gc2VydmVzIGZyb20uXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIG9uZSBvbmx5OiBlYWNoIHJlZ2lvbidzIGAubG9jYWxgIGdyb3VwIGhvbGRzIGEgY29weSBvZiB0aGUgc2FtZSBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUxvZ0dyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJGdW5jdGlvbkxvZ0dyb3VwPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ09wdGlvbnM6IFBpY2s8V2ViRnVuY3Rpb25Qcm9wcywgJ2xvZ1JldGVudGlvbicgfCAnbG9nUmVtb3ZhbFBvbGljeSc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25DbGVhbnVwOiBSZXZpc2lvbkNsZWFudXA7XG5cbiAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoaXMgZnVuY3Rpb24sIGZvciBBUElzIHRoYXQgYWNjZXB0IGBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmYC4gKi9cbiAgcHVibGljIGdldCB3ZWJGdW5jdGlvblJlZigpOiBsYW1iZGEuV2ViRnVuY3Rpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uQXJuIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmlzaW9uUmV0ZW50aW9uID0gcHJvcHMucmV2aXNpb25SZXRlbnRpb24gPz8gMjA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb25SZXRlbnRpb24pICYmICghTnVtYmVyLmlzSW50ZWdlcihyZXZpc2lvblJldGVudGlvbikgfHwgcmV2aXNpb25SZXRlbnRpb24gPCAxIHx8IHJldmlzaW9uUmV0ZW50aW9uID4gNTApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZXZpc2lvblJldGVudGlvbiBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDUwLCBnb3QgJHtyZXZpc2lvblJldGVudGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3lzdGVtTG9nTGV2ZWxzID0gW2xhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5ERUJVRywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk8sIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5XQVJOXTtcbiAgICBpZiAocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMiAhPT0gdW5kZWZpbmVkICYmICFzeXN0ZW1Mb2dMZXZlbHMuaW5jbHVkZXMocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHN5c3RlbUxvZ0xldmVsVjIgbXVzdCBiZSBERUJVRywgSU5GTyBvciBXQVJOIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9uc2ApO1xuICAgIH1cblxuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gcHJvcHMud2ViRnVuY3Rpb25OYW1lID8/IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQsIHNlcGFyYXRvcjogJy0nIH0pO1xuICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnd2ViRnVuY3Rpb25OYW1lJywgdGhpcy53ZWJGdW5jdGlvbk5hbWUpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuZW52aXJvbm1lbnQgPz8ge30pKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVudmlyb25tZW50LkFXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUgPz8gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyldLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG5cbiAgICAvLyBMb2cgZ3JvdXBzIGZpcnN0OiB0aGUgc2VydmljZSB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIHRoZW0gd2l0aG91dCByZXRlbnRpb24uXG4gICAgY29uc3QgbG9nR3JvdXBOYW1lID0gYC9hd3MvbGFtYmRhL3dlYi8ke3RoaXMud2ViRnVuY3Rpb25OYW1lfWA7XG4gICAgdGhpcy5sb2dHcm91cE5hbWUgPSBsb2dHcm91cE5hbWU7XG4gICAgdGhpcy5sb2dPcHRpb25zID0geyBsb2dSZXRlbnRpb246IHByb3BzLmxvZ1JldGVudGlvbiwgbG9nUmVtb3ZhbFBvbGljeTogcHJvcHMubG9nUmVtb3ZhbFBvbGljeSB9O1xuICAgIGNvbnN0IGxvZ0dyb3VwcyA9IHRoaXMuY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5sb2dHcm91cCA9IGxvZ3MuTG9nR3JvdXAuZnJvbUxvZ0dyb3VwTmFtZSh0aGlzLCAnTG9nR3JvdXAnLCBsb2dHcm91cE5hbWUpO1xuXG4gICAgY29uc3QgY29kZSA9IG5ldyBXZWJGdW5jdGlvbkNvZGUodGhpcywgJ0NvZGUnLCBwcm9wcy5jb2RlKS5sb2NhdGlvbjtcblxuICAgIGNvbnN0IGZuID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbih0aGlzLCAnUmVzb3VyY2UnLCB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSk7XG4gICAgLy8gVGhlIGZ1bmN0aW9uIGlzIGRlbGV0ZWQgYmVmb3JlIGl0cyBsb2cgZ3JvdXBzLCB3aGljaCB0aGVuIHdhaXQgZm9yIGxhdGUgZmx1c2hlcy5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGxvZ0dyb3VwcykgZm4ubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihmbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IGZuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBmbi5hdHRyRnVuY3Rpb25Bcm47XG5cbiAgICBjb25zdCByZXZpc2lvbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25SZXZpc2lvbih0aGlzLCAnUmV2aXNpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgLy8gUmVwbGFjZWQgcmV2aXNpb25zIHN0YXkgYXMgcm9sbGJhY2sgdGFyZ2V0czsgUmV2aXNpb25DbGVhbnVwIGRlbGV0ZXMgdGhlIG9sZGVzdC4gRGVsZXRpbmcgdGhlIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlbSBhbGwuXG4gICAgcmV2aXNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB0aGlzLnJldmlzaW9uSWQgPSByZXZpc2lvbi5hdHRyUmV2aXNpb25JZDtcbiAgICB0aGlzLmN1cnJlbnRSZXZpc2lvbiA9IFdlYkZ1bmN0aW9uUmV2aXNpb24uX2N1cnJlbnQodGhpcywgJ0N1cnJlbnRSZXZpc2lvbicsIHRoaXMsIHJldmlzaW9uLmF0dHJSZXZpc2lvbklkLCByZXZpc2lvbi5hdHRyUmV2aXNpb25Bcm4pO1xuXG4gICAgdGhpcy5yZXZpc2lvbkNsZWFudXAgPSBuZXcgUmV2aXNpb25DbGVhbnVwKHRoaXMsICdSZXZpc2lvbkNsZWFudXAnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25Bcm46IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGtlZXA6IHJldmlzaW9uUmV0ZW50aW9uLFxuICAgICAgcmV2aXNpb25JZHM6ICgpID0+IFt0aGlzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLCAuLi50aGlzLmVuZHBvaW50cy5mbGF0TWFwKChlKSA9PiBlLl9yZXZpc2lvbklkcygpKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gdGhpcy5jcmVhdGVFbmRwb2ludCgnRW5kcG9pbnQnLCB7IC4uLnByb3BzLmVuZHBvaW50LCBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUgfSwgJ2RlZmF1bHQnKTtcbiAgICB0aGlzLmdyYW50cyA9IHRoaXMuZW5kcG9pbnQuZ3JhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW5kcG9pbnQgKHVwIHRvIDEwIHBlciBmdW5jdGlvbiksIGUuZy4gYSBwdWJsaWMgb25lIG5leHQgdG8gYW4gSUFNLW9ubHkgb25lLCBvciBvbmUgcGlubmVkIHRvIGFuXG4gICAqIGVhcmxpZXIgcmV2aXNpb24uIEVhY2ggZW5kcG9pbnQgaGFzIGl0cyBvd24gVVJMLCBhdXRoZW50aWNhdGlvbiwgcmVnaW9ucyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIGVuZHBvaW50J3MgY29uc3RydWN0IElELCBhbHNvIHVzZWQgaW4gaXRzIGdlbmVyYXRlZCBuYW1lIChgPGlkPi08aGFzaD5gKVxuICAgKi9cbiAgcHVibGljIGFkZEVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgY29uc3QgcHJlZml4ID0gaWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rLywgJycpLnNsaWNlKDAsIDU1KS5yZXBsYWNlKC8tKyQvLCAnJykgfHwgJ2VuZHBvaW50JztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFbmRwb2ludChpZCwgb3B0aW9ucywgcHJlZml4LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogV2ViRnVuY3Rpb24ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQVdTXycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBlbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVzZXJ2ZWQgKG5hbWVzIHN0YXJ0aW5nIHdpdGggQVdTXyBhcmUgc2V0IGJ5IHRoZSBydW50aW1lKSR7a2V5ID09PSAnQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCcgPyAnOyB1c2UgdGhlIGVudHJ5cG9pbnQgcHJvcGVydHknIDogJyd9YCk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGV4ZWN1dGlvbiByb2xlJ3MgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLCBhcyBvbiBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5pbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zLCBuYW1lUHJlZml4OiBzdHJpbmcsIG5hbWVTZWVkPzogc3RyaW5nKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRzLmxlbmd0aCA+PSBNQVhfRU5EUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBhIFdlYiBGdW5jdGlvbiBjYW4gaGF2ZSBhdCBtb3N0ICR7TUFYX0VORFBPSU5UU30gZW5kcG9pbnRzYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gV2ViRnVuY3Rpb25FbmRwb2ludC5fY3JlYXRlKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd2ViRnVuY3Rpb246IHRoaXMsXG4gICAgICBjdXJyZW50UmV2aXNpb246IHRoaXMuY3VycmVudFJldmlzaW9uLFxuICAgICAgbmFtZVByZWZpeCxcbiAgICAgIG5hbWVTZWVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYXNoID0gdGhpcy5lbmRwb2ludHMuZmluZCgoZSkgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChlLmVuZHBvaW50TmFtZSkgJiYgZS5lbmRwb2ludE5hbWUgPT09IGVuZHBvaW50LmVuZHBvaW50TmFtZSk7XG4gICAgaWYgKGNsYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogZW5kcG9pbnROYW1lICcke2VuZHBvaW50LmVuZHBvaW50TmFtZX0nIGlzIGFscmVhZHkgdXNlZCBieSAke2NsYXNoLm5vZGUucGF0aH1gKTtcbiAgICB9XG4gICAgdGhpcy5lbmRwb2ludHMucHVzaChlbmRwb2ludCk7XG4gICAgLy8gUmV2aXNpb25zIGFuIGVuZHBvaW50IHN0b3BzIHJvdXRpbmcgdG8gb25seSBiZWNvbWUgZGVsZXRhYmxlIG9uY2UgaXQncyB1cGRhdGVkLlxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShlbmRwb2ludCk7XG4gICAgLy8gRWFjaCBzZXJ2aW5nIHJlZ2lvbidzIC5sb2NhbCBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSB0cmFmZmljLCBhbmQgb3V0bGl2ZSB0aGUgZnVuY3Rpb24uXG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgZW5kcG9pbnQucmVnaW9ucy5zbGljZSgxKSkge1xuICAgICAgaWYgKHRoaXMucmVtb3RlTG9nR3JvdXBzLmhhcyhyZWdpb24pKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sb2dHcm91cEluKGBMb2NhbExvZ3MtJHtyZWdpb259YCwgcmVnaW9uLCBgJHt0aGlzLmxvZ0dyb3VwTmFtZX0ubG9jYWxgKTtcbiAgICAgIHRoaXMucmVtb3RlTG9nR3JvdXBzLnNldChyZWdpb24sIGdyb3VwKTtcbiAgICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwW10ge1xuICAgIGNvbnN0IGhvbWUgPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubG9nR3JvdXBJbignTG9ncycsIGhvbWUsIGxvZ0dyb3VwTmFtZSksXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvY2FsTG9ncycsIGhvbWUsIGAke2xvZ0dyb3VwTmFtZX0ubG9jYWxgKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dHcm91cEluKGlkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uTG9nR3JvdXAodGhpcywgaWQsIHtcbiAgICAgIHJlZ2lvbixcbiAgICAgIGxvZ0dyb3VwTmFtZTogbmFtZSxcbiAgICAgIHJldGVudGlvbjogdGhpcy5sb2dPcHRpb25zLmxvZ1JldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5sb2dPcHRpb25zLmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -46,6 +46,8 @@
46
46
  "@aws-cdk/integ-runner": "latest",
47
47
  "@aws-cdk/integ-tests-alpha": "latest",
48
48
  "@aws-crypto/sha256-js": "^5.2.0",
49
+ "@aws-sdk/client-cloudformation": "^3",
50
+ "@aws-sdk/client-cloudwatch": "^3",
49
51
  "@aws-sdk/client-cloudwatch-logs": "^3",
50
52
  "@aws-sdk/client-lambda-web": "^3.1151.0",
51
53
  "@aws-sdk/client-s3": "^3",
@@ -77,6 +79,7 @@
77
79
  "jsii-pacmak": "^1.141.0",
78
80
  "jsii-rosetta": "~6.0.0",
79
81
  "projen": "^0.104.5",
82
+ "supports-color": "^7",
80
83
  "ts-jest": "^29.4.15",
81
84
  "ts-node": "^10.9.2",
82
85
  "tsx": "^4.23.15",
@@ -108,7 +111,7 @@
108
111
  "main": "lib/index.js",
109
112
  "license": "Apache-2.0",
110
113
  "stability": "experimental",
111
- "version": "0.1.0",
114
+ "version": "0.1.2",
112
115
  "jest": {
113
116
  "coverageProvider": "v8",
114
117
  "testMatch": [
@@ -164,7 +167,9 @@
164
167
  "awslint": {
165
168
  "exclude": [
166
169
  "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint",
167
- "from-method:@ashishpandeyone/cdk-lambda-web-function.WebFunction"
170
+ "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision",
171
+ "from-method:@ashishpandeyone/cdk-lambda-web-function.WebFunction",
172
+ "resource-interface:@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction"
168
173
  ]
169
174
  },
170
175
  "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."