@ashishpandeyone/cdk-lambda-web-function 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1520 -130
- package/.jsii.tabl.json +1 -1
- package/API.md +1612 -124
- package/README.md +151 -7
- package/assets/web-function-deployment/index.js +58 -0
- package/assets/web-function-provider/index.js +26 -26
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/nodejs-web-function.js +1 -1
- package/lib/private/metrics.d.ts +23 -0
- package/lib/private/metrics.js +49 -0
- package/lib/private/provider-protocol.d.ts +57 -0
- package/lib/private/provider-protocol.js +13 -2
- package/lib/private/provider.d.ts +3 -3
- package/lib/private/provider.js +16 -6
- package/lib/private/regional-alarm.d.ts +23 -0
- package/lib/private/regional-alarm.js +40 -0
- package/lib/private/revision-cleanup.d.ts +19 -0
- package/lib/private/revision-cleanup.js +38 -0
- package/lib/private/rollback.d.ts +9 -0
- package/lib/private/rollback.js +3 -0
- package/lib/private/traffic-shift.d.ts +22 -0
- package/lib/private/traffic-shift.js +144 -0
- package/lib/web-function-deployment.d.ts +153 -0
- package/lib/web-function-deployment.js +125 -0
- package/lib/web-function-endpoint.d.ts +168 -19
- package/lib/web-function-endpoint.js +292 -18
- package/lib/web-function-grants.d.ts +2 -2
- package/lib/web-function-grants.js +4 -4
- package/lib/web-function-revision.d.ts +45 -0
- package/lib/web-function-revision.js +40 -0
- package/lib/web-function.d.ts +69 -9
- package/lib/web-function.js +130 -26
- package/package.json +5 -2
|
@@ -37,20 +37,25 @@ exports.WebFunctionEndpoint = void 0;
|
|
|
37
37
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
38
|
const node_crypto_1 = require("node:crypto");
|
|
39
39
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
40
|
+
const cloudwatch = __importStar(require("aws-cdk-lib/aws-cloudwatch"));
|
|
40
41
|
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
41
42
|
const constructs_1 = require("constructs");
|
|
42
43
|
const enums_1 = require("./enums");
|
|
43
44
|
const endpoint_lookup_1 = require("./private/endpoint-lookup");
|
|
45
|
+
const metrics_1 = require("./private/metrics");
|
|
46
|
+
const regional_alarm_1 = require("./private/regional-alarm");
|
|
47
|
+
const traffic_shift_1 = require("./private/traffic-shift");
|
|
44
48
|
const validation_1 = require("./private/validation");
|
|
49
|
+
const web_function_grants_1 = require("./web-function-grants");
|
|
45
50
|
/**
|
|
46
|
-
*
|
|
51
|
+
* An HTTPS endpoint of a Web Function: `fn.endpoint` (the default one) or the result of `fn.addEndpoint()`.
|
|
47
52
|
*
|
|
48
|
-
*
|
|
53
|
+
* Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
|
|
49
54
|
*/
|
|
50
55
|
class WebFunctionEndpoint extends constructs_1.Construct {
|
|
51
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.
|
|
56
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.3" };
|
|
52
57
|
/**
|
|
53
|
-
* Creates
|
|
58
|
+
* Creates an endpoint of a Web Function. Used by `WebFunction`.
|
|
54
59
|
*
|
|
55
60
|
* @internal
|
|
56
61
|
*/
|
|
@@ -63,6 +68,8 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
63
68
|
endpointArn;
|
|
64
69
|
/** Where the endpoint serves traffic from. */
|
|
65
70
|
endpointType;
|
|
71
|
+
/** How callers of the endpoint are authenticated. */
|
|
72
|
+
authType;
|
|
66
73
|
/** Every region the endpoint serves from: the home region first, then the others in alphabetical order. */
|
|
67
74
|
regions;
|
|
68
75
|
/**
|
|
@@ -73,15 +80,27 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
73
80
|
* The endpoint's URL: the global URL for `MULTI_REGION`, otherwise the home region's.
|
|
74
81
|
*/
|
|
75
82
|
url;
|
|
83
|
+
/** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
|
|
84
|
+
grants;
|
|
85
|
+
/**
|
|
86
|
+
* The alarms this endpoint created for its deployment's `rollbackOn`, one per threshold in every region it serves from
|
|
87
|
+
* (the home region's first). Empty without `rollbackOn`.
|
|
88
|
+
*/
|
|
89
|
+
rollbackAlarms = [];
|
|
76
90
|
homeRegion;
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
webFunction;
|
|
92
|
+
resource;
|
|
93
|
+
weights;
|
|
94
|
+
routed = false;
|
|
95
|
+
gradual;
|
|
79
96
|
lookup;
|
|
80
97
|
constructor(scope, id, props) {
|
|
81
98
|
super(scope, id);
|
|
82
99
|
const homeRegion = aws_cdk_lib_1.Stack.of(this).region;
|
|
83
100
|
const endpointType = props.endpointType ?? enums_1.WebFunctionEndpointType.HOME_REGION;
|
|
84
101
|
const extraRegions = normaliseRegions(this, endpointType, homeRegion, props.regions ?? []);
|
|
102
|
+
validateRateLimit(this, props.rateLimit);
|
|
103
|
+
validateMaxEnvironments(this, props.maxEnvironments);
|
|
85
104
|
if (props.endpointName !== undefined) {
|
|
86
105
|
(0, validation_1.assertResourceName)(this, 'endpointName', props.endpointName);
|
|
87
106
|
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:explicitEndpointName', `endpointName '${props.endpointName}' is set explicitly: changing endpointType or regions later also requires a new endpointName, otherwise the deployment fails with "already exists" (the stack rolls back safely). Omit endpointName to get a name that changes automatically.`);
|
|
@@ -90,23 +109,65 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
90
109
|
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:authTypeNone', 'authType NONE makes the endpoint public: Lambda does no authentication, so your application must authenticate requests itself.');
|
|
91
110
|
}
|
|
92
111
|
this.endpointType = endpointType;
|
|
93
|
-
this.
|
|
112
|
+
this.authType = props.authType;
|
|
113
|
+
this.endpointName = props.endpointName ?? defaultEndpointName(props.namePrefix, props.nameSeed, endpointType, extraRegions);
|
|
94
114
|
this.regions = [homeRegion, ...extraRegions];
|
|
95
115
|
this.homeRegion = homeRegion;
|
|
96
|
-
this.
|
|
97
|
-
this.
|
|
116
|
+
this.webFunction = props.webFunction;
|
|
117
|
+
this.weights = [{ revisionId: props.currentRevision.revisionId, weight: 100 }];
|
|
98
118
|
const resource = new lambda.CfnWebFunctionEndpoint(this, 'Resource', {
|
|
99
|
-
functionName: props.
|
|
119
|
+
functionName: props.webFunction.webFunctionArn,
|
|
100
120
|
endpointName: this.endpointName,
|
|
101
121
|
endpointType,
|
|
102
122
|
authType: props.authType,
|
|
123
|
+
description: props.description,
|
|
103
124
|
regions: extraRegions.length > 0 ? extraRegions : undefined,
|
|
104
|
-
revisionWeights:
|
|
125
|
+
revisionWeights: this.weights,
|
|
126
|
+
throttleConfig: props.rateLimit !== undefined ? { rateLimit: props.rateLimit } : undefined,
|
|
127
|
+
scalingConfig: props.maxEnvironments !== undefined ? { maxEnvironments: props.maxEnvironments } : undefined,
|
|
105
128
|
});
|
|
106
129
|
aws_cdk_lib_1.Validations.of(resource).acknowledge(validation_1.CFN_VALIDATE_UNKNOWN_TYPE);
|
|
130
|
+
this.resource = resource;
|
|
131
|
+
this.gradual = props.deployment?._gradual ?? false;
|
|
132
|
+
if (props.deployment?._gradual) {
|
|
133
|
+
if (props.revision !== undefined || props.additionalRevisions !== undefined) {
|
|
134
|
+
throw new Error(`${this.node.path}: an endpoint with a ${props.deployment._kind} deployment always moves to the current revision; it can't also set revision or additionalRevisions`);
|
|
135
|
+
}
|
|
136
|
+
const rollbackAlarmArns = props.deployment._rollbackOn ? this.createRollbackAlarms(props.deployment._rollbackOn) : [];
|
|
137
|
+
const waitSeconds = props.deployment._waitSeconds;
|
|
138
|
+
const rollback = props.deployment._rollbackOn;
|
|
139
|
+
if (rollback && waitSeconds < rollback.period.toSeconds() * rollback.evaluationPeriods + 120) {
|
|
140
|
+
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:rollbackSlowerThanStep', `rollbackOn needs ${rollback.evaluationPeriods} period(s) of ${rollback.period.toHumanString()} plus about 2 minutes of CloudWatch delay to fire, longer than each ${props.deployment._kind} step (${aws_cdk_lib_1.Duration.seconds(waitSeconds).toHumanString()}): a bad revision can reach the next step before its alarm fires.`);
|
|
141
|
+
}
|
|
142
|
+
// Moves the traffic in steps before CloudFormation writes the endpoint, which then finds it already done.
|
|
143
|
+
const shift = new traffic_shift_1.TrafficShift(this, 'Deployment', {
|
|
144
|
+
functionName: props.webFunction.webFunctionName,
|
|
145
|
+
functionArn: props.webFunction.webFunctionArn,
|
|
146
|
+
endpointName: this.endpointName,
|
|
147
|
+
revisionId: props.currentRevision.revisionId,
|
|
148
|
+
deployment: props.deployment,
|
|
149
|
+
alarmArns: rollbackAlarmArns,
|
|
150
|
+
endpointConfig: {
|
|
151
|
+
endpointType,
|
|
152
|
+
authType: props.authType,
|
|
153
|
+
description: props.description,
|
|
154
|
+
regions: extraRegions,
|
|
155
|
+
rateLimit: props.rateLimit,
|
|
156
|
+
maxEnvironments: props.maxEnvironments,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
resource.node.addDependency(shift);
|
|
160
|
+
// Alarms in other regions are only referenced by ARN.
|
|
161
|
+
for (const alarm of this.node.findAll().filter((c) => c instanceof regional_alarm_1.RegionalAlarm))
|
|
162
|
+
shift.node.addDependency(alarm);
|
|
163
|
+
}
|
|
164
|
+
if (props.revision !== undefined || props.additionalRevisions !== undefined) {
|
|
165
|
+
this.routeTraffic(props.revision ?? props.currentRevision, props.additionalRevisions);
|
|
166
|
+
}
|
|
107
167
|
this.endpointArn = resource.attrEndpointArn;
|
|
108
168
|
this.domainName = resource.attrDomainName;
|
|
109
169
|
this.url = `https://${resource.attrDomainName}`;
|
|
170
|
+
this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this);
|
|
110
171
|
}
|
|
111
172
|
/**
|
|
112
173
|
* The URL of this endpoint in one region. Only for `PER_REGION` endpoints.
|
|
@@ -124,13 +185,183 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
124
185
|
return this.url;
|
|
125
186
|
}
|
|
126
187
|
this.lookup ??= new endpoint_lookup_1.EndpointLookup(this, 'Lookup', {
|
|
127
|
-
functionName: this.
|
|
128
|
-
functionArn: this.
|
|
188
|
+
functionName: this.webFunction.webFunctionName,
|
|
189
|
+
functionArn: this.webFunction.webFunctionArn,
|
|
129
190
|
endpointName: this.endpointName,
|
|
130
191
|
endpointArn: this.endpointArn,
|
|
131
192
|
});
|
|
132
193
|
return `https://${this.lookup.regionalDomain(region)}`;
|
|
133
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
|
|
197
|
+
* traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
|
|
198
|
+
*
|
|
199
|
+
* Use it to keep an endpoint on an earlier revision (`WebFunctionRevision.fromRevisionAttributes`),
|
|
200
|
+
* or to send part of the traffic to the current revision:
|
|
201
|
+
* `fn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }])`.
|
|
202
|
+
* Can be called once per endpoint, and not on one created with `revision` or `additionalRevisions`.
|
|
203
|
+
*/
|
|
204
|
+
routeTraffic(revision, additionalRevisions) {
|
|
205
|
+
if (this.gradual) {
|
|
206
|
+
throw new Error(`${this.node.path}: the endpoint has a deployment in steps, which always moves it to the current revision; routeTraffic() can't be used with it`);
|
|
207
|
+
}
|
|
208
|
+
if (this.routed) {
|
|
209
|
+
throw new Error(`${this.node.path}: the endpoint's revisions are already set (revision, additionalRevisions or routeTraffic)`);
|
|
210
|
+
}
|
|
211
|
+
this.weights = revisionWeights(this, this.webFunction, revision, additionalRevisions ?? []);
|
|
212
|
+
this.resource.revisionWeights = this.weights;
|
|
213
|
+
this.routed = true;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* The IDs of the revisions this endpoint routes to.
|
|
217
|
+
*
|
|
218
|
+
* @internal
|
|
219
|
+
*/
|
|
220
|
+
_revisionIds() {
|
|
221
|
+
return this.weights.map((w) => w.revisionId);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* A metric of this endpoint in `AWS/Lambda/Web` (dimensions `FunctionName` and `EndpointName`).
|
|
225
|
+
*
|
|
226
|
+
* Metrics are published in the region that served the request: pass `region` for one of the endpoint's
|
|
227
|
+
* other regions. An alarm can only use metrics from its own stack's region.
|
|
228
|
+
*
|
|
229
|
+
* @default - sum over 1 minute, in the home region
|
|
230
|
+
*/
|
|
231
|
+
metric(metricName, props) {
|
|
232
|
+
return new cloudwatch.Metric({
|
|
233
|
+
namespace: metrics_1.WEB_NAMESPACE,
|
|
234
|
+
metricName,
|
|
235
|
+
dimensionsMap: (0, metrics_1.endpointDimensions)(this.metricIds()),
|
|
236
|
+
statistic: cloudwatch.Stats.SUM,
|
|
237
|
+
period: metrics_1.DEFAULT_PERIOD,
|
|
238
|
+
...props,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/** Requests the endpoint served (`ExecutedRequests`). There's no separate count of successful (2XX) responses. */
|
|
242
|
+
metricRequests(props) {
|
|
243
|
+
return this.metric(metrics_1.REQUESTS, props);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Requests answered with a 4XX status (`HTTPResponseStatusClass4XX`), including 429s from `rateLimit` and `maxEnvironments`.
|
|
247
|
+
* The metric only exists once it's non-zero, so alarms should treat missing data as not breaching.
|
|
248
|
+
*/
|
|
249
|
+
metricClientErrors(props) {
|
|
250
|
+
return this.metric(metrics_1.CLIENT_ERRORS, props);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Requests answered with a 5XX status (`HTTPResponseStatusClass5XX`). Includes the platform's 503s while the endpoint
|
|
254
|
+
* scales up for a sudden burst, not only your application's errors. The metric only exists once it's non-zero.
|
|
255
|
+
*/
|
|
256
|
+
metricServerErrors(props) {
|
|
257
|
+
return this.metric(metrics_1.SERVER_ERRORS, props);
|
|
258
|
+
}
|
|
259
|
+
/** The percentage of requests answered with a 4XX status (math expression; periods with no 4XX count as 0). */
|
|
260
|
+
metricClientErrorRate(props) {
|
|
261
|
+
return this.rate(metrics_1.CLIENT_ERRORS, 'Client error rate (%)', props);
|
|
262
|
+
}
|
|
263
|
+
/** The percentage of requests answered with a 5XX status (math expression; periods with no 5XX count as 0). */
|
|
264
|
+
metricServerErrorRate(props) {
|
|
265
|
+
return this.rate(metrics_1.SERVER_ERRORS, 'Server error rate (%)', props);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Execution environments serving the endpoint (`EndpointActiveEnvironments`), to compare with `maxEnvironments`.
|
|
269
|
+
*
|
|
270
|
+
* @default - maximum over 1 minute, in the home region
|
|
271
|
+
*/
|
|
272
|
+
metricActiveEnvironments(props) {
|
|
273
|
+
return this.usageMetric('EndpointActiveEnvironments', cloudwatch.Stats.MAXIMUM, props);
|
|
274
|
+
}
|
|
275
|
+
/** Requests rejected with 429 because the endpoint reached its `rateLimit` (`EndpointRequestThrottles`). */
|
|
276
|
+
metricRequestThrottles(props) {
|
|
277
|
+
return this.usageMetric('EndpointRequestThrottles', cloudwatch.Stats.SUM, props);
|
|
278
|
+
}
|
|
279
|
+
/** Requests rejected with 429 because the endpoint reached `maxEnvironments` (`EndpointActiveEnvironmentThrottles`). */
|
|
280
|
+
metricEnvironmentThrottles(props) {
|
|
281
|
+
return this.usageMetric('EndpointActiveEnvironmentThrottles', cloudwatch.Stats.SUM, props);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
|
|
285
|
+
* [disable-awslint:no-grants]
|
|
286
|
+
*/
|
|
287
|
+
grantInvoke(grantee) {
|
|
288
|
+
return this.grants.invoke(grantee);
|
|
289
|
+
}
|
|
290
|
+
metricIds() {
|
|
291
|
+
return { functionName: this.webFunction.webFunctionName, endpointName: this.endpointName };
|
|
292
|
+
}
|
|
293
|
+
rate(errorMetric, label, props) {
|
|
294
|
+
const period = props?.period ?? metrics_1.DEFAULT_PERIOD;
|
|
295
|
+
const options = { period, region: props?.region, account: props?.account };
|
|
296
|
+
return new cloudwatch.MathExpression({
|
|
297
|
+
expression: (0, metrics_1.rateExpression)(1),
|
|
298
|
+
usingMetrics: { requests: this.metric(metrics_1.REQUESTS, options), errors: this.metric(errorMetric, options) },
|
|
299
|
+
period,
|
|
300
|
+
label: props?.label ?? label,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
usageMetric(metricName, statistic, props) {
|
|
304
|
+
return new cloudwatch.Metric({
|
|
305
|
+
namespace: metrics_1.USAGE_NAMESPACE,
|
|
306
|
+
metricName,
|
|
307
|
+
dimensionsMap: { ...(0, metrics_1.endpointDimensions)(this.metricIds()), ExecutionRegion: props?.region ?? this.homeRegion },
|
|
308
|
+
statistic,
|
|
309
|
+
period: metrics_1.DEFAULT_PERIOD,
|
|
310
|
+
...props,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/** One alarm per threshold in every serving region: a CloudFormation alarm at home, a custom resource elsewhere. Returns their ARNs. */
|
|
314
|
+
createRollbackAlarms(rollback) {
|
|
315
|
+
const thresholds = [
|
|
316
|
+
{ key: 'ServerErrors', short: '5xx', metric: metrics_1.SERVER_ERRORS, status: '5XX', threshold: rollback.serverErrorRate },
|
|
317
|
+
{ key: 'ClientErrors', short: '4xx', metric: metrics_1.CLIENT_ERRORS, status: '4XX', threshold: rollback.clientErrorRate },
|
|
318
|
+
];
|
|
319
|
+
const arns = [];
|
|
320
|
+
for (const t of thresholds) {
|
|
321
|
+
if (t.threshold === undefined)
|
|
322
|
+
continue;
|
|
323
|
+
for (const region of this.regions) {
|
|
324
|
+
const description = `Rolls back deployments of endpoint ${this.endpointName} of ${this.webFunction.webFunctionName} when more than `
|
|
325
|
+
+ `${t.threshold}% of its requests in ${region} get a ${t.status} response (${rollback.evaluationPeriods} x ${rollback.period.toHumanString()}, `
|
|
326
|
+
+ `periods with fewer than ${rollback.minimumRequests} requests ignored).`;
|
|
327
|
+
if (region === this.homeRegion) {
|
|
328
|
+
const alarm = new cloudwatch.Alarm(this, `Rollback${t.key}`, {
|
|
329
|
+
metric: new cloudwatch.MathExpression({
|
|
330
|
+
expression: (0, metrics_1.rateExpression)(rollback.minimumRequests),
|
|
331
|
+
usingMetrics: {
|
|
332
|
+
requests: this.metric(metrics_1.REQUESTS, { period: rollback.period }),
|
|
333
|
+
errors: this.metric(t.metric, { period: rollback.period }),
|
|
334
|
+
},
|
|
335
|
+
period: rollback.period,
|
|
336
|
+
label: `${t.status} rate (%)`,
|
|
337
|
+
}),
|
|
338
|
+
threshold: t.threshold,
|
|
339
|
+
evaluationPeriods: rollback.evaluationPeriods,
|
|
340
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
341
|
+
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
342
|
+
alarmDescription: description,
|
|
343
|
+
});
|
|
344
|
+
this.rollbackAlarms.push(alarm);
|
|
345
|
+
arns.push(alarm.alarmArn);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
const alarm = new regional_alarm_1.RegionalAlarm(this, `Rollback${t.key}-${region}`, {
|
|
349
|
+
region,
|
|
350
|
+
alarmName: `${regional_alarm_1.ALARM_NAME_PREFIX}${this.webFunction.webFunctionName}-${this.endpointName}-${t.short}-rate`,
|
|
351
|
+
alarmDescription: description,
|
|
352
|
+
metrics: (0, metrics_1.rateAlarmQueries)(this.metricIds(), t.metric, rollback.period, rollback.minimumRequests),
|
|
353
|
+
threshold: t.threshold,
|
|
354
|
+
evaluationPeriods: rollback.evaluationPeriods,
|
|
355
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
356
|
+
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
357
|
+
});
|
|
358
|
+
this.rollbackAlarms.push(cloudwatch.Alarm.fromAlarmArn(this, `Rollback${t.key}-${region}-Ref`, alarm.alarmArn));
|
|
359
|
+
arns.push(alarm.alarmArn);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return arns;
|
|
364
|
+
}
|
|
134
365
|
}
|
|
135
366
|
exports.WebFunctionEndpoint = WebFunctionEndpoint;
|
|
136
367
|
function normaliseRegions(scope, endpointType, homeRegion, regions) {
|
|
@@ -156,9 +387,52 @@ function normaliseRegions(scope, endpointType, homeRegion, regions) {
|
|
|
156
387
|
}
|
|
157
388
|
return extra;
|
|
158
389
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
390
|
+
function validateRateLimit(scope, rateLimit) {
|
|
391
|
+
if (rateLimit === undefined || aws_cdk_lib_1.Token.isUnresolved(rateLimit))
|
|
392
|
+
return;
|
|
393
|
+
const allowed = rateLimit === 0
|
|
394
|
+
|| (rateLimit >= 100 && rateLimit <= 1000 && rateLimit % 100 === 0)
|
|
395
|
+
|| (rateLimit >= 2000 && rateLimit <= 10000 && rateLimit % 1000 === 0);
|
|
396
|
+
if (!allowed) {
|
|
397
|
+
throw new Error(`${scope.node.path}: rateLimit must be 0, 100-1,000 in steps of 100, or 2,000-10,000 in steps of 1,000, got ${rateLimit}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
function validateMaxEnvironments(scope, maxEnvironments) {
|
|
401
|
+
if (maxEnvironments === undefined || aws_cdk_lib_1.Token.isUnresolved(maxEnvironments))
|
|
402
|
+
return;
|
|
403
|
+
if (!Number.isInteger(maxEnvironments) || maxEnvironments < 2 || maxEnvironments > 10000) {
|
|
404
|
+
throw new Error(`${scope.node.path}: maxEnvironments must be an integer from 2 to 10,000, got ${maxEnvironments}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/** `primary` gets what `additional` leaves; weights are whole percentages summing to 100. */
|
|
408
|
+
function revisionWeights(scope, webFunction, primary, additional) {
|
|
409
|
+
for (const r of [primary, ...additional.map((a) => a.revision)]) {
|
|
410
|
+
if (r.webFunction !== webFunction) {
|
|
411
|
+
throw new Error(`${scope.node.path}: revision ${r.revisionId} belongs to another function`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (additional.length === 0) {
|
|
415
|
+
return [{ revisionId: primary.revisionId, weight: 100 }];
|
|
416
|
+
}
|
|
417
|
+
if (additional.length > 1) {
|
|
418
|
+
throw new Error(`${scope.node.path}: an endpoint routes to at most two revisions, so additionalRevisions takes one`);
|
|
419
|
+
}
|
|
420
|
+
const [{ revision, weight }] = additional;
|
|
421
|
+
const percent = Math.round(weight * 100);
|
|
422
|
+
if (aws_cdk_lib_1.Token.isUnresolved(weight) || Math.abs(weight * 100 - percent) > 1e-9 || percent < 1 || percent > 99) {
|
|
423
|
+
throw new Error(`${scope.node.path}: an additional revision's weight must be a whole percentage from 0.01 to 0.99, got ${weight}`);
|
|
424
|
+
}
|
|
425
|
+
if (revision === primary || (!aws_cdk_lib_1.Token.isUnresolved(revision.revisionId) && revision.revisionId === primary.revisionId)) {
|
|
426
|
+
throw new Error(`${scope.node.path}: the additional revision is the same as the endpoint's revision`);
|
|
427
|
+
}
|
|
428
|
+
return [{ revisionId: primary.revisionId, weight: 100 - percent }, { revisionId: revision.revisionId, weight: percent }];
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* `<prefix>-<hash>`, with the hash covering the endpoint type and regions: a type or region change produces
|
|
432
|
+
* a new name, so the replacement doesn't collide with the endpoint it replaces.
|
|
433
|
+
*/
|
|
434
|
+
function defaultEndpointName(prefix, seed, endpointType, extraRegions) {
|
|
435
|
+
const hash = (0, node_crypto_1.createHash)('sha256').update([...(seed !== undefined ? [seed] : []), endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
|
|
436
|
+
return `${prefix}-${hash}`;
|
|
163
437
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUFxRTtBQUNyRSwrREFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLG1DQUF1RTtBQUN2RSwrREFBMkQ7QUFDM0QscURBQXFGO0FBcURyRjs7OztHQUlHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUzs7SUFDaEQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDakYsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDJCQUEyQjtJQUNYLFlBQVksQ0FBUztJQUVyQywwQkFBMEI7SUFDVixXQUFXLENBQVM7SUFFcEMsOENBQThDO0lBQzlCLFlBQVksQ0FBMEI7SUFFdEQsMkdBQTJHO0lBQzNGLE9BQU8sQ0FBVztJQUVsQzs7T0FFRztJQUNhLFVBQVUsQ0FBUztJQUVuQzs7T0FFRztJQUNhLEdBQUcsQ0FBUztJQUVYLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQVM7SUFDckIsV0FBVyxDQUFTO0lBQzdCLE1BQU0sQ0FBa0I7SUFFaEMsWUFBb0IsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwrQkFBdUIsQ0FBQyxXQUFXLENBQUM7UUFDL0UsTUFBTSxZQUFZ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cnQgeyBBbm5vdGF0aW9ucywgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSwgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IEVuZHBvaW50TG9va3VwIH0gZnJvbSAnLi9wcml2YXRlL2VuZHBvaW50LWxvb2t1cCc7XG5pbXBvcnQgeyBDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFLCBhc3NlcnRSZXNvdXJjZU5hbWUgfSBmcm9tICcuL3ByaXZhdGUvdmFsaWRhdGlvbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBXZWIgRnVuY3Rpb24ncyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT05cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50VHlwZT86IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHRvIHNlcnZlIGZyb20gaW4gYWRkaXRpb24gdG8gdGhlIGhvbWUgcmVnaW9uICh0aGUgc3RhY2sncyByZWdpb24pLlxuICAgKiBSZXF1aXJlZCAoYXQgbGVhc3Qgb25lKSBmb3IgYE1VTFRJX1JFR0lPTmAgYW5kIGBQRVJfUkVHSU9OYDsgbXVzdCBiZSBlbXB0eSBmb3IgYEhPTUVfUkVHSU9OYC5cbiAgICpcbiAgICogQ2hhbmdpbmcgdGhpcyBjcmVhdGVzIGEgbmV3IGVuZHBvaW50IHdpdGggYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIHJlZ2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgbmFtZSwgc2hvd24gaW4gbG9ncyAoYGVuZHBvaW50TmFtZWApIGFuZCBpbiB0aGUgYGxhbWJkYS13ZWItZW5kcG9pbnQtbmFtZWAgaGVhZGVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGlzIGBkZWZhdWx0LTxoYXNoPmAsIHdpdGggdGhlIGhhc2ggY292ZXJpbmcgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnMsXG4gICAqIHNvIGNoYW5naW5nIGVpdGhlciBkZXBsb3lzIGEgbmV3IGVuZHBvaW50IGNsZWFubHkuIFdoZW4gc2V0LCBjaGFuZ2luZyB0aGUgZW5kcG9pbnQgdHlwZSBvclxuICAgKiByZWdpb25zIGFsc28gcmVxdWlyZXMgYSBuZXcgbmFtZTogdHdvIGVuZHBvaW50cyBvZiBvbmUgZnVuY3Rpb24gY2FuJ3Qgc2hhcmUgYSBuYW1lLCBhbmRcbiAgICogQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvbGQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBkZWZhdWx0LTxoYXNoIG9mIHR5cGUgYW5kIHJlZ2lvbnM+YFxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVybmFsOiBob3cgYFdlYkZ1bmN0aW9uYCBjcmVhdGVzIGl0cyBlbmRwb2ludC4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBMaXRlcmFsIG5hbWUgb2YgdGhlIFdlYiBGdW5jdGlvbiAodGhlIHByb3ZpZGVyJ3MgSUFNIG11c3Qgbm90IHJlZmVyZW5jZSByZXNvdXJjZSBhdHRyaWJ1dGVzKS4gKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBXZWIgRnVuY3Rpb24ncyBBUk4uICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIElEIG9mIHRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLiAqL1xuICByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIGFyZSBhdXRoZW50aWNhdGVkLiAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgSFRUUFMgZW5kcG9pbnQgb2YgYSBXZWIgRnVuY3Rpb24uIENyZWF0ZWQgYnkgYFdlYkZ1bmN0aW9uYDsgYWNjZXNzIGl0IGFzIGBmbi5lbmRwb2ludGAuXG4gKlxuICogT25seSBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgZW5kcG9pbnRzIGluIHRoaXMgdmVyc2lvbiAob25lIHBlciBmdW5jdGlvbiksIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbi4gVXNlZCBieSBgV2ViRnVuY3Rpb25gLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2NyZWF0ZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25FbmRwb2ludFByb3BzKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkVuZHBvaW50KHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRwb2ludCdzIG5hbWUuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKiogVGhlIGVuZHBvaW50J3MgQVJOLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRBcm46IHN0cmluZztcblxuICAvKiogV2hlcmUgdGhlIGVuZHBvaW50IHNlcnZlcyB0cmFmZmljIGZyb20uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG5cbiAgICBpZiAocHJvcHMuZW5kcG9pbnROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnZW5kcG9pbnROYW1lJywgcHJvcHMuZW5kcG9pbnROYW1lKTtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmV4cGxpY2l0RW5kcG9pbnROYW1lJyxcbiAgICAgICAgYGVuZHBvaW50TmFtZSAnJHtwcm9wcy5lbmRwb2ludE5hbWV9JyBpcyBzZXQgZXhwbGljaXRseTogY2hhbmdpbmcgZW5kcG9pbnRUeXBlIG9yIHJlZ2lvbnMgbGF0ZXIgYWxzbyByZXF1aXJlcyBhIG5ldyBlbmRwb2ludE5hbWUsIG90aGVyd2lzZSB0aGUgZGVwbG95bWVudCBmYWlscyB3aXRoIFwiYWxyZWFkeSBleGlzdHNcIiAodGhlIHN0YWNrIHJvbGxzIGJhY2sgc2FmZWx5KS4gT21pdCBlbmRwb2ludE5hbWUgdG8gZ2V0IGEgbmFtZSB0aGF0IGNoYW5nZXMgYXV0b21hdGljYWxseS5gKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhUeXBlID09PSBXZWJGdW5jdGlvbkF1dGhUeXBlLk5PTkUpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmF1dGhUeXBlTm9uZScsXG4gICAgICAgICdhdXRoVHlwZSBOT05FIG1ha2VzIHRoZSBlbmRwb2ludCBwdWJsaWM6IExhbWJkYSBkb2VzIG5vIGF1dGhlbnRpY2F0aW9uLCBzbyB5b3VyIGFwcGxpY2F0aW9uIG11c3QgYXV0aGVudGljYXRlIHJlcXVlc3RzIGl0c2VsZi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZHBvaW50VHlwZSA9IGVuZHBvaW50VHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gcHJvcHMuZnVuY3Rpb25OYW1lO1xuICAgIHRoaXMuZnVuY3Rpb25Bcm4gPSBwcm9wcy5mdW5jdGlvbkFybjtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMuZnVuY3Rpb25Bcm4sXG4gICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgZW5kcG9pbnRUeXBlLFxuICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgcmVnaW9uczogZXh0cmFSZWdpb25zLmxlbmd0aCA+IDAgPyBleHRyYVJlZ2lvbnMgOiB1bmRlZmluZWQsXG4gICAgICByZXZpc2lvbldlaWdodHM6IFt7IHJldmlzaW9uSWQ6IHByb3BzLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dLFxuICAgIH0pO1xuICAgIFZhbGlkYXRpb25zLm9mKHJlc291cmNlKS5hY2tub3dsZWRnZShDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFKTtcblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsVXJsKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLlBFUl9SRUdJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbmFsVXJsKCkgaXMgb25seSBhdmFpbGFibGUgZm9yIFBFUl9SRUdJT04gZW5kcG9pbnRzICh0aGlzIG9uZSBpcyAke3RoaXMuZW5kcG9pbnRUeXBlfSk7IHVzZSB1cmxgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXAgPz89IG5ldyBFbmRwb2ludExvb2t1cCh0aGlzLCAnTG9va3VwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50QXJuOiB0aGlzLmVuZHBvaW50QXJuLFxuICAgIH0pO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMubG9va3VwLnJlZ2lvbmFsRG9tYWluKHJlZ2lvbil9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpc2VSZWdpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGhvbWVSZWdpb246IHN0cmluZywgcmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhID0gWy4uLm5ldyBTZXQocmVnaW9ucyldLmZpbHRlcigocikgPT4gciAhPT0gaG9tZVJlZ2lvbikuc29ydCgpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZWdpb25zIG11c3QgYmUgbGl0ZXJhbCByZWdpb24gbmFtZXMsIGdvdCBhIHRva2VuYCk7XG4gICAgfVxuICAgIGlmICghL15bYS16XXsyfSgtW2Etel0rKSstXFxkJC8udGVzdChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICcke3J9JyBpcyBub3QgYSB2YWxpZCByZWdpb24gbmFtZWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTiAmJiBleHRyYS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmVzIG9ubHkgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KTsgdXNlIE1VTFRJX1JFR0lPTiBvciBQRVJfUkVHSU9OIHRvIGFkZCAke2V4dHJhLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGhvbWVSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50cyBuZWVkIGEgc3RhY2sgd2l0aCBhbiBleHBsaWNpdCByZWdpb24gKGVudi5yZWdpb24pYCk7XG4gICAgfVxuICAgIGlmIChleHRyYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludCBuZWVkcyBhdCBsZWFzdCBvbmUgcmVnaW9uIGJlc2lkZXMgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbi8qKiBgZGVmYXVsdC08aGFzaD5gOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlcyBhIG5ldyBuYW1lLCBzbyB0aGUgcmVwbGFjZW1lbnQgZG9lc24ndCBjb2xsaWRlLiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGBkZWZhdWx0LSR7aGFzaH1gO1xufVxuIl19
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUErRTtBQUMvRSx1RUFBeUQ7QUFFekQsK0RBQWlEO0FBQ2pELDJDQUF1QztBQUN2QyxtQ0FBdUU7QUFDdkUsK0RBQTJEO0FBQzNELCtDQUcyQjtBQUMzQiw2REFBNEU7QUFFNUUsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRTFDOzs7T0FHRztJQUNhLGNBQWMsR0FBd0IsRUFBRSxDQUFDO0lBRXhDLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQWU7SUFDMUIsUUFBUSxDQUFnQztJQUNqRCxPQUFPLENBQXlEO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDTixPQUFPLENBQVU7SUFDMUIsTUFBTSxDQUFrQjtJ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QyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBEdXJhdGlvbiwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7XG4gIENMSUVOVF9FUlJPUlMsIERFRkFVTFRfUEVSSU9ELCBSRVFVRVNUUywgU0VSVkVSX0VSUk9SUywgVVNBR0VfTkFNRVNQQUNFLCBXRUJfTkFNRVNQQUNFLFxuICBlbmRwb2ludERpbWVuc2lvbnMsIHJhdGVBbGFybVF1ZXJpZXMsIHJhdGVFeHByZXNzaW9uLFxufSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBBTEFSTV9OQU1FX1BSRUZJWCwgUmVnaW9uYWxBbGFybSB9IGZyb20gJy4vcHJpdmF0ZS9yZWdpb25hbC1hbGFybSc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi9wcml2YXRlL3JvbGxiYWNrJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyB0aGlzIGVuZHBvaW50IGNyZWF0ZWQgZm9yIGl0cyBkZXBsb3ltZW50J3MgYHJvbGxiYWNrT25gLCBvbmUgcGVyIHRocmVzaG9sZCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb21cbiAgICogKHRoZSBob21lIHJlZ2lvbidzIGZpcnN0KS4gRW1wdHkgd2l0aG91dCBgcm9sbGJhY2tPbmAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sbGJhY2tBbGFybXM6IGNsb3Vkd2F0Y2guSUFsYXJtW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludDtcbiAgcHJpdmF0ZSB3ZWlnaHRzOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W107XG4gIHByaXZhdGUgcm91dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JhZHVhbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb29rdXA/OiBFbmRwb2ludExvb2t1cDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaG9tZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBlbmRwb2ludFR5cGUgPSBwcm9wcy5lbmRwb2ludFR5cGUgPz8gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT047XG4gICAgY29uc3QgZXh0cmFSZWdpb25zID0gbm9ybWFsaXNlUmVnaW9ucyh0aGlzLCBlbmRwb2ludFR5cGUsIGhvbWVSZWdpb24sIHByb3BzLnJlZ2lvbnMgPz8gW10pO1xuICAgIHZhbGlkYXRlUmF0ZUxpbWl0KHRoaXMsIHByb3BzLnJhdGVMaW1pdCk7XG4gICAgdmFsaWRhdGVNYXhFbnZpcm9ubWVudHModGhpcywgcHJvcHMubWF4RW52aXJvbm1lbnRzKTtcblxuICAgIGlmIChwcm9wcy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBwcm9wcy5lbmRwb2ludE5hbWUpO1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6ZXhwbGljaXRFbmRwb2ludE5hbWUnLFxuICAgICAgICBgZW5kcG9pbnROYW1lICcke3Byb3BzLmVuZHBvaW50TmFtZX0nIGlzIHNldCBleHBsaWNpdGx5OiBjaGFuZ2luZyBlbmRwb2ludFR5cGUgb3IgcmVnaW9ucyBsYXRlciBhbHNvIHJlcXVpcmVzIGEgbmV3IGVuZHBvaW50TmFtZSwgb3RoZXJ3aXNlIHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXCJhbHJlYWR5IGV4aXN0c1wiICh0aGUgc3RhY2sgcm9sbHMgYmFjayBzYWZlbHkpLiBPbWl0IGVuZHBvaW50TmFtZSB0byBnZXQgYSBuYW1lIHRoYXQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LmApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aFR5cGUgPT09IFdlYkZ1bmN0aW9uQXV0aFR5cGUuTk9ORSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6YXV0aFR5cGVOb25lJyxcbiAgICAgICAgJ2F1dGhUeXBlIE5PTkUgbWFrZXMgdGhlIGVuZHBvaW50IHB1YmxpYzogTGFtYmRhIGRvZXMgbm8gYXV0aGVudGljYXRpb24sIHNvIHlvdXIgYXBwbGljYXRpb24gbXVzdCBhdXRoZW50aWNhdGUgcmVxdWVzdHMgaXRzZWxmLicpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRUeXBlID0gZW5kcG9pbnRUeXBlO1xuICAgIHRoaXMuYXV0aFR5cGUgPSBwcm9wcy5hdXRoVHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKHByb3BzLm5hbWVQcmVmaXgsIHByb3BzLm5hbWVTZWVkLCBlbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9ucyk7XG4gICAgdGhpcy5yZWdpb25zID0gW2hvbWVSZWdpb24sIC4uLmV4dHJhUmVnaW9uc107XG4gICAgdGhpcy5ob21lUmVnaW9uID0gaG9tZVJlZ2lvbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uID0gcHJvcHMud2ViRnVuY3Rpb247XG4gICAgdGhpcy53ZWlnaHRzID0gW3sgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludFR5cGUsXG4gICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMubGVuZ3RoID4gMCA/IGV4dHJhUmVnaW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHJldmlzaW9uV2VpZ2h0czogdGhpcy53ZWlnaHRzLFxuICAgICAgdGhyb3R0bGVDb25maWc6IHByb3BzLnJhdGVMaW1pdCAhPT0gdW5kZWZpbmVkID8geyByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCB9IDogdW5kZWZpbmVkLFxuICAgICAgc2NhbGluZ0NvbmZpZzogcHJvcHMubWF4RW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQgPyB7IG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmVzb3VyY2UpLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTtcblxuICAgIHRoaXMuZ3JhZHVhbCA9IHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsID8/IGZhbHNlO1xuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50Py5fZ3JhZHVhbCkge1xuICAgICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHdpdGggYSAke3Byb3BzLmRlcGxveW1lbnQuX2tpbmR9IGRlcGxveW1lbnQgYWx3YXlzIG1vdmVzIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOyBpdCBjYW4ndCBhbHNvIHNldCByZXZpc2lvbiBvciBhZGRpdGlvbmFsUmV2aXNpb25zYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xsYmFja0FsYXJtQXJucyA9IHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT24gPyB0aGlzLmNyZWF0ZVJvbGxiYWNrQWxhcm1zKHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT24pIDogW107XG4gICAgICBjb25zdCB3YWl0U2Vjb25kcyA9IHByb3BzLmRlcGxveW1lbnQuX3dhaXRTZWNvbmRzO1xuICAgICAgY29uc3Qgcm9sbGJhY2sgPSBwcm9wcy5kZXBsb3ltZW50Ll9yb2xsYmFja09uO1xuICAgICAgaWYgKHJvbGxiYWNrICYmIHdhaXRTZWNvbmRzIDwgcm9sbGJhY2sucGVyaW9kLnRvU2Vjb25kcygpICogcm9sbGJhY2suZXZhbHVhdGlvblBlcmlvZHMgKyAxMjApIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6cm9sbGJhY2tTbG93ZXJUaGFuU3RlcCcsXG4gICAgICAgICAgYHJvbGxiYWNrT24gbmVlZHMgJHtyb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kc30gcGVyaW9kKHMpIG9mICR7cm9sbGJhY2sucGVyaW9kLnRvSHVtYW5TdHJpbmcoKX0gcGx1cyBhYm91dCAyIG1pbnV0ZXMgb2YgQ2xvdWRXYXRjaCBkZWxheSB0byBmaXJlLCBsb25nZXIgdGhhbiBlYWNoICR7cHJvcHMuZGVwbG95bWVudC5fa2luZH0gc3RlcCAoJHtEdXJhdGlvbi5zZWNvbmRzKHdhaXRTZWNvbmRzKS50b0h1bWFuU3RyaW5nKCl9KTogYSBiYWQgcmV2aXNpb24gY2FuIHJlYWNoIHRoZSBuZXh0IHN0ZXAgYmVmb3JlIGl0cyBhbGFybSBmaXJlcy5gKTtcbiAgICAgIH1cbiAgICAgIC8vIE1vdmVzIHRoZSB0cmFmZmljIGluIHN0ZXBzIGJlZm9yZSBDbG91ZEZvcm1hdGlvbiB3cml0ZXMgdGhlIGVuZHBvaW50LCB3aGljaCB0aGVuIGZpbmRzIGl0IGFscmVhZHkgZG9uZS5cbiAgICAgIGNvbnN0IHNoaWZ0ID0gbmV3IFRyYWZmaWNTaGlmdCh0aGlzLCAnRGVwbG95bWVudCcsIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uQXJuOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgICAgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsXG4gICAgICAgIGRlcGxveW1lbnQ6IHByb3BzLmRlcGxveW1lbnQsXG4gICAgICAgIGFsYXJtQXJuczogcm9sbGJhY2tBbGFybUFybnMsXG4gICAgICAgIGVuZHBvaW50Q29uZmlnOiB7XG4gICAgICAgICAgZW5kcG9pbnRUeXBlLFxuICAgICAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcmVnaW9uczogZXh0cmFSZWdpb25zLFxuICAgICAgICAgIHJhdGVMaW1pdDogcHJvcHMucmF0ZUxpbWl0LFxuICAgICAgICAgIG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3koc2hpZnQpO1xuICAgICAgLy8gQWxhcm1zIGluIG90aGVyIHJlZ2lvbnMgYXJlIG9ubHkgcmVmZXJlbmNlZCBieSBBUk4uXG4gICAgICBmb3IgKGNvbnN0IGFsYXJtIG9mIHRoaXMubm9kZS5maW5kQWxsKCkuZmlsdGVyKChjKSA9PiBjIGluc3RhbmNlb2YgUmVnaW9uYWxBbGFybSkpIHNoaWZ0Lm5vZGUuYWRkRGVwZW5kZW5jeShhbGFybSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5yZXZpc2lvbiAhPT0gdW5kZWZpbmVkIHx8IHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb3V0ZVRyYWZmaWMocHJvcHMucmV2aXNpb24gPz8gcHJvcHMuY3VycmVudFJldmlzaW9uLCBwcm9wcy5hZGRpdGlvbmFsUmV2aXNpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZHBvaW50QXJuID0gcmVzb3VyY2UuYXR0ckVuZHBvaW50QXJuO1xuICAgIHRoaXMuZG9tYWluTmFtZSA9IHJlc291cmNlLmF0dHJEb21haW5OYW1lO1xuICAgIHRoaXMudXJsID0gYGh0dHBzOi8vJHtyZXNvdXJjZS5hdHRyRG9tYWluTmFtZX1gO1xuICAgIHRoaXMuZ3JhbnRzID0gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhpcyBlbmRwb2ludCBpbiBvbmUgcmVnaW9uLiBPbmx5IGZvciBgUEVSX1JFR0lPTmAgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnaW9uIG9uZSBvZiBgcmVnaW9uc2BcbiAgICovXG4gIHB1YmxpYyByZWdpb25hbFVybChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZWdpb25hbFVybCgpIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHt0aGlzLmVuZHBvaW50VHlwZX0pOyB1c2UgdXJsYCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5yZWdpb25zLmluY2x1ZGVzKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbiAke3JlZ2lvbn0gaXMgbm90IG9uZSBvZiB0aGUgZW5kcG9pbnQncyByZWdpb25zICgke3RoaXMucmVnaW9ucy5qb2luKCcsICcpfSlgKTtcbiAgICB9XG4gICAgaWYgKHJlZ2lvbiA9PT0gdGhpcy5ob21lUmVnaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuICAgIHRoaXMubG9va3VwID8/PSBuZXcgRW5kcG9pbnRMb29rdXAodGhpcywgJ0xvb2t1cCcsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludEFybjogdGhpcy5lbmRwb2ludEFybixcbiAgICB9KTtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmxvb2t1cC5yZWdpb25hbERvbWFpbihyZWdpb24pfWA7XG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIHRoZSBlbmRwb2ludCB0byBgcmV2aXNpb25gIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgb3B0aW9uYWxseSBzaGFyaW5nXG4gICAqIHRyYWZmaWMgd2l0aCBvbmUgbW9yZSByZXZpc2lvbiAoYGFkZGl0aW9uYWxSZXZpc2lvbnNgLCB3aGljaCBnZXRzIGl0cyB3ZWlnaHQ7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdCkuXG4gICAqXG4gICAqIFVzZSBpdCB0byBrZWVwIGFuIGVuZHBvaW50IG9uIGFuIGVhcmxpZXIgcmV2aXNpb24gKGBXZWJGdW5jdGlvblJldmlzaW9uLmZyb21SZXZpc2lvbkF0dHJpYnV0ZXNgKSxcbiAgICogb3IgdG8gc2VuZCBwYXJ0IG9mIHRoZSB0cmFmZmljIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOlxuICAgKiBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKHByZXZpb3VzLCBbeyByZXZpc2lvbjogZm4uY3VycmVudFJldmlzaW9uLCB3ZWlnaHQ6IDAuMSB9XSlgLlxuICAgKiBDYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGVuZHBvaW50LCBhbmQgbm90IG9uIG9uZSBjcmVhdGVkIHdpdGggYHJldmlzaW9uYCBvciBgYWRkaXRpb25hbFJldmlzaW9uc2AuXG4gICAqL1xuICBwdWJsaWMgcm91dGVUcmFmZmljKHJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbiwgYWRkaXRpb25hbFJldmlzaW9ucz86IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyYWR1YWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCBoYXMgYSBkZXBsb3ltZW50IGluIHN0ZXBzLCB3aGljaCBhbHdheXMgbW92ZXMgaXQgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IHJvdXRlVHJhZmZpYygpIGNhbid0IGJlIHVzZWQgd2l0aCBpdGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3V0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCdzIHJldmlzaW9ucyBhcmUgYWxyZWFkeSBzZXQgKHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zIG9yIHJvdXRlVHJhZmZpYylgKTtcbiAgICB9XG4gICAgdGhpcy53ZWlnaHRzID0gcmV2aXNpb25XZWlnaHRzKHRoaXMsIHRoaXMud2ViRnVuY3Rpb24sIHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zID8/IFtdKTtcbiAgICB0aGlzLnJlc291cmNlLnJldmlzaW9uV2VpZ2h0cyA9IHRoaXMud2VpZ2h0cztcbiAgICB0aGlzLnJvdXRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEcyBvZiB0aGUgcmV2aXNpb25zIHRoaXMgZW5kcG9pbnQgcm91dGVzIHRvLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmV2aXNpb25JZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLndlaWdodHMubWFwKCh3KSA9PiB3LnJldmlzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZW5kcG9pbnQgaW4gYEFXUy9MYW1iZGEvV2ViYCAoZGltZW5zaW9ucyBgRnVuY3Rpb25OYW1lYCBhbmQgYEVuZHBvaW50TmFtZWApLlxuICAgKlxuICAgKiBNZXRyaWNzIGFyZSBwdWJsaXNoZWQgaW4gdGhlIHJlZ2lvbiB0aGF0IHNlcnZlZCB0aGUgcmVxdWVzdDogcGFzcyBgcmVnaW9uYCBmb3Igb25lIG9mIHRoZSBlbmRwb2ludCdzXG4gICAqIG90aGVyIHJlZ2lvbnMuIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFdFQl9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyB0aGUgZW5kcG9pbnQgc2VydmVkIChgRXhlY3V0ZWRSZXF1ZXN0c2ApLiBUaGVyZSdzIG5vIHNlcGFyYXRlIGNvdW50IG9mIHN1Y2Nlc3NmdWwgKDJYWCkgcmVzcG9uc2VzLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFJFUVVFU1RTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDRYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczRYWGApLCBpbmNsdWRpbmcgNDI5cyBmcm9tIGByYXRlTGltaXRgIGFuZCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICogVGhlIG1ldHJpYyBvbmx5IGV4aXN0cyBvbmNlIGl0J3Mgbm9uLXplcm8sIHNvIGFsYXJtcyBzaG91bGQgdHJlYXQgbWlzc2luZyBkYXRhIGFzIG5vdCBicmVhY2hpbmcuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhDTElFTlRfRVJST1JTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDVYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczVYWGApLiBJbmNsdWRlcyB0aGUgcGxhdGZvcm0ncyA1MDNzIHdoaWxlIHRoZSBlbmRwb2ludFxuICAgKiBzY2FsZXMgdXAgZm9yIGEgc3VkZGVuIGJ1cnN0LCBub3Qgb25seSB5b3VyIGFwcGxpY2F0aW9uJ3MgZXJyb3JzLiBUaGUgbWV0cmljIG9ubHkgZXhpc3RzIG9uY2UgaXQncyBub24temVyby5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFNFUlZFUl9FUlJPUlMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGVyY2VudGFnZSBvZiByZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNFhYIHN0YXR1cyAobWF0aCBleHByZXNzaW9uOyBwZXJpb2RzIHdpdGggbm8gNFhYIGNvdW50IGFzIDApLiAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JSYXRlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZShDTElFTlRfRVJST1JTLCAnQ2xpZW50IGVycm9yIHJhdGUgKCUpJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIGFuc3dlcmVkIHdpdGggYSA1WFggc3RhdHVzIChtYXRoIGV4cHJlc3Npb247IHBlcmlvZHMgd2l0aCBubyA1WFggY291bnQgYXMgMCkuICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvclJhdGUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlKFNFUlZFUl9FUlJPUlMsICdTZXJ2ZXIgZXJyb3IgcmF0ZSAoJSknLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0aW9uIGVudmlyb25tZW50cyBzZXJ2aW5nIHRoZSBlbmRwb2ludCAoYEVuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRzYCksIHRvIGNvbXBhcmUgd2l0aCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBob21lIHJlZ2lvblxuICAgKi9cbiAgcHVibGljIG1ldHJpY0FjdGl2ZUVudmlyb25tZW50cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudHMnLCBjbG91ZHdhdGNoLlN0YXRzLk1BWElNVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGl0cyBgcmF0ZUxpbWl0YCAoYEVuZHBvaW50UmVxdWVzdFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdFRocm90dGxlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRSZXF1ZXN0VGhyb3R0bGVzJywgY2xvdWR3YXRjaC5TdGF0cy5TVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGBtYXhFbnZpcm9ubWVudHNgIChgRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljRW52aXJvbm1lbnRUaHJvdHRsZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMudXNhZ2VNZXRyaWMoJ0VuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRUaHJvdHRsZXMnLCBjbG91ZHdhdGNoLlN0YXRzLlNVTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGlzIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLmludm9rZShncmFudGVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0cmljSWRzKCkge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmF0ZShlcnJvck1ldHJpYzogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzPy5wZXJpb2QgPz8gREVGQVVMVF9QRVJJT0Q7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgcGVyaW9kLCByZWdpb246IHByb3BzPy5yZWdpb24sIGFjY291bnQ6IHByb3BzPy5hY2NvdW50IH07XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgIGV4cHJlc3Npb246IHJhdGVFeHByZXNzaW9uKDEpLFxuICAgICAgdXNpbmdNZXRyaWNzOiB7IHJlcXVlc3RzOiB0aGlzLm1ldHJpYyhSRVFVRVNUUywgb3B0aW9ucyksIGVycm9yczogdGhpcy5tZXRyaWMoZXJyb3JNZXRyaWMsIG9wdGlvbnMpIH0sXG4gICAgICBwZXJpb2QsXG4gICAgICBsYWJlbDogcHJvcHM/LmxhYmVsID8/IGxhYmVsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1c2FnZU1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHN0YXRpc3RpYzogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogVVNBR0VfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLCBFeGVjdXRpb25SZWdpb246IHByb3BzPy5yZWdpb24gPz8gdGhpcy5ob21lUmVnaW9uIH0sXG4gICAgICBzdGF0aXN0aWMsXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogT25lIGFsYXJtIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgc2VydmluZyByZWdpb246IGEgQ2xvdWRGb3JtYXRpb24gYWxhcm0gYXQgaG9tZSwgYSBjdXN0b20gcmVzb3VyY2UgZWxzZXdoZXJlLiBSZXR1cm5zIHRoZWlyIEFSTnMuICovXG4gIHByaXZhdGUgY3JlYXRlUm9sbGJhY2tBbGFybXMocm9sbGJhY2s6IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRocmVzaG9sZHMgPSBbXG4gICAgICB7IGtleTogJ1NlcnZlckVycm9ycycsIHNob3J0OiAnNXh4JywgbWV0cmljOiBTRVJWRVJfRVJST1JTLCBzdGF0dXM6ICc1WFgnLCB0aHJlc2hvbGQ6IHJvbGxiYWNrLnNlcnZlckVycm9yUmF0ZSB9LFxuICAgICAgeyBrZXk6ICdDbGllbnRFcnJvcnMnLCBzaG9ydDogJzR4eCcsIG1ldHJpYzogQ0xJRU5UX0VSUk9SUywgc3RhdHVzOiAnNFhYJywgdGhyZXNob2xkOiByb2xsYmFjay5jbGllbnRFcnJvclJhdGUgfSxcbiAgICBdO1xuICAgIGNvbnN0IGFybnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHRocmVzaG9sZHMpIHtcbiAgICAgIGlmICh0LnRocmVzaG9sZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHRoaXMucmVnaW9ucykge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGBSb2xscyBiYWNrIGRlcGxveW1lbnRzIG9mIGVuZHBvaW50ICR7dGhpcy5lbmRwb2ludE5hbWV9IG9mICR7dGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWV9IHdoZW4gbW9yZSB0aGFuIGBcbiAgICAgICAgICArIGAke3QudGhyZXNob2xkfSUgb2YgaXRzIHJlcXVlc3RzIGluICR7cmVnaW9ufSBnZXQgYSAke3Quc3RhdHVzfSByZXNwb25zZSAoJHtyb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kc30geCAke3JvbGxiYWNrLnBlcmlvZC50b0h1bWFuU3RyaW5nKCl9LCBgXG4gICAgICAgICAgKyBgcGVyaW9kcyB3aXRoIGZld2VyIHRoYW4gJHtyb2xsYmFjay5taW5pbXVtUmVxdWVzdHN9IHJlcXVlc3RzIGlnbm9yZWQpLmA7XG4gICAgICAgIGlmIChyZWdpb24gPT09IHRoaXMuaG9tZVJlZ2lvbikge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX1gLCB7XG4gICAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogcmF0ZUV4cHJlc3Npb24ocm9sbGJhY2subWluaW11bVJlcXVlc3RzKSxcbiAgICAgICAgICAgICAgdXNpbmdNZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHM6IHRoaXMubWV0cmljKFJFUVVFU1RTLCB7IHBlcmlvZDogcm9sbGJhY2sucGVyaW9kIH0pLFxuICAgICAgICAgICAgICAgIGVycm9yczogdGhpcy5tZXRyaWModC5tZXRyaWMsIHsgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlcmlvZDogcm9sbGJhY2sucGVyaW9kLFxuICAgICAgICAgICAgICBsYWJlbDogYCR7dC5zdGF0dXN9IHJhdGUgKCUpYCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0LnRocmVzaG9sZCxcbiAgICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGFsYXJtKTtcbiAgICAgICAgICBhcm5zLnB1c2goYWxhcm0uYWxhcm1Bcm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IFJlZ2lvbmFsQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX0tJHtyZWdpb259YCwge1xuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgYWxhcm1OYW1lOiBgJHtBTEFSTV9OQU1FX1BSRUZJWH0ke3RoaXMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25OYW1lfS0ke3RoaXMuZW5kcG9pbnROYW1lfS0ke3Quc2hvcnR9LXJhdGVgLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBtZXRyaWNzOiByYXRlQWxhcm1RdWVyaWVzKHRoaXMubWV0cmljSWRzKCksIHQubWV0cmljLCByb2xsYmFjay5wZXJpb2QsIHJvbGxiYWNrLm1pbmltdW1SZXF1ZXN0cyksXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHQudGhyZXNob2xkLFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHJvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGNsb3Vkd2F0Y2guQWxhcm0uZnJvbUFsYXJtQXJuKHRoaXMsIGBSb2xsYmFjayR7dC5rZXl9LSR7cmVnaW9ufS1SZWZgLCBhbGFybS5hbGFybUFybikpO1xuICAgICAgICAgIGFybnMucHVzaChhbGFybS5hbGFybUFybik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFybnM7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXNlUmVnaW9ucyhzY29wZTogQ29uc3RydWN0LCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBob21lUmVnaW9uOiBzdHJpbmcsIHJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRyYSA9IFsuLi5uZXcgU2V0KHJlZ2lvbnMpXS5maWx0ZXIoKHIpID0+IHIgIT09IGhvbWVSZWdpb24pLnNvcnQoKTtcbiAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmVnaW9ucyBtdXN0IGJlIGxpdGVyYWwgcmVnaW9uIG5hbWVzLCBnb3QgYSB0b2tlbmApO1xuICAgIH1cbiAgICBpZiAoIS9eW2Etel17Mn0oLVthLXpdKykrLVxcZCQvLnRlc3QocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiAnJHtyfScgaXMgbm90IGEgdmFsaWQgcmVnaW9uIG5hbWVgKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSA9PT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04gJiYgZXh0cmEubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZlcyBvbmx5IHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSk7IHVzZSBNVUxUSV9SRUdJT04gb3IgUEVSX1JFR0lPTiB0byBhZGQgJHtleHRyYS5qb2luKCcsICcpfWApO1xuICB9XG4gIGlmIChlbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChob21lUmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludHMgbmVlZCBhIHN0YWNrIHdpdGggYW4gZXhwbGljaXQgcmVnaW9uIChlbnYucmVnaW9uKWApO1xuICAgIH1cbiAgICBpZiAoZXh0cmEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSAke2VuZHBvaW50VHlwZX0gZW5kcG9pbnQgbmVlZHMgYXQgbGVhc3Qgb25lIHJlZ2lvbiBiZXNpZGVzIHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSlgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJhdGVMaW1pdChzY29wZTogQ29uc3RydWN0LCByYXRlTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAocmF0ZUxpbWl0ID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHJhdGVMaW1pdCkpIHJldHVybjtcbiAgY29uc3QgYWxsb3dlZCA9IHJhdGVMaW1pdCA9PT0gMFxuICAgIHx8IChyYXRlTGltaXQgPj0gMTAwICYmIHJhdGVMaW1pdCA8PSAxMDAwICYmIHJhdGVMaW1pdCAlIDEwMCA9PT0gMClcbiAgICB8fCAocmF0ZUxpbWl0ID49IDIwMDAgJiYgcmF0ZUxpbWl0IDw9IDEwMDAwICYmIHJhdGVMaW1pdCAlIDEwMDAgPT09IDApO1xuICBpZiAoIWFsbG93ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmF0ZUxpbWl0IG11c3QgYmUgMCwgMTAwLTEsMDAwIGluIHN0ZXBzIG9mIDEwMCwgb3IgMiwwMDAtMTAsMDAwIGluIHN0ZXBzIG9mIDEsMDAwLCBnb3QgJHtyYXRlTGltaXR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXhFbnZpcm9ubWVudHMoc2NvcGU6IENvbnN0cnVjdCwgbWF4RW52aXJvbm1lbnRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG1heEVudmlyb25tZW50cyA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChtYXhFbnZpcm9ubWVudHMpKSByZXR1cm47XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhFbnZpcm9ubWVudHMpIHx8IG1heEVudmlyb25tZW50cyA8IDIgfHwgbWF4RW52aXJvbm1lbnRzID4gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogbWF4RW52aXJvbm1lbnRzIG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDIgdG8gMTAsMDAwLCBnb3QgJHttYXhFbnZpcm9ubWVudHN9YCk7XG4gIH1cbn1cblxuLyoqIGBwcmltYXJ5YCBnZXRzIHdoYXQgYGFkZGl0aW9uYWxgIGxlYXZlczsgd2VpZ2h0cyBhcmUgd2hvbGUgcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAuICovXG5mdW5jdGlvbiByZXZpc2lvbldlaWdodHMoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24sXG4gIHByaW1hcnk6IElXZWJGdW5jdGlvblJldmlzaW9uLFxuICBhZGRpdGlvbmFsOiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W10sXG4pOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W10ge1xuICBmb3IgKGNvbnN0IHIgb2YgW3ByaW1hcnksIC4uLmFkZGl0aW9uYWwubWFwKChhKSA9PiBhLnJldmlzaW9uKV0pIHtcbiAgICBpZiAoci53ZWJGdW5jdGlvbiAhPT0gd2ViRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZXZpc2lvbiAke3IucmV2aXNpb25JZH0gYmVsb25ncyB0byBhbm90aGVyIGZ1bmN0aW9uYCk7XG4gICAgfVxuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbeyByZXZpc2lvbklkOiBwcmltYXJ5LnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucywgc28gYWRkaXRpb25hbFJldmlzaW9ucyB0YWtlcyBvbmVgKTtcbiAgfVxuICBjb25zdCBbeyByZXZpc2lvbiwgd2VpZ2h0IH1dID0gYWRkaXRpb25hbDtcbiAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQod2VpZ2h0ICogMTAwKTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh3ZWlnaHQpIHx8IE1hdGguYWJzKHdlaWdodCAqIDEwMCAtIHBlcmNlbnQpID4gMWUtOSB8fCBwZXJjZW50IDwgMSB8fCBwZXJjZW50ID4gOTkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gYWRkaXRpb25hbCByZXZpc2lvbidzIHdlaWdodCBtdXN0IGJlIGEgd2hvbGUgcGVyY2VudGFnZSBmcm9tIDAuMDEgdG8gMC45OSwgZ290ICR7d2VpZ2h0fWApO1xuICB9XG4gIGlmIChyZXZpc2lvbiA9PT0gcHJpbWFyeSB8fCAoIVRva2VuLmlzVW5yZXNvbHZlZChyZXZpc2lvbi5yZXZpc2lvbklkKSAmJiByZXZpc2lvbi5yZXZpc2lvbklkID09PSBwcmltYXJ5LnJldmlzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHRoZSBhZGRpdGlvbmFsIHJldmlzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBlbmRwb2ludCdzIHJldmlzaW9uYCk7XG4gIH1cbiAgcmV0dXJuIFt7IHJldmlzaW9uSWQ6IHByaW1hcnkucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgLSBwZXJjZW50IH0sIHsgcmV2aXNpb25JZDogcmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiBwZXJjZW50IH1dO1xufVxuXG4vKipcbiAqIGA8cHJlZml4Pi08aGFzaD5gLCB3aXRoIHRoZSBoYXNoIGNvdmVyaW5nIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlc1xuICogYSBuZXcgbmFtZSwgc28gdGhlIHJlcGxhY2VtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIHRoZSBlbmRwb2ludCBpdCByZXBsYWNlcy5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShwcmVmaXg6IHN0cmluZywgc2VlZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbLi4uKHNlZWQgIT09IHVuZGVmaW5lZCA/IFtzZWVkXSA6IFtdKSwgZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtoYXNofWA7XG59XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
2
|
import type { WebFunctionEndpoint } from './web-function-endpoint';
|
|
3
3
|
/**
|
|
4
|
-
* Grants on a Web Function. Access
|
|
4
|
+
* Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
|
|
5
5
|
*/
|
|
6
6
|
export declare class WebFunctionGrants {
|
|
7
7
|
private readonly endpoint;
|
|
@@ -11,7 +11,7 @@ export declare class WebFunctionGrants {
|
|
|
11
11
|
static _forEndpoint(endpoint: WebFunctionEndpoint): WebFunctionGrants;
|
|
12
12
|
private constructor();
|
|
13
13
|
/**
|
|
14
|
-
* Allows `grantee` to call the
|
|
14
|
+
* Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
|
|
15
15
|
*
|
|
16
16
|
* The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
|
|
17
17
|
* endpoint serves from, including a MULTI_REGION global URL.
|
|
@@ -37,11 +37,11 @@ exports.WebFunctionGrants = void 0;
|
|
|
37
37
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
38
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
39
|
/**
|
|
40
|
-
* Grants on a Web Function. Access
|
|
40
|
+
* Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
|
|
41
41
|
*/
|
|
42
42
|
class WebFunctionGrants {
|
|
43
43
|
endpoint;
|
|
44
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.
|
|
44
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.3" };
|
|
45
45
|
/**
|
|
46
46
|
* @internal
|
|
47
47
|
*/
|
|
@@ -52,7 +52,7 @@ class WebFunctionGrants {
|
|
|
52
52
|
this.endpoint = endpoint;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Allows `grantee` to call the
|
|
55
|
+
* Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
|
|
56
56
|
*
|
|
57
57
|
* The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
|
|
58
58
|
* endpoint serves from, including a MULTI_REGION global URL.
|
|
@@ -66,4 +66,4 @@ class WebFunctionGrants {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
exports.WebFunctionGrants = WebFunctionGrants;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQVFTOztJQVByQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBNkI7UUFDdEQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUFxQyxRQUE2QjtRQUE3QixhQUFRLEdBQVIsUUFBUSxDQUFxQjtJQUFHLENBQUM7SUFFdEU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0QkgsOENBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cyhlbmRwb2ludCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICovXG4gIHB1YmxpYyBpbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFsnbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnQnXSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuZW5kcG9pbnQuZW5kcG9pbnRBcm5dLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|