@pwrdrvr/microapps-cdk 0.0.18 → 0.0.19

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
@@ -1239,7 +1239,7 @@
1239
1239
  },
1240
1240
  "name": "@pwrdrvr/microapps-cdk",
1241
1241
  "readme": {
1242
- "markdown": "# Overview\n\nThe MicroApps project...\n\n# Project Layout\n\n- [src/cdk]() - CDK Stacks\n - MicroAppsS3\n - Creates S3 buckets\n - MicroAppsRepos\n - Creates the ECR repos for components to be published into;\n - Deployer\n - Router\n - MicroAppsSvcs\n - Create DynamoDB table\n - Create Deployer Lambda function\n - Create Router Lambda function\n - Create APIGateway HTTP API\n - MicroAppsCF\n - Creates Cloudfront distribution\n - MicroAppsR53\n - Creates domain names to point to the edge (Cloudfront) and origin (API Gateway)\n- [src/microapps-deployer]()\n - Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.\n- [src/microapps-publish]()\n - Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`\n - Permissions required:\n - Lambda invoke\n - S3 publish to the staging bucket\n - ECR write\n - Lambda version publish\n- [src/microapps-router]()\n - Lambda function that determines which version of an app to point a user to on a particular invocation\n\n# Useful Commands\n\n- `npm run build` compiles TypeSript to JavaScript\n- `npm run lint` checks TypeScript for compliance with Lint rules\n- `cdk list` list the stack names\n- `cdk deploy` deploy this stack to your default AWS account/region\n- `cdk diff` compare deployed stack with current state\n- `cdk synth` emits the synthesized CloudFormation template\n\n# Running CDK\n\nAlways run CDK from the root of the git repo, which is the directory containing `cdk.json`.\n\n## Set AWS Profile\n\n`export AWS_PROFILE=pwrdrvr`\n\n## Set NVM Version\n\n`nvm use`\n\n# Deployer Service\n\nCopies static assets from staging to deployed directory, creates record of application / version in DynamoDB Table.\n\n## Build and Deploy Update\n\n```\nmake aws-ecr-login\nmake aws-ecr-publish-deployer\nmake aws-lambda-update-deployer\n```\n\n# Notes on Selection of Docker Image Lambdas\n\nThe Router and Deployer services are very small (0.5 MB) after tree shaking, minification, and uglification performed by `rollup`. The router has the tightest performance requirement and performed just as well as a docker image vs a zip file. However, docker image start up is up to 2x longer vs the zip file for the router; this should not be a problem for any live system with continuous usage and for demos the router can be initialized or pre-provisioned beforehand. The development benefits of docker images for Lambda outweigh the small init time impact on cold starts.\n\n# Notes on Performance\n\n## Router\n\nFor best demo performance (and real user performance), the memory for the Router Lambda should be set to 1024 MB as this gives the fastest cold start at the lowest cost. The cost per warm request is actually lower at 1024 MB than at 128 MB, so 1024 MB is just the ideal size.\n\nFor supremely optimum demo performance the Router Lambda should be deployed as a .zip file as that saves about 50% of the cold start time, or about 200 ms, but once it's the cold start has happened they are equally as fast as each other.\n\n- Lambda Memory (which linearly scales CPU) Speeds\n - Docker Image Lambda\n - Note: All times captured with Rollup ~400 KB Docker Layer\n - 128 MB\n - Duration Warm: 118 ms\n - Duration Cold: 763 ms\n - Init Duration: 518 ms\n - Billed Duration Warm: 119 ms\n - Billed Duration Init: 1,282 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.26 millicents\n - 256 MB\n - Duration Warm: 30 ms\n - Duration Cold: 363 ms\n - Init Duration: 488 ms\n - Billed Duration Warm: 30 ms\n - Billed Duration Init: 853 ms\n - Warm Cost: 0.013 millicents\n - Init Cost: 0.36 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 176 ms\n - Init Duration: 572 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Init: 749 ms\n - Warm Cost: 0.0083 millicents\n - Init Cost: 0.62 millicents\n - 1024 MB\n - Duration Warm: 9 ms\n - Duration Cold: 84.5 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 9 ms\n - Billed Duration Init: 585 ms\n - Warm Cost: 0.015 millicents\n - Init Cost: 0.97 millicents\n - _Init performance scales linearly up to and including 1024 MB_\n - 1769 MB\n - This is the point at which a Lambda has 100% of 1 CPU\n - https://docs.aws.amazon.com/lambda/latest/dg/configuration-memory.html\n - Duration Warm: 8.31 ms\n - Duration Cold: 73 ms\n - Init Duration: 514 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Cold: 587 ms\n - Warm Cost: 0.029 millicents\n - Init Cost: 1.7 millicents\n - 2048 MB\n - Duration Warm: 10 ms\n - Duration Cold: 67 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 11 ms\n - Billed Duration Init: 566 ms\n - Warm Cost: 0.037 millicents\n - Init Cost: 1.89 millicents\n - Zip File Lambda\n - 128 MB\n - Duration Warm: 110 ms\n - Duration Cold: 761 ms\n - Init Duration: 210 ms\n - Billed Duration Warm: 120 ms\n - Billed Duration Init: 762 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.16 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 179 ms\n - Init Duration: 201 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 185 ms\n - Warm Cost: 0.01 millicents\n - Init Cost: 0.15 millicents\n - 1024 MB\n - Duration Warm: 10 ms\n - Duration Cold: 85 ms\n - Init Duration: 185 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 85 ms\n - Warm Cost: 0.02 millicents\n - Init Cost: 0.14 millicents\n"
1242
+ "markdown": "# Overview\n\nThe MicroApps project....\n\n# Project Layout\n\n- [packages/cdk]() - CDK Stacks\n - MicroAppsS3\n - Creates S3 buckets\n - MicroAppsRepos\n - Creates the ECR repos for components to be published into;\n - Deployer\n - Router\n - MicroAppsSvcs\n - Create DynamoDB table\n - Create Deployer Lambda function\n - Create Router Lambda function\n - Create APIGateway HTTP API\n - MicroAppsCF\n - Creates Cloudfront distribution\n - MicroAppsR53\n - Creates domain names to point to the edge (Cloudfront) and origin (API Gateway)\n- [packages/microapps-deployer]()\n - Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.\n- [packages/microapps-publish]()\n - Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`\n - Permissions required:\n - Lambda invoke\n - S3 publish to the staging bucket\n - ECR write\n - Lambda version publish\n- [packages/microapps-router]()\n - Lambda function that determines which version of an app to point a user to on a particular invocation\n\n# Useful Commands\n\n- `npm run build` compiles TypeSript to JavaScript\n- `npm run lint` checks TypeScript for compliance with Lint rules\n- `cdk list` list the stack names\n- `cdk deploy` deploy this stack to your default AWS account/region\n- `cdk diff` compare deployed stack with current state\n- `cdk synth` emits the synthesized CloudFormation template\n\n# Running CDK\n\nAlways run CDK from the root of the git repo, which is the directory containing `cdk.json`.\n\n## Set AWS Profile\n\n`export AWS_PROFILE=pwrdrvr`\n\n## Set NVM Version\n\n`nvm use`\n\n# Deployer Service\n\nCopies static assets from staging to deployed directory, creates record of application / version in DynamoDB Table.\n\n## Build and Deploy Update\n\n```\nmake aws-ecr-login\nmake aws-ecr-publish-deployer\nmake aws-lambda-update-deployer\n```\n\n# Notes on Selection of Docker Image Lambdas\n\nThe Router and Deployer services are very small (0.5 MB) after tree shaking, minification, and uglification performed by `rollup`. The router has the tightest performance requirement and performed just as well as a docker image vs a zip file. However, docker image start up is up to 2x longer vs the zip file for the router; this should not be a problem for any live system with continuous usage and for demos the router can be initialized or pre-provisioned beforehand. The development benefits of docker images for Lambda outweigh the small init time impact on cold starts.\n\n# Notes on Performance\n\n## Router\n\nFor best demo performance (and real user performance), the memory for the Router Lambda should be set to 1024 MB as this gives the fastest cold start at the lowest cost. The cost per warm request is actually lower at 1024 MB than at 128 MB, so 1024 MB is just the ideal size.\n\nFor supremely optimum demo performance the Router Lambda should be deployed as a .zip file as that saves about 50% of the cold start time, or about 200 ms, but once it's the cold start has happened they are equally as fast as each other.\n\n- Lambda Memory (which linearly scales CPU) Speeds\n - Docker Image Lambda\n - Note: All times captured with Rollup ~400 KB Docker Layer\n - 128 MB\n - Duration Warm: 118 ms\n - Duration Cold: 763 ms\n - Init Duration: 518 ms\n - Billed Duration Warm: 119 ms\n - Billed Duration Init: 1,282 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.26 millicents\n - 256 MB\n - Duration Warm: 30 ms\n - Duration Cold: 363 ms\n - Init Duration: 488 ms\n - Billed Duration Warm: 30 ms\n - Billed Duration Init: 853 ms\n - Warm Cost: 0.013 millicents\n - Init Cost: 0.36 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 176 ms\n - Init Duration: 572 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Init: 749 ms\n - Warm Cost: 0.0083 millicents\n - Init Cost: 0.62 millicents\n - 1024 MB\n - Duration Warm: 9 ms\n - Duration Cold: 84.5 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 9 ms\n - Billed Duration Init: 585 ms\n - Warm Cost: 0.015 millicents\n - Init Cost: 0.97 millicents\n - _Init performance scales linearly up to and including 1024 MB_\n - 1769 MB\n - This is the point at which a Lambda has 100% of 1 CPU\n - https://docs.aws.amazon.com/lambda/latest/dg/configuration-memory.html\n - Duration Warm: 8.31 ms\n - Duration Cold: 73 ms\n - Init Duration: 514 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Cold: 587 ms\n - Warm Cost: 0.029 millicents\n - Init Cost: 1.7 millicents\n - 2048 MB\n - Duration Warm: 10 ms\n - Duration Cold: 67 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 11 ms\n - Billed Duration Init: 566 ms\n - Warm Cost: 0.037 millicents\n - Init Cost: 1.89 millicents\n - Zip File Lambda\n - 128 MB\n - Duration Warm: 110 ms\n - Duration Cold: 761 ms\n - Init Duration: 210 ms\n - Billed Duration Warm: 120 ms\n - Billed Duration Init: 762 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.16 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 179 ms\n - Init Duration: 201 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 185 ms\n - Warm Cost: 0.01 millicents\n - Init Cost: 0.15 millicents\n - 1024 MB\n - Duration Warm: 10 ms\n - Duration Cold: 85 ms\n - Init Duration: 185 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 85 ms\n - Warm Cost: 0.02 millicents\n - Init Cost: 0.14 millicents\n"
1243
1243
  },
1244
1244
  "repository": {
1245
1245
  "type": "git",
@@ -1585,6 +1585,6 @@
1585
1585
  ]
1586
1586
  }
1587
1587
  },
1588
- "version": "0.0.18",
1589
- "fingerprint": "dz8DUjQqsyCPvBa1izkmiMLSACZviYvS4jpR/9BVBEQ="
1588
+ "version": "0.0.19",
1589
+ "fingerprint": "2OFdJMX0z9W/VwycrxzleJIL+mLytkiH4vlGUcHfJ6c="
1590
1590
  }
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Overview
2
2
 
3
- The MicroApps project...
3
+ The MicroApps project....
4
4
 
5
5
  # Project Layout
6
6
 
7
- - [src/cdk]() - CDK Stacks
7
+ - [packages/cdk]() - CDK Stacks
8
8
  - MicroAppsS3
9
9
  - Creates S3 buckets
10
10
  - MicroAppsRepos
@@ -20,16 +20,16 @@ The MicroApps project...
20
20
  - Creates Cloudfront distribution
21
21
  - MicroAppsR53
22
22
  - Creates domain names to point to the edge (Cloudfront) and origin (API Gateway)
23
- - [src/microapps-deployer]()
23
+ - [packages/microapps-deployer]()
24
24
  - Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.
25
- - [src/microapps-publish]()
25
+ - [packages/microapps-publish]()
26
26
  - Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`
27
27
  - Permissions required:
28
28
  - Lambda invoke
29
29
  - S3 publish to the staging bucket
30
30
  - ECR write
31
31
  - Lambda version publish
32
- - [src/microapps-router]()
32
+ - [packages/microapps-router]()
33
33
  - Lambda function that determines which version of an app to point a user to on a particular invocation
34
34
 
35
35
  # Useful Commands
package/lib/MicroApps.js CHANGED
@@ -73,5 +73,5 @@ class MicroApps extends cdk.Construct {
73
73
  }
74
74
  exports.MicroApps = MicroApps;
75
75
  _a = JSII_RTTI_SYMBOL_1;
76
- MicroApps[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroApps", version: "0.0.18" };
76
+ MicroApps[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroApps", version: "0.0.19" };
77
77
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01pY3JvQXBwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHFDQUFxQztBQUNyQywrQ0FBNEM7QUFDNUMsK0NBQTRDO0FBQzVDLG1EQUFnRDs7Ozs7O0FBbURoRCxNQUFhLFNBQVUsU0FBUSxHQUFHLENBQUMsU0FBUzs7OztJQVUxQyxZQUFZLEtBQW9CLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUVELE1BQU0sRUFDSixVQUFVLEVBQ1YsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixhQUFhLEdBQUcsV0FBVyxFQUMzQixlQUFlLEdBQUcsRUFBRSxFQUNwQixvQkFBb0IsR0FBRyxLQUFLLEVBQzVCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxHQUFHLEtBQUssRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUFHLGFBQWEsR0FDdkMsR0FBRyxLQUFLLENBQUM7UUFDVixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUQsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDL0Msb0JBQW9CO1lBQ3BCLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2IsZUFBZTtTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3ZELFNBQVMsRUFBRSxFQUFFO1lBQ2IsYUFBYTtZQUNiLGVBQWU7WUFDZixVQUFVO1lBQ1YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0I7WUFDaEIsb0JBQW9CO1lBQ3BCLFNBQVM7WUFDVCxXQUFXO1lBQ1gsUUFBUTtTQUNULENBQUMsQ0FBQztRQUNILElBQUksNkJBQWEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDeEMsY0FBYyxFQUFFLEVBQUU7WUFDbEIsU0FBUyxFQUFFLEVBQUU7WUFDYixhQUFhO1lBQ2IsZUFBZTtZQUNmLFVBQVU7WUFDVixpQkFBaUI7WUFDakIsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixvQkFBb0I7WUFDcEIsU0FBUztZQUNULFdBQVc7WUFDWCxPQUFPO1lBQ1AsTUFBTTtZQUNOLE1BQU07WUFDTixVQUFVO1lBQ1Ysa0JBQWtCO1lBQ2xCLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBekVELHlEQUF5RDtJQUNqRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDekMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7QUFSSCw4QkEyRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBNaWNyb0FwcHNDRiB9IGZyb20gJy4vTWljcm9BcHBzQ0YnO1xuaW1wb3J0IHsgTWljcm9BcHBzUzMgfSBmcm9tICcuL01pY3JvQXBwc1MzJztcbmltcG9ydCB7IE1pY3JvQXBwc1N2Y3MgfSBmcm9tICcuL01pY3JvQXBwc1N2Y3MnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBzUHJvcHMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFwcEVudjogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByNTNab25lTmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByNTNab25lSUQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjZXJ0RWRnZTogYWNtLklDZXJ0aWZpY2F0ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjZXJ0T3JpZ2luOiBhY20uSUNlcnRpZmljYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NSb2xlTmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9BOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZG9tYWluTmFtZU9yaWdpbjogc3RyaW5nO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgTWljcm9BcHBzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCB7XG4gIC8vIGlucHV0IGxpa2UgJ2V4YW1wbGUuY29tLicgd2lsbCByZXR1cm4gYXMgJ2NvbS5leGFtcGxlJ1xuICBwcml2YXRlIHN0YXRpYyByZXZlcnNlRG9tYWluKGRvbWFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcGFydHMgPSBkb21haW4uc3BsaXQoJy4nKS5yZXZlcnNlKCk7XG4gICAgaWYgKHBhcnRzWzBdID09PSAnJykge1xuICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IE1pY3JvQXBwc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZG9tYWluTmFtZSxcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIGFzc2V0TmFtZVJvb3QgPSAnbWljcm9hcHBzJyxcbiAgICAgIGFzc2V0TmFtZVN1ZmZpeCA9ICcnLFxuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcgPSBmYWxzZSxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgY2VydEVkZ2UsXG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgYXBwRW52ID0gJ2RldicsXG4gICAgICBjZXJ0T3JpZ2luLFxuICAgICAgczNQb2xpY3lCeXBhc3NBUk9BLFxuICAgICAgczNQb2xpY3lCeXBhc3NSb2xlTmFtZSA9ICdBZG1pbkFjY2VzcycsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHJldmVyc2VEb21haW5OYW1lID0gTWljcm9BcHBzLnJldmVyc2VEb21haW4oZG9tYWluTmFtZSk7XG5cbiAgICBjb25zdCBzMyA9IG5ldyBNaWNyb0FwcHNTMyh0aGlzLCAnbWljcm9hcHBzLXMzJywge1xuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcsXG4gICAgICByZXZlcnNlRG9tYWluTmFtZSxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSk7XG4gICAgY29uc3QgY2YgPSBuZXcgTWljcm9BcHBzQ0YodGhpcywgJ21pY3JvYXBwcy1jbG91ZGZyb250Jywge1xuICAgICAgczNFeHBvcnRzOiBzMyxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICBkb21haW5OYW1lLFxuICAgICAgcmV2ZXJzZURvbWFpbk5hbWUsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgY2VydEVkZ2UsXG4gICAgfSk7XG4gICAgbmV3IE1pY3JvQXBwc1N2Y3ModGhpcywgJ21pY3JvYXBwcy1zdmNzJywge1xuICAgICAgY2ZTdGFja0V4cG9ydHM6IGNmLFxuICAgICAgczNFeHBvcnRzOiBzMyxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICBkb21haW5OYW1lLFxuICAgICAgcmV2ZXJzZURvbWFpbk5hbWUsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFwcEVudixcbiAgICAgIGNlcnRPcmlnaW4sXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0EsXG4gICAgICBzM1BvbGljeUJ5cGFzc1JvbGVOYW1lLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -83,7 +83,7 @@ class MicroAppsSvcs extends cdk.Construct {
83
83
  }
84
84
  else {
85
85
  deployerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-deployer-func', {
86
- entry: './src/microapps-deployer/src/index.ts',
86
+ entry: './packages/microapps-deployer/src/index.ts',
87
87
  handler: 'handler',
88
88
  bundling: {
89
89
  minify: true,
@@ -278,13 +278,13 @@ class MicroAppsSvcs extends cdk.Construct {
278
278
  else {
279
279
  // Create Router Lambda Layer
280
280
  const routerDataFiles = new lambda.LayerVersion(this, 'microapps-router-layer', {
281
- code: lambda.Code.fromAsset('./src/microapps-router/templates/'),
281
+ code: lambda.Code.fromAsset('./packages/microapps-router/templates/'),
282
282
  });
283
283
  if (autoDeleteEverything) {
284
284
  routerDataFiles.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
285
285
  }
286
286
  routerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-router-func', {
287
- entry: './src/microapps-router/src/index.ts',
287
+ entry: './packages/microapps-router/src/index.ts',
288
288
  handler: 'handler',
289
289
  bundling: {
290
290
  minify: true,
@@ -417,4 +417,4 @@ class MicroAppsSvcs extends cdk.Construct {
417
417
  }
418
418
  }
419
419
  exports.MicroAppsSvcs = MicroAppsSvcs;
420
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFDN0Isb0RBQW9EO0FBQ3BELG9FQUFvRTtBQUVwRSxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QywyREFBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLHFDQUFxQztBQWtDckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNOUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUErQjs7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEdBQzNGLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEIsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sYUFBYSxFQUNiLGVBQWUsR0FDaEIsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFFckMsRUFBRTtRQUNGLGlCQUFpQjtRQUNqQixFQUFFO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUMvRCxTQUFTLEVBQUUs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NUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNoQyxJQUFJLFVBQVUsQ0FBQyw0QkFBNEIsQ0FDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDeEMsQ0FDRjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksb0JBQW9CLEVBQUU7WUFDeEIsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBemNELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQXdjRjtBQTVjRCxzQ0E0Y0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaWd3eSBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGFwaWd3eWludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdAYXdzLWNkay9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ0Bhd3MtY2RrL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnQGF3cy1jZGsvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgcjUzIGZyb20gJ0Bhd3MtY2RrL2F3cy1yb3V0ZTUzJztcbmltcG9ydCAqIGFzIHI1M3RhcmdldHMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdAYXdzLWNkay9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc0NGRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzQ0YnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc1MzRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzUzMnO1xuXG5pbnRlcmZhY2UgTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMgZXh0ZW5kcyBjZGsuUmVzb3VyY2VQcm9wcyB7XG4gIHJlYWRvbmx5IGNmU3RhY2tFeHBvcnRzOiBJTWljcm9BcHBzQ0ZFeHBvcnRzO1xuICByZWFkb25seSBzM0V4cG9ydHM6IElNaWNyb0FwcHNTM0V4cG9ydHM7XG5cbiAgcmVhZG9ubHkgYXBwRW52OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nOiBib29sZWFuO1xuICByZWFkb25seSByZXZlcnNlRG9tYWluTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVPcmlnaW46IHN0cmluZztcblxuICByZWFkb25seSBhc3NldE5hbWVSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFzc2V0TmFtZVN1ZmZpeDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNlcnRPcmlnaW46IGFjbS5JQ2VydGlmaWNhdGU7XG5cbiAgcmVhZG9ubHkgcjUzWm9uZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcjUzWm9uZUlEOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9BOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHMzUG9saWN5QnlwYXNzUm9sZU5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHJlYWRvbmx5IGRuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNTdmNzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCBpbXBsZW1lbnRzIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHByaXZhdGUgX2RuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG4gIHB1YmxpYyBnZXQgZG5BcHBzT3JpZ2luKCk6IGFwaWd3eS5Eb21haW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZG5BcHBzT3JpZ2luO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcHMgY2Fubm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYnVja2V0QXBwcywgYnVja2V0QXBwc05hbWUsIGJ1Y2tldEFwcHNPQUksIGJ1Y2tldEFwcHNTdGFnaW5nLCBidWNrZXRBcHBzU3RhZ2luZ05hbWUgfSA9XG4gICAgICBwcm9wcy5zM0V4cG9ydHM7XG4gICAgY29uc3Qge1xuICAgICAgcjUzWm9uZUlELFxuICAgICAgcjUzWm9uZU5hbWUsXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0EsXG4gICAgICBzM1BvbGljeUJ5cGFzc1JvbGVOYW1lLFxuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcsXG4gICAgICBhcHBFbnYsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBjZXJ0T3JpZ2luLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgYXBpZ2F0ZXdheU5hbWUgPSBhc3NldE5hbWVSb290O1xuXG4gICAgLy9cbiAgICAvLyBEeW5hbW9EQiBUYWJsZVxuICAgIC8vXG4gICAgY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItdGFibGUnLCB7XG4gICAgICB0YWJsZU5hbWU6IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YCxcbiAgICAgIGJpbGxpbmdNb2RlOiBkeW5hbW9kYi5CaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ1BLJyxcbiAgICAgICAgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgc29ydEtleToge1xuICAgICAgICBuYW1lOiAnU0snLFxuICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0YWJsZS5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBEZXBsb3llciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIERlcGxveWVyIExhbWJkYSBGdW5jdGlvblxuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWROYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXItdXBsb2FkJHthc3NldE5hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNOYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXIke2Fzc2V0TmFtZVN1ZmZpeH1gO1xuICAgIGxldCBkZXBsb3llckZ1bmM6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZGVwbG95ZXJGdW5jTmFtZSxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfRU5WOiBhcHBFbnYsXG4gICAgICAgIEFQSUdXWV9OQU1FOiBhcGlnYXRld2F5TmFtZSxcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGFibGUudGFibGVOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfU1RBR0lOR19CVUNLRVQ6IGJ1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgICAgRklMRVNUT1JFX0RFU1RfQlVDS0VUOiBidWNrZXRBcHBzTmFtZSxcbiAgICAgICAgVVBMT0FEX1JPTEVfTkFNRTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLWRlcGxveWVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtZGVwbG95ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIGRlcGxveWVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3NyYy9taWNyb2FwcHMtZGVwbG95ZXIvc3JjL2luZGV4LnRzJyxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIG1pbmlmeTogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlcGxveWVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgZGVwbG95ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgLy8gR2l2ZSB0aGUgRGVwbG95ZXIgYWNjZXNzIHRvIER5bmFtb0RCIHRhYmxlXG4gICAgdGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGRlcGxveWVyRnVuYyk7XG4gICAgdGFibGUuZ3JhbnQoZGVwbG95ZXJGdW5jLCAnZHluYW1vZGI6RGVzY3JpYmVUYWJsZScpO1xuXG4gICAgLy9cbiAgICAvLyBEZWxveWVyIHVwbG9hZCB0ZW1wIHJvbGVcbiAgICAvLyBEZXBsb3llciBhc3N1bWVzIHRoaXMgcm9sZSB3aXRoIGEgbGltaXRlZCBwb2xpY3kgdG8gZ2VuZXJhdGVcbiAgICAvLyBhbiBTVFMgdGVtcCB0b2tlbiB0byByZXR1cm4gdG8gbWljcm9hcHBzLXB1Ymxpc2ggZm9yIHRoZSB1cGxvYWQuXG4gICAgLy9cbiAgICBjb25zdCBpYW1Sb2xlVXBsb2FkID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItdXBsb2FkLXJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICB1cGxvYWRQb2xpY3k6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogWydzMzpMaXN0QnVja2V0J10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogWydzMzpQdXRPYmplY3QnLCAnczM6R2V0T2JqZWN0JywgJ3MzOkFib3J0TXVsdGlwYXJ0VXBsb2FkJ10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybn0vKmBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgYXNzdW1lZEJ5OiBkZXBsb3llckZ1bmMuZ3JhbnRQcmluY2lwYWwsXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIFVwZGF0ZSBTMyBwZXJtaXNzaW9uc1xuICAgIC8vXG4gICAgLy8gRGVueSBhcHBzIGZyb20gcmVhZGluZzpcbiAgICAvLyAtIElmIHRoZXkgYXJlIG1pc3NpbmcgdGhlIG1pY3JvYXBwLW5hbWUgdGFnXG4gICAgLy8gLSBBbnl0aGluZyBvdXRzaWRlIG9mIHRoZSBmb2xkZXIgdGhhdCBtYXRjaGVzIHRoZWlyIG1pY3JvYXBwLW5hbWUgdGFnXG4gICAgY29uc3QgcG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdkZW55LXByZWZpeC1vdXRzaWRlLW1pY3JvYXBwLW5hbWUtdGFnJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgYWN0aW9uczogWydzMzoqJ10sXG4gICAgICBub3RQcmluY2lwYWxzOiBbXG4gICAgICAgIG5ldyBpYW0uQ2Fub25pY2FsVXNlclByaW5jaXBhbChcbiAgICAgICAgICBidWNrZXRBcHBzT0FJLmNsb3VkRnJvbnRPcmlnaW5BY2Nlc3NJZGVudGl0eVMzQ2Fub25pY2FsVXNlcklkLFxuICAgICAgICApLFxuICAgICAgICBuZXcgaWFtLkFjY291bnRSb290UHJpbmNpcGFsKCksXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlLyR7czNQb2xpY3lCeXBhc3NSb2xlTmFtZX1gKSxcbiAgICAgICAgZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgICAgICAvLyBBbGxvdyB0aGUgYnVpbGRlciB1c2VyIHRvIHVwZGF0ZSB0aGUgYnVja2V0c1xuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChcbiAgICAgICAgICBgYXJuOmF3czppYW06OiR7YWNjb3VudH06dXNlci8ke2Fzc2V0TmFtZVJvb3R9LWJ1aWxkZXItJHtwcm9wcy5hcHBFbnZ9YCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICBub3RSZXNvdXJjZXM6IFtcbiAgICAgICAgYCR7YnVja2V0QXBwcy5idWNrZXRBcm59L1xcJHthd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWV9LypgLFxuICAgICAgICBidWNrZXRBcHBzLmJ1Y2tldEFybixcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIE51bGw6IHsgJ2F3czpQcmluY2lwYWxUYWcvbWljcm9hcHAtbmFtZSc6ICdmYWxzZScgfSxcbiAgICAgICAgLy8gU3RyaW5nTm90TGlrZTogeydhd3M6J31cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZy5hZGRDb25kaXRpb24oXG4gICAgICAgIC8vIEFsbG93cyB0aGUgRGVsZXRhYmxlQnVja2V0IExhbWJkYSB0byBkZWxldGUgaXRlbXMgaW4gdGhlIGJ1Y2tldHNcbiAgICAgICAgJ1N0cmluZ05vdExpa2UnLFxuICAgICAgICB7ICdhd3M6UHJpbmNpcGFsVGFnL2FwcGxpY2F0aW9uJzogYCR7YXNzZXROYW1lUm9vdH0tY29yZSpgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3lEZW55TWlzc2luZ1RhZyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2RlbnktbWlzc2luZy1taWNyb2FwcC1uYW1lLXRhZycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgbm90UHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IGlhbS5BY2NvdW50Um9vdFByaW5jaXBhbCgpLFxuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS8ke3MzUG9saWN5QnlwYXNzUm9sZU5hbWV9YCksXG4gICAgICAgIGRlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6c3RzOjoke2FjY291bnR9OmFzc3VtZWQtcm9sZS8ke2RlcGxveWVyRnVuYz8ucm9sZT8ucm9sZU5hbWV9LyR7ZGVwbG95ZXJGdW5jLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgICApLFxuICAgICAgICAvLyBBbGxvdyB0aGUgYnVpbGRlciB1c2VyIHRvIHVwZGF0ZSB0aGUgYnVja2V0c1xuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChcbiAgICAgICAgICBgYXJuOmF3czppYW06OiR7YWNjb3VudH06dXNlci8ke2Fzc2V0TmFtZVJvb3R9LWJ1aWxkZXItJHtwcm9wcy5hcHBFbnZ9YCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHMuYnVja2V0QXJuXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgTnVsbDogeyAnYXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lJzogJ3RydWUnIH0sXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgQVJPQSBtdXN0IGJlIHNwZWNpZmllZCB0byBwcmV2ZW50IHRoaXMgcG9saWN5IGZyb20gbG9ja2luZ1xuICAgICAgICAvLyBvdXQgbm9uLXJvb3Qgc2Vzc2lvbnMgdGhhdCBoYXZlIGFzc3VtZWQgdGhlIGFkbWluIHJvbGUuXG4gICAgICAgIC8vIFRoZSBub3RQcmluY2lwYWxzIHdpbGwgb25seSBtYXRjaCB0aGUgcm9sZSBuYW1lIGV4YWN0bHkgYW5kIHdpbGwgbm90IG1hdGNoXG4gICAgICAgIC8vIGFueSBzZXNzaW9uIHRoYXQgaGFzIGFzc3VtZWQgdGhlIHJvbGUgc2luY2Ugbm90UHJpbmNpcGFscyBkb2VzIG5vdCBhbGxvd1xuICAgICAgICAvLyB3aWxkY2FyZCBtYXRjaGVzIGFuZCBkb2VzIG5vdCBkbyB0aGVtIGltcGxpY2l0bHkgZWl0aGVyLlxuICAgICAgICAvLyBUaGUgQVJPQSBtdXN0IGJlIHVhc2VkIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgMyBQcmluY2lwYWwgdmFyaWFibGVzOlxuICAgICAgICAvLyAgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc192YXJpYWJsZXMuaHRtbCNwcmluY2lwYWx0YWJsZVxuICAgICAgICAvLyAgYXdzOnVzZXJuYW1lLCBhd3M6dXNlcmlkLCBhd3M6UHJpbmNpcGFsVGFnXG4gICAgICAgIC8vIEZvciBhbiBhc3N1bWVkIHJvbGUsIGF3czp1c2VybmFtZSBpcyBibGFuaywgYXdzOnVzZXJpZCBpczpcbiAgICAgICAgLy8gIFt1bmlxdWUgaWQgQUtBIEFST0EgZm9yIFJvbGVdOltzZXNzaW9uIG5hbWVdXG4gICAgICAgIC8vIFRhYmxlIG9mIHVuaXF1ZSBJRCBwcmVmaXhlcyBzdWNoIGFzIEFST0E6XG4gICAgICAgIC8vICBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lkZW50aWZpZXJzLmh0bWwjaWRlbnRpZmllcnMtcHJlZml4ZXNcbiAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMgc2ltcGx5IG5vdCBhdmFpbGFibGUgYW5kIGlmIGl0IHdhc1xuICAgICAgICAvLyB3ZSdkIG5lZWQgdG8gd3JpdGUgYSBjb21wbGljYXRlZCBjb21wYXJpc29uIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGRpZG4ndCBleGNsdWRlIHRoZSBEZW55IHRhZyBmcm9tIHJvbGVzIGluIG90aGVyIGFjY291bnRzLlxuICAgICAgICBTdHJpbmdOb3RMaWtlOiB7ICdhd3M6dXNlcmlkJzogW2Ake3MzUG9saWN5QnlwYXNzQVJPQX06KmAsIGFjY291bnRdIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcG9saWN5RGVueU1pc3NpbmdUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Fzc2V0TmFtZVJvb3R9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5Q2xvdWRGcm9udEFjY2VzcyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2Nsb3VkZnJvbnQtb2FpLWFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCddLFxuICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGlmIChidWNrZXRBcHBzLnBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkb2N1bWVudCA9IG5ldyBzMy5CdWNrZXRQb2xpY3kodGhpcywgJ0NGUG9saWN5Jywge1xuICAgICAgICBidWNrZXQ6IGJ1Y2tldEFwcHMsXG4gICAgICB9KS5kb2N1bWVudDtcbiAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5Q2xvdWRGcm9udEFjY2Vzcyk7XG4gICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnKTtcbiAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueU1pc3NpbmdUYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeUNsb3VkRnJvbnRBY2Nlc3MpO1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZyk7XG4gICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgTGFtYmRhIHRvIHJlYWQgZnJvbSB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkTGlzdFN0YWdpbmcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAvLyBGSVhNRTogQWxsb3cgRGVwbG95ZXIgdG8gZGVsZXRlIGZyb20gU3RhZ2luZyBidWNrZXRcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkTGlzdFN0YWdpbmcpO1xuXG4gICAgLy8gQWxsb3cgdGhlIExhbWJkYSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IGJ1Y2tldFxuICAgIGNvbnN0IHBvbGljeVJlYWRXcml0ZUxpc3RUYXJnZXQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCcsICdzMzpQdXRPYmplY3QnLCAnczM6TGlzdEJ1Y2tldCddLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzLmJ1Y2tldEFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkV3JpdGVMaXN0VGFyZ2V0KTtcblxuICAgIC8vIEFsbG93IHRoZSBkZXBsb3llciB0byBnZXQgYSB0ZW1wb3JhcnkgU1RTIHRva2VuXG4gICAgY29uc3QgcG9saWN5R2V0U1RTVG9rZW4gPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3N0czpHZXRGZWRlcmF0aW9uVG9rZW4nXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lHZXRTVFNUb2tlbik7XG5cbiAgICAvLyBBbGxvdyB0aGUgZGVwbG95ZXIgdG8gYXNzdW1lIHRoZSB1cGxvYWQgcm9sZVxuICAgIGNvbnN0IHBvbGljeUFzc3VtZVVwbG9hZCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgICAgIHJlc291cmNlczogW2lhbVJvbGVVcGxvYWQucm9sZUFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lBc3N1bWVVcGxvYWQpO1xuXG4gICAgLy9cbiAgICAvLyBSb3V0ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgLy9cblxuICAgIC8vIENyZWF0ZSBSb3V0ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgbGV0IHJvdXRlckZ1bmM6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICBjb25zdCByb3V0ZXJGdW5jUHJvcHM6IE9taXQ8bGFtYmRhLkZ1bmN0aW9uUHJvcHMsICdoYW5kbGVyJyB8ICdjb2RlJz4gPSB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGAke2Fzc2V0TmFtZVJvb3R9LXJvdXRlciR7YXNzZXROYW1lU3VmZml4fWAsXG4gICAgICBtZW1vcnlTaXplOiAxMDI0LFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX0VOVjogYXBwRW52LFxuICAgICAgICBEQVRBQkFTRV9UQUJMRV9OQU1FOiB0YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLXJvdXRlci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBsb2NhbCBkZXZcbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtcm91dGVyL2ApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLXJvdXRlci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLXJvdXRlci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgTGF5ZXJcbiAgICAgIGNvbnN0IHJvdXRlckRhdGFGaWxlcyA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWxheWVyJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoJy4vc3JjL21pY3JvYXBwcy1yb3V0ZXIvdGVtcGxhdGVzLycpLFxuICAgICAgfSk7XG4gICAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgICAgcm91dGVyRGF0YUZpbGVzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICAgIH1cblxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3NyYy9taWNyb2FwcHMtcm91dGVyL3NyYy9pbmRleC50cycsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsYXllcnM6IFtyb3V0ZXJEYXRhRmlsZXNdLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByb3V0ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5UmVhZFRhcmdldCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgcm91dGVyIG9mIFtyb3V0ZXJGdW5jXSkge1xuICAgICAgcm91dGVyLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkVGFyZ2V0KTtcbiAgICAgIC8vIEdpdmUgdGhlIFJvdXRlciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICAgIHRhYmxlLmdyYW50UmVhZERhdGEocm91dGVyKTtcbiAgICAgIHRhYmxlLmdyYW50KHJvdXRlciwgJ2R5bmFtb2RiOkRlc2NyaWJlVGFibGUnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBZGQgTGFzdCBSb3V0ZSBmb3IgLyove3Byb3h5K31cbiAgICAvLyBOb3RlOiBUaGF0IG1pZ2h0IG5vdCB3b3JrLCBtYXkgbmVlZCBhIEJlaGF2aW9yIGluIENsb3VkRnJvbnRcbiAgICAvLyAgICAgICBvciBhIExhbWJkYSBAIEVkZ2UgZnVuY3Rpb24gdGhhdCBkZXRlY3RzIHRoZXNlIGFuZCByb3V0ZXNcbiAgICAvLyAgICAgICB0byBvcmlnaW4gTGFtYmRhIFJvdXRlciBmdW5jdGlvbi5cblxuICAgIC8vXG4gICAgLy8gQVBJR2F0ZXdheSBkb21haW4gbmFtZXMgZm9yIENsb3VkRnJvbnQgYW5kIG9yaWdpblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgQ3VzdG9tIERvbWFpbnMgZm9yIEFQSSBHYXRld2F5XG4gICAgY29uc3QgZG5BcHBzRWRnZSA9IG5ldyBhcGlnd3kuRG9tYWluTmFtZSh0aGlzLCAnbWljcm9hcHBzLWFwcHMtZWRnZS1kbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkbkFwcHNFZGdlLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgdGhpcy5fZG5BcHBzT3JpZ2luID0gbmV3IGFwaWd3eS5Eb21haW5OYW1lKHRoaXMsICdtaWNyb2FwcHMtYXBwcy1vcmlnaW4tZG4nLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0aGlzLl9kbkFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlZ3JhdGlvbiBmb3IgdGhlIFJvdXRlclxuICAgIC8vIERvIHRoaXMgaGVyZSBzaW5jZSBpdCdzIHRoZSBkZWZhdWx0IHJvdXRlXG4gICAgY29uc3QgaW50Um91dGVyID0gbmV3IGFwaWd3eWludC5MYW1iZGFQcm94eUludGVncmF0aW9uKHtcbiAgICAgIGhhbmRsZXI6IHJvdXRlckZ1bmMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQVBJR2F0ZXdheSBmb3IgdGhlIEVkZ2UgbmFtZVxuICAgIGNvbnN0IGh0dHBBcGlEb21haW5NYXBwaW5nOiBhcGlnd3kuRG9tYWluTWFwcGluZ09wdGlvbnMgPSB7XG4gICAgICBkb21haW5OYW1lOiBkbkFwcHNFZGdlLFxuICAgIH07XG4gICAgY29uc3QgaHR0cEFwaSA9IG5ldyBhcGlnd3kuSHR0cEFwaSh0aGlzLCAnbWljcm9hcHBzLWFwaScsIHtcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiBodHRwQXBpRG9tYWluTWFwcGluZyxcbiAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogaW50Um91dGVyLFxuICAgICAgYXBpTmFtZTogYXBpZ2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBodHRwQXBpLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIExldCBBUEkgR2F0ZXdheSBhY2NlcHQgcmVxdWVzdHMgdXNpbmcgZG9tYWluTmFtZU9yaWdpblxuICAgIC8vIFRoYXQgaXMgdGhlIG9yaWdpbiBVUkkgdGhhdCBDbG91ZEZyb250IHVzZXMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICAvLyBUaGUgZ2F0ZXdheSB3aWxsIHJlZnVzZSB0aGUgdHJhZmZpYyBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlXG4gICAgLy8gZG9tYWluIG5hbWUgcmVnaXN0ZXJlZC5cbiAgICAvL1xuICAgIGNvbnN0IG1hcHBpbmdBcHBzQXBpcyA9IG5ldyBhcGlnd3kuQXBpTWFwcGluZyh0aGlzLCAnbWljcm9hcHBzLWFwaS1tYXBwaW5nLW9yaWdpbicsIHtcbiAgICAgIGFwaTogaHR0cEFwaSxcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMuZG5BcHBzT3JpZ2luLFxuICAgIH0pO1xuICAgIG1hcHBpbmdBcHBzQXBpcy5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kbkFwcHNPcmlnaW4pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgbWFwcGluZ0FwcHNBcGlzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEdpdmUgRGVwbG95ZXIgcGVybWlzc2lvbnMgdG8gY3JlYXRlIHJvdXRlcyBhbmQgaW50ZWdyYXRpb25zXG4gICAgLy8gb24gdGhlIEFQSSBHYXRld2F5IEFQSS5cbiAgICAvL1xuXG4gICAgLy8gR3JhbnQgdGhlIGFiaWxpdHkgdG8gTGlzdCBhbGwgQVBJcyAod2UgaGF2ZSB0byBmaW5kIGl0KVxuICAgIGNvbnN0IHBvbGljeUFQSUxpc3QgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2FwaWdhdGV3YXk6R0VUJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTo6L2FwaXNgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSUxpc3QpO1xuICAgIC8vIEdyYW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBBUEkgd2UgY3JlYXRlZFxuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06JHthY2NvdW50fToke2h0dHBBcGkuaHR0cEFwaUlkfS8qYCxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L2ludGVncmF0aW9uc2AsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OjovYXBpcy8ke2h0dHBBcGkuaHR0cEFwaUlkfS9yb3V0ZXNgLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZSk7XG4gICAgLy8gR3JhbnQgZnVsbCBjb250cm9sIG92ZXIgbGFtYmRhcyB0aGF0IGluZGljYXRlIHRoZXkgYXJlIG1pY3JvYXBwc1xuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZUxhbWJkYXMgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6bGFtYmRhOiR7cmVnaW9ufToke2FjY291bnR9OmZ1bmN0aW9uOipgLFxuICAgICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259OiR7YWNjb3VudH06ZnVuY3Rpb246KjoqYCxcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsc0lmRXhpc3RzOiB7ICdhd3M6UmVzb3VyY2VUYWcvbWljcm9hcHAtbWFuYWdlZCc6ICd0cnVlJyB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZUxhbWJkYXMpO1xuXG4gICAgLy9cbiAgICAvLyBDcmVhdGUgdGhlIG9yaWdpbiBuYW1lIGZvciBBUEkgR2F0ZXdheVxuICAgIC8vXG5cbiAgICBjb25zdCB6b25lID0gcjUzLkhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsICdtaWNyb2FwcHMtem9uZScsIHtcbiAgICAgIHpvbmVOYW1lOiByNTNab25lTmFtZSxcbiAgICAgIGhvc3RlZFpvbmVJZDogcjUzWm9uZUlELFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnJBcHBzT3JpZ2luID0gbmV3IHI1My5BUmVjb3JkKHRoaXMsICdtaWNyb2FwcHMtb3JpZ2luLWFyZWNvcmQnLCB7XG4gICAgICB6b25lOiB6b25lLFxuICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyByNTN0YXJnZXRzLkFwaUdhdGV3YXl2MkRvbWFpblByb3BlcnRpZXMoXG4gICAgICAgICAgdGhpcy5fZG5BcHBzT3JpZ2luLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLl9kbkFwcHNPcmlnaW4ucmVnaW9uYWxIb3N0ZWRab25lSWQsXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcnJBcHBzT3JpZ2luLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFDN0Isb0RBQW9EO0FBQ3BELG9FQUFvRTtBQUVwRSxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QywyREFBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLHFDQUFxQztBQWtDckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNOUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUErQjs7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEdBQzNGLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEIsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sYUFBYSxFQUNiLGVBQWUsR0FDaEIsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFFckMsRUFBRTtRQUNGLGlCQUFpQjtRQUNqQixFQUFFO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUMvRCxTQUFTLEVBQUUs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NUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNoQyxJQUFJLFVBQVUsQ0FBQyw0QkFBNEIsQ0FDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDeEMsQ0FDRjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksb0JBQW9CLEVBQUU7WUFDeEIsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBemNELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQXdjRjtBQTVjRCxzQ0E0Y0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaWd3eSBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGFwaWd3eWludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdAYXdzLWNkay9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ0Bhd3MtY2RrL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnQGF3cy1jZGsvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgcjUzIGZyb20gJ0Bhd3MtY2RrL2F3cy1yb3V0ZTUzJztcbmltcG9ydCAqIGFzIHI1M3RhcmdldHMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdAYXdzLWNkay9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc0NGRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzQ0YnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc1MzRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzUzMnO1xuXG5pbnRlcmZhY2UgTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMgZXh0ZW5kcyBjZGsuUmVzb3VyY2VQcm9wcyB7XG4gIHJlYWRvbmx5IGNmU3RhY2tFeHBvcnRzOiBJTWljcm9BcHBzQ0ZFeHBvcnRzO1xuICByZWFkb25seSBzM0V4cG9ydHM6IElNaWNyb0FwcHNTM0V4cG9ydHM7XG5cbiAgcmVhZG9ubHkgYXBwRW52OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nOiBib29sZWFuO1xuICByZWFkb25seSByZXZlcnNlRG9tYWluTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVPcmlnaW46IHN0cmluZztcblxuICByZWFkb25seSBhc3NldE5hbWVSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFzc2V0TmFtZVN1ZmZpeDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNlcnRPcmlnaW46IGFjbS5JQ2VydGlmaWNhdGU7XG5cbiAgcmVhZG9ubHkgcjUzWm9uZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcjUzWm9uZUlEOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9BOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHMzUG9saWN5QnlwYXNzUm9sZU5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHJlYWRvbmx5IGRuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNTdmNzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCBpbXBsZW1lbnRzIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHByaXZhdGUgX2RuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG4gIHB1YmxpYyBnZXQgZG5BcHBzT3JpZ2luKCk6IGFwaWd3eS5Eb21haW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZG5BcHBzT3JpZ2luO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcHMgY2Fubm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYnVja2V0QXBwcywgYnVja2V0QXBwc05hbWUsIGJ1Y2tldEFwcHNPQUksIGJ1Y2tldEFwcHNTdGFnaW5nLCBidWNrZXRBcHBzU3RhZ2luZ05hbWUgfSA9XG4gICAgICBwcm9wcy5zM0V4cG9ydHM7XG4gICAgY29uc3Qge1xuICAgICAgcjUzWm9uZUlELFxuICAgICAgcjUzWm9uZU5hbWUsXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0EsXG4gICAgICBzM1BvbGljeUJ5cGFzc1JvbGVOYW1lLFxuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcsXG4gICAgICBhcHBFbnYsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBjZXJ0T3JpZ2luLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgYXBpZ2F0ZXdheU5hbWUgPSBhc3NldE5hbWVSb290O1xuXG4gICAgLy9cbiAgICAvLyBEeW5hbW9EQiBUYWJsZVxuICAgIC8vXG4gICAgY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItdGFibGUnLCB7XG4gICAgICB0YWJsZU5hbWU6IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YCxcbiAgICAgIGJpbGxpbmdNb2RlOiBkeW5hbW9kYi5CaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ1BLJyxcbiAgICAgICAgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgc29ydEtleToge1xuICAgICAgICBuYW1lOiAnU0snLFxuICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0YWJsZS5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBEZXBsb3llciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIERlcGxveWVyIExhbWJkYSBGdW5jdGlvblxuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWROYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXItdXBsb2FkJHthc3NldE5hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNOYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXIke2Fzc2V0TmFtZVN1ZmZpeH1gO1xuICAgIGxldCBkZXBsb3llckZ1bmM6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZGVwbG95ZXJGdW5jTmFtZSxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfRU5WOiBhcHBFbnYsXG4gICAgICAgIEFQSUdXWV9OQU1FOiBhcGlnYXRld2F5TmFtZSxcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGFibGUudGFibGVOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfU1RBR0lOR19CVUNLRVQ6IGJ1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgICAgRklMRVNUT1JFX0RFU1RfQlVDS0VUOiBidWNrZXRBcHBzTmFtZSxcbiAgICAgICAgVVBMT0FEX1JPTEVfTkFNRTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLWRlcGxveWVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtZGVwbG95ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIGRlcGxveWVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3BhY2thZ2VzL21pY3JvYXBwcy1kZXBsb3llci9zcmMvaW5kZXgudHMnLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgbWluaWZ5OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkZXBsb3llckZ1bmMuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgICAvLyBHaXZlIHRoZSBEZXBsb3llciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICB0YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZGVwbG95ZXJGdW5jKTtcbiAgICB0YWJsZS5ncmFudChkZXBsb3llckZ1bmMsICdkeW5hbW9kYjpEZXNjcmliZVRhYmxlJyk7XG5cbiAgICAvL1xuICAgIC8vIERlbG95ZXIgdXBsb2FkIHRlbXAgcm9sZVxuICAgIC8vIERlcGxveWVyIGFzc3VtZXMgdGhpcyByb2xlIHdpdGggYSBsaW1pdGVkIHBvbGljeSB0byBnZW5lcmF0ZVxuICAgIC8vIGFuIFNUUyB0ZW1wIHRva2VuIHRvIHJldHVybiB0byBtaWNyb2FwcHMtcHVibGlzaCBmb3IgdGhlIHVwbG9hZC5cbiAgICAvL1xuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWQgPSBuZXcgaWFtLlJvbGUodGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci11cGxvYWQtcm9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiBpYW1Sb2xlVXBsb2FkTmFtZSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIHVwbG9hZFBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJuXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3MzOlB1dE9iamVjdCcsICdzMzpHZXRPYmplY3QnLCAnczM6QWJvcnRNdWx0aXBhcnRVcGxvYWQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IGRlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy8gVXBkYXRlIFMzIHBlcm1pc3Npb25zXG4gICAgLy9cbiAgICAvLyBEZW55IGFwcHMgZnJvbSByZWFkaW5nOlxuICAgIC8vIC0gSWYgdGhleSBhcmUgbWlzc2luZyB0aGUgbWljcm9hcHAtbmFtZSB0YWdcbiAgICAvLyAtIEFueXRoaW5nIG91dHNpZGUgb2YgdGhlIGZvbGRlciB0aGF0IG1hdGNoZXMgdGhlaXIgbWljcm9hcHAtbmFtZSB0YWdcbiAgICBjb25zdCBwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2RlbnktcHJlZml4LW91dHNpZGUtbWljcm9hcHAtbmFtZS10YWcnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICBhY3Rpb25zOiBbJ3MzOionXSxcbiAgICAgIG5vdFByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICAgIG5ldyBpYW0uQWNjb3VudFJvb3RQcmluY2lwYWwoKSxcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoYGFybjphd3M6aWFtOjoke2FjY291bnR9OnJvbGUvJHtzM1BvbGljeUJ5cGFzc1JvbGVOYW1lfWApLFxuICAgICAgICBkZXBsb3llckZ1bmMuZ3JhbnRQcmluY2lwYWwsXG4gICAgICAgIC8vIEFsbG93IHRoZSBidWlsZGVyIHVzZXIgdG8gdXBkYXRlIHRoZSBidWNrZXRzXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKFxuICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTp1c2VyLyR7YXNzZXROYW1lUm9vdH0tYnVpbGRlci0ke3Byb3BzLmFwcEVudn1gLFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIG5vdFJlc291cmNlczogW1xuICAgICAgICBgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vXFwke2F3czpQcmluY2lwYWxUYWcvbWljcm9hcHAtbmFtZX0vKmAsXG4gICAgICAgIGJ1Y2tldEFwcHMuYnVja2V0QXJuLFxuICAgICAgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgTnVsbDogeyAnYXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lJzogJ2ZhbHNlJyB9LFxuICAgICAgICAvLyBTdHJpbmdOb3RMaWtlOiB7J2F3czonfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnLmFkZENvbmRpdGlvbihcbiAgICAgICAgLy8gQWxsb3dzIHRoZSBEZWxldGFibGVCdWNrZXQgTGFtYmRhIHRvIGRlbGV0ZSBpdGVtcyBpbiB0aGUgYnVja2V0c1xuICAgICAgICAnU3RyaW5nTm90TGlrZScsXG4gICAgICAgIHsgJ2F3czpQcmluY2lwYWxUYWcvYXBwbGljYXRpb24nOiBgJHthc3NldE5hbWVSb290fS1jb3JlKmAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBvbGljeURlbnlNaXNzaW5nVGFnID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnZGVueS1taXNzaW5nLW1pY3JvYXBwLW5hbWUtdGFnJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgYWN0aW9uczogWydzMzoqJ10sXG4gICAgICBub3RQcmluY2lwYWxzOiBbXG4gICAgICAgIG5ldyBpYW0uQ2Fub25pY2FsVXNlclByaW5jaXBhbChcbiAgICAgICAgICBidWNrZXRBcHBzT0FJLmNsb3VkRnJvbnRPcmlnaW5BY2Nlc3NJZGVudGl0eVMzQ2Fub25pY2FsVXNlcklkLFxuICAgICAgICApLFxuICAgICAgICBuZXcgaWFtLkFjY291bnRSb290UHJpbmNpcGFsKCksXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlLyR7czNQb2xpY3lCeXBhc3NSb2xlTmFtZX1gKSxcbiAgICAgICAgZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChcbiAgICAgICAgICBgYXJuOmF3czpzdHM6OiR7YWNjb3VudH06YXNzdW1lZC1yb2xlLyR7ZGVwbG95ZXJGdW5jPy5yb2xlPy5yb2xlTmFtZX0vJHtkZXBsb3llckZ1bmMuZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgICksXG4gICAgICAgIC8vIEFsbG93IHRoZSBidWlsZGVyIHVzZXIgdG8gdXBkYXRlIHRoZSBidWNrZXRzXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKFxuICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTp1c2VyLyR7YXNzZXROYW1lUm9vdH0tYnVpbGRlci0ke3Byb3BzLmFwcEVudn1gLFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwcy5idWNrZXRBcm5dLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBOdWxsOiB7ICdhd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWUnOiAndHJ1ZScgfSxcbiAgICAgICAgLy8gTm90ZTogVGhpcyBBUk9BIG11c3QgYmUgc3BlY2lmaWVkIHRvIHByZXZlbnQgdGhpcyBwb2xpY3kgZnJvbSBsb2NraW5nXG4gICAgICAgIC8vIG91dCBub24tcm9vdCBzZXNzaW9ucyB0aGF0IGhhdmUgYXNzdW1lZCB0aGUgYWRtaW4gcm9sZS5cbiAgICAgICAgLy8gVGhlIG5vdFByaW5jaXBhbHMgd2lsbCBvbmx5IG1hdGNoIHRoZSByb2xlIG5hbWUgZXhhY3RseSBhbmQgd2lsbCBub3QgbWF0Y2hcbiAgICAgICAgLy8gYW55IHNlc3Npb24gdGhhdCBoYXMgYXNzdW1lZCB0aGUgcm9sZSBzaW5jZSBub3RQcmluY2lwYWxzIGRvZXMgbm90IGFsbG93XG4gICAgICAgIC8vIHdpbGRjYXJkIG1hdGNoZXMgYW5kIGRvZXMgbm90IGRvIHRoZW0gaW1wbGljaXRseSBlaXRoZXIuXG4gICAgICAgIC8vIFRoZSBBUk9BIG11c3QgYmUgdWFzZWQgYmVjYXVzZSB0aGVyZSBhcmUgb25seSAzIFByaW5jaXBhbCB2YXJpYWJsZXM6XG4gICAgICAgIC8vICBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX3ZhcmlhYmxlcy5odG1sI3ByaW5jaXBhbHRhYmxlXG4gICAgICAgIC8vICBhd3M6dXNlcm5hbWUsIGF3czp1c2VyaWQsIGF3czpQcmluY2lwYWxUYWdcbiAgICAgICAgLy8gRm9yIGFuIGFzc3VtZWQgcm9sZSwgYXdzOnVzZXJuYW1lIGlzIGJsYW5rLCBhd3M6dXNlcmlkIGlzOlxuICAgICAgICAvLyAgW3VuaXF1ZSBpZCBBS0EgQVJPQSBmb3IgUm9sZV06W3Nlc3Npb24gbmFtZV1cbiAgICAgICAgLy8gVGFibGUgb2YgdW5pcXVlIElEIHByZWZpeGVzIHN1Y2ggYXMgQVJPQTpcbiAgICAgICAgLy8gIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfaWRlbnRpZmllcnMuaHRtbCNpZGVudGlmaWVycy1wcmVmaXhlc1xuICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcm9sZSBpcyBzaW1wbHkgbm90IGF2YWlsYWJsZSBhbmQgaWYgaXQgd2FzXG4gICAgICAgIC8vIHdlJ2QgbmVlZCB0byB3cml0ZSBhIGNvbXBsaWNhdGVkIGNvbXBhcmlzb24gdG8gbWFrZSBzdXJlXG4gICAgICAgIC8vIHRoYXQgd2UgZGlkbid0IGV4Y2x1ZGUgdGhlIERlbnkgdGFnIGZyb20gcm9sZXMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAgICAgIFN0cmluZ05vdExpa2U6IHsgJ2F3czp1c2VyaWQnOiBbYCR7czNQb2xpY3lCeXBhc3NBUk9BfToqYCwgYWNjb3VudF0gfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBwb2xpY3lEZW55TWlzc2luZ1RhZy5hZGRDb25kaXRpb24oXG4gICAgICAgIC8vIEFsbG93cyB0aGUgRGVsZXRhYmxlQnVja2V0IExhbWJkYSB0byBkZWxldGUgaXRlbXMgaW4gdGhlIGJ1Y2tldHNcbiAgICAgICAgJ1N0cmluZ05vdExpa2UnLFxuICAgICAgICB7ICdhd3M6UHJpbmNpcGFsVGFnL2FwcGxpY2F0aW9uJzogYCR7YXNzZXROYW1lUm9vdH0tY29yZSpgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3lDbG91ZEZyb250QWNjZXNzID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnY2xvdWRmcm9udC1vYWktYWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgIG5ldyBpYW0uQ2Fub25pY2FsVXNlclByaW5jaXBhbChcbiAgICAgICAgICBidWNrZXRBcHBzT0FJLmNsb3VkRnJvbnRPcmlnaW5BY2Nlc3NJZGVudGl0eVMzQ2Fub25pY2FsVXNlcklkLFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYF0sXG4gICAgfSk7XG4gICAgaWYgKGJ1Y2tldEFwcHMucG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gbmV3IHMzLkJ1Y2tldFBvbGljeSh0aGlzLCAnQ0ZQb2xpY3knLCB7XG4gICAgICAgIGJ1Y2tldDogYnVja2V0QXBwcyxcbiAgICAgIH0pLmRvY3VtZW50O1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcbiAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lEZW55TWlzc2luZ1RhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Y2tldEFwcHMucG9saWN5LmRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5Q2xvdWRGcm9udEFjY2Vzcyk7XG4gICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnKTtcbiAgICAgIGJ1Y2tldEFwcHMucG9saWN5LmRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueU1pc3NpbmdUYWcpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHRoZSBMYW1iZGEgdG8gcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgIGNvbnN0IHBvbGljeVJlYWRMaXN0U3RhZ2luZyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIC8vIEZJWE1FOiBBbGxvdyBEZXBsb3llciB0byBkZWxldGUgZnJvbSBTdGFnaW5nIGJ1Y2tldFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnLCAnczM6TGlzdEJ1Y2tldCddLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJuXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeVJlYWRMaXN0U3RhZ2luZyk7XG5cbiAgICAvLyBBbGxvdyB0aGUgTGFtYmRhIHRvIHdyaXRlIHRvIHRoZSB0YXJnZXQgYnVja2V0XG4gICAgY29uc3QgcG9saWN5UmVhZFdyaXRlTGlzdFRhcmdldCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0JywgJ3MzOlB1dE9iamVjdCcsICdzMzpMaXN0QnVja2V0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHMuYnVja2V0QXJuXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeVJlYWRXcml0ZUxpc3RUYXJnZXQpO1xuXG4gICAgLy8gQWxsb3cgdGhlIGRlcGxveWVyIHRvIGdldCBhIHRlbXBvcmFyeSBTVFMgdG9rZW5cbiAgICBjb25zdCBwb2xpY3lHZXRTVFNUb2tlbiA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3RzOkdldEZlZGVyYXRpb25Ub2tlbiddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUdldFNUU1Rva2VuKTtcblxuICAgIC8vIEFsbG93IHRoZSBkZXBsb3llciB0byBhc3N1bWUgdGhlIHVwbG9hZCByb2xlXG4gICAgY29uc3QgcG9saWN5QXNzdW1lVXBsb2FkID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzdHM6QXNzdW1lUm9sZSddLFxuICAgICAgcmVzb3VyY2VzOiBbaWFtUm9sZVVwbG9hZC5yb2xlQXJuXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFzc3VtZVVwbG9hZCk7XG5cbiAgICAvL1xuICAgIC8vIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICBsZXQgcm91dGVyRnVuYzogbGFtYmRhLkZ1bmN0aW9uO1xuICAgIGNvbnN0IHJvdXRlckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYCR7YXNzZXROYW1lUm9vdH0tcm91dGVyJHthc3NldE5hbWVTdWZmaXh9YCxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfRU5WOiBhcHBFbnYsXG4gICAgICAgIERBVEFCQVNFX1RBQkxFX05BTUU6IHRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtcm91dGVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS8uLi9kaXN0L21pY3JvYXBwcy1yb3V0ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4ucm91dGVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChleGlzdHNTeW5jKGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS9taWNyb2FwcHMtcm91dGVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1aWx0IGFwcHMgcGFja2FnZWQgd2l0aCB0aGUgQ0RLIGNvbnN0cnVjdFxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS9taWNyb2FwcHMtcm91dGVyL2ApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgUm91dGVyIExhbWJkYSBMYXllclxuICAgICAgY29uc3Qgcm91dGVyRGF0YUZpbGVzID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItbGF5ZXInLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldCgnLi9wYWNrYWdlcy9taWNyb2FwcHMtcm91dGVyL3RlbXBsYXRlcy8nKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICAgIHJvdXRlckRhdGFGaWxlcy5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgICB9XG5cbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGVudHJ5OiAnLi9wYWNrYWdlcy9taWNyb2FwcHMtcm91dGVyL3NyYy9pbmRleC50cycsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsYXllcnM6IFtyb3V0ZXJEYXRhRmlsZXNdLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByb3V0ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5UmVhZFRhcmdldCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgcm91dGVyIG9mIFtyb3V0ZXJGdW5jXSkge1xuICAgICAgcm91dGVyLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkVGFyZ2V0KTtcbiAgICAgIC8vIEdpdmUgdGhlIFJvdXRlciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICAgIHRhYmxlLmdyYW50UmVhZERhdGEocm91dGVyKTtcbiAgICAgIHRhYmxlLmdyYW50KHJvdXRlciwgJ2R5bmFtb2RiOkRlc2NyaWJlVGFibGUnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBZGQgTGFzdCBSb3V0ZSBmb3IgLyove3Byb3h5K31cbiAgICAvLyBOb3RlOiBUaGF0IG1pZ2h0IG5vdCB3b3JrLCBtYXkgbmVlZCBhIEJlaGF2aW9yIGluIENsb3VkRnJvbnRcbiAgICAvLyAgICAgICBvciBhIExhbWJkYSBAIEVkZ2UgZnVuY3Rpb24gdGhhdCBkZXRlY3RzIHRoZXNlIGFuZCByb3V0ZXNcbiAgICAvLyAgICAgICB0byBvcmlnaW4gTGFtYmRhIFJvdXRlciBmdW5jdGlvbi5cblxuICAgIC8vXG4gICAgLy8gQVBJR2F0ZXdheSBkb21haW4gbmFtZXMgZm9yIENsb3VkRnJvbnQgYW5kIG9yaWdpblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgQ3VzdG9tIERvbWFpbnMgZm9yIEFQSSBHYXRld2F5XG4gICAgY29uc3QgZG5BcHBzRWRnZSA9IG5ldyBhcGlnd3kuRG9tYWluTmFtZSh0aGlzLCAnbWljcm9hcHBzLWFwcHMtZWRnZS1kbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkbkFwcHNFZGdlLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgdGhpcy5fZG5BcHBzT3JpZ2luID0gbmV3IGFwaWd3eS5Eb21haW5OYW1lKHRoaXMsICdtaWNyb2FwcHMtYXBwcy1vcmlnaW4tZG4nLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0aGlzLl9kbkFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlZ3JhdGlvbiBmb3IgdGhlIFJvdXRlclxuICAgIC8vIERvIHRoaXMgaGVyZSBzaW5jZSBpdCdzIHRoZSBkZWZhdWx0IHJvdXRlXG4gICAgY29uc3QgaW50Um91dGVyID0gbmV3IGFwaWd3eWludC5MYW1iZGFQcm94eUludGVncmF0aW9uKHtcbiAgICAgIGhhbmRsZXI6IHJvdXRlckZ1bmMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQVBJR2F0ZXdheSBmb3IgdGhlIEVkZ2UgbmFtZVxuICAgIGNvbnN0IGh0dHBBcGlEb21haW5NYXBwaW5nOiBhcGlnd3kuRG9tYWluTWFwcGluZ09wdGlvbnMgPSB7XG4gICAgICBkb21haW5OYW1lOiBkbkFwcHNFZGdlLFxuICAgIH07XG4gICAgY29uc3QgaHR0cEFwaSA9IG5ldyBhcGlnd3kuSHR0cEFwaSh0aGlzLCAnbWljcm9hcHBzLWFwaScsIHtcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiBodHRwQXBpRG9tYWluTWFwcGluZyxcbiAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogaW50Um91dGVyLFxuICAgICAgYXBpTmFtZTogYXBpZ2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBodHRwQXBpLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIExldCBBUEkgR2F0ZXdheSBhY2NlcHQgcmVxdWVzdHMgdXNpbmcgZG9tYWluTmFtZU9yaWdpblxuICAgIC8vIFRoYXQgaXMgdGhlIG9yaWdpbiBVUkkgdGhhdCBDbG91ZEZyb250IHVzZXMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICAvLyBUaGUgZ2F0ZXdheSB3aWxsIHJlZnVzZSB0aGUgdHJhZmZpYyBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlXG4gICAgLy8gZG9tYWluIG5hbWUgcmVnaXN0ZXJlZC5cbiAgICAvL1xuICAgIGNvbnN0IG1hcHBpbmdBcHBzQXBpcyA9IG5ldyBhcGlnd3kuQXBpTWFwcGluZyh0aGlzLCAnbWljcm9hcHBzLWFwaS1tYXBwaW5nLW9yaWdpbicsIHtcbiAgICAgIGFwaTogaHR0cEFwaSxcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMuZG5BcHBzT3JpZ2luLFxuICAgIH0pO1xuICAgIG1hcHBpbmdBcHBzQXBpcy5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kbkFwcHNPcmlnaW4pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgbWFwcGluZ0FwcHNBcGlzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEdpdmUgRGVwbG95ZXIgcGVybWlzc2lvbnMgdG8gY3JlYXRlIHJvdXRlcyBhbmQgaW50ZWdyYXRpb25zXG4gICAgLy8gb24gdGhlIEFQSSBHYXRld2F5IEFQSS5cbiAgICAvL1xuXG4gICAgLy8gR3JhbnQgdGhlIGFiaWxpdHkgdG8gTGlzdCBhbGwgQVBJcyAod2UgaGF2ZSB0byBmaW5kIGl0KVxuICAgIGNvbnN0IHBvbGljeUFQSUxpc3QgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2FwaWdhdGV3YXk6R0VUJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTo6L2FwaXNgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSUxpc3QpO1xuICAgIC8vIEdyYW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBBUEkgd2UgY3JlYXRlZFxuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06JHthY2NvdW50fToke2h0dHBBcGkuaHR0cEFwaUlkfS8qYCxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L2ludGVncmF0aW9uc2AsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OjovYXBpcy8ke2h0dHBBcGkuaHR0cEFwaUlkfS9yb3V0ZXNgLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZSk7XG4gICAgLy8gR3JhbnQgZnVsbCBjb250cm9sIG92ZXIgbGFtYmRhcyB0aGF0IGluZGljYXRlIHRoZXkgYXJlIG1pY3JvYXBwc1xuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZUxhbWJkYXMgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6bGFtYmRhOiR7cmVnaW9ufToke2FjY291bnR9OmZ1bmN0aW9uOipgLFxuICAgICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259OiR7YWNjb3VudH06ZnVuY3Rpb246KjoqYCxcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsc0lmRXhpc3RzOiB7ICdhd3M6UmVzb3VyY2VUYWcvbWljcm9hcHAtbWFuYWdlZCc6ICd0cnVlJyB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZUxhbWJkYXMpO1xuXG4gICAgLy9cbiAgICAvLyBDcmVhdGUgdGhlIG9yaWdpbiBuYW1lIGZvciBBUEkgR2F0ZXdheVxuICAgIC8vXG5cbiAgICBjb25zdCB6b25lID0gcjUzLkhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsICdtaWNyb2FwcHMtem9uZScsIHtcbiAgICAgIHpvbmVOYW1lOiByNTNab25lTmFtZSxcbiAgICAgIGhvc3RlZFpvbmVJZDogcjUzWm9uZUlELFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnJBcHBzT3JpZ2luID0gbmV3IHI1My5BUmVjb3JkKHRoaXMsICdtaWNyb2FwcHMtb3JpZ2luLWFyZWNvcmQnLCB7XG4gICAgICB6b25lOiB6b25lLFxuICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyByNTN0YXJnZXRzLkFwaUdhdGV3YXl2MkRvbWFpblByb3BlcnRpZXMoXG4gICAgICAgICAgdGhpcy5fZG5BcHBzT3JpZ2luLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLl9kbkFwcHNPcmlnaW4ucmVnaW9uYWxIb3N0ZWRab25lSWQsXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcnJBcHBzT3JpZ2luLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==