truemark-cdk-lib 1.29.0 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CfnServiceLinkedRole, Role } from 'aws-cdk-lib/aws-iam';
|
|
2
|
-
import { CfnAwsLogSource, CfnDataLake } from 'aws-cdk-lib/aws-securitylake';
|
|
2
|
+
import { CfnAwsLogSource, CfnDataLake, CfnSubscriber, CfnSubscriberNotification } from 'aws-cdk-lib/aws-securitylake';
|
|
3
3
|
import type { Construct } from 'constructs';
|
|
4
4
|
import { ExtendedConstruct, type ExtendedConstructProps } from '../../aws-cdk/index';
|
|
5
5
|
/**
|
|
@@ -116,6 +116,102 @@ export interface SecurityLakeReplicationProps {
|
|
|
116
116
|
*/
|
|
117
117
|
readonly destinationKmsKeyArns?: string[];
|
|
118
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* The AWS log sources a subscriber should receive. Each entry maps to the
|
|
121
|
+
* same `sourceName`/`sourceVersion` pair used when enabling the source.
|
|
122
|
+
*/
|
|
123
|
+
export interface SecurityLakeSubscriberSourceProps {
|
|
124
|
+
/**
|
|
125
|
+
* The source name, e.g. `CLOUD_TRAIL_MGMT`.
|
|
126
|
+
*/
|
|
127
|
+
readonly sourceName: AwsLogSourceName | string;
|
|
128
|
+
/**
|
|
129
|
+
* The source version.
|
|
130
|
+
*
|
|
131
|
+
* @default - '2.0'
|
|
132
|
+
*/
|
|
133
|
+
readonly sourceVersion?: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Properties for a Security Lake subscriber with S3-notification access.
|
|
137
|
+
* Only the `S3` access type (asynchronous SQS notification of new objects)
|
|
138
|
+
* is modelled; Lake Formation subscribers can be created directly against
|
|
139
|
+
* the underlying `CfnSubscriber` L1.
|
|
140
|
+
*
|
|
141
|
+
* @see https://docs.aws.amazon.com/security-lake/latest/userguide/subscriber-management.html
|
|
142
|
+
*/
|
|
143
|
+
export interface SecurityLakeSubscriberProps {
|
|
144
|
+
/**
|
|
145
|
+
* The friendly name of the subscriber.
|
|
146
|
+
*/
|
|
147
|
+
readonly subscriberName: string;
|
|
148
|
+
/**
|
|
149
|
+
* The AWS account id of the principal that will consume data (typically
|
|
150
|
+
* the SIEM / downstream account id).
|
|
151
|
+
*/
|
|
152
|
+
readonly principal: string;
|
|
153
|
+
/**
|
|
154
|
+
* External id the subscriber must present when assuming the
|
|
155
|
+
* Security-Lake-managed role. Treat as a shared secret.
|
|
156
|
+
*/
|
|
157
|
+
readonly externalId: string;
|
|
158
|
+
/**
|
|
159
|
+
* Log sources this subscriber receives. Each entry must correspond to a
|
|
160
|
+
* source that is enabled on the data lake.
|
|
161
|
+
*/
|
|
162
|
+
readonly sources: SecurityLakeSubscriberSourceProps[];
|
|
163
|
+
/**
|
|
164
|
+
* Optional human-readable description.
|
|
165
|
+
*
|
|
166
|
+
* @default - no description
|
|
167
|
+
*/
|
|
168
|
+
readonly description?: string;
|
|
169
|
+
/**
|
|
170
|
+
* Optional HTTPS endpoint for subscriber notifications. If omitted,
|
|
171
|
+
* Security Lake creates an SQS queue in the data-lake account and
|
|
172
|
+
* notifies the subscriber via SQS messages (recommended default — the
|
|
173
|
+
* SIEM polls the queue).
|
|
174
|
+
*
|
|
175
|
+
* When set, {@link httpsNotificationTargetRoleArn} is required.
|
|
176
|
+
*
|
|
177
|
+
* @default - SQS notification
|
|
178
|
+
*/
|
|
179
|
+
readonly httpsNotificationEndpoint?: string;
|
|
180
|
+
/**
|
|
181
|
+
* IAM role ARN EventBridge assumes to invoke the HTTPS endpoint when
|
|
182
|
+
* {@link httpsNotificationEndpoint} is set. The role must trust
|
|
183
|
+
* `events.amazonaws.com` and have `events:InvokeApiDestination`
|
|
184
|
+
* permissions. The AWS console provisions this helper role
|
|
185
|
+
* automatically when a subscriber is created through the UI, but the
|
|
186
|
+
* CloudFormation / API path does **not** — so a fresh account must
|
|
187
|
+
* create and pass this role explicitly, or Security Lake will reject
|
|
188
|
+
* the subscriber-notification create call.
|
|
189
|
+
*
|
|
190
|
+
* Ignored when {@link httpsNotificationEndpoint} is omitted.
|
|
191
|
+
*
|
|
192
|
+
* @default - none; required when `httpsNotificationEndpoint` is set
|
|
193
|
+
*/
|
|
194
|
+
readonly httpsNotificationTargetRoleArn?: string;
|
|
195
|
+
/**
|
|
196
|
+
* When set and the subscriber uses the default SQS notification path,
|
|
197
|
+
* the construct patches the Security-Lake-managed Main-Queue's
|
|
198
|
+
* `VisibilityTimeout` attribute to this value (seconds) via an
|
|
199
|
+
* `AwsCustomResource`. Needed because Security Lake auto-provisions
|
|
200
|
+
* the queue with a 300s visibility timeout, which is **less than** the
|
|
201
|
+
* default aes-siem es-loader Lambda timeout of 600s, causing the
|
|
202
|
+
* event-source-mapping create to be rejected with
|
|
203
|
+
* `"The event source mapping's function timeout must be smaller than
|
|
204
|
+
* or equal to the queue's visibility timeout"`.
|
|
205
|
+
*
|
|
206
|
+
* Set to a value `>=` your subscriber Lambda's timeout. 3600 is a
|
|
207
|
+
* safe default for aes-siem.
|
|
208
|
+
*
|
|
209
|
+
* Ignored when {@link httpsNotificationEndpoint} is set.
|
|
210
|
+
*
|
|
211
|
+
* @default - no patch; the queue keeps the Security-Lake-provisioned 300s
|
|
212
|
+
*/
|
|
213
|
+
readonly sqsVisibilityTimeoutSeconds?: number;
|
|
214
|
+
}
|
|
119
215
|
/**
|
|
120
216
|
* Properties for StandardSecurityLake.
|
|
121
217
|
*/
|
|
@@ -185,6 +281,14 @@ export interface StandardSecurityLakeProps extends ExtendedConstructProps {
|
|
|
185
281
|
* @default false
|
|
186
282
|
*/
|
|
187
283
|
readonly createLakeFormationServiceLinkedRole?: boolean;
|
|
284
|
+
/**
|
|
285
|
+
* Subscribers that should receive S3 notifications of new Security Lake
|
|
286
|
+
* objects. Each entry creates an `AWS::SecurityLake::Subscriber` (access
|
|
287
|
+
* type `S3`) plus an `AWS::SecurityLake::SubscriberNotification`.
|
|
288
|
+
*
|
|
289
|
+
* @default - no subscribers are created
|
|
290
|
+
*/
|
|
291
|
+
readonly subscribers?: SecurityLakeSubscriberProps[];
|
|
188
292
|
}
|
|
189
293
|
/**
|
|
190
294
|
* Standard Amazon Security Lake. Wraps the Security Lake L1 constructs to
|
|
@@ -219,5 +323,15 @@ export declare class StandardSecurityLake extends ExtendedConstruct {
|
|
|
219
323
|
* they were declared.
|
|
220
324
|
*/
|
|
221
325
|
readonly logSources: CfnAwsLogSource[];
|
|
326
|
+
/**
|
|
327
|
+
* The `CfnSubscriber` resources created by this construct, in the order
|
|
328
|
+
* they were declared.
|
|
329
|
+
*/
|
|
330
|
+
readonly subscribers: CfnSubscriber[];
|
|
331
|
+
/**
|
|
332
|
+
* The `CfnSubscriberNotification` resources created by this construct,
|
|
333
|
+
* one per subscriber, in the order they were declared.
|
|
334
|
+
*/
|
|
335
|
+
readonly subscriberNotifications: CfnSubscriberNotification[];
|
|
222
336
|
constructor(scope: Construct, id: string, props?: StandardSecurityLakeProps);
|
|
223
337
|
}
|
|
@@ -4,6 +4,7 @@ exports.StandardSecurityLake = exports.AwsLogSourceName = void 0;
|
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
6
6
|
const aws_securitylake_1 = require("aws-cdk-lib/aws-securitylake");
|
|
7
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
7
8
|
const index_1 = require("../../aws-cdk/index");
|
|
8
9
|
/**
|
|
9
10
|
* The AWS-native log sources that Amazon Security Lake can ingest.
|
|
@@ -31,13 +32,23 @@ var AwsLogSourceName;
|
|
|
31
32
|
*/
|
|
32
33
|
class StandardSecurityLake extends index_1.ExtendedConstruct {
|
|
33
34
|
constructor(scope, id, props) {
|
|
34
|
-
var _a, _b, _c, _d;
|
|
35
|
+
var _a, _b, _c, _d, _e;
|
|
35
36
|
super(scope, id, props);
|
|
36
37
|
/**
|
|
37
38
|
* The `CfnAwsLogSource` resources created by this construct, in the order
|
|
38
39
|
* they were declared.
|
|
39
40
|
*/
|
|
40
41
|
this.logSources = [];
|
|
42
|
+
/**
|
|
43
|
+
* The `CfnSubscriber` resources created by this construct, in the order
|
|
44
|
+
* they were declared.
|
|
45
|
+
*/
|
|
46
|
+
this.subscribers = [];
|
|
47
|
+
/**
|
|
48
|
+
* The `CfnSubscriberNotification` resources created by this construct,
|
|
49
|
+
* one per subscriber, in the order they were declared.
|
|
50
|
+
*/
|
|
51
|
+
this.subscriberNotifications = [];
|
|
41
52
|
// Optional Lake Formation service-linked role. Security Lake requires
|
|
42
53
|
// this SLR to exist in the account before a data lake can be created.
|
|
43
54
|
if (props === null || props === void 0 ? void 0 : props.createLakeFormationServiceLinkedRole) {
|
|
@@ -260,7 +271,123 @@ class StandardSecurityLake extends index_1.ExtendedConstruct {
|
|
|
260
271
|
previous = logSource;
|
|
261
272
|
this.logSources.push(logSource);
|
|
262
273
|
}
|
|
274
|
+
// Subscribers. Each entry becomes a `CfnSubscriber` with `accessTypes:
|
|
275
|
+
// ['S3']` plus a sibling `CfnSubscriberNotification`. The notification
|
|
276
|
+
// defaults to SQS (Security Lake creates the queue in this account);
|
|
277
|
+
// callers can switch to HTTPS by passing `httpsNotificationEndpoint`.
|
|
278
|
+
for (const sub of (_e = props === null || props === void 0 ? void 0 : props.subscribers) !== null && _e !== void 0 ? _e : []) {
|
|
279
|
+
const subscriber = new aws_securitylake_1.CfnSubscriber(this, `Subscriber${sub.subscriberName}`, {
|
|
280
|
+
accessTypes: ['S3'],
|
|
281
|
+
dataLakeArn: this.dataLake.attrArn,
|
|
282
|
+
subscriberName: sub.subscriberName,
|
|
283
|
+
subscriberDescription: sub.description,
|
|
284
|
+
subscriberIdentity: {
|
|
285
|
+
externalId: sub.externalId,
|
|
286
|
+
principal: sub.principal,
|
|
287
|
+
},
|
|
288
|
+
sources: sub.sources.map((s) => {
|
|
289
|
+
var _a;
|
|
290
|
+
return ({
|
|
291
|
+
awsLogSource: {
|
|
292
|
+
sourceName: s.sourceName,
|
|
293
|
+
sourceVersion: (_a = s.sourceVersion) !== null && _a !== void 0 ? _a : '2.0',
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
}),
|
|
297
|
+
});
|
|
298
|
+
subscriber.addDependency(this.dataLake);
|
|
299
|
+
// Subscriber creation requires the AwsLogSource to exist for every
|
|
300
|
+
// source it references; chain through the last log source we created
|
|
301
|
+
// so CFN waits for ingestion to be enabled.
|
|
302
|
+
for (const ls of this.logSources) {
|
|
303
|
+
subscriber.addDependency(ls);
|
|
304
|
+
}
|
|
305
|
+
this.subscribers.push(subscriber);
|
|
306
|
+
if (sub.httpsNotificationEndpoint &&
|
|
307
|
+
!sub.httpsNotificationTargetRoleArn) {
|
|
308
|
+
throw new Error(`StandardSecurityLake: subscriber "${sub.subscriberName}" sets ` +
|
|
309
|
+
'`httpsNotificationEndpoint` but no ' +
|
|
310
|
+
'`httpsNotificationTargetRoleArn`. The CloudFormation/API path ' +
|
|
311
|
+
'does not auto-provision the EventBridge invocation role (only ' +
|
|
312
|
+
'the AWS console does). Create a role trusted by ' +
|
|
313
|
+
'`events.amazonaws.com` with `events:InvokeApiDestination` on ' +
|
|
314
|
+
'the target endpoint and pass its ARN as ' +
|
|
315
|
+
'`httpsNotificationTargetRoleArn`.');
|
|
316
|
+
}
|
|
317
|
+
const notification = new aws_securitylake_1.CfnSubscriberNotification(this, `SubscriberNotification${sub.subscriberName}`, {
|
|
318
|
+
subscriberArn: subscriber.attrSubscriberArn,
|
|
319
|
+
notificationConfiguration: sub.httpsNotificationEndpoint
|
|
320
|
+
? {
|
|
321
|
+
httpsNotificationConfiguration: {
|
|
322
|
+
endpoint: sub.httpsNotificationEndpoint,
|
|
323
|
+
targetRoleArn: sub.httpsNotificationTargetRoleArn,
|
|
324
|
+
},
|
|
325
|
+
}
|
|
326
|
+
: {
|
|
327
|
+
sqsNotificationConfiguration: {},
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
notification.addDependency(subscriber);
|
|
331
|
+
this.subscriberNotifications.push(notification);
|
|
332
|
+
// Patch the Security-Lake-managed SQS Main-Queue's visibility
|
|
333
|
+
// timeout. Needed because Security Lake auto-provisions the queue
|
|
334
|
+
// with 300s, less than the aes-siem es-loader Lambda timeout (600s
|
|
335
|
+
// default), causing event-source-mapping creation to fail with
|
|
336
|
+
// "The event source mapping's function timeout must be smaller
|
|
337
|
+
// than or equal to the queue's visibility timeout."
|
|
338
|
+
if (!sub.httpsNotificationEndpoint &&
|
|
339
|
+
sub.sqsVisibilityTimeoutSeconds !== undefined) {
|
|
340
|
+
const timeout = sub.sqsVisibilityTimeoutSeconds;
|
|
341
|
+
const stack = aws_cdk_lib_1.Stack.of(this);
|
|
342
|
+
// The notification resource returns the queue ARN via
|
|
343
|
+
// `SubscriberEndpoint`. Convert to a queue URL for the SQS SDK.
|
|
344
|
+
// ARN: arn:<partition>:sqs:<region>:<account>:<name>
|
|
345
|
+
// URL: https://sqs.<region>.<url-suffix>/<account>/<name>
|
|
346
|
+
//
|
|
347
|
+
// The URL suffix is partition-aware (`amazonaws.com`,
|
|
348
|
+
// `amazonaws.com.cn`, `c2s.ic.gov`, etc.); hard-coding
|
|
349
|
+
// `amazonaws.com` breaks `aws-cn` and GovCloud. Use the stack's
|
|
350
|
+
// `urlSuffix` token so CloudFormation substitutes the right
|
|
351
|
+
// value at deploy time.
|
|
352
|
+
const queueName = aws_cdk_lib_1.Fn.select(5, aws_cdk_lib_1.Fn.split(':', notification.attrSubscriberEndpoint));
|
|
353
|
+
const queueUrl = `https://sqs.${stack.region}.${stack.urlSuffix}/${stack.account}/${queueName}`;
|
|
354
|
+
const patch = new custom_resources_1.AwsCustomResource(this, `SubscriberQueueVisibilityPatch${sub.subscriberName}`, {
|
|
355
|
+
onCreate: {
|
|
356
|
+
service: 'SQS',
|
|
357
|
+
action: 'setQueueAttributes',
|
|
358
|
+
parameters: {
|
|
359
|
+
QueueUrl: queueUrl,
|
|
360
|
+
Attributes: { VisibilityTimeout: timeout.toString() },
|
|
361
|
+
},
|
|
362
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${sub.subscriberName}-visibility-${timeout}`),
|
|
363
|
+
},
|
|
364
|
+
onUpdate: {
|
|
365
|
+
service: 'SQS',
|
|
366
|
+
action: 'setQueueAttributes',
|
|
367
|
+
parameters: {
|
|
368
|
+
QueueUrl: queueUrl,
|
|
369
|
+
Attributes: { VisibilityTimeout: timeout.toString() },
|
|
370
|
+
},
|
|
371
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${sub.subscriberName}-visibility-${timeout}`),
|
|
372
|
+
},
|
|
373
|
+
policy: custom_resources_1.AwsCustomResourcePolicy.fromStatements([
|
|
374
|
+
new aws_iam_1.PolicyStatement({
|
|
375
|
+
actions: ['sqs:SetQueueAttributes'],
|
|
376
|
+
// Scope to the exact queue ARN exposed by the
|
|
377
|
+
// SubscriberNotification resource
|
|
378
|
+
// (`attrSubscriberEndpoint`), which is already an SQS
|
|
379
|
+
// ARN. Using the token means CloudFormation substitutes
|
|
380
|
+
// the real queue ARN at deploy-time, so the custom-
|
|
381
|
+
// resource role cannot be abused to modify unrelated
|
|
382
|
+
// queues in the account.
|
|
383
|
+
resources: [notification.attrSubscriberEndpoint],
|
|
384
|
+
}),
|
|
385
|
+
]),
|
|
386
|
+
});
|
|
387
|
+
patch.node.addDependency(notification);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
263
390
|
}
|
|
264
391
|
}
|
|
265
392
|
exports.StandardSecurityLake = StandardSecurityLake;
|
|
266
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtc2VjdXJpdHktbGFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3Mtc2VjdXJpdHlsYWtlL2xpYi9zdGFuZGFyZC1zZWN1cml0eS1sYWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRDtBQUNqRCxpREFPNkI7QUFDN0IsbUVBQTBFO0FBRTFFLCtDQUc2QjtBQUU3Qjs7OztHQUlHO0FBQ0gsSUFBWSxnQkFTWDtBQVRELFdBQVksZ0JBQWdCO0lBQzFCLHlEQUFxQyxDQUFBO0lBQ3JDLHlEQUFxQyxDQUFBO0lBQ3JDLHVDQUFtQixDQUFBO0lBQ25CLHVDQUFtQixDQUFBO0lBQ25CLCtDQUEyQixDQUFBO0lBQzNCLHlDQUFxQixDQUFBO0lBQ3JCLDJDQUF1QixDQUFBO0lBQ3ZCLCtCQUFXLENBQUE7QUFDYixDQUFDLEVBVFcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFTM0I7QUE2TEQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsb0JBQXFCLFNBQVEseUJBQWlCO0lBOEJ6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWlDOztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQVAxQjs7O1dBR0c7UUFDTSxlQUFVLEdBQXNCLEVBQUUsQ0FBQztRQUsxQyxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLG9DQUFvQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksOEJBQW9CLENBQzVELElBQUksRUFDSixnQ0FBZ0MsRUFDaEM7Z0JBQ0UsY0FBYyxFQUFFLDZCQUE2QjtnQkFDN0MsV0FBVyxFQUNULHFIQUFxSDthQUN4SCxDQUNGLENBQUM7WUFDRixvRUFBb0U7WUFDcEUsc0RBQXNEO1lBQ3RELG1FQUFtRTtZQUNuRSxnRUFBZ0U7WUFDaEUsSUFB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QyxDQUFDLE9BQU8sQ0FBQzthQUN0RCxDQUNGLENBQUM7WUFDRixTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUNELFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTNTRCxvREEyU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBDZm5TZXJ2aWNlTGlua2VkUm9sZSxcbiAgTWFuYWdlZFBvbGljeSxcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge0NmbkF3c0xvZ1NvdXJjZSwgQ2ZuRGF0YUxha2V9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWN1cml0eWxha2UnO1xuaW1wb3J0IHR5cGUge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBFeHRlbmRlZENvbnN0cnVjdCxcbiAgdHlwZSBFeHRlbmRlZENvbnN0cnVjdFByb3BzLFxufSBmcm9tICcuLi8uLi9hd3MtY2RrL2luZGV4JztcblxuLyoqXG4gKiBUaGUgQVdTLW5hdGl2ZSBsb2cgc291cmNlcyB0aGF0IEFtYXpvbiBTZWN1cml0eSBMYWtlIGNhbiBpbmdlc3QuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHktbGFrZS9sYXRlc3QvdXNlcmd1aWRlL2ludGVybmFsLXNvdXJjZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBBd3NMb2dTb3VyY2VOYW1lIHtcbiAgQ0xPVURfVFJBSUxfTUdNVCA9ICdDTE9VRF9UUkFJTF9NR01UJyxcbiAgTEFNQkRBX0VYRUNVVElPTiA9ICdMQU1CREFfRVhFQ1VUSU9OJyxcbiAgUk9VVEU1MyA9ICdST1VURTUzJyxcbiAgUzNfREFUQSA9ICdTM19EQVRBJyxcbiAgU0hfRklORElOR1MgPSAnU0hfRklORElOR1MnLFxuICBWUENfRkxPVyA9ICdWUENfRkxPVycsXG4gIEVLU19BVURJVCA9ICdFS1NfQVVESVQnLFxuICBXQUYgPSAnV0FGJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBpbmRpdmlkdWFsIEFXUyBsb2cgc291cmNlIHRvIGVuYWJsZSBvbiB0aGUgZGF0YSBsYWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0xvZ1NvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBV1MgbG9nIHNvdXJjZSB0byBlbmFibGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VOYW1lOiBBd3NMb2dTb3VyY2VOYW1lIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgQVdTIGxvZyBzb3VyY2UgdG8gZW5hYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtICcyLjAnXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnRzIHdob3NlIGRhdGEgc2hvdWxkIGJlIGNvbGxlY3RlZCBmb3IgdGhpcyBzb3VyY2UuIElmIG5vdFxuICAgKiBwcm92aWRlZCwgdGhlIGRhdGEgbGFrZSBvd25lciBhY2NvdW50IGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW1N0YWNrLm9mKHRoaXMpLmFjY291bnRdXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIExpZmVjeWNsZSB0cmFuc2l0aW9uIGZvciBTZWN1cml0eSBMYWtlIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlMYWtlVHJhbnNpdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgZGF0YSB0cmFuc2l0aW9ucyB0byB0aGUgZ2l2ZW4gc3RvcmFnZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGRheXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBTMyBzdG9yYWdlIGNsYXNzLiBTdXBwb3J0ZWQgdmFsdWVzIGluY2x1ZGUgYFNUQU5EQVJEX0lBYCxcbiAgICogYE9ORVpPTkVfSUFgLCBgSU5URUxMSUdFTlRfVElFUklOR2AsIGBHTEFDSUVSX0lSYCwgYEdMQUNJRVJgIGFuZFxuICAgKiBgREVFUF9BUkNISVZFYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VDbGFzczogc3RyaW5nO1xufVxuXG4vKipcbiAqIExpZmVjeWNsZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFNlY3VyaXR5IExha2UgbWFuYWdlZCBTMyBzdG9yYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5TGFrZUxpZmVjeWNsZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgU2VjdXJpdHkgTGFrZSBkYXRhIGlzIGV4cGlyZWQvZGVsZXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkYXRhIGlzIHJldGFpbmVkIGluZGVmaW5pdGVseVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwaXJhdGlvbkRheXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb25zIGFwcGxpZWQgdG8gU2VjdXJpdHkgTGFrZSBkYXRhLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRyYW5zaXRpb25zXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0aW9ucz86IFNlY3VyaXR5TGFrZVRyYW5zaXRpb25Qcm9wc1tdO1xufVxuXG4vKipcbiAqIFJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIFNlY3VyaXR5IExha2UgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eUxha2VSZXBsaWNhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIE9uZSBvciBtb3JlIHJvbGx1cCBSZWdpb25zIHRvIHJlcGxpY2F0ZSBkYXRhIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIElBTSByb2xlIFNlY3VyaXR5IExha2UgdXNlcyB0byByZXBsaWNhdGUgb2JqZWN0cy4gSWYgbm90XG4gICAqIHByb3ZpZGVkLCBhIHJvbGUgd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuZXcgcm9sZSBpcyBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgZW5jcnlwdGluZyB0aGUgc291cmNlXG4gICAqIChvcmlnaW5hdGluZy1SZWdpb24pIFNlY3VyaXR5IExha2UgYnVja2V0LiBSZXF1aXJlZCB3aGVuIHRoZSBlbmNsb3NpbmdcbiAgICogYFN0YW5kYXJkU2VjdXJpdHlMYWtlYCBpcyBjb25maWd1cmVkIHdpdGggYSBjdXN0b21lci1tYW5hZ2VkIGBrbXNLZXlJZGBcbiAgICogYW5kIHRoaXMgY29uc3RydWN0IGNyZWF0ZXMgdGhlIHJlcGxpY2F0aW9uIHJvbGUgKGkuZS4gd2hlbiBgcm9sZUFybmBcbiAgICogaXMgbm90IHByb3ZpZGVkKTsgUzMgbmVlZHMgYGttczpEZWNyeXB0YCBvbiB0aGlzIGtleSB0byByZWFkIG9iamVjdHNcbiAgICogYmVmb3JlIHJlcGxpY2F0aW5nIHRoZW0uIE5vdCByZXF1aXJlZCB3aGVuIHRoZSBzb3VyY2UgYnVja2V0IHVzZXNcbiAgICogUzMtbWFuYWdlZCBvciBBV1MtbWFuYWdlZCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGBkZXN0aW5hdGlvbkttc0tleUFybnNgOiBTZWN1cml0eSBMYWtlIHJvbGx1cFxuICAgKiBSZWdpb25zIG1heSB1c2UgdGhlaXIgb3duIGVuY3J5cHRpb24gc2V0dGluZ3MsIHNvIGEgQ01LIHNvdXJjZSBjYW5cbiAgICogcmVwbGljYXRlIHRvIGFuIFNTRS1TMyByb2xsdXAgYW5kIHZpY2UgdmVyc2EuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gS01TIGRlY3J5cHQgc3RhdGVtZW50IGlzIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VLbXNLZXlBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk5zIG9mIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXlzIGVuY3J5cHRpbmcgdGhlIGRlc3RpbmF0aW9uXG4gICAqIChyb2xsdXAtUmVnaW9uKSBTZWN1cml0eSBMYWtlIGJ1Y2tldHMuIFN1cHBseSB3aGVuIGFueSByb2xsdXAgUmVnaW9uJ3NcbiAgICogYnVja2V0IHVzZXMgYSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgc28gdGhlIHJlcGxpY2F0aW9uIHJvbGUgY2FuXG4gICAqIGBrbXM6RW5jcnlwdGAgLyBga21zOkdlbmVyYXRlRGF0YUtleWAgYWdhaW5zdCB0aGVtLiBOb3QgcmVxdWlyZWQgd2hlblxuICAgKiBldmVyeSByb2xsdXAgYnVja2V0IHVzZXMgUzMtbWFuYWdlZCBvciBBV1MtbWFuYWdlZCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGBzb3VyY2VLbXNLZXlBcm5gIGFuZCB0aGUgc291cmNlIGxha2Unc1xuICAgKiBga21zS2V5SWRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIEtNUyBlbmNyeXB0IHN0YXRlbWVudCBpcyBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25LbXNLZXlBcm5zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgU3RhbmRhcmRTZWN1cml0eUxha2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhcmRTZWN1cml0eUxha2VQcm9wcyBleHRlbmRzIEV4dGVuZGVkQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIEtNUyBrZXkgaWQgdG8gdXNlIHRvIGVuY3J5cHQgZGF0YSBzdG9yZWQgYnkgU2VjdXJpdHkgTGFrZS4gVXNlIHRoZVxuICAgKiBsaXRlcmFsIHN0cmluZyBgUzNfTUFOQUdFRF9LRVlgIHRvIHVzZSBTMyBtYW5hZ2VkIGtleXMgKFNTRS1TMykuIE9taXQgdG9cbiAgICogbGV0IFNlY3VyaXR5IExha2UgdXNlIGl0cyBkZWZhdWx0IG1hbmFnZWQga2V5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlY3VyaXR5IExha2UgbWFuYWdlZCBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBrbXNLZXlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB1c2VkIGJ5IFNlY3VyaXR5IExha2UgdG8gbWFuYWdlIHRoZSBBV1MgR2x1ZVxuICAgKiBtZXRhc3RvcmUuIElmIG9taXR0ZWQsIGEgcm9sZSBpcyBjcmVhdGVkIHdpdGggdGhlXG4gICAqIGBBbWF6b25TZWN1cml0eUxha2VNZXRhc3RvcmVNYW5hZ2VyYCBBV1MgbWFuYWdlZCBwb2xpY3kgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSByb2xlIGlzIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IFNlY3VyaXR5IExha2VcbiAgICogZGF0YS4gUmVxdWlyZWQgd2hlbiBga21zS2V5SWRgIGlzIHNldCB0byBhIGN1c3RvbWVyLW1hbmFnZWQga2V5IGFuZCB0aGlzXG4gICAqIGNvbnN0cnVjdCBjcmVhdGVzIHRoZSBtZXRhc3RvcmUgbWFuYWdlciByb2xlIChpLmUuIHdoZW5cbiAgICogYG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuYCBpcyBub3QgcHJvdmlkZWQpLiBUaGUgbWV0YXN0b3JlIG1hbmFnZXJcbiAgICogTGFtYmRhIG11c3QgZGVjcnlwdCBhbmQgKHJlKWVuY3J5cHQgU2VjdXJpdHkgTGFrZSBtZXRhZGF0YTsgdGhlIEFXU1xuICAgKiBtYW5hZ2VkIHBvbGljeSBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YXN0b3JlTWFuYWdlcmAgZG9lcyBub3QgaW5jbHVkZVxuICAgKiBLTVMgcGVybWlzc2lvbnMsIHNvIHdpdGhvdXQgdGhpcyBncmFudCB0aGUgc3RhY2sgZGVwbG95cyBidXQgcGFydGl0aW9uXG4gICAqIHVwZGF0ZXMgYW5kIHN1YnNjcmliZXIgcXVlcmllcyBzaWxlbnRseSBmYWlsLiBOb3QgcmVxdWlyZWQgd2hlblxuICAgKiBga21zS2V5SWRgIGlzIHVuc2V0IG9yIHNldCB0byBgUzNfTUFOQUdFRF9LRVlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIEtNUyBzdGF0ZW1lbnQgaXMgYWRkZWQgKHN1ZmZpY2llbnQgd2hlbiB0aGUgZGF0YSBsYWtlXG4gICAqIHVzZXMgU2VjdXJpdHkgTGFrZSBkZWZhdWx0cyBvciBTU0UtUzMpXG4gICAqL1xuICByZWFkb25seSBtZXRhU3RvcmVNYW5hZ2VyS21zS2V5QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFNlY3VyaXR5IExha2UgbWFuYWdlZCBTMyBzdG9yYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlY3VyaXR5IExha2UgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZT86IFNlY3VyaXR5TGFrZUxpZmVjeWNsZVByb3BzO1xuXG4gIC8qKlxuICAgKiBSZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgU2VjdXJpdHkgTGFrZSBtYW5hZ2VkIFMzIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2F0aW9uPzogU2VjdXJpdHlMYWtlUmVwbGljYXRpb25Qcm9wcztcblxuICAvKipcbiAgICogVGhlIEFXUyBuYXRpdmUgbG9nIHNvdXJjZXMgdG8gZW5hYmxlIG9uIHRoZSBkYXRhIGxha2UuIFNvdXJjZXMgYXJlXG4gICAqIGNyZWF0ZWQgc2VxdWVudGlhbGx5IHVzaW5nIGBEZXBlbmRzT25gIGFzIHJlcXVpcmVkIGJ5IFNlY3VyaXR5IExha2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbG9nIHNvdXJjZXMgYXJlIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1NvdXJjZXM/OiBBd3NMb2dTb3VyY2VQcm9wc1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSB0aGUgYEFXU1NlcnZpY2VSb2xlRm9yTGFrZUZvcm1hdGlvbkRhdGFBY2Nlc3NgXG4gICAqIHNlcnZpY2UtbGlua2VkIHJvbGUuIFNlY3VyaXR5IExha2UgcmVxdWlyZXMgdGhpcyByb2xlIHRvIGV4aXN0IGluIHRoZVxuICAgKiBhY2NvdW50IGJlZm9yZSBhIGRhdGEgbGFrZSBjYW4gYmUgY3JlYXRlZDsgaG93ZXZlciB0aGUgcm9sZSBpcyBhXG4gICAqIHNpbmdsZXRvbiBwZXIgYWNjb3VudCBhbmQgaXMgZnJlcXVlbnRseSBhdXRvLWNyZWF0ZWQgb24gZmlyc3QgdXNlIG9mXG4gICAqIExha2UgRm9ybWF0aW9uLiBFbmFibGUgdGhpcyBvbmx5IHdoZW4geW91IGtub3cgdGhlIHJvbGUgZG9lcyBub3QgeWV0XG4gICAqIGV4aXN0IGluIHRoZSBhY2NvdW50LCBvdGhlcndpc2Ugc3RhY2sgY3JlYXRpb24gd2lsbCBmYWlsIHdpdGhcbiAgICogYGhhcyBiZWVuIHRha2VuIGluIHRoaXMgYWNjb3VudGAuXG4gICAqXG4gICAqIFRoZSBkYXRhIGxha2Ugd2lsbCBgRGVwZW5kc09uYCB0aGlzIHJvbGUgd2hlbiBpdCBpcyBjcmVhdGVkIHNvIG9yZGVyaW5nXG4gICAqIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQW1hem9uIFNlY3VyaXR5IExha2UuIFdyYXBzIHRoZSBTZWN1cml0eSBMYWtlIEwxIGNvbnN0cnVjdHMgdG9cbiAqIHN0YW5kIHVwIGEgZGF0YSBsYWtlIHdpdGggYW4gb3B0aW9uYWwgc2V0IG9mIEFXUyBuYXRpdmUgbG9nIHNvdXJjZXNcbiAqIGVuYWJsZWQsIGEgbWV0YXN0b3JlIG1hbmFnZXIgcm9sZSwgbGlmZWN5Y2xlIHBvbGljeSBhbmQgcmVwbGljYXRpb24uXG4gKlxuICogV2hlcmUgdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3QgbWVldCB5b3VyIG5lZWRzLCB1c2UgdGhlIHVuZGVybHlpbmdcbiAqIGBDZm5EYXRhTGFrZWAgYW5kIGBDZm5Bd3NMb2dTb3VyY2VgIGNvbnN0cnVjdHMgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZFNlY3VyaXR5TGFrZSBleHRlbmRzIEV4dGVuZGVkQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIGBDZm5EYXRhTGFrZWAgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBkYXRhTGFrZTogQ2ZuRGF0YUxha2U7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB1c2VkIGJ5IFNlY3VyaXR5IExha2UgdG8gbWFuYWdlIHRoZSBHbHVlIG1ldGFzdG9yZS4gV2hlblxuICAgKiBgbWV0YVN0b3JlTWFuYWdlclJvbGVBcm5gIGlzIHByb3ZpZGVkIHRoaXMgd2lsbCBiZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGFTdG9yZU1hbmFnZXJSb2xlPzogUm9sZTtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHVzZWQgYnkgU2VjdXJpdHkgTGFrZSB0byByZXBsaWNhdGUgb2JqZWN0cy4gT25seSBjcmVhdGVkXG4gICAqIHdoZW4gcmVwbGljYXRpb24gaXMgZW5hYmxlZCBhbmQgbm8gYHJvbGVBcm5gIHdhcyBzdXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2F0aW9uUm9sZT86IFJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBMYWtlIEZvcm1hdGlvbiBgQVdTU2VydmljZVJvbGVGb3JMYWtlRm9ybWF0aW9uRGF0YUFjY2Vzc2BcbiAgICogc2VydmljZS1saW5rZWQgcm9sZSwgd2hlbiBpdCB3YXMgcHJvdmlzaW9uZWQgYnkgdGhpcyBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBsYWtlRm9ybWF0aW9uU2VydmljZUxpbmtlZFJvbGU/OiBDZm5TZXJ2aWNlTGlua2VkUm9sZTtcblxuICAvKipcbiAgICogVGhlIGBDZm5Bd3NMb2dTb3VyY2VgIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXMgY29uc3RydWN0LCBpbiB0aGUgb3JkZXJcbiAgICogdGhleSB3ZXJlIGRlY2xhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nU291cmNlczogQ2ZuQXdzTG9nU291cmNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFN0YW5kYXJkU2VjdXJpdHlMYWtlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIE9wdGlvbmFsIExha2UgRm9ybWF0aW9uIHNlcnZpY2UtbGlua2VkIHJvbGUuIFNlY3VyaXR5IExha2UgcmVxdWlyZXNcbiAgICAvLyB0aGlzIFNMUiB0byBleGlzdCBpbiB0aGUgYWNjb3VudCBiZWZvcmUgYSBkYXRhIGxha2UgY2FuIGJlIGNyZWF0ZWQuXG4gICAgaWYgKHByb3BzPy5jcmVhdGVMYWtlRm9ybWF0aW9uU2VydmljZUxpbmtlZFJvbGUpIHtcbiAgICAgIHRoaXMubGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlID0gbmV3IENmblNlcnZpY2VMaW5rZWRSb2xlKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnTGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlJyxcbiAgICAgICAge1xuICAgICAgICAgIGF3c1NlcnZpY2VOYW1lOiAnbGFrZWZvcm1hdGlvbi5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdTZXJ2aWNlLWxpbmtlZCByb2xlIHVzZWQgYnkgQVdTIExha2UgRm9ybWF0aW9uIHRvIGFjY2VzcyByZWdpc3RlcmVkIFMzIGxvY2F0aW9ucy4gUmVxdWlyZWQgYnkgQW1hem9uIFNlY3VyaXR5IExha2UuJyxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBUaGUgTGFrZSBGb3JtYXRpb24gU0xSIGlzIGFuIGFjY291bnQgc2luZ2xldG9uIHRoYXQgaXMgZnJlcXVlbnRseVxuICAgICAgLy8gc2hhcmVkIHdpdGggb3RoZXIgc3RhY2tzIGFuZCBjb25zb2xlcy4gUmV0YWluIGl0IG9uXG4gICAgICAvLyBzdGFjay1kZWxldGUvb3B0LW91dCBzbyB0b2dnbGluZyB0aGlzIGZsYWcgb2ZmIChvciByZW1vdmluZyB0aGlzXG4gICAgICAvLyBjb25zdHJ1Y3QpIGRvZXMgbm90IHN0cmlwIExha2UgRm9ybWF0aW9uIGFjY2VzcyBhY2NvdW50LXdpZGUuXG4gICAgICB0aGlzLmxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZS5hcHBseVJlbW92YWxQb2xpY3koXG4gICAgICAgIFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBNZXRhc3RvcmUgbWFuYWdlciByb2xlLlxuICAgIGxldCBtZXRhU3RvcmVNYW5hZ2VyUm9sZUFybiA9IHByb3BzPy5tZXRhU3RvcmVNYW5hZ2VyUm9sZUFybjtcbiAgICBjb25zdCB1c2VzQ3VzdG9tZXJNYW5hZ2VkS2V5ID1cbiAgICAgIHByb3BzPy5rbXNLZXlJZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmttc0tleUlkICE9PSAnUzNfTUFOQUdFRF9LRVknO1xuICAgIGlmICghbWV0YVN0b3JlTWFuYWdlclJvbGVBcm4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRhdGEgbGFrZSBpcyBlbmNyeXB0ZWQgd2l0aCBhIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSxcbiAgICAgIC8vIHRoZSBtZXRhc3RvcmUgbWFuYWdlciBMYW1iZGEgbXVzdCBiZSBhYmxlIHRvIERlY3J5cHQgLyBFbmNyeXB0IC9cbiAgICAgIC8vIEdlbmVyYXRlRGF0YUtleSBhZ2FpbnN0IHRoYXQga2V5LiBUaGUgQVdTIG1hbmFnZWQgcG9saWN5XG4gICAgICAvLyBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YXN0b3JlTWFuYWdlcmAgZG9lcyBOT1QgaW5jbHVkZSBLTVMgYWN0aW9ucyxcbiAgICAgIC8vIHNvIHdpdGhvdXQgdGhpcyBncmFudCBDRk4gZGVwbG95bWVudCBzdWNjZWVkcyBidXQgcGFydGl0aW9uXG4gICAgICAvLyB1cGRhdGVzIGFuZCBzdWJzY3JpYmVyIHF1ZXJpZXMgZmFpbCBhdCBydW50aW1lLiBUaGUga2V5IEFSTiBpc1xuICAgICAgLy8gbm90IGRlcml2YWJsZSBhdCBzeW50aCB0aW1lLCBzbyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gc3VwcGx5IGl0XG4gICAgICAvLyBleHBsaWNpdGx5IHZpYSBgbWV0YVN0b3JlTWFuYWdlckttc0tleUFybmAgb3IgcHJlLXByb3Zpc2lvbiB0aGVpclxuICAgICAgLy8gb3duIG1ldGFzdG9yZSBtYW5hZ2VyIHJvbGUgdmlhIGBtZXRhU3RvcmVNYW5hZ2VyUm9sZUFybmAuXG4gICAgICBpZiAodXNlc0N1c3RvbWVyTWFuYWdlZEtleSAmJiAhcHJvcHM/Lm1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTdGFuZGFyZFNlY3VyaXR5TGFrZTogYSBjdXN0b21lci1tYW5hZ2VkIGBrbXNLZXlJZGAgcmVxdWlyZXMgJyArXG4gICAgICAgICAgICAnYG1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm5gIHNvIHRoZSBnZW5lcmF0ZWQgbWV0YXN0b3JlIG1hbmFnZXIgJyArXG4gICAgICAgICAgICAncm9sZSBjYW4gYmUgZ3JhbnRlZCB0aGUgbmVjZXNzYXJ5IEtNUyBwZXJtaXNzaW9ucy4gJyArXG4gICAgICAgICAgICAnQWx0ZXJuYXRpdmVseSwgcHJlLXByb3Zpc2lvbiB0aGUgbWV0YXN0b3JlIG1hbmFnZXIgcm9sZSAnICtcbiAgICAgICAgICAgICd5b3Vyc2VsZiBhbmQgcGFzcyBpdHMgQVJOIHZpYSBgbWV0YVN0b3JlTWFuYWdlclJvbGVBcm5gLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhU3RvcmVJbmxpbmVQb2xpY2llczoge1tuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudH0gPSB7fTtcbiAgICAgIGlmICh1c2VzQ3VzdG9tZXJNYW5hZ2VkS2V5ICYmIHByb3BzPy5tZXRhU3RvcmVNYW5hZ2VyS21zS2V5QXJuKSB7XG4gICAgICAgIG1ldGFTdG9yZUlubGluZVBvbGljaWVzLkFtYXpvblNlY3VyaXR5TGFrZU1ldGFzdG9yZU1hbmFnZXJLbXNQb2xpY3kgPVxuICAgICAgICAgIG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIHNpZDogJ0FsbG93TWV0YVN0b3JlTWFuYWdlckttc0FjY2VzcycsXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgICdrbXM6RW5jcnlwdCcsXG4gICAgICAgICAgICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleScsXG4gICAgICAgICAgICAgICAgICAna21zOkRlc2NyaWJlS2V5JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW3Byb3BzLm1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm5dLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGFTdG9yZU1hbmFnZXJSb2xlID0gbmV3IFJvbGUodGhpcywgJ01ldGFTdG9yZU1hbmFnZXJSb2xlJywge1xuICAgICAgICAvLyBUaGUgcGFydGl0aW9uLXVwZGF0ZXIgTGFtYmRhIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IFNlY3VyaXR5IExha2UgYXJlXG4gICAgICAgIC8vIGhhcmQtY29kZWQgdG8gYXNzdW1lIGEgcm9sZSBuYW1lZFxuICAgICAgICAvLyBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YVN0b3JlTWFuYWdlclYyYCB1bmRlciB0aGUgYC9zZXJ2aWNlLXJvbGUvYFxuICAgICAgICAvLyBwYXRoIGFuZCBkbyBub3QgaG9ub3IgYW4gYXJiaXRyYXJ5IHJvbGUgQVJOLiBXaXRob3V0IGEgbWF0Y2hpbmdcbiAgICAgICAgLy8gcm9sZSBuYW1lLCBDRk4gZGVwbG95bWVudCBhbmQgYENyZWF0ZURhdGFMYWtlYCBzdWNjZWVkIGJ1dCB0aGVcbiAgICAgICAgLy8gcGFydGl0aW9uIHVwZGF0ZXIgc2lsZW50bHkgZmFpbHMgYW5kIHN1YnNjcmliZXJzIGNhbm5vdCBxdWVyeVxuICAgICAgICAvLyByZXBsaWNhdGVkIG9iamVjdHMuIFRoZSByb2xlIG5hbWUgaXMgYWNjb3VudC1nbG9iYWw7IGZvclxuICAgICAgICAvLyBtdWx0aS1SZWdpb24gZGVwbG95cyBpbiB0aGUgc2FtZSBhY2NvdW50IHBhc3NcbiAgICAgICAgLy8gYG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuYCBmb3IgYWxsIGJ1dCBvbmUgUmVnaW9uLlxuICAgICAgICBwYXRoOiAnL3NlcnZpY2Utcm9sZS8nLFxuICAgICAgICByb2xlTmFtZTogJ0FtYXpvblNlY3VyaXR5TGFrZU1ldGFTdG9yZU1hbmFnZXJWMicsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdSb2xlIHVzZWQgYnkgQW1hem9uIFNlY3VyaXR5IExha2UgbWV0YXN0b3JlIG1hbmFnZXIgTGFtYmRhIHRvIG1hbmFnZSB0aGUgQVdTIEdsdWUgbWV0YXN0b3JlLicsXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIE1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgICAgJ3NlcnZpY2Utcm9sZS9BbWF6b25TZWN1cml0eUxha2VNZXRhc3RvcmVNYW5hZ2VyJyxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICBpbmxpbmVQb2xpY2llczogbWV0YVN0b3JlSW5saW5lUG9saWNpZXMsXG4gICAgICB9KTtcbiAgICAgIG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuID0gdGhpcy5tZXRhU3RvcmVNYW5hZ2VyUm9sZS5yb2xlQXJuO1xuICAgIH1cblxuICAgIC8vIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAgICBjb25zdCBlbmNyeXB0aW9uQ29uZmlndXJhdGlvbjpcbiAgICAgIHwgQ2ZuRGF0YUxha2UuRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVxuICAgICAgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvcHM/Lmttc0tleUlkICE9PSB1bmRlZmluZWQgPyB7a21zS2V5SWQ6IHByb3BzLmttc0tleUlkfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgIGxldCBsaWZlY3ljbGVDb25maWd1cmF0aW9uOlxuICAgICAgfCBDZm5EYXRhTGFrZS5MaWZlY3ljbGVDb25maWd1cmF0aW9uUHJvcGVydHlcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcz8ubGlmZWN5Y2xlKSB7XG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBleHBpcmF0aW9uOlxuICAgICAgICAgIHByb3BzLmxpZmVjeWNsZS5leHBpcmF0aW9uRGF5cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHtkYXlzOiBwcm9wcy5saWZlY3ljbGUuZXhwaXJhdGlvbkRheXN9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IHByb3BzLmxpZmVjeWNsZS50cmFuc2l0aW9ucz8ubWFwKCh0KSA9PiAoe1xuICAgICAgICAgIGRheXM6IHQuZGF5cyxcbiAgICAgICAgICBzdG9yYWdlQ2xhc3M6IHQuc3RvcmFnZUNsYXNzLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAgbGV0IHJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjpcbiAgICAgIHwgQ2ZuRGF0YUxha2UuUmVwbGljYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcz8ucmVwbGljYXRpb24pIHtcbiAgICAgIGxldCByZXBsaWNhdGlvblJvbGVBcm4gPSBwcm9wcy5yZXBsaWNhdGlvbi5yb2xlQXJuO1xuICAgICAgaWYgKCFyZXBsaWNhdGlvblJvbGVBcm4pIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgICAgIGNvbnN0IHNvdXJjZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWdpb25zID0gcHJvcHMucmVwbGljYXRpb24ucmVnaW9ucztcblxuICAgICAgICAvLyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGVuY3J5cHRpb24gYXJlIGluZGVwZW5kZW50IGluIFNlY3VyaXR5XG4gICAgICAgIC8vIExha2U6IGEgQ01LIHNvdXJjZSBjYW4gcmVwbGljYXRlIHRvIGFuIFNTRS1TMyByb2xsdXAgYW5kIHZpY2VcbiAgICAgICAgLy8gdmVyc2EuIEdyYW50IGBrbXM6RGVjcnlwdGAgb24gdGhlIHNvdXJjZSBrZXkgb25seSB3aGVuIHRoZVxuICAgICAgICAvLyBzb3VyY2UgbGFrZSB1c2VzIGEgQ01LLCBhbmQgZ3JhbnQgYGttczpFbmNyeXB0YCAvXG4gICAgICAgIC8vIGBrbXM6R2VuZXJhdGVEYXRhS2V5YCBvbiB0aGUgZGVzdGluYXRpb24ga2V5cyBvbmx5IHdoZW4gYW55XG4gICAgICAgIC8vIHJvbGx1cCBidWNrZXQgdXNlcyBhIENNSy4gVGhlIGtleSBBUk5zIGFyZSBub3QgZGVyaXZhYmxlIGF0XG4gICAgICAgIC8vIHN5bnRoIHRpbWUsIHNvIHJlcXVpcmUgdGhlIGNhbGxlciB0byBzdXBwbHkgdGhlbSBleHBsaWNpdGx5IG9uXG4gICAgICAgIC8vIHRoZSBlbmNyeXB0ZWQgc2lkZSAob3IgcHJlLXByb3Zpc2lvbiB0aGVpciBvd24gcmVwbGljYXRpb24gcm9sZVxuICAgICAgICAvLyB2aWEgYHJlcGxpY2F0aW9uLnJvbGVBcm5gKS5cbiAgICAgICAgaWYgKHVzZXNDdXN0b21lck1hbmFnZWRLZXkgJiYgIXByb3BzLnJlcGxpY2F0aW9uLnNvdXJjZUttc0tleUFybikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGFuZGFyZFNlY3VyaXR5TGFrZTogYSBjdXN0b21lci1tYW5hZ2VkIGBrbXNLZXlJZGAgd2l0aCAnICtcbiAgICAgICAgICAgICAgJ3JlcGxpY2F0aW9uIHJlcXVpcmVzIGByZXBsaWNhdGlvbi5zb3VyY2VLbXNLZXlBcm5gIHNvIHRoZSAnICtcbiAgICAgICAgICAgICAgJ2dlbmVyYXRlZCByZXBsaWNhdGlvbiByb2xlIGNhbiBga21zOkRlY3J5cHRgIHNvdXJjZSBvYmplY3RzLiAnICtcbiAgICAgICAgICAgICAgJ0lmIGFueSByb2xsdXAgUmVnaW9uIGJ1Y2tldCBpcyBhbHNvIGVuY3J5cHRlZCB3aXRoIGEgJyArXG4gICAgICAgICAgICAgICdjdXN0b21lci1tYW5hZ2VkIGtleSwgcGFzcyBpdHMgQVJOIHZpYSAnICtcbiAgICAgICAgICAgICAgJ2ByZXBsaWNhdGlvbi5kZXN0aW5hdGlvbkttc0tleUFybnNgLiBBbHRlcm5hdGl2ZWx5LCAnICtcbiAgICAgICAgICAgICAgJ3ByZS1wcm92aXNpb24gdGhlIHJlcGxpY2F0aW9uIHJvbGUgeW91cnNlbGYgYW5kIHBhc3MgaXRzIEFSTiAnICtcbiAgICAgICAgICAgICAgJ3ZpYSBgcmVwbGljYXRpb24ucm9sZUFybmAuJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga21zU3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10gPSBbXTtcbiAgICAgICAgaWYgKHVzZXNDdXN0b21lck1hbmFnZWRLZXkgJiYgcHJvcHMucmVwbGljYXRpb24uc291cmNlS21zS2V5QXJuKSB7XG4gICAgICAgICAga21zU3RhdGVtZW50cy5wdXNoKFxuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0FsbG93RGVjcnlwdFNvdXJjZUttc0tleScsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsna21zOkRlY3J5cHQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucmVwbGljYXRpb24uc291cmNlS21zS2V5QXJuXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uLmRlc3RpbmF0aW9uS21zS2V5QXJucyAmJlxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uLmRlc3RpbmF0aW9uS21zS2V5QXJucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGttc1N0YXRlbWVudHMucHVzaChcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdBbGxvd0VuY3J5cHREZXN0aW5hdGlvbkttc0tleXMnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2ttczpFbmNyeXB0JywgJ2ttczpHZW5lcmF0ZURhdGFLZXknXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBwcm9wcy5yZXBsaWNhdGlvbi5kZXN0aW5hdGlvbkttc0tleUFybnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXBsaWNhdGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnUmVwbGljYXRpb25Sb2xlJywge1xuICAgICAgICAgIC8vIFNlY3VyaXR5IExha2UgcmVxdWlyZXMgdGhlIHJlcGxpY2F0aW9uIHJvbGUgdG8gbGl2ZSB1bmRlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2aWNlLXJvbGUvIHBhdGggYW5kIHN0YXJ0IHdpdGggYFNlY3VyaXR5TGFrZWAuIElBTSByb2xlIG5hbWVzXG4gICAgICAgICAgLy8gYXJlIGFjY291bnQtZ2xvYmFsLCBzbyBpbmNsdWRlIHRoZSBzb3VyY2UgUmVnaW9uIGluIHRoZSBzdWZmaXggdG9cbiAgICAgICAgICAvLyBhdm9pZCBjb2xsaXNpb25zIHdoZW4gdGhlIGNvbnN0cnVjdCBpcyBkZXBsb3llZCB0byBtdWx0aXBsZVxuICAgICAgICAgIC8vIFJlZ2lvbnMgaW4gdGhlIHNhbWUgYWNjb3VudC5cbiAgICAgICAgICBwYXRoOiAnL3NlcnZpY2Utcm9sZS8nLFxuICAgICAgICAgIHJvbGVOYW1lOiBgU2VjdXJpdHlMYWtlUzNSZXBsaWNhdGlvblJvbGUtJHtzb3VyY2VSZWdpb259YCxcbiAgICAgICAgICAvLyBBbWF6b24gUzMgcGVyZm9ybXMgdGhlIGNyb3NzLVJlZ2lvbiByZXBsaWNhdGlvbiwgc28gaXQgKG5vdCB0aGVcbiAgICAgICAgICAvLyBTZWN1cml0eSBMYWtlIHNlcnZpY2UpIG11c3QgYmUgYWxsb3dlZCB0byBhc3N1bWUgdGhpcyByb2xlLlxuICAgICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3MzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdSb2xlIHVzZWQgYnkgQW1hem9uIFMzIHRvIHJlcGxpY2F0ZSBBbWF6b24gU2VjdXJpdHkgTGFrZSBvYmplY3RzIGFjcm9zcyBSZWdpb25zLicsXG4gICAgICAgICAgLy8gTm8gQVdTIG1hbmFnZWQgcG9saWN5IGV4aXN0cyBmb3IgdGhpcyByb2xlOyBhdHRhY2ggdGhlIGlubGluZVxuICAgICAgICAgIC8vIHBvbGljeSBkb2N1bWVudGVkIGJ5IFNlY3VyaXR5IExha2UuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5LWxha2UvbGF0ZXN0L3VzZXJndWlkZS9hZGQtcm9sbHVwLXJlZ2lvbi5odG1sXG4gICAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICAgIEFtYXpvblNlY3VyaXR5TGFrZVMzUmVwbGljYXRpb25Sb2xlUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgICBzaWQ6ICdBbGxvd1JlYWRTM1JlcGxpY2F0aW9uU2V0dGluZycsXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uRm9yUmVwbGljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnczM6R2V0T2JqZWN0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uQWNsJyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdFZlcnNpb25UYWdnaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdFJldGVudGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RMZWdhbEhvbGQnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpzMzo6OmF3cy1zZWN1cml0eS1kYXRhLWxha2UtJHtzb3VyY2VSZWdpb259KmAsXG4gICAgICAgICAgICAgICAgICAgIGBhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OnMzOjo6YXdzLXNlY3VyaXR5LWRhdGEtbGFrZS0ke3NvdXJjZVJlZ2lvbn0qLypgLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7J3MzOlJlc291cmNlQWNjb3VudCc6IFthY2NvdW50XX0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgICAgc2lkOiAnQWxsb3dTM1JlcGxpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ3MzOlJlcGxpY2F0ZU9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICdzMzpSZXBsaWNhdGVEZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICAnczM6UmVwbGljYXRlVGFncycsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uVGFnZ2luZycsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBkZXN0aW5hdGlvblJlZ2lvbnMuZmxhdE1hcCgocikgPT4gW1xuICAgICAgICAgICAgICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpzMzo6OmF3cy1zZWN1cml0eS1kYXRhLWxha2UtJHtyfSovKmAsXG4gICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7J3MzOlJlc291cmNlQWNjb3VudCc6IFthY2NvdW50XX0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLmttc1N0YXRlbWVudHMsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVwbGljYXRpb25Sb2xlQXJuID0gdGhpcy5yZXBsaWNhdGlvblJvbGUucm9sZUFybjtcbiAgICAgIH1cbiAgICAgIHJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgcmVnaW9uczogcHJvcHMucmVwbGljYXRpb24ucmVnaW9ucyxcbiAgICAgICAgcm9sZUFybjogcmVwbGljYXRpb25Sb2xlQXJuLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFMYWtlID0gbmV3IENmbkRhdGFMYWtlKHRoaXMsICdEYXRhTGFrZScsIHtcbiAgICAgIG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuLFxuICAgICAgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24sXG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uLFxuICAgICAgcmVwbGljYXRpb25Db25maWd1cmF0aW9uLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZSkge1xuICAgICAgdGhpcy5kYXRhTGFrZS5hZGREZXBlbmRlbmN5KHRoaXMubGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgQVdTIGxvZyBzb3VyY2VzIHNlcXVlbnRpYWxseSB1c2luZyBEZXBlbmRzT24sIGFzIHJlcXVpcmVkIGJ5XG4gICAgLy8gU2VjdXJpdHkgTGFrZSB3aGVuIG1vcmUgdGhhbiBvbmUgc291cmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHNhbWVcbiAgICAvLyB0ZW1wbGF0ZS5cbiAgICBsZXQgcHJldmlvdXM6IENmbkF3c0xvZ1NvdXJjZSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9wcz8ubG9nU291cmNlcyA/PyBbXSkge1xuICAgICAgY29uc3QgbG9nU291cmNlID0gbmV3IENmbkF3c0xvZ1NvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExvZ1NvdXJjZSR7c291cmNlLnNvdXJjZU5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFMYWtlQXJuOiB0aGlzLmRhdGFMYWtlLmF0dHJBcm4sXG4gICAgICAgICAgc291cmNlTmFtZTogc291cmNlLnNvdXJjZU5hbWUsXG4gICAgICAgICAgc291cmNlVmVyc2lvbjogc291cmNlLnNvdXJjZVZlcnNpb24gPz8gJzIuMCcsXG4gICAgICAgICAgYWNjb3VudHM6IHNvdXJjZS5hY2NvdW50cyA/PyBbU3RhY2sub2YodGhpcykuYWNjb3VudF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbG9nU291cmNlLmFkZERlcGVuZGVuY3kodGhpcy5kYXRhTGFrZSk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgbG9nU291cmNlLmFkZERlcGVuZGVuY3kocHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBsb2dTb3VyY2U7XG4gICAgICB0aGlzLmxvZ1NvdXJjZXMucHVzaChsb2dTb3VyY2UpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtc2VjdXJpdHktbGFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3Mtc2VjdXJpdHlsYWtlL2xpYi9zdGFuZGFyZC1zZWN1cml0eS1sYWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFxRDtBQUNyRCxpREFPNkI7QUFDN0IsbUVBS3NDO0FBQ3RDLG1FQUlzQztBQUV0QywrQ0FHNkI7QUFFN0I7Ozs7R0FJRztBQUNILElBQVksZ0JBU1g7QUFURCxXQUFZLGdCQUFnQjtJQUMxQix5REFBcUMsQ0FBQTtJQUNyQyx5REFBcUMsQ0FBQTtJQUNyQyx1Q0FBbUIsQ0FBQTtJQUNuQix1Q0FBbUIsQ0FBQTtJQUNuQiwrQ0FBMkIsQ0FBQTtJQUMzQix5Q0FBcUIsQ0FBQTtJQUNyQiwyQ0FBdUIsQ0FBQTtJQUN2QiwrQkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVRXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBUzNCO0FBZ1REOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLG9CQUFxQixTQUFRLHlCQUFpQjtJQTBDekQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQzs7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFuQjFCOzs7V0FHRztRQUNNLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBRTVDOzs7V0FHRztRQUNNLGdCQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUUzQzs7O1dBR0c7UUFDTSw0QkFBdUIsR0FBZ0MsRUFBRSxDQUFDO1FBS2pFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsSUFBSSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsb0NBQW9DLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSw4QkFBb0IsQ0FDNUQsSUFBSSxFQUNKLGdDQUFnQyxFQUNoQztnQkFDRSxjQUFjLEVBQUUsNkJBQTZCO2dCQUM3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UUFBUSxFQUFFLFFBQVE7NEJBQ2xCLFVBQVUsRUFBRSxFQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBQzt5QkFDcEQ7d0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUN2QyxHQUFHLEdBQUcsQ0FBQyxjQUFjLGVBQWUsT0FBTyxFQUFFLENBQzlDO3FCQUNGO29CQUNELFFBQVEsRUFBRTt3QkFDUixPQUFPLEVBQUUsS0FBSzt3QkFDZCxNQUFNLEVBQUUsb0JBQW9CO3dCQUM1QixVQUFVLEVBQUU7NEJBQ1YsUUFBUSxFQUFFLFFBQVE7NEJBQ2xCLFVBQVUsRUFBRSxFQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBQzt5QkFDcEQ7d0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUN2QyxHQUFHLEdBQUcsQ0FBQyxjQUFjLGVBQWUsT0FBTyxFQUFFLENBQzlDO3FCQUNGO29CQUNELE1BQU0sRUFBRSwwQ0FBdUIsQ0FBQyxjQUFjLENBQUM7d0JBQzdDLElBQUkseUJBQWUsQ0FBQzs0QkFDbEIsT0FBTyxFQUFFLENBQUMsd0JBQXdCLENBQUM7NEJBQ25DLDhDQUE4Qzs0QkFDOUMsa0NBQWtDOzRCQUNsQyxzREFBc0Q7NEJBQ3RELHdEQUF3RDs0QkFDeEQsb0RBQW9EOzRCQUNwRCxxREFBcUQ7NEJBQ3JELHlCQUF5Qjs0QkFDekIsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO3lCQUNqRCxDQUFDO3FCQUNILENBQUM7aUJBQ0gsQ0FDRixDQUFDO2dCQUNGLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcmNELG9EQXFjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Rm4sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBDZm5TZXJ2aWNlTGlua2VkUm9sZSxcbiAgTWFuYWdlZFBvbGljeSxcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBDZm5Bd3NMb2dTb3VyY2UsXG4gIENmbkRhdGFMYWtlLFxuICBDZm5TdWJzY3JpYmVyLFxuICBDZm5TdWJzY3JpYmVyTm90aWZpY2F0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjdXJpdHlsYWtlJztcbmltcG9ydCB7XG4gIEF3c0N1c3RvbVJlc291cmNlLFxuICBBd3NDdXN0b21SZXNvdXJjZVBvbGljeSxcbiAgUGh5c2ljYWxSZXNvdXJjZUlkLFxufSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB0eXBlIHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgRXh0ZW5kZWRDb25zdHJ1Y3QsXG4gIHR5cGUgRXh0ZW5kZWRDb25zdHJ1Y3RQcm9wcyxcbn0gZnJvbSAnLi4vLi4vYXdzLWNkay9pbmRleCc7XG5cbi8qKlxuICogVGhlIEFXUy1uYXRpdmUgbG9nIHNvdXJjZXMgdGhhdCBBbWF6b24gU2VjdXJpdHkgTGFrZSBjYW4gaW5nZXN0LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5LWxha2UvbGF0ZXN0L3VzZXJndWlkZS9pbnRlcm5hbC1zb3VyY2VzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gQXdzTG9nU291cmNlTmFtZSB7XG4gIENMT1VEX1RSQUlMX01HTVQgPSAnQ0xPVURfVFJBSUxfTUdNVCcsXG4gIExBTUJEQV9FWEVDVVRJT04gPSAnTEFNQkRBX0VYRUNVVElPTicsXG4gIFJPVVRFNTMgPSAnUk9VVEU1MycsXG4gIFMzX0RBVEEgPSAnUzNfREFUQScsXG4gIFNIX0ZJTkRJTkdTID0gJ1NIX0ZJTkRJTkdTJyxcbiAgVlBDX0ZMT1cgPSAnVlBDX0ZMT1cnLFxuICBFS1NfQVVESVQgPSAnRUtTX0FVRElUJyxcbiAgV0FGID0gJ1dBRicsXG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gaW5kaXZpZHVhbCBBV1MgbG9nIHNvdXJjZSB0byBlbmFibGUgb24gdGhlIGRhdGEgbGFrZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NMb2dTb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgQVdTIGxvZyBzb3VyY2UgdG8gZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTmFtZTogQXdzTG9nU291cmNlTmFtZSB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIEFXUyBsb2cgc291cmNlIHRvIGVuYWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAnMi4wJ1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBhY2NvdW50cyB3aG9zZSBkYXRhIHNob3VsZCBiZSBjb2xsZWN0ZWQgZm9yIHRoaXMgc291cmNlLiBJZiBub3RcbiAgICogcHJvdmlkZWQsIHRoZSBkYXRhIGxha2Ugb3duZXIgYWNjb3VudCBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtTdGFjay5vZih0aGlzKS5hY2NvdW50XVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBMaWZlY3ljbGUgdHJhbnNpdGlvbiBmb3IgU2VjdXJpdHkgTGFrZSBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5TGFrZVRyYW5zaXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYmVmb3JlIGRhdGEgdHJhbnNpdGlvbnMgdG8gdGhlIGdpdmVuIHN0b3JhZ2UgY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBkYXlzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgUzMgc3RvcmFnZSBjbGFzcy4gU3VwcG9ydGVkIHZhbHVlcyBpbmNsdWRlIGBTVEFOREFSRF9JQWAsXG4gICAqIGBPTkVaT05FX0lBYCwgYElOVEVMTElHRU5UX1RJRVJJTkdgLCBgR0xBQ0lFUl9JUmAsIGBHTEFDSUVSYCBhbmRcbiAgICogYERFRVBfQVJDSElWRWAuXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3M6IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaWZlY3ljbGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBTZWN1cml0eSBMYWtlIG1hbmFnZWQgUzMgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eUxha2VMaWZlY3ljbGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYmVmb3JlIFNlY3VyaXR5IExha2UgZGF0YSBpcyBleHBpcmVkL2RlbGV0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGF0YSBpcyByZXRhaW5lZCBpbmRlZmluaXRlbHlcbiAgICovXG4gIHJlYWRvbmx5IGV4cGlyYXRpb25EYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9ucyBhcHBsaWVkIHRvIFNlY3VyaXR5IExha2UgZGF0YS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0cmFuc2l0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNpdGlvbnM/OiBTZWN1cml0eUxha2VUcmFuc2l0aW9uUHJvcHNbXTtcbn1cblxuLyoqXG4gKiBSZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZvciBTZWN1cml0eSBMYWtlIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlMYWtlUmVwbGljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBPbmUgb3IgbW9yZSByb2xsdXAgUmVnaW9ucyB0byByZXBsaWNhdGUgZGF0YSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBJQU0gcm9sZSBTZWN1cml0eSBMYWtlIHVzZXMgdG8gcmVwbGljYXRlIG9iamVjdHMuIElmIG5vdFxuICAgKiBwcm92aWRlZCwgYSByb2xlIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgaXMgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IGVuY3J5cHRpbmcgdGhlIHNvdXJjZVxuICAgKiAob3JpZ2luYXRpbmctUmVnaW9uKSBTZWN1cml0eSBMYWtlIGJ1Y2tldC4gUmVxdWlyZWQgd2hlbiB0aGUgZW5jbG9zaW5nXG4gICAqIGBTdGFuZGFyZFNlY3VyaXR5TGFrZWAgaXMgY29uZmlndXJlZCB3aXRoIGEgY3VzdG9tZXItbWFuYWdlZCBga21zS2V5SWRgXG4gICAqIGFuZCB0aGlzIGNvbnN0cnVjdCBjcmVhdGVzIHRoZSByZXBsaWNhdGlvbiByb2xlIChpLmUuIHdoZW4gYHJvbGVBcm5gXG4gICAqIGlzIG5vdCBwcm92aWRlZCk7IFMzIG5lZWRzIGBrbXM6RGVjcnlwdGAgb24gdGhpcyBrZXkgdG8gcmVhZCBvYmplY3RzXG4gICAqIGJlZm9yZSByZXBsaWNhdGluZyB0aGVtLiBOb3QgcmVxdWlyZWQgd2hlbiB0aGUgc291cmNlIGJ1Y2tldCB1c2VzXG4gICAqIFMzLW1hbmFnZWQgb3IgQVdTLW1hbmFnZWQgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBgZGVzdGluYXRpb25LbXNLZXlBcm5zYDogU2VjdXJpdHkgTGFrZSByb2xsdXBcbiAgICogUmVnaW9ucyBtYXkgdXNlIHRoZWlyIG93biBlbmNyeXB0aW9uIHNldHRpbmdzLCBzbyBhIENNSyBzb3VyY2UgY2FuXG4gICAqIHJlcGxpY2F0ZSB0byBhbiBTU0UtUzMgcm9sbHVwIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIEtNUyBkZWNyeXB0IHN0YXRlbWVudCBpcyBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlS21zS2V5QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOcyBvZiB0aGUgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5cyBlbmNyeXB0aW5nIHRoZSBkZXN0aW5hdGlvblxuICAgKiAocm9sbHVwLVJlZ2lvbikgU2VjdXJpdHkgTGFrZSBidWNrZXRzLiBTdXBwbHkgd2hlbiBhbnkgcm9sbHVwIFJlZ2lvbidzXG4gICAqIGJ1Y2tldCB1c2VzIGEgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IHNvIHRoZSByZXBsaWNhdGlvbiByb2xlIGNhblxuICAgKiBga21zOkVuY3J5cHRgIC8gYGttczpHZW5lcmF0ZURhdGFLZXlgIGFnYWluc3QgdGhlbS4gTm90IHJlcXVpcmVkIHdoZW5cbiAgICogZXZlcnkgcm9sbHVwIGJ1Y2tldCB1c2VzIFMzLW1hbmFnZWQgb3IgQVdTLW1hbmFnZWQgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBgc291cmNlS21zS2V5QXJuYCBhbmQgdGhlIHNvdXJjZSBsYWtlJ3NcbiAgICogYGttc0tleUlkYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBLTVMgZW5jcnlwdCBzdGF0ZW1lbnQgaXMgYWRkZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uS21zS2V5QXJucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBBV1MgbG9nIHNvdXJjZXMgYSBzdWJzY3JpYmVyIHNob3VsZCByZWNlaXZlLiBFYWNoIGVudHJ5IG1hcHMgdG8gdGhlXG4gKiBzYW1lIGBzb3VyY2VOYW1lYC9gc291cmNlVmVyc2lvbmAgcGFpciB1c2VkIHdoZW4gZW5hYmxpbmcgdGhlIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eUxha2VTdWJzY3JpYmVyU291cmNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBuYW1lLCBlLmcuIGBDTE9VRF9UUkFJTF9NR01UYC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZU5hbWU6IEF3c0xvZ1NvdXJjZU5hbWUgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgdmVyc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAnMi4wJ1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlVmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFNlY3VyaXR5IExha2Ugc3Vic2NyaWJlciB3aXRoIFMzLW5vdGlmaWNhdGlvbiBhY2Nlc3MuXG4gKiBPbmx5IHRoZSBgUzNgIGFjY2VzcyB0eXBlIChhc3luY2hyb25vdXMgU1FTIG5vdGlmaWNhdGlvbiBvZiBuZXcgb2JqZWN0cylcbiAqIGlzIG1vZGVsbGVkOyBMYWtlIEZvcm1hdGlvbiBzdWJzY3JpYmVycyBjYW4gYmUgY3JlYXRlZCBkaXJlY3RseSBhZ2FpbnN0XG4gKiB0aGUgdW5kZXJseWluZyBgQ2ZuU3Vic2NyaWJlcmAgTDEuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VjdXJpdHktbGFrZS9sYXRlc3QvdXNlcmd1aWRlL3N1YnNjcmliZXItbWFuYWdlbWVudC5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlMYWtlU3Vic2NyaWJlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBmcmllbmRseSBuYW1lIG9mIHRoZSBzdWJzY3JpYmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Vic2NyaWJlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBhY2NvdW50IGlkIG9mIHRoZSBwcmluY2lwYWwgdGhhdCB3aWxsIGNvbnN1bWUgZGF0YSAodHlwaWNhbGx5XG4gICAqIHRoZSBTSUVNIC8gZG93bnN0cmVhbSBhY2NvdW50IGlkKS5cbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBpZCB0aGUgc3Vic2NyaWJlciBtdXN0IHByZXNlbnQgd2hlbiBhc3N1bWluZyB0aGVcbiAgICogU2VjdXJpdHktTGFrZS1tYW5hZ2VkIHJvbGUuIFRyZWF0IGFzIGEgc2hhcmVkIHNlY3JldC5cbiAgICovXG4gIHJlYWRvbmx5IGV4dGVybmFsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTG9nIHNvdXJjZXMgdGhpcyBzdWJzY3JpYmVyIHJlY2VpdmVzLiBFYWNoIGVudHJ5IG11c3QgY29ycmVzcG9uZCB0byBhXG4gICAqIHNvdXJjZSB0aGF0IGlzIGVuYWJsZWQgb24gdGhlIGRhdGEgbGFrZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZXM6IFNlY3VyaXR5TGFrZVN1YnNjcmliZXJTb3VyY2VQcm9wc1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEhUVFBTIGVuZHBvaW50IGZvciBzdWJzY3JpYmVyIG5vdGlmaWNhdGlvbnMuIElmIG9taXR0ZWQsXG4gICAqIFNlY3VyaXR5IExha2UgY3JlYXRlcyBhbiBTUVMgcXVldWUgaW4gdGhlIGRhdGEtbGFrZSBhY2NvdW50IGFuZFxuICAgKiBub3RpZmllcyB0aGUgc3Vic2NyaWJlciB2aWEgU1FTIG1lc3NhZ2VzIChyZWNvbW1lbmRlZCBkZWZhdWx0IOKAlCB0aGVcbiAgICogU0lFTSBwb2xscyB0aGUgcXVldWUpLlxuICAgKlxuICAgKiBXaGVuIHNldCwge0BsaW5rIGh0dHBzTm90aWZpY2F0aW9uVGFyZ2V0Um9sZUFybn0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU1FTIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgaHR0cHNOb3RpZmljYXRpb25FbmRwb2ludD86IHN0cmluZztcblxuICAvKipcbiAgICogSUFNIHJvbGUgQVJOIEV2ZW50QnJpZGdlIGFzc3VtZXMgdG8gaW52b2tlIHRoZSBIVFRQUyBlbmRwb2ludCB3aGVuXG4gICAqIHtAbGluayBodHRwc05vdGlmaWNhdGlvbkVuZHBvaW50fSBpcyBzZXQuIFRoZSByb2xlIG11c3QgdHJ1c3RcbiAgICogYGV2ZW50cy5hbWF6b25hd3MuY29tYCBhbmQgaGF2ZSBgZXZlbnRzOkludm9rZUFwaURlc3RpbmF0aW9uYFxuICAgKiBwZXJtaXNzaW9ucy4gVGhlIEFXUyBjb25zb2xlIHByb3Zpc2lvbnMgdGhpcyBoZWxwZXIgcm9sZVxuICAgKiBhdXRvbWF0aWNhbGx5IHdoZW4gYSBzdWJzY3JpYmVyIGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUksIGJ1dCB0aGVcbiAgICogQ2xvdWRGb3JtYXRpb24gLyBBUEkgcGF0aCBkb2VzICoqbm90Kiog4oCUIHNvIGEgZnJlc2ggYWNjb3VudCBtdXN0XG4gICAqIGNyZWF0ZSBhbmQgcGFzcyB0aGlzIHJvbGUgZXhwbGljaXRseSwgb3IgU2VjdXJpdHkgTGFrZSB3aWxsIHJlamVjdFxuICAgKiB0aGUgc3Vic2NyaWJlci1ub3RpZmljYXRpb24gY3JlYXRlIGNhbGwuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgaHR0cHNOb3RpZmljYXRpb25FbmRwb2ludH0gaXMgb21pdHRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyByZXF1aXJlZCB3aGVuIGBodHRwc05vdGlmaWNhdGlvbkVuZHBvaW50YCBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGh0dHBzTm90aWZpY2F0aW9uVGFyZ2V0Um9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBzZXQgYW5kIHRoZSBzdWJzY3JpYmVyIHVzZXMgdGhlIGRlZmF1bHQgU1FTIG5vdGlmaWNhdGlvbiBwYXRoLFxuICAgKiB0aGUgY29uc3RydWN0IHBhdGNoZXMgdGhlIFNlY3VyaXR5LUxha2UtbWFuYWdlZCBNYWluLVF1ZXVlJ3NcbiAgICogYFZpc2liaWxpdHlUaW1lb3V0YCBhdHRyaWJ1dGUgdG8gdGhpcyB2YWx1ZSAoc2Vjb25kcykgdmlhIGFuXG4gICAqIGBBd3NDdXN0b21SZXNvdXJjZWAuIE5lZWRlZCBiZWNhdXNlIFNlY3VyaXR5IExha2UgYXV0by1wcm92aXNpb25zXG4gICAqIHRoZSBxdWV1ZSB3aXRoIGEgMzAwcyB2aXNpYmlsaXR5IHRpbWVvdXQsIHdoaWNoIGlzICoqbGVzcyB0aGFuKiogdGhlXG4gICAqIGRlZmF1bHQgYWVzLXNpZW0gZXMtbG9hZGVyIExhbWJkYSB0aW1lb3V0IG9mIDYwMHMsIGNhdXNpbmcgdGhlXG4gICAqIGV2ZW50LXNvdXJjZS1tYXBwaW5nIGNyZWF0ZSB0byBiZSByZWplY3RlZCB3aXRoXG4gICAqIGBcIlRoZSBldmVudCBzb3VyY2UgbWFwcGluZydzIGZ1bmN0aW9uIHRpbWVvdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW5cbiAgICogb3IgZXF1YWwgdG8gdGhlIHF1ZXVlJ3MgdmlzaWJpbGl0eSB0aW1lb3V0XCJgLlxuICAgKlxuICAgKiBTZXQgdG8gYSB2YWx1ZSBgPj1gIHlvdXIgc3Vic2NyaWJlciBMYW1iZGEncyB0aW1lb3V0LiAzNjAwIGlzIGFcbiAgICogc2FmZSBkZWZhdWx0IGZvciBhZXMtc2llbS5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBodHRwc05vdGlmaWNhdGlvbkVuZHBvaW50fSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGF0Y2g7IHRoZSBxdWV1ZSBrZWVwcyB0aGUgU2VjdXJpdHktTGFrZS1wcm92aXNpb25lZCAzMDBzXG4gICAqL1xuICByZWFkb25seSBzcXNWaXNpYmlsaXR5VGltZW91dFNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgU3RhbmRhcmRTZWN1cml0eUxha2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhcmRTZWN1cml0eUxha2VQcm9wcyBleHRlbmRzIEV4dGVuZGVkQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIEtNUyBrZXkgaWQgdG8gdXNlIHRvIGVuY3J5cHQgZGF0YSBzdG9yZWQgYnkgU2VjdXJpdHkgTGFrZS4gVXNlIHRoZVxuICAgKiBsaXRlcmFsIHN0cmluZyBgUzNfTUFOQUdFRF9LRVlgIHRvIHVzZSBTMyBtYW5hZ2VkIGtleXMgKFNTRS1TMykuIE9taXQgdG9cbiAgICogbGV0IFNlY3VyaXR5IExha2UgdXNlIGl0cyBkZWZhdWx0IG1hbmFnZWQga2V5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlY3VyaXR5IExha2UgbWFuYWdlZCBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBrbXNLZXlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB1c2VkIGJ5IFNlY3VyaXR5IExha2UgdG8gbWFuYWdlIHRoZSBBV1MgR2x1ZVxuICAgKiBtZXRhc3RvcmUuIElmIG9taXR0ZWQsIGEgcm9sZSBpcyBjcmVhdGVkIHdpdGggdGhlXG4gICAqIGBBbWF6b25TZWN1cml0eUxha2VNZXRhc3RvcmVNYW5hZ2VyYCBBV1MgbWFuYWdlZCBwb2xpY3kgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSByb2xlIGlzIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IFNlY3VyaXR5IExha2VcbiAgICogZGF0YS4gUmVxdWlyZWQgd2hlbiBga21zS2V5SWRgIGlzIHNldCB0byBhIGN1c3RvbWVyLW1hbmFnZWQga2V5IGFuZCB0aGlzXG4gICAqIGNvbnN0cnVjdCBjcmVhdGVzIHRoZSBtZXRhc3RvcmUgbWFuYWdlciByb2xlIChpLmUuIHdoZW5cbiAgICogYG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuYCBpcyBub3QgcHJvdmlkZWQpLiBUaGUgbWV0YXN0b3JlIG1hbmFnZXJcbiAgICogTGFtYmRhIG11c3QgZGVjcnlwdCBhbmQgKHJlKWVuY3J5cHQgU2VjdXJpdHkgTGFrZSBtZXRhZGF0YTsgdGhlIEFXU1xuICAgKiBtYW5hZ2VkIHBvbGljeSBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YXN0b3JlTWFuYWdlcmAgZG9lcyBub3QgaW5jbHVkZVxuICAgKiBLTVMgcGVybWlzc2lvbnMsIHNvIHdpdGhvdXQgdGhpcyBncmFudCB0aGUgc3RhY2sgZGVwbG95cyBidXQgcGFydGl0aW9uXG4gICAqIHVwZGF0ZXMgYW5kIHN1YnNjcmliZXIgcXVlcmllcyBzaWxlbnRseSBmYWlsLiBOb3QgcmVxdWlyZWQgd2hlblxuICAgKiBga21zS2V5SWRgIGlzIHVuc2V0IG9yIHNldCB0byBgUzNfTUFOQUdFRF9LRVlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIEtNUyBzdGF0ZW1lbnQgaXMgYWRkZWQgKHN1ZmZpY2llbnQgd2hlbiB0aGUgZGF0YSBsYWtlXG4gICAqIHVzZXMgU2VjdXJpdHkgTGFrZSBkZWZhdWx0cyBvciBTU0UtUzMpXG4gICAqL1xuICByZWFkb25seSBtZXRhU3RvcmVNYW5hZ2VyS21zS2V5QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFNlY3VyaXR5IExha2UgbWFuYWdlZCBTMyBzdG9yYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlY3VyaXR5IExha2UgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IGxpZmVjeWNsZT86IFNlY3VyaXR5TGFrZUxpZmVjeWNsZVByb3BzO1xuXG4gIC8qKlxuICAgKiBSZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgU2VjdXJpdHkgTGFrZSBtYW5hZ2VkIFMzIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2F0aW9uPzogU2VjdXJpdHlMYWtlUmVwbGljYXRpb25Qcm9wcztcblxuICAvKipcbiAgICogVGhlIEFXUyBuYXRpdmUgbG9nIHNvdXJjZXMgdG8gZW5hYmxlIG9uIHRoZSBkYXRhIGxha2UuIFNvdXJjZXMgYXJlXG4gICAqIGNyZWF0ZWQgc2VxdWVudGlhbGx5IHVzaW5nIGBEZXBlbmRzT25gIGFzIHJlcXVpcmVkIGJ5IFNlY3VyaXR5IExha2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbG9nIHNvdXJjZXMgYXJlIGVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1NvdXJjZXM/OiBBd3NMb2dTb3VyY2VQcm9wc1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSB0aGUgYEFXU1NlcnZpY2VSb2xlRm9yTGFrZUZvcm1hdGlvbkRhdGFBY2Nlc3NgXG4gICAqIHNlcnZpY2UtbGlua2VkIHJvbGUuIFNlY3VyaXR5IExha2UgcmVxdWlyZXMgdGhpcyByb2xlIHRvIGV4aXN0IGluIHRoZVxuICAgKiBhY2NvdW50IGJlZm9yZSBhIGRhdGEgbGFrZSBjYW4gYmUgY3JlYXRlZDsgaG93ZXZlciB0aGUgcm9sZSBpcyBhXG4gICAqIHNpbmdsZXRvbiBwZXIgYWNjb3VudCBhbmQgaXMgZnJlcXVlbnRseSBhdXRvLWNyZWF0ZWQgb24gZmlyc3QgdXNlIG9mXG4gICAqIExha2UgRm9ybWF0aW9uLiBFbmFibGUgdGhpcyBvbmx5IHdoZW4geW91IGtub3cgdGhlIHJvbGUgZG9lcyBub3QgeWV0XG4gICAqIGV4aXN0IGluIHRoZSBhY2NvdW50LCBvdGhlcndpc2Ugc3RhY2sgY3JlYXRpb24gd2lsbCBmYWlsIHdpdGhcbiAgICogYGhhcyBiZWVuIHRha2VuIGluIHRoaXMgYWNjb3VudGAuXG4gICAqXG4gICAqIFRoZSBkYXRhIGxha2Ugd2lsbCBgRGVwZW5kc09uYCB0aGlzIHJvbGUgd2hlbiBpdCBpcyBjcmVhdGVkIHNvIG9yZGVyaW5nXG4gICAqIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXJzIHRoYXQgc2hvdWxkIHJlY2VpdmUgUzMgbm90aWZpY2F0aW9ucyBvZiBuZXcgU2VjdXJpdHkgTGFrZVxuICAgKiBvYmplY3RzLiBFYWNoIGVudHJ5IGNyZWF0ZXMgYW4gYEFXUzo6U2VjdXJpdHlMYWtlOjpTdWJzY3JpYmVyYCAoYWNjZXNzXG4gICAqIHR5cGUgYFMzYCkgcGx1cyBhbiBgQVdTOjpTZWN1cml0eUxha2U6OlN1YnNjcmliZXJOb3RpZmljYXRpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN1YnNjcmliZXJzIGFyZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBzdWJzY3JpYmVycz86IFNlY3VyaXR5TGFrZVN1YnNjcmliZXJQcm9wc1tdO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIEFtYXpvbiBTZWN1cml0eSBMYWtlLiBXcmFwcyB0aGUgU2VjdXJpdHkgTGFrZSBMMSBjb25zdHJ1Y3RzIHRvXG4gKiBzdGFuZCB1cCBhIGRhdGEgbGFrZSB3aXRoIGFuIG9wdGlvbmFsIHNldCBvZiBBV1MgbmF0aXZlIGxvZyBzb3VyY2VzXG4gKiBlbmFibGVkLCBhIG1ldGFzdG9yZSBtYW5hZ2VyIHJvbGUsIGxpZmVjeWNsZSBwb2xpY3kgYW5kIHJlcGxpY2F0aW9uLlxuICpcbiAqIFdoZXJlIHRoaXMgY29uc3RydWN0IGRvZXMgbm90IG1lZXQgeW91ciBuZWVkcywgdXNlIHRoZSB1bmRlcmx5aW5nXG4gKiBgQ2ZuRGF0YUxha2VgIGFuZCBgQ2ZuQXdzTG9nU291cmNlYCBjb25zdHJ1Y3RzIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRTZWN1cml0eUxha2UgZXh0ZW5kcyBFeHRlbmRlZENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBgQ2ZuRGF0YUxha2VgIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUxha2U6IENmbkRhdGFMYWtlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdXNlZCBieSBTZWN1cml0eSBMYWtlIHRvIG1hbmFnZSB0aGUgR2x1ZSBtZXRhc3RvcmUuIFdoZW5cbiAgICogYG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuYCBpcyBwcm92aWRlZCB0aGlzIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBtZXRhU3RvcmVNYW5hZ2VyUm9sZT86IFJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB1c2VkIGJ5IFNlY3VyaXR5IExha2UgdG8gcmVwbGljYXRlIG9iamVjdHMuIE9ubHkgY3JlYXRlZFxuICAgKiB3aGVuIHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQgYW5kIG5vIGByb2xlQXJuYCB3YXMgc3VwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhdGlvblJvbGU/OiBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFrZSBGb3JtYXRpb24gYEFXU1NlcnZpY2VSb2xlRm9yTGFrZUZvcm1hdGlvbkRhdGFBY2Nlc3NgXG4gICAqIHNlcnZpY2UtbGlua2VkIHJvbGUsIHdoZW4gaXQgd2FzIHByb3Zpc2lvbmVkIGJ5IHRoaXMgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlPzogQ2ZuU2VydmljZUxpbmtlZFJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBgQ2ZuQXdzTG9nU291cmNlYCByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdCwgaW4gdGhlIG9yZGVyXG4gICAqIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ1NvdXJjZXM6IENmbkF3c0xvZ1NvdXJjZVtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBgQ2ZuU3Vic2NyaWJlcmAgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QsIGluIHRoZSBvcmRlclxuICAgKiB0aGV5IHdlcmUgZGVjbGFyZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJzY3JpYmVyczogQ2ZuU3Vic2NyaWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBgQ2ZuU3Vic2NyaWJlck5vdGlmaWNhdGlvbmAgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QsXG4gICAqIG9uZSBwZXIgc3Vic2NyaWJlciwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnNjcmliZXJOb3RpZmljYXRpb25zOiBDZm5TdWJzY3JpYmVyTm90aWZpY2F0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFN0YW5kYXJkU2VjdXJpdHlMYWtlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIE9wdGlvbmFsIExha2UgRm9ybWF0aW9uIHNlcnZpY2UtbGlua2VkIHJvbGUuIFNlY3VyaXR5IExha2UgcmVxdWlyZXNcbiAgICAvLyB0aGlzIFNMUiB0byBleGlzdCBpbiB0aGUgYWNjb3VudCBiZWZvcmUgYSBkYXRhIGxha2UgY2FuIGJlIGNyZWF0ZWQuXG4gICAgaWYgKHByb3BzPy5jcmVhdGVMYWtlRm9ybWF0aW9uU2VydmljZUxpbmtlZFJvbGUpIHtcbiAgICAgIHRoaXMubGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlID0gbmV3IENmblNlcnZpY2VMaW5rZWRSb2xlKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnTGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlJyxcbiAgICAgICAge1xuICAgICAgICAgIGF3c1NlcnZpY2VOYW1lOiAnbGFrZWZvcm1hdGlvbi5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdTZXJ2aWNlLWxpbmtlZCByb2xlIHVzZWQgYnkgQVdTIExha2UgRm9ybWF0aW9uIHRvIGFjY2VzcyByZWdpc3RlcmVkIFMzIGxvY2F0aW9ucy4gUmVxdWlyZWQgYnkgQW1hem9uIFNlY3VyaXR5IExha2UuJyxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBUaGUgTGFrZSBGb3JtYXRpb24gU0xSIGlzIGFuIGFjY291bnQgc2luZ2xldG9uIHRoYXQgaXMgZnJlcXVlbnRseVxuICAgICAgLy8gc2hhcmVkIHdpdGggb3RoZXIgc3RhY2tzIGFuZCBjb25zb2xlcy4gUmV0YWluIGl0IG9uXG4gICAgICAvLyBzdGFjay1kZWxldGUvb3B0LW91dCBzbyB0b2dnbGluZyB0aGlzIGZsYWcgb2ZmIChvciByZW1vdmluZyB0aGlzXG4gICAgICAvLyBjb25zdHJ1Y3QpIGRvZXMgbm90IHN0cmlwIExha2UgRm9ybWF0aW9uIGFjY2VzcyBhY2NvdW50LXdpZGUuXG4gICAgICB0aGlzLmxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZS5hcHBseVJlbW92YWxQb2xpY3koXG4gICAgICAgIFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBNZXRhc3RvcmUgbWFuYWdlciByb2xlLlxuICAgIGxldCBtZXRhU3RvcmVNYW5hZ2VyUm9sZUFybiA9IHByb3BzPy5tZXRhU3RvcmVNYW5hZ2VyUm9sZUFybjtcbiAgICBjb25zdCB1c2VzQ3VzdG9tZXJNYW5hZ2VkS2V5ID1cbiAgICAgIHByb3BzPy5rbXNLZXlJZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmttc0tleUlkICE9PSAnUzNfTUFOQUdFRF9LRVknO1xuICAgIGlmICghbWV0YVN0b3JlTWFuYWdlclJvbGVBcm4pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRhdGEgbGFrZSBpcyBlbmNyeXB0ZWQgd2l0aCBhIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSxcbiAgICAgIC8vIHRoZSBtZXRhc3RvcmUgbWFuYWdlciBMYW1iZGEgbXVzdCBiZSBhYmxlIHRvIERlY3J5cHQgLyBFbmNyeXB0IC9cbiAgICAgIC8vIEdlbmVyYXRlRGF0YUtleSBhZ2FpbnN0IHRoYXQga2V5LiBUaGUgQVdTIG1hbmFnZWQgcG9saWN5XG4gICAgICAvLyBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YXN0b3JlTWFuYWdlcmAgZG9lcyBOT1QgaW5jbHVkZSBLTVMgYWN0aW9ucyxcbiAgICAgIC8vIHNvIHdpdGhvdXQgdGhpcyBncmFudCBDRk4gZGVwbG95bWVudCBzdWNjZWVkcyBidXQgcGFydGl0aW9uXG4gICAgICAvLyB1cGRhdGVzIGFuZCBzdWJzY3JpYmVyIHF1ZXJpZXMgZmFpbCBhdCBydW50aW1lLiBUaGUga2V5IEFSTiBpc1xuICAgICAgLy8gbm90IGRlcml2YWJsZSBhdCBzeW50aCB0aW1lLCBzbyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gc3VwcGx5IGl0XG4gICAgICAvLyBleHBsaWNpdGx5IHZpYSBgbWV0YVN0b3JlTWFuYWdlckttc0tleUFybmAgb3IgcHJlLXByb3Zpc2lvbiB0aGVpclxuICAgICAgLy8gb3duIG1ldGFzdG9yZSBtYW5hZ2VyIHJvbGUgdmlhIGBtZXRhU3RvcmVNYW5hZ2VyUm9sZUFybmAuXG4gICAgICBpZiAodXNlc0N1c3RvbWVyTWFuYWdlZEtleSAmJiAhcHJvcHM/Lm1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTdGFuZGFyZFNlY3VyaXR5TGFrZTogYSBjdXN0b21lci1tYW5hZ2VkIGBrbXNLZXlJZGAgcmVxdWlyZXMgJyArXG4gICAgICAgICAgICAnYG1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm5gIHNvIHRoZSBnZW5lcmF0ZWQgbWV0YXN0b3JlIG1hbmFnZXIgJyArXG4gICAgICAgICAgICAncm9sZSBjYW4gYmUgZ3JhbnRlZCB0aGUgbmVjZXNzYXJ5IEtNUyBwZXJtaXNzaW9ucy4gJyArXG4gICAgICAgICAgICAnQWx0ZXJuYXRpdmVseSwgcHJlLXByb3Zpc2lvbiB0aGUgbWV0YXN0b3JlIG1hbmFnZXIgcm9sZSAnICtcbiAgICAgICAgICAgICd5b3Vyc2VsZiBhbmQgcGFzcyBpdHMgQVJOIHZpYSBgbWV0YVN0b3JlTWFuYWdlclJvbGVBcm5gLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhU3RvcmVJbmxpbmVQb2xpY2llczoge1tuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudH0gPSB7fTtcbiAgICAgIGlmICh1c2VzQ3VzdG9tZXJNYW5hZ2VkS2V5ICYmIHByb3BzPy5tZXRhU3RvcmVNYW5hZ2VyS21zS2V5QXJuKSB7XG4gICAgICAgIG1ldGFTdG9yZUlubGluZVBvbGljaWVzLkFtYXpvblNlY3VyaXR5TGFrZU1ldGFzdG9yZU1hbmFnZXJLbXNQb2xpY3kgPVxuICAgICAgICAgIG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIHNpZDogJ0FsbG93TWV0YVN0b3JlTWFuYWdlckttc0FjY2VzcycsXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgICdrbXM6RW5jcnlwdCcsXG4gICAgICAgICAgICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleScsXG4gICAgICAgICAgICAgICAgICAna21zOkRlc2NyaWJlS2V5JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW3Byb3BzLm1ldGFTdG9yZU1hbmFnZXJLbXNLZXlBcm5dLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGFTdG9yZU1hbmFnZXJSb2xlID0gbmV3IFJvbGUodGhpcywgJ01ldGFTdG9yZU1hbmFnZXJSb2xlJywge1xuICAgICAgICAvLyBUaGUgcGFydGl0aW9uLXVwZGF0ZXIgTGFtYmRhIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IFNlY3VyaXR5IExha2UgYXJlXG4gICAgICAgIC8vIGhhcmQtY29kZWQgdG8gYXNzdW1lIGEgcm9sZSBuYW1lZFxuICAgICAgICAvLyBgQW1hem9uU2VjdXJpdHlMYWtlTWV0YVN0b3JlTWFuYWdlclYyYCB1bmRlciB0aGUgYC9zZXJ2aWNlLXJvbGUvYFxuICAgICAgICAvLyBwYXRoIGFuZCBkbyBub3QgaG9ub3IgYW4gYXJiaXRyYXJ5IHJvbGUgQVJOLiBXaXRob3V0IGEgbWF0Y2hpbmdcbiAgICAgICAgLy8gcm9sZSBuYW1lLCBDRk4gZGVwbG95bWVudCBhbmQgYENyZWF0ZURhdGFMYWtlYCBzdWNjZWVkIGJ1dCB0aGVcbiAgICAgICAgLy8gcGFydGl0aW9uIHVwZGF0ZXIgc2lsZW50bHkgZmFpbHMgYW5kIHN1YnNjcmliZXJzIGNhbm5vdCBxdWVyeVxuICAgICAgICAvLyByZXBsaWNhdGVkIG9iamVjdHMuIFRoZSByb2xlIG5hbWUgaXMgYWNjb3VudC1nbG9iYWw7IGZvclxuICAgICAgICAvLyBtdWx0aS1SZWdpb24gZGVwbG95cyBpbiB0aGUgc2FtZSBhY2NvdW50IHBhc3NcbiAgICAgICAgLy8gYG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuYCBmb3IgYWxsIGJ1dCBvbmUgUmVnaW9uLlxuICAgICAgICBwYXRoOiAnL3NlcnZpY2Utcm9sZS8nLFxuICAgICAgICByb2xlTmFtZTogJ0FtYXpvblNlY3VyaXR5TGFrZU1ldGFTdG9yZU1hbmFnZXJWMicsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdSb2xlIHVzZWQgYnkgQW1hem9uIFNlY3VyaXR5IExha2UgbWV0YXN0b3JlIG1hbmFnZXIgTGFtYmRhIHRvIG1hbmFnZSB0aGUgQVdTIEdsdWUgbWV0YXN0b3JlLicsXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIE1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgICAgJ3NlcnZpY2Utcm9sZS9BbWF6b25TZWN1cml0eUxha2VNZXRhc3RvcmVNYW5hZ2VyJyxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICBpbmxpbmVQb2xpY2llczogbWV0YVN0b3JlSW5saW5lUG9saWNpZXMsXG4gICAgICB9KTtcbiAgICAgIG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuID0gdGhpcy5tZXRhU3RvcmVNYW5hZ2VyUm9sZS5yb2xlQXJuO1xuICAgIH1cblxuICAgIC8vIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAgICBjb25zdCBlbmNyeXB0aW9uQ29uZmlndXJhdGlvbjpcbiAgICAgIHwgQ2ZuRGF0YUxha2UuRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVxuICAgICAgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvcHM/Lmttc0tleUlkICE9PSB1bmRlZmluZWQgPyB7a21zS2V5SWQ6IHByb3BzLmttc0tleUlkfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgIGxldCBsaWZlY3ljbGVDb25maWd1cmF0aW9uOlxuICAgICAgfCBDZm5EYXRhTGFrZS5MaWZlY3ljbGVDb25maWd1cmF0aW9uUHJvcGVydHlcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcz8ubGlmZWN5Y2xlKSB7XG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBleHBpcmF0aW9uOlxuICAgICAgICAgIHByb3BzLmxpZmVjeWNsZS5leHBpcmF0aW9uRGF5cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHtkYXlzOiBwcm9wcy5saWZlY3ljbGUuZXhwaXJhdGlvbkRheXN9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IHByb3BzLmxpZmVjeWNsZS50cmFuc2l0aW9ucz8ubWFwKCh0KSA9PiAoe1xuICAgICAgICAgIGRheXM6IHQuZGF5cyxcbiAgICAgICAgICBzdG9yYWdlQ2xhc3M6IHQuc3RvcmFnZUNsYXNzLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAgbGV0IHJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjpcbiAgICAgIHwgQ2ZuRGF0YUxha2UuUmVwbGljYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcz8ucmVwbGljYXRpb24pIHtcbiAgICAgIGxldCByZXBsaWNhdGlvblJvbGVBcm4gPSBwcm9wcy5yZXBsaWNhdGlvbi5yb2xlQXJuO1xuICAgICAgaWYgKCFyZXBsaWNhdGlvblJvbGVBcm4pIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgICAgIGNvbnN0IHNvdXJjZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWdpb25zID0gcHJvcHMucmVwbGljYXRpb24ucmVnaW9ucztcblxuICAgICAgICAvLyBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGVuY3J5cHRpb24gYXJlIGluZGVwZW5kZW50IGluIFNlY3VyaXR5XG4gICAgICAgIC8vIExha2U6IGEgQ01LIHNvdXJjZSBjYW4gcmVwbGljYXRlIHRvIGFuIFNTRS1TMyByb2xsdXAgYW5kIHZpY2VcbiAgICAgICAgLy8gdmVyc2EuIEdyYW50IGBrbXM6RGVjcnlwdGAgb24gdGhlIHNvdXJjZSBrZXkgb25seSB3aGVuIHRoZVxuICAgICAgICAvLyBzb3VyY2UgbGFrZSB1c2VzIGEgQ01LLCBhbmQgZ3JhbnQgYGttczpFbmNyeXB0YCAvXG4gICAgICAgIC8vIGBrbXM6R2VuZXJhdGVEYXRhS2V5YCBvbiB0aGUgZGVzdGluYXRpb24ga2V5cyBvbmx5IHdoZW4gYW55XG4gICAgICAgIC8vIHJvbGx1cCBidWNrZXQgdXNlcyBhIENNSy4gVGhlIGtleSBBUk5zIGFyZSBub3QgZGVyaXZhYmxlIGF0XG4gICAgICAgIC8vIHN5bnRoIHRpbWUsIHNvIHJlcXVpcmUgdGhlIGNhbGxlciB0byBzdXBwbHkgdGhlbSBleHBsaWNpdGx5IG9uXG4gICAgICAgIC8vIHRoZSBlbmNyeXB0ZWQgc2lkZSAob3IgcHJlLXByb3Zpc2lvbiB0aGVpciBvd24gcmVwbGljYXRpb24gcm9sZVxuICAgICAgICAvLyB2aWEgYHJlcGxpY2F0aW9uLnJvbGVBcm5gKS5cbiAgICAgICAgaWYgKHVzZXNDdXN0b21lck1hbmFnZWRLZXkgJiYgIXByb3BzLnJlcGxpY2F0aW9uLnNvdXJjZUttc0tleUFybikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGFuZGFyZFNlY3VyaXR5TGFrZTogYSBjdXN0b21lci1tYW5hZ2VkIGBrbXNLZXlJZGAgd2l0aCAnICtcbiAgICAgICAgICAgICAgJ3JlcGxpY2F0aW9uIHJlcXVpcmVzIGByZXBsaWNhdGlvbi5zb3VyY2VLbXNLZXlBcm5gIHNvIHRoZSAnICtcbiAgICAgICAgICAgICAgJ2dlbmVyYXRlZCByZXBsaWNhdGlvbiByb2xlIGNhbiBga21zOkRlY3J5cHRgIHNvdXJjZSBvYmplY3RzLiAnICtcbiAgICAgICAgICAgICAgJ0lmIGFueSByb2xsdXAgUmVnaW9uIGJ1Y2tldCBpcyBhbHNvIGVuY3J5cHRlZCB3aXRoIGEgJyArXG4gICAgICAgICAgICAgICdjdXN0b21lci1tYW5hZ2VkIGtleSwgcGFzcyBpdHMgQVJOIHZpYSAnICtcbiAgICAgICAgICAgICAgJ2ByZXBsaWNhdGlvbi5kZXN0aW5hdGlvbkttc0tleUFybnNgLiBBbHRlcm5hdGl2ZWx5LCAnICtcbiAgICAgICAgICAgICAgJ3ByZS1wcm92aXNpb24gdGhlIHJlcGxpY2F0aW9uIHJvbGUgeW91cnNlbGYgYW5kIHBhc3MgaXRzIEFSTiAnICtcbiAgICAgICAgICAgICAgJ3ZpYSBgcmVwbGljYXRpb24ucm9sZUFybmAuJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga21zU3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10gPSBbXTtcbiAgICAgICAgaWYgKHVzZXNDdXN0b21lck1hbmFnZWRLZXkgJiYgcHJvcHMucmVwbGljYXRpb24uc291cmNlS21zS2V5QXJuKSB7XG4gICAgICAgICAga21zU3RhdGVtZW50cy5wdXNoKFxuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0FsbG93RGVjcnlwdFNvdXJjZUttc0tleScsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsna21zOkRlY3J5cHQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucmVwbGljYXRpb24uc291cmNlS21zS2V5QXJuXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uLmRlc3RpbmF0aW9uS21zS2V5QXJucyAmJlxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uLmRlc3RpbmF0aW9uS21zS2V5QXJucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGttc1N0YXRlbWVudHMucHVzaChcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdBbGxvd0VuY3J5cHREZXN0aW5hdGlvbkttc0tleXMnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2ttczpFbmNyeXB0JywgJ2ttczpHZW5lcmF0ZURhdGFLZXknXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBwcm9wcy5yZXBsaWNhdGlvbi5kZXN0aW5hdGlvbkttc0tleUFybnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXBsaWNhdGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCAnUmVwbGljYXRpb25Sb2xlJywge1xuICAgICAgICAgIC8vIFNlY3VyaXR5IExha2UgcmVxdWlyZXMgdGhlIHJlcGxpY2F0aW9uIHJvbGUgdG8gbGl2ZSB1bmRlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2aWNlLXJvbGUvIHBhdGggYW5kIHN0YXJ0IHdpdGggYFNlY3VyaXR5TGFrZWAuIElBTSByb2xlIG5hbWVzXG4gICAgICAgICAgLy8gYXJlIGFjY291bnQtZ2xvYmFsLCBzbyBpbmNsdWRlIHRoZSBzb3VyY2UgUmVnaW9uIGluIHRoZSBzdWZmaXggdG9cbiAgICAgICAgICAvLyBhdm9pZCBjb2xsaXNpb25zIHdoZW4gdGhlIGNvbnN0cnVjdCBpcyBkZXBsb3llZCB0byBtdWx0aXBsZVxuICAgICAgICAgIC8vIFJlZ2lvbnMgaW4gdGhlIHNhbWUgYWNjb3VudC5cbiAgICAgICAgICBwYXRoOiAnL3NlcnZpY2Utcm9sZS8nLFxuICAgICAgICAgIHJvbGVOYW1lOiBgU2VjdXJpdHlMYWtlUzNSZXBsaWNhdGlvblJvbGUtJHtzb3VyY2VSZWdpb259YCxcbiAgICAgICAgICAvLyBBbWF6b24gUzMgcGVyZm9ybXMgdGhlIGNyb3NzLVJlZ2lvbiByZXBsaWNhdGlvbiwgc28gaXQgKG5vdCB0aGVcbiAgICAgICAgICAvLyBTZWN1cml0eSBMYWtlIHNlcnZpY2UpIG11c3QgYmUgYWxsb3dlZCB0byBhc3N1bWUgdGhpcyByb2xlLlxuICAgICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3MzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdSb2xlIHVzZWQgYnkgQW1hem9uIFMzIHRvIHJlcGxpY2F0ZSBBbWF6b24gU2VjdXJpdHkgTGFrZSBvYmplY3RzIGFjcm9zcyBSZWdpb25zLicsXG4gICAgICAgICAgLy8gTm8gQVdTIG1hbmFnZWQgcG9saWN5IGV4aXN0cyBmb3IgdGhpcyByb2xlOyBhdHRhY2ggdGhlIGlubGluZVxuICAgICAgICAgIC8vIHBvbGljeSBkb2N1bWVudGVkIGJ5IFNlY3VyaXR5IExha2UuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3VyaXR5LWxha2UvbGF0ZXN0L3VzZXJndWlkZS9hZGQtcm9sbHVwLXJlZ2lvbi5odG1sXG4gICAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICAgIEFtYXpvblNlY3VyaXR5TGFrZVMzUmVwbGljYXRpb25Sb2xlUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgICBzaWQ6ICdBbGxvd1JlYWRTM1JlcGxpY2F0aW9uU2V0dGluZycsXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uRm9yUmVwbGljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnczM6R2V0T2JqZWN0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uQWNsJyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdFZlcnNpb25UYWdnaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdFJldGVudGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RMZWdhbEhvbGQnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpzMzo6OmF3cy1zZWN1cml0eS1kYXRhLWxha2UtJHtzb3VyY2VSZWdpb259KmAsXG4gICAgICAgICAgICAgICAgICAgIGBhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OnMzOjo6YXdzLXNlY3VyaXR5LWRhdGEtbGFrZS0ke3NvdXJjZVJlZ2lvbn0qLypgLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7J3MzOlJlc291cmNlQWNjb3VudCc6IFthY2NvdW50XX0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgICAgc2lkOiAnQWxsb3dTM1JlcGxpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ3MzOlJlcGxpY2F0ZU9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICdzMzpSZXBsaWNhdGVEZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICAnczM6UmVwbGljYXRlVGFncycsXG4gICAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uVGFnZ2luZycsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBkZXN0aW5hdGlvblJlZ2lvbnMuZmxhdE1hcCgocikgPT4gW1xuICAgICAgICAgICAgICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpzMzo6OmF3cy1zZWN1cml0eS1kYXRhLWxha2UtJHtyfSovKmAsXG4gICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7J3MzOlJlc291cmNlQWNjb3VudCc6IFthY2NvdW50XX0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLmttc1N0YXRlbWVudHMsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVwbGljYXRpb25Sb2xlQXJuID0gdGhpcy5yZXBsaWNhdGlvblJvbGUucm9sZUFybjtcbiAgICAgIH1cbiAgICAgIHJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgcmVnaW9uczogcHJvcHMucmVwbGljYXRpb24ucmVnaW9ucyxcbiAgICAgICAgcm9sZUFybjogcmVwbGljYXRpb25Sb2xlQXJuLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFMYWtlID0gbmV3IENmbkRhdGFMYWtlKHRoaXMsICdEYXRhTGFrZScsIHtcbiAgICAgIG1ldGFTdG9yZU1hbmFnZXJSb2xlQXJuLFxuICAgICAgZW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24sXG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uLFxuICAgICAgcmVwbGljYXRpb25Db25maWd1cmF0aW9uLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmxha2VGb3JtYXRpb25TZXJ2aWNlTGlua2VkUm9sZSkge1xuICAgICAgdGhpcy5kYXRhTGFrZS5hZGREZXBlbmRlbmN5KHRoaXMubGFrZUZvcm1hdGlvblNlcnZpY2VMaW5rZWRSb2xlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgQVdTIGxvZyBzb3VyY2VzIHNlcXVlbnRpYWxseSB1c2luZyBEZXBlbmRzT24sIGFzIHJlcXVpcmVkIGJ5XG4gICAgLy8gU2VjdXJpdHkgTGFrZSB3aGVuIG1vcmUgdGhhbiBvbmUgc291cmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHNhbWVcbiAgICAvLyB0ZW1wbGF0ZS5cbiAgICBsZXQgcHJldmlvdXM6IENmbkF3c0xvZ1NvdXJjZSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9wcz8ubG9nU291cmNlcyA/PyBbXSkge1xuICAgICAgY29uc3QgbG9nU291cmNlID0gbmV3IENmbkF3c0xvZ1NvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExvZ1NvdXJjZSR7c291cmNlLnNvdXJjZU5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFMYWtlQXJuOiB0aGlzLmRhdGFMYWtlLmF0dHJBcm4sXG4gICAgICAgICAgc291cmNlTmFtZTogc291cmNlLnNvdXJjZU5hbWUsXG4gICAgICAgICAgc291cmNlVmVyc2lvbjogc291cmNlLnNvdXJjZVZlcnNpb24gPz8gJzIuMCcsXG4gICAgICAgICAgYWNjb3VudHM6IHNvdXJjZS5hY2NvdW50cyA/PyBbU3RhY2sub2YodGhpcykuYWNjb3VudF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbG9nU291cmNlLmFkZERlcGVuZGVuY3kodGhpcy5kYXRhTGFrZSk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgbG9nU291cmNlLmFkZERlcGVuZGVuY3kocHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBsb2dTb3VyY2U7XG4gICAgICB0aGlzLmxvZ1NvdXJjZXMucHVzaChsb2dTb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIFN1YnNjcmliZXJzLiBFYWNoIGVudHJ5IGJlY29tZXMgYSBgQ2ZuU3Vic2NyaWJlcmAgd2l0aCBgYWNjZXNzVHlwZXM6XG4gICAgLy8gWydTMyddYCBwbHVzIGEgc2libGluZyBgQ2ZuU3Vic2NyaWJlck5vdGlmaWNhdGlvbmAuIFRoZSBub3RpZmljYXRpb25cbiAgICAvLyBkZWZhdWx0cyB0byBTUVMgKFNlY3VyaXR5IExha2UgY3JlYXRlcyB0aGUgcXVldWUgaW4gdGhpcyBhY2NvdW50KTtcbiAgICAvLyBjYWxsZXJzIGNhbiBzd2l0Y2ggdG8gSFRUUFMgYnkgcGFzc2luZyBgaHR0cHNOb3RpZmljYXRpb25FbmRwb2ludGAuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgcHJvcHM/LnN1YnNjcmliZXJzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IENmblN1YnNjcmliZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBTdWJzY3JpYmVyJHtzdWIuc3Vic2NyaWJlck5hbWV9YCxcbiAgICAgICAge1xuICAgICAgICAgIGFjY2Vzc1R5cGVzOiBbJ1MzJ10sXG4gICAgICAgICAgZGF0YUxha2VBcm46IHRoaXMuZGF0YUxha2UuYXR0ckFybixcbiAgICAgICAgICBzdWJzY3JpYmVyTmFtZTogc3ViLnN1YnNjcmliZXJOYW1lLFxuICAgICAgICAgIHN1YnNjcmliZXJEZXNjcmlwdGlvbjogc3ViLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHN1YnNjcmliZXJJZGVudGl0eToge1xuICAgICAgICAgICAgZXh0ZXJuYWxJZDogc3ViLmV4dGVybmFsSWQsXG4gICAgICAgICAgICBwcmluY2lwYWw6IHN1Yi5wcmluY2lwYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3VyY2VzOiBzdWIuc291cmNlcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBhd3NMb2dTb3VyY2U6IHtcbiAgICAgICAgICAgICAgc291cmNlTmFtZTogcy5zb3VyY2VOYW1lLFxuICAgICAgICAgICAgICBzb3VyY2VWZXJzaW9uOiBzLnNvdXJjZVZlcnNpb24gPz8gJzIuMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBzdWJzY3JpYmVyLmFkZERlcGVuZGVuY3kodGhpcy5kYXRhTGFrZSk7XG4gICAgICAvLyBTdWJzY3JpYmVyIGNyZWF0aW9uIHJlcXVpcmVzIHRoZSBBd3NMb2dTb3VyY2UgdG8gZXhpc3QgZm9yIGV2ZXJ5XG4gICAgICAvLyBzb3VyY2UgaXQgcmVmZXJlbmNlczsgY2hhaW4gdGhyb3VnaCB0aGUgbGFzdCBsb2cgc291cmNlIHdlIGNyZWF0ZWRcbiAgICAgIC8vIHNvIENGTiB3YWl0cyBmb3IgaW5nZXN0aW9uIHRvIGJlIGVuYWJsZWQuXG4gICAgICBmb3IgKGNvbnN0IGxzIG9mIHRoaXMubG9nU291cmNlcykge1xuICAgICAgICBzdWJzY3JpYmVyLmFkZERlcGVuZGVuY3kobHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHN1Yi5odHRwc05vdGlmaWNhdGlvbkVuZHBvaW50ICYmXG4gICAgICAgICFzdWIuaHR0cHNOb3RpZmljYXRpb25UYXJnZXRSb2xlQXJuXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdGFuZGFyZFNlY3VyaXR5TGFrZTogc3Vic2NyaWJlciBcIiR7c3ViLnN1YnNjcmliZXJOYW1lfVwiIHNldHMgYCArXG4gICAgICAgICAgICAnYGh0dHBzTm90aWZpY2F0aW9uRW5kcG9pbnRgIGJ1dCBubyAnICtcbiAgICAgICAgICAgICdgaHR0cHNOb3RpZmljYXRpb25UYXJnZXRSb2xlQXJuYC4gVGhlIENsb3VkRm9ybWF0aW9uL0FQSSBwYXRoICcgK1xuICAgICAgICAgICAgJ2RvZXMgbm90IGF1dG8tcHJvdmlzaW9uIHRoZSBFdmVudEJyaWRnZSBpbnZvY2F0aW9uIHJvbGUgKG9ubHkgJyArXG4gICAgICAgICAgICAndGhlIEFXUyBjb25zb2xlIGRvZXMpLiBDcmVhdGUgYSByb2xlIHRydXN0ZWQgYnkgJyArXG4gICAgICAgICAgICAnYGV2ZW50cy5hbWF6b25hd3MuY29tYCB3aXRoIGBldmVudHM6SW52b2tlQXBpRGVzdGluYXRpb25gIG9uICcgK1xuICAgICAgICAgICAgJ3RoZSB0YXJnZXQgZW5kcG9pbnQgYW5kIHBhc3MgaXRzIEFSTiBhcyAnICtcbiAgICAgICAgICAgICdgaHR0cHNOb3RpZmljYXRpb25UYXJnZXRSb2xlQXJuYC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSBuZXcgQ2ZuU3Vic2NyaWJlck5vdGlmaWNhdGlvbihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFN1YnNjcmliZXJOb3RpZmljYXRpb24ke3N1Yi5zdWJzY3JpYmVyTmFtZX1gLFxuICAgICAgICB7XG4gICAgICAgICAgc3Vic2NyaWJlckFybjogc3Vic2NyaWJlci5hdHRyU3Vic2NyaWJlckFybixcbiAgICAgICAgICBub3RpZmljYXRpb25Db25maWd1cmF0aW9uOiBzdWIuaHR0cHNOb3RpZmljYXRpb25FbmRwb2ludFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgaHR0cHNOb3RpZmljYXRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBlbmRwb2ludDogc3ViLmh0dHBzTm90aWZpY2F0aW9uRW5kcG9pbnQsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRSb2xlQXJuOiBzdWIuaHR0cHNOb3RpZmljYXRpb25UYXJnZXRSb2xlQXJuIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBzcXNOb3RpZmljYXRpb25Db25maWd1cmF0aW9uOiB7fSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBub3RpZmljYXRpb24uYWRkRGVwZW5kZW5jeShzdWJzY3JpYmVyKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlck5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuXG4gICAgICAvLyBQYXRjaCB0aGUgU2VjdXJpdHktTGFrZS1tYW5hZ2VkIFNRUyBNYWluLVF1ZXVlJ3MgdmlzaWJpbGl0eVxuICAgICAgLy8gdGltZW91dC4gTmVlZGVkIGJlY2F1c2UgU2VjdXJpdHkgTGFrZSBhdXRvLXByb3Zpc2lvbnMgdGhlIHF1ZXVlXG4gICAgICAvLyB3aXRoIDMwMHMsIGxlc3MgdGhhbiB0aGUgYWVzLXNpZW0gZXMtbG9hZGVyIExhbWJkYSB0aW1lb3V0ICg2MDBzXG4gICAgICAvLyBkZWZhdWx0KSwgY2F1c2luZyBldmVudC1zb3VyY2UtbWFwcGluZyBjcmVhdGlvbiB0byBmYWlsIHdpdGhcbiAgICAgIC8vIFwiVGhlIGV2ZW50IHNvdXJjZSBtYXBwaW5nJ3MgZnVuY3Rpb24gdGltZW91dCBtdXN0IGJlIHNtYWxsZXJcbiAgICAgIC8vIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHF1ZXVlJ3MgdmlzaWJpbGl0eSB0aW1lb3V0LlwiXG4gICAgICBpZiAoXG4gICAgICAgICFzdWIuaHR0cHNOb3RpZmljYXRpb25FbmRwb2ludCAmJlxuICAgICAgICBzdWIuc3FzVmlzaWJpbGl0eVRpbWVvdXRTZWNvbmRzICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3ViLnNxc1Zpc2liaWxpdHlUaW1lb3V0U2Vjb25kcztcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICAgICAgLy8gVGhlIG5vdGlmaWNhdGlvbiByZXNvdXJjZSByZXR1cm5zIHRoZSBxdWV1ZSBBUk4gdmlhXG4gICAgICAgIC8vIGBTdWJzY3JpYmVyRW5kcG9pbnRgLiBDb252ZXJ0IHRvIGEgcXVldWUgVVJMIGZvciB0aGUgU1FTIFNESy5cbiAgICAgICAgLy8gQVJOOiBhcm46PHBhcnRpdGlvbj46c3FzOjxyZWdpb24+OjxhY2NvdW50Pjo8bmFtZT5cbiAgICAgICAgLy8gVVJMOiBodHRwczovL3Nxcy48cmVnaW9uPi48dXJsLXN1ZmZpeD4vPGFjY291bnQ+LzxuYW1lPlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgVVJMIHN1ZmZpeCBpcyBwYXJ0aXRpb24tYXdhcmUgKGBhbWF6b25hd3MuY29tYCxcbiAgICAgICAgLy8gYGFtYXpvbmF3cy5jb20uY25gLCBgYzJzLmljLmdvdmAsIGV0Yy4pOyBoYXJkLWNvZGluZ1xuICAgICAgICAvLyBgYW1hem9uYXdzLmNvbWAgYnJlYWtzIGBhd3MtY25gIGFuZCBHb3ZDbG91ZC4gVXNlIHRoZSBzdGFjaydzXG4gICAgICAgIC8vIGB1cmxTdWZmaXhgIHRva2VuIHNvIENsb3VkRm9ybWF0aW9uIHN1YnN0aXR1dGVzIHRoZSByaWdodFxuICAgICAgICAvLyB2YWx1ZSBhdCBkZXBsb3kgdGltZS5cbiAgICAgICAgY29uc3QgcXVldWVOYW1lID0gRm4uc2VsZWN0KFxuICAgICAgICAgIDUsXG4gICAgICAgICAgRm4uc3BsaXQoJzonLCBub3RpZmljYXRpb24uYXR0clN1YnNjcmliZXJFbmRwb2ludCksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHF1ZXVlVXJsID0gYGh0dHBzOi8vc3FzLiR7c3RhY2sucmVnaW9ufS4ke3N0YWNrLnVybFN1ZmZpeH0vJHtzdGFjay5hY2NvdW50fS8ke3F1ZXVlTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXRjaCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBTdWJzY3JpYmVyUXVldWVWaXNpYmlsaXR5UGF0Y2gke3N1Yi5zdWJzY3JpYmVyTmFtZX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6ICdTUVMnLFxuICAgICAgICAgICAgICBhY3Rpb246ICdzZXRRdWV1ZUF0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgUXVldWVVcmw6IHF1ZXVlVXJsLFxuICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXM6IHtWaXNpYmlsaXR5VGltZW91dDogdGltZW91dC50b1N0cmluZygpfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgICAgYCR7c3ViLnN1YnNjcmliZXJOYW1lfS12aXNpYmlsaXR5LSR7dGltZW91dH1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6ICdTUVMnLFxuICAgICAgICAgICAgICBhY3Rpb246ICdzZXRRdWV1ZUF0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgUXVldWVVcmw6IHF1ZXVlVXJsLFxuICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXM6IHtWaXNpYmlsaXR5VGltZW91dDogdGltZW91dC50b1N0cmluZygpfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgICAgYCR7c3ViLnN1YnNjcmliZXJOYW1lfS12aXNpYmlsaXR5LSR7dGltZW91dH1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeTogQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3NxczpTZXRRdWV1ZUF0dHJpYnV0ZXMnXSxcbiAgICAgICAgICAgICAgICAvLyBTY29wZSB0byB0aGUgZXhhY3QgcXVldWUgQVJOIGV4cG9zZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlck5vdGlmaWNhdGlvbiByZXNvdXJjZVxuICAgICAgICAgICAgICAgIC8vIChgYXR0clN1YnNjcmliZXJFbmRwb2ludGApLCB3aGljaCBpcyBhbHJlYWR5IGFuIFNRU1xuICAgICAgICAgICAgICAgIC8vIEFSTi4gVXNpbmcgdGhlIHRva2VuIG1lYW5zIENsb3VkRm9ybWF0aW9uIHN1YnN0aXR1dGVzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgcXVldWUgQVJOIGF0IGRlcGxveS10aW1lLCBzbyB0aGUgY3VzdG9tLVxuICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIHJvbGUgY2Fubm90IGJlIGFidXNlZCB0byBtb2RpZnkgdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgLy8gcXVldWVzIGluIHRoZSBhY2NvdW50LlxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW25vdGlmaWNhdGlvbi5hdHRyU3Vic2NyaWJlckVuZHBvaW50XSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBwYXRjaC5ub2RlLmFkZERlcGVuZGVuY3kobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "truemark-cdk-lib",
|
|
3
3
|
"description": "AWS CDK constructs created by TrueMark",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.31.0",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"typesVersions": {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
],
|
|
104
104
|
"devDependencies": {
|
|
105
105
|
"@aws-sdk/client-dynamodb": "^3.996.2",
|
|
106
|
-
"@aws-sdk/client-elastic-load-balancing-v2": "
|
|
106
|
+
"@aws-sdk/client-elastic-load-balancing-v2": "3.1050.0",
|
|
107
107
|
"@aws-sdk/util-dynamodb": "^3.996.2",
|
|
108
108
|
"@biomejs/biome": "2.4.5",
|
|
109
109
|
"@opensearch-project/opensearch": "^2.13.0",
|