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

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.
@@ -1,4 +1,5 @@
1
1
  import { Duration, type IResource, RemovalPolicy, Resource } from 'aws-cdk-lib';
2
+ import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
2
3
  import * as iam from 'aws-cdk-lib/aws-iam';
3
4
  import * as lambda from 'aws-cdk-lib/aws-lambda';
4
5
  import * as logs from 'aws-cdk-lib/aws-logs';
@@ -125,7 +126,7 @@ export interface WebFunctionProps extends WebFunctionOptions {
125
126
  readonly entrypoint?: string;
126
127
  }
127
128
  /**
128
- * A Lambda Web Function.
129
+ * A Lambda Web Function, created in this app (`WebFunction`) or imported (`WebFunction.fromWebFunctionArn`).
129
130
  */
130
131
  export interface IWebFunction extends IResource, lambda.IWebFunctionRef {
131
132
  /**
@@ -140,6 +141,95 @@ export interface IWebFunction extends IResource, lambda.IWebFunctionRef {
140
141
  * @attribute
141
142
  */
142
143
  readonly webFunctionArn: string;
144
+ /**
145
+ * Allows `grantee` to call the function's endpoint (`lambda:InvokeWebFunctionEndpoint`): the default endpoint
146
+ * of a `WebFunction`; for an imported function, the endpoint named in its attributes, or every endpoint.
147
+ *
148
+ * This adds to the grantee's IAM policy. For a function in another account, its resource policy must also allow the grantee.
149
+ * [disable-awslint:no-grants]
150
+ */
151
+ grantInvoke(grantee: iam.IGrantable): iam.Grant;
152
+ /**
153
+ * A metric of the function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`).
154
+ */
155
+ metric(metricName: string, props?: cloudwatch.MetricOptions): cloudwatch.Metric;
156
+ /** Time the execution environments were active (`EnvironmentActiveTime`). */
157
+ metricActiveTime(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
158
+ /** CPU time the execution environments used (`EnvironmentCPUTime`). */
159
+ metricCpuTime(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
160
+ /** Requests an execution environment handled at once (`EnvironmentConcurrentRequests`, maximum). */
161
+ metricConcurrentRequests(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
162
+ /** Peak memory an execution environment used (`EnvironmentMaxMemoryUsage`, maximum). */
163
+ metricMaxMemoryUsage(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
164
+ /** Bytes sent in responses (`ResponseBytes`). */
165
+ metricResponseBytes(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
166
+ }
167
+ /**
168
+ * Attributes of an existing Web Function. Give its ARN or its name.
169
+ */
170
+ export interface WebFunctionAttributes {
171
+ /**
172
+ * The function's ARN, e.g. `arn:aws:lambda:us-east-1:111122223333:web-function/orders`. It may be in another
173
+ * region or account; across accounts, `grantInvoke` also needs the function's resource policy to allow the caller.
174
+ *
175
+ * @default - built from `webFunctionName`, in this stack's account and region
176
+ */
177
+ readonly webFunctionArn?: string;
178
+ /**
179
+ * The function's name.
180
+ *
181
+ * @default - taken from `webFunctionArn`
182
+ */
183
+ readonly webFunctionName?: string;
184
+ /**
185
+ * The endpoint `grantInvoke` allows calling.
186
+ *
187
+ * @default - every endpoint of the function
188
+ */
189
+ readonly endpointName?: string;
190
+ }
191
+ /**
192
+ * What `WebFunction` and imported functions have in common.
193
+ */
194
+ export declare abstract class WebFunctionBase extends Resource implements IWebFunction {
195
+ abstract readonly webFunctionName: string;
196
+ abstract readonly webFunctionArn: string;
197
+ /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
198
+ get webFunctionRef(): lambda.WebFunctionReference;
199
+ /**
200
+ * Allows `grantee` to call the function's endpoint.
201
+ * [disable-awslint:no-grants]
202
+ */
203
+ abstract grantInvoke(grantee: iam.IGrantable): iam.Grant;
204
+ /**
205
+ * A metric of this function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`), across all endpoints.
206
+ * For request and error counts, use the endpoint's metrics (`fn.endpoint.metricRequests()`).
207
+ *
208
+ * Metrics are published in the region that served the request: pass `region` for another serving region.
209
+ * An alarm can only use metrics from its own stack's region.
210
+ *
211
+ * @default - sum over 1 minute, in the function's home region
212
+ */
213
+ metric(metricName: string, props?: cloudwatch.MetricOptions): cloudwatch.Metric;
214
+ /** Time the execution environments were active (`EnvironmentActiveTime`). */
215
+ metricActiveTime(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
216
+ /** CPU time the execution environments used (`EnvironmentCPUTime`). */
217
+ metricCpuTime(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
218
+ /**
219
+ * Requests an execution environment handled at once (`EnvironmentConcurrentRequests`), to compare with
220
+ * `maxConcurrencyPerEnvironment`.
221
+ *
222
+ * @default - maximum over 1 minute
223
+ */
224
+ metricConcurrentRequests(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
225
+ /**
226
+ * Peak memory an execution environment used (`EnvironmentMaxMemoryUsage`); each environment has 2 GB.
227
+ *
228
+ * @default - maximum over 1 minute
229
+ */
230
+ metricMaxMemoryUsage(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
231
+ /** Bytes sent in responses (`ResponseBytes`). */
232
+ metricResponseBytes(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
143
233
  }
144
234
  /**
145
235
  * A Node.js HTTP server running as an AWS Lambda Web Function, served from one or more regions.
@@ -148,11 +238,23 @@ export interface IWebFunction extends IResource, lambda.IWebFunctionRef {
148
238
  * and the newest `revisionRetention` are kept), a default HTTPS endpoint, an execution role, and owns
149
239
  * the function's log groups in every region its endpoints serve from.
150
240
  *
151
- * Importing existing functions (`fromXxx` methods) is planned after 0.1.
241
+ * Use `fromWebFunctionArn`, `fromWebFunctionName` or `fromWebFunctionAttributes` for a function defined elsewhere.
152
242
  *
153
243
  * @resource AWS::Lambda::WebFunction
154
244
  */
155
- export declare class WebFunction extends Resource implements IWebFunction, iam.IGrantable {
245
+ export declare class WebFunction extends WebFunctionBase implements iam.IGrantable {
246
+ /**
247
+ * Imports an existing Web Function by its ARN (in any region or account).
248
+ */
249
+ static fromWebFunctionArn(scope: Construct, id: string, webFunctionArn: string): IWebFunction;
250
+ /**
251
+ * Imports an existing Web Function in this stack's account and region by its name.
252
+ */
253
+ static fromWebFunctionName(scope: Construct, id: string, webFunctionName: string): IWebFunction;
254
+ /**
255
+ * Imports an existing Web Function: give its ARN or its name, and optionally the endpoint `grantInvoke` allows.
256
+ */
257
+ static fromWebFunctionAttributes(scope: Construct, id: string, attrs: WebFunctionAttributes): IWebFunction;
156
258
  readonly webFunctionName: string;
157
259
  readonly webFunctionArn: string;
158
260
  /** The ID of the current revision. Same as `currentRevision.revisionId`. */
@@ -179,8 +281,6 @@ export declare class WebFunction extends Resource implements IWebFunction, iam.I
179
281
  private readonly logOptions;
180
282
  private readonly resource;
181
283
  private readonly revisionCleanup;
182
- /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
183
- get webFunctionRef(): lambda.WebFunctionReference;
184
284
  constructor(scope: Construct, id: string, props: WebFunctionProps);
185
285
  /**
186
286
  * Adds an endpoint (up to 10 per function), e.g. a public one next to an IAM-only one, or one pinned to an
@@ -33,20 +33,85 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.WebFunction = void 0;
36
+ exports.WebFunction = exports.WebFunctionBase = void 0;
37
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
38
  const aws_cdk_lib_1 = require("aws-cdk-lib");
39
+ const cloudwatch = __importStar(require("aws-cdk-lib/aws-cloudwatch"));
39
40
  const iam = __importStar(require("aws-cdk-lib/aws-iam"));
40
41
  const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
41
42
  const logs = __importStar(require("aws-cdk-lib/aws-logs"));
42
43
  const code_1 = require("./private/code");
43
44
  const log_group_1 = require("./private/log-group");
45
+ const metrics_1 = require("./private/metrics");
44
46
  const revision_cleanup_1 = require("./private/revision-cleanup");
45
47
  const validation_1 = require("./private/validation");
46
48
  const web_function_endpoint_1 = require("./web-function-endpoint");
49
+ const web_function_grants_1 = require("./web-function-grants");
47
50
  const web_function_revision_1 = require("./web-function-revision");
48
51
  /** Endpoints per function (service quota, not adjustable). */
49
52
  const MAX_ENDPOINTS = 10;
53
+ /**
54
+ * What `WebFunction` and imported functions have in common.
55
+ */
56
+ class WebFunctionBase extends aws_cdk_lib_1.Resource {
57
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.4" };
58
+ /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
59
+ get webFunctionRef() {
60
+ return { functionArn: this.webFunctionArn };
61
+ }
62
+ /**
63
+ * A metric of this function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`), across all endpoints.
64
+ * For request and error counts, use the endpoint's metrics (`fn.endpoint.metricRequests()`).
65
+ *
66
+ * Metrics are published in the region that served the request: pass `region` for another serving region.
67
+ * An alarm can only use metrics from its own stack's region.
68
+ *
69
+ * @default - sum over 1 minute, in the function's home region
70
+ */
71
+ metric(metricName, props) {
72
+ // An imported function in another region publishes its metrics there.
73
+ const region = !aws_cdk_lib_1.Token.isUnresolved(this.env.region) && this.env.region !== aws_cdk_lib_1.Stack.of(this).region ? this.env.region : undefined;
74
+ return new cloudwatch.Metric({
75
+ namespace: metrics_1.WEB_NAMESPACE,
76
+ metricName,
77
+ dimensionsMap: { FunctionName: this.webFunctionName },
78
+ statistic: cloudwatch.Stats.SUM,
79
+ period: metrics_1.DEFAULT_PERIOD,
80
+ region,
81
+ ...props,
82
+ });
83
+ }
84
+ /** Time the execution environments were active (`EnvironmentActiveTime`). */
85
+ metricActiveTime(props) {
86
+ return this.metric('EnvironmentActiveTime', props);
87
+ }
88
+ /** CPU time the execution environments used (`EnvironmentCPUTime`). */
89
+ metricCpuTime(props) {
90
+ return this.metric('EnvironmentCPUTime', props);
91
+ }
92
+ /**
93
+ * Requests an execution environment handled at once (`EnvironmentConcurrentRequests`), to compare with
94
+ * `maxConcurrencyPerEnvironment`.
95
+ *
96
+ * @default - maximum over 1 minute
97
+ */
98
+ metricConcurrentRequests(props) {
99
+ return this.metric('EnvironmentConcurrentRequests', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
100
+ }
101
+ /**
102
+ * Peak memory an execution environment used (`EnvironmentMaxMemoryUsage`); each environment has 2 GB.
103
+ *
104
+ * @default - maximum over 1 minute
105
+ */
106
+ metricMaxMemoryUsage(props) {
107
+ return this.metric('EnvironmentMaxMemoryUsage', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
108
+ }
109
+ /** Bytes sent in responses (`ResponseBytes`). */
110
+ metricResponseBytes(props) {
111
+ return this.metric('ResponseBytes', props);
112
+ }
113
+ }
114
+ exports.WebFunctionBase = WebFunctionBase;
50
115
  /**
51
116
  * A Node.js HTTP server running as an AWS Lambda Web Function, served from one or more regions.
52
117
  *
@@ -54,12 +119,30 @@ const MAX_ENDPOINTS = 10;
54
119
  * and the newest `revisionRetention` are kept), a default HTTPS endpoint, an execution role, and owns
55
120
  * the function's log groups in every region its endpoints serve from.
56
121
  *
57
- * Importing existing functions (`fromXxx` methods) is planned after 0.1.
122
+ * Use `fromWebFunctionArn`, `fromWebFunctionName` or `fromWebFunctionAttributes` for a function defined elsewhere.
58
123
  *
59
124
  * @resource AWS::Lambda::WebFunction
60
125
  */
61
- class WebFunction extends aws_cdk_lib_1.Resource {
62
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.2" };
126
+ class WebFunction extends WebFunctionBase {
127
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.4" };
128
+ /**
129
+ * Imports an existing Web Function by its ARN (in any region or account).
130
+ */
131
+ static fromWebFunctionArn(scope, id, webFunctionArn) {
132
+ return WebFunction.fromWebFunctionAttributes(scope, id, { webFunctionArn });
133
+ }
134
+ /**
135
+ * Imports an existing Web Function in this stack's account and region by its name.
136
+ */
137
+ static fromWebFunctionName(scope, id, webFunctionName) {
138
+ return WebFunction.fromWebFunctionAttributes(scope, id, { webFunctionName });
139
+ }
140
+ /**
141
+ * Imports an existing Web Function: give its ARN or its name, and optionally the endpoint `grantInvoke` allows.
142
+ */
143
+ static fromWebFunctionAttributes(scope, id, attrs) {
144
+ return new ImportedWebFunction(scope, id, attrs);
145
+ }
63
146
  webFunctionName;
64
147
  webFunctionArn;
65
148
  /** The ID of the current revision. Same as `currentRevision.revisionId`. */
@@ -86,10 +169,6 @@ class WebFunction extends aws_cdk_lib_1.Resource {
86
169
  logOptions;
87
170
  resource;
88
171
  revisionCleanup;
89
- /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
90
- get webFunctionRef() {
91
- return { functionArn: this.webFunctionArn };
92
- }
93
172
  constructor(scope, id, props) {
94
173
  super(scope, id);
95
174
  if (props.runtime.family !== lambda.RuntimeFamily.NODEJS) {
@@ -254,4 +333,42 @@ class WebFunction extends aws_cdk_lib_1.Resource {
254
333
  }
255
334
  }
256
335
  exports.WebFunction = WebFunction;
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==
336
+ /** A Web Function defined outside this app. */
337
+ class ImportedWebFunction extends WebFunctionBase {
338
+ webFunctionName;
339
+ webFunctionArn;
340
+ endpointName;
341
+ constructor(scope, id, attrs) {
342
+ const arn = importedArn(scope, id, attrs);
343
+ super(scope, id, { environmentFromArn: arn });
344
+ this.webFunctionArn = arn;
345
+ this.webFunctionName = attrs.webFunctionName ?? aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
346
+ if (attrs.endpointName !== undefined)
347
+ (0, validation_1.assertResourceName)(this, 'endpointName', attrs.endpointName);
348
+ this.endpointName = attrs.endpointName;
349
+ }
350
+ grantInvoke(grantee) {
351
+ return web_function_grants_1.WebFunctionGrants._forEndpointArns([`${this.webFunctionArn}/endpoint/${this.endpointName ?? '*'}`]).invoke(grantee);
352
+ }
353
+ }
354
+ function importedArn(scope, id, attrs) {
355
+ const path = `${scope.node.path}/${id}`;
356
+ if ((attrs.webFunctionArn === undefined) === (attrs.webFunctionName === undefined)) {
357
+ throw new Error(`${path}: give either webFunctionArn or webFunctionName`);
358
+ }
359
+ if (attrs.webFunctionName !== undefined) {
360
+ if (!aws_cdk_lib_1.Token.isUnresolved(attrs.webFunctionName)) {
361
+ // Validated against the scope, before the import exists.
362
+ (0, validation_1.assertResourceName)(scope, 'webFunctionName', attrs.webFunctionName);
363
+ }
364
+ return aws_cdk_lib_1.Stack.of(scope).formatArn({
365
+ service: 'lambda', resource: 'web-function', resourceName: attrs.webFunctionName, arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
366
+ });
367
+ }
368
+ const arn = attrs.webFunctionArn;
369
+ if (!aws_cdk_lib_1.Token.isUnresolved(arn) && !/^arn:[^:]+:lambda:[a-z0-9-]+:\d{12}:web-function\/[A-Za-z0-9_-]{1,64}$/.test(arn)) {
370
+ throw new Error(`${path}: '${arn}' is not a Web Function ARN (arn:<partition>:lambda:<region>:<account>:web-function/<name>)`);
371
+ }
372
+ return arn;
373
+ }
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdJO0FBQ3hJLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MsK0RBQWlEO0FBQ2pELDJEQUE2QztBQUc3Qyx5Q0FBaUQ7QUFDakQsbURBQTBEO0FBQzFELCtDQUFrRTtBQUNsRSxpRUFBNkQ7QUFDN0QscURBQXFGO0FBQ3JGLG1FQUFtSTtBQUNuSSwrREFBMEQ7QUFDMUQsbUVBQXlGO0FBRXpGLDhEQUE4RDtBQUM5RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFpTnpCOztHQUVHO0FBQ0gsTUFBc0IsZUFBZ0IsU0FBUSxzQkFBUTs7SUFJcEQsbUZBQW1GO0lBQ25GLElBQVcsY0FBYztRQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBUUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsVUFBa0IsRUFBRSxLQUFnQztRQUNoRSxzRUFBc0U7UUFDdEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUMvSCxPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQixTQUFTLEVBQUUsdUJBQWE7WUFDeEIsVUFBVTtZQUNWLGFBQWEsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3JE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LCBEdXJhdGlvbiwgdHlwZSBJUmVzb3VyY2UsIExhenksIE5hbWVzLCBSZW1vdmFsUG9saWN5LCBSZXNvdXJjZSwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQXV0aFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQ29kZSB9IGZyb20gJy4vcHJpdmF0ZS9jb2RlJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uTG9nR3JvdXAgfSBmcm9tICcuL3ByaXZhdGUvbG9nLWdyb3VwJztcbmltcG9ydCB7IERFRkFVTFRfUEVSSU9ELCBXRUJfTkFNRVNQQUNFIH0gZnJvbSAnLi9wcml2YXRlL21ldHJpY3MnO1xuaW1wb3J0IHsgUmV2aXNpb25DbGVhbnVwIH0gZnJvbSAnLi9wcml2YXRlL3JldmlzaW9uLWNsZWFudXAnO1xuaW1wb3J0IHsgQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSwgYXNzZXJ0UmVzb3VyY2VOYW1lIH0gZnJvbSAnLi9wcml2YXRlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25FbmRwb2ludCwgdHlwZSBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgdHlwZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uUmV2aXNpb24sIHR5cGUgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKiBFbmRwb2ludHMgcGVyIGZ1bmN0aW9uIChzZXJ2aWNlIHF1b3RhLCBub3QgYWRqdXN0YWJsZSkuICovXG5jb25zdCBNQVhfRU5EUE9JTlRTID0gMTA7XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgYFdlYkZ1bmN0aW9uYCBhbmQgYE5vZGVqc1dlYkZ1bmN0aW9uYDogZXZlcnl0aGluZyBleGNlcHQgaG93IHRoZSBjb2RlIGlzIHN1cHBsaWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGUgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kcG9pbnQgKGBmbi5lbmRwb2ludGApOiB3aGVyZSBpdCBzZXJ2ZXMgZnJvbSwgaXRzIG5hbWUgYW5kIGxpbWl0cy5cbiAgICogSXQgc2VydmVzIHRoZSBjdXJyZW50IHJldmlzaW9uOyByb3V0ZSBpdCBlbHNld2hlcmUgd2l0aCBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKClgLlxuICAgKiBBZGQgbW9yZSBlbmRwb2ludHMgd2l0aCBgYWRkRW5kcG9pbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmluZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucztcblxuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhlIG5ld2VzdCByZXZpc2lvbnMgdG8ga2VlcCAoMS01MCkuIEVhY2ggZGVwbG95bWVudCB0aGF0IGNoYW5nZXMgdGhlIGNvZGUgb3JcbiAgICogY29uZmlndXJhdGlvbiBjcmVhdGVzIGEgcmV2aXNpb247IG9sZGVyIG9uZXMgc3RheSBhdmFpbGFibGUgdG8gcm9sbCBiYWNrIHRvIG9yIHJvdXRlIHRyYWZmaWMgdG8sXG4gICAqIGFuZCB0aGUgb2xkZXN0IGJleW9uZCB0aGlzIGNvdW50IGFyZSBkZWxldGVkIGFmdGVyIGVhY2ggZGVwbG95bWVudC5cbiAgICpcbiAgICogUmV2aXNpb25zIHRoYXQgYW4gZW5kcG9pbnQgcm91dGVzIHRvIGFyZSBuZXZlciBkZWxldGVkLCBhbmQgbmVpdGhlciBhcmUgdGhvc2UgdGhlIHByZXZpb3VzXG4gICAqIGRlcGxveW1lbnQgdXNlZCAoYSByb2xsYmFjayByZXR1cm5zIHRvIHRoZW0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25SZXRlbnRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuIFJlbmFtaW5nIGEgZnVuY3Rpb24gcmVwbGFjZXMgaXQsIGFuZCBpdHMgZW5kcG9pbnQgZ2V0cyBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgbmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uc3RydWN0IHBhdGggKG1vdmluZyB0aGUgY29uc3RydWN0IGNoYW5nZXMgaXQpXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgY29kZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogQW4gYGlhbS5JUm9sZWAgKG5vdCBgSVJvbGVSZWZgKSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBhZGRzIHN0YXRlbWVudHMgdG8gaXQgYW5kIGdyYW50cyB0aHJvdWdoIGl0LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSB0cnVzdGluZyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdpdGggYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWBcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogSG93IGxvbmcgYSBzaW5nbGUgcmVxdWVzdCBtYXkgcnVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBvbmUgZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZXMgYXQgdGhlIHNhbWUgdGltZSAoMS0xMjgpLlxuICAgKiBSZXF1ZXN0cyBzaGFyZSBtb2R1bGUtbGV2ZWwgc3RhdGUsIHNvIGhhbmRsZXJzIG11c3QgYmUgY29uY3VycmVuY3ktc2FmZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNjRcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldGVudGlvbiBmb3IgZXZlcnkgbG9nIGdyb3VwIG9mIHRoZSBmdW5jdGlvbiwgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVucyB0byB0aGUgbG9nIGdyb3VwcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyByZW1vdmVkOiBSRVRBSU4gb3IgREVTVFJPWS5cbiAgICogV2l0aCBERVNUUk9ZLCBkZWxldGlvbiB3YWl0cyBhYm91dCBhIG1pbnV0ZSBmb3IgZW52aXJvbm1lbnRzIHRvIGZsdXNoIHRoZWlyIGxhc3QgbGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgYXBwbGljYXRpb24gbG9ncyB0byBrZWVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkxvZ0xldmVsVjI/OiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgcGxhdGZvcm0gbG9ncyB0byBrZWVwIChERUJVRywgSU5GTyBvciBXQVJOKS5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk9cbiAgICovXG4gIHJlYWRvbmx5IHN5c3RlbUxvZ0xldmVsVjI/OiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWw7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBgV2ViRnVuY3Rpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE5vZGUuanMgcnVudGltZSwgZS5nLiBgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzI0X1hgLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZTogbGFtYmRhLlJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2RlOiBhIHppcCBpbiBTMyAoYENvZGUuZnJvbUFzc2V0YCwgYENvZGUuZnJvbUJ1Y2tldGAsIGBDb2RlLmZyb21DdXN0b21Db21tYW5kYCwgYENvZGUuZnJvbURvY2tlckJ1aWxkYCkuXG4gICAqIElubGluZSBjb2RlIGFuZCBjb250YWluZXIgaW1hZ2VzIGFyZW4ndCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIFRoZSBjb2RlIGlzIGNvcGllZCBpbnRvIHRoZSBzdGFjaydzIGNvZGUgYnVja2V0LCB3aGljaCBMYW1iZGEgV2ViIEZ1bmN0aW9ucyBjYW4gcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IGxhbWJkYS5Db2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IHN0YXJ0cyB5b3VyIHNlcnZlciwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdpbmRleC5qcydcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBBIExhbWJkYSBXZWIgRnVuY3Rpb24sIGNyZWF0ZWQgaW4gdGhpcyBhcHAgKGBXZWJGdW5jdGlvbmApIG9yIGltcG9ydGVkIChgV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXJuYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkZ1bmN0aW9uIGV4dGVuZHMgSVJlc291cmNlLCBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBBUk4uXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZnVuY3Rpb24ncyBlbmRwb2ludCAoYGxhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50YCk6IHRoZSBkZWZhdWx0IGVuZHBvaW50XG4gICAqIG9mIGEgYFdlYkZ1bmN0aW9uYDsgZm9yIGFuIGltcG9ydGVkIGZ1bmN0aW9uLCB0aGUgZW5kcG9pbnQgbmFtZWQgaW4gaXRzIGF0dHJpYnV0ZXMsIG9yIGV2ZXJ5IGVuZHBvaW50LlxuICAgKlxuICAgKiBUaGlzIGFkZHMgdG8gdGhlIGdyYW50ZWUncyBJQU0gcG9saWN5LiBGb3IgYSBmdW5jdGlvbiBpbiBhbm90aGVyIGFjY291bnQsIGl0cyByZXNvdXJjZSBwb2xpY3kgbXVzdCBhbHNvIGFsbG93IHRoZSBncmFudGVlLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2AsIG1heGltdW0pLiAqL1xuICBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24uIEdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLCBlLmcuIGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTExMTIyMjIzMzMzOndlYi1mdW5jdGlvbi9vcmRlcnNgLiBJdCBtYXkgYmUgaW4gYW5vdGhlclxuICAgKiByZWdpb24gb3IgYWNjb3VudDsgYWNyb3NzIGFjY291bnRzLCBgZ3JhbnRJbnZva2VgIGFsc28gbmVlZHMgdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IHRvIGFsbG93IHRoZSBjYWxsZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYnVpbHQgZnJvbSBgd2ViRnVuY3Rpb25OYW1lYCwgaW4gdGhpcyBzdGFjaydzIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFrZW4gZnJvbSBgd2ViRnVuY3Rpb25Bcm5gXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cyBjYWxsaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYFdlYkZ1bmN0aW9uYCBhbmQgaW1wb3J0ZWQgZnVuY3Rpb25zIGhhdmUgaW4gY29tbW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2ViRnVuY3Rpb25CYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb24ge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIGZ1bmN0aW9uLCBmb3IgQVBJcyB0aGF0IGFjY2VwdCBgbGFtYmRhLklXZWJGdW5jdGlvblJlZmAuICovXG4gIHB1YmxpYyBnZXQgd2ViRnVuY3Rpb25SZWYoKTogbGFtYmRhLldlYkZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbkFybiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZnVuY3Rpb24ncyBlbmRwb2ludC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCksIGFjcm9zcyBhbGwgZW5kcG9pbnRzLlxuICAgKiBGb3IgcmVxdWVzdCBhbmQgZXJyb3IgY291bnRzLCB1c2UgdGhlIGVuZHBvaW50J3MgbWV0cmljcyAoYGZuLmVuZHBvaW50Lm1ldHJpY1JlcXVlc3RzKClgKS5cbiAgICpcbiAgICogTWV0cmljcyBhcmUgcHVibGlzaGVkIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3Q6IHBhc3MgYHJlZ2lvbmAgZm9yIGFub3RoZXIgc2VydmluZyByZWdpb24uXG4gICAqIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGZ1bmN0aW9uJ3MgaG9tZSByZWdpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICAvLyBBbiBpbXBvcnRlZCBmdW5jdGlvbiBpbiBhbm90aGVyIHJlZ2lvbiBwdWJsaXNoZXMgaXRzIG1ldHJpY3MgdGhlcmUuXG4gICAgY29uc3QgcmVnaW9uID0gIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmVudi5yZWdpb24pICYmIHRoaXMuZW52LnJlZ2lvbiAhPT0gU3RhY2sub2YodGhpcykucmVnaW9uID8gdGhpcy5lbnYucmVnaW9uIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBXRUJfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgRnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSB9LFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICByZWdpb24sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNBY3RpdmVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRBY3RpdmVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIENQVSB0aW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHVzZWQgKGBFbnZpcm9ubWVudENQVVRpbWVgKS4gKi9cbiAgcHVibGljIG1ldHJpY0NwdVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudENQVVRpbWUnLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZWQgYXQgb25jZSAoYEVudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzYCksIHRvIGNvbXBhcmUgd2l0aFxuICAgKiBgbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29uY3VycmVudFJlcXVlc3RzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDb25jdXJyZW50UmVxdWVzdHMnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZWFrIG1lbW9yeSBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgdXNlZCAoYEVudmlyb25tZW50TWF4TWVtb3J5VXNhZ2VgKTsgZWFjaCBlbnZpcm9ubWVudCBoYXMgMiBHQi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNNYXhNZW1vcnlVc2FnZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50TWF4TWVtb3J5VXNhZ2UnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKiBCeXRlcyBzZW50IGluIHJlc3BvbnNlcyAoYFJlc3BvbnNlQnl0ZXNgKS4gKi9cbiAgcHVibGljIG1ldHJpY1Jlc3BvbnNlQnl0ZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSZXNwb25zZUJ5dGVzJywgcHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogQSBOb2RlLmpzIEhUVFAgc2VydmVyIHJ1bm5pbmcgYXMgYW4gQVdTIExhbWJkYSBXZWIgRnVuY3Rpb24sIHNlcnZlZCBmcm9tIG9uZSBvciBtb3JlIHJlZ2lvbnMuXG4gKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24sIGl0cyBjdXJyZW50IHJldmlzaW9uIChjb2RlIGFuZCBjb25maWd1cmF0aW9uOyBhbnkgY2hhbmdlIGNyZWF0ZXMgYSBuZXcgb25lLFxuICogYW5kIHRoZSBuZXdlc3QgYHJldmlzaW9uUmV0ZW50aW9uYCBhcmUga2VwdCksIGEgZGVmYXVsdCBIVFRQUyBlbmRwb2ludCwgYW4gZXhlY3V0aW9uIHJvbGUsIGFuZCBvd25zXG4gKiB0aGUgZnVuY3Rpb24ncyBsb2cgZ3JvdXBzIGluIGV2ZXJ5IHJlZ2lvbiBpdHMgZW5kcG9pbnRzIHNlcnZlIGZyb20uXG4gKlxuICogVXNlIGBmcm9tV2ViRnVuY3Rpb25Bcm5gLCBgZnJvbVdlYkZ1bmN0aW9uTmFtZWAgb3IgYGZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXNgIGZvciBhIGZ1bmN0aW9uIGRlZmluZWQgZWxzZXdoZXJlLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkxhbWJkYTo6V2ViRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIGltcGxlbWVudHMgaWFtLklHcmFudGFibGUge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24gYnkgaXRzIEFSTiAoaW4gYW55IHJlZ2lvbiBvciBhY2NvdW50KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmcpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbi5mcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB3ZWJGdW5jdGlvbkFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbiBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uIGJ5IGl0cyBuYW1lLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25OYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgd2ViRnVuY3Rpb25OYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uOiBnaXZlIGl0cyBBUk4gb3IgaXRzIG5hbWUsIGFuZCBvcHRpb25hbGx5IHRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydGVkV2ViRnVuY3Rpb24oc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgcmV2aXNpb24uIFNhbWUgYXMgYGN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHJldmlzaW9uIGJ1aWx0IGZyb20gdGhlIGN1cnJlbnQgY29kZSBhbmQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRSZXZpc2lvbjogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqIFRoZSBkZWZhdWx0IGVuZHBvaW50LiBBZGQgbW9yZSB3aXRoIGBhZGRFbmRwb2ludGAuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKiogR3JhbnRzIG9uIHRoZSBkZWZhdWx0IGVuZHBvaW50IChlLmcuIGBncmFudHMuaW52b2tlKHByaW5jaXBhbClgKS4gT3RoZXIgZW5kcG9pbnRzIGhhdmUgdGhlaXIgb3duIGBncmFudHNgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKiogVGhlIGV4ZWN1dGlvbiByb2xlLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvICh0aGUgZXhlY3V0aW9uIHJvbGUpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZS1yZWdpb24gbG9nIGdyb3VwIHRoYXQgcmVjZWl2ZXMgdGhlIGxvZ3Mgb2YgZXZlcnkgcmVnaW9uIHRoZSBmdW5jdGlvbiBzZXJ2ZXMgZnJvbS5cbiAgICogU3Vic2NyaWJlIHRvIHRoaXMgb25lIG9ubHk6IGVhY2ggcmVnaW9uJ3MgYC5sb2NhbGAgZ3JvdXAgaG9sZHMgYSBjb3B5IG9mIHRoZSBzYW1lIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50czogV2ViRnVuY3Rpb25FbmRwb2ludFtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlTG9nR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFdlYkZ1bmN0aW9uTG9nR3JvdXA+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nT3B0aW9uczogUGljazxXZWJGdW5jdGlvblByb3BzLCAnbG9nUmV0ZW50aW9uJyB8ICdsb2dSZW1vdmFsUG9saWN5Jz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZpc2lvbkNsZWFudXA6IFJldmlzaW9uQ2xlYW51cDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmlzaW9uUmV0ZW50aW9uID0gcHJvcHMucmV2aXNpb25SZXRlbnRpb24gPz8gMjA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb25SZXRlbnRpb24pICYmICghTnVtYmVyLmlzSW50ZWdlcihyZXZpc2lvblJldGVudGlvbikgfHwgcmV2aXNpb25SZXRlbnRpb24gPCAxIHx8IHJldmlzaW9uUmV0ZW50aW9uID4gNTApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZXZpc2lvblJldGVudGlvbiBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDUwLCBnb3QgJHtyZXZpc2lvblJldGVudGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3lzdGVtTG9nTGV2ZWxzID0gW2xhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5ERUJVRywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk8sIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5XQVJOXTtcbiAgICBpZiAocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMiAhPT0gdW5kZWZpbmVkICYmICFzeXN0ZW1Mb2dMZXZlbHMuaW5jbHVkZXMocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHN5c3RlbUxvZ0xldmVsVjIgbXVzdCBiZSBERUJVRywgSU5GTyBvciBXQVJOIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9uc2ApO1xuICAgIH1cblxuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gcHJvcHMud2ViRnVuY3Rpb25OYW1lID8/IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQsIHNlcGFyYXRvcjogJy0nIH0pO1xuICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnd2ViRnVuY3Rpb25OYW1lJywgdGhpcy53ZWJGdW5jdGlvbk5hbWUpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuZW52aXJvbm1lbnQgPz8ge30pKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVudmlyb25tZW50LkFXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUgPz8gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyldLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG5cbiAgICAvLyBMb2cgZ3JvdXBzIGZpcnN0OiB0aGUgc2VydmljZSB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIHRoZW0gd2l0aG91dCByZXRlbnRpb24uXG4gICAgY29uc3QgbG9nR3JvdXBOYW1lID0gYC9hd3MvbGFtYmRhL3dlYi8ke3RoaXMud2ViRnVuY3Rpb25OYW1lfWA7XG4gICAgdGhpcy5sb2dHcm91cE5hbWUgPSBsb2dHcm91cE5hbWU7XG4gICAgdGhpcy5sb2dPcHRpb25zID0geyBsb2dSZXRlbnRpb246IHByb3BzLmxvZ1JldGVudGlvbiwgbG9nUmVtb3ZhbFBvbGljeTogcHJvcHMubG9nUmVtb3ZhbFBvbGljeSB9O1xuICAgIGNvbnN0IGxvZ0dyb3VwcyA9IHRoaXMuY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5sb2dHcm91cCA9IGxvZ3MuTG9nR3JvdXAuZnJvbUxvZ0dyb3VwTmFtZSh0aGlzLCAnTG9nR3JvdXAnLCBsb2dHcm91cE5hbWUpO1xuXG4gICAgY29uc3QgY29kZSA9IG5ldyBXZWJGdW5jdGlvbkNvZGUodGhpcywgJ0NvZGUnLCBwcm9wcy5jb2RlKS5sb2NhdGlvbjtcblxuICAgIGNvbnN0IGZuID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbih0aGlzLCAnUmVzb3VyY2UnLCB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSk7XG4gICAgLy8gVGhlIGZ1bmN0aW9uIGlzIGRlbGV0ZWQgYmVmb3JlIGl0cyBsb2cgZ3JvdXBzLCB3aGljaCB0aGVuIHdhaXQgZm9yIGxhdGUgZmx1c2hlcy5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGxvZ0dyb3VwcykgZm4ubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihmbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IGZuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBmbi5hdHRyRnVuY3Rpb25Bcm47XG5cbiAgICBjb25zdCByZXZpc2lvbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25SZXZpc2lvbih0aGlzLCAnUmV2aXNpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgLy8gUmVwbGFjZWQgcmV2aXNpb25zIHN0YXkgYXMgcm9sbGJhY2sgdGFyZ2V0czsgUmV2aXNpb25DbGVhbnVwIGRlbGV0ZXMgdGhlIG9sZGVzdC4gRGVsZXRpbmcgdGhlIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlbSBhbGwuXG4gICAgcmV2aXNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB0aGlzLnJldmlzaW9uSWQgPSByZXZpc2lvbi5hdHRyUmV2aXNpb25JZDtcbiAgICB0aGlzLmN1cnJlbnRSZXZpc2lvbiA9IFdlYkZ1bmN0aW9uUmV2aXNpb24uX2N1cnJlbnQodGhpcywgJ0N1cnJlbnRSZXZpc2lvbicsIHRoaXMsIHJldmlzaW9uLmF0dHJSZXZpc2lvbklkLCByZXZpc2lvbi5hdHRyUmV2aXNpb25Bcm4pO1xuXG4gICAgdGhpcy5yZXZpc2lvbkNsZWFudXAgPSBuZXcgUmV2aXNpb25DbGVhbnVwKHRoaXMsICdSZXZpc2lvbkNsZWFudXAnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25Bcm46IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGtlZXA6IHJldmlzaW9uUmV0ZW50aW9uLFxuICAgICAgcmV2aXNpb25JZHM6ICgpID0+IFt0aGlzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLCAuLi50aGlzLmVuZHBvaW50cy5mbGF0TWFwKChlKSA9PiBlLl9yZXZpc2lvbklkcygpKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gdGhpcy5jcmVhdGVFbmRwb2ludCgnRW5kcG9pbnQnLCB7IC4uLnByb3BzLmVuZHBvaW50LCBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUgfSwgJ2RlZmF1bHQnKTtcbiAgICB0aGlzLmdyYW50cyA9IHRoaXMuZW5kcG9pbnQuZ3JhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW5kcG9pbnQgKHVwIHRvIDEwIHBlciBmdW5jdGlvbiksIGUuZy4gYSBwdWJsaWMgb25lIG5leHQgdG8gYW4gSUFNLW9ubHkgb25lLCBvciBvbmUgcGlubmVkIHRvIGFuXG4gICAqIGVhcmxpZXIgcmV2aXNpb24uIEVhY2ggZW5kcG9pbnQgaGFzIGl0cyBvd24gVVJMLCBhdXRoZW50aWNhdGlvbiwgcmVnaW9ucyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIGVuZHBvaW50J3MgY29uc3RydWN0IElELCBhbHNvIHVzZWQgaW4gaXRzIGdlbmVyYXRlZCBuYW1lIChgPGlkPi08aGFzaD5gKVxuICAgKi9cbiAgcHVibGljIGFkZEVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgY29uc3QgcHJlZml4ID0gaWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rLywgJycpLnNsaWNlKDAsIDU1KS5yZXBsYWNlKC8tKyQvLCAnJykgfHwgJ2VuZHBvaW50JztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFbmRwb2ludChpZCwgb3B0aW9ucywgcHJlZml4LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogV2ViRnVuY3Rpb24ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQVdTXycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBlbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVzZXJ2ZWQgKG5hbWVzIHN0YXJ0aW5nIHdpdGggQVdTXyBhcmUgc2V0IGJ5IHRoZSBydW50aW1lKSR7a2V5ID09PSAnQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCcgPyAnOyB1c2UgdGhlIGVudHJ5cG9pbnQgcHJvcGVydHknIDogJyd9YCk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGV4ZWN1dGlvbiByb2xlJ3MgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLCBhcyBvbiBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5pbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zLCBuYW1lUHJlZml4OiBzdHJpbmcsIG5hbWVTZWVkPzogc3RyaW5nKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRzLmxlbmd0aCA+PSBNQVhfRU5EUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBhIFdlYiBGdW5jdGlvbiBjYW4gaGF2ZSBhdCBtb3N0ICR7TUFYX0VORFBPSU5UU30gZW5kcG9pbnRzYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gV2ViRnVuY3Rpb25FbmRwb2ludC5fY3JlYXRlKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd2ViRnVuY3Rpb246IHRoaXMsXG4gICAgICBjdXJyZW50UmV2aXNpb246IHRoaXMuY3VycmVudFJldmlzaW9uLFxuICAgICAgbmFtZVByZWZpeCxcbiAgICAgIG5hbWVTZWVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYXNoID0gdGhpcy5lbmRwb2ludHMuZmluZCgoZSkgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChlLmVuZHBvaW50TmFtZSkgJiYgZS5lbmRwb2ludE5hbWUgPT09IGVuZHBvaW50LmVuZHBvaW50TmFtZSk7XG4gICAgaWYgKGNsYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogZW5kcG9pbnROYW1lICcke2VuZHBvaW50LmVuZHBvaW50TmFtZX0nIGlzIGFscmVhZHkgdXNlZCBieSAke2NsYXNoLm5vZGUucGF0aH1gKTtcbiAgICB9XG4gICAgdGhpcy5lbmRwb2ludHMucHVzaChlbmRwb2ludCk7XG4gICAgLy8gUmV2aXNpb25zIGFuIGVuZHBvaW50IHN0b3BzIHJvdXRpbmcgdG8gb25seSBiZWNvbWUgZGVsZXRhYmxlIG9uY2UgaXQncyB1cGRhdGVkLlxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShlbmRwb2ludCk7XG4gICAgLy8gRWFjaCBzZXJ2aW5nIHJlZ2lvbidzIC5sb2NhbCBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSB0cmFmZmljLCBhbmQgb3V0bGl2ZSB0aGUgZnVuY3Rpb24uXG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgZW5kcG9pbnQucmVnaW9ucy5zbGljZSgxKSkge1xuICAgICAgaWYgKHRoaXMucmVtb3RlTG9nR3JvdXBzLmhhcyhyZWdpb24pKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sb2dHcm91cEluKGBMb2NhbExvZ3MtJHtyZWdpb259YCwgcmVnaW9uLCBgJHt0aGlzLmxvZ0dyb3VwTmFtZX0ubG9jYWxgKTtcbiAgICAgIHRoaXMucmVtb3RlTG9nR3JvdXBzLnNldChyZWdpb24sIGdyb3VwKTtcbiAgICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwW10ge1xuICAgIGNvbnN0IGhvbWUgPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubG9nR3JvdXBJbignTG9ncycsIGhvbWUsIGxvZ0dyb3VwTmFtZSksXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvY2FsTG9ncycsIGhvbWUsIGAke2xvZ0dyb3VwTmFtZX0ubG9jYWxgKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dHcm91cEluKGlkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uTG9nR3JvdXAodGhpcywgaWQsIHtcbiAgICAgIHJlZ2lvbixcbiAgICAgIGxvZ0dyb3VwTmFtZTogbmFtZSxcbiAgICAgIHJldGVudGlvbjogdGhpcy5sb2dPcHRpb25zLmxvZ1JldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5sb2dPcHRpb25zLmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEEgV2ViIEZ1bmN0aW9uIGRlZmluZWQgb3V0c2lkZSB0aGlzIGFwcC4gKi9cbmNsYXNzIEltcG9ydGVkV2ViRnVuY3Rpb24gZXh0ZW5kcyBXZWJGdW5jdGlvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgYXJuID0gaW1wb3J0ZWRBcm4oc2NvcGUsIGlkLCBhdHRycyk7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IGVudmlyb25tZW50RnJvbUFybjogYXJuIH0pO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBhcm47XG4gICAgdGhpcy53ZWJGdW5jdGlvbk5hbWUgPSBhdHRycy53ZWJGdW5jdGlvbk5hbWUgPz8gQXJuLnNwbGl0KGFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgaWYgKGF0dHJzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIGF0dHJzLmVuZHBvaW50TmFtZSk7XG4gICAgdGhpcy5lbmRwb2ludE5hbWUgPSBhdHRycy5lbmRwb2ludE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnRBcm5zKFtgJHt0aGlzLndlYkZ1bmN0aW9uQXJufS9lbmRwb2ludC8ke3RoaXMuZW5kcG9pbnROYW1lID8/ICcqJ31gXSkuaW52b2tlKGdyYW50ZWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGltcG9ydGVkQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gYCR7c2NvcGUubm9kZS5wYXRofS8ke2lkfWA7XG4gIGlmICgoYXR0cnMud2ViRnVuY3Rpb25Bcm4gPT09IHVuZGVmaW5lZCkgPT09IChhdHRycy53ZWJGdW5jdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06IGdpdmUgZWl0aGVyIHdlYkZ1bmN0aW9uQXJuIG9yIHdlYkZ1bmN0aW9uTmFtZWApO1xuICB9XG4gIGlmIChhdHRycy53ZWJGdW5jdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGF0dHJzLndlYkZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgIC8vIFZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzY29wZSwgYmVmb3JlIHRoZSBpbXBvcnQgZXhpc3RzLlxuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHNjb3BlLCAnd2ViRnVuY3Rpb25OYW1lJywgYXR0cnMud2ViRnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xhbWJkYScsIHJlc291cmNlOiAnd2ViLWZ1bmN0aW9uJywgcmVzb3VyY2VOYW1lOiBhdHRycy53ZWJGdW5jdGlvbk5hbWUsIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXJuID0gYXR0cnMud2ViRnVuY3Rpb25Bcm4hO1xuICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhcm4pICYmICEvXmFybjpbXjpdKzpsYW1iZGE6W2EtejAtOS1dKzpcXGR7MTJ9OndlYi1mdW5jdGlvblxcL1tBLVphLXowLTlfLV17MSw2NH0kLy50ZXN0KGFybikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06ICcke2Fybn0nIGlzIG5vdCBhIFdlYiBGdW5jdGlvbiBBUk4gKGFybjo8cGFydGl0aW9uPjpsYW1iZGE6PHJlZ2lvbj46PGFjY291bnQ+OndlYi1mdW5jdGlvbi88bmFtZT4pYCk7XG4gIH1cbiAgcmV0dXJuIGFybjtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -78,7 +78,7 @@
78
78
  "jsii-docgen": "^10.5.0",
79
79
  "jsii-pacmak": "^1.141.0",
80
80
  "jsii-rosetta": "~6.0.0",
81
- "projen": "^0.104.5",
81
+ "projen": "^0.104.8",
82
82
  "supports-color": "^7",
83
83
  "ts-jest": "^29.4.15",
84
84
  "ts-node": "^10.9.2",
@@ -111,7 +111,7 @@
111
111
  "main": "lib/index.js",
112
112
  "license": "Apache-2.0",
113
113
  "stability": "experimental",
114
- "version": "0.1.2",
114
+ "version": "0.1.4",
115
115
  "jest": {
116
116
  "coverageProvider": "v8",
117
117
  "testMatch": [
@@ -168,7 +168,6 @@
168
168
  "exclude": [
169
169
  "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint",
170
170
  "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision",
171
- "from-method:@ashishpandeyone/cdk-lambda-web-function.WebFunction",
172
171
  "resource-interface:@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction"
173
172
  ]
174
173
  },