@aws-solutions-constructs/core 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -13,7 +13,7 @@
13
13
  "npmlog": "^4.1.2"
14
14
  },
15
15
  "dependencies": {
16
- "aws-cdk-lib": "^2.10.0",
16
+ "aws-cdk-lib": "^2.15.0",
17
17
  "constructs": "^10.0.0"
18
18
  },
19
19
  "dependencyClosure": {
@@ -1528,6 +1528,19 @@
1528
1528
  }
1529
1529
  }
1530
1530
  },
1531
+ "aws-cdk-lib.aws_kafkaconnect": {
1532
+ "targets": {
1533
+ "dotnet": {
1534
+ "namespace": "Amazon.CDK.AWS.KafkaConnect"
1535
+ },
1536
+ "java": {
1537
+ "package": "software.amazon.awscdk.services.kafkaconnect"
1538
+ },
1539
+ "python": {
1540
+ "module": "aws_cdk.aws_kafkaconnect"
1541
+ }
1542
+ }
1543
+ },
1531
1544
  "aws-cdk-lib.aws_kendra": {
1532
1545
  "targets": {
1533
1546
  "dotnet": {
@@ -2853,6 +2866,19 @@
2853
2866
  "module": "aws_cdk.region_info"
2854
2867
  }
2855
2868
  }
2869
+ },
2870
+ "aws-cdk-lib.triggers": {
2871
+ "targets": {
2872
+ "dotnet": {
2873
+ "namespace": "Amazon.CDK.Triggers"
2874
+ },
2875
+ "java": {
2876
+ "package": "software.amazon.awscdk.triggers"
2877
+ },
2878
+ "python": {
2879
+ "module": "aws_cdk.triggers"
2880
+ }
2881
+ }
2856
2882
  }
2857
2883
  },
2858
2884
  "targets": {
@@ -3356,7 +3382,7 @@
3356
3382
  "kind": "interface",
3357
3383
  "locationInModule": {
3358
3384
  "filename": "lib/glue-job-helper.ts",
3359
- "line": 59
3385
+ "line": 60
3360
3386
  },
3361
3387
  "name": "BuildGlueJobProps",
3362
3388
  "properties": [
@@ -3368,7 +3394,7 @@
3368
3394
  "immutable": true,
3369
3395
  "locationInModule": {
3370
3396
  "filename": "lib/glue-job-helper.ts",
3371
- "line": 75
3397
+ "line": 76
3372
3398
  },
3373
3399
  "name": "database",
3374
3400
  "type": {
@@ -3383,13 +3409,30 @@
3383
3409
  "immutable": true,
3384
3410
  "locationInModule": {
3385
3411
  "filename": "lib/glue-job-helper.ts",
3386
- "line": 71
3412
+ "line": 72
3387
3413
  },
3388
3414
  "name": "table",
3389
3415
  "type": {
3390
3416
  "fqn": "aws-cdk-lib.aws_glue.CfnTable"
3391
3417
  }
3392
3418
  },
3419
+ {
3420
+ "abstract": true,
3421
+ "docs": {
3422
+ "default": "- None",
3423
+ "summary": "Asset instance for the ETL code that performs Glue Job transformation."
3424
+ },
3425
+ "immutable": true,
3426
+ "locationInModule": {
3427
+ "filename": "lib/glue-job-helper.ts",
3428
+ "line": 86
3429
+ },
3430
+ "name": "etlCodeAsset",
3431
+ "optional": true,
3432
+ "type": {
3433
+ "fqn": "aws-cdk-lib.aws_s3_assets.Asset"
3434
+ }
3435
+ },
3393
3436
  {
3394
3437
  "abstract": true,
3395
3438
  "docs": {
@@ -3398,7 +3441,7 @@
3398
3441
  "immutable": true,
3399
3442
  "locationInModule": {
3400
3443
  "filename": "lib/glue-job-helper.ts",
3401
- "line": 67
3444
+ "line": 68
3402
3445
  },
3403
3446
  "name": "existingCfnJob",
3404
3447
  "optional": true,
@@ -3414,7 +3457,7 @@
3414
3457
  "immutable": true,
3415
3458
  "locationInModule": {
3416
3459
  "filename": "lib/glue-job-helper.ts",
3417
- "line": 63
3460
+ "line": 64
3418
3461
  },
3419
3462
  "name": "glueJobProps",
3420
3463
  "optional": true,
@@ -3430,7 +3473,7 @@
3430
3473
  "immutable": true,
3431
3474
  "locationInModule": {
3432
3475
  "filename": "lib/glue-job-helper.ts",
3433
- "line": 79
3476
+ "line": 80
3434
3477
  },
3435
3478
  "name": "outputDataStore",
3436
3479
  "optional": true,
@@ -4518,7 +4561,7 @@
4518
4561
  "kind": "interface",
4519
4562
  "locationInModule": {
4520
4563
  "filename": "lib/glue-job-helper.ts",
4521
- "line": 34
4564
+ "line": 35
4522
4565
  },
4523
4566
  "name": "SinkDataStoreProps",
4524
4567
  "properties": [
@@ -4530,7 +4573,7 @@
4530
4573
  "immutable": true,
4531
4574
  "locationInModule": {
4532
4575
  "filename": "lib/glue-job-helper.ts",
4533
- "line": 38
4576
+ "line": 39
4534
4577
  },
4535
4578
  "name": "datastoreType",
4536
4579
  "type": {
@@ -4546,7 +4589,7 @@
4546
4589
  "immutable": true,
4547
4590
  "locationInModule": {
4548
4591
  "filename": "lib/glue-job-helper.ts",
4549
- "line": 51
4592
+ "line": 52
4550
4593
  },
4551
4594
  "name": "existingS3OutputBucket",
4552
4595
  "optional": true,
@@ -4563,7 +4606,7 @@
4563
4606
  "immutable": true,
4564
4607
  "locationInModule": {
4565
4608
  "filename": "lib/glue-job-helper.ts",
4566
- "line": 56
4609
+ "line": 57
4567
4610
  },
4568
4611
  "name": "outputBucketProps",
4569
4612
  "optional": true,
@@ -4584,7 +4627,7 @@
4584
4627
  "kind": "enum",
4585
4628
  "locationInModule": {
4586
4629
  "filename": "lib/glue-job-helper.ts",
4587
- "line": 26
4630
+ "line": 27
4588
4631
  },
4589
4632
  "members": [
4590
4633
  {
@@ -5077,6 +5120,6 @@
5077
5120
  "symbolId": "lib/input-validation:VerifiedProps"
5078
5121
  }
5079
5122
  },
5080
- "version": "2.4.0",
5081
- "fingerprint": "clkPdrTLyvJowwNOt7MSTzEq0r+IlPRNTNozLmZEHl4="
5123
+ "version": "2.5.0",
5124
+ "fingerprint": "WU1KwUpvoepQ7t2Eee9YSaqccwBXEjXKrKtnnszAc3E="
5082
5125
  }
@@ -12,4 +12,5 @@
12
12
  */
13
13
  import { CfnJobProps } from 'aws-cdk-lib/aws-glue';
14
14
  import { IRole } from 'aws-cdk-lib/aws-iam';
15
- export declare function DefaultGlueJobProps(jobRole: IRole, userProvidedGlueJobProps: CfnJobProps, glueSecurityConfigName: string, defaultArguments: {}): CfnJobProps;
15
+ import * as s3assets from "aws-cdk-lib/aws-s3-assets";
16
+ export declare function DefaultGlueJobProps(jobRole: IRole, userProvidedGlueJobProps: CfnJobProps | any, glueSecurityConfigName: string, defaultArguments: {}, etlCodeAsset?: s3assets.Asset): CfnJobProps;
@@ -13,11 +13,14 @@
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.DefaultGlueJobProps = void 0;
16
- function DefaultGlueJobProps(jobRole, userProvidedGlueJobProps, glueSecurityConfigName, defaultArguments) {
16
+ function DefaultGlueJobProps(jobRole, userProvidedGlueJobProps, glueSecurityConfigName, defaultArguments, etlCodeAsset) {
17
17
  const glueVersion = userProvidedGlueJobProps.glueVersion;
18
18
  // setting default to 2 to reduce cost
19
19
  const maxCapacity = glueVersion === "1.0" && !(userProvidedGlueJobProps.workerType
20
20
  || userProvidedGlueJobProps.numberOfWorkers) ? 2 : undefined;
21
+ if (etlCodeAsset) {
22
+ userProvidedGlueJobProps.command.scriptLocation = etlCodeAsset.s3ObjectUrl;
23
+ }
21
24
  const defaultGlueJobProps = {
22
25
  command: userProvidedGlueJobProps.command,
23
26
  role: jobRole.roleArn,
@@ -32,4 +35,4 @@ function DefaultGlueJobProps(jobRole, userProvidedGlueJobProps, glueSecurityConf
32
35
  return defaultGlueJobProps;
33
36
  }
34
37
  exports.DefaultGlueJobProps = DefaultGlueJobProps;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnbHVlLWpvYi1kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQUtILFNBQWdCLG1CQUFtQixDQUFDLE9BQWMsRUFBRSx3QkFBcUMsRUFDdkYsc0JBQThCLEVBQUUsZ0JBQW9CO0lBQ3BELE1BQU0sV0FBVyxHQUF1Qix3QkFBd0IsQ0FBQyxXQUFXLENBQUM7SUFFN0Usc0NBQXNDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLFdBQVcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFVBQVU7V0FDN0Usd0JBQXdCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRS9ELE1BQU0sbUJBQW1CLEdBQWdCO1FBQ3ZDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxPQUFRO1FBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTztRQUNyQixxQkFBcUIsRUFBRSxzQkFBc0I7UUFDN0MsZ0JBQWdCO1FBQ2hCLFdBQVc7UUFDWCxlQUFlLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN4RSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN4RSx3SEFBd0g7UUFDeEgsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLO0tBQy9DLENBQUM7SUFFRixPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUM7QUFyQkQsa0RBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IDIwMjIgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDZm5Kb2JQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEZWZhdWx0R2x1ZUpvYlByb3BzKGpvYlJvbGU6IElSb2xlLCB1c2VyUHJvdmlkZWRHbHVlSm9iUHJvcHM6IENmbkpvYlByb3BzLFxuICBnbHVlU2VjdXJpdHlDb25maWdOYW1lOiBzdHJpbmcsIGRlZmF1bHRBcmd1bWVudHM6IHt9KTogQ2ZuSm9iUHJvcHMge1xuICBjb25zdCBnbHVlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdXNlclByb3ZpZGVkR2x1ZUpvYlByb3BzLmdsdWVWZXJzaW9uO1xuXG4gIC8vIHNldHRpbmcgZGVmYXVsdCB0byAyIHRvIHJlZHVjZSBjb3N0XG4gIGNvbnN0IG1heENhcGFjaXR5ID0gZ2x1ZVZlcnNpb24gPT09IFwiMS4wXCIgJiYgISh1c2VyUHJvdmlkZWRHbHVlSm9iUHJvcHMud29ya2VyVHlwZVxuICAgIHx8IHVzZXJQcm92aWRlZEdsdWVKb2JQcm9wcy5udW1iZXJPZldvcmtlcnMpID8gMiA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBkZWZhdWx0R2x1ZUpvYlByb3BzOiBDZm5Kb2JQcm9wcyA9IHtcbiAgICBjb21tYW5kOiB1c2VyUHJvdmlkZWRHbHVlSm9iUHJvcHMuY29tbWFuZCEsXG4gICAgcm9sZTogam9iUm9sZS5yb2xlQXJuLFxuICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgIG1heENhcGFjaXR5LFxuICAgIG51bWJlck9mV29ya2VyczogKCFnbHVlVmVyc2lvbiB8fCBnbHVlVmVyc2lvbiA9PT0gXCIyLjBcIikgPyAyIDogdW5kZWZpbmVkLCAvLyBkZWZhdWx0aW5nIHRvIDIgd29ya2VycyxcbiAgICB3b3JrZXJUeXBlOiAoIWdsdWVWZXJzaW9uIHx8IGdsdWVWZXJzaW9uID09PSBcIjIuMFwiKSA/ICdHLjFYJyA6IHVuZGVmaW5lZCwgLy8gZGVmYXVsdGluZyB0byBHLjFYIGFzIGl0IGlzIHByZWZlcnJlZCB3aXRoIGdsdWUgdmVyc2lvbiAyLjBcbiAgICAvLyBnbHVlIHZlcnNpb24gdGhvdWdoIG9wdGlvbmFsIGlzIHJlcXVpcmVkIGZvciBzdHJlYW1pbmcgZXRsIGpvYnMgb3RoZXJ3aXNlIGl0IHRocm93cyBhbiBlcnJvciB0aGF0ICdjb21tYW5kIG5vdCBmb3VuZCdcbiAgICBnbHVlVmVyc2lvbjogZ2x1ZVZlcnNpb24gPyBnbHVlVmVyc2lvbiA6ICcyLjAnXG4gIH07XG5cbiAgcmV0dXJuIGRlZmF1bHRHbHVlSm9iUHJvcHM7XG59Il19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnbHVlLWpvYi1kZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQU1ILFNBQWdCLG1CQUFtQixDQUFDLE9BQWMsRUFBRSx3QkFBMkMsRUFDN0Ysc0JBQThCLEVBQUUsZ0JBQW9CLEVBQUUsWUFBNkI7SUFDbkYsTUFBTSxXQUFXLEdBQXVCLHdCQUF3QixDQUFDLFdBQVcsQ0FBQztJQUU3RSxzQ0FBc0M7SUFDdEMsTUFBTSxXQUFXLEdBQUcsV0FBVyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsd0JBQXdCLENBQUMsVUFBVTtXQUM3RSx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFL0QsSUFBSSxZQUFZLEVBQUU7UUFDaEIsd0JBQXdCLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxtQkFBbUIsR0FBZ0I7UUFDdkMsT0FBTyxFQUFFLHdCQUF3QixDQUFDLE9BQVE7UUFDMUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3JCLHFCQUFxQixFQUFFLHNCQUFzQjtRQUM3QyxnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLGVBQWUsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3hFLFVBQVUsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3hFLHdIQUF3SDtRQUN4SCxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUs7S0FDL0MsQ0FBQztJQUVGLE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQztBQXpCRCxrREF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgMjAyMiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENmbkpvYlByb3BzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzYXNzZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBEZWZhdWx0R2x1ZUpvYlByb3BzKGpvYlJvbGU6IElSb2xlLCB1c2VyUHJvdmlkZWRHbHVlSm9iUHJvcHM6IENmbkpvYlByb3BzIHwgYW55LFxuICBnbHVlU2VjdXJpdHlDb25maWdOYW1lOiBzdHJpbmcsIGRlZmF1bHRBcmd1bWVudHM6IHt9LCBldGxDb2RlQXNzZXQ/OiBzM2Fzc2V0cy5Bc3NldCk6IENmbkpvYlByb3BzIHtcbiAgY29uc3QgZ2x1ZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVzZXJQcm92aWRlZEdsdWVKb2JQcm9wcy5nbHVlVmVyc2lvbjtcblxuICAvLyBzZXR0aW5nIGRlZmF1bHQgdG8gMiB0byByZWR1Y2UgY29zdFxuICBjb25zdCBtYXhDYXBhY2l0eSA9IGdsdWVWZXJzaW9uID09PSBcIjEuMFwiICYmICEodXNlclByb3ZpZGVkR2x1ZUpvYlByb3BzLndvcmtlclR5cGVcbiAgICB8fCB1c2VyUHJvdmlkZWRHbHVlSm9iUHJvcHMubnVtYmVyT2ZXb3JrZXJzKSA/IDIgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGV0bENvZGVBc3NldCkge1xuICAgIHVzZXJQcm92aWRlZEdsdWVKb2JQcm9wcy5jb21tYW5kLnNjcmlwdExvY2F0aW9uID0gZXRsQ29kZUFzc2V0LnMzT2JqZWN0VXJsO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdEdsdWVKb2JQcm9wczogQ2ZuSm9iUHJvcHMgPSB7XG4gICAgY29tbWFuZDogdXNlclByb3ZpZGVkR2x1ZUpvYlByb3BzLmNvbW1hbmQhLFxuICAgIHJvbGU6IGpvYlJvbGUucm9sZUFybixcbiAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IGdsdWVTZWN1cml0eUNvbmZpZ05hbWUsXG4gICAgZGVmYXVsdEFyZ3VtZW50cyxcbiAgICBtYXhDYXBhY2l0eSxcbiAgICBudW1iZXJPZldvcmtlcnM6ICghZ2x1ZVZlcnNpb24gfHwgZ2x1ZVZlcnNpb24gPT09IFwiMi4wXCIpID8gMiA6IHVuZGVmaW5lZCwgLy8gZGVmYXVsdGluZyB0byAyIHdvcmtlcnMsXG4gICAgd29ya2VyVHlwZTogKCFnbHVlVmVyc2lvbiB8fCBnbHVlVmVyc2lvbiA9PT0gXCIyLjBcIikgPyAnRy4xWCcgOiB1bmRlZmluZWQsIC8vIGRlZmF1bHRpbmcgdG8gRy4xWCBhcyBpdCBpcyBwcmVmZXJyZWQgd2l0aCBnbHVlIHZlcnNpb24gMi4wXG4gICAgLy8gZ2x1ZSB2ZXJzaW9uIHRob3VnaCBvcHRpb25hbCBpcyByZXF1aXJlZCBmb3Igc3RyZWFtaW5nIGV0bCBqb2JzIG90aGVyd2lzZSBpdCB0aHJvd3MgYW4gZXJyb3IgdGhhdCAnY29tbWFuZCBub3QgZm91bmQnXG4gICAgZ2x1ZVZlcnNpb246IGdsdWVWZXJzaW9uID8gZ2x1ZVZlcnNpb24gOiAnMi4wJ1xuICB9O1xuXG4gIHJldHVybiBkZWZhdWx0R2x1ZUpvYlByb3BzO1xufSJdfQ==
@@ -14,6 +14,7 @@ import { Construct } from 'constructs';
14
14
  import * as glue from 'aws-cdk-lib/aws-glue';
15
15
  import { IRole, Role } from 'aws-cdk-lib/aws-iam';
16
16
  import { Bucket, BucketProps } from 'aws-cdk-lib/aws-s3';
17
+ import * as s3assets from "aws-cdk-lib/aws-s3-assets";
17
18
  /**
18
19
  * Enumeration of data store types that could include S3, DynamoDB, DocumentDB, RDS or Redshift. Current
19
20
  * construct implementation only supports S3, but potential to add other output types in the future
@@ -70,9 +71,15 @@ export interface BuildGlueJobProps {
70
71
  * Output storage options
71
72
  */
72
73
  readonly outputDataStore?: SinkDataStoreProps;
74
+ /**
75
+ * Asset instance for the ETL code that performs Glue Job transformation
76
+ *
77
+ * @default - None
78
+ */
79
+ readonly etlCodeAsset?: s3assets.Asset;
73
80
  }
74
81
  export declare function buildGlueJob(scope: Construct, props: BuildGlueJobProps): [glue.CfnJob, IRole, [Bucket, (Bucket | undefined)?]?];
75
- export declare function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, database: glue.CfnDatabase, table: glue.CfnTable, outputDataStore: SinkDataStoreProps): [glue.CfnJob, IRole, [Bucket, (Bucket | undefined)?]];
82
+ export declare function deployGlueJob(scope: Construct, glueJobProps: glue.CfnJobProps, database: glue.CfnDatabase, table: glue.CfnTable, outputDataStore: SinkDataStoreProps, etlCodeAsset?: s3assets.Asset): [glue.CfnJob, IRole, [Bucket, (Bucket | undefined)?]];
76
83
  /**
77
84
  * This is a helper method to create the Role required for the Glue Job. If a role is already created then this
78
85
  * method is not required to be called.
@@ -38,7 +38,7 @@ function buildGlueJob(scope, props) {
38
38
  throw Error('Cannot set MaxCapacity and "WorkerType" or "NumberOfWorkers". If using glueVersion 2.0 or beyond, ' +
39
39
  'it is recommended to use "WorkerType" or "NumberOfWorkers"');
40
40
  }
41
- return deployGlueJob(scope, props.glueJobProps, props.database, props.table, props.outputDataStore);
41
+ return deployGlueJob(scope, props.glueJobProps, props.database, props.table, props.outputDataStore, props.etlCodeAsset);
42
42
  }
43
43
  else {
44
44
  throw Error('Either glueJobProps or existingCfnJob is required');
@@ -49,7 +49,7 @@ function buildGlueJob(scope, props) {
49
49
  }
50
50
  }
51
51
  exports.buildGlueJob = buildGlueJob;
52
- function deployGlueJob(scope, glueJobProps, database, table, outputDataStore) {
52
+ function deployGlueJob(scope, glueJobProps, database, table, outputDataStore, etlCodeAsset) {
53
53
  let _glueSecurityConfigName;
54
54
  if (glueJobProps.securityConfiguration === undefined) {
55
55
  _glueSecurityConfigName = 'ETLJobSecurityConfig';
@@ -109,18 +109,21 @@ function deployGlueJob(scope, glueJobProps, database, table, outputDataStore) {
109
109
  { '--output_path': `s3a://${_outputLocation[0].bucketName}/output/` }),
110
110
  ...glueJobProps.defaultArguments
111
111
  };
112
- const _newGlueJobProps = utils_1.overrideProps(defaults.DefaultGlueJobProps(_jobRole, glueJobProps, _glueSecurityConfigName, _jobArgumentsList), glueJobProps);
113
- let _scriptLocation;
114
- if (isJobCommandProperty(_newGlueJobProps.command)) {
115
- if (_newGlueJobProps.command.scriptLocation) {
116
- _scriptLocation = _newGlueJobProps.command.scriptLocation;
117
- }
118
- else {
119
- throw Error('Script location has to be provided as an s3 Url location. Script location cannot be empty');
112
+ const _newGlueJobProps = utils_1.overrideProps(defaults.DefaultGlueJobProps(_jobRole, glueJobProps, _glueSecurityConfigName, _jobArgumentsList, etlCodeAsset), glueJobProps);
113
+ if (etlCodeAsset) {
114
+ etlCodeAsset.grantRead(_jobRole);
115
+ }
116
+ else {
117
+ // create CDK Bucket instance from S3 url and grant read access to Glue Job's service principal
118
+ if (isJobCommandProperty(_newGlueJobProps.command)) {
119
+ if (!_newGlueJobProps.command.scriptLocation) {
120
+ throw Error('Script location has to be provided as an s3 Url location. Script location cannot be empty');
121
+ }
122
+ const _scriptLocation = _newGlueJobProps.command.scriptLocation;
123
+ const _scriptBucketLocation = aws_s3_1.Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(_scriptLocation));
124
+ _scriptBucketLocation.grantRead(_jobRole);
120
125
  }
121
126
  }
122
- const _scriptBucketLocation = aws_s3_1.Bucket.fromBucketArn(scope, 'ScriptLocaiton', getS3ArnfromS3Url(_scriptLocation));
123
- _scriptBucketLocation.grantRead(_jobRole);
124
127
  const _glueJob = new glue.CfnJob(scope, 'KinesisETLJob', _newGlueJobProps);
125
128
  return [_glueJob, _jobRole, _outputLocation];
126
129
  }
@@ -165,17 +168,23 @@ exports.createGlueDatabase = createGlueDatabase;
165
168
  * @param s3Url
166
169
  */
167
170
  function getS3ArnfromS3Url(s3Url) {
168
- const splitString = s3Url.slice('s3://'.length);
169
- return `arn:${aws_cdk_lib_1.Aws.PARTITION}:s3:::${splitString}`;
171
+ if (s3Url && s3Url.startsWith('s3://')) {
172
+ const splitString = s3Url.slice('s3://'.length);
173
+ return `arn:${aws_cdk_lib_1.Aws.PARTITION}:s3:::${splitString}`;
174
+ }
175
+ else {
176
+ throw Error(`Received S3URL as ${s3Url}. The S3 url string does not begin with s3://. This is not a standard S3 url`);
177
+ }
170
178
  }
171
179
  /**
172
- * A utility method to type check CfnJob.JobCommandProperty type.
180
+ * A utility method to type check CfnJob.JobCommandProperty type. For the construct to work for streaming ETL from Kinesis Data
181
+ * Streams, all three attributes of the JobCommandProperty are required, even though they may be optional for other use cases.
173
182
  *
174
183
  * @param command
175
184
  */
176
185
  function isJobCommandProperty(command) {
177
- if (command.name ||
178
- command.pythonVersion ||
186
+ if (command.name &&
187
+ command.pythonVersion &&
179
188
  command.scriptLocation) {
180
189
  return true;
181
190
  }
@@ -184,4 +193,4 @@ function isJobCommandProperty(command) {
184
193
  return false;
185
194
  }
186
195
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2x1ZS1qb2ItaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBR0gsNkNBQTZDO0FBQzdDLGlEQUFxRztBQUNyRywrQ0FBa0U7QUFDbEUsNkNBQStDO0FBQy9DLGdDQUFnQztBQUNoQyxtQ0FBd0M7QUFFeEM7OztHQUdHO0FBQ0gsSUFBWSxhQUVYO0FBRkQsV0FBWSxhQUFhO0lBQ3ZCLDBCQUFTLENBQUE7QUFDWCxDQUFDLEVBRlcsYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFFeEI7QUFzREQsU0FBZ0IsWUFBWSxDQUFDLEtBQWdCLEVBQUUsS0FBd0I7SUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7UUFDekIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO2dCQUM5RSxNQUFNLEtBQUssQ0FBQyxtR0FBbUc7b0JBQy9HLDBHQUEwRyxDQUFDLENBQUM7YUFDN0c7WUFFRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDM0csTUFBTSxLQUFLLENBQUMscUdBQXFHO29CQUNqSCw2REFBNkQsQ0FBQyxDQUFDO2FBQ2hFO1lBRUQsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVMsRUFBRSxLQUFLLENBQUMsS0FBTSxFQUFFLEtBQUssQ0FBQyxlQUFnQixDQUFDLENBQUM7U0FDeEc7YUFBTTtZQUNMLE1BQU0sS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7U0FDbEU7S0FDRjtTQUFNO1FBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsY0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNuRztBQUNILENBQUM7QUFwQkQsb0NBb0JDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLEtBQWdCLEVBQUUsWUFBOEIsRUFBRSxRQUEwQixFQUFFLEtBQW9CLEVBQzlILGVBQW1DO0lBRW5DLElBQUksdUJBQStCLENBQUM7SUFFcEMsSUFBSSxZQUFZLENBQUMscUJBQXFCLEtBQUssU0FBUyxFQUFFO1FBQ3BELHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO1FBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8saUJBQUcsQ0FBQyxTQUFTLFFBQVEsaUJBQUcsQ0FBQyxNQUFNLElBQUksaUJBQUcsQ0FBQyxVQUFVLGlCQUFpQixDQUFDO1FBRTlGLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtZQUM3RCxJQUFJLEVBQUUsdUJBQXVCO1lBQzdCLHVCQUF1QixFQUFFO2dCQUN2QixzQkFBc0IsRUFBRTtvQkFDdEIsMEJBQTBCLEVBQUUsU0FBUztvQkFDckMsU0FBUyxFQUFFLFdBQVc7aUJBQ3ZCO2dCQUNELGFBQWEsRUFBRSxDQUFDO3dCQUNkLGdCQUFnQixFQUFFLFFBQVE7cUJBQzNCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCx1QkFBdUIsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUM7S0FDOUQ7SUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGdCQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRTtRQUNwRCxVQUFVLEVBQUU7WUFDVixJQUFJLHlCQUFlLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixDQUFFO2dCQUMvRSxTQUFTLEVBQUUsQ0FBRSxPQUFPLGlCQUFHLENBQUMsU0FBUyxTQUFTLGlCQUFHLENBQUMsTUFBTSxJQUFJLGlCQUFHLENBQUMsVUFBVSx3QkFBd0IsQ0FBRTthQUNqRyxDQUFDO1NBQ0g7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLFFBQWUsQ0FBQztJQUNwQixJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUU7UUFDckIsUUFBUSxHQUFHLGNBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEU7U0FBTTtRQUNMLFFBQVEsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDOUM7SUFFRCxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXRDLElBQUksZUFBb0MsQ0FBQztJQUN6QyxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsRUFBRSxFQUFFO1FBQ3ZGLElBQUksZUFBZSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTtZQUN4RCxlQUFlLEdBQUcsQ0FBRSxlQUFlLENBQUMsc0JBQXNCLEVBQUUsU0FBUyxDQUFFLENBQUM7U0FDekU7YUFBTTtZQUNMLGVBQWUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsQ0FBRSxDQUFDO1NBQ3RHO0tBQ0Y7U0FBTTtRQUNMLGVBQWUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUVELGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsTUFBTSxpQkFBaUIsR0FBRztRQUN4QixrQkFBa0IsRUFBRyxJQUFJO1FBQ3pCLG9DQUFvQyxFQUFHLElBQUk7UUFDM0MsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLEdBQUc7UUFDL0IsY0FBYyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUcsRUFBRSxlQUFlLEVBQUcsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxVQUFVLEVBQUUsQ0FBQztRQUN6RSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0I7S0FDakMsQ0FBQztJQUVGLE1BQU0sZ0JBQWdCLEdBQXFCLHFCQUFhLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFFBQVMsRUFBRSxZQUFZLEVBQzNHLHVCQUF1QixFQUFFLGlCQUFpQixDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFN0QsSUFBSSxlQUF1QixDQUFDO0lBQzVCLElBQUksb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDbEQsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO1lBQzNDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1NBQzNEO2FBQU07WUFDTCxNQUFNLEtBQUssQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO1NBQzFHO0tBQ0Y7SUFFRCxNQUFNLHFCQUFxQixHQUFZLGVBQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLGVBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzFILHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxQyxNQUFNLFFBQVEsR0FBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN4RixPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBcEZELHNDQW9GQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsS0FBZ0I7SUFDaEQsT0FBTyxJQUFJLGNBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ2hDLFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLG9CQUFvQixDQUFDO1FBQ3JELFdBQVcsRUFBRSxrRUFBa0U7S0FDaEYsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUxELDhDQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsS0FBZ0IsRUFBRSxRQUEwQixFQUFFLFVBQStCLEVBQzNHLFdBQTZDLEVBQUUsVUFBbUIsRUFBRSxVQUFnQjtJQUNwRixPQUFPLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0UsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxXQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEYsQ0FBQztBQUpELDBDQUlDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsS0FBZ0IsRUFBRyxhQUFxQztJQUN6RixNQUFNLGNBQWMsR0FBMEIsQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFhLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMvSSxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUN0QyxPQUFPLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUpELGdEQUlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxNQUFNLFdBQVcsR0FBVyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxPQUFPLE9BQU8saUJBQUcsQ0FBQyxTQUFTLFNBQVMsV0FBVyxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLE9BQXFEO0lBQ2pGLElBQUssT0FBMEMsQ0FBQyxJQUFJO1FBQ2pELE9BQTBDLENBQUMsYUFBYTtRQUN4RCxPQUEwQyxDQUFDLGNBQWMsRUFBRTtRQUM1RCxPQUFPLElBQUksQ0FBQztLQUNiO1NBQU07UUFDTCxRQUFRLENBQUMsWUFBWSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgMjAyMiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgZ2x1ZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgeyBFZmZlY3QsIElSb2xlLCBQb2xpY3ksIFBvbGljeVN0YXRlbWVudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0LCBCdWNrZXRQcm9wcywgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3MsIElSZXNvbHZhYmxlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgZGVmYXVsdHMgZnJvbSAnLi4vJztcbmltcG9ydCB7IG92ZXJyaWRlUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBkYXRhIHN0b3JlIHR5cGVzIHRoYXQgY291bGQgaW5jbHVkZSBTMywgRHluYW1vREIsIERvY3VtZW50REIsIFJEUyBvciBSZWRzaGlmdC4gQ3VycmVudFxuICogY29uc3RydWN0IGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgUzMsIGJ1dCBwb3RlbnRpYWwgdG8gYWRkIG90aGVyIG91dHB1dCB0eXBlcyBpbiB0aGUgZnV0dXJlXG4gKi9cbmV4cG9ydCBlbnVtIFNpbmtTdG9yZVR5cGUge1xuICBTMyA9ICdTMydcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgdG8gZGVmaW5lIHBvdGVudGlhbCBvdXRwdXRzIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3QgZGVmaW5lIGFkZGl0aW9uYWwgb3V0cHV0IGRlc3RpbmF0aW9ucyBmb3IgRVRMXG4gKiB0cmFuc2Zvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmtEYXRhU3RvcmVQcm9wcyB7XG4gIC8qKlxuICAgKiBTaW5rIGRhdGEgc3RvcmUgdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YXN0b3JlVHlwZTogU2lua1N0b3JlVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgUzMgbG9jYXRpb24gd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uIFRoZSBwcm92aWRlZCBTMyBidWNrZXQgd2lsbCBiZSB1c2VkIHRvIHBhc3NcbiAgICogdGhlIG91dHB1dCBsb2NhdGlvbiB0byB0aGUgZXRsIHNjcmlwdCBhcyBhbiBhcmd1bWVudCB0byB0aGUgQVdTIEdsdWUgam9iLlxuICAgKlxuICAgKiBJZiBubyBsb2NhdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBjaGVjayBpZiBAb3V0cHV0QnVja2V0UHJvcHMgYXJlIHByb3ZpZGVkLiBJZiBub3QgaXQgd2lsbCBjcmVhdGUgYSBuZXdcbiAgICogYnVja2V0IGlmIHRoZSBAZGF0YXN0b3JlVHlwZSBpcyBTMy5cbiAgICpcbiAgICogVGhlIGFyZ3VtZW50IGtleSBpcyBgb3V0cHV0X3BhdGhgLiBUaGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IGNhbiBiZSByZXRyaWV2ZSBpbiB0aGUgcHl0aG9uIHNjcmlwdFxuICAgKiBhcyBmb2xsb3dzOlxuICAgKiAgZ2V0UmVzb2x2ZWRPcHRpb25zKHN5cy5hcmd2LCBbXCJKT0JfTkFNRVwiLCBcIm91dHB1dF9wYXRoXCIsIDxvdGhlciBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkPiBdKVxuICAgKiAgb3V0cHV0X3BhdGggPSBhcmdzW1wib3V0cHV0X3BhdGhcIl1cbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nUzNPdXRwdXRCdWNrZXQ/OiBCdWNrZXRcbiAgLyoqXG4gICAqIElmIEBleGlzdGluZ1MzT3V0cHV0QlVja2V0IGlzIHByb3ZpZGVkLCB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQsXG4gICAqIHRoZSBjb25zdHJ1Y3Qgd2lsbCBjcmVhdGUgYSBuZXcgYnVja2V0IGlmIHRoZSBAZGF0YXN0b3JlVHlwZSBpcyBTMy5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dEJ1Y2tldFByb3BzPzogQnVja2V0UHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRHbHVlSm9iUHJvcHMge1xuICAvKipcbiAgICogR2x1ZSBFVEwgam9iIHByb3BlcnRpZXMuXG4gICAqL1xuICByZWFkb25seSBnbHVlSm9iUHJvcHM/OiBnbHVlLkNmbkpvYlByb3BzIHwgYW55XG4gIC8qKlxuICAgKiBFeGlzdGluZyBpbnN0YW5jZSBvZiB0aGUgUzMgYnVja2V0IG9iamVjdCwgaWYgdGhpcyBpcyBzZXQgdGhlbiB0aGUgc2NyaXB0IGxvY2F0aW9uIGlzIGlnbm9yZWQuXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0NmbkpvYj86IGdsdWUuQ2ZuSm9iO1xuICAvKipcbiAgICogQVdTIEdsdWUgdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlOiBnbHVlLkNmblRhYmxlO1xuICAvKipcbiAgICogQVdTIEdsdWUgZGF0YWJhc2VcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlOiBnbHVlLkNmbkRhdGFiYXNlO1xuICAvKipcbiAgICogT3V0cHV0IHN0b3JhZ2Ugb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0RGF0YVN0b3JlPzogU2lua0RhdGFTdG9yZVByb3BzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdsdWVKb2Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IEJ1aWxkR2x1ZUpvYlByb3BzKTogW2dsdWUuQ2ZuSm9iLCBJUm9sZSwgW0J1Y2tldCwgKEJ1Y2tldCB8IHVuZGVmaW5lZCk/XT9dIHtcbiAgaWYgKCFwcm9wcy5leGlzdGluZ0NmbkpvYikge1xuICAgIGlmIChwcm9wcy5nbHVlSm9iUHJvcHMpIHtcbiAgICAgIGlmIChwcm9wcy5nbHVlSm9iUHJvcHMuZ2x1ZVZlcnNpb24gPT09ICcyLjAnICYmIHByb3BzLmdsdWVKb2JQcm9wcy5tYXhDYXBhY2l0eSkge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHNldCBcIk1heENhcGFjaXR5XCIgd2l0aCBHbHVlVmVyc2lvbiAyLjAgb3IgaGlnaGVyLiBVc2UgXCJOdW1iZXJPZldvcmtlcnNcIiBhbmQgXCJXb3JrZXJUeXBlXCIuICcgK1xuICAgICAgICAnUmVmZXIgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC93ZWJhcGkvQVBJX0pvYi5odG1sIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmdsdWVKb2JQcm9wcy5tYXhDYXBhY2l0eSAmJiAocHJvcHMuZ2x1ZUpvYlByb3BzLm51bWJlck9mV29ya2VycyB8fCBwcm9wcy5nbHVlSm9iUHJvcHMud29ya2VyVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgTWF4Q2FwYWNpdHkgYW5kIFwiV29ya2VyVHlwZVwiIG9yICBcIk51bWJlck9mV29ya2Vyc1wiLiBJZiB1c2luZyBnbHVlVmVyc2lvbiAyLjAgb3IgYmV5b25kLCAnICtcbiAgICAgICAgJ2l0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBcIldvcmtlclR5cGVcIiBvciAgXCJOdW1iZXJPZldvcmtlcnNcIicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVwbG95R2x1ZUpvYihzY29wZSwgcHJvcHMuZ2x1ZUpvYlByb3BzLCBwcm9wcy5kYXRhYmFzZSEsIHByb3BzLnRhYmxlISwgcHJvcHMub3V0cHV0RGF0YVN0b3JlISk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKCdFaXRoZXIgZ2x1ZUpvYlByb3BzIG9yIGV4aXN0aW5nQ2ZuSm9iIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbcHJvcHMuZXhpc3RpbmdDZm5Kb2IsIFJvbGUuZnJvbVJvbGVBcm4oc2NvcGUsICdFeGlzdGluZ1JvbGUnLCBwcm9wcy5leGlzdGluZ0NmbkpvYi5yb2xlKV07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveUdsdWVKb2Ioc2NvcGU6IENvbnN0cnVjdCwgZ2x1ZUpvYlByb3BzOiBnbHVlLkNmbkpvYlByb3BzLCBkYXRhYmFzZTogZ2x1ZS5DZm5EYXRhYmFzZSwgdGFibGU6IGdsdWUuQ2ZuVGFibGUsXG4gIG91dHB1dERhdGFTdG9yZTogU2lua0RhdGFTdG9yZVByb3BzKTogW2dsdWUuQ2ZuSm9iLCBJUm9sZSwgW0J1Y2tldCwgKEJ1Y2tldCB8IHVuZGVmaW5lZCk/XV0ge1xuXG4gIGxldCBfZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZTogc3RyaW5nO1xuXG4gIGlmIChnbHVlSm9iUHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBfZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZSA9ICdFVExKb2JTZWN1cml0eUNvbmZpZyc7XG4gICAgY29uc3QgX2dsdWVLTVNLZXkgPSBgYXJuOiR7QXdzLlBBUlRJVElPTn06a21zOiR7QXdzLlJFR0lPTn06JHtBd3MuQUNDT1VOVF9JRH06YWxpYXMvYXdzL2dsdWVgO1xuXG4gICAgbmV3IGdsdWUuQ2ZuU2VjdXJpdHlDb25maWd1cmF0aW9uKHNjb3BlLCAnR2x1ZVNlY3VyaXR5Q29uZmlnJywge1xuICAgICAgbmFtZTogX2dsdWVTZWN1cml0eUNvbmZpZ05hbWUsXG4gICAgICBlbmNyeXB0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICBqb2JCb29rbWFya3NFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgam9iQm9va21hcmtzRW5jcnlwdGlvbk1vZGU6ICdDU0UtS01TJyxcbiAgICAgICAgICBrbXNLZXlBcm46IF9nbHVlS01TS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHMzRW5jcnlwdGlvbnM6IFt7XG4gICAgICAgICAgczNFbmNyeXB0aW9uTW9kZTogJ1NTRS1TMydcbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBfZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZSA9IGdsdWVKb2JQcm9wcy5zZWN1cml0eUNvbmZpZ3VyYXRpb247XG4gIH1cblxuICBjb25zdCBfZ2x1ZUpvYlBvbGljeSA9IG5ldyBQb2xpY3koc2NvcGUsICdMb2dQb2xpY3knLCB7XG4gICAgc3RhdGVtZW50czogW1xuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbICdsb2dzOkNyZWF0ZUxvZ0dyb3VwJywgJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJyBdLFxuICAgICAgICByZXNvdXJjZXM6IFsgYGFybjoke0F3cy5QQVJUSVRJT059OmxvZ3M6JHtBd3MuUkVHSU9OfToke0F3cy5BQ0NPVU5UX0lEfTpsb2ctZ3JvdXA6L2F3cy1nbHVlLypgIF1cbiAgICAgIH0pXG4gICAgXVxuICB9KTtcblxuICBsZXQgX2pvYlJvbGU6IElSb2xlO1xuICBpZiAoZ2x1ZUpvYlByb3BzLnJvbGUpIHtcbiAgICBfam9iUm9sZSA9IFJvbGUuZnJvbVJvbGVBcm4oc2NvcGUsICdKb2JSb2xlJywgZ2x1ZUpvYlByb3BzLnJvbGUpO1xuICB9IGVsc2Uge1xuICAgIF9qb2JSb2xlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZUpvYlJvbGUoc2NvcGUpO1xuICB9XG5cbiAgX2dsdWVKb2JQb2xpY3kuYXR0YWNoVG9Sb2xlKF9qb2JSb2xlKTtcblxuICBsZXQgX291dHB1dExvY2F0aW9uOiBbIEJ1Y2tldCwgQnVja2V0PyBdO1xuICBpZiAob3V0cHV0RGF0YVN0b3JlICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0RGF0YVN0b3JlLmRhdGFzdG9yZVR5cGUgPT09IFNpbmtTdG9yZVR5cGUuUzMpIHtcbiAgICBpZiAob3V0cHV0RGF0YVN0b3JlLmV4aXN0aW5nUzNPdXRwdXRCdWNrZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgX291dHB1dExvY2F0aW9uID0gWyBvdXRwdXREYXRhU3RvcmUuZXhpc3RpbmdTM091dHB1dEJ1Y2tldCwgdW5kZWZpbmVkIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIF9vdXRwdXRMb2NhdGlvbiA9IGRlZmF1bHRzLmJ1aWxkUzNCdWNrZXQoc2NvcGUsIHsgYnVja2V0UHJvcHM6IG91dHB1dERhdGFTdG9yZS5vdXRwdXRCdWNrZXRQcm9wcyB9ICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIF9vdXRwdXRMb2NhdGlvbiA9IGRlZmF1bHRzLmJ1aWxkUzNCdWNrZXQoc2NvcGUsIHt9KTtcbiAgfVxuXG4gIF9vdXRwdXRMb2NhdGlvblswXS5ncmFudFJlYWRXcml0ZShfam9iUm9sZSk7XG5cbiAgY29uc3QgX2pvYkFyZ3VtZW50c0xpc3QgPSB7XG4gICAgXCItLWVuYWJsZS1tZXRyaWNzXCIgOiB0cnVlLFxuICAgIFwiLS1lbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZ1wiIDogdHJ1ZSxcbiAgICBcIi0tZGF0YWJhc2VfbmFtZVwiOiBkYXRhYmFzZS5yZWYsXG4gICAgXCItLXRhYmxlX25hbWVcIjogdGFibGUucmVmLFxuICAgIC4uLigob3V0cHV0RGF0YVN0b3JlID09PSB1bmRlZmluZWQgfHwgKG91dHB1dERhdGFTdG9yZSAmJiBvdXRwdXREYXRhU3RvcmUuZGF0YXN0b3JlVHlwZSA9PT0gU2lua1N0b3JlVHlwZS5TMykpICYmXG4gICAgICB7ICctLW91dHB1dF9wYXRoJyA6IGBzM2E6Ly8ke19vdXRwdXRMb2NhdGlvblswXS5idWNrZXROYW1lfS9vdXRwdXQvYCB9KSxcbiAgICAuLi5nbHVlSm9iUHJvcHMuZGVmYXVsdEFyZ3VtZW50c1xuICB9O1xuXG4gIGNvbnN0IF9uZXdHbHVlSm9iUHJvcHM6IGdsdWUuQ2ZuSm9iUHJvcHMgPSBvdmVycmlkZVByb3BzKGRlZmF1bHRzLkRlZmF1bHRHbHVlSm9iUHJvcHMoX2pvYlJvbGUhLCBnbHVlSm9iUHJvcHMsXG4gICAgX2dsdWVTZWN1cml0eUNvbmZpZ05hbWUsIF9qb2JBcmd1bWVudHNMaXN0KSwgZ2x1ZUpvYlByb3BzKTtcblxuICBsZXQgX3NjcmlwdExvY2F0aW9uOiBzdHJpbmc7XG4gIGlmIChpc0pvYkNvbW1hbmRQcm9wZXJ0eShfbmV3R2x1ZUpvYlByb3BzLmNvbW1hbmQpKSB7XG4gICAgaWYgKF9uZXdHbHVlSm9iUHJvcHMuY29tbWFuZC5zY3JpcHRMb2NhdGlvbikge1xuICAgICAgX3NjcmlwdExvY2F0aW9uID0gX25ld0dsdWVKb2JQcm9wcy5jb21tYW5kLnNjcmlwdExvY2F0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignU2NyaXB0IGxvY2F0aW9uIGhhcyB0byBiZSBwcm92aWRlZCBhcyBhbiBzMyBVcmwgbG9jYXRpb24uIFNjcmlwdCBsb2NhdGlvbiBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBfc2NyaXB0QnVja2V0TG9jYXRpb246IElCdWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldEFybihzY29wZSwgJ1NjcmlwdExvY2FpdG9uJywgZ2V0UzNBcm5mcm9tUzNVcmwoX3NjcmlwdExvY2F0aW9uISkpO1xuICBfc2NyaXB0QnVja2V0TG9jYXRpb24uZ3JhbnRSZWFkKF9qb2JSb2xlKTtcblxuICBjb25zdCBfZ2x1ZUpvYjogZ2x1ZS5DZm5Kb2IgPSBuZXcgZ2x1ZS5DZm5Kb2Ioc2NvcGUsICdLaW5lc2lzRVRMSm9iJywgX25ld0dsdWVKb2JQcm9wcyk7XG4gIHJldHVybiBbX2dsdWVKb2IsIF9qb2JSb2xlLCBfb3V0cHV0TG9jYXRpb25dO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgUm9sZSByZXF1aXJlZCBmb3IgdGhlIEdsdWUgSm9iLiBJZiBhIHJvbGUgaXMgYWxyZWFkeSBjcmVhdGVkIHRoZW4gdGhpc1xuICogbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBiZSBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gVGhlIEFXUyBDb25zdHJ1Y3QgdW5kZXIgd2hpY2ggdGhlIHJvbGUgaXMgdG8gYmUgY3JlYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2x1ZUpvYlJvbGUoc2NvcGU6IENvbnN0cnVjdCk6IFJvbGUge1xuICByZXR1cm4gbmV3IFJvbGUoc2NvcGUsICdKb2JSb2xlJywge1xuICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2dsdWUuYW1hem9uYXdzLmNvbScpLFxuICAgIGRlc2NyaXB0aW9uOiAnU2VydmljZSByb2xlIHRoYXQgR2x1ZSBjdXN0b20gRVRMIGpvYnMgd2lsbCBhc3N1bWUgZm9yIGV4ZXVjdGlvbicsXG4gIH0pO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gQVdTIEdsdWUgdGFibGUuIFRoZSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gZXhpc3RpbmcgR2x1ZSB0YWJsZSBpcyBub3QgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdsdWVUYWJsZShzY29wZTogQ29uc3RydWN0LCBkYXRhYmFzZTogZ2x1ZS5DZm5EYXRhYmFzZSwgdGFibGVQcm9wcz86IGdsdWUuQ2ZuVGFibGVQcm9wcyxcbiAgZmllbGRTY2hlbWE/OiBnbHVlLkNmblRhYmxlLkNvbHVtblByb3BlcnR5IFtdLCBzb3VyY2VUeXBlPzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55KTogZ2x1ZS5DZm5UYWJsZSB7XG4gIHJldHVybiBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlKHNjb3BlLCB0YWJsZVByb3BzICE9PSB1bmRlZmluZWQgPyB0YWJsZVByb3BzIDpcbiAgICBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoZGF0YWJhc2UsIGZpZWxkU2NoZW1hISwgc291cmNlVHlwZSwgcGFyYW1ldGVycykpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gQVdTIEdsdWUgZGF0YWJhc2UuIFRoZSBtZXRob2QgaXMgb25seSBjYWxsZWQgd2l0aCBhbiBleGlzdGluZyBHbHVlIGRhdGFiYXNlIHR5cGUgaXMgbm90IHByb3ZpZGVkLlxuICogVGhlIG1ldGhvZCB1c2VzIHRoZSB1c2VyIHByb3ZpZGVkIHByb3BzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWwgcHJvcHMgZm9yIHRoZSBHbHVlIGRhdGFiYXNlXG4gKlxuICogQHBhcmFtIHNjb3BlXG4gKiBAcGFyYW0gZGF0YWJhc2VQcm9wc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2x1ZURhdGFiYXNlKHNjb3BlOiBDb25zdHJ1Y3QsICBkYXRhYmFzZVByb3BzPzogZ2x1ZS5DZm5EYXRhYmFzZVByb3BzKTogZ2x1ZS5DZm5EYXRhYmFzZSB7XG4gIGNvbnN0IF9tZXJnZWREQlByb3BzOiBnbHVlLkNmbkRhdGFiYXNlUHJvcHMgPSAoZGF0YWJhc2VQcm9wcyAhPT0gdW5kZWZpbmVkKSA/IG92ZXJyaWRlUHJvcHMoZGVmYXVsdHMuRGVmYXVsdEdsdWVEYXRhYmFzZVByb3BzKCksIGRhdGFiYXNlUHJvcHMpIDpcbiAgICBkZWZhdWx0cy5EZWZhdWx0R2x1ZURhdGFiYXNlUHJvcHMoKTtcbiAgcmV0dXJuIGRlZmF1bHRzLkRlZmF1bHRHbHVlRGF0YWJhc2Uoc2NvcGUsIF9tZXJnZWREQlByb3BzKTtcbn1cblxuLyoqXG4gKiBBIHV0aWxpdHkgbWV0aG9kIHRvIGdlbmVyYXRlIHRoZSBTMyBBcm4gZnJvbSBhbiBTMyBVcmwuXG4gKlxuICogQHBhcmFtIHMzVXJsXG4gKi9cbmZ1bmN0aW9uIGdldFMzQXJuZnJvbVMzVXJsKHMzVXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGxpdFN0cmluZzogc3RyaW5nID0gczNVcmwuc2xpY2UoJ3MzOi8vJy5sZW5ndGgpO1xuICByZXR1cm4gYGFybjoke0F3cy5QQVJUSVRJT059OnMzOjo6JHtzcGxpdFN0cmluZ31gO1xufVxuXG4vKipcbiAqIEEgdXRpbGl0eSBtZXRob2QgdG8gdHlwZSBjaGVjayBDZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5IHR5cGUuXG4gKlxuICogQHBhcmFtIGNvbW1hbmRcbiAqL1xuZnVuY3Rpb24gaXNKb2JDb21tYW5kUHJvcGVydHkoY29tbWFuZDogZ2x1ZS5DZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5IHwgSVJlc29sdmFibGUpOiBjb21tYW5kIGlzIGdsdWUuQ2ZuSm9iLkpvYkNvbW1hbmRQcm9wZXJ0eSB7XG4gIGlmICgoY29tbWFuZCBhcyBnbHVlLkNmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkpLm5hbWUgfHxcbiAgICAoY29tbWFuZCBhcyBnbHVlLkNmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkpLnB5dGhvblZlcnNpb24gfHxcbiAgICAoY29tbWFuZCBhcyBnbHVlLkNmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkpLnNjcmlwdExvY2F0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdHMucHJpbnRXYXJuaW5nKCdjb21tYW5kIG5vdCBvZiB0eXBlIEpvYkNvbW1hbmRQcm9wZXJ0eSB0eXBlJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59Il19
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2x1ZS1qb2ItaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBR0gsNkNBQTZDO0FBQzdDLGlEQUFxRztBQUNyRywrQ0FBa0U7QUFDbEUsNkNBQStDO0FBRS9DLGdDQUFnQztBQUNoQyxtQ0FBd0M7QUFFeEM7OztHQUdHO0FBQ0gsSUFBWSxhQUVYO0FBRkQsV0FBWSxhQUFhO0lBQ3ZCLDBCQUFTLENBQUE7QUFDWCxDQUFDLEVBRlcsYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFFeEI7QUE0REQsU0FBZ0IsWUFBWSxDQUFDLEtBQWdCLEVBQUUsS0FBd0I7SUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7UUFDekIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO2dCQUM5RSxNQUFNLEtBQUssQ0FBQyxtR0FBbUc7b0JBQy9HLDBHQUEwRyxDQUFDLENBQUM7YUFDN0c7WUFFRCxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDM0csTUFBTSxLQUFLLENBQUMscUdBQXFHO29CQUNqSCw2REFBNkQsQ0FBQyxDQUFDO2FBQ2hFO1lBRUQsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVMsRUFBRSxLQUFLLENBQUMsS0FBTSxFQUFFLEtBQUssQ0FBQyxlQUFnQixFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1SDthQUFNO1lBQ0wsTUFBTSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUNsRTtLQUNGO1NBQU07UUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25HO0FBQ0gsQ0FBQztBQXBCRCxvQ0FvQkM7QUFFRCxTQUFnQixhQUFhLENBQUMsS0FBZ0IsRUFBRSxZQUE4QixFQUFFLFFBQTBCLEVBQUUsS0FBb0IsRUFDOUgsZUFBbUMsRUFBRSxZQUE2QjtJQUVsRSxJQUFJLHVCQUErQixDQUFDO0lBRXBDLElBQUksWUFBWSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtRQUNwRCx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQztRQUNqRCxNQUFNLFdBQVcsR0FBRyxPQUFPLGlCQUFHLENBQUMsU0FBUyxRQUFRLGlCQUFHLENBQUMsTUFBTSxJQUFJLGlCQUFHLENBQUMsVUFBVSxpQkFBaUIsQ0FBQztRQUU5RixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7WUFDN0QsSUFBSSxFQUFFLHVCQUF1QjtZQUM3Qix1QkFBdUIsRUFBRTtnQkFDdkIsc0JBQXNCLEVBQUU7b0JBQ3RCLDBCQUEwQixFQUFFLFNBQVM7b0JBQ3JDLFNBQVMsRUFBRSxXQUFXO2lCQUN2QjtnQkFDRCxhQUFhLEVBQUUsQ0FBQzt3QkFDZCxnQkFBZ0IsRUFBRSxRQUFRO3FCQUMzQixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7S0FDSjtTQUFNO1FBQ0wsdUJBQXVCLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDO0tBQzlEO0lBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxnQkFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDcEQsVUFBVSxFQUFFO1lBQ1YsSUFBSSx5QkFBZSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixPQUFPLEVBQUUsQ0FBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBRTtnQkFDL0UsU0FBUyxFQUFFLENBQUUsT0FBTyxpQkFBRyxDQUFDLFNBQVMsU0FBUyxpQkFBRyxDQUFDLE1BQU0sSUFBSSxpQkFBRyxDQUFDLFVBQVUsd0JBQXdCLENBQUU7YUFDakcsQ0FBQztTQUNIO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsSUFBSSxRQUFlLENBQUM7SUFDcEIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO1FBQ3JCLFFBQVEsR0FBRyxjQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xFO1NBQU07UUFDTCxRQUFRLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlDO0lBRUQsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0QyxJQUFJLGVBQW9DLENBQUM7SUFDekMsSUFBSSxlQUFlLEtBQUssU0FBUyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLEVBQUUsRUFBRTtRQUN2RixJQUFJLGVBQWUsQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7WUFDeEQsZUFBZSxHQUFHLENBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLFNBQVMsQ0FBRSxDQUFDO1NBQ3pFO2FBQU07WUFDTCxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUUsQ0FBQztTQUN0RztLQUNGO1NBQU07UUFDTCxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDckQ7SUFFRCxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVDLE1BQU0saUJBQWlCLEdBQUc7UUFDeEIsa0JBQWtCLEVBQUcsSUFBSTtRQUN6QixvQ0FBb0MsRUFBRyxJQUFJO1FBQzNDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxHQUFHO1FBQy9CLGNBQWMsRUFBRSxLQUFLLENBQUMsR0FBRztRQUN6QixHQUFHLENBQUMsQ0FBQyxlQUFlLEtBQUssU0FBUyxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVHLEVBQUUsZUFBZSxFQUFHLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsVUFBVSxFQUFFLENBQUM7UUFDekUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCO0tBQ2pDLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFxQixxQkFBYSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFTLEVBQUUsWUFBWSxFQUMzRyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMzRSxJQUFJLFlBQVksRUFBRTtRQUNoQixZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2xDO1NBQU07UUFDTCwrRkFBK0Y7UUFDL0YsSUFBSSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDNUMsTUFBTSxLQUFLLENBQUMsMkZBQTJGLENBQUMsQ0FBQzthQUMxRztZQUNELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFFaEUsTUFBTSxxQkFBcUIsR0FBWSxlQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxlQUFnQixDQUFDLENBQUMsQ0FBQztZQUMxSCxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0M7S0FDRjtJQUVELE1BQU0sUUFBUSxHQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hGLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUF0RkQsc0NBc0ZDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUFnQjtJQUNoRCxPQUFPLElBQUksY0FBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDaEMsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsb0JBQW9CLENBQUM7UUFDckQsV0FBVyxFQUFFLGtFQUFrRTtLQUNoRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBTEQsOENBS0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxLQUFnQixFQUFFLFFBQTBCLEVBQUUsVUFBK0IsRUFDM0csV0FBNkMsRUFBRSxVQUFtQixFQUFFLFVBQWdCO0lBQ3BGLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RSxRQUFRLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLFdBQVksRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBSkQsMENBSUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFnQixFQUFHLGFBQXFDO0lBQ3pGLE1BQU0sY0FBYyxHQUEwQixDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQWEsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQy9JLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3RDLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBSkQsZ0RBSUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhO0lBQ3RDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDdEMsTUFBTSxXQUFXLEdBQVcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsT0FBTyxPQUFPLGlCQUFHLENBQUMsU0FBUyxTQUFTLFdBQVcsRUFBRSxDQUFDO0tBQ25EO1NBQU07UUFDTCxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyw4RUFBOEUsQ0FBQyxDQUFDO0tBQ3ZIO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxPQUFxRDtJQUNqRixJQUFLLE9BQTBDLENBQUMsSUFBSTtRQUNqRCxPQUEwQyxDQUFDLGFBQWE7UUFDeEQsT0FBMEMsQ0FBQyxjQUFjLEVBQUU7UUFDNUQsT0FBTyxJQUFJLENBQUM7S0FDYjtTQUFNO1FBQ0wsUUFBUSxDQUFDLFlBQVksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IDIwMjIgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGdsdWUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgRWZmZWN0LCBJUm9sZSwgUG9saWN5LCBQb2xpY3lTdGF0ZW1lbnQsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEJ1Y2tldCwgQnVja2V0UHJvcHMsIElCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQXdzLCBJUmVzb2x2YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIHMzYXNzZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzXCI7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuLi8nO1xuaW1wb3J0IHsgb3ZlcnJpZGVQcm9wcyB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIG9mIGRhdGEgc3RvcmUgdHlwZXMgdGhhdCBjb3VsZCBpbmNsdWRlIFMzLCBEeW5hbW9EQiwgRG9jdW1lbnREQiwgUkRTIG9yIFJlZHNoaWZ0LiBDdXJyZW50XG4gKiBjb25zdHJ1Y3QgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBTMywgYnV0IHBvdGVudGlhbCB0byBhZGQgb3RoZXIgb3V0cHV0IHR5cGVzIGluIHRoZSBmdXR1cmVcbiAqL1xuZXhwb3J0IGVudW0gU2lua1N0b3JlVHlwZSB7XG4gIFMzID0gJ1MzJ1xufVxuXG4vKipcbiAqIEludGVyZmFjZSB0byBkZWZpbmUgcG90ZW50aWFsIG91dHB1dHMgdG8gYWxsb3cgdGhlIGNvbnN0cnVjdCBkZWZpbmUgYWRkaXRpb25hbCBvdXRwdXQgZGVzdGluYXRpb25zIGZvciBFVExcbiAqIHRyYW5zZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua0RhdGFTdG9yZVByb3BzIHtcbiAgLyoqXG4gICAqIFNpbmsgZGF0YSBzdG9yZSB0eXBlXG4gICAqL1xuICByZWFkb25seSBkYXRhc3RvcmVUeXBlOiBTaW5rU3RvcmVUeXBlO1xuICAvKipcbiAgICogVGhlIG91dHB1dCBTMyBsb2NhdGlvbiB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4gVGhlIHByb3ZpZGVkIFMzIGJ1Y2tldCB3aWxsIGJlIHVzZWQgdG8gcGFzc1xuICAgKiB0aGUgb3V0cHV0IGxvY2F0aW9uIHRvIHRoZSBldGwgc2NyaXB0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBBV1MgR2x1ZSBqb2IuXG4gICAqXG4gICAqIElmIG5vIGxvY2F0aW9uIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGNoZWNrIGlmIEBvdXRwdXRCdWNrZXRQcm9wcyBhcmUgcHJvdmlkZWQuIElmIG5vdCBpdCB3aWxsIGNyZWF0ZSBhIG5ld1xuICAgKiBidWNrZXQgaWYgdGhlIEBkYXRhc3RvcmVUeXBlIGlzIFMzLlxuICAgKlxuICAgKiBUaGUgYXJndW1lbnQga2V5IGlzIGBvdXRwdXRfcGF0aGAuIFRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgY2FuIGJlIHJldHJpZXZlIGluIHRoZSBweXRob24gc2NyaXB0XG4gICAqIGFzIGZvbGxvd3M6XG4gICAqICBnZXRSZXNvbHZlZE9wdGlvbnMoc3lzLmFyZ3YsIFtcIkpPQl9OQU1FXCIsIFwib3V0cHV0X3BhdGhcIiwgPG90aGVyIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQ+IF0pXG4gICAqICBvdXRwdXRfcGF0aCA9IGFyZ3NbXCJvdXRwdXRfcGF0aFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdTM091dHB1dEJ1Y2tldD86IEJ1Y2tldFxuICAvKipcbiAgICogSWYgQGV4aXN0aW5nUzNPdXRwdXRCVWNrZXQgaXMgcHJvdmlkZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWRlZCxcbiAgICogdGhlIGNvbnN0cnVjdCB3aWxsIGNyZWF0ZSBhIG5ldyBidWNrZXQgaWYgdGhlIEBkYXRhc3RvcmVUeXBlIGlzIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0QnVja2V0UHJvcHM/OiBCdWNrZXRQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZEdsdWVKb2JQcm9wcyB7XG4gIC8qKlxuICAgKiBHbHVlIEVUTCBqb2IgcHJvcGVydGllcy5cbiAgICovXG4gIHJlYWRvbmx5IGdsdWVKb2JQcm9wcz86IGdsdWUuQ2ZuSm9iUHJvcHMgfCBhbnlcbiAgLyoqXG4gICAqIEV4aXN0aW5nIGluc3RhbmNlIG9mIHRoZSBTMyBidWNrZXQgb2JqZWN0LCBpZiB0aGlzIGlzIHNldCB0aGVuIHRoZSBzY3JpcHQgbG9jYXRpb24gaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nQ2ZuSm9iPzogZ2x1ZS5DZm5Kb2I7XG4gIC8qKlxuICAgKiBBV1MgR2x1ZSB0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGU6IGdsdWUuQ2ZuVGFibGU7XG4gIC8qKlxuICAgKiBBV1MgR2x1ZSBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IGdsdWUuQ2ZuRGF0YWJhc2U7XG4gIC8qKlxuICAgKiBPdXRwdXQgc3RvcmFnZSBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBvdXRwdXREYXRhU3RvcmU/OiBTaW5rRGF0YVN0b3JlUHJvcHNcbiAgLyoqXG4gICAqIEFzc2V0IGluc3RhbmNlIGZvciB0aGUgRVRMIGNvZGUgdGhhdCBwZXJmb3JtcyBHbHVlIEpvYiB0cmFuc2Zvcm1hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gICByZWFkb25seSBldGxDb2RlQXNzZXQ/OiBzM2Fzc2V0cy5Bc3NldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2x1ZUpvYihzY29wZTogQ29uc3RydWN0LCBwcm9wczogQnVpbGRHbHVlSm9iUHJvcHMpOiBbZ2x1ZS5DZm5Kb2IsIElSb2xlLCBbQnVja2V0LCAoQnVja2V0IHwgdW5kZWZpbmVkKT9dP10ge1xuICBpZiAoIXByb3BzLmV4aXN0aW5nQ2ZuSm9iKSB7XG4gICAgaWYgKHByb3BzLmdsdWVKb2JQcm9wcykge1xuICAgICAgaWYgKHByb3BzLmdsdWVKb2JQcm9wcy5nbHVlVmVyc2lvbiA9PT0gJzIuMCcgJiYgcHJvcHMuZ2x1ZUpvYlByb3BzLm1heENhcGFjaXR5KSB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IFwiTWF4Q2FwYWNpdHlcIiB3aXRoIEdsdWVWZXJzaW9uIDIuMCBvciBoaWdoZXIuIFVzZSBcIk51bWJlck9mV29ya2Vyc1wiIGFuZCBcIldvcmtlclR5cGVcIi4gJyArXG4gICAgICAgICdSZWZlciB0aGUgQVBJIGRvY3VtZW50YXRpb24gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L3dlYmFwaS9BUElfSm9iLmh0bWwgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZ2x1ZUpvYlByb3BzLm1heENhcGFjaXR5ICYmIChwcm9wcy5nbHVlSm9iUHJvcHMubnVtYmVyT2ZXb3JrZXJzIHx8IHByb3BzLmdsdWVKb2JQcm9wcy53b3JrZXJUeXBlKSkge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHNldCBNYXhDYXBhY2l0eSBhbmQgXCJXb3JrZXJUeXBlXCIgb3IgIFwiTnVtYmVyT2ZXb3JrZXJzXCIuIElmIHVzaW5nIGdsdWVWZXJzaW9uIDIuMCBvciBiZXlvbmQsICcgK1xuICAgICAgICAnaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFwiV29ya2VyVHlwZVwiIG9yICBcIk51bWJlck9mV29ya2Vyc1wiJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXBsb3lHbHVlSm9iKHNjb3BlLCBwcm9wcy5nbHVlSm9iUHJvcHMsIHByb3BzLmRhdGFiYXNlISwgcHJvcHMudGFibGUhLCBwcm9wcy5vdXRwdXREYXRhU3RvcmUhLCBwcm9wcy5ldGxDb2RlQXNzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignRWl0aGVyIGdsdWVKb2JQcm9wcyBvciBleGlzdGluZ0NmbkpvYiBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3Byb3BzLmV4aXN0aW5nQ2ZuSm9iLCBSb2xlLmZyb21Sb2xlQXJuKHNjb3BlLCAnRXhpc3RpbmdSb2xlJywgcHJvcHMuZXhpc3RpbmdDZm5Kb2Iucm9sZSldO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3lHbHVlSm9iKHNjb3BlOiBDb25zdHJ1Y3QsIGdsdWVKb2JQcm9wczogZ2x1ZS5DZm5Kb2JQcm9wcywgZGF0YWJhc2U6IGdsdWUuQ2ZuRGF0YWJhc2UsIHRhYmxlOiBnbHVlLkNmblRhYmxlLFxuICBvdXRwdXREYXRhU3RvcmU6IFNpbmtEYXRhU3RvcmVQcm9wcywgZXRsQ29kZUFzc2V0PzogczNhc3NldHMuQXNzZXQpOiBbZ2x1ZS5DZm5Kb2IsIElSb2xlLCBbQnVja2V0LCAoQnVja2V0IHwgdW5kZWZpbmVkKT9dXSB7XG5cbiAgbGV0IF9nbHVlU2VjdXJpdHlDb25maWdOYW1lOiBzdHJpbmc7XG5cbiAgaWYgKGdsdWVKb2JQcm9wcy5zZWN1cml0eUNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIF9nbHVlU2VjdXJpdHlDb25maWdOYW1lID0gJ0VUTEpvYlNlY3VyaXR5Q29uZmlnJztcbiAgICBjb25zdCBfZ2x1ZUtNU0tleSA9IGBhcm46JHtBd3MuUEFSVElUSU9OfTprbXM6JHtBd3MuUkVHSU9OfToke0F3cy5BQ0NPVU5UX0lEfTphbGlhcy9hd3MvZ2x1ZWA7XG5cbiAgICBuZXcgZ2x1ZS5DZm5TZWN1cml0eUNvbmZpZ3VyYXRpb24oc2NvcGUsICdHbHVlU2VjdXJpdHlDb25maWcnLCB7XG4gICAgICBuYW1lOiBfZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZSxcbiAgICAgIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgIGpvYkJvb2ttYXJrc0VuY3J5cHRpb246IHtcbiAgICAgICAgICBqb2JCb29rbWFya3NFbmNyeXB0aW9uTW9kZTogJ0NTRS1LTVMnLFxuICAgICAgICAgIGttc0tleUFybjogX2dsdWVLTVNLZXlcbiAgICAgICAgfSxcbiAgICAgICAgczNFbmNyeXB0aW9uczogW3tcbiAgICAgICAgICBzM0VuY3J5cHRpb25Nb2RlOiAnU1NFLVMzJ1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIF9nbHVlU2VjdXJpdHlDb25maWdOYW1lID0gZ2x1ZUpvYlByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbjtcbiAgfVxuXG4gIGNvbnN0IF9nbHVlSm9iUG9saWN5ID0gbmV3IFBvbGljeShzY29wZSwgJ0xvZ1BvbGljeScsIHtcbiAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsgJ2xvZ3M6Q3JlYXRlTG9nR3JvdXAnLCAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnIF0sXG4gICAgICAgIHJlc291cmNlczogWyBgYXJuOiR7QXdzLlBBUlRJVElPTn06bG9nczoke0F3cy5SRUdJT059OiR7QXdzLkFDQ09VTlRfSUR9OmxvZy1ncm91cDovYXdzLWdsdWUvKmAgXVxuICAgICAgfSlcbiAgICBdXG4gIH0pO1xuXG4gIGxldCBfam9iUm9sZTogSVJvbGU7XG4gIGlmIChnbHVlSm9iUHJvcHMucm9sZSkge1xuICAgIF9qb2JSb2xlID0gUm9sZS5mcm9tUm9sZUFybihzY29wZSwgJ0pvYlJvbGUnLCBnbHVlSm9iUHJvcHMucm9sZSk7XG4gIH0gZWxzZSB7XG4gICAgX2pvYlJvbGUgPSBkZWZhdWx0cy5jcmVhdGVHbHVlSm9iUm9sZShzY29wZSk7XG4gIH1cblxuICBfZ2x1ZUpvYlBvbGljeS5hdHRhY2hUb1JvbGUoX2pvYlJvbGUpO1xuXG4gIGxldCBfb3V0cHV0TG9jYXRpb246IFsgQnVja2V0LCBCdWNrZXQ/IF07XG4gIGlmIChvdXRwdXREYXRhU3RvcmUgIT09IHVuZGVmaW5lZCAmJiBvdXRwdXREYXRhU3RvcmUuZGF0YXN0b3JlVHlwZSA9PT0gU2lua1N0b3JlVHlwZS5TMykge1xuICAgIGlmIChvdXRwdXREYXRhU3RvcmUuZXhpc3RpbmdTM091dHB1dEJ1Y2tldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBfb3V0cHV0TG9jYXRpb24gPSBbIG91dHB1dERhdGFTdG9yZS5leGlzdGluZ1MzT3V0cHV0QnVja2V0LCB1bmRlZmluZWQgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX291dHB1dExvY2F0aW9uID0gZGVmYXVsdHMuYnVpbGRTM0J1Y2tldChzY29wZSwgeyBidWNrZXRQcm9wczogb3V0cHV0RGF0YVN0b3JlLm91dHB1dEJ1Y2tldFByb3BzIH0gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX291dHB1dExvY2F0aW9uID0gZGVmYXVsdHMuYnVpbGRTM0J1Y2tldChzY29wZSwge30pO1xuICB9XG5cbiAgX291dHB1dExvY2F0aW9uWzBdLmdyYW50UmVhZFdyaXRlKF9qb2JSb2xlKTtcblxuICBjb25zdCBfam9iQXJndW1lbnRzTGlzdCA9IHtcbiAgICBcIi0tZW5hYmxlLW1ldHJpY3NcIiA6IHRydWUsXG4gICAgXCItLWVuYWJsZS1jb250aW51b3VzLWNsb3Vkd2F0Y2gtbG9nXCIgOiB0cnVlLFxuICAgIFwiLS1kYXRhYmFzZV9uYW1lXCI6IGRhdGFiYXNlLnJlZixcbiAgICBcIi0tdGFibGVfbmFtZVwiOiB0YWJsZS5yZWYsXG4gICAgLi4uKChvdXRwdXREYXRhU3RvcmUgPT09IHVuZGVmaW5lZCB8fCAob3V0cHV0RGF0YVN0b3JlICYmIG91dHB1dERhdGFTdG9yZS5kYXRhc3RvcmVUeXBlID09PSBTaW5rU3RvcmVUeXBlLlMzKSkgJiZcbiAgICAgIHsgJy0tb3V0cHV0X3BhdGgnIDogYHMzYTovLyR7X291dHB1dExvY2F0aW9uWzBdLmJ1Y2tldE5hbWV9L291dHB1dC9gIH0pLFxuICAgIC4uLmdsdWVKb2JQcm9wcy5kZWZhdWx0QXJndW1lbnRzXG4gIH07XG5cbiAgY29uc3QgX25ld0dsdWVKb2JQcm9wczogZ2x1ZS5DZm5Kb2JQcm9wcyA9IG92ZXJyaWRlUHJvcHMoZGVmYXVsdHMuRGVmYXVsdEdsdWVKb2JQcm9wcyhfam9iUm9sZSEsIGdsdWVKb2JQcm9wcyxcbiAgICBfZ2x1ZVNlY3VyaXR5Q29uZmlnTmFtZSwgX2pvYkFyZ3VtZW50c0xpc3QsIGV0bENvZGVBc3NldCksIGdsdWVKb2JQcm9wcyk7XG4gIGlmIChldGxDb2RlQXNzZXQpIHtcbiAgICBldGxDb2RlQXNzZXQuZ3JhbnRSZWFkKF9qb2JSb2xlKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBjcmVhdGUgQ0RLIEJ1Y2tldCBpbnN0YW5jZSBmcm9tIFMzIHVybCBhbmQgZ3JhbnQgcmVhZCBhY2Nlc3MgdG8gR2x1ZSBKb2IncyBzZXJ2aWNlIHByaW5jaXBhbFxuICAgIGlmIChpc0pvYkNvbW1hbmRQcm9wZXJ0eShfbmV3R2x1ZUpvYlByb3BzLmNvbW1hbmQpKSB7XG4gICAgICBpZiAoIV9uZXdHbHVlSm9iUHJvcHMuY29tbWFuZC5zY3JpcHRMb2NhdGlvbikge1xuICAgICAgICB0aHJvdyBFcnJvcignU2NyaXB0IGxvY2F0aW9uIGhhcyB0byBiZSBwcm92aWRlZCBhcyBhbiBzMyBVcmwgbG9jYXRpb24uIFNjcmlwdCBsb2NhdGlvbiBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IF9zY3JpcHRMb2NhdGlvbiA9IF9uZXdHbHVlSm9iUHJvcHMuY29tbWFuZC5zY3JpcHRMb2NhdGlvbjtcblxuICAgICAgY29uc3QgX3NjcmlwdEJ1Y2tldExvY2F0aW9uOiBJQnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXRBcm4oc2NvcGUsICdTY3JpcHRMb2NhaXRvbicsIGdldFMzQXJuZnJvbVMzVXJsKF9zY3JpcHRMb2NhdGlvbiEpKTtcbiAgICAgIF9zY3JpcHRCdWNrZXRMb2NhdGlvbi5ncmFudFJlYWQoX2pvYlJvbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IF9nbHVlSm9iOiBnbHVlLkNmbkpvYiA9IG5ldyBnbHVlLkNmbkpvYihzY29wZSwgJ0tpbmVzaXNFVExKb2InLCBfbmV3R2x1ZUpvYlByb3BzKTtcbiAgcmV0dXJuIFtfZ2x1ZUpvYiwgX2pvYlJvbGUsIF9vdXRwdXRMb2NhdGlvbl07XG59XG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gY3JlYXRlIHRoZSBSb2xlIHJlcXVpcmVkIGZvciB0aGUgR2x1ZSBKb2IuIElmIGEgcm9sZSBpcyBhbHJlYWR5IGNyZWF0ZWQgdGhlbiB0aGlzXG4gKiBtZXRob2QgaXMgbm90IHJlcXVpcmVkIHRvIGJlIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBUaGUgQVdTIENvbnN0cnVjdCB1bmRlciB3aGljaCB0aGUgcm9sZSBpcyB0byBiZSBjcmVhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHbHVlSm9iUm9sZShzY29wZTogQ29uc3RydWN0KTogUm9sZSB7XG4gIHJldHVybiBuZXcgUm9sZShzY29wZSwgJ0pvYlJvbGUnLCB7XG4gICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgZGVzY3JpcHRpb246ICdTZXJ2aWNlIHJvbGUgdGhhdCBHbHVlIGN1c3RvbSBFVEwgam9icyB3aWxsIGFzc3VtZSBmb3IgZXhldWN0aW9uJyxcbiAgfSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhbiBBV1MgR2x1ZSB0YWJsZS4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBleGlzdGluZyBHbHVlIHRhYmxlIGlzIG5vdCBwcm92aWRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2x1ZVRhYmxlKHNjb3BlOiBDb25zdHJ1Y3QsIGRhdGFiYXNlOiBnbHVlLkNmbkRhdGFiYXNlLCB0YWJsZVByb3BzPzogZ2x1ZS5DZm5UYWJsZVByb3BzLFxuICBmaWVsZFNjaGVtYT86IGdsdWUuQ2ZuVGFibGUuQ29sdW1uUHJvcGVydHkgW10sIHNvdXJjZVR5cGU/OiBzdHJpbmcsIHBhcmFtZXRlcnM/OiBhbnkpOiBnbHVlLkNmblRhYmxlIHtcbiAgcmV0dXJuIGRlZmF1bHRzLkRlZmF1bHRHbHVlVGFibGUoc2NvcGUsIHRhYmxlUHJvcHMgIT09IHVuZGVmaW5lZCA/IHRhYmxlUHJvcHMgOlxuICAgIGRlZmF1bHRzLkRlZmF1bHRHbHVlVGFibGVQcm9wcyhkYXRhYmFzZSwgZmllbGRTY2hlbWEhLCBzb3VyY2VUeXBlLCBwYXJhbWV0ZXJzKSk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhbiBBV1MgR2x1ZSBkYXRhYmFzZS4gVGhlIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aXRoIGFuIGV4aXN0aW5nIEdsdWUgZGF0YWJhc2UgdHlwZSBpcyBub3QgcHJvdmlkZWQuXG4gKiBUaGUgbWV0aG9kIHVzZXMgdGhlIHVzZXIgcHJvdmlkZWQgcHJvcHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bCBwcm9wcyBmb3IgdGhlIEdsdWUgZGF0YWJhc2VcbiAqXG4gKiBAcGFyYW0gc2NvcGVcbiAqIEBwYXJhbSBkYXRhYmFzZVByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHbHVlRGF0YWJhc2Uoc2NvcGU6IENvbnN0cnVjdCwgIGRhdGFiYXNlUHJvcHM/OiBnbHVlLkNmbkRhdGFiYXNlUHJvcHMpOiBnbHVlLkNmbkRhdGFiYXNlIHtcbiAgY29uc3QgX21lcmdlZERCUHJvcHM6IGdsdWUuQ2ZuRGF0YWJhc2VQcm9wcyA9IChkYXRhYmFzZVByb3BzICE9PSB1bmRlZmluZWQpID8gb3ZlcnJpZGVQcm9wcyhkZWZhdWx0cy5EZWZhdWx0R2x1ZURhdGFiYXNlUHJvcHMoKSwgZGF0YWJhc2VQcm9wcykgOlxuICAgIGRlZmF1bHRzLkRlZmF1bHRHbHVlRGF0YWJhc2VQcm9wcygpO1xuICByZXR1cm4gZGVmYXVsdHMuRGVmYXVsdEdsdWVEYXRhYmFzZShzY29wZSwgX21lcmdlZERCUHJvcHMpO1xufVxuXG4vKipcbiAqIEEgdXRpbGl0eSBtZXRob2QgdG8gZ2VuZXJhdGUgdGhlIFMzIEFybiBmcm9tIGFuIFMzIFVybC5cbiAqXG4gKiBAcGFyYW0gczNVcmxcbiAqL1xuZnVuY3Rpb24gZ2V0UzNBcm5mcm9tUzNVcmwoczNVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzM1VybCAmJiBzM1VybC5zdGFydHNXaXRoKCdzMzovLycpKSB7XG4gICAgY29uc3Qgc3BsaXRTdHJpbmc6IHN0cmluZyA9IHMzVXJsLnNsaWNlKCdzMzovLycubGVuZ3RoKTtcbiAgICByZXR1cm4gYGFybjoke0F3cy5QQVJUSVRJT059OnMzOjo6JHtzcGxpdFN0cmluZ31gO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBSZWNlaXZlZCBTM1VSTCBhcyAke3MzVXJsfS4gVGhlIFMzIHVybCBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBzMzovLy4gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBTMyB1cmxgKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgdXRpbGl0eSBtZXRob2QgdG8gdHlwZSBjaGVjayBDZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5IHR5cGUuIEZvciB0aGUgY29uc3RydWN0IHRvIHdvcmsgZm9yIHN0cmVhbWluZyBFVEwgZnJvbSBLaW5lc2lzIERhdGFcbiAqIFN0cmVhbXMsIGFsbCB0aHJlZSBhdHRyaWJ1dGVzIG9mIHRoZSBKb2JDb21tYW5kUHJvcGVydHkgYXJlIHJlcXVpcmVkLCBldmVuIHRob3VnaCB0aGV5IG1heSBiZSBvcHRpb25hbCBmb3Igb3RoZXIgdXNlIGNhc2VzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIGlzSm9iQ29tbWFuZFByb3BlcnR5KGNvbW1hbmQ6IGdsdWUuQ2ZuSm9iLkpvYkNvbW1hbmRQcm9wZXJ0eSB8IElSZXNvbHZhYmxlKTogY29tbWFuZCBpcyBnbHVlLkNmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkge1xuICBpZiAoKGNvbW1hbmQgYXMgZ2x1ZS5DZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5KS5uYW1lICYmXG4gICAgKGNvbW1hbmQgYXMgZ2x1ZS5DZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5KS5weXRob25WZXJzaW9uICYmXG4gICAgKGNvbW1hbmQgYXMgZ2x1ZS5DZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5KS5zY3JpcHRMb2NhdGlvbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRzLnByaW50V2FybmluZygnY29tbWFuZCBub3Qgb2YgdHlwZSBKb2JDb21tYW5kUHJvcGVydHkgdHlwZScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-solutions-constructs/core",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "Core CDK Construct for patterns library",
5
5
  "main": "index.js",
6
6
  "types": "index.ts",
@@ -59,10 +59,10 @@
59
59
  "devDependencies": {
60
60
  "@types/deep-diff": "^1.0.0",
61
61
  "@types/npmlog": "^4.1.2",
62
- "@aws-cdk/assert": "2.10.0",
62
+ "@aws-cdk/assert": "2.15.0",
63
63
  "@types/jest": "^27.4.0",
64
64
  "@types/node": "^10.3.0",
65
- "aws-cdk-lib": "2.10.0",
65
+ "aws-cdk-lib": "2.15.0",
66
66
  "constructs": "^10.0.0"
67
67
  },
68
68
  "jest": {
@@ -85,7 +85,7 @@
85
85
  "deep-diff"
86
86
  ],
87
87
  "peerDependencies": {
88
- "aws-cdk-lib": "^2.10.0",
88
+ "aws-cdk-lib": "^2.15.0",
89
89
  "constructs": "^10.0.0"
90
90
  }
91
91
  }
@@ -384,7 +384,9 @@ test('Test deployment with role creation', () => {
384
384
  }
385
385
  catch (error) {
386
386
  expect(error).toBeInstanceOf(Error);
387
- expect(error.message).toEqual('Script location has to be provided as an s3 Url location. Script location cannot be empty');
387
+ expect(error.message).toEqual('Either one of CfnJob.JobCommandProperty.scriptLocation or KinesisstreamsToGluejobProps.etlCodeAsset ' +
388
+ 'has to be provided. If the ETL Job code file exists in a local filesystem, please set KinesisstreamsToGluejobProps.etlCodeAsset. ' +
389
+ 'If the ETL Job is available in an S3 bucket, set the CfnJob.JobCommandProperty.scriptLocation property');
388
390
  }
389
391
  });
390
392
  // --------------------------------------------------------------
@@ -551,4 +553,4 @@ test('Cannot use maxCapacity and WorkerType, so error out', () => {
551
553
  expect(error).toBeInstanceOf(Error);
552
554
  }
553
555
  });
554
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItaGVscGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnbHVlLWpvYi1oZWxwZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgsVUFBVTtBQUNWLDRDQUErQztBQUMvQyxnQ0FBOEI7QUFDOUIsbURBQTJEO0FBQzNELGlEQUE2RDtBQUM3RCwrQ0FBOEQ7QUFDOUQsNkNBQW1EO0FBQ25ELCtCQUErQjtBQUUvQixpRUFBaUU7QUFDakUscUNBQXFDO0FBQ3JDLGlFQUFpRTtBQUNqRSxJQUFJLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFOztJQUM5QyxRQUFRO0lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7SUFFMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1FBQ25ELFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLG9CQUFvQixDQUFDO0tBQ3RELENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFnQixRQUFRLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFO1FBQ3RFLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxTQUFTO1lBQ2YsYUFBYSxFQUFFLEdBQUc7WUFDbEIsY0FBYyxFQUFFLG9DQUFvQztTQUNyRDtRQUNELElBQUksRUFBRSxRQUFRLENBQUMsT0FBTztLQUN2QixFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVyQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7SUFFMUYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7UUFDNUMsWUFBWSxFQUFFLFdBQVc7UUFDekIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FB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QUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLGVBQWUsRUFBRTtnQkFDZixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2FBQ3pDO1lBQ0QsUUFBUSxFQUFFLFNBQVM7WUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzNGLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxLQUFLO29CQUNYLE9BQU8sRUFBRSxFQUFFO2lCQUNaLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLEVBQUU7Z0JBQ1osT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxZQUFZO29CQUNsQixhQUFhLEVBQUUsR0FBRztpQkFDbkI7Z0JBQ0QsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLFdBQVcsRUFBRSxHQUFHO2dCQUNoQixlQUFlLEVBQUUsQ0FBQztnQkFDbEIsVUFBVSxFQUFFLE1BQU07YUFDbkI7U0FDRixDQUFDLENBQUM7S0FDSjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNyQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IDIwMjIgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBJbXBvcnRzXG5pbXBvcnQgeyBSZXNvdXJjZVBhcnQgfSBmcm9tICdAYXdzLWNkay9hc3NlcnQnO1xuaW1wb3J0ICdAYXdzLWNkay9hc3NlcnQvamVzdCc7XG5pbXBvcnQgeyBDZm5Kb2IsIENmbkpvYlByb3BzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0LCBCdWNrZXRFbmNyeXB0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuLic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUZXN0IGRlcGxveW1lbnQgd2l0aCByb2xlIGNyZWF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggcm9sZSBjcmVhdGlvbicsICgpID0+IHtcbiAgLy8gU3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICBjb25zdCBfam9iUm9sZSA9IG5ldyBSb2xlKHN0YWNrLCAnQ3VzdG9tRVRMSm9iUm9sZScsIHtcbiAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdnbHVlLmFtYXpvbmF3cy5jb20nKVxuICB9KTtcblxuICBjb25zdCBjZm5Kb2JQcm9wczogQ2ZuSm9iUHJvcHMgPSBkZWZhdWx0cy5EZWZhdWx0R2x1ZUpvYlByb3BzKF9qb2JSb2xlLCB7XG4gICAgY29tbWFuZDoge1xuICAgICAgbmFtZTogJ2dsdWVldGwnLFxuICAgICAgcHl0aG9uVmVyc2lvbjogJzMnLFxuICAgICAgc2NyaXB0TG9jYXRpb246ICdzMzovL2Zha2VzY3JpcHRsb2NhdGlvbi9mYWtlYnVja2V0JyxcbiAgICB9LFxuICAgIHJvbGU6IF9qb2JSb2xlLnJvbGVBcm5cbiAgfSwgJ3Rlc3RFVExKb2InLCB7fSk7XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZURhdGFiYXNlUHJvcHMoKSk7XG5cbiAgY29uc3QgX2dsdWVKb2IgPSBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICBnbHVlSm9iUHJvcHM6IGNmbkpvYlByb3BzLFxuICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCB1bmRlZmluZWQsIFt7XG4gICAgICBuYW1lOiBcImlkXCIsXG4gICAgICB0eXBlOiBcImludFwiLFxuICAgICAgY29tbWVudDogXCJcIlxuICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgfSk7XG5cbiAgZXhwZWN0KF9nbHVlSm9iWzJdPy5bMF0pLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChfZ2x1ZUpvYlsyXT8uWzBdKS50b0JlSW5zdGFuY2VPZihCdWNrZXQpO1xuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpHbHVlOjpKb2InLCB7XG4gICAgVHlwZTogXCJBV1M6OkdsdWU6OkpvYlwiLFxuICAgIFByb3BlcnRpZXM6IHtcbiAgICAgIENvbW1hbmQ6IHtcbiAgICAgICAgTmFtZTogXCJnbHVlZXRsXCIsXG4gICAgICAgIFB5dGhvblZlcnNpb246IFwiM1wiLFxuICAgICAgICBTY3JpcHRMb2NhdGlvbjogXCJzMzovL2Zha2VzY3JpcHRsb2NhdGlvbi9mYWtlYnVja2V0XCJcbiAgICAgIH0sXG4gICAgICBSb2xlOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJDdXN0b21FVExKb2JSb2xlOTBBODNBNjZcIixcbiAgICAgICAgICBcIkFyblwiXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBHbHVlVmVyc2lvbjogXCIyLjBcIixcbiAgICAgIE51bWJlck9mV29ya2VyczogMixcbiAgICAgIFNlY3VyaXR5Q29uZmlndXJhdGlvbjogXCJ0ZXN0RVRMSm9iXCIsXG4gICAgICBXb3JrZXJUeXBlOiBcIkcuMVhcIlxuICAgIH1cbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhc3MgYW4gZXhpc3RpbmcgR2x1ZSBKb2Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdDcmVhdGUgYSBHbHVlIEpvYiBvdXRzaWRlIHRoZSBjb25zdHJ1Y3QnLCAoKSA9PiB7XG4gIC8vIFN0YWNrXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IF9leGlzdGluZ0NmbkpvYiA9IG5ldyBDZm5Kb2Ioc3RhY2ssICdFeGlzdGluZ0pvYicsIHtcbiAgICBjb21tYW5kOiB7XG4gICAgICBuYW1lOiAncHl0aG9uc2hlbGwnLFxuICAgICAgcHl0aG9uVmVyc2lvbjogJzInLFxuICAgICAgc2NyaXB0TG9jYXRpb246ICdzMzovL2V4aXN0aW5nZmFrZWxvY2F0aW9uL2V4aXN0aW5nU2NyaXB0J1xuICAgIH0sXG4gICAgcm9sZTogbmV3IFJvbGUoc3RhY2ssICdFeGlzdGluZ0pvYlJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdnbHVlLmFtYXpvbi5jb20nKSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXhpc3Rpbmcgcm9sZSdcbiAgICB9KS5yb2xlQXJuLFxuICAgIGdsdWVWZXJzaW9uOiAnMScsXG4gICAgYWxsb2NhdGVkQ2FwYWNpdHk6IDIsXG4gICAgbWF4Q2FwYWNpdHk6IDQsXG4gICAgbnVtYmVyT2ZXb3JrZXJzOiAyLFxuICAgIHdvcmtlclR5cGU6ICdTdGFuZGFyZCdcbiAgfSk7XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZURhdGFiYXNlUHJvcHMoKSk7XG5cbiAgY29uc3QgX2dsdWVKb2IgPSBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICBleGlzdGluZ0NmbkpvYjogX2V4aXN0aW5nQ2ZuSm9iLFxuICAgIG91dHB1dERhdGFTdG9yZToge1xuICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgIH0sXG4gICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBjb21tZW50OiBcIlwiXG4gICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KVxuICB9KTtcblxuICBleHBlY3QoX2dsdWVKb2JbMl0pLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpHbHVlOjpKb2InLCB7XG4gICAgVHlwZTogXCJBV1M6OkdsdWU6OkpvYlwiLFxuICAgIFByb3BlcnRpZXM6IHtcbiAgICAgIEFsbG9jYXRlZENhcGFjaXR5OiAyLFxuICAgICAgQ29tbWFuZDoge1xuICAgICAgICBOYW1lOiBcInB5dGhvbnNoZWxsXCIsXG4gICAgICAgIFB5dGhvblZlcnNpb246IFwiMlwiLFxuICAgICAgICBTY3JpcHRMb2NhdGlvbjogXCJzMzovL2V4aXN0aW5nZmFrZWxvY2F0aW9uL2V4aXN0aW5nU2NyaXB0XCIsXG4gICAgICB9LFxuICAgICAgR2x1ZVZlcnNpb246IFwiMVwiLFxuICAgICAgTWF4Q2FwYWNpdHk6IDQsXG4gICAgICBOdW1iZXJPZldvcmtlcnM6IDIsXG4gICAgICBSb2xlOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJFeGlzdGluZ0pvYlJvbGU4Rjc1MDk3NlwiLFxuICAgICAgICAgIFwiQXJuXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgV29ya2VyVHlwZTogXCJTdGFuZGFyZFwiLFxuICAgIH1cbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByb3ZpZGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG90aGVyIHRoYW4gZGVmYXVsdCBvbmVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnVGVzdCBjdXN0b20gZGVwbG95bWVudCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAvLyBTdGFja1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBfY29tbWFuZE5hbWUgPSAnZ2x1ZWV0bCc7XG5cbiAgY29uc3QgY2ZuSm9iUHJvcHM6IENmbkpvYlByb3BzID0ge1xuICAgIGNvbW1hbmQ6IHtcbiAgICAgIG5hbWU6IF9jb21tYW5kTmFtZSxcbiAgICAgIHB5dGhvblZlcnNpb246ICczJyxcbiAgICAgIHNjcmlwdExvY2F0aW9uOiAnczM6Ly9leGlzdGluZ2Zha2Vsb2NhdGlvbi9leGlzdGluZ1NjcmlwdCdcbiAgICB9LFxuICAgIHJvbGU6IG5ldyBSb2xlKHN0YWNrLCAnRXhpc3RpbmdKb2JSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b24uY29tJyksXG4gICAgICBkZXNjcmlwdGlvbjogJ0V4aXN0aW5nIHJvbGUnXG4gICAgfSkucm9sZUFybixcbiAgICBnbHVlVmVyc2lvbjogJzEnLFxuICAgIG51bWJlck9mV29ya2VyczogMixcbiAgICB3b3JrZXJUeXBlOiAnU3RhbmRhcmQnXG4gIH07XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrKTtcblxuICBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICBnbHVlSm9iUHJvcHM6IGNmbkpvYlByb3BzLFxuICAgIG91dHB1dERhdGFTdG9yZToge1xuICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgIH0sXG4gICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBjb21tZW50OiBcIlwiXG4gICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KVxuICB9KTtcblxuICAvLyBjaGVjayBpZiBHbHVlIEpvYiBSZXNvdXJjZSB3YXMgY3JlYXRlZCBjb3JyZWN0bHlcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6R2x1ZTo6Sm9iJywge1xuICAgIFByb3BlcnRpZXM6IHtcbiAgICAgIENvbW1hbmQ6IHtcbiAgICAgICAgTmFtZTogXCJnbHVlZXRsXCIsXG4gICAgICAgIFB5dGhvblZlcnNpb246IFwiM1wiLFxuICAgICAgICBTY3JpcHRMb2NhdGlvbjogXCJzMzovL2V4aXN0aW5nZmFrZWxvY2F0aW9uL2V4aXN0aW5nU2NyaXB0XCIsXG4gICAgICB9LFxuICAgICAgR2x1ZVZlcnNpb246IFwiMVwiLFxuICAgICAgTnVtYmVyT2ZXb3JrZXJzOiAyLFxuICAgICAgUm9sZToge1xuICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgIFwiRXhpc3RpbmdKb2JSb2xlOEY3NTA5NzZcIixcbiAgICAgICAgICBcIkFyblwiLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIFNlY3VyaXR5Q29uZmlndXJhdGlvbjogXCJFVExKb2JTZWN1cml0eUNvbmZpZ1wiLFxuICAgICAgV29ya2VyVHlwZTogXCJTdGFuZGFyZFwiLFxuICAgIH0sXG4gICAgVHlwZTogXCJBV1M6OkdsdWU6OkpvYlwiXG4gIH0sIFJlc291cmNlUGFydC5Db21wbGV0ZURlZmluaXRpb24pO1xuXG4gIC8vIGNoZWNrIGlmIHRoZSByb2xlIGlzIGNyZWF0ZWRcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6SUFNOjpSb2xlJywgICAgICAgICB7XG4gICAgVHlwZTogXCJBV1M6OklBTTo6Um9sZVwiLFxuICAgIFByb3BlcnRpZXM6IHtcbiAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgICAgUHJpbmNpcGFsOiB7XG4gICAgICAgICAgICAgIFNlcnZpY2U6IFwiZ2x1ZS5hbWF6b24uY29tXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFZlcnNpb246IFwiMjAxMi0xMC0xN1wiXG4gICAgICB9LFxuICAgICAgRGVzY3JpcHRpb246IFwiRXhpc3Rpbmcgcm9sZVwiXG4gICAgfVxuICB9LCBSZXNvdXJjZVBhcnQuQ29tcGxldGVEZWZpbml0aW9uKTtcblxuICAvLyBjaGVjayBpZiB0aGUgc2VjdXJpdHkgY29uZmlnIGlzIGNyZWF0ZWRcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6R2x1ZTo6U2VjdXJpdHlDb25maWd1cmF0aW9uJywge1xuICAgIFByb3BlcnRpZXM6IHtcbiAgICAgIEVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgIEpvYkJvb2ttYXJrc0VuY3J5cHRpb246IHtcbiAgICAgICAgICBKb2JCb29rbWFya3NFbmNyeXB0aW9uTW9kZTogXCJDU0UtS01TXCIsXG4gICAgICAgICAgS21zS2V5QXJuOiB7XG4gICAgICAgICAgICBcIkZuOjpKb2luXCI6IFtcbiAgICAgICAgICAgICAgXCJcIiwgW1xuICAgICAgICAgICAgICAgIFwiYXJuOlwiLCB7XG4gICAgICAgICAgICAgICAgICBSZWY6IFwiQVdTOjpQYXJ0aXRpb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiOmttczpcIiwge1xuICAgICAgICAgICAgICAgICAgUmVmOiBcIkFXUzo6UmVnaW9uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjpcIiwge1xuICAgICAgICAgICAgICAgICAgUmVmOiBcIkFXUzo6QWNjb3VudElkXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjphbGlhcy9hd3MvZ2x1ZVwiLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBTM0VuY3J5cHRpb25zOiBbe1xuICAgICAgICAgIFMzRW5jcnlwdGlvbk1vZGU6IFwiU1NFLVMzXCIsXG4gICAgICAgIH1dLFxuICAgICAgfSxcbiAgICAgIE5hbWU6IFwiRVRMSm9iU2VjdXJpdHlDb25maWdcIixcbiAgICB9LFxuICAgIFR5cGU6IFwiQVdTOjpHbHVlOjpTZWN1cml0eUNvbmZpZ3VyYXRpb25cIixcbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERvIG5vdCBzdXBwbHkgcGFyYW1ldGVycyBhbmQgZXJyb3Igb3V0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnRG8gbm8gc3VwcGx5IGdsdWVKb2JQcm9wcyBvciBleGlzdGluZ0NmbkpvYiBhbmQgZXJyb3Igb3V0JywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICB0cnkge1xuICAgIGNvbnN0IF9kYXRhYmFzZSA9IGRlZmF1bHRzLmNyZWF0ZUdsdWVEYXRhYmFzZShzdGFjayk7XG4gICAgZGVmYXVsdHMuYnVpbGRHbHVlSm9iKHN0YWNrLCB7XG4gICAgICBvdXRwdXREYXRhU3RvcmU6IHtcbiAgICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgICAgfSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIGRlZmF1bHRzLkRlZmF1bHRHbHVlVGFibGVQcm9wcyhfZGF0YWJhc2UsIFt7XG4gICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgICAgY29tbWVudDogXCJcIlxuICAgICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KSlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBbGxvdyB0aGUgY29uc3RydWN0IHRvIGNyZWF0ZSB0aGUgam9iIHJvbGUgcmVxdWlyZWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdUZXN0IGRlcGxveW1lbnQgd2l0aCByb2xlIGNyZWF0aW9uJywgKCkgPT4ge1xuICAvLyBTdGFja1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBfam9iSUQgPSAnZ2x1ZWV0bCc7XG5cbiAgY29uc3QgY2ZuSm9iUHJvcHMgPSB7XG4gICAgY29tbWFuZDoge1xuICAgICAgbmFtZTogX2pvYklELFxuICAgICAgcHl0aG9uVmVyc2lvbjogJzMnLFxuICAgICAgc2NyaXB0TG9jYXRpb246ICdzMzovL2Zha2Vsb2NhdGlvbi9zY3JpcHQnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IF9kYXRhYmFzZSA9IGRlZmF1bHRzLmNyZWF0ZUdsdWVEYXRhYmFzZShzdGFjayk7XG5cbiAgZGVmYXVsdHMuYnVpbGRHbHVlSm9iKHN0YWNrLCB7XG4gICAgZ2x1ZUpvYlByb3BzOiBjZm5Kb2JQcm9wcyxcbiAgICBvdXRwdXREYXRhU3RvcmU6IHtcbiAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICB9LFxuICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCB1bmRlZmluZWQsIFt7XG4gICAgICBuYW1lOiBcImlkXCIsXG4gICAgICB0eXBlOiBcImludFwiLFxuICAgICAgY29tbWVudDogXCJcIlxuICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgfSk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICBUeXBlOiBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgUHJvcGVydGllczoge1xuICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XG4gICAgICAgIFN0YXRlbWVudDogW3tcbiAgICAgICAgICBBY3Rpb246IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgICAgICAgICBFZmZlY3Q6IFwiQWxsb3dcIixcbiAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgIFNlcnZpY2U6IFwiZ2x1ZS5hbWF6b25hd3MuY29tXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1dLFxuICAgICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIlxuICAgICAgfSxcbiAgICAgIERlc2NyaXB0aW9uOiBcIlNlcnZpY2Ugcm9sZSB0aGF0IEdsdWUgY3VzdG9tIEVUTCBqb2JzIHdpbGwgYXNzdW1lIGZvciBleGV1Y3Rpb25cIlxuICAgIH1cbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRlc3QgZGVwbG95bWVudCB3aGVuIG91dHB1dCBsb2NhdGlvbiBpcyBwcm92aWRlZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIHJvbGUgY3JlYXRpb24nLCAoKSA9PiB7XG4gIC8vIFN0YWNrXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IF9qb2JJRCA9ICdnbHVlZXRsJztcblxuICBjb25zdCBjZm5Kb2JQcm9wcyA9IHtcbiAgICBjb21tYW5kOiB7XG4gICAgICBuYW1lOiBfam9iSUQsXG4gICAgICBweXRob25WZXJzaW9uOiAnMycsXG4gICAgICBzY3JpcHRMb2NhdGlvbjogJ3MzOi8vZmFrZWxvY2F0aW9uL3NjcmlwdCdcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrKTtcblxuICBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICBnbHVlSm9iUHJvcHM6IGNmbkpvYlByb3BzLFxuICAgIG91dHB1dERhdGFTdG9yZToge1xuICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TMyxcbiAgICAgIGV4aXN0aW5nUzNPdXRwdXRCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssICdPdXRwdXRCdWNrZXQnLCB7XG4gICAgICAgIHZlcnNpb25lZDogZmFsc2UsXG4gICAgICAgIGJ1Y2tldE5hbWU6ICdvdXRwdXRidWNrZXQnLFxuICAgICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAgfSlcbiAgICB9LFxuICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCB1bmRlZmluZWQsIFt7XG4gICAgICBuYW1lOiBcImlkXCIsXG4gICAgICB0eXBlOiBcImludFwiLFxuICAgICAgY29tbWVudDogXCJcIlxuICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgfSk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgVHlwZTogJ0FXUzo6UzM6OkJ1Y2tldCcsXG4gICAgUHJvcGVydGllczoge1xuICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IFt7XG4gICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgIFNTRUFsZ29yaXRobTogXCJBRVMyNTZcIlxuICAgICAgICAgIH1cbiAgICAgICAgfV1cbiAgICAgIH0sXG4gICAgICBCdWNrZXROYW1lOiBcIm91dHB1dGJ1Y2tldFwiXG4gICAgfSxcbiAgICBVcGRhdGVSZXBsYWNlUG9saWN5OiBcIkRlbGV0ZVwiLFxuICAgIERlbGV0aW9uUG9saWN5OiBcIkRlbGV0ZVwiXG4gIH0sIFJlc291cmNlUGFydC5Db21wbGV0ZURlZmluaXRpb24pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUZXN0IGRlcGxveW1lbnQgd2hlbiBzY3JpcHQgbG9jYXRpb24gbm90IHByb3ZpZGVkIC0gdGhyb3cgZXJyb3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdUZXN0IGRlcGxveW1lbnQgd2l0aCByb2xlIGNyZWF0aW9uJywgKCkgPT4ge1xuICAvLyBTdGFja1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBfam9iSUQgPSAnZ2x1ZWV0bCc7XG5cbiAgY29uc3QgY2ZuSm9iUHJvcHMgPSB7XG4gICAgY29tbWFuZDoge1xuICAgICAgbmFtZTogX2pvYklELFxuICAgICAgcHl0aG9uVmVyc2lvbjogJzMnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IF9kYXRhYmFzZSA9IGRlZmF1bHRzLmNyZWF0ZUdsdWVEYXRhYmFzZShzdGFjayk7XG4gIHRyeSB7XG4gICAgZGVmYXVsdHMuYnVpbGRHbHVlSm9iKHN0YWNrLCB7XG4gICAgICBnbHVlSm9iUHJvcHM6IGNmbkpvYlByb3BzLFxuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzMsXG4gICAgICAgIGV4aXN0aW5nUzNPdXRwdXRCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssICdPdXRwdXRCdWNrZXQnLCB7XG4gICAgICAgICAgdmVyc2lvbmVkOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcImludFwiLFxuICAgICAgICBjb21tZW50OiBcIlwiXG4gICAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXhwZWN0KGVycm9yKS50b0JlSW5zdGFuY2VPZihFcnJvcik7XG4gICAgZXhwZWN0KGVycm9yLm1lc3NhZ2UpLnRvRXF1YWwoJ1NjcmlwdCBsb2NhdGlvbiBoYXMgdG8gYmUgcHJvdmlkZWQgYXMgYW4gczMgVXJsIGxvY2F0aW9uLiBTY3JpcHQgbG9jYXRpb24gY2Fubm90IGJlIGVtcHR5Jyk7XG4gIH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRG9udCBwYXNzIEpvYiBDb21tYW5kIGF0dHJpYnV0ZXMgYW5kIGl0IHNob3VsZCB0aHJvdyBhbiBlcnJvclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ1Rlc3QgZm9yIGluY29ycmVjdCBKb2IgQ29tbWFuZCBwcm9wZXJ0eScsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgZ2x1ZUpvYlByb3BzOiB7fSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcImludFwiLFxuICAgICAgICBjb21tZW50OiBcIlwiXG4gICAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXhwZWN0KGVycm9yKS50b0JlSW5zdGFuY2VPZihFcnJvcik7XG4gIH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIENmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkgdHlwZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ2NoZWNrIGZvciBKb2JDb21tYW5kUHJvcGVydHkgdHlwZScsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBmYWtla2V5OiAnZmFrZXZhbHVlJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgdW5kZWZpbmVkLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdXBwbHkgbWF4Q2FwYWNpdHkgd2l0aCBHbHVlVmVyc2lvbiAyLjAgYW5kIGVycm9yIG91dFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ0dsdWVKb2IgY29uZmlndXJhdGlvbiB3aXRoIGdsdWVWZXJzaW9uIDIuMCBzaG91bGQgbm90IHN1cHBvcnQgbWF4Q2FwYWNpdHkgYW5kIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGdsdWVWZXJzaW9uOiAnMi4wJyxcbiAgICAgICAgbWF4Q2FwYWNpdHk6ICcyJ1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGV4cGVjdChlcnJvcikudG9CZUluc3RhbmNlT2YoRXJyb3IpO1xuICB9XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZhaWwgaWYgc2V0dGluZyBtYXhDYXBhY2l0eSBhbmQgV29ya2VyVHlwZS8gTnVtYmVyT2ZXb3JrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnQ2Fubm90IHVzZSBtYXhDYXBhY2l0eSBhbmQgV29ya2VyVHlwZSwgc28gZXJyb3Igb3V0JywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICB0cnkge1xuICAgIGNvbnN0IF9kYXRhYmFzZSA9IGRlZmF1bHRzLmNyZWF0ZUdsdWVEYXRhYmFzZShzdGFjayk7XG4gICAgZGVmYXVsdHMuYnVpbGRHbHVlSm9iKHN0YWNrLCB7XG4gICAgICBvdXRwdXREYXRhU3RvcmU6IHtcbiAgICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgICAgfSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIGRlZmF1bHRzLkRlZmF1bHRHbHVlVGFibGVQcm9wcyhfZGF0YWJhc2UsIFt7XG4gICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgICAgY29tbWVudDogXCJcIlxuICAgICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KSksXG4gICAgICBnbHVlSm9iUHJvcHM6IHtcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgIG5hbWU6IFwiZ2x1ZWpvYjEuMFwiLFxuICAgICAgICAgIHB5dGhvblZlcnNpb246ICczJ1xuICAgICAgICB9LFxuICAgICAgICBnbHVlVmVyc2lvbjogJzEuMCcsXG4gICAgICAgIG1heENhcGFjaXR5OiAnMicsXG4gICAgICAgIHdvcmtlclR5cGU6ICdTdGFuZGFyZCdcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbnRlc3QoJ0Nhbm5vdCB1c2UgbWF4Q2FwYWNpdHkgYW5kIFdvcmtlclR5cGUsIHNvIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBuYW1lOiBcImdsdWVqb2IxLjBcIixcbiAgICAgICAgICBweXRob25WZXJzaW9uOiAnMydcbiAgICAgICAgfSxcbiAgICAgICAgZ2x1ZVZlcnNpb246ICcxLjAnLFxuICAgICAgICBtYXhDYXBhY2l0eTogJzInLFxuICAgICAgICBudW1iZXJPZldvcmtlcnM6IDJcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbnRlc3QoJ0Nhbm5vdCB1c2UgbWF4Q2FwYWNpdHkgYW5kIFdvcmtlclR5cGUsIHNvIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBuYW1lOiBcImdsdWVqb2IxLjBcIixcbiAgICAgICAgICBweXRob25WZXJzaW9uOiAnMydcbiAgICAgICAgfSxcbiAgICAgICAgZ2x1ZVZlcnNpb246ICcxLjAnLFxuICAgICAgICBtYXhDYXBhY2l0eTogJzInLFxuICAgICAgICBudW1iZXJPZldvcmtlcnM6IDIsXG4gICAgICAgIHdvcmtlclR5cGU6ICdHMS5YJ1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGV4cGVjdChlcnJvcikudG9CZUluc3RhbmNlT2YoRXJyb3IpO1xuICB9XG59KTsiXX0=
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2x1ZS1qb2ItaGVscGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnbHVlLWpvYi1oZWxwZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgsVUFBVTtBQUNWLDRDQUErQztBQUMvQyxnQ0FBOEI7QUFDOUIsbURBQTJEO0FBQzNELGlEQUE2RDtBQUM3RCwrQ0FBOEQ7QUFDOUQsNkNBQW1EO0FBQ25ELCtCQUErQjtBQUUvQixpRUFBaUU7QUFDakUscUNBQXFDO0FBQ3JDLGlFQUFpRTtBQUNqRSxJQUFJLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFOztJQUM5QyxRQUFRO0lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7SUFFMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1FBQ25ELFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLG9CQUFvQixDQUFDO0tBQ3RELENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFnQixRQUFRLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFO1FBQ3RFLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxTQUFTO1lBQ2YsYUFBYSxFQUFFLEdBQUc7WUFDbEIsY0FBYyxFQUFFLG9DQUFvQztTQUNyRDtRQUNELElBQUksRUFBRSxRQUFRLENBQUMsT0FBTztLQUN2QixFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVyQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7SUFFMUYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7UUFDNUMsWUFBWSxFQUFFLFdBQVc7UUFDekIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FB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UUFDRixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsZUFBZSxFQUFFO2dCQUNmLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7YUFDekM7WUFDRCxRQUFRLEVBQUUsU0FBUztZQUNuQixLQUFLLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDM0YsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsT0FBTyxFQUFFLEVBQUU7aUJBQ1osQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1lBQzVDLFlBQVksRUFBRTtnQkFDWixPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLGFBQWEsRUFBRSxHQUFHO2lCQUNuQjtnQkFDRCxXQUFXLEVBQUUsS0FBSztnQkFDbEIsV0FBVyxFQUFFLEdBQUc7Z0JBQ2hCLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixVQUFVLEVBQUUsTUFBTTthQUNuQjtTQUNGLENBQUMsQ0FBQztLQUNKO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JDO0FBQ0gsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgMjAyMiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIEltcG9ydHNcbmltcG9ydCB7IFJlc291cmNlUGFydCB9IGZyb20gJ0Bhd3MtY2RrL2Fzc2VydCc7XG5pbXBvcnQgJ0Bhd3MtY2RrL2Fzc2VydC9qZXN0JztcbmltcG9ydCB7IENmbkpvYiwgQ2ZuSm9iUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgeyBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gJy4uJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRlc3QgZGVwbG95bWVudCB3aXRoIHJvbGUgY3JlYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdUZXN0IGRlcGxveW1lbnQgd2l0aCByb2xlIGNyZWF0aW9uJywgKCkgPT4ge1xuICAvLyBTdGFja1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIGNvbnN0IF9qb2JSb2xlID0gbmV3IFJvbGUoc3RhY2ssICdDdXN0b21FVExKb2JSb2xlJywge1xuICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2dsdWUuYW1hem9uYXdzLmNvbScpXG4gIH0pO1xuXG4gIGNvbnN0IGNmbkpvYlByb3BzOiBDZm5Kb2JQcm9wcyA9IGRlZmF1bHRzLkRlZmF1bHRHbHVlSm9iUHJvcHMoX2pvYlJvbGUsIHtcbiAgICBjb21tYW5kOiB7XG4gICAgICBuYW1lOiAnZ2x1ZWV0bCcsXG4gICAgICBweXRob25WZXJzaW9uOiAnMycsXG4gICAgICBzY3JpcHRMb2NhdGlvbjogJ3MzOi8vZmFrZXNjcmlwdGxvY2F0aW9uL2Zha2VidWNrZXQnLFxuICAgIH0sXG4gICAgcm9sZTogX2pvYlJvbGUucm9sZUFyblxuICB9LCAndGVzdEVUTEpvYicsIHt9KTtcblxuICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2ssIGRlZmF1bHRzLkRlZmF1bHRHbHVlRGF0YWJhc2VQcm9wcygpKTtcblxuICBjb25zdCBfZ2x1ZUpvYiA9IGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgIGdsdWVKb2JQcm9wczogY2ZuSm9iUHJvcHMsXG4gICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBjb21tZW50OiBcIlwiXG4gICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KVxuICB9KTtcblxuICBleHBlY3QoX2dsdWVKb2JbMl0/LlswXSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KF9nbHVlSm9iWzJdPy5bMF0pLnRvQmVJbnN0YW5jZU9mKEJ1Y2tldCk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkdsdWU6OkpvYicsIHtcbiAgICBUeXBlOiBcIkFXUzo6R2x1ZTo6Sm9iXCIsXG4gICAgUHJvcGVydGllczoge1xuICAgICAgQ29tbWFuZDoge1xuICAgICAgICBOYW1lOiBcImdsdWVldGxcIixcbiAgICAgICAgUHl0aG9uVmVyc2lvbjogXCIzXCIsXG4gICAgICAgIFNjcmlwdExvY2F0aW9uOiBcInMzOi8vZmFrZXNjcmlwdGxvY2F0aW9uL2Zha2VidWNrZXRcIlxuICAgICAgfSxcbiAgICAgIFJvbGU6IHtcbiAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICBcIkN1c3RvbUVUTEpvYlJvbGU5MEE4M0E2NlwiLFxuICAgICAgICAgIFwiQXJuXCJcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIEdsdWVWZXJzaW9uOiBcIjIuMFwiLFxuICAgICAgTnVtYmVyT2ZXb3JrZXJzOiAyLFxuICAgICAgU2VjdXJpdHlDb25maWd1cmF0aW9uOiBcInRlc3RFVExKb2JcIixcbiAgICAgIFdvcmtlclR5cGU6IFwiRy4xWFwiXG4gICAgfVxuICB9LCBSZXNvdXJjZVBhcnQuQ29tcGxldGVEZWZpbml0aW9uKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFzcyBhbiBleGlzdGluZyBHbHVlIEpvYlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ0NyZWF0ZSBhIEdsdWUgSm9iIG91dHNpZGUgdGhlIGNvbnN0cnVjdCcsICgpID0+IHtcbiAgLy8gU3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgX2V4aXN0aW5nQ2ZuSm9iID0gbmV3IENmbkpvYihzdGFjaywgJ0V4aXN0aW5nSm9iJywge1xuICAgIGNvbW1hbmQ6IHtcbiAgICAgIG5hbWU6ICdweXRob25zaGVsbCcsXG4gICAgICBweXRob25WZXJzaW9uOiAnMicsXG4gICAgICBzY3JpcHRMb2NhdGlvbjogJ3MzOi8vZXhpc3RpbmdmYWtlbG9jYXRpb24vZXhpc3RpbmdTY3JpcHQnXG4gICAgfSxcbiAgICByb2xlOiBuZXcgUm9sZShzdGFjaywgJ0V4aXN0aW5nSm9iUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2dsdWUuYW1hem9uLmNvbScpLFxuICAgICAgZGVzY3JpcHRpb246ICdFeGlzdGluZyByb2xlJ1xuICAgIH0pLnJvbGVBcm4sXG4gICAgZ2x1ZVZlcnNpb246ICcxJyxcbiAgICBhbGxvY2F0ZWRDYXBhY2l0eTogMixcbiAgICBtYXhDYXBhY2l0eTogNCxcbiAgICBudW1iZXJPZldvcmtlcnM6IDIsXG4gICAgd29ya2VyVHlwZTogJ1N0YW5kYXJkJ1xuICB9KTtcblxuICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2ssIGRlZmF1bHRzLkRlZmF1bHRHbHVlRGF0YWJhc2VQcm9wcygpKTtcblxuICBjb25zdCBfZ2x1ZUpvYiA9IGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgIGV4aXN0aW5nQ2ZuSm9iOiBfZXhpc3RpbmdDZm5Kb2IsXG4gICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICBkYXRhc3RvcmVUeXBlOiBkZWZhdWx0cy5TaW5rU3RvcmVUeXBlLlMzXG4gICAgfSxcbiAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgdW5kZWZpbmVkLCBbe1xuICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pXG4gIH0pO1xuXG4gIGV4cGVjdChfZ2x1ZUpvYlsyXSkubm90LnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkdsdWU6OkpvYicsIHtcbiAgICBUeXBlOiBcIkFXUzo6R2x1ZTo6Sm9iXCIsXG4gICAgUHJvcGVydGllczoge1xuICAgICAgQWxsb2NhdGVkQ2FwYWNpdHk6IDIsXG4gICAgICBDb21tYW5kOiB7XG4gICAgICAgIE5hbWU6IFwicHl0aG9uc2hlbGxcIixcbiAgICAgICAgUHl0aG9uVmVyc2lvbjogXCIyXCIsXG4gICAgICAgIFNjcmlwdExvY2F0aW9uOiBcInMzOi8vZXhpc3RpbmdmYWtlbG9jYXRpb24vZXhpc3RpbmdTY3JpcHRcIixcbiAgICAgIH0sXG4gICAgICBHbHVlVmVyc2lvbjogXCIxXCIsXG4gICAgICBNYXhDYXBhY2l0eTogNCxcbiAgICAgIE51bWJlck9mV29ya2VyczogMixcbiAgICAgIFJvbGU6IHtcbiAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICBcIkV4aXN0aW5nSm9iUm9sZThGNzUwOTc2XCIsXG4gICAgICAgICAgXCJBcm5cIixcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBXb3JrZXJUeXBlOiBcIlN0YW5kYXJkXCIsXG4gICAgfVxuICB9LCBSZXNvdXJjZVBhcnQuQ29tcGxldGVEZWZpbml0aW9uKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHJvdmlkZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgb3RoZXIgdGhhbiBkZWZhdWx0IG9uZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdUZXN0IGN1c3RvbSBkZXBsb3ltZW50IHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gIC8vIFN0YWNrXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IF9jb21tYW5kTmFtZSA9ICdnbHVlZXRsJztcblxuICBjb25zdCBjZm5Kb2JQcm9wczogQ2ZuSm9iUHJvcHMgPSB7XG4gICAgY29tbWFuZDoge1xuICAgICAgbmFtZTogX2NvbW1hbmROYW1lLFxuICAgICAgcHl0aG9uVmVyc2lvbjogJzMnLFxuICAgICAgc2NyaXB0TG9jYXRpb246ICdzMzovL2V4aXN0aW5nZmFrZWxvY2F0aW9uL2V4aXN0aW5nU2NyaXB0J1xuICAgIH0sXG4gICAgcm9sZTogbmV3IFJvbGUoc3RhY2ssICdFeGlzdGluZ0pvYlJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdnbHVlLmFtYXpvbi5jb20nKSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXhpc3Rpbmcgcm9sZSdcbiAgICB9KS5yb2xlQXJuLFxuICAgIGdsdWVWZXJzaW9uOiAnMScsXG4gICAgbnVtYmVyT2ZXb3JrZXJzOiAyLFxuICAgIHdvcmtlclR5cGU6ICdTdGFuZGFyZCdcbiAgfTtcblxuICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuXG4gIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgIGdsdWVKb2JQcm9wczogY2ZuSm9iUHJvcHMsXG4gICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICBkYXRhc3RvcmVUeXBlOiBkZWZhdWx0cy5TaW5rU3RvcmVUeXBlLlMzXG4gICAgfSxcbiAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgdW5kZWZpbmVkLCBbe1xuICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pXG4gIH0pO1xuXG4gIC8vIGNoZWNrIGlmIEdsdWUgSm9iIFJlc291cmNlIHdhcyBjcmVhdGVkIGNvcnJlY3RseVxuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpHbHVlOjpKb2InLCB7XG4gICAgUHJvcGVydGllczoge1xuICAgICAgQ29tbWFuZDoge1xuICAgICAgICBOYW1lOiBcImdsdWVldGxcIixcbiAgICAgICAgUHl0aG9uVmVyc2lvbjogXCIzXCIsXG4gICAgICAgIFNjcmlwdExvY2F0aW9uOiBcInMzOi8vZXhpc3RpbmdmYWtlbG9jYXRpb24vZXhpc3RpbmdTY3JpcHRcIixcbiAgICAgIH0sXG4gICAgICBHbHVlVmVyc2lvbjogXCIxXCIsXG4gICAgICBOdW1iZXJPZldvcmtlcnM6IDIsXG4gICAgICBSb2xlOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJFeGlzdGluZ0pvYlJvbGU4Rjc1MDk3NlwiLFxuICAgICAgICAgIFwiQXJuXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgU2VjdXJpdHlDb25maWd1cmF0aW9uOiBcIkVUTEpvYlNlY3VyaXR5Q29uZmlnXCIsXG4gICAgICBXb3JrZXJUeXBlOiBcIlN0YW5kYXJkXCIsXG4gICAgfSxcbiAgICBUeXBlOiBcIkFXUzo6R2x1ZTo6Sm9iXCJcbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG5cbiAgLy8gY2hlY2sgaWYgdGhlIHJvbGUgaXMgY3JlYXRlZFxuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpJQU06OlJvbGUnLCAgICAgICAgIHtcbiAgICBUeXBlOiBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgUHJvcGVydGllczoge1xuICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XG4gICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIEFjdGlvbjogXCJzdHM6QXNzdW1lUm9sZVwiLFxuICAgICAgICAgICAgRWZmZWN0OiBcIkFsbG93XCIsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogXCJnbHVlLmFtYXpvbi5jb21cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgVmVyc2lvbjogXCIyMDEyLTEwLTE3XCJcbiAgICAgIH0sXG4gICAgICBEZXNjcmlwdGlvbjogXCJFeGlzdGluZyByb2xlXCJcbiAgICB9XG4gIH0sIFJlc291cmNlUGFydC5Db21wbGV0ZURlZmluaXRpb24pO1xuXG4gIC8vIGNoZWNrIGlmIHRoZSBzZWN1cml0eSBjb25maWcgaXMgY3JlYXRlZFxuICBleHBlY3Qoc3RhY2spLnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpHbHVlOjpTZWN1cml0eUNvbmZpZ3VyYXRpb24nLCB7XG4gICAgUHJvcGVydGllczoge1xuICAgICAgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgSm9iQm9va21hcmtzRW5jcnlwdGlvbjoge1xuICAgICAgICAgIEpvYkJvb2ttYXJrc0VuY3J5cHRpb25Nb2RlOiBcIkNTRS1LTVNcIixcbiAgICAgICAgICBLbXNLZXlBcm46IHtcbiAgICAgICAgICAgIFwiRm46OkpvaW5cIjogW1xuICAgICAgICAgICAgICBcIlwiLCBbXG4gICAgICAgICAgICAgICAgXCJhcm46XCIsIHtcbiAgICAgICAgICAgICAgICAgIFJlZjogXCJBV1M6OlBhcnRpdGlvblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI6a21zOlwiLCB7XG4gICAgICAgICAgICAgICAgICBSZWY6IFwiQVdTOjpSZWdpb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiOlwiLCB7XG4gICAgICAgICAgICAgICAgICBSZWY6IFwiQVdTOjpBY2NvdW50SWRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiOmFsaWFzL2F3cy9nbHVlXCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFMzRW5jcnlwdGlvbnM6IFt7XG4gICAgICAgICAgUzNFbmNyeXB0aW9uTW9kZTogXCJTU0UtUzNcIixcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgICAgTmFtZTogXCJFVExKb2JTZWN1cml0eUNvbmZpZ1wiLFxuICAgIH0sXG4gICAgVHlwZTogXCJBV1M6OkdsdWU6OlNlY3VyaXR5Q29uZmlndXJhdGlvblwiLFxuICB9LCBSZXNvdXJjZVBhcnQuQ29tcGxldGVEZWZpbml0aW9uKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRG8gbm90IHN1cHBseSBwYXJhbWV0ZXJzIGFuZCBlcnJvciBvdXRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KCdEbyBubyBzdXBwbHkgZ2x1ZUpvYlByb3BzIG9yIGV4aXN0aW5nQ2ZuSm9iIGFuZCBlcnJvciBvdXQnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrKTtcbiAgICBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICAgIG91dHB1dERhdGFTdG9yZToge1xuICAgICAgICBkYXRhc3RvcmVUeXBlOiBkZWZhdWx0cy5TaW5rU3RvcmVUeXBlLlMzXG4gICAgICB9LFxuICAgICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgZGVmYXVsdHMuRGVmYXVsdEdsdWVUYWJsZVByb3BzKF9kYXRhYmFzZSwgW3tcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcImludFwiLFxuICAgICAgICBjb21tZW50OiBcIlwiXG4gICAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pKVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGV4cGVjdChlcnJvcikudG9CZUluc3RhbmNlT2YoRXJyb3IpO1xuICB9XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFsbG93IHRoZSBjb25zdHJ1Y3QgdG8gY3JlYXRlIHRoZSBqb2Igcm9sZSByZXF1aXJlZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIHJvbGUgY3JlYXRpb24nLCAoKSA9PiB7XG4gIC8vIFN0YWNrXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IF9qb2JJRCA9ICdnbHVlZXRsJztcblxuICBjb25zdCBjZm5Kb2JQcm9wcyA9IHtcbiAgICBjb21tYW5kOiB7XG4gICAgICBuYW1lOiBfam9iSUQsXG4gICAgICBweXRob25WZXJzaW9uOiAnMycsXG4gICAgICBzY3JpcHRMb2NhdGlvbjogJ3MzOi8vZmFrZWxvY2F0aW9uL3NjcmlwdCdcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrKTtcblxuICBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICBnbHVlSm9iUHJvcHM6IGNmbkpvYlByb3BzLFxuICAgIG91dHB1dERhdGFTdG9yZToge1xuICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgIH0sXG4gICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBjb21tZW50OiBcIlwiXG4gICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KVxuICB9KTtcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgIFR5cGU6IFwiQVdTOjpJQU06OlJvbGVcIixcbiAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBbe1xuICAgICAgICAgIEFjdGlvbjogXCJzdHM6QXNzdW1lUm9sZVwiLFxuICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgIFByaW5jaXBhbDoge1xuICAgICAgICAgICAgU2VydmljZTogXCJnbHVlLmFtYXpvbmF3cy5jb21cIlxuICAgICAgICAgIH1cbiAgICAgICAgfV0sXG4gICAgICAgIFZlcnNpb246IFwiMjAxMi0xMC0xN1wiXG4gICAgICB9LFxuICAgICAgRGVzY3JpcHRpb246IFwiU2VydmljZSByb2xlIHRoYXQgR2x1ZSBjdXN0b20gRVRMIGpvYnMgd2lsbCBhc3N1bWUgZm9yIGV4ZXVjdGlvblwiXG4gICAgfVxuICB9LCBSZXNvdXJjZVBhcnQuQ29tcGxldGVEZWZpbml0aW9uKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGVzdCBkZXBsb3ltZW50IHdoZW4gb3V0cHV0IGxvY2F0aW9uIGlzIHByb3ZpZGVkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggcm9sZSBjcmVhdGlvbicsICgpID0+IHtcbiAgLy8gU3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgX2pvYklEID0gJ2dsdWVldGwnO1xuXG4gIGNvbnN0IGNmbkpvYlByb3BzID0ge1xuICAgIGNvbW1hbmQ6IHtcbiAgICAgIG5hbWU6IF9qb2JJRCxcbiAgICAgIHB5dGhvblZlcnNpb246ICczJyxcbiAgICAgIHNjcmlwdExvY2F0aW9uOiAnczM6Ly9mYWtlbG9jYXRpb24vc2NyaXB0J1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuXG4gIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgIGdsdWVKb2JQcm9wczogY2ZuSm9iUHJvcHMsXG4gICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICBkYXRhc3RvcmVUeXBlOiBkZWZhdWx0cy5TaW5rU3RvcmVUeXBlLlMzLFxuICAgICAgZXhpc3RpbmdTM091dHB1dEJ1Y2tldDogbmV3IEJ1Y2tldChzdGFjaywgJ091dHB1dEJ1Y2tldCcsIHtcbiAgICAgICAgdmVyc2lvbmVkOiBmYWxzZSxcbiAgICAgICAgYnVja2V0TmFtZTogJ291dHB1dGJ1Y2tldCcsXG4gICAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICBjb21tZW50OiBcIlwiXG4gICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KVxuICB9KTtcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0JyxcbiAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICBCdWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogW3tcbiAgICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDoge1xuICAgICAgICAgICAgU1NFQWxnb3JpdGhtOiBcIkFFUzI1NlwiXG4gICAgICAgICAgfVxuICAgICAgICB9XVxuICAgICAgfSxcbiAgICAgIEJ1Y2tldE5hbWU6IFwib3V0cHV0YnVja2V0XCJcbiAgICB9LFxuICAgIFVwZGF0ZVJlcGxhY2VQb2xpY3k6IFwiRGVsZXRlXCIsXG4gICAgRGVsZXRpb25Qb2xpY3k6IFwiRGVsZXRlXCJcbiAgfSwgUmVzb3VyY2VQYXJ0LkNvbXBsZXRlRGVmaW5pdGlvbik7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRlc3QgZGVwbG95bWVudCB3aGVuIHNjcmlwdCBsb2NhdGlvbiBub3QgcHJvdmlkZWQgLSB0aHJvdyBlcnJvclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIHJvbGUgY3JlYXRpb24nLCAoKSA9PiB7XG4gIC8vIFN0YWNrXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IF9qb2JJRCA9ICdnbHVlZXRsJztcblxuICBjb25zdCBjZm5Kb2JQcm9wcyA9IHtcbiAgICBjb21tYW5kOiB7XG4gICAgICBuYW1lOiBfam9iSUQsXG4gICAgICBweXRob25WZXJzaW9uOiAnMydcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgX2RhdGFiYXNlID0gZGVmYXVsdHMuY3JlYXRlR2x1ZURhdGFiYXNlKHN0YWNrKTtcbiAgdHJ5IHtcbiAgICBkZWZhdWx0cy5idWlsZEdsdWVKb2Ioc3RhY2ssIHtcbiAgICAgIGdsdWVKb2JQcm9wczogY2ZuSm9iUHJvcHMsXG4gICAgICBvdXRwdXREYXRhU3RvcmU6IHtcbiAgICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TMyxcbiAgICAgICAgZXhpc3RpbmdTM091dHB1dEJ1Y2tldDogbmV3IEJ1Y2tldChzdGFjaywgJ091dHB1dEJ1Y2tldCcsIHtcbiAgICAgICAgICB2ZXJzaW9uZWQ6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgdW5kZWZpbmVkLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgICBleHBlY3QoZXJyb3IubWVzc2FnZSkudG9FcXVhbCgnRWl0aGVyIG9uZSBvZiBDZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5LnNjcmlwdExvY2F0aW9uIG9yIEtpbmVzaXNzdHJlYW1zVG9HbHVlam9iUHJvcHMuZXRsQ29kZUFzc2V0ICcgK1xuICAgICdoYXMgdG8gYmUgcHJvdmlkZWQuIElmIHRoZSBFVEwgSm9iIGNvZGUgZmlsZSBleGlzdHMgaW4gYSBsb2NhbCBmaWxlc3lzdGVtLCBwbGVhc2Ugc2V0IEtpbmVzaXNzdHJlYW1zVG9HbHVlam9iUHJvcHMuZXRsQ29kZUFzc2V0LiAnICtcbiAgICAnSWYgdGhlIEVUTCBKb2IgaXMgYXZhaWxhYmxlIGluIGFuIFMzIGJ1Y2tldCwgc2V0IHRoZSBDZm5Kb2IuSm9iQ29tbWFuZFByb3BlcnR5LnNjcmlwdExvY2F0aW9uIHByb3BlcnR5Jyk7XG4gIH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRG9udCBwYXNzIEpvYiBDb21tYW5kIGF0dHJpYnV0ZXMgYW5kIGl0IHNob3VsZCB0aHJvdyBhbiBlcnJvclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ1Rlc3QgZm9yIGluY29ycmVjdCBKb2IgQ29tbWFuZCBwcm9wZXJ0eScsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgZ2x1ZUpvYlByb3BzOiB7fSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIHVuZGVmaW5lZCwgW3tcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICB0eXBlOiBcImludFwiLFxuICAgICAgICBjb21tZW50OiBcIlwiXG4gICAgICB9XSwgJ2tpbmVzaXMnLCB7U1RSRUFNX05BTUU6ICd0ZXN0U3RyZWFtJ30pXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXhwZWN0KGVycm9yKS50b0JlSW5zdGFuY2VPZihFcnJvcik7XG4gIH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIENmbkpvYi5Kb2JDb21tYW5kUHJvcGVydHkgdHlwZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ2NoZWNrIGZvciBKb2JDb21tYW5kUHJvcGVydHkgdHlwZScsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBmYWtla2V5OiAnZmFrZXZhbHVlJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGF0YWJhc2U6IF9kYXRhYmFzZSxcbiAgICAgIHRhYmxlOiBkZWZhdWx0cy5jcmVhdGVHbHVlVGFibGUoc3RhY2ssIF9kYXRhYmFzZSwgdW5kZWZpbmVkLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdXBwbHkgbWF4Q2FwYWNpdHkgd2l0aCBHbHVlVmVyc2lvbiAyLjAgYW5kIGVycm9yIG91dFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoJ0dsdWVKb2IgY29uZmlndXJhdGlvbiB3aXRoIGdsdWVWZXJzaW9uIDIuMCBzaG91bGQgbm90IHN1cHBvcnQgbWF4Q2FwYWNpdHkgYW5kIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGdsdWVWZXJzaW9uOiAnMi4wJyxcbiAgICAgICAgbWF4Q2FwYWNpdHk6ICcyJ1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGV4cGVjdChlcnJvcikudG9CZUluc3RhbmNlT2YoRXJyb3IpO1xuICB9XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZhaWwgaWYgc2V0dGluZyBtYXhDYXBhY2l0eSBhbmQgV29ya2VyVHlwZS8gTnVtYmVyT2ZXb3JrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdCgnQ2Fubm90IHVzZSBtYXhDYXBhY2l0eSBhbmQgV29ya2VyVHlwZSwgc28gZXJyb3Igb3V0JywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICB0cnkge1xuICAgIGNvbnN0IF9kYXRhYmFzZSA9IGRlZmF1bHRzLmNyZWF0ZUdsdWVEYXRhYmFzZShzdGFjayk7XG4gICAgZGVmYXVsdHMuYnVpbGRHbHVlSm9iKHN0YWNrLCB7XG4gICAgICBvdXRwdXREYXRhU3RvcmU6IHtcbiAgICAgICAgZGF0YXN0b3JlVHlwZTogZGVmYXVsdHMuU2lua1N0b3JlVHlwZS5TM1xuICAgICAgfSxcbiAgICAgIGRhdGFiYXNlOiBfZGF0YWJhc2UsXG4gICAgICB0YWJsZTogZGVmYXVsdHMuY3JlYXRlR2x1ZVRhYmxlKHN0YWNrLCBfZGF0YWJhc2UsIGRlZmF1bHRzLkRlZmF1bHRHbHVlVGFibGVQcm9wcyhfZGF0YWJhc2UsIFt7XG4gICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgdHlwZTogXCJpbnRcIixcbiAgICAgICAgY29tbWVudDogXCJcIlxuICAgICAgfV0sICdraW5lc2lzJywge1NUUkVBTV9OQU1FOiAndGVzdFN0cmVhbSd9KSksXG4gICAgICBnbHVlSm9iUHJvcHM6IHtcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgIG5hbWU6IFwiZ2x1ZWpvYjEuMFwiLFxuICAgICAgICAgIHB5dGhvblZlcnNpb246ICczJ1xuICAgICAgICB9LFxuICAgICAgICBnbHVlVmVyc2lvbjogJzEuMCcsXG4gICAgICAgIG1heENhcGFjaXR5OiAnMicsXG4gICAgICAgIHdvcmtlclR5cGU6ICdTdGFuZGFyZCdcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbnRlc3QoJ0Nhbm5vdCB1c2UgbWF4Q2FwYWNpdHkgYW5kIFdvcmtlclR5cGUsIHNvIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBuYW1lOiBcImdsdWVqb2IxLjBcIixcbiAgICAgICAgICBweXRob25WZXJzaW9uOiAnMydcbiAgICAgICAgfSxcbiAgICAgICAgZ2x1ZVZlcnNpb246ICcxLjAnLFxuICAgICAgICBtYXhDYXBhY2l0eTogJzInLFxuICAgICAgICBudW1iZXJPZldvcmtlcnM6IDJcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmVJbnN0YW5jZU9mKEVycm9yKTtcbiAgfVxufSk7XG5cbnRlc3QoJ0Nhbm5vdCB1c2UgbWF4Q2FwYWNpdHkgYW5kIFdvcmtlclR5cGUsIHNvIGVycm9yIG91dCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBfZGF0YWJhc2UgPSBkZWZhdWx0cy5jcmVhdGVHbHVlRGF0YWJhc2Uoc3RhY2spO1xuICAgIGRlZmF1bHRzLmJ1aWxkR2x1ZUpvYihzdGFjaywge1xuICAgICAgb3V0cHV0RGF0YVN0b3JlOiB7XG4gICAgICAgIGRhdGFzdG9yZVR5cGU6IGRlZmF1bHRzLlNpbmtTdG9yZVR5cGUuUzNcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZTogX2RhdGFiYXNlLFxuICAgICAgdGFibGU6IGRlZmF1bHRzLmNyZWF0ZUdsdWVUYWJsZShzdGFjaywgX2RhdGFiYXNlLCBkZWZhdWx0cy5EZWZhdWx0R2x1ZVRhYmxlUHJvcHMoX2RhdGFiYXNlLCBbe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIHR5cGU6IFwiaW50XCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiXCJcbiAgICAgIH1dLCAna2luZXNpcycsIHtTVFJFQU1fTkFNRTogJ3Rlc3RTdHJlYW0nfSkpLFxuICAgICAgZ2x1ZUpvYlByb3BzOiB7XG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICBuYW1lOiBcImdsdWVqb2IxLjBcIixcbiAgICAgICAgICBweXRob25WZXJzaW9uOiAnMydcbiAgICAgICAgfSxcbiAgICAgICAgZ2x1ZVZlcnNpb246ICcxLjAnLFxuICAgICAgICBtYXhDYXBhY2l0eTogJzInLFxuICAgICAgICBudW1iZXJPZldvcmtlcnM6IDIsXG4gICAgICAgIHdvcmtlclR5cGU6ICdHMS5YJ1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGV4cGVjdChlcnJvcikudG9CZUluc3RhbmNlT2YoRXJyb3IpO1xuICB9XG59KTsiXX0=