@pagopa/dx-cli 0.24.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/bin/index.js +13 -3
- package/dist/adapters/azure/cloud-account-service.js +169 -92
- package/dist/adapters/azure/locations.d.ts +5 -1
- package/dist/adapters/azure/locations.js +1 -1
- package/dist/adapters/azure-monitor/instrumentation.d.ts +26 -0
- package/dist/adapters/azure-monitor/instrumentation.js +84 -0
- package/dist/adapters/azure-monitor/telemetry.d.ts +19 -0
- package/dist/adapters/azure-monitor/telemetry.js +28 -0
- package/dist/adapters/commander/commands/add.d.ts +32 -7
- package/dist/adapters/commander/commands/add.js +197 -15
- package/dist/adapters/commander/commands/doctor.js +4 -1
- package/dist/adapters/commander/commands/init.js +64 -15
- package/dist/adapters/github/github-repo.js +20 -2
- package/dist/adapters/octokit/index.d.ts +12 -0
- package/dist/adapters/octokit/index.js +26 -2
- package/dist/adapters/plop/actions/setup-pnpm.js +5 -1
- package/dist/adapters/plop/actions/sync-repository-environments.d.ts +15 -0
- package/dist/adapters/plop/actions/sync-repository-environments.js +98 -0
- package/dist/adapters/plop/generators/environment/actions.js +4 -1
- package/dist/adapters/plop/generators/environment/index.d.ts +3 -3
- package/dist/adapters/plop/generators/environment/index.js +6 -3
- package/dist/adapters/plop/generators/environment/prompts.d.ts +38 -0
- package/dist/adapters/plop/generators/environment/prompts.js +236 -91
- package/dist/adapters/plop/index.d.ts +3 -3
- package/dist/adapters/plop/index.js +5 -5
- package/dist/domain/authorization.js +4 -4
- package/dist/domain/environment.d.ts +6 -1
- package/dist/domain/environment.js +1 -1
- package/dist/index.js +132 -8
- package/package.json +24 -16
- package/templates/environment/workflow/_release-terraform-apply-bootstrapper-{{env.name}}.yaml.hbs +145 -2
|
@@ -11,10 +11,12 @@ import { getLogger } from "@logtape/logtape";
|
|
|
11
11
|
import { Client } from "@microsoft/microsoft-graph-client";
|
|
12
12
|
import * as assert from "node:assert/strict";
|
|
13
13
|
import { createHash } from "node:crypto";
|
|
14
|
+
import { lookup } from "node:dns/promises";
|
|
15
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
14
16
|
import { z } from "zod/v4";
|
|
15
17
|
import { environmentShort, } from "../../domain/environment.js";
|
|
16
18
|
import { terraformBackendSchema, } from "../../domain/remote-backend.js";
|
|
17
|
-
import { isAzureLocation, locations, locationShort } from "./locations.js";
|
|
19
|
+
import { isAzureLocation, locations, locationShort, } from "./locations.js";
|
|
18
20
|
// We are only interested in these properties for now;
|
|
19
21
|
// the actual result structure contains the full cloud resource object
|
|
20
22
|
export const resourceGraphDataSchema = z.object({
|
|
@@ -36,6 +38,7 @@ const builtInRoleDefinitionIds = {
|
|
|
36
38
|
contributor: "b24988ac-6180-42a0-ab88-20f7382dd24c",
|
|
37
39
|
keyVaultSecretsOfficer: "b86a8fe4-44ce-4948-aee5-eccb2c155cd7",
|
|
38
40
|
owner: "8e3af657-a8ff-443c-a75c-2fe8c4bcb635",
|
|
41
|
+
reader: "acdd72a7-3385-48ef-bd42-f606fba81ae7",
|
|
39
42
|
roleBasedAccessControlAdministrator: "f58310d9-a9f6-439a-9e8d-f62e7b41a168",
|
|
40
43
|
storageBlobDataContributor: "ba92f5b4-2d11-453d-a403-e96b0029c9fe",
|
|
41
44
|
};
|
|
@@ -45,6 +48,16 @@ const bootstrapIdentityRoleDefinitionIds = [
|
|
|
45
48
|
builtInRoleDefinitionIds.contributor,
|
|
46
49
|
builtInRoleDefinitionIds.storageBlobDataContributor,
|
|
47
50
|
];
|
|
51
|
+
const bootstrapCiIdentityRoleDefinitionIds = [
|
|
52
|
+
// Plan needs read access for refresh and blob access for Terraform backend locks/state.
|
|
53
|
+
builtInRoleDefinitionIds.reader,
|
|
54
|
+
builtInRoleDefinitionIds.storageBlobDataContributor,
|
|
55
|
+
];
|
|
56
|
+
const keyVaultDnsErrorSchema = z.object({
|
|
57
|
+
code: z.enum(["EAI_AGAIN", "ENOTFOUND"]),
|
|
58
|
+
});
|
|
59
|
+
const keyVaultDnsReadyMaxAttempts = 30;
|
|
60
|
+
const keyVaultDnsReadyRetryDelayMs = 10_000;
|
|
48
61
|
export class AzureCloudAccountService {
|
|
49
62
|
#credential;
|
|
50
63
|
#requiredResourceProviders = [
|
|
@@ -178,49 +191,57 @@ export class AzureCloudAccountService {
|
|
|
178
191
|
logger.debug("Created resource group {resourceGroupName} in subscription {subscriptionId}", { resourceGroupName, subscriptionId: cloudAccount.id });
|
|
179
192
|
try {
|
|
180
193
|
const identityName = `${prefix}-${short.env}-${short.location}-bootstrap-id-01`;
|
|
194
|
+
const ciIdentityName = `${prefix}-${short.env}-${short.location}-bootstrap-ci-id-01`;
|
|
181
195
|
const msiClient = new ManagedServiceIdentityClient(this.#credential, cloudAccount.id);
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
196
|
+
const [cdIdentity, ciIdentity] = await Promise.all([
|
|
197
|
+
this.#createBootstrapperIdentity({
|
|
198
|
+
cloudAccountId: cloudAccount.id,
|
|
199
|
+
identityName,
|
|
200
|
+
msiClient,
|
|
201
|
+
parameters,
|
|
202
|
+
resourceGroupName,
|
|
203
|
+
}),
|
|
204
|
+
this.#createBootstrapperIdentity({
|
|
205
|
+
cloudAccountId: cloudAccount.id,
|
|
206
|
+
identityName: ciIdentityName,
|
|
207
|
+
msiClient,
|
|
208
|
+
parameters,
|
|
209
|
+
resourceGroupName,
|
|
210
|
+
}),
|
|
211
|
+
]);
|
|
188
212
|
const authorizationManagementClient = new AuthorizationManagementClient(this.#credential, cloudAccount.id);
|
|
189
213
|
const subscriptionClient = new SubscriptionClient(this.#credential);
|
|
190
214
|
const subscription = await subscriptionClient.subscriptions.get(cloudAccount.id);
|
|
191
215
|
assert.ok(subscription.tenantId, "Subscription tenant ID is undefined");
|
|
192
216
|
const tenantId = subscription.tenantId;
|
|
193
217
|
const subscriptionScope = `/subscriptions/${cloudAccount.id}`;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
identityName,
|
|
216
|
-
subscriptionId: cloudAccount.id,
|
|
217
|
-
});
|
|
218
|
-
await this.#storeBootstrapperEnvironmentSecrets({
|
|
218
|
+
await Promise.all([
|
|
219
|
+
this.#assignBootstrapperRoles({
|
|
220
|
+
authorizationManagementClient,
|
|
221
|
+
cloudAccountId: cloudAccount.id,
|
|
222
|
+
identity: cdIdentity,
|
|
223
|
+
roleDefinitionIds: bootstrapIdentityRoleDefinitionIds,
|
|
224
|
+
scope: subscriptionScope,
|
|
225
|
+
}),
|
|
226
|
+
this.#assignBootstrapperRoles({
|
|
227
|
+
authorizationManagementClient,
|
|
228
|
+
cloudAccountId: cloudAccount.id,
|
|
229
|
+
identity: ciIdentity,
|
|
230
|
+
roleDefinitionIds: bootstrapCiIdentityRoleDefinitionIds,
|
|
231
|
+
scope: subscriptionScope,
|
|
232
|
+
}),
|
|
233
|
+
]);
|
|
234
|
+
await this.#configureBootstrapperGitHubEnvironments({
|
|
235
|
+
cdIdentityClientId: cdIdentity.clientId,
|
|
236
|
+
cdIdentityName: cdIdentity.name,
|
|
237
|
+
ciIdentityClientId: ciIdentity.clientId,
|
|
238
|
+
ciIdentityName: ciIdentity.name,
|
|
219
239
|
cloudAccountId: cloudAccount.id,
|
|
220
240
|
github,
|
|
221
|
-
githubEnvironmentName,
|
|
222
241
|
gitHubService,
|
|
223
|
-
|
|
242
|
+
msiClient,
|
|
243
|
+
name,
|
|
244
|
+
resourceGroupName,
|
|
224
245
|
runnerAppCredentials,
|
|
225
246
|
tenantId,
|
|
226
247
|
});
|
|
@@ -244,12 +265,7 @@ export class AzureCloudAccountService {
|
|
|
244
265
|
// Cleanup resource group if initialization fails
|
|
245
266
|
await resourceManagementClient.resourceGroups.beginDeleteAndWait(resourceGroupName);
|
|
246
267
|
logger.debug("Deleted resource group {resourceGroupName} in subscription {subscriptionId} due to initialization failure", { resourceGroupName, subscriptionId: cloudAccount.id });
|
|
247
|
-
|
|
248
|
-
logger.error(cause.message);
|
|
249
|
-
}
|
|
250
|
-
throw new Error(`Error during the initialization of the cloud account`, {
|
|
251
|
-
cause,
|
|
252
|
-
});
|
|
268
|
+
throw new Error("Failed to initialize cloud account", { cause });
|
|
253
269
|
}
|
|
254
270
|
}
|
|
255
271
|
async isInitialized(cloudAccountId, { name, prefix }) {
|
|
@@ -348,6 +364,65 @@ export class AzureCloudAccountService {
|
|
|
348
364
|
}));
|
|
349
365
|
return results.every(Boolean);
|
|
350
366
|
}
|
|
367
|
+
async #assignBootstrapperRoles({ authorizationManagementClient, cloudAccountId, identity, roleDefinitionIds, scope, }) {
|
|
368
|
+
const logger = getLogger(["gen", "env"]);
|
|
369
|
+
await Promise.all(roleDefinitionIds.map((roleDefinitionId) => authorizationManagementClient.roleAssignments.create(scope, this.#createRoleAssignmentName(scope, identity.principalId, roleDefinitionId), {
|
|
370
|
+
principalId: identity.principalId,
|
|
371
|
+
principalType: "ServicePrincipal",
|
|
372
|
+
roleDefinitionId: this.#createRoleDefinitionResourceId(cloudAccountId, roleDefinitionId),
|
|
373
|
+
})));
|
|
374
|
+
logger.debug("Assigned bootstrap roles to identity {identityName} in subscription {subscriptionId}", { identityName: identity.name, subscriptionId: cloudAccountId });
|
|
375
|
+
}
|
|
376
|
+
async #configureBootstrapperGitHubEnvironments({ cdIdentityClientId, cdIdentityName, ciIdentityClientId, ciIdentityName, cloudAccountId, github, gitHubService, msiClient, name, resourceGroupName, runnerAppCredentials, tenantId, }) {
|
|
377
|
+
const logger = getLogger(["gen", "env"]);
|
|
378
|
+
const cdEnvironmentName = `bootstrapper-${name}-cd`;
|
|
379
|
+
const ciEnvironmentName = `bootstrapper-${name}-ci`;
|
|
380
|
+
const environmentIdentities = [
|
|
381
|
+
{
|
|
382
|
+
environmentName: cdEnvironmentName,
|
|
383
|
+
identityClientId: cdIdentityClientId,
|
|
384
|
+
identityName: cdIdentityName,
|
|
385
|
+
runnerAppCredentials,
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
environmentName: ciEnvironmentName,
|
|
389
|
+
identityClientId: ciIdentityClientId,
|
|
390
|
+
identityName: ciIdentityName,
|
|
391
|
+
},
|
|
392
|
+
];
|
|
393
|
+
// Include a repository-derived suffix so different repositories can share
|
|
394
|
+
// the same bootstrap identity without overwriting each other's OIDC trust.
|
|
395
|
+
await Promise.all(environmentIdentities.map(({ environmentName, identityName }) => msiClient.federatedIdentityCredentials.createOrUpdate(resourceGroupName, identityName, this.#createFederatedCredentialName({
|
|
396
|
+
github,
|
|
397
|
+
githubEnvironmentName: environmentName,
|
|
398
|
+
}), {
|
|
399
|
+
audiences: ["api://AzureADTokenExchange"],
|
|
400
|
+
issuer: "https://token.actions.githubusercontent.com",
|
|
401
|
+
subject: `repo:${github.owner}/${github.repo}:environment:${environmentName}`,
|
|
402
|
+
})));
|
|
403
|
+
logger.debug("Configured bootstrapper federated identity credentials in subscription {subscriptionId}", { subscriptionId: cloudAccountId });
|
|
404
|
+
await Promise.all(environmentIdentities.map(({ environmentName, identityClientId, runnerAppCredentials }) => this.#storeBootstrapperEnvironmentSecrets({
|
|
405
|
+
cloudAccountId,
|
|
406
|
+
github,
|
|
407
|
+
githubEnvironmentName: environmentName,
|
|
408
|
+
gitHubService,
|
|
409
|
+
identityClientId,
|
|
410
|
+
runnerAppCredentials,
|
|
411
|
+
tenantId,
|
|
412
|
+
})));
|
|
413
|
+
}
|
|
414
|
+
async #createBootstrapperIdentity({ cloudAccountId, identityName, msiClient, parameters, resourceGroupName, }) {
|
|
415
|
+
const logger = getLogger(["gen", "env"]);
|
|
416
|
+
const identity = await msiClient.userAssignedIdentities.createOrUpdate(resourceGroupName, identityName, parameters);
|
|
417
|
+
assert.ok(identity.principalId, "Managed identity principal ID is undefined");
|
|
418
|
+
assert.ok(identity.clientId, "Managed identity client ID is undefined");
|
|
419
|
+
logger.debug("Created identity {identityName} in subscription {subscriptionId}", { identityName, subscriptionId: cloudAccountId });
|
|
420
|
+
return {
|
|
421
|
+
clientId: identity.clientId,
|
|
422
|
+
name: identityName,
|
|
423
|
+
principalId: identity.principalId,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
351
426
|
async #createCommonKeyVault({ cloudAccount, name, prefix, resourceGroupName, shortEnv, shortLocation, tags, tenantId, }) {
|
|
352
427
|
const logger = getLogger(["gen", "env"]);
|
|
353
428
|
const kvClient = new KeyVaultManagementClient(this.#credential, cloudAccount.id);
|
|
@@ -440,57 +515,35 @@ export class AzureCloudAccountService {
|
|
|
440
515
|
}
|
|
441
516
|
async #storeBootstrapperEnvironmentSecrets({ cloudAccountId, github, githubEnvironmentName, gitHubService, identityClientId, runnerAppCredentials, tenantId, }) {
|
|
442
517
|
const logger = getLogger(["gen", "env"]);
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
473
|
-
environmentName: githubEnvironmentName,
|
|
474
|
-
owner: github.owner,
|
|
475
|
-
repo: github.repo,
|
|
476
|
-
secretName: "GH_APP_CLIENT_ID",
|
|
477
|
-
secretValue: runnerAppCredentials.clientId,
|
|
478
|
-
}),
|
|
479
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
480
|
-
environmentName: githubEnvironmentName,
|
|
481
|
-
owner: github.owner,
|
|
482
|
-
repo: github.repo,
|
|
483
|
-
secretName: "GH_APP_INSTALLATION_ID",
|
|
484
|
-
secretValue: runnerAppCredentials.installationId,
|
|
485
|
-
}),
|
|
486
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
487
|
-
environmentName: githubEnvironmentName,
|
|
488
|
-
owner: github.owner,
|
|
489
|
-
repo: github.repo,
|
|
490
|
-
secretName: "GH_APP_KEY",
|
|
491
|
-
secretValue: runnerAppCredentials.key.trimEnd(),
|
|
492
|
-
}),
|
|
493
|
-
]);
|
|
518
|
+
const commonSecrets = [
|
|
519
|
+
{ secretName: "ARM_CLIENT_ID", secretValue: identityClientId },
|
|
520
|
+
{ secretName: "ARM_TENANT_ID", secretValue: tenantId },
|
|
521
|
+
{ secretName: "ARM_SUBSCRIPTION_ID", secretValue: cloudAccountId },
|
|
522
|
+
];
|
|
523
|
+
const releaseSecrets = runnerAppCredentials
|
|
524
|
+
? [
|
|
525
|
+
{ secretName: "GH_APP_ID", secretValue: runnerAppCredentials.id },
|
|
526
|
+
{
|
|
527
|
+
secretName: "GH_APP_CLIENT_ID",
|
|
528
|
+
secretValue: runnerAppCredentials.clientId,
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
secretName: "GH_APP_INSTALLATION_ID",
|
|
532
|
+
secretValue: runnerAppCredentials.installationId,
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
secretName: "GH_APP_KEY",
|
|
536
|
+
secretValue: runnerAppCredentials.key.trimEnd(),
|
|
537
|
+
},
|
|
538
|
+
]
|
|
539
|
+
: [];
|
|
540
|
+
await Promise.all([...commonSecrets, ...releaseSecrets].map(({ secretName, secretValue }) => gitHubService.createOrUpdateEnvironmentSecret({
|
|
541
|
+
environmentName: githubEnvironmentName,
|
|
542
|
+
owner: github.owner,
|
|
543
|
+
repo: github.repo,
|
|
544
|
+
secretName,
|
|
545
|
+
secretValue,
|
|
546
|
+
})));
|
|
494
547
|
logger.debug("Set GitHub environment secrets for {environmentName}", {
|
|
495
548
|
environmentName: githubEnvironmentName,
|
|
496
549
|
subscriptionId: cloudAccountId,
|
|
@@ -498,6 +551,10 @@ export class AzureCloudAccountService {
|
|
|
498
551
|
}
|
|
499
552
|
async #storeRunnerAppSecrets({ cloudAccountId, keyVaultName, runnerAppCredentials, }) {
|
|
500
553
|
const logger = getLogger(["gen", "env"]);
|
|
554
|
+
await this.#waitForKeyVaultDnsResolution({
|
|
555
|
+
cloudAccountId,
|
|
556
|
+
keyVaultName,
|
|
557
|
+
});
|
|
501
558
|
const secretClient = new SecretClient(`https://${keyVaultName}.vault.azure.net/`, this.#credential);
|
|
502
559
|
await Promise.all([
|
|
503
560
|
secretClient.setSecret("github-runner-app-id", runnerAppCredentials.id),
|
|
@@ -506,5 +563,25 @@ export class AzureCloudAccountService {
|
|
|
506
563
|
]);
|
|
507
564
|
logger.debug("Created secrets in key vault {keyVaultName} in subscription {subscriptionId}", { keyVaultName, subscriptionId: cloudAccountId });
|
|
508
565
|
}
|
|
566
|
+
async #waitForKeyVaultDnsResolution({ cloudAccountId, keyVaultName, }) {
|
|
567
|
+
const logger = getLogger(["gen", "env"]);
|
|
568
|
+
const hostname = `${keyVaultName}.vault.azure.net`;
|
|
569
|
+
// Azure can report the vault as created before its public DNS name is ready.
|
|
570
|
+
// Wait here so writing runner app secrets does not fail with ENOTFOUND.
|
|
571
|
+
for (let attempt = 1; attempt <= keyVaultDnsReadyMaxAttempts; attempt++) {
|
|
572
|
+
try {
|
|
573
|
+
await lookup(hostname);
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
catch (cause) {
|
|
577
|
+
if (!keyVaultDnsErrorSchema.safeParse(cause).success ||
|
|
578
|
+
attempt === keyVaultDnsReadyMaxAttempts) {
|
|
579
|
+
throw new Error(`Key vault endpoint '${hostname}' is not resolvable`, { cause });
|
|
580
|
+
}
|
|
581
|
+
logger.debug("Waiting for key vault endpoint {hostname} to become resolvable in subscription {subscriptionId}", { hostname, subscriptionId: cloudAccountId });
|
|
582
|
+
await sleep(keyVaultDnsReadyRetryDelayMs);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
509
586
|
}
|
|
510
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFNckMsT0FBTyxFQUVMLHNCQUFzQixHQUN2QixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxN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LENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTthQUNoRCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxzREFBc0QsRUFBRTtZQUNuRSxlQUFlLEVBQUUscUJBQXFCO1lBQ3RDLGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFDM0IsY0FBYyxFQUNkLFlBQVksRUFDWixvQkFBb0IsR0FLckI7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FDbkMsV0FBVyxZQUFZLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxTQUFTLENBQ3BCLG1DQUFtQyxFQUNuQyxvQkFBb0IsQ0FBQyxjQUFjLENBQ3BDO1lBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FDcEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsS0FBSyxDQUNWLDhFQUE4RSxFQUM5RSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQ2pELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRva2VuQ3JlZGVudGlhbCB9IGZyb20gXCJAYXp1cmUvaWRlbnRpdHlcIjtcblxuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1hdXRob3JpemF0aW9uXCI7XG5pbXBvcnQgeyBLZXlWYXVsdE1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1rZXl2YXVsdFwiO1xuaW1wb3J0IHsgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLW1zaVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFwaENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLXJlc291cmNlZ3JhcGhcIjtcbmltcG9ydCB7IFJlc291cmNlTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzLXN1YnNjcmlwdGlvbnNcIjtcbmltcG9ydCB7IFN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tc3RvcmFnZVwiO1xuaW1wb3J0IHsgU2VjcmV0Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9rZXl2YXVsdC1zZWNyZXRzXCI7XG5pbXBvcnQgeyBCbG9iU2VydmljZUNsaWVudCB9IGZyb20gXCJAYXp1cmUvc3RvcmFnZS1ibG9iXCI7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBtaWNyb3NvZnQvbWljcm9zb2Z0LWdyYXBoLWNsaWVudFwiO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydC9zdHJpY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kL3Y0XCI7XG5cbmltcG9ydCB7XG4gIENsb3VkQWNjb3VudCxcbiAgdHlwZSBDbG91ZEFjY291bnRTZXJ2aWNlLFxufSBmcm9tIFwiLi4vLi4vZG9tYWluL2Nsb3VkLWFjY291bnQuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW52aXJvbm1lbnRJZCxcbiAgZW52aXJvbm1lbnRTaG9ydCxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJSZXBvIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWItcmVwby5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gIHR5cGUgR2l0SHViU2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVycmFmb3JtQmFja2VuZCxcbiAgdGVycmFmb3JtQmFja2VuZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9yZW1vdGUtYmFja2VuZC5qc1wiO1xuaW1wb3J0IHsgaXNBenVyZUxvY2F0aW9uLCBsb2NhdGlvbnMsIGxvY2F0aW9uU2hvcnQgfSBmcm9tIFwiLi9sb2NhdGlvbnMuanNcIjtcblxuLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGVzZSBwcm9wZXJ0aWVzIGZvciBub3c7XG4vLyB0aGUgYWN0dWFsIHJlc3VsdCBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgY2xvdWQgcmVzb3VyY2Ugb2JqZWN0XG5leHBvcnQgY29uc3QgcmVzb3VyY2VHcmFwaERhdGFTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGxvY2F0aW9uOiB6LmVudW0obG9jYXRpb25zKSxcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgcmVzb3VyY2VHcm91cDogei5zdHJpbmcoKSxcbn0pO1xuXG5jb25zdCBncmFwaFVzZXJSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBJdGVtU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbn0pO1xuXG5jb25zdCBncmFwaEdyb3VwTWVtYmVyc2hpcFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBcIkBvZGF0YS5uZXh0TGlua1wiOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHZhbHVlOiB6LmFycmF5KGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSksXG59KTtcblxuY29uc3QgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzID0ge1xuICBjb250cmlidXRvcjogXCJiMjQ5ODhhYy02MTgwLTQyYTAtYWI4OC0yMGY3MzgyZGQyNGNcIixcbiAga2V5VmF1bHRTZWNyZXRzT2ZmaWNlcjogXCJiODZhOGZlNC00NGNlLTQ5NDgtYWVlNS1lY2NiMmMxNTVjZDdcIixcbiAgb3duZXI6IFwiOGUzYWY2NTctYThmZi00NDNjLWE3NWMtMmZlOGM0YmNiNjM1XCIsXG4gIHJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yOiBcImY1ODMxMGQ5LWE5ZjYtNDM5YS05ZThkLWY2MmU3YjQxYTE2OFwiLFxuICBzdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcjogXCJiYTkyZjViNC0yZDExLTQ1M2QtYTQwMy1lOTZiMDAyOWM5ZmVcIixcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcElkZW50aXR5Um9sZURlZmluaXRpb25JZHMgPSBbXG4gIC8vIFRoZXNlIHJvbGVzIGxldCB0aGUgYm9vdHN0cmFwIGlkZW50aXR5IHJ1biB0aGUgYm9vdHN0cmFwcGVyIG1vZHVsZSBmcm9tIEdpdEh1YiBBY3Rpb25zIHdpdGhvdXQgZXh0cmEgbWFudWFsIGdyYW50cy5cbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLnJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuY29udHJpYnV0b3IsXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcixcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBBenVyZUNsb3VkQWNjb3VudFNlcnZpY2UgaW1wbGVtZW50cyBDbG91ZEFjY291bnRTZXJ2aWNlIHtcbiAgI2NyZWRlbnRpYWw6IFRva2VuQ3JlZGVudGlhbDtcbiAgI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMgPSBbXG4gICAgXCJNaWNyb3NvZnQuQWR2aXNvclwiLFxuICAgIFwiTWljcm9zb2Z0LkFsZXJ0c01hbmFnZW1lbnRcIixcbiAgICBcIk1pY3Jvc29mdC5BcGlNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBwXCIsXG4gICAgXCJNaWNyb3NvZnQuQXV0aG9yaXphdGlvblwiLFxuICAgIFwiTWljcm9zb2Z0LkF6dXJlVGVycmFmb3JtXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2FjaGVcIixcbiAgICBcIk1pY3Jvc29mdC5DZG5cIixcbiAgICBcIk1pY3Jvc29mdC5Db250YWluZXJJbnN0YW5jZVwiLFxuICAgIFwiTWljcm9zb2Z0LkNvc3RNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuREJmb3JQb3N0Z3JlU1FMXCIsXG4gICAgXCJNaWNyb3NvZnQuS2V5VmF1bHRcIixcbiAgICBcIk1pY3Jvc29mdC5TZXJ2aWNlQnVzXCIsXG4gICAgXCJNaWNyb3NvZnQuU3FsXCIsXG4gICAgXCJNaWNyb3NvZnQuU3RvcmFnZVwiLFxuICAgIFwiTWljcm9zb2Z0LldlYlwiLFxuICBdIGFzIGNvbnN0O1xuICAjcmVzb3VyY2VHcmFwaENsaWVudDogUmVzb3VyY2VHcmFwaENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50ID0gbmV3IFJlc291cmNlR3JhcGhDbGllbnQoY3JlZGVudGlhbCk7XG4gICAgdGhpcy4jY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gIH1cblxuICBhc3luYyBnZXRUZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcbiAgICAvLyBDaGVjayBpZiBhIHN0b3JhZ2UgYWNjb3VudCB3aXRoIHRoZSBleHBlY3RlZCBuYW1lIGV4aXN0c1xuICAgIC8vICRwcmVmaXggKyBlbnZpcm9ubWVudCBzaG9ydCArIGxvY2F0aW9uICsgXCJ0ZnN0YXRlc3RcIiArIHN1ZmZpeCAoZS5nLiwgXCJkeHBpdG50ZnN0YXRlc3QwMVwiKVxuICAgIC8vIGl0IGNhbiByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyAoZS5nLiBmb3IgZGlmZmVyZW50IGxvY2F0aW9uIG9yIGluc3RhbmNlIG51bWJlcilcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBgJHtwcmVmaXh9JHtzaG9ydEVudn0oJHthbGxMb2NhdGlvbnN9KXRmc3RhdGVzdCgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHJlc291cmNlc1xuICAgICAgICAgICAgIHwgd2hlcmUgdHlwZSA9PSAnbWljcm9zb2Z0LnN0b3JhZ2Uvc3RvcmFnZWFjY291bnRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtyZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICBxdWVyeSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50cyA9IHouYXJyYXkocmVzb3VyY2VHcmFwaERhdGFTY2hlbWEpLnBhcnNlKHJlc3VsdC5kYXRhKTtcbiAgICAvLyBvbiBtdWx0aXBsZSByZXN1bHRzLCByYW5rIHN0b3JhZ2UgYWNjb3VudHMgYnkgbG9jYXRpb24gcHJpb3JpdHkgYW5kIGluc3RhbmNlIG51bWJlclxuICAgIGlmIChzdG9yYWdlQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgc3RvcmFnZUFjY291bnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gY29tcGFyZSBsb2NhdGlvbnMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgbG9jYXRpb25Db21wYXJpc29uID1cbiAgICAgICAgICBsb2NhdGlvbnMuaW5kZXhPZihhLmxvY2F0aW9uKSAtIGxvY2F0aW9ucy5pbmRleE9mKGIubG9jYXRpb24pO1xuICAgICAgICBpZiAobG9jYXRpb25Db21wYXJpc29uID09PSAwKSB7XG4gICAgICAgICAgLy8gc2FtZSBsb2NhdGlvbiwgY29tcGFyZSBieSBuYW1lICh0byBnZXQgdGhlIGhpZ2hlc3QgaW5zdGFuY2UgbnVtYmVyKVxuICAgICAgICAgIHJldHVybiBiLm5hbWUubG9jYWxlQ29tcGFyZShhLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhdGlvbkNvbXBhcmlzb247XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0b3JhZ2VBY2NvdW50c1swXS5yZXNvdXJjZUdyb3VwLFxuICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIHR5cGU6IFwiYXp1cmVybVwiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaGFzVXNlclBlcm1pc3Npb25Ub0luaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50SWQ6IENsb3VkQWNjb3VudFtcImlkXCJdLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gYXdhaXQgdGhpcy4jZ2V0Q3VycmVudFByaW5jaXBhbElkcygpO1xuXG4gICAgICAvLyBHZXQgcm9sZSBhc3NpZ25tZW50cyBmb3IgdGhlIHN1YnNjcmlwdGlvblxuICAgICAgY29uc3QgYXV0aENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gW1xuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMub3duZXIsIC8vIE93bmVyXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvciwgLy8gU3RvcmFnZSBCbG9iIERhdGEgQ29udHJpYnV0b3JcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmtleVZhdWx0U2VjcmV0c09mZmljZXIsIC8vIEtleSBWYXVsdCBTZWNyZXRzIE9mZmljZXJcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50SWR9YDtcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgcm9sZSBkZWZpbml0aW9uIElEcyBhc3NpZ25lZCB0byB0aGUgdXNlciBvciB0aGVpciBncm91cHNcbiAgICAgIGNvbnN0IGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBhc3NpZ25tZW50IG9mIGF1dGhDbGllbnQucm9sZUFzc2lnbm1lbnRzLmxpc3RGb3JTY29wZShcbiAgICAgICAgc2NvcGUsXG4gICAgICApKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXNzaWdubWVudCBpcyBmb3IgdGhlIHVzZXIgb3IgYW55IG9mIHRoZWlyIGdyb3Vwc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYXNzaWdubWVudC5wcmluY2lwYWxJZCAmJlxuICAgICAgICAgIGFsbFByaW5jaXBhbElkcy5oYXMoYXNzaWdubWVudC5wcmluY2lwYWxJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCByb2xlIGRlZmluaXRpb24gSUQgZnJvbSB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgICAgICAgIC8vIEZvcm1hdDogL3N1YnNjcmlwdGlvbnMve3N1Yn0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy97cm9sZUlkfVxuICAgICAgICAgIGNvbnN0IHJvbGVEZWZJZCA9IGFzc2lnbm1lbnQucm9sZURlZmluaXRpb25JZD8uc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgICAgICAgIGlmIChyb2xlRGVmSWQpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuYWRkKHJvbGVEZWZJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQtY2lyY3VpdDogc3RvcCBpZiBhbGwgcmVxdWlyZWQgcm9sZXMgaGF2ZSBiZWVuIGZvdW5kXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmhhcyhyZXF1aXJlZFJvbGUpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNBbGxSb2xlcyA9IHJlcXVpcmVkUm9sZXMuZXZlcnkoKHJlcXVpcmVkUm9sZSkgPT5cbiAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBoYXNBbGxSb2xlcztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gSGFuZGxlIGF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMgRm9yYmlkZGVuKSAtIHVzZXIgbGFja3MgcGVybWlzc2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIFwic3RhdHVzQ29kZVwiIGluIGVycm9yICYmXG4gICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlLXRocm93IG90aGVyIGVycm9yc1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzOiBHaXRIdWJBcHBDcmVkZW50aWFscyxcbiAgICBnaXRodWI6IEdpdEh1YlJlcG8sXG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydC5lcXVhbChjbG91ZEFjY291bnQuY3NwLCBcImF6dXJlXCIsIFwiQ2xvdWQgYWNjb3VudCBtdXN0IGJlIEF6dXJlXCIpO1xuICAgIGFzc2VydC5vayhcbiAgICAgIGlzQXp1cmVMb2NhdGlvbihjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uKSxcbiAgICAgIFwiVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnQgaXMgbm90IGEgdmFsaWQgQXp1cmUgbG9jYXRpb25cIixcbiAgICApO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICAvLyBSZWdpc3RlciByZXF1aXJlZCByZXNvdXJjZSBwcm92aWRlcnMgYmVmb3JlIGNyZWF0aW5nIGFueSByZXNvdXJjZXNcbiAgICBhd2FpdCB0aGlzLiNyZWdpc3RlclByb3ZpZGVycyhjbG91ZEFjY291bnQuaWQpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc291cmNlR3JvdXBOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tY29tbW9uLXJnLTAxYDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgQ3JlYXRlZEJ5OiBcIkRYIENMSVwiLFxuICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgLi4udGFncyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlkZW50aXR5TmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LWJvb3RzdHJhcC1pZC0wMWA7XG5cbiAgICAgIGNvbnN0IG1zaUNsaWVudCA9IG5ldyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50KFxuICAgICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IG1zaUNsaWVudC51c2VyQXNzaWduZWRJZGVudGl0aWVzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0Lm9rKFxuICAgICAgICBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgXCJNYW5hZ2VkIGlkZW50aXR5IHByaW5jaXBhbCBJRCBpcyB1bmRlZmluZWRcIixcbiAgICAgICk7XG4gICAgICBjb25zdCBpZGVudGl0eVByaW5jaXBhbElkID0gaWRlbnRpdHkucHJpbmNpcGFsSWQ7XG4gICAgICBhc3NlcnQub2soaWRlbnRpdHkuY2xpZW50SWQsIFwiTWFuYWdlZCBpZGVudGl0eSBjbGllbnQgSUQgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgY29uc3QgaWRlbnRpdHlDbGllbnRJZCA9IGlkZW50aXR5LmNsaWVudElkO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQ3JlYXRlZCBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7IGlkZW50aXR5TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQgPSBuZXcgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQoXG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25DbGllbnQgPSBuZXcgU3Vic2NyaXB0aW9uQ2xpZW50KHRoaXMuI2NyZWRlbnRpYWwpO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYXdhaXQgc3Vic2NyaXB0aW9uQ2xpZW50LnN1YnNjcmlwdGlvbnMuZ2V0KFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKHN1YnNjcmlwdGlvbi50ZW5hbnRJZCwgXCJTdWJzY3JpcHRpb24gdGVuYW50IElEIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IHRlbmFudElkID0gc3Vic2NyaXB0aW9uLnRlbmFudElkO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2NvcGUgPSBgL3N1YnNjcmlwdGlvbnMvJHtjbG91ZEFjY291bnQuaWR9YDtcblxuICAgICAgLy8gR3JhbnQgdGhlIGJvb3RzdHJhcCBpZGVudGl0eSB0aGUgQXp1cmUgcGVybWlzc2lvbnMgaXQgbmVlZHMgdG8gb3BlcmF0ZSBhdXRvbm9tb3VzbHkgaW4gdGhlIGJvb3RzdHJhcCB3b3JrZmxvdy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzLm1hcCgocm9sZURlZmluaXRpb25JZCkgPT5cbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudC5yb2xlQXNzaWdubWVudHMuY3JlYXRlKFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uU2NvcGUsXG4gICAgICAgICAgICB0aGlzLiNjcmVhdGVSb2xlQXNzaWdubWVudE5hbWUoXG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICBpZGVudGl0eVByaW5jaXBhbElkLFxuICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGlkZW50aXR5UHJpbmNpcGFsSWQsXG4gICAgICAgICAgICAgIHByaW5jaXBhbFR5cGU6IFwiU2VydmljZVByaW5jaXBhbFwiLFxuICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkOiB0aGlzLiNjcmVhdGVSb2xlRGVmaW5pdGlvblJlc291cmNlSWQoXG4gICAgICAgICAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQXNzaWduZWQgYm9vdHN0cmFwIHJvbGVzIHRvIGlkZW50aXR5IHtpZGVudGl0eU5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICAgIHsgaWRlbnRpdHlOYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBnaXRodWJFbnZpcm9ubWVudE5hbWUgPSBgYm9vdHN0cmFwcGVyLSR7bmFtZX0tY2RgO1xuICAgICAgY29uc3QgZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUgPSB0aGlzLiNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgICAgIGdpdGh1YixcbiAgICAgICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEluY2x1ZGUgYSByZXBvc2l0b3J5LWRlcml2ZWQgc3VmZml4IHNvIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgY2FuIHNoYXJlXG4gICAgICAvLyB0aGUgc2FtZSBib290c3RyYXAgaWRlbnRpdHkgd2l0aG91dCBvdmVyd3JpdGluZyBlYWNoIG90aGVyJ3MgT0lEQyB0cnVzdC5cbiAgICAgIGF3YWl0IG1zaUNsaWVudC5mZWRlcmF0ZWRJZGVudGl0eUNyZWRlbnRpYWxzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICBmZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIGF1ZGllbmNlczogW1wiYXBpOi8vQXp1cmVBRFRva2VuRXhjaGFuZ2VcIl0sXG4gICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgICAgICBzdWJqZWN0OiBgcmVwbzoke2dpdGh1Yi5vd25lcn0vJHtnaXRodWIucmVwb306ZW52aXJvbm1lbnQ6JHtnaXRodWJFbnZpcm9ubWVudE5hbWV9YCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJDb25maWd1cmVkIGZlZGVyYXRlZCBpZGVudGl0eSBjcmVkZW50aWFsIHtjcmVkZW50aWFsTmFtZX0gZm9yIGlkZW50aXR5IHtpZGVudGl0eU5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjcmVkZW50aWFsTmFtZTogZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUsXG4gICAgICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZUJvb3RzdHJhcHBlckVudmlyb25tZW50U2VjcmV0cyh7XG4gICAgICAgIGNsb3VkQWNjb3VudElkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICAgIGdpdGh1YixcbiAgICAgICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICBpZGVudGl0eUNsaWVudElkLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qga2V5VmF1bHROYW1lID0gYXdhaXQgdGhpcy4jY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgICAgICBjbG91ZEFjY291bnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIHNob3J0RW52OiBzaG9ydC5lbnYsXG4gICAgICAgIHNob3J0TG9jYXRpb246IHNob3J0LmxvY2F0aW9uLFxuICAgICAgICB0YWdzLFxuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgaW5pdGlhbGl6YXRpb24gZmFpbHNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJEZWxldGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gZHVlIHRvIGluaXRpYWxpemF0aW9uIGZhaWx1cmVcIixcbiAgICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcbiAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihjYXVzZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xvdWQgYWNjb3VudGAsIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0luaXRpYWxpemVkKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcblxuICAgIGNvbnN0IGlkZW50aXR5UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1ib290c3RyYXAtaWQtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3QgaWRlbnRpdHlRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5tYW5hZ2VkaWRlbnRpdHkvdXNlcmFzc2lnbmVkaWRlbnRpdGllcydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7aWRlbnRpdHlSZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcblxuICAgIGNvbnN0IGtleVZhdWx0UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1jb21tb24ta3YtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3Qga2V5VmF1bHRRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5rZXl2YXVsdC92YXVsdHMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2tleVZhdWx0UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBbaWRlbnRpdHlSZXN1bHQsIGtleVZhdWx0UmVzdWx0LCBhcmVQcm92aWRlcnNSZWdpc3RlcmVkXSA9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeTogaWRlbnRpdHlRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgICAgIHF1ZXJ5OiBrZXlWYXVsdFF1ZXJ5LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKGNsb3VkQWNjb3VudElkKSxcbiAgICAgIF0pO1xuXG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPVxuICAgICAgaWRlbnRpdHlSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAga2V5VmF1bHRSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZDtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwic3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gaW5pdGlhbGl6ZWQ6IHtpbml0aWFsaXplZH1cIiwge1xuICAgICAgaW5pdGlhbGl6ZWQsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBhc3luYyBwcm92aXNpb25UZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50LFxuICAgIHsgbmFtZSwgcHJlZml4IH06IEVudmlyb25tZW50SWQsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LXRmc3RhdGUtcmctMDFgO1xuXG4gICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgcmVzb3VyY2UgZ3JvdXAge3Jlc291cmNlR3JvdXBOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudCA9IG5ldyBTdG9yYWdlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50ID1cbiAgICAgIGF3YWl0IHN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50LnN0b3JhZ2VBY2NvdW50cy5iZWdpbkNyZWF0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBgJHtwcmVmaXh9JHtzaG9ydC5lbnZ9JHtzaG9ydC5sb2NhdGlvbn10ZnN0YXRlc3QwMWAsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBcIlN0b3JhZ2VWMlwiLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgbmFtZTogXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgIHRpZXI6IFwiU3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIFwiU3RvcmFnZSBhY2NvdW50IGJsb2IgZW5kcG9pbnQgaXMgdW5kZWZpbmVkXCIsXG4gICAgKTtcblxuICAgIGFzc2VydC5vayhzdG9yYWdlQWNjb3VudC5uYW1lLCBcIlN0b3JhZ2UgYWNjb3VudCBuYW1lIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzdG9yYWdlIGFjY291bnQge3N0b3JhZ2VBY2NvdW50TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHtcbiAgICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudC5uYW1lLFxuICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGJsb2JTZXJ2aWNlQ2xpZW50ID0gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9XG4gICAgICBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCJ0ZXJyYWZvcm0tc3RhdGVcIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgYmxvYiBjb250YWluZXIgY3JlYXRpb24gZmFpbHNcbiAgICAgIC8vIHJlc291cmNlIGdyb3VwIGRlbGV0aW9uIGFsc28gZGVsZXRlcyBhbGwgY29udGFpbmVkIHJlc291cmNlc1xuICAgICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmJlZ2luRGVsZXRlQW5kV2FpdChcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBibG9iIGNvbnRhaW5lcmAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVycmFmb3JtQmFja2VuZFNjaGVtYS5wYXJzZSh7XG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGF3YWl0IGNsaWVudC5wcm92aWRlcnMuZ2V0KG5hbWVzcGFjZSk7XG4gICAgICAgIHJldHVybiBwcm92aWRlci5yZWdpc3RyYXRpb25TdGF0ZSA9PT0gXCJSZWdpc3RlcmVkXCI7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KEJvb2xlYW4pO1xuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUNvbW1vbktleVZhdWx0KHtcbiAgICBjbG91ZEFjY291bnQsXG4gICAgbmFtZSxcbiAgICBwcmVmaXgsXG4gICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgc2hvcnRFbnYsXG4gICAgc2hvcnRMb2NhdGlvbixcbiAgICB0YWdzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50OiBDbG91ZEFjY291bnQ7XG4gICAgbmFtZTogRW52aXJvbm1lbnRJZFtcIm5hbWVcIl07XG4gICAgcHJlZml4OiBzdHJpbmc7XG4gICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0cmluZztcbiAgICBzaG9ydEVudjogc3RyaW5nO1xuICAgIHNob3J0TG9jYXRpb246IHN0cmluZztcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3Qga3ZDbGllbnQgPSBuZXcgS2V5VmF1bHRNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICApO1xuXG4gICAgY29uc3Qga2V5VmF1bHROYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0ke3Nob3J0TG9jYXRpb259LWNvbW1vbi1rdi0wMWA7XG4gICAgY29uc3Qgc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID0gc2hvcnRFbnYgPT09IFwicFwiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga3ZDbGllbnQudmF1bHRzLmNoZWNrTmFtZUF2YWlsYWJpbGl0eSh7XG4gICAgICBuYW1lOiBrZXlWYXVsdE5hbWUsXG4gICAgICB0eXBlOiBcIk1pY3Jvc29mdC5LZXlWYXVsdC92YXVsdHNcIixcbiAgICB9KTtcblxuICAgIGF3YWl0IGt2Q2xpZW50LnZhdWx0cy5iZWdpbkNyZWF0ZU9yVXBkYXRlQW5kV2FpdChcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAga2V5VmF1bHROYW1lLFxuICAgICAge1xuICAgICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGNyZWF0ZU1vZGU6IHJlc3VsdC5uYW1lQXZhaWxhYmxlID8gXCJkZWZhdWx0XCIgOiBcInJlY292ZXJcIixcbiAgICAgICAgICBlbmFibGVkRm9yRGlza0VuY3J5cHRpb246IHRydWUsXG4gICAgICAgICAgZW5hYmxlUHVyZ2VQcm90ZWN0aW9uOiBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVuYWJsZVJiYWNBdXRob3JpemF0aW9uOiB0cnVlLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgZmFtaWx5OiBcIkFcIixcbiAgICAgICAgICAgIG5hbWU6IFwic3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvZnREZWxldGVSZXRlbnRpb25JbkRheXM6IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA/IDE0IDogNyxcbiAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgfSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIEVudmlyb25tZW50OiBuYW1lLFxuICAgICAgICAgIC4uLnRhZ3MsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQga2V5IHZhdWx0IHtrZXlWYXVsdE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGtleVZhdWx0TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5VmF1bHROYW1lO1xuICB9XG5cbiAgI2NyZWF0ZUZlZGVyYXRlZENyZWRlbnRpYWxOYW1lKHtcbiAgICBnaXRodWIsXG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICB9OiB7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZTogc3RyaW5nO1xuICB9KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvTmFtZSA9IGdpdGh1Yi5yZXBvLnJlcGxhY2VBbGwoL1teYS16QS1aMC05LV0vZywgXCItXCIpO1xuXG4gICAgcmV0dXJuIGAke3JlcG9OYW1lfS0ke2dpdGh1YkVudmlyb25tZW50TmFtZX1gO1xuICB9XG5cbiAgI2NyZWF0ZVJvbGVBc3NpZ25tZW50TmFtZShcbiAgICBzY29wZTogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcm9sZURlZmluaXRpb25JZDogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKGAke3Njb3BlfToke3ByaW5jaXBhbElkfToke3JvbGVEZWZpbml0aW9uSWR9YClcbiAgICAgIC5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICByZXR1cm4gYCR7aGFzaC5zbGljZSgwLCA4KX0tJHtoYXNoLnNsaWNlKDgsIDEyKX0tJHtoYXNoLnNsaWNlKFxuICAgICAgMTIsXG4gICAgICAxNixcbiAgICApfS0ke2hhc2guc2xpY2UoMTYsIDIwKX0tJHtoYXNoLnNsaWNlKDIwLCAzMil9YDtcbiAgfVxuXG4gICNjcmVhdGVSb2xlRGVmaW5pdGlvblJlc291cmNlSWQoXG4gICAgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyxcbiAgICByb2xlRGVmaW5pdGlvbklkOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvc3Vic2NyaXB0aW9ucy8ke3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZURlZmluaXRpb25zLyR7cm9sZURlZmluaXRpb25JZH1gO1xuICB9XG5cbiAgYXN5bmMgI2dldEN1cnJlbnRQcmluY2lwYWxJZHMoKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICAgIC8vIENyZWF0ZSBHcmFwaCBjbGllbnQgd2l0aCBjdXN0b20gYXV0aCBwcm92aWRlciB0aGF0IGZldGNoZXMgZnJlc2ggdG9rZW5zXG4gICAgY29uc3QgZ3JhcGhDbGllbnQgPSBDbGllbnQuaW5pdCh7XG4gICAgICBhdXRoUHJvdmlkZXI6IGFzeW5jIChkb25lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuI2NyZWRlbnRpYWwuZ2V0VG9rZW4oXG4gICAgICAgICAgICBcImh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS8uZGVmYXVsdFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICAgICAgICBkb25lKFxuICAgICAgICAgICAgICBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gYWNxdWlyZSB0b2tlbiBmb3IgTWljcm9zb2Z0IEdyYXBoXCIpLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZG9uZShudWxsLCB0b2tlblJlc3BvbnNlLnRva2VuKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBkb25lKGVycm9yIGFzIEVycm9yLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEdldCBjdXJyZW50IHVzZXIncyBpbmZvXG4gICAgY29uc3QgbWVSZXNwb25zZSA9IGF3YWl0IGdyYXBoQ2xpZW50LmFwaShcIi9tZVwiKS5nZXQoKTtcbiAgICBjb25zdCBtZSA9IGdyYXBoVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKG1lUmVzcG9uc2UpO1xuICAgIGNvbnN0IHVzZXJPYmplY3RJZCA9IG1lLmlkO1xuXG4gICAgLy8gR2V0IGFsbCBncm91cCBtZW1iZXJzaGlwcyAodHJhbnNpdGl2ZSAtIGluY2x1ZGVzIG5lc3RlZCBncm91cHMpXG4gICAgY29uc3QgZ3JvdXBJZHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5leHRMaW5rOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBcIi9tZS90cmFuc2l0aXZlTWVtYmVyT2Y/JHNlbGVjdD1pZFwiO1xuXG4gICAgd2hpbGUgKG5leHRMaW5rKSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IGdyYXBoQ2xpZW50LmFwaShuZXh0TGluaykuZ2V0KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGdyYXBoR3JvdXBNZW1iZXJzaGlwUmVzcG9uc2VTY2hlbWEucGFyc2UocmF3UmVzcG9uc2UpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLnZhbHVlKSB7XG4gICAgICAgIGdyb3VwSWRzLnB1c2goaXRlbS5pZCk7XG4gICAgICB9XG4gICAgICBuZXh0TGluayA9IHJlc3BvbnNlW1wiQG9kYXRhLm5leHRMaW5rXCJdO1xuICAgIH1cblxuICAgIC8vIEFsbCBwcmluY2lwYWwgSURzIHRvIGNoZWNrICh1c2VyICsgYWxsIGdyb3VwcylcbiAgICBjb25zdCBhbGxQcmluY2lwYWxJZHMgPSBuZXcgU2V0KFt1c2VyT2JqZWN0SWQsIC4uLmdyb3VwSWRzXSk7XG4gICAgcmV0dXJuIGFsbFByaW5jaXBhbElkcztcbiAgfVxuXG4gIGFzeW5jICNyZWdpc3RlclByb3ZpZGVycyhzdWJzY3JpcHRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImR4LWNsaVwiLCBcInJlZ2lzdGVyLXByb3ZpZGVyc1wiXSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBcIlJlZ2lzdGVyaW5nIHtjb3VudH0gcmVzb3VyY2UgcHJvdmlkZXJzIG9uIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGNvdW50OiB0aGlzLiNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzLmxlbmd0aCwgc3Vic2NyaXB0aW9uSWQgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLiNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzLm1hcChhc3luYyAobmFtZXNwYWNlKSA9PiB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5wcm92aWRlcnMucmVnaXN0ZXIobmFtZXNwYWNlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiUmVnaXN0ZXJlZCBwcm92aWRlciB7bmFtZXNwYWNlfVwiLCB7IG5hbWVzcGFjZSB9KTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIFwiQWxsIHJlc291cmNlIHByb3ZpZGVycyByZWdpc3RlcmVkIG9uIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IHN1YnNjcmlwdGlvbklkIH0sXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICNzdG9yZUJvb3RzdHJhcHBlckVudmlyb25tZW50U2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAgZ2l0aHViLFxuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICBnaXRIdWJTZXJ2aWNlLFxuICAgIGlkZW50aXR5Q2xpZW50SWQsXG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgdGVuYW50SWQsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnRJZDogc3RyaW5nO1xuICAgIGdpdGh1YjogR2l0SHViUmVwbztcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcbiAgICBnaXRIdWJTZXJ2aWNlOiBHaXRIdWJTZXJ2aWNlO1xuICAgIGlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkFSTV9DTElFTlRfSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IGlkZW50aXR5Q2xpZW50SWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fVEVOQU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiB0ZW5hbnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkFSTV9TVUJTQ1JJUFRJT05fSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IGNsb3VkQWNjb3VudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5pZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9DTElFTlRfSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmNsaWVudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lOU1RBTExBVElPTl9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaW5zdGFsbGF0aW9uSWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfS0VZXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5rZXkudHJpbUVuZCgpLFxuICAgICAgfSksXG4gICAgXSk7XG5cbiAgICBsb2dnZXIuZGVidWcoXCJTZXQgR2l0SHViIGVudmlyb25tZW50IHNlY3JldHMgZm9yIHtlbnZpcm9ubWVudE5hbWV9XCIsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlUnVubmVyQXBwU2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAga2V5VmF1bHROYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IHNlY3JldENsaWVudCA9IG5ldyBTZWNyZXRDbGllbnQoXG4gICAgICBgaHR0cHM6Ly8ke2tleVZhdWx0TmFtZX0udmF1bHQuYXp1cmUubmV0L2AsXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFwiZ2l0aHViLXJ1bm5lci1hcHAtaWRcIiwgcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQpLFxuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcbiAgICAgICAgXCJnaXRodWItcnVubmVyLWFwcC1pbnN0YWxsYXRpb24taWRcIixcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMuaW5zdGFsbGF0aW9uSWQsXG4gICAgICApLFxuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcbiAgICAgICAgXCJnaXRodWItcnVubmVyLWFwcC1rZXlcIixcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSwgLy8gc3RyaXAgdHJhaWxpbmcgbmV3bGluZXMgZnJvbSBQRU0ga2V5c1xuICAgICAgKSxcbiAgICBdKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzZWNyZXRzIGluIGtleSB2YXVsdCB7a2V5VmF1bHROYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBrZXlWYXVsdE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBRWpCLE1BQU0sNkJBQTZCLENB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QUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLFlBQVksa0JBQWtCLENBQUM7UUFFbkQsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksMkJBQTJCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUNFLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU87b0JBQ2hELE9BQU8sS0FBSywyQkFBMkIsRUFDdkMsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixRQUFRLHFCQUFxQixFQUNwRCxFQUFFLEtBQUssRUFBRSxDQUNWLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLGlHQUFpRyxFQUNqRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQzdDLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVG9rZW5DcmVkZW50aWFsIH0gZnJvbSBcIkBhenVyZS9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWF1dGhvcml6YXRpb25cIjtcbmltcG9ydCB7IEtleVZhdWx0TWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWtleXZhdWx0XCI7XG5pbXBvcnQgeyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tbXNpXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VncmFwaFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25DbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1yZXNvdXJjZXMtc3Vic2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1zdG9yYWdlXCI7XG5pbXBvcnQgeyBTZWNyZXRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2tleXZhdWx0LXNlY3JldHNcIjtcbmltcG9ydCB7IEJsb2JTZXJ2aWNlQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9zdG9yYWdlLWJsb2JcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQG1pY3Jvc29mdC9taWNyb3NvZnQtZ3JhcGgtY2xpZW50XCI7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcIm5vZGU6ZG5zL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuXG5pbXBvcnQge1xuICBDbG91ZEFjY291bnQsXG4gIHR5cGUgQ2xvdWRBY2NvdW50U2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9jbG91ZC1hY2NvdW50LmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudmlyb25tZW50SWQsXG4gIGVudmlyb25tZW50U2hvcnQsXG4gIEVudmlyb25tZW50U2hvcnRWYWx1ZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJSZXBvIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWItcmVwby5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gIHR5cGUgR2l0SHViU2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVycmFmb3JtQmFja2VuZCxcbiAgdGVycmFmb3JtQmFja2VuZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9yZW1vdGUtYmFja2VuZC5qc1wiO1xuaW1wb3J0IHtcbiAgaXNBenVyZUxvY2F0aW9uLFxuICBsb2NhdGlvbnMsXG4gIGxvY2F0aW9uU2hvcnQsXG4gIExvY2F0aW9uU2hvcnRWYWx1ZSxcbn0gZnJvbSBcIi4vbG9jYXRpb25zLmpzXCI7XG5cbi8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlc2UgcHJvcGVydGllcyBmb3Igbm93O1xuLy8gdGhlIGFjdHVhbCByZXN1bHQgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGNsb3VkIHJlc291cmNlIG9iamVjdFxuZXhwb3J0IGNvbnN0IHJlc291cmNlR3JhcGhEYXRhU2NoZW1hID0gei5vYmplY3Qoe1xuICBsb2NhdGlvbjogei5lbnVtKGxvY2F0aW9ucyksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHJlc291cmNlR3JvdXA6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxufSk7XG5cbmNvbnN0IGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgXCJAb2RhdGEubmV4dExpbmtcIjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZTogei5hcnJheShncmFwaEdyb3VwTWVtYmVyc2hpcEl0ZW1TY2hlbWEpLFxufSk7XG5cbmNvbnN0IGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcyA9IHtcbiAgY29udHJpYnV0b3I6IFwiYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCIsXG4gIGtleVZhdWx0U2VjcmV0c09mZmljZXI6IFwiYjg2YThmZTQtNDRjZS00OTQ4LWFlZTUtZWNjYjJjMTU1Y2Q3XCIsXG4gIG93bmVyOiBcIjhlM2FmNjU3LWE4ZmYtNDQzYy1hNzVjLTJmZThjNGJjYjYzNVwiLFxuICByZWFkZXI6IFwiYWNkZDcyYTctMzM4NS00OGVmLWJkNDItZjYwNmZiYTgxYWU3XCIsXG4gIHJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yOiBcImY1ODMxMGQ5LWE5ZjYtNDM5YS05ZThkLWY2MmU3YjQxYTE2OFwiLFxuICBzdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcjogXCJiYTkyZjViNC0yZDExLTQ1M2QtYTQwMy1lOTZiMDAyOWM5ZmVcIixcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcElkZW50aXR5Um9sZURlZmluaXRpb25JZHMgPSBbXG4gIC8vIFRoZXNlIHJvbGVzIGxldCB0aGUgYm9vdHN0cmFwIGlkZW50aXR5IHJ1biB0aGUgYm9vdHN0cmFwcGVyIG1vZHVsZSBmcm9tIEdpdEh1YiBBY3Rpb25zIHdpdGhvdXQgZXh0cmEgbWFudWFsIGdyYW50cy5cbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLnJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuY29udHJpYnV0b3IsXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcENpSWRlbnRpdHlSb2xlRGVmaW5pdGlvbklkcyA9IFtcbiAgLy8gUGxhbiBuZWVkcyByZWFkIGFjY2VzcyBmb3IgcmVmcmVzaCBhbmQgYmxvYiBhY2Nlc3MgZm9yIFRlcnJhZm9ybSBiYWNrZW5kIGxvY2tzL3N0YXRlLlxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMucmVhZGVyLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsXG5dIGFzIGNvbnN0O1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5ID0ge1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBuYW1lOiBCb290c3RyYXBwZXJJZGVudGl0eU5hbWU7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG59O1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5TmFtZSA9XG4gIHwgYCR7c3RyaW5nfS0ke0Vudmlyb25tZW50U2hvcnRWYWx1ZX0tJHtMb2NhdGlvblNob3J0VmFsdWV9LWJvb3RzdHJhcC1jaS1pZC0ke3N0cmluZ31gXG4gIHwgYCR7c3RyaW5nfS0ke0Vudmlyb25tZW50U2hvcnRWYWx1ZX0tJHtMb2NhdGlvblNob3J0VmFsdWV9LWJvb3RzdHJhcC1pZC0ke3N0cmluZ31gO1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5UGFyYW1ldGVycyA9IHtcbiAgbG9jYXRpb246IHN0cmluZztcbiAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmNvbnN0IGtleVZhdWx0RG5zRXJyb3JTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNvZGU6IHouZW51bShbXCJFQUlfQUdBSU5cIiwgXCJFTk9URk9VTkRcIl0pLFxufSk7XG5jb25zdCBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHMgPSAzMDtcbmNvbnN0IGtleVZhdWx0RG5zUmVhZHlSZXRyeURlbGF5TXMgPSAxMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBBenVyZUNsb3VkQWNjb3VudFNlcnZpY2UgaW1wbGVtZW50cyBDbG91ZEFjY291bnRTZXJ2aWNlIHtcbiAgI2NyZWRlbnRpYWw6IFRva2VuQ3JlZGVudGlhbDtcbiAgI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMgPSBbXG4gICAgXCJNaWNyb3NvZnQuQWR2aXNvclwiLFxuICAgIFwiTWljcm9zb2Z0LkFsZXJ0c01hbmFnZW1lbnRcIixcbiAgICBcIk1pY3Jvc29mdC5BcGlNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBwXCIsXG4gICAgXCJNaWNyb3NvZnQuQXV0aG9yaXphdGlvblwiLFxuICAgIFwiTWljcm9zb2Z0LkF6dXJlVGVycmFmb3JtXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2FjaGVcIixcbiAgICBcIk1pY3Jvc29mdC5DZG5cIixcbiAgICBcIk1pY3Jvc29mdC5Db250YWluZXJJbnN0YW5jZVwiLFxuICAgIFwiTWljcm9zb2Z0LkNvc3RNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuREJmb3JQb3N0Z3JlU1FMXCIsXG4gICAgXCJNaWNyb3NvZnQuS2V5VmF1bHRcIixcbiAgICBcIk1pY3Jvc29mdC5TZXJ2aWNlQnVzXCIsXG4gICAgXCJNaWNyb3NvZnQuU3FsXCIsXG4gICAgXCJNaWNyb3NvZnQuU3RvcmFnZVwiLFxuICAgIFwiTWljcm9zb2Z0LldlYlwiLFxuICBdIGFzIGNvbnN0O1xuICAjcmVzb3VyY2VHcmFwaENsaWVudDogUmVzb3VyY2VHcmFwaENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50ID0gbmV3IFJlc291cmNlR3JhcGhDbGllbnQoY3JlZGVudGlhbCk7XG4gICAgdGhpcy4jY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gIH1cblxuICBhc3luYyBnZXRUZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcbiAgICAvLyBDaGVjayBpZiBhIHN0b3JhZ2UgYWNjb3VudCB3aXRoIHRoZSBleHBlY3RlZCBuYW1lIGV4aXN0c1xuICAgIC8vICRwcmVmaXggKyBlbnZpcm9ubWVudCBzaG9ydCArIGxvY2F0aW9uICsgXCJ0ZnN0YXRlc3RcIiArIHN1ZmZpeCAoZS5nLiwgXCJkeHBpdG50ZnN0YXRlc3QwMVwiKVxuICAgIC8vIGl0IGNhbiByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyAoZS5nLiBmb3IgZGlmZmVyZW50IGxvY2F0aW9uIG9yIGluc3RhbmNlIG51bWJlcilcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBgJHtwcmVmaXh9JHtzaG9ydEVudn0oJHthbGxMb2NhdGlvbnN9KXRmc3RhdGVzdCgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHJlc291cmNlc1xuICAgICAgICAgICAgIHwgd2hlcmUgdHlwZSA9PSAnbWljcm9zb2Z0LnN0b3JhZ2Uvc3RvcmFnZWFjY291bnRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtyZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICBxdWVyeSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50cyA9IHouYXJyYXkocmVzb3VyY2VHcmFwaERhdGFTY2hlbWEpLnBhcnNlKHJlc3VsdC5kYXRhKTtcbiAgICAvLyBvbiBtdWx0aXBsZSByZXN1bHRzLCByYW5rIHN0b3JhZ2UgYWNjb3VudHMgYnkgbG9jYXRpb24gcHJpb3JpdHkgYW5kIGluc3RhbmNlIG51bWJlclxuICAgIGlmIChzdG9yYWdlQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgc3RvcmFnZUFjY291bnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gY29tcGFyZSBsb2NhdGlvbnMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgbG9jYXRpb25Db21wYXJpc29uID1cbiAgICAgICAgICBsb2NhdGlvbnMuaW5kZXhPZihhLmxvY2F0aW9uKSAtIGxvY2F0aW9ucy5pbmRleE9mKGIubG9jYXRpb24pO1xuICAgICAgICBpZiAobG9jYXRpb25Db21wYXJpc29uID09PSAwKSB7XG4gICAgICAgICAgLy8gc2FtZSBsb2NhdGlvbiwgY29tcGFyZSBieSBuYW1lICh0byBnZXQgdGhlIGhpZ2hlc3QgaW5zdGFuY2UgbnVtYmVyKVxuICAgICAgICAgIHJldHVybiBiLm5hbWUubG9jYWxlQ29tcGFyZShhLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhdGlvbkNvbXBhcmlzb247XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0b3JhZ2VBY2NvdW50c1swXS5yZXNvdXJjZUdyb3VwLFxuICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIHR5cGU6IFwiYXp1cmVybVwiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaGFzVXNlclBlcm1pc3Npb25Ub0luaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50SWQ6IENsb3VkQWNjb3VudFtcImlkXCJdLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gYXdhaXQgdGhpcy4jZ2V0Q3VycmVudFByaW5jaXBhbElkcygpO1xuXG4gICAgICAvLyBHZXQgcm9sZSBhc3NpZ25tZW50cyBmb3IgdGhlIHN1YnNjcmlwdGlvblxuICAgICAgY29uc3QgYXV0aENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gW1xuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMub3duZXIsIC8vIE93bmVyXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvciwgLy8gU3RvcmFnZSBCbG9iIERhdGEgQ29udHJpYnV0b3JcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmtleVZhdWx0U2VjcmV0c09mZmljZXIsIC8vIEtleSBWYXVsdCBTZWNyZXRzIE9mZmljZXJcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50SWR9YDtcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgcm9sZSBkZWZpbml0aW9uIElEcyBhc3NpZ25lZCB0byB0aGUgdXNlciBvciB0aGVpciBncm91cHNcbiAgICAgIGNvbnN0IGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBhc3NpZ25tZW50IG9mIGF1dGhDbGllbnQucm9sZUFzc2lnbm1lbnRzLmxpc3RGb3JTY29wZShcbiAgICAgICAgc2NvcGUsXG4gICAgICApKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXNzaWdubWVudCBpcyBmb3IgdGhlIHVzZXIgb3IgYW55IG9mIHRoZWlyIGdyb3Vwc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYXNzaWdubWVudC5wcmluY2lwYWxJZCAmJlxuICAgICAgICAgIGFsbFByaW5jaXBhbElkcy5oYXMoYXNzaWdubWVudC5wcmluY2lwYWxJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCByb2xlIGRlZmluaXRpb24gSUQgZnJvbSB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgICAgICAgIC8vIEZvcm1hdDogL3N1YnNjcmlwdGlvbnMve3N1Yn0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy97cm9sZUlkfVxuICAgICAgICAgIGNvbnN0IHJvbGVEZWZJZCA9IGFzc2lnbm1lbnQucm9sZURlZmluaXRpb25JZD8uc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgICAgICAgIGlmIChyb2xlRGVmSWQpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuYWRkKHJvbGVEZWZJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQtY2lyY3VpdDogc3RvcCBpZiBhbGwgcmVxdWlyZWQgcm9sZXMgaGF2ZSBiZWVuIGZvdW5kXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmhhcyhyZXF1aXJlZFJvbGUpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNBbGxSb2xlcyA9IHJlcXVpcmVkUm9sZXMuZXZlcnkoKHJlcXVpcmVkUm9sZSkgPT5cbiAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBoYXNBbGxSb2xlcztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gSGFuZGxlIGF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMgRm9yYmlkZGVuKSAtIHVzZXIgbGFja3MgcGVybWlzc2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIFwic3RhdHVzQ29kZVwiIGluIGVycm9yICYmXG4gICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlLXRocm93IG90aGVyIGVycm9yc1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzOiBHaXRIdWJBcHBDcmVkZW50aWFscyxcbiAgICBnaXRodWI6IEdpdEh1YlJlcG8sXG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydC5lcXVhbChjbG91ZEFjY291bnQuY3NwLCBcImF6dXJlXCIsIFwiQ2xvdWQgYWNjb3VudCBtdXN0IGJlIEF6dXJlXCIpO1xuICAgIGFzc2VydC5vayhcbiAgICAgIGlzQXp1cmVMb2NhdGlvbihjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uKSxcbiAgICAgIFwiVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnQgaXMgbm90IGEgdmFsaWQgQXp1cmUgbG9jYXRpb25cIixcbiAgICApO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICAvLyBSZWdpc3RlciByZXF1aXJlZCByZXNvdXJjZSBwcm92aWRlcnMgYmVmb3JlIGNyZWF0aW5nIGFueSByZXNvdXJjZXNcbiAgICBhd2FpdCB0aGlzLiNyZWdpc3RlclByb3ZpZGVycyhjbG91ZEFjY291bnQuaWQpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc291cmNlR3JvdXBOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tY29tbW9uLXJnLTAxYDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgQ3JlYXRlZEJ5OiBcIkRYIENMSVwiLFxuICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgLi4udGFncyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlkZW50aXR5TmFtZTogQm9vdHN0cmFwcGVySWRlbnRpdHlOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tYm9vdHN0cmFwLWlkLTAxYDtcbiAgICAgIGNvbnN0IGNpSWRlbnRpdHlOYW1lOiBCb290c3RyYXBwZXJJZGVudGl0eU5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS1ib290c3RyYXAtY2ktaWQtMDFgO1xuXG4gICAgICBjb25zdCBtc2lDbGllbnQgPSBuZXcgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgW2NkSWRlbnRpdHksIGNpSWRlbnRpdHldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLiNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICBpZGVudGl0eU5hbWUsXG4gICAgICAgICAgbXNpQ2xpZW50LFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICBpZGVudGl0eU5hbWU6IGNpSWRlbnRpdHlOYW1lLFxuICAgICAgICAgIG1zaUNsaWVudCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNsaWVudCA9IG5ldyBTdWJzY3JpcHRpb25DbGllbnQodGhpcy4jY3JlZGVudGlhbCk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBhd2FpdCBzdWJzY3JpcHRpb25DbGllbnQuc3Vic2NyaXB0aW9ucy5nZXQoXG4gICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2soc3Vic2NyaXB0aW9uLnRlbmFudElkLCBcIlN1YnNjcmlwdGlvbiB0ZW5hbnQgSUQgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgY29uc3QgdGVuYW50SWQgPSBzdWJzY3JpcHRpb24udGVuYW50SWQ7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25TY29wZSA9IGAvc3Vic2NyaXB0aW9ucy8ke2Nsb3VkQWNjb3VudC5pZH1gO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgIGlkZW50aXR5OiBjZElkZW50aXR5LFxuICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWRzOiBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzLFxuICAgICAgICAgIHNjb3BlOiBzdWJzY3JpcHRpb25TY29wZSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgIGlkZW50aXR5OiBjaUlkZW50aXR5LFxuICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWRzOiBib290c3RyYXBDaUlkZW50aXR5Um9sZURlZmluaXRpb25JZHMsXG4gICAgICAgICAgc2NvcGU6IHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNjb25maWd1cmVCb290c3RyYXBwZXJHaXRIdWJFbnZpcm9ubWVudHMoe1xuICAgICAgICBjZElkZW50aXR5Q2xpZW50SWQ6IGNkSWRlbnRpdHkuY2xpZW50SWQsXG4gICAgICAgIGNkSWRlbnRpdHlOYW1lOiBjZElkZW50aXR5Lm5hbWUsXG4gICAgICAgIGNpSWRlbnRpdHlDbGllbnRJZDogY2lJZGVudGl0eS5jbGllbnRJZCxcbiAgICAgICAgY2lJZGVudGl0eU5hbWU6IGNpSWRlbnRpdHkubmFtZSxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgZ2l0aHViLFxuICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICBtc2lDbGllbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qga2V5VmF1bHROYW1lID0gYXdhaXQgdGhpcy4jY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgICAgICBjbG91ZEFjY291bnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIHNob3J0RW52OiBzaG9ydC5lbnYsXG4gICAgICAgIHNob3J0TG9jYXRpb246IHNob3J0LmxvY2F0aW9uLFxuICAgICAgICB0YWdzLFxuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgaW5pdGlhbGl6YXRpb24gZmFpbHNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJEZWxldGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gZHVlIHRvIGluaXRpYWxpemF0aW9uIGZhaWx1cmVcIixcbiAgICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNsb3VkIGFjY291bnRcIiwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0luaXRpYWxpemVkKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcblxuICAgIGNvbnN0IGlkZW50aXR5UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1ib290c3RyYXAtaWQtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3QgaWRlbnRpdHlRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5tYW5hZ2VkaWRlbnRpdHkvdXNlcmFzc2lnbmVkaWRlbnRpdGllcydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7aWRlbnRpdHlSZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcblxuICAgIGNvbnN0IGtleVZhdWx0UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1jb21tb24ta3YtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3Qga2V5VmF1bHRRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5rZXl2YXVsdC92YXVsdHMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2tleVZhdWx0UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBbaWRlbnRpdHlSZXN1bHQsIGtleVZhdWx0UmVzdWx0LCBhcmVQcm92aWRlcnNSZWdpc3RlcmVkXSA9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeTogaWRlbnRpdHlRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgICAgIHF1ZXJ5OiBrZXlWYXVsdFF1ZXJ5LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKGNsb3VkQWNjb3VudElkKSxcbiAgICAgIF0pO1xuXG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPVxuICAgICAgaWRlbnRpdHlSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAga2V5VmF1bHRSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZDtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwic3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gaW5pdGlhbGl6ZWQ6IHtpbml0aWFsaXplZH1cIiwge1xuICAgICAgaW5pdGlhbGl6ZWQsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBhc3luYyBwcm92aXNpb25UZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50LFxuICAgIHsgbmFtZSwgcHJlZml4IH06IEVudmlyb25tZW50SWQsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LXRmc3RhdGUtcmctMDFgO1xuXG4gICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgcmVzb3VyY2UgZ3JvdXAge3Jlc291cmNlR3JvdXBOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudCA9IG5ldyBTdG9yYWdlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50ID1cbiAgICAgIGF3YWl0IHN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50LnN0b3JhZ2VBY2NvdW50cy5iZWdpbkNyZWF0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBgJHtwcmVmaXh9JHtzaG9ydC5lbnZ9JHtzaG9ydC5sb2NhdGlvbn10ZnN0YXRlc3QwMWAsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBcIlN0b3JhZ2VWMlwiLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgbmFtZTogXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgIHRpZXI6IFwiU3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIFwiU3RvcmFnZSBhY2NvdW50IGJsb2IgZW5kcG9pbnQgaXMgdW5kZWZpbmVkXCIsXG4gICAgKTtcblxuICAgIGFzc2VydC5vayhzdG9yYWdlQWNjb3VudC5uYW1lLCBcIlN0b3JhZ2UgYWNjb3VudCBuYW1lIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzdG9yYWdlIGFjY291bnQge3N0b3JhZ2VBY2NvdW50TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHtcbiAgICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudC5uYW1lLFxuICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGJsb2JTZXJ2aWNlQ2xpZW50ID0gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9XG4gICAgICBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCJ0ZXJyYWZvcm0tc3RhdGVcIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgYmxvYiBjb250YWluZXIgY3JlYXRpb24gZmFpbHNcbiAgICAgIC8vIHJlc291cmNlIGdyb3VwIGRlbGV0aW9uIGFsc28gZGVsZXRlcyBhbGwgY29udGFpbmVkIHJlc291cmNlc1xuICAgICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmJlZ2luRGVsZXRlQW5kV2FpdChcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBibG9iIGNvbnRhaW5lcmAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVycmFmb3JtQmFja2VuZFNjaGVtYS5wYXJzZSh7XG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGF3YWl0IGNsaWVudC5wcm92aWRlcnMuZ2V0KG5hbWVzcGFjZSk7XG4gICAgICAgIHJldHVybiBwcm92aWRlci5yZWdpc3RyYXRpb25TdGF0ZSA9PT0gXCJSZWdpc3RlcmVkXCI7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KEJvb2xlYW4pO1xuICB9XG5cbiAgYXN5bmMgI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBpZGVudGl0eSxcbiAgICByb2xlRGVmaW5pdGlvbklkcyxcbiAgICBzY29wZSxcbiAgfToge1xuICAgIGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50OiBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudDtcbiAgICBjbG91ZEFjY291bnRJZDogc3RyaW5nO1xuICAgIGlkZW50aXR5OiBCb290c3RyYXBwZXJJZGVudGl0eTtcbiAgICByb2xlRGVmaW5pdGlvbklkczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgc2NvcGU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByb2xlRGVmaW5pdGlvbklkcy5tYXAoKHJvbGVEZWZpbml0aW9uSWQpID0+XG4gICAgICAgIGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50LnJvbGVBc3NpZ25tZW50cy5jcmVhdGUoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgdGhpcy4jY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmluY2lwYWxJZDogaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQ6IHRoaXMuI2NyZWF0ZVJvbGVEZWZpbml0aW9uUmVzb3VyY2VJZChcbiAgICAgICAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkFzc2lnbmVkIGJvb3RzdHJhcCByb2xlcyB0byBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBpZGVudGl0eU5hbWU6IGlkZW50aXR5Lm5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyAjY29uZmlndXJlQm9vdHN0cmFwcGVyR2l0SHViRW52aXJvbm1lbnRzKHtcbiAgICBjZElkZW50aXR5Q2xpZW50SWQsXG4gICAgY2RJZGVudGl0eU5hbWUsXG4gICAgY2lJZGVudGl0eUNsaWVudElkLFxuICAgIGNpSWRlbnRpdHlOYW1lLFxuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGdpdGh1YixcbiAgICBnaXRIdWJTZXJ2aWNlLFxuICAgIG1zaUNsaWVudCxcbiAgICBuYW1lLFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2RJZGVudGl0eUNsaWVudElkOiBzdHJpbmc7XG4gICAgY2RJZGVudGl0eU5hbWU6IHN0cmluZztcbiAgICBjaUlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZztcbiAgICBjaUlkZW50aXR5TmFtZTogc3RyaW5nO1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2U7XG4gICAgbXNpQ2xpZW50OiBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50O1xuICAgIG5hbWU6IEVudmlyb25tZW50SWRbXCJuYW1lXCJdO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcbiAgICBjb25zdCBjZEVudmlyb25tZW50TmFtZSA9IGBib290c3RyYXBwZXItJHtuYW1lfS1jZGA7XG4gICAgY29uc3QgY2lFbnZpcm9ubWVudE5hbWUgPSBgYm9vdHN0cmFwcGVyLSR7bmFtZX0tY2lgO1xuICAgIGNvbnN0IGVudmlyb25tZW50SWRlbnRpdGllcyA9IFtcbiAgICAgIHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBjZEVudmlyb25tZW50TmFtZSxcbiAgICAgICAgaWRlbnRpdHlDbGllbnRJZDogY2RJZGVudGl0eUNsaWVudElkLFxuICAgICAgICBpZGVudGl0eU5hbWU6IGNkSWRlbnRpdHlOYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogY2lFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIGlkZW50aXR5Q2xpZW50SWQ6IGNpSWRlbnRpdHlDbGllbnRJZCxcbiAgICAgICAgaWRlbnRpdHlOYW1lOiBjaUlkZW50aXR5TmFtZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEluY2x1ZGUgYSByZXBvc2l0b3J5LWRlcml2ZWQgc3VmZml4IHNvIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgY2FuIHNoYXJlXG4gICAgLy8gdGhlIHNhbWUgYm9vdHN0cmFwIGlkZW50aXR5IHdpdGhvdXQgb3ZlcndyaXRpbmcgZWFjaCBvdGhlcidzIE9JREMgdHJ1c3QuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBlbnZpcm9ubWVudElkZW50aXRpZXMubWFwKCh7IGVudmlyb25tZW50TmFtZSwgaWRlbnRpdHlOYW1lIH0pID0+XG4gICAgICAgIG1zaUNsaWVudC5mZWRlcmF0ZWRJZGVudGl0eUNyZWRlbnRpYWxzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgICB0aGlzLiNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgICAgICAgICBnaXRodWIsXG4gICAgICAgICAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IGVudmlyb25tZW50TmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhdWRpZW5jZXM6IFtcImFwaTovL0F6dXJlQURUb2tlbkV4Y2hhbmdlXCJdLFxuICAgICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgICAgICAgIHN1YmplY3Q6IGByZXBvOiR7Z2l0aHViLm93bmVyfS8ke2dpdGh1Yi5yZXBvfTplbnZpcm9ubWVudDoke2Vudmlyb25tZW50TmFtZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNvbmZpZ3VyZWQgYm9vdHN0cmFwcGVyIGZlZGVyYXRlZCBpZGVudGl0eSBjcmVkZW50aWFscyBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBlbnZpcm9ubWVudElkZW50aXRpZXMubWFwKFxuICAgICAgICAoeyBlbnZpcm9ubWVudE5hbWUsIGlkZW50aXR5Q2xpZW50SWQsIHJ1bm5lckFwcENyZWRlbnRpYWxzIH0pID0+XG4gICAgICAgICAgdGhpcy4jc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgICAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICAgICAgICBnaXRodWIsXG4gICAgICAgICAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IGVudmlyb25tZW50TmFtZSxcbiAgICAgICAgICAgIGdpdEh1YlNlcnZpY2UsXG4gICAgICAgICAgICBpZGVudGl0eUNsaWVudElkLFxuICAgICAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAgaWRlbnRpdHlOYW1lLFxuICAgIG1zaUNsaWVudCxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBpZGVudGl0eU5hbWU6IEJvb3RzdHJhcHBlcklkZW50aXR5TmFtZTtcbiAgICBtc2lDbGllbnQ6IE1hbmFnZWRTZXJ2aWNlSWRlbnRpdHlDbGllbnQ7XG4gICAgcGFyYW1ldGVyczogQm9vdHN0cmFwcGVySWRlbnRpdHlQYXJhbWV0ZXJzO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEJvb3RzdHJhcHBlcklkZW50aXR5PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBtc2lDbGllbnQudXNlckFzc2lnbmVkSWRlbnRpdGllcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICBcIk1hbmFnZWQgaWRlbnRpdHkgcHJpbmNpcGFsIElEIGlzIHVuZGVmaW5lZFwiLFxuICAgICk7XG4gICAgYXNzZXJ0Lm9rKGlkZW50aXR5LmNsaWVudElkLCBcIk1hbmFnZWQgaWRlbnRpdHkgY2xpZW50IElEIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBpZGVudGl0eU5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGlkZW50aXR5LmNsaWVudElkLFxuICAgICAgbmFtZTogaWRlbnRpdHlOYW1lLFxuICAgICAgcHJpbmNpcGFsSWQ6IGlkZW50aXR5LnByaW5jaXBhbElkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyAjY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgIGNsb3VkQWNjb3VudCxcbiAgICBuYW1lLFxuICAgIHByZWZpeCxcbiAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICBzaG9ydEVudixcbiAgICBzaG9ydExvY2F0aW9uLFxuICAgIHRhZ3MsXG4gICAgdGVuYW50SWQsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudDtcbiAgICBuYW1lOiBFbnZpcm9ubWVudElkW1wibmFtZVwiXTtcbiAgICBwcmVmaXg6IHN0cmluZztcbiAgICByZXNvdXJjZUdyb3VwTmFtZTogc3RyaW5nO1xuICAgIHNob3J0RW52OiBzdHJpbmc7XG4gICAgc2hvcnRMb2NhdGlvbjogc3RyaW5nO1xuICAgIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICBjb25zdCBrdkNsaWVudCA9IG5ldyBLZXlWYXVsdE1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBrZXlWYXVsdE5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnRFbnZ9LSR7c2hvcnRMb2NhdGlvbn0tY29tbW9uLWt2LTAxYDtcbiAgICBjb25zdCBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPSBzaG9ydEVudiA9PT0gXCJwXCI7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrdkNsaWVudC52YXVsdHMuY2hlY2tOYW1lQXZhaWxhYmlsaXR5KHtcbiAgICAgIG5hbWU6IGtleVZhdWx0TmFtZSxcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LktleVZhdWx0L3ZhdWx0c1wiLFxuICAgIH0pO1xuXG4gICAgYXdhaXQga3ZDbGllbnQudmF1bHRzLmJlZ2luQ3JlYXRlT3JVcGRhdGVBbmRXYWl0KFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICB7XG4gICAgICAgIGxvY2F0aW9uOiBjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgY3JlYXRlTW9kZTogcmVzdWx0Lm5hbWVBdmFpbGFibGUgPyBcImRlZmF1bHRcIiA6IFwicmVjb3ZlclwiLFxuICAgICAgICAgIGVuYWJsZWRGb3JEaXNrRW5jcnlwdGlvbjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQdXJnZVByb3RlY3Rpb246IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW5hYmxlUmJhY0F1dGhvcml6YXRpb246IHRydWUsXG4gICAgICAgICAgc2t1OiB7XG4gICAgICAgICAgICBmYW1pbHk6IFwiQVwiLFxuICAgICAgICAgICAgbmFtZTogXCJzdGFuZGFyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29mdERlbGV0ZVJldGVudGlvbkluRGF5czogc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID8gMTQgOiA3LFxuICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICB9LFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgICAgLi4udGFncyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBrZXkgdmF1bHQge2tleVZhdWx0TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsga2V5VmF1bHROYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBrZXlWYXVsdE5hbWU7XG4gIH1cblxuICAjY3JlYXRlRmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUoe1xuICAgIGdpdGh1YixcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gIH06IHtcbiAgICBnaXRodWI6IEdpdEh1YlJlcG87XG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlcG9OYW1lID0gZ2l0aHViLnJlcG8ucmVwbGFjZUFsbCgvW15hLXpBLVowLTktXS9nLCBcIi1cIik7XG5cbiAgICByZXR1cm4gYCR7cmVwb05hbWV9LSR7Z2l0aHViRW52aXJvbm1lbnROYW1lfWA7XG4gIH1cblxuICAjY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgIHNjb3BlOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICByb2xlRGVmaW5pdGlvbklkOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgIC51cGRhdGUoYCR7c2NvcGV9OiR7cHJpbmNpcGFsSWR9OiR7cm9sZURlZmluaXRpb25JZH1gKVxuICAgICAgLmRpZ2VzdChcImhleFwiKTtcblxuICAgIHJldHVybiBgJHtoYXNoLnNsaWNlKDAsIDgpfS0ke2hhc2guc2xpY2UoOCwgMTIpfS0ke2hhc2guc2xpY2UoXG4gICAgICAxMixcbiAgICAgIDE2LFxuICAgICl9LSR7aGFzaC5zbGljZSgxNiwgMjApfS0ke2hhc2guc2xpY2UoMjAsIDMyKX1gO1xuICB9XG5cbiAgI2NyZWF0ZVJvbGVEZWZpbml0aW9uUmVzb3VyY2VJZChcbiAgICBzdWJzY3JpcHRpb25JZDogc3RyaW5nLFxuICAgIHJvbGVEZWZpbml0aW9uSWQ6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9zdWJzY3JpcHRpb25zLyR7c3Vic2NyaXB0aW9uSWR9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMvJHtyb2xlRGVmaW5pdGlvbklkfWA7XG4gIH1cblxuICBhc3luYyAjZ2V0Q3VycmVudFByaW5jaXBhbElkcygpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gICAgLy8gQ3JlYXRlIEdyYXBoIGNsaWVudCB3aXRoIGN1c3RvbSBhdXRoIHByb3ZpZGVyIHRoYXQgZmV0Y2hlcyBmcmVzaCB0b2tlbnNcbiAgICBjb25zdCBncmFwaENsaWVudCA9IENsaWVudC5pbml0KHtcbiAgICAgIGF1dGhQcm92aWRlcjogYXN5bmMgKGRvbmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY3JlZGVudGlhbC5nZXRUb2tlbihcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tLy5kZWZhdWx0XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGRvbmUoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcIkZhaWxlZCB0byBhY3F1aXJlIHRva2VuIGZvciBNaWNyb3NvZnQgR3JhcGhcIiksXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKG51bGwsIHRva2VuUmVzcG9uc2UudG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGRvbmUoZXJyb3IgYXMgRXJyb3IsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgdXNlcidzIGluZm9cbiAgICBjb25zdCBtZVJlc3BvbnNlID0gYXdhaXQgZ3JhcGhDbGllbnQuYXBpKFwiL21lXCIpLmdldCgpO1xuICAgIGNvbnN0IG1lID0gZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UobWVSZXNwb25zZSk7XG4gICAgY29uc3QgdXNlck9iamVjdElkID0gbWUuaWQ7XG5cbiAgICAvLyBHZXQgYWxsIGdyb3VwIG1lbWJlcnNoaXBzICh0cmFuc2l0aXZlIC0gaW5jbHVkZXMgbmVzdGVkIGdyb3VwcylcbiAgICBjb25zdCBncm91cElkczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbmV4dExpbms6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFwiL21lL3RyYW5zaXRpdmVNZW1iZXJPZj8kc2VsZWN0PWlkXCI7XG5cbiAgICB3aGlsZSAobmV4dExpbmspIHtcbiAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gYXdhaXQgZ3JhcGhDbGllbnQuYXBpKG5leHRMaW5rKS5nZXQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYS5wYXJzZShyYXdSZXNwb25zZSk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzcG9uc2UudmFsdWUpIHtcbiAgICAgICAgZ3JvdXBJZHMucHVzaChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICAgIG5leHRMaW5rID0gcmVzcG9uc2VbXCJAb2RhdGEubmV4dExpbmtcIl07XG4gICAgfVxuXG4gICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgIGNvbnN0IGFsbFByaW5jaXBhbElkcyA9IG5ldyBTZXQoW3VzZXJPYmplY3RJZCwgLi4uZ3JvdXBJZHNdKTtcbiAgICByZXR1cm4gYWxsUHJpbmNpcGFsSWRzO1xuICB9XG5cbiAgYXN5bmMgI3JlZ2lzdGVyUHJvdmlkZXJzKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZHgtY2xpXCIsIFwicmVnaXN0ZXItcHJvdmlkZXJzXCJdKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIFwiUmVnaXN0ZXJpbmcge2NvdW50fSByZXNvdXJjZSBwcm92aWRlcnMgb24gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgY291bnQ6IHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubGVuZ3RoLCBzdWJzY3JpcHRpb25JZCB9LFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubWFwKGFzeW5jIChuYW1lc3BhY2UpID0+IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnByb3ZpZGVycy5yZWdpc3RlcihuYW1lc3BhY2UpO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJSZWdpc3RlcmVkIHByb3ZpZGVyIHtuYW1lc3BhY2V9XCIsIHsgbmFtZXNwYWNlIH0pO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgXCJBbGwgcmVzb3VyY2UgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgb24gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgc3Vic2NyaXB0aW9uSWQgfSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlQm9vdHN0cmFwcGVyRW52aXJvbm1lbnRTZWNyZXRzKHtcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBnaXRodWIsXG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgIGdpdEh1YlNlcnZpY2UsXG4gICAgaWRlbnRpdHlDbGllbnRJZCxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICB0ZW5hbnRJZCxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZTogc3RyaW5nO1xuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2U7XG4gICAgaWRlbnRpdHlDbGllbnRJZDogc3RyaW5nO1xuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzPzogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgY29tbW9uU2VjcmV0cyA9IFtcbiAgICAgIHsgc2VjcmV0TmFtZTogXCJBUk1fQ0xJRU5UX0lEXCIsIHNlY3JldFZhbHVlOiBpZGVudGl0eUNsaWVudElkIH0sXG4gICAgICB7IHNlY3JldE5hbWU6IFwiQVJNX1RFTkFOVF9JRFwiLCBzZWNyZXRWYWx1ZTogdGVuYW50SWQgfSxcbiAgICAgIHsgc2VjcmV0TmFtZTogXCJBUk1fU1VCU0NSSVBUSU9OX0lEXCIsIHNlY3JldFZhbHVlOiBjbG91ZEFjY291bnRJZCB9LFxuICAgIF07XG4gICAgY29uc3QgcmVsZWFzZVNlY3JldHMgPSBydW5uZXJBcHBDcmVkZW50aWFsc1xuICAgICAgPyBbXG4gICAgICAgICAgeyBzZWNyZXROYW1lOiBcIkdIX0FQUF9JRFwiLCBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9DTElFTlRfSURcIixcbiAgICAgICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5jbGllbnRJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lOU1RBTExBVElPTl9JRFwiLFxuICAgICAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfS0VZXCIsXG4gICAgICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBbLi4uY29tbW9uU2VjcmV0cywgLi4ucmVsZWFzZVNlY3JldHNdLm1hcCgoeyBzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSB9KSA9PlxuICAgICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICBzZWNyZXRWYWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXCJTZXQgR2l0SHViIGVudmlyb25tZW50IHNlY3JldHMgZm9yIHtlbnZpcm9ubWVudE5hbWV9XCIsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlUnVubmVyQXBwU2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAga2V5VmF1bHROYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGF3YWl0IHRoaXMuI3dhaXRGb3JLZXlWYXVsdERuc1Jlc29sdXRpb24oe1xuICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICBrZXlWYXVsdE5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWNyZXRDbGllbnQgPSBuZXcgU2VjcmV0Q2xpZW50KFxuICAgICAgYGh0dHBzOi8vJHtrZXlWYXVsdE5hbWV9LnZhdWx0LmF6dXJlLm5ldC9gLFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcImdpdGh1Yi1ydW5uZXItYXBwLWlkXCIsIHJ1bm5lckFwcENyZWRlbnRpYWxzLmlkKSxcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXG4gICAgICAgIFwiZ2l0aHViLXJ1bm5lci1hcHAtaW5zdGFsbGF0aW9uLWlkXCIsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgKSxcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXG4gICAgICAgIFwiZ2l0aHViLXJ1bm5lci1hcHAta2V5XCIsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLmtleS50cmltRW5kKCksIC8vIHN0cmlwIHRyYWlsaW5nIG5ld2xpbmVzIGZyb20gUEVNIGtleXNcbiAgICAgICksXG4gICAgXSk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgc2VjcmV0cyBpbiBrZXkgdmF1bHQge2tleVZhdWx0TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsga2V5VmF1bHROYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgI3dhaXRGb3JLZXlWYXVsdERuc1Jlc29sdXRpb24oe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGtleVZhdWx0TmFtZSxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXTtcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gYCR7a2V5VmF1bHROYW1lfS52YXVsdC5henVyZS5uZXRgO1xuXG4gICAgLy8gQXp1cmUgY2FuIHJlcG9ydCB0aGUgdmF1bHQgYXMgY3JlYXRlZCBiZWZvcmUgaXRzIHB1YmxpYyBETlMgbmFtZSBpcyByZWFkeS5cbiAgICAvLyBXYWl0IGhlcmUgc28gd3JpdGluZyBydW5uZXIgYXBwIHNlY3JldHMgZG9lcyBub3QgZmFpbCB3aXRoIEVOT1RGT1VORC5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9va3VwKGhvc3RuYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFrZXlWYXVsdERuc0Vycm9yU2NoZW1hLnNhZmVQYXJzZShjYXVzZSkuc3VjY2VzcyB8fFxuICAgICAgICAgIGF0dGVtcHQgPT09IGtleVZhdWx0RG5zUmVhZHlNYXhBdHRlbXB0c1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgS2V5IHZhdWx0IGVuZHBvaW50ICcke2hvc3RuYW1lfScgaXMgbm90IHJlc29sdmFibGVgLFxuICAgICAgICAgICAgeyBjYXVzZSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgXCJXYWl0aW5nIGZvciBrZXkgdmF1bHQgZW5kcG9pbnQge2hvc3RuYW1lfSB0byBiZWNvbWUgcmVzb2x2YWJsZSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICAgIHsgaG9zdG5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChrZXlWYXVsdERuc1JlYWR5UmV0cnlEZWxheU1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|