From 32b81d642c29dd8863e783704a53bfa8ca5145c7 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Sat, 15 Jun 2024 23:15:14 +0200 Subject: [PATCH 01/23] fix(iam) add 12-digits validation for AccountPrincipal --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 6 ++++-- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 6833334fcbf3d..5e72f14198d53 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -473,14 +473,16 @@ export class ArnPrincipal extends PrincipalBase { export class AccountPrincipal extends ArnPrincipal { public readonly principalAccount: string | undefined; + private accountIdRegExp = new RegExp('^[0-9]{12}$'); + /** * * @param accountId AWS account ID (i.e. '123456789012') */ constructor(public readonly accountId: any) { super(new StackDependentToken(stack => `arn:${stack.partition}:iam::${accountId}:root`).toString()); - if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') { - throw new Error('accountId should be of type string'); + if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string' && !this.accountIdRegExp.test(accountId)) { + throw new Error('accountId should be of type string and be composed of 12 digits'); } this.principalAccount = accountId; } diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 67cdb361ee257..2a5aa691e2533 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -369,7 +369,15 @@ describe('deprecated ServicePrincipal behavior', () => { }); test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string and be composed of 12 digits'); + }); + + test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal("123456")).toThrowError('accountId should be of type string and be composed of 12 digits'); + }); + + test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal("test")).toThrowError('accountId should be of type string and be composed of 12 digits'); }); test('ServicePrincipal in agnostic stack generates lookup table', () => { From dfa6d2b78b62b8bef0661c043ff9ed220b275ed4 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Sat, 15 Jun 2024 23:37:34 +0200 Subject: [PATCH 02/23] fix(iam): add 12-digits validation for AccountPrincipal -fix double quotes strings --- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 2a5aa691e2533..6a9e2793a9e93 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -373,11 +373,19 @@ describe('deprecated ServicePrincipal behavior', () => { }); test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { +<<<<<<< Updated upstream expect(() => new iam.AccountPrincipal("123456")).toThrowError('accountId should be of type string and be composed of 12 digits'); }); test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { expect(() => new iam.AccountPrincipal("test")).toThrowError('accountId should be of type string and be composed of 12 digits'); +======= + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be of type string and be composed of 12 digits'); + }); + + test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be of type string and be composed of 12 digits'); +>>>>>>> Stashed changes }); test('ServicePrincipal in agnostic stack generates lookup table', () => { From 5377e35cb4e882f28f7629b5f237def90ec20603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Wed, 26 Jun 2024 23:41:28 +0200 Subject: [PATCH 03/23] Update principals.test.ts --- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 6a9e2793a9e93..e635bf3fb1593 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -373,19 +373,11 @@ describe('deprecated ServicePrincipal behavior', () => { }); test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { -<<<<<<< Updated upstream - expect(() => new iam.AccountPrincipal("123456")).toThrowError('accountId should be of type string and be composed of 12 digits'); - }); - - test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal("test")).toThrowError('accountId should be of type string and be composed of 12 digits'); -======= expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be of type string and be composed of 12 digits'); }); test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be of type string and be composed of 12 digits'); ->>>>>>> Stashed changes }); test('ServicePrincipal in agnostic stack generates lookup table', () => { From bafdb583d38464b2f7d62c9acf9af6f1aa8961ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Thu, 27 Jun 2024 00:00:53 +0200 Subject: [PATCH 04/23] Update principals.ts --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 5e72f14198d53..6db6c7a7c530b 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -481,7 +481,7 @@ export class AccountPrincipal extends ArnPrincipal { */ constructor(public readonly accountId: any) { super(new StackDependentToken(stack => `arn:${stack.partition}:iam::${accountId}:root`).toString()); - if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string' && !this.accountIdRegExp.test(accountId)) { + if ((!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') || !this.accountIdRegExp.test(accountId)) { throw new Error('accountId should be of type string and be composed of 12 digits'); } this.principalAccount = accountId; From 4ca3cddb0da718d4396cf7f8464dac4479ac3527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Thu, 27 Jun 2024 00:20:24 +0200 Subject: [PATCH 05/23] Update principals.ts --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 6db6c7a7c530b..5b3caa2d3a26c 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -481,8 +481,11 @@ export class AccountPrincipal extends ArnPrincipal { */ constructor(public readonly accountId: any) { super(new StackDependentToken(stack => `arn:${stack.partition}:iam::${accountId}:root`).toString()); - if ((!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') || !this.accountIdRegExp.test(accountId)) { - throw new Error('accountId should be of type string and be composed of 12 digits'); + if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') { + throw new Error('accountId should be of type string'); + } + if(!this.accountIdRegExp.test(accountId)){ + throw new Error('accountId should be composed of 12 digits'); } this.principalAccount = accountId; } From f62de18fe33c8ece6d657bd02808f5abfe76e45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Thu, 27 Jun 2024 00:21:48 +0200 Subject: [PATCH 06/23] Update principals.test.ts --- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index e635bf3fb1593..6beeaaf893549 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -369,15 +369,15 @@ describe('deprecated ServicePrincipal behavior', () => { }); test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string and be composed of 12 digits'); + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); }); test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be of type string and be composed of 12 digits'); + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); }); test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be of type string and be composed of 12 digits'); + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); }); test('ServicePrincipal in agnostic stack generates lookup table', () => { From c417abc22ce7c14ff4bd5d8a57e9d5109d96cfba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Thu, 27 Jun 2024 00:34:52 +0200 Subject: [PATCH 07/23] Update principals.ts --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 5b3caa2d3a26c..657ee7c94245a 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -484,8 +484,8 @@ export class AccountPrincipal extends ArnPrincipal { if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') { throw new Error('accountId should be of type string'); } - if(!this.accountIdRegExp.test(accountId)){ - throw new Error('accountId should be composed of 12 digits'); + if (!this.accountIdRegExp.test(accountId)) { + throw new Error('accountId should be composed of 12 digits'); } this.principalAccount = accountId; } From eb4c43617b7e2a0266fcb51998b4b91aaee59a56 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Sat, 29 Jun 2024 14:33:04 +0200 Subject: [PATCH 08/23] Fix with !cdk.Token.isUnresolved(accountId) --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 657ee7c94245a..f6c3620dc9366 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -484,7 +484,7 @@ export class AccountPrincipal extends ArnPrincipal { if (!cdk.Token.isUnresolved(accountId) && typeof accountId !== 'string') { throw new Error('accountId should be of type string'); } - if (!this.accountIdRegExp.test(accountId)) { + if (!cdk.Token.isUnresolved(accountId) && !this.accountIdRegExp.test(accountId)) { throw new Error('accountId should be composed of 12 digits'); } this.principalAccount = accountId; From 23afbdf7506a10786ca94115e6bb7dea47edd672 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Sat, 29 Jun 2024 15:08:21 +0200 Subject: [PATCH 09/23] Fix few test with incorrect mock AWS account id --- packages/aws-cdk-lib/aws-iam/test/role.test.ts | 2 +- packages/aws-cdk-lib/aws-lambda/test/function-url.test.ts | 2 +- packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/role.test.ts b/packages/aws-cdk-lib/aws-iam/test/role.test.ts index 1733b256400c1..2f0da60411517 100644 --- a/packages/aws-cdk-lib/aws-iam/test/role.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/role.test.ts @@ -414,7 +414,7 @@ describe('IAM role', () => { }); // THEN - expect(() => role.grantAssumeRole(new AccountPrincipal('123456789'))) + expect(() => role.grantAssumeRole(new AccountPrincipal('123456789012'))) .toThrow('Cannot use a service or account principal with grantAssumeRole, use assumeRolePolicy instead.'); }); diff --git a/packages/aws-cdk-lib/aws-lambda/test/function-url.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function-url.test.ts index 048fcea4fa1fa..61065556ebaa1 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function-url.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function-url.test.ts @@ -164,7 +164,7 @@ describe('FunctionUrl', () => { // GIVEN const stack = new cdk.Stack(); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('1234'), + assumedBy: new iam.AccountPrincipal('123456789012'), }); const fn = new lambda.Function(stack, 'MyLambda', { code: new lambda.InlineCode('hello()'), diff --git a/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts b/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts index 38ed48e3fbf55..b325641c43cad 100644 --- a/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts +++ b/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts @@ -382,7 +382,7 @@ test('grantRead cross account', () => { // GIVEN const key = new kms.Key(stack, 'KMS'); const secret = new secretsmanager.Secret(stack, 'Secret', { encryptionKey: key }); - const principal = new iam.AccountPrincipal('1234'); + const principal = new iam.AccountPrincipal('123456789012'); // WHEN secret.grantRead(principal, ['FOO', 'bar']).assertSuccess(); From e16f43b073b6c162388c5c78744664f2d62a728f Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 00:07:26 +0200 Subject: [PATCH 10/23] Fix test with incorrect Account Id --- .../test/cloudformation/integ.stacksets.ts | 2 +- .../test/integ.pipeline-ecr-source.ts | 6 +-- .../aws-neptune-alpha/test/cluster.test.ts | 2 +- .../aws-neptune-alpha/test/instance.test.ts | 2 +- .../aws-redshift-alpha/test/cluster.test.ts | 2 +- .../cdk-cli-wrapper/test/cdk-wrapper.test.ts | 12 ++--- .../cli-lib-alpha/test/commands.test.ts | 12 ++--- .../test/server/deployment-group.test.ts | 6 +-- ...ormation-stackset-pipeline-actions.test.ts | 4 +- .../codecommit-source-action.test.ts | 16 +++--- .../test/ecs/ecs-deploy-action.test.ts | 2 +- .../test/pipeline.test.ts | 4 +- .../stepfunctions-invoke-actions.test.ts | 2 +- .../aws-codepipeline/test/cross-env.test.ts | 14 +++--- .../aws-cognito/test/user-pool.test.ts | 50 +++++++++---------- .../aws-docdb/test/cluster.test.ts | 2 +- .../aws-docdb/test/instance.test.ts | 8 +-- .../tag-parameter-container-image.test.ts | 8 +-- .../aws-elasticsearch/test/domain.test.ts | 16 +++--- .../aws-events/test/event-bus.test.ts | 10 ++-- .../aws-cdk-lib/aws-events/test/rule.test.ts | 4 +- .../aws-iam/test/cross-account.test.ts | 14 +++--- .../aws-iam/test/policy-document.test.ts | 8 +-- packages/aws-cdk-lib/aws-kms/test/key.test.ts | 8 +-- .../aws-lambda/test/function.test.ts | 18 +++---- .../aws-opensearchservice/test/domain.test.ts | 18 +++---- .../aws-cdk-lib/aws-rds/test/cluster.test.ts | 12 ++--- .../test/database-secretmanager.test.ts | 8 +-- .../aws-cdk-lib/aws-rds/test/instance.test.ts | 6 +-- .../serverless-cluster-from-snapshot.test.ts | 2 +- .../aws-rds/test/serverless-cluster.test.ts | 6 +-- .../test/hosted-zone-provider.test.ts | 8 +-- .../aws-route53/test/hosted-zone.test.ts | 2 +- .../aws-secretsmanager/test/secret.test.ts | 22 ++++---- .../aws-sns-subscriptions/test/subs.test.ts | 24 ++++----- packages/aws-cdk-lib/core/test/app.test.ts | 6 +-- .../aws-cdk-lib/core/test/context.test.ts | 34 ++++++------- packages/aws-cdk-lib/core/test/stack.test.ts | 4 +- .../pipelines/lib/docker-credentials.ts | 2 +- .../test/codepipeline/codepipeline.test.ts | 8 +-- .../pipelines/test/compliance/assets.test.ts | 10 ++-- .../compliance/docker-credentials.test.ts | 6 +-- .../test/compliance/self-mutation.test.ts | 2 +- .../pipelines/test/testhelpers/test-app.ts | 2 +- packages/aws-cdk/test/api/bootstrap.test.ts | 2 +- packages/aws-cdk/test/api/bootstrap2.test.ts | 2 +- .../test/api/logs/logs-monitor.test.ts | 4 +- .../test/context-providers/amis.test.ts | 4 +- .../context-providers/asymmetric-vpcs.test.ts | 18 +++---- .../test/context-providers/generic.test.ts | 8 +-- .../test/context-providers/keys.test.ts | 8 +-- .../context-providers/load-balancers.test.ts | 28 +++++------ .../context-providers/security-groups.test.ts | 18 +++---- .../test/context-providers/vpcs.test.ts | 20 ++++---- .../test/private/docker-credentials.test.ts | 14 +++--- 55 files changed, 270 insertions(+), 270 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts index 85972dc67f432..98e263f834c87 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts @@ -53,7 +53,7 @@ export class StackSetPipelineStack extends Stack { ], }); - const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['1111', '2222']; + const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['1111', '222222222222']; pipeline.addStage({ stageName: 'Cfn', diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts index 2dbdbfc0c5e90..334692de4300b 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts @@ -15,9 +15,9 @@ import * as cpactions from 'aws-cdk-lib/aws-codepipeline-actions'; * * Outputs: * aws-cdk-codepipeline-ecr-source.PipelineConsoleLink = https://us-east-1.console.aws.amazon.com/codesuite/codepipeline/pipelines/aws-cdk-codepipeline-ecr-source-MyPipelineAED38ECF-1P0OYRLWF8FHY/view?region=us-east-1 - * aws-cdk-codepipeline-ecr-source.LoginCommand = aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 11111111111.dkr.ecr.us-east-1.amazonaws.com - * aws-cdk-codepipeline-ecr-source.PushCommand = docker tag public.ecr.aws/lambda/provided 11111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest \ - * && docker push 11111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest + * aws-cdk-codepipeline-ecr-source.LoginCommand = aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111111111111.dkr.ecr.us-east-1.amazonaws.com + * aws-cdk-codepipeline-ecr-source.PushCommand = docker tag public.ecr.aws/lambda/provided 111111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest \ + * && docker push 111111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest * * Run the LoginCommand & PushCommand to tag and push an image to the ECR repository. * Then use the PipelineConsoleLink to navigate to the pipeline console page to validate that the pipeline diff --git a/packages/@aws-cdk/aws-neptune-alpha/test/cluster.test.ts b/packages/@aws-cdk/aws-neptune-alpha/test/cluster.test.ts index 223966581c395..353b81eaa48d5 100644 --- a/packages/@aws-cdk/aws-neptune-alpha/test/cluster.test.ts +++ b/packages/@aws-cdk/aws-neptune-alpha/test/cluster.test.ts @@ -916,7 +916,7 @@ describe('DatabaseCluster', () => { }); function testStack() { - const stack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/@aws-cdk/aws-neptune-alpha/test/instance.test.ts b/packages/@aws-cdk/aws-neptune-alpha/test/instance.test.ts index 622d126fc05e9..3e331e72e2906 100644 --- a/packages/@aws-cdk/aws-neptune-alpha/test/instance.test.ts +++ b/packages/@aws-cdk/aws-neptune-alpha/test/instance.test.ts @@ -219,5 +219,5 @@ class TestStack extends cdk.Stack { } function testStack() { - return new TestStack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + return new TestStack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); } diff --git a/packages/@aws-cdk/aws-redshift-alpha/test/cluster.test.ts b/packages/@aws-cdk/aws-redshift-alpha/test/cluster.test.ts index cd4e4bfa04fa4..c76cfa2148dd5 100644 --- a/packages/@aws-cdk/aws-redshift-alpha/test/cluster.test.ts +++ b/packages/@aws-cdk/aws-redshift-alpha/test/cluster.test.ts @@ -937,7 +937,7 @@ describe('IAM role', () => { }); function testStack() { - const newTestStack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + const newTestStack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); newTestStack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); return newTestStack; } diff --git a/packages/@aws-cdk/cdk-cli-wrapper/test/cdk-wrapper.test.ts b/packages/@aws-cdk/cdk-cli-wrapper/test/cdk-wrapper.test.ts index 266a7b9c81190..b519ee4256369 100644 --- a/packages/@aws-cdk/cdk-cli-wrapper/test/cdk-wrapper.test.ts +++ b/packages/@aws-cdk/cdk-cli-wrapper/test/cdk-wrapper.test.ts @@ -68,7 +68,7 @@ test('deploy with all arguments', () => { lookups: false, notices: true, profile: 'my-profile', - roleArn: 'arn:aws:iam::1111111111:role/my-role', + roleArn: 'arn:aws:iam::111111111111:role/my-role', staging: false, verbose: true, ec2Creds: true, @@ -112,7 +112,7 @@ test('deploy with all arguments', () => { '--profile', 'my-profile', '--proxy', 'https://proxy', '--ca-bundle-path', '/some/path', - '--role-arn', 'arn:aws:iam::1111111111:role/my-role', + '--role-arn', 'arn:aws:iam::111111111111:role/my-role', '--output', 'cdk.out', '--no-ci', '--execute', @@ -247,8 +247,8 @@ test('can parse array arguments', () => { app: 'node bin/my-app.js', stacks: ['test-stack1'], notificationArns: [ - 'arn:aws:us-east-1:1111111111:some:resource', - 'arn:aws:us-east-1:1111111111:some:other-resource', + 'arn:aws:us-east-1:111111111111:some:resource', + 'arn:aws:us-east-1:111111111111:some:other-resource', ], }); @@ -257,8 +257,8 @@ test('can parse array arguments', () => { expect.stringMatching(/cdk/), [ 'deploy', - '--notification-arns', 'arn:aws:us-east-1:1111111111:some:resource', - '--notification-arns', 'arn:aws:us-east-1:1111111111:some:other-resource', + '--notification-arns', 'arn:aws:us-east-1:111111111111:some:resource', + '--notification-arns', 'arn:aws:us-east-1:111111111111:some:other-resource', '--progress', 'events', '--app', 'node bin/my-app.js', diff --git a/packages/@aws-cdk/cli-lib-alpha/test/commands.test.ts b/packages/@aws-cdk/cli-lib-alpha/test/commands.test.ts index 710bc278b2ff4..ecab658d50065 100644 --- a/packages/@aws-cdk/cli-lib-alpha/test/commands.test.ts +++ b/packages/@aws-cdk/cli-lib-alpha/test/commands.test.ts @@ -49,7 +49,7 @@ describe('deploy', () => { lookups: false, notices: true, profile: 'my-profile', - roleArn: 'arn:aws:iam::1111111111:role/my-role', + roleArn: 'arn:aws:iam::111111111111:role/my-role', staging: false, verbose: true, ec2Creds: true, @@ -113,7 +113,7 @@ describe('deploy', () => { '--profile', 'my-profile', '--proxy', 'https://proxy', '--ca-bundle-path', '/some/path', - '--role-arn', 'arn:aws:iam::1111111111:role/my-role', + '--role-arn', 'arn:aws:iam::111111111111:role/my-role', 'Stack1', ]), expect.anything(), @@ -229,8 +229,8 @@ describe('deploy', () => { await cdk.deploy({ stacks: ['Stack1'], notificationArns: [ - 'arn:aws:us-east-1:1111111111:some:resource', - 'arn:aws:us-east-1:1111111111:some:other-resource', + 'arn:aws:us-east-1:111111111111:some:resource', + 'arn:aws:us-east-1:111111111111:some:other-resource', ], }); @@ -238,8 +238,8 @@ describe('deploy', () => { expect(jest.mocked(cli.exec)).toHaveBeenCalledWith( [ 'deploy', - '--notification-arns', 'arn:aws:us-east-1:1111111111:some:resource', - '--notification-arns', 'arn:aws:us-east-1:1111111111:some:other-resource', + '--notification-arns', 'arn:aws:us-east-1:111111111111:some:resource', + '--notification-arns', 'arn:aws:us-east-1:111111111111:some:other-resource', '--progress', 'events', 'Stack1', ], diff --git a/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts b/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts index a2b431af3cebe..8d1c4f05fae3c 100644 --- a/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts +++ b/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts @@ -43,8 +43,8 @@ describe('CodeDeploy Server Deployment Group', () => { }); test('creating an application with physical name if needed', () => { - const stack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); - const stack2 = new cdk.Stack(undefined, undefined, { env: { account: '12346', region: 'us-test-2' } }); + const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); + const stack2 = new cdk.Stack(undefined, undefined, { env: { account: '123467890123', region: 'us-test-2' } }); const serverDeploymentGroup = new codedeploy.ServerDeploymentGroup(stack, 'MyDG', { deploymentGroupName: cdk.PhysicalName.GENERATE_IF_NEEDED, }); @@ -54,7 +54,7 @@ describe('CodeDeploy Server Deployment Group', () => { }); Template.fromStack(stack2).hasOutput('Output', { - Value: 'defaultmydgapplication78dba0bb0c7580b32033', + Value: 'defaultmydgapplication78dba0bb21f873b29bdf', }); }); diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/cloudformation/cloudformation-stackset-pipeline-actions.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/cloudformation/cloudformation-stackset-pipeline-actions.test.ts index cfa43a665baea..bd4036873c43c 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/cloudformation/cloudformation-stackset-pipeline-actions.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/cloudformation/cloudformation-stackset-pipeline-actions.test.ts @@ -241,7 +241,7 @@ describe('StackSetAction', () => { stack.deployStage.addAction(new cpactions.CloudFormationDeployStackSetAction({ ...defaultOpts(), stackInstances: cpactions.StackInstances.inAccounts( - ['11111111111', '22222222222'], + ['111111111111', '22222222222'], ['us-east-1', 'us-west-1', 'ca-central-1'], ), deploymentModel: cpactions.StackSetDeploymentModel.selfManaged({ @@ -264,7 +264,7 @@ describe('StackSetAction', () => { 'TemplatePath': 'SourceArtifact::template.yaml', 'Parameters': 'SourceArtifact::parameters.json', 'Capabilities': 'CAPABILITY_NAMED_IAM', - 'DeploymentTargets': '11111111111,22222222222', + 'DeploymentTargets': '111111111111,22222222222', 'FailureTolerancePercentage': 50, 'MaxConcurrentPercentage': 25, 'Regions': 'us-east-1,us-west-1,ca-central-1', diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts index eefb65d40cf7c..d5b5caa480ae2 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts @@ -42,8 +42,8 @@ describe('CodeCommit Source Action', () => { test('cross-account CodeCommit Repository Source does not use target role in source stack', () => { // Test for https://github.com/aws/aws-cdk/issues/15639 const app = new App(); - const sourceStack = new Stack(app, 'SourceStack', { env: { account: '1234', region: 'north-pole' } }); - const targetStack = new Stack(app, 'TargetStack', { env: { account: '5678', region: 'north-pole' } }); + const sourceStack = new Stack(app, 'SourceStack', { env: { account: '123456789012', region: 'north-pole' } }); + const targetStack = new Stack(app, 'TargetStack', { env: { account: '567890123456', region: 'north-pole' } }); const repo = new codecommit.Repository(sourceStack, 'MyRepo', { repositoryName: 'my-repo', @@ -85,7 +85,7 @@ describe('CodeCommit Source Action', () => { 'Fn::Join': ['', [ 'arn:', { 'Ref': 'AWS::Partition' }, - ':events:north-pole:5678:event-bus/default', + ':events:north-pole:567890123456:event-bus/default', ]], }, }], @@ -104,7 +104,7 @@ describe('CodeCommit Source Action', () => { [ 'arn:', { 'Ref': 'AWS::Partition' }, - ':codecommit:north-pole:1234:my-repo', + ':codecommit:north-pole:123456789012:my-repo', ], ], }, @@ -116,7 +116,7 @@ describe('CodeCommit Source Action', () => { 'Fn::Join': ['', [ 'arn:', { 'Ref': 'AWS::Partition' }, - ':codepipeline:north-pole:5678:', + ':codepipeline:north-pole:567890123456:', { 'Ref': 'MyPipelineAED38ECF' }, ]], }, @@ -569,18 +569,18 @@ describe('CodeCommit Source Action', () => { const app = new App(); const repoStack = new Stack(app, 'RepoStack', { - env: { account: '123', region: 'us-east-1' }, + env: { account: '123456789012', region: 'us-east-1' }, }); const repoFomAnotherAccount = codecommit.Repository.fromRepositoryName(repoStack, 'Repo', 'my-repo'); const pipelineStack = new Stack(app, 'PipelineStack', { - env: { account: '456', region: 'us-east-1' }, + env: { account: '456789012345', region: 'us-east-1' }, }); new codepipeline.Pipeline(pipelineStack, 'Pipeline', { artifactBucket: s3.Bucket.fromBucketAttributes(pipelineStack, 'PipelineBucket', { bucketName: 'pipeline-bucket', encryptionKey: kms.Key.fromKeyArn(pipelineStack, 'PipelineKey', - 'arn:aws:kms:us-east-1:456:key/my-key'), + 'arn:aws:kms:us-east-1:456789012345:key/my-key'), }), stages: [ { diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/ecs/ecs-deploy-action.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/ecs/ecs-deploy-action.test.ts index 2a6684e3a5c67..17636be28e203 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/ecs/ecs-deploy-action.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/ecs/ecs-deploy-action.test.ts @@ -193,7 +193,7 @@ describe('ecs deploy action', () => { const app = new cdk.App(); const stack = new cdk.Stack(app, 'PipelineStack', { env: { - region: 'pipeline-region', account: 'pipeline-account', + region: 'pipeline-region', account: '123456789012', }, }); const clusterName = 'cluster-name'; diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/pipeline.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/pipeline.test.ts index fac873b4ba4fd..abf219efbd869 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/pipeline.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/pipeline.test.ts @@ -551,7 +551,7 @@ describe('pipeline', () => { describe('cross-region Pipeline', () => { test('generates the required Action & ArtifactStores properties in the template', () => { const pipelineRegion = 'us-west-2'; - const pipelineAccount = '123'; + const pipelineAccount = '123456789012'; const app = new App(); @@ -620,7 +620,7 @@ describe('pipeline', () => { 'Region': 'us-east-1', 'ArtifactStore': { 'Type': 'S3', - 'Location': 'teststack-support-us-easteplicationbucket1a8063b3cdac6e7e0e73', + 'Location': 'teststack-support-us-easteplicationbucket851dbc8fad9a87dc5f52', }, }, { diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/stepfunctions/stepfunctions-invoke-actions.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/stepfunctions/stepfunctions-invoke-actions.test.ts index 94a14b6d08683..f1504fc668f24 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/stepfunctions/stepfunctions-invoke-actions.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/stepfunctions/stepfunctions-invoke-actions.test.ts @@ -125,7 +125,7 @@ describe('StepFunctions Invoke Action', () => { }); test('Allows the pipeline to describe this stepfunction execution (across accounts & regions)', () => { - const stack = new Stack(undefined, undefined, { env: { account: '11111111111', region: 'us-east-1' } }); + const stack = new Stack(undefined, undefined, { env: { account: '111111111111', region: 'us-east-1' } }); minimalPipeline(stack, '999999999999', 'bermuda-triangle-1337'); diff --git a/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts b/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts index 56af22bb97a4f..1fafcc0356532 100644 --- a/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts @@ -27,7 +27,7 @@ describe.each([ }); stackScope = inStage ? new CdkStage(app, 'MyStage') : app; - stack = new Stack(stackScope, 'PipelineStack', { env: { account: '2222', region: 'us-east-1' } }); + stack = new Stack(stackScope, 'PipelineStack', { env: { account: '222222222222', region: 'us-east-1' } }); sourceArtifact = new codepipeline.Artifact(); initialStages = [ { @@ -140,7 +140,7 @@ describe.each([ }); test('when twiddling another stack', () => { - const stack2 = new Stack(stackScope, 'Stack2', { env: { account: '2222', region: 'eu-west-1' } }); + const stack2 = new Stack(stackScope, 'Stack2', { env: { account: '222222222222', region: 'eu-west-1' } }); // WHEN stage.addAction(new FakeBuildAction({ @@ -162,7 +162,7 @@ describe('cross-environment CodePipeline', function () { const app = new App(); const pipelineStack = new Stack(app, 'PipelineStack', { - env: { account: '123', region: 'my-region' }, + env: { account: '123456789012', region: 'my-region' }, }); const sourceOutput = new codepipeline.Artifact(); const pipeline = new codepipeline.Pipeline(pipelineStack, 'Pipeline', { @@ -185,7 +185,7 @@ describe('cross-environment CodePipeline', function () { // and a correct support Stack should be created. const deployBucket = s3.Bucket.fromBucketAttributes(pipelineStack, 'DeployBucket', { bucketName: 'my-bucket', - account: '456', + account: '456789012345', }); pipeline.addStage({ stageName: 'Build', @@ -199,9 +199,9 @@ describe('cross-environment CodePipeline', function () { }); const asm = app.synth(); - const supportStack = asm.getStackByName(`${pipelineStack.stackName}-support-456`); + const supportStack = asm.getStackByName(`${pipelineStack.stackName}-support-456789012345`); Template.fromJSON(supportStack.template).hasResourceProperties('AWS::IAM::Role', { - RoleName: 'pipelinestack-support-456dbuildactionrole91c6f1a469fd11d52dfe', + RoleName: 'pipelinestack-support-456dbuildactionroledeafad808cffa2919e34', }); Template.fromStack(pipelineStack).hasResourceProperties('AWS::CodePipeline::Pipeline', { @@ -216,7 +216,7 @@ describe('cross-environment CodePipeline', function () { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':iam::456:role/pipelinestack-support-456dbuildactionrole91c6f1a469fd11d52dfe', + ':iam::456789012345:role/pipelinestack-support-456dbuildactionroledeafad808cffa2919e34', ]], }, }, diff --git a/packages/aws-cdk-lib/aws-cognito/test/user-pool.test.ts b/packages/aws-cdk-lib/aws-cognito/test/user-pool.test.ts index 934f6a312c81b..3d9609bae0893 100644 --- a/packages/aws-cdk-lib/aws-cognito/test/user-pool.test.ts +++ b/packages/aws-cdk-lib/aws-cognito/test/user-pool.test.ts @@ -281,31 +281,31 @@ describe('User Pool', () => { test('import using id', () => { // GIVEN const stack = new Stack(undefined, undefined, { - env: { region: 'some-region-1', account: '0123456789012' }, + env: { region: 'some-region-1', account: '123456789012' }, }); const userPoolId = 'test-user-pool'; // WHEN const pool = UserPool.fromUserPoolId(stack, 'userpool', userPoolId); expect(pool.userPoolId).toEqual(userPoolId); - expect(pool.userPoolArn).toMatch(/cognito-idp:some-region-1:0123456789012:userpool\/test-user-pool/); + expect(pool.userPoolArn).toMatch(/cognito-idp:some-region-1:123456789012:userpool\/test-user-pool/); }); test('import using arn', () => { // GIVEN const stack = new Stack(); - const userPoolArn = 'arn:aws:cognito-idp:us-east-1:0123456789012:userpool/test-user-pool'; + const userPoolArn = 'arn:aws:cognito-idp:us-east-1:123456789012:userpool/test-user-pool'; // WHEN const pool = UserPool.fromUserPoolArn(stack, 'userpool', userPoolArn); expect(pool.userPoolId).toEqual('test-user-pool'); - expect(stack.resolve(pool.userPoolArn)).toEqual('arn:aws:cognito-idp:us-east-1:0123456789012:userpool/test-user-pool'); + expect(stack.resolve(pool.userPoolArn)).toEqual('arn:aws:cognito-idp:us-east-1:123456789012:userpool/test-user-pool'); }); test('import using arn without resourceName fails', () => { // GIVEN const stack = new Stack(); - const userPoolArn = 'arn:aws:cognito-idp:us-east-1:0123456789012:*'; + const userPoolArn = 'arn:aws:cognito-idp:us-east-1:123456789012:*'; // WHEN expect(() => { @@ -315,7 +315,7 @@ describe('User Pool', () => { test('import from different account region using arn', () => { // GIVEN - const userPoolArn = 'arn:aws:cognito-idp:us-east-1:0123456789012:userpool/test-user-pool'; + const userPoolArn = 'arn:aws:cognito-idp:us-east-1:123456789012:userpool/test-user-pool'; const stack = new Stack(undefined, undefined, { env: { @@ -326,9 +326,9 @@ describe('User Pool', () => { // WHEN const pool = UserPool.fromUserPoolArn(stack, 'userpool', userPoolArn); - expect(pool.env.account).toEqual('0123456789012'); + expect(pool.env.account).toEqual('123456789012'); expect(pool.env.region).toEqual('us-east-1'); - expect(pool.userPoolArn).toEqual('arn:aws:cognito-idp:us-east-1:0123456789012:userpool/test-user-pool'); + expect(pool.userPoolArn).toEqual('arn:aws:cognito-idp:us-east-1:123456789012:userpool/test-user-pool'); }); test('support tags', () => { @@ -1741,7 +1741,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1769,7 +1769,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1783,7 +1783,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1812,7 +1812,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1825,7 +1825,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1850,7 +1850,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1863,7 +1863,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1888,7 +1888,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1901,7 +1901,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1926,7 +1926,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1939,7 +1939,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-1', - account: '11111111111', + account: '111111111111', }, }); @@ -1964,7 +1964,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -1977,7 +1977,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-2', - account: '11111111111', + account: '111111111111', }, }); @@ -2007,7 +2007,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/mycustomemail@example.com', + ':ses:us-east-1:111111111111:identity/mycustomemail@example.com', ], ], }, @@ -2021,7 +2021,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-2', - account: '11111111111', + account: '111111111111', }, }); @@ -2052,7 +2052,7 @@ describe('User Pool', () => { { Ref: 'AWS::Partition', }, - ':ses:us-east-1:11111111111:identity/example.com', + ':ses:us-east-1:111111111111:identity/example.com', ], ], }, @@ -2065,7 +2065,7 @@ describe('User Pool', () => { const stack = new Stack(undefined, undefined, { env: { region: 'us-east-2', - account: '11111111111', + account: '111111111111', }, }); diff --git a/packages/aws-cdk-lib/aws-docdb/test/cluster.test.ts b/packages/aws-cdk-lib/aws-docdb/test/cluster.test.ts index 3c5139140b541..00675f42f47ab 100644 --- a/packages/aws-cdk-lib/aws-docdb/test/cluster.test.ts +++ b/packages/aws-cdk-lib/aws-docdb/test/cluster.test.ts @@ -1183,7 +1183,7 @@ describe('DatabaseCluster', () => { }); function testStack() { - const stack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/aws-cdk-lib/aws-docdb/test/instance.test.ts b/packages/aws-cdk-lib/aws-docdb/test/instance.test.ts index 320fe71e9d8ac..f157bc5316bda 100644 --- a/packages/aws-cdk-lib/aws-docdb/test/instance.test.ts +++ b/packages/aws-cdk-lib/aws-docdb/test/instance.test.ts @@ -138,7 +138,7 @@ describe('DatabaseInstance', () => { [ 'arn:', { Ref: 'AWS::Partition' }, - ':rds:us-test-1:12345:db:', + ':rds:us-test-1:123456789012:db:', { Ref: 'InstanceC1063A87' }, ], ], @@ -181,7 +181,7 @@ describe('DatabaseInstance', () => { [ 'arn:', { Ref: 'AWS::Partition' }, - `:rds:us-test-1:12345:db:${instanceIdentifier}`, + `:rds:us-test-1:123456789012:db:${instanceIdentifier}`, ], ], }, @@ -221,7 +221,7 @@ class TestStack extends cdk.Stack { constructor(scope?: constructs.Construct, id?: string, props: cdk.StackProps = {}) { super(scope, id, props); - this.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); + this.node.setContext('availability-zones:123456789012:us-test-1', ['us-test-1a', 'us-test-1b']); this.vpc = new ec2.Vpc(this, 'VPC'); this.cluster = new DatabaseCluster(this, 'Database', { @@ -236,6 +236,6 @@ class TestStack extends cdk.Stack { } function testStack() { - const stack = new TestStack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + const stack = new TestStack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); return stack; } diff --git a/packages/aws-cdk-lib/aws-ecs/test/images/tag-parameter-container-image.test.ts b/packages/aws-cdk-lib/aws-ecs/test/images/tag-parameter-container-image.test.ts index 8910e52849e0d..c74c7be2a71e5 100644 --- a/packages/aws-cdk-lib/aws-ecs/test/images/tag-parameter-container-image.test.ts +++ b/packages/aws-cdk-lib/aws-ecs/test/images/tag-parameter-container-image.test.ts @@ -38,7 +38,7 @@ describe('tag parameter container image', () => { const app = new cdk.App(); const pipelineStack = new cdk.Stack(app, 'PipelineStack', { env: { - account: 'pipeline-account', + account: '111111111111', region: 'us-west-1', }, }); @@ -50,7 +50,7 @@ describe('tag parameter container image', () => { const serviceStack = new cdk.Stack(app, 'ServiceStack', { env: { - account: 'service-account', + account: '222222222222', region: 'us-west-1', }, }); @@ -77,7 +77,7 @@ describe('tag parameter container image', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':iam::service-account:root', + ':iam::222222222222:root', ]], }, }, @@ -104,7 +104,7 @@ describe('tag parameter container image', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - `:ecr:us-west-1:pipeline-account:repository/${repositoryName}`, + `:ecr:us-west-1:111111111111:repository/${repositoryName}`, ]], }, }), diff --git a/packages/aws-cdk-lib/aws-elasticsearch/test/domain.test.ts b/packages/aws-cdk-lib/aws-elasticsearch/test/domain.test.ts index 5880d269c0c07..78c56c30d2f18 100644 --- a/packages/aws-cdk-lib/aws-elasticsearch/test/domain.test.ts +++ b/packages/aws-cdk-lib/aws-elasticsearch/test/domain.test.ts @@ -18,7 +18,7 @@ let stack: Stack; beforeEach(() => { app = new App(); stack = new Stack(app, 'Stack', { - env: { account: '1234', region: 'testregion' }, + env: { account: '123456789012', region: 'testregion' }, }); jest.resetAllMocks(); @@ -211,7 +211,7 @@ testDeprecated('can set a self-referencing custom policy', () => { new iam.PolicyStatement({ actions: ['es:ESHttpPost', 'es:ESHttpPut'], effect: iam.Effect.ALLOW, - principals: [new iam.AccountPrincipal('5678')], + principals: [new iam.AccountPrincipal('567890123456')], resources: [domain.domainArn, `${domain.domainArn}/*`], }), ); @@ -228,7 +228,7 @@ testDeprecated('can set a self-referencing custom policy', () => { { Ref: 'AWS::Partition', }, - ':iam::5678:root\\"},\\"Resource\\":[\\"', + ':iam::567890123456:root\\"},\\"Resource\\":[\\"', { 'Fn::GetAtt': [ 'Domain66AC69E0', @@ -825,7 +825,7 @@ describe('grants', () => { { Ref: 'AWS::Partition', }, - ':es:testregion:1234:domain/test-domain-2w2x2u3tifly', + ':es:testregion:123456789012:domain/test-domain-2w2x2u3tifly', ], ], }, @@ -837,7 +837,7 @@ describe('grants', () => { { Ref: 'AWS::Partition', }, - ':es:testregion:1234:domain/test-domain-2w2x2u3tifly/*', + ':es:testregion:123456789012:domain/test-domain-2w2x2u3tifly/*', ], ], }, @@ -992,7 +992,7 @@ describe('import', () => { const imported = Domain.fromDomainEndpoint(stack, 'Domain', domainEndpoint); expect(imported.domainName).toEqual(domainName); - expect(imported.domainArn).toMatch(RegExp(`es:testregion:1234:domain/${domainName}$`)); + expect(imported.domainArn).toMatch(RegExp(`es:testregion:123456789012:domain/${domainName}$`)); expect(imported.domainEndpoint).toEqual(domainEndpointWithoutHttps); Template.fromStack(stack).resourceCountIs('AWS::Elasticsearch::Domain', 0); @@ -1000,7 +1000,7 @@ describe('import', () => { testDeprecated('static fromDomainAttributes(attributes) allows importing an external/existing domain', () => { const domainName = 'test-domain-2w2x2u3tifly'; - const domainArn = `arn:aws:es:testregion:1234:domain/${domainName}`; + const domainArn = `arn:aws:es:testregion:123456789012:domain/${domainName}`; const domainEndpointWithoutHttps = `${domainName}-jcjotrt6f7otem4sqcwbch3c4u.testregion.es.amazonaws.com`; const domainEndpoint = `https://${domainEndpointWithoutHttps}`; const imported = Domain.fromDomainAttributes(stack, 'Domain', { @@ -1895,7 +1895,7 @@ function testMetric( period, statistic, dimensions: { - ClientId: '1234', + ClientId: '123456789012', }, }); expect(metric.dimensions).toHaveProperty('DomainName'); diff --git a/packages/aws-cdk-lib/aws-events/test/event-bus.test.ts b/packages/aws-cdk-lib/aws-events/test/event-bus.test.ts index da4a96a3763e3..fa426294e78b3 100644 --- a/packages/aws-cdk-lib/aws-events/test/event-bus.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/event-bus.test.ts @@ -507,13 +507,13 @@ describe('event bus', () => { const app = new App(); const stack1 = new Stack(app, 'Stack1', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, }); const stack2 = new Stack(app, 'Stack2', { env: { - account: '22222222222', + account: '222222222222', region: 'us-east-1', }, }); @@ -527,7 +527,7 @@ describe('event bus', () => { // THEN Template.fromStack(stack1).hasResourceProperties('AWS::Events::EventBus', { - Name: 'stack1stack1busca19bdf8ab2e51b62a5a', + Name: 'stack1stack1busca19bdf823d8f39f1c0f', }); }); @@ -540,7 +540,7 @@ describe('event bus', () => { // WHEN bus.addToResourcePolicy(new iam.PolicyStatement({ effect: Effect.ALLOW, - principals: [new iam.AccountPrincipal('111111111111111')], + principals: [new iam.AccountPrincipal('111111111111')], actions: ['events:PutEvents'], sid: '123', resources: [bus.eventBusArn], @@ -564,7 +564,7 @@ describe('event bus', () => { { Ref: 'AWS::Partition', }, - ':iam::111111111111111:root', + ':iam::111111111111:root', ], ], }, diff --git a/packages/aws-cdk-lib/aws-events/test/rule.test.ts b/packages/aws-cdk-lib/aws-events/test/rule.test.ts index dbcf5ad9bd01c..6fca18c9306f8 100644 --- a/packages/aws-cdk-lib/aws-events/test/rule.test.ts +++ b/packages/aws-cdk-lib/aws-events/test/rule.test.ts @@ -259,7 +259,7 @@ describe('rule', () => { const rule = new Rule(stack, 'MyRule'); rule.addEventPattern({ - account: ['12345'], + account: ['123456789012'], detail: { foo: ['hello', 'bar', 'hello'], }, @@ -282,7 +282,7 @@ describe('rule', () => { 'Properties': { 'EventPattern': { 'account': [ - '12345', + '123456789012', ], 'detail': { 'foo': [ diff --git a/packages/aws-cdk-lib/aws-iam/test/cross-account.test.ts b/packages/aws-cdk-lib/aws-iam/test/cross-account.test.ts index e23a873c9a8db..8222469296dd3 100644 --- a/packages/aws-cdk-lib/aws-iam/test/cross-account.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/cross-account.test.ts @@ -12,11 +12,11 @@ import * as iam from '../lib'; // a different account than the resource). let app: cdk.App; -const stack1Account = '1234'; +const stack1Account = '123456789012'; let stack1: cdk.Stack; -const stack2Account = '5678'; +const stack2Account = '567890123456'; let stack2: cdk.Stack; -const thirdAccount = '123456789012'; +const thirdAccount = '901234567890'; beforeEach(() => { app = new cdk.App(); @@ -42,7 +42,7 @@ test('cross-account Role grant creates permissions AND trust', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - `:iam::${stack1Account}:role/stack1stack1rolef3c14260253562f428b7`, + `:iam::${stack1Account}:role/stack1stack1rolef3c14260c341bd0b2cb0`, ]], }, }); @@ -106,7 +106,7 @@ test('Imported Role with definitely same account grant does not create trust', ( test('Imported Role with partition token and definitely same account grant does not create trust', () => { const resource = new FakeResource(stack2, 'Resource'); - const role = iam.Role.fromRoleArn(stack2, 'Role', `arn:${stack2.partition}:iam::5678:role/S3Access`, { mutable: true }); + const role = iam.Role.fromRoleArn(stack2, 'Role', `arn:${stack2.partition}:iam::567890123456:role/S3Access`, { mutable: true }); // WHEN doGrant(resource, role); @@ -120,13 +120,13 @@ test('Agnostic stack with concrete imported role adds trust', () => { // GIVEN const stack = new cdk.Stack(app, 'AgStack'); const resource = new FakeResource(stack, 'Resource'); - const role = iam.Role.fromRoleArn(stack2, 'Role', 'arn:aws:iam::5678:role/S3Access', { mutable: true }); + const role = iam.Role.fromRoleArn(stack2, 'Role', 'arn:aws:iam::567890123456:role/S3Access', { mutable: true }); // WHEN doGrant(resource, role); // THEN - assertTrustCreated(stack, { AWS: 'arn:aws:iam::5678:role/S3Access' }); + assertTrustCreated(stack, { AWS: 'arn:aws:iam::567890123456:role/S3Access' }); noPolicyCreated(stack); }); diff --git a/packages/aws-cdk-lib/aws-iam/test/policy-document.test.ts b/packages/aws-cdk-lib/aws-iam/test/policy-document.test.ts index 09af35f469636..074c265591b10 100644 --- a/packages/aws-cdk-lib/aws-iam/test/policy-document.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/policy-document.test.ts @@ -241,14 +241,14 @@ describe('IAM policy document', () => { const stack = new Stack(); const p = new PolicyStatement(); - p.addAwsAccountPrincipal('1234'); - p.addAwsAccountPrincipal('5678'); + p.addAwsAccountPrincipal('123456789012'); + p.addAwsAccountPrincipal('345678901234'); expect(stack.resolve(p.toStatementJson())).toEqual({ Effect: 'Allow', Principal: { AWS: [ - { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::1234:root']] }, - { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::5678:root']] }, + { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::123456789012:root']] }, + { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::345678901234:root']] }, ], }, }); diff --git a/packages/aws-cdk-lib/aws-kms/test/key.test.ts b/packages/aws-cdk-lib/aws-kms/test/key.test.ts index 298a82730dc45..ebfd5c59135ff 100644 --- a/packages/aws-cdk-lib/aws-kms/test/key.test.ts +++ b/packages/aws-cdk-lib/aws-kms/test/key.test.ts @@ -337,7 +337,7 @@ describe('key policies', () => { test('grant for a principal in a different account', () => { const app = new cdk.App(); - const principalStack = new cdk.Stack(app, 'PrincipalStack', { env: { account: '0123456789012' } }); + const principalStack = new cdk.Stack(app, 'PrincipalStack', { env: { account: '123456789012' } }); const principal = new iam.Role(principalStack, 'Role', { assumedBy: new iam.AnyPrincipal(), roleName: 'MyRolePhysicalName', @@ -357,7 +357,7 @@ describe('key policies', () => { 'kms:GenerateDataKey*', ], Effect: 'Allow', - Principal: { AWS: { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::0123456789012:role/MyRolePhysicalName']] } }, + Principal: { AWS: { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::123456789012:role/MyRolePhysicalName']] } }, Resource: '*', }]), Version: '2012-10-17', @@ -383,7 +383,7 @@ describe('key policies', () => { test('grant for an immutable role', () => { const app = new cdk.App(); - const principalStack = new cdk.Stack(app, 'PrincipalStack', { env: { account: '0123456789012' } }); + const principalStack = new cdk.Stack(app, 'PrincipalStack', { env: { account: '123456789012' } }); const principal = new iam.Role(principalStack, 'Role', { assumedBy: new iam.AnyPrincipal(), roleName: 'MyRolePhysicalName', @@ -409,7 +409,7 @@ describe('key policies', () => { 'kms:GenerateDataKey*', ], Effect: 'Allow', - Principal: { AWS: { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::0123456789012:root']] } }, + Principal: { AWS: { 'Fn::Join': ['', ['arn:', { Ref: 'AWS::Partition' }, ':iam::123456789012:root']] } }, Resource: '*', }]), Version: '2012-10-17', diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index b656f02af036d..f444a3e6cb82b 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -220,7 +220,7 @@ describe('function', () => { .toThrow(/Invalid principal type for Lambda permission statement/); fn.addPermission('S1', { principal: new iam.ServicePrincipal('my-service') }); - fn.addPermission('S2', { principal: new iam.AccountPrincipal('account') }); + fn.addPermission('S2', { principal: new iam.AccountPrincipal('123456789012') }); fn.addPermission('S3', { principal: new iam.ArnPrincipal('my:arn') }); fn.addPermission('S4', { principal: new iam.OrganizationPrincipal('my:org') }); }); @@ -1280,7 +1280,7 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('1234'), + assumedBy: new iam.AccountPrincipal('123456789012'), }); const fn = new lambda.Function(stack, 'Function', { code: lambda.Code.fromInline('xxx'), @@ -1581,8 +1581,8 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const compositePrincipal = new iam.CompositePrincipal( - new iam.AccountPrincipal('1234'), - new iam.AccountPrincipal('5678'), + new iam.AccountPrincipal('123456789012'), + new iam.AccountPrincipal('567890123456'), ); const fn = new lambda.Function(stack, 'Function', { @@ -1603,7 +1603,7 @@ describe('function', () => { 'Arn', ], }, - Principal: '1234', + Principal: '123456789012', }); Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { Action: 'lambda:InvokeFunction', @@ -1613,7 +1613,7 @@ describe('function', () => { 'Arn', ], }, - Principal: '5678', + Principal: '567890123456', }); }); @@ -1621,7 +1621,7 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const compositePrincipal = new iam.CompositePrincipal( - new iam.AccountPrincipal('1234'), + new iam.AccountPrincipal('123456789012'), new iam.ServicePrincipal('apigateway.amazonaws.com'), new iam.ArnPrincipal('arn:aws:iam::123456789012:role/someRole'), new iam.OrganizationPrincipal('my-org-id'), @@ -1645,7 +1645,7 @@ describe('function', () => { 'Arn', ], }, - Principal: '1234', + Principal: '123456789012', }); Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { Action: 'lambda:InvokeFunction', @@ -3269,7 +3269,7 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('1234'), + assumedBy: new iam.AccountPrincipal('123456789012'), }); const fn = new lambda.Function(stack, 'MyLambda', { code: new lambda.InlineCode('hello()'), diff --git a/packages/aws-cdk-lib/aws-opensearchservice/test/domain.test.ts b/packages/aws-cdk-lib/aws-opensearchservice/test/domain.test.ts index abde6c1fb499c..b0833e7fb9a8b 100644 --- a/packages/aws-cdk-lib/aws-opensearchservice/test/domain.test.ts +++ b/packages/aws-cdk-lib/aws-opensearchservice/test/domain.test.ts @@ -18,7 +18,7 @@ let stack: Stack; beforeEach(() => { app = new App(); stack = new Stack(app, 'Stack', { - env: { account: '1234', region: 'testregion' }, + env: { account: '123456789012', region: 'testregion' }, }); jest.resetAllMocks(); @@ -262,7 +262,7 @@ each([testedOpenSearchVersions]).test('can set a self-referencing custom policy' new iam.PolicyStatement({ actions: ['es:ESHttpPost', 'es:ESHttpPut'], effect: iam.Effect.ALLOW, - principals: [new iam.AccountPrincipal('5678')], + principals: [new iam.AccountPrincipal('567890123456')], resources: [domain.domainArn, `${domain.domainArn}/*`], }), ); @@ -279,7 +279,7 @@ each([testedOpenSearchVersions]).test('can set a self-referencing custom policy' { Ref: 'AWS::Partition', }, - ':iam::5678:root\\"},\\"Resource\\":[\\"', + ':iam::567890123456:root\\"},\\"Resource\\":[\\"', { 'Fn::GetAtt': [ 'Domain66AC69E0', @@ -433,7 +433,7 @@ each([testedOpenSearchVersions]).test('multiAZWithStandbyEnabled: true throws wi each([testedOpenSearchVersions]).test('ENABLE_OPENSEARCH_MULTIAZ_WITH_STANDBY set multiAZWithStandbyEnabled value', (engineVersion) => { const stackWithFlag = new Stack(app, 'StackWithFlag', { - env: { account: '1234', region: 'testregion' }, + env: { account: '123456789012', region: 'testregion' }, }); stackWithFlag.node.setContext(cxapi.ENABLE_OPENSEARCH_MULTIAZ_WITH_STANDBY, true); new Domain(stackWithFlag, 'Domain', { @@ -1058,7 +1058,7 @@ each(testedOpenSearchVersions).describe('grants', (engineVersion) => { { Ref: 'AWS::Partition', }, - ':es:testregion:1234:domain/test-domain-2w2x2u3tifly', + ':es:testregion:123456789012:domain/test-domain-2w2x2u3tifly', ], ], }, @@ -1070,7 +1070,7 @@ each(testedOpenSearchVersions).describe('grants', (engineVersion) => { { Ref: 'AWS::Partition', }, - ':es:testregion:1234:domain/test-domain-2w2x2u3tifly/*', + ':es:testregion:123456789012:domain/test-domain-2w2x2u3tifly/*', ], ], }, @@ -1240,7 +1240,7 @@ describe('import', () => { const imported = Domain.fromDomainEndpoint(stack, 'Domain', domainEndpoint); expect(imported.domainName).toEqual(domainName); - expect(imported.domainArn).toMatch(RegExp(`es:testregion:1234:domain/${domainName}$`)); + expect(imported.domainArn).toMatch(RegExp(`es:testregion:123456789012:domain/${domainName}$`)); expect(imported.domainEndpoint).toEqual(domainEndpointWithoutHttps); Template.fromStack(stack).resourceCountIs('AWS::OpenSearchService::Domain', 0); @@ -1248,7 +1248,7 @@ describe('import', () => { test('static fromDomainAttributes(attributes) allows importing an external/existing domain', () => { const domainName = 'test-domain-2w2x2u3tifly'; - const domainArn = `arn:aws:es:testregion:1234:domain/${domainName}`; + const domainArn = `arn:aws:es:testregion:123456789012:domain/${domainName}`; const domainEndpointWithoutHttps = `${domainName}-jcjotrt6f7otem4sqcwbch3c4u.testregion.es.amazonaws.com`; const domainEndpoint = `https://${domainEndpointWithoutHttps}`; const imported = Domain.fromDomainAttributes(stack, 'Domain', { @@ -2775,7 +2775,7 @@ function testMetric( period, statistic, dimensions: { - ClientId: '1234', + ClientId: '123456789012', }, }); expect(metric.dimensions).toHaveProperty('DomainName'); diff --git a/packages/aws-cdk-lib/aws-rds/test/cluster.test.ts b/packages/aws-cdk-lib/aws-rds/test/cluster.test.ts index b62f574518097..2f2a11a41ab88 100644 --- a/packages/aws-cdk-lib/aws-rds/test/cluster.test.ts +++ b/packages/aws-cdk-lib/aws-rds/test/cluster.test.ts @@ -2007,7 +2007,7 @@ describe('cluster', () => { metricName: 'CPUUtilization', period: cdk.Duration.minutes(5), statistic: 'Average', - account: '12345', + account: '123456789012', region: 'us-test-1', }); }); @@ -4167,7 +4167,7 @@ describe('cluster', () => { { Ref: 'AWS::Partition', }, - ':rds-db:us-test-1:12345:dbuser:', + ':rds-db:us-test-1:123456789012:dbuser:', { 'Fn::GetAtt': [ 'DatabaseB269D8BB', @@ -4285,7 +4285,7 @@ describe('cluster', () => { [ 'arn:', { Ref: 'AWS::Partition' }, - ':rds:us-test-1:12345:cluster:', + ':rds:us-test-1:123456789012:cluster:', { Ref: 'DatabaseB269D8BB' }, ], ], @@ -4350,7 +4350,7 @@ describe('cluster', () => { [ 'arn:', { Ref: 'AWS::Partition' }, - ':rds:us-test-1:12345:cluster:', + ':rds:us-test-1:123456789012:cluster:', { Ref: 'DatabaseB269D8BB' }, ], ], @@ -4463,7 +4463,7 @@ test.each([ }); function testStack(app?: cdk.App, stackId?: string) { - const stack = new cdk.Stack(app, stackId, { env: { account: '12345', region: 'us-test-1' } }); - stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); + const stack = new cdk.Stack(app, stackId, { env: { account: '123456789012', region: 'us-test-1' } }); + stack.node.setContext('availability-zones:123456789012:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/aws-cdk-lib/aws-rds/test/database-secretmanager.test.ts b/packages/aws-cdk-lib/aws-rds/test/database-secretmanager.test.ts index 202491883f5d1..5965078122eab 100644 --- a/packages/aws-cdk-lib/aws-rds/test/database-secretmanager.test.ts +++ b/packages/aws-cdk-lib/aws-rds/test/database-secretmanager.test.ts @@ -36,7 +36,7 @@ describe('database secret manager', () => { { Ref: 'AWS::Partition', }, - ':secretsmanager:us-test-1:12345:secret:myDBLoginInfo:SecretString:username::}}', + ':secretsmanager:us-test-1:123456789012:secret:myDBLoginInfo:SecretString:username::}}', ], ], }, @@ -48,7 +48,7 @@ describe('database secret manager', () => { { Ref: 'AWS::Partition', }, - ':secretsmanager:us-test-1:12345:secret:myDBLoginInfo:SecretString:password::}}', + ':secretsmanager:us-test-1:123456789012:secret:myDBLoginInfo:SecretString:password::}}', ], ], }, @@ -69,7 +69,7 @@ describe('database secret manager', () => { }); function testStack() { - const stack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); - stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); + const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); + stack.node.setContext('availability-zones:123456789012:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/aws-cdk-lib/aws-rds/test/instance.test.ts b/packages/aws-cdk-lib/aws-rds/test/instance.test.ts index 84a303309b597..3641e4fb131f4 100644 --- a/packages/aws-cdk-lib/aws-rds/test/instance.test.ts +++ b/packages/aws-cdk-lib/aws-rds/test/instance.test.ts @@ -2118,11 +2118,11 @@ test.each([ describe('cross-account instance', () => { test.each([ ['MyInstance', 'MyInstance', 'myinstance'], - ['PhysicalName.GENERATE_IF_NEEDED', cdk.PhysicalName.GENERATE_IF_NEEDED, 'instancestackncestackinstancec830ba83756a6dfc7154'], + ['PhysicalName.GENERATE_IF_NEEDED', cdk.PhysicalName.GENERATE_IF_NEEDED, 'instancestackncestackinstancec830ba832991dc808c38'], ])("with database identifier '%s' can be referenced from a Stack in a different account", (_, providedInstanceId, expectedInstanceId) => { const app = new cdk.App(); const instanceStack = new cdk.Stack(app, 'InstanceStack', { - env: { account: '123', region: 'my-region' }, + env: { account: '123456789012', region: 'my-region' }, }); const instance = new rds.DatabaseInstance(instanceStack, 'Instance', { vpc: new ec2.Vpc(instanceStack, 'Vpc'), @@ -2148,7 +2148,7 @@ describe('cross-account instance', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - `:rds:my-region:123:db:${expectedInstanceId}`, + `:rds:my-region:123456789012:db:${expectedInstanceId}`, ]], }, }, diff --git a/packages/aws-cdk-lib/aws-rds/test/serverless-cluster-from-snapshot.test.ts b/packages/aws-cdk-lib/aws-rds/test/serverless-cluster-from-snapshot.test.ts index 9c289c472a4a9..ef1881b805ed9 100644 --- a/packages/aws-cdk-lib/aws-rds/test/serverless-cluster-from-snapshot.test.ts +++ b/packages/aws-cdk-lib/aws-rds/test/serverless-cluster-from-snapshot.test.ts @@ -163,7 +163,7 @@ describe('serverless cluster from snapshot', () => { }); function testStack(): cdk.Stack { - const stack = new cdk.Stack(undefined, undefined, { env: { account: '12345', region: 'us-test-1' } }); + const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/aws-cdk-lib/aws-rds/test/serverless-cluster.test.ts b/packages/aws-cdk-lib/aws-rds/test/serverless-cluster.test.ts index 5382baf85984c..ebc1d6658c19c 100644 --- a/packages/aws-cdk-lib/aws-rds/test/serverless-cluster.test.ts +++ b/packages/aws-cdk-lib/aws-rds/test/serverless-cluster.test.ts @@ -620,7 +620,7 @@ describe('serverless cluster', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':rds:us-test-1:12345:cluster:', + ':rds:us-test-1:123456789012:cluster:', { Ref: 'DatabaseB269D8BB' }, ]], }); @@ -988,7 +988,7 @@ describe('serverless cluster', () => { }); function testStack(app?: cdk.App, id?: string): cdk.Stack { - const stack = new cdk.Stack(app, id, { env: { account: '12345', region: 'us-test-1' } }); - stack.node.setContext('availability-zones:12345:us-test-1', ['us-test-1a', 'us-test-1b']); + const stack = new cdk.Stack(app, id, { env: { account: '123456789012', region: 'us-test-1' } }); + stack.node.setContext('availability-zones:123456789012:us-test-1', ['us-test-1a', 'us-test-1b']); return stack; } diff --git a/packages/aws-cdk-lib/aws-route53/test/hosted-zone-provider.test.ts b/packages/aws-cdk-lib/aws-route53/test/hosted-zone-provider.test.ts index 94a42bdf85920..b39c379d63fde 100644 --- a/packages/aws-cdk-lib/aws-route53/test/hosted-zone-provider.test.ts +++ b/packages/aws-cdk-lib/aws-route53/test/hosted-zone-provider.test.ts @@ -7,7 +7,7 @@ describe('hosted zone provider', () => { // GIVEN const app = new cdk.App(); const stack = new cdk.Stack(app, 'TestStack', { - env: { account: '12345', region: 'us-east-1' }, + env: { account: '123456789012', region: 'us-east-1' }, }); const filter = { domainName: 'test.com' }; @@ -30,7 +30,7 @@ describe('hosted zone provider', () => { }; const stack2 = new cdk.Stack(undefined, 'TestStack', { - env: { account: '12345', region: 'us-east-1' }, + env: { account: '123456789012', region: 'us-east-1' }, }); stack2.node.setContext(missing[0].key, fakeZone); @@ -45,7 +45,7 @@ describe('hosted zone provider', () => { // GIVEN const app = new cdk.App(); const stack = new cdk.Stack(app, 'TestStack', { - env: { account: '12345', region: 'us-east-1' }, + env: { account: '123456789012', region: 'us-east-1' }, }); const filter = { domainName: 'test.com' }; @@ -68,7 +68,7 @@ describe('hosted zone provider', () => { }; const stack2 = new cdk.Stack(undefined, 'TestStack', { - env: { account: '12345', region: 'us-east-1' }, + env: { account: '123456789012', region: 'us-east-1' }, }); stack2.node.setContext(missing[0].key, fakeZone); diff --git a/packages/aws-cdk-lib/aws-route53/test/hosted-zone.test.ts b/packages/aws-cdk-lib/aws-route53/test/hosted-zone.test.ts index aa0de897d6007..e3fc27f778ceb 100644 --- a/packages/aws-cdk-lib/aws-route53/test/hosted-zone.test.ts +++ b/packages/aws-cdk-lib/aws-route53/test/hosted-zone.test.ts @@ -239,7 +239,7 @@ test('grantDelegation', () => { }); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('22222222222222'), + assumedBy: new iam.AccountPrincipal('222222222222'), }); const zone = new PublicHostedZone(stack, 'Zone', { diff --git a/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts b/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts index b325641c43cad..f5b503cc0612d 100644 --- a/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts +++ b/packages/aws-cdk-lib/aws-secretsmanager/test/secret.test.ts @@ -414,7 +414,7 @@ test('grantRead cross account', () => { { Ref: 'AWS::Partition', }, - ':iam::1234:root', + ':iam::123456789012:root', ], ], }, @@ -461,7 +461,7 @@ test('grantRead cross account', () => { { Ref: 'AWS::Partition', }, - ':iam::1234:root', + ':iam::123456789012:root', ], ], }, @@ -1360,8 +1360,8 @@ describe('secretObjectValue', () => { test('cross-environment grant with direct object reference', () => { // GIVEN - const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '1111111111' } }); - const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '1111111111' } }); + const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '111111111111' } }); + const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '111111111111' } }); const secret = new secretsmanager.Secret(producerStack, 'Secret', { secretName: 'MySecret' }); const role = new iam.Role(consumerStack, 'Role', { assumedBy: new iam.AccountRootPrincipal() }); @@ -1382,7 +1382,7 @@ test('cross-environment grant with direct object reference', () => { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':secretsmanager:foo:1111111111:secret:MySecret-??????', + ':secretsmanager:foo:111111111111:secret:MySecret-??????', ]], }, }], @@ -1393,9 +1393,9 @@ test('cross-environment grant with direct object reference', () => { test('cross-environment grant with imported from completeArn', () => { // GIVEN - const secretCompleteArn = 'arn:aws:secretsmanager:foobar:1111111111:secret:secret-name-suffix'; - const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '1111111111' } }); - const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '1111111111' } }); + const secretCompleteArn = 'arn:aws:secretsmanager:foobar:111111111111:secret:secret-name-suffix'; + const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '111111111111' } }); + const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '111111111111' } }); const secret = secretsmanager.Secret.fromSecretCompleteArn(producerStack, 'Secret', secretCompleteArn); const role = new iam.Role(consumerStack, 'Role', { assumedBy: new iam.AccountRootPrincipal() }); @@ -1421,9 +1421,9 @@ test('cross-environment grant with imported from completeArn', () => { test('cross-environment grant with imported from partialArn', () => { // GIVEN - const secretPartialArn = 'arn:aws:secretsmanager:foobar:1111111111:secret:secret-name'; - const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '1111111111' } }); - const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '1111111111' } }); + const secretPartialArn = 'arn:aws:secretsmanager:foobar:111111111111:secret:secret-name'; + const producerStack = new cdk.Stack(app, 'ProducerStack', { env: { region: 'foo', account: '111111111111' } }); + const consumerStack = new cdk.Stack(app, 'ConsumerStack', { env: { region: 'bar', account: '111111111111' } }); const secret = secretsmanager.Secret.fromSecretPartialArn(producerStack, 'Secret', secretPartialArn); const role = new iam.Role(consumerStack, 'Role', { assumedBy: new iam.AccountRootPrincipal() }); diff --git a/packages/aws-cdk-lib/aws-sns-subscriptions/test/subs.test.ts b/packages/aws-cdk-lib/aws-sns-subscriptions/test/subs.test.ts index aa70888651178..bd890d1940eeb 100644 --- a/packages/aws-cdk-lib/aws-sns-subscriptions/test/subs.test.ts +++ b/packages/aws-cdk-lib/aws-sns-subscriptions/test/subs.test.ts @@ -313,13 +313,13 @@ test('queue subscription cross region', () => { const app = new App(); const topicStack = new Stack(app, 'TopicStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, }); const queueStack = new Stack(app, 'QueueStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-2', }, }); @@ -369,7 +369,7 @@ test('queue subscription cross region', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, @@ -408,7 +408,7 @@ test('queue subscription cross region', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, @@ -527,7 +527,7 @@ test('queue subscription cross region, topic env agnostic', () => { const topicStack = new Stack(app, 'TopicStack', {}); const queueStack = new Stack(app, 'QueueStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, }); @@ -652,7 +652,7 @@ test('queue subscription cross region, queue env agnostic', () => { const app = new App(); const topicStack = new Stack(app, 'TopicStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, }); @@ -703,7 +703,7 @@ test('queue subscription cross region, queue env agnostic', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, @@ -742,7 +742,7 @@ test('queue subscription cross region, queue env agnostic', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, @@ -1444,13 +1444,13 @@ test('lambda subscription, cross region', () => { const app = new App(); const topicStack = new Stack(app, 'TopicStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, }); const lambdaStack = new Stack(app, 'LambdaStack', { env: { - account: '11111111111', + account: '111111111111', region: 'us-east-2', }, }); @@ -1538,7 +1538,7 @@ test('lambda subscription, cross region', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, @@ -1556,7 +1556,7 @@ test('lambda subscription, cross region', () => { { 'Ref': 'AWS::Partition', }, - ':sns:us-east-1:11111111111:topicName', + ':sns:us-east-1:111111111111:topicName', ], ], }, diff --git a/packages/aws-cdk-lib/core/test/app.test.ts b/packages/aws-cdk-lib/core/test/app.test.ts index 49654658ef8d4..05c457e21239e 100644 --- a/packages/aws-cdk-lib/core/test/app.test.ts +++ b/packages/aws-cdk-lib/core/test/app.test.ts @@ -25,7 +25,7 @@ function withApp(props: AppProps, block: (app: App) => void): cxapi.CloudAssembl function synth(context?: { [key: string]: any }): cxapi.CloudAssembly { return withApp({ context }, app => { - const stack1 = new Stack(app, 'stack1', { env: { account: '12345', region: 'us-east-1' } }); + const stack1 = new Stack(app, 'stack1', { env: { account: '123456789012', region: 'us-east-1' } }); new CfnResource(stack1, 's1c1', { type: 'DummyResource', properties: { Prop1: 'Prop1' } }); const r2 = new CfnResource(stack1, 's1c2', { type: 'DummyResource', properties: { Foo: 123 } }); @@ -63,9 +63,9 @@ describe('app', () => { const stack1 = response.stacks[0]; expect(stack1.stackName).toEqual('stack1'); expect(stack1.id).toEqual('stack1'); - expect(stack1.environment.account).toEqual('12345'); + expect(stack1.environment.account).toEqual('123456789012'); expect(stack1.environment.region).toEqual('us-east-1'); - expect(stack1.environment.name).toEqual('aws://12345/us-east-1'); + expect(stack1.environment.name).toEqual('aws://123456789012/us-east-1'); expect(stack1.template).toEqual({ Resources: { diff --git a/packages/aws-cdk-lib/core/test/context.test.ts b/packages/aws-cdk-lib/core/test/context.test.ts index e7d8c638ed5de..ef250b3053a69 100644 --- a/packages/aws-cdk-lib/core/test/context.test.ts +++ b/packages/aws-cdk-lib/core/test/context.test.ts @@ -6,7 +6,7 @@ import { synthesize } from '../lib/private/synthesis'; describe('context', () => { test('AvailabilityZoneProvider returns a list with dummy values if the context is not available', () => { - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); const azs = stack.availabilityZones; expect(azs).toEqual(['dummy1a', 'dummy1b', 'dummy1c']); @@ -15,7 +15,7 @@ describe('context', () => { test('AvailabilityZoneProvider will return context list if available', () => { const app = new App({ context: { [cxapi.NEW_STYLE_STACK_SYNTHESIS_CONTEXT]: false } }); - const stack = new Stack(app, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(app, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); const before = stack.availabilityZones; expect(before).toEqual(['dummy1a', 'dummy1b', 'dummy1c']); const key = expectedContextKey(stack); @@ -28,7 +28,7 @@ describe('context', () => { test('AvailabilityZoneProvider will complain if not given a list', () => { const app = new App({ context: { [cxapi.NEW_STYLE_STACK_SYNTHESIS_CONTEXT]: false } }); - const stack = new Stack(app, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(app, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); const before = stack.availabilityZones; expect(before).toEqual(['dummy1a', 'dummy1b', 'dummy1c']); const key = expectedContextKey(stack); @@ -41,7 +41,7 @@ describe('context', () => { }); test('ContextProvider consistently generates a key', () => { - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); const key = ContextProvider.getKey(stack, { provider: 'ssm', props: { @@ -51,9 +51,9 @@ describe('context', () => { }); expect(key).toEqual({ - key: 'ssm:account=12345:anyStringParam=bar:parameterName=foo:region=us-east-1', + key: 'ssm:account=123456789012:anyStringParam=bar:parameterName=foo:region=us-east-1', props: { - account: '12345', + account: '123456789012', region: 'us-east-1', parameterName: 'foo', anyStringParam: 'bar', @@ -69,9 +69,9 @@ describe('context', () => { }, }); expect(complexKey).toEqual({ - key: 'vpc:account=12345:cidrBlock=192.168.0.16:igw=false:region=us-east-1:tags.Env=Preprod:tags.Name=MyVPC', + key: 'vpc:account=123456789012:cidrBlock=192.168.0.16:igw=false:region=us-east-1:tags.Env=Preprod:tags.Name=MyVPC', props: { - account: '12345', + account: '123456789012', region: 'us-east-1', cidrBlock: '192.168.0.16', tags: { Name: 'MyVPC', Env: 'Preprod' }, @@ -82,7 +82,7 @@ describe('context', () => { test('Key generation can contain arbitrarily deep structures', () => { // GIVEN - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); // WHEN const key = ContextProvider.getKey(stack, { @@ -97,9 +97,9 @@ describe('context', () => { // THEN expect(key).toEqual({ - key: 'provider:account=12345:list.0.key=key1:list.0.value=value1:list.1.key=key2:list.1.value=value2:region=us-east-1', + key: 'provider:account=123456789012:list.0.key=key1:list.0.value=value1:list.1.key=key2:list.1.value=value2:region=us-east-1', props: { - account: '12345', + account: '123456789012', region: 'us-east-1', list: [ { key: 'key1', value: 'value1' }, @@ -111,7 +111,7 @@ describe('context', () => { test('Keys with undefined values are not serialized', () => { // GIVEN - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); // WHEN const result = ContextProvider.getKey(stack, { @@ -124,9 +124,9 @@ describe('context', () => { // THEN expect(result).toEqual({ - key: 'provider:account=12345:p1=42:region=us-east-1', + key: 'provider:account=123456789012:p1=42:region=us-east-1', props: { - account: '12345', + account: '123456789012', region: 'us-east-1', p1: 42, p2: undefined, @@ -136,10 +136,10 @@ describe('context', () => { test('context provider errors are attached to tree', () => { const contextProps = { provider: 'availability-zones' }; - const contextKey = 'availability-zones:account=12345:region=us-east-1'; // Depends on the mangling algo + const contextKey = 'availability-zones:account=123456789012:region=us-east-1'; // Depends on the mangling algo // GIVEN - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); // NOTE: error key is inlined here because it's part of the CX-API // compatibility surface. @@ -161,7 +161,7 @@ describe('context', () => { }); test('can skip account/region from attach to context', () => { - const stack = new Stack(undefined, 'TestStack', { env: { account: '12345', region: 'us-east-1' } }); + const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: 'us-east-1' } }); expect(ContextProvider.getKey(stack, { provider: 'asdf', includeEnvironment: false }).key).toEqual('asdf:'); }); }); diff --git a/packages/aws-cdk-lib/core/test/stack.test.ts b/packages/aws-cdk-lib/core/test/stack.test.ts index 82be67b19499b..19488fa7515cb 100644 --- a/packages/aws-cdk-lib/core/test/stack.test.ts +++ b/packages/aws-cdk-lib/core/test/stack.test.ts @@ -1769,7 +1769,7 @@ describe('stack', () => { const app = new App(); const stack1 = new Stack(app, 'Stack1', { env: { account: '123456789012', region: 'es-norst-1' } }); const account1 = new ScopedAws(stack1).accountId; - const stack2 = new Stack(app, 'Stack2', { env: { account: '11111111111', region: 'es-norst-2' } }); + const stack2 = new Stack(app, 'Stack2', { env: { account: '111111111111', region: 'es-norst-2' } }); // WHEN new CfnParameter(stack2, 'SomeParameter', { type: 'String', default: account1 }); @@ -2178,7 +2178,7 @@ describe('stack', () => { test('account id passed in stack environment must be a string', () => { // GIVEN const envConfig: any = { - account: 11111111111, + account: 111111111111, }; // WHEN diff --git a/packages/aws-cdk-lib/pipelines/lib/docker-credentials.ts b/packages/aws-cdk-lib/pipelines/lib/docker-credentials.ts index 5b59da3314b14..1836ac6d9174a 100644 --- a/packages/aws-cdk-lib/pipelines/lib/docker-credentials.ts +++ b/packages/aws-cdk-lib/pipelines/lib/docker-credentials.ts @@ -30,7 +30,7 @@ export abstract class DockerCredential { * Creates a DockerCredential for one or more ECR repositories. * * NOTE - All ECR repositories in the same account and region share a domain name - * (e.g., 0123456789012.dkr.ecr.eu-west-1.amazonaws.com), and can only have one associated + * (e.g., 123456789012.dkr.ecr.eu-west-1.amazonaws.com), and can only have one associated * set of credentials (and DockerCredential). Attempting to associate one set of credentials * with one ECR repo and another with another ECR repo in the same account and region will * result in failures when using these credentials in the pipeline. diff --git a/packages/aws-cdk-lib/pipelines/test/codepipeline/codepipeline.test.ts b/packages/aws-cdk-lib/pipelines/test/codepipeline/codepipeline.test.ts index ed265b78327f0..f3f8c3bd34d96 100644 --- a/packages/aws-cdk-lib/pipelines/test/codepipeline/codepipeline.test.ts +++ b/packages/aws-cdk-lib/pipelines/test/codepipeline/codepipeline.test.ts @@ -61,18 +61,18 @@ describe('CodePipeline support stack reuse', () => { const supportStackATemplate = Template.fromJSON(supportStackAArtifact.template); supportStackATemplate.hasResourceProperties('AWS::S3::Bucket', { - BucketName: 'pipelinestacka-support-useplicationbucket80db3753a0ebbf052279', + BucketName: 'pipelinestacka-support-useplicationbucket80db37539447715cac4f', }); supportStackATemplate.hasResourceProperties('AWS::KMS::Alias', { - AliasName: 'alias/pport-ustencryptionalias5cad45754e1ff088476b', + AliasName: 'alias/pport-ustencryptionalias5cad4575e12193eb33f2', }); const supportStackBTemplate = Template.fromJSON(supportStackBArtifact.template); supportStackBTemplate.hasResourceProperties('AWS::S3::Bucket', { - BucketName: 'pipelinestackb-support-useplicationbucket1d556ec7f959b336abf8', + BucketName: 'pipelinestackb-support-useplicationbucket1d556ec771e60c10c683', }); supportStackBTemplate.hasResourceProperties('AWS::KMS::Alias', { - AliasName: 'alias/pport-ustencryptionalias668c7ffd0de17c9867b0', + AliasName: 'alias/pport-ustencryptionalias668c7ffd2deea6ebc8a4', }); }); }); diff --git a/packages/aws-cdk-lib/pipelines/test/compliance/assets.test.ts b/packages/aws-cdk-lib/pipelines/test/compliance/assets.test.ts index 1f222fee6c439..3e0e4d4d024ee 100644 --- a/packages/aws-cdk-lib/pipelines/test/compliance/assets.test.ts +++ b/packages/aws-cdk-lib/pipelines/test/compliance/assets.test.ts @@ -410,7 +410,7 @@ describe('basic pipeline', () => { pipeline.addApplicationStage(new FileAssetApp(app, 'App1')); pipeline.addApplicationStage(new FileAssetApp(app, 'App2', { env: { - account: '0123456789012', + account: '123456789012', region: 'eu-west-1', }, })); @@ -427,7 +427,7 @@ describe('basic pipeline', () => { pipeline.addStage(new FileAssetApp(app, 'App1')); pipeline.addStage(new FileAssetApp(app, 'App2', { env: { - account: '0123456789012', + account: '123456789012', region: 'eu-west-1', }, })); @@ -437,7 +437,7 @@ describe('basic pipeline', () => { function THEN_codePipelineExpectation() { Template.fromStack(pipelineStack).hasResourceProperties('AWS::IAM::Policy', - expectedAssetRolePolicy([FILE_PUBLISHING_ROLE, 'arn:${AWS::Partition}:iam::0123456789012:role/cdk-hnb659fds-file-publishing-role-0123456789012-eu-west-1'], + expectedAssetRolePolicy([FILE_PUBLISHING_ROLE, 'arn:${AWS::Partition}:iam::123456789012:role/cdk-hnb659fds-file-publishing-role-123456789012-eu-west-1'], 'CdkAssetsFileRole6BE17A07')); } }); @@ -980,7 +980,7 @@ behavior('necessary secrets manager permissions get added to asset roles', suite [ 'arn:', { Ref: 'AWS::Partition' }, - ':secretsmanager:us-pipeline:123pipeline:secret:FoobarSecret-??????', + ':secretsmanager:us-pipeline:123456789012:secret:FoobarSecret-??????', ], ], }, @@ -1022,7 +1022,7 @@ behavior('adding environment variable to assets job adds SecretsManager permissi 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':secretsmanager:us-pipeline:123pipeline:secret:FoobarSecret-??????', + ':secretsmanager:us-pipeline:123456789012:secret:FoobarSecret-??????', ]], }, }), diff --git a/packages/aws-cdk-lib/pipelines/test/compliance/docker-credentials.test.ts b/packages/aws-cdk-lib/pipelines/test/compliance/docker-credentials.test.ts index e0266239dff2d..b778603155e56 100644 --- a/packages/aws-cdk-lib/pipelines/test/compliance/docker-credentials.test.ts +++ b/packages/aws-cdk-lib/pipelines/test/compliance/docker-credentials.test.ts @@ -8,9 +8,9 @@ import { CodeBuildStep } from '../../lib'; import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../../lib/private/default-codebuild-image'; import { behavior, PIPELINE_ENV, TestApp, LegacyTestGitHubNpmPipeline, ModernTestGitHubNpmPipeline, DockerAssetApp, stringLike } from '../testhelpers'; -const secretSynthArn = 'arn:aws:secretsmanager:eu-west-1:0123456789012:secret:synth-012345'; -const secretUpdateArn = 'arn:aws:secretsmanager:eu-west-1:0123456789012:secret:update-012345'; -const secretPublishArn = 'arn:aws:secretsmanager:eu-west-1:0123456789012:secret:publish-012345'; +const secretSynthArn = 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:synth-012345'; +const secretUpdateArn = 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:update-012345'; +const secretPublishArn = 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:publish-012345'; let app: TestApp; let pipelineStack: Stack; diff --git a/packages/aws-cdk-lib/pipelines/test/compliance/self-mutation.test.ts b/packages/aws-cdk-lib/pipelines/test/compliance/self-mutation.test.ts index 98828dc57eb47..e28d36f6f1900 100644 --- a/packages/aws-cdk-lib/pipelines/test/compliance/self-mutation.test.ts +++ b/packages/aws-cdk-lib/pipelines/test/compliance/self-mutation.test.ts @@ -218,7 +218,7 @@ behavior('self-update project role uses tagged bootstrap-role permissions', (sui { Action: 'sts:AssumeRole', Effect: 'Allow', - Resource: 'arn:*:iam::123pipeline:role/*', + Resource: 'arn:*:iam::123456789012:role/*', Condition: { 'ForAnyValue:StringEquals': { 'iam:ResourceTag/aws-cdk:bootstrap-role': ['image-publishing', 'file-publishing', 'deploy'], diff --git a/packages/aws-cdk-lib/pipelines/test/testhelpers/test-app.ts b/packages/aws-cdk-lib/pipelines/test/testhelpers/test-app.ts index 89332e69c056c..a54e331c0c676 100644 --- a/packages/aws-cdk-lib/pipelines/test/testhelpers/test-app.ts +++ b/packages/aws-cdk-lib/pipelines/test/testhelpers/test-app.ts @@ -8,7 +8,7 @@ import { App, AppProps, Environment, CfnOutput, Stage, StageProps, Stack, StackP import { assemblyBuilderOf } from '../../lib/private/construct-internals'; export const PIPELINE_ENV: Environment = { - account: '123pipeline', + account: '123456789012', region: 'us-pipeline', }; diff --git a/packages/aws-cdk/test/api/bootstrap.test.ts b/packages/aws-cdk/test/api/bootstrap.test.ts index 11fdac8cce89e..d1c54b70e62e1 100644 --- a/packages/aws-cdk/test/api/bootstrap.test.ts +++ b/packages/aws-cdk/test/api/bootstrap.test.ts @@ -157,7 +157,7 @@ test('passing trusted accounts to the old bootstrapping results in an error', as await expect(bootstrapper.bootstrapEnvironment(env, sdk, { toolkitStackName: 'mockStack', parameters: { - trustedAccounts: ['0123456789012'], + trustedAccounts: ['123456789012'], }, })) .rejects diff --git a/packages/aws-cdk/test/api/bootstrap2.test.ts b/packages/aws-cdk/test/api/bootstrap2.test.ts index d9ec9d563768a..ca75a625cbd38 100644 --- a/packages/aws-cdk/test/api/bootstrap2.test.ts +++ b/packages/aws-cdk/test/api/bootstrap2.test.ts @@ -44,7 +44,7 @@ describe('Bootstrapping v2', () => { const value = { Policy: { PolicyName: 'my-policy', - Arn: 'arn:aws:iam::0123456789012:policy/my-policy', + Arn: 'arn:aws:iam::123456789012:policy/my-policy', }, }; mockGetPolicyIamCode = jest.fn().mockReturnValue(value); diff --git a/packages/aws-cdk/test/api/logs/logs-monitor.test.ts b/packages/aws-cdk/test/api/logs/logs-monitor.test.ts index 5d35455b0c846..7e98d1847146a 100644 --- a/packages/aws-cdk/test/api/logs/logs-monitor.test.ts +++ b/packages/aws-cdk/test/api/logs/logs-monitor.test.ts @@ -31,7 +31,7 @@ test('process events', async () => { monitor.addLogGroups( { name: 'name', - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, sdk, @@ -69,7 +69,7 @@ test('process truncated events', async () => { monitor.addLogGroups( { name: 'name', - account: '11111111111', + account: '111111111111', region: 'us-east-1', }, sdk, diff --git a/packages/aws-cdk/test/context-providers/amis.test.ts b/packages/aws-cdk/test/context-providers/amis.test.ts index 70018ed8eaf84..ccf91695b7012 100644 --- a/packages/aws-cdk/test/context-providers/amis.test.ts +++ b/packages/aws-cdk/test/context-providers/amis.test.ts @@ -29,7 +29,7 @@ test('calls DescribeImages on the request', async () => { // WHEN await new AmiContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'asdf', owners: ['some-owner'], filters: { @@ -68,7 +68,7 @@ test('returns the most recent AMI matching the criteria', async () => { // WHEN const result = await new AmiContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'asdf', filters: {}, }); diff --git a/packages/aws-cdk/test/context-providers/asymmetric-vpcs.test.ts b/packages/aws-cdk/test/context-providers/asymmetric-vpcs.test.ts index 7d572685f0343..435347ba2b83b 100644 --- a/packages/aws-cdk/test/context-providers/asymmetric-vpcs.test.ts +++ b/packages/aws-cdk/test/context-providers/asymmetric-vpcs.test.ts @@ -68,7 +68,7 @@ test('looks up the requested (symmetric) VPC', async () => { }); const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -124,7 +124,7 @@ test('throws when no such VPC is found', async () => { }); await expect(new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -140,7 +140,7 @@ test('throws when multiple VPCs are found', async () => { // WHEN await expect(new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -195,7 +195,7 @@ test('uses the VPC main route table when a subnet has no specific association', }); const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -280,7 +280,7 @@ test('Recognize public subnet by route table', async () => { // WHEN const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -342,7 +342,7 @@ test('Recognize isolated subnet by route table', async () => { // WHEN const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -416,7 +416,7 @@ test('Recognize private subnet by route table', async () => { // WHEN const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -493,7 +493,7 @@ test('works for asymmetric subnets (not spanning the same Availability Zones)', // WHEN const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, @@ -621,7 +621,7 @@ test('allows specifying the subnet group name tag', async () => { }); const result = await new VpcNetworkContextProviderPlugin(mockSDK).getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter: { foo: 'bar' }, returnAsymmetricSubnets: true, diff --git a/packages/aws-cdk/test/context-providers/generic.test.ts b/packages/aws-cdk/test/context-providers/generic.test.ts index 07bfe967a635e..ec2da3b83da28 100644 --- a/packages/aws-cdk/test/context-providers/generic.test.ts +++ b/packages/aws-cdk/test/context-providers/generic.test.ts @@ -20,7 +20,7 @@ test('errors are reported into the context value', async () => { // WHEN await contextproviders.provideContextValues([ - { key: 'asdf', props: { account: '1234', region: 'us-east-1' }, provider: TEST_PROVIDER }, + { key: 'asdf', props: { account: '123456789012', region: 'us-east-1' }, provider: TEST_PROVIDER }, ], context, mockSDK); // THEN - error is now in context @@ -52,7 +52,7 @@ test('lookup role ARN is resolved', async () => { { key: 'asdf', props: { - account: '1234', + account: '123456789012', region: 'us-east-1', lookupRoleArn: 'arn:${AWS::Partition}:iam::280619947791:role/cdk-hnb659fds-lookup-role-280619947791-us-east-1', }, @@ -75,7 +75,7 @@ test('errors are marked transient', async () => { // WHEN await contextproviders.provideContextValues([ - { key: 'asdf', props: { account: '1234', region: 'us-east-1' }, provider: TEST_PROVIDER }, + { key: 'asdf', props: { account: '123456789012', region: 'us-east-1' }, provider: TEST_PROVIDER }, ], context, mockSDK); // THEN - error is marked transient @@ -96,7 +96,7 @@ test('context provider can be registered using PluginHost', async () => { // WHEN await contextproviders.provideContextValues([ - { key: 'asdf', props: { account: '1234', region: 'us-east-1', pluginName: 'prov' }, provider: PLUGIN_PROVIDER }, + { key: 'asdf', props: { account: '123456789012', region: 'us-east-1', pluginName: 'prov' }, provider: PLUGIN_PROVIDER }, ], context, mockSDK); // THEN - error is marked transient diff --git a/packages/aws-cdk/test/context-providers/keys.test.ts b/packages/aws-cdk/test/context-providers/keys.test.ts index 2503110745963..ed2c5d06f8311 100644 --- a/packages/aws-cdk/test/context-providers/keys.test.ts +++ b/packages/aws-cdk/test/context-providers/keys.test.ts @@ -31,7 +31,7 @@ test('looks up the requested Key - single result', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', aliasName: 'alias/foo', }); @@ -68,7 +68,7 @@ test('looks up the requested Key - multiple results', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', aliasName: 'alias/foo', }); @@ -125,7 +125,7 @@ test('looks up the requested Key - multiple results with pagination', async () = // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', aliasName: 'alias/foo', }); @@ -148,7 +148,7 @@ test('throw exception - no key found', async () => { // WHEN await expect(provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', aliasName: 'alias/foo', })).rejects.toThrow(/Could not find any key with alias named/); diff --git a/packages/aws-cdk/test/context-providers/load-balancers.test.ts b/packages/aws-cdk/test/context-providers/load-balancers.test.ts index a6a3a61b50264..1b80100547e62 100644 --- a/packages/aws-cdk/test/context-providers/load-balancers.test.ts +++ b/packages/aws-cdk/test/context-providers/load-balancers.test.ts @@ -183,7 +183,7 @@ describe('load balancer context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerArn: 'arn:load-balancer1', @@ -236,7 +236,7 @@ describe('load balancer context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [ @@ -267,7 +267,7 @@ describe('load balancer context provider plugin', () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerArn: 'arn:load-balancer1', @@ -327,7 +327,7 @@ describe('load balancer context provider plugin', () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [ @@ -379,7 +379,7 @@ describe('load balancer context provider plugin', () => { // WHEN const loadBalancer = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerTags: [{ key: 'some', value: 'tag' }], loadBalancerType: cxschema.LoadBalancerType.APPLICATION, @@ -401,7 +401,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [{ key: 'some', value: 'tag' }], @@ -433,7 +433,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerArn: 'arn:load-balancer', @@ -487,7 +487,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [{ key: 'some', value: 'tag' }], @@ -522,7 +522,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN const listener = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, listenerArn: 'arn:listener-arn', @@ -561,7 +561,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN const listener = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerArn: 'arn:load-balancer-arn1', @@ -627,7 +627,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN const listener = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [ @@ -742,7 +742,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN const listener = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.APPLICATION, loadBalancerTags: [{ key: 'some', value: 'tag' }], @@ -800,7 +800,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN const listener = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.NETWORK, loadBalancerTags: [{ key: 'some', value: 'tag' }], @@ -840,7 +840,7 @@ describe('load balancer listener context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', loadBalancerType: cxschema.LoadBalancerType.NETWORK, listenerArn: 'arn:listener-arn1', diff --git a/packages/aws-cdk/test/context-providers/security-groups.test.ts b/packages/aws-cdk/test/context-providers/security-groups.test.ts index c7bdc586ad7bc..bc810dfc9703f 100644 --- a/packages/aws-cdk/test/context-providers/security-groups.test.ts +++ b/packages/aws-cdk/test/context-providers/security-groups.test.ts @@ -27,7 +27,7 @@ describe('security group context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', }), @@ -65,7 +65,7 @@ describe('security group context provider plugin', () => { // WHEN const res = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', }); @@ -114,7 +114,7 @@ describe('security group context provider plugin', () => { // WHEN const res = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', vpcId: 'vpc-1234567', @@ -163,7 +163,7 @@ describe('security group context provider plugin', () => { // WHEN const res = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupName: 'my-security-group', }); @@ -215,7 +215,7 @@ describe('security group context provider plugin', () => { // WHEN const res = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupName: 'my-security-group', vpcId: 'vpc-1234567', @@ -251,7 +251,7 @@ describe('security group context provider plugin', () => { // WHEN const res = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', }); @@ -297,7 +297,7 @@ describe('security group context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', }), @@ -311,7 +311,7 @@ describe('security group context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', securityGroupId: 'sg-1234', securityGroupName: 'my-security-group', @@ -326,7 +326,7 @@ describe('security group context provider plugin', () => { // WHEN await expect( provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', }), ).rejects.toThrow(/\'securityGroupId\' or \'securityGroupName\' must be specified to look up a security group/i); diff --git a/packages/aws-cdk/test/context-providers/vpcs.test.ts b/packages/aws-cdk/test/context-providers/vpcs.test.ts index d9472126baaa1..e720f39a020fa 100644 --- a/packages/aws-cdk/test/context-providers/vpcs.test.ts +++ b/packages/aws-cdk/test/context-providers/vpcs.test.ts @@ -69,7 +69,7 @@ test('looks up the requested VPC', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); @@ -106,7 +106,7 @@ test('throws when no such VPC is found', async () => { // WHEN await expect(provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, })).rejects.toThrow(/Could not find any VPCs matching/); @@ -165,7 +165,7 @@ test('throws when subnet with subnetGroupNameTag not found', async () => { // WHEN await expect(provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', subnetGroupNameTag: 'DOES_NOT_EXIST', filter, @@ -225,7 +225,7 @@ test('does not throw when subnet with subnetGroupNameTag is found', async () => // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', subnetGroupNameTag: 'DOES_EXIST', filter, @@ -263,7 +263,7 @@ test('throws when multiple VPCs are found', async () => { // WHEN await expect(provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, })).rejects.toThrow(/Found 2 VPCs matching/); @@ -322,7 +322,7 @@ test('uses the VPC main route table when a subnet has no specific association', // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); @@ -386,7 +386,7 @@ test('Recognize public subnet by route table', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); @@ -450,7 +450,7 @@ test('Recognize private subnet by route table with NAT Gateway', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); @@ -514,7 +514,7 @@ test('Recognize private subnet by route table with Transit Gateway', async () => // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); @@ -566,7 +566,7 @@ test('Recognize isolated subnet by route table', async () => { // WHEN const result = await provider.getValue({ - account: '1234', + account: '123456789012', region: 'us-east-1', filter, }); diff --git a/packages/cdk-assets/test/private/docker-credentials.test.ts b/packages/cdk-assets/test/private/docker-credentials.test.ts index c7e6957f9bc66..28496c0680354 100644 --- a/packages/cdk-assets/test/private/docker-credentials.test.ts +++ b/packages/cdk-assets/test/private/docker-credentials.test.ts @@ -72,18 +72,18 @@ describe('fetchDockerLoginCredentials', () => { 'secret.example.com': { secretsManagerSecretId: 'mySecret' }, 'secretwithrole.example.com': { secretsManagerSecretId: 'mySecret', - assumeRoleArn: 'arn:aws:iam::0123456789012:role/my-role', + assumeRoleArn: 'arn:aws:iam::123456789012:role/my-role', }, 'secretwithcustomfields.example.com': { secretsManagerSecretId: 'mySecret', secretsUsernameField: 'name', secretsPasswordField: 'apiKey', - assumeRoleArn: 'arn:aws:iam::0123456789012:role/my-role', + assumeRoleArn: 'arn:aws:iam::123456789012:role/my-role', }, 'ecr.example.com': { ecrRepository: true }, 'ecrwithrole.example.com': { ecrRepository: true, - assumeRoleArn: 'arn:aws:iam::0123456789012:role/my-role', + assumeRoleArn: 'arn:aws:iam::123456789012:role/my-role', }, }, }; @@ -133,7 +133,7 @@ describe('fetchDockerLoginCredentials', () => { const creds = await fetchDockerLoginCredentials(aws, config, 'secretwithrole.example.com'); expect(creds).toEqual({ Username: 'secretUser', Secret: 'secretPass' }); - expect(aws.secretsManagerClient).toHaveBeenCalledWith({ assumeRoleArn: 'arn:aws:iam::0123456789012:role/my-role' }); + expect(aws.secretsManagerClient).toHaveBeenCalledWith({ assumeRoleArn: 'arn:aws:iam::123456789012:role/my-role' }); }); test('supports configuring the secret fields', async () => { @@ -178,7 +178,7 @@ describe('fetchDockerLoginCredentials', () => { const creds = await fetchDockerLoginCredentials(aws, config, 'ecrwithrole.example.com'); expect(creds).toEqual({ Username: 'myFoo', Secret: 'myBar' }); - expect(aws.ecrClient).toHaveBeenCalledWith({ assumeRoleArn: 'arn:aws:iam::0123456789012:role/my-role' }); + expect(aws.ecrClient).toHaveBeenCalledWith({ assumeRoleArn: 'arn:aws:iam::123456789012:role/my-role' }); }); test('throws if ECR returns no authData', async () => { @@ -198,7 +198,7 @@ describe('fetchDockerLoginCredentials', () => { function mockSecretWithSecretString(secretString: any) { aws.mockSecretsManager.getSecretValue = mockedApiResult({ - ARN: 'arn:aws:secretsmanager:eu-west-1:0123456789012:secret:mySecret', + ARN: 'arn:aws:secretsmanager:eu-west-1:123456789012:secret:mySecret', Name: 'mySecret', VersionId: 'fa81fe61-c167-4aca-969e-4d8df74d4814', SecretString: JSON.stringify(secretString), @@ -213,7 +213,7 @@ function mockEcrAuthorizationData(authorizationToken: string) { authorizationData: [ { authorizationToken, - proxyEndpoint: 'https://0123456789012.dkr.ecr.eu-west-1.amazonaws.com', + proxyEndpoint: 'https://123456789012.dkr.ecr.eu-west-1.amazonaws.com', }, ], }); From 599d0f56a4f188d00f18916a51b7541ed9d7536b Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 09:53:03 +0200 Subject: [PATCH 11/23] Fix allowed account id in test --- .../test/server/deployment-group.test.ts | 2 +- .../test/codecommit/codecommit-source-action.test.ts | 10 +++++----- .../aws-codepipeline/test/cross-env.test.ts | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts b/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts index 8d1c4f05fae3c..f1b07fc55d359 100644 --- a/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts +++ b/packages/aws-cdk-lib/aws-codedeploy/test/server/deployment-group.test.ts @@ -44,7 +44,7 @@ describe('CodeDeploy Server Deployment Group', () => { test('creating an application with physical name if needed', () => { const stack = new cdk.Stack(undefined, undefined, { env: { account: '123456789012', region: 'us-test-1' } }); - const stack2 = new cdk.Stack(undefined, undefined, { env: { account: '123467890123', region: 'us-test-2' } }); + const stack2 = new cdk.Stack(undefined, undefined, { env: { account: '012345678913', region: 'us-test-2' } }); const serverDeploymentGroup = new codedeploy.ServerDeploymentGroup(stack, 'MyDG', { deploymentGroupName: cdk.PhysicalName.GENERATE_IF_NEEDED, }); diff --git a/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts b/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts index d5b5caa480ae2..01f6a25dc5ea8 100644 --- a/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline-actions/test/codecommit/codecommit-source-action.test.ts @@ -43,7 +43,7 @@ describe('CodeCommit Source Action', () => { // Test for https://github.com/aws/aws-cdk/issues/15639 const app = new App(); const sourceStack = new Stack(app, 'SourceStack', { env: { account: '123456789012', region: 'north-pole' } }); - const targetStack = new Stack(app, 'TargetStack', { env: { account: '567890123456', region: 'north-pole' } }); + const targetStack = new Stack(app, 'TargetStack', { env: { account: '234567890123', region: 'north-pole' } }); const repo = new codecommit.Repository(sourceStack, 'MyRepo', { repositoryName: 'my-repo', @@ -85,7 +85,7 @@ describe('CodeCommit Source Action', () => { 'Fn::Join': ['', [ 'arn:', { 'Ref': 'AWS::Partition' }, - ':events:north-pole:567890123456:event-bus/default', + ':events:north-pole:234567890123:event-bus/default', ]], }, }], @@ -116,7 +116,7 @@ describe('CodeCommit Source Action', () => { 'Fn::Join': ['', [ 'arn:', { 'Ref': 'AWS::Partition' }, - ':codepipeline:north-pole:567890123456:', + ':codepipeline:north-pole:234567890123:', { 'Ref': 'MyPipelineAED38ECF' }, ]], }, @@ -574,13 +574,13 @@ describe('CodeCommit Source Action', () => { const repoFomAnotherAccount = codecommit.Repository.fromRepositoryName(repoStack, 'Repo', 'my-repo'); const pipelineStack = new Stack(app, 'PipelineStack', { - env: { account: '456789012345', region: 'us-east-1' }, + env: { account: '234567890123', region: 'us-east-1' }, }); new codepipeline.Pipeline(pipelineStack, 'Pipeline', { artifactBucket: s3.Bucket.fromBucketAttributes(pipelineStack, 'PipelineBucket', { bucketName: 'pipeline-bucket', encryptionKey: kms.Key.fromKeyArn(pipelineStack, 'PipelineKey', - 'arn:aws:kms:us-east-1:456789012345:key/my-key'), + 'arn:aws:kms:us-east-1:234567890123:key/my-key'), }), stages: [ { diff --git a/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts b/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts index 1fafcc0356532..16f75aafd1361 100644 --- a/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts +++ b/packages/aws-cdk-lib/aws-codepipeline/test/cross-env.test.ts @@ -185,7 +185,7 @@ describe('cross-environment CodePipeline', function () { // and a correct support Stack should be created. const deployBucket = s3.Bucket.fromBucketAttributes(pipelineStack, 'DeployBucket', { bucketName: 'my-bucket', - account: '456789012345', + account: '234567890123', }); pipeline.addStage({ stageName: 'Build', @@ -199,9 +199,9 @@ describe('cross-environment CodePipeline', function () { }); const asm = app.synth(); - const supportStack = asm.getStackByName(`${pipelineStack.stackName}-support-456789012345`); + const supportStack = asm.getStackByName(`${pipelineStack.stackName}-support-234567890123`); Template.fromJSON(supportStack.template).hasResourceProperties('AWS::IAM::Role', { - RoleName: 'pipelinestack-support-456dbuildactionroledeafad808cffa2919e34', + RoleName: 'pipelinestack-support-234dbuildactionrolec4ab6bf1cf3a58f0a3ba', }); Template.fromStack(pipelineStack).hasResourceProperties('AWS::CodePipeline::Pipeline', { @@ -216,7 +216,7 @@ describe('cross-environment CodePipeline', function () { 'Fn::Join': ['', [ 'arn:', { Ref: 'AWS::Partition' }, - ':iam::456789012345:role/pipelinestack-support-456dbuildactionroledeafad808cffa2919e34', + ':iam::234567890123:role/pipelinestack-support-234dbuildactionrolec4ab6bf1cf3a58f0a3ba', ]], }, }, From f276c6523bc34b744fdd793223a7874abe298668 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 18:48:57 +0200 Subject: [PATCH 12/23] fix bootstrap test --- packages/aws-cdk/test/cdk-toolkit.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk/test/cdk-toolkit.test.ts b/packages/aws-cdk/test/cdk-toolkit.test.ts index 7f70bbc8434de..1d4be09fb03d1 100644 --- a/packages/aws-cdk/test/cdk-toolkit.test.ts +++ b/packages/aws-cdk/test/cdk-toolkit.test.ts @@ -534,13 +534,13 @@ describe('deploy', () => { const toolkit = defaultToolkitSetup(); // WHEN - await toolkit.bootstrap(['aws://56789/south-pole'], bootstrapper, {}); + await toolkit.bootstrap(['aws://567890123456/south-pole'], bootstrapper, {}); // THEN expect(bootstrapper.bootstrapEnvironment).toHaveBeenCalledWith({ - account: '56789', + account: '567890123456', region: 'south-pole', - name: 'aws://56789/south-pole', + name: 'aws://567890123456/south-pole', }, expect.anything(), expect.anything()); expect(bootstrapper.bootstrapEnvironment).toHaveBeenCalledTimes(1); }); From 0de4548abf6f6751a89244c9c3d15c13e1c19540 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 18:59:15 +0200 Subject: [PATCH 13/23] fix bootstrap test - 2 --- packages/aws-cdk/test/cdk-toolkit.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-cdk/test/cdk-toolkit.test.ts b/packages/aws-cdk/test/cdk-toolkit.test.ts index 1d4be09fb03d1..01246006e8e86 100644 --- a/packages/aws-cdk/test/cdk-toolkit.test.ts +++ b/packages/aws-cdk/test/cdk-toolkit.test.ts @@ -534,13 +534,13 @@ describe('deploy', () => { const toolkit = defaultToolkitSetup(); // WHEN - await toolkit.bootstrap(['aws://567890123456/south-pole'], bootstrapper, {}); + await toolkit.bootstrap(['aws://234567890123/south-pole'], bootstrapper, {}); // THEN expect(bootstrapper.bootstrapEnvironment).toHaveBeenCalledWith({ - account: '567890123456', + account: '234567890123', region: 'south-pole', - name: 'aws://567890123456/south-pole', + name: 'aws://234567890123/south-pole', }, expect.anything(), expect.anything()); expect(bootstrapper.bootstrapEnvironment).toHaveBeenCalledTimes(1); }); From 5269a4c5d09e136a8c53560c70a6765bad5d19bc Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 19:26:06 +0200 Subject: [PATCH 14/23] fix integ test --- .../test/cloudformation/integ.stacksets.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts index 98e263f834c87..7e4113819f254 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts @@ -53,7 +53,7 @@ export class StackSetPipelineStack extends Stack { ], }); - const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['1111', '222222222222']; + const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['111111111111', '222222222222']; pipeline.addStage({ stageName: 'Cfn', From b22e556999d7e3317f32526f0810d36f104f9995 Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Mon, 1 Jul 2024 21:04:38 +0200 Subject: [PATCH 15/23] fix integ test? --- .../test/cloudformation/integ.stacksets.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts index 7e4113819f254..85972dc67f432 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-codepipeline-actions/test/cloudformation/integ.stacksets.ts @@ -53,7 +53,7 @@ export class StackSetPipelineStack extends Stack { ], }); - const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['111111111111', '222222222222']; + const accounts = process.env.STACKSET_ACCOUNTS?.split(',') ?? ['1111', '2222']; pipeline.addStage({ stageName: 'Cfn', From 9d4c41109c59259edd66134fba4d4e52c21039ed Mon Sep 17 00:00:00 2001 From: Benoit Durand Date: Wed, 10 Jul 2024 19:07:01 +0200 Subject: [PATCH 16/23] fix test --- packages/aws-cdk-lib/aws-lambda/test/function.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 95d2df66056eb..2206d70043710 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -1313,7 +1313,7 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('1234'), + assumedBy: new iam.AccountPrincipal('123456789012'), }); const fn = new lambda.Function(stack, 'Function', { code: lambda.Code.fromInline('xxx'), @@ -1346,7 +1346,7 @@ describe('function', () => { // GIVEN const stack = new cdk.Stack(); const role = new iam.Role(stack, 'Role', { - assumedBy: new iam.AccountPrincipal('1234'), + assumedBy: new iam.AccountPrincipal('123456789012'), }); const fn = new lambda.Function(stack, 'Function', { code: lambda.Code.fromInline('xxx'), From 23afb1cad8c03d34c8ee3b10134687b27a7868db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Sun, 14 Jul 2024 14:07:48 +0200 Subject: [PATCH 17/23] Update principals.test.ts --- .../aws-iam/test/principals.test.ts | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 57377afb5a2b9..3e763a3a8646d 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -306,6 +306,18 @@ test('PrincipalWithConditions inherits principalAccount from AccountPrincipal ', expect(principalWithConditions.principalAccount).toStrictEqual('123456789012'); }); +test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); +}); + + test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); +}); + + test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); +}); + test('AccountPrincipal can specify an organization', () => { // GIVEN const stack = new Stack(); @@ -367,35 +379,7 @@ describe('deprecated ServicePrincipal behavior', () => { expect(usEastStack.resolve(principalName)).toEqual('states.amazonaws.com'); expect(afSouthStack.resolve(principalName)).toEqual('states.amazonaws.com'); }); - - test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); - }); - - test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); - }); - - test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); - }); - - test('ServicePrincipal in agnostic stack generates lookup table', () => { - // GIVEN - const stack = new Stack(); - - // WHEN - new iam.Role(stack, 'Role', { - assumedBy: new iam.ServicePrincipal('states.amazonaws.com'), - }); - - // THEN - const template = Template.fromStack(stack); - const mappings = template.findMappings('ServiceprincipalMap'); - expect(mappings.ServiceprincipalMap['af-south-1']?.states).toEqual('states.af-south-1.amazonaws.com'); - expect(mappings.ServiceprincipalMap['us-east-1']?.states).toEqual('states.us-east-1.amazonaws.com'); - }); - + }); describe('standardized Service Principal behavior', () => { From 1f73435e84bad9d69d6e83b0c44a5a3ea18020f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Sun, 14 Jul 2024 15:31:56 +0200 Subject: [PATCH 18/23] fix indent --- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 3e763a3a8646d..6067c30dbdddd 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -307,15 +307,15 @@ test('PrincipalWithConditions inherits principalAccount from AccountPrincipal ', }); test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); }); - test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); +test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); }); - test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); +test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); }); test('AccountPrincipal can specify an organization', () => { @@ -379,7 +379,7 @@ describe('deprecated ServicePrincipal behavior', () => { expect(usEastStack.resolve(principalName)).toEqual('states.amazonaws.com'); expect(afSouthStack.resolve(principalName)).toEqual('states.amazonaws.com'); }); - + }); describe('standardized Service Principal behavior', () => { From 15901f22b5accb1bf987ce695b76a9505ebc5721 Mon Sep 17 00:00:00 2001 From: Xia Zhao <78883180+xazhao@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:54:30 -0700 Subject: [PATCH 19/23] fix(lambda-nodejs): breaking change in esbuild causes import module error (#30726) Closes #30717. esbuild introduced a breaking change in v0.22 which caused the build error in `aws-lambda-nodejs` module. Pin the esbuild version to 0.21 in Dockerfile - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .../index.js | 645 +++++++----------- .../index.js | 645 +++++++----------- 2 files changed, 484 insertions(+), 806 deletions(-) diff --git a/packages/@aws-cdk/aws-pipes-enrichments-alpha/test/integ.stepfunctions.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js b/packages/@aws-cdk/aws-pipes-enrichments-alpha/test/integ.stepfunctions.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js index d99ddf1f7e394..a1206ea985dc1 100644 --- a/packages/@aws-cdk/aws-pipes-enrichments-alpha/test/integ.stepfunctions.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js +++ b/packages/@aws-cdk/aws-pipes-enrichments-alpha/test/integ.stepfunctions.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js @@ -863,9 +863,8 @@ function __extends(d, b) { } function __rest(s, e) { var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) @@ -875,12 +874,8 @@ function __rest(s, e) { } function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function __param(paramIndex, decorator) { @@ -890,8 +885,7 @@ function __param(paramIndex, decorator) { } function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { - if (f !== void 0 && typeof f !== "function") - throw new TypeError("Function expected"); + if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; @@ -900,36 +894,25 @@ function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, e var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; - for (var p in contextIn) - context[p] = p === "access" ? {} : contextIn[p]; - for (var p in contextIn.access) - context.access[p] = contextIn.access[p]; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function(f) { - if (done) - throw new TypeError("Cannot add initializers after decoration has completed"); + if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { - if (result === void 0) - continue; - if (result === null || typeof result !== "object") - throw new TypeError("Object expected"); - if (_ = accept(result.get)) - descriptor.get = _; - if (_ = accept(result.set)) - descriptor.set = _; - if (_ = accept(result.init)) - initializers.unshift(_); + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { - if (kind === "field") - initializers.unshift(_); - else - descriptor[key] = _; + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; } } - if (target) - Object.defineProperty(target, contextIn.name, descriptor); + if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; } function __runInitializers(thisArg, initializers, value) { @@ -943,13 +926,11 @@ function __propKey(x) { return typeof x === "symbol" ? x : "".concat(x); } function __setFunctionName(f, name, prefix) { - if (typeof name === "symbol") - name = name.description ? "[".concat(name.description, "]") : ""; + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); } function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { @@ -980,8 +961,7 @@ function __awaiter(thisArg, _arguments, P, generator) { } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { - if (t[0] & 1) - throw t[1]; + if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { @@ -993,103 +973,88 @@ function __generator(thisArg, body) { }; } function step(op) { - if (f) - throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) - return t; - if (y = 0, t) - op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; t = op; break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) - _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; } - if (op[0] & 5) - throw op[1]; + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __exportStar(m, o) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) - __createBinding(o, m, p); + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); } function __values(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function() { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; + if (!m) return o; var i = m.call(o), r, ar = [], e; try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error }; } finally { try { - if (r && !r.done && (m = i["return"])) - m.call(i); + if (r && !r.done && (m = i["return"])) m.call(i); } finally { - if (e) - throw e.error; + if (e) throw e.error; } } return ar; @@ -1100,41 +1065,44 @@ function __spread() { return ar; } function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; } function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) - ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; } + } return to.concat(ar || Array.prototype.slice.call(from)); } function __await(v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { return this; }, i; - function verb(n) { - if (g[n]) + function awaitReturn(f) { + return function(v) { + return Promise.resolve(v).then(f, reject); + }; + } + function verb(n, f) { + if (g[n]) { i[n] = function(v) { return new Promise(function(a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; + if (f) i[n] = f(i[n]); + } } function resume(n, v) { try { @@ -1153,8 +1121,7 @@ function __asyncGenerator(thisArg, _arguments, generator) { resume("throw", value); } function settle(f, v) { - if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); + if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } } function __asyncDelegator(o) { @@ -1171,8 +1138,7 @@ function __asyncDelegator(o) { } } function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { return this; @@ -1199,13 +1165,10 @@ function __makeTemplateObject(cooked, raw) { return cooked; } function __importStar(mod) { - if (mod && mod.__esModule) - return mod; + if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); } __setModuleDefault(result, mod); return result; @@ -1214,43 +1177,41 @@ function __importDefault(mod) { return mod && mod.__esModule ? mod : { default: mod }; } function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot read private member from an object whose class did not declare it"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); } function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") - throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot write private member to an object whose class did not declare it"); + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; } function __classPrivateFieldIn(state, receiver) { - if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") - throw new TypeError("Cannot use 'in' operator on non-object"); + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); return typeof state === "function" ? receiver === state : state.has(receiver); } function __addDisposableResource(env, value, async) { if (value !== null && value !== void 0) { - if (typeof value !== "object" && typeof value !== "function") - throw new TypeError("Object expected."); - var dispose; + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose, inner; if (async) { - if (!Symbol.asyncDispose) - throw new TypeError("Symbol.asyncDispose is not defined."); + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); dispose = value[Symbol.asyncDispose]; } if (dispose === void 0) { - if (!Symbol.dispose) - throw new TypeError("Symbol.dispose is not defined."); + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); dispose = value[Symbol.dispose]; + if (async) inner = dispose; } - if (typeof dispose !== "function") - throw new TypeError("Object not disposable."); + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + if (inner) dispose = function() { + try { + inner.call(this); + } catch (e) { + return Promise.reject(e); + } + }; env.stack.push({ value, dispose, async }); } else if (async) { env.stack.push({ async: true }); @@ -1267,17 +1228,15 @@ function __disposeResources(env) { var rec = env.stack.pop(); try { var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) - return Promise.resolve(result).then(next, function(e) { - fail(e); - return next(); - }); + if (rec.async) return Promise.resolve(result).then(next, function(e) { + fail(e); + return next(); + }); } catch (e) { fail(e); } } - if (env.hasError) - throw env.error; + if (env.hasError) throw env.error; } return next(); } @@ -1288,9 +1247,7 @@ var init_tslib_es6 = __esm({ extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) { d2.__proto__ = b2; } || function(d2, b2) { - for (var p in b2) - if (Object.prototype.hasOwnProperty.call(b2, p)) - d2[p] = b2[p]; + for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p]; }; return extendStatics(d, b); }; @@ -1298,17 +1255,14 @@ var init_tslib_es6 = __esm({ __assign = Object.assign || function __assign2(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; __createBinding = Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { @@ -1317,8 +1271,7 @@ var init_tslib_es6 = __esm({ } Object.defineProperty(o, k2, desc); } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; o[k2] = m[k]; }; __setModuleDefault = Object.create ? function(o, v) { @@ -9792,8 +9745,7 @@ var require_validator = __commonJS({ if (xmlData[i] === "<" && xmlData[i + 1] === "?") { i += 2; i = readPI(xmlData, i); - if (i.err) - return i; + if (i.err) return i; } else if (xmlData[i] === "<") { let tagStartPos = i; i++; @@ -9879,8 +9831,7 @@ var require_validator = __commonJS({ continue; } else if (xmlData[i + 1] === "?") { i = readPI(xmlData, ++i); - if (i.err) - return i; + if (i.err) return i; } else { break; } @@ -10148,13 +10099,11 @@ var require_xmlNode = __commonJS({ this[":@"] = {}; } add(key, val2) { - if (key === "__proto__") - key = "#__proto__"; + if (key === "__proto__") key = "#__proto__"; this.child.push({ [key]: val2 }); } addChild(node) { - if (node.tagname === "__proto__") - node.tagname = "#__proto__"; + if (node.tagname === "__proto__") node.tagname = "#__proto__"; if (node[":@"] && Object.keys(node[":@"]).length > 0) { this.child.push({ [node.tagname]: node.child, [":@"]: node[":@"] }); } else { @@ -10187,16 +10136,11 @@ var require_DocTypeReader = __commonJS({ regx: RegExp(`&${entityName};`, "g"), val }; - } else if (hasBody && isElement(xmlData, i)) - i += 8; - else if (hasBody && isAttlist(xmlData, i)) - i += 8; - else if (hasBody && isNotation(xmlData, i)) - i += 9; - else if (isComment) - comment = true; - else - throw new Error("Invalid DOCTYPE"); + } else if (hasBody && isElement(xmlData, i)) i += 8; + else if (hasBody && isAttlist(xmlData, i)) i += 8; + else if (hasBody && isNotation(xmlData, i)) i += 9; + else if (isComment) comment = true; + else throw new Error("Invalid DOCTYPE"); angleBracketsCount++; exp = ""; } else if (xmlData[i] === ">") { @@ -10231,8 +10175,7 @@ var require_DocTypeReader = __commonJS({ entityName2 += xmlData[i]; } entityName2 = entityName2.trim(); - if (entityName2.indexOf(" ") !== -1) - throw new Error("External entites are not supported"); + if (entityName2.indexOf(" ") !== -1) throw new Error("External entites are not supported"); const startChar = xmlData[i++]; let val2 = ""; for (; i < xmlData.length && xmlData[i] !== startChar; i++) { @@ -10241,28 +10184,23 @@ var require_DocTypeReader = __commonJS({ return [entityName2, val2, i]; } function isComment(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "-" && xmlData[i + 3] === "-") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "-" && xmlData[i + 3] === "-") return true; return false; } function isEntity(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "N" && xmlData[i + 4] === "T" && xmlData[i + 5] === "I" && xmlData[i + 6] === "T" && xmlData[i + 7] === "Y") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "N" && xmlData[i + 4] === "T" && xmlData[i + 5] === "I" && xmlData[i + 6] === "T" && xmlData[i + 7] === "Y") return true; return false; } function isElement(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "L" && xmlData[i + 4] === "E" && xmlData[i + 5] === "M" && xmlData[i + 6] === "E" && xmlData[i + 7] === "N" && xmlData[i + 8] === "T") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "L" && xmlData[i + 4] === "E" && xmlData[i + 5] === "M" && xmlData[i + 6] === "E" && xmlData[i + 7] === "N" && xmlData[i + 8] === "T") return true; return false; } function isAttlist(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "A" && xmlData[i + 3] === "T" && xmlData[i + 4] === "T" && xmlData[i + 5] === "L" && xmlData[i + 6] === "I" && xmlData[i + 7] === "S" && xmlData[i + 8] === "T") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "A" && xmlData[i + 3] === "T" && xmlData[i + 4] === "T" && xmlData[i + 5] === "L" && xmlData[i + 6] === "I" && xmlData[i + 7] === "S" && xmlData[i + 8] === "T") return true; return false; } function isNotation(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "N" && xmlData[i + 3] === "O" && xmlData[i + 4] === "T" && xmlData[i + 5] === "A" && xmlData[i + 6] === "T" && xmlData[i + 7] === "I" && xmlData[i + 8] === "O" && xmlData[i + 9] === "N") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "N" && xmlData[i + 3] === "O" && xmlData[i + 4] === "T" && xmlData[i + 5] === "A" && xmlData[i + 6] === "T" && xmlData[i + 7] === "I" && xmlData[i + 8] === "O" && xmlData[i + 9] === "N") return true; return false; } function validateEntityName(name) { @@ -10295,11 +10233,9 @@ var require_strnum = __commonJS({ }; function toNumber(str, options = {}) { options = Object.assign({}, consider, options); - if (!str || typeof str !== "string") - return str; + if (!str || typeof str !== "string") return str; let trimmedStr = str.trim(); - if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) - return str; + if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) return str; else if (options.hex && hexRegex.test(trimmedStr)) { return Number.parseInt(trimmedStr, 16); } else { @@ -10309,45 +10245,30 @@ var require_strnum = __commonJS({ const leadingZeros = match[2]; let numTrimmedByZeros = trimZeros(match[3]); const eNotation = match[4] || match[6]; - if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") - return str; - else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") - return str; + if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") return str; + else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") return str; else { const num = Number(trimmedStr); const numStr = "" + num; if (numStr.search(/[eE]/) !== -1) { - if (options.eNotation) - return num; - else - return str; + if (options.eNotation) return num; + else return str; } else if (eNotation) { - if (options.eNotation) - return num; - else - return str; + if (options.eNotation) return num; + else return str; } else if (trimmedStr.indexOf(".") !== -1) { - if (numStr === "0" && numTrimmedByZeros === "") - return num; - else if (numStr === numTrimmedByZeros) - return num; - else if (sign && numStr === "-" + numTrimmedByZeros) - return num; - else - return str; + if (numStr === "0" && numTrimmedByZeros === "") return num; + else if (numStr === numTrimmedByZeros) return num; + else if (sign && numStr === "-" + numTrimmedByZeros) return num; + else return str; } if (leadingZeros) { - if (numTrimmedByZeros === numStr) - return num; - else if (sign + numTrimmedByZeros === numStr) - return num; - else - return str; + if (numTrimmedByZeros === numStr) return num; + else if (sign + numTrimmedByZeros === numStr) return num; + else return str; } - if (trimmedStr === numStr) - return num; - else if (trimmedStr === sign + numStr) - return num; + if (trimmedStr === numStr) return num; + else if (trimmedStr === sign + numStr) return num; return str; } } else { @@ -10358,12 +10279,9 @@ var require_strnum = __commonJS({ function trimZeros(numStr) { if (numStr && numStr.indexOf(".") !== -1) { numStr = numStr.replace(/0+$/, ""); - if (numStr === ".") - numStr = "0"; - else if (numStr[0] === ".") - numStr = "0" + numStr; - else if (numStr[numStr.length - 1] === ".") - numStr = numStr.substr(0, numStr.length - 1); + if (numStr === ".") numStr = "0"; + else if (numStr[0] === ".") numStr = "0" + numStr; + else if (numStr[numStr.length - 1] === ".") numStr = numStr.substr(0, numStr.length - 1); return numStr; } return numStr; @@ -10437,8 +10355,7 @@ var require_OrderedObjParser = __commonJS({ val2 = val2.trim(); } if (val2.length > 0) { - if (!escapeEntities) - val2 = this.replaceEntitiesValue(val2); + if (!escapeEntities) val2 = this.replaceEntitiesValue(val2); const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode); if (newval === null || newval === void 0) { return val2; @@ -10484,8 +10401,7 @@ var require_OrderedObjParser = __commonJS({ if (this.options.transformAttributeName) { aName = this.options.transformAttributeName(aName); } - if (aName === "__proto__") - aName = "#__proto__"; + if (aName === "__proto__") aName = "#__proto__"; if (oldVal !== void 0) { if (this.options.trimValues) { oldVal = oldVal.trim(); @@ -10560,8 +10476,7 @@ var require_OrderedObjParser = __commonJS({ i = closeIndex; } else if (xmlData[i + 1] === "?") { let tagData = readTagExp(xmlData, i, false, "?>"); - if (!tagData) - throw new Error("Pi Tag is not closed."); + if (!tagData) throw new Error("Pi Tag is not closed."); textData = this.saveTextToParentTag(textData, currentNode, jPath); if (this.options.ignoreDeclaration && tagData.tagName === "?xml" || this.options.ignorePiTags) { } else { @@ -10593,8 +10508,7 @@ var require_OrderedObjParser = __commonJS({ currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]); } else { let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true); - if (val2 == void 0) - val2 = ""; + if (val2 == void 0) val2 = ""; currentNode.add(this.options.textNodeName, val2); } i = closeIndex + 2; @@ -10628,8 +10542,7 @@ var require_OrderedObjParser = __commonJS({ i = result.closeIndex; } else { const result2 = this.readStopNodeData(xmlData, tagName, closeIndex + 1); - if (!result2) - throw new Error(`Unexpected end of ${tagName}`); + if (!result2) throw new Error(`Unexpected end of ${tagName}`); i = result2.i; tagContent = result2.tagContent; } @@ -10711,8 +10624,7 @@ var require_OrderedObjParser = __commonJS({ }; function saveTextToParentTag(textData, currentNode, jPath, isLeafNode) { if (textData) { - if (isLeafNode === void 0) - isLeafNode = Object.keys(currentNode.child).length === 0; + if (isLeafNode === void 0) isLeafNode = Object.keys(currentNode.child).length === 0; textData = this.parseTextData( textData, currentNode.tagname, @@ -10731,8 +10643,7 @@ var require_OrderedObjParser = __commonJS({ const allNodesExp = "*." + currentTagName; for (const stopNodePath in stopNodes) { const stopNodeExp = stopNodes[stopNodePath]; - if (allNodesExp === stopNodeExp || jPath === stopNodeExp) - return true; + if (allNodesExp === stopNodeExp || jPath === stopNodeExp) return true; } return false; } @@ -10742,8 +10653,7 @@ var require_OrderedObjParser = __commonJS({ for (let index = i; index < xmlData.length; index++) { let ch = xmlData[index]; if (attrBoundary) { - if (ch === attrBoundary) - attrBoundary = ""; + if (ch === attrBoundary) attrBoundary = ""; } else if (ch === '"' || ch === "'") { attrBoundary = ch; } else if (ch === closingChar[0]) { @@ -10776,8 +10686,7 @@ var require_OrderedObjParser = __commonJS({ } function readTagExp(xmlData, i, removeNSPrefix, closingChar = ">") { const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar); - if (!result) - return; + if (!result) return; let tagExp = result.data; const closeIndex = result.index; const separatorIndex = tagExp.search(/\s/); @@ -10844,12 +10753,9 @@ var require_OrderedObjParser = __commonJS({ function parseValue(val2, shouldParse, options) { if (shouldParse && typeof val2 === "string") { const newval = val2.trim(); - if (newval === "true") - return true; - else if (newval === "false") - return false; - else - return toNumber(val2, options); + if (newval === "true") return true; + else if (newval === "false") return false; + else return toNumber(val2, options); } else { if (util.isExist(val2)) { return val2; @@ -10876,15 +10782,11 @@ var require_node2json = __commonJS({ const tagObj = arr[i]; const property = propName(tagObj); let newJpath = ""; - if (jPath === void 0) - newJpath = property; - else - newJpath = jPath + "." + property; + if (jPath === void 0) newJpath = property; + else newJpath = jPath + "." + property; if (property === options.textNodeName) { - if (text === void 0) - text = tagObj[property]; - else - text += "" + tagObj[property]; + if (text === void 0) text = tagObj[property]; + else text += "" + tagObj[property]; } else if (property === void 0) { continue; } else if (tagObj[property]) { @@ -10895,10 +10797,8 @@ var require_node2json = __commonJS({ } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== void 0 && !options.alwaysCreateTextNode) { val2 = val2[options.textNodeName]; } else if (Object.keys(val2).length === 0) { - if (options.alwaysCreateTextNode) - val2[options.textNodeName] = ""; - else - val2 = ""; + if (options.alwaysCreateTextNode) val2[options.textNodeName] = ""; + else val2 = ""; } if (compressedObj[property] !== void 0 && compressedObj.hasOwnProperty(property)) { if (!Array.isArray(compressedObj[property])) { @@ -10915,18 +10815,15 @@ var require_node2json = __commonJS({ } } if (typeof text === "string") { - if (text.length > 0) - compressedObj[options.textNodeName] = text; - } else if (text !== void 0) - compressedObj[options.textNodeName] = text; + if (text.length > 0) compressedObj[options.textNodeName] = text; + } else if (text !== void 0) compressedObj[options.textNodeName] = text; return compressedObj; } function propName(obj) { const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key !== ":@") - return key; + if (key !== ":@") return key; } } function assignAttributes(obj, attrMap, jpath, options) { @@ -10983,8 +10880,7 @@ var require_XMLParser = __commonJS({ throw new Error("XML data is accepted in String or Bytes[] form."); } if (validationOption) { - if (validationOption === true) - validationOption = {}; + if (validationOption === true) validationOption = {}; const result = validator.validate(xmlData, validationOption); if (result !== true) { throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`); @@ -10993,10 +10889,8 @@ var require_XMLParser = __commonJS({ const orderedObjParser = new OrderedObjParser(this.options); orderedObjParser.addExternalEntities(this.externalEntities); const orderedResult = orderedObjParser.parseXml(xmlData); - if (this.options.preserveOrder || orderedResult === void 0) - return orderedResult; - else - return prettify(orderedResult, this.options); + if (this.options.preserveOrder || orderedResult === void 0) return orderedResult; + else return prettify(orderedResult, this.options); } /** * Add Entity which is not by default supported by this library @@ -11037,10 +10931,8 @@ var require_orderedJs2Xml = __commonJS({ const tagObj = arr[i]; const tagName = propName(tagObj); let newJPath = ""; - if (jPath.length === 0) - newJPath = tagName; - else - newJPath = `${jPath}.${tagName}`; + if (jPath.length === 0) newJPath = tagName; + else newJPath = `${jPath}.${tagName}`; if (tagName === options.textNodeName) { let tagText = tagObj[tagName]; if (!isStopNode(newJPath, options)) { @@ -11081,10 +10973,8 @@ var require_orderedJs2Xml = __commonJS({ const tagStart = indentation + `<${tagName}${attStr}`; const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation); if (options.unpairedTags.indexOf(tagName) !== -1) { - if (options.suppressUnpairedNode) - xmlStr += tagStart + ">"; - else - xmlStr += tagStart + "/>"; + if (options.suppressUnpairedNode) xmlStr += tagStart + ">"; + else xmlStr += tagStart + "/>"; } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) { xmlStr += tagStart + "/>"; } else if (tagValue && tagValue.endsWith(">")) { @@ -11106,8 +10996,7 @@ var require_orderedJs2Xml = __commonJS({ const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key !== ":@") - return key; + if (key !== ":@") return key; } } function attr_to_str(attrMap, options) { @@ -11129,8 +11018,7 @@ var require_orderedJs2Xml = __commonJS({ jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1); let tagName = jPath.substr(jPath.lastIndexOf(".") + 1); for (let index in options.stopNodes) { - if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) - return true; + if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) return true; } return false; } @@ -11227,10 +11115,8 @@ var require_json2xml = __commonJS({ for (let key in jObj) { if (typeof jObj[key] === "undefined") { } else if (jObj[key] === null) { - if (key[0] === "?") - val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; - else - val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + if (key[0] === "?") val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + else val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; } else if (jObj[key] instanceof Date) { val2 += this.buildTextValNode(jObj[key], key, "", level); } else if (typeof jObj[key] !== "object") { @@ -11252,10 +11138,8 @@ var require_json2xml = __commonJS({ const item = jObj[key][j]; if (typeof item === "undefined") { } else if (item === null) { - if (key[0] === "?") - val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; - else - val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + if (key[0] === "?") val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + else val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; } else if (typeof item === "object") { if (this.options.oneListGroup) { listTagVal += this.j2x(item, level + 1).val; @@ -11289,8 +11173,7 @@ var require_json2xml = __commonJS({ val2 = this.replaceEntitiesValue(val2); if (this.options.suppressBooleanAttributes && val2 === "true") { return " " + attrName; - } else - return " " + attrName + '="' + val2 + '"'; + } else return " " + attrName + '="' + val2 + '"'; }; function processTextOrObjNode(object, key, level) { const result = this.j2x(object, level + 1); @@ -11302,8 +11185,7 @@ var require_json2xml = __commonJS({ } Builder.prototype.buildObjectNode = function(val2, key, attrStr, level) { if (val2 === "") { - if (key[0] === "?") - return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; + if (key[0] === "?") return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; else { return this.indentate(level) + "<" + key + attrStr + this.closeTag(key) + this.tagEndChar; } @@ -11326,8 +11208,7 @@ var require_json2xml = __commonJS({ Builder.prototype.closeTag = function(key) { let closeTag = ""; if (this.options.unpairedTags.indexOf(key) !== -1) { - if (!this.options.suppressUnpairedNode) - closeTag = "/"; + if (!this.options.suppressUnpairedNode) closeTag = "/"; } else if (this.options.suppressEmptyNode) { closeTag = "/"; } else { @@ -22857,8 +22738,7 @@ var require_lib2 = __commonJS({ const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); return function(V, opts) { - if (!opts) - opts = {}; + if (!opts) opts = {}; let x = +V; if (opts.enforceRange) { if (!Number.isFinite(x)) { @@ -22872,10 +22752,8 @@ var require_lib2 = __commonJS({ } if (!isNaN(x) && opts.clamp) { x = evenRound(x); - if (x < lowerBound) - x = lowerBound; - if (x > upperBound) - x = upperBound; + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; return x; } if (!Number.isFinite(x) || x === 0) { @@ -22926,8 +22804,7 @@ var require_lib2 = __commonJS({ conversions["float"] = conversions["double"]; conversions["unrestricted float"] = conversions["unrestricted double"]; conversions["DOMString"] = function(V, opts) { - if (!opts) - opts = {}; + if (!opts) opts = {}; if (opts.treatNullAsEmptyString && V === null) { return ""; } @@ -23164,8 +23041,7 @@ var require_tr46 = __commonJS({ } } } - if (result.error) - return null; + if (result.error) return null; return labels.join("."); }; module2.exports.toUnicode = function(domain_name, useSTD3) { @@ -24576,8 +24452,7 @@ var require_URL = __commonJS({ return obj; }, setup(obj, constructorArgs, privateData) { - if (!privateData) - privateData = {}; + if (!privateData) privateData = {}; privateData.wrapper = obj; obj[impl] = new Impl.implementation(constructorArgs, privateData); obj[impl][utils.wrapperSymbol] = obj; @@ -24616,18 +24491,14 @@ var require_safer = __commonJS({ var safer = {}; var key; for (key in buffer) { - if (!buffer.hasOwnProperty(key)) - continue; - if (key === "SlowBuffer" || key === "Buffer") - continue; + if (!buffer.hasOwnProperty(key)) continue; + if (key === "SlowBuffer" || key === "Buffer") continue; safer[key] = buffer[key]; } var Safer = safer.Buffer = {}; for (key in Buffer2) { - if (!Buffer2.hasOwnProperty(key)) - continue; - if (key === "allocUnsafe" || key === "allocUnsafeSlow") - continue; + if (!Buffer2.hasOwnProperty(key)) continue; + if (key === "allocUnsafe" || key === "allocUnsafeSlow") continue; Safer[key] = Buffer2[key]; } safer.Buffer.prototype = Buffer2.prototype; @@ -25075,14 +24946,10 @@ var require_utf32 = __commonJS({ return "utf-32be"; } } - if (b[0] !== 0 || b[1] > 16) - invalidBE++; - if (b[3] !== 0 || b[2] > 16) - invalidLE++; - if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) - bmpCharsBE++; - if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) - bmpCharsLE++; + if (b[0] !== 0 || b[1] > 16) invalidBE++; + if (b[3] !== 0 || b[2] > 16) invalidLE++; + if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) bmpCharsBE++; + if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) bmpCharsLE++; b.length = 0; charsProcessed++; if (charsProcessed >= 100) { @@ -25091,10 +24958,8 @@ var require_utf32 = __commonJS({ } } } - if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE) - return "utf-32be"; - if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE) - return "utf-32le"; + if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE) return "utf-32be"; + if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE) return "utf-32le"; return defaultEncoding || "utf-32le"; } } @@ -25214,15 +25079,11 @@ var require_utf16 = __commonJS({ b.push(buf[j]); if (b.length === 2) { if (charsProcessed === 0) { - if (b[0] === 255 && b[1] === 254) - return "utf-16le"; - if (b[0] === 254 && b[1] === 255) - return "utf-16be"; + if (b[0] === 255 && b[1] === 254) return "utf-16le"; + if (b[0] === 254 && b[1] === 255) return "utf-16be"; } - if (b[0] === 0 && b[1] !== 0) - asciiCharsBE++; - if (b[0] !== 0 && b[1] === 0) - asciiCharsLE++; + if (b[0] === 0 && b[1] !== 0) asciiCharsBE++; + if (b[0] !== 0 && b[1] === 0) asciiCharsLE++; b.length = 0; charsProcessed++; if (charsProcessed >= 100) { @@ -25231,10 +25092,8 @@ var require_utf16 = __commonJS({ } } } - if (asciiCharsBE > asciiCharsLE) - return "utf-16be"; - if (asciiCharsBE < asciiCharsLE) - return "utf-16le"; + if (asciiCharsBE > asciiCharsLE) return "utf-16be"; + if (asciiCharsBE < asciiCharsLE) return "utf-16le"; return defaultEncoding || "utf-16le"; } } @@ -26185,10 +26044,8 @@ var require_dbcs_codec = __commonJS({ this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]); } this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]; - if (this.defCharSB === UNASSIGNED) - this.defCharSB = this.encodeTable[0]["?"]; - if (this.defCharSB === UNASSIGNED) - this.defCharSB = "?".charCodeAt(0); + if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]["?"]; + if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0); } DBCSCodec.prototype.encoder = DBCSEncoder; DBCSCodec.prototype.decoder = DBCSDecoder; @@ -26269,8 +26126,7 @@ var require_dbcs_codec = __commonJS({ node = this.encodeTableSeq[SEQ_START - bucket[low]]; } else { node = {}; - if (bucket[low] !== UNASSIGNED) - node[DEF_CHAR] = bucket[low]; + if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; bucket[low] = SEQ_START - this.encodeTableSeq.length; this.encodeTableSeq.push(node); } @@ -26327,8 +26183,7 @@ var require_dbcs_codec = __commonJS({ var newBuf = Buffer2.alloc(str.length * (this.gb18030 ? 4 : 3)), leadSurrogate = this.leadSurrogate, seqObj = this.seqObj, nextChar = -1, i2 = 0, j = 0; while (true) { if (nextChar === -1) { - if (i2 == str.length) - break; + if (i2 == str.length) break; var uCode = str.charCodeAt(i2++); } else { var uCode = nextChar; @@ -28069,8 +27924,7 @@ var require_streams = __commonJS({ return done(new Error("Iconv encoding stream needs strings as its input.")); try { var res = this.conv.write(chunk); - if (res && res.length) - this.push(res); + if (res && res.length) this.push(res); done(); } catch (e) { done(e); @@ -28079,8 +27933,7 @@ var require_streams = __commonJS({ IconvLiteEncoderStream.prototype._flush = function(done) { try { var res = this.conv.end(); - if (res && res.length) - this.push(res); + if (res && res.length) this.push(res); done(); } catch (e) { done(e); @@ -28111,8 +27964,7 @@ var require_streams = __commonJS({ return done(new Error("Iconv decoding stream needs buffers as its input.")); try { var res = this.conv.write(chunk); - if (res && res.length) - this.push(res, this.encoding); + if (res && res.length) this.push(res, this.encoding); done(); } catch (e) { done(e); @@ -28121,8 +27973,7 @@ var require_streams = __commonJS({ IconvLiteDecoderStream.prototype._flush = function(done) { try { var res = this.conv.end(); - if (res && res.length) - this.push(res, this.encoding); + if (res && res.length) this.push(res, this.encoding); done(); } catch (e) { done(e); @@ -28458,16 +28309,13 @@ var require_lib4 = __commonJS({ body = null; } else if (isURLSearchParams(body)) { body = Buffer.from(body.toString()); - } else if (isBlob(body)) - ; - else if (Buffer.isBuffer(body)) - ; + } else if (isBlob(body)) ; + else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === "[object ArrayBuffer]") { body = Buffer.from(body); } else if (ArrayBuffer.isView(body)) { body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); - } else if (body instanceof Stream) - ; + } else if (body instanceof Stream) ; else { body = Buffer.from(String(body)); } @@ -28810,8 +28658,7 @@ var require_lib4 = __commonJS({ } return; } - if (init == null) - ; + if (init == null) ; else if (typeof init === "object") { const method = init[Symbol.iterator]; if (method != null) { @@ -29193,8 +29040,7 @@ var require_lib4 = __commonJS({ } } let signal = isRequest(input) ? input.signal : null; - if ("signal" in init) - signal = init.signal; + if ("signal" in init) signal = init.signal; if (signal != null && !isAbortSignal(signal)) { throw new TypeError("Expected signal to be an instanceof AbortSignal"); } @@ -29331,8 +29177,7 @@ var require_lib4 = __commonJS({ if (request2.body && request2.body instanceof Stream.Readable) { destroyStream(request2.body, error); } - if (!response || !response.body) - return; + if (!response || !response.body) return; response.body.emit("error", error); }; if (signal && signal.aborted) { @@ -29350,8 +29195,7 @@ var require_lib4 = __commonJS({ } function finalize() { req.abort(); - if (signal) - signal.removeEventListener("abort", abortAndFinalize); + if (signal) signal.removeEventListener("abort", abortAndFinalize); clearTimeout(reqTimeout); } if (request2.timeout) { @@ -29460,8 +29304,7 @@ var require_lib4 = __commonJS({ } } res.once("end", function() { - if (signal) - signal.removeEventListener("abort", abortAndFinalize); + if (signal) signal.removeEventListener("abort", abortAndFinalize); }); let body = res.pipe(new PassThrough$1()); const response_options = { @@ -31154,8 +30997,7 @@ var require_lib5 = __commonJS({ "../aws-custom-resource-sdk-adapter/lib/index.js"(exports2) { "use strict"; var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { @@ -31164,14 +31006,11 @@ var require_lib5 = __commonJS({ } Object.defineProperty(o, k2, desc); } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; o[k2] = m[k]; }); var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) - __createBinding2(exports3, m, p); + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding2(exports3, m, p); }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.normalizeActionName = exports2.normalizeServiceName = exports2.findV3ClientConstructor = exports2.coerceApiParameters = void 0; diff --git a/packages/@aws-cdk/aws-pipes-targets-alpha/test/integ.lambda.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js b/packages/@aws-cdk/aws-pipes-targets-alpha/test/integ.lambda.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js index d99ddf1f7e394..a1206ea985dc1 100644 --- a/packages/@aws-cdk/aws-pipes-targets-alpha/test/integ.lambda.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js +++ b/packages/@aws-cdk/aws-pipes-targets-alpha/test/integ.lambda.js.snapshot/asset.cfdb46b4f2c6702b4a1cc8e23ca426e8de43d13567e73a8453d01c1176393814.bundle/index.js @@ -863,9 +863,8 @@ function __extends(d, b) { } function __rest(s, e) { var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) @@ -875,12 +874,8 @@ function __rest(s, e) { } function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function __param(paramIndex, decorator) { @@ -890,8 +885,7 @@ function __param(paramIndex, decorator) { } function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { - if (f !== void 0 && typeof f !== "function") - throw new TypeError("Function expected"); + if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; @@ -900,36 +894,25 @@ function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, e var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; - for (var p in contextIn) - context[p] = p === "access" ? {} : contextIn[p]; - for (var p in contextIn.access) - context.access[p] = contextIn.access[p]; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function(f) { - if (done) - throw new TypeError("Cannot add initializers after decoration has completed"); + if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { - if (result === void 0) - continue; - if (result === null || typeof result !== "object") - throw new TypeError("Object expected"); - if (_ = accept(result.get)) - descriptor.get = _; - if (_ = accept(result.set)) - descriptor.set = _; - if (_ = accept(result.init)) - initializers.unshift(_); + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { - if (kind === "field") - initializers.unshift(_); - else - descriptor[key] = _; + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; } } - if (target) - Object.defineProperty(target, contextIn.name, descriptor); + if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; } function __runInitializers(thisArg, initializers, value) { @@ -943,13 +926,11 @@ function __propKey(x) { return typeof x === "symbol" ? x : "".concat(x); } function __setFunctionName(f, name, prefix) { - if (typeof name === "symbol") - name = name.description ? "[".concat(name.description, "]") : ""; + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); } function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { @@ -980,8 +961,7 @@ function __awaiter(thisArg, _arguments, P, generator) { } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { - if (t[0] & 1) - throw t[1]; + if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { @@ -993,103 +973,88 @@ function __generator(thisArg, body) { }; } function step(op) { - if (f) - throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) - return t; - if (y = 0, t) - op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; t = op; break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) - _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; } - if (op[0] & 5) - throw op[1]; + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __exportStar(m, o) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) - __createBinding(o, m, p); + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); } function __values(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function() { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function() { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; + if (!m) return o; var i = m.call(o), r, ar = [], e; try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error }; } finally { try { - if (r && !r.done && (m = i["return"])) - m.call(i); + if (r && !r.done && (m = i["return"])) m.call(i); } finally { - if (e) - throw e.error; + if (e) throw e.error; } } return ar; @@ -1100,41 +1065,44 @@ function __spread() { return ar; } function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; } function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) - ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; } + } return to.concat(ar || Array.prototype.slice.call(from)); } function __await(v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { return this; }, i; - function verb(n) { - if (g[n]) + function awaitReturn(f) { + return function(v) { + return Promise.resolve(v).then(f, reject); + }; + } + function verb(n, f) { + if (g[n]) { i[n] = function(v) { return new Promise(function(a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; + if (f) i[n] = f(i[n]); + } } function resume(n, v) { try { @@ -1153,8 +1121,7 @@ function __asyncGenerator(thisArg, _arguments, generator) { resume("throw", value); } function settle(f, v) { - if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); + if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } } function __asyncDelegator(o) { @@ -1171,8 +1138,7 @@ function __asyncDelegator(o) { } } function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { return this; @@ -1199,13 +1165,10 @@ function __makeTemplateObject(cooked, raw) { return cooked; } function __importStar(mod) { - if (mod && mod.__esModule) - return mod; + if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); } __setModuleDefault(result, mod); return result; @@ -1214,43 +1177,41 @@ function __importDefault(mod) { return mod && mod.__esModule ? mod : { default: mod }; } function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot read private member from an object whose class did not declare it"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); } function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") - throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot write private member to an object whose class did not declare it"); + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; } function __classPrivateFieldIn(state, receiver) { - if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") - throw new TypeError("Cannot use 'in' operator on non-object"); + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); return typeof state === "function" ? receiver === state : state.has(receiver); } function __addDisposableResource(env, value, async) { if (value !== null && value !== void 0) { - if (typeof value !== "object" && typeof value !== "function") - throw new TypeError("Object expected."); - var dispose; + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose, inner; if (async) { - if (!Symbol.asyncDispose) - throw new TypeError("Symbol.asyncDispose is not defined."); + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); dispose = value[Symbol.asyncDispose]; } if (dispose === void 0) { - if (!Symbol.dispose) - throw new TypeError("Symbol.dispose is not defined."); + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); dispose = value[Symbol.dispose]; + if (async) inner = dispose; } - if (typeof dispose !== "function") - throw new TypeError("Object not disposable."); + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + if (inner) dispose = function() { + try { + inner.call(this); + } catch (e) { + return Promise.reject(e); + } + }; env.stack.push({ value, dispose, async }); } else if (async) { env.stack.push({ async: true }); @@ -1267,17 +1228,15 @@ function __disposeResources(env) { var rec = env.stack.pop(); try { var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) - return Promise.resolve(result).then(next, function(e) { - fail(e); - return next(); - }); + if (rec.async) return Promise.resolve(result).then(next, function(e) { + fail(e); + return next(); + }); } catch (e) { fail(e); } } - if (env.hasError) - throw env.error; + if (env.hasError) throw env.error; } return next(); } @@ -1288,9 +1247,7 @@ var init_tslib_es6 = __esm({ extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) { d2.__proto__ = b2; } || function(d2, b2) { - for (var p in b2) - if (Object.prototype.hasOwnProperty.call(b2, p)) - d2[p] = b2[p]; + for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p]; }; return extendStatics(d, b); }; @@ -1298,17 +1255,14 @@ var init_tslib_es6 = __esm({ __assign = Object.assign || function __assign2(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; __createBinding = Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { @@ -1317,8 +1271,7 @@ var init_tslib_es6 = __esm({ } Object.defineProperty(o, k2, desc); } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; o[k2] = m[k]; }; __setModuleDefault = Object.create ? function(o, v) { @@ -9792,8 +9745,7 @@ var require_validator = __commonJS({ if (xmlData[i] === "<" && xmlData[i + 1] === "?") { i += 2; i = readPI(xmlData, i); - if (i.err) - return i; + if (i.err) return i; } else if (xmlData[i] === "<") { let tagStartPos = i; i++; @@ -9879,8 +9831,7 @@ var require_validator = __commonJS({ continue; } else if (xmlData[i + 1] === "?") { i = readPI(xmlData, ++i); - if (i.err) - return i; + if (i.err) return i; } else { break; } @@ -10148,13 +10099,11 @@ var require_xmlNode = __commonJS({ this[":@"] = {}; } add(key, val2) { - if (key === "__proto__") - key = "#__proto__"; + if (key === "__proto__") key = "#__proto__"; this.child.push({ [key]: val2 }); } addChild(node) { - if (node.tagname === "__proto__") - node.tagname = "#__proto__"; + if (node.tagname === "__proto__") node.tagname = "#__proto__"; if (node[":@"] && Object.keys(node[":@"]).length > 0) { this.child.push({ [node.tagname]: node.child, [":@"]: node[":@"] }); } else { @@ -10187,16 +10136,11 @@ var require_DocTypeReader = __commonJS({ regx: RegExp(`&${entityName};`, "g"), val }; - } else if (hasBody && isElement(xmlData, i)) - i += 8; - else if (hasBody && isAttlist(xmlData, i)) - i += 8; - else if (hasBody && isNotation(xmlData, i)) - i += 9; - else if (isComment) - comment = true; - else - throw new Error("Invalid DOCTYPE"); + } else if (hasBody && isElement(xmlData, i)) i += 8; + else if (hasBody && isAttlist(xmlData, i)) i += 8; + else if (hasBody && isNotation(xmlData, i)) i += 9; + else if (isComment) comment = true; + else throw new Error("Invalid DOCTYPE"); angleBracketsCount++; exp = ""; } else if (xmlData[i] === ">") { @@ -10231,8 +10175,7 @@ var require_DocTypeReader = __commonJS({ entityName2 += xmlData[i]; } entityName2 = entityName2.trim(); - if (entityName2.indexOf(" ") !== -1) - throw new Error("External entites are not supported"); + if (entityName2.indexOf(" ") !== -1) throw new Error("External entites are not supported"); const startChar = xmlData[i++]; let val2 = ""; for (; i < xmlData.length && xmlData[i] !== startChar; i++) { @@ -10241,28 +10184,23 @@ var require_DocTypeReader = __commonJS({ return [entityName2, val2, i]; } function isComment(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "-" && xmlData[i + 3] === "-") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "-" && xmlData[i + 3] === "-") return true; return false; } function isEntity(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "N" && xmlData[i + 4] === "T" && xmlData[i + 5] === "I" && xmlData[i + 6] === "T" && xmlData[i + 7] === "Y") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "N" && xmlData[i + 4] === "T" && xmlData[i + 5] === "I" && xmlData[i + 6] === "T" && xmlData[i + 7] === "Y") return true; return false; } function isElement(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "L" && xmlData[i + 4] === "E" && xmlData[i + 5] === "M" && xmlData[i + 6] === "E" && xmlData[i + 7] === "N" && xmlData[i + 8] === "T") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "L" && xmlData[i + 4] === "E" && xmlData[i + 5] === "M" && xmlData[i + 6] === "E" && xmlData[i + 7] === "N" && xmlData[i + 8] === "T") return true; return false; } function isAttlist(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "A" && xmlData[i + 3] === "T" && xmlData[i + 4] === "T" && xmlData[i + 5] === "L" && xmlData[i + 6] === "I" && xmlData[i + 7] === "S" && xmlData[i + 8] === "T") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "A" && xmlData[i + 3] === "T" && xmlData[i + 4] === "T" && xmlData[i + 5] === "L" && xmlData[i + 6] === "I" && xmlData[i + 7] === "S" && xmlData[i + 8] === "T") return true; return false; } function isNotation(xmlData, i) { - if (xmlData[i + 1] === "!" && xmlData[i + 2] === "N" && xmlData[i + 3] === "O" && xmlData[i + 4] === "T" && xmlData[i + 5] === "A" && xmlData[i + 6] === "T" && xmlData[i + 7] === "I" && xmlData[i + 8] === "O" && xmlData[i + 9] === "N") - return true; + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "N" && xmlData[i + 3] === "O" && xmlData[i + 4] === "T" && xmlData[i + 5] === "A" && xmlData[i + 6] === "T" && xmlData[i + 7] === "I" && xmlData[i + 8] === "O" && xmlData[i + 9] === "N") return true; return false; } function validateEntityName(name) { @@ -10295,11 +10233,9 @@ var require_strnum = __commonJS({ }; function toNumber(str, options = {}) { options = Object.assign({}, consider, options); - if (!str || typeof str !== "string") - return str; + if (!str || typeof str !== "string") return str; let trimmedStr = str.trim(); - if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) - return str; + if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr)) return str; else if (options.hex && hexRegex.test(trimmedStr)) { return Number.parseInt(trimmedStr, 16); } else { @@ -10309,45 +10245,30 @@ var require_strnum = __commonJS({ const leadingZeros = match[2]; let numTrimmedByZeros = trimZeros(match[3]); const eNotation = match[4] || match[6]; - if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") - return str; - else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") - return str; + if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") return str; + else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") return str; else { const num = Number(trimmedStr); const numStr = "" + num; if (numStr.search(/[eE]/) !== -1) { - if (options.eNotation) - return num; - else - return str; + if (options.eNotation) return num; + else return str; } else if (eNotation) { - if (options.eNotation) - return num; - else - return str; + if (options.eNotation) return num; + else return str; } else if (trimmedStr.indexOf(".") !== -1) { - if (numStr === "0" && numTrimmedByZeros === "") - return num; - else if (numStr === numTrimmedByZeros) - return num; - else if (sign && numStr === "-" + numTrimmedByZeros) - return num; - else - return str; + if (numStr === "0" && numTrimmedByZeros === "") return num; + else if (numStr === numTrimmedByZeros) return num; + else if (sign && numStr === "-" + numTrimmedByZeros) return num; + else return str; } if (leadingZeros) { - if (numTrimmedByZeros === numStr) - return num; - else if (sign + numTrimmedByZeros === numStr) - return num; - else - return str; + if (numTrimmedByZeros === numStr) return num; + else if (sign + numTrimmedByZeros === numStr) return num; + else return str; } - if (trimmedStr === numStr) - return num; - else if (trimmedStr === sign + numStr) - return num; + if (trimmedStr === numStr) return num; + else if (trimmedStr === sign + numStr) return num; return str; } } else { @@ -10358,12 +10279,9 @@ var require_strnum = __commonJS({ function trimZeros(numStr) { if (numStr && numStr.indexOf(".") !== -1) { numStr = numStr.replace(/0+$/, ""); - if (numStr === ".") - numStr = "0"; - else if (numStr[0] === ".") - numStr = "0" + numStr; - else if (numStr[numStr.length - 1] === ".") - numStr = numStr.substr(0, numStr.length - 1); + if (numStr === ".") numStr = "0"; + else if (numStr[0] === ".") numStr = "0" + numStr; + else if (numStr[numStr.length - 1] === ".") numStr = numStr.substr(0, numStr.length - 1); return numStr; } return numStr; @@ -10437,8 +10355,7 @@ var require_OrderedObjParser = __commonJS({ val2 = val2.trim(); } if (val2.length > 0) { - if (!escapeEntities) - val2 = this.replaceEntitiesValue(val2); + if (!escapeEntities) val2 = this.replaceEntitiesValue(val2); const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode); if (newval === null || newval === void 0) { return val2; @@ -10484,8 +10401,7 @@ var require_OrderedObjParser = __commonJS({ if (this.options.transformAttributeName) { aName = this.options.transformAttributeName(aName); } - if (aName === "__proto__") - aName = "#__proto__"; + if (aName === "__proto__") aName = "#__proto__"; if (oldVal !== void 0) { if (this.options.trimValues) { oldVal = oldVal.trim(); @@ -10560,8 +10476,7 @@ var require_OrderedObjParser = __commonJS({ i = closeIndex; } else if (xmlData[i + 1] === "?") { let tagData = readTagExp(xmlData, i, false, "?>"); - if (!tagData) - throw new Error("Pi Tag is not closed."); + if (!tagData) throw new Error("Pi Tag is not closed."); textData = this.saveTextToParentTag(textData, currentNode, jPath); if (this.options.ignoreDeclaration && tagData.tagName === "?xml" || this.options.ignorePiTags) { } else { @@ -10593,8 +10508,7 @@ var require_OrderedObjParser = __commonJS({ currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]); } else { let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true); - if (val2 == void 0) - val2 = ""; + if (val2 == void 0) val2 = ""; currentNode.add(this.options.textNodeName, val2); } i = closeIndex + 2; @@ -10628,8 +10542,7 @@ var require_OrderedObjParser = __commonJS({ i = result.closeIndex; } else { const result2 = this.readStopNodeData(xmlData, tagName, closeIndex + 1); - if (!result2) - throw new Error(`Unexpected end of ${tagName}`); + if (!result2) throw new Error(`Unexpected end of ${tagName}`); i = result2.i; tagContent = result2.tagContent; } @@ -10711,8 +10624,7 @@ var require_OrderedObjParser = __commonJS({ }; function saveTextToParentTag(textData, currentNode, jPath, isLeafNode) { if (textData) { - if (isLeafNode === void 0) - isLeafNode = Object.keys(currentNode.child).length === 0; + if (isLeafNode === void 0) isLeafNode = Object.keys(currentNode.child).length === 0; textData = this.parseTextData( textData, currentNode.tagname, @@ -10731,8 +10643,7 @@ var require_OrderedObjParser = __commonJS({ const allNodesExp = "*." + currentTagName; for (const stopNodePath in stopNodes) { const stopNodeExp = stopNodes[stopNodePath]; - if (allNodesExp === stopNodeExp || jPath === stopNodeExp) - return true; + if (allNodesExp === stopNodeExp || jPath === stopNodeExp) return true; } return false; } @@ -10742,8 +10653,7 @@ var require_OrderedObjParser = __commonJS({ for (let index = i; index < xmlData.length; index++) { let ch = xmlData[index]; if (attrBoundary) { - if (ch === attrBoundary) - attrBoundary = ""; + if (ch === attrBoundary) attrBoundary = ""; } else if (ch === '"' || ch === "'") { attrBoundary = ch; } else if (ch === closingChar[0]) { @@ -10776,8 +10686,7 @@ var require_OrderedObjParser = __commonJS({ } function readTagExp(xmlData, i, removeNSPrefix, closingChar = ">") { const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar); - if (!result) - return; + if (!result) return; let tagExp = result.data; const closeIndex = result.index; const separatorIndex = tagExp.search(/\s/); @@ -10844,12 +10753,9 @@ var require_OrderedObjParser = __commonJS({ function parseValue(val2, shouldParse, options) { if (shouldParse && typeof val2 === "string") { const newval = val2.trim(); - if (newval === "true") - return true; - else if (newval === "false") - return false; - else - return toNumber(val2, options); + if (newval === "true") return true; + else if (newval === "false") return false; + else return toNumber(val2, options); } else { if (util.isExist(val2)) { return val2; @@ -10876,15 +10782,11 @@ var require_node2json = __commonJS({ const tagObj = arr[i]; const property = propName(tagObj); let newJpath = ""; - if (jPath === void 0) - newJpath = property; - else - newJpath = jPath + "." + property; + if (jPath === void 0) newJpath = property; + else newJpath = jPath + "." + property; if (property === options.textNodeName) { - if (text === void 0) - text = tagObj[property]; - else - text += "" + tagObj[property]; + if (text === void 0) text = tagObj[property]; + else text += "" + tagObj[property]; } else if (property === void 0) { continue; } else if (tagObj[property]) { @@ -10895,10 +10797,8 @@ var require_node2json = __commonJS({ } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== void 0 && !options.alwaysCreateTextNode) { val2 = val2[options.textNodeName]; } else if (Object.keys(val2).length === 0) { - if (options.alwaysCreateTextNode) - val2[options.textNodeName] = ""; - else - val2 = ""; + if (options.alwaysCreateTextNode) val2[options.textNodeName] = ""; + else val2 = ""; } if (compressedObj[property] !== void 0 && compressedObj.hasOwnProperty(property)) { if (!Array.isArray(compressedObj[property])) { @@ -10915,18 +10815,15 @@ var require_node2json = __commonJS({ } } if (typeof text === "string") { - if (text.length > 0) - compressedObj[options.textNodeName] = text; - } else if (text !== void 0) - compressedObj[options.textNodeName] = text; + if (text.length > 0) compressedObj[options.textNodeName] = text; + } else if (text !== void 0) compressedObj[options.textNodeName] = text; return compressedObj; } function propName(obj) { const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key !== ":@") - return key; + if (key !== ":@") return key; } } function assignAttributes(obj, attrMap, jpath, options) { @@ -10983,8 +10880,7 @@ var require_XMLParser = __commonJS({ throw new Error("XML data is accepted in String or Bytes[] form."); } if (validationOption) { - if (validationOption === true) - validationOption = {}; + if (validationOption === true) validationOption = {}; const result = validator.validate(xmlData, validationOption); if (result !== true) { throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`); @@ -10993,10 +10889,8 @@ var require_XMLParser = __commonJS({ const orderedObjParser = new OrderedObjParser(this.options); orderedObjParser.addExternalEntities(this.externalEntities); const orderedResult = orderedObjParser.parseXml(xmlData); - if (this.options.preserveOrder || orderedResult === void 0) - return orderedResult; - else - return prettify(orderedResult, this.options); + if (this.options.preserveOrder || orderedResult === void 0) return orderedResult; + else return prettify(orderedResult, this.options); } /** * Add Entity which is not by default supported by this library @@ -11037,10 +10931,8 @@ var require_orderedJs2Xml = __commonJS({ const tagObj = arr[i]; const tagName = propName(tagObj); let newJPath = ""; - if (jPath.length === 0) - newJPath = tagName; - else - newJPath = `${jPath}.${tagName}`; + if (jPath.length === 0) newJPath = tagName; + else newJPath = `${jPath}.${tagName}`; if (tagName === options.textNodeName) { let tagText = tagObj[tagName]; if (!isStopNode(newJPath, options)) { @@ -11081,10 +10973,8 @@ var require_orderedJs2Xml = __commonJS({ const tagStart = indentation + `<${tagName}${attStr}`; const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation); if (options.unpairedTags.indexOf(tagName) !== -1) { - if (options.suppressUnpairedNode) - xmlStr += tagStart + ">"; - else - xmlStr += tagStart + "/>"; + if (options.suppressUnpairedNode) xmlStr += tagStart + ">"; + else xmlStr += tagStart + "/>"; } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) { xmlStr += tagStart + "/>"; } else if (tagValue && tagValue.endsWith(">")) { @@ -11106,8 +10996,7 @@ var require_orderedJs2Xml = __commonJS({ const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key !== ":@") - return key; + if (key !== ":@") return key; } } function attr_to_str(attrMap, options) { @@ -11129,8 +11018,7 @@ var require_orderedJs2Xml = __commonJS({ jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1); let tagName = jPath.substr(jPath.lastIndexOf(".") + 1); for (let index in options.stopNodes) { - if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) - return true; + if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) return true; } return false; } @@ -11227,10 +11115,8 @@ var require_json2xml = __commonJS({ for (let key in jObj) { if (typeof jObj[key] === "undefined") { } else if (jObj[key] === null) { - if (key[0] === "?") - val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; - else - val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + if (key[0] === "?") val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + else val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; } else if (jObj[key] instanceof Date) { val2 += this.buildTextValNode(jObj[key], key, "", level); } else if (typeof jObj[key] !== "object") { @@ -11252,10 +11138,8 @@ var require_json2xml = __commonJS({ const item = jObj[key][j]; if (typeof item === "undefined") { } else if (item === null) { - if (key[0] === "?") - val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; - else - val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + if (key[0] === "?") val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + else val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; } else if (typeof item === "object") { if (this.options.oneListGroup) { listTagVal += this.j2x(item, level + 1).val; @@ -11289,8 +11173,7 @@ var require_json2xml = __commonJS({ val2 = this.replaceEntitiesValue(val2); if (this.options.suppressBooleanAttributes && val2 === "true") { return " " + attrName; - } else - return " " + attrName + '="' + val2 + '"'; + } else return " " + attrName + '="' + val2 + '"'; }; function processTextOrObjNode(object, key, level) { const result = this.j2x(object, level + 1); @@ -11302,8 +11185,7 @@ var require_json2xml = __commonJS({ } Builder.prototype.buildObjectNode = function(val2, key, attrStr, level) { if (val2 === "") { - if (key[0] === "?") - return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; + if (key[0] === "?") return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; else { return this.indentate(level) + "<" + key + attrStr + this.closeTag(key) + this.tagEndChar; } @@ -11326,8 +11208,7 @@ var require_json2xml = __commonJS({ Builder.prototype.closeTag = function(key) { let closeTag = ""; if (this.options.unpairedTags.indexOf(key) !== -1) { - if (!this.options.suppressUnpairedNode) - closeTag = "/"; + if (!this.options.suppressUnpairedNode) closeTag = "/"; } else if (this.options.suppressEmptyNode) { closeTag = "/"; } else { @@ -22857,8 +22738,7 @@ var require_lib2 = __commonJS({ const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); return function(V, opts) { - if (!opts) - opts = {}; + if (!opts) opts = {}; let x = +V; if (opts.enforceRange) { if (!Number.isFinite(x)) { @@ -22872,10 +22752,8 @@ var require_lib2 = __commonJS({ } if (!isNaN(x) && opts.clamp) { x = evenRound(x); - if (x < lowerBound) - x = lowerBound; - if (x > upperBound) - x = upperBound; + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; return x; } if (!Number.isFinite(x) || x === 0) { @@ -22926,8 +22804,7 @@ var require_lib2 = __commonJS({ conversions["float"] = conversions["double"]; conversions["unrestricted float"] = conversions["unrestricted double"]; conversions["DOMString"] = function(V, opts) { - if (!opts) - opts = {}; + if (!opts) opts = {}; if (opts.treatNullAsEmptyString && V === null) { return ""; } @@ -23164,8 +23041,7 @@ var require_tr46 = __commonJS({ } } } - if (result.error) - return null; + if (result.error) return null; return labels.join("."); }; module2.exports.toUnicode = function(domain_name, useSTD3) { @@ -24576,8 +24452,7 @@ var require_URL = __commonJS({ return obj; }, setup(obj, constructorArgs, privateData) { - if (!privateData) - privateData = {}; + if (!privateData) privateData = {}; privateData.wrapper = obj; obj[impl] = new Impl.implementation(constructorArgs, privateData); obj[impl][utils.wrapperSymbol] = obj; @@ -24616,18 +24491,14 @@ var require_safer = __commonJS({ var safer = {}; var key; for (key in buffer) { - if (!buffer.hasOwnProperty(key)) - continue; - if (key === "SlowBuffer" || key === "Buffer") - continue; + if (!buffer.hasOwnProperty(key)) continue; + if (key === "SlowBuffer" || key === "Buffer") continue; safer[key] = buffer[key]; } var Safer = safer.Buffer = {}; for (key in Buffer2) { - if (!Buffer2.hasOwnProperty(key)) - continue; - if (key === "allocUnsafe" || key === "allocUnsafeSlow") - continue; + if (!Buffer2.hasOwnProperty(key)) continue; + if (key === "allocUnsafe" || key === "allocUnsafeSlow") continue; Safer[key] = Buffer2[key]; } safer.Buffer.prototype = Buffer2.prototype; @@ -25075,14 +24946,10 @@ var require_utf32 = __commonJS({ return "utf-32be"; } } - if (b[0] !== 0 || b[1] > 16) - invalidBE++; - if (b[3] !== 0 || b[2] > 16) - invalidLE++; - if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) - bmpCharsBE++; - if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) - bmpCharsLE++; + if (b[0] !== 0 || b[1] > 16) invalidBE++; + if (b[3] !== 0 || b[2] > 16) invalidLE++; + if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) bmpCharsBE++; + if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) bmpCharsLE++; b.length = 0; charsProcessed++; if (charsProcessed >= 100) { @@ -25091,10 +24958,8 @@ var require_utf32 = __commonJS({ } } } - if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE) - return "utf-32be"; - if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE) - return "utf-32le"; + if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE) return "utf-32be"; + if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE) return "utf-32le"; return defaultEncoding || "utf-32le"; } } @@ -25214,15 +25079,11 @@ var require_utf16 = __commonJS({ b.push(buf[j]); if (b.length === 2) { if (charsProcessed === 0) { - if (b[0] === 255 && b[1] === 254) - return "utf-16le"; - if (b[0] === 254 && b[1] === 255) - return "utf-16be"; + if (b[0] === 255 && b[1] === 254) return "utf-16le"; + if (b[0] === 254 && b[1] === 255) return "utf-16be"; } - if (b[0] === 0 && b[1] !== 0) - asciiCharsBE++; - if (b[0] !== 0 && b[1] === 0) - asciiCharsLE++; + if (b[0] === 0 && b[1] !== 0) asciiCharsBE++; + if (b[0] !== 0 && b[1] === 0) asciiCharsLE++; b.length = 0; charsProcessed++; if (charsProcessed >= 100) { @@ -25231,10 +25092,8 @@ var require_utf16 = __commonJS({ } } } - if (asciiCharsBE > asciiCharsLE) - return "utf-16be"; - if (asciiCharsBE < asciiCharsLE) - return "utf-16le"; + if (asciiCharsBE > asciiCharsLE) return "utf-16be"; + if (asciiCharsBE < asciiCharsLE) return "utf-16le"; return defaultEncoding || "utf-16le"; } } @@ -26185,10 +26044,8 @@ var require_dbcs_codec = __commonJS({ this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]); } this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]; - if (this.defCharSB === UNASSIGNED) - this.defCharSB = this.encodeTable[0]["?"]; - if (this.defCharSB === UNASSIGNED) - this.defCharSB = "?".charCodeAt(0); + if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]["?"]; + if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0); } DBCSCodec.prototype.encoder = DBCSEncoder; DBCSCodec.prototype.decoder = DBCSDecoder; @@ -26269,8 +26126,7 @@ var require_dbcs_codec = __commonJS({ node = this.encodeTableSeq[SEQ_START - bucket[low]]; } else { node = {}; - if (bucket[low] !== UNASSIGNED) - node[DEF_CHAR] = bucket[low]; + if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; bucket[low] = SEQ_START - this.encodeTableSeq.length; this.encodeTableSeq.push(node); } @@ -26327,8 +26183,7 @@ var require_dbcs_codec = __commonJS({ var newBuf = Buffer2.alloc(str.length * (this.gb18030 ? 4 : 3)), leadSurrogate = this.leadSurrogate, seqObj = this.seqObj, nextChar = -1, i2 = 0, j = 0; while (true) { if (nextChar === -1) { - if (i2 == str.length) - break; + if (i2 == str.length) break; var uCode = str.charCodeAt(i2++); } else { var uCode = nextChar; @@ -28069,8 +27924,7 @@ var require_streams = __commonJS({ return done(new Error("Iconv encoding stream needs strings as its input.")); try { var res = this.conv.write(chunk); - if (res && res.length) - this.push(res); + if (res && res.length) this.push(res); done(); } catch (e) { done(e); @@ -28079,8 +27933,7 @@ var require_streams = __commonJS({ IconvLiteEncoderStream.prototype._flush = function(done) { try { var res = this.conv.end(); - if (res && res.length) - this.push(res); + if (res && res.length) this.push(res); done(); } catch (e) { done(e); @@ -28111,8 +27964,7 @@ var require_streams = __commonJS({ return done(new Error("Iconv decoding stream needs buffers as its input.")); try { var res = this.conv.write(chunk); - if (res && res.length) - this.push(res, this.encoding); + if (res && res.length) this.push(res, this.encoding); done(); } catch (e) { done(e); @@ -28121,8 +27973,7 @@ var require_streams = __commonJS({ IconvLiteDecoderStream.prototype._flush = function(done) { try { var res = this.conv.end(); - if (res && res.length) - this.push(res, this.encoding); + if (res && res.length) this.push(res, this.encoding); done(); } catch (e) { done(e); @@ -28458,16 +28309,13 @@ var require_lib4 = __commonJS({ body = null; } else if (isURLSearchParams(body)) { body = Buffer.from(body.toString()); - } else if (isBlob(body)) - ; - else if (Buffer.isBuffer(body)) - ; + } else if (isBlob(body)) ; + else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === "[object ArrayBuffer]") { body = Buffer.from(body); } else if (ArrayBuffer.isView(body)) { body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); - } else if (body instanceof Stream) - ; + } else if (body instanceof Stream) ; else { body = Buffer.from(String(body)); } @@ -28810,8 +28658,7 @@ var require_lib4 = __commonJS({ } return; } - if (init == null) - ; + if (init == null) ; else if (typeof init === "object") { const method = init[Symbol.iterator]; if (method != null) { @@ -29193,8 +29040,7 @@ var require_lib4 = __commonJS({ } } let signal = isRequest(input) ? input.signal : null; - if ("signal" in init) - signal = init.signal; + if ("signal" in init) signal = init.signal; if (signal != null && !isAbortSignal(signal)) { throw new TypeError("Expected signal to be an instanceof AbortSignal"); } @@ -29331,8 +29177,7 @@ var require_lib4 = __commonJS({ if (request2.body && request2.body instanceof Stream.Readable) { destroyStream(request2.body, error); } - if (!response || !response.body) - return; + if (!response || !response.body) return; response.body.emit("error", error); }; if (signal && signal.aborted) { @@ -29350,8 +29195,7 @@ var require_lib4 = __commonJS({ } function finalize() { req.abort(); - if (signal) - signal.removeEventListener("abort", abortAndFinalize); + if (signal) signal.removeEventListener("abort", abortAndFinalize); clearTimeout(reqTimeout); } if (request2.timeout) { @@ -29460,8 +29304,7 @@ var require_lib4 = __commonJS({ } } res.once("end", function() { - if (signal) - signal.removeEventListener("abort", abortAndFinalize); + if (signal) signal.removeEventListener("abort", abortAndFinalize); }); let body = res.pipe(new PassThrough$1()); const response_options = { @@ -31154,8 +30997,7 @@ var require_lib5 = __commonJS({ "../aws-custom-resource-sdk-adapter/lib/index.js"(exports2) { "use strict"; var __createBinding2 = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { @@ -31164,14 +31006,11 @@ var require_lib5 = __commonJS({ } Object.defineProperty(o, k2, desc); } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; + if (k2 === void 0) k2 = k; o[k2] = m[k]; }); var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) - __createBinding2(exports3, m, p); + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding2(exports3, m, p); }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.normalizeActionName = exports2.normalizeServiceName = exports2.findV3ClientConstructor = exports2.coerceApiParameters = void 0; From e5e032b0d9cd9c43396c5574add011b11252ca28 Mon Sep 17 00:00:00 2001 From: Kendra Neil <53584728+TheRealAmazonKendra@users.noreply.github.com> Date: Fri, 12 Jul 2024 13:51:31 -0700 Subject: [PATCH 20/23] chore: remove use of deprecated ServicePrincipal Mapping (#30832) They have now been standardized for a few years. We did not initially remove the old mappings out of caution and because we were unsure that the changes has made it to all regions yet. It is long past that happening at this point. Because we never removed this or marked it as deprecated, we still have a not insignificant amount of customers who believe the individual mapping is necessary and cut tickets because it is not up-to-date. Closes #. - [ ] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- packages/@aws-cdk/aws-appconfig-alpha/.jsii | 12743 ++++++++++++++++ .../aws-appconfig-alpha/.warnings.jsii.js | 739 + .../aws-appconfig-alpha/lib/application.d.ts | 296 + .../aws-appconfig-alpha/lib/application.js | 353 + .../lib/configuration.d.ts | 579 + .../aws-appconfig-alpha/lib/configuration.js | 696 + .../lib/deployment-strategy.d.ts | 258 + .../lib/deployment-strategy.js | 287 + .../aws-appconfig-alpha/lib/environment.d.ts | 296 + .../aws-appconfig-alpha/lib/environment.js | 274 + .../aws-appconfig-alpha/lib/extension.d.ts | 474 + .../aws-appconfig-alpha/lib/extension.js | 594 + .../aws-appconfig-alpha/lib/index.d.ts | 5 + .../@aws-cdk/aws-appconfig-alpha/lib/index.js | 22 + .../aws-appconfig-alpha/lib/private/hash.d.ts | 2 + .../aws-appconfig-alpha/lib/private/hash.js | 16 + .../test/application.test.d.ts | 1 + .../test/application.test.js | 488 + .../test/configuration.test.d.ts | 1 + .../test/configuration.test.js | 1280 ++ .../test/deployment-strategy.test.d.ts | 1 + .../test/deployment-strategy.test.js | 252 + .../test/environment.test.d.ts | 1 + .../test/environment.test.js | 496 + .../test/extension.test.d.ts | 1 + .../test/extension.test.js | 626 + .../test/integ.application.d.ts | 1 + .../test/integ.application.js | 21 + .../test/integ.configuration.d.ts | 1 + .../test/integ.configuration.js | 208 + .../test/integ.deployment-strategy.d.ts | 1 + .../test/integ.deployment-strategy.js | 21 + .../test/integ.environment.d.ts | 1 + .../test/integ.environment.js | 82 + .../test/integ.extension.d.ts | 1 + .../test/integ.extension.js | 105 + .../aws-appconfig-alpha/tsconfig.json | 53 + 37 files changed, 21276 insertions(+) create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/.jsii create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/.warnings.jsii.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/application.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/application.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/environment.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/environment.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/extension.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/extension.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/index.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/index.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/application.test.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/application.test.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.d.ts create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.js create mode 100644 packages/@aws-cdk/aws-appconfig-alpha/tsconfig.json diff --git a/packages/@aws-cdk/aws-appconfig-alpha/.jsii b/packages/@aws-cdk/aws-appconfig-alpha/.jsii new file mode 100644 index 0000000000000..1bef9a68a529d --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/.jsii @@ -0,0 +1,12743 @@ +{ + "author": { + "name": "Amazon Web Services", + "organization": true, + "roles": [ + "author" + ], + "url": "https://aws.amazon.com" + }, + "bundled": { + "mime-types": "^2.1.35" + }, + "dependencies": { + "aws-cdk-lib": "^0.0.0", + "constructs": "^10.0.0" + }, + "dependencyClosure": { + "@aws-cdk/asset-awscli-v1": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.AwsCliV1", + "packageId": "Amazon.CDK.Asset.AwsCliV1" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-awscli-go", + "packageName": "awscliv1" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-awscli-v1", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.awscli.v1" + }, + "js": { + "npm": "@aws-cdk/asset-awscli-v1" + }, + "python": { + "distName": "aws-cdk.asset-awscli-v1", + "module": "aws_cdk.asset_awscli_v1" + } + } + }, + "@aws-cdk/asset-kubectl-v20": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.KubectlV20", + "packageId": "Amazon.CDK.Asset.KubectlV20" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-kubectl-go", + "packageName": "kubectlv20" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-kubectl-v20", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.kubectl.v20" + }, + "js": { + "npm": "@aws-cdk/asset-kubectl-v20" + }, + "python": { + "distName": "aws-cdk.asset-kubectl-v20", + "module": "aws_cdk.asset_kubectl_v20" + } + } + }, + "@aws-cdk/asset-node-proxy-agent-v6": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.NodeProxyAgentV6", + "packageId": "Amazon.CDK.Asset.NodeProxyAgentV6" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-node-proxy-agent-go", + "packageName": "nodeproxyagentv6" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-node-proxy-agent-v6", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.node.proxy.agent.v6" + }, + "js": { + "npm": "@aws-cdk/asset-node-proxy-agent-v6" + }, + "python": { + "distName": "aws-cdk.asset-node-proxy-agent-v6", + "module": "aws_cdk.asset_node_proxy_agent_v6" + } + } + }, + "aws-cdk-lib": { + "submodules": { + "aws-cdk-lib.alexa_ask": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Alexa.Ask" + }, + "java": { + "package": "software.amazon.awscdk.alexa.ask" + }, + "python": { + "module": "aws_cdk.alexa_ask" + } + } + }, + "aws-cdk-lib.assertions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Assertions" + }, + "java": { + "package": "software.amazon.awscdk.assertions" + }, + "python": { + "module": "aws_cdk.assertions" + } + } + }, + "aws-cdk-lib.assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Assets" + }, + "java": { + "package": "software.amazon.awscdk.assets" + }, + "python": { + "module": "aws_cdk.assets" + } + } + }, + "aws-cdk-lib.aws_accessanalyzer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AccessAnalyzer" + }, + "java": { + "package": "software.amazon.awscdk.services.accessanalyzer" + }, + "python": { + "module": "aws_cdk.aws_accessanalyzer" + } + } + }, + "aws-cdk-lib.aws_acmpca": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ACMPCA" + }, + "java": { + "package": "software.amazon.awscdk.services.acmpca" + }, + "python": { + "module": "aws_cdk.aws_acmpca" + } + } + }, + "aws-cdk-lib.aws_amazonmq": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AmazonMQ" + }, + "java": { + "package": "software.amazon.awscdk.services.amazonmq" + }, + "python": { + "module": "aws_cdk.aws_amazonmq" + } + } + }, + "aws-cdk-lib.aws_amplify": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Amplify" + }, + "java": { + "package": "software.amazon.awscdk.services.amplify" + }, + "python": { + "module": "aws_cdk.aws_amplify" + } + } + }, + "aws-cdk-lib.aws_amplifyuibuilder": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AmplifyUIBuilder" + }, + "java": { + "package": "software.amazon.awscdk.services.amplifyuibuilder" + }, + "python": { + "module": "aws_cdk.aws_amplifyuibuilder" + } + } + }, + "aws-cdk-lib.aws_apigateway": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.APIGateway" + }, + "java": { + "package": "software.amazon.awscdk.services.apigateway" + }, + "python": { + "module": "aws_cdk.aws_apigateway" + } + } + }, + "aws-cdk-lib.aws_apigatewayv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Apigatewayv2" + }, + "java": { + "package": "software.amazon.awscdk.services.apigatewayv2" + }, + "python": { + "module": "aws_cdk.aws_apigatewayv2" + } + } + }, + "aws-cdk-lib.aws_apigatewayv2_authorizers": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AwsApigatewayv2Authorizers" + }, + "java": { + "package": "software.amazon.awscdk.aws_apigatewayv2_authorizers" + }, + "python": { + "module": "aws_cdk.aws_apigatewayv2_authorizers" + } + } + }, + "aws-cdk-lib.aws_apigatewayv2_integrations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AwsApigatewayv2Integrations" + }, + "java": { + "package": "software.amazon.awscdk.aws_apigatewayv2_integrations" + }, + "python": { + "module": "aws_cdk.aws_apigatewayv2_integrations" + } + } + }, + "aws-cdk-lib.aws_appconfig": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppConfig" + }, + "java": { + "package": "software.amazon.awscdk.services.appconfig" + }, + "python": { + "module": "aws_cdk.aws_appconfig" + } + } + }, + "aws-cdk-lib.aws_appflow": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppFlow" + }, + "java": { + "package": "software.amazon.awscdk.services.appflow" + }, + "python": { + "module": "aws_cdk.aws_appflow" + } + } + }, + "aws-cdk-lib.aws_appintegrations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppIntegrations" + }, + "java": { + "package": "software.amazon.awscdk.services.appintegrations" + }, + "python": { + "module": "aws_cdk.aws_appintegrations" + } + } + }, + "aws-cdk-lib.aws_applicationautoscaling": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ApplicationAutoScaling" + }, + "java": { + "package": "software.amazon.awscdk.services.applicationautoscaling" + }, + "python": { + "module": "aws_cdk.aws_applicationautoscaling" + } + } + }, + "aws-cdk-lib.aws_applicationinsights": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ApplicationInsights" + }, + "java": { + "package": "software.amazon.awscdk.services.applicationinsights" + }, + "python": { + "module": "aws_cdk.aws_applicationinsights" + } + } + }, + "aws-cdk-lib.aws_applicationsignals": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.ApplicationSignals" + }, + "java": { + "package": "software.amazon.awscdk.services.applicationsignals" + }, + "python": { + "module": "aws_cdk.aws_applicationsignals" + } + } + }, + "aws-cdk-lib.aws_appmesh": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppMesh" + }, + "java": { + "package": "software.amazon.awscdk.services.appmesh" + }, + "python": { + "module": "aws_cdk.aws_appmesh" + } + } + }, + "aws-cdk-lib.aws_apprunner": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppRunner" + }, + "java": { + "package": "software.amazon.awscdk.services.apprunner" + }, + "python": { + "module": "aws_cdk.aws_apprunner" + } + } + }, + "aws-cdk-lib.aws_appstream": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppStream" + }, + "java": { + "package": "software.amazon.awscdk.services.appstream" + }, + "python": { + "module": "aws_cdk.aws_appstream" + } + } + }, + "aws-cdk-lib.aws_appsync": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppSync" + }, + "java": { + "package": "software.amazon.awscdk.services.appsync" + }, + "python": { + "module": "aws_cdk.aws_appsync" + } + } + }, + "aws-cdk-lib.aws_apptest": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.AppTest" + }, + "java": { + "package": "software.amazon.awscdk.services.apptest" + }, + "python": { + "module": "aws_cdk.aws_apptest" + } + } + }, + "aws-cdk-lib.aws_aps": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.APS" + }, + "java": { + "package": "software.amazon.awscdk.services.aps" + }, + "python": { + "module": "aws_cdk.aws_aps" + } + } + }, + "aws-cdk-lib.aws_arczonalshift": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.ARCZonalShift" + }, + "java": { + "package": "software.amazon.awscdk.services.arczonalshift" + }, + "python": { + "module": "aws_cdk.aws_arczonalshift" + } + } + }, + "aws-cdk-lib.aws_athena": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Athena" + }, + "java": { + "package": "software.amazon.awscdk.services.athena" + }, + "python": { + "module": "aws_cdk.aws_athena" + } + } + }, + "aws-cdk-lib.aws_auditmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AuditManager" + }, + "java": { + "package": "software.amazon.awscdk.services.auditmanager" + }, + "python": { + "module": "aws_cdk.aws_auditmanager" + } + } + }, + "aws-cdk-lib.aws_autoscaling": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling" + }, + "python": { + "module": "aws_cdk.aws_autoscaling" + } + } + }, + "aws-cdk-lib.aws_autoscaling_common": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling.Common" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling.common" + }, + "python": { + "module": "aws_cdk.aws_autoscaling_common" + } + } + }, + "aws-cdk-lib.aws_autoscaling_hooktargets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling.HookTargets" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling.hooktargets" + }, + "python": { + "module": "aws_cdk.aws_autoscaling_hooktargets" + } + } + }, + "aws-cdk-lib.aws_autoscalingplans": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScalingPlans" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscalingplans" + }, + "python": { + "module": "aws_cdk.aws_autoscalingplans" + } + } + }, + "aws-cdk-lib.aws_b2bi": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.B2BI" + }, + "java": { + "package": "software.amazon.awscdk.services.b2bi" + }, + "python": { + "module": "aws_cdk.aws_b2bi" + } + } + }, + "aws-cdk-lib.aws_backup": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Backup" + }, + "java": { + "package": "software.amazon.awscdk.services.backup" + }, + "python": { + "module": "aws_cdk.aws_backup" + } + } + }, + "aws-cdk-lib.aws_backupgateway": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.BackupGateway" + }, + "java": { + "package": "software.amazon.awscdk.services.backupgateway" + }, + "python": { + "module": "aws_cdk.aws_backupgateway" + } + } + }, + "aws-cdk-lib.aws_batch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Batch" + }, + "java": { + "package": "software.amazon.awscdk.services.batch" + }, + "python": { + "module": "aws_cdk.aws_batch" + } + } + }, + "aws-cdk-lib.aws_bcmdataexports": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.BCMDataExports" + }, + "java": { + "package": "software.amazon.awscdk.services.bcmdataexports" + }, + "python": { + "module": "aws_cdk.aws_bcmdataexports" + } + } + }, + "aws-cdk-lib.aws_bedrock": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Bedrock" + }, + "java": { + "package": "software.amazon.awscdk.services.bedrock" + }, + "python": { + "module": "aws_cdk.aws_bedrock" + } + } + }, + "aws-cdk-lib.aws_billingconductor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.BillingConductor" + }, + "java": { + "package": "software.amazon.awscdk.services.billingconductor" + }, + "python": { + "module": "aws_cdk.aws_billingconductor" + } + } + }, + "aws-cdk-lib.aws_budgets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Budgets" + }, + "java": { + "package": "software.amazon.awscdk.services.budgets" + }, + "python": { + "module": "aws_cdk.aws_budgets" + } + } + }, + "aws-cdk-lib.aws_cassandra": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cassandra" + }, + "java": { + "package": "software.amazon.awscdk.services.cassandra" + }, + "python": { + "module": "aws_cdk.aws_cassandra" + } + } + }, + "aws-cdk-lib.aws_ce": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CE" + }, + "java": { + "package": "software.amazon.awscdk.services.ce" + }, + "python": { + "module": "aws_cdk.aws_ce" + } + } + }, + "aws-cdk-lib.aws_certificatemanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CertificateManager" + }, + "java": { + "package": "software.amazon.awscdk.services.certificatemanager" + }, + "python": { + "module": "aws_cdk.aws_certificatemanager" + } + } + }, + "aws-cdk-lib.aws_chatbot": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Chatbot" + }, + "java": { + "package": "software.amazon.awscdk.services.chatbot" + }, + "python": { + "module": "aws_cdk.aws_chatbot" + } + } + }, + "aws-cdk-lib.aws_cleanrooms": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.CleanRooms" + }, + "java": { + "package": "software.amazon.awscdk.services.cleanrooms" + }, + "python": { + "module": "aws_cdk.aws_cleanrooms" + } + } + }, + "aws-cdk-lib.aws_cleanroomsml": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.CleanRoomsML" + }, + "java": { + "package": "software.amazon.awscdk.services.cleanroomsml" + }, + "python": { + "module": "aws_cdk.aws_cleanroomsml" + } + } + }, + "aws-cdk-lib.aws_cloud9": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cloud9" + }, + "java": { + "package": "software.amazon.awscdk.services.cloud9" + }, + "python": { + "module": "aws_cdk.aws_cloud9" + } + } + }, + "aws-cdk-lib.aws_cloudformation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFormation" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudformation" + }, + "python": { + "module": "aws_cdk.aws_cloudformation" + } + } + }, + "aws-cdk-lib.aws_cloudfront": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFront" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudfront" + }, + "python": { + "module": "aws_cdk.aws_cloudfront" + } + } + }, + "aws-cdk-lib.aws_cloudfront.experimental": {}, + "aws-cdk-lib.aws_cloudfront_origins": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFront.Origins" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudfront.origins" + }, + "python": { + "module": "aws_cdk.aws_cloudfront_origins" + } + } + }, + "aws-cdk-lib.aws_cloudtrail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudTrail" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudtrail" + }, + "python": { + "module": "aws_cdk.aws_cloudtrail" + } + } + }, + "aws-cdk-lib.aws_cloudwatch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudWatch" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudwatch" + }, + "python": { + "module": "aws_cdk.aws_cloudwatch" + } + } + }, + "aws-cdk-lib.aws_cloudwatch_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudWatch.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudwatch.actions" + }, + "python": { + "module": "aws_cdk.aws_cloudwatch_actions" + } + } + }, + "aws-cdk-lib.aws_codeartifact": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeArtifact" + }, + "java": { + "package": "software.amazon.awscdk.services.codeartifact" + }, + "python": { + "module": "aws_cdk.aws_codeartifact" + } + } + }, + "aws-cdk-lib.aws_codebuild": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeBuild" + }, + "java": { + "package": "software.amazon.awscdk.services.codebuild" + }, + "python": { + "module": "aws_cdk.aws_codebuild" + } + } + }, + "aws-cdk-lib.aws_codecommit": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeCommit" + }, + "java": { + "package": "software.amazon.awscdk.services.codecommit" + }, + "python": { + "module": "aws_cdk.aws_codecommit" + } + } + }, + "aws-cdk-lib.aws_codeconnections": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.CodeConnections" + }, + "java": { + "package": "software.amazon.awscdk.services.codeconnections" + }, + "python": { + "module": "aws_cdk.aws_codeconnections" + } + } + }, + "aws-cdk-lib.aws_codedeploy": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeDeploy" + }, + "java": { + "package": "software.amazon.awscdk.services.codedeploy" + }, + "python": { + "module": "aws_cdk.aws_codedeploy" + } + } + }, + "aws-cdk-lib.aws_codeguruprofiler": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeGuruProfiler" + }, + "java": { + "package": "software.amazon.awscdk.services.codeguruprofiler" + }, + "python": { + "module": "aws_cdk.aws_codeguruprofiler" + } + } + }, + "aws-cdk-lib.aws_codegurureviewer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeGuruReviewer" + }, + "java": { + "package": "software.amazon.awscdk.services.codegurureviewer" + }, + "python": { + "module": "aws_cdk.aws_codegurureviewer" + } + } + }, + "aws-cdk-lib.aws_codepipeline": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodePipeline" + }, + "java": { + "package": "software.amazon.awscdk.services.codepipeline" + }, + "python": { + "module": "aws_cdk.aws_codepipeline" + } + } + }, + "aws-cdk-lib.aws_codepipeline_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodePipeline.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.codepipeline.actions" + }, + "python": { + "module": "aws_cdk.aws_codepipeline_actions" + } + } + }, + "aws-cdk-lib.aws_codestar": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Codestar" + }, + "java": { + "package": "software.amazon.awscdk.services.codestar" + }, + "python": { + "module": "aws_cdk.aws_codestar" + } + } + }, + "aws-cdk-lib.aws_codestarconnections": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeStarConnections" + }, + "java": { + "package": "software.amazon.awscdk.services.codestarconnections" + }, + "python": { + "module": "aws_cdk.aws_codestarconnections" + } + } + }, + "aws-cdk-lib.aws_codestarnotifications": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeStarNotifications" + }, + "java": { + "package": "software.amazon.awscdk.services.codestarnotifications" + }, + "python": { + "module": "aws_cdk.aws_codestarnotifications" + } + } + }, + "aws-cdk-lib.aws_cognito": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cognito" + }, + "java": { + "package": "software.amazon.awscdk.services.cognito" + }, + "python": { + "module": "aws_cdk.aws_cognito" + } + } + }, + "aws-cdk-lib.aws_comprehend": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Comprehend" + }, + "java": { + "package": "software.amazon.awscdk.services.comprehend" + }, + "python": { + "module": "aws_cdk.aws_comprehend" + } + } + }, + "aws-cdk-lib.aws_config": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Config" + }, + "java": { + "package": "software.amazon.awscdk.services.config" + }, + "python": { + "module": "aws_cdk.aws_config" + } + } + }, + "aws-cdk-lib.aws_connect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Connect" + }, + "java": { + "package": "software.amazon.awscdk.services.connect" + }, + "python": { + "module": "aws_cdk.aws_connect" + } + } + }, + "aws-cdk-lib.aws_connectcampaigns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ConnectCampaigns" + }, + "java": { + "package": "software.amazon.awscdk.services.connectcampaigns" + }, + "python": { + "module": "aws_cdk.aws_connectcampaigns" + } + } + }, + "aws-cdk-lib.aws_controltower": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ControlTower" + }, + "java": { + "package": "software.amazon.awscdk.services.controltower" + }, + "python": { + "module": "aws_cdk.aws_controltower" + } + } + }, + "aws-cdk-lib.aws_cur": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CUR" + }, + "java": { + "package": "software.amazon.awscdk.services.cur" + }, + "python": { + "module": "aws_cdk.aws_cur" + } + } + }, + "aws-cdk-lib.aws_customerprofiles": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CustomerProfiles" + }, + "java": { + "package": "software.amazon.awscdk.services.customerprofiles" + }, + "python": { + "module": "aws_cdk.aws_customerprofiles" + } + } + }, + "aws-cdk-lib.aws_databrew": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataBrew" + }, + "java": { + "package": "software.amazon.awscdk.services.databrew" + }, + "python": { + "module": "aws_cdk.aws_databrew" + } + } + }, + "aws-cdk-lib.aws_datapipeline": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataPipeline" + }, + "java": { + "package": "software.amazon.awscdk.services.datapipeline" + }, + "python": { + "module": "aws_cdk.aws_datapipeline" + } + } + }, + "aws-cdk-lib.aws_datasync": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataSync" + }, + "java": { + "package": "software.amazon.awscdk.services.datasync" + }, + "python": { + "module": "aws_cdk.aws_datasync" + } + } + }, + "aws-cdk-lib.aws_datazone": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.DataZone" + }, + "java": { + "package": "software.amazon.awscdk.services.datazone" + }, + "python": { + "module": "aws_cdk.aws_datazone" + } + } + }, + "aws-cdk-lib.aws_dax": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DAX" + }, + "java": { + "package": "software.amazon.awscdk.services.dax" + }, + "python": { + "module": "aws_cdk.aws_dax" + } + } + }, + "aws-cdk-lib.aws_deadline": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Deadline" + }, + "java": { + "package": "software.amazon.awscdk.services.deadline" + }, + "python": { + "module": "aws_cdk.aws_deadline" + } + } + }, + "aws-cdk-lib.aws_detective": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Detective" + }, + "java": { + "package": "software.amazon.awscdk.services.detective" + }, + "python": { + "module": "aws_cdk.aws_detective" + } + } + }, + "aws-cdk-lib.aws_devicefarm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DeviceFarm" + }, + "java": { + "package": "software.amazon.awscdk.services.devicefarm" + }, + "python": { + "module": "aws_cdk.aws_devicefarm" + } + } + }, + "aws-cdk-lib.aws_devopsguru": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DevOpsGuru" + }, + "java": { + "package": "software.amazon.awscdk.services.devopsguru" + }, + "python": { + "module": "aws_cdk.aws_devopsguru" + } + } + }, + "aws-cdk-lib.aws_directoryservice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DirectoryService" + }, + "java": { + "package": "software.amazon.awscdk.services.directoryservice" + }, + "python": { + "module": "aws_cdk.aws_directoryservice" + } + } + }, + "aws-cdk-lib.aws_dlm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DLM" + }, + "java": { + "package": "software.amazon.awscdk.services.dlm" + }, + "python": { + "module": "aws_cdk.aws_dlm" + } + } + }, + "aws-cdk-lib.aws_dms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DMS" + }, + "java": { + "package": "software.amazon.awscdk.services.dms" + }, + "python": { + "module": "aws_cdk.aws_dms" + } + } + }, + "aws-cdk-lib.aws_docdb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DocDB" + }, + "java": { + "package": "software.amazon.awscdk.services.docdb" + }, + "python": { + "module": "aws_cdk.aws_docdb" + } + } + }, + "aws-cdk-lib.aws_docdbelastic": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DocDBElastic" + }, + "java": { + "package": "software.amazon.awscdk.services.docdbelastic" + }, + "python": { + "module": "aws_cdk.aws_docdbelastic" + } + } + }, + "aws-cdk-lib.aws_dynamodb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DynamoDB" + }, + "java": { + "package": "software.amazon.awscdk.services.dynamodb" + }, + "python": { + "module": "aws_cdk.aws_dynamodb" + } + } + }, + "aws-cdk-lib.aws_ec2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EC2" + }, + "java": { + "package": "software.amazon.awscdk.services.ec2" + }, + "python": { + "module": "aws_cdk.aws_ec2" + } + } + }, + "aws-cdk-lib.aws_ecr": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECR" + }, + "java": { + "package": "software.amazon.awscdk.services.ecr" + }, + "python": { + "module": "aws_cdk.aws_ecr" + } + } + }, + "aws-cdk-lib.aws_ecr_assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Ecr.Assets" + }, + "java": { + "package": "software.amazon.awscdk.services.ecr.assets" + }, + "python": { + "module": "aws_cdk.aws_ecr_assets" + } + } + }, + "aws-cdk-lib.aws_ecs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECS" + }, + "java": { + "package": "software.amazon.awscdk.services.ecs" + }, + "python": { + "module": "aws_cdk.aws_ecs" + } + } + }, + "aws-cdk-lib.aws_ecs_patterns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECS.Patterns" + }, + "java": { + "package": "software.amazon.awscdk.services.ecs.patterns" + }, + "python": { + "module": "aws_cdk.aws_ecs_patterns" + } + } + }, + "aws-cdk-lib.aws_efs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EFS" + }, + "java": { + "package": "software.amazon.awscdk.services.efs" + }, + "python": { + "module": "aws_cdk.aws_efs" + } + } + }, + "aws-cdk-lib.aws_eks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EKS" + }, + "java": { + "package": "software.amazon.awscdk.services.eks" + }, + "python": { + "module": "aws_cdk.aws_eks" + } + } + }, + "aws-cdk-lib.aws_elasticache": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElastiCache" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticache" + }, + "python": { + "module": "aws_cdk.aws_elasticache" + } + } + }, + "aws-cdk-lib.aws_elasticbeanstalk": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticBeanstalk" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticbeanstalk" + }, + "python": { + "module": "aws_cdk.aws_elasticbeanstalk" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancing": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancing" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancing" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancing" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2.actions" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2_actions" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2.targets" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2_targets" + } + } + }, + "aws-cdk-lib.aws_elasticsearch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Elasticsearch" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticsearch" + }, + "python": { + "module": "aws_cdk.aws_elasticsearch" + } + } + }, + "aws-cdk-lib.aws_emr": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMR" + }, + "java": { + "package": "software.amazon.awscdk.services.emr" + }, + "python": { + "module": "aws_cdk.aws_emr" + } + } + }, + "aws-cdk-lib.aws_emrcontainers": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMRContainers" + }, + "java": { + "package": "software.amazon.awscdk.services.emrcontainers" + }, + "python": { + "module": "aws_cdk.aws_emrcontainers" + } + } + }, + "aws-cdk-lib.aws_emrserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMRServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.emrserverless" + }, + "python": { + "module": "aws_cdk.aws_emrserverless" + } + } + }, + "aws-cdk-lib.aws_entityresolution": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.EntityResolution" + }, + "java": { + "package": "software.amazon.awscdk.services.entityresolution" + }, + "python": { + "module": "aws_cdk.aws_entityresolution" + } + } + }, + "aws-cdk-lib.aws_events": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Events" + }, + "java": { + "package": "software.amazon.awscdk.services.events" + }, + "python": { + "module": "aws_cdk.aws_events" + } + } + }, + "aws-cdk-lib.aws_events_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Events.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.events.targets" + }, + "python": { + "module": "aws_cdk.aws_events_targets" + } + } + }, + "aws-cdk-lib.aws_eventschemas": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EventSchemas" + }, + "java": { + "package": "software.amazon.awscdk.services.eventschemas" + }, + "python": { + "module": "aws_cdk.aws_eventschemas" + } + } + }, + "aws-cdk-lib.aws_evidently": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Evidently" + }, + "java": { + "package": "software.amazon.awscdk.services.evidently" + }, + "python": { + "module": "aws_cdk.aws_evidently" + } + } + }, + "aws-cdk-lib.aws_finspace": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FinSpace" + }, + "java": { + "package": "software.amazon.awscdk.services.finspace" + }, + "python": { + "module": "aws_cdk.aws_finspace" + } + } + }, + "aws-cdk-lib.aws_fis": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FIS" + }, + "java": { + "package": "software.amazon.awscdk.services.fis" + }, + "python": { + "module": "aws_cdk.aws_fis" + } + } + }, + "aws-cdk-lib.aws_fms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FMS" + }, + "java": { + "package": "software.amazon.awscdk.services.fms" + }, + "python": { + "module": "aws_cdk.aws_fms" + } + } + }, + "aws-cdk-lib.aws_forecast": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Forecast" + }, + "java": { + "package": "software.amazon.awscdk.services.forecast" + }, + "python": { + "module": "aws_cdk.aws_forecast" + } + } + }, + "aws-cdk-lib.aws_frauddetector": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FraudDetector" + }, + "java": { + "package": "software.amazon.awscdk.services.frauddetector" + }, + "python": { + "module": "aws_cdk.aws_frauddetector" + } + } + }, + "aws-cdk-lib.aws_fsx": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FSx" + }, + "java": { + "package": "software.amazon.awscdk.services.fsx" + }, + "python": { + "module": "aws_cdk.aws_fsx" + } + } + }, + "aws-cdk-lib.aws_gamelift": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GameLift" + }, + "java": { + "package": "software.amazon.awscdk.services.gamelift" + }, + "python": { + "module": "aws_cdk.aws_gamelift" + } + } + }, + "aws-cdk-lib.aws_globalaccelerator": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GlobalAccelerator" + }, + "java": { + "package": "software.amazon.awscdk.services.globalaccelerator" + }, + "python": { + "module": "aws_cdk.aws_globalaccelerator" + } + } + }, + "aws-cdk-lib.aws_globalaccelerator_endpoints": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GlobalAccelerator.Endpoints" + }, + "java": { + "package": "software.amazon.awscdk.services.globalaccelerator.endpoints" + }, + "python": { + "module": "aws_cdk.aws_globalaccelerator_endpoints" + } + } + }, + "aws-cdk-lib.aws_glue": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Glue" + }, + "java": { + "package": "software.amazon.awscdk.services.glue" + }, + "python": { + "module": "aws_cdk.aws_glue" + } + } + }, + "aws-cdk-lib.aws_grafana": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Grafana" + }, + "java": { + "package": "software.amazon.awscdk.services.grafana" + }, + "python": { + "module": "aws_cdk.aws_grafana" + } + } + }, + "aws-cdk-lib.aws_greengrass": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Greengrass" + }, + "java": { + "package": "software.amazon.awscdk.services.greengrass" + }, + "python": { + "module": "aws_cdk.aws_greengrass" + } + } + }, + "aws-cdk-lib.aws_greengrassv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GreengrassV2" + }, + "java": { + "package": "software.amazon.awscdk.services.greengrassv2" + }, + "python": { + "module": "aws_cdk.aws_greengrassv2" + } + } + }, + "aws-cdk-lib.aws_groundstation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GroundStation" + }, + "java": { + "package": "software.amazon.awscdk.services.groundstation" + }, + "python": { + "module": "aws_cdk.aws_groundstation" + } + } + }, + "aws-cdk-lib.aws_guardduty": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GuardDuty" + }, + "java": { + "package": "software.amazon.awscdk.services.guardduty" + }, + "python": { + "module": "aws_cdk.aws_guardduty" + } + } + }, + "aws-cdk-lib.aws_healthimaging": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.HealthImaging" + }, + "java": { + "package": "software.amazon.awscdk.services.healthimaging" + }, + "python": { + "module": "aws_cdk.aws_healthimaging" + } + } + }, + "aws-cdk-lib.aws_healthlake": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.HealthLake" + }, + "java": { + "package": "software.amazon.awscdk.services.healthlake" + }, + "python": { + "module": "aws_cdk.aws_healthlake" + } + } + }, + "aws-cdk-lib.aws_iam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IAM" + }, + "java": { + "package": "software.amazon.awscdk.services.iam" + }, + "python": { + "module": "aws_cdk.aws_iam" + } + } + }, + "aws-cdk-lib.aws_identitystore": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IdentityStore" + }, + "java": { + "package": "software.amazon.awscdk.services.identitystore" + }, + "python": { + "module": "aws_cdk.aws_identitystore" + } + } + }, + "aws-cdk-lib.aws_imagebuilder": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ImageBuilder" + }, + "java": { + "package": "software.amazon.awscdk.services.imagebuilder" + }, + "python": { + "module": "aws_cdk.aws_imagebuilder" + } + } + }, + "aws-cdk-lib.aws_inspector": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Inspector" + }, + "java": { + "package": "software.amazon.awscdk.services.inspector" + }, + "python": { + "module": "aws_cdk.aws_inspector" + } + } + }, + "aws-cdk-lib.aws_inspectorv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.InspectorV2" + }, + "java": { + "package": "software.amazon.awscdk.services.inspectorv2" + }, + "python": { + "module": "aws_cdk.aws_inspectorv2" + } + } + }, + "aws-cdk-lib.aws_internetmonitor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.InternetMonitor" + }, + "java": { + "package": "software.amazon.awscdk.services.internetmonitor" + }, + "python": { + "module": "aws_cdk.aws_internetmonitor" + } + } + }, + "aws-cdk-lib.aws_iot": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoT" + }, + "java": { + "package": "software.amazon.awscdk.services.iot" + }, + "python": { + "module": "aws_cdk.aws_iot" + } + } + }, + "aws-cdk-lib.aws_iot1click": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoT1Click" + }, + "java": { + "package": "software.amazon.awscdk.services.iot1click" + }, + "python": { + "module": "aws_cdk.aws_iot1click" + } + } + }, + "aws-cdk-lib.aws_iotanalytics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTAnalytics" + }, + "java": { + "package": "software.amazon.awscdk.services.iotanalytics" + }, + "python": { + "module": "aws_cdk.aws_iotanalytics" + } + } + }, + "aws-cdk-lib.aws_iotcoredeviceadvisor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTCoreDeviceAdvisor" + }, + "java": { + "package": "software.amazon.awscdk.services.iotcoredeviceadvisor" + }, + "python": { + "module": "aws_cdk.aws_iotcoredeviceadvisor" + } + } + }, + "aws-cdk-lib.aws_iotevents": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTEvents" + }, + "java": { + "package": "software.amazon.awscdk.services.iotevents" + }, + "python": { + "module": "aws_cdk.aws_iotevents" + } + } + }, + "aws-cdk-lib.aws_iotfleethub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTFleetHub" + }, + "java": { + "package": "software.amazon.awscdk.services.iotfleethub" + }, + "python": { + "module": "aws_cdk.aws_iotfleethub" + } + } + }, + "aws-cdk-lib.aws_iotfleetwise": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTFleetWise" + }, + "java": { + "package": "software.amazon.awscdk.services.iotfleetwise" + }, + "python": { + "module": "aws_cdk.aws_iotfleetwise" + } + } + }, + "aws-cdk-lib.aws_iotsitewise": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTSiteWise" + }, + "java": { + "package": "software.amazon.awscdk.services.iotsitewise" + }, + "python": { + "module": "aws_cdk.aws_iotsitewise" + } + } + }, + "aws-cdk-lib.aws_iotthingsgraph": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTThingsGraph" + }, + "java": { + "package": "software.amazon.awscdk.services.iotthingsgraph" + }, + "python": { + "module": "aws_cdk.aws_iotthingsgraph" + } + } + }, + "aws-cdk-lib.aws_iottwinmaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTTwinMaker" + }, + "java": { + "package": "software.amazon.awscdk.services.iottwinmaker" + }, + "python": { + "module": "aws_cdk.aws_iottwinmaker" + } + } + }, + "aws-cdk-lib.aws_iotwireless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTWireless" + }, + "java": { + "package": "software.amazon.awscdk.services.iotwireless" + }, + "python": { + "module": "aws_cdk.aws_iotwireless" + } + } + }, + "aws-cdk-lib.aws_ivs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Ivs" + }, + "java": { + "package": "software.amazon.awscdk.services.ivs" + }, + "python": { + "module": "aws_cdk.aws_ivs" + } + } + }, + "aws-cdk-lib.aws_ivschat": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IVSChat" + }, + "java": { + "package": "software.amazon.awscdk.services.ivschat" + }, + "python": { + "module": "aws_cdk.aws_ivschat" + } + } + }, + "aws-cdk-lib.aws_kafkaconnect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KafkaConnect" + }, + "java": { + "package": "software.amazon.awscdk.services.kafkaconnect" + }, + "python": { + "module": "aws_cdk.aws_kafkaconnect" + } + } + }, + "aws-cdk-lib.aws_kendra": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Kendra" + }, + "java": { + "package": "software.amazon.awscdk.services.kendra" + }, + "python": { + "module": "aws_cdk.aws_kendra" + } + } + }, + "aws-cdk-lib.aws_kendraranking": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KendraRanking" + }, + "java": { + "package": "software.amazon.awscdk.services.kendraranking" + }, + "python": { + "module": "aws_cdk.aws_kendraranking" + } + } + }, + "aws-cdk-lib.aws_kinesis": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Kinesis" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesis" + }, + "python": { + "module": "aws_cdk.aws_kinesis" + } + } + }, + "aws-cdk-lib.aws_kinesisanalytics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisAnalytics" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisanalytics" + }, + "python": { + "module": "aws_cdk.aws_kinesisanalytics" + } + } + }, + "aws-cdk-lib.aws_kinesisanalyticsv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisAnalyticsV2" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisanalyticsv2" + }, + "python": { + "module": "aws_cdk.aws_kinesisanalyticsv2" + } + } + }, + "aws-cdk-lib.aws_kinesisfirehose": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisFirehose" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisfirehose" + }, + "python": { + "module": "aws_cdk.aws_kinesisfirehose" + } + } + }, + "aws-cdk-lib.aws_kinesisvideo": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisVideo" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisvideo" + }, + "python": { + "module": "aws_cdk.aws_kinesisvideo" + } + } + }, + "aws-cdk-lib.aws_kms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KMS" + }, + "java": { + "package": "software.amazon.awscdk.services.kms" + }, + "python": { + "module": "aws_cdk.aws_kms" + } + } + }, + "aws-cdk-lib.aws_lakeformation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LakeFormation" + }, + "java": { + "package": "software.amazon.awscdk.services.lakeformation" + }, + "python": { + "module": "aws_cdk.aws_lakeformation" + } + } + }, + "aws-cdk-lib.aws_lambda": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda" + }, + "python": { + "module": "aws_cdk.aws_lambda" + } + } + }, + "aws-cdk-lib.aws_lambda_destinations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.Destinations" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.destinations" + }, + "python": { + "module": "aws_cdk.aws_lambda_destinations" + } + } + }, + "aws-cdk-lib.aws_lambda_event_sources": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.EventSources" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.eventsources" + }, + "python": { + "module": "aws_cdk.aws_lambda_event_sources" + } + } + }, + "aws-cdk-lib.aws_lambda_nodejs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.Nodejs" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.nodejs" + }, + "python": { + "module": "aws_cdk.aws_lambda_nodejs" + } + } + }, + "aws-cdk-lib.aws_lex": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lex" + }, + "java": { + "package": "software.amazon.awscdk.services.lex" + }, + "python": { + "module": "aws_cdk.aws_lex" + } + } + }, + "aws-cdk-lib.aws_licensemanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LicenseManager" + }, + "java": { + "package": "software.amazon.awscdk.services.licensemanager" + }, + "python": { + "module": "aws_cdk.aws_licensemanager" + } + } + }, + "aws-cdk-lib.aws_lightsail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lightsail" + }, + "java": { + "package": "software.amazon.awscdk.services.lightsail" + }, + "python": { + "module": "aws_cdk.aws_lightsail" + } + } + }, + "aws-cdk-lib.aws_location": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Location" + }, + "java": { + "package": "software.amazon.awscdk.services.location" + }, + "python": { + "module": "aws_cdk.aws_location" + } + } + }, + "aws-cdk-lib.aws_logs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Logs" + }, + "java": { + "package": "software.amazon.awscdk.services.logs" + }, + "python": { + "module": "aws_cdk.aws_logs" + } + } + }, + "aws-cdk-lib.aws_logs_destinations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Logs.Destinations" + }, + "java": { + "package": "software.amazon.awscdk.services.logs.destinations" + }, + "python": { + "module": "aws_cdk.aws_logs_destinations" + } + } + }, + "aws-cdk-lib.aws_lookoutequipment": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutEquipment" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutequipment" + }, + "python": { + "module": "aws_cdk.aws_lookoutequipment" + } + } + }, + "aws-cdk-lib.aws_lookoutmetrics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutMetrics" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutmetrics" + }, + "python": { + "module": "aws_cdk.aws_lookoutmetrics" + } + } + }, + "aws-cdk-lib.aws_lookoutvision": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutVision" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutvision" + }, + "python": { + "module": "aws_cdk.aws_lookoutvision" + } + } + }, + "aws-cdk-lib.aws_m2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.M2" + }, + "java": { + "package": "software.amazon.awscdk.services.m2" + }, + "python": { + "module": "aws_cdk.aws_m2" + } + } + }, + "aws-cdk-lib.aws_macie": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Macie" + }, + "java": { + "package": "software.amazon.awscdk.services.macie" + }, + "python": { + "module": "aws_cdk.aws_macie" + } + } + }, + "aws-cdk-lib.aws_managedblockchain": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ManagedBlockchain" + }, + "java": { + "package": "software.amazon.awscdk.services.managedblockchain" + }, + "python": { + "module": "aws_cdk.aws_managedblockchain" + } + } + }, + "aws-cdk-lib.aws_mediaconnect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaConnect" + }, + "java": { + "package": "software.amazon.awscdk.services.mediaconnect" + }, + "python": { + "module": "aws_cdk.aws_mediaconnect" + } + } + }, + "aws-cdk-lib.aws_mediaconvert": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaConvert" + }, + "java": { + "package": "software.amazon.awscdk.services.mediaconvert" + }, + "python": { + "module": "aws_cdk.aws_mediaconvert" + } + } + }, + "aws-cdk-lib.aws_medialive": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaLive" + }, + "java": { + "package": "software.amazon.awscdk.services.medialive" + }, + "python": { + "module": "aws_cdk.aws_medialive" + } + } + }, + "aws-cdk-lib.aws_mediapackage": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaPackage" + }, + "java": { + "package": "software.amazon.awscdk.services.mediapackage" + }, + "python": { + "module": "aws_cdk.aws_mediapackage" + } + } + }, + "aws-cdk-lib.aws_mediapackagev2": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.MediaPackageV2" + }, + "java": { + "package": "software.amazon.awscdk.services.mediapackagev2" + }, + "python": { + "module": "aws_cdk.aws_mediapackagev2" + } + } + }, + "aws-cdk-lib.aws_mediastore": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaStore" + }, + "java": { + "package": "software.amazon.awscdk.services.mediastore" + }, + "python": { + "module": "aws_cdk.aws_mediastore" + } + } + }, + "aws-cdk-lib.aws_mediatailor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaTailor" + }, + "java": { + "package": "software.amazon.awscdk.services.mediatailor" + }, + "python": { + "module": "aws_cdk.aws_mediatailor" + } + } + }, + "aws-cdk-lib.aws_memorydb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MemoryDB" + }, + "java": { + "package": "software.amazon.awscdk.services.memorydb" + }, + "python": { + "module": "aws_cdk.aws_memorydb" + } + } + }, + "aws-cdk-lib.aws_msk": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MSK" + }, + "java": { + "package": "software.amazon.awscdk.services.msk" + }, + "python": { + "module": "aws_cdk.aws_msk" + } + } + }, + "aws-cdk-lib.aws_mwaa": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MWAA" + }, + "java": { + "package": "software.amazon.awscdk.services.mwaa" + }, + "python": { + "module": "aws_cdk.aws_mwaa" + } + } + }, + "aws-cdk-lib.aws_neptune": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Neptune" + }, + "java": { + "package": "software.amazon.awscdk.services.neptune" + }, + "python": { + "module": "aws_cdk.aws_neptune" + } + } + }, + "aws-cdk-lib.aws_neptunegraph": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.NeptuneGraph" + }, + "java": { + "package": "software.amazon.awscdk.services.neptunegraph" + }, + "python": { + "module": "aws_cdk.aws_neptunegraph" + } + } + }, + "aws-cdk-lib.aws_networkfirewall": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NetworkFirewall" + }, + "java": { + "package": "software.amazon.awscdk.services.networkfirewall" + }, + "python": { + "module": "aws_cdk.aws_networkfirewall" + } + } + }, + "aws-cdk-lib.aws_networkmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NetworkManager" + }, + "java": { + "package": "software.amazon.awscdk.services.networkmanager" + }, + "python": { + "module": "aws_cdk.aws_networkmanager" + } + } + }, + "aws-cdk-lib.aws_nimblestudio": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NimbleStudio" + }, + "java": { + "package": "software.amazon.awscdk.services.nimblestudio" + }, + "python": { + "module": "aws_cdk.aws_nimblestudio" + } + } + }, + "aws-cdk-lib.aws_oam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Oam" + }, + "java": { + "package": "software.amazon.awscdk.services.oam" + }, + "python": { + "module": "aws_cdk.aws_oam" + } + } + }, + "aws-cdk-lib.aws_omics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Omics" + }, + "java": { + "package": "software.amazon.awscdk.services.omics" + }, + "python": { + "module": "aws_cdk.aws_omics" + } + } + }, + "aws-cdk-lib.aws_opensearchserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpenSearchServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.opensearchserverless" + }, + "python": { + "module": "aws_cdk.aws_opensearchserverless" + } + } + }, + "aws-cdk-lib.aws_opensearchservice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpenSearchService" + }, + "java": { + "package": "software.amazon.awscdk.services.opensearchservice" + }, + "python": { + "module": "aws_cdk.aws_opensearchservice" + } + } + }, + "aws-cdk-lib.aws_opsworks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpsWorks" + }, + "java": { + "package": "software.amazon.awscdk.services.opsworks" + }, + "python": { + "module": "aws_cdk.aws_opsworks" + } + } + }, + "aws-cdk-lib.aws_opsworkscm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpsWorksCM" + }, + "java": { + "package": "software.amazon.awscdk.services.opsworkscm" + }, + "python": { + "module": "aws_cdk.aws_opsworkscm" + } + } + }, + "aws-cdk-lib.aws_organizations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Organizations" + }, + "java": { + "package": "software.amazon.awscdk.services.organizations" + }, + "python": { + "module": "aws_cdk.aws_organizations" + } + } + }, + "aws-cdk-lib.aws_osis": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.OSIS" + }, + "java": { + "package": "software.amazon.awscdk.services.osis" + }, + "python": { + "module": "aws_cdk.aws_osis" + } + } + }, + "aws-cdk-lib.aws_panorama": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Panorama" + }, + "java": { + "package": "software.amazon.awscdk.services.panorama" + }, + "python": { + "module": "aws_cdk.aws_panorama" + } + } + }, + "aws-cdk-lib.aws_paymentcryptography": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.PaymentCryptography" + }, + "java": { + "package": "software.amazon.awscdk.services.paymentcryptography" + }, + "python": { + "module": "aws_cdk.aws_paymentcryptography" + } + } + }, + "aws-cdk-lib.aws_pcaconnectorad": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.PCAConnectorAD" + }, + "java": { + "package": "software.amazon.awscdk.services.pcaconnectorad" + }, + "python": { + "module": "aws_cdk.aws_pcaconnectorad" + } + } + }, + "aws-cdk-lib.aws_personalize": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Personalize" + }, + "java": { + "package": "software.amazon.awscdk.services.personalize" + }, + "python": { + "module": "aws_cdk.aws_personalize" + } + } + }, + "aws-cdk-lib.aws_pinpoint": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Pinpoint" + }, + "java": { + "package": "software.amazon.awscdk.services.pinpoint" + }, + "python": { + "module": "aws_cdk.aws_pinpoint" + } + } + }, + "aws-cdk-lib.aws_pinpointemail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.PinpointEmail" + }, + "java": { + "package": "software.amazon.awscdk.services.pinpointemail" + }, + "python": { + "module": "aws_cdk.aws_pinpointemail" + } + } + }, + "aws-cdk-lib.aws_pipes": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Pipes" + }, + "java": { + "package": "software.amazon.awscdk.services.pipes" + }, + "python": { + "module": "aws_cdk.aws_pipes" + } + } + }, + "aws-cdk-lib.aws_proton": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Proton" + }, + "java": { + "package": "software.amazon.awscdk.services.proton" + }, + "python": { + "module": "aws_cdk.aws_proton" + } + } + }, + "aws-cdk-lib.aws_qbusiness": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.QBusiness" + }, + "java": { + "package": "software.amazon.awscdk.services.qbusiness" + }, + "python": { + "module": "aws_cdk.aws_qbusiness" + } + } + }, + "aws-cdk-lib.aws_qldb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.QLDB" + }, + "java": { + "package": "software.amazon.awscdk.services.qldb" + }, + "python": { + "module": "aws_cdk.aws_qldb" + } + } + }, + "aws-cdk-lib.aws_quicksight": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.QuickSight" + }, + "java": { + "package": "software.amazon.awscdk.services.quicksight" + }, + "python": { + "module": "aws_cdk.aws_quicksight" + } + } + }, + "aws-cdk-lib.aws_ram": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RAM" + }, + "java": { + "package": "software.amazon.awscdk.services.ram" + }, + "python": { + "module": "aws_cdk.aws_ram" + } + } + }, + "aws-cdk-lib.aws_rds": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RDS" + }, + "java": { + "package": "software.amazon.awscdk.services.rds" + }, + "python": { + "module": "aws_cdk.aws_rds" + } + } + }, + "aws-cdk-lib.aws_redshift": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Redshift" + }, + "java": { + "package": "software.amazon.awscdk.services.redshift" + }, + "python": { + "module": "aws_cdk.aws_redshift" + } + } + }, + "aws-cdk-lib.aws_redshiftserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RedshiftServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.redshiftserverless" + }, + "python": { + "module": "aws_cdk.aws_redshiftserverless" + } + } + }, + "aws-cdk-lib.aws_refactorspaces": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RefactorSpaces" + }, + "java": { + "package": "software.amazon.awscdk.services.refactorspaces" + }, + "python": { + "module": "aws_cdk.aws_refactorspaces" + } + } + }, + "aws-cdk-lib.aws_rekognition": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Rekognition" + }, + "java": { + "package": "software.amazon.awscdk.services.rekognition" + }, + "python": { + "module": "aws_cdk.aws_rekognition" + } + } + }, + "aws-cdk-lib.aws_resiliencehub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResilienceHub" + }, + "java": { + "package": "software.amazon.awscdk.services.resiliencehub" + }, + "python": { + "module": "aws_cdk.aws_resiliencehub" + } + } + }, + "aws-cdk-lib.aws_resourceexplorer2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResourceExplorer2" + }, + "java": { + "package": "software.amazon.awscdk.services.resourceexplorer2" + }, + "python": { + "module": "aws_cdk.aws_resourceexplorer2" + } + } + }, + "aws-cdk-lib.aws_resourcegroups": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResourceGroups" + }, + "java": { + "package": "software.amazon.awscdk.services.resourcegroups" + }, + "python": { + "module": "aws_cdk.aws_resourcegroups" + } + } + }, + "aws-cdk-lib.aws_robomaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RoboMaker" + }, + "java": { + "package": "software.amazon.awscdk.services.robomaker" + }, + "python": { + "module": "aws_cdk.aws_robomaker" + } + } + }, + "aws-cdk-lib.aws_rolesanywhere": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RolesAnywhere" + }, + "java": { + "package": "software.amazon.awscdk.services.rolesanywhere" + }, + "python": { + "module": "aws_cdk.aws_rolesanywhere" + } + } + }, + "aws-cdk-lib.aws_route53": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53" + }, + "java": { + "package": "software.amazon.awscdk.services.route53" + }, + "python": { + "module": "aws_cdk.aws_route53" + } + } + }, + "aws-cdk-lib.aws_route53_patterns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53.Patterns" + }, + "java": { + "package": "software.amazon.awscdk.services.route53.patterns" + }, + "python": { + "module": "aws_cdk.aws_route53_patterns" + } + } + }, + "aws-cdk-lib.aws_route53_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.route53.targets" + }, + "python": { + "module": "aws_cdk.aws_route53_targets" + } + } + }, + "aws-cdk-lib.aws_route53profiles": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Route53Profiles" + }, + "java": { + "package": "software.amazon.awscdk.services.route53profiles" + }, + "python": { + "module": "aws_cdk.aws_route53profiles" + } + } + }, + "aws-cdk-lib.aws_route53recoverycontrol": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53RecoveryControl" + }, + "java": { + "package": "software.amazon.awscdk.services.route53recoverycontrol" + }, + "python": { + "module": "aws_cdk.aws_route53recoverycontrol" + } + } + }, + "aws-cdk-lib.aws_route53recoveryreadiness": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53RecoveryReadiness" + }, + "java": { + "package": "software.amazon.awscdk.services.route53recoveryreadiness" + }, + "python": { + "module": "aws_cdk.aws_route53recoveryreadiness" + } + } + }, + "aws-cdk-lib.aws_route53resolver": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53Resolver" + }, + "java": { + "package": "software.amazon.awscdk.services.route53resolver" + }, + "python": { + "module": "aws_cdk.aws_route53resolver" + } + } + }, + "aws-cdk-lib.aws_rum": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RUM" + }, + "java": { + "package": "software.amazon.awscdk.services.rum" + }, + "python": { + "module": "aws_cdk.aws_rum" + } + } + }, + "aws-cdk-lib.aws_s3": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3" + }, + "java": { + "package": "software.amazon.awscdk.services.s3" + }, + "python": { + "module": "aws_cdk.aws_s3" + } + } + }, + "aws-cdk-lib.aws_s3_assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Assets" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.assets" + }, + "python": { + "module": "aws_cdk.aws_s3_assets" + } + } + }, + "aws-cdk-lib.aws_s3_deployment": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Deployment" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.deployment" + }, + "python": { + "module": "aws_cdk.aws_s3_deployment" + } + } + }, + "aws-cdk-lib.aws_s3_notifications": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Notifications" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.notifications" + }, + "python": { + "module": "aws_cdk.aws_s3_notifications" + } + } + }, + "aws-cdk-lib.aws_s3express": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.S3Express" + }, + "java": { + "package": "software.amazon.awscdk.services.s3express" + }, + "python": { + "module": "aws_cdk.aws_s3express" + } + } + }, + "aws-cdk-lib.aws_s3objectlambda": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3ObjectLambda" + }, + "java": { + "package": "software.amazon.awscdk.services.s3objectlambda" + }, + "python": { + "module": "aws_cdk.aws_s3objectlambda" + } + } + }, + "aws-cdk-lib.aws_s3outposts": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3Outposts" + }, + "java": { + "package": "software.amazon.awscdk.services.s3outposts" + }, + "python": { + "module": "aws_cdk.aws_s3outposts" + } + } + }, + "aws-cdk-lib.aws_sagemaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Sagemaker" + }, + "java": { + "package": "software.amazon.awscdk.services.sagemaker" + }, + "python": { + "module": "aws_cdk.aws_sagemaker" + } + } + }, + "aws-cdk-lib.aws_sam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SAM" + }, + "java": { + "package": "software.amazon.awscdk.services.sam" + }, + "python": { + "module": "aws_cdk.aws_sam" + } + } + }, + "aws-cdk-lib.aws_scheduler": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Scheduler" + }, + "java": { + "package": "software.amazon.awscdk.services.scheduler" + }, + "python": { + "module": "aws_cdk.aws_scheduler" + } + } + }, + "aws-cdk-lib.aws_sdb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SDB" + }, + "java": { + "package": "software.amazon.awscdk.services.sdb" + }, + "python": { + "module": "aws_cdk.aws_sdb" + } + } + }, + "aws-cdk-lib.aws_secretsmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SecretsManager" + }, + "java": { + "package": "software.amazon.awscdk.services.secretsmanager" + }, + "python": { + "module": "aws_cdk.aws_secretsmanager" + } + } + }, + "aws-cdk-lib.aws_securityhub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SecurityHub" + }, + "java": { + "package": "software.amazon.awscdk.services.securityhub" + }, + "python": { + "module": "aws_cdk.aws_securityhub" + } + } + }, + "aws-cdk-lib.aws_securitylake": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.SecurityLake" + }, + "java": { + "package": "software.amazon.awscdk.services.securitylake" + }, + "python": { + "module": "aws_cdk.aws_securitylake" + } + } + }, + "aws-cdk-lib.aws_servicecatalog": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Servicecatalog" + }, + "java": { + "package": "software.amazon.awscdk.services.servicecatalog" + }, + "python": { + "module": "aws_cdk.aws_servicecatalog" + } + } + }, + "aws-cdk-lib.aws_servicecatalogappregistry": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Servicecatalogappregistry" + }, + "java": { + "package": "software.amazon.awscdk.services.servicecatalogappregistry" + }, + "python": { + "module": "aws_cdk.aws_servicecatalogappregistry" + } + } + }, + "aws-cdk-lib.aws_servicediscovery": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ServiceDiscovery" + }, + "java": { + "package": "software.amazon.awscdk.services.servicediscovery" + }, + "python": { + "module": "aws_cdk.aws_servicediscovery" + } + } + }, + "aws-cdk-lib.aws_ses": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SES" + }, + "java": { + "package": "software.amazon.awscdk.services.ses" + }, + "python": { + "module": "aws_cdk.aws_ses" + } + } + }, + "aws-cdk-lib.aws_ses_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SES.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.ses.actions" + }, + "python": { + "module": "aws_cdk.aws_ses_actions" + } + } + }, + "aws-cdk-lib.aws_shield": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Shield" + }, + "java": { + "package": "software.amazon.awscdk.services.shield" + }, + "python": { + "module": "aws_cdk.aws_shield" + } + } + }, + "aws-cdk-lib.aws_signer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Signer" + }, + "java": { + "package": "software.amazon.awscdk.services.signer" + }, + "python": { + "module": "aws_cdk.aws_signer" + } + } + }, + "aws-cdk-lib.aws_simspaceweaver": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SimSpaceWeaver" + }, + "java": { + "package": "software.amazon.awscdk.services.simspaceweaver" + }, + "python": { + "module": "aws_cdk.aws_simspaceweaver" + } + } + }, + "aws-cdk-lib.aws_sns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SNS" + }, + "java": { + "package": "software.amazon.awscdk.services.sns" + }, + "python": { + "module": "aws_cdk.aws_sns" + } + } + }, + "aws-cdk-lib.aws_sns_subscriptions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SNS.Subscriptions" + }, + "java": { + "package": "software.amazon.awscdk.services.sns.subscriptions" + }, + "python": { + "module": "aws_cdk.aws_sns_subscriptions" + } + } + }, + "aws-cdk-lib.aws_sqs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SQS" + }, + "java": { + "package": "software.amazon.awscdk.services.sqs" + }, + "python": { + "module": "aws_cdk.aws_sqs" + } + } + }, + "aws-cdk-lib.aws_ssm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSM" + }, + "java": { + "package": "software.amazon.awscdk.services.ssm" + }, + "python": { + "module": "aws_cdk.aws_ssm" + } + } + }, + "aws-cdk-lib.aws_ssmcontacts": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSMContacts" + }, + "java": { + "package": "software.amazon.awscdk.services.ssmcontacts" + }, + "python": { + "module": "aws_cdk.aws_ssmcontacts" + } + } + }, + "aws-cdk-lib.aws_ssmincidents": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSMIncidents" + }, + "java": { + "package": "software.amazon.awscdk.services.ssmincidents" + }, + "python": { + "module": "aws_cdk.aws_ssmincidents" + } + } + }, + "aws-cdk-lib.aws_sso": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSO" + }, + "java": { + "package": "software.amazon.awscdk.services.sso" + }, + "python": { + "module": "aws_cdk.aws_sso" + } + } + }, + "aws-cdk-lib.aws_stepfunctions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.StepFunctions" + }, + "java": { + "package": "software.amazon.awscdk.services.stepfunctions" + }, + "python": { + "module": "aws_cdk.aws_stepfunctions" + } + } + }, + "aws-cdk-lib.aws_stepfunctions_tasks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.StepFunctions.Tasks" + }, + "java": { + "package": "software.amazon.awscdk.services.stepfunctions.tasks" + }, + "python": { + "module": "aws_cdk.aws_stepfunctions_tasks" + } + } + }, + "aws-cdk-lib.aws_supportapp": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SupportApp" + }, + "java": { + "package": "software.amazon.awscdk.services.supportapp" + }, + "python": { + "module": "aws_cdk.aws_supportapp" + } + } + }, + "aws-cdk-lib.aws_synthetics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Synthetics" + }, + "java": { + "package": "software.amazon.awscdk.services.synthetics" + }, + "python": { + "module": "aws_cdk.aws_synthetics" + } + } + }, + "aws-cdk-lib.aws_systemsmanagersap": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SystemsManagerSAP" + }, + "java": { + "package": "software.amazon.awscdk.services.systemsmanagersap" + }, + "python": { + "module": "aws_cdk.aws_systemsmanagersap" + } + } + }, + "aws-cdk-lib.aws_timestream": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Timestream" + }, + "java": { + "package": "software.amazon.awscdk.services.timestream" + }, + "python": { + "module": "aws_cdk.aws_timestream" + } + } + }, + "aws-cdk-lib.aws_transfer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Transfer" + }, + "java": { + "package": "software.amazon.awscdk.services.transfer" + }, + "python": { + "module": "aws_cdk.aws_transfer" + } + } + }, + "aws-cdk-lib.aws_verifiedpermissions": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.VerifiedPermissions" + }, + "java": { + "package": "software.amazon.awscdk.services.verifiedpermissions" + }, + "python": { + "module": "aws_cdk.aws_verifiedpermissions" + } + } + }, + "aws-cdk-lib.aws_voiceid": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.VoiceID" + }, + "java": { + "package": "software.amazon.awscdk.services.voiceid" + }, + "python": { + "module": "aws_cdk.aws_voiceid" + } + } + }, + "aws-cdk-lib.aws_vpclattice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.VpcLattice" + }, + "java": { + "package": "software.amazon.awscdk.services.vpclattice" + }, + "python": { + "module": "aws_cdk.aws_vpclattice" + } + } + }, + "aws-cdk-lib.aws_waf": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAF" + }, + "java": { + "package": "software.amazon.awscdk.services.waf" + }, + "python": { + "module": "aws_cdk.aws_waf" + } + } + }, + "aws-cdk-lib.aws_wafregional": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAFRegional" + }, + "java": { + "package": "software.amazon.awscdk.services.waf.regional" + }, + "python": { + "module": "aws_cdk.aws_wafregional" + } + } + }, + "aws-cdk-lib.aws_wafv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAFv2" + }, + "java": { + "package": "software.amazon.awscdk.services.wafv2" + }, + "python": { + "module": "aws_cdk.aws_wafv2" + } + } + }, + "aws-cdk-lib.aws_wisdom": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Wisdom" + }, + "java": { + "package": "software.amazon.awscdk.services.wisdom" + }, + "python": { + "module": "aws_cdk.aws_wisdom" + } + } + }, + "aws-cdk-lib.aws_workspaces": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WorkSpaces" + }, + "java": { + "package": "software.amazon.awscdk.services.workspaces" + }, + "python": { + "module": "aws_cdk.aws_workspaces" + } + } + }, + "aws-cdk-lib.aws_workspacesthinclient": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.WorkSpacesThinClient" + }, + "java": { + "package": "software.amazon.awscdk.services.workspacesthinclient" + }, + "python": { + "module": "aws_cdk.aws_workspacesthinclient" + } + } + }, + "aws-cdk-lib.aws_workspacesweb": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.WorkSpacesWeb" + }, + "java": { + "package": "software.amazon.awscdk.services.workspacesweb" + }, + "python": { + "module": "aws_cdk.aws_workspacesweb" + } + } + }, + "aws-cdk-lib.aws_xray": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.XRay" + }, + "java": { + "package": "software.amazon.awscdk.services.xray" + }, + "python": { + "module": "aws_cdk.aws_xray" + } + } + }, + "aws-cdk-lib.cloud_assembly_schema": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CloudAssembly.Schema" + }, + "java": { + "package": "software.amazon.awscdk.cloudassembly.schema" + }, + "python": { + "module": "aws_cdk.cloud_assembly_schema" + } + } + }, + "aws-cdk-lib.cloudformation_include": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CloudFormation.Include" + }, + "java": { + "package": "software.amazon.awscdk.cloudformation.include" + }, + "python": { + "module": "aws_cdk.cloudformation_include" + } + } + }, + "aws-cdk-lib.custom_resources": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CustomResources" + }, + "java": { + "package": "software.amazon.awscdk.customresources" + }, + "python": { + "module": "aws_cdk.custom_resources" + } + } + }, + "aws-cdk-lib.cx_api": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CXAPI" + }, + "java": { + "package": "software.amazon.awscdk.cxapi" + }, + "python": { + "module": "aws_cdk.cx_api" + } + } + }, + "aws-cdk-lib.lambda_layer_awscli": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.AwsCli" + }, + "java": { + "package": "software.amazon.awscdk.lambdalayer.awscli" + }, + "python": { + "module": "aws_cdk.lambda_layer_awscli" + } + } + }, + "aws-cdk-lib.lambda_layer_kubectl": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.Kubectl" + }, + "java": { + "package": "software.amazon.awscdk.lambdalayer.kubectl" + }, + "python": { + "module": "aws_cdk.lambda_layer_kubectl" + } + } + }, + "aws-cdk-lib.lambda_layer_node_proxy_agent": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.NodeProxyAgent" + }, + "java": { + "package": "software.amazon.awscdk.lambda.layer.node.proxy.agent" + }, + "python": { + "module": "aws_cdk.lambda_layer_node_proxy_agent" + } + } + }, + "aws-cdk-lib.pipelines": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Pipelines" + }, + "java": { + "package": "software.amazon.awscdk.pipelines" + }, + "python": { + "module": "aws_cdk.pipelines" + } + } + }, + "aws-cdk-lib.region_info": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.RegionInfo" + }, + "java": { + "package": "software.amazon.awscdk.regioninfo" + }, + "python": { + "module": "aws_cdk.region_info" + } + } + }, + "aws-cdk-lib.triggers": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Triggers" + }, + "java": { + "package": "software.amazon.awscdk.triggers" + }, + "python": { + "module": "aws_cdk.triggers" + } + } + } + }, + "targets": { + "dotnet": { + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", + "namespace": "Amazon.CDK", + "packageId": "Amazon.CDK.Lib" + }, + "go": { + "moduleName": "github.com/aws/aws-cdk-go", + "packageName": "awscdk" + }, + "java": { + "maven": { + "artifactId": "aws-cdk-lib", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk" + }, + "js": { + "npm": "aws-cdk-lib" + }, + "python": { + "distName": "aws-cdk-lib", + "module": "aws_cdk" + } + } + }, + "constructs": { + "targets": { + "dotnet": { + "namespace": "Constructs", + "packageId": "Constructs" + }, + "go": { + "moduleName": "github.com/aws/constructs-go" + }, + "java": { + "maven": { + "artifactId": "constructs", + "groupId": "software.constructs" + }, + "package": "software.constructs" + }, + "js": { + "npm": "constructs" + }, + "python": { + "distName": "constructs", + "module": "constructs" + } + } + } + }, + "description": "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-appconfig", + "docs": { + "stability": "deprecated" + }, + "homepage": "https://github.com/aws/aws-cdk", + "jsiiVersion": "5.4.23 (build 4babcb9)", + "keywords": [ + "aws", + "cdk", + "constructs", + "appconfig" + ], + "license": "Apache-2.0", + "metadata": { + "jsii": { + "compiledWithDeprecationWarnings": true, + "pacmak": { + "hasDefaultInterfaces": true + }, + "rosetta": { + "strict": true + } + } + }, + "name": "@aws-cdk/aws-appconfig-alpha", + "readme": { + "markdown": "# AWS AppConfig Construct Library\n\n\n\n---\n\n![Deprecated](https://img.shields.io/badge/deprecated-critical.svg?style=for-the-badge)\n\n> This API may emit warnings. Backward compatibility is not guaranteed.\n\n---\n\n\n\nAll constructs moved to aws-cdk-lib/aws-appconfig.\n" + }, + "repository": { + "directory": "packages/@aws-cdk/aws-appconfig-alpha", + "type": "git", + "url": "https://github.com/aws/aws-cdk.git" + }, + "schema": "jsii/0.10.0", + "targets": { + "dotnet": { + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", + "namespace": "Amazon.CDK.AWS.AppConfig.Alpha", + "packageId": "Amazon.CDK.AWS.AppConfig.Alpha" + }, + "go": { + "moduleName": "github.com/aws/aws-cdk-go", + "packageName": "awscdkappconfigalpha" + }, + "java": { + "maven": { + "artifactId": "appconfig-alpha", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.services.appconfig.alpha" + }, + "js": { + "npm": "@aws-cdk/aws-appconfig-alpha" + }, + "python": { + "classifiers": [ + "Framework :: AWS CDK", + "Framework :: AWS CDK :: 2" + ], + "distName": "aws-cdk.aws-appconfig-alpha", + "module": "aws_cdk.aws_appconfig_alpha" + } + }, + "types": { + "@aws-cdk/aws-appconfig-alpha.Action": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines an action for an extension." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Action", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 225 + }, + "parameters": [ + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionProps" + } + } + ] + }, + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 194 + }, + "name": "Action", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The action points that will trigger the extension action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 198 + }, + "name": "actionPoints", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The event destination for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 203 + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 218 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The execution role for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 213 + }, + "name": "executionRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The flag that specifies whether to create the execution role." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 223 + }, + "name": "invokeWithoutExecutionRole", + "optional": true, + "type": { + "primitive": "boolean" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 208 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/extension:Action" + }, + "@aws-cdk/aws-appconfig-alpha.ActionPoint": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about.html#working-with-appconfig-extensions-how-it-works-step-2", + "stability": "deprecated", + "summary": "Defines Extension action points." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint", + "kind": "enum", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 16 + }, + "members": [ + { + "docs": { + "stability": "deprecated" + }, + "name": "PRE_CREATE_HOSTED_CONFIGURATION_VERSION" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "PRE_START_DEPLOYMENT" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ON_DEPLOYMENT_START" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ON_DEPLOYMENT_STEP" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ON_DEPLOYMENT_BAKING" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ON_DEPLOYMENT_COMPLETE" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ON_DEPLOYMENT_ROLLED_BACK" + } + ], + "name": "ActionPoint", + "symbolId": "lib/extension:ActionPoint" + }, + "@aws-cdk/aws-appconfig-alpha.ActionProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Action construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionProps", + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 147 + }, + "name": "ActionProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The action points that will trigger the extension action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 151 + }, + "name": "actionPoints", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The event destination for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 156 + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "The description for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 177 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- A role is generated.", + "stability": "deprecated", + "summary": "The execution role for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 170 + }, + "name": "executionRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "abstract": true, + "docs": { + "default": "false", + "remarks": "If set to true, then the role will not be auto-generated under the assumption\nthere is already the corresponding resource-based policy attached to the event\ndestination. If false, the execution role will be generated if not provided.", + "stability": "deprecated", + "summary": "The flag that specifies whether or not to create the execution role." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 188 + }, + "name": "invokeWithoutExecutionRole", + "optional": true, + "type": { + "primitive": "boolean" + } + }, + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "The name for the action." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 163 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/extension:ActionProps" + }, + "@aws-cdk/aws-appconfig-alpha.Application": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "aws-cdk-lib.Resource", + "docs": { + "custom": { + "resource": "AWS::AppConfig::Application" + }, + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-application.html", + "stability": "deprecated", + "summary": "An AWS AppConfig application." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Application", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 415 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ApplicationProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IApplication", + "@aws-cdk/aws-appconfig-alpha.IExtensible" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/application.ts", + "line": 317 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Adds the AWS AppConfig Agent as a container to the provided ECS task definition." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 381 + }, + "name": "addAgentToEcs", + "parameters": [ + { + "docs": { + "summary": "The ECS task definition [disable-awslint:ref-via-interface]." + }, + "name": "taskDef", + "type": { + "fqn": "aws-cdk-lib.aws_ecs.TaskDefinition" + } + } + ], + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Imports an AWS AppConfig application into the CDK using its Amazon Resource Name (ARN)." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 325 + }, + "name": "fromApplicationArn", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the application construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The Amazon Resource Name (ARN) of the application." + }, + "name": "applicationArn", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Imports an AWS AppConfig application into the CDK using its ID." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 348 + }, + "name": "fromApplicationId", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the application construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The ID of the application." + }, + "name": "applicationId", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + "static": true + }, + { + "docs": { + "returns": "Lambda layer version ARN", + "stability": "deprecated", + "summary": "Retrieves the Lambda layer version Amazon Resource Name (ARN) for the AWS AppConfig Lambda extension." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 372 + }, + "name": "getLambdaLayerVersionArn", + "parameters": [ + { + "docs": { + "summary": "The region for the Lambda layer (for example, 'us-east-1')." + }, + "name": "region", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The platform for the Lambda layer (default is Platform.X86_64)." + }, + "name": "platform", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Platform" + } + } + ], + "returns": { + "type": { + "primitive": "string" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an environment." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 183 + }, + "name": "addEnvironment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an existing environment." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 204 + }, + "name": "addExistingEnvironment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "name": "environment", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 306 + }, + "name": "addExtension", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a hosted configuration." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 190 + }, + "name": "addHostedConfiguration", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfiguration" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a sourced configuration." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 197 + }, + "name": "addSourcedConfiguration", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfiguration" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 220 + }, + "name": "on", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 275 + }, + "name": "onDeploymentBaking", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 286 + }, + "name": "onDeploymentComplete", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 297 + }, + "name": "onDeploymentRolledBack", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 253 + }, + "name": "onDeploymentStart", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 264 + }, + "name": "onDeploymentStep", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 231 + }, + "name": "preCreateHostedConfigurationVersion", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 242 + }, + "name": "preStartDeployment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "Application", + "properties": [ + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 410 + }, + "name": "applicationArn", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 403 + }, + "name": "applicationId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "Returns the list of associated environments." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 208 + }, + "name": "environments", + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 391 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 396 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IApplication", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 413 + }, + "name": "extensible", + "protected": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensibleBase" + } + } + ], + "symbolId": "lib/application:Application" + }, + "@aws-cdk/aws-appconfig-alpha.ApplicationProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Application construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ApplicationProps", + "kind": "interface", + "locationInModule": { + "filename": "lib/application.ts", + "line": 161 + }, + "name": "ApplicationProps", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "The name of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 167 + }, + "name": "applicationName", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "The description for the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 174 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/application:ApplicationProps" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationContent": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 812 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content from a file." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 819 + }, + "name": "fromFile", + "parameters": [ + { + "docs": { + "summary": "The path to the file that defines configuration content." + }, + "name": "inputPath", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The content type of the configuration." + }, + "name": "contentType", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content from inline code." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 832 + }, + "name": "fromInline", + "parameters": [ + { + "docs": { + "summary": "The inline code that defines the configuration content." + }, + "name": "content", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The content type of the configuration." + }, + "name": "contentType", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content as JSON from inline code." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 845 + }, + "name": "fromInlineJson", + "parameters": [ + { + "docs": { + "summary": "The inline code that defines the configuration content." + }, + "name": "content", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The content type of the configuration." + }, + "name": "contentType", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content as text from inline code." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 857 + }, + "name": "fromInlineText", + "parameters": [ + { + "docs": { + "summary": "The inline code that defines the configuration content." + }, + "name": "content", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines the hosted configuration content as YAML from inline code." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 869 + }, + "name": "fromInlineYaml", + "parameters": [ + { + "docs": { + "summary": "The inline code that defines the configuration content." + }, + "name": "content", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + "static": true + } + ], + "name": "ConfigurationContent", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The configuration content." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 879 + }, + "name": "content", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The configuration content type." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 884 + }, + "name": "contentType", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:ConfigurationContent" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationOptions": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Options for the Configuration construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationOptions", + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 23 + }, + "name": "ConfigurationOptions", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The deployment key of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 75 + }, + "name": "deploymentKey", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + }, + { + "abstract": true, + "docs": { + "default": "- A deployment strategy with the rollout strategy set to\nRolloutStrategy.CANARY_10_PERCENT_20_MINUTES", + "stability": "deprecated", + "summary": "The deployment strategy for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 30 + }, + "name": "deploymentStrategy", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "remarks": "If this parameter is not specified, then there will be no\ndeployment.", + "stability": "deprecated", + "summary": "The list of environments to deploy the configuration to." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 68 + }, + "name": "deployTo", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "The description of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 51 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "The name of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 37 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "ConfigurationType.FREEFORM", + "stability": "deprecated", + "summary": "The type of configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 58 + }, + "name": "type", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationType" + } + }, + { + "abstract": true, + "docs": { + "default": "- No validators.", + "stability": "deprecated", + "summary": "The validators for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 44 + }, + "name": "validators", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IValidator" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/configuration:ConfigurationOptions" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Configuration construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationProps", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ConfigurationOptions" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 81 + }, + "name": "ConfigurationProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The application associated with the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 85 + }, + "name": "application", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + } + ], + "symbolId": "lib/configuration:ConfigurationProps" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationSource": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the integrated configuration sources." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 890 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Defines configuration content from an Amazon S3 bucket." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 898 + }, + "name": "fromBucket", + "parameters": [ + { + "docs": { + "summary": "The S3 bucket where the configuration is stored." + }, + "name": "bucket", + "type": { + "fqn": "aws-cdk-lib.aws_s3.IBucket" + } + }, + { + "docs": { + "summary": "The path to the configuration." + }, + "name": "objectKey", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The KMS Key that the bucket is encrypted with." + }, + "name": "key", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines configuration content from a Systems Manager (SSM) document." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 938 + }, + "name": "fromCfnDocument", + "parameters": [ + { + "docs": { + "summary": "The SSM document where the configuration is stored." + }, + "name": "document", + "type": { + "fqn": "aws-cdk-lib.aws_ssm.CfnDocument" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines configuration content from a Systems Manager (SSM) Parameter Store parameter." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 925 + }, + "name": "fromParameter", + "parameters": [ + { + "docs": { + "summary": "The parameter where the configuration is stored." + }, + "name": "parameter", + "type": { + "fqn": "aws-cdk-lib.aws_ssm.IParameter" + } + }, + { + "docs": { + "summary": "The KMS Key that the secure string is encrypted with." + }, + "name": "key", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + "static": true + }, + { + "docs": { + "returns": "", + "stability": "deprecated", + "summary": "Defines configuration content from AWS CodePipeline." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 951 + }, + "name": "fromPipeline", + "parameters": [ + { + "docs": { + "summary": "The pipeline where the configuration is stored." + }, + "name": "pipeline", + "type": { + "fqn": "aws-cdk-lib.aws_codepipeline.IPipeline" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines configuration content from an AWS Secrets Manager secret." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 911 + }, + "name": "fromSecret", + "parameters": [ + { + "docs": { + "summary": "The secret where the configuration is stored." + }, + "name": "secret", + "type": { + "fqn": "aws-cdk-lib.aws_secretsmanager.ISecret" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + "static": true + } + ], + "name": "ConfigurationSource", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The URI of the configuration source." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 961 + }, + "name": "locationUri", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of the configuration source." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 966 + }, + "name": "type", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The KMS Key that encrypts the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 971 + }, + "name": "key", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + } + ], + "symbolId": "lib/configuration:ConfigurationSource" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "The configuration source type." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType", + "kind": "enum", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 731 + }, + "members": [ + { + "docs": { + "stability": "deprecated" + }, + "name": "S3" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "SECRETS_MANAGER" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "SSM_PARAMETER" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "SSM_DOCUMENT" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "CODE_PIPELINE" + } + ], + "name": "ConfigurationSourceType", + "symbolId": "lib/configuration:ConfigurationSourceType" + }, + "@aws-cdk/aws-appconfig-alpha.ConfigurationType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "The configuration type." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationType", + "kind": "enum", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 696 + }, + "members": [ + { + "docs": { + "remarks": "Allows you to store your data in the AWS AppConfig\nhosted configuration store or another Systems Manager capability or AWS service that integrates\nwith AWS AppConfig.", + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-free-form-configurations-creating.html", + "stability": "deprecated", + "summary": "Freeform configuration profile." + }, + "name": "FREEFORM" + }, + { + "docs": { + "remarks": "This configuration stores its data\nin the AWS AppConfig hosted configuration store and the URI is simply hosted.", + "stability": "deprecated", + "summary": "Feature flag configuration profile." + }, + "name": "FEATURE_FLAGS" + } + ], + "name": "ConfigurationType", + "symbolId": "lib/configuration:ConfigurationType" + }, + "@aws-cdk/aws-appconfig-alpha.DeploymentStrategy": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "aws-cdk-lib.Resource", + "docs": { + "custom": { + "resource": "AWS::AppConfig::DeploymentStrategy" + }, + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html", + "stability": "deprecated", + "summary": "An AWS AppConfig deployment strategy." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategy", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 131 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 37 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Imports a deployment strategy into the CDK using its Amazon Resource Name (ARN)." + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 45 + }, + "name": "fromDeploymentStrategyArn", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the deployment strategy construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The Amazon Resource Name (ARN) of the deployment strategy." + }, + "name": "deploymentStrategyArn", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Imports a deployment strategy into the CDK using its ID." + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 69 + }, + "name": "fromDeploymentStrategyId", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the deployment strategy construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The ID of the deployment strategy." + }, + "name": "deploymentStrategyId", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + "static": true + } + ], + "name": "DeploymentStrategy", + "properties": [ + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 127 + }, + "name": "deploymentStrategyArn", + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The ID of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 120 + }, + "name": "deploymentStrategyId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The deployment duration in minutes of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 95 + }, + "name": "deploymentDurationInMinutes", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 105 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The final bake time in minutes of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 110 + }, + "name": "finalBakeTimeInMinutes", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The growth factor of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 100 + }, + "name": "growthFactor", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The growth type of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 115 + }, + "name": "growthType", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.GrowthType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 90 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/deployment-strategy:DeploymentStrategy" + }, + "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html", + "stability": "deprecated", + "summary": "Defines the deployment strategy ID's of AWS AppConfig deployment strategies." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 189 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Builds a deployment strategy ID from a string." + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 221 + }, + "name": "fromString", + "parameters": [ + { + "docs": { + "summary": "The deployment strategy ID." + }, + "name": "deploymentStrategyId", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + }, + "static": true + } + ], + "name": "DeploymentStrategyId", + "properties": [ + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to all targets immediately.", + "stability": "deprecated", + "summary": "**Quick**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 214 + }, + "name": "ALL_AT_ONCE", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes.\nAWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices\nfor configuration deployments.", + "stability": "deprecated", + "summary": "**AWS Recommended**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 195 + }, + "name": "CANARY_10_PERCENT_20_MINUTES", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment.\nAWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices\nfor configuration deployments.", + "stability": "deprecated", + "summary": "**AWS Recommended**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 209 + }, + "name": "LINEAR_20_PERCENT_EVERY_6_MINUTES", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to half of all targets every 30 seconds for a\none-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because\nit has a short duration and bake time.", + "stability": "deprecated", + "summary": "**Testing/Demonstration**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 202 + }, + "name": "LINEAR_50_PERCENT_EVERY_30_SECONDS", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The deployment strategy ID." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 230 + }, + "name": "id", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/deployment-strategy:DeploymentStrategyId" + }, + "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for DeploymentStrategy." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps", + "kind": "interface", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 8 + }, + "name": "DeploymentStrategyProps", + "properties": [ + { + "abstract": true, + "docs": { + "remarks": "You can use predefined deployment\nstrategies, such as RolloutStrategy.ALL_AT_ONCE, RolloutStrategy.LINEAR_50_PERCENT_EVERY_30_SECONDS,\nor RolloutStrategy.CANARY_10_PERCENT_20_MINUTES.", + "stability": "deprecated", + "summary": "The rollout strategy for the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 14 + }, + "name": "rolloutStrategy", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "A name for the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 21 + }, + "name": "deploymentStrategyName", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "A description of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 28 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/deployment-strategy:DeploymentStrategyProps" + }, + "@aws-cdk/aws-appconfig-alpha.Environment": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "aws-cdk-lib.Resource", + "docs": { + "custom": { + "resource": "AWS::AppConfig::Environment" + }, + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-environment.html", + "stability": "deprecated", + "summary": "An AWS AppConfig environment." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Environment", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 238 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "@aws-cdk/aws-appconfig-alpha.IExtensible" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 131 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Imports an environment into the CDK using its Amazon Resource Name (ARN)." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 139 + }, + "name": "fromEnvironmentArn", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the environment construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The Amazon Resource Name (ARN) of the environment." + }, + "name": "environmentArn", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Imports an environment into the CDK from its attributes." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 171 + }, + "name": "fromEnvironmentAttributes", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the environment construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The attributes of the environment." + }, + "name": "attrs", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 84 + }, + "name": "addExtension", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 52 + }, + "name": "on", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 72 + }, + "name": "onDeploymentBaking", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 76 + }, + "name": "onDeploymentComplete", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 80 + }, + "name": "onDeploymentRolledBack", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 64 + }, + "name": "onDeploymentStart", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 68 + }, + "name": "onDeploymentStep", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 56 + }, + "name": "preCreateHostedConfigurationVersion", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 60 + }, + "name": "preStartDeployment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "Environment", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The ID of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 234 + }, + "name": "applicationId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 229 + }, + "name": "environmentArn", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 222 + }, + "name": "environmentId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The application associated with the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 200 + }, + "name": "application", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 210 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The monitors for the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 215 + }, + "name": "monitors", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 205 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 50 + }, + "name": "extensible", + "protected": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensibleBase" + } + } + ], + "symbolId": "lib/environment:Environment" + }, + "@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Attributes of an existing AWS AppConfig environment to import it." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes", + "kind": "interface", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 13 + }, + "name": "EnvironmentAttributes", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The application associated with the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 17 + }, + "name": "application", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The ID of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 22 + }, + "name": "environmentId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The description of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 36 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The monitors for the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 43 + }, + "name": "monitors", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The name of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 29 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/environment:EnvironmentAttributes" + }, + "@aws-cdk/aws-appconfig-alpha.EnvironmentOptions": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Options for the Environment construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentOptions", + "kind": "interface", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 92 + }, + "name": "EnvironmentOptions", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "The description of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 105 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "The name of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 98 + }, + "name": "environmentName", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- No monitors.", + "stability": "deprecated", + "summary": "The monitors for the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 112 + }, + "name": "monitors", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/environment:EnvironmentOptions" + }, + "@aws-cdk/aws-appconfig-alpha.EnvironmentProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Environment construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentProps", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.EnvironmentOptions" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 118 + }, + "name": "EnvironmentProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The application to be associated with the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 122 + }, + "name": "application", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + } + ], + "symbolId": "lib/environment:EnvironmentProps" + }, + "@aws-cdk/aws-appconfig-alpha.EventBridgeDestination": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Use an Amazon EventBridge event bus as an event destination." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.EventBridgeDestination", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 138 + }, + "parameters": [ + { + "name": "bus", + "type": { + "fqn": "aws-cdk-lib.aws_events.IEventBus" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IEventDestination" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 134 + }, + "name": "EventBridgeDestination", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The URI of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 135 + }, + "name": "extensionUri", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The type of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 136 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType" + } + } + ], + "symbolId": "lib/extension:EventBridgeDestination" + }, + "@aws-cdk/aws-appconfig-alpha.ExtensibleBase": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "remarks": "There is currently no use\nfor this class outside of the AWS AppConfig construct implementation. It is\nintended to be used with the resources since there is currently no way to\ninherit from two classes (at least within JSII constraints).", + "stability": "deprecated", + "summary": "This class is meant to be used by AWS AppConfig resources (application, configuration profile, environment) directly." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensibleBase", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 622 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "resourceArn", + "type": { + "primitive": "string" + } + }, + { + "name": "resourceName", + "optional": true, + "type": { + "primitive": "string" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IExtensible" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 617 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 660 + }, + "name": "addExtension", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 628 + }, + "name": "on", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 648 + }, + "name": "onDeploymentBaking", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 652 + }, + "name": "onDeploymentComplete", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 656 + }, + "name": "onDeploymentRolledBack", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 640 + }, + "name": "onDeploymentStart", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 644 + }, + "name": "onDeploymentStep", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 632 + }, + "name": "preCreateHostedConfigurationVersion", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 636 + }, + "name": "preStartDeployment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "ExtensibleBase", + "symbolId": "lib/extension:ExtensibleBase" + }, + "@aws-cdk/aws-appconfig-alpha.Extension": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "aws-cdk-lib.Resource", + "docs": { + "custom": { + "resource": "AWS::AppConfig::Extension" + }, + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html", + "stability": "deprecated", + "summary": "An AWS AppConfig extension." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Extension", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 494 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IExtension" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 383 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Imports an extension into the CDK using its Amazon Resource Name (ARN)." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 391 + }, + "name": "fromExtensionArn", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the extension construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The Amazon Resource Name (ARN) of the extension." + }, + "name": "extensionArn", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Imports an extension into the CDK using its attributes." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 423 + }, + "name": "fromExtensionAttributes", + "parameters": [ + { + "docs": { + "summary": "The parent construct." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "docs": { + "summary": "The name of the extension construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The attributes of the extension." + }, + "name": "attrs", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionAttributes" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + }, + "static": true + } + ], + "name": "Extension", + "properties": [ + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 475 + }, + "name": "extensionArn", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 482 + }, + "name": "extensionId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 489 + }, + "name": "extensionVersionNumber", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The actions for the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 448 + }, + "name": "actions", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Action" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 458 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The latest version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 463 + }, + "name": "latestVersionNumber", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 453 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The parameters of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 468 + }, + "name": "parameters", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtension", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/extension:Extension" + }, + "@aws-cdk/aws-appconfig-alpha.ExtensionAttributes": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Attributes of an existing AWS AppConfig extension to import." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionAttributes", + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 292 + }, + "name": "ExtensionAttributes", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The ID of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 296 + }, + "name": "extensionId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 301 + }, + "name": "extensionVersionNumber", + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The actions of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 315 + }, + "name": "actions", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Action" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The description of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 329 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- The extension ARN is generated.", + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 308 + }, + "name": "extensionArn", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The name of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 322 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/extension:ExtensionAttributes" + }, + "@aws-cdk/aws-appconfig-alpha.ExtensionOptions": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Options for the Extension construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions", + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 335 + }, + "name": "ExtensionOptions", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- No description.", + "stability": "deprecated", + "summary": "A description of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 348 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- A name is generated.", + "stability": "deprecated", + "summary": "The name of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 341 + }, + "name": "extensionName", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "remarks": "When you create a new version,\nspecify the most recent current version number. For example, you create version 3,\nenter 2 for this field.", + "stability": "deprecated", + "summary": "The latest version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 357 + }, + "name": "latestVersionNumber", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The parameters accepted for the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 364 + }, + "name": "parameters", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/extension:ExtensionOptions" + }, + "@aws-cdk/aws-appconfig-alpha.ExtensionProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Extension construct." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionProps", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 370 + }, + "name": "ExtensionProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The actions for the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 374 + }, + "name": "actions", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Action" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/extension:ExtensionProps" + }, + "@aws-cdk/aws-appconfig-alpha.GrowthType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the growth type of the deployment strategy." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.GrowthType", + "kind": "enum", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 169 + }, + "members": [ + { + "docs": { + "stability": "deprecated", + "summary": "AWS AppConfig will process the deployment by increments of the growth factor evenly distributed over the deployment." + }, + "name": "LINEAR" + }, + { + "docs": { + "remarks": "In this formula, `G` is the step percentage specified by the user and `N`\nis the number of steps until the configuration is deployed to all targets.", + "stability": "deprecated", + "summary": "AWS AppConfig will process the deployment exponentially using the following formula: `G*(2^N)`." + }, + "name": "EXPONENTIAL" + } + ], + "name": "GrowthType", + "symbolId": "lib/deployment-strategy:GrowthType" + }, + "@aws-cdk/aws-appconfig-alpha.HostedConfiguration": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "constructs.Construct", + "docs": { + "stability": "deprecated", + "summary": "A hosted configuration represents configuration stored in the AWS AppConfig hosted configuration store." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfiguration", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 441 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "@aws-cdk/aws-appconfig-alpha.IExtensible" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 397 + }, + "methods": [ + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 324 + }, + "name": "addExistingEnvironmentsToApplication", + "protected": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 300 + }, + "name": "addExtension", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "docs": { + "deprecated": "Use `deployTo` as a property instead. We do not recommend\ncreating resources in multiple stacks. If you want to do this still,\nplease take a look into https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appconfig.CfnDeployment.html.", + "stability": "deprecated", + "summary": "Deploys the configuration to the specified environment." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 312 + }, + "name": "deploy", + "parameters": [ + { + "docs": { + "summary": "The environment to deploy the configuration to." + }, + "name": "environment", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + ] + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 332 + }, + "name": "deployConfigToEnvironments", + "protected": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 214 + }, + "name": "on", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 269 + }, + "name": "onDeploymentBaking", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 280 + }, + "name": "onDeploymentComplete", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 291 + }, + "name": "onDeploymentRolledBack", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 247 + }, + "name": "onDeploymentStart", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 258 + }, + "name": "onDeploymentStep", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 225 + }, + "name": "preCreateHostedConfigurationVersion", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 236 + }, + "name": "preStartDeployment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "HostedConfiguration", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The application associated with the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 147 + }, + "name": "application", + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the configuration profile." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 436 + }, + "name": "configurationProfileArn", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The ID of the configuration profile." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 431 + }, + "name": "configurationProfileId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The content of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 401 + }, + "name": "content", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the hosted configuration version." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 426 + }, + "name": "hostedConfigurationVersionArn", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The content type of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 406 + }, + "name": "contentType", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The deployment key for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 177 + }, + "name": "deploymentKey", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The deployment strategy for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 182 + }, + "name": "deploymentStrategy", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The environments to deploy to." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 152 + }, + "name": "deployTo", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 167 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The latest version number of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 411 + }, + "name": "latestVersionNumber", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 157 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The configuration type." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 172 + }, + "name": "type", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The validators for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 162 + }, + "name": "validators", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IValidator" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The version label of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 416 + }, + "name": "versionLabel", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The version number of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 421 + }, + "name": "versionNumber", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 184 + }, + "name": "applicationId", + "protected": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 185 + }, + "name": "extensible", + "protected": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensibleBase" + } + } + ], + "symbolId": "lib/configuration:HostedConfiguration" + }, + "@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Options for HostedConfiguration." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ConfigurationOptions" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 349 + }, + "name": "HostedConfigurationOptions", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The content of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 353 + }, + "name": "content", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The latest version number of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 360 + }, + "name": "latestVersionNumber", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The version label of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 367 + }, + "name": "versionLabel", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:HostedConfigurationOptions" + }, + "@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for HostedConfiguration." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ConfigurationProps" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 373 + }, + "name": "HostedConfigurationProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The content of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 377 + }, + "name": "content", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationContent" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The latest version number of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 384 + }, + "name": "latestVersionNumber", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "stability": "deprecated", + "summary": "The version label of the hosted configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 391 + }, + "name": "versionLabel", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:HostedConfigurationProps" + }, + "@aws-cdk/aws-appconfig-alpha.IApplication": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication", + "interfaces": [ + "aws-cdk-lib.IResource" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/application.ts", + "line": 19 + }, + "methods": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an environment." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 48 + }, + "name": "addEnvironment", + "parameters": [ + { + "docs": { + "summary": "The name of the environment construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The options for the environment construct." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.EnvironmentOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an existing environment." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 71 + }, + "name": "addExistingEnvironment", + "parameters": [ + { + "docs": { + "summary": "The environment." + }, + "name": "environment", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 155 + }, + "name": "addExtension", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a hosted configuration." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 56 + }, + "name": "addHostedConfiguration", + "parameters": [ + { + "docs": { + "summary": "The name of the hosted configuration construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The options for the hosted configuration construct." + }, + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.HostedConfiguration" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a sourced configuration." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 64 + }, + "name": "addSourcedConfiguration", + "parameters": [ + { + "docs": { + "summary": "The name of the sourced configuration construct." + }, + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The options for the sourced configuration construct." + }, + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfiguration" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 86 + }, + "name": "on", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 130 + }, + "name": "onDeploymentBaking", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 139 + }, + "name": "onDeploymentComplete", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 148 + }, + "name": "onDeploymentRolledBack", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 112 + }, + "name": "onDeploymentStart", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 121 + }, + "name": "onDeploymentStep", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 95 + }, + "name": "preCreateHostedConfigurationVersion", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to an application." + }, + "locationInModule": { + "filename": "lib/application.ts", + "line": 104 + }, + "name": "preStartDeployment", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "IApplication", + "properties": [ + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 40 + }, + "name": "applicationArn", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 34 + }, + "name": "applicationId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Returns the list of associated environments." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 76 + }, + "name": "environments", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The description of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 23 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The name of the application." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/application.ts", + "line": 28 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/application:IApplication" + }, + "@aws-cdk/aws-appconfig-alpha.IConfiguration": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "interfaces": [ + "constructs.IConstruct" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 88 + }, + "name": "IConfiguration", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The application associated with the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 102 + }, + "name": "application", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The ID of the configuration profile." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 137 + }, + "name": "configurationProfileId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The deployment key for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 132 + }, + "name": "deploymentKey", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The deployment strategy for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 92 + }, + "name": "deploymentStrategy", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The environments to deploy to." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 127 + }, + "name": "deployTo", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The description of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 117 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The name of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 107 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The configuration type." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 122 + }, + "name": "type", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationType" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The validators for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 112 + }, + "name": "validators", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IValidator" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The configuration version number." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 97 + }, + "name": "versionNumber", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:IConfiguration" + }, + "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy", + "interfaces": [ + "aws-cdk-lib.IResource" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 358 + }, + "name": "IDeploymentStrategy", + "properties": [ + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 399 + }, + "name": "deploymentStrategyArn", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 393 + }, + "name": "deploymentStrategyId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The deployment duration in minutes." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 367 + }, + "name": "deploymentDurationInMinutes", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The description of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 377 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The final bake time in minutes." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 382 + }, + "name": "finalBakeTimeInMinutes", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The growth factor of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 372 + }, + "name": "growthFactor", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The growth type of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 387 + }, + "name": "growthType", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.GrowthType" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The name of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 362 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/deployment-strategy:IDeploymentStrategy" + }, + "@aws-cdk/aws-appconfig-alpha.IEnvironment": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment", + "interfaces": [ + "aws-cdk-lib.IResource" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 378 + }, + "methods": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 494 + }, + "name": "addExtension", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 424 + }, + "name": "on", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 469 + }, + "name": "onDeploymentBaking", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 478 + }, + "name": "onDeploymentComplete", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 487 + }, + "name": "onDeploymentRolledBack", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 451 + }, + "name": "onDeploymentStart", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 460 + }, + "name": "onDeploymentStep", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 433 + }, + "name": "preCreateHostedConfigurationVersion", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the environment." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 442 + }, + "name": "preStartDeployment", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "IEnvironment", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The ID of the application associated to the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 387 + }, + "name": "applicationId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 414 + }, + "name": "environmentArn", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 408 + }, + "name": "environmentId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The application associated with the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 382 + }, + "name": "application", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The description of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 397 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The monitors for the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 402 + }, + "name": "monitors", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The name of the environment." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 392 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/environment:IEnvironment" + }, + "@aws-cdk/aws-appconfig-alpha.IEventDestination": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Implemented by allowed extension event destinations." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 39 + }, + "name": "IEventDestination", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The URI of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 43 + }, + "name": "extensionUri", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 48 + }, + "name": "type", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The IAM policy document to invoke the event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 53 + }, + "name": "policyDocument", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.PolicyDocument" + } + } + ], + "symbolId": "lib/extension:IEventDestination" + }, + "@aws-cdk/aws-appconfig-alpha.IExtensible": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the extensible base implementation for extension association resources." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 722 + }, + "methods": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 801 + }, + "name": "addExtension", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 731 + }, + "name": "on", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 776 + }, + "name": "onDeploymentBaking", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 785 + }, + "name": "onDeploymentComplete", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 794 + }, + "name": "onDeploymentRolledBack", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 758 + }, + "name": "onDeploymentStart", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 767 + }, + "name": "onDeploymentStep", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 740 + }, + "name": "preCreateHostedConfigurationVersion", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the derived resource." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 749 + }, + "name": "preStartDeployment", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "IExtensible", + "symbolId": "lib/extension:IExtensible" + }, + "@aws-cdk/aws-appconfig-alpha.IExtension": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension", + "interfaces": [ + "aws-cdk-lib.IResource" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 565 + }, + "name": "IExtension", + "properties": [ + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 595 + }, + "name": "extensionArn", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The ID of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 601 + }, + "name": "extensionId", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 607 + }, + "name": "extensionVersionNumber", + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The actions for the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 569 + }, + "name": "actions", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Action" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The description of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 579 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The latest version number of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 584 + }, + "name": "latestVersionNumber", + "optional": true, + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The name of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 574 + }, + "name": "name", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The parameters of the extension." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 589 + }, + "name": "parameters", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter" + }, + "kind": "array" + } + } + } + ], + "symbolId": "lib/extension:IExtension" + }, + "@aws-cdk/aws-appconfig-alpha.IValidator": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated" + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.IValidator", + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 739 + }, + "name": "IValidator", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The content of the validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 743 + }, + "name": "content", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 748 + }, + "name": "type", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ValidatorType" + } + } + ], + "symbolId": "lib/configuration:IValidator" + }, + "@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines a JSON Schema validator." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IValidator" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 754 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Defines a JSON Schema validator from a file." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 760 + }, + "name": "fromFile", + "parameters": [ + { + "docs": { + "summary": "The path to the file that defines the validator." + }, + "name": "inputPath", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Defines a JSON Schema validator from inline code." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 772 + }, + "name": "fromInline", + "parameters": [ + { + "docs": { + "summary": "The inline code that defines the validator." + }, + "name": "code", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator" + } + }, + "static": true + } + ], + "name": "JsonSchemaValidator", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The content of the validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 779 + }, + "name": "content", + "overrides": "@aws-cdk/aws-appconfig-alpha.IValidator", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 780 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IValidator", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ValidatorType" + } + } + ], + "symbolId": "lib/configuration:JsonSchemaValidator" + }, + "@aws-cdk/aws-appconfig-alpha.LambdaDestination": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Use an AWS Lambda function as an event destination." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.LambdaDestination", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 64 + }, + "parameters": [ + { + "name": "func", + "type": { + "fqn": "aws-cdk-lib.aws_lambda.IFunction" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IEventDestination" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 59 + }, + "name": "LambdaDestination", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The URI of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 60 + }, + "name": "extensionUri", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The type of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 61 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The IAM policy document to invoke the event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 62 + }, + "name": "policyDocument", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "aws-cdk-lib.aws_iam.PolicyDocument" + } + } + ], + "symbolId": "lib/extension:LambdaDestination" + }, + "@aws-cdk/aws-appconfig-alpha.LambdaValidator": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines an AWS Lambda validator." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.LambdaValidator", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IValidator" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 786 + }, + "methods": [ + { + "docs": { + "remarks": "This will call\n`addPermission` to your function to grant AWS AppConfig permissions.", + "stability": "deprecated", + "summary": "Defines an AWS Lambda validator from a Lambda function." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 793 + }, + "name": "fromFunction", + "parameters": [ + { + "docs": { + "summary": "The function that defines the validator." + }, + "name": "func", + "type": { + "fqn": "aws-cdk-lib.aws_lambda.Function" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.LambdaValidator" + } + }, + "static": true + } + ], + "name": "LambdaValidator", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The content of the validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 805 + }, + "name": "content", + "overrides": "@aws-cdk/aws-appconfig-alpha.IValidator", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of validator." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 806 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IValidator", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ValidatorType" + } + } + ], + "symbolId": "lib/configuration:LambdaValidator" + }, + "@aws-cdk/aws-appconfig-alpha.Monitor": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines monitors that will be associated with an AWS AppConfig environment." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 325 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Creates a Monitor from a CfnEnvironment.MonitorsProperty construct." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 346 + }, + "name": "fromCfnMonitorsProperty", + "parameters": [ + { + "docs": { + "summary": "The monitors property." + }, + "name": "monitorsProperty", + "type": { + "fqn": "aws-cdk-lib.aws_appconfig.CfnEnvironment.MonitorsProperty" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + } + }, + "static": true + }, + { + "docs": { + "remarks": "If the alarm role is not specified, a role will\nbe generated.", + "stability": "deprecated", + "summary": "Creates a Monitor from a CloudWatch alarm." + }, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 333 + }, + "name": "fromCloudWatchAlarm", + "parameters": [ + { + "docs": { + "summary": "The Amazon CloudWatch alarm." + }, + "name": "alarm", + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.IAlarm" + } + }, + { + "docs": { + "summary": "The IAM role for AWS AppConfig to view the alarm state." + }, + "name": "alarmRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Monitor" + } + }, + "static": true + } + ], + "name": "Monitor", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The alarm ARN for AWS AppConfig to monitor." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 360 + }, + "name": "alarmArn", + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The type of monitor." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 365 + }, + "name": "monitorType", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.MonitorType" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The IAM role ARN for AWS AppConfig to view the alarm state." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 370 + }, + "name": "alarmRoleArn", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "Indicates whether a CloudWatch alarm is a composite alarm." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/environment.ts", + "line": 375 + }, + "name": "isCompositeAlarm", + "optional": true, + "type": { + "primitive": "boolean" + } + } + ], + "symbolId": "lib/environment:Monitor" + }, + "@aws-cdk/aws-appconfig-alpha.MonitorType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "The type of Monitor." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.MonitorType", + "kind": "enum", + "locationInModule": { + "filename": "lib/environment.ts", + "line": 310 + }, + "members": [ + { + "docs": { + "stability": "deprecated", + "summary": "A Monitor from a CloudWatch alarm." + }, + "name": "CLOUDWATCH" + }, + { + "docs": { + "stability": "deprecated", + "summary": "A Monitor from a CfnEnvironment.MonitorsProperty construct." + }, + "name": "CFN_MONITORS_PROPERTY" + } + ], + "name": "MonitorType", + "symbolId": "lib/environment:MonitorType" + }, + "@aws-cdk/aws-appconfig-alpha.Parameter": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines a parameter for an extension." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter", + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 238 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "An optional parameter for an extension." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 257 + }, + "name": "notRequired", + "parameters": [ + { + "docs": { + "summary": "The name of the parameter." + }, + "name": "name", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The value of the parameter." + }, + "name": "value", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "A description for the parameter." + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "A required parameter for an extension." + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 246 + }, + "name": "required", + "parameters": [ + { + "docs": { + "summary": "The name of the parameter." + }, + "name": "name", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The value of the parameter." + }, + "name": "value", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "A description for the parameter." + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.Parameter" + } + }, + "static": true + } + ], + "name": "Parameter", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "A boolean that indicates if the parameter is required or optional." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 269 + }, + "name": "isRequired", + "type": { + "primitive": "boolean" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the parameter." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 264 + }, + "name": "name", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the parameter." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 279 + }, + "name": "description", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The value of the parameter." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 274 + }, + "name": "value", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/extension:Parameter" + }, + "@aws-cdk/aws-appconfig-alpha.Platform": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the platform for the AWS AppConfig Lambda extension." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.Platform", + "kind": "enum", + "locationInModule": { + "filename": "lib/application.ts", + "line": 14 + }, + "members": [ + { + "docs": { + "stability": "deprecated" + }, + "name": "X86_64" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "ARM_64" + } + ], + "name": "Platform", + "symbolId": "lib/application:Platform" + }, + "@aws-cdk/aws-appconfig-alpha.RolloutStrategy": { + "abstract": true, + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "see": "https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html", + "stability": "deprecated", + "summary": "Defines the rollout strategy for a deployment strategy and includes the growth factor, deployment duration, growth type, and optionally final bake time." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 270 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Build your own exponential rollout strategy." + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 328 + }, + "name": "exponential", + "parameters": [ + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Build your own linear rollout strategy." + }, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 316 + }, + "name": "linear", + "parameters": [ + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + "static": true + } + ], + "name": "RolloutStrategy", + "properties": [ + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to all targets immediately.", + "stability": "deprecated", + "summary": "**Quick**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 307 + }, + "name": "ALL_AT_ONCE", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes.\nAWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices\nfor configuration deployments.", + "stability": "deprecated", + "summary": "**AWS Recommended**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 276 + }, + "name": "CANARY_10_PERCENT_20_MINUTES", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment.\nAWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices\nfor configuration deployments.", + "stability": "deprecated", + "summary": "**AWS Recommended**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 298 + }, + "name": "LINEAR_20_PERCENT_EVERY_6_MINUTES", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + { + "const": true, + "docs": { + "remarks": "This strategy deploys the configuration to half of all targets every 30 seconds for a\none-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because\nit has a short duration and bake time.", + "stability": "deprecated", + "summary": "**Testing/Demonstration**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 287 + }, + "name": "LINEAR_50_PERCENT_EVERY_30_SECONDS", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategy" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The deployment duration of the rollout strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 345 + }, + "name": "deploymentDuration", + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The growth factor of the rollout strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 340 + }, + "name": "growthFactor", + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The final bake time of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 355 + }, + "name": "finalBakeTime", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The growth type of the rollout strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 350 + }, + "name": "growthType", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.GrowthType" + } + } + ], + "symbolId": "lib/deployment-strategy:RolloutStrategy" + }, + "@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for the Rollout Strategy." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps", + "kind": "interface", + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 236 + }, + "name": "RolloutStrategyProps", + "properties": [ + { + "abstract": true, + "docs": { + "remarks": "This defines\nthe total amount of time for a deployment to last.", + "stability": "deprecated", + "summary": "The deployment duration of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 248 + }, + "name": "deploymentDuration", + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "remarks": "This defines\nthe percentage of targets to receive a deployed configuration\nduring each interval.", + "stability": "deprecated", + "summary": "The growth factor of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 242 + }, + "name": "growthFactor", + "type": { + "primitive": "number" + } + }, + { + "abstract": true, + "docs": { + "default": "Duration.minutes(0)", + "remarks": "This setting specifies the amount of time AWS AppConfig monitors for Amazon\nCloudWatch alarms after the configuration has been deployed to\n100% of its targets, before considering the deployment to be complete.\nIf an alarm is triggered during this time, AWS AppConfig rolls back\nthe deployment.", + "stability": "deprecated", + "summary": "The final bake time of the deployment strategy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/deployment-strategy.ts", + "line": 261 + }, + "name": "finalBakeTime", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.Duration" + } + } + ], + "symbolId": "lib/deployment-strategy:RolloutStrategyProps" + }, + "@aws-cdk/aws-appconfig-alpha.SnsDestination": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Use an Amazon SNS topic as an event destination." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SnsDestination", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 117 + }, + "parameters": [ + { + "name": "topic", + "type": { + "fqn": "aws-cdk-lib.aws_sns.ITopic" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IEventDestination" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 112 + }, + "name": "SnsDestination", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The URI of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 113 + }, + "name": "extensionUri", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The type of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 114 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The IAM policy document to invoke the event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 115 + }, + "name": "policyDocument", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "aws-cdk-lib.aws_iam.PolicyDocument" + } + } + ], + "symbolId": "lib/extension:SnsDestination" + }, + "@aws-cdk/aws-appconfig-alpha.SourceType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Defines the source type for event destinations." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType", + "kind": "enum", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 29 + }, + "members": [ + { + "docs": { + "stability": "deprecated" + }, + "name": "LAMBDA" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "SQS" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "SNS" + }, + { + "docs": { + "stability": "deprecated" + }, + "name": "EVENTS" + } + ], + "name": "SourceType", + "symbolId": "lib/extension:SourceType" + }, + "@aws-cdk/aws-appconfig-alpha.SourcedConfiguration": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "base": "constructs.Construct", + "docs": { + "stability": "deprecated", + "summary": "A sourced configuration represents configuration stored in an Amazon S3 bucket, AWS Secrets Manager secret, Systems Manager (SSM) Parameter Store parameter, SSM document, or AWS CodePipeline." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfiguration", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 577 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "@aws-cdk/aws-appconfig-alpha.IExtensible" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 541 + }, + "methods": [ + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 324 + }, + "name": "addExistingEnvironmentsToApplication", + "protected": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 300 + }, + "name": "addExtension", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The extension to create an association for." + }, + "name": "extension", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IExtension" + } + } + ] + }, + { + "docs": { + "deprecated": "Use `deployTo` as a property instead. We do not recommend\ncreating resources in multiple stacks. If you want to do this still,\nplease take a look into https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appconfig.CfnDeployment.html.", + "stability": "deprecated", + "summary": "Deploys the configuration to the specified environment." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 312 + }, + "name": "deploy", + "parameters": [ + { + "docs": { + "summary": "The environment to deploy the configuration to." + }, + "name": "environment", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + } + } + ] + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 332 + }, + "name": "deployConfigToEnvironments", + "protected": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an extension defined by the action point and event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 214 + }, + "name": "on", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The action point which triggers the event." + }, + "name": "actionPoint", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ActionPoint" + } + }, + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 269 + }, + "name": "onDeploymentBaking", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 280 + }, + "name": "onDeploymentComplete", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 291 + }, + "name": "onDeploymentRolledBack", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 247 + }, + "name": "onDeploymentStart", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 258 + }, + "name": "onDeploymentStep", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 225 + }, + "name": "preCreateHostedConfigurationVersion", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + }, + { + "docs": { + "stability": "deprecated", + "summary": "Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates an extension association to the configuration profile." + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 236 + }, + "name": "preStartDeployment", + "overrides": "@aws-cdk/aws-appconfig-alpha.IExtensible", + "parameters": [ + { + "docs": { + "summary": "The event that occurs during the extension." + }, + "name": "eventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEventDestination" + } + }, + { + "docs": { + "summary": "Options for the extension." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensionOptions" + } + } + ] + } + ], + "name": "SourcedConfiguration", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The application associated with the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 147 + }, + "name": "application", + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IApplication" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The Amazon Resource Name (ARN) of the configuration profile." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 572 + }, + "name": "configurationProfileArn", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The ID of the configuration profile." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 567 + }, + "name": "configurationProfileId", + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The location where the configuration is stored." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 545 + }, + "name": "location", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The deployment key for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 177 + }, + "name": "deploymentKey", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The deployment strategy for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 182 + }, + "name": "deploymentStrategy", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IDeploymentStrategy" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The environments to deploy to." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 152 + }, + "name": "deployTo", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IEnvironment" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The description of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 167 + }, + "name": "description", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 157 + }, + "name": "name", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The IAM role to retrieve the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 555 + }, + "name": "retrievalRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "docs": { + "remarks": "This key\ncan be used when storing configuration in AWS Secrets Manager, Systems Manager Parameter Store,\nor Amazon S3.", + "stability": "deprecated", + "summary": "The key to decrypt the configuration if applicable." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 562 + }, + "name": "sourceKey", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_kms.IKey" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The configuration type." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 172 + }, + "name": "type", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The validators for the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 162 + }, + "name": "validators", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "collection": { + "elementtype": { + "fqn": "@aws-cdk/aws-appconfig-alpha.IValidator" + }, + "kind": "array" + } + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The version number of the configuration to deploy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 550 + }, + "name": "versionNumber", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IConfiguration", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 184 + }, + "name": "applicationId", + "protected": true, + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 185 + }, + "name": "extensible", + "protected": true, + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ExtensibleBase" + } + } + ], + "symbolId": "lib/configuration:SourcedConfiguration" + }, + "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Options for SourcedConfiguration." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ConfigurationOptions" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 490 + }, + "name": "SourcedConfigurationOptions", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The location where the configuration is stored." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 494 + }, + "name": "location", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + { + "abstract": true, + "docs": { + "default": "- A role is generated.", + "stability": "deprecated", + "summary": "The IAM role to retrieve the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 509 + }, + "name": "retrievalRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "remarks": "If this is not specified,\nthen there will be no deployment.", + "stability": "deprecated", + "summary": "The version number of the sourced configuration to deploy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 502 + }, + "name": "versionNumber", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:SourcedConfigurationOptions" + }, + "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for SourcedConfiguration." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps", + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.ConfigurationProps" + ], + "kind": "interface", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 515 + }, + "name": "SourcedConfigurationProps", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The location where the configuration is stored." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 519 + }, + "name": "location", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.ConfigurationSource" + } + }, + { + "abstract": true, + "docs": { + "default": "- A role is generated.", + "stability": "deprecated", + "summary": "The IAM role to retrieve the configuration." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 534 + }, + "name": "retrievalRole", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "abstract": true, + "docs": { + "default": "- None.", + "remarks": "If this is not specified,\nthen there will be no deployment.", + "stability": "deprecated", + "summary": "The version number of the sourced configuration to deploy." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 527 + }, + "name": "versionNumber", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/configuration:SourcedConfigurationProps" + }, + "@aws-cdk/aws-appconfig-alpha.SqsDestination": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "Use an Amazon SQS queue as an event destination." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.SqsDestination", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 95 + }, + "parameters": [ + { + "name": "queue", + "type": { + "fqn": "aws-cdk-lib.aws_sqs.IQueue" + } + } + ] + }, + "interfaces": [ + "@aws-cdk/aws-appconfig-alpha.IEventDestination" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/extension.ts", + "line": 90 + }, + "name": "SqsDestination", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The URI of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 91 + }, + "name": "extensionUri", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The type of the extension event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 92 + }, + "name": "type", + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "@aws-cdk/aws-appconfig-alpha.SourceType" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The IAM policy document to invoke the event destination." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/extension.ts", + "line": 93 + }, + "name": "policyDocument", + "optional": true, + "overrides": "@aws-cdk/aws-appconfig-alpha.IEventDestination", + "type": { + "fqn": "aws-cdk-lib.aws_iam.PolicyDocument" + } + } + ], + "symbolId": "lib/extension:SqsDestination" + }, + "@aws-cdk/aws-appconfig-alpha.ValidatorType": { + "assembly": "@aws-cdk/aws-appconfig-alpha", + "docs": { + "stability": "deprecated", + "summary": "The validator type." + }, + "fqn": "@aws-cdk/aws-appconfig-alpha.ValidatorType", + "kind": "enum", + "locationInModule": { + "filename": "lib/configuration.ts", + "line": 716 + }, + "members": [ + { + "docs": { + "stability": "deprecated", + "summary": "JSON Scema validator." + }, + "name": "JSON_SCHEMA" + }, + { + "docs": { + "stability": "deprecated", + "summary": "Validate using a Lambda function." + }, + "name": "LAMBDA" + } + ], + "name": "ValidatorType", + "symbolId": "lib/configuration:ValidatorType" + } + }, + "version": "0.0.0", + "fingerprint": "xSxaa3BOr+0HDQmqarJLyyr6/6KG2+4Rhe1LhDqCFFU=" +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/.warnings.jsii.js b/packages/@aws-cdk/aws-appconfig-alpha/.warnings.jsii.js new file mode 100644 index 0000000000000..c61cfab56c725 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/.warnings.jsii.js @@ -0,0 +1,739 @@ +function _aws_cdk_aws_appconfig_alpha_EnvironmentAttributes(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("application" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes#application", ""); + if (!visitedObjects.has(p.application)) + _aws_cdk_aws_appconfig_alpha_IApplication(p.application); + if ("environmentId" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes#environmentId", ""); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes#description", ""); + if ("monitors" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes#monitors", ""); + if (p.monitors != null) + for (const o of p.monitors) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Monitor(o); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentAttributes#name", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_EnvironmentOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#description", ""); + if ("environmentName" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#environmentName", ""); + if ("monitors" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#monitors", ""); + if (p.monitors != null) + for (const o of p.monitors) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Monitor(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_EnvironmentProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("application" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentProps#application", ""); + if (!visitedObjects.has(p.application)) + _aws_cdk_aws_appconfig_alpha_IApplication(p.application); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#description", ""); + if ("environmentName" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#environmentName", ""); + if ("monitors" in p) + print("@aws-cdk/aws-appconfig-alpha.EnvironmentOptions#monitors", ""); + if (p.monitors != null) + for (const o of p.monitors) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Monitor(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_Environment(p) { +} +function _aws_cdk_aws_appconfig_alpha_MonitorType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.MonitorType", ""); + const ns = require("./lib/environment.js"); + if (Object.values(ns.MonitorType).filter(x => x === p).length > 1) + return; + if (p === ns.MonitorType.CLOUDWATCH) + print("@aws-cdk/aws-appconfig-alpha.MonitorType#CLOUDWATCH", ""); + if (p === ns.MonitorType.CFN_MONITORS_PROPERTY) + print("@aws-cdk/aws-appconfig-alpha.MonitorType#CFN_MONITORS_PROPERTY", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_Monitor(p) { +} +function _aws_cdk_aws_appconfig_alpha_IEnvironment(p) { +} +function _aws_cdk_aws_appconfig_alpha_DeploymentStrategyProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("rolloutStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps#rolloutStrategy", ""); + if (!visitedObjects.has(p.rolloutStrategy)) + _aws_cdk_aws_appconfig_alpha_RolloutStrategy(p.rolloutStrategy); + if ("deploymentStrategyName" in p) + print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps#deploymentStrategyName", ""); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategyProps#description", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_DeploymentStrategy(p) { +} +function _aws_cdk_aws_appconfig_alpha_GrowthType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.GrowthType", ""); + const ns = require("./lib/deployment-strategy.js"); + if (Object.values(ns.GrowthType).filter(x => x === p).length > 1) + return; + if (p === ns.GrowthType.LINEAR) + print("@aws-cdk/aws-appconfig-alpha.GrowthType#LINEAR", ""); + if (p === ns.GrowthType.EXPONENTIAL) + print("@aws-cdk/aws-appconfig-alpha.GrowthType#EXPONENTIAL", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_DeploymentStrategyId(p) { +} +function _aws_cdk_aws_appconfig_alpha_RolloutStrategyProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("deploymentDuration" in p) + print("@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps#deploymentDuration", ""); + if ("growthFactor" in p) + print("@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps#growthFactor", ""); + if ("finalBakeTime" in p) + print("@aws-cdk/aws-appconfig-alpha.RolloutStrategyProps#finalBakeTime", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_RolloutStrategy(p) { +} +function _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p) { +} +function _aws_cdk_aws_appconfig_alpha_ActionPoint(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.ActionPoint", ""); + const ns = require("./lib/extension.js"); + if (Object.values(ns.ActionPoint).filter(x => x === p).length > 1) + return; + if (p === ns.ActionPoint.PRE_CREATE_HOSTED_CONFIGURATION_VERSION) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#PRE_CREATE_HOSTED_CONFIGURATION_VERSION", ""); + if (p === ns.ActionPoint.PRE_START_DEPLOYMENT) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#PRE_START_DEPLOYMENT", ""); + if (p === ns.ActionPoint.ON_DEPLOYMENT_START) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#ON_DEPLOYMENT_START", ""); + if (p === ns.ActionPoint.ON_DEPLOYMENT_STEP) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#ON_DEPLOYMENT_STEP", ""); + if (p === ns.ActionPoint.ON_DEPLOYMENT_BAKING) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#ON_DEPLOYMENT_BAKING", ""); + if (p === ns.ActionPoint.ON_DEPLOYMENT_COMPLETE) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#ON_DEPLOYMENT_COMPLETE", ""); + if (p === ns.ActionPoint.ON_DEPLOYMENT_ROLLED_BACK) + print("@aws-cdk/aws-appconfig-alpha.ActionPoint#ON_DEPLOYMENT_ROLLED_BACK", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_SourceType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.SourceType", ""); + const ns = require("./lib/extension.js"); + if (Object.values(ns.SourceType).filter(x => x === p).length > 1) + return; + if (p === ns.SourceType.LAMBDA) + print("@aws-cdk/aws-appconfig-alpha.SourceType#LAMBDA", ""); + if (p === ns.SourceType.SQS) + print("@aws-cdk/aws-appconfig-alpha.SourceType#SQS", ""); + if (p === ns.SourceType.SNS) + print("@aws-cdk/aws-appconfig-alpha.SourceType#SNS", ""); + if (p === ns.SourceType.EVENTS) + print("@aws-cdk/aws-appconfig-alpha.SourceType#EVENTS", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_IEventDestination(p) { +} +function _aws_cdk_aws_appconfig_alpha_LambdaDestination(p) { +} +function _aws_cdk_aws_appconfig_alpha_SqsDestination(p) { +} +function _aws_cdk_aws_appconfig_alpha_SnsDestination(p) { +} +function _aws_cdk_aws_appconfig_alpha_EventBridgeDestination(p) { +} +function _aws_cdk_aws_appconfig_alpha_ActionProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("actionPoints" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#actionPoints", ""); + if (p.actionPoints != null) + for (const o of p.actionPoints) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_ActionPoint(o); + if ("eventDestination" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#eventDestination", ""); + if (!visitedObjects.has(p.eventDestination)) + _aws_cdk_aws_appconfig_alpha_IEventDestination(p.eventDestination); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#description", ""); + if ("executionRole" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#executionRole", ""); + if ("invokeWithoutExecutionRole" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#invokeWithoutExecutionRole", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ActionProps#name", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_Action(p) { +} +function _aws_cdk_aws_appconfig_alpha_Parameter(p) { +} +function _aws_cdk_aws_appconfig_alpha_ExtensionAttributes(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("extensionId" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#extensionId", ""); + if ("extensionVersionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#extensionVersionNumber", ""); + if ("actions" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#actions", ""); + if (p.actions != null) + for (const o of p.actions) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Action(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#description", ""); + if ("extensionArn" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#extensionArn", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionAttributes#name", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_ExtensionOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#description", ""); + if ("extensionName" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#extensionName", ""); + if ("latestVersionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#latestVersionNumber", ""); + if ("parameters" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#parameters", ""); + if (p.parameters != null) + for (const o of p.parameters) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Parameter(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_ExtensionProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("actions" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionProps#actions", ""); + if (p.actions != null) + for (const o of p.actions) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Action(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#description", ""); + if ("extensionName" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#extensionName", ""); + if ("latestVersionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#latestVersionNumber", ""); + if ("parameters" in p) + print("@aws-cdk/aws-appconfig-alpha.ExtensionOptions#parameters", ""); + if (p.parameters != null) + for (const o of p.parameters) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_Parameter(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_Extension(p) { +} +function _aws_cdk_aws_appconfig_alpha_IExtension(p) { +} +function _aws_cdk_aws_appconfig_alpha_ExtensibleBase(p) { +} +function _aws_cdk_aws_appconfig_alpha_IExtensible(p) { +} +function _aws_cdk_aws_appconfig_alpha_Platform(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.Platform", ""); + const ns = require("./lib/application.js"); + if (Object.values(ns.Platform).filter(x => x === p).length > 1) + return; + if (p === ns.Platform.X86_64) + print("@aws-cdk/aws-appconfig-alpha.Platform#X86_64", ""); + if (p === ns.Platform.ARM_64) + print("@aws-cdk/aws-appconfig-alpha.Platform#ARM_64", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_IApplication(p) { +} +function _aws_cdk_aws_appconfig_alpha_ApplicationProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("applicationName" in p) + print("@aws-cdk/aws-appconfig-alpha.ApplicationProps#applicationName", ""); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ApplicationProps#description", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_Application(p) { +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("application" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationProps#application", ""); + if (!visitedObjects.has(p.application)) + _aws_cdk_aws_appconfig_alpha_IApplication(p.application); + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_IConfiguration(p) { +} +function _aws_cdk_aws_appconfig_alpha_HostedConfigurationOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("content" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions#content", ""); + if (!visitedObjects.has(p.content)) + _aws_cdk_aws_appconfig_alpha_ConfigurationContent(p.content); + if ("latestVersionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions#latestVersionNumber", ""); + if ("versionLabel" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationOptions#versionLabel", ""); + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_HostedConfigurationProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("content" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps#content", ""); + if (!visitedObjects.has(p.content)) + _aws_cdk_aws_appconfig_alpha_ConfigurationContent(p.content); + if ("latestVersionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps#latestVersionNumber", ""); + if ("versionLabel" in p) + print("@aws-cdk/aws-appconfig-alpha.HostedConfigurationProps#versionLabel", ""); + if ("application" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationProps#application", ""); + if (!visitedObjects.has(p.application)) + _aws_cdk_aws_appconfig_alpha_IApplication(p.application); + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_HostedConfiguration(p) { +} +function _aws_cdk_aws_appconfig_alpha_SourcedConfigurationOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("location" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions#location", ""); + if (!visitedObjects.has(p.location)) + _aws_cdk_aws_appconfig_alpha_ConfigurationSource(p.location); + if ("retrievalRole" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions#retrievalRole", ""); + if ("versionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationOptions#versionNumber", ""); + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_SourcedConfigurationProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("location" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps#location", ""); + if (!visitedObjects.has(p.location)) + _aws_cdk_aws_appconfig_alpha_ConfigurationSource(p.location); + if ("retrievalRole" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps#retrievalRole", ""); + if ("versionNumber" in p) + print("@aws-cdk/aws-appconfig-alpha.SourcedConfigurationProps#versionNumber", ""); + if ("application" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationProps#application", ""); + if (!visitedObjects.has(p.application)) + _aws_cdk_aws_appconfig_alpha_IApplication(p.application); + if ("deploymentKey" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentKey", ""); + if ("deploymentStrategy" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deploymentStrategy", ""); + if (!visitedObjects.has(p.deploymentStrategy)) + _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy(p.deploymentStrategy); + if ("deployTo" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#deployTo", ""); + if (p.deployTo != null) + for (const o of p.deployTo) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IEnvironment(o); + if ("description" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#description", ""); + if ("name" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#name", ""); + if ("type" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#type", ""); + if (!visitedObjects.has(p.type)) + _aws_cdk_aws_appconfig_alpha_ConfigurationType(p.type); + if ("validators" in p) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationOptions#validators", ""); + if (p.validators != null) + for (const o of p.validators) + if (!visitedObjects.has(o)) + _aws_cdk_aws_appconfig_alpha_IValidator(o); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_SourcedConfiguration(p) { +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.ConfigurationType", ""); + const ns = require("./lib/configuration.js"); + if (Object.values(ns.ConfigurationType).filter(x => x === p).length > 1) + return; + if (p === ns.ConfigurationType.FREEFORM) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationType#FREEFORM", ""); + if (p === ns.ConfigurationType.FEATURE_FLAGS) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationType#FEATURE_FLAGS", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_ValidatorType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.ValidatorType", ""); + const ns = require("./lib/configuration.js"); + if (Object.values(ns.ValidatorType).filter(x => x === p).length > 1) + return; + if (p === ns.ValidatorType.JSON_SCHEMA) + print("@aws-cdk/aws-appconfig-alpha.ValidatorType#JSON_SCHEMA", ""); + if (p === ns.ValidatorType.LAMBDA) + print("@aws-cdk/aws-appconfig-alpha.ValidatorType#LAMBDA", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationSourceType(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType", ""); + const ns = require("./lib/configuration.js"); + if (Object.values(ns.ConfigurationSourceType).filter(x => x === p).length > 1) + return; + if (p === ns.ConfigurationSourceType.S3) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType#S3", ""); + if (p === ns.ConfigurationSourceType.SECRETS_MANAGER) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType#SECRETS_MANAGER", ""); + if (p === ns.ConfigurationSourceType.SSM_PARAMETER) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType#SSM_PARAMETER", ""); + if (p === ns.ConfigurationSourceType.SSM_DOCUMENT) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType#SSM_DOCUMENT", ""); + if (p === ns.ConfigurationSourceType.CODE_PIPELINE) + print("@aws-cdk/aws-appconfig-alpha.ConfigurationSourceType#CODE_PIPELINE", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_appconfig_alpha_IValidator(p) { +} +function _aws_cdk_aws_appconfig_alpha_JsonSchemaValidator(p) { +} +function _aws_cdk_aws_appconfig_alpha_LambdaValidator(p) { +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationContent(p) { +} +function _aws_cdk_aws_appconfig_alpha_ConfigurationSource(p) { +} +function print(name, deprecationMessage) { + const deprecated = process.env.JSII_DEPRECATED; + const deprecationMode = ["warn", "fail", "quiet"].includes(deprecated) ? deprecated : "warn"; + const message = `${name} is deprecated.\n ${deprecationMessage.trim()}\n This API will be removed in the next major release.`; + switch (deprecationMode) { + case "fail": + throw new DeprecationError(message); + case "warn": + console.warn("[WARNING]", message); + break; + } +} +function getPropertyDescriptor(obj, prop) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + if (descriptor) { + return descriptor; + } + const proto = Object.getPrototypeOf(obj); + const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop); + if (prototypeDescriptor) { + return prototypeDescriptor; + } + return {}; +} +const visitedObjects = new Set(); +class DeprecationError extends Error { + constructor(...args) { + super(...args); + Object.defineProperty(this, "name", { + configurable: false, + enumerable: true, + value: "DeprecationError", + writable: false, + }); + } +} +module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_appconfig_alpha_EnvironmentAttributes, _aws_cdk_aws_appconfig_alpha_EnvironmentOptions, _aws_cdk_aws_appconfig_alpha_EnvironmentProps, _aws_cdk_aws_appconfig_alpha_Environment, _aws_cdk_aws_appconfig_alpha_MonitorType, _aws_cdk_aws_appconfig_alpha_Monitor, _aws_cdk_aws_appconfig_alpha_IEnvironment, _aws_cdk_aws_appconfig_alpha_DeploymentStrategyProps, _aws_cdk_aws_appconfig_alpha_DeploymentStrategy, _aws_cdk_aws_appconfig_alpha_GrowthType, _aws_cdk_aws_appconfig_alpha_DeploymentStrategyId, _aws_cdk_aws_appconfig_alpha_RolloutStrategyProps, _aws_cdk_aws_appconfig_alpha_RolloutStrategy, _aws_cdk_aws_appconfig_alpha_IDeploymentStrategy, _aws_cdk_aws_appconfig_alpha_ActionPoint, _aws_cdk_aws_appconfig_alpha_SourceType, _aws_cdk_aws_appconfig_alpha_IEventDestination, _aws_cdk_aws_appconfig_alpha_LambdaDestination, _aws_cdk_aws_appconfig_alpha_SqsDestination, _aws_cdk_aws_appconfig_alpha_SnsDestination, _aws_cdk_aws_appconfig_alpha_EventBridgeDestination, _aws_cdk_aws_appconfig_alpha_ActionProps, _aws_cdk_aws_appconfig_alpha_Action, _aws_cdk_aws_appconfig_alpha_Parameter, _aws_cdk_aws_appconfig_alpha_ExtensionAttributes, _aws_cdk_aws_appconfig_alpha_ExtensionOptions, _aws_cdk_aws_appconfig_alpha_ExtensionProps, _aws_cdk_aws_appconfig_alpha_Extension, _aws_cdk_aws_appconfig_alpha_IExtension, _aws_cdk_aws_appconfig_alpha_ExtensibleBase, _aws_cdk_aws_appconfig_alpha_IExtensible, _aws_cdk_aws_appconfig_alpha_Platform, _aws_cdk_aws_appconfig_alpha_IApplication, _aws_cdk_aws_appconfig_alpha_ApplicationProps, _aws_cdk_aws_appconfig_alpha_Application, _aws_cdk_aws_appconfig_alpha_ConfigurationOptions, _aws_cdk_aws_appconfig_alpha_ConfigurationProps, _aws_cdk_aws_appconfig_alpha_IConfiguration, _aws_cdk_aws_appconfig_alpha_HostedConfigurationOptions, _aws_cdk_aws_appconfig_alpha_HostedConfigurationProps, _aws_cdk_aws_appconfig_alpha_HostedConfiguration, _aws_cdk_aws_appconfig_alpha_SourcedConfigurationOptions, _aws_cdk_aws_appconfig_alpha_SourcedConfigurationProps, _aws_cdk_aws_appconfig_alpha_SourcedConfiguration, _aws_cdk_aws_appconfig_alpha_ConfigurationType, _aws_cdk_aws_appconfig_alpha_ValidatorType, _aws_cdk_aws_appconfig_alpha_ConfigurationSourceType, _aws_cdk_aws_appconfig_alpha_IValidator, _aws_cdk_aws_appconfig_alpha_JsonSchemaValidator, _aws_cdk_aws_appconfig_alpha_LambdaValidator, _aws_cdk_aws_appconfig_alpha_ConfigurationContent, _aws_cdk_aws_appconfig_alpha_ConfigurationSource }; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/application.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/application.d.ts new file mode 100644 index 0000000000000..08ce10f0a0784 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/application.d.ts @@ -0,0 +1,296 @@ +import * as cdk from 'aws-cdk-lib'; +import * as ecs from 'aws-cdk-lib/aws-ecs'; +import { Construct } from 'constructs'; +import { HostedConfiguration, HostedConfigurationOptions, SourcedConfiguration, SourcedConfigurationOptions } from './configuration'; +import { EnvironmentOptions, IEnvironment } from './environment'; +import { ActionPoint, IEventDestination, ExtensionOptions, IExtension, IExtensible, ExtensibleBase } from './extension'; +/** + * Defines the platform for the AWS AppConfig Lambda extension. + */ +export declare enum Platform { + X86_64 = "x86-64", + ARM_64 = "ARM64" +} +export interface IApplication extends cdk.IResource { + /** + * The description of the application. + */ + readonly description?: string; + /** + * The name of the application. + */ + readonly name?: string; + /** + * The ID of the application. + * @attribute + */ + readonly applicationId: string; + /** + * The Amazon Resource Name (ARN) of the application. + * @attribute + */ + readonly applicationArn: string; + /** + * Adds an environment. + * + * @param id The name of the environment construct + * @param options The options for the environment construct + */ + addEnvironment(id: string, options?: EnvironmentOptions): IEnvironment; + /** + * Adds a hosted configuration. + * + * @param id The name of the hosted configuration construct + * @param options The options for the hosted configuration construct + */ + addHostedConfiguration(id: string, options: HostedConfigurationOptions): HostedConfiguration; + /** + * Adds a sourced configuration. + * + * @param id The name of the sourced configuration construct + * @param options The options for the sourced configuration construct + */ + addSourcedConfiguration(id: string, options: SourcedConfigurationOptions): SourcedConfiguration; + /** + * Adds an existing environment. + * + * @param environment The environment + */ + addExistingEnvironment(environment: IEnvironment): void; + /** + * Returns the list of associated environments. + */ + get environments(): IEnvironment[]; + /** + * Adds an extension defined by the action point and event destination + * and also creates an extension association to an application. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the + * provided event destination and also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an extension association to the application. + * + * @param extension The extension to create an association for + */ + addExtension(extension: IExtension): void; +} +/** + * Properties for the Application construct + */ +export interface ApplicationProps { + /** + * The name of the application. + * + * @default - A name is generated. + */ + readonly applicationName?: string; + /** + * The description for the application. + * + * @default - No description. + */ + readonly description?: string; +} +declare abstract class ApplicationBase extends cdk.Resource implements IApplication, IExtensible { + abstract applicationId: string; + abstract applicationArn: string; + private _environments; + protected abstract extensible: ExtensibleBase; + addEnvironment(id: string, options?: EnvironmentOptions): IEnvironment; + addHostedConfiguration(id: string, options: HostedConfigurationOptions): HostedConfiguration; + addSourcedConfiguration(id: string, options: SourcedConfigurationOptions): SourcedConfiguration; + addExistingEnvironment(environment: IEnvironment): void; + get environments(): IEnvironment[]; + /** + * Adds an extension defined by the action point and event destination + * and also creates an extension association to an application. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the + * provided event destination and also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an extension association to the application. + * + * @param extension The extension to create an association for + */ + addExtension(extension: IExtension): void; +} +/** + * An AWS AppConfig application. + * + * @resource AWS::AppConfig::Application + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-application.html + */ +export declare class Application extends ApplicationBase { + /** + * Imports an AWS AppConfig application into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the application construct + * @param applicationArn The Amazon Resource Name (ARN) of the application + */ + static fromApplicationArn(scope: Construct, id: string, applicationArn: string): IApplication; + /** + * Imports an AWS AppConfig application into the CDK using its ID. + * + * @param scope The parent construct + * @param id The name of the application construct + * @param applicationId The ID of the application + */ + static fromApplicationId(scope: Construct, id: string, applicationId: string): IApplication; + /** + * Retrieves the Lambda layer version Amazon Resource Name (ARN) for the AWS AppConfig Lambda extension. + * + * @param region The region for the Lambda layer (for example, 'us-east-1') + * @param platform The platform for the Lambda layer (default is Platform.X86_64) + * @returns Lambda layer version ARN + */ + static getLambdaLayerVersionArn(region: string, platform?: Platform): string; + /** + * Adds the AWS AppConfig Agent as a container to the provided ECS task definition. + * + * @param taskDef The ECS task definition [disable-awslint:ref-via-interface] + */ + static addAgentToEcs(taskDef: ecs.TaskDefinition): void; + /** + * The description of the application. + */ + readonly description?: string; + /** + * The name of the application. + */ + readonly name?: string; + /** + * The ID of the application. + * + * @attribute + */ + readonly applicationId: string; + /** + * The Amazon Resource Name (ARN) of the application. + * + * @attribute + */ + readonly applicationArn: string; + private _application; + protected extensible: ExtensibleBase; + constructor(scope: Construct, id: string, props?: ApplicationProps); +} +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/application.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/application.js new file mode 100644 index 0000000000000..7732e7d8291eb --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/application.js @@ -0,0 +1,353 @@ +"use strict"; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Application = exports.Platform = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +/* eslint-disable @aws-cdk/no-literal-partition */ +const cdk = require("aws-cdk-lib"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_appconfig_1 = require("aws-cdk-lib/aws-appconfig"); +const ecs = require("aws-cdk-lib/aws-ecs"); +const configuration_1 = require("./configuration"); +const environment_1 = require("./environment"); +const extension_1 = require("./extension"); +/** + * Defines the platform for the AWS AppConfig Lambda extension. + */ +var Platform; +(function (Platform) { + Platform["X86_64"] = "x86-64"; + Platform["ARM_64"] = "ARM64"; +})(Platform || (exports.Platform = Platform = {})); +class ApplicationBase extends cdk.Resource { + constructor() { + super(...arguments); + this._environments = []; + } + addEnvironment(id, options = {}) { + return new environment_1.Environment(this, id, { + application: this, + ...options, + }); + } + addHostedConfiguration(id, options) { + return new configuration_1.HostedConfiguration(this, id, { + application: this, + ...options, + }); + } + addSourcedConfiguration(id, options) { + return new configuration_1.SourcedConfiguration(this, id, { + application: this, + ...options, + }); + } + addExistingEnvironment(environment) { + this._environments.push(environment); + } + get environments() { + return this._environments; + } + /** + * Adds an extension defined by the action point and event destination + * and also creates an extension association to an application. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint, eventDestination, options) { + this.extensible.on(actionPoint, eventDestination, options); + } + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the + * provided event destination and also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination, options) { + this.extensible.preCreateHostedConfigurationVersion(eventDestination, options); + } + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination, options) { + this.extensible.preStartDeployment(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination, options) { + this.extensible.onDeploymentStart(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination, options) { + this.extensible.onDeploymentStep(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination, options) { + this.extensible.onDeploymentBaking(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination, options) { + this.extensible.onDeploymentComplete(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and + * also creates an extension association to an application. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination, options) { + this.extensible.onDeploymentRolledBack(eventDestination, options); + } + /** + * Adds an extension association to the application. + * + * @param extension The extension to create an association for + */ + addExtension(extension) { + this.extensible.addExtension(extension); + } +} +/** + * An AWS AppConfig application. + * + * @resource AWS::AppConfig::Application + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-application.html + */ +class Application extends ApplicationBase { + /** + * Imports an AWS AppConfig application into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the application construct + * @param applicationArn The Amazon Resource Name (ARN) of the application + */ + static fromApplicationArn(scope, id, applicationArn) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Application#fromApplicationArn", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromApplicationArn); + } + throw error; + } + const parsedArn = cdk.Stack.of(scope).splitArn(applicationArn, cdk.ArnFormat.SLASH_RESOURCE_NAME); + const applicationId = parsedArn.resourceName; + if (!applicationId) { + throw new Error('Missing required application id from application ARN'); + } + class Import extends ApplicationBase { + constructor() { + super(...arguments); + this.applicationId = applicationId; + this.applicationArn = applicationArn; + this.extensible = new extension_1.ExtensibleBase(scope, this.applicationArn); + } + } + return new Import(scope, id); + } + /** + * Imports an AWS AppConfig application into the CDK using its ID. + * + * @param scope The parent construct + * @param id The name of the application construct + * @param applicationId The ID of the application + */ + static fromApplicationId(scope, id, applicationId) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Application#fromApplicationId", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromApplicationId); + } + throw error; + } + const stack = cdk.Stack.of(scope); + const applicationArn = stack.formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: applicationId, + }); + class Import extends ApplicationBase { + constructor() { + super(...arguments); + this.applicationId = applicationId; + this.applicationArn = applicationArn; + this.extensible = new extension_1.ExtensibleBase(scope, this.applicationArn); + } + } + return new Import(scope, id); + } + /** + * Retrieves the Lambda layer version Amazon Resource Name (ARN) for the AWS AppConfig Lambda extension. + * + * @param region The region for the Lambda layer (for example, 'us-east-1') + * @param platform The platform for the Lambda layer (default is Platform.X86_64) + * @returns Lambda layer version ARN + */ + static getLambdaLayerVersionArn(region, platform) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Application#getLambdaLayerVersionArn", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_Platform(platform); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.getLambdaLayerVersionArn); + } + throw error; + } + return lambdaLayerVersions[platform || Platform.X86_64][region]; + } + /** + * Adds the AWS AppConfig Agent as a container to the provided ECS task definition. + * + * @param taskDef The ECS task definition [disable-awslint:ref-via-interface] + */ + static addAgentToEcs(taskDef) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Application#addAgentToEcs", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.addAgentToEcs); + } + throw error; + } + taskDef.addContainer('AppConfigAgentContainer', { + image: ecs.ContainerImage.fromRegistry('public.ecr.aws/aws-appconfig/aws-appconfig-agent:latest'), + containerName: 'AppConfigAgentContainer', + }); + } + constructor(scope, id, props = {}) { + super(scope, id); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Application", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ApplicationProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Application); + } + throw error; + } + this.description = props.description; + this.name = props.applicationName || aws_cdk_lib_1.Names.uniqueResourceName(this, { + maxLength: 64, + separator: '-', + }); + this._application = new aws_appconfig_1.CfnApplication(this, 'Resource', { + name: this.name, + description: this.description, + }); + this.applicationId = this._application.ref; + this.applicationArn = cdk.Stack.of(this).formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: this.applicationId, + }); + this.extensible = new extension_1.ExtensibleBase(this, this.applicationArn, this.name); + } +} +exports.Application = Application; +_a = JSII_RTTI_SYMBOL_1; +Application[_a] = { fqn: "@aws-cdk/aws-appconfig-alpha.Application", version: "0.0.0" }; +const lambdaLayerVersions = { + [Platform.X86_64]: { + 'us-east-1': 'arn:aws:lambda:us-east-1:027255383542:layer:AWS-AppConfig-Extension:128', + 'us-east-2': 'arn:aws:lambda:us-east-2:728743619870:layer:AWS-AppConfig-Extension:93', + 'us-west-1': 'arn:aws:lambda:us-west-1:958113053741:layer:AWS-AppConfig-Extension:141', + 'us-west-2': 'arn:aws:lambda:us-west-2:359756378197:layer:AWS-AppConfig-Extension:161', + 'ca-central-1': 'arn:aws:lambda:ca-central-1:039592058896:layer:AWS-AppConfig-Extension:93', + 'eu-central-1': 'arn:aws:lambda:eu-central-1:066940009817:layer:AWS-AppConfig-Extension:106', + 'eu-central-2': 'arn:aws:lambda:eu-central-2:758369105281:layer:AWS-AppConfig-Extension:47', + 'eu-west-1': 'arn:aws:lambda:eu-west-1:434848589818:layer:AWS-AppConfig-Extension:125', + 'eu-west-2': 'arn:aws:lambda:eu-west-2:282860088358:layer:AWS-AppConfig-Extension:93', + 'eu-west-3': 'arn:aws:lambda:eu-west-3:493207061005:layer:AWS-AppConfig-Extension:98', + 'eu-north-1': 'arn:aws:lambda:eu-north-1:646970417810:layer:AWS-AppConfig-Extension:159', + 'eu-south-1': 'arn:aws:lambda:eu-south-1:203683718741:layer:AWS-AppConfig-Extension:83', + 'eu-south-2': 'arn:aws:lambda:eu-south-2:586093569114:layer:AWS-AppConfig-Extension:44', + 'cn-north-1': 'arn:aws-cn:lambda:cn-north-1:615057806174:layer:AWS-AppConfig-Extension:76', + 'cn-northwest-1': 'arn:aws-cn:lambda:cn-northwest-1:615084187847:layer:AWS-AppConfig-Extension:76', + 'ap-east-1': 'arn:aws:lambda:ap-east-1:630222743974:layer:AWS-AppConfig-Extension:83', + 'ap-northeast-1': 'arn:aws:lambda:ap-northeast-1:980059726660:layer:AWS-AppConfig-Extension:98', + 'ap-northeast-2': 'arn:aws:lambda:ap-northeast-2:826293736237:layer:AWS-AppConfig-Extension:108', + 'ap-northeast-3': 'arn:aws:lambda:ap-northeast-3:706869817123:layer:AWS-AppConfig-Extension:101', + 'ap-southeast-1': 'arn:aws:lambda:ap-southeast-1:421114256042:layer:AWS-AppConfig-Extension:106', + 'ap-southeast-2': 'arn:aws:lambda:ap-southeast-2:080788657173:layer:AWS-AppConfig-Extension:106', + 'ap-southeast-3': 'arn:aws:lambda:ap-southeast-3:418787028745:layer:AWS-AppConfig-Extension:79', + 'ap-southeast-4': 'arn:aws:lambda:ap-southeast-4:307021474294:layer:AWS-AppConfig-Extension:20', + 'ap-south-1': 'arn:aws:lambda:ap-south-1:554480029851:layer:AWS-AppConfig-Extension:107', + 'ap-south-2': 'arn:aws:lambda:ap-south-2:489524808438:layer:AWS-AppConfig-Extension:47', + 'sa-east-1': 'arn:aws:lambda:sa-east-1:000010852771:layer:AWS-AppConfig-Extension:128', + 'af-south-1': 'arn:aws:lambda:af-south-1:574348263942:layer:AWS-AppConfig-Extension:83', + 'il-central-1': 'arn:aws:lambda:il-central-1:895787185223:layer:AWS-AppConfig-Extension:22', + 'me-central-1': 'arn:aws:lambda:me-central-1:662846165436:layer:AWS-AppConfig-Extension:49', + 'me-south-1': 'arn:aws:lambda:me-south-1:559955524753:layer:AWS-AppConfig-Extension:85', + 'us-gov-east-1': 'arn:aws-us-gov:lambda:us-gov-east-1:946561847325:layer:AWS-AppConfig-Extension:54', + 'us-gov-west-1': 'arn:aws-us-gov:lambda:us-gov-west-1:946746059096:layer:AWS-AppConfig-Extension:54', + }, + [Platform.ARM_64]: { + 'us-east-1': 'arn:aws:lambda:us-east-1:027255383542:layer:AWS-AppConfig-Extension-Arm64:61', + 'us-east-2': 'arn:aws:lambda:us-east-2:728743619870:layer:AWS-AppConfig-Extension-Arm64:45', + 'us-west-1': 'arn:aws:lambda:us-west-1:958113053741:layer:AWS-AppConfig-Extension-Arm64:18', + 'us-west-2': 'arn:aws:lambda:us-west-2:359756378197:layer:AWS-AppConfig-Extension-Arm64:63', + 'ca-central-1': 'arn:aws:lambda:ca-central-1:039592058896:layer:AWS-AppConfig-Extension-Arm64:13', + 'eu-central-1': 'arn:aws:lambda:eu-central-1:066940009817:layer:AWS-AppConfig-Extension-Arm64:49', + 'eu-central-2': 'arn:aws:lambda:eu-central-2:758369105281:layer:AWS-AppConfig-Extension-Arm64:5', + 'eu-west-1': 'arn:aws:lambda:eu-west-1:434848589818:layer:AWS-AppConfig-Extension-Arm64:63', + 'eu-west-2': 'arn:aws:lambda:eu-west-2:282860088358:layer:AWS-AppConfig-Extension-Arm64:45', + 'eu-west-3': 'arn:aws:lambda:eu-west-3:493207061005:layer:AWS-AppConfig-Extension-Arm64:17', + 'eu-north-1': 'arn:aws:lambda:eu-north-1:646970417810:layer:AWS-AppConfig-Extension-Arm64:18', + 'eu-south-1': 'arn:aws:lambda:eu-south-1:203683718741:layer:AWS-AppConfig-Extension-Arm64:11', + 'eu-south-2': 'arn:aws:lambda:eu-south-2:586093569114:layer:AWS-AppConfig-Extension-Arm64:5', + 'ap-east-1': 'arn:aws:lambda:ap-east-1:630222743974:layer:AWS-AppConfig-Extension-Arm64:11', + 'ap-northeast-1': 'arn:aws:lambda:ap-northeast-1:980059726660:layer:AWS-AppConfig-Extension-Arm64:51', + 'ap-northeast-2': 'arn:aws:lambda:ap-northeast-2:826293736237:layer:AWS-AppConfig-Extension-Arm64:16', + 'ap-northeast-3': 'arn:aws:lambda:ap-northeast-3:706869817123:layer:AWS-AppConfig-Extension-Arm64:16', + 'ap-southeast-1': 'arn:aws:lambda:ap-southeast-1:421114256042:layer:AWS-AppConfig-Extension-Arm64:58', + 'ap-southeast-2': 'arn:aws:lambda:ap-southeast-2:080788657173:layer:AWS-AppConfig-Extension-Arm64:49', + 'ap-southeast-3': 'arn:aws:lambda:ap-southeast-3:418787028745:layer:AWS-AppConfig-Extension-Arm64:16', + 'ap-southeast-4': 'arn:aws:lambda:ap-southeast-4:307021474294:layer:AWS-AppConfig-Extension-Arm64:5', + 'ap-south-1': 'arn:aws:lambda:ap-south-1:554480029851:layer:AWS-AppConfig-Extension-Arm64:49', + 'ap-south-2': 'arn:aws:lambda:ap-south-2:489524808438:layer:AWS-AppConfig-Extension-Arm64:5', + 'sa-east-1': 'arn:aws:lambda:sa-east-1:000010852771:layer:AWS-AppConfig-Extension-Arm64:16', + 'af-south-1': 'arn:aws:lambda:af-south-1:574348263942:layer:AWS-AppConfig-Extension-Arm64:11', + 'me-central-1': 'arn:aws:lambda:me-central-1:662846165436:layer:AWS-AppConfig-Extension-Arm64:5', + 'me-south-1': 'arn:aws:lambda:me-south-1:559955524753:layer:AWS-AppConfig-Extension-Arm64:13', + 'il-central-1': 'arn:aws:lambda:il-central-1:895787185223:layer:AWS-AppConfig-Extension-Arm64:5', + }, +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBa0Q7QUFDbEQsbUNBQW1DO0FBQ25DLDZDQUFvQztBQUNwQyw2REFBMkQ7QUFDM0QsMkNBQTJDO0FBRTNDLG1EQUFxSTtBQUNySSwrQ0FBOEU7QUFDOUUsMkNBQXdIO0FBRXhIOztHQUVHO0FBQ0gsSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLDZCQUFpQixDQUFBO0lBQ2pCLDRCQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFIVyxRQUFRLHdCQUFSLFFBQVEsUUFHbkI7QUFnS0QsTUFBZSxlQUFnQixTQUFRLEdBQUcsQ0FBQyxRQUFRO0lBQW5EOztRQUdVLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQWlJN0MsQ0FBQztJQTlIUSxjQUFjLENBQUMsRUFBVSxFQUFFLFVBQThCLEVBQUU7UUFDaEUsT0FBTyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUMvQixXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7S0FDSjtJQUVNLHNCQUFzQixDQUFDLEVBQVUsRUFBRSxPQUFtQztRQUMzRSxPQUFPLElBQUksbUNBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN2QyxXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7S0FDSjtJQUVNLHVCQUF1QixDQUFDLEVBQVUsRUFBRSxPQUFvQztRQUM3RSxPQUFPLElBQUksb0NBQW9CLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN4QyxXQUFXLEVBQUUsSUFBSTtZQUNqQixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7S0FDSjtJQUVNLHNCQUFzQixDQUFDLFdBQXlCO1FBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxD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RUFBRSw4RUFBOEU7UUFDM0YsZ0JBQWdCLEVBQUUsbUZBQW1GO1FBQ3JHLGdCQUFnQixFQUFFLG1GQUFtRjtRQUNyRyxnQkFBZ0IsRUFBRSxtRkFBbUY7UUFDckcsZ0JBQWdCLEVBQUUsbUZBQW1GO1FBQ3JHLGdCQUFnQixFQUFFLG1GQUFtRjtRQUNyRyxnQkFBZ0IsRUFBRSxtRkFBbUY7UUFDckcsZ0JBQWdCLEVBQUUsa0ZBQWtGO1FBQ3BHLFlBQVksRUFBRSwrRUFBK0U7UUFDN0YsWUFBWSxFQUFFLDhFQUE4RTtRQUM1RixXQUFXLEVBQUUsOEVBQThFO1FBQzNGLFlBQVksRUFBRSwrRUFBK0U7UUFDN0YsY0FBYyxFQUFFLGdGQUFnRjtRQUNoRyxZQUFZLEVBQUUsK0VBQStFO1FBQzdGLGNBQWMsRUFBRSxnRkFBZ0Y7S0FDakc7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGF3cy1jZGsvbm8tbGl0ZXJhbC1wYXJ0aXRpb24gKi9cbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBOYW1lcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENmbkFwcGxpY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwcGNvbmZpZyc7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEhvc3RlZENvbmZpZ3VyYXRpb24sIEhvc3RlZENvbmZpZ3VyYXRpb25PcHRpb25zLCBTb3VyY2VkQ29uZmlndXJhdGlvbiwgU291cmNlZENvbmZpZ3VyYXRpb25PcHRpb25zIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFbnZpcm9ubWVudE9wdGlvbnMsIElFbnZpcm9ubWVudCB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQWN0aW9uUG9pbnQsIElFdmVudERlc3RpbmF0aW9uLCBFeHRlbnNpb25PcHRpb25zLCBJRXh0ZW5zaW9uLCBJRXh0ZW5zaWJsZSwgRXh0ZW5zaWJsZUJhc2UgfSBmcm9tICcuL2V4dGVuc2lvbic7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcGxhdGZvcm0gZm9yIHRoZSBBV1MgQXBwQ29uZmlnIExhbWJkYSBleHRlbnNpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgWDg2XzY0ID0gJ3g4Ni02NCcsXG4gIEFSTV82NCA9ICdBUk02NCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uIGV4dGVuZHMgY2RrLklSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGlkIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBlbnZpcm9ubWVudCBjb25zdHJ1Y3RcbiAgICovXG4gIGFkZEVudmlyb25tZW50KGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBFbnZpcm9ubWVudE9wdGlvbnMpOiBJRW52aXJvbm1lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBob3N0ZWQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlkIFRoZSBuYW1lIG9mIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiBjb25zdHJ1Y3RcbiAgICovXG4gIGFkZEhvc3RlZENvbmZpZ3VyYXRpb24oaWQ6IHN0cmluZywgb3B0aW9uczogSG9zdGVkQ29uZmlndXJhdGlvbk9wdGlvbnMpOiBIb3N0ZWRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc291cmNlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIHNvdXJjZWQgY29uZmlndXJhdGlvbiBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBzb3VyY2VkIGNvbmZpZ3VyYXRpb24gY29uc3RydWN0XG4gICAqL1xuICBhZGRTb3VyY2VkQ29uZmlndXJhdGlvbihpZDogc3RyaW5nLCBvcHRpb25zOiBTb3VyY2VkQ29uZmlndXJhdGlvbk9wdGlvbnMpOiBTb3VyY2VkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQWRkcyBhbiBleGlzdGluZyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudFxuICAgKi9cbiAgYWRkRXhpc3RpbmdFbnZpcm9ubWVudChlbnZpcm9ubWVudDogSUVudmlyb25tZW50KTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhc3NvY2lhdGVkIGVudmlyb25tZW50cy5cbiAgICovXG4gIGdldCBlbnZpcm9ubWVudHMoKTogSUVudmlyb25tZW50W107XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgYnkgdGhlIGFjdGlvbiBwb2ludCBhbmQgZXZlbnQgZGVzdGluYXRpb25cbiAgICogYW5kIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25Qb2ludCBUaGUgYWN0aW9uIHBvaW50IHdoaWNoIHRyaWdnZXJzIHRoZSBldmVudFxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb24oYWN0aW9uUG9pbnQ6IEFjdGlvblBvaW50LCBldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgUFJFX0NSRUFURV9IT1NURURfQ09ORklHVVJBVElPTl9WRVJTSU9OIGV4dGVuc2lvbiB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmQgYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byBhbiBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHByZUNyZWF0ZUhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfU1RBUlRfREVQTE9ZTUVOVCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwcmVTdGFydERlcGxveW1lbnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9TVEFSVCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbkRlcGxveW1lbnRTdGFydChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfU1RFUCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbkRlcGxveW1lbnRTdGVwKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9CQUtJTkcgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50QmFraW5nKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9DT01QTEVURSBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbkRlcGxveW1lbnRDb21wbGV0ZShldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfUk9MTEVEX0JBQ0sgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50Um9sbGVkQmFjayhldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGV4dGVuc2lvbiB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gZm9yXG4gICAqL1xuICBhZGRFeHRlbnNpb24oZXh0ZW5zaW9uOiBJRXh0ZW5zaW9uKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgQXBwbGljYXRpb24gY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuYW1lIGlzIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb24uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuYWJzdHJhY3QgY2xhc3MgQXBwbGljYXRpb25CYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uLCBJRXh0ZW5zaWJsZSB7XG4gIHB1YmxpYyBhYnN0cmFjdCBhcHBsaWNhdGlvbklkOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCBhcHBsaWNhdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIF9lbnZpcm9ubWVudHM6IElFbnZpcm9ubWVudFtdID0gW107XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBleHRlbnNpYmxlOiBFeHRlbnNpYmxlQmFzZTtcblxuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQoaWQ6IHN0cmluZywgb3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25zID0ge30pOiBJRW52aXJvbm1lbnQge1xuICAgIHJldHVybiBuZXcgRW52aXJvbm1lbnQodGhpcywgaWQsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRIb3N0ZWRDb25maWd1cmF0aW9uKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEhvc3RlZENvbmZpZ3VyYXRpb25PcHRpb25zKTogSG9zdGVkQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHRoaXMsIGlkLCB7XG4gICAgICBhcHBsaWNhdGlvbjogdGhpcyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkU291cmNlZENvbmZpZ3VyYXRpb24oaWQ6IHN0cmluZywgb3B0aW9uczogU291cmNlZENvbmZpZ3VyYXRpb25PcHRpb25zKTogU291cmNlZENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgU291cmNlZENvbmZpZ3VyYXRpb24odGhpcywgaWQsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiB0aGlzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFeGlzdGluZ0Vudmlyb25tZW50KGVudmlyb25tZW50OiBJRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9lbnZpcm9ubWVudHMucHVzaChlbnZpcm9ubWVudCk7XG4gIH1cblxuICBnZXQgZW52aXJvbm1lbnRzKCk6IElFbnZpcm9ubWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZW52aXJvbm1lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgYnkgdGhlIGFjdGlvbiBwb2ludCBhbmQgZXZlbnQgZGVzdGluYXRpb25cbiAgICogYW5kIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25Qb2ludCBUaGUgYWN0aW9uIHBvaW50IHdoaWNoIHRyaWdnZXJzIHRoZSBldmVudFxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIG9uKGFjdGlvblBvaW50OiBBY3Rpb25Qb2ludCwgZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uKGFjdGlvblBvaW50LCBldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgUFJFX0NSRUFURV9IT1NURURfQ09ORklHVVJBVElPTl9WRVJTSU9OIGV4dGVuc2lvbiB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmQgYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byBhbiBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBwcmVDcmVhdGVIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbihldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2libGUucHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24oZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIFBSRV9TVEFSVF9ERVBMT1lNRU5UIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byBhbiBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBwcmVTdGFydERlcGxveW1lbnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLnByZVN0YXJ0RGVwbG95bWVudChldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfU1RBUlQgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIG9uRGVwbG95bWVudFN0YXJ0KGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5vbkRlcGxveW1lbnRTdGFydChldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfU1RFUCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gYW4gYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgb25EZXBsb3ltZW50U3RlcChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2libGUub25EZXBsb3ltZW50U3RlcChldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfQkFLSU5HIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byBhbiBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBvbkRlcGxveW1lbnRCYWtpbmcoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudEJha2luZyhldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfQ09NUExFVEUgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIG9uRGVwbG95bWVudENvbXBsZXRlKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5vbkRlcGxveW1lbnRDb21wbGV0ZShldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfUk9MTEVEX0JBQ0sgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIG9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIGZvclxuICAgKi9cbiAgcHVibGljIGFkZEV4dGVuc2lvbihleHRlbnNpb246IElFeHRlbnNpb24pIHtcbiAgICB0aGlzLmV4dGVuc2libGUuYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBBV1MgQXBwQ29uZmlnIGFwcGxpY2F0aW9uLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb25cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwcGNvbmZpZy9sYXRlc3QvdXNlcmd1aWRlL2FwcGNvbmZpZy1jcmVhdGluZy1hcHBsaWNhdGlvbi5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIEFXUyBBcHBDb25maWcgYXBwbGljYXRpb24gaW50byB0aGUgQ0RLIHVzaW5nIGl0cyBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gY29uc3RydWN0XG4gICAqIEBwYXJhbSBhcHBsaWNhdGlvbkFybiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcHBsaWNhdGlvbkFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhcHBsaWNhdGlvbkFybjogc3RyaW5nKTogSUFwcGxpY2F0aW9uIHtcbiAgICBjb25zdCBwYXJzZWRBcm4gPSBjZGsuU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKGFwcGxpY2F0aW9uQXJuLCBjZGsuQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpO1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBwYXJzZWRBcm4ucmVzb3VyY2VOYW1lO1xuICAgIGlmICghYXBwbGljYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFwcGxpY2F0aW9uIGlkIGZyb20gYXBwbGljYXRpb24gQVJOJyk7XG4gICAgfVxuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXBwbGljYXRpb25CYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBsaWNhdGlvbklkID0gYXBwbGljYXRpb25JZCE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXBwbGljYXRpb25Bcm4gPSBhcHBsaWNhdGlvbkFybjtcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBleHRlbnNpYmxlID0gbmV3IEV4dGVuc2libGVCYXNlKHNjb3BlLCB0aGlzLmFwcGxpY2F0aW9uQXJuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gQVdTIEFwcENvbmZpZyBhcHBsaWNhdGlvbiBpbnRvIHRoZSBDREsgdXNpbmcgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGFwcGxpY2F0aW9uSWQgVGhlIElEIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXBwbGljYXRpb25JZChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhcHBsaWNhdGlvbklkOiBzdHJpbmcpOiBJQXBwbGljYXRpb24ge1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHNjb3BlKTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbkFybiA9IHN0YWNrLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnYXBwY29uZmlnJyxcbiAgICAgIHJlc291cmNlOiAnYXBwbGljYXRpb24nLFxuICAgICAgcmVzb3VyY2VOYW1lOiBhcHBsaWNhdGlvbklkLFxuICAgIH0pO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXBwbGljYXRpb25CYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBsaWNhdGlvbklkID0gYXBwbGljYXRpb25JZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBsaWNhdGlvbkFybiA9IGFwcGxpY2F0aW9uQXJuO1xuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4dGVuc2libGUgPSBuZXcgRXh0ZW5zaWJsZUJhc2Uoc2NvcGUsIHRoaXMuYXBwbGljYXRpb25Bcm4pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBMYW1iZGEgbGF5ZXIgdmVyc2lvbiBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBmb3IgdGhlIEFXUyBBcHBDb25maWcgTGFtYmRhIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uIGZvciB0aGUgTGFtYmRhIGxheWVyIChmb3IgZXhhbXBsZSwgJ3VzLWVhc3QtMScpXG4gICAqIEBwYXJhbSBwbGF0Zm9ybSBUaGUgcGxhdGZvcm0gZm9yIHRoZSBMYW1iZGEgbGF5ZXIgKGRlZmF1bHQgaXMgUGxhdGZvcm0uWDg2XzY0KVxuICAgKiBAcmV0dXJucyBMYW1iZGEgbGF5ZXIgdmVyc2lvbiBBUk5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFtYmRhTGF5ZXJWZXJzaW9uQXJuKHJlZ2lvbjogc3RyaW5nLCBwbGF0Zm9ybT86IFBsYXRmb3JtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGFtYmRhTGF5ZXJWZXJzaW9uc1twbGF0Zm9ybSB8fCBQbGF0Zm9ybS5YODZfNjRdW3JlZ2lvbl07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgQVdTIEFwcENvbmZpZyBBZ2VudCBhcyBhIGNvbnRhaW5lciB0byB0aGUgcHJvdmlkZWQgRUNTIHRhc2sgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRhc2tEZWYgVGhlIEVDUyB0YXNrIGRlZmluaXRpb24gW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkQWdlbnRUb0Vjcyh0YXNrRGVmOiBlY3MuVGFza0RlZmluaXRpb24pIHtcbiAgICB0YXNrRGVmLmFkZENvbnRhaW5lcignQXBwQ29uZmlnQWdlbnRDb250YWluZXInLCB7XG4gICAgICBpbWFnZTogZWNzLkNvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeSgncHVibGljLmVjci5hd3MvYXdzLWFwcGNvbmZpZy9hd3MtYXBwY29uZmlnLWFnZW50OmxhdGVzdCcpLFxuICAgICAgY29udGFpbmVyTmFtZTogJ0FwcENvbmZpZ0FnZW50Q29udGFpbmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uQXJuOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYXBwbGljYXRpb246IENmbkFwcGxpY2F0aW9uO1xuICBwcm90ZWN0ZWQgZXh0ZW5zaWJsZTogRXh0ZW5zaWJsZUJhc2U7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFwcGxpY2F0aW9uUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5uYW1lID0gcHJvcHMuYXBwbGljYXRpb25OYW1lIHx8IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9hcHBsaWNhdGlvbiA9IG5ldyBDZm5BcHBsaWNhdGlvbih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSB0aGlzLl9hcHBsaWNhdGlvbi5yZWY7XG4gICAgdGhpcy5hcHBsaWNhdGlvbkFybiA9IGNkay5TdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgIHJlc291cmNlTmFtZTogdGhpcy5hcHBsaWNhdGlvbklkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5leHRlbnNpYmxlID0gbmV3IEV4dGVuc2libGVCYXNlKHRoaXMsIHRoaXMuYXBwbGljYXRpb25Bcm4sIHRoaXMubmFtZSk7XG4gIH1cbn1cblxuY29uc3QgbGFtYmRhTGF5ZXJWZXJzaW9uczoge1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9fSA9IHtcbiAgW1BsYXRmb3JtLlg4Nl82NF06IHtcbiAgICAndXMtZWFzdC0xJzogJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMTowMjcyNTUzODM1NDI6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTI4JyxcbiAgICAndXMtZWFzdC0yJzogJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMjo3Mjg3NDM2MTk4NzA6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246OTMnLFxuICAgICd1cy13ZXN0LTEnOiAnYXJuOmF3czpsYW1iZGE6dXMtd2VzdC0xOjk1ODExMzA1Mzc0MTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjoxNDEnLFxuICAgICd1cy13ZXN0LTInOiAnYXJuOmF3czpsYW1iZGE6dXMtd2VzdC0yOjM1OTc1NjM3ODE5NzpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjoxNjEnLFxuICAgICdjYS1jZW50cmFsLTEnOiAnYXJuOmF3czpsYW1iZGE6Y2EtY2VudHJhbC0xOjAzOTU5MjA1ODg5NjpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjo5MycsXG4gICAgJ2V1LWNlbnRyYWwtMSc6ICdhcm46YXdzOmxhbWJkYTpldS1jZW50cmFsLTE6MDY2OTQwMDA5ODE3OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjEwNicsXG4gICAgJ2V1LWNlbnRyYWwtMic6ICdhcm46YXdzOmxhbWJkYTpldS1jZW50cmFsLTI6NzU4MzY5MTA1MjgxOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjQ3JyxcbiAgICAnZXUtd2VzdC0xJzogJ2Fybjphd3M6bGFtYmRhOmV1LXdlc3QtMTo0MzQ4NDg1ODk4MTg6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTI1JyxcbiAgICAnZXUtd2VzdC0yJzogJ2Fybjphd3M6bGFtYmRhOmV1LXdlc3QtMjoyODI4NjAwODgzNTg6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246OTMnLFxuICAgICdldS13ZXN0LTMnOiAnYXJuOmF3czpsYW1iZGE6ZXUtd2VzdC0zOjQ5MzIwNzA2MTAwNTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjo5OCcsXG4gICAgJ2V1LW5vcnRoLTEnOiAnYXJuOmF3czpsYW1iZGE6ZXUtbm9ydGgtMTo2NDY5NzA0MTc4MTA6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTU5JyxcbiAgICAnZXUtc291dGgtMSc6ICdhcm46YXdzOmxhbWJkYTpldS1zb3V0aC0xOjIwMzY4MzcxODc0MTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjo4MycsXG4gICAgJ2V1LXNvdXRoLTInOiAnYXJuOmF3czpsYW1iZGE6ZXUtc291dGgtMjo1ODYwOTM1NjkxMTQ6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246NDQnLFxuICAgICdjbi1ub3J0aC0xJzogJ2Fybjphd3MtY246bGFtYmRhOmNuLW5vcnRoLTE6NjE1MDU3ODA2MTc0OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjc2JyxcbiAgICAnY24tbm9ydGh3ZXN0LTEnOiAnYXJuOmF3cy1jbjpsYW1iZGE6Y24tbm9ydGh3ZXN0LTE6NjE1MDg0MTg3ODQ3OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjc2JyxcbiAgICAnYXAtZWFzdC0xJzogJ2Fybjphd3M6bGFtYmRhOmFwLWVhc3QtMTo2MzAyMjI3NDM5NzQ6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246ODMnLFxuICAgICdhcC1ub3J0aGVhc3QtMSc6ICdhcm46YXdzOmxhbWJkYTphcC1ub3J0aGVhc3QtMTo5ODAwNTk3MjY2NjA6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246OTgnLFxuICAgICdhcC1ub3J0aGVhc3QtMic6ICdhcm46YXdzOmxhbWJkYTphcC1ub3J0aGVhc3QtMjo4MjYyOTM3MzYyMzc6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTA4JyxcbiAgICAnYXAtbm9ydGhlYXN0LTMnOiAnYXJuOmF3czpsYW1iZGE6YXAtbm9ydGhlYXN0LTM6NzA2ODY5ODE3MTIzOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjEwMScsXG4gICAgJ2FwLXNvdXRoZWFzdC0xJzogJ2Fybjphd3M6bGFtYmRhOmFwLXNvdXRoZWFzdC0xOjQyMTExNDI1NjA0MjpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjoxMDYnLFxuICAgICdhcC1zb3V0aGVhc3QtMic6ICdhcm46YXdzOmxhbWJkYTphcC1zb3V0aGVhc3QtMjowODA3ODg2NTcxNzM6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTA2JyxcbiAgICAnYXAtc291dGhlYXN0LTMnOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTM6NDE4Nzg3MDI4NzQ1OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjc5JyxcbiAgICAnYXAtc291dGhlYXN0LTQnOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTQ6MzA3MDIxNDc0Mjk0OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjIwJyxcbiAgICAnYXAtc291dGgtMSc6ICdhcm46YXdzOmxhbWJkYTphcC1zb3V0aC0xOjU1NDQ4MDAyOTg1MTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjoxMDcnLFxuICAgICdhcC1zb3V0aC0yJzogJ2Fybjphd3M6bGFtYmRhOmFwLXNvdXRoLTI6NDg5NTI0ODA4NDM4OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjQ3JyxcbiAgICAnc2EtZWFzdC0xJzogJ2Fybjphd3M6bGFtYmRhOnNhLWVhc3QtMTowMDAwMTA4NTI3NzE6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246MTI4JyxcbiAgICAnYWYtc291dGgtMSc6ICdhcm46YXdzOmxhbWJkYTphZi1zb3V0aC0xOjU3NDM0ODI2Mzk0MjpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjo4MycsXG4gICAgJ2lsLWNlbnRyYWwtMSc6ICdhcm46YXdzOmxhbWJkYTppbC1jZW50cmFsLTE6ODk1Nzg3MTg1MjIzOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjIyJyxcbiAgICAnbWUtY2VudHJhbC0xJzogJ2Fybjphd3M6bGFtYmRhOm1lLWNlbnRyYWwtMTo2NjI4NDYxNjU0MzY6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246NDknLFxuICAgICdtZS1zb3V0aC0xJzogJ2Fybjphd3M6bGFtYmRhOm1lLXNvdXRoLTE6NTU5OTU1NTI0NzUzOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjg1JyxcbiAgICAndXMtZ292LWVhc3QtMSc6ICdhcm46YXdzLXVzLWdvdjpsYW1iZGE6dXMtZ292LWVhc3QtMTo5NDY1NjE4NDczMjU6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb246NTQnLFxuICAgICd1cy1nb3Ytd2VzdC0xJzogJ2Fybjphd3MtdXMtZ292OmxhbWJkYTp1cy1nb3Ytd2VzdC0xOjk0Njc0NjA1OTA5NjpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbjo1NCcsXG4gIH0sXG4gIFtQbGF0Zm9ybS5BUk1fNjRdOiB7XG4gICAgJ3VzLWVhc3QtMSc6ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MDI3MjU1MzgzNTQyOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjYxJyxcbiAgICAndXMtZWFzdC0yJzogJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMjo3Mjg3NDM2MTk4NzA6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6NDUnLFxuICAgICd1cy13ZXN0LTEnOiAnYXJuOmF3czpsYW1iZGE6dXMtd2VzdC0xOjk1ODExMzA1Mzc0MTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDoxOCcsXG4gICAgJ3VzLXdlc3QtMic6ICdhcm46YXdzOmxhbWJkYTp1cy13ZXN0LTI6MzU5NzU2Mzc4MTk3OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjYzJyxcbiAgICAnY2EtY2VudHJhbC0xJzogJ2Fybjphd3M6bGFtYmRhOmNhLWNlbnRyYWwtMTowMzk1OTIwNTg4OTY6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6MTMnLFxuICAgICdldS1jZW50cmFsLTEnOiAnYXJuOmF3czpsYW1iZGE6ZXUtY2VudHJhbC0xOjA2Njk0MDAwOTgxNzpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDo0OScsXG4gICAgJ2V1LWNlbnRyYWwtMic6ICdhcm46YXdzOmxhbWJkYTpldS1jZW50cmFsLTI6NzU4MzY5MTA1MjgxOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjUnLFxuICAgICdldS13ZXN0LTEnOiAnYXJuOmF3czpsYW1iZGE6ZXUtd2VzdC0xOjQzNDg0ODU4OTgxODpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDo2MycsXG4gICAgJ2V1LXdlc3QtMic6ICdhcm46YXdzOmxhbWJkYTpldS13ZXN0LTI6MjgyODYwMDg4MzU4OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjQ1JyxcbiAgICAnZXUtd2VzdC0zJzogJ2Fybjphd3M6bGFtYmRhOmV1LXdlc3QtMzo0OTMyMDcwNjEwMDU6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6MTcnLFxuICAgICdldS1ub3J0aC0xJzogJ2Fybjphd3M6bGFtYmRhOmV1LW5vcnRoLTE6NjQ2OTcwNDE3ODEwOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjE4JyxcbiAgICAnZXUtc291dGgtMSc6ICdhcm46YXdzOmxhbWJkYTpldS1zb3V0aC0xOjIwMzY4MzcxODc0MTpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDoxMScsXG4gICAgJ2V1LXNvdXRoLTInOiAnYXJuOmF3czpsYW1iZGE6ZXUtc291dGgtMjo1ODYwOTM1NjkxMTQ6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6NScsXG4gICAgJ2FwLWVhc3QtMSc6ICdhcm46YXdzOmxhbWJkYTphcC1lYXN0LTE6NjMwMjIyNzQzOTc0OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjExJyxcbiAgICAnYXAtbm9ydGhlYXN0LTEnOiAnYXJuOmF3czpsYW1iZGE6YXAtbm9ydGhlYXN0LTE6OTgwMDU5NzI2NjYwOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjUxJyxcbiAgICAnYXAtbm9ydGhlYXN0LTInOiAnYXJuOmF3czpsYW1iZGE6YXAtbm9ydGhlYXN0LTI6ODI2MjkzNzM2MjM3OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjE2JyxcbiAgICAnYXAtbm9ydGhlYXN0LTMnOiAnYXJuOmF3czpsYW1iZGE6YXAtbm9ydGhlYXN0LTM6NzA2ODY5ODE3MTIzOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjE2JyxcbiAgICAnYXAtc291dGhlYXN0LTEnOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTE6NDIxMTE0MjU2MDQyOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjU4JyxcbiAgICAnYXAtc291dGhlYXN0LTInOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTI6MDgwNzg4NjU3MTczOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjQ5JyxcbiAgICAnYXAtc291dGhlYXN0LTMnOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTM6NDE4Nzg3MDI4NzQ1OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjE2JyxcbiAgICAnYXAtc291dGhlYXN0LTQnOiAnYXJuOmF3czpsYW1iZGE6YXAtc291dGhlYXN0LTQ6MzA3MDIxNDc0Mjk0OmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjUnLFxuICAgICdhcC1zb3V0aC0xJzogJ2Fybjphd3M6bGFtYmRhOmFwLXNvdXRoLTE6NTU0NDgwMDI5ODUxOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjQ5JyxcbiAgICAnYXAtc291dGgtMic6ICdhcm46YXdzOmxhbWJkYTphcC1zb3V0aC0yOjQ4OTUyNDgwODQzODpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDo1JyxcbiAgICAnc2EtZWFzdC0xJzogJ2Fybjphd3M6bGFtYmRhOnNhLWVhc3QtMTowMDAwMTA4NTI3NzE6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6MTYnLFxuICAgICdhZi1zb3V0aC0xJzogJ2Fybjphd3M6bGFtYmRhOmFmLXNvdXRoLTE6NTc0MzQ4MjYzOTQyOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uLUFybTY0OjExJyxcbiAgICAnbWUtY2VudHJhbC0xJzogJ2Fybjphd3M6bGFtYmRhOm1lLWNlbnRyYWwtMTo2NjI4NDYxNjU0MzY6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6NScsXG4gICAgJ21lLXNvdXRoLTEnOiAnYXJuOmF3czpsYW1iZGE6bWUtc291dGgtMTo1NTk5NTU1MjQ3NTM6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6MTMnLFxuICAgICdpbC1jZW50cmFsLTEnOiAnYXJuOmF3czpsYW1iZGE6aWwtY2VudHJhbC0xOjg5NTc4NzE4NTIyMzpsYXllcjpBV1MtQXBwQ29uZmlnLUV4dGVuc2lvbi1Bcm02NDo1JyxcbiAgfSxcbn07Il19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.d.ts new file mode 100644 index 0000000000000..8553a802164b0 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.d.ts @@ -0,0 +1,579 @@ +import * as cp from 'aws-cdk-lib/aws-codepipeline'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as kms from 'aws-cdk-lib/aws-kms'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as sm from 'aws-cdk-lib/aws-secretsmanager'; +import * as ssm from 'aws-cdk-lib/aws-ssm'; +import { Construct, IConstruct } from 'constructs'; +import { IApplication } from './application'; +import { IDeploymentStrategy } from './deployment-strategy'; +import { IEnvironment } from './environment'; +import { ActionPoint, IEventDestination, ExtensionOptions, IExtension, IExtensible, ExtensibleBase } from './extension'; +/** + * Options for the Configuration construct + */ +export interface ConfigurationOptions { + /** + * The deployment strategy for the configuration. + * + * @default - A deployment strategy with the rollout strategy set to + * RolloutStrategy.CANARY_10_PERCENT_20_MINUTES + */ + readonly deploymentStrategy?: IDeploymentStrategy; + /** + * The name of the configuration. + * + * @default - A name is generated. + */ + readonly name?: string; + /** + * The validators for the configuration. + * + * @default - No validators. + */ + readonly validators?: IValidator[]; + /** + * The description of the configuration. + * + * @default - No description. + */ + readonly description?: string; + /** + * The type of configuration. + * + * @default ConfigurationType.FREEFORM + */ + readonly type?: ConfigurationType; + /** + * The list of environments to deploy the configuration to. + * + * If this parameter is not specified, then there will be no + * deployment. + * + * @default - None. + */ + readonly deployTo?: IEnvironment[]; + /** + * The deployment key of the configuration. + * + * @default - None. + */ + readonly deploymentKey?: kms.IKey; +} +/** + * Properties for the Configuration construct. + */ +export interface ConfigurationProps extends ConfigurationOptions { + /** + * The application associated with the configuration. + */ + readonly application: IApplication; +} +export interface IConfiguration extends IConstruct { + /** + * The deployment strategy for the configuration. + */ + readonly deploymentStrategy?: IDeploymentStrategy; + /** + * The configuration version number. + */ + readonly versionNumber?: string; + /** + * The application associated with the configuration. + */ + readonly application: IApplication; + /** + * The name of the configuration. + */ + readonly name?: string; + /** + * The validators for the configuration. + */ + readonly validators?: IValidator[]; + /** + * The description of the configuration. + */ + readonly description?: string; + /** + * The configuration type. + */ + readonly type?: ConfigurationType; + /** + * The environments to deploy to. + */ + readonly deployTo?: IEnvironment[]; + /** + * The deployment key for the configuration. + */ + readonly deploymentKey?: kms.IKey; + /** + * The ID of the configuration profile. + */ + readonly configurationProfileId: string; +} +declare abstract class ConfigurationBase extends Construct implements IConfiguration, IExtensible { + abstract readonly versionNumber?: string; + abstract readonly configurationProfileId: string; + /** + * The application associated with the configuration. + */ + readonly application: IApplication; + /** + * The environments to deploy to. + */ + readonly deployTo?: IEnvironment[]; + /** + * The name of the configuration. + */ + readonly name?: string; + /** + * The validators for the configuration. + */ + readonly validators?: IValidator[]; + /** + * The description of the configuration. + */ + readonly description?: string; + /** + * The configuration type. + */ + readonly type?: ConfigurationType; + /** + * The deployment key for the configuration. + */ + readonly deploymentKey?: kms.IKey; + /** + * The deployment strategy for the configuration. + */ + readonly deploymentStrategy?: IDeploymentStrategy; + protected applicationId: string; + protected extensible: ExtensibleBase; + constructor(scope: Construct, id: string, props: ConfigurationProps); + /** + * Adds an extension defined by the action point and event destination + * and also creates an extension association to the configuration profile. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the + * provided event destination and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an extension association to the configuration profile. + * + * @param extension The extension to create an association for + */ + addExtension(extension: IExtension): void; + /** + * Deploys the configuration to the specified environment. + * + * @param environment The environment to deploy the configuration to + * @deprecated Use `deployTo` as a property instead. We do not recommend + * creating resources in multiple stacks. If you want to do this still, + * please take a look into https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appconfig.CfnDeployment.html. + */ + deploy(environment: IEnvironment): void; + protected addExistingEnvironmentsToApplication(): void; + protected deployConfigToEnvironments(): void; +} +/** + * Options for HostedConfiguration + */ +export interface HostedConfigurationOptions extends ConfigurationOptions { + /** + * The content of the hosted configuration. + */ + readonly content: ConfigurationContent; + /** + * The latest version number of the hosted configuration. + * + * @default - None. + */ + readonly latestVersionNumber?: number; + /** + * The version label of the hosted configuration. + * + * @default - None. + */ + readonly versionLabel?: string; +} +/** + * Properties for HostedConfiguration + */ +export interface HostedConfigurationProps extends ConfigurationProps { + /** + * The content of the hosted configuration. + */ + readonly content: ConfigurationContent; + /** + * The latest version number of the hosted configuration. + * + * @default - None. + */ + readonly latestVersionNumber?: number; + /** + * The version label of the hosted configuration. + * + * @default - None. + */ + readonly versionLabel?: string; +} +/** + * A hosted configuration represents configuration stored in the AWS AppConfig hosted configuration store. + */ +export declare class HostedConfiguration extends ConfigurationBase { + /** + * The content of the hosted configuration. + */ + readonly content: string; + /** + * The content type of the hosted configuration. + */ + readonly contentType?: string; + /** + * The latest version number of the hosted configuration. + */ + readonly latestVersionNumber?: number; + /** + * The version label of the hosted configuration. + */ + readonly versionLabel?: string; + /** + * The version number of the hosted configuration. + */ + readonly versionNumber?: string; + /** + * The Amazon Resource Name (ARN) of the hosted configuration version. + */ + readonly hostedConfigurationVersionArn: string; + /** + * The ID of the configuration profile. + */ + readonly configurationProfileId: string; + /** + * The Amazon Resource Name (ARN) of the configuration profile. + */ + readonly configurationProfileArn: string; + private readonly _cfnConfigurationProfile; + private readonly _cfnHostedConfigurationVersion; + constructor(scope: Construct, id: string, props: HostedConfigurationProps); +} +/** + * Options for SourcedConfiguration + */ +export interface SourcedConfigurationOptions extends ConfigurationOptions { + /** + * The location where the configuration is stored. + */ + readonly location: ConfigurationSource; + /** + * The version number of the sourced configuration to deploy. If this is not specified, + * then there will be no deployment. + * + * @default - None. + */ + readonly versionNumber?: string; + /** + * The IAM role to retrieve the configuration. + * + * @default - A role is generated. + */ + readonly retrievalRole?: iam.IRole; +} +/** + * Properties for SourcedConfiguration. + */ +export interface SourcedConfigurationProps extends ConfigurationProps { + /** + * The location where the configuration is stored. + */ + readonly location: ConfigurationSource; + /** + * The version number of the sourced configuration to deploy. If this is not specified, + * then there will be no deployment. + * + * @default - None. + */ + readonly versionNumber?: string; + /** + * The IAM role to retrieve the configuration. + * + * @default - A role is generated. + */ + readonly retrievalRole?: iam.IRole; +} +/** + * A sourced configuration represents configuration stored in an Amazon S3 bucket, AWS Secrets Manager secret, Systems Manager + * (SSM) Parameter Store parameter, SSM document, or AWS CodePipeline. + */ +export declare class SourcedConfiguration extends ConfigurationBase { + /** + * The location where the configuration is stored. + */ + readonly location: ConfigurationSource; + /** + * The version number of the configuration to deploy. + */ + readonly versionNumber?: string; + /** + * The IAM role to retrieve the configuration. + */ + readonly retrievalRole?: iam.IRole; + /** + * The key to decrypt the configuration if applicable. This key + * can be used when storing configuration in AWS Secrets Manager, Systems Manager Parameter Store, + * or Amazon S3. + */ + readonly sourceKey?: kms.IKey; + /** + * The ID of the configuration profile. + */ + readonly configurationProfileId: string; + /** + * The Amazon Resource Name (ARN) of the configuration profile. + */ + readonly configurationProfileArn: string; + private readonly locationUri; + private readonly _cfnConfigurationProfile; + constructor(scope: Construct, id: string, props: SourcedConfigurationProps); + private getPolicyForRole; +} +/** + * The configuration type. + */ +export declare enum ConfigurationType { + /** + * Freeform configuration profile. Allows you to store your data in the AWS AppConfig + * hosted configuration store or another Systems Manager capability or AWS service that integrates + * with AWS AppConfig. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-free-form-configurations-creating.html + */ + FREEFORM = "AWS.Freeform", + /** + * Feature flag configuration profile. This configuration stores its data + * in the AWS AppConfig hosted configuration store and the URI is simply hosted. + */ + FEATURE_FLAGS = "AWS.AppConfig.FeatureFlags" +} +/** + * The validator type. + */ +export declare enum ValidatorType { + /** + * JSON Scema validator. + */ + JSON_SCHEMA = "JSON_SCHEMA", + /** + * Validate using a Lambda function. + */ + LAMBDA = "LAMBDA" +} +/** + * The configuration source type. + */ +export declare enum ConfigurationSourceType { + S3 = "S3", + SECRETS_MANAGER = "SECRETS_MANAGER", + SSM_PARAMETER = "SSM_PARAMETER", + SSM_DOCUMENT = "SSM_DOCUMENT", + CODE_PIPELINE = "CODE_PIPELINE" +} +export interface IValidator { + /** + * The content of the validator. + */ + readonly content: string; + /** + * The type of validator. + */ + readonly type: ValidatorType; +} +/** + * Defines a JSON Schema validator. + */ +export declare abstract class JsonSchemaValidator implements IValidator { + /** + * Defines a JSON Schema validator from a file. + * + * @param inputPath The path to the file that defines the validator + */ + static fromFile(inputPath: string): JsonSchemaValidator; + /** + * Defines a JSON Schema validator from inline code. + * + * @param code The inline code that defines the validator + */ + static fromInline(code: string): JsonSchemaValidator; + abstract readonly content: string; + abstract readonly type: ValidatorType; +} +/** + * Defines an AWS Lambda validator. + */ +export declare abstract class LambdaValidator implements IValidator { + /** + * Defines an AWS Lambda validator from a Lambda function. This will call + * `addPermission` to your function to grant AWS AppConfig permissions. + * + * @param func The function that defines the validator + */ + static fromFunction(func: lambda.Function): LambdaValidator; + abstract readonly content: string; + abstract readonly type: ValidatorType; +} +/** + * Defines the hosted configuration content. + */ +export declare abstract class ConfigurationContent { + /** + * Defines the hosted configuration content from a file. + * + * @param inputPath The path to the file that defines configuration content + * @param contentType The content type of the configuration + */ + static fromFile(inputPath: string, contentType?: string): ConfigurationContent; + /** + * Defines the hosted configuration content from inline code. + * + * @param content The inline code that defines the configuration content + * @param contentType The content type of the configuration + */ + static fromInline(content: string, contentType?: string): ConfigurationContent; + /** + * Defines the hosted configuration content as JSON from inline code. + * + * @param content The inline code that defines the configuration content + * @param contentType The content type of the configuration + */ + static fromInlineJson(content: string, contentType?: string): ConfigurationContent; + /** + * Defines the hosted configuration content as text from inline code. + * + * @param content The inline code that defines the configuration content + */ + static fromInlineText(content: string): ConfigurationContent; + /** + * Defines the hosted configuration content as YAML from inline code. + * + * @param content The inline code that defines the configuration content + */ + static fromInlineYaml(content: string): ConfigurationContent; + /** + * The configuration content. + */ + abstract readonly content: string; + /** + * The configuration content type. + */ + abstract readonly contentType: string; +} +/** + * Defines the integrated configuration sources. + */ +export declare abstract class ConfigurationSource { + /** + * Defines configuration content from an Amazon S3 bucket. + * + * @param bucket The S3 bucket where the configuration is stored + * @param objectKey The path to the configuration + * @param key The KMS Key that the bucket is encrypted with + */ + static fromBucket(bucket: s3.IBucket, objectKey: string, key?: kms.IKey): ConfigurationSource; + /** + * Defines configuration content from an AWS Secrets Manager secret. + * + * @param secret The secret where the configuration is stored + */ + static fromSecret(secret: sm.ISecret): ConfigurationSource; + /** + * Defines configuration content from a Systems Manager (SSM) Parameter Store parameter. + * + * @param parameter The parameter where the configuration is stored + * @param key The KMS Key that the secure string is encrypted with + */ + static fromParameter(parameter: ssm.IParameter, key?: kms.IKey): ConfigurationSource; + /** + * Defines configuration content from a Systems Manager (SSM) document. + * + * @param document The SSM document where the configuration is stored + */ + static fromCfnDocument(document: ssm.CfnDocument): ConfigurationSource; + /** + * Defines configuration content from AWS CodePipeline. + * + * @param pipeline The pipeline where the configuration is stored + * @returns + */ + static fromPipeline(pipeline: cp.IPipeline): ConfigurationSource; + /** + * The URI of the configuration source. + */ + abstract readonly locationUri: string; + /** + * The type of the configuration source. + */ + abstract readonly type: ConfigurationSourceType; + /** + * The KMS Key that encrypts the configuration. + */ + abstract readonly key?: kms.IKey; +} +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.js new file mode 100644 index 0000000000000..144525872ba1f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/configuration.js @@ -0,0 +1,696 @@ +"use strict"; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConfigurationSource = exports.ConfigurationContent = exports.LambdaValidator = exports.JsonSchemaValidator = exports.ConfigurationSourceType = exports.ValidatorType = exports.ConfigurationType = exports.SourcedConfiguration = exports.HostedConfiguration = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const fs = require("fs"); +const path = require("path"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_appconfig_1 = require("aws-cdk-lib/aws-appconfig"); +const iam = require("aws-cdk-lib/aws-iam"); +const constructs_1 = require("constructs"); +const mimeTypes = require("mime-types"); +const deployment_strategy_1 = require("./deployment-strategy"); +const extension_1 = require("./extension"); +const hash_1 = require("./private/hash"); +class ConfigurationBase extends constructs_1.Construct { + constructor(scope, id, props) { + super(scope, id); + this.name = props.name || aws_cdk_lib_1.Names.uniqueResourceName(this, { + maxLength: 128, + separator: '-', + }); + this.application = props.application; + this.applicationId = this.application.applicationId; + this.type = props.type; + this.validators = props.validators; + this.description = props.description; + this.deployTo = props.deployTo; + this.deploymentKey = props.deploymentKey; + this.deploymentStrategy = props.deploymentStrategy || new deployment_strategy_1.DeploymentStrategy(this, 'DeploymentStrategy', { + rolloutStrategy: deployment_strategy_1.RolloutStrategy.CANARY_10_PERCENT_20_MINUTES, + }); + } + /** + * Adds an extension defined by the action point and event destination + * and also creates an extension association to the configuration profile. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint, eventDestination, options) { + this.extensible.on(actionPoint, eventDestination, options); + } + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the + * provided event destination and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination, options) { + this.extensible.preCreateHostedConfigurationVersion(eventDestination, options); + } + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination, options) { + this.extensible.preStartDeployment(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination, options) { + this.extensible.onDeploymentStart(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination, options) { + this.extensible.onDeploymentStep(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination, options) { + this.extensible.onDeploymentBaking(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination, options) { + this.extensible.onDeploymentComplete(eventDestination, options); + } + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination + * and also creates an extension association to the configuration profile. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination, options) { + this.extensible.onDeploymentRolledBack(eventDestination, options); + } + /** + * Adds an extension association to the configuration profile. + * + * @param extension The extension to create an association for + */ + addExtension(extension) { + this.extensible.addExtension(extension); + } + /** + * Deploys the configuration to the specified environment. + * + * @param environment The environment to deploy the configuration to + * @deprecated Use `deployTo` as a property instead. We do not recommend + * creating resources in multiple stacks. If you want to do this still, + * please take a look into https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appconfig.CfnDeployment.html. + */ + deploy(environment) { + new aws_appconfig_1.CfnDeployment(this, `Deployment${(0, hash_1.getHash)(environment.name)}`, { + applicationId: this.application.applicationId, + configurationProfileId: this.configurationProfileId, + deploymentStrategyId: this.deploymentStrategy.deploymentStrategyId, + environmentId: environment.environmentId, + configurationVersion: this.versionNumber, + description: this.description, + kmsKeyIdentifier: this.deploymentKey?.keyArn, + }); + } + addExistingEnvironmentsToApplication() { + this.deployTo?.forEach((environment) => { + if (!this.application.environments.includes(environment)) { + this.application.addExistingEnvironment(environment); + } + }); + } + deployConfigToEnvironments() { + if (!this.deployTo || !this.versionNumber) { + return; + } + this.application.environments.forEach((environment) => { + if ((this.deployTo && !this.deployTo.includes(environment))) { + return; + } + this.deploy(environment); + }); + } +} +/** + * A hosted configuration represents configuration stored in the AWS AppConfig hosted configuration store. + */ +class HostedConfiguration extends ConfigurationBase { + constructor(scope, id, props) { + super(scope, id, props); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.HostedConfiguration", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_HostedConfigurationProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, HostedConfiguration); + } + throw error; + } + this._cfnConfigurationProfile = new aws_appconfig_1.CfnConfigurationProfile(this, 'ConfigurationProfile', { + applicationId: this.applicationId, + locationUri: 'hosted', + name: this.name, + description: this.description, + type: this.type, + validators: this.validators, + }); + this.configurationProfileId = this._cfnConfigurationProfile.ref; + this.configurationProfileArn = aws_cdk_lib_1.Stack.of(this).formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: `${this.applicationId}/configurationprofile/${this.configurationProfileId}`, + }); + this.extensible = new extension_1.ExtensibleBase(this, this.configurationProfileArn, this.name); + this.content = props.content.content; + this.contentType = props.content.contentType; + this.latestVersionNumber = props.latestVersionNumber; + this.versionLabel = props.versionLabel; + this._cfnHostedConfigurationVersion = new aws_appconfig_1.CfnHostedConfigurationVersion(this, 'Resource', { + applicationId: this.applicationId, + configurationProfileId: this.configurationProfileId, + content: this.content, + contentType: this.contentType, + description: this.description, + latestVersionNumber: this.latestVersionNumber, + versionLabel: this.versionLabel, + }); + this._cfnHostedConfigurationVersion.applyRemovalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN); + this.versionNumber = this._cfnHostedConfigurationVersion.ref; + this.hostedConfigurationVersionArn = aws_cdk_lib_1.Stack.of(this).formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: `${this.applicationId}/configurationprofile/${this.configurationProfileId}/hostedconfigurationversion/${this.versionNumber}`, + }); + this.addExistingEnvironmentsToApplication(); + this.deployConfigToEnvironments(); + } +} +exports.HostedConfiguration = HostedConfiguration; +_a = JSII_RTTI_SYMBOL_1; +HostedConfiguration[_a] = { fqn: "@aws-cdk/aws-appconfig-alpha.HostedConfiguration", version: "0.0.0" }; +/** + * A sourced configuration represents configuration stored in an Amazon S3 bucket, AWS Secrets Manager secret, Systems Manager + * (SSM) Parameter Store parameter, SSM document, or AWS CodePipeline. + */ +class SourcedConfiguration extends ConfigurationBase { + constructor(scope, id, props) { + super(scope, id, props); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.SourcedConfiguration", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_SourcedConfigurationProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, SourcedConfiguration); + } + throw error; + } + this.location = props.location; + this.locationUri = this.location.locationUri; + this.versionNumber = props.versionNumber; + this.sourceKey = this.location.key; + this.retrievalRole = props.retrievalRole || this.location.type != ConfigurationSourceType.CODE_PIPELINE + ? new iam.Role(this, 'Role', { + roleName: aws_cdk_lib_1.PhysicalName.GENERATE_IF_NEEDED, + assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'), + inlinePolicies: { + ['AllowAppConfigReadFromSourcePolicy']: this.getPolicyForRole(), + }, + }) + : undefined; + this._cfnConfigurationProfile = new aws_appconfig_1.CfnConfigurationProfile(this, 'Resource', { + applicationId: this.applicationId, + locationUri: this.locationUri, + name: this.name, + description: this.description, + retrievalRoleArn: this.retrievalRole?.roleArn, + type: this.type, + validators: this.validators, + }); + this.configurationProfileId = this._cfnConfigurationProfile.ref; + this.configurationProfileArn = aws_cdk_lib_1.Stack.of(this).formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: `${this.applicationId}/configurationprofile/${this.configurationProfileId}`, + }); + this.extensible = new extension_1.ExtensibleBase(this, this.configurationProfileArn, this.name); + this.addExistingEnvironmentsToApplication(); + this.deployConfigToEnvironments(); + } + getPolicyForRole() { + const policy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + }); + const document = new iam.PolicyDocument({ + statements: [policy], + }); + if (this.location.type == ConfigurationSourceType.SSM_PARAMETER) { + policy.addActions('ssm:GetParameter'); + policy.addResources(this.locationUri); + } + else if (this.location.type == ConfigurationSourceType.SSM_DOCUMENT) { + policy.addActions('ssm:GetDocument'); + policy.addResources(aws_cdk_lib_1.Stack.of(this).formatArn({ + service: 'ssm', + resource: 'document', + resourceName: this.locationUri.split('://')[1], + })); + } + else if (this.location.type == ConfigurationSourceType.S3) { + const bucketAndObjectKey = this.locationUri.split('://')[1]; + const sep = bucketAndObjectKey.search('/'); + const bucketName = bucketAndObjectKey.substring(0, sep); + const objectKey = bucketAndObjectKey.substring(sep + 1); + policy.addActions('s3:GetObject', 's3:GetObjectMetadata', 's3:GetObjectVersion'); + policy.addResources(aws_cdk_lib_1.Stack.of(this).formatArn({ + region: '', + account: '', + service: 's3', + arnFormat: aws_cdk_lib_1.ArnFormat.NO_RESOURCE_NAME, + resource: `${bucketName}/${objectKey}`, + })); + const bucketPolicy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: [ + 's3:GetBucketLocation', + 's3:GetBucketVersioning', + 's3:ListBucket', + 's3:ListBucketVersions', + ], + resources: [ + aws_cdk_lib_1.Stack.of(this).formatArn({ + region: '', + account: '', + service: 's3', + arnFormat: aws_cdk_lib_1.ArnFormat.NO_RESOURCE_NAME, + resource: bucketName, + }), + ], + }); + const listBucketsPolicy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: ['s3:ListAllMyBuckets'], + resources: ['*'], + }); + document.addStatements(bucketPolicy, listBucketsPolicy); + } + else { + policy.addActions('secretsmanager:GetSecretValue'); + policy.addResources(this.locationUri); + } + if (this.sourceKey) { + const keyPolicy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: ['kms:Decrypt'], + resources: [this.sourceKey.keyArn], + }); + document.addStatements(keyPolicy); + } + return document; + } +} +exports.SourcedConfiguration = SourcedConfiguration; +_b = JSII_RTTI_SYMBOL_1; +SourcedConfiguration[_b] = { fqn: "@aws-cdk/aws-appconfig-alpha.SourcedConfiguration", version: "0.0.0" }; +/** + * The configuration type. + */ +var ConfigurationType; +(function (ConfigurationType) { + /** + * Freeform configuration profile. Allows you to store your data in the AWS AppConfig + * hosted configuration store or another Systems Manager capability or AWS service that integrates + * with AWS AppConfig. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-free-form-configurations-creating.html + */ + ConfigurationType["FREEFORM"] = "AWS.Freeform"; + /** + * Feature flag configuration profile. This configuration stores its data + * in the AWS AppConfig hosted configuration store and the URI is simply hosted. + */ + ConfigurationType["FEATURE_FLAGS"] = "AWS.AppConfig.FeatureFlags"; +})(ConfigurationType || (exports.ConfigurationType = ConfigurationType = {})); +/** + * The validator type. + */ +var ValidatorType; +(function (ValidatorType) { + /** + * JSON Scema validator. + */ + ValidatorType["JSON_SCHEMA"] = "JSON_SCHEMA"; + /** + * Validate using a Lambda function. + */ + ValidatorType["LAMBDA"] = "LAMBDA"; +})(ValidatorType || (exports.ValidatorType = ValidatorType = {})); +/** + * The configuration source type. + */ +var ConfigurationSourceType; +(function (ConfigurationSourceType) { + ConfigurationSourceType["S3"] = "S3"; + ConfigurationSourceType["SECRETS_MANAGER"] = "SECRETS_MANAGER"; + ConfigurationSourceType["SSM_PARAMETER"] = "SSM_PARAMETER"; + ConfigurationSourceType["SSM_DOCUMENT"] = "SSM_DOCUMENT"; + ConfigurationSourceType["CODE_PIPELINE"] = "CODE_PIPELINE"; +})(ConfigurationSourceType || (exports.ConfigurationSourceType = ConfigurationSourceType = {})); +/** + * Defines a JSON Schema validator. + */ +class JsonSchemaValidator { + /** + * Defines a JSON Schema validator from a file. + * + * @param inputPath The path to the file that defines the validator + */ + static fromFile(inputPath) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator#fromFile", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromFile); + } + throw error; + } + return { + content: fs.readFileSync(path.resolve(inputPath)).toString(), + type: ValidatorType.JSON_SCHEMA, + }; + } + /** + * Defines a JSON Schema validator from inline code. + * + * @param code The inline code that defines the validator + */ + static fromInline(code) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator#fromInline", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInline); + } + throw error; + } + return { + content: code, + type: ValidatorType.JSON_SCHEMA, + }; + } +} +exports.JsonSchemaValidator = JsonSchemaValidator; +_c = JSII_RTTI_SYMBOL_1; +JsonSchemaValidator[_c] = { fqn: "@aws-cdk/aws-appconfig-alpha.JsonSchemaValidator", version: "0.0.0" }; +/** + * Defines an AWS Lambda validator. + */ +class LambdaValidator { + /** + * Defines an AWS Lambda validator from a Lambda function. This will call + * `addPermission` to your function to grant AWS AppConfig permissions. + * + * @param func The function that defines the validator + */ + static fromFunction(func) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.LambdaValidator#fromFunction", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromFunction); + } + throw error; + } + if (!func.permissionsNode.tryFindChild('AppConfigPermission')) { + func.addPermission('AppConfigPermission', { + principal: new iam.ServicePrincipal('appconfig.amazonaws.com'), + }); + } + return { + content: func.functionArn, + type: ValidatorType.LAMBDA, + }; + } +} +exports.LambdaValidator = LambdaValidator; +_d = JSII_RTTI_SYMBOL_1; +LambdaValidator[_d] = { fqn: "@aws-cdk/aws-appconfig-alpha.LambdaValidator", version: "0.0.0" }; +/** + * Defines the hosted configuration content. + */ +class ConfigurationContent { + /** + * Defines the hosted configuration content from a file. + * + * @param inputPath The path to the file that defines configuration content + * @param contentType The content type of the configuration + */ + static fromFile(inputPath, contentType) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationContent#fromFile", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromFile); + } + throw error; + } + return { + content: fs.readFileSync(path.resolve(inputPath)).toString(), + contentType: contentType || mimeTypes.lookup(inputPath) || 'application/json', + }; + } + /** + * Defines the hosted configuration content from inline code. + * + * @param content The inline code that defines the configuration content + * @param contentType The content type of the configuration + */ + static fromInline(content, contentType) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationContent#fromInline", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInline); + } + throw error; + } + return { + content, + contentType: contentType || 'application/octet-stream', + }; + } + /** + * Defines the hosted configuration content as JSON from inline code. + * + * @param content The inline code that defines the configuration content + * @param contentType The content type of the configuration + */ + static fromInlineJson(content, contentType) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationContent#fromInlineJson", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInlineJson); + } + throw error; + } + return { + content, + contentType: contentType || 'application/json', + }; + } + /** + * Defines the hosted configuration content as text from inline code. + * + * @param content The inline code that defines the configuration content + */ + static fromInlineText(content) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationContent#fromInlineText", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInlineText); + } + throw error; + } + return { + content, + contentType: 'text/plain', + }; + } + /** + * Defines the hosted configuration content as YAML from inline code. + * + * @param content The inline code that defines the configuration content + */ + static fromInlineYaml(content) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationContent#fromInlineYaml", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInlineYaml); + } + throw error; + } + return { + content, + contentType: 'application/x-yaml', + }; + } +} +exports.ConfigurationContent = ConfigurationContent; +_e = JSII_RTTI_SYMBOL_1; +ConfigurationContent[_e] = { fqn: "@aws-cdk/aws-appconfig-alpha.ConfigurationContent", version: "0.0.0" }; +/** + * Defines the integrated configuration sources. + */ +class ConfigurationSource { + /** + * Defines configuration content from an Amazon S3 bucket. + * + * @param bucket The S3 bucket where the configuration is stored + * @param objectKey The path to the configuration + * @param key The KMS Key that the bucket is encrypted with + */ + static fromBucket(bucket, objectKey, key) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationSource#fromBucket", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromBucket); + } + throw error; + } + return { + locationUri: bucket.s3UrlForObject(objectKey), + type: ConfigurationSourceType.S3, + key, + }; + } + /** + * Defines configuration content from an AWS Secrets Manager secret. + * + * @param secret The secret where the configuration is stored + */ + static fromSecret(secret) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationSource#fromSecret", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromSecret); + } + throw error; + } + return { + locationUri: secret.secretArn, + type: ConfigurationSourceType.SECRETS_MANAGER, + key: secret.encryptionKey, + }; + } + /** + * Defines configuration content from a Systems Manager (SSM) Parameter Store parameter. + * + * @param parameter The parameter where the configuration is stored + * @param key The KMS Key that the secure string is encrypted with + */ + static fromParameter(parameter, key) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationSource#fromParameter", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromParameter); + } + throw error; + } + return { + locationUri: parameter.parameterArn, + type: ConfigurationSourceType.SSM_PARAMETER, + key, + }; + } + /** + * Defines configuration content from a Systems Manager (SSM) document. + * + * @param document The SSM document where the configuration is stored + */ + static fromCfnDocument(document) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationSource#fromCfnDocument", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromCfnDocument); + } + throw error; + } + return { + locationUri: `ssm-document://${document.ref}`, + type: ConfigurationSourceType.SSM_DOCUMENT, + }; + } + /** + * Defines configuration content from AWS CodePipeline. + * + * @param pipeline The pipeline where the configuration is stored + * @returns + */ + static fromPipeline(pipeline) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ConfigurationSource#fromPipeline", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromPipeline); + } + throw error; + } + return { + locationUri: `codepipeline://${pipeline.pipelineName}`, + type: ConfigurationSourceType.CODE_PIPELINE, + }; + } +} +exports.ConfigurationSource = ConfigurationSource; +_f = JSII_RTTI_SYMBOL_1; +ConfigurationSource[_f] = { fqn: "@aws-cdk/aws-appconfig-alpha.ConfigurationSource", version: "0.0.0" }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2Q0FBbUY7QUFDbkYsNkRBQWtIO0FBRWxILDJDQUEyQztBQU0zQywyQ0FBbUQ7QUFDbkQsd0NBQXdDO0FBRXhDLCtEQUFpRztBQUVqRywyQ0FBd0g7QUFDeEgseUNBQXlDO0FBMEh6QyxNQUFlLGlCQUFrQixTQUFRLHNCQUFTO0lBK0NoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLG1CQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO1lBQ3ZELFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLEdBQUc7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLElBQUksSUFBSSx3Q0FBa0IsQ0FBQyxJQUFJLEVBQUUsb0JB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RztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBa0I7Ozs7Ozs7Ozs7UUFDekMsT0FBTztZQUNMLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUztZQUM3QixJQUFJLEVBQUUsdUJBQXVCLENBQUMsZUFBZTtZQUM3QyxHQUFHLEVBQUUsTUFBTSxDQUFDLGFBQWE7U0FDMUIsQ0FBQztLQUNIO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQXlCLEVBQUUsR0FBYzs7Ozs7Ozs7OztRQUNuRSxPQUFPO1lBQ0wsV0FBVyxFQUFFLFNBQVMsQ0FBQyxZQUFZO1lBQ25DLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxhQUFhO1lBQzNDLEdBQUc7U0FDSixDQUFDO0tBQ0g7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUF5Qjs7Ozs7Ozs7OztRQUNyRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLGtCQUFrQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxZQUFZO1NBQzNDLENBQUM7S0FDSDtJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFzQjs7Ozs7Ozs7OztRQUMvQyxPQUFPO1lBQ0wsV0FBVyxFQUFFLGtCQUFrQixRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3RELElBQUksRUFBRSx1QkFBdUIsQ0FBQyxhQUFhO1NBQzVDLENBQUM7S0FDSDs7QUFsRUgsa0RBa0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFBoeXNpY2FsTmFtZSwgU3RhY2ssIEFybkZvcm1hdCwgTmFtZXMsIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5Db25maWd1cmF0aW9uUHJvZmlsZSwgQ2ZuRGVwbG95bWVudCwgQ2ZuSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBwY29uZmlnJztcbmltcG9ydCAqIGFzIGNwIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHNtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIG1pbWVUeXBlcyBmcm9tICdtaW1lLXR5cGVzJztcbmltcG9ydCB7IElBcHBsaWNhdGlvbiB9IGZyb20gJy4vYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgRGVwbG95bWVudFN0cmF0ZWd5LCBJRGVwbG95bWVudFN0cmF0ZWd5LCBSb2xsb3V0U3RyYXRlZ3kgfSBmcm9tICcuL2RlcGxveW1lbnQtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBBY3Rpb25Qb2ludCwgSUV2ZW50RGVzdGluYXRpb24sIEV4dGVuc2lvbk9wdGlvbnMsIElFeHRlbnNpb24sIElFeHRlbnNpYmxlLCBFeHRlbnNpYmxlQmFzZSB9IGZyb20gJy4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IGdldEhhc2ggfSBmcm9tICcuL3ByaXZhdGUvaGFzaCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIENvbmZpZ3VyYXRpb24gY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgZGVwbG95bWVudCBzdHJhdGVneSB3aXRoIHRoZSByb2xsb3V0IHN0cmF0ZWd5IHNldCB0b1xuICAgKiBSb2xsb3V0U3RyYXRlZ3kuQ0FOQVJZXzEwX1BFUkNFTlRfMjBfTUlOVVRFU1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFN0cmF0ZWd5PzogSURlcGxveW1lbnRTdHJhdGVneTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuYW1lIGlzIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWxpZGF0b3JzIGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB2YWxpZGF0b3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdG9ycz86IElWYWxpZGF0b3JbXTtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IENvbmZpZ3VyYXRpb25UeXBlLkZSRUVGT1JNXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogQ29uZmlndXJhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVudmlyb25tZW50cyB0byBkZXBsb3kgdGhlIGNvbmZpZ3VyYXRpb24gdG8uXG4gICAqXG4gICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlcmUgd2lsbCBiZSBub1xuICAgKiBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUbz86IElFbnZpcm9ubWVudFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBrZXkgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRLZXk/OiBrbXMuSUtleTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblByb3BzIGV4dGVuZHMgQ29uZmlndXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5IGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRTdHJhdGVneT86IElEZXBsb3ltZW50U3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHZlcnNpb24gbnVtYmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbk51bWJlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbGlkYXRvcnMgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdG9ycz86IElWYWxpZGF0b3JbXTtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogQ29uZmlndXJhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudHMgdG8gZGVwbG95IHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95VG8/OiBJRW52aXJvbm1lbnRbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQga2V5IGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRLZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uUHJvZmlsZUlkOiBzdHJpbmc7XG59XG5cbmFic3RyYWN0IGNsYXNzIENvbmZpZ3VyYXRpb25CYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb24sIElFeHRlbnNpYmxlIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHZlcnNpb25OdW1iZXI/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb25maWd1cmF0aW9uUHJvZmlsZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50cyB0byBkZXBsb3kgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95VG8/OiBJRW52aXJvbm1lbnRbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbGlkYXRvcnMgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbGlkYXRvcnM/OiBJVmFsaWRhdG9yW107XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlPzogQ29uZmlndXJhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IGtleSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95bWVudEtleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBzdHJhdGVneSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3k/OiBJRGVwbG95bWVudFN0cmF0ZWd5O1xuXG4gIHByb3RlY3RlZCBhcHBsaWNhdGlvbklkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBleHRlbnNpYmxlITogRXh0ZW5zaWJsZUJhc2U7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENvbmZpZ3VyYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lIHx8IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgIH0pO1xuICAgIHRoaXMuYXBwbGljYXRpb24gPSBwcm9wcy5hcHBsaWNhdGlvbjtcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSB0aGlzLmFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQ7XG4gICAgdGhpcy50eXBlID0gcHJvcHMudHlwZTtcbiAgICB0aGlzLnZhbGlkYXRvcnMgPSBwcm9wcy52YWxpZGF0b3JzO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcGxveVRvID0gcHJvcHMuZGVwbG95VG87XG4gICAgdGhpcy5kZXBsb3ltZW50S2V5ID0gcHJvcHMuZGVwbG95bWVudEtleTtcbiAgICB0aGlzLmRlcGxveW1lbnRTdHJhdGVneSA9IHByb3BzLmRlcGxveW1lbnRTdHJhdGVneSB8fCBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHRoaXMsICdEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5DQU5BUllfMTBfUEVSQ0VOVF8yMF9NSU5VVEVTLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIGRlZmluZWQgYnkgdGhlIGFjdGlvbiBwb2ludCBhbmQgZXZlbnQgZGVzdGluYXRpb25cbiAgICogYW5kIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvblBvaW50IFRoZSBhY3Rpb24gcG9pbnQgd2hpY2ggdHJpZ2dlcnMgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgb24oYWN0aW9uUG9pbnQ6IEFjdGlvblBvaW50LCBldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2libGUub24oYWN0aW9uUG9pbnQsIGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfQ1JFQVRFX0hPU1RFRF9DT05GSUdVUkFUSU9OX1ZFUlNJT04gZXh0ZW5zaW9uIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZCBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgcHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24oZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLnByZUNyZWF0ZUhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uKGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfU1RBUlRfREVQTE9ZTUVOVCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb25cbiAgICogYW5kIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBwcmVTdGFydERlcGxveW1lbnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLnByZVN0YXJ0RGVwbG95bWVudChldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfU1RBUlQgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uXG4gICAqIGFuZCBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgb25EZXBsb3ltZW50U3RhcnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFN0YXJ0KGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9TVEVQIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvblxuICAgKiBhbmQgYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgY29uZmlndXJhdGlvbiBwcm9maWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIG9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX0JBS0lORyBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBvbkRlcGxveW1lbnRCYWtpbmcoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudEJha2luZyhldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfQ09NUExFVEUgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uXG4gICAqIGFuZCBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgb25EZXBsb3ltZW50Q29tcGxldGUoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudENvbXBsZXRlKGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9ST0xMRURfQkFDSyBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb25cbiAgICogYW5kIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHB1YmxpYyBvbkRlcGxveW1lbnRSb2xsZWRCYWNrKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5vbkRlcGxveW1lbnRSb2xsZWRCYWNrKGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGV4dGVuc2lvbiB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gZm9yXG4gICAqL1xuICBwdWJsaWMgYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbjogSUV4dGVuc2lvbikge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5hZGRFeHRlbnNpb24oZXh0ZW5zaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3lzIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQgdG8gZGVwbG95IHRoZSBjb25maWd1cmF0aW9uIHRvXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZGVwbG95VG9gIGFzIGEgcHJvcGVydHkgaW5zdGVhZC4gV2UgZG8gbm90IHJlY29tbWVuZFxuICAgKiBjcmVhdGluZyByZXNvdXJjZXMgaW4gbXVsdGlwbGUgc3RhY2tzLiBJZiB5b3Ugd2FudCB0byBkbyB0aGlzIHN0aWxsLFxuICAgKiBwbGVhc2UgdGFrZSBhIGxvb2sgaW50byBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19hcHBjb25maWcuQ2ZuRGVwbG95bWVudC5odG1sLlxuICAgKi9cbiAgcHVibGljIGRlcGxveShlbnZpcm9ubWVudDogSUVudmlyb25tZW50KSB7XG4gICAgbmV3IENmbkRlcGxveW1lbnQodGhpcywgYERlcGxveW1lbnQke2dldEhhc2goZW52aXJvbm1lbnQubmFtZSEpfWAsIHtcbiAgICAgIGFwcGxpY2F0aW9uSWQ6IHRoaXMuYXBwbGljYXRpb24uYXBwbGljYXRpb25JZCxcbiAgICAgIGNvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHRoaXMuY29uZmlndXJhdGlvblByb2ZpbGVJZCxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneUlkOiB0aGlzLmRlcGxveW1lbnRTdHJhdGVneSEuZGVwbG95bWVudFN0cmF0ZWd5SWQsXG4gICAgICBlbnZpcm9ubWVudElkOiBlbnZpcm9ubWVudC5lbnZpcm9ubWVudElkLFxuICAgICAgY29uZmlndXJhdGlvblZlcnNpb246IHRoaXMudmVyc2lvbk51bWJlciEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGttc0tleUlkZW50aWZpZXI6IHRoaXMuZGVwbG95bWVudEtleT8ua2V5QXJuLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEV4aXN0aW5nRW52aXJvbm1lbnRzVG9BcHBsaWNhdGlvbigpIHtcbiAgICB0aGlzLmRlcGxveVRvPy5mb3JFYWNoKChlbnZpcm9ubWVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uLmVudmlyb25tZW50cy5pbmNsdWRlcyhlbnZpcm9ubWVudCkpIHtcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbi5hZGRFeGlzdGluZ0Vudmlyb25tZW50KGVudmlyb25tZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXBsb3lDb25maWdUb0Vudmlyb25tZW50cygpIHtcbiAgICBpZiAoIXRoaXMuZGVwbG95VG8gfHwgIXRoaXMudmVyc2lvbk51bWJlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbGljYXRpb24uZW52aXJvbm1lbnRzLmZvckVhY2goKGVudmlyb25tZW50KSA9PiB7XG4gICAgICBpZiAoKHRoaXMuZGVwbG95VG8gJiYgIXRoaXMuZGVwbG95VG8uaW5jbHVkZXMoZW52aXJvbm1lbnQpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRlcGxveShlbnZpcm9ubWVudCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBIb3N0ZWRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdGVkQ29uZmlndXJhdGlvbk9wdGlvbnMgZXh0ZW5kcyBDb25maWd1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudDtcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGxhdGVzdFZlcnNpb25OdW1iZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGxhYmVsIG9mIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbkxhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEhvc3RlZENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRDb25maWd1cmF0aW9uUHJvcHMgZXh0ZW5kcyBDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGhvc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGhvc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBsYXRlc3RWZXJzaW9uTnVtYmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBsYWJlbCBvZiB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25MYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGhvc3RlZCBjb25maWd1cmF0aW9uIHJlcHJlc2VudHMgY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gdGhlIEFXUyBBcHBDb25maWcgaG9zdGVkIGNvbmZpZ3VyYXRpb24gc3RvcmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGhvc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGVudFR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGhvc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhdGVzdFZlcnNpb25OdW1iZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGxhYmVsIG9mIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbk51bWJlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9maWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvblByb2ZpbGVBcm46IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jZm5Db25maWd1cmF0aW9uUHJvZmlsZTogQ2ZuQ29uZmlndXJhdGlvblByb2ZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nmbkhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uOiBDZm5Ib3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSG9zdGVkQ29uZmlndXJhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLl9jZm5Db25maWd1cmF0aW9uUHJvZmlsZSA9IG5ldyBDZm5Db25maWd1cmF0aW9uUHJvZmlsZSh0aGlzLCAnQ29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcGxpY2F0aW9uSWQsXG4gICAgICBsb2NhdGlvblVyaTogJ2hvc3RlZCcsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUhLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2YWxpZGF0b3JzOiB0aGlzLnZhbGlkYXRvcnMsXG4gICAgfSk7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uUHJvZmlsZUlkID0gdGhpcy5fY2ZuQ29uZmlndXJhdGlvblByb2ZpbGUucmVmO1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb2ZpbGVBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgIHJlc291cmNlTmFtZTogYCR7dGhpcy5hcHBsaWNhdGlvbklkfS9jb25maWd1cmF0aW9ucHJvZmlsZS8ke3RoaXMuY29uZmlndXJhdGlvblByb2ZpbGVJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMuZXh0ZW5zaWJsZSA9IG5ldyBFeHRlbnNpYmxlQmFzZSh0aGlzLCB0aGlzLmNvbmZpZ3VyYXRpb25Qcm9maWxlQXJuLCB0aGlzLm5hbWUpO1xuXG4gICAgdGhpcy5jb250ZW50ID0gcHJvcHMuY29udGVudC5jb250ZW50O1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBwcm9wcy5jb250ZW50LmNvbnRlbnRUeXBlO1xuICAgIHRoaXMubGF0ZXN0VmVyc2lvbk51bWJlciA9IHByb3BzLmxhdGVzdFZlcnNpb25OdW1iZXI7XG4gICAgdGhpcy52ZXJzaW9uTGFiZWwgPSBwcm9wcy52ZXJzaW9uTGFiZWw7XG4gICAgdGhpcy5fY2ZuSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24gPSBuZXcgQ2ZuSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5hcHBsaWNhdGlvbklkLFxuICAgICAgY29uZmlndXJhdGlvblByb2ZpbGVJZDogdGhpcy5jb25maWd1cmF0aW9uUHJvZmlsZUlkLFxuICAgICAgY29udGVudDogdGhpcy5jb250ZW50LFxuICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGxhdGVzdFZlcnNpb25OdW1iZXI6IHRoaXMubGF0ZXN0VmVyc2lvbk51bWJlcixcbiAgICAgIHZlcnNpb25MYWJlbDogdGhpcy52ZXJzaW9uTGFiZWwsXG4gICAgfSk7XG4gICAgdGhpcy5fY2ZuSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcblxuICAgIHRoaXMudmVyc2lvbk51bWJlciA9IHRoaXMuX2Nmbkhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uLnJlZjtcbiAgICB0aGlzLmhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdhcHBjb25maWcnLFxuICAgICAgcmVzb3VyY2U6ICdhcHBsaWNhdGlvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IGAke3RoaXMuYXBwbGljYXRpb25JZH0vY29uZmlndXJhdGlvbnByb2ZpbGUvJHt0aGlzLmNvbmZpZ3VyYXRpb25Qcm9maWxlSWR9L2hvc3RlZGNvbmZpZ3VyYXRpb252ZXJzaW9uLyR7dGhpcy52ZXJzaW9uTnVtYmVyfWAsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV4aXN0aW5nRW52aXJvbm1lbnRzVG9BcHBsaWNhdGlvbigpO1xuICAgIHRoaXMuZGVwbG95Q29uZmlnVG9FbnZpcm9ubWVudHMoKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFNvdXJjZWRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlZENvbmZpZ3VyYXRpb25PcHRpb25zIGV4dGVuZHMgQ29uZmlndXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHN0b3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHNvdXJjZWQgY29uZmlndXJhdGlvbiB0byBkZXBsb3kuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCxcbiAgICogdGhlbiB0aGVyZSB3aWxsIGJlIG5vIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25OdW1iZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSB0byByZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIHJvbGUgaXMgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cmlldmFsUm9sZT86IGlhbS5JUm9sZTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBTb3VyY2VkQ29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VkQ29uZmlndXJhdGlvblByb3BzIGV4dGVuZHMgQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQuXG4gICAqL1xuICByZWFkb25seSBsb2NhdGlvbjogQ29uZmlndXJhdGlvblNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzb3VyY2VkIGNvbmZpZ3VyYXRpb24gdG8gZGVwbG95LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQsXG4gICAqIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uTnVtYmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdG8gcmV0cmlldmUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSByb2xlIGlzIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJpZXZhbFJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogQSBzb3VyY2VkIGNvbmZpZ3VyYXRpb24gcmVwcmVzZW50cyBjb25maWd1cmF0aW9uIHN0b3JlZCBpbiBhbiBBbWF6b24gUzMgYnVja2V0LCBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCwgU3lzdGVtcyBNYW5hZ2VyXG4gKiAoU1NNKSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyLCBTU00gZG9jdW1lbnQsIG9yIEFXUyBDb2RlUGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VkQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9jYXRpb246IENvbmZpZ3VyYXRpb25Tb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY29uZmlndXJhdGlvbiB0byBkZXBsb3kuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbk51bWJlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRvIHJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldHJpZXZhbFJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gZGVjcnlwdCB0aGUgY29uZmlndXJhdGlvbiBpZiBhcHBsaWNhYmxlLiBUaGlzIGtleVxuICAgKiBjYW4gYmUgdXNlZCB3aGVuIHN0b3JpbmcgY29uZmlndXJhdGlvbiBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyLCBTeXN0ZW1zIE1hbmFnZXIgUGFyYW1ldGVyIFN0b3JlLFxuICAgKiBvciBBbWF6b24gUzMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9maWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb2ZpbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvblByb2ZpbGVBcm46IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uVXJpOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NmbkNvbmZpZ3VyYXRpb25Qcm9maWxlOiBDZm5Db25maWd1cmF0aW9uUHJvZmlsZTtcblxuICBjb25zdHJ1Y3RvciAoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNvdXJjZWRDb25maWd1cmF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMubG9jYXRpb24gPSBwcm9wcy5sb2NhdGlvbjtcbiAgICB0aGlzLmxvY2F0aW9uVXJpID0gdGhpcy5sb2NhdGlvbi5sb2NhdGlvblVyaTtcbiAgICB0aGlzLnZlcnNpb25OdW1iZXIgPSBwcm9wcy52ZXJzaW9uTnVtYmVyO1xuICAgIHRoaXMuc291cmNlS2V5ID0gdGhpcy5sb2NhdGlvbi5rZXk7XG4gICAgdGhpcy5yZXRyaWV2YWxSb2xlID0gcHJvcHMucmV0cmlldmFsUm9sZSB8fCB0aGlzLmxvY2F0aW9uLnR5cGUgIT0gQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuQ09ERV9QSVBFTElORVxuICAgICAgPyBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAgICAgIHJvbGVOYW1lOiBQaHlzaWNhbE5hbWUuR0VORVJBVEVfSUZfTkVFREVELFxuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYXBwY29uZmlnLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICBbJ0FsbG93QXBwQ29uZmlnUmVhZEZyb21Tb3VyY2VQb2xpY3knXTogdGhpcy5nZXRQb2xpY3lGb3JSb2xlKCksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9jZm5Db25maWd1cmF0aW9uUHJvZmlsZSA9IG5ldyBDZm5Db25maWd1cmF0aW9uUHJvZmlsZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcGxpY2F0aW9uSWQsXG4gICAgICBsb2NhdGlvblVyaTogdGhpcy5sb2NhdGlvblVyaSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHJldHJpZXZhbFJvbGVBcm46IHRoaXMucmV0cmlldmFsUm9sZT8ucm9sZUFybixcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZhbGlkYXRvcnM6IHRoaXMudmFsaWRhdG9ycyxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlndXJhdGlvblByb2ZpbGVJZCA9IHRoaXMuX2NmbkNvbmZpZ3VyYXRpb25Qcm9maWxlLnJlZjtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25Qcm9maWxlQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdhcHBjb25maWcnLFxuICAgICAgcmVzb3VyY2U6ICdhcHBsaWNhdGlvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IGAke3RoaXMuYXBwbGljYXRpb25JZH0vY29uZmlndXJhdGlvbnByb2ZpbGUvJHt0aGlzLmNvbmZpZ3VyYXRpb25Qcm9maWxlSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLmV4dGVuc2libGUgPSBuZXcgRXh0ZW5zaWJsZUJhc2UodGhpcywgdGhpcy5jb25maWd1cmF0aW9uUHJvZmlsZUFybiwgdGhpcy5uYW1lKTtcblxuICAgIHRoaXMuYWRkRXhpc3RpbmdFbnZpcm9ubWVudHNUb0FwcGxpY2F0aW9uKCk7XG4gICAgdGhpcy5kZXBsb3lDb25maWdUb0Vudmlyb25tZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb2xpY3lGb3JSb2xlKCk6IGlhbS5Qb2xpY3lEb2N1bWVudCB7XG4gICAgY29uc3QgcG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgIH0pO1xuICAgIGNvbnN0IGRvY3VtZW50ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICBzdGF0ZW1lbnRzOiBbcG9saWN5XSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmxvY2F0aW9uLnR5cGUgPT0gQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuU1NNX1BBUkFNRVRFUikge1xuICAgICAgcG9saWN5LmFkZEFjdGlvbnMoJ3NzbTpHZXRQYXJhbWV0ZXInKTtcbiAgICAgIHBvbGljeS5hZGRSZXNvdXJjZXModGhpcy5sb2NhdGlvblVyaSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2F0aW9uLnR5cGUgPT0gQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuU1NNX0RPQ1VNRU5UKSB7XG4gICAgICBwb2xpY3kuYWRkQWN0aW9ucygnc3NtOkdldERvY3VtZW50Jyk7XG4gICAgICBwb2xpY3kuYWRkUmVzb3VyY2VzKFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgIHNlcnZpY2U6ICdzc20nLFxuICAgICAgICByZXNvdXJjZTogJ2RvY3VtZW50JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLmxvY2F0aW9uVXJpLnNwbGl0KCc6Ly8nKVsxXSxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubG9jYXRpb24udHlwZSA9PSBDb25maWd1cmF0aW9uU291cmNlVHlwZS5TMykge1xuICAgICAgY29uc3QgYnVja2V0QW5kT2JqZWN0S2V5ID0gdGhpcy5sb2NhdGlvblVyaS5zcGxpdCgnOi8vJylbMV07XG4gICAgICBjb25zdCBzZXAgPSBidWNrZXRBbmRPYmplY3RLZXkuc2VhcmNoKCcvJyk7XG4gICAgICBjb25zdCBidWNrZXROYW1lID0gYnVja2V0QW5kT2JqZWN0S2V5LnN1YnN0cmluZygwLCBzZXApO1xuICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gYnVja2V0QW5kT2JqZWN0S2V5LnN1YnN0cmluZyhzZXAgKyAxKTtcbiAgICAgIHBvbGljeS5hZGRBY3Rpb25zKFxuICAgICAgICAnczM6R2V0T2JqZWN0JyxcbiAgICAgICAgJ3MzOkdldE9iamVjdE1ldGFkYXRhJyxcbiAgICAgICAgJ3MzOkdldE9iamVjdFZlcnNpb24nLFxuICAgICAgKTtcbiAgICAgIHBvbGljeS5hZGRSZXNvdXJjZXMoU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgcmVnaW9uOiAnJyxcbiAgICAgICAgYWNjb3VudDogJycsXG4gICAgICAgIHNlcnZpY2U6ICdzMycsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUsXG4gICAgICAgIHJlc291cmNlOiBgJHtidWNrZXROYW1lfS8ke29iamVjdEtleX1gLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgYnVja2V0UG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6R2V0QnVja2V0TG9jYXRpb24nLFxuICAgICAgICAgICdzMzpHZXRCdWNrZXRWZXJzaW9uaW5nJyxcbiAgICAgICAgICAnczM6TGlzdEJ1Y2tldCcsXG4gICAgICAgICAgJ3MzOkxpc3RCdWNrZXRWZXJzaW9ucycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgICAgICByZWdpb246ICcnLFxuICAgICAgICAgICAgYWNjb3VudDogJycsXG4gICAgICAgICAgICBzZXJ2aWNlOiAnczMnLFxuICAgICAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgICAgIHJlc291cmNlOiBidWNrZXROYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsaXN0QnVja2V0c1BvbGljeSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ3MzOkxpc3RBbGxNeUJ1Y2tldHMnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhidWNrZXRQb2xpY3ksIGxpc3RCdWNrZXRzUG9saWN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9saWN5LmFkZEFjdGlvbnMoJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJyk7XG4gICAgICBwb2xpY3kuYWRkUmVzb3VyY2VzKHRoaXMubG9jYXRpb25VcmkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZUtleSkge1xuICAgICAgY29uc3Qga2V5UG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsna21zOkRlY3J5cHQnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5zb3VyY2VLZXkua2V5QXJuXSxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhrZXlQb2xpY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIENvbmZpZ3VyYXRpb25UeXBlIHtcbiAgLyoqXG4gICAqIEZyZWVmb3JtIGNvbmZpZ3VyYXRpb24gcHJvZmlsZS4gQWxsb3dzIHlvdSB0byBzdG9yZSB5b3VyIGRhdGEgaW4gdGhlIEFXUyBBcHBDb25maWdcbiAgICogaG9zdGVkIGNvbmZpZ3VyYXRpb24gc3RvcmUgb3IgYW5vdGhlciBTeXN0ZW1zIE1hbmFnZXIgY2FwYWJpbGl0eSBvciBBV1Mgc2VydmljZSB0aGF0IGludGVncmF0ZXNcbiAgICogd2l0aCBBV1MgQXBwQ29uZmlnLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcHBjb25maWcvbGF0ZXN0L3VzZXJndWlkZS9hcHBjb25maWctZnJlZS1mb3JtLWNvbmZpZ3VyYXRpb25zLWNyZWF0aW5nLmh0bWxcbiAgICovXG4gIEZSRUVGT1JNID0gJ0FXUy5GcmVlZm9ybScsXG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgZmxhZyBjb25maWd1cmF0aW9uIHByb2ZpbGUuIFRoaXMgY29uZmlndXJhdGlvbiBzdG9yZXMgaXRzIGRhdGFcbiAgICogaW4gdGhlIEFXUyBBcHBDb25maWcgaG9zdGVkIGNvbmZpZ3VyYXRpb24gc3RvcmUgYW5kIHRoZSBVUkkgaXMgc2ltcGx5IGhvc3RlZC5cbiAgICovXG4gIEZFQVRVUkVfRkxBR1MgPSAnQVdTLkFwcENvbmZpZy5GZWF0dXJlRmxhZ3MnLFxufVxuXG4vKipcbiAqIFRoZSB2YWxpZGF0b3IgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gVmFsaWRhdG9yVHlwZSB7XG4gIC8qKlxuICAgKiBKU09OIFNjZW1hIHZhbGlkYXRvci5cbiAgICovXG4gIEpTT05fU0NIRU1BID0gJ0pTT05fU0NIRU1BJyxcblxuICAvKipcbiAgICogVmFsaWRhdGUgdXNpbmcgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBMQU1CREEgPSAnTEFNQkRBJyxcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBzb3VyY2UgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gQ29uZmlndXJhdGlvblNvdXJjZVR5cGUge1xuICBTMyA9ICdTMycsXG4gIFNFQ1JFVFNfTUFOQUdFUiA9ICdTRUNSRVRTX01BTkFHRVInLFxuICBTU01fUEFSQU1FVEVSID0gJ1NTTV9QQVJBTUVURVInLFxuICBTU01fRE9DVU1FTlQgPSAnU1NNX0RPQ1VNRU5UJyxcbiAgQ09ERV9QSVBFTElORSA9ICdDT0RFX1BJUEVMSU5FJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSB2YWxpZGF0b3IuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHZhbGlkYXRvci5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZhbGlkYXRvclR5cGU7XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIEpTT04gU2NoZW1hIHZhbGlkYXRvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpzb25TY2hlbWFWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIERlZmluZXMgYSBKU09OIFNjaGVtYSB2YWxpZGF0b3IgZnJvbSBhIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFBhdGggVGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoaW5wdXRQYXRoOiBzdHJpbmcpOiBKc29uU2NoZW1hVmFsaWRhdG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpKS50b1N0cmluZygpLFxuICAgICAgdHlwZTogVmFsaWRhdG9yVHlwZS5KU09OX1NDSEVNQSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYSBKU09OIFNjaGVtYSB2YWxpZGF0b3IgZnJvbSBpbmxpbmUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIGlubGluZSBjb2RlIHRoYXQgZGVmaW5lcyB0aGUgdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoY29kZTogc3RyaW5nKTogSnNvblNjaGVtYVZhbGlkYXRvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IGNvZGUsXG4gICAgICB0eXBlOiBWYWxpZGF0b3JUeXBlLkpTT05fU0NIRU1BLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdHlwZTogVmFsaWRhdG9yVHlwZTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBMYW1iZGEgdmFsaWRhdG9yLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGFtYmRhVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7XG4gIC8qKlxuICAgKiAgRGVmaW5lcyBhbiBBV1MgTGFtYmRhIHZhbGlkYXRvciBmcm9tIGEgTGFtYmRhIGZ1bmN0aW9uLiBUaGlzIHdpbGwgY2FsbFxuICAgKiBgYWRkUGVybWlzc2lvbmAgdG8geW91ciBmdW5jdGlvbiB0byBncmFudCBBV1MgQXBwQ29uZmlnIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZ1bmN0aW9uKGZ1bmM6IGxhbWJkYS5GdW5jdGlvbik6IExhbWJkYVZhbGlkYXRvciB7XG4gICAgaWYgKCFmdW5jLnBlcm1pc3Npb25zTm9kZS50cnlGaW5kQ2hpbGQoJ0FwcENvbmZpZ1Blcm1pc3Npb24nKSkge1xuICAgICAgZnVuYy5hZGRQZXJtaXNzaW9uKCdBcHBDb25maWdQZXJtaXNzaW9uJywge1xuICAgICAgICBwcmluY2lwYWw6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYXBwY29uZmlnLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogZnVuYy5mdW5jdGlvbkFybixcbiAgICAgIHR5cGU6IFZhbGlkYXRvclR5cGUuTEFNQkRBLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdHlwZTogVmFsaWRhdG9yVHlwZTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiBjb250ZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRlbnQge1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24gY29udGVudCBmcm9tIGEgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0UGF0aCBUaGUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IGRlZmluZXMgY29uZmlndXJhdGlvbiBjb250ZW50XG4gICAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGUgY29udGVudCB0eXBlIG9mIHRoZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GaWxlKGlucHV0UGF0aDogc3RyaW5nLCBjb250ZW50VHlwZT86IHN0cmluZyk6IENvbmZpZ3VyYXRpb25Db250ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpKS50b1N0cmluZygpLFxuICAgICAgY29udGVudFR5cGU6IGNvbnRlbnRUeXBlIHx8IG1pbWVUeXBlcy5sb29rdXAoaW5wdXRQYXRoKSB8fCAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiBjb250ZW50IGZyb20gaW5saW5lIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBpbmxpbmUgY29kZSB0aGF0IGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudFxuICAgKiBAcGFyYW0gY29udGVudFR5cGUgVGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGNvbnRlbnQ6IHN0cmluZywgY29udGVudFR5cGU/OiBzdHJpbmcpOiBDb25maWd1cmF0aW9uQ29udGVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBob3N0ZWQgY29uZmlndXJhdGlvbiBjb250ZW50IGFzIEpTT04gZnJvbSBpbmxpbmUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGlubGluZSBjb2RlIHRoYXQgZGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50XG4gICAqIEBwYXJhbSBjb250ZW50VHlwZSBUaGUgY29udGVudCB0eXBlIG9mIHRoZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmVKc29uKGNvbnRlbnQ6IHN0cmluZywgY29udGVudFR5cGU/OiBzdHJpbmcpOiBDb25maWd1cmF0aW9uQ29udGVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb250ZW50VHlwZTogY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24gY29udGVudCBhcyB0ZXh0IGZyb20gaW5saW5lIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBpbmxpbmUgY29kZSB0aGF0IGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lVGV4dChjb250ZW50OiBzdHJpbmcpOiBDb25maWd1cmF0aW9uQ29udGVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb250ZW50VHlwZTogJ3RleHQvcGxhaW4nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgaG9zdGVkIGNvbmZpZ3VyYXRpb24gY29udGVudCBhcyBZQU1MIGZyb20gaW5saW5lIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBpbmxpbmUgY29kZSB0aGF0IGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lWWFtbChjb250ZW50OiBzdHJpbmcpOiBDb25maWd1cmF0aW9uQ29udGVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gteWFtbCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRlbnRUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uIHNvdXJjZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmF0aW9uU291cmNlIHtcbiAgLyoqXG4gICAqIERlZmluZXMgY29uZmlndXJhdGlvbiBjb250ZW50IGZyb20gYW4gQW1hem9uIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldCBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHN0b3JlZFxuICAgKiBAcGFyYW0gb2JqZWN0S2V5IFRoZSBwYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBrZXkgVGhlIEtNUyBLZXkgdGhhdCB0aGUgYnVja2V0IGlzIGVuY3J5cHRlZCB3aXRoXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXQoYnVja2V0OiBzMy5JQnVja2V0LCBvYmplY3RLZXk6IHN0cmluZywga2V5Pzoga21zLklLZXkpOiBDb25maWd1cmF0aW9uU291cmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb25Vcmk6IGJ1Y2tldC5zM1VybEZvck9iamVjdChvYmplY3RLZXkpLFxuICAgICAgdHlwZTogQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuUzMsXG4gICAgICBrZXksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gY29udGVudCBmcm9tIGFuIEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VjcmV0IFRoZSBzZWNyZXQgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3RvcmVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TZWNyZXQoc2VjcmV0OiBzbS5JU2VjcmV0KTogQ29uZmlndXJhdGlvblNvdXJjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uVXJpOiBzZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgdHlwZTogQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuU0VDUkVUU19NQU5BR0VSLFxuICAgICAga2V5OiBzZWNyZXQuZW5jcnlwdGlvbktleSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgY29uZmlndXJhdGlvbiBjb250ZW50IGZyb20gYSBTeXN0ZW1zIE1hbmFnZXIgKFNTTSkgUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlciBUaGUgcGFyYW1ldGVyIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHN0b3JlZFxuICAgKiBAcGFyYW0ga2V5IFRoZSBLTVMgS2V5IHRoYXQgdGhlIHNlY3VyZSBzdHJpbmcgaXMgZW5jcnlwdGVkIHdpdGhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhcmFtZXRlcihwYXJhbWV0ZXI6IHNzbS5JUGFyYW1ldGVyLCBrZXk/OiBrbXMuSUtleSk6IENvbmZpZ3VyYXRpb25Tb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvblVyaTogcGFyYW1ldGVyLnBhcmFtZXRlckFybixcbiAgICAgIHR5cGU6IENvbmZpZ3VyYXRpb25Tb3VyY2VUeXBlLlNTTV9QQVJBTUVURVIsXG4gICAgICBrZXksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gY29udGVudCBmcm9tIGEgU3lzdGVtcyBNYW5hZ2VyIChTU00pIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZG9jdW1lbnQgVGhlIFNTTSBkb2N1bWVudCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBpcyBzdG9yZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNmbkRvY3VtZW50KGRvY3VtZW50OiBzc20uQ2ZuRG9jdW1lbnQpOiBDb25maWd1cmF0aW9uU291cmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb25Vcmk6IGBzc20tZG9jdW1lbnQ6Ly8ke2RvY3VtZW50LnJlZn1gLFxuICAgICAgdHlwZTogQ29uZmlndXJhdGlvblNvdXJjZVR5cGUuU1NNX0RPQ1VNRU5ULFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBjb25maWd1cmF0aW9uIGNvbnRlbnQgZnJvbSBBV1MgQ29kZVBpcGVsaW5lLlxuICAgKlxuICAgKiBAcGFyYW0gcGlwZWxpbmUgVGhlIHBpcGVsaW5lIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHN0b3JlZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUGlwZWxpbmUocGlwZWxpbmU6IGNwLklQaXBlbGluZSk6IENvbmZpZ3VyYXRpb25Tb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvblVyaTogYGNvZGVwaXBlbGluZTovLyR7cGlwZWxpbmUucGlwZWxpbmVOYW1lfWAsXG4gICAgICB0eXBlOiBDb25maWd1cmF0aW9uU291cmNlVHlwZS5DT0RFX1BJUEVMSU5FLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSSSBvZiB0aGUgY29uZmlndXJhdGlvbiBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbG9jYXRpb25Vcmk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc291cmNlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHR5cGU6IENvbmZpZ3VyYXRpb25Tb3VyY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgS01TIEtleSB0aGF0IGVuY3J5cHRzIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGtleT86IGttcy5JS2V5O1xufVxuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.d.ts new file mode 100644 index 0000000000000..019c4b3788223 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.d.ts @@ -0,0 +1,258 @@ +import { Resource, IResource, Duration } from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +/** + * Properties for DeploymentStrategy. + */ +export interface DeploymentStrategyProps { + /** + * The rollout strategy for the deployment strategy. You can use predefined deployment + * strategies, such as RolloutStrategy.ALL_AT_ONCE, RolloutStrategy.LINEAR_50_PERCENT_EVERY_30_SECONDS, + * or RolloutStrategy.CANARY_10_PERCENT_20_MINUTES. + */ + readonly rolloutStrategy: RolloutStrategy; + /** + * A name for the deployment strategy. + * + * @default - A name is generated. + */ + readonly deploymentStrategyName?: string; + /** + * A description of the deployment strategy. + * + * @default - No description. + */ + readonly description?: string; +} +/** + * An AWS AppConfig deployment strategy. + * + * @resource AWS::AppConfig::DeploymentStrategy + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +export declare class DeploymentStrategy extends Resource implements IDeploymentStrategy { + /** + * Imports a deployment strategy into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the deployment strategy construct + * @param deploymentStrategyArn The Amazon Resource Name (ARN) of the deployment strategy + */ + static fromDeploymentStrategyArn(scope: Construct, id: string, deploymentStrategyArn: string): IDeploymentStrategy; + /** + * Imports a deployment strategy into the CDK using its ID. + * + * @param scope The parent construct + * @param id The name of the deployment strategy construct + * @param deploymentStrategyId The ID of the deployment strategy + */ + static fromDeploymentStrategyId(scope: Construct, id: string, deploymentStrategyId: DeploymentStrategyId): IDeploymentStrategy; + /** + * The name of the deployment strategy. + */ + readonly name?: string; + /** + * The deployment duration in minutes of the deployment strategy. + */ + readonly deploymentDurationInMinutes?: number; + /** + * The growth factor of the deployment strategy. + */ + readonly growthFactor?: number; + /** + * The description of the deployment strategy. + */ + readonly description?: string; + /** + * The final bake time in minutes of the deployment strategy. + */ + readonly finalBakeTimeInMinutes?: number; + /** + * The growth type of the deployment strategy. + */ + readonly growthType?: GrowthType; + /** + * The ID of the deployment strategy. + */ + readonly deploymentStrategyId: string; + /** + * The Amazon Resource Name (ARN) of the deployment strategy. + * + * @attribute + */ + readonly deploymentStrategyArn: string; + private readonly _cfnDeploymentStrategy; + constructor(scope: Construct, id: string, props: DeploymentStrategyProps); +} +/** + * Defines the growth type of the deployment strategy. + */ +export declare enum GrowthType { + /** + * AWS AppConfig will process the deployment by increments of the growth factor + * evenly distributed over the deployment. + */ + LINEAR = "LINEAR", + /** + * AWS AppConfig will process the deployment exponentially using the following formula: + * `G*(2^N)`. In this formula, `G` is the step percentage specified by the user and `N` + * is the number of steps until the configuration is deployed to all targets. + */ + EXPONENTIAL = "EXPONENTIAL" +} +/** + * Defines the deployment strategy ID's of AWS AppConfig deployment strategies. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +export declare abstract class DeploymentStrategyId { + /** + * **AWS Recommended**. This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ + static readonly CANARY_10_PERCENT_20_MINUTES: DeploymentStrategyId; + /** + * **Testing/Demonstration**. This strategy deploys the configuration to half of all targets every 30 seconds for a + * one-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because + * it has a short duration and bake time. + */ + static readonly LINEAR_50_PERCENT_EVERY_30_SECONDS: DeploymentStrategyId; + /** + * **AWS Recommended**. This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ + static readonly LINEAR_20_PERCENT_EVERY_6_MINUTES: DeploymentStrategyId; + /** + * **Quick**. This strategy deploys the configuration to all targets immediately. + */ + static readonly ALL_AT_ONCE: DeploymentStrategyId; + /** + * Builds a deployment strategy ID from a string. + * + * @param deploymentStrategyId The deployment strategy ID. + */ + static fromString(deploymentStrategyId: string): DeploymentStrategyId; + /** + * The deployment strategy ID. + */ + abstract readonly id: string; +} +/** + * Properties for the Rollout Strategy. + */ +export interface RolloutStrategyProps { + /** + * The growth factor of the deployment strategy. This defines + * the percentage of targets to receive a deployed configuration + * during each interval. + */ + readonly growthFactor: number; + /** + * The deployment duration of the deployment strategy. This defines + * the total amount of time for a deployment to last. + */ + readonly deploymentDuration: Duration; + /** + * The final bake time of the deployment strategy. + * + * This setting specifies the amount of time AWS AppConfig monitors for Amazon + * CloudWatch alarms after the configuration has been deployed to + * 100% of its targets, before considering the deployment to be complete. + * If an alarm is triggered during this time, AWS AppConfig rolls back + * the deployment. + * + * @default Duration.minutes(0) + */ + readonly finalBakeTime?: Duration; +} +/** + * Defines the rollout strategy for a deployment strategy and includes the growth factor, + * deployment duration, growth type, and optionally final bake time. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +export declare abstract class RolloutStrategy { + /** + * **AWS Recommended**. This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ + static readonly CANARY_10_PERCENT_20_MINUTES: RolloutStrategy; + /** + * **Testing/Demonstration**. This strategy deploys the configuration to half of all targets every 30 seconds for a + * one-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because + * it has a short duration and bake time. + */ + static readonly LINEAR_50_PERCENT_EVERY_30_SECONDS: RolloutStrategy; + /** + * **AWS Recommended**. This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ + static readonly LINEAR_20_PERCENT_EVERY_6_MINUTES: RolloutStrategy; + /** + * **Quick**. This strategy deploys the configuration to all targets immediately. + */ + static readonly ALL_AT_ONCE: RolloutStrategy; + /** + * Build your own linear rollout strategy. + */ + static linear(props: RolloutStrategyProps): RolloutStrategy; + /** + * Build your own exponential rollout strategy. + */ + static exponential(props: RolloutStrategyProps): RolloutStrategy; + /** + * The growth factor of the rollout strategy. + */ + abstract readonly growthFactor: number; + /** + * The deployment duration of the rollout strategy. + */ + abstract readonly deploymentDuration: Duration; + /** + * The growth type of the rollout strategy. + */ + abstract readonly growthType?: GrowthType; + /** + * The final bake time of the deployment strategy. + */ + abstract readonly finalBakeTime?: Duration; +} +export interface IDeploymentStrategy extends IResource { + /** + * The name of the deployment strategy. + */ + readonly name?: string; + /** + * The deployment duration in minutes. + */ + readonly deploymentDurationInMinutes?: number; + /** + * The growth factor of the deployment strategy. + */ + readonly growthFactor?: number; + /** + * The description of the deployment strategy. + */ + readonly description?: string; + /** + * The final bake time in minutes. + */ + readonly finalBakeTimeInMinutes?: number; + /** + * The growth type of the deployment strategy. + */ + readonly growthType?: GrowthType; + /** + * The ID of the deployment strategy. + * @attribute + */ + readonly deploymentStrategyId: string; + /** + * The Amazon Resource Name (ARN) of the deployment strategy. + * @attribute + */ + readonly deploymentStrategyArn: string; +} diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.js new file mode 100644 index 0000000000000..a3a6fbe489cbf --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/deployment-strategy.js @@ -0,0 +1,287 @@ +"use strict"; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RolloutStrategy = exports.DeploymentStrategyId = exports.GrowthType = exports.DeploymentStrategy = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_appconfig_1 = require("aws-cdk-lib/aws-appconfig"); +/** + * An AWS AppConfig deployment strategy. + * + * @resource AWS::AppConfig::DeploymentStrategy + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +class DeploymentStrategy extends aws_cdk_lib_1.Resource { + /** + * Imports a deployment strategy into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the deployment strategy construct + * @param deploymentStrategyArn The Amazon Resource Name (ARN) of the deployment strategy + */ + static fromDeploymentStrategyArn(scope, id, deploymentStrategyArn) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategy#fromDeploymentStrategyArn", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromDeploymentStrategyArn); + } + throw error; + } + const parsedArn = aws_cdk_lib_1.Stack.of(scope).splitArn(deploymentStrategyArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME); + const deploymentStrategyId = parsedArn.resourceName; + if (!deploymentStrategyId) { + throw new Error('Missing required deployment strategy id from deployment strategy ARN'); + } + class Import extends aws_cdk_lib_1.Resource { + constructor() { + super(...arguments); + this.deploymentStrategyId = deploymentStrategyId; + this.deploymentStrategyArn = deploymentStrategyArn; + } + } + return new Import(scope, id, { + environmentFromArn: deploymentStrategyArn, + }); + } + /** + * Imports a deployment strategy into the CDK using its ID. + * + * @param scope The parent construct + * @param id The name of the deployment strategy construct + * @param deploymentStrategyId The ID of the deployment strategy + */ + static fromDeploymentStrategyId(scope, id, deploymentStrategyId) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategy#fromDeploymentStrategyId", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_DeploymentStrategyId(deploymentStrategyId); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromDeploymentStrategyId); + } + throw error; + } + const stack = aws_cdk_lib_1.Stack.of(scope); + const deploymentStrategyArn = stack.formatArn({ + service: 'appconfig', + resource: 'deploymentstrategy', + resourceName: deploymentStrategyId.id, + }); + class Import extends aws_cdk_lib_1.Resource { + constructor() { + super(...arguments); + this.deploymentStrategyId = deploymentStrategyId.id; + this.deploymentStrategyArn = deploymentStrategyArn; + } + } + return new Import(scope, id, { + environmentFromArn: deploymentStrategyArn, + }); + } + constructor(scope, id, props) { + super(scope, id, { + physicalName: props.deploymentStrategyName, + }); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategy", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_DeploymentStrategyProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, DeploymentStrategy); + } + throw error; + } + this.deploymentDurationInMinutes = props.rolloutStrategy.deploymentDuration.toMinutes(); + this.growthFactor = props.rolloutStrategy.growthFactor; + this.description = props.description; + this.finalBakeTimeInMinutes = props.rolloutStrategy.finalBakeTime?.toMinutes(); + this.growthType = props.rolloutStrategy.growthType; + this.name = props.deploymentStrategyName || aws_cdk_lib_1.Names.uniqueResourceName(this, { + maxLength: 64, + separator: '-', + }); + const resource = new aws_appconfig_1.CfnDeploymentStrategy(this, 'Resource', { + name: this.name, + deploymentDurationInMinutes: this.deploymentDurationInMinutes, + growthFactor: this.growthFactor, + replicateTo: 'NONE', + description: this.description, + finalBakeTimeInMinutes: this.finalBakeTimeInMinutes, + growthType: this.growthType, + }); + this._cfnDeploymentStrategy = resource; + this.deploymentStrategyId = this._cfnDeploymentStrategy.ref; + this.deploymentStrategyArn = this.stack.formatArn({ + service: 'appconfig', + resource: 'deploymentstrategy', + resourceName: this.deploymentStrategyId, + }); + } +} +exports.DeploymentStrategy = DeploymentStrategy; +_a = JSII_RTTI_SYMBOL_1; +DeploymentStrategy[_a] = { fqn: "@aws-cdk/aws-appconfig-alpha.DeploymentStrategy", version: "0.0.0" }; +/** + * Defines the growth type of the deployment strategy. + */ +var GrowthType; +(function (GrowthType) { + /** + * AWS AppConfig will process the deployment by increments of the growth factor + * evenly distributed over the deployment. + */ + GrowthType["LINEAR"] = "LINEAR"; + /** + * AWS AppConfig will process the deployment exponentially using the following formula: + * `G*(2^N)`. In this formula, `G` is the step percentage specified by the user and `N` + * is the number of steps until the configuration is deployed to all targets. + */ + GrowthType["EXPONENTIAL"] = "EXPONENTIAL"; +})(GrowthType || (exports.GrowthType = GrowthType = {})); +/** + * Defines the deployment strategy ID's of AWS AppConfig deployment strategies. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +class DeploymentStrategyId { + /** + * Builds a deployment strategy ID from a string. + * + * @param deploymentStrategyId The deployment strategy ID. + */ + static fromString(deploymentStrategyId) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId#fromString", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromString); + } + throw error; + } + return { + id: deploymentStrategyId, + }; + } +} +exports.DeploymentStrategyId = DeploymentStrategyId; +_b = JSII_RTTI_SYMBOL_1; +DeploymentStrategyId[_b] = { fqn: "@aws-cdk/aws-appconfig-alpha.DeploymentStrategyId", version: "0.0.0" }; +/** + * **AWS Recommended**. This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ +DeploymentStrategyId.CANARY_10_PERCENT_20_MINUTES = DeploymentStrategyId.fromString('AppConfig.Canary10Percent20Minutes'); +/** + * **Testing/Demonstration**. This strategy deploys the configuration to half of all targets every 30 seconds for a + * one-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because + * it has a short duration and bake time. + */ +DeploymentStrategyId.LINEAR_50_PERCENT_EVERY_30_SECONDS = DeploymentStrategyId.fromString('AppConfig.Linear50PercentEvery30Seconds'); +/** + * **AWS Recommended**. This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ +DeploymentStrategyId.LINEAR_20_PERCENT_EVERY_6_MINUTES = DeploymentStrategyId.fromString('AppConfig.Linear20PercentEvery6Minutes'); +/** + * **Quick**. This strategy deploys the configuration to all targets immediately. + */ +DeploymentStrategyId.ALL_AT_ONCE = DeploymentStrategyId.fromString('AppConfig.AllAtOnce'); +/** + * Defines the rollout strategy for a deployment strategy and includes the growth factor, + * deployment duration, growth type, and optionally final bake time. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-deployment-strategy.html + */ +class RolloutStrategy { + /** + * Build your own linear rollout strategy. + */ + static linear(props) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.RolloutStrategy#linear", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_RolloutStrategyProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.linear); + } + throw error; + } + return { + growthFactor: props.growthFactor, + deploymentDuration: props.deploymentDuration, + growthType: GrowthType.LINEAR, + finalBakeTime: props.finalBakeTime, + }; + } + /** + * Build your own exponential rollout strategy. + */ + static exponential(props) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.RolloutStrategy#exponential", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_RolloutStrategyProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.exponential); + } + throw error; + } + return { + growthFactor: props.growthFactor, + deploymentDuration: props.deploymentDuration, + growthType: GrowthType.EXPONENTIAL, + finalBakeTime: props.finalBakeTime, + }; + } +} +exports.RolloutStrategy = RolloutStrategy; +_c = JSII_RTTI_SYMBOL_1; +RolloutStrategy[_c] = { fqn: "@aws-cdk/aws-appconfig-alpha.RolloutStrategy", version: "0.0.0" }; +/** + * **AWS Recommended**. This strategy processes the deployment exponentially using a 10% growth factor over 20 minutes. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ +RolloutStrategy.CANARY_10_PERCENT_20_MINUTES = RolloutStrategy.exponential({ + growthFactor: 10, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(20), + finalBakeTime: aws_cdk_lib_1.Duration.minutes(10), +}); +/** + * **Testing/Demonstration**. This strategy deploys the configuration to half of all targets every 30 seconds for a + * one-minute deployment. AWS AppConfig recommends using this strategy only for testing or demonstration purposes because + * it has a short duration and bake time. + */ +RolloutStrategy.LINEAR_50_PERCENT_EVERY_30_SECONDS = RolloutStrategy.linear({ + growthFactor: 50, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(1), + finalBakeTime: aws_cdk_lib_1.Duration.minutes(1), +}); +/** + * **AWS Recommended**. This strategy deploys the configuration to 20% of all targets every six minutes for a 30 minute deployment. + * AWS AppConfig recommends using this strategy for production deployments because it aligns with AWS best practices + * for configuration deployments. + */ +RolloutStrategy.LINEAR_20_PERCENT_EVERY_6_MINUTES = RolloutStrategy.linear({ + growthFactor: 20, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(30), + finalBakeTime: aws_cdk_lib_1.Duration.minutes(30), +}); +/** + * **Quick**. This strategy deploys the configuration to all targets immediately. + */ +RolloutStrategy.ALL_AT_ONCE = RolloutStrategy.linear({ + growthFactor: 100, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(0), + finalBakeTime: aws_cdk_lib_1.Duration.minutes(10), +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlcGxveW1lbnQtc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkNBQXFGO0FBQ3JGLDZEQUFrRTtBQTZCbEU7Ozs7O0dBS0c7QUFDSCxNQUFhLGtCQUFtQixTQUFRLHNCQUFRO0lBQzlDOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxxQkFBNkI7Ozs7Ozs7Ozs7UUFDakcsTUFBTSxTQUFTLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLHVCQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRyxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7UUFDcEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFFRCxNQUFNLE1BQU8sU0FBUSxzQkFBUTtZQUE3Qjs7Z0JBQ2tCLHlCQUFvQixHQUFHLG9CQUFxQixDQUFDO2dCQUM3QywwQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztZQUNoRSxDQUFDO1NBQUE7UUFFRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDM0Isa0JBQWtCLEVBQUUscUJBQXFCO1NBQzFDLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLG9CQUEwQzs7Ozs7Ozs7Ozs7UUFDN0csTUFBTSxLQUFLLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzVD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LENBQUMsTUFBTSxDQUFDO0lBQ2pGLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGtCQUFrQixFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN2QyxhQUFhLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQ25DLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDb0IsaURBQWlDLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoRixZQUFZLEVBQUUsRUFBRTtJQUNoQixrQkFBa0IsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDeEMsYUFBYSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztDQUNwQyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNvQiwyQkFBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDMUQsWUFBWSxFQUFFLEdBQUc7SUFDakIsa0JBQWtCLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLGFBQWEsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Q0FDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzb3VyY2UsIElSZXNvdXJjZSwgU3RhY2ssIEFybkZvcm1hdCwgTmFtZXMsIER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuRGVwbG95bWVudFN0cmF0ZWd5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwcGNvbmZpZyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBEZXBsb3ltZW50U3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudFN0cmF0ZWd5UHJvcHMge1xuICAvKipcbiAgICogVGhlIHJvbGxvdXQgc3RyYXRlZ3kgZm9yIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LiBZb3UgY2FuIHVzZSBwcmVkZWZpbmVkIGRlcGxveW1lbnRcbiAgICogc3RyYXRlZ2llcywgc3VjaCBhcyBSb2xsb3V0U3RyYXRlZ3kuQUxMX0FUX09OQ0UsIFJvbGxvdXRTdHJhdGVneS5MSU5FQVJfNTBfUEVSQ0VOVF9FVkVSWV8zMF9TRUNPTkRTLFxuICAgKiBvciBSb2xsb3V0U3RyYXRlZ3kuQ0FOQVJZXzEwX1BFUkNFTlRfMjBfTUlOVVRFUy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmFtZSBpcyBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gQVdTIEFwcENvbmZpZyBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5XG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcHBjb25maWcvbGF0ZXN0L3VzZXJndWlkZS9hcHBjb25maWctY3JlYXRpbmctZGVwbG95bWVudC1zdHJhdGVneS5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50U3RyYXRlZ3kgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElEZXBsb3ltZW50U3RyYXRlZ3kge1xuICAvKipcbiAgICogSW1wb3J0cyBhIGRlcGxveW1lbnQgc3RyYXRlZ3kgaW50byB0aGUgQ0RLIHVzaW5nIGl0cyBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGRlcGxveW1lbnRTdHJhdGVneUFybiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3lcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbURlcGxveW1lbnRTdHJhdGVneUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBkZXBsb3ltZW50U3RyYXRlZ3lBcm46IHN0cmluZyk6IElEZXBsb3ltZW50U3RyYXRlZ3kge1xuICAgIGNvbnN0IHBhcnNlZEFybiA9IFN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihkZXBsb3ltZW50U3RyYXRlZ3lBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICBjb25zdCBkZXBsb3ltZW50U3RyYXRlZ3lJZCA9IHBhcnNlZEFybi5yZXNvdXJjZU5hbWU7XG4gICAgaWYgKCFkZXBsb3ltZW50U3RyYXRlZ3lJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGRlcGxveW1lbnQgc3RyYXRlZ3kgaWQgZnJvbSBkZXBsb3ltZW50IHN0cmF0ZWd5IEFSTicpO1xuICAgIH1cblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSURlcGxveW1lbnRTdHJhdGVneSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95bWVudFN0cmF0ZWd5SWQgPSBkZXBsb3ltZW50U3RyYXRlZ3lJZCE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95bWVudFN0cmF0ZWd5QXJuID0gZGVwbG95bWVudFN0cmF0ZWd5QXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCwge1xuICAgICAgZW52aXJvbm1lbnRGcm9tQXJuOiBkZXBsb3ltZW50U3RyYXRlZ3lBcm4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIGRlcGxveW1lbnQgc3RyYXRlZ3kgaW50byB0aGUgQ0RLIHVzaW5nIGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGRlcGxveW1lbnRTdHJhdGVneUlkIFRoZSBJRCBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGVwbG95bWVudFN0cmF0ZWd5SWQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZGVwbG95bWVudFN0cmF0ZWd5SWQ6IERlcGxveW1lbnRTdHJhdGVneUlkKTogSURlcGxveW1lbnRTdHJhdGVneSB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZGVwbG95bWVudFN0cmF0ZWd5QXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdhcHBjb25maWcnLFxuICAgICAgcmVzb3VyY2U6ICdkZXBsb3ltZW50c3RyYXRlZ3knLFxuICAgICAgcmVzb3VyY2VOYW1lOiBkZXBsb3ltZW50U3RyYXRlZ3lJZC5pZCxcbiAgICB9KTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSURlcGxveW1lbnRTdHJhdGVneSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVwbG95bWVudFN0cmF0ZWd5SWQgPSBkZXBsb3ltZW50U3RyYXRlZ3lJZC5pZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3lBcm4gPSBkZXBsb3ltZW50U3RyYXRlZ3lBcm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBlbnZpcm9ubWVudEZyb21Bcm46IGRlcGxveW1lbnRTdHJhdGVneUFybixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBkdXJhdGlvbiBpbiBtaW51dGVzIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlcGxveW1lbnREdXJhdGlvbkluTWludXRlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGdyb3d0aCBmYWN0b3Igb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3Jvd3RoRmFjdG9yPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaW5hbCBiYWtlIHRpbWUgaW4gbWludXRlcyBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaW5hbEJha2VUaW1lSW5NaW51dGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3Jvd3RoIHR5cGUgb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3Jvd3RoVHlwZT86IEdyb3d0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3lJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3lBcm46IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jZm5EZXBsb3ltZW50U3RyYXRlZ3k6IENmbkRlcGxveW1lbnRTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGVwbG95bWVudFN0cmF0ZWd5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuZGVwbG95bWVudFN0cmF0ZWd5TmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzID0gcHJvcHMucm9sbG91dFN0cmF0ZWd5LmRlcGxveW1lbnREdXJhdGlvbi50b01pbnV0ZXMoKTtcbiAgICB0aGlzLmdyb3d0aEZhY3RvciA9IHByb3BzLnJvbGxvdXRTdHJhdGVneS5ncm93dGhGYWN0b3I7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZmluYWxCYWtlVGltZUluTWludXRlcyA9IHByb3BzLnJvbGxvdXRTdHJhdGVneS5maW5hbEJha2VUaW1lPy50b01pbnV0ZXMoKTtcbiAgICB0aGlzLmdyb3d0aFR5cGUgPSBwcm9wcy5yb2xsb3V0U3RyYXRlZ3kuZ3Jvd3RoVHlwZTtcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5kZXBsb3ltZW50U3RyYXRlZ3lOYW1lIHx8IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5EZXBsb3ltZW50U3RyYXRlZ3kodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiB0aGlzLmRlcGxveW1lbnREdXJhdGlvbkluTWludXRlcyxcbiAgICAgIGdyb3d0aEZhY3RvcjogdGhpcy5ncm93dGhGYWN0b3IsXG4gICAgICByZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBmaW5hbEJha2VUaW1lSW5NaW51dGVzOiB0aGlzLmZpbmFsQmFrZVRpbWVJbk1pbnV0ZXMsXG4gICAgICBncm93dGhUeXBlOiB0aGlzLmdyb3d0aFR5cGUsXG4gICAgfSk7XG4gICAgdGhpcy5fY2ZuRGVwbG95bWVudFN0cmF0ZWd5ID0gcmVzb3VyY2U7XG5cbiAgICB0aGlzLmRlcGxveW1lbnRTdHJhdGVneUlkID0gdGhpcy5fY2ZuRGVwbG95bWVudFN0cmF0ZWd5LnJlZjtcbiAgICB0aGlzLmRlcGxveW1lbnRTdHJhdGVneUFybiA9IHRoaXMuc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdhcHBjb25maWcnLFxuICAgICAgcmVzb3VyY2U6ICdkZXBsb3ltZW50c3RyYXRlZ3knLFxuICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLmRlcGxveW1lbnRTdHJhdGVneUlkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZ3Jvd3RoIHR5cGUgb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBlbnVtIEdyb3d0aFR5cGUge1xuICAvKipcbiAgICogQVdTIEFwcENvbmZpZyB3aWxsIHByb2Nlc3MgdGhlIGRlcGxveW1lbnQgYnkgaW5jcmVtZW50cyBvZiB0aGUgZ3Jvd3RoIGZhY3RvclxuICAgKiBldmVubHkgZGlzdHJpYnV0ZWQgb3ZlciB0aGUgZGVwbG95bWVudC5cbiAgICovXG4gIExJTkVBUiA9ICdMSU5FQVInLFxuXG4gIC8qKlxuICAgKiBBV1MgQXBwQ29uZmlnIHdpbGwgcHJvY2VzcyB0aGUgZGVwbG95bWVudCBleHBvbmVudGlhbGx5IHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYTpcbiAgICogYEcqKDJeTilgLiBJbiB0aGlzIGZvcm11bGEsIGBHYCBpcyB0aGUgc3RlcCBwZXJjZW50YWdlIHNwZWNpZmllZCBieSB0aGUgdXNlciBhbmQgYE5gXG4gICAqIGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgdW50aWwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZGVwbG95ZWQgdG8gYWxsIHRhcmdldHMuXG4gICAqL1xuICBFWFBPTkVOVElBTCA9ICdFWFBPTkVOVElBTCcsXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZGVwbG95bWVudCBzdHJhdGVneSBJRCdzIG9mIEFXUyBBcHBDb25maWcgZGVwbG95bWVudCBzdHJhdGVnaWVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwcGNvbmZpZy9sYXRlc3QvdXNlcmd1aWRlL2FwcGNvbmZpZy1jcmVhdGluZy1kZXBsb3ltZW50LXN0cmF0ZWd5Lmh0bWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlcGxveW1lbnRTdHJhdGVneUlkIHtcbiAgLyoqXG4gICAqICoqQVdTIFJlY29tbWVuZGVkKiouIFRoaXMgc3RyYXRlZ3kgcHJvY2Vzc2VzIHRoZSBkZXBsb3ltZW50IGV4cG9uZW50aWFsbHkgdXNpbmcgYSAxMCUgZ3Jvd3RoIGZhY3RvciBvdmVyIDIwIG1pbnV0ZXMuXG4gICAqIEFXUyBBcHBDb25maWcgcmVjb21tZW5kcyB1c2luZyB0aGlzIHN0cmF0ZWd5IGZvciBwcm9kdWN0aW9uIGRlcGxveW1lbnRzIGJlY2F1c2UgaXQgYWxpZ25zIHdpdGggQVdTIGJlc3QgcHJhY3RpY2VzXG4gICAqIGZvciBjb25maWd1cmF0aW9uIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDQU5BUllfMTBfUEVSQ0VOVF8yMF9NSU5VVEVTID0gRGVwbG95bWVudFN0cmF0ZWd5SWQuZnJvbVN0cmluZygnQXBwQ29uZmlnLkNhbmFyeTEwUGVyY2VudDIwTWludXRlcycpO1xuXG4gIC8qKlxuICAgKiAqKlRlc3RpbmcvRGVtb25zdHJhdGlvbioqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gaGFsZiBvZiBhbGwgdGFyZ2V0cyBldmVyeSAzMCBzZWNvbmRzIGZvciBhXG4gICAqIG9uZS1taW51dGUgZGVwbG95bWVudC4gQVdTIEFwcENvbmZpZyByZWNvbW1lbmRzIHVzaW5nIHRoaXMgc3RyYXRlZ3kgb25seSBmb3IgdGVzdGluZyBvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIGJlY2F1c2VcbiAgICogaXQgaGFzIGEgc2hvcnQgZHVyYXRpb24gYW5kIGJha2UgdGltZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElORUFSXzUwX1BFUkNFTlRfRVZFUllfMzBfU0VDT05EUyA9IERlcGxveW1lbnRTdHJhdGVneUlkLmZyb21TdHJpbmcoJ0FwcENvbmZpZy5MaW5lYXI1MFBlcmNlbnRFdmVyeTMwU2Vjb25kcycpO1xuXG4gIC8qKlxuICAgKiAqKkFXUyBSZWNvbW1lbmRlZCoqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gMjAlIG9mIGFsbCB0YXJnZXRzIGV2ZXJ5IHNpeCBtaW51dGVzIGZvciBhIDMwIG1pbnV0ZSBkZXBsb3ltZW50LlxuICAgKiBBV1MgQXBwQ29uZmlnIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBzdHJhdGVneSBmb3IgcHJvZHVjdGlvbiBkZXBsb3ltZW50cyBiZWNhdXNlIGl0IGFsaWducyB3aXRoIEFXUyBiZXN0IHByYWN0aWNlc1xuICAgKiBmb3IgY29uZmlndXJhdGlvbiBkZXBsb3ltZW50cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElORUFSXzIwX1BFUkNFTlRfRVZFUllfNl9NSU5VVEVTID0gRGVwbG95bWVudFN0cmF0ZWd5SWQuZnJvbVN0cmluZygnQXBwQ29uZmlnLkxpbmVhcjIwUGVyY2VudEV2ZXJ5Nk1pbnV0ZXMnKTtcblxuICAvKipcbiAgICogKipRdWljayoqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYWxsIHRhcmdldHMgaW1tZWRpYXRlbHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFMTF9BVF9PTkNFID0gRGVwbG95bWVudFN0cmF0ZWd5SWQuZnJvbVN0cmluZygnQXBwQ29uZmlnLkFsbEF0T25jZScpO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZXBsb3ltZW50IHN0cmF0ZWd5IElEIGZyb20gYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBsb3ltZW50U3RyYXRlZ3lJZCBUaGUgZGVwbG95bWVudCBzdHJhdGVneSBJRC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyhkZXBsb3ltZW50U3RyYXRlZ3lJZDogc3RyaW5nKTogRGVwbG95bWVudFN0cmF0ZWd5SWQge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGVwbG95bWVudFN0cmF0ZWd5SWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBzdHJhdGVneSBJRC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBSb2xsb3V0IFN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGxvdXRTdHJhdGVneVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBncm93dGggZmFjdG9yIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LiBUaGlzIGRlZmluZXNcbiAgICogdGhlIHBlcmNlbnRhZ2Ugb2YgdGFyZ2V0cyB0byByZWNlaXZlIGEgZGVwbG95ZWQgY29uZmlndXJhdGlvblxuICAgKiBkdXJpbmcgZWFjaCBpbnRlcnZhbC5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3d0aEZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBkdXJhdGlvbiBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS4gVGhpcyBkZWZpbmVzXG4gICAqIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBmb3IgYSBkZXBsb3ltZW50IHRvIGxhc3QuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50RHVyYXRpb246IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZmluYWwgYmFrZSB0aW1lIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKlxuICAgKiBUaGlzIHNldHRpbmcgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGltZSBBV1MgQXBwQ29uZmlnIG1vbml0b3JzIGZvciBBbWF6b25cbiAgICogQ2xvdWRXYXRjaCBhbGFybXMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gZGVwbG95ZWQgdG9cbiAgICogMTAwJSBvZiBpdHMgdGFyZ2V0cywgYmVmb3JlIGNvbnNpZGVyaW5nIHRoZSBkZXBsb3ltZW50IHRvIGJlIGNvbXBsZXRlLlxuICAgKiBJZiBhbiBhbGFybSBpcyB0cmlnZ2VyZWQgZHVyaW5nIHRoaXMgdGltZSwgQVdTIEFwcENvbmZpZyByb2xscyBiYWNrXG4gICAqIHRoZSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDApXG4gICAqL1xuICByZWFkb25seSBmaW5hbEJha2VUaW1lPzogRHVyYXRpb247XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcm9sbG91dCBzdHJhdGVneSBmb3IgYSBkZXBsb3ltZW50IHN0cmF0ZWd5IGFuZCBpbmNsdWRlcyB0aGUgZ3Jvd3RoIGZhY3RvcixcbiAqIGRlcGxveW1lbnQgZHVyYXRpb24sIGdyb3d0aCB0eXBlLCBhbmQgb3B0aW9uYWxseSBmaW5hbCBiYWtlIHRpbWUuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBwY29uZmlnL2xhdGVzdC91c2VyZ3VpZGUvYXBwY29uZmlnLWNyZWF0aW5nLWRlcGxveW1lbnQtc3RyYXRlZ3kuaHRtbFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUm9sbG91dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqICoqQVdTIFJlY29tbWVuZGVkKiouIFRoaXMgc3RyYXRlZ3kgcHJvY2Vzc2VzIHRoZSBkZXBsb3ltZW50IGV4cG9uZW50aWFsbHkgdXNpbmcgYSAxMCUgZ3Jvd3RoIGZhY3RvciBvdmVyIDIwIG1pbnV0ZXMuXG4gICAqIEFXUyBBcHBDb25maWcgcmVjb21tZW5kcyB1c2luZyB0aGlzIHN0cmF0ZWd5IGZvciBwcm9kdWN0aW9uIGRlcGxveW1lbnRzIGJlY2F1c2UgaXQgYWxpZ25zIHdpdGggQVdTIGJlc3QgcHJhY3RpY2VzXG4gICAqIGZvciBjb25maWd1cmF0aW9uIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDQU5BUllfMTBfUEVSQ0VOVF8yMF9NSU5VVEVTID0gUm9sbG91dFN0cmF0ZWd5LmV4cG9uZW50aWFsKHtcbiAgICBncm93dGhGYWN0b3I6IDEwLFxuICAgIGRlcGxveW1lbnREdXJhdGlvbjogRHVyYXRpb24ubWludXRlcygyMCksXG4gICAgZmluYWxCYWtlVGltZTogRHVyYXRpb24ubWludXRlcygxMCksXG4gIH0pO1xuXG4gIC8qKlxuICAgKiAqKlRlc3RpbmcvRGVtb25zdHJhdGlvbioqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gaGFsZiBvZiBhbGwgdGFyZ2V0cyBldmVyeSAzMCBzZWNvbmRzIGZvciBhXG4gICAqIG9uZS1taW51dGUgZGVwbG95bWVudC4gQVdTIEFwcENvbmZpZyByZWNvbW1lbmRzIHVzaW5nIHRoaXMgc3RyYXRlZ3kgb25seSBmb3IgdGVzdGluZyBvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIGJlY2F1c2VcbiAgICogaXQgaGFzIGEgc2hvcnQgZHVyYXRpb24gYW5kIGJha2UgdGltZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElORUFSXzUwX1BFUkNFTlRfRVZFUllfMzBfU0VDT05EUyA9IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgIGdyb3d0aEZhY3RvcjogNTAsXG4gICAgZGVwbG95bWVudER1cmF0aW9uOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgIGZpbmFsQmFrZVRpbWU6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gIH0pO1xuXG4gIC8qKlxuICAgKiAqKkFXUyBSZWNvbW1lbmRlZCoqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gMjAlIG9mIGFsbCB0YXJnZXRzIGV2ZXJ5IHNpeCBtaW51dGVzIGZvciBhIDMwIG1pbnV0ZSBkZXBsb3ltZW50LlxuICAgKiBBV1MgQXBwQ29uZmlnIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBzdHJhdGVneSBmb3IgcHJvZHVjdGlvbiBkZXBsb3ltZW50cyBiZWNhdXNlIGl0IGFsaWducyB3aXRoIEFXUyBiZXN0IHByYWN0aWNlc1xuICAgKiBmb3IgY29uZmlndXJhdGlvbiBkZXBsb3ltZW50cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElORUFSXzIwX1BFUkNFTlRfRVZFUllfNl9NSU5VVEVTID0gUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgZ3Jvd3RoRmFjdG9yOiAyMCxcbiAgICBkZXBsb3ltZW50RHVyYXRpb246IER1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgIGZpbmFsQmFrZVRpbWU6IER1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICB9KTtcblxuICAvKipcbiAgICogKipRdWljayoqLiBUaGlzIHN0cmF0ZWd5IGRlcGxveXMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYWxsIHRhcmdldHMgaW1tZWRpYXRlbHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFMTF9BVF9PTkNFID0gUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgZ3Jvd3RoRmFjdG9yOiAxMDAsXG4gICAgZGVwbG95bWVudER1cmF0aW9uOiBEdXJhdGlvbi5taW51dGVzKDApLFxuICAgIGZpbmFsQmFrZVRpbWU6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICB9KTtcblxuICAvKipcbiAgICogQnVpbGQgeW91ciBvd24gbGluZWFyIHJvbGxvdXQgc3RyYXRlZ3kuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxpbmVhcihwcm9wczogUm9sbG91dFN0cmF0ZWd5UHJvcHMpOiBSb2xsb3V0U3RyYXRlZ3kge1xuICAgIHJldHVybiB7XG4gICAgICBncm93dGhGYWN0b3I6IHByb3BzLmdyb3d0aEZhY3RvcixcbiAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogcHJvcHMuZGVwbG95bWVudER1cmF0aW9uLFxuICAgICAgZ3Jvd3RoVHlwZTogR3Jvd3RoVHlwZS5MSU5FQVIsXG4gICAgICBmaW5hbEJha2VUaW1lOiBwcm9wcy5maW5hbEJha2VUaW1lLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgeW91ciBvd24gZXhwb25lbnRpYWwgcm9sbG91dCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXhwb25lbnRpYWwocHJvcHM6IFJvbGxvdXRTdHJhdGVneVByb3BzKTogUm9sbG91dFN0cmF0ZWd5IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3Jvd3RoRmFjdG9yOiBwcm9wcy5ncm93dGhGYWN0b3IsXG4gICAgICBkZXBsb3ltZW50RHVyYXRpb246IHByb3BzLmRlcGxveW1lbnREdXJhdGlvbixcbiAgICAgIGdyb3d0aFR5cGU6IEdyb3d0aFR5cGUuRVhQT05FTlRJQUwsXG4gICAgICBmaW5hbEJha2VUaW1lOiBwcm9wcy5maW5hbEJha2VUaW1lLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdyb3d0aCBmYWN0b3Igb2YgdGhlIHJvbGxvdXQgc3RyYXRlZ3kuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZ3Jvd3RoRmFjdG9yOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IGR1cmF0aW9uIG9mIHRoZSByb2xsb3V0IHN0cmF0ZWd5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGRlcGxveW1lbnREdXJhdGlvbjogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBncm93dGggdHlwZSBvZiB0aGUgcm9sbG91dCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBncm93dGhUeXBlPzogR3Jvd3RoVHlwZTtcblxuICAvKipcbiAgICogVGhlIGZpbmFsIGJha2UgdGltZSBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBmaW5hbEJha2VUaW1lPzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlcGxveW1lbnRTdHJhdGVneSBleHRlbmRzIElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IGR1cmF0aW9uIGluIG1pbnV0ZXMuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50RHVyYXRpb25Jbk1pbnV0ZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBncm93dGggZmFjdG9yIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKi9cbiAgcmVhZG9ubHkgZ3Jvd3RoRmFjdG9yPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcGxveW1lbnQgc3RyYXRlZ3kuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbmFsIGJha2UgdGltZSBpbiBtaW51dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluYWxCYWtlVGltZUluTWludXRlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGdyb3d0aCB0eXBlIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKi9cbiAgcmVhZG9ubHkgZ3Jvd3RoVHlwZT86IEdyb3d0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZGVwbG95bWVudCBzdHJhdGVneS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFN0cmF0ZWd5SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBkZXBsb3ltZW50IHN0cmF0ZWd5LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50U3RyYXRlZ3lBcm46IHN0cmluZztcbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.d.ts new file mode 100644 index 0000000000000..030e33c751647 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.d.ts @@ -0,0 +1,296 @@ +import { Resource, IResource } from 'aws-cdk-lib'; +import { CfnEnvironment } from 'aws-cdk-lib/aws-appconfig'; +import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { Construct } from 'constructs'; +import { IApplication } from './application'; +import { ActionPoint, IEventDestination, ExtensionOptions, IExtension, IExtensible, ExtensibleBase } from './extension'; +/** + * Attributes of an existing AWS AppConfig environment to import it. + */ +export interface EnvironmentAttributes { + /** + * The application associated with the environment. + */ + readonly application: IApplication; + /** + * The ID of the environment. + */ + readonly environmentId: string; + /** + * The name of the environment. + * + * @default - None. + */ + readonly name?: string; + /** + * The description of the environment. + * + * @default - None. + */ + readonly description?: string; + /** + * The monitors for the environment. + * + * @default - None. + */ + readonly monitors?: Monitor[]; +} +declare abstract class EnvironmentBase extends Resource implements IEnvironment, IExtensible { + abstract applicationId: string; + abstract environmentId: string; + abstract environmentArn: string; + protected extensible: ExtensibleBase; + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + addExtension(extension: IExtension): void; +} +/** + * Options for the Environment construct. + */ +export interface EnvironmentOptions { + /** + * The name of the environment. + * + * @default - A name is generated. + */ + readonly environmentName?: string; + /** + * The description of the environment. + * + * @default - No description. + */ + readonly description?: string; + /** + * The monitors for the environment. + * + * @default - No monitors. + */ + readonly monitors?: Monitor[]; +} +/** + * Properties for the Environment construct. + */ +export interface EnvironmentProps extends EnvironmentOptions { + /** + * The application to be associated with the environment. + */ + readonly application: IApplication; +} +/** + * An AWS AppConfig environment. + * + * @resource AWS::AppConfig::Environment + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-environment.html + */ +export declare class Environment extends EnvironmentBase { + /** + * Imports an environment into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the environment construct + * @param environmentArn The Amazon Resource Name (ARN) of the environment + */ + static fromEnvironmentArn(scope: Construct, id: string, environmentArn: string): IEnvironment; + /** + * Imports an environment into the CDK from its attributes. + * + * @param scope The parent construct + * @param id The name of the environment construct + * @param attrs The attributes of the environment + */ + static fromEnvironmentAttributes(scope: Construct, id: string, attrs: EnvironmentAttributes): IEnvironment; + /** + * The application associated with the environment. + */ + readonly application?: IApplication; + /** + * The name of the environment. + */ + readonly name?: string; + /** + * The description of the environment. + */ + readonly description?: string; + /** + * The monitors for the environment. + */ + readonly monitors?: Monitor[]; + /** + * The ID of the environment. + * + * @attribute + */ + readonly environmentId: string; + /** + * The Amazon Resource Name (ARN) of the environment. + * + * @attribute + */ + readonly environmentArn: string; + /** + * The ID of the environment. + */ + readonly applicationId: string; + private readonly _cfnEnvironment; + constructor(scope: Construct, id: string, props: EnvironmentProps); + private createOrGetAlarmRole; +} +/** + * The type of Monitor. + */ +export declare enum MonitorType { + /** + * A Monitor from a CloudWatch alarm. + */ + CLOUDWATCH = 0, + /** + * A Monitor from a CfnEnvironment.MonitorsProperty construct. + */ + CFN_MONITORS_PROPERTY = 1 +} +/** + * Defines monitors that will be associated with an AWS AppConfig environment. + */ +export declare abstract class Monitor { + /** + * Creates a Monitor from a CloudWatch alarm. If the alarm role is not specified, a role will + * be generated. + * + * @param alarm The Amazon CloudWatch alarm. + * @param alarmRole The IAM role for AWS AppConfig to view the alarm state. + */ + static fromCloudWatchAlarm(alarm: cloudwatch.IAlarm, alarmRole?: iam.IRole): Monitor; + /** + * Creates a Monitor from a CfnEnvironment.MonitorsProperty construct. + * + * @param monitorsProperty The monitors property. + */ + static fromCfnMonitorsProperty(monitorsProperty: CfnEnvironment.MonitorsProperty): Monitor; + /** + * The alarm ARN for AWS AppConfig to monitor. + */ + abstract readonly alarmArn: string; + /** + * The type of monitor. + */ + abstract readonly monitorType: MonitorType; + /** + * The IAM role ARN for AWS AppConfig to view the alarm state. + */ + abstract readonly alarmRoleArn?: string; + /** + * Indicates whether a CloudWatch alarm is a composite alarm. + */ + abstract readonly isCompositeAlarm?: boolean; +} +export interface IEnvironment extends IResource { + /** + * The application associated with the environment. + */ + readonly application?: IApplication; + /** + * The ID of the application associated to the environment. + */ + readonly applicationId: string; + /** + * The name of the environment. + */ + readonly name?: string; + /** + * The description of the environment. + */ + readonly description?: string; + /** + * The monitors for the environment. + */ + readonly monitors?: Monitor[]; + /** + * The ID of the environment. + * @attribute + */ + readonly environmentId: string; + /** + * The Amazon Resource Name (ARN) of the environment. + * @attribute + */ + readonly environmentArn: string; + /** + * Adds an extension defined by the action point and event destination and also + * creates an extension association to the environment. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event destination + * and also creates an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and also creates + * an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination and also creates + * an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and also + * creates an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and + * also creates an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and + * also creates an extension association to the environment. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an extension association to the environment. + * + * @param extension The extension to create an association for + */ + addExtension(extension: IExtension): void; +} +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.js new file mode 100644 index 0000000000000..1c1114c7a8080 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/environment.js @@ -0,0 +1,274 @@ +"use strict"; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Monitor = exports.MonitorType = exports.Environment = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_appconfig_1 = require("aws-cdk-lib/aws-appconfig"); +const iam = require("aws-cdk-lib/aws-iam"); +const extension_1 = require("./extension"); +const hash_1 = require("./private/hash"); +class EnvironmentBase extends aws_cdk_lib_1.Resource { + on(actionPoint, eventDestination, options) { + this.extensible.on(actionPoint, eventDestination, options); + } + preCreateHostedConfigurationVersion(eventDestination, options) { + this.extensible.preCreateHostedConfigurationVersion(eventDestination, options); + } + preStartDeployment(eventDestination, options) { + this.extensible.preStartDeployment(eventDestination, options); + } + onDeploymentStart(eventDestination, options) { + this.extensible.onDeploymentStart(eventDestination, options); + } + onDeploymentStep(eventDestination, options) { + this.extensible.onDeploymentStep(eventDestination, options); + } + onDeploymentBaking(eventDestination, options) { + this.extensible.onDeploymentBaking(eventDestination, options); + } + onDeploymentComplete(eventDestination, options) { + this.extensible.onDeploymentComplete(eventDestination, options); + } + onDeploymentRolledBack(eventDestination, options) { + this.extensible.onDeploymentRolledBack(eventDestination, options); + } + addExtension(extension) { + this.extensible.addExtension(extension); + } +} +/** + * An AWS AppConfig environment. + * + * @resource AWS::AppConfig::Environment + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-environment.html + */ +class Environment extends EnvironmentBase { + /** + * Imports an environment into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the environment construct + * @param environmentArn The Amazon Resource Name (ARN) of the environment + */ + static fromEnvironmentArn(scope, id, environmentArn) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Environment#fromEnvironmentArn", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromEnvironmentArn); + } + throw error; + } + const parsedArn = aws_cdk_lib_1.Stack.of(scope).splitArn(environmentArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME); + if (!parsedArn.resourceName) { + throw new Error(`Missing required /$/{applicationId}/environment//$/{environmentId} from environment ARN: ${parsedArn.resourceName}`); + } + const resourceName = parsedArn.resourceName.split('/'); + if (resourceName.length != 3 || !resourceName[0] || !resourceName[2]) { + throw new Error('Missing required parameters for environment ARN: format should be /$/{applicationId}/environment//$/{environmentId}'); + } + const applicationId = resourceName[0]; + const environmentId = resourceName[2]; + class Import extends EnvironmentBase { + constructor() { + super(...arguments); + this.applicationId = applicationId; + this.environmentId = environmentId; + this.environmentArn = environmentArn; + } + } + return new Import(scope, id, { + environmentFromArn: environmentArn, + }); + } + /** + * Imports an environment into the CDK from its attributes. + * + * @param scope The parent construct + * @param id The name of the environment construct + * @param attrs The attributes of the environment + */ + static fromEnvironmentAttributes(scope, id, attrs) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Environment#fromEnvironmentAttributes", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_EnvironmentAttributes(attrs); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromEnvironmentAttributes); + } + throw error; + } + const applicationId = attrs.application.applicationId; + const environmentId = attrs.environmentId; + const stack = aws_cdk_lib_1.Stack.of(scope); + const environmentArn = stack.formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: `${applicationId}/environment/${environmentId}`, + }); + class Import extends EnvironmentBase { + constructor() { + super(...arguments); + this.application = attrs.application; + this.applicationId = attrs.application.applicationId; + this.name = attrs.name; + this.environmentId = environmentId; + this.environmentArn = environmentArn; + this.description = attrs.description; + this.monitors = attrs.monitors; + } + } + return new Import(scope, id, { + environmentFromArn: environmentArn, + }); + } + constructor(scope, id, props) { + super(scope, id, { + physicalName: props.environmentName, + }); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Environment", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_EnvironmentProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Environment); + } + throw error; + } + this.name = props.environmentName || aws_cdk_lib_1.Names.uniqueResourceName(this, { + maxLength: 64, + separator: '-', + }); + this.application = props.application; + this.applicationId = this.application.applicationId; + this.description = props.description; + this.monitors = props.monitors; + const resource = new aws_appconfig_1.CfnEnvironment(this, 'Resource', { + applicationId: this.applicationId, + name: this.name, + description: this.description, + monitors: this.monitors?.map((monitor) => { + return { + alarmArn: monitor.alarmArn, + ...(monitor.monitorType === MonitorType.CLOUDWATCH + ? { alarmRoleArn: monitor.alarmRoleArn || this.createOrGetAlarmRole().roleArn } + : { alarmRoleArn: monitor.alarmRoleArn }), + }; + }), + }); + this._cfnEnvironment = resource; + this.environmentId = this._cfnEnvironment.ref; + this.environmentArn = this.stack.formatArn({ + service: 'appconfig', + resource: 'application', + resourceName: `${this.applicationId}/environment/${this.environmentId}`, + }); + this.extensible = new extension_1.ExtensibleBase(this, this.environmentArn, this.name); + this.application.addExistingEnvironment(this); + } + createOrGetAlarmRole() { + // the name is guaranteed to be set in line 243 + const logicalId = `Role${(0, hash_1.getHash)(this.name)}`; + const existingRole = this.node.tryFindChild(logicalId); + if (existingRole) { + return existingRole; + } + // this scope is fine for cloudwatch:DescribeAlarms since it is readonly + // and it is required for composite alarms + // https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html + const policy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: ['cloudwatch:DescribeAlarms'], + resources: ['*'], + }); + const document = new iam.PolicyDocument({ + statements: [policy], + }); + const role = new iam.Role(this, logicalId, { + roleName: aws_cdk_lib_1.PhysicalName.GENERATE_IF_NEEDED, + assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'), + inlinePolicies: { + ['AllowAppConfigMonitorAlarmPolicy']: document, + }, + }); + return role; + } +} +exports.Environment = Environment; +_a = JSII_RTTI_SYMBOL_1; +Environment[_a] = { fqn: "@aws-cdk/aws-appconfig-alpha.Environment", version: "0.0.0" }; +/** + * The type of Monitor. + */ +var MonitorType; +(function (MonitorType) { + /** + * A Monitor from a CloudWatch alarm. + */ + MonitorType[MonitorType["CLOUDWATCH"] = 0] = "CLOUDWATCH"; + /** + * A Monitor from a CfnEnvironment.MonitorsProperty construct. + */ + MonitorType[MonitorType["CFN_MONITORS_PROPERTY"] = 1] = "CFN_MONITORS_PROPERTY"; +})(MonitorType || (exports.MonitorType = MonitorType = {})); +/** + * Defines monitors that will be associated with an AWS AppConfig environment. + */ +class Monitor { + /** + * Creates a Monitor from a CloudWatch alarm. If the alarm role is not specified, a role will + * be generated. + * + * @param alarm The Amazon CloudWatch alarm. + * @param alarmRole The IAM role for AWS AppConfig to view the alarm state. + */ + static fromCloudWatchAlarm(alarm, alarmRole) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Monitor#fromCloudWatchAlarm", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromCloudWatchAlarm); + } + throw error; + } + return { + alarmArn: alarm.alarmArn, + alarmRoleArn: alarmRole?.roleArn, + monitorType: MonitorType.CLOUDWATCH, + }; + } + /** + * Creates a Monitor from a CfnEnvironment.MonitorsProperty construct. + * + * @param monitorsProperty The monitors property. + */ + static fromCfnMonitorsProperty(monitorsProperty) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Monitor#fromCfnMonitorsProperty", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromCfnMonitorsProperty); + } + throw error; + } + if (monitorsProperty.alarmArn === undefined) { + throw new Error('You must specify an alarmArn property to use "fromCfnMonitorsProperty".'); + } + return { + alarmArn: monitorsProperty.alarmArn, + alarmRoleArn: monitorsProperty.alarmRoleArn, + monitorType: MonitorType.CFN_MONITORS_PROPERTY, + }; + } +} +exports.Monitor = Monitor; +_b = JSII_RTTI_SYMBOL_1; +Monitor[_b] = { fqn: "@aws-cdk/aws-appconfig-alpha.Monitor", version: "0.0.0" }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2Q0FBeUY7QUFDekYsNkRBQTJEO0FBRTNELDJDQUEyQztBQUczQywyQ0FBd0g7QUFDeEgseUNBQXlDO0FBc0N6QyxNQUFlLGVBQWdCLFNBQVEsc0JBQVE7SUFNdEMsRUFBRSxDQUFDLFdBQXdCLEVBQUUsZ0JBQW1DLEVBQUUsT0FBMEI7UUFDakcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzVEO0lBRU0sbUNBQW1DLENBQUMsZ0JBQW1DLEVBQUUsT0FBMEI7UUFDeEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNoRjtJQUVNLGtCQUFrQixDQUFDLGdCQUFtQyxFQUFFLE9BQTBCO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDL0Q7SUFFTSxpQkFBaUIsQ0FBQyxnQkFBbUMsRUFBRSxPQUEwQjtRQUN0RixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzlEO0lBRU0sZ0JBQWdCLENBQUMsZ0JBQW1DLEVBQUUsT0FBMEI7UUFDckYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUM3RDtJQUVNLGtCQUFrQixDQUFDLGdCQUFtQyxFQUFFLE9BQTBCO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDL0Q7SUFFTSxvQkFBb0IsQ0FBQyxnQkFBbUMsRUFBRSxPQUEwQjtRQUN6RixJ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QUssU0FBUyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO1FBQzdGLENBQUM7UUFDRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7WUFDbkMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLFlBQVk7WUFDM0MsV0FBVyxFQUFFLFdBQVcsQ0FBQyxxQkFBcUI7U0FDL0MsQ0FBQztLQUNIOztBQTlCSCwwQkFtREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZSwgSVJlc291cmNlLCBTdGFjaywgQXJuRm9ybWF0LCBQaHlzaWNhbE5hbWUsIE5hbWVzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuRW52aXJvbm1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBwY29uZmlnJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb24gfSBmcm9tICcuL2FwcGxpY2F0aW9uJztcbmltcG9ydCB7IEFjdGlvblBvaW50LCBJRXZlbnREZXN0aW5hdGlvbiwgRXh0ZW5zaW9uT3B0aW9ucywgSUV4dGVuc2lvbiwgSUV4dGVuc2libGUsIEV4dGVuc2libGVCYXNlIH0gZnJvbSAnLi9leHRlbnNpb24nO1xuaW1wb3J0IHsgZ2V0SGFzaCB9IGZyb20gJy4vcHJpdmF0ZS9oYXNoJztcblxuLyoqXG4gKiBBdHRyaWJ1dGVzIG9mIGFuIGV4aXN0aW5nIEFXUyBBcHBDb25maWcgZW52aXJvbm1lbnQgdG8gaW1wb3J0IGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb25pdG9ycyBmb3IgdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBtb25pdG9ycz86IE1vbml0b3JbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgRW52aXJvbm1lbnRCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJRW52aXJvbm1lbnQsIElFeHRlbnNpYmxlIHtcbiAgcHVibGljIGFic3RyYWN0IGFwcGxpY2F0aW9uSWQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IGVudmlyb25tZW50QXJuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBleHRlbnNpYmxlITogRXh0ZW5zaWJsZUJhc2U7XG5cbiAgcHVibGljIG9uKGFjdGlvblBvaW50OiBBY3Rpb25Qb2ludCwgZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uKGFjdGlvblBvaW50LCBldmVudERlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVDcmVhdGVIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbihldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2libGUucHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24oZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgcHJlU3RhcnREZXBsb3ltZW50KGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5wcmVTdGFydERlcGxveW1lbnQoZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25EZXBsb3ltZW50U3RhcnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFN0YXJ0KGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25EZXBsb3ltZW50QmFraW5nKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5vbkRlcGxveW1lbnRCYWtpbmcoZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgb25EZXBsb3ltZW50Q29tcGxldGUoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudENvbXBsZXRlKGV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5leHRlbnNpYmxlLm9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbjogSUV4dGVuc2lvbikge1xuICAgIHRoaXMuZXh0ZW5zaWJsZS5hZGRFeHRlbnNpb24oZXh0ZW5zaW9uKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBFbnZpcm9ubWVudCBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIG5hbWUgaXMgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb25pdG9ycyBmb3IgdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1vbml0b3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcnM/OiBNb25pdG9yW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEVudmlyb25tZW50IGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudFByb3BzIGV4dGVuZHMgRW52aXJvbm1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbjtcbn1cblxuLyoqXG4gKiBBbiBBV1MgQXBwQ29uZmlnIGVudmlyb25tZW50LlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnRcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwcGNvbmZpZy9sYXRlc3QvdXNlcmd1aWRlL2FwcGNvbmZpZy1jcmVhdGluZy1lbnZpcm9ubWVudC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBleHRlbmRzIEVudmlyb25tZW50QmFzZSB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGVudmlyb25tZW50IGludG8gdGhlIENESyB1c2luZyBpdHMgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRBcm4gVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRW52aXJvbm1lbnRBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZW52aXJvbm1lbnRBcm46IHN0cmluZyk6IElFbnZpcm9ubWVudCB7XG4gICAgY29uc3QgcGFyc2VkQXJuID0gU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKGVudmlyb25tZW50QXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG4gICAgaWYgKCFwYXJzZWRBcm4ucmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgLyQve2FwcGxpY2F0aW9uSWR9L2Vudmlyb25tZW50Ly8kL3tlbnZpcm9ubWVudElkfSBmcm9tIGVudmlyb25tZW50IEFSTjogJHtwYXJzZWRBcm4ucmVzb3VyY2VOYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHBhcnNlZEFybi5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKTtcbiAgICBpZiAocmVzb3VyY2VOYW1lLmxlbmd0aCAhPSAzIHx8ICFyZXNvdXJjZU5hbWVbMF0gfHwgIXJlc291cmNlTmFtZVsyXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMgZm9yIGVudmlyb25tZW50IEFSTjogZm9ybWF0IHNob3VsZCBiZSAvJC97YXBwbGljYXRpb25JZH0vZW52aXJvbm1lbnQvLyQve2Vudmlyb25tZW50SWR9Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwbGljYXRpb25JZCA9IHJlc291cmNlTmFtZVswXTtcbiAgICBjb25zdCBlbnZpcm9ubWVudElkID0gcmVzb3VyY2VOYW1lWzJdO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgRW52aXJvbm1lbnRCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBsaWNhdGlvbklkID0gYXBwbGljYXRpb25JZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudElkID0gZW52aXJvbm1lbnRJZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudEFybiA9IGVudmlyb25tZW50QXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCwge1xuICAgICAgZW52aXJvbm1lbnRGcm9tQXJuOiBlbnZpcm9ubWVudEFybixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGVudmlyb25tZW50IGludG8gdGhlIENESyBmcm9tIGl0cyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRW52aXJvbm1lbnRBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBFbnZpcm9ubWVudEF0dHJpYnV0ZXMpOiBJRW52aXJvbm1lbnQge1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBhdHRycy5hcHBsaWNhdGlvbi5hcHBsaWNhdGlvbklkO1xuICAgIGNvbnN0IGVudmlyb25tZW50SWQgPSBhdHRycy5lbnZpcm9ubWVudElkO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZW52aXJvbm1lbnRBcm4gPSBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgIHJlc291cmNlTmFtZTogYCR7YXBwbGljYXRpb25JZH0vZW52aXJvbm1lbnQvJHtlbnZpcm9ubWVudElkfWAsXG4gICAgfSk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBFbnZpcm9ubWVudEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uID0gYXR0cnMuYXBwbGljYXRpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXBwbGljYXRpb25JZCA9IGF0dHJzLmFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IGF0dHJzLm5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW52aXJvbm1lbnRJZCA9IGVudmlyb25tZW50SWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW52aXJvbm1lbnRBcm4gPSBlbnZpcm9ubWVudEFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IGF0dHJzLmRlc2NyaXB0aW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG1vbml0b3JzID0gYXR0cnMubW9uaXRvcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBlbnZpcm9ubWVudEZyb21Bcm46IGVudmlyb25tZW50QXJuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uPzogSUFwcGxpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbml0b3JzIGZvciB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9uaXRvcnM/OiBNb25pdG9yW107XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcGxpY2F0aW9uSWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jZm5FbnZpcm9ubWVudDogQ2ZuRW52aXJvbm1lbnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVudmlyb25tZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuZW52aXJvbm1lbnROYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lID0gcHJvcHMuZW52aXJvbm1lbnROYW1lIHx8IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBsaWNhdGlvbiA9IHByb3BzLmFwcGxpY2F0aW9uO1xuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IHRoaXMuYXBwbGljYXRpb24uYXBwbGljYXRpb25JZDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5tb25pdG9ycyA9IHByb3BzLm1vbml0b3JzO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuRW52aXJvbm1lbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5hcHBsaWNhdGlvbklkLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBtb25pdG9yczogdGhpcy5tb25pdG9ycz8ubWFwKChtb25pdG9yKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWxhcm1Bcm46IG1vbml0b3IuYWxhcm1Bcm4sXG4gICAgICAgICAgLi4uKG1vbml0b3IubW9uaXRvclR5cGUgPT09IE1vbml0b3JUeXBlLkNMT1VEV0FUQ0hcbiAgICAgICAgICAgID8geyBhbGFybVJvbGVBcm46IG1vbml0b3IuYWxhcm1Sb2xlQXJuIHx8IHRoaXMuY3JlYXRlT3JHZXRBbGFybVJvbGUoKS5yb2xlQXJuIH1cbiAgICAgICAgICAgIDogeyBhbGFybVJvbGVBcm46IG1vbml0b3IuYWxhcm1Sb2xlQXJuIH0pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSk7XG4gICAgdGhpcy5fY2ZuRW52aXJvbm1lbnQgPSByZXNvdXJjZTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRJZCA9IHRoaXMuX2NmbkVudmlyb25tZW50LnJlZjtcbiAgICB0aGlzLmVudmlyb25tZW50QXJuID0gdGhpcy5zdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgIHJlc291cmNlTmFtZTogYCR7dGhpcy5hcHBsaWNhdGlvbklkfS9lbnZpcm9ubWVudC8ke3RoaXMuZW52aXJvbm1lbnRJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMuZXh0ZW5zaWJsZSA9IG5ldyBFeHRlbnNpYmxlQmFzZSh0aGlzLCB0aGlzLmVudmlyb25tZW50QXJuLCB0aGlzLm5hbWUpO1xuXG4gICAgdGhpcy5hcHBsaWNhdGlvbi5hZGRFeGlzdGluZ0Vudmlyb25tZW50KHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPckdldEFsYXJtUm9sZSgpOiBpYW0uSVJvbGUge1xuICAgIC8vIHRoZSBuYW1lIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IGluIGxpbmUgMjQzXG4gICAgY29uc3QgbG9naWNhbElkID0gYFJvbGUke2dldEhhc2godGhpcy5uYW1lISl9YDtcbiAgICBjb25zdCBleGlzdGluZ1JvbGUgPSB0aGlzLm5vZGUudHJ5RmluZENoaWxkKGxvZ2ljYWxJZCkgYXMgaWFtLklSb2xlO1xuICAgIGlmIChleGlzdGluZ1JvbGUpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ1JvbGU7XG4gICAgfVxuICAgIC8vIHRoaXMgc2NvcGUgaXMgZmluZSBmb3IgY2xvdWR3YXRjaDpEZXNjcmliZUFsYXJtcyBzaW5jZSBpdCBpcyByZWFkb25seVxuICAgIC8vIGFuZCBpdCBpcyByZXF1aXJlZCBmb3IgY29tcG9zaXRlIGFsYXJtc1xuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQWxhcm1zLmh0bWxcbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2Nsb3Vkd2F0Y2g6RGVzY3JpYmVBbGFybXMnXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSk7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgIHN0YXRlbWVudHM6IFtwb2xpY3ldLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgbG9naWNhbElkLCB7XG4gICAgICByb2xlTmFtZTogUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhcHBjb25maWcuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgWydBbGxvd0FwcENvbmZpZ01vbml0b3JBbGFybVBvbGljeSddOiBkb2N1bWVudCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBNb25pdG9yLlxuICovXG5leHBvcnQgZW51bSBNb25pdG9yVHlwZSB7XG4gIC8qKlxuICAgKiBBIE1vbml0b3IgZnJvbSBhIENsb3VkV2F0Y2ggYWxhcm0uXG4gICAqL1xuICBDTE9VRFdBVENILFxuXG4gIC8qKlxuICAgKiBBIE1vbml0b3IgZnJvbSBhIENmbkVudmlyb25tZW50Lk1vbml0b3JzUHJvcGVydHkgY29uc3RydWN0LlxuICAgKi9cbiAgQ0ZOX01PTklUT1JTX1BST1BFUlRZLFxufVxuXG4vKipcbiAqIERlZmluZXMgbW9uaXRvcnMgdGhhdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBBV1MgQXBwQ29uZmlnIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9uaXRvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgTW9uaXRvciBmcm9tIGEgQ2xvdWRXYXRjaCBhbGFybS4gSWYgdGhlIGFsYXJtIHJvbGUgaXMgbm90IHNwZWNpZmllZCwgYSByb2xlIHdpbGxcbiAgICogYmUgZ2VuZXJhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gYWxhcm0gVGhlIEFtYXpvbiBDbG91ZFdhdGNoIGFsYXJtLlxuICAgKiBAcGFyYW0gYWxhcm1Sb2xlIFRoZSBJQU0gcm9sZSBmb3IgQVdTIEFwcENvbmZpZyB0byB2aWV3IHRoZSBhbGFybSBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNsb3VkV2F0Y2hBbGFybShhbGFybTogY2xvdWR3YXRjaC5JQWxhcm0sIGFsYXJtUm9sZT86IGlhbS5JUm9sZSk6IE1vbml0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICBhbGFybUFybjogYWxhcm0uYWxhcm1Bcm4sXG4gICAgICBhbGFybVJvbGVBcm46IGFsYXJtUm9sZT8ucm9sZUFybixcbiAgICAgIG1vbml0b3JUeXBlOiBNb25pdG9yVHlwZS5DTE9VRFdBVENILFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIE1vbml0b3IgZnJvbSBhIENmbkVudmlyb25tZW50Lk1vbml0b3JzUHJvcGVydHkgY29uc3RydWN0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9uaXRvcnNQcm9wZXJ0eSBUaGUgbW9uaXRvcnMgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DZm5Nb25pdG9yc1Byb3BlcnR5KG1vbml0b3JzUHJvcGVydHk6IENmbkVudmlyb25tZW50Lk1vbml0b3JzUHJvcGVydHkpOiBNb25pdG9yIHtcbiAgICBpZiAobW9uaXRvcnNQcm9wZXJ0eS5hbGFybUFybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNwZWNpZnkgYW4gYWxhcm1Bcm4gcHJvcGVydHkgdG8gdXNlIFwiZnJvbUNmbk1vbml0b3JzUHJvcGVydHlcIi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsYXJtQXJuOiBtb25pdG9yc1Byb3BlcnR5LmFsYXJtQXJuLFxuICAgICAgYWxhcm1Sb2xlQXJuOiBtb25pdG9yc1Byb3BlcnR5LmFsYXJtUm9sZUFybixcbiAgICAgIG1vbml0b3JUeXBlOiBNb25pdG9yVHlwZS5DRk5fTU9OSVRPUlNfUFJPUEVSVFksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWxhcm0gQVJOIGZvciBBV1MgQXBwQ29uZmlnIHRvIG1vbml0b3IuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWxhcm1Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgbW9uaXRvci5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBtb25pdG9yVHlwZTogTW9uaXRvclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBBUk4gZm9yIEFXUyBBcHBDb25maWcgdG8gdmlldyB0aGUgYWxhcm0gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWxhcm1Sb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIENsb3VkV2F0Y2ggYWxhcm0gaXMgYSBjb21wb3NpdGUgYWxhcm0uXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNDb21wb3NpdGVBbGFybT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb24/OiBJQXBwbGljYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB0byB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbml0b3JzIGZvciB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBtb25pdG9ycz86IE1vbml0b3JbXTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGVudmlyb25tZW50LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4dGVuc2lvbiBkZWZpbmVkIGJ5IHRoZSBhY3Rpb24gcG9pbnQgYW5kIGV2ZW50IGRlc3RpbmF0aW9uIGFuZCBhbHNvXG4gICAqIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvblBvaW50IFRoZSBhY3Rpb24gcG9pbnQgd2hpY2ggdHJpZ2dlcnMgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbihhY3Rpb25Qb2ludDogQWN0aW9uUG9pbnQsIGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfQ1JFQVRFX0hPU1RFRF9DT05GSUdVUkFUSU9OX1ZFUlNJT04gZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uXG4gICAqIGFuZCBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHByZUNyZWF0ZUhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfU1RBUlRfREVQTE9ZTUVOVCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kIGFsc28gY3JlYXRlc1xuICAgKiBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHJlU3RhcnREZXBsb3ltZW50KGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9TVEFSVCBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kIGFsc28gY3JlYXRlc1xuICAgKiBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50U3RhcnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX1NURVAgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZCBhbHNvXG4gICAqIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIG9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX0JBS0lORyBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50QmFraW5nKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gT05fREVQTE9ZTUVOVF9DT01QTEVURSBleHRlbnNpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgZGVzdGluYXRpb24gYW5kXG4gICAqIGFsc28gY3JlYXRlcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50Q29tcGxldGUoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbkRlcGxveW1lbnRSb2xsZWRCYWNrKGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGV4dGVuc2lvbiBUaGUgZXh0ZW5zaW9uIHRvIGNyZWF0ZSBhbiBhc3NvY2lhdGlvbiBmb3JcbiAgICovXG4gIGFkZEV4dGVuc2lvbihleHRlbnNpb246IElFeHRlbnNpb24pOiB2b2lkO1xufSJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.d.ts new file mode 100644 index 0000000000000..c7645cd03253a --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.d.ts @@ -0,0 +1,474 @@ +import { IResource, Resource } from 'aws-cdk-lib'; +import * as events from 'aws-cdk-lib/aws-events'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as sns from 'aws-cdk-lib/aws-sns'; +import * as sqs from 'aws-cdk-lib/aws-sqs'; +import { Construct } from 'constructs'; +/** + * Defines Extension action points. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about.html#working-with-appconfig-extensions-how-it-works-step-2 + */ +export declare enum ActionPoint { + PRE_CREATE_HOSTED_CONFIGURATION_VERSION = "PRE_CREATE_HOSTED_CONFIGURATION_VERSION", + PRE_START_DEPLOYMENT = "PRE_START_DEPLOYMENT", + ON_DEPLOYMENT_START = "ON_DEPLOYMENT_START", + ON_DEPLOYMENT_STEP = "ON_DEPLOYMENT_STEP", + ON_DEPLOYMENT_BAKING = "ON_DEPLOYMENT_BAKING", + ON_DEPLOYMENT_COMPLETE = "ON_DEPLOYMENT_COMPLETE", + ON_DEPLOYMENT_ROLLED_BACK = "ON_DEPLOYMENT_ROLLED_BACK" +} +/** + * Defines the source type for event destinations. + */ +export declare enum SourceType { + LAMBDA = "lambda", + SQS = "sqs", + SNS = "sns", + EVENTS = "events" +} +/** + * Implemented by allowed extension event destinations. + */ +export interface IEventDestination { + /** + * The URI of the extension event destination. + */ + readonly extensionUri: string; + /** + * The type of the extension event destination. + */ + readonly type: SourceType; + /** + * The IAM policy document to invoke the event destination. + */ + readonly policyDocument?: iam.PolicyDocument; +} +/** + * Use an AWS Lambda function as an event destination. + */ +export declare class LambdaDestination implements IEventDestination { + readonly extensionUri: string; + readonly type: SourceType; + readonly policyDocument?: iam.PolicyDocument; + constructor(func: lambda.IFunction); +} +/** + * Use an Amazon SQS queue as an event destination. + */ +export declare class SqsDestination implements IEventDestination { + readonly extensionUri: string; + readonly type: SourceType; + readonly policyDocument?: iam.PolicyDocument; + constructor(queue: sqs.IQueue); +} +/** + * Use an Amazon SNS topic as an event destination. + */ +export declare class SnsDestination implements IEventDestination { + readonly extensionUri: string; + readonly type: SourceType; + readonly policyDocument?: iam.PolicyDocument; + constructor(topic: sns.ITopic); +} +/** + * Use an Amazon EventBridge event bus as an event destination. + */ +export declare class EventBridgeDestination implements IEventDestination { + readonly extensionUri: string; + readonly type: SourceType; + constructor(bus: events.IEventBus); +} +/** + * Properties for the Action construct + */ +export interface ActionProps { + /** + * The action points that will trigger the extension action. + */ + readonly actionPoints: ActionPoint[]; + /** + * The event destination for the action. + */ + readonly eventDestination: IEventDestination; + /** + * The name for the action. + * + * @default - A name is generated. + */ + readonly name?: string; + /** + * The execution role for the action. + * + * @default - A role is generated. + */ + readonly executionRole?: iam.IRole; + /** + * The description for the action. + * + * @default - No description. + */ + readonly description?: string; + /** + * The flag that specifies whether or not to create the execution role. + * + * If set to true, then the role will not be auto-generated under the assumption + * there is already the corresponding resource-based policy attached to the event + * destination. If false, the execution role will be generated if not provided. + * + * @default false + */ + readonly invokeWithoutExecutionRole?: boolean; +} +/** + * Defines an action for an extension. + */ +export declare class Action { + /** + * The action points that will trigger the extension action. + */ + readonly actionPoints: ActionPoint[]; + /** + * The event destination for the action. + */ + readonly eventDestination: IEventDestination; + /** + * The name for the action. + */ + readonly name?: string; + /** + * The execution role for the action. + */ + readonly executionRole?: iam.IRole; + /** + * The description for the action. + */ + readonly description?: string; + /** + * The flag that specifies whether to create the execution role. + */ + readonly invokeWithoutExecutionRole?: boolean; + constructor(props: ActionProps); +} +/** + * Defines a parameter for an extension. + */ +export declare class Parameter { + /** + * A required parameter for an extension. + * + * @param name The name of the parameter + * @param value The value of the parameter + * @param description A description for the parameter + */ + static required(name: string, value: string, description?: string): Parameter; + /** + * An optional parameter for an extension. + * + * @param name The name of the parameter + * @param value The value of the parameter + * @param description A description for the parameter + */ + static notRequired(name: string, value?: string, description?: string): Parameter; + /** + * The name of the parameter. + */ + readonly name: string; + /** + * A boolean that indicates if the parameter is required or optional. + */ + readonly isRequired: boolean; + /** + * The value of the parameter. + */ + readonly value?: string; + /** + * The description of the parameter. + */ + readonly description?: string; + private constructor(); +} +/** + * Attributes of an existing AWS AppConfig extension to import. + */ +export interface ExtensionAttributes { + /** + * The ID of the extension. + */ + readonly extensionId: string; + /** + * The version number of the extension. + */ + readonly extensionVersionNumber: number; + /** + * The Amazon Resource Name (ARN) of the extension. + * + * @default - The extension ARN is generated. + */ + readonly extensionArn?: string; + /** + * The actions of the extension. + * + * @default - None. + */ + readonly actions?: Action[]; + /** + * The name of the extension. + * + * @default - None. + */ + readonly name?: string; + /** + * The description of the extension. + * + * @default - None. + */ + readonly description?: string; +} +/** + * Options for the Extension construct. + */ +export interface ExtensionOptions { + /** + * The name of the extension. + * + * @default - A name is generated. + */ + readonly extensionName?: string; + /** + * A description of the extension + * + * @default - No description. + */ + readonly description?: string; + /** + * The latest version number of the extension. When you create a new version, + * specify the most recent current version number. For example, you create version 3, + * enter 2 for this field. + * + * @default - None. + */ + readonly latestVersionNumber?: number; + /** + * The parameters accepted for the extension. + * + * @default - None. + */ + readonly parameters?: Parameter[]; +} +/** + * Properties for the Extension construct. + */ +export interface ExtensionProps extends ExtensionOptions { + /** + * The actions for the extension. + */ + readonly actions: Action[]; +} +/** + * An AWS AppConfig extension. + * + * @resource AWS::AppConfig::Extension + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html + */ +export declare class Extension extends Resource implements IExtension { + /** + * Imports an extension into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the extension construct + * @param extensionArn The Amazon Resource Name (ARN) of the extension + */ + static fromExtensionArn(scope: Construct, id: string, extensionArn: string): IExtension; + /** + * Imports an extension into the CDK using its attributes. + * + * @param scope The parent construct + * @param id The name of the extension construct + * @param attrs The attributes of the extension + */ + static fromExtensionAttributes(scope: Construct, id: string, attrs: ExtensionAttributes): IExtension; + /** + * The actions for the extension. + */ + readonly actions?: Action[]; + /** + * The name of the extension. + */ + readonly name?: string; + /** + * The description of the extension. + */ + readonly description?: string; + /** + * The latest version number of the extension. + */ + readonly latestVersionNumber?: number; + /** + * The parameters of the extension. + */ + readonly parameters?: Parameter[]; + /** + * The Amazon Resource Name (ARN) of the extension. + * + * @attribute + */ + readonly extensionArn: string; + /** + * The ID of the extension. + * + * @attribute + */ + readonly extensionId: string; + /** + * The version number of the extension. + * + * @attribute + */ + readonly extensionVersionNumber: number; + private readonly _cfnExtension; + private executionRole?; + constructor(scope: Construct, id: string, props: ExtensionProps); + private getExecutionRole; +} +export interface IExtension extends IResource { + /** + * The actions for the extension. + */ + readonly actions?: Action[]; + /** + * The name of the extension. + */ + readonly name?: string; + /** + * The description of the extension. + */ + readonly description?: string; + /** + * The latest version number of the extension. + */ + readonly latestVersionNumber?: number; + /** + * The parameters of the extension. + */ + readonly parameters?: Parameter[]; + /** + * The Amazon Resource Name (ARN) of the extension. + * @attribute + */ + readonly extensionArn: string; + /** + * The ID of the extension. + * @attribute + */ + readonly extensionId: string; + /** + * The version number of the extension. + * @attribute + */ + readonly extensionVersionNumber: number; +} +/** + * This class is meant to be used by AWS AppConfig resources (application, + * configuration profile, environment) directly. There is currently no use + * for this class outside of the AWS AppConfig construct implementation. It is + * intended to be used with the resources since there is currently no way to + * inherit from two classes (at least within JSII constraints). + */ +export declare class ExtensibleBase implements IExtensible { + private resourceArn; + private resourceName?; + private scope; + constructor(scope: Construct, resourceArn: string, resourceName?: string); + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + addExtension(extension: IExtension): void; + private getExtensionForActionPoint; + private addExtensionAssociation; + private getExtensionHash; + private getExtensionAssociationHash; + private getExtensionDefaultName; +} +/** + * Defines the extensible base implementation for extension association resources. + */ +export interface IExtensible { + /** + * Adds an extension defined by the action point and event destination and + * also creates an extension association to the derived resource. + * + * @param actionPoint The action point which triggers the event + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event + * destination and also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_START extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and + * also creates an extension association to the derived resource. + * + * @param eventDestination The event that occurs during the extension + * @param options Options for the extension + */ + onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void; + /** + * Adds an extension association to the derived resource. + * + * @param extension The extension to create an association for + */ + addExtension(extension: IExtension): void; +} diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.js new file mode 100644 index 0000000000000..a02c837c25226 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/extension.js @@ -0,0 +1,594 @@ +"use strict"; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ExtensibleBase = exports.Extension = exports.Parameter = exports.Action = exports.EventBridgeDestination = exports.SnsDestination = exports.SqsDestination = exports.LambdaDestination = exports.SourceType = exports.ActionPoint = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_appconfig_1 = require("aws-cdk-lib/aws-appconfig"); +const iam = require("aws-cdk-lib/aws-iam"); +const hash_1 = require("./private/hash"); +/** + * Defines Extension action points. + * + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about.html#working-with-appconfig-extensions-how-it-works-step-2 + */ +var ActionPoint; +(function (ActionPoint) { + ActionPoint["PRE_CREATE_HOSTED_CONFIGURATION_VERSION"] = "PRE_CREATE_HOSTED_CONFIGURATION_VERSION"; + ActionPoint["PRE_START_DEPLOYMENT"] = "PRE_START_DEPLOYMENT"; + ActionPoint["ON_DEPLOYMENT_START"] = "ON_DEPLOYMENT_START"; + ActionPoint["ON_DEPLOYMENT_STEP"] = "ON_DEPLOYMENT_STEP"; + ActionPoint["ON_DEPLOYMENT_BAKING"] = "ON_DEPLOYMENT_BAKING"; + ActionPoint["ON_DEPLOYMENT_COMPLETE"] = "ON_DEPLOYMENT_COMPLETE"; + ActionPoint["ON_DEPLOYMENT_ROLLED_BACK"] = "ON_DEPLOYMENT_ROLLED_BACK"; +})(ActionPoint || (exports.ActionPoint = ActionPoint = {})); +/** + * Defines the source type for event destinations. + */ +var SourceType; +(function (SourceType) { + SourceType["LAMBDA"] = "lambda"; + SourceType["SQS"] = "sqs"; + SourceType["SNS"] = "sns"; + SourceType["EVENTS"] = "events"; +})(SourceType || (exports.SourceType = SourceType = {})); +/** + * Use an AWS Lambda function as an event destination. + */ +class LambdaDestination { + constructor(func) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.LambdaDestination", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, LambdaDestination); + } + throw error; + } + this.extensionUri = func.functionArn; + this.type = SourceType.LAMBDA; + const policy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + resources: [this.extensionUri], + actions: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }); + this.policyDocument = new iam.PolicyDocument({ + statements: [policy], + }); + if (!func.permissionsNode.tryFindChild('AppConfigPermission')) { + func.addPermission('AppConfigPermission', { + principal: new iam.ServicePrincipal('appconfig.amazonaws.com'), + }); + } + } +} +exports.LambdaDestination = LambdaDestination; +_a = JSII_RTTI_SYMBOL_1; +LambdaDestination[_a] = { fqn: "@aws-cdk/aws-appconfig-alpha.LambdaDestination", version: "0.0.0" }; +/** + * Use an Amazon SQS queue as an event destination. + */ +class SqsDestination { + constructor(queue) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.SqsDestination", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, SqsDestination); + } + throw error; + } + this.extensionUri = queue.queueArn; + this.type = SourceType.SQS; + const policy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + resources: [this.extensionUri], + actions: ['sqs:SendMessage'], + }); + this.policyDocument = new iam.PolicyDocument({ + statements: [policy], + }); + } +} +exports.SqsDestination = SqsDestination; +_b = JSII_RTTI_SYMBOL_1; +SqsDestination[_b] = { fqn: "@aws-cdk/aws-appconfig-alpha.SqsDestination", version: "0.0.0" }; +/** + * Use an Amazon SNS topic as an event destination. + */ +class SnsDestination { + constructor(topic) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.SnsDestination", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, SnsDestination); + } + throw error; + } + this.extensionUri = topic.topicArn; + this.type = SourceType.SNS; + const policy = new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + resources: [this.extensionUri], + actions: ['sns:Publish'], + }); + this.policyDocument = new iam.PolicyDocument({ + statements: [policy], + }); + } +} +exports.SnsDestination = SnsDestination; +_c = JSII_RTTI_SYMBOL_1; +SnsDestination[_c] = { fqn: "@aws-cdk/aws-appconfig-alpha.SnsDestination", version: "0.0.0" }; +/** + * Use an Amazon EventBridge event bus as an event destination. + */ +class EventBridgeDestination { + constructor(bus) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.EventBridgeDestination", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, EventBridgeDestination); + } + throw error; + } + this.extensionUri = bus.eventBusArn; + this.type = SourceType.EVENTS; + } +} +exports.EventBridgeDestination = EventBridgeDestination; +_d = JSII_RTTI_SYMBOL_1; +EventBridgeDestination[_d] = { fqn: "@aws-cdk/aws-appconfig-alpha.EventBridgeDestination", version: "0.0.0" }; +/** + * Defines an action for an extension. + */ +class Action { + constructor(props) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Action", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ActionProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Action); + } + throw error; + } + this.actionPoints = props.actionPoints; + this.eventDestination = props.eventDestination; + this.name = props.name; + this.executionRole = props.executionRole; + this.description = props.description; + this.invokeWithoutExecutionRole = props.invokeWithoutExecutionRole || false; + } +} +exports.Action = Action; +_e = JSII_RTTI_SYMBOL_1; +Action[_e] = { fqn: "@aws-cdk/aws-appconfig-alpha.Action", version: "0.0.0" }; +/** + * Defines a parameter for an extension. + */ +class Parameter { + /** + * A required parameter for an extension. + * + * @param name The name of the parameter + * @param value The value of the parameter + * @param description A description for the parameter + */ + static required(name, value, description) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Parameter#required", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.required); + } + throw error; + } + return new Parameter(name, true, value, description); + } + /** + * An optional parameter for an extension. + * + * @param name The name of the parameter + * @param value The value of the parameter + * @param description A description for the parameter + */ + static notRequired(name, value, description) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Parameter#notRequired", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.notRequired); + } + throw error; + } + return new Parameter(name, false, value, description); + } + constructor(name, isRequired, value, description) { + this.name = name; + this.isRequired = isRequired; + this.value = value; + this.description = description; + } +} +exports.Parameter = Parameter; +_f = JSII_RTTI_SYMBOL_1; +Parameter[_f] = { fqn: "@aws-cdk/aws-appconfig-alpha.Parameter", version: "0.0.0" }; +/** + * An AWS AppConfig extension. + * + * @resource AWS::AppConfig::Extension + * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html + */ +class Extension extends aws_cdk_lib_1.Resource { + /** + * Imports an extension into the CDK using its Amazon Resource Name (ARN). + * + * @param scope The parent construct + * @param id The name of the extension construct + * @param extensionArn The Amazon Resource Name (ARN) of the extension + */ + static fromExtensionArn(scope, id, extensionArn) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Extension#fromExtensionArn", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromExtensionArn); + } + throw error; + } + const parsedArn = aws_cdk_lib_1.Stack.of(scope).splitArn(extensionArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME); + if (!parsedArn.resourceName) { + throw new Error(`Missing required /$/{extensionId}//$/{extensionVersionNumber} from configuration profile ARN: ${parsedArn.resourceName}`); + } + const resourceName = parsedArn.resourceName.split('/'); + if (resourceName.length != 2 || !resourceName[0] || !resourceName[1]) { + throw new Error('Missing required parameters for extension ARN: format should be /$/{extensionId}//$/{extensionVersionNumber}'); + } + const extensionId = resourceName[0]; + const extensionVersionNumber = resourceName[1]; + class Import extends aws_cdk_lib_1.Resource { + constructor() { + super(...arguments); + this.extensionId = extensionId; + this.extensionVersionNumber = parseInt(extensionVersionNumber); + this.extensionArn = extensionArn; + } + } + return new Import(scope, id, { + environmentFromArn: extensionArn, + }); + } + /** + * Imports an extension into the CDK using its attributes. + * + * @param scope The parent construct + * @param id The name of the extension construct + * @param attrs The attributes of the extension + */ + static fromExtensionAttributes(scope, id, attrs) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Extension#fromExtensionAttributes", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionAttributes(attrs); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromExtensionAttributes); + } + throw error; + } + const stack = aws_cdk_lib_1.Stack.of(scope); + const extensionArn = attrs.extensionArn || stack.formatArn({ + service: 'appconfig', + resource: 'extension', + resourceName: `${attrs.extensionId}/${attrs.extensionVersionNumber}`, + }); + class Import extends aws_cdk_lib_1.Resource { + constructor() { + super(...arguments); + this.extensionId = attrs.extensionId; + this.extensionVersionNumber = attrs.extensionVersionNumber; + this.extensionArn = extensionArn; + this.name = attrs.name; + this.actions = attrs.actions; + this.description = attrs.description; + } + } + return new Import(scope, id, { + environmentFromArn: extensionArn, + }); + } + constructor(scope, id, props) { + super(scope, id, { + physicalName: props.extensionName, + }); + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.Extension", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Extension); + } + throw error; + } + this.actions = props.actions; + this.name = props.extensionName || aws_cdk_lib_1.Names.uniqueResourceName(this, { + maxLength: 64, + separator: '-', + }); + this.description = props.description; + this.latestVersionNumber = props.latestVersionNumber; + this.parameters = props.parameters; + const resource = new aws_appconfig_1.CfnExtension(this, 'Resource', { + actions: this.actions.reduce((acc, cur, index) => { + const extensionUri = cur.eventDestination.extensionUri; + const sourceType = cur.eventDestination.type; + this.executionRole = cur.executionRole; + const name = cur.name ?? `${this.name}-${index}`; + cur.actionPoints.forEach((actionPoint) => { + acc[actionPoint] = [ + { + Name: name, + Uri: extensionUri, + ...(sourceType === SourceType.EVENTS || cur.invokeWithoutExecutionRole + ? {} + : { RoleArn: this.executionRole?.roleArn || this.getExecutionRole(cur.eventDestination, name).roleArn }), + ...(cur.description ? { Description: cur.description } : {}), + }, + ]; + }); + return acc; + }, {}), + name: this.name, + description: this.description, + latestVersionNumber: this.latestVersionNumber, + parameters: this.parameters?.reduce((acc, cur) => { + acc[cur.name] = { + required: cur.isRequired, + description: cur.description, + }; + return acc; + }, {}), + }); + this._cfnExtension = resource; + this.extensionId = this._cfnExtension.attrId; + this.extensionVersionNumber = this._cfnExtension.attrVersionNumber; + this.extensionArn = this.getResourceArnAttribute(this._cfnExtension.attrArn, { + service: 'appconfig', + resource: 'extension', + resourceName: `${this.extensionId}/${this.extensionVersionNumber}`, + }); + } + getExecutionRole(eventDestination, actionName) { + const versionNumber = this.latestVersionNumber ? this.latestVersionNumber + 1 : 1; + const combinedObjects = (0, hash_1.stringifyObjects)(this.name, versionNumber, actionName); + this.executionRole = new iam.Role(this, `Role${(0, hash_1.getHash)(combinedObjects)}`, { + roleName: aws_cdk_lib_1.PhysicalName.GENERATE_IF_NEEDED, + assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'), + inlinePolicies: { + ['AllowAppConfigInvokeExtensionEventSourcePolicy']: eventDestination.policyDocument, + }, + }); + return this.executionRole; + } +} +exports.Extension = Extension; +_g = JSII_RTTI_SYMBOL_1; +Extension[_g] = { fqn: "@aws-cdk/aws-appconfig-alpha.Extension", version: "0.0.0" }; +/** + * This class is meant to be used by AWS AppConfig resources (application, + * configuration profile, environment) directly. There is currently no use + * for this class outside of the AWS AppConfig construct implementation. It is + * intended to be used with the resources since there is currently no way to + * inherit from two classes (at least within JSII constraints). + */ +class ExtensibleBase { + constructor(scope, resourceArn, resourceName) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, ExtensibleBase); + } + throw error; + } + this.resourceArn = resourceArn; + this.resourceName = resourceName; + this.scope = scope; + } + on(actionPoint, eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#on", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ActionPoint(actionPoint); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.on); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, actionPoint, options); + } + preCreateHostedConfigurationVersion(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#preCreateHostedConfigurationVersion", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.preCreateHostedConfigurationVersion); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.PRE_CREATE_HOSTED_CONFIGURATION_VERSION, options); + } + preStartDeployment(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#preStartDeployment", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.preStartDeployment); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.PRE_START_DEPLOYMENT, options); + } + onDeploymentStart(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#onDeploymentStart", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.onDeploymentStart); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.ON_DEPLOYMENT_START, options); + } + onDeploymentStep(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#onDeploymentStep", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.onDeploymentStep); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.ON_DEPLOYMENT_STEP, options); + } + onDeploymentBaking(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#onDeploymentBaking", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.onDeploymentBaking); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.ON_DEPLOYMENT_BAKING, options); + } + onDeploymentComplete(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#onDeploymentComplete", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.onDeploymentComplete); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.ON_DEPLOYMENT_COMPLETE, options); + } + onDeploymentRolledBack(eventDestination, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#onDeploymentRolledBack", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IEventDestination(eventDestination); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_ExtensionOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.onDeploymentRolledBack); + } + throw error; + } + this.getExtensionForActionPoint(eventDestination, ActionPoint.ON_DEPLOYMENT_ROLLED_BACK, options); + } + addExtension(extension) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-appconfig-alpha.ExtensibleBase#addExtension", ""); + jsiiDeprecationWarnings._aws_cdk_aws_appconfig_alpha_IExtension(extension); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.addExtension); + } + throw error; + } + this.addExtensionAssociation(extension); + } + getExtensionForActionPoint(eventDestination, actionPoint, options) { + const name = options?.extensionName || this.getExtensionDefaultName(); + const versionNumber = options?.latestVersionNumber ? options?.latestVersionNumber + 1 : 1; + const extension = new Extension(this.scope, `Extension${this.getExtensionHash(name, versionNumber)}`, { + actions: [ + new Action({ + eventDestination, + actionPoints: [ + actionPoint, + ], + }), + ], + extensionName: name, + ...(options?.description ? { description: options.description } : {}), + ...(options?.latestVersionNumber ? { latestVersionNumber: options.latestVersionNumber } : {}), + ...(options?.parameters ? { parameters: options.parameters } : {}), + }); + this.addExtensionAssociation(extension); + } + addExtensionAssociation(extension) { + const versionNumber = extension?.latestVersionNumber ? extension?.latestVersionNumber + 1 : 1; + const name = extension.name ?? this.getExtensionDefaultName(); + new aws_appconfig_1.CfnExtensionAssociation(this.scope, `AssociationResource${this.getExtensionAssociationHash(name, versionNumber)}`, { + extensionIdentifier: extension.extensionId, + resourceIdentifier: this.resourceArn, + extensionVersionNumber: extension.extensionVersionNumber, + parameters: extension.parameters?.reduce((acc, cur) => { + if (cur.value) { + acc[cur.name] = cur.value; + } + return acc; + }, {}), + }); + } + getExtensionHash(name, versionNumber) { + const combinedString = (0, hash_1.stringifyObjects)(name, versionNumber); + return (0, hash_1.getHash)(combinedString); + } + getExtensionAssociationHash(name, versionNumber) { + const resourceIdentifier = this.resourceName ?? this.resourceArn; + const combinedString = (0, hash_1.stringifyObjects)(resourceIdentifier, name, versionNumber); + return (0, hash_1.getHash)(combinedString); + } + getExtensionDefaultName() { + return aws_cdk_lib_1.Names.uniqueResourceName(this.scope, { + maxLength: 54, + separator: '-', + }) + '-Extension'; + } +} +exports.ExtensibleBase = ExtensibleBase; +_h = JSII_RTTI_SYMBOL_1; +ExtensibleBase[_h] = { fqn: "@aws-cdk/aws-appconfig-alpha.ExtensibleBase", version: "0.0.0" }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZDQUF5RjtBQUN6Riw2REFBa0Y7QUFFbEYsMkNBQTJDO0FBSzNDLHlDQUEyRDtBQUUzRDs7OztHQUlHO0FBQ0gsSUFBWSxXQVFYO0FBUkQsV0FBWSxXQUFXO0lBQ3JCLGtHQUFtRixDQUFBO0lBQ25GLDREQUE2QyxDQUFBO0lBQzdDLDBEQUEyQyxDQUFBO0lBQzNDLHdEQUF5QyxDQUFBO0lBQ3pDLDREQUE2QyxDQUFBO0lBQzdDLGdFQUFpRCxDQUFBO0lBQ2pELHNFQUF1RCxDQUFBO0FBQ3pELENBQUMsRUFSVyxXQUFXLDJCQUFYLFdBQVcsUUFRdEI7QUFFRDs7R0FFRztBQUNILElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQiwrQkFBaUIsQ0FBQTtJQUNqQix5QkFBVyxDQUFBO0lBQ1gseUJBQVcsQ0FBQTtJQUNYLCtCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxVQUFVLDBCQUFWLFVBQVUsUUFLckI7QUFzQkQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQUs1QixZQUFZLElBQXNCOzs7Ozs7K0NBTHZCLGlCQUFpQjs7OztRQU0xQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDOUIsT0FBTyxFQUFFO2dCQUNQLHVCQUF1QjtnQkFDdkIsb0JBQW9CO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEdBQUcs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QUUsSUFBSSxDQUFDLFdBQVc7WUFDcEMsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLHNCQUFzQjtZQUN4RCxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUE0QixFQUFFLEdBQWMsRUFBRSxFQUFFO2dCQUN4RixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ1AsQ0FBQyxDQUFDO0tBQ0o7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsYUFBcUI7UUFDMUQsTUFBTSxjQUFjLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFBLGNBQU8sRUFBQyxjQUFjLENBQUMsQ0FBQztLQUNoQztJQUVPLDJCQUEyQixDQUFDLElBQVksRUFBRSxhQUFxQjtRQUNyRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNqRSxNQUFNLGNBQWMsR0FBRyxJQUFBLHVCQUFnQixFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRixPQUFPLElBQUEsY0FBTyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQ2hDO0lBRU8sdUJBQXVCO1FBQzdCLE9BQU8sbUJBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzFDLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEdBQUc7U0FDZixDQUFDLEdBQUcsWUFBWSxDQUFDO0tBQ25COztBQW5HSCx3Q0FvR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcm5Gb3JtYXQsIElSZXNvdXJjZSwgTmFtZXMsIFBoeXNpY2FsTmFtZSwgUmVzb3VyY2UsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuRXh0ZW5zaW9uLCBDZm5FeHRlbnNpb25Bc3NvY2lhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcHBjb25maWcnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc3FzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBnZXRIYXNoLCBzdHJpbmdpZnlPYmplY3RzIH0gZnJvbSAnLi9wcml2YXRlL2hhc2gnO1xuXG4vKipcbiAqIERlZmluZXMgRXh0ZW5zaW9uIGFjdGlvbiBwb2ludHMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBwY29uZmlnL2xhdGVzdC91c2VyZ3VpZGUvd29ya2luZy13aXRoLWFwcGNvbmZpZy1leHRlbnNpb25zLWFib3V0Lmh0bWwjd29ya2luZy13aXRoLWFwcGNvbmZpZy1leHRlbnNpb25zLWhvdy1pdC13b3Jrcy1zdGVwLTJcbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uUG9pbnQge1xuICBQUkVfQ1JFQVRFX0hPU1RFRF9DT05GSUdVUkFUSU9OX1ZFUlNJT04gPSAnUFJFX0NSRUFURV9IT1NURURfQ09ORklHVVJBVElPTl9WRVJTSU9OJyxcbiAgUFJFX1NUQVJUX0RFUExPWU1FTlQgPSAnUFJFX1NUQVJUX0RFUExPWU1FTlQnLFxuICBPTl9ERVBMT1lNRU5UX1NUQVJUID0gJ09OX0RFUExPWU1FTlRfU1RBUlQnLFxuICBPTl9ERVBMT1lNRU5UX1NURVAgPSAnT05fREVQTE9ZTUVOVF9TVEVQJyxcbiAgT05fREVQTE9ZTUVOVF9CQUtJTkcgPSAnT05fREVQTE9ZTUVOVF9CQUtJTkcnLFxuICBPTl9ERVBMT1lNRU5UX0NPTVBMRVRFID0gJ09OX0RFUExPWU1FTlRfQ09NUExFVEUnLFxuICBPTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLID0gJ09OX0RFUExPWU1FTlRfUk9MTEVEX0JBQ0snLFxufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHNvdXJjZSB0eXBlIGZvciBldmVudCBkZXN0aW5hdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFNvdXJjZVR5cGUge1xuICBMQU1CREEgPSAnbGFtYmRhJyxcbiAgU1FTID0gJ3NxcycsXG4gIFNOUyA9ICdzbnMnLFxuICBFVkVOVFMgPSAnZXZlbnRzJyxcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRlZCBieSBhbGxvd2VkIGV4dGVuc2lvbiBldmVudCBkZXN0aW5hdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50RGVzdGluYXRpb24ge1xuICAvKipcbiAgICogVGhlIFVSSSBvZiB0aGUgZXh0ZW5zaW9uIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uVXJpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBTb3VyY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHBvbGljeSBkb2N1bWVudCB0byBpbnZva2UgdGhlIGV2ZW50IGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RG9jdW1lbnQ/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbi8qKlxuICogVXNlIGFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gYXMgYW4gZXZlbnQgZGVzdGluYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFEZXN0aW5hdGlvbiBpbXBsZW1lbnRzIElFdmVudERlc3RpbmF0aW9uIHtcbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvblVyaTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogU291cmNlVHlwZTtcbiAgcHVibGljIHJlYWRvbmx5IHBvbGljeURvY3VtZW50PzogaWFtLlBvbGljeURvY3VtZW50O1xuXG4gIGNvbnN0cnVjdG9yKGZ1bmM6IGxhbWJkYS5JRnVuY3Rpb24pIHtcbiAgICB0aGlzLmV4dGVuc2lvblVyaSA9IGZ1bmMuZnVuY3Rpb25Bcm47XG4gICAgdGhpcy50eXBlID0gU291cmNlVHlwZS5MQU1CREE7XG4gICAgY29uc3QgcG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5leHRlbnNpb25VcmldLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgJ2xhbWJkYTpJbnZva2VBc3luYycsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHRoaXMucG9saWN5RG9jdW1lbnQgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgIHN0YXRlbWVudHM6IFtwb2xpY3ldLFxuICAgIH0pO1xuXG4gICAgaWYgKCFmdW5jLnBlcm1pc3Npb25zTm9kZS50cnlGaW5kQ2hpbGQoJ0FwcENvbmZpZ1Blcm1pc3Npb24nKSkge1xuICAgICAgZnVuYy5hZGRQZXJtaXNzaW9uKCdBcHBDb25maWdQZXJtaXNzaW9uJywge1xuICAgICAgICBwcmluY2lwYWw6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYXBwY29uZmlnLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVzZSBhbiBBbWF6b24gU1FTIHF1ZXVlIGFzIGFuIGV2ZW50IGRlc3RpbmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU3FzRGVzdGluYXRpb24gaW1wbGVtZW50cyBJRXZlbnREZXN0aW5hdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBleHRlbnNpb25Vcmk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFNvdXJjZVR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lEb2N1bWVudD86IGlhbS5Qb2xpY3lEb2N1bWVudDtcblxuICBjb25zdHJ1Y3RvcihxdWV1ZTogc3FzLklRdWV1ZSkge1xuICAgIHRoaXMuZXh0ZW5zaW9uVXJpID0gcXVldWUucXVldWVBcm47XG4gICAgdGhpcy50eXBlID0gU291cmNlVHlwZS5TUVM7XG4gICAgY29uc3QgcG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5leHRlbnNpb25VcmldLFxuICAgICAgYWN0aW9uczogWydzcXM6U2VuZE1lc3NhZ2UnXSxcbiAgICB9KTtcbiAgICB0aGlzLnBvbGljeURvY3VtZW50ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICBzdGF0ZW1lbnRzOiBbcG9saWN5XSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBhbiBBbWF6b24gU05TIHRvcGljIGFzIGFuIGV2ZW50IGRlc3RpbmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU25zRGVzdGluYXRpb24gaW1wbGVtZW50cyBJRXZlbnREZXN0aW5hdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBleHRlbnNpb25Vcmk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFNvdXJjZVR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lEb2N1bWVudD86IGlhbS5Qb2xpY3lEb2N1bWVudDtcblxuICBjb25zdHJ1Y3Rvcih0b3BpYzogc25zLklUb3BpYykge1xuICAgIHRoaXMuZXh0ZW5zaW9uVXJpID0gdG9waWMudG9waWNBcm47XG4gICAgdGhpcy50eXBlID0gU291cmNlVHlwZS5TTlM7XG4gICAgY29uc3QgcG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5leHRlbnNpb25VcmldLFxuICAgICAgYWN0aW9uczogWydzbnM6UHVibGlzaCddLFxuICAgIH0pO1xuICAgIHRoaXMucG9saWN5RG9jdW1lbnQgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgIHN0YXRlbWVudHM6IFtwb2xpY3ldLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVXNlIGFuIEFtYXpvbiBFdmVudEJyaWRnZSBldmVudCBidXMgYXMgYW4gZXZlbnQgZGVzdGluYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEJyaWRnZURlc3RpbmF0aW9uIGltcGxlbWVudHMgSUV2ZW50RGVzdGluYXRpb24ge1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uVXJpOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBTb3VyY2VUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKGJ1czogZXZlbnRzLklFdmVudEJ1cykge1xuICAgIHRoaXMuZXh0ZW5zaW9uVXJpID0gYnVzLmV2ZW50QnVzQXJuO1xuICAgIHRoaXMudHlwZSA9IFNvdXJjZVR5cGUuRVZFTlRTO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEFjdGlvbiBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHBvaW50cyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZXh0ZW5zaW9uIGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvblBvaW50czogQWN0aW9uUG9pbnRbXTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGRlc3RpbmF0aW9uIGZvciB0aGUgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmFtZSBpcyBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBhY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSByb2xlIGlzIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgdGhlIGV4ZWN1dGlvbiByb2xlLlxuICAgKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgcm9sZSB3aWxsIG5vdCBiZSBhdXRvLWdlbmVyYXRlZCB1bmRlciB0aGUgYXNzdW1wdGlvblxuICAgKiB0aGVyZSBpcyBhbHJlYWR5IHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlLWJhc2VkIHBvbGljeSBhdHRhY2hlZCB0byB0aGUgZXZlbnRcbiAgICogZGVzdGluYXRpb24uIElmIGZhbHNlLCB0aGUgZXhlY3V0aW9uIHJvbGUgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgbm90IHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2tlV2l0aG91dEV4ZWN1dGlvblJvbGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmluZXMgYW4gYWN0aW9uIGZvciBhbiBleHRlbnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb24ge1xuICAvKipcbiAgICogVGhlIGFjdGlvbiBwb2ludHMgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGV4dGVuc2lvbiBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uUG9pbnRzOiBBY3Rpb25Qb2ludFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgZGVzdGluYXRpb24gZm9yIHRoZSBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZSBmb3IgdGhlIGFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoZSBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmbGFnIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdG8gY3JlYXRlIHRoZSBleGVjdXRpb24gcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZVdpdGhvdXRFeGVjdXRpb25Sb2xlPzogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IEFjdGlvblByb3BzKSB7XG4gICAgdGhpcy5hY3Rpb25Qb2ludHMgPSBwcm9wcy5hY3Rpb25Qb2ludHM7XG4gICAgdGhpcy5ldmVudERlc3RpbmF0aW9uID0gcHJvcHMuZXZlbnREZXN0aW5hdGlvbjtcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IHByb3BzLmV4ZWN1dGlvblJvbGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuaW52b2tlV2l0aG91dEV4ZWN1dGlvblJvbGUgPSBwcm9wcy5pbnZva2VXaXRob3V0RXhlY3V0aW9uUm9sZSB8fCBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYSBwYXJhbWV0ZXIgZm9yIGFuIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciBmb3IgYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHBhcmFtZXRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXF1aXJlZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogUGFyYW1ldGVyIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihuYW1lLCB0cnVlLCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHBhcmFtZXRlciBmb3IgYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHBhcmFtZXRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub3RSZXF1aXJlZChuYW1lOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IFBhcmFtZXRlciB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIobmFtZSwgZmFsc2UsIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzUmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgaXNSZXF1aXJlZDogYm9vbGVhbiwgdmFsdWU/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIG9mIGFuIGV4aXN0aW5nIEFXUyBBcHBDb25maWcgZXh0ZW5zaW9uIHRvIGltcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb25BdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uXG4gICAqL1xuICByZWFkb25seSBleHRlbnNpb25WZXJzaW9uTnVtYmVyOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBleHRlbnNpb24gQVJOIGlzIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvbkFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFjdGlvbnMgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9ucz86IEFjdGlvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIEV4dGVuc2lvbiBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmFtZSBpcyBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBleHRlbnNpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBleHRlbnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uIFdoZW4geW91IGNyZWF0ZSBhIG5ldyB2ZXJzaW9uLFxuICAgKiBzcGVjaWZ5IHRoZSBtb3N0IHJlY2VudCBjdXJyZW50IHZlcnNpb24gbnVtYmVyLiBGb3IgZXhhbXBsZSwgeW91IGNyZWF0ZSB2ZXJzaW9uIDMsXG4gICAqIGVudGVyIDIgZm9yIHRoaXMgZmllbGQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGxhdGVzdFZlcnNpb25OdW1iZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXJzIGFjY2VwdGVkIGZvciB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmUuXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogUGFyYW1ldGVyW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEV4dGVuc2lvbiBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uUHJvcHMgZXh0ZW5kcyBFeHRlbnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb25zIGZvciB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uczogQWN0aW9uW107XG59XG5cbi8qKlxuICogQW4gQVdTIEFwcENvbmZpZyBleHRlbnNpb24uXG4gKlxuICogQHJlc291cmNlIEFXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb25cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwcGNvbmZpZy9sYXRlc3QvdXNlcmd1aWRlL3dvcmtpbmctd2l0aC1hcHBjb25maWctZXh0ZW5zaW9ucy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb24gZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElFeHRlbnNpb24ge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleHRlbnNpb24gaW50byB0aGUgQ0RLIHVzaW5nIGl0cyBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gZXh0ZW5zaW9uQXJuIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21FeHRlbnNpb25Bcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZXh0ZW5zaW9uQXJuOiBzdHJpbmcpOiBJRXh0ZW5zaW9uIHtcbiAgICBjb25zdCBwYXJzZWRBcm4gPSBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4oZXh0ZW5zaW9uQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG4gICAgaWYgKCFwYXJzZWRBcm4ucmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgLyQve2V4dGVuc2lvbklkfS8vJC97ZXh0ZW5zaW9uVmVyc2lvbk51bWJlcn0gZnJvbSBjb25maWd1cmF0aW9uIHByb2ZpbGUgQVJOOiAke3BhcnNlZEFybi5yZXNvdXJjZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gcGFyc2VkQXJuLnJlc291cmNlTmFtZS5zcGxpdCgnLycpO1xuICAgIGlmIChyZXNvdXJjZU5hbWUubGVuZ3RoICE9IDIgfHwgIXJlc291cmNlTmFtZVswXSB8fCAhcmVzb3VyY2VOYW1lWzFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgZXh0ZW5zaW9uIEFSTjogZm9ybWF0IHNob3VsZCBiZSAvJC97ZXh0ZW5zaW9uSWR9Ly8kL3tleHRlbnNpb25WZXJzaW9uTnVtYmVyfScpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuc2lvbklkID0gcmVzb3VyY2VOYW1lWzBdO1xuICAgIGNvbnN0IGV4dGVuc2lvblZlcnNpb25OdW1iZXIgPSByZXNvdXJjZU5hbWVbMV07XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElFeHRlbnNpb24ge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbklkID0gZXh0ZW5zaW9uSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uVmVyc2lvbk51bWJlciA9IHBhcnNlSW50KGV4dGVuc2lvblZlcnNpb25OdW1iZXIpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbkFybiA9IGV4dGVuc2lvbkFybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQsIHtcbiAgICAgIGVudmlyb25tZW50RnJvbUFybjogZXh0ZW5zaW9uQXJuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXh0ZW5zaW9uIGludG8gdGhlIENESyB1c2luZyBpdHMgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXh0ZW5zaW9uQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogRXh0ZW5zaW9uQXR0cmlidXRlcyk6IElFeHRlbnNpb24ge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkFybiA9IGF0dHJzLmV4dGVuc2lvbkFybiB8fCBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2V4dGVuc2lvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IGAke2F0dHJzLmV4dGVuc2lvbklkfS8ke2F0dHJzLmV4dGVuc2lvblZlcnNpb25OdW1iZXJ9YCxcbiAgICB9KTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUV4dGVuc2lvbiB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uSWQgPSBhdHRycy5leHRlbnNpb25JZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleHRlbnNpb25WZXJzaW9uTnVtYmVyID0gYXR0cnMuZXh0ZW5zaW9uVmVyc2lvbk51bWJlcjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleHRlbnNpb25Bcm4gPSBleHRlbnNpb25Bcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IGF0dHJzLm5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9ucyA9IGF0dHJzLmFjdGlvbnM7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSBhdHRycy5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQsIHtcbiAgICAgIGVudmlyb25tZW50RnJvbUFybjogZXh0ZW5zaW9uQXJuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb25zIGZvciB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjdGlvbnM/OiBBY3Rpb25bXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGV4dGVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhdGVzdFZlcnNpb25OdW1iZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBleHRlbnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVycz86IFBhcmFtZXRlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uVmVyc2lvbk51bWJlcjogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NmbkV4dGVuc2lvbjogQ2ZuRXh0ZW5zaW9uO1xuICBwcml2YXRlIGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEV4dGVuc2lvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmV4dGVuc2lvbk5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjdGlvbnMgPSBwcm9wcy5hY3Rpb25zO1xuICAgIHRoaXMubmFtZSA9IHByb3BzLmV4dGVuc2lvbk5hbWUgfHwgTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgIG1heExlbmd0aDogNjQsXG4gICAgICBzZXBhcmF0b3I6ICctJyxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5sYXRlc3RWZXJzaW9uTnVtYmVyID0gcHJvcHMubGF0ZXN0VmVyc2lvbk51bWJlcjtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwcm9wcy5wYXJhbWV0ZXJzO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuRXh0ZW5zaW9uKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5yZWR1Y2UoKGFjYzoge1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9W119LCBjdXI6IEFjdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBleHRlbnNpb25VcmkgPSBjdXIuZXZlbnREZXN0aW5hdGlvbi5leHRlbnNpb25Vcmk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBjdXIuZXZlbnREZXN0aW5hdGlvbi50eXBlO1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblJvbGUgPSBjdXIuZXhlY3V0aW9uUm9sZTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGN1ci5uYW1lID8/IGAke3RoaXMubmFtZX0tJHtpbmRleH1gO1xuICAgICAgICBjdXIuYWN0aW9uUG9pbnRzLmZvckVhY2goKGFjdGlvblBvaW50KSA9PiB7XG4gICAgICAgICAgYWNjW2FjdGlvblBvaW50XSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgVXJpOiBleHRlbnNpb25VcmksXG4gICAgICAgICAgICAgIC4uLihzb3VyY2VUeXBlID09PSBTb3VyY2VUeXBlLkVWRU5UUyB8fCBjdXIuaW52b2tlV2l0aG91dEV4ZWN1dGlvblJvbGVcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7IFJvbGVBcm46IHRoaXMuZXhlY3V0aW9uUm9sZT8ucm9sZUFybiB8fCB0aGlzLmdldEV4ZWN1dGlvblJvbGUoY3VyLmV2ZW50RGVzdGluYXRpb24sIG5hbWUpLnJvbGVBcm4gfSksXG4gICAgICAgICAgICAgIC4uLihjdXIuZGVzY3JpcHRpb24gPyB7IERlc2NyaXB0aW9uOiBjdXIuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGxhdGVzdFZlcnNpb25OdW1iZXI6IHRoaXMubGF0ZXN0VmVyc2lvbk51bWJlcixcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycz8ucmVkdWNlKChhY2M6IHtba2V5OiBzdHJpbmddOiBDZm5FeHRlbnNpb24uUGFyYW1ldGVyUHJvcGVydHl9LCBjdXI6IFBhcmFtZXRlcikgPT4ge1xuICAgICAgICBhY2NbY3VyLm5hbWVdID0ge1xuICAgICAgICAgIHJlcXVpcmVkOiBjdXIuaXNSZXF1aXJlZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogY3VyLmRlc2NyaXB0aW9uLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pLFxuICAgIH0pO1xuICAgIHRoaXMuX2NmbkV4dGVuc2lvbiA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5leHRlbnNpb25JZCA9IHRoaXMuX2NmbkV4dGVuc2lvbi5hdHRySWQ7XG4gICAgdGhpcy5leHRlbnNpb25WZXJzaW9uTnVtYmVyID0gdGhpcy5fY2ZuRXh0ZW5zaW9uLmF0dHJWZXJzaW9uTnVtYmVyO1xuICAgIHRoaXMuZXh0ZW5zaW9uQXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZSh0aGlzLl9jZm5FeHRlbnNpb24uYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2FwcGNvbmZpZycsXG4gICAgICByZXNvdXJjZTogJ2V4dGVuc2lvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IGAke3RoaXMuZXh0ZW5zaW9uSWR9LyR7dGhpcy5leHRlbnNpb25WZXJzaW9uTnVtYmVyfWAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4ZWN1dGlvblJvbGUoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIGFjdGlvbk5hbWU6IHN0cmluZyk6IGlhbS5JUm9sZSB7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlciA9IHRoaXMubGF0ZXN0VmVyc2lvbk51bWJlciA/IHRoaXMubGF0ZXN0VmVyc2lvbk51bWJlciArIDEgOiAxO1xuICAgIGNvbnN0IGNvbWJpbmVkT2JqZWN0cyA9IHN0cmluZ2lmeU9iamVjdHModGhpcy5uYW1lLCB2ZXJzaW9uTnVtYmVyLCBhY3Rpb25OYW1lKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgYFJvbGUke2dldEhhc2goY29tYmluZWRPYmplY3RzKX1gLCB7XG4gICAgICByb2xlTmFtZTogUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhcHBjb25maWcuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgWydBbGxvd0FwcENvbmZpZ0ludm9rZUV4dGVuc2lvbkV2ZW50U291cmNlUG9saWN5J106IGV2ZW50RGVzdGluYXRpb24ucG9saWN5RG9jdW1lbnQhLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJvbGU7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXh0ZW5zaW9uIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb25zIGZvciB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9ucz86IEFjdGlvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBleHRlbnNpb24uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGF0ZXN0VmVyc2lvbk51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiBQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBleHRlbnNpb24uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvblZlcnNpb25OdW1iZXI6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgQVdTIEFwcENvbmZpZyByZXNvdXJjZXMgKGFwcGxpY2F0aW9uLFxuICogY29uZmlndXJhdGlvbiBwcm9maWxlLCBlbnZpcm9ubWVudCkgZGlyZWN0bHkuIFRoZXJlIGlzIGN1cnJlbnRseSBubyB1c2VcbiAqIGZvciB0aGlzIGNsYXNzIG91dHNpZGUgb2YgdGhlIEFXUyBBcHBDb25maWcgY29uc3RydWN0IGltcGxlbWVudGF0aW9uLiBJdCBpc1xuICogaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXNvdXJjZXMgc2luY2UgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0b1xuICogaW5oZXJpdCBmcm9tIHR3byBjbGFzc2VzIChhdCBsZWFzdCB3aXRoaW4gSlNJSSBjb25zdHJhaW50cykuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpYmxlQmFzZSBpbXBsZW1lbnRzIElFeHRlbnNpYmxlIHtcbiAgcHJpdmF0ZSByZXNvdXJjZUFybjogc3RyaW5nO1xuICBwcml2YXRlIHJlc291cmNlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBzY29wZTogQ29uc3RydWN0O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCByZXNvdXJjZUFybjogc3RyaW5nLCByZXNvdXJjZU5hbWU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc291cmNlQXJuID0gcmVzb3VyY2VBcm47XG4gICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICB9XG5cbiAgcHVibGljIG9uKGFjdGlvblBvaW50OiBBY3Rpb25Qb2ludCwgZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5nZXRFeHRlbnNpb25Gb3JBY3Rpb25Qb2ludChldmVudERlc3RpbmF0aW9uLCBhY3Rpb25Qb2ludCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgcHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24oZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5nZXRFeHRlbnNpb25Gb3JBY3Rpb25Qb2ludChldmVudERlc3RpbmF0aW9uLCBBY3Rpb25Qb2ludC5QUkVfQ1JFQVRFX0hPU1RFRF9DT05GSUdVUkFUSU9OX1ZFUlNJT04sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHByZVN0YXJ0RGVwbG95bWVudChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmdldEV4dGVuc2lvbkZvckFjdGlvblBvaW50KGV2ZW50RGVzdGluYXRpb24sIEFjdGlvblBvaW50LlBSRV9TVEFSVF9ERVBMT1lNRU5ULCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlcGxveW1lbnRTdGFydChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmdldEV4dGVuc2lvbkZvckFjdGlvblBvaW50KGV2ZW50RGVzdGluYXRpb24sIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfU1RBUlQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRGVwbG95bWVudFN0ZXAoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5nZXRFeHRlbnNpb25Gb3JBY3Rpb25Qb2ludChldmVudERlc3RpbmF0aW9uLCBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX1NURVAsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRGVwbG95bWVudEJha2luZyhldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmdldEV4dGVuc2lvbkZvckFjdGlvblBvaW50KGV2ZW50RGVzdGluYXRpb24sIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQkFLSU5HLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlcGxveW1lbnRDb21wbGV0ZShldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpIHtcbiAgICB0aGlzLmdldEV4dGVuc2lvbkZvckFjdGlvblBvaW50KGV2ZW50RGVzdGluYXRpb24sIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQ09NUExFVEUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIG9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgdGhpcy5nZXRFeHRlbnNpb25Gb3JBY3Rpb25Qb2ludChldmVudERlc3RpbmF0aW9uLCBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFeHRlbnNpb24oZXh0ZW5zaW9uOiBJRXh0ZW5zaW9uKSB7XG4gICAgdGhpcy5hZGRFeHRlbnNpb25Bc3NvY2lhdGlvbihleHRlbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb25Gb3JBY3Rpb25Qb2ludChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgYWN0aW9uUG9pbnQ6IEFjdGlvblBvaW50LCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucykge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zPy5leHRlbnNpb25OYW1lIHx8IHRoaXMuZ2V0RXh0ZW5zaW9uRGVmYXVsdE5hbWUoKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyID0gb3B0aW9ucz8ubGF0ZXN0VmVyc2lvbk51bWJlciA/IG9wdGlvbnM/LmxhdGVzdFZlcnNpb25OdW1iZXIgKyAxIDogMTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKHRoaXMuc2NvcGUsIGBFeHRlbnNpb24ke3RoaXMuZ2V0RXh0ZW5zaW9uSGFzaChuYW1lLCB2ZXJzaW9uTnVtYmVyKX1gLCB7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIG5ldyBBY3Rpb24oe1xuICAgICAgICAgIGV2ZW50RGVzdGluYXRpb24sXG4gICAgICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgICAgICBhY3Rpb25Qb2ludCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICBleHRlbnNpb25OYW1lOiBuYW1lLFxuICAgICAgLi4uKG9wdGlvbnM/LmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnM/LmxhdGVzdFZlcnNpb25OdW1iZXIgPyB7IGxhdGVzdFZlcnNpb25OdW1iZXI6IG9wdGlvbnMubGF0ZXN0VmVyc2lvbk51bWJlciB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnM/LnBhcmFtZXRlcnMgPyB7IHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRXh0ZW5zaW9uQXNzb2NpYXRpb24oZXh0ZW5zaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXh0ZW5zaW9uQXNzb2NpYXRpb24oZXh0ZW5zaW9uOiBJRXh0ZW5zaW9uKSB7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlciA9IGV4dGVuc2lvbj8ubGF0ZXN0VmVyc2lvbk51bWJlciA/IGV4dGVuc2lvbj8ubGF0ZXN0VmVyc2lvbk51bWJlciArIDEgOiAxO1xuICAgIGNvbnN0IG5hbWUgPSBleHRlbnNpb24ubmFtZSA/PyB0aGlzLmdldEV4dGVuc2lvbkRlZmF1bHROYW1lKCk7XG4gICAgbmV3IENmbkV4dGVuc2lvbkFzc29jaWF0aW9uKHRoaXMuc2NvcGUsIGBBc3NvY2lhdGlvblJlc291cmNlJHt0aGlzLmdldEV4dGVuc2lvbkFzc29jaWF0aW9uSGFzaChuYW1lLCB2ZXJzaW9uTnVtYmVyKX1gLCB7XG4gICAgICBleHRlbnNpb25JZGVudGlmaWVyOiBleHRlbnNpb24uZXh0ZW5zaW9uSWQsXG4gICAgICByZXNvdXJjZUlkZW50aWZpZXI6IHRoaXMucmVzb3VyY2VBcm4sXG4gICAgICBleHRlbnNpb25WZXJzaW9uTnVtYmVyOiBleHRlbnNpb24uZXh0ZW5zaW9uVmVyc2lvbk51bWJlcixcbiAgICAgIHBhcmFtZXRlcnM6IGV4dGVuc2lvbi5wYXJhbWV0ZXJzPy5yZWR1Y2UoKGFjYzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIGN1cjogUGFyYW1ldGVyKSA9PiB7XG4gICAgICAgIGlmIChjdXIudmFsdWUpIHtcbiAgICAgICAgICBhY2NbY3VyLm5hbWVdID0gY3VyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4dGVuc2lvbkhhc2gobmFtZTogc3RyaW5nLCB2ZXJzaW9uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb21iaW5lZFN0cmluZyA9IHN0cmluZ2lmeU9iamVjdHMobmFtZSwgdmVyc2lvbk51bWJlcik7XG4gICAgcmV0dXJuIGdldEhhc2goY29tYmluZWRTdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb25Bc3NvY2lhdGlvbkhhc2gobmFtZTogc3RyaW5nLCB2ZXJzaW9uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXNvdXJjZUlkZW50aWZpZXIgPSB0aGlzLnJlc291cmNlTmFtZSA/PyB0aGlzLnJlc291cmNlQXJuO1xuICAgIGNvbnN0IGNvbWJpbmVkU3RyaW5nID0gc3RyaW5naWZ5T2JqZWN0cyhyZXNvdXJjZUlkZW50aWZpZXIsIG5hbWUsIHZlcnNpb25OdW1iZXIpO1xuICAgIHJldHVybiBnZXRIYXNoKGNvbWJpbmVkU3RyaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXh0ZW5zaW9uRGVmYXVsdE5hbWUoKSB7XG4gICAgcmV0dXJuIE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLnNjb3BlLCB7XG4gICAgICBtYXhMZW5ndGg6IDU0LFxuICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgfSkgKyAnLUV4dGVuc2lvbic7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBleHRlbnNpYmxlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4dGVuc2libGUge1xuICAvKipcbiAgICogQWRkcyBhbiBleHRlbnNpb24gZGVmaW5lZCBieSB0aGUgYWN0aW9uIHBvaW50IGFuZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgZGVyaXZlZCByZXNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvblBvaW50IFRoZSBhY3Rpb24gcG9pbnQgd2hpY2ggdHJpZ2dlcnMgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudERlc3RpbmF0aW9uIFRoZSBldmVudCB0aGF0IG9jY3VycyBkdXJpbmcgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZXh0ZW5zaW9uXG4gICAqL1xuICBvbihhY3Rpb25Qb2ludDogQWN0aW9uUG9pbnQsIGV2ZW50RGVzdGluYXRpb246IElFdmVudERlc3RpbmF0aW9uLCBvcHRpb25zPzogRXh0ZW5zaW9uT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQUkVfQ1JFQVRFX0hPU1RFRF9DT05GSUdVUkFUSU9OX1ZFUlNJT04gZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50XG4gICAqIGRlc3RpbmF0aW9uIGFuZCBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBkZXJpdmVkIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgcHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24oZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhIFBSRV9TVEFSVF9ERVBMT1lNRU5UIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgZGVyaXZlZCByZXNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIHByZVN0YXJ0RGVwbG95bWVudChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfU1RBUlQgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBkZXJpdmVkIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50U3RhcnQoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX1NURVAgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBkZXJpdmVkIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50U3RlcChldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfQkFLSU5HIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgZGVyaXZlZCByZXNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIG9uRGVwbG95bWVudEJha2luZyhldmVudERlc3RpbmF0aW9uOiBJRXZlbnREZXN0aW5hdGlvbiwgb3B0aW9ucz86IEV4dGVuc2lvbk9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9OX0RFUExPWU1FTlRfQ09NUExFVEUgZXh0ZW5zaW9uIHdpdGggdGhlIHByb3ZpZGVkIGV2ZW50IGRlc3RpbmF0aW9uIGFuZFxuICAgKiBhbHNvIGNyZWF0ZXMgYW4gZXh0ZW5zaW9uIGFzc29jaWF0aW9uIHRvIHRoZSBkZXJpdmVkIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREZXN0aW5hdGlvbiBUaGUgZXZlbnQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBleHRlbnNpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGV4dGVuc2lvblxuICAgKi9cbiAgb25EZXBsb3ltZW50Q29tcGxldGUoZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBPTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLIGV4dGVuc2lvbiB3aXRoIHRoZSBwcm92aWRlZCBldmVudCBkZXN0aW5hdGlvbiBhbmRcbiAgICogYWxzbyBjcmVhdGVzIGFuIGV4dGVuc2lvbiBhc3NvY2lhdGlvbiB0byB0aGUgZGVyaXZlZCByZXNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50RGVzdGluYXRpb24gVGhlIGV2ZW50IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBleHRlbnNpb25cbiAgICovXG4gIG9uRGVwbG95bWVudFJvbGxlZEJhY2soZXZlbnREZXN0aW5hdGlvbjogSUV2ZW50RGVzdGluYXRpb24sIG9wdGlvbnM/OiBFeHRlbnNpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbiBleHRlbnNpb24gYXNzb2NpYXRpb24gdG8gdGhlIGRlcml2ZWQgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGV4dGVuc2lvbiB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gZm9yXG4gICAqL1xuICBhZGRFeHRlbnNpb24oZXh0ZW5zaW9uOiBJRXh0ZW5zaW9uKTogdm9pZDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/index.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/index.d.ts new file mode 100644 index 0000000000000..33118b5873456 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/index.d.ts @@ -0,0 +1,5 @@ +export * from './environment'; +export * from './deployment-strategy'; +export * from './extension'; +export * from './application'; +export * from './configuration'; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/index.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/index.js new file mode 100644 index 0000000000000..ac26300f2cd3e --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/index.js @@ -0,0 +1,22 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./environment"), exports); +__exportStar(require("./deployment-strategy"), exports); +__exportStar(require("./extension"), exports); +__exportStar(require("./application"), exports); +__exportStar(require("./configuration"), exports); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQThCO0FBQzlCLHdEQUFzQztBQUN0Qyw4Q0FBNEI7QUFDNUIsZ0RBQThCO0FBQzlCLGtEQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXBsb3ltZW50LXN0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vZXh0ZW5zaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwbGljYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.d.ts new file mode 100644 index 0000000000000..215b3952211a9 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.d.ts @@ -0,0 +1,2 @@ +export declare function getHash(stringToHash: string): string; +export declare function stringifyObjects(...objects: any[]): string; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.js b/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.js new file mode 100644 index 0000000000000..4a488af328faa --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/lib/private/hash.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stringifyObjects = exports.getHash = void 0; +const crypto = require("crypto"); +function getHash(stringToHash) { + const hash = crypto.createHash('sha256').update(stringToHash).digest('hex'); + const truncatedHash = hash.substring(0, 5).toUpperCase(); + return truncatedHash; +} +exports.getHash = getHash; +function stringifyObjects(...objects) { + const combinedObject = Object.assign({}, ...objects); + return JSON.stringify(combinedObject); +} +exports.stringifyObjects = stringifyObjects; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWlDO0FBRWpDLFNBQWdCLE9BQU8sQ0FBQyxZQUFvQjtJQUMxQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUpELDBCQUlDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBRyxPQUFjO0lBQ2hELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFIRCw0Q0FHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFzaChzdHJpbmdUb0hhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHN0cmluZ1RvSGFzaCkuZGlnZXN0KCdoZXgnKTtcbiAgY29uc3QgdHJ1bmNhdGVkSGFzaCA9IGhhc2guc3Vic3RyaW5nKDAsIDUpLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB0cnVuY2F0ZWRIYXNoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0cyguLi5vYmplY3RzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbWJpbmVkT2JqZWN0ID0gT2JqZWN0LmFzc2lnbih7fSwgLi4ub2JqZWN0cyk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShjb21iaW5lZE9iamVjdCk7XG59Il19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.js b/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.js new file mode 100644 index 0000000000000..232a9028d95b2 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/application.test.js @@ -0,0 +1,488 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cdk = require("aws-cdk-lib"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const aws_ecs_1 = require("aws-cdk-lib/aws-ecs"); +const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); +const lib_1 = require("../lib"); +describe('appconfig', () => { + test('basic appconfig', () => { + const stack = new cdk.Stack(); + new lib_1.Application(stack, 'MyAppConfig'); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Application', { + Name: 'MyAppConfig', + }); + }); + test('appconfig with name', () => { + const stack = new cdk.Stack(); + new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'TestApp', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Application', { + Name: 'TestApp', + }); + }); + test('appconfig with description', () => { + const stack = new cdk.Stack(); + new lib_1.Application(stack, 'MyAppConfig', { + description: 'This is my description', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Application', { + Name: 'MyAppConfig', + Description: 'This is my description', + }); + }); + test('get lambda layer arn', () => { + expect(lib_1.Application.getLambdaLayerVersionArn('us-east-1')).toEqual('arn:aws:lambda:us-east-1:027255383542:layer:AWS-AppConfig-Extension:128'); + expect(lib_1.Application.getLambdaLayerVersionArn('us-east-1', lib_1.Platform.ARM_64)).toEqual('arn:aws:lambda:us-east-1:027255383542:layer:AWS-AppConfig-Extension-Arm64:61'); + }); + test('add agent to ecs', () => { + const stack = new cdk.Stack(); + const taskDef = new aws_ecs_1.FargateTaskDefinition(stack, 'TaskDef'); + lib_1.Application.addAgentToEcs(taskDef); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: [ + { + Image: 'public.ecr.aws/aws-appconfig/aws-appconfig-agent:latest', + Name: 'AppConfigAgentContainer', + Essential: true, + }, + ], + }); + }); + test('specifying action point for extensible action on', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + appconfig.on(lib_1.ActionPoint.ON_DEPLOYMENT_STEP, new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_STEP: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: { 'Fn::GetAtt': ['MyFunc8A243A2C', 'Arn'] }, + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('pre create hosted configuration version', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + appconfig.preCreateHostedConfigurationVersion(new lib_1.LambdaDestination(func), { + description: 'This is my description', + extensionName: 'MyExtension', + latestVersionNumber: 1, + parameters: [ + lib_1.Parameter.required('myparam', 'val'), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Description: 'This is my description', + LatestVersionNumber: 1, + Actions: { + PRE_CREATE_HOSTED_CONFIGURATION_VERSION: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionE4CCERole467D69791333F', 'Arn'] }, + Uri: { 'Fn::GetAtt': ['MyFunc8A243A2C', 'Arn'] }, + }, + ], + }, + Parameters: { + myparam: { Required: true }, + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionE4CCE34485313', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionE4CCE34485313', 'VersionNumber'], + }, + Parameters: { + myparam: 'val', + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('pre start deployment', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.preStartDeployment(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + PRE_START_DEPLOYMENT: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('on deployment start', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + Object.defineProperty(appconfig, 'applicationArn', { + value: 'arn:aws:appconfig:us-east-1:123456789012:application/abc123', + }); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.onDeploymentStart(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_START: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('on deployment step', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.onDeploymentStep(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_STEP: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('on deployment complete', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.onDeploymentComplete(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('on deployment bake', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.onDeploymentBaking(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_BAKING: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('on deployment rolled back', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.onDeploymentRolledBack(new lib_1.LambdaDestination(func)); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyAppConfig-Extension', + Actions: { + ON_DEPLOYMENT_ROLLED_BACK: [ + { + Name: 'MyAppConfig-Extension-0', + RoleArn: { 'Fn::GetAtt': ['MyAppConfigExtensionF845ERole0D30970E5A7E5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyAppConfigExtensionF845EC11D4079', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyAppConfigB4B63E75' }, + ], + ], + }, + }); + }); + test('create same extension twice', () => { + const stack = new cdk.Stack(); + const appconfig = new lib_1.Application(stack, 'MyAppConfig'); + const func = new aws_lambda_1.Function(stack, 'MyFunc', { + handler: 'index.handler', + runtime: aws_lambda_1.Runtime.PYTHON_3_7, + code: aws_lambda_1.Code.fromInline('# this is my code'), + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + appconfig.preStartDeployment(new lib_1.LambdaDestination(func)); + expect(() => { + appconfig.preStartDeployment(new lib_1.LambdaDestination(func)); + }).toThrow(); + }); + test('from application arn', () => { + const stack = new cdk.Stack(); + const app = lib_1.Application.fromApplicationArn(stack, 'Application', 'arn:aws:appconfig:us-west-2:123456789012:application/abc123'); + expect(app.applicationId).toEqual('abc123'); + }); + test('from application arn with no resource name', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Application.fromApplicationArn(stack, 'Application', 'arn:aws:appconfig:us-west-2:123456789012:application/'); + }).toThrow('Missing required application id from application ARN'); + }); + test('from application id', () => { + const cdkApp = new cdk.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const app = lib_1.Application.fromApplicationId(stack, 'Application', 'abc123'); + expect(app.applicationId).toEqual('abc123'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcGxpY2F0aW9uLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBbUM7QUFDbkMsdURBQWtEO0FBQ2xELGlEQUE0RDtBQUM1RCx1REFBaUU7QUFDakUsZ0NBTWdCO0FBRWhCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV0QyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyw2QkFBNkIsRUFBRTtZQUM3RSxJQUFJLEVBQUUsYUFBYTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDcEMsZUFBZSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxDQUFDO1FBRUgscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLEVBQUU7WUFDN0UsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksaUJBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQ3BD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a0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFDN0QsNkRBQTZELENBQUMsQ0FBQztRQUVqRSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLGlCQUFXLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFDakQsdURBQXVELENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDM0MsR0FBRyxFQUFFO2dCQUNILE1BQU0sRUFBRSxXQUFXO2dCQUNuQixPQUFPLEVBQUUsY0FBYzthQUN4QjtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLGlCQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUxRSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBGYXJnYXRlVGFza0RlZmluaXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbixcbiAgUGxhdGZvcm0sXG4gIExhbWJkYURlc3RpbmF0aW9uLFxuICBQYXJhbWV0ZXIsXG4gIEFjdGlvblBvaW50LFxufSBmcm9tICcuLi9saWInO1xuXG5kZXNjcmliZSgnYXBwY29uZmlnJywgKCkgPT4ge1xuICB0ZXN0KCdiYXNpYyBhcHBjb25maWcnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb24nLCB7XG4gICAgICBOYW1lOiAnTXlBcHBDb25maWcnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhcHBjb25maWcgd2l0aCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJywge1xuICAgICAgYXBwbGljYXRpb25OYW1lOiAnVGVzdEFwcCcsXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkFwcGxpY2F0aW9uJywge1xuICAgICAgTmFtZTogJ1Rlc3RBcHAnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhcHBjb25maWcgd2l0aCBkZXNjcmlwdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkFwcGxpY2F0aW9uJywge1xuICAgICAgTmFtZTogJ015QXBwQ29uZmlnJyxcbiAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dldCBsYW1iZGEgbGF5ZXIgYXJuJywgKCkgPT4ge1xuICAgIGV4cGVjdChBcHBsaWNhdGlvbi5nZXRMYW1iZGFMYXllclZlcnNpb25Bcm4oJ3VzLWVhc3QtMScpKS50b0VxdWFsKCdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MDI3MjU1MzgzNTQyOmxheWVyOkFXUy1BcHBDb25maWctRXh0ZW5zaW9uOjEyOCcpO1xuICAgIGV4cGVjdChBcHBsaWNhdGlvbi5nZXRMYW1iZGFMYXllclZlcnNpb25Bcm4oJ3VzLWVhc3QtMScsIFBsYXRmb3JtLkFSTV82NCkpLnRvRXF1YWwoJ2Fybjphd3M6bGFtYmRhOnVzLWVhc3QtMTowMjcyNTUzODM1NDI6bGF5ZXI6QVdTLUFwcENvbmZpZy1FeHRlbnNpb24tQXJtNjQ6NjEnKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkIGFnZW50IHRvIGVjcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCB0YXNrRGVmID0gbmV3IEZhcmdhdGVUYXNrRGVmaW5pdGlvbihzdGFjaywgJ1Rhc2tEZWYnKTtcbiAgICBBcHBsaWNhdGlvbi5hZGRBZ2VudFRvRWNzKHRhc2tEZWYpO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RUNTOjpUYXNrRGVmaW5pdGlvbicsIHtcbiAgICAgIENvbnRhaW5lckRlZmluaXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBJbWFnZTogJ3B1YmxpYy5lY3IuYXdzL2F3cy1hcHBjb25maWcvYXdzLWFwcGNvbmZpZy1hZ2VudDpsYXRlc3QnLFxuICAgICAgICAgIE5hbWU6ICdBcHBDb25maWdBZ2VudENvbnRhaW5lcicsXG4gICAgICAgICAgRXNzZW50aWFsOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnc3BlY2lmeWluZyBhY3Rpb24gcG9pbnQgZm9yIGV4dGVuc2libGUgYWN0aW9uIG9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcGNvbmZpZyA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ015RnVuYycsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuUFlUSE9OXzNfNyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnIyB0aGlzIGlzIG15IGNvZGUnKSxcbiAgICB9KTtcbiAgICBhcHBjb25maWcub24oQWN0aW9uUG9pbnQuT05fREVQTE9ZTUVOVF9TVEVQLCBuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYykpO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb24nLCB7XG4gICAgICBOYW1lOiAnTXlBcHBDb25maWctRXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9TVEVQOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiB7ICdGbjo6R2V0QXR0JzogWydNeUZ1bmM4QTI0M0EyQycsICdBcm4nXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uQXNzb2NpYXRpb24nLCB7XG4gICAgICBFeHRlbnNpb25JZGVudGlmaWVyOiB7XG4gICAgICAgICdGbjo6R2V0QXR0JzogWydNeUFwcENvbmZpZ0V4dGVuc2lvbkY4NDVFQzExRDQwNzknLCAnSWQnXSxcbiAgICAgIH0sXG4gICAgICBFeHRlbnNpb25WZXJzaW9uTnVtYmVyOiB7XG4gICAgICAgICdGbjo6R2V0QXR0JzogWydNeUFwcENvbmZpZ0V4dGVuc2lvbkY4NDVFQzExRDQwNzknLCAnVmVyc2lvbk51bWJlciddLFxuICAgICAgfSxcbiAgICAgIFJlc291cmNlSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ2FybjonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlBhcnRpdGlvbicgfSxcbiAgICAgICAgICAgICc6YXBwY29uZmlnOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UmVnaW9uJyB9LFxuICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICc6YXBwbGljYXRpb24vJyxcbiAgICAgICAgICAgIHsgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScgfSxcbiAgICAgICAgICBdLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgncHJlIGNyZWF0ZSBob3N0ZWQgY29uZmlndXJhdGlvbiB2ZXJzaW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcGNvbmZpZyA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ015RnVuYycsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuUFlUSE9OXzNfNyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnIyB0aGlzIGlzIG15IGNvZGUnKSxcbiAgICB9KTtcbiAgICBhcHBjb25maWcucHJlQ3JlYXRlSG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24obmV3IExhbWJkYURlc3RpbmF0aW9uKGZ1bmMpLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgbXkgZGVzY3JpcHRpb24nLFxuICAgICAgZXh0ZW5zaW9uTmFtZTogJ015RXh0ZW5zaW9uJyxcbiAgICAgIGxhdGVzdFZlcnNpb25OdW1iZXI6IDEsXG4gICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgIFBhcmFtZXRlci5yZXF1aXJlZCgnbXlwYXJhbScsICd2YWwnKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbicsXG4gICAgICBEZXNjcmlwdGlvbjogJ1RoaXMgaXMgbXkgZGVzY3JpcHRpb24nLFxuICAgICAgTGF0ZXN0VmVyc2lvbk51bWJlcjogMSxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgUFJFX0NSRUFURV9IT1NURURfQ09ORklHVVJBVElPTl9WRVJTSU9OOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015RXh0ZW5zaW9uLTAnLFxuICAgICAgICAgICAgUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25FNENDRVJvbGU0NjdENjk3OTEzMzNGJywgJ0FybiddIH0sXG4gICAgICAgICAgICBVcmk6IHsgJ0ZuOjpHZXRBdHQnOiBbJ015RnVuYzhBMjQzQTJDJywgJ0FybiddIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBQYXJhbWV0ZXJzOiB7XG4gICAgICAgIG15cGFyYW06IHsgUmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb25Bc3NvY2lhdGlvbicsIHtcbiAgICAgIEV4dGVuc2lvbklkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRTRDQ0UzNDQ4NTMxMycsICdJZCddLFxuICAgICAgfSxcbiAgICAgIEV4dGVuc2lvblZlcnNpb25OdW1iZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRTRDQ0UzNDQ4NTMxMycsICdWZXJzaW9uTnVtYmVyJ10sXG4gICAgICB9LFxuICAgICAgUGFyYW1ldGVyczoge1xuICAgICAgICBteXBhcmFtOiAndmFsJyxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3ByZSBzdGFydCBkZXBsb3ltZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcGNvbmZpZyA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ015RnVuYycsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuUFlUSE9OXzNfNyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnIyB0aGlzIGlzIG15IGNvZGUnKSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYywgJ2Z1bmN0aW9uQXJuJywge1xuICAgICAgdmFsdWU6ICdhcm46bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246bXktZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIGFwcGNvbmZpZy5wcmVTdGFydERlcGxveW1lbnQobmV3IExhbWJkYURlc3RpbmF0aW9uKGZ1bmMpKTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uJywge1xuICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbicsXG4gICAgICBBY3Rpb25zOiB7XG4gICAgICAgIFBSRV9TVEFSVF9ERVBMT1lNRU5UOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ29uIGRlcGxveW1lbnQgc3RhcnQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwY29uZmlnID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwY29uZmlnLCAnYXBwbGljYXRpb25Bcm4nLCB7XG4gICAgICB2YWx1ZTogJ2Fybjphd3M6YXBwY29uZmlnOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vYWJjMTIzJyxcbiAgICB9KTtcbiAgICBjb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKHN0YWNrLCAnTXlGdW5jJywge1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgcnVudGltZTogUnVudGltZS5QWVRIT05fM183LFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCcjIHRoaXMgaXMgbXkgY29kZScpLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jLCAnZnVuY3Rpb25Bcm4nLCB7XG4gICAgICB2YWx1ZTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgfSk7XG4gICAgYXBwY29uZmlnLm9uRGVwbG95bWVudFN0YXJ0KG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUFwcENvbmZpZy1FeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX1NUQVJUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ29uIGRlcGxveW1lbnQgc3RlcCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHBjb25maWcgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmMnLCB7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBydW50aW1lOiBSdW50aW1lLlBZVEhPTl8zXzcsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJyMgdGhpcyBpcyBteSBjb2RlJyksXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBhcHBjb25maWcub25EZXBsb3ltZW50U3RlcChuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYykpO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb24nLCB7XG4gICAgICBOYW1lOiAnTXlBcHBDb25maWctRXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9TVEVQOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ29uIGRlcGxveW1lbnQgY29tcGxldGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwY29uZmlnID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKHN0YWNrLCAnTXlGdW5jJywge1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgcnVudGltZTogUnVudGltZS5QWVRIT05fM183LFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCcjIHRoaXMgaXMgbXkgY29kZScpLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jLCAnZnVuY3Rpb25Bcm4nLCB7XG4gICAgICB2YWx1ZTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgfSk7XG4gICAgYXBwY29uZmlnLm9uRGVwbG95bWVudENvbXBsZXRlKG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUFwcENvbmZpZy1FeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX0NPTVBMRVRFOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ29uIGRlcGxveW1lbnQgYmFrZScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHBjb25maWcgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmMnLCB7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBydW50aW1lOiBSdW50aW1lLlBZVEhPTl8zXzcsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJyMgdGhpcyBpcyBteSBjb2RlJyksXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBhcHBjb25maWcub25EZXBsb3ltZW50QmFraW5nKG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUFwcENvbmZpZy1FeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX0JBS0lORzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdNeUFwcENvbmZpZy1FeHRlbnNpb24tMCcsXG4gICAgICAgICAgICBSb2xlQXJuOiB7ICdGbjo6R2V0QXR0JzogWydNeUFwcENvbmZpZ0V4dGVuc2lvbkY4NDVFUm9sZTBEMzA5NzBFNUE3RTUnLCAnQXJuJ10gfSxcbiAgICAgICAgICAgIFVyaTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb25Bc3NvY2lhdGlvbicsIHtcbiAgICAgIEV4dGVuc2lvbklkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVDMTFENDA3OScsICdJZCddLFxuICAgICAgfSxcbiAgICAgIEV4dGVuc2lvblZlcnNpb25OdW1iZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVDMTFENDA3OScsICdWZXJzaW9uTnVtYmVyJ10sXG4gICAgICB9LFxuICAgICAgUmVzb3VyY2VJZGVudGlmaWVyOiB7XG4gICAgICAgICdGbjo6Sm9pbic6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICAnYXJuOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UGFydGl0aW9uJyB9LFxuICAgICAgICAgICAgJzphcHBjb25maWc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpSZWdpb24nIH0sXG4gICAgICAgICAgICAnOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6QWNjb3VudElkJyB9LFxuICAgICAgICAgICAgJzphcHBsaWNhdGlvbi8nLFxuICAgICAgICAgICAgeyBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdvbiBkZXBsb3ltZW50IHJvbGxlZCBiYWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcGNvbmZpZyA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ015RnVuYycsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuUFlUSE9OXzNfNyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnIyB0aGlzIGlzIG15IGNvZGUnKSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYywgJ2Z1bmN0aW9uQXJuJywge1xuICAgICAgdmFsdWU6ICdhcm46bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246bXktZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIGFwcGNvbmZpZy5vbkRlcGxveW1lbnRSb2xsZWRCYWNrKG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUFwcENvbmZpZy1FeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015QXBwQ29uZmlnLUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015QXBwQ29uZmlnRXh0ZW5zaW9uRjg0NUVSb2xlMEQzMDk3MEU1QTdFNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlBcHBDb25maWdFeHRlbnNpb25GODQ1RUMxMUQ0MDc5JywgJ1ZlcnNpb25OdW1iZXInXSxcbiAgICAgIH0sXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHtcbiAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICcnLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAnOmFwcGNvbmZpZzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpBY2NvdW50SWQnIH0sXG4gICAgICAgICAgICAnOmFwcGxpY2F0aW9uLycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZSBzYW1lIGV4dGVuc2lvbiB0d2ljZScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHBjb25maWcgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmMnLCB7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBydW50aW1lOiBSdW50aW1lLlBZVEhPTl8zXzcsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJyMgdGhpcyBpcyBteSBjb2RlJyksXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBhcHBjb25maWcucHJlU3RhcnREZXBsb3ltZW50KG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSk7XG5cbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgYXBwY29uZmlnLnByZVN0YXJ0RGVwbG95bWVudChuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYykpO1xuICAgIH0pLnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgnZnJvbSBhcHBsaWNhdGlvbiBhcm4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gQXBwbGljYXRpb24uZnJvbUFwcGxpY2F0aW9uQXJuKHN0YWNrLCAnQXBwbGljYXRpb24nLFxuICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vYWJjMTIzJyk7XG5cbiAgICBleHBlY3QoYXBwLmFwcGxpY2F0aW9uSWQpLnRvRXF1YWwoJ2FiYzEyMycpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIGFwcGxpY2F0aW9uIGFybiB3aXRoIG5vIHJlc291cmNlIG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIEFwcGxpY2F0aW9uLmZyb21BcHBsaWNhdGlvbkFybihzdGFjaywgJ0FwcGxpY2F0aW9uJyxcbiAgICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vJyk7XG4gICAgfSkudG9UaHJvdygnTWlzc2luZyByZXF1aXJlZCBhcHBsaWNhdGlvbiBpZCBmcm9tIGFwcGxpY2F0aW9uIEFSTicpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIGFwcGxpY2F0aW9uIGlkJywgKCkgPT4ge1xuICAgIGNvbnN0IGNka0FwcCA9IG5ldyBjZGsuQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGNka0FwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBhcHAgPSBBcHBsaWNhdGlvbi5mcm9tQXBwbGljYXRpb25JZChzdGFjaywgJ0FwcGxpY2F0aW9uJywgJ2FiYzEyMycpO1xuXG4gICAgZXhwZWN0KGFwcC5hcHBsaWNhdGlvbklkKS50b0VxdWFsKCdhYmMxMjMnKTtcbiAgfSk7XG59KTsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.js b/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.js new file mode 100644 index 0000000000000..fbab8223536ec --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/configuration.test.js @@ -0,0 +1,1280 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cdk = require("aws-cdk-lib"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const aws_codepipeline_1 = require("aws-cdk-lib/aws-codepipeline"); +const aws_codepipeline_actions_1 = require("aws-cdk-lib/aws-codepipeline-actions"); +const iam = require("aws-cdk-lib/aws-iam"); +const aws_kms_1 = require("aws-cdk-lib/aws-kms"); +const aws_s3_1 = require("aws-cdk-lib/aws-s3"); +const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager"); +const aws_ssm_1 = require("aws-cdk-lib/aws-ssm"); +const lib_1 = require("../lib"); +describe('configuration', () => { + test('configuration with no environments and no deployTo prop', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Environment', 0); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyHostedConfig', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration with environments and no deployTo prop', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + app.addEnvironment('MyEnv1'); + app.addEnvironment('MyEnv2'); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyHostedConfig', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Environment', 2); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration with environments and deployTo prop', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + app.addEnvironment('MyEnv1'); + const env = app.addEnvironment('MyEnv2'); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deployTo: [env], + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyHostedConfig', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv2350437D6', + }, + ConfigurationVersion: { + Ref: 'MyHostedConfig51D3877D', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy60D31FB0', + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Environment', 2); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration using deploy method and no environment associated', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + app.addEnvironment('MyEnv1'); + const env = app.addEnvironment('MyEnv2'); + const config = new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + config.deploy(env); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv2350437D6', + }, + ConfigurationVersion: { + Ref: 'MyHostedConfig51D3877D', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy60D31FB0', + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration using deploy method with environment associated', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + const env1 = app.addEnvironment('MyEnv1'); + const env2 = app.addEnvironment('MyEnv2'); + const config = new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [env1], + }); + config.deploy(env2); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv1B9120FA1', + }, + ConfigurationVersion: { + Ref: 'MyHostedConfig51D3877D', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy60D31FB0', + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv2350437D6', + }, + ConfigurationVersion: { + Ref: 'MyHostedConfig51D3877D', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy60D31FB0', + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 2); + }); + test('configuration with no environment associated and no deploy method used', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration with two configurations specified', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + const env1 = app.addEnvironment('MyEnv1'); + const env2 = app.addEnvironment('MyEnv2'); + const bucket = new aws_s3_1.Bucket(stack, 'MyBucket'); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + deployTo: [env1], + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy1', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + new lib_1.SourcedConfiguration(stack, 'MySourcedConfig', { + versionNumber: '1', + location: lib_1.ConfigurationSource.fromBucket(bucket, 'path/to/object'), + application: app, + deployTo: [env2], + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy2', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyHostedConfig', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MySourcedConfig', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: { + 'Fn::Join': [ + '', + [ + 's3://', + { Ref: 'MyBucketF68F3FF0' }, + '/path/to/object', + ], + ], + }, + RetrievalRoleArn: { 'Fn::GetAtt': ['MySourcedConfigRole249449B1', 'Arn'] }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy1', + DeploymentDurationInMinutes: 30, + GrowthFactor: 15, + ReplicateTo: 'NONE', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy2', + DeploymentDurationInMinutes: 30, + GrowthFactor: 15, + ReplicateTo: 'NONE', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv1B9120FA1', + }, + ConfigurationVersion: { + Ref: 'MyHostedConfig51D3877D', + }, + ConfigurationProfileId: { + Ref: 'MyHostedConfigConfigurationProfile2E1A2BBC', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy178099446', + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigMyEnv2350437D6', + }, + ConfigurationVersion: '1', + ConfigurationProfileId: { + Ref: 'MySourcedConfig5455C47C', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy202B80715', + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::ConfigurationProfile', 2); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Environment', 2); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 2); + }); + test('configuration with two configurations and no deployment strategy specified', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'MyApplication', + }); + const bucket = new aws_s3_1.Bucket(stack, 'MyBucket'); + new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + application: app, + }); + new lib_1.SourcedConfiguration(stack, 'MySourcedConfig', { + versionNumber: '1', + location: lib_1.ConfigurationSource.fromBucket(bucket, 'path/to/object'), + application: app, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyHostedConfig-DeploymentStrategy-A5936E60', + DeploymentDurationInMinutes: 20, + GrowthFactor: 10, + ReplicateTo: 'NONE', + FinalBakeTimeInMinutes: 10, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MySourcedConfig-DeploymentStrategy-7A104657', + DeploymentDurationInMinutes: 20, + GrowthFactor: 10, + ReplicateTo: 'NONE', + FinalBakeTimeInMinutes: 10, + }); + }); + test('deploy secret with kms key', () => { + const stack = new cdk.Stack(); + const key = new aws_kms_1.Key(stack, 'MyKey'); + const secret = new aws_secretsmanager_1.Secret(stack, 'MySecret'); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MySourcedConfig', { + versionNumber: '1', + location: lib_1.ConfigurationSource.fromSecret(secret), + deploymentKey: key, + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Deployment', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + EnvironmentId: { + Ref: 'MyAppConfigEnvironment833A9182', + }, + ConfigurationVersion: '1', + ConfigurationProfileId: { + Ref: 'MySourcedConfig5455C47C', + }, + DeploymentStrategyId: { + Ref: 'MyDeploymentStrategy60D31FB0', + }, + KmsKeyIdentifier: { 'Fn::GetAtt': ['MyKey6AB29FA6', 'Arn'] }, + }); + }); + test('default configuration from inline', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + application: app, + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyConfiguration', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationConfigurationProfileEE0ECA85', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('default configuration from file', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + application: app, + content: lib_1.ConfigurationContent.fromFile('test/config.json'), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyConfiguration', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationConfigurationProfileEE0ECA85', + }, + Content: '{\n "content": "This is the configuration content"\n}', + ContentType: 'application/json', + }); + }); + test('default configuration from inline octet', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + application: app, + content: lib_1.ConfigurationContent.fromInline('This should be of content type application/octet'), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyConfiguration', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationConfigurationProfileEE0ECA85', + }, + Content: 'This should be of content type application/octet', + ContentType: 'application/octet-stream', + }); + }); + test('default configuration from inline yaml', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + application: app, + content: lib_1.ConfigurationContent.fromInlineYaml('This should be of content type application/x-yaml'), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'MyConfiguration', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationConfigurationProfileEE0ECA85', + }, + Content: 'This should be of content type application/x-yaml', + ContentType: 'application/x-yaml', + }); + }); + test('configuration profile with name', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfigurationProfile', { + name: 'TestConfigProfile', + application: app, + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationProfile33A97163', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with type', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfigurationProfile', { + name: 'TestConfigProfile', + application: app, + type: lib_1.ConfigurationType.FEATURE_FLAGS, + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Type: 'AWS.AppConfig.FeatureFlags', + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationProfile33A97163', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with description', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfigurationProfile', { + name: 'TestConfigProfile', + application: app, + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + description: 'This is my description', + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Description: 'This is my description', + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationProfile33A97163', + }, + Content: 'This is my content', + ContentType: 'text/plain', + Description: 'This is my description', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with validator', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.HostedConfiguration(stack, 'MyConfigurationProfile', { + name: 'TestConfigProfile', + application: app, + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + validators: [ + { + content: 'dummy validator', + type: lib_1.ValidatorType.JSON_SCHEMA, + }, + ], + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Validators: [ + { + Type: 'JSON_SCHEMA', + Content: 'dummy validator', + }, + ], + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationProfile33A97163', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with inline json schema validator', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const validatorContent = ` + { + "type": "object", + "properties": { + "computeResource": { + "type": "object", + "properties": { + "ComputeAL1ImageId": { + "type": "object", + "properties": { + "me-south-1": { "type": "string" }, + "ap-east-1": { "type": "string" }, + "ap-northeast-1": { "type": "string" }, + "ap-northeast-2": { "type": "string" }, + "ap-south-1": { "type": "string" }, + "ap-southeast-1": { "type": "string" }, + "ap-southeast-2": { "type": "string" }, + "ca-central-1": { "type": "string" }, + "cn-north-1": { "type": "string" }, + "cn-northwest-1": { "type": "string" }, + "eu-central-1": { "type": "string" }, + "eu-north-1": { "type": "string" }, + "eu-west-1": { "type": "string" }, + "eu-west-2": { "type": "string" }, + "eu-west-3": { "type": "string" }, + "sa-east-1": { "type": "string" }, + "us-east-1": { "type": "string" }, + "us-east-2": { "type": "string" }, + "us-gov-west-1": { "type": "string" }, + "us-gov-east-1": { "type": "string" }, + "us-west-1": { "type": "string" }, + "us-west-2": { "type": "string" }, + "eu-south-1": { "type": "string" }, + "ap-northeast-3": { "type": "string" }, + "af-south-1": { "type": "string" } + } + }, + "GPUImageId": { + "type": "object", + "properties": { + "me-south-1": { "type": "string" }, + "ap-east-1": { "type": "string" }, + "ap-northeast-1": { "type": "string" }, + "ap-northeast-2": { "type": "string" }, + "ap-south-1": { "type": "string" }, + "ap-southeast-1": { "type": "string" }, + "ap-southeast-2": { "type": "string" }, + "ca-central-1": { "type": "string" }, + "cn-north-1": { "type": "string" }, + "cn-northwest-1": { "type": "string" }, + "eu-central-1": { "type": "string" }, + "eu-north-1": { "type": "string" }, + "eu-west-1": { "type": "string" }, + "eu-west-2": { "type": "string" }, + "eu-west-3": { "type": "string" }, + "sa-east-1": { "type": "string" }, + "us-east-1": { "type": "string" }, + "us-east-2": { "type": "string" }, + "us-gov-west-1": { "type": "string" }, + "us-gov-east-1": { "type": "string" }, + "us-west-1": { "type": "string" }, + "us-west-2": { "type": "string" }, + "eu-south-1": { "type": "string" }, + "ap-northeast-3": { "type": "string" }, + "af-south-1": { "type": "string" } + } + }, + "ARMImageId": { + "type": "object", + "properties": { + "me-south-1": { "type": "string" }, + "ap-east-1": { "type": "string" }, + "ap-northeast-1": { "type": "string" }, + "ap-northeast-2": { "type": "string" }, + "ap-south-1": { "type": "string" }, + "ap-southeast-1": { "type": "string" }, + "ap-southeast-2": { "type": "string" }, + "ca-central-1": { "type": "string" }, + "cn-north-1": { "type": "string" }, + "cn-northwest-1": { "type": "string" }, + "eu-central-1": { "type": "string" }, + "eu-north-1": { "type": "string" }, + "eu-west-1": { "type": "string" }, + "eu-west-2": { "type": "string" }, + "eu-west-3": { "type": "string" }, + "sa-east-1": { "type": "string" }, + "us-east-1": { "type": "string" }, + "us-east-2": { "type": "string" }, + "us-gov-west-1": { "type": "string" }, + "us-gov-east-1": { "type": "string" }, + "us-west-1": { "type": "string" }, + "us-west-2": { "type": "string" }, + "eu-south-1": { "type": "string" }, + "ap-northeast-3": { "type": "string" }, + "af-south-1": { "type": "string" } + } + }, + "ComputeAL2ImageId": { + "type": "object", + "properties": { + "me-south-1": { "type": "string" }, + "ap-east-1": { "type": "string" }, + "ap-northeast-1": { "type": "string" }, + "ap-northeast-2": { "type": "string" }, + "ap-south-1": { "type": "string" }, + "ap-southeast-1": { "type": "string" }, + "ap-southeast-2": { "type": "string" }, + "ca-central-1": { "type": "string" }, + "cn-north-1": { "type": "string" }, + "cn-northwest-1": { "type": "string" }, + "eu-central-1": { "type": "string" }, + "eu-north-1": { "type": "string" }, + "eu-west-1": { "type": "string" }, + "eu-west-2": { "type": "string" }, + "eu-west-3": { "type": "string" }, + "sa-east-1": { "type": "string" }, + "us-east-1": { "type": "string" }, + "us-east-2": { "type": "string" }, + "us-gov-west-1": { "type": "string" }, + "us-gov-east-1": { "type": "string" }, + "us-west-1": { "type": "string" }, + "us-west-2": { "type": "string" }, + "eu-south-1": { "type": "string" }, + "ap-northeast-3": { "type": "string" }, + "af-south-1": { "type": "string" } + } + } + } + } + } + }`; + new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + application: app, + validators: [ + lib_1.JsonSchemaValidator.fromInline(validatorContent), + lib_1.JsonSchemaValidator.fromFile('test/schema.json'), + ], + content: lib_1.ConfigurationContent.fromInlineText('This is my content'), + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Validators: [ + { + Type: 'JSON_SCHEMA', + Content: '\n {\n \"type\": \"object\",\n \"properties\": {\n \"computeResource\": {\n \"type\": \"object\",\n \"properties\": {\n \"ComputeAL1ImageId\": {\n \"type\": \"object\",\n \"properties\": {\n \"me-south-1\": { \"type\": \"string\" },\n \"ap-east-1\": { \"type\": \"string\" },\n \"ap-northeast-1\": { \"type\": \"string\" },\n \"ap-northeast-2\": { \"type\": \"string\" },\n \"ap-south-1\": { \"type\": \"string\" },\n \"ap-southeast-1\": { \"type\": \"string\" },\n \"ap-southeast-2\": { \"type\": \"string\" },\n \"ca-central-1\": { \"type\": \"string\" },\n \"cn-north-1\": { \"type\": \"string\" },\n \"cn-northwest-1\": { \"type\": \"string\" },\n \"eu-central-1\": { \"type\": \"string\" },\n \"eu-north-1\": { \"type\": \"string\" },\n \"eu-west-1\": { \"type\": \"string\" },\n \"eu-west-2\": { \"type\": \"string\" },\n \"eu-west-3\": { \"type\": \"string\" },\n \"sa-east-1\": { \"type\": \"string\" },\n \"us-east-1\": { \"type\": \"string\" },\n \"us-east-2\": { \"type\": \"string\" },\n \"us-gov-west-1\": { \"type\": \"string\" },\n \"us-gov-east-1\": { \"type\": \"string\" },\n \"us-west-1\": { \"type\": \"string\" },\n \"us-west-2\": { \"type\": \"string\" },\n \"eu-south-1\": { \"type\": \"string\" },\n \"ap-northeast-3\": { \"type\": \"string\" },\n \"af-south-1\": { \"type\": \"string\" }\n }\n },\n \"GPUImageId\": {\n \"type\": \"object\",\n \"properties\": {\n \"me-south-1\": { \"type\": \"string\" },\n \"ap-east-1\": { \"type\": \"string\" },\n \"ap-northeast-1\": { \"type\": \"string\" },\n \"ap-northeast-2\": { \"type\": \"string\" },\n \"ap-south-1\": { \"type\": \"string\" },\n \"ap-southeast-1\": { \"type\": \"string\" },\n \"ap-southeast-2\": { \"type\": \"string\" },\n \"ca-central-1\": { \"type\": \"string\" },\n \"cn-north-1\": { \"type\": \"string\" },\n \"cn-northwest-1\": { \"type\": \"string\" },\n \"eu-central-1\": { \"type\": \"string\" },\n \"eu-north-1\": { \"type\": \"string\" },\n \"eu-west-1\": { \"type\": \"string\" },\n \"eu-west-2\": { \"type\": \"string\" },\n \"eu-west-3\": { \"type\": \"string\" },\n \"sa-east-1\": { \"type\": \"string\" },\n \"us-east-1\": { \"type\": \"string\" },\n \"us-east-2\": { \"type\": \"string\" },\n \"us-gov-west-1\": { \"type\": \"string\" },\n \"us-gov-east-1\": { \"type\": \"string\" },\n \"us-west-1\": { \"type\": \"string\" },\n \"us-west-2\": { \"type\": \"string\" },\n \"eu-south-1\": { \"type\": \"string\" },\n \"ap-northeast-3\": { \"type\": \"string\" },\n \"af-south-1\": { \"type\": \"string\" }\n }\n },\n \"ARMImageId\": {\n \"type\": \"object\",\n \"properties\": {\n \"me-south-1\": { \"type\": \"string\" },\n \"ap-east-1\": { \"type\": \"string\" },\n \"ap-northeast-1\": { \"type\": \"string\" },\n \"ap-northeast-2\": { \"type\": \"string\" },\n \"ap-south-1\": { \"type\": \"string\" },\n \"ap-southeast-1\": { \"type\": \"string\" },\n \"ap-southeast-2\": { \"type\": \"string\" },\n \"ca-central-1\": { \"type\": \"string\" },\n \"cn-north-1\": { \"type\": \"string\" },\n \"cn-northwest-1\": { \"type\": \"string\" },\n \"eu-central-1\": { \"type\": \"string\" },\n \"eu-north-1\": { \"type\": \"string\" },\n \"eu-west-1\": { \"type\": \"string\" },\n \"eu-west-2\": { \"type\": \"string\" },\n \"eu-west-3\": { \"type\": \"string\" },\n \"sa-east-1\": { \"type\": \"string\" },\n \"us-east-1\": { \"type\": \"string\" },\n \"us-east-2\": { \"type\": \"string\" },\n \"us-gov-west-1\": { \"type\": \"string\" },\n \"us-gov-east-1\": { \"type\": \"string\" },\n \"us-west-1\": { \"type\": \"string\" },\n \"us-west-2\": { \"type\": \"string\" },\n \"eu-south-1\": { \"type\": \"string\" },\n \"ap-northeast-3\": { \"type\": \"string\" },\n \"af-south-1\": { \"type\": \"string\" }\n }\n },\n \"ComputeAL2ImageId\": {\n \"type\": \"object\",\n \"properties\": {\n \"me-south-1\": { \"type\": \"string\" },\n \"ap-east-1\": { \"type\": \"string\" },\n \"ap-northeast-1\": { \"type\": \"string\" },\n \"ap-northeast-2\": { \"type\": \"string\" },\n \"ap-south-1\": { \"type\": \"string\" },\n \"ap-southeast-1\": { \"type\": \"string\" },\n \"ap-southeast-2\": { \"type\": \"string\" },\n \"ca-central-1\": { \"type\": \"string\" },\n \"cn-north-1\": { \"type\": \"string\" },\n \"cn-northwest-1\": { \"type\": \"string\" },\n \"eu-central-1\": { \"type\": \"string\" },\n \"eu-north-1\": { \"type\": \"string\" },\n \"eu-west-1\": { \"type\": \"string\" },\n \"eu-west-2\": { \"type\": \"string\" },\n \"eu-west-3\": { \"type\": \"string\" },\n \"sa-east-1\": { \"type\": \"string\" },\n \"us-east-1\": { \"type\": \"string\" },\n \"us-east-2\": { \"type\": \"string\" },\n \"us-gov-west-1\": { \"type\": \"string\" },\n \"us-gov-east-1\": { \"type\": \"string\" },\n \"us-west-1\": { \"type\": \"string\" },\n \"us-west-2\": { \"type\": \"string\" },\n \"eu-south-1\": { \"type\": \"string\" },\n \"ap-northeast-3\": { \"type\": \"string\" },\n \"af-south-1\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }', + }, + { + Type: 'JSON_SCHEMA', + Content: '{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"string\"\n}', + }, + ], + LocationUri: 'hosted', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::HostedConfigurationVersion', { + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + ConfigurationProfileId: { + Ref: 'MyConfigurationConfigurationProfileEE0ECA85', + }, + Content: 'This is my content', + ContentType: 'text/plain', + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with ssm parameter', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const parameter = new aws_ssm_1.StringParameter(stack, 'MyParameter', { + stringValue: 'This is the content stored in ssm parameter', + parameterName: 'my-parameter', + }); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromParameter(parameter), + versionNumber: '1', + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':ssm:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':parameter/', + { Ref: 'MyParameter18BA547D' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':ssm:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':parameter/', + { Ref: 'MyParameter18BA547D' }, + ], + ], + }, + Action: 'ssm:GetParameter', + }, + ], + }, + PolicyName: 'AllowAppConfigReadFromSourcePolicy', + }, + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration profile with ssm document', () => { + const stack = new cdk.Stack(); + const document = new aws_ssm_1.CfnDocument(stack, 'MyDocument', { + content: { + mainSteps: [ + { + action: 'aws:runShellScript', + }, + ], + }, + name: 'TestDocumentName', + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromCfnDocument(document), + versionNumber: '1', + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: { + 'Fn::Join': [ + '', + [ + 'ssm-document://', + { Ref: 'MyDocument' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':ssm:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':document/', + { Ref: 'MyDocument' }, + ], + ], + }, + Action: 'ssm:GetDocument', + }, + ], + }, + PolicyName: 'AllowAppConfigReadFromSourcePolicy', + }, + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration profile with s3 object', () => { + const stack = new cdk.Stack(); + const bucket = new aws_s3_1.Bucket(stack, 'MyBucket', { + bucketName: 'bucket', + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromBucket(bucket, 'hello/file.txt'), + versionNumber: '1', + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: { + 'Fn::Join': [ + '', + [ + 's3://', + { Ref: 'MyBucketF68F3FF0' }, + '/hello/file.txt', + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':s3:::', + { Ref: 'MyBucketF68F3FF0' }, + '/hello/file.txt', + ], + ], + }, + Action: [ + 's3:GetObject', + 's3:GetObjectMetadata', + 's3:GetObjectVersion', + ], + }, + { + Effect: iam.Effect.ALLOW, + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':s3:::', + { Ref: 'MyBucketF68F3FF0' }, + ], + ], + }, + Action: [ + 's3:GetBucketLocation', + 's3:GetBucketVersioning', + 's3:ListBucket', + 's3:ListBucketVersions', + ], + }, + { + Effect: iam.Effect.ALLOW, + Resource: '*', + Action: 's3:ListAllMyBuckets', + }, + ], + }, + PolicyName: 'AllowAppConfigReadFromSourcePolicy', + }, + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration profile with codepipeline', () => { + const stack = new cdk.Stack(); + const bucket = new aws_s3_1.Bucket(stack, 'MyBucket'); + const sourceAction = new aws_codepipeline_actions_1.S3SourceAction({ + actionName: 'Source', + bucket: bucket, + bucketKey: 'hello/world/codepipeline.txt', + output: new aws_codepipeline_1.Artifact('SourceOutput'), + }); + const deployAction = new aws_codepipeline_actions_1.S3DeployAction({ + actionName: 'Deploy', + input: aws_codepipeline_1.Artifact.artifact('SourceOutput'), + bucket: bucket, + extract: true, + }); + const pipeline = new aws_codepipeline_1.Pipeline(stack, 'MyPipeline', { + stages: [ + { + stageName: 'beta', + actions: [sourceAction], + }, + { + stageName: 'prod', + actions: [deployAction], + }, + ], + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromPipeline(pipeline), + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: { + 'Fn::Join': [ + '', + [ + 'codepipeline://', + { Ref: 'MyPipelineAED38ECF' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 3); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Policy', 3); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 0); + }); + test('configuration profile with secretsmanager', () => { + const stack = new cdk.Stack(); + const secret = new aws_secretsmanager_1.Secret(stack, 'MySecret', { + secretStringValue: cdk.SecretValue.unsafePlainText('This is the content stored in secrets manager'), + secretName: 'secret', + }); + Object.defineProperty(secret, 'secretArn', { + value: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromSecret(secret), + versionNumber: '1', + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + Action: 'secretsmanager:GetSecretValue', + }, + ], + }, + PolicyName: 'AllowAppConfigReadFromSourcePolicy', + }, + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); + test('configuration profile with secretsmanager and kms', () => { + const stack = new cdk.Stack(); + const key = new aws_kms_1.Key(stack, 'MyKey'); + const secret = new aws_secretsmanager_1.Secret(stack, 'MySecret', { + secretStringValue: cdk.SecretValue.unsafePlainText('This is the content stored in secrets manager'), + secretName: 'secret', + encryptionKey: key, + }); + Object.defineProperty(secret, 'secretArn', { + value: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.SourcedConfiguration(stack, 'MyConfiguration', { + name: 'TestConfigProfile', + location: lib_1.ConfigurationSource.fromSecret(secret), + versionNumber: '1', + application: app, + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: cdk.Duration.minutes(30), + }), + }), + deployTo: [app.addEnvironment('Environment')], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ConfigurationProfile', { + Name: 'TestConfigProfile', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + LocationUri: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret', + Action: 'secretsmanager:GetSecretValue', + }, + { + Effect: iam.Effect.ALLOW, + Resource: { + 'Fn::GetAtt': ['MyKey6AB29FA6', 'Arn'], + }, + Action: 'kms:Decrypt', + }, + ], + }, + PolicyName: 'AllowAppConfigReadFromSourcePolicy', + }, + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::AppConfig::Deployment', 1); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uZmlndXJhdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLHVEQUFrRDtBQUNsRCxtRUFBa0U7QUFDbEUsbUZBQXNGO0FBQ3RGLDJDQUEyQztBQUMzQyxpREFBMEM7QUFDMUMsK0NBQTRDO0FBQzVDLHVFQUF3RDtBQUN4RCxpREFBbUU7QUFDbkUsZ0NBV2dCO0FBRWhCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLElBQUksQ0FBQyx5REFBeUQsRUFBRSxHQUFHLEVBQUU7UUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLHlCQUFtQixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUMvQyxPQUFPLEVBQUUsMEJBQW9CLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDO1lBQ2xFLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLGtCQUFrQixFQUFFLElBQUksd0JBQWtCLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFO2dCQUN4RSxlQUFlLEVBQUUscUJBQWUsQ0FBQyxNQUFNLENBQUM7b0JBQ3RDLFlBQVksRUFBRSxFQUFFO29CQUNoQixrQkFBa0IsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7aUJBQzdDLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVFLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLHND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QixhQUFhLEVBQUU7Z0JBQ2IsR0FBRyxFQUFFLHFCQUFxQjthQUMzQjtZQUNELFdBQVcsRUFBRSxnRUFBZ0U7U0FDOUUsQ0FBQyxDQUFDO1FBQ0gscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUU7WUFDaEUsUUFBUSxFQUFFO2dCQUNSO29CQUNFLGNBQWMsRUFBRTt3QkFDZCxTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQ0FDeEIsUUFBUSxFQUFFLGdFQUFnRTtnQ0FDMUUsTUFBTSxFQUFFLCtCQUErQjs2QkFDeEM7NEJBQ0Q7Z0NBQ0UsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQ0FDeEIsUUFBUSxFQUFFO29DQUNSLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUM7aUNBQ3ZDO2dDQUNELE1BQU0sRUFBRSxhQUFhOzZCQUN0Qjt5QkFDRjtxQkFDRjtvQkFDRCxVQUFVLEVBQUUsb0NBQW9DO2lCQUNqRDthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFydGlmYWN0LCBQaXBlbGluZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0IHsgUzNEZXBsb3lBY3Rpb24sIFMzU291cmNlQWN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBDZm5Eb2N1bWVudCwgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbixcbiAgSG9zdGVkQ29uZmlndXJhdGlvbixcbiAgQ29uZmlndXJhdGlvblNvdXJjZSxcbiAgU291cmNlZENvbmZpZ3VyYXRpb24sXG4gIERlcGxveW1lbnRTdHJhdGVneSxcbiAgQ29uZmlndXJhdGlvblR5cGUsXG4gIFZhbGlkYXRvclR5cGUsXG4gIEpzb25TY2hlbWFWYWxpZGF0b3IsXG4gIENvbmZpZ3VyYXRpb25Db250ZW50LFxuICBSb2xsb3V0U3RyYXRlZ3ksXG59IGZyb20gJy4uL2xpYic7XG5cbmRlc2NyaWJlKCdjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICB0ZXN0KCdjb25maWd1cmF0aW9uIHdpdGggbm8gZW52aXJvbm1lbnRzIGFuZCBubyBkZXBsb3lUbyBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IEhvc3RlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeUhvc3RlZENvbmZpZycsIHtcbiAgICAgIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21JbmxpbmVUZXh0KCdUaGlzIGlzIG15IGNvbnRlbnQnKSxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudCcsIDApO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBOYW1lOiAnTXlIb3N0ZWRDb25maWcnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZ0NvbmZpZ3VyYXRpb25Qcm9maWxlMkUxQTJCQkMnLFxuICAgICAgfSxcbiAgICAgIENvbnRlbnQ6ICdUaGlzIGlzIG15IGNvbnRlbnQnLFxuICAgICAgQ29udGVudFR5cGU6ICd0ZXh0L3BsYWluJyxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAwKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiB3aXRoIGVudmlyb25tZW50cyBhbmQgbm8gZGVwbG95VG8gcHJvcCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycsIHtcbiAgICAgIGFwcGxpY2F0aW9uTmFtZTogJ015QXBwbGljYXRpb24nLFxuICAgIH0pO1xuICAgIGFwcC5hZGRFbnZpcm9ubWVudCgnTXlFbnYxJyk7XG4gICAgYXBwLmFkZEVudmlyb25tZW50KCdNeUVudjInKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnJywge1xuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29udGVudCcpLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkNvbmZpZ3VyYXRpb25Qcm9maWxlJywge1xuICAgICAgTmFtZTogJ015SG9zdGVkQ29uZmlnJyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWdDb25maWd1cmF0aW9uUHJvZmlsZTJFMUEyQkJDJyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBpcyBteSBjb250ZW50JyxcbiAgICAgIENvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudCcsIDIpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDApO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmF0aW9uIHdpdGggZW52aXJvbm1lbnRzIGFuZCBkZXBsb3lUbyBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJywge1xuICAgICAgYXBwbGljYXRpb25OYW1lOiAnTXlBcHBsaWNhdGlvbicsXG4gICAgfSk7XG4gICAgYXBwLmFkZEVudmlyb25tZW50KCdNeUVudjEnKTtcbiAgICBjb25zdCBlbnYgPSBhcHAuYWRkRW52aXJvbm1lbnQoJ015RW52MicpO1xuICAgIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlIb3N0ZWRDb25maWcnLCB7XG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVwbG95VG86IFtlbnZdLFxuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBOYW1lOiAnTXlIb3N0ZWRDb25maWcnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZ0NvbmZpZ3VyYXRpb25Qcm9maWxlMkUxQTJCQkMnLFxuICAgICAgfSxcbiAgICAgIENvbnRlbnQ6ICdUaGlzIGlzIG15IGNvbnRlbnQnLFxuICAgICAgQ29udGVudFR5cGU6ICd0ZXh0L3BsYWluJyxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIEVudmlyb25tZW50SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdNeUVudjIzNTA0MzdENicsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblZlcnNpb246IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWc1MUQzODc3RCcsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZ0NvbmZpZ3VyYXRpb25Qcm9maWxlMkUxQTJCQkMnLFxuICAgICAgfSxcbiAgICAgIERlcGxveW1lbnRTdHJhdGVneUlkOiB7XG4gICAgICAgIFJlZjogJ015RGVwbG95bWVudFN0cmF0ZWd5NjBEMzFGQjAnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50JywgMik7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gdXNpbmcgZGVwbG95IG1ldGhvZCBhbmQgbm8gZW52aXJvbm1lbnQgYXNzb2NpYXRlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycsIHtcbiAgICAgIGFwcGxpY2F0aW9uTmFtZTogJ015QXBwbGljYXRpb24nLFxuICAgIH0pO1xuICAgIGFwcC5hZGRFbnZpcm9ubWVudCgnTXlFbnYxJyk7XG4gICAgY29uc3QgZW52ID0gYXBwLmFkZEVudmlyb25tZW50KCdNeUVudjInKTtcbiAgICBjb25zdCBjb25maWcgPSBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnJywge1xuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29udGVudCcpLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgY29uZmlnLmRlcGxveShlbnYpO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50Jywge1xuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBFbnZpcm9ubWVudElkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnTXlFbnYyMzUwNDM3RDYnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25WZXJzaW9uOiB7XG4gICAgICAgIFJlZjogJ015SG9zdGVkQ29uZmlnNTFEMzg3N0QnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWdDb25maWd1cmF0aW9uUHJvZmlsZTJFMUEyQkJDJyxcbiAgICAgIH0sXG4gICAgICBEZXBsb3ltZW50U3RyYXRlZ3lJZDoge1xuICAgICAgICBSZWY6ICdNeURlcGxveW1lbnRTdHJhdGVneTYwRDMxRkIwJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gdXNpbmcgZGVwbG95IG1ldGhvZCB3aXRoIGVudmlyb25tZW50IGFzc29jaWF0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnLCB7XG4gICAgICBhcHBsaWNhdGlvbk5hbWU6ICdNeUFwcGxpY2F0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCBlbnYxID0gYXBwLmFkZEVudmlyb25tZW50KCdNeUVudjEnKTtcbiAgICBjb25zdCBlbnYyID0gYXBwLmFkZEVudmlyb25tZW50KCdNeUVudjInKTtcbiAgICBjb25zdCBjb25maWcgPSBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnJywge1xuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29udGVudCcpLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBkZXBsb3lUbzogW2VudjFdLFxuICAgIH0pO1xuICAgIGNvbmZpZy5kZXBsb3koZW52Mik7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIEVudmlyb25tZW50SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdNeUVudjFCOTEyMEZBMScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblZlcnNpb246IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWc1MUQzODc3RCcsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZ0NvbmZpZ3VyYXRpb25Qcm9maWxlMkUxQTJCQkMnLFxuICAgICAgfSxcbiAgICAgIERlcGxveW1lbnRTdHJhdGVneUlkOiB7XG4gICAgICAgIFJlZjogJ015RGVwbG95bWVudFN0cmF0ZWd5NjBEMzFGQjAnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIEVudmlyb25tZW50SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdNeUVudjIzNTA0MzdENicsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblZlcnNpb246IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWc1MUQzODc3RCcsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZ0NvbmZpZ3VyYXRpb25Qcm9maWxlMkUxQTJCQkMnLFxuICAgICAgfSxcbiAgICAgIERlcGxveW1lbnRTdHJhdGVneUlkOiB7XG4gICAgICAgIFJlZjogJ015RGVwbG95bWVudFN0cmF0ZWd5NjBEMzFGQjAnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAyKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiB3aXRoIG5vIGVudmlyb25tZW50IGFzc29jaWF0ZWQgYW5kIG5vIGRlcGxveSBtZXRob2QgdXNlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycsIHtcbiAgICAgIGFwcGxpY2F0aW9uTmFtZTogJ015QXBwbGljYXRpb24nLFxuICAgIH0pO1xuICAgIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlIb3N0ZWRDb25maWcnLCB7XG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDApO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmF0aW9uIHdpdGggdHdvIGNvbmZpZ3VyYXRpb25zIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycsIHtcbiAgICAgIGFwcGxpY2F0aW9uTmFtZTogJ015QXBwbGljYXRpb24nLFxuICAgIH0pO1xuICAgIGNvbnN0IGVudjEgPSBhcHAuYWRkRW52aXJvbm1lbnQoJ015RW52MScpO1xuICAgIGNvbnN0IGVudjIgPSBhcHAuYWRkRW52aXJvbm1lbnQoJ015RW52MicpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdNeUJ1Y2tldCcpO1xuICAgIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlIb3N0ZWRDb25maWcnLCB7XG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVwbG95VG86IFtlbnYxXSxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5MScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIG5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015U291cmNlZENvbmZpZycsIHtcbiAgICAgIHZlcnNpb25OdW1iZXI6ICcxJyxcbiAgICAgIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21CdWNrZXQoYnVja2V0LCAncGF0aC90by9vYmplY3QnKSxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3lUbzogW2VudjJdLFxuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3kyJywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkNvbmZpZ3VyYXRpb25Qcm9maWxlJywge1xuICAgICAgTmFtZTogJ015SG9zdGVkQ29uZmlnJyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgTG9jYXRpb25Vcmk6ICdob3N0ZWQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlIb3N0ZWRDb25maWdDb25maWd1cmF0aW9uUHJvZmlsZTJFMUEyQkJDJyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBpcyBteSBjb250ZW50JyxcbiAgICAgIENvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdNeVNvdXJjZWRDb25maWcnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBMb2NhdGlvblVyaToge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ3MzOi8vJyxcbiAgICAgICAgICAgIHsgUmVmOiAnTXlCdWNrZXRGNjhGM0ZGMCcgfSxcbiAgICAgICAgICAgICcvcGF0aC90by9vYmplY3QnLFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgUmV0cmlldmFsUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlTb3VyY2VkQ29uZmlnUm9sZTI0OTQ0OUIxJywgJ0FybiddIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBOYW1lOiAnTXlEZXBsb3ltZW50U3RyYXRlZ3kxJyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMzAsXG4gICAgICBHcm93dGhGYWN0b3I6IDE1LFxuICAgICAgUmVwbGljYXRlVG86ICdOT05FJyxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIE5hbWU6ICdNeURlcGxveW1lbnRTdHJhdGVneTInLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAzMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTUsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgRW52aXJvbm1lbnRJZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ015RW52MUI5MTIwRkExJyxcbiAgICAgIH0sXG4gICAgICBDb25maWd1cmF0aW9uVmVyc2lvbjoge1xuICAgICAgICBSZWY6ICdNeUhvc3RlZENvbmZpZzUxRDM4NzdEJyxcbiAgICAgIH0sXG4gICAgICBDb25maWd1cmF0aW9uUHJvZmlsZUlkOiB7XG4gICAgICAgIFJlZjogJ015SG9zdGVkQ29uZmlnQ29uZmlndXJhdGlvblByb2ZpbGUyRTFBMkJCQycsXG4gICAgICB9LFxuICAgICAgRGVwbG95bWVudFN0cmF0ZWd5SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlEZXBsb3ltZW50U3RyYXRlZ3kxNzgwOTk0NDYnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIEVudmlyb25tZW50SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdNeUVudjIzNTA0MzdENicsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblZlcnNpb246ICcxJyxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlTb3VyY2VkQ29uZmlnNTQ1NUM0N0MnLFxuICAgICAgfSxcbiAgICAgIERlcGxveW1lbnRTdHJhdGVneUlkOiB7XG4gICAgICAgIFJlZjogJ015RGVwbG95bWVudFN0cmF0ZWd5MjAyQjgwNzE1JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIDIpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnQnLCAyKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAyKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiB3aXRoIHR3byBjb25maWd1cmF0aW9ucyBhbmQgbm8gZGVwbG95bWVudCBzdHJhdGVneSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnLCB7XG4gICAgICBhcHBsaWNhdGlvbk5hbWU6ICdNeUFwcGxpY2F0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnTXlCdWNrZXQnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnJywge1xuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29udGVudCcpLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICB9KTtcbiAgICBuZXcgU291cmNlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeVNvdXJjZWRDb25maWcnLCB7XG4gICAgICB2ZXJzaW9uTnVtYmVyOiAnMScsXG4gICAgICBsb2NhdGlvbjogQ29uZmlndXJhdGlvblNvdXJjZS5mcm9tQnVja2V0KGJ1Y2tldCwgJ3BhdGgvdG8vb2JqZWN0JyksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBOYW1lOiAnTXlIb3N0ZWRDb25maWctRGVwbG95bWVudFN0cmF0ZWd5LUE1OTM2RTYwJyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMjAsXG4gICAgICBHcm93dGhGYWN0b3I6IDEwLFxuICAgICAgUmVwbGljYXRlVG86ICdOT05FJyxcbiAgICAgIEZpbmFsQmFrZVRpbWVJbk1pbnV0ZXM6IDEwLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ015U291cmNlZENvbmZpZy1EZXBsb3ltZW50U3RyYXRlZ3ktN0ExMDQ2NTcnLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAyMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgRmluYWxCYWtlVGltZUluTWludXRlczogMTAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlcGxveSBzZWNyZXQgd2l0aCBrbXMga2V5JywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGtleSA9IG5ldyBLZXkoc3RhY2ssICdNeUtleScpO1xuICAgIGNvbnN0IHNlY3JldCA9IG5ldyBTZWNyZXQoc3RhY2ssICdNeVNlY3JldCcpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IFNvdXJjZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlTb3VyY2VkQ29uZmlnJywge1xuICAgICAgdmVyc2lvbk51bWJlcjogJzEnLFxuICAgICAgbG9jYXRpb246IENvbmZpZ3VyYXRpb25Tb3VyY2UuZnJvbVNlY3JldChzZWNyZXQpLFxuICAgICAgZGVwbG95bWVudEtleToga2V5LFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBkZXBsb3lUbzogW2FwcC5hZGRFbnZpcm9ubWVudCgnRW52aXJvbm1lbnQnKV0sXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIEVudmlyb25tZW50SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdFbnZpcm9ubWVudDgzM0E5MTgyJyxcbiAgICAgIH0sXG4gICAgICBDb25maWd1cmF0aW9uVmVyc2lvbjogJzEnLFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeVNvdXJjZWRDb25maWc1NDU1QzQ3QycsXG4gICAgICB9LFxuICAgICAgRGVwbG95bWVudFN0cmF0ZWd5SWQ6IHtcbiAgICAgICAgUmVmOiAnTXlEZXBsb3ltZW50U3RyYXRlZ3k2MEQzMUZCMCcsXG4gICAgICB9LFxuICAgICAgS21zS2V5SWRlbnRpZmllcjogeyAnRm46OkdldEF0dCc6IFsnTXlLZXk2QUIyOUZBNicsICdBcm4nXSB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSBpbmxpbmUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvbicsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZGVwbG95VG86IFthcHAuYWRkRW52aXJvbm1lbnQoJ0Vudmlyb25tZW50JyldLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdNeUNvbmZpZ3VyYXRpb24nLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBMb2NhdGlvblVyaTogJ2hvc3RlZCcsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUNvbmZpZ3VyYXRpb25Db25maWd1cmF0aW9uUHJvZmlsZUVFMEVDQTg1JyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBpcyBteSBjb250ZW50JyxcbiAgICAgIENvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvbicsIHtcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUZpbGUoJ3Rlc3QvY29uZmlnLmpzb24nKSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBOYW1lOiAnTXlDb25maWd1cmF0aW9uJyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgTG9jYXRpb25Vcmk6ICdob3N0ZWQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlDb25maWd1cmF0aW9uQ29uZmlndXJhdGlvblByb2ZpbGVFRTBFQ0E4NScsXG4gICAgICB9LFxuICAgICAgQ29udGVudDogJ3tcXG4gIFwiY29udGVudFwiOiBcIlRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudFwiXFxufScsXG4gICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSBpbmxpbmUgb2N0ZXQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvbicsIHtcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZSgnVGhpcyBzaG91bGQgYmUgb2YgY29udGVudCB0eXBlIGFwcGxpY2F0aW9uL29jdGV0JyksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkNvbmZpZ3VyYXRpb25Qcm9maWxlJywge1xuICAgICAgTmFtZTogJ015Q29uZmlndXJhdGlvbicsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIExvY2F0aW9uVXJpOiAnaG9zdGVkJyxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6Okhvc3RlZENvbmZpZ3VyYXRpb25WZXJzaW9uJywge1xuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBDb25maWd1cmF0aW9uUHJvZmlsZUlkOiB7XG4gICAgICAgIFJlZjogJ015Q29uZmlndXJhdGlvbkNvbmZpZ3VyYXRpb25Qcm9maWxlRUUwRUNBODUnLFxuICAgICAgfSxcbiAgICAgIENvbnRlbnQ6ICdUaGlzIHNob3VsZCBiZSBvZiBjb250ZW50IHR5cGUgYXBwbGljYXRpb24vb2N0ZXQnLFxuICAgICAgQ29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSBpbmxpbmUgeWFtbCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lWWFtbCgnVGhpcyBzaG91bGQgYmUgb2YgY29udGVudCB0eXBlIGFwcGxpY2F0aW9uL3gteWFtbCcpLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdNeUNvbmZpZ3VyYXRpb24nLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBMb2NhdGlvblVyaTogJ2hvc3RlZCcsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUNvbmZpZ3VyYXRpb25Db25maWd1cmF0aW9uUHJvZmlsZUVFMEVDQTg1JyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBzaG91bGQgYmUgb2YgY29udGVudCB0eXBlIGFwcGxpY2F0aW9uL3gteWFtbCcsXG4gICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gteWFtbCcsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gcHJvZmlsZSB3aXRoIG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBuYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21JbmxpbmVUZXh0KCdUaGlzIGlzIG15IGNvbnRlbnQnKSxcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneTogbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICAgIGdyb3d0aEZhY3RvcjogMTUsXG4gICAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkNvbmZpZ3VyYXRpb25Qcm9maWxlJywge1xuICAgICAgTmFtZTogJ1Rlc3RDb25maWdQcm9maWxlJyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgTG9jYXRpb25Vcmk6ICdob3N0ZWQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlDb25maWd1cmF0aW9uUHJvZmlsZTMzQTk3MTYzJyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBpcyBteSBjb250ZW50JyxcbiAgICAgIENvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gcHJvZmlsZSB3aXRoIHR5cGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBuYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIHR5cGU6IENvbmZpZ3VyYXRpb25UeXBlLkZFQVRVUkVfRkxBR1MsXG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIFR5cGU6ICdBV1MuQXBwQ29uZmlnLkZlYXR1cmVGbGFncycsXG4gICAgICBMb2NhdGlvblVyaTogJ2hvc3RlZCcsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUNvbmZpZ3VyYXRpb25Qcm9maWxlMzNBOTcxNjMnLFxuICAgICAgfSxcbiAgICAgIENvbnRlbnQ6ICdUaGlzIGlzIG15IGNvbnRlbnQnLFxuICAgICAgQ29udGVudFR5cGU6ICd0ZXh0L3BsYWluJyxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAwKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiBwcm9maWxlIHdpdGggZGVzY3JpcHRpb24nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBuYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21JbmxpbmVUZXh0KCdUaGlzIGlzIG15IGNvbnRlbnQnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgICBMb2NhdGlvblVyaTogJ2hvc3RlZCcsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpIb3N0ZWRDb25maWd1cmF0aW9uVmVyc2lvbicsIHtcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgQ29uZmlndXJhdGlvblByb2ZpbGVJZDoge1xuICAgICAgICBSZWY6ICdNeUNvbmZpZ3VyYXRpb25Qcm9maWxlMzNBOTcxNjMnLFxuICAgICAgfSxcbiAgICAgIENvbnRlbnQ6ICdUaGlzIGlzIG15IGNvbnRlbnQnLFxuICAgICAgQ29udGVudFR5cGU6ICd0ZXh0L3BsYWluJyxcbiAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gcHJvZmlsZSB3aXRoIHZhbGlkYXRvcicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIG5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29udGVudCcpLFxuICAgICAgdmFsaWRhdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogJ2R1bW15IHZhbGlkYXRvcicsXG4gICAgICAgICAgdHlwZTogVmFsaWRhdG9yVHlwZS5KU09OX1NDSEVNQSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIFZhbGlkYXRvcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFR5cGU6ICdKU09OX1NDSEVNQScsXG4gICAgICAgICAgQ29udGVudDogJ2R1bW15IHZhbGlkYXRvcicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgTG9jYXRpb25Vcmk6ICdob3N0ZWQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlDb25maWd1cmF0aW9uUHJvZmlsZTMzQTk3MTYzJyxcbiAgICAgIH0sXG4gICAgICBDb250ZW50OiAnVGhpcyBpcyBteSBjb250ZW50JyxcbiAgICAgIENvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gcHJvZmlsZSB3aXRoIGlubGluZSBqc29uIHNjaGVtYSB2YWxpZGF0b3InLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBjb25zdCB2YWxpZGF0b3JDb250ZW50ID0gYFxuICAgIHtcbiAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgXCJjb21wdXRlUmVzb3VyY2VcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICBcIkNvbXB1dGVBTDFJbWFnZUlkXCI6IHtcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJtZS1zb3V0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLWVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1ub3J0aGVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1ub3J0aGVhc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1zb3V0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLXNvdXRoZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLXNvdXRoZWFzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImNhLWNlbnRyYWwtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJjbi1ub3J0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImNuLW5vcnRod2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LWNlbnRyYWwtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS1ub3J0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LXdlc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS13ZXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtd2VzdC0zXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInNhLWVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtZWFzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWdvdi13ZXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtZ292LWVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy13ZXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtd2VzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LXNvdXRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtbm9ydGhlYXN0LTNcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYWYtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiR1BVSW1hZ2VJZFwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwibWUtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtbm9ydGhlYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtbm9ydGhlYXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1zb3V0aGVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1zb3V0aGVhc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJjYS1jZW50cmFsLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiY24tbm9ydGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJjbi1ub3J0aHdlc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS1jZW50cmFsLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtbm9ydGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS13ZXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtd2VzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LXdlc3QtM1wiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJzYS1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWVhc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy1nb3Ytd2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWdvdi1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtd2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLXdlc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS1zb3V0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLW5vcnRoZWFzdC0zXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFmLXNvdXRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIkFSTUltYWdlSWRcIjoge1xuICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICBcIm1lLXNvdXRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLW5vcnRoZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLW5vcnRoZWFzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLXNvdXRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtc291dGhlYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtc291dGhlYXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiY2EtY2VudHJhbC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImNuLW5vcnRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiY24tbm9ydGh3ZXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtY2VudHJhbC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LW5vcnRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtd2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LXdlc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS13ZXN0LTNcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwic2EtZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy1lYXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtZ292LXdlc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy1nb3YtZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLXdlc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy13ZXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1ub3J0aGVhc3QtM1wiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhZi1zb3V0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJDb21wdXRlQUwySW1hZ2VJZFwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwibWUtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtbm9ydGhlYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtbm9ydGhlYXN0LTJcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiYXAtc291dGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1zb3V0aGVhc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJhcC1zb3V0aGVhc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJjYS1jZW50cmFsLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiY24tbm9ydGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJjbi1ub3J0aHdlc3QtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS1jZW50cmFsLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtbm9ydGgtMVwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS13ZXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwiZXUtd2VzdC0yXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImV1LXdlc3QtM1wiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJzYS1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtZWFzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWVhc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJ1cy1nb3Ytd2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLWdvdi1lYXN0LTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICAgIFwidXMtd2VzdC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcInVzLXdlc3QtMlwiOiB7IFwidHlwZVwiOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgXCJldS1zb3V0aC0xXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFwLW5vcnRoZWFzdC0zXCI6IHsgXCJ0eXBlXCI6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgICBcImFmLXNvdXRoLTFcIjogeyBcInR5cGVcIjogXCJzdHJpbmdcIiB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9YDtcbiAgICBuZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvbicsIHtcbiAgICAgIG5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgdmFsaWRhdG9yczogW1xuICAgICAgICBKc29uU2NoZW1hVmFsaWRhdG9yLmZyb21JbmxpbmUodmFsaWRhdG9yQ29udGVudCksXG4gICAgICAgIEpzb25TY2hlbWFWYWxpZGF0b3IuZnJvbUZpbGUoJ3Rlc3Qvc2NoZW1hLmpzb24nKSxcbiAgICAgIF0sXG4gICAgICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyBteSBjb250ZW50JyksXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIFZhbGlkYXRvcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFR5cGU6ICdKU09OX1NDSEVNQScsXG4gICAgICAgICAgQ29udGVudDogJ1xcbiAgICB7XFxuICAgICAgXFxcInR5cGVcXFwiOiBcXFwib2JqZWN0XFxcIixcXG4gICAgICBcXFwicHJvcGVydGllc1xcXCI6IHtcXG4gICAgICAgIFxcXCJjb21wdXRlUmVzb3VyY2VcXFwiOiB7XFxuICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcIm9iamVjdFxcXCIsXFxuICAgICAgICAgIFxcXCJwcm9wZXJ0aWVzXFxcIjoge1xcbiAgICAgICAgICAgIFxcXCJDb21wdXRlQUwxSW1hZ2VJZFxcXCI6IHtcXG4gICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcIm9iamVjdFxcXCIsXFxuICAgICAgICAgICAgICBcXFwicHJvcGVydGllc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcIm1lLXNvdXRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLWVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtbm9ydGhlYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLW5vcnRoZWFzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1zb3V0aGVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtc291dGhlYXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImNhLWNlbnRyYWwtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiY24tbm9ydGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiY24tbm9ydGh3ZXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LWNlbnRyYWwtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtbm9ydGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtd2VzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS13ZXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LXdlc3QtM1xcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwic2EtZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWVhc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtZ292LXdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtZ292LWVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtd2VzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy13ZXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LXNvdXRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLW5vcnRoZWFzdC0zXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhZi1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH1cXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIFxcXCJHUFVJbWFnZUlkXFxcIjoge1xcbiAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwib2JqZWN0XFxcIixcXG4gICAgICAgICAgICAgIFxcXCJwcm9wZXJ0aWVzXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwibWUtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1ub3J0aGVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtbm9ydGhlYXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLXNvdXRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLXNvdXRoZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1zb3V0aGVhc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiY2EtY2VudHJhbC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJjbi1ub3J0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJjbi1ub3J0aHdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtY2VudHJhbC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS1ub3J0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS13ZXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LXdlc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtd2VzdC0zXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJzYS1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtZWFzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy1nb3Ytd2VzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy1nb3YtZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy13ZXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLXdlc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtbm9ydGhlYXN0LTNcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFmLXNvdXRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfVxcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgXFxcIkFSTUltYWdlSWRcXFwiOiB7XFxuICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJvYmplY3RcXFwiLFxcbiAgICAgICAgICAgICAgXFxcInByb3BlcnRpZXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJtZS1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLW5vcnRoZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1ub3J0aGVhc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtc291dGhlYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLXNvdXRoZWFzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJjYS1jZW50cmFsLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImNuLW5vcnRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImNuLW5vcnRod2VzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS1jZW50cmFsLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LW5vcnRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LXdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtd2VzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS13ZXN0LTNcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInNhLWVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy1lYXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWdvdi13ZXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWdvdi1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLXdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtd2VzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1ub3J0aGVhc3QtM1xcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYWYtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBcXFwiQ29tcHV0ZUFMMkltYWdlSWRcXFwiOiB7XFxuICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJvYmplY3RcXFwiLFxcbiAgICAgICAgICAgICAgXFxcInByb3BlcnRpZXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJtZS1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLW5vcnRoZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1ub3J0aGVhc3QtMlxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXAtc291dGhlYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImFwLXNvdXRoZWFzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJjYS1jZW50cmFsLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImNuLW5vcnRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImNuLW5vcnRod2VzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS1jZW50cmFsLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LW5vcnRoLTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcImV1LXdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiZXUtd2VzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS13ZXN0LTNcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInNhLWVhc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtZWFzdC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJ1cy1lYXN0LTJcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWdvdi13ZXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLWdvdi1lYXN0LTFcXFwiOiB7IFxcXCJ0eXBlXFxcIjogXFxcInN0cmluZ1xcXCIgfSxcXG4gICAgICAgICAgICAgICAgXFxcInVzLXdlc3QtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwidXMtd2VzdC0yXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJldS1zb3V0aC0xXFxcIjogeyBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhcC1ub3J0aGVhc3QtM1xcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYWYtc291dGgtMVxcXCI6IHsgXFxcInR5cGVcXFwiOiBcXFwic3RyaW5nXFxcIiB9XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICB9JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFR5cGU6ICdKU09OX1NDSEVNQScsXG4gICAgICAgICAgQ29udGVudDogJ3tcXG4gIFxcXCIkc2NoZW1hXFxcIjogXFxcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1xcXCIsXFxuICBcXFwidHlwZVxcXCI6IFxcXCJzdHJpbmdcXFwiXFxufScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgTG9jYXRpb25Vcmk6ICdob3N0ZWQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6SG9zdGVkQ29uZmlndXJhdGlvblZlcnNpb24nLCB7XG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIENvbmZpZ3VyYXRpb25Qcm9maWxlSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlDb25maWd1cmF0aW9uQ29uZmlndXJhdGlvblByb2ZpbGVFRTBFQ0E4NScsXG4gICAgICB9LFxuICAgICAgQ29udGVudDogJ1RoaXMgaXMgbXkgY29udGVudCcsXG4gICAgICBDb250ZW50VHlwZTogJ3RleHQvcGxhaW4nLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDApO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmF0aW9uIHByb2ZpbGUgd2l0aCBzc20gcGFyYW1ldGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgcGFyYW1ldGVyID0gbmV3IFN0cmluZ1BhcmFtZXRlcihzdGFjaywgJ015UGFyYW1ldGVyJywge1xuICAgICAgc3RyaW5nVmFsdWU6ICdUaGlzIGlzIHRoZSBjb250ZW50IHN0b3JlZCBpbiBzc20gcGFyYW1ldGVyJyxcbiAgICAgIHBhcmFtZXRlck5hbWU6ICdteS1wYXJhbWV0ZXInLFxuICAgIH0pO1xuICAgIG5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlndXJhdGlvbicsIHtcbiAgICAgIG5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBsb2NhdGlvbjogQ29uZmlndXJhdGlvblNvdXJjZS5mcm9tUGFyYW1ldGVyKHBhcmFtZXRlciksXG4gICAgICB2ZXJzaW9uTnVtYmVyOiAnMScsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGRlcGxveVRvOiBbYXBwLmFkZEVudmlyb25tZW50KCdFbnZpcm9ubWVudCcpXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBOYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBMb2NhdGlvblVyaToge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ2FybjonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlBhcnRpdGlvbicgfSxcbiAgICAgICAgICAgICc6c3NtOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UmVnaW9uJyB9LFxuICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICc6cGFyYW1ldGVyLycsXG4gICAgICAgICAgICB7IFJlZjogJ015UGFyYW1ldGVyMThCQTU0N0QnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgICAgICAgICAgICB7IFJlZjogJ0FXUzo6UGFydGl0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICc6c3NtOicsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAnOicsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAnOnBhcmFtZXRlci8nLFxuICAgICAgICAgICAgICAgICAgICAgIHsgUmVmOiAnTXlQYXJhbWV0ZXIxOEJBNTQ3RCcgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBBY3Rpb246ICdzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdSZWFkRnJvbVNvdXJjZVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDEpO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmF0aW9uIHByb2ZpbGUgd2l0aCBzc20gZG9jdW1lbnQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBuZXcgQ2ZuRG9jdW1lbnQoc3RhY2ssICdNeURvY3VtZW50Jywge1xuICAgICAgY29udGVudDoge1xuICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgbmFtZTogJ1Rlc3REb2N1bWVudE5hbWUnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IFNvdXJjZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogJ1Rlc3RDb25maWdQcm9maWxlJyxcbiAgICAgIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21DZm5Eb2N1bWVudChkb2N1bWVudCksXG4gICAgICB2ZXJzaW9uTnVtYmVyOiAnMScsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGRlcGxveVRvOiBbYXBwLmFkZEVudmlyb25tZW50KCdFbnZpcm9ubWVudCcpXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6Q29uZmlndXJhdGlvblByb2ZpbGUnLCB7XG4gICAgICBOYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBMb2NhdGlvblVyaToge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ3NzbS1kb2N1bWVudDovLycsXG4gICAgICAgICAgICB7IFJlZjogJ015RG9jdW1lbnQnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgICAgICAgICAgICB7IFJlZjogJ0FXUzo6UGFydGl0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICc6c3NtOicsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlJlZ2lvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAnOicsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAnOmRvY3VtZW50LycsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdNeURvY3VtZW50JyB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEFjdGlvbjogJ3NzbTpHZXREb2N1bWVudCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0FsbG93QXBwQ29uZmlnUmVhZEZyb21Tb3VyY2VQb2xpY3knLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAxKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiBwcm9maWxlIHdpdGggczMgb2JqZWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdNeUJ1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6ICdidWNrZXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IFNvdXJjZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogJ1Rlc3RDb25maWdQcm9maWxlJyxcbiAgICAgIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21CdWNrZXQoYnVja2V0LCAnaGVsbG8vZmlsZS50eHQnKSxcbiAgICAgIHZlcnNpb25OdW1iZXI6ICcxJyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZGVwbG95VG86IFthcHAuYWRkRW52aXJvbm1lbnQoJ0Vudmlyb25tZW50JyldLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIExvY2F0aW9uVXJpOiB7XG4gICAgICAgICdGbjo6Sm9pbic6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICAnczM6Ly8nLFxuICAgICAgICAgICAgeyBSZWY6ICdNeUJ1Y2tldEY2OEYzRkYwJyB9LFxuICAgICAgICAgICAgJy9oZWxsby9maWxlLnR4dCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgICAgICAgICAgICB7IFJlZjogJ0FXUzo6UGFydGl0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICc6czM6OjonLFxuICAgICAgICAgICAgICAgICAgICAgIHsgUmVmOiAnTXlCdWNrZXRGNjhGM0ZGMCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAnL2hlbGxvL2ZpbGUudHh0JyxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdE1ldGFkYXRhJyxcbiAgICAgICAgICAgICAgICAgICdzMzpHZXRPYmplY3RWZXJzaW9uJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgJ2FybjonLFxuICAgICAgICAgICAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpQYXJ0aXRpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgJzpzMzo6OicsXG4gICAgICAgICAgICAgICAgICAgICAgeyBSZWY6ICdNeUJ1Y2tldEY2OEYzRkYwJyB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICAgJ3MzOkdldEJ1Y2tldExvY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICdzMzpHZXRCdWNrZXRWZXJzaW9uaW5nJyxcbiAgICAgICAgICAgICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgICAgICAgICAgICAgICdzMzpMaXN0QnVja2V0VmVyc2lvbnMnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICAgICAgICBBY3Rpb246ICdzMzpMaXN0QWxsTXlCdWNrZXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdSZWFkRnJvbVNvdXJjZVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDEpO1xuICB9KTtcblxuICB0ZXN0KCdjb25maWd1cmF0aW9uIHByb2ZpbGUgd2l0aCBjb2RlcGlwZWxpbmUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ015QnVja2V0Jyk7XG4gICAgY29uc3Qgc291cmNlQWN0aW9uID0gbmV3IFMzU291cmNlQWN0aW9uKHtcbiAgICAgIGFjdGlvbk5hbWU6ICdTb3VyY2UnLFxuICAgICAgYnVja2V0OiBidWNrZXQsXG4gICAgICBidWNrZXRLZXk6ICdoZWxsby93b3JsZC9jb2RlcGlwZWxpbmUudHh0JyxcbiAgICAgIG91dHB1dDogbmV3IEFydGlmYWN0KCdTb3VyY2VPdXRwdXQnKSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXBsb3lBY3Rpb24gPSBuZXcgUzNEZXBsb3lBY3Rpb24oe1xuICAgICAgYWN0aW9uTmFtZTogJ0RlcGxveScsXG4gICAgICBpbnB1dDogQXJ0aWZhY3QuYXJ0aWZhY3QoJ1NvdXJjZU91dHB1dCcpLFxuICAgICAgYnVja2V0OiBidWNrZXQsXG4gICAgICBleHRyYWN0OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHN0YWNrLCAnTXlQaXBlbGluZScsIHtcbiAgICAgIHN0YWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhZ2VOYW1lOiAnYmV0YScsXG4gICAgICAgICAgYWN0aW9uczogW3NvdXJjZUFjdGlvbl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgICAgICBhY3Rpb25zOiBbZGVwbG95QWN0aW9uXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgU291cmNlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeUNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICBuYW1lOiAnVGVzdENvbmZpZ1Byb2ZpbGUnLFxuICAgICAgbG9jYXRpb246IENvbmZpZ3VyYXRpb25Tb3VyY2UuZnJvbVBpcGVsaW5lKHBpcGVsaW5lKSxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZGVwbG95VG86IFthcHAuYWRkRW52aXJvbm1lbnQoJ0Vudmlyb25tZW50JyldLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIExvY2F0aW9uVXJpOiB7XG4gICAgICAgICdGbjo6Sm9pbic6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICAnY29kZXBpcGVsaW5lOi8vJyxcbiAgICAgICAgICAgIHsgUmVmOiAnTXlQaXBlbGluZUFFRDM4RUNGJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6SUFNOjpSb2xlJywgMyk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6SUFNOjpQb2xpY3knLCAzKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnQnLCAwKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJhdGlvbiBwcm9maWxlIHdpdGggc2VjcmV0c21hbmFnZXInLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3Qgc2VjcmV0ID0gbmV3IFNlY3JldChzdGFjaywgJ015U2VjcmV0Jywge1xuICAgICAgc2VjcmV0U3RyaW5nVmFsdWU6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoJ1RoaXMgaXMgdGhlIGNvbnRlbnQgc3RvcmVkIGluIHNlY3JldHMgbWFuYWdlcicpLFxuICAgICAgc2VjcmV0TmFtZTogJ3NlY3JldCcsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlY3JldCwgJ3NlY3JldEFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOnNlY3JldDpteS1zZWNyZXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IFNvdXJjZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogJ1Rlc3RDb25maWdQcm9maWxlJyxcbiAgICAgIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21TZWNyZXQoc2VjcmV0KSxcbiAgICAgIHZlcnNpb25OdW1iZXI6ICcxJyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZGVwbG95VG86IFthcHAuYWRkRW52aXJvbm1lbnQoJ0Vudmlyb25tZW50JyldLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIExvY2F0aW9uVXJpOiAnYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOnNlY3JldDpteS1zZWNyZXQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0Om15LXNlY3JldCcsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBvbGljeU5hbWU6ICdBbGxvd0FwcENvbmZpZ1JlYWRGcm9tU291cmNlUG9saWN5JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50JywgMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyYXRpb24gcHJvZmlsZSB3aXRoIHNlY3JldHNtYW5hZ2VyIGFuZCBrbXMnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3Qga2V5ID0gbmV3IEtleShzdGFjaywgJ015S2V5Jyk7XG4gICAgY29uc3Qgc2VjcmV0ID0gbmV3IFNlY3JldChzdGFjaywgJ015U2VjcmV0Jywge1xuICAgICAgc2VjcmV0U3RyaW5nVmFsdWU6IGNkay5TZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoJ1RoaXMgaXMgdGhlIGNvbnRlbnQgc3RvcmVkIGluIHNlY3JldHMgbWFuYWdlcicpLFxuICAgICAgc2VjcmV0TmFtZTogJ3NlY3JldCcsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBrZXksXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlY3JldCwgJ3NlY3JldEFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOnNlY3JldDpteS1zZWNyZXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IFNvdXJjZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogJ1Rlc3RDb25maWdQcm9maWxlJyxcbiAgICAgIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21TZWNyZXQoc2VjcmV0KSxcbiAgICAgIHZlcnNpb25OdW1iZXI6ICcxJyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3k6IG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgICBncm93dGhGYWN0b3I6IDE1LFxuICAgICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZGVwbG95VG86IFthcHAuYWRkRW52aXJvbm1lbnQoJ0Vudmlyb25tZW50JyldLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpDb25maWd1cmF0aW9uUHJvZmlsZScsIHtcbiAgICAgIE5hbWU6ICdUZXN0Q29uZmlnUHJvZmlsZScsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIExvY2F0aW9uVXJpOiAnYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOnNlY3JldDpteS1zZWNyZXQnLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0Om15LXNlY3JldCcsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlLZXk2QUIyOUZBNicsICdBcm4nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEFjdGlvbjogJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdSZWFkRnJvbVNvdXJjZVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudCcsIDEpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.js b/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.js new file mode 100644 index 0000000000000..99c83a683a521 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/deployment-strategy.test.js @@ -0,0 +1,252 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cdk = require("aws-cdk-lib"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const lib_1 = require("../lib"); +describe('deployment strategy', () => { + test('default deployment strategy', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('deployment strategy with name', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('deployment strategy duration in seconds', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.seconds(120), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 2, + GrowthFactor: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('deployment strategy with description', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + }), + description: 'This is my description', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + Description: 'This is my description', + GrowthType: 'LINEAR', + }); + }); + test('deployment strategy with final bake time', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + finalBakeTime: cdk.Duration.minutes(30), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + FinalBakeTimeInMinutes: 30, + GrowthType: 'LINEAR', + }); + }); + test('deployment strategy with growth type', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.exponential({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + GrowthType: 'EXPONENTIAL', + }); + }); + test('deployment strategy with replicate to', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + deploymentStrategyName: 'TestDeploymentStrategy', + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 10, + deploymentDuration: cdk.Duration.minutes(10), + }), + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'TestDeploymentStrategy', + DeploymentDurationInMinutes: 10, + GrowthFactor: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('from deployment strategy arn', () => { + const stack = new cdk.Stack(); + const deploymentStrategy = lib_1.DeploymentStrategy.fromDeploymentStrategyArn(stack, 'MyDeploymentStrategy', 'arn:aws:appconfig:us-west-2:123456789012:deploymentstrategy/abc123'); + expect(deploymentStrategy.deploymentStrategyId).toEqual('abc123'); + expect(deploymentStrategy.env.account).toEqual('123456789012'); + expect(deploymentStrategy.env.region).toEqual('us-west-2'); + }); + test('from deployment strategy arn with no resource name', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.DeploymentStrategy.fromDeploymentStrategyArn(stack, 'MyDeploymentStrategy', 'arn:aws:appconfig:us-west-2:123456789012:deploymentstrategy/'); + }).toThrow('Missing required deployment strategy id from deployment strategy ARN'); + }); + test('from deployment strategy id', () => { + const cdkApp = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const deploymentStrategy = lib_1.DeploymentStrategy.fromDeploymentStrategyId(stack, 'MyDeploymentStrategy', lib_1.DeploymentStrategyId.fromString('abc123')); + expect(deploymentStrategy.deploymentStrategyId).toEqual('abc123'); + expect(deploymentStrategy.env.account).toEqual('123456789012'); + expect(deploymentStrategy.env.region).toEqual('us-west-2'); + }); + test('from predefined all at once deployment strategy id', () => { + const cdkApp = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const deploymentStrategy = lib_1.DeploymentStrategy.fromDeploymentStrategyId(stack, 'MyDeploymentStrategy', lib_1.DeploymentStrategyId.ALL_AT_ONCE); + expect(deploymentStrategy.deploymentStrategyId).toEqual('AppConfig.AllAtOnce'); + expect(deploymentStrategy.env.account).toEqual('123456789012'); + expect(deploymentStrategy.env.region).toEqual('us-west-2'); + }); + test('from predefined canary deployment strategy id', () => { + const cdkApp = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const deploymentStrategy = lib_1.DeploymentStrategy.fromDeploymentStrategyId(stack, 'MyDeploymentStrategy', lib_1.DeploymentStrategyId.CANARY_10_PERCENT_20_MINUTES); + expect(deploymentStrategy.deploymentStrategyId).toEqual('AppConfig.Canary10Percent20Minutes'); + expect(deploymentStrategy.env.account).toEqual('123456789012'); + expect(deploymentStrategy.env.region).toEqual('us-west-2'); + }); + test('from predefined linear deployment strategy id', () => { + const cdkApp = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const deploymentStrategy = lib_1.DeploymentStrategy.fromDeploymentStrategyId(stack, 'MyDeploymentStrategy', lib_1.DeploymentStrategyId.LINEAR_50_PERCENT_EVERY_30_SECONDS); + expect(deploymentStrategy.deploymentStrategyId).toEqual('AppConfig.Linear50PercentEvery30Seconds'); + expect(deploymentStrategy.env.account).toEqual('123456789012'); + expect(deploymentStrategy.env.region).toEqual('us-west-2'); + }); + test('all at once deployment strategy with no bake time', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.ALL_AT_ONCE, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy', + DeploymentDurationInMinutes: 0, + GrowthFactor: 100, + FinalBakeTimeInMinutes: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('all at once deployment strategy with bake time', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.ALL_AT_ONCE, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy', + DeploymentDurationInMinutes: 0, + GrowthFactor: 100, + FinalBakeTimeInMinutes: 10, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); + test('canary deployment strategy with no bake time', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.CANARY_10_PERCENT_20_MINUTES, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy', + DeploymentDurationInMinutes: 20, + GrowthFactor: 10, + FinalBakeTimeInMinutes: 10, + ReplicateTo: 'NONE', + GrowthType: 'EXPONENTIAL', + }); + }); + test('linear deployment strategy with no bake time', () => { + const stack = new cdk.Stack(); + new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.LINEAR_50_PERCENT_EVERY_30_SECONDS, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::DeploymentStrategy', { + Name: 'MyDeploymentStrategy', + DeploymentDurationInMinutes: 1, + GrowthFactor: 50, + FinalBakeTimeInMinutes: 1, + ReplicateTo: 'NONE', + GrowthType: 'LINEAR', + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1zdHJhdGVneS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95bWVudC1zdHJhdGVneS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLDZDQUFrQztBQUNsQyx1REFBa0Q7QUFDbEQsZ0NBQW1GO0FBRW5GLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLHdCQUFrQixDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtZQUNwRCxlQUFlLEVBQUUscUJBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLFlBQVksRUFBRSxFQUFFO2dCQUNoQixrQkFBa0IsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7YUFDN0MsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLG9DQUFvQyxFQUFFO1lBQ3BGLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsMkJBQTJCLEVBQUUsRUFBRTtZQUMvQixZQUFZLEVBQUUsRUFBRTtZQUNoQixXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSx3QkFBa0IsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7WUFDcEQsc0JBQXNCLEVBQUUsd0JBQXdCO1lBQ2hELGVBQWUsRUFBRSxxQkFBZSxDQUFDLE1BQU0s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QUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLHdCQUFrQixDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtZQUNwRCxlQUFlLEVBQUUscUJBQWUsQ0FBQyxrQ0FBa0M7U0FDcEUsQ0FBQyxDQUFDO1FBRUgscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsb0NBQW9DLEVBQUU7WUFDcEYsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QiwyQkFBMkIsRUFBRSxDQUFDO1lBQzlCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLHNCQUFzQixFQUFFLENBQUM7WUFDekIsV0FBVyxFQUFFLE1BQU07WUFDbkIsVUFBVSxFQUFFLFFBQVE7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgRGVwbG95bWVudFN0cmF0ZWd5LCBEZXBsb3ltZW50U3RyYXRlZ3lJZCwgUm9sbG91dFN0cmF0ZWd5IH0gZnJvbSAnLi4vbGliJztcblxuZGVzY3JpYmUoJ2RlcGxveW1lbnQgc3RyYXRlZ3knLCAoKSA9PiB7XG4gIHRlc3QoJ2RlZmF1bHQgZGVwbG95bWVudCBzdHJhdGVneScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICBncm93dGhGYWN0b3I6IDEwLFxuICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBOYW1lOiAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAxMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgR3Jvd3RoVHlwZTogJ0xJTkVBUicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlcGxveW1lbnQgc3RyYXRlZ3kgd2l0aCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneU5hbWU6ICdUZXN0RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgIGdyb3d0aEZhY3RvcjogMTAsXG4gICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIE5hbWU6ICdUZXN0RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMTAsXG4gICAgICBHcm93dGhGYWN0b3I6IDEwLFxuICAgICAgUmVwbGljYXRlVG86ICdOT05FJyxcbiAgICAgIEdyb3d0aFR5cGU6ICdMSU5FQVInLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZXBsb3ltZW50IHN0cmF0ZWd5IGR1cmF0aW9uIGluIHNlY29uZHMnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgZGVwbG95bWVudFN0cmF0ZWd5TmFtZTogJ1Rlc3REZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxMCxcbiAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIE5hbWU6ICdUZXN0RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMixcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgR3Jvd3RoVHlwZTogJ0xJTkVBUicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlcGxveW1lbnQgc3RyYXRlZ3kgd2l0aCBkZXNjcmlwdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3lOYW1lOiAnVGVzdERlcGxveW1lbnRTdHJhdGVneScsXG4gICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICBncm93dGhGYWN0b3I6IDEwLFxuICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIG15IGRlc2NyaXB0aW9uJyxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ1Rlc3REZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAxMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgRGVzY3JpcHRpb246ICdUaGlzIGlzIG15IGRlc2NyaXB0aW9uJyxcbiAgICAgIEdyb3d0aFR5cGU6ICdMSU5FQVInLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZXBsb3ltZW50IHN0cmF0ZWd5IHdpdGggZmluYWwgYmFrZSB0aW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneU5hbWU6ICdUZXN0RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgICAgIGdyb3d0aEZhY3RvcjogMTAsXG4gICAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgICBmaW5hbEJha2VUaW1lOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ1Rlc3REZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAxMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgRmluYWxCYWtlVGltZUluTWludXRlczogMzAsXG4gICAgICBHcm93dGhUeXBlOiAnTElORUFSJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVwbG95bWVudCBzdHJhdGVneSB3aXRoIGdyb3d0aCB0eXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIGRlcGxveW1lbnRTdHJhdGVneU5hbWU6ICdUZXN0RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmV4cG9uZW50aWFsKHtcbiAgICAgICAgZ3Jvd3RoRmFjdG9yOiAxMCxcbiAgICAgICAgZGVwbG95bWVudER1cmF0aW9uOiBjZGsuRHVyYXRpb24ubWludXRlcygxMCksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ1Rlc3REZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAxMCxcbiAgICAgIEdyb3d0aEZhY3RvcjogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgR3Jvd3RoVHlwZTogJ0VYUE9ORU5USUFMJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVwbG95bWVudCBzdHJhdGVneSB3aXRoIHJlcGxpY2F0ZSB0bycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBkZXBsb3ltZW50U3RyYXRlZ3lOYW1lOiAnVGVzdERlcGxveW1lbnRTdHJhdGVneScsXG4gICAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgICBncm93dGhGYWN0b3I6IDEwLFxuICAgICAgICBkZXBsb3ltZW50RHVyYXRpb246IGNkay5EdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBOYW1lOiAnVGVzdERlcGxveW1lbnRTdHJhdGVneScsXG4gICAgICBEZXBsb3ltZW50RHVyYXRpb25Jbk1pbnV0ZXM6IDEwLFxuICAgICAgR3Jvd3RoRmFjdG9yOiAxMCxcbiAgICAgIFJlcGxpY2F0ZVRvOiAnTk9ORScsXG4gICAgICBHcm93dGhUeXBlOiAnTElORUFSJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZnJvbSBkZXBsb3ltZW50IHN0cmF0ZWd5IGFybicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBkZXBsb3ltZW50U3RyYXRlZ3kgPSBEZXBsb3ltZW50U3RyYXRlZ3kuZnJvbURlcGxveW1lbnRTdHJhdGVneUFybihzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgICdhcm46YXdzOmFwcGNvbmZpZzp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmRlcGxveW1lbnRzdHJhdGVneS9hYmMxMjMnKTtcblxuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZGVwbG95bWVudFN0cmF0ZWd5SWQpLnRvRXF1YWwoJ2FiYzEyMycpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZGVwbG95bWVudCBzdHJhdGVneSBhcm4gd2l0aCBubyByZXNvdXJjZSBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICBEZXBsb3ltZW50U3RyYXRlZ3kuZnJvbURlcGxveW1lbnRTdHJhdGVneUFybihzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6ZGVwbG95bWVudHN0cmF0ZWd5LycpO1xuICAgIH0pLnRvVGhyb3coJ01pc3NpbmcgcmVxdWlyZWQgZGVwbG95bWVudCBzdHJhdGVneSBpZCBmcm9tIGRlcGxveW1lbnQgc3RyYXRlZ3kgQVJOJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZGVwbG95bWVudCBzdHJhdGVneSBpZCcsICgpID0+IHtcbiAgICBjb25zdCBjZGtBcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGNka0FwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXBsb3ltZW50U3RyYXRlZ3kgPSBEZXBsb3ltZW50U3RyYXRlZ3kuZnJvbURlcGxveW1lbnRTdHJhdGVneUlkKHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCBEZXBsb3ltZW50U3RyYXRlZ3lJZC5mcm9tU3RyaW5nKCdhYmMxMjMnKSk7XG5cbiAgICBleHBlY3QoZGVwbG95bWVudFN0cmF0ZWd5LmRlcGxveW1lbnRTdHJhdGVneUlkKS50b0VxdWFsKCdhYmMxMjMnKTtcbiAgICBleHBlY3QoZGVwbG95bWVudFN0cmF0ZWd5LmVudi5hY2NvdW50KS50b0VxdWFsKCcxMjM0NTY3ODkwMTInKTtcbiAgICBleHBlY3QoZGVwbG95bWVudFN0cmF0ZWd5LmVudi5yZWdpb24pLnRvRXF1YWwoJ3VzLXdlc3QtMicpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIHByZWRlZmluZWQgYWxsIGF0IG9uY2UgZGVwbG95bWVudCBzdHJhdGVneSBpZCcsICgpID0+IHtcbiAgICBjb25zdCBjZGtBcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGNka0FwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXBsb3ltZW50U3RyYXRlZ3kgPSBEZXBsb3ltZW50U3RyYXRlZ3kuZnJvbURlcGxveW1lbnRTdHJhdGVneUlkKHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCBEZXBsb3ltZW50U3RyYXRlZ3lJZC5BTExfQVRfT05DRSk7XG5cbiAgICBleHBlY3QoZGVwbG95bWVudFN0cmF0ZWd5LmRlcGxveW1lbnRTdHJhdGVneUlkKS50b0VxdWFsKCdBcHBDb25maWcuQWxsQXRPbmNlJyk7XG4gICAgZXhwZWN0KGRlcGxveW1lbnRTdHJhdGVneS5lbnYuYWNjb3VudCkudG9FcXVhbCgnMTIzNDU2Nzg5MDEyJyk7XG4gICAgZXhwZWN0KGRlcGxveW1lbnRTdHJhdGVneS5lbnYucmVnaW9uKS50b0VxdWFsKCd1cy13ZXN0LTInKTtcbiAgfSk7XG5cbiAgdGVzdCgnZnJvbSBwcmVkZWZpbmVkIGNhbmFyeSBkZXBsb3ltZW50IHN0cmF0ZWd5IGlkJywgKCkgPT4ge1xuICAgIGNvbnN0IGNka0FwcCA9IG5ldyBBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soY2RrQXBwLCAnU3RhY2snLCB7XG4gICAgICBlbnY6IHtcbiAgICAgICAgcmVnaW9uOiAndXMtd2VzdC0yJyxcbiAgICAgICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGRlcGxveW1lbnRTdHJhdGVneSA9IERlcGxveW1lbnRTdHJhdGVneS5mcm9tRGVwbG95bWVudFN0cmF0ZWd5SWQoc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIERlcGxveW1lbnRTdHJhdGVneUlkLkNBTkFSWV8xMF9QRVJDRU5UXzIwX01JTlVURVMpO1xuXG4gICAgZXhwZWN0KGRlcGxveW1lbnRTdHJhdGVneS5kZXBsb3ltZW50U3RyYXRlZ3lJZCkudG9FcXVhbCgnQXBwQ29uZmlnLkNhbmFyeTEwUGVyY2VudDIwTWludXRlcycpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gcHJlZGVmaW5lZCBsaW5lYXIgZGVwbG95bWVudCBzdHJhdGVneSBpZCcsICgpID0+IHtcbiAgICBjb25zdCBjZGtBcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGNka0FwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXBsb3ltZW50U3RyYXRlZ3kgPSBEZXBsb3ltZW50U3RyYXRlZ3kuZnJvbURlcGxveW1lbnRTdHJhdGVneUlkKHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCBEZXBsb3ltZW50U3RyYXRlZ3lJZC5MSU5FQVJfNTBfUEVSQ0VOVF9FVkVSWV8zMF9TRUNPTkRTKTtcblxuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZGVwbG95bWVudFN0cmF0ZWd5SWQpLnRvRXF1YWwoJ0FwcENvbmZpZy5MaW5lYXI1MFBlcmNlbnRFdmVyeTMwU2Vjb25kcycpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChkZXBsb3ltZW50U3RyYXRlZ3kuZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FsbCBhdCBvbmNlIGRlcGxveW1lbnQgc3RyYXRlZ3kgd2l0aCBubyBiYWtlIHRpbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kuQUxMX0FUX09OQ0UsXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkRlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIE5hbWU6ICdNeURlcGxveW1lbnRTdHJhdGVneScsXG4gICAgICBEZXBsb3ltZW50RHVyYXRpb25Jbk1pbnV0ZXM6IDAsXG4gICAgICBHcm93dGhGYWN0b3I6IDEwMCxcbiAgICAgIEZpbmFsQmFrZVRpbWVJbk1pbnV0ZXM6IDEwLFxuICAgICAgUmVwbGljYXRlVG86ICdOT05FJyxcbiAgICAgIEdyb3d0aFR5cGU6ICdMSU5FQVInLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhbGwgYXQgb25jZSBkZXBsb3ltZW50IHN0cmF0ZWd5IHdpdGggYmFrZSB0aW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koc3RhY2ssICdNeURlcGxveW1lbnRTdHJhdGVneScsIHtcbiAgICAgIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LkFMTF9BVF9PTkNFLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgICBOYW1lOiAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLFxuICAgICAgRGVwbG95bWVudER1cmF0aW9uSW5NaW51dGVzOiAwLFxuICAgICAgR3Jvd3RoRmFjdG9yOiAxMDAsXG4gICAgICBGaW5hbEJha2VUaW1lSW5NaW51dGVzOiAxMCxcbiAgICAgIFJlcGxpY2F0ZVRvOiAnTk9ORScsXG4gICAgICBHcm93dGhUeXBlOiAnTElORUFSJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnY2FuYXJ5IGRlcGxveW1lbnQgc3RyYXRlZ3kgd2l0aCBubyBiYWtlIHRpbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kuQ0FOQVJZXzEwX1BFUkNFTlRfMjBfTUlOVVRFUyxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ015RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMjAsXG4gICAgICBHcm93dGhGYWN0b3I6IDEwLFxuICAgICAgRmluYWxCYWtlVGltZUluTWludXRlczogMTAsXG4gICAgICBSZXBsaWNhdGVUbzogJ05PTkUnLFxuICAgICAgR3Jvd3RoVHlwZTogJ0VYUE9ORU5USUFMJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnbGluZWFyIGRlcGxveW1lbnQgc3RyYXRlZ3kgd2l0aCBubyBiYWtlIHRpbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgbmV3IERlcGxveW1lbnRTdHJhdGVneShzdGFjaywgJ015RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kuTElORUFSXzUwX1BFUkNFTlRfRVZFUllfMzBfU0VDT05EUyxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RGVwbG95bWVudFN0cmF0ZWd5Jywge1xuICAgICAgTmFtZTogJ015RGVwbG95bWVudFN0cmF0ZWd5JyxcbiAgICAgIERlcGxveW1lbnREdXJhdGlvbkluTWludXRlczogMSxcbiAgICAgIEdyb3d0aEZhY3RvcjogNTAsXG4gICAgICBGaW5hbEJha2VUaW1lSW5NaW51dGVzOiAxLFxuICAgICAgUmVwbGljYXRlVG86ICdOT05FJyxcbiAgICAgIEdyb3d0aFR5cGU6ICdMSU5FQVInLFxuICAgIH0pO1xuICB9KTtcbn0pOyJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.js b/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.js new file mode 100644 index 0000000000000..342383ab0b810 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/environment.test.js @@ -0,0 +1,496 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cdk = require("aws-cdk-lib"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); +const iam = require("aws-cdk-lib/aws-iam"); +const lib_1 = require("../lib"); +describe('environment', () => { + test('default environment', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.Environment(stack, 'MyEnvironment', { + application: app, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'MyEnvironment', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + }); + }); + test('environment with name', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + }); + }); + test('environment with description', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + description: 'This is my description', + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Description: 'This is my description', + }); + }); + test('environment with monitors with alarm and alarmRole', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const alarm = new aws_cloudwatch_1.Alarm(stack, 'Alarm', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const alarmRole = new iam.Role(stack, 'Role', { + assumedBy: new iam.ServicePrincipal('appconfig.amazonaws.com'), + }); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [lib_1.Monitor.fromCloudWatchAlarm(alarm, alarmRole)], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 1); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 1); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: { + 'Fn::GetAtt': [ + 'Alarm7103F465', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'Role1ABCC5F0', + 'Arn', + ], + }, + }, + ], + }); + }); + test('environment with monitors with only alarm', () => { + const stack = new cdk.Stack(); + const alarm = new aws_cloudwatch_1.Alarm(stack, 'Alarm', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [lib_1.Monitor.fromCloudWatchAlarm(alarm)], + }); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 1); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: { + 'Fn::GetAtt': [ + 'Alarm7103F465', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: '*', + Action: 'cloudwatch:DescribeAlarms', + }, + ], + }, + PolicyName: 'AllowAppConfigMonitorAlarmPolicy', + }, + ], + }); + }); + test('environment with CfnMonitorsProperty monitor', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [ + lib_1.Monitor.fromCfnMonitorsProperty({ + alarmArn: 'thisismyalarm', + }), + ], + }); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 0); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 0); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: 'thisismyalarm', + }, + ], + }); + }); + test('environment with CfnMonitorsProperty monitor with roleArn', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [ + lib_1.Monitor.fromCfnMonitorsProperty({ + alarmArn: 'thisismyalarm', + alarmRoleArn: 'thisismyalarmrolearn', + }), + ], + }); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 0); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 0); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: 'thisismyalarm', + AlarmRoleArn: 'thisismyalarmrolearn', + }, + ], + }); + }); + test('environment with composite alarm', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const alarm = new aws_cloudwatch_1.Alarm(stack, 'Alarm', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const compositeAlarm = new aws_cloudwatch_1.CompositeAlarm(stack, 'MyCompositeAlarm', { + alarmRule: alarm, + }); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [ + lib_1.Monitor.fromCloudWatchAlarm(compositeAlarm), + ], + }); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 1); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::CompositeAlarm', 1); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: { + 'Fn::GetAtt': [ + 'MyCompositeAlarm0F045229', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: '*', + Action: 'cloudwatch:DescribeAlarms', + }, + ], + }, + PolicyName: 'AllowAppConfigMonitorAlarmPolicy', + }, + ], + }); + }); + test('environment with two composite alarms', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const alarm = new aws_cloudwatch_1.Alarm(stack, 'Alarm', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const compositeAlarm1 = new aws_cloudwatch_1.CompositeAlarm(stack, 'MyCompositeAlarm1', { + alarmRule: alarm, + }); + const compositeAlarm2 = new aws_cloudwatch_1.CompositeAlarm(stack, 'MyCompositeAlarm2', { + alarmRule: alarm, + }); + const env = new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [ + lib_1.Monitor.fromCloudWatchAlarm(compositeAlarm1), + lib_1.Monitor.fromCloudWatchAlarm(compositeAlarm2), + ], + }); + expect(env).toBeDefined(); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 1); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::CompositeAlarm', 2); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 1); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: { + 'Fn::GetAtt': [ + 'MyCompositeAlarm159A950D0', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + { + AlarmArn: { + 'Fn::GetAtt': [ + 'MyCompositeAlarm2195BFA48', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: iam.Effect.ALLOW, + Resource: '*', + Action: 'cloudwatch:DescribeAlarms', + }, + ], + }, + PolicyName: 'AllowAppConfigMonitorAlarmPolicy', + }, + ], + }); + }); + test('environment with monitors with multiple alarms', () => { + const stack = new cdk.Stack(); + const app = new lib_1.Application(stack, 'MyAppConfig'); + const alarm1 = new aws_cloudwatch_1.Alarm(stack, 'Alarm1', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const alarm2 = new aws_cloudwatch_1.Alarm(stack, 'Alarm2', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + const alarm3 = new aws_cloudwatch_1.Alarm(stack, 'Alarm3', { + threshold: 5, + evaluationPeriods: 5, + metric: new aws_cloudwatch_1.Metric({ + namespace: 'aws', + metricName: 'myMetric', + }), + }); + new lib_1.Environment(stack, 'MyEnvironment', { + environmentName: 'TestEnv', + application: app, + monitors: [ + lib_1.Monitor.fromCloudWatchAlarm(alarm1), + lib_1.Monitor.fromCloudWatchAlarm(alarm2), + lib_1.Monitor.fromCloudWatchAlarm(alarm3), + ], + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 3); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 1); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Environment', { + Name: 'TestEnv', + ApplicationId: { + Ref: 'MyAppConfigB4B63E75', + }, + Monitors: [ + { + AlarmArn: { + 'Fn::GetAtt': [ + 'Alarm1F9009D71', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + { + AlarmArn: { + 'Fn::GetAtt': [ + 'Alarm2A7122E13', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + { + AlarmArn: { + 'Fn::GetAtt': [ + 'Alarm32341D8D9', + 'Arn', + ], + }, + AlarmRoleArn: { + 'Fn::GetAtt': [ + 'MyEnvironmentRole1E6113D2F07A1', + 'Arn', + ], + }, + }, + ], + }); + }); + test('from environment arn', () => { + const stack = new cdk.Stack(); + const env = lib_1.Environment.fromEnvironmentArn(stack, 'MyEnvironment', 'arn:aws:appconfig:us-west-2:123456789012:application/abc123/environment/def456'); + expect(env.applicationId).toEqual('abc123'); + expect(env.environmentId).toEqual('def456'); + expect(env.env.account).toEqual('123456789012'); + expect(env.env.region).toEqual('us-west-2'); + }); + test('from environment arn with no resource name', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Environment.fromEnvironmentArn(stack, 'MyEnvironment', 'arn:aws:appconfig:us-west-2:123456789012:application/'); + }).toThrow('Missing required /$/{applicationId}/environment//$/{environmentId} from environment ARN:'); + }); + test('from environment arn with missing slash', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Environment.fromEnvironmentArn(stack, 'MyEnvironment', 'arn:aws:appconfig:us-west-2:123456789012:application/abc123environment/def456'); + }).toThrow('Missing required parameters for environment ARN: format should be /$/{applicationId}/environment//$/{environmentId}'); + }); + test('from environment arn with no application id', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Environment.fromEnvironmentArn(stack, 'MyEnvironment', 'arn:aws:appconfig:us-west-2:123456789012:application//environment/def456'); + }).toThrow('Missing required parameters for environment ARN: format should be /$/{applicationId}/environment//$/{environmentId}'); + }); + test('from environment arn with no environment id', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Environment.fromEnvironmentArn(stack, 'MyEnvironment', 'arn:aws:appconfig:us-west-2:123456789012:application/abc123/environment/'); + }).toThrow('Missing required parameters for environment ARN: format should be /$/{applicationId}/environment//$/{environmentId}'); + }); + test('from environment attributes', () => { + const app = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(app, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const appConfigApp = new lib_1.Application(stack, 'MyAppConfig'); + const env = lib_1.Environment.fromEnvironmentAttributes(stack, 'MyEnvironment', { + application: appConfigApp, + environmentId: 'def456', + }); + expect(env.environmentId).toEqual('def456'); + expect(env.applicationId).toBeDefined(); + expect(env.env.account).toEqual('123456789012'); + expect(env.env.region).toEqual('us-west-2'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImVudmlyb25tZW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBQWtDO0FBQ2xDLHVEQUFrRDtBQUNsRCwrREFBMkU7QUFDM0UsMkNBQTJDO0FBQzNDLGdDQUEyRDtBQUUzRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEQsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUU7WUFDdEMsV0FBVyxFQUFFLEdBQUc7U0FDakIsQ0FBQyxDQUFDO1FBRUgscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLEVBQUU7WUFDN0UsSUFBSSxFQUFFLGVBQWU7WUFDckIsYUFBYSxFQUFFO2dCQUNiLEdBQUcsRUFBRSxxQkFBcUI7YUFDM0I7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLGlCQUFXLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUN0QyxlQUFlLEVBQUUsU0FBUztZQUMxQixXQUFXLEVBQUUsR0FBRztTQUNqQixDQUFDLENBQUM7UUFFSCxxQkFBUSxDQUFDLFNBQVMsQ0FB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QUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFsYXJtLCBDb21wb3NpdGVBbGFybSwgTWV0cmljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQXBwbGljYXRpb24sIEVudmlyb25tZW50LCBNb25pdG9yIH0gZnJvbSAnLi4vbGliJztcblxuZGVzY3JpYmUoJ2Vudmlyb25tZW50JywgKCkgPT4ge1xuICB0ZXN0KCdkZWZhdWx0IGVudmlyb25tZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgbmV3IEVudmlyb25tZW50KHN0YWNrLCAnTXlFbnZpcm9ubWVudCcsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ015RW52aXJvbm1lbnQnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Vudmlyb25tZW50IHdpdGggbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIG5ldyBFbnZpcm9ubWVudChzdGFjaywgJ015RW52aXJvbm1lbnQnLCB7XG4gICAgICBlbnZpcm9ubWVudE5hbWU6ICdUZXN0RW52JyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Vudmlyb25tZW50IHdpdGggZGVzY3JpcHRpb24nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBuZXcgRW52aXJvbm1lbnQoc3RhY2ssICdNeUVudmlyb25tZW50Jywge1xuICAgICAgZW52aXJvbm1lbnROYW1lOiAnVGVzdEVudicsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIG15IGRlc2NyaXB0aW9uJyxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnQnLCB7XG4gICAgICBOYW1lOiAnVGVzdEVudicsXG4gICAgICBBcHBsaWNhdGlvbklkOiB7XG4gICAgICAgIFJlZjogJ015QXBwQ29uZmlnQjRCNjNFNzUnLFxuICAgICAgfSxcbiAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBkZXNjcmlwdGlvbicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Vudmlyb25tZW50IHdpdGggbW9uaXRvcnMgd2l0aCBhbGFybSBhbmQgYWxhcm1Sb2xlJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJyk7XG4gICAgY29uc3QgYWxhcm0gPSBuZXcgQWxhcm0oc3RhY2ssICdBbGFybScsIHtcbiAgICAgIHRocmVzaG9sZDogNSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiA1LFxuICAgICAgbWV0cmljOiBuZXcgTWV0cmljKFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZXNwYWNlOiAnYXdzJyxcbiAgICAgICAgICBtZXRyaWNOYW1lOiAnbXlNZXRyaWMnLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBhbGFybVJvbGUgPSBuZXcgaWFtLlJvbGUoc3RhY2ssICdSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FwcGNvbmZpZy5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG4gICAgY29uc3QgZW52ID0gbmV3IEVudmlyb25tZW50KHN0YWNrLCAnTXlFbnZpcm9ubWVudCcsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIG1vbml0b3JzOiBbTW9uaXRvci5mcm9tQ2xvdWRXYXRjaEFsYXJtKGFsYXJtLCBhbGFybVJvbGUpXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJywgMSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6SUFNOjpSb2xlJywgMSk7XG4gICAgZXhwZWN0KGVudikudG9CZURlZmluZWQoKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBNb25pdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnQWxhcm03MTAzRjQ2NScsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFsYXJtUm9sZUFybjoge1xuICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgICAgICdSb2xlMUFCQ0M1RjAnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Vudmlyb25tZW50IHdpdGggbW9uaXRvcnMgd2l0aCBvbmx5IGFsYXJtJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGFsYXJtID0gbmV3IEFsYXJtKHN0YWNrLCAnQWxhcm0nLCB7XG4gICAgICB0aHJlc2hvbGQ6IDUsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogNSxcbiAgICAgIG1ldHJpYzogbmV3IE1ldHJpYyhcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVzcGFjZTogJ2F3cycsXG4gICAgICAgICAgbWV0cmljTmFtZTogJ215TWV0cmljJyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBjb25zdCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoc3RhY2ssICdNeUVudmlyb25tZW50Jywge1xuICAgICAgZW52aXJvbm1lbnROYW1lOiAnVGVzdEVudicsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgbW9uaXRvcnM6IFtNb25pdG9yLmZyb21DbG91ZFdhdGNoQWxhcm0oYWxhcm0pXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChlbnYpLnRvQmVEZWZpbmVkKCk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q2xvdWRXYXRjaDo6QWxhcm0nLCAxKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBNb25pdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnQWxhcm03MTAzRjQ2NScsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFsYXJtUm9sZUFybjoge1xuICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgICAgICdNeUVudmlyb25tZW50Um9sZTFFNjExM0QyRjA3QTEnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonLFxuICAgICAgICAgICAgICAgIEFjdGlvbjogJ2Nsb3Vkd2F0Y2g6RGVzY3JpYmVBbGFybXMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBvbGljeU5hbWU6ICdBbGxvd0FwcENvbmZpZ01vbml0b3JBbGFybVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdlbnZpcm9ubWVudCB3aXRoIENmbk1vbml0b3JzUHJvcGVydHkgbW9uaXRvcicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGVudiA9IG5ldyBFbnZpcm9ubWVudChzdGFjaywgJ015RW52aXJvbm1lbnQnLCB7XG4gICAgICBlbnZpcm9ubWVudE5hbWU6ICdUZXN0RW52JyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBtb25pdG9yczogW1xuICAgICAgICBNb25pdG9yLmZyb21DZm5Nb25pdG9yc1Byb3BlcnR5KHtcbiAgICAgICAgICBhbGFybUFybjogJ3RoaXNpc215YWxhcm0nLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZW52KS50b0JlRGVmaW5lZCgpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJywgMCk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6SUFNOjpSb2xlJywgMCk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudCcsIHtcbiAgICAgIE5hbWU6ICdUZXN0RW52JyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgTW9uaXRvcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIEFsYXJtQXJuOiAndGhpc2lzbXlhbGFybScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdlbnZpcm9ubWVudCB3aXRoIENmbk1vbml0b3JzUHJvcGVydHkgbW9uaXRvciB3aXRoIHJvbGVBcm4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBjb25zdCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoc3RhY2ssICdNeUVudmlyb25tZW50Jywge1xuICAgICAgZW52aXJvbm1lbnROYW1lOiAnVGVzdEVudicsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgbW9uaXRvcnM6IFtcbiAgICAgICAgTW9uaXRvci5mcm9tQ2ZuTW9uaXRvcnNQcm9wZXJ0eSh7XG4gICAgICAgICAgYWxhcm1Bcm46ICd0aGlzaXNteWFsYXJtJyxcbiAgICAgICAgICBhbGFybVJvbGVBcm46ICd0aGlzaXNteWFsYXJtcm9sZWFybicsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChlbnYpLnRvQmVEZWZpbmVkKCk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q2xvdWRXYXRjaDo6QWxhcm0nLCAwKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpJQU06OlJvbGUnLCAwKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBNb25pdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46ICd0aGlzaXNteWFsYXJtJyxcbiAgICAgICAgICBBbGFybVJvbGVBcm46ICd0aGlzaXNteWFsYXJtcm9sZWFybicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdlbnZpcm9ubWVudCB3aXRoIGNvbXBvc2l0ZSBhbGFybScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGFsYXJtID0gbmV3IEFsYXJtKHN0YWNrLCAnQWxhcm0nLCB7XG4gICAgICB0aHJlc2hvbGQ6IDUsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogNSxcbiAgICAgIG1ldHJpYzogbmV3IE1ldHJpYyhcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVzcGFjZTogJ2F3cycsXG4gICAgICAgICAgbWV0cmljTmFtZTogJ215TWV0cmljJyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3QgY29tcG9zaXRlQWxhcm0gPSBuZXcgQ29tcG9zaXRlQWxhcm0oc3RhY2ssICdNeUNvbXBvc2l0ZUFsYXJtJywge1xuICAgICAgYWxhcm1SdWxlOiBhbGFybSxcbiAgICB9KTtcbiAgICBjb25zdCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoc3RhY2ssICdNeUVudmlyb25tZW50Jywge1xuICAgICAgZW52aXJvbm1lbnROYW1lOiAnVGVzdEVudicsXG4gICAgICBhcHBsaWNhdGlvbjogYXBwLFxuICAgICAgbW9uaXRvcnM6IFtcbiAgICAgICAgTW9uaXRvci5mcm9tQ2xvdWRXYXRjaEFsYXJtKGNvbXBvc2l0ZUFsYXJtKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZW52KS50b0JlRGVmaW5lZCgpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJywgMSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q2xvdWRXYXRjaDo6Q29tcG9zaXRlQWxhcm0nLCAxKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBNb25pdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnTXlDb21wb3NpdGVBbGFybTBGMDQ1MjI5JyxcbiAgICAgICAgICAgICAgJ0FybicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgQWxhcm1Sb2xlQXJuOiB7XG4gICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgJ015RW52aXJvbm1lbnRSb2xlMUU2MTEzRDJGMDdBMScsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgICBQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnY2xvdWR3YXRjaDpEZXNjcmliZUFsYXJtcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0FsbG93QXBwQ29uZmlnTW9uaXRvckFsYXJtUG9saWN5JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Vudmlyb25tZW50IHdpdGggdHdvIGNvbXBvc2l0ZSBhbGFybXMnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnKTtcbiAgICBjb25zdCBhbGFybSA9IG5ldyBBbGFybShzdGFjaywgJ0FsYXJtJywge1xuICAgICAgdGhyZXNob2xkOiA1LFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDUsXG4gICAgICBtZXRyaWM6IG5ldyBNZXRyaWMoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lc3BhY2U6ICdhd3MnLFxuICAgICAgICAgIG1ldHJpY05hbWU6ICdteU1ldHJpYycsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBvc2l0ZUFsYXJtMSA9IG5ldyBDb21wb3NpdGVBbGFybShzdGFjaywgJ015Q29tcG9zaXRlQWxhcm0xJywge1xuICAgICAgYWxhcm1SdWxlOiBhbGFybSxcbiAgICB9KTtcbiAgICBjb25zdCBjb21wb3NpdGVBbGFybTIgPSBuZXcgQ29tcG9zaXRlQWxhcm0oc3RhY2ssICdNeUNvbXBvc2l0ZUFsYXJtMicsIHtcbiAgICAgIGFsYXJtUnVsZTogYWxhcm0sXG4gICAgfSk7XG4gICAgY29uc3QgZW52ID0gbmV3IEVudmlyb25tZW50KHN0YWNrLCAnTXlFbnZpcm9ubWVudCcsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIG1vbml0b3JzOiBbXG4gICAgICAgIE1vbml0b3IuZnJvbUNsb3VkV2F0Y2hBbGFybShjb21wb3NpdGVBbGFybTEpLFxuICAgICAgICBNb25pdG9yLmZyb21DbG91ZFdhdGNoQWxhcm0oY29tcG9zaXRlQWxhcm0yKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZW52KS50b0JlRGVmaW5lZCgpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJywgMSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q2xvdWRXYXRjaDo6Q29tcG9zaXRlQWxhcm0nLCAyKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpJQU06OlJvbGUnLCAxKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkVudmlyb25tZW50Jywge1xuICAgICAgTmFtZTogJ1Rlc3RFbnYnLFxuICAgICAgQXBwbGljYXRpb25JZDoge1xuICAgICAgICBSZWY6ICdNeUFwcENvbmZpZ0I0QjYzRTc1JyxcbiAgICAgIH0sXG4gICAgICBNb25pdG9yczogW1xuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnTXlDb21wb3NpdGVBbGFybTE1OUE5NTBEMCcsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFsYXJtUm9sZUFybjoge1xuICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgICAgICdNeUVudmlyb25tZW50Um9sZTFFNjExM0QyRjA3QTEnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIEFsYXJtQXJuOiB7XG4gICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgJ015Q29tcG9zaXRlQWxhcm0yMTk1QkZBNDgnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBBbGFybVJvbGVBcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnTXlFbnZpcm9ubWVudFJvbGUxRTYxMTNEMkYwN0ExJyxcbiAgICAgICAgICAgICAgJ0FybicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICAgICAgICBBY3Rpb246ICdjbG91ZHdhdGNoOkRlc2NyaWJlQWxhcm1zJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdNb25pdG9yQWxhcm1Qb2xpY3knLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZW52aXJvbm1lbnQgd2l0aCBtb25pdG9ycyB3aXRoIG11bHRpcGxlIGFsYXJtcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGFsYXJtMSA9IG5ldyBBbGFybShzdGFjaywgJ0FsYXJtMScsIHtcbiAgICAgIHRocmVzaG9sZDogNSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiA1LFxuICAgICAgbWV0cmljOiBuZXcgTWV0cmljKFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZXNwYWNlOiAnYXdzJyxcbiAgICAgICAgICBtZXRyaWNOYW1lOiAnbXlNZXRyaWMnLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBhbGFybTIgPSBuZXcgQWxhcm0oc3RhY2ssICdBbGFybTInLCB7XG4gICAgICB0aHJlc2hvbGQ6IDUsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogNSxcbiAgICAgIG1ldHJpYzogbmV3IE1ldHJpYyhcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVzcGFjZTogJ2F3cycsXG4gICAgICAgICAgbWV0cmljTmFtZTogJ215TWV0cmljJyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3QgYWxhcm0zID0gbmV3IEFsYXJtKHN0YWNrLCAnQWxhcm0zJywge1xuICAgICAgdGhyZXNob2xkOiA1LFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDUsXG4gICAgICBtZXRyaWM6IG5ldyBNZXRyaWMoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lc3BhY2U6ICdhd3MnLFxuICAgICAgICAgIG1ldHJpY05hbWU6ICdteU1ldHJpYycsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIH0pO1xuICAgIG5ldyBFbnZpcm9ubWVudChzdGFjaywgJ015RW52aXJvbm1lbnQnLCB7XG4gICAgICBlbnZpcm9ubWVudE5hbWU6ICdUZXN0RW52JyxcbiAgICAgIGFwcGxpY2F0aW9uOiBhcHAsXG4gICAgICBtb25pdG9yczogW1xuICAgICAgICBNb25pdG9yLmZyb21DbG91ZFdhdGNoQWxhcm0oYWxhcm0xKSxcbiAgICAgICAgTW9uaXRvci5mcm9tQ2xvdWRXYXRjaEFsYXJtKGFsYXJtMiksXG4gICAgICAgIE1vbml0b3IuZnJvbUNsb3VkV2F0Y2hBbGFybShhbGFybTMpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJywgMyk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6SUFNOjpSb2xlJywgMSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudCcsIHtcbiAgICAgIE5hbWU6ICdUZXN0RW52JyxcbiAgICAgIEFwcGxpY2F0aW9uSWQ6IHtcbiAgICAgICAgUmVmOiAnTXlBcHBDb25maWdCNEI2M0U3NScsXG4gICAgICB9LFxuICAgICAgTW9uaXRvcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIEFsYXJtQXJuOiB7XG4gICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgJ0FsYXJtMUY5MDA5RDcxJyxcbiAgICAgICAgICAgICAgJ0FybicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgQWxhcm1Sb2xlQXJuOiB7XG4gICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgJ015RW52aXJvbm1lbnRSb2xlMUU2MTEzRDJGMDdBMScsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgQWxhcm1Bcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnQWxhcm0yQTcxMjJFMTMnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBBbGFybVJvbGVBcm46IHtcbiAgICAgICAgICAgICdGbjo6R2V0QXR0JzogW1xuICAgICAgICAgICAgICAnTXlFbnZpcm9ubWVudFJvbGUxRTYxMTNEMkYwN0ExJyxcbiAgICAgICAgICAgICAgJ0FybicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBBbGFybUFybjoge1xuICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgICAgICdBbGFybTMyMzQxRDhEOScsXG4gICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFsYXJtUm9sZUFybjoge1xuICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbXG4gICAgICAgICAgICAgICdNeUVudmlyb25tZW50Um9sZTFFNjExM0QyRjA3QTEnLFxuICAgICAgICAgICAgICAnQXJuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZW52aXJvbm1lbnQgYXJuJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IGVudiA9IEVudmlyb25tZW50LmZyb21FbnZpcm9ubWVudEFybihzdGFjaywgJ015RW52aXJvbm1lbnQnLFxuICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vYWJjMTIzL2Vudmlyb25tZW50L2RlZjQ1NicpO1xuXG4gICAgZXhwZWN0KGVudi5hcHBsaWNhdGlvbklkKS50b0VxdWFsKCdhYmMxMjMnKTtcbiAgICBleHBlY3QoZW52LmVudmlyb25tZW50SWQpLnRvRXF1YWwoJ2RlZjQ1NicpO1xuICAgIGV4cGVjdChlbnYuZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChlbnYuZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZW52aXJvbm1lbnQgYXJuIHdpdGggbm8gcmVzb3VyY2UgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgRW52aXJvbm1lbnQuZnJvbUVudmlyb25tZW50QXJuKHN0YWNrLCAnTXlFbnZpcm9ubWVudCcsXG4gICAgICAgICdhcm46YXdzOmFwcGNvbmZpZzp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmFwcGxpY2F0aW9uLycpO1xuICAgIH0pLnRvVGhyb3coJ01pc3NpbmcgcmVxdWlyZWQgLyQve2FwcGxpY2F0aW9uSWR9L2Vudmlyb25tZW50Ly8kL3tlbnZpcm9ubWVudElkfSBmcm9tIGVudmlyb25tZW50IEFSTjonKTtcbiAgfSk7XG5cbiAgdGVzdCgnZnJvbSBlbnZpcm9ubWVudCBhcm4gd2l0aCBtaXNzaW5nIHNsYXNoJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICBFbnZpcm9ubWVudC5mcm9tRW52aXJvbm1lbnRBcm4oc3RhY2ssICdNeUVudmlyb25tZW50JyxcbiAgICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vYWJjMTIzZW52aXJvbm1lbnQvZGVmNDU2Jyk7XG4gICAgfSkudG9UaHJvdygnTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzIGZvciBlbnZpcm9ubWVudCBBUk46IGZvcm1hdCBzaG91bGQgYmUgLyQve2FwcGxpY2F0aW9uSWR9L2Vudmlyb25tZW50Ly8kL3tlbnZpcm9ubWVudElkfScpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIGVudmlyb25tZW50IGFybiB3aXRoIG5vIGFwcGxpY2F0aW9uIGlkJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICBFbnZpcm9ubWVudC5mcm9tRW52aXJvbm1lbnRBcm4oc3RhY2ssICdNeUVudmlyb25tZW50JyxcbiAgICAgICAgJ2Fybjphd3M6YXBwY29uZmlnOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6YXBwbGljYXRpb24vL2Vudmlyb25tZW50L2RlZjQ1NicpO1xuICAgIH0pLnRvVGhyb3coJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgZW52aXJvbm1lbnQgQVJOOiBmb3JtYXQgc2hvdWxkIGJlIC8kL3thcHBsaWNhdGlvbklkfS9lbnZpcm9ubWVudC8vJC97ZW52aXJvbm1lbnRJZH0nKTtcbiAgfSk7XG5cbiAgdGVzdCgnZnJvbSBlbnZpcm9ubWVudCBhcm4gd2l0aCBubyBlbnZpcm9ubWVudCBpZCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgRW52aXJvbm1lbnQuZnJvbUVudmlyb25tZW50QXJuKHN0YWNrLCAnTXlFbnZpcm9ubWVudCcsXG4gICAgICAgICdhcm46YXdzOmFwcGNvbmZpZzp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmFwcGxpY2F0aW9uL2FiYzEyMy9lbnZpcm9ubWVudC8nKTtcbiAgICB9KS50b1Rocm93KCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMgZm9yIGVudmlyb25tZW50IEFSTjogZm9ybWF0IHNob3VsZCBiZSAvJC97YXBwbGljYXRpb25JZH0vZW52aXJvbm1lbnQvLyQve2Vudmlyb25tZW50SWR9Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZW52aXJvbm1lbnQgYXR0cmlidXRlcycsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGFwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBhcHBDb25maWdBcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcENvbmZpZycpO1xuICAgIGNvbnN0IGVudiA9IEVudmlyb25tZW50LmZyb21FbnZpcm9ubWVudEF0dHJpYnV0ZXMoc3RhY2ssICdNeUVudmlyb25tZW50Jywge1xuICAgICAgYXBwbGljYXRpb246IGFwcENvbmZpZ0FwcCxcbiAgICAgIGVudmlyb25tZW50SWQ6ICdkZWY0NTYnLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGVudi5lbnZpcm9ubWVudElkKS50b0VxdWFsKCdkZWY0NTYnKTtcbiAgICBleHBlY3QoZW52LmFwcGxpY2F0aW9uSWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KGVudi5lbnYuYWNjb3VudCkudG9FcXVhbCgnMTIzNDU2Nzg5MDEyJyk7XG4gICAgZXhwZWN0KGVudi5lbnYucmVnaW9uKS50b0VxdWFsKCd1cy13ZXN0LTInKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.js b/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.js new file mode 100644 index 0000000000000..36053d2bca59a --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/extension.test.js @@ -0,0 +1,626 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const cdk = require("aws-cdk-lib"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const aws_events_1 = require("aws-cdk-lib/aws-events"); +const aws_iam_1 = require("aws-cdk-lib/aws-iam"); +const lambda = require("aws-cdk-lib/aws-lambda"); +const aws_sns_1 = require("aws-cdk-lib/aws-sns"); +const aws_sqs_1 = require("aws-cdk-lib/aws-sqs"); +const lib_1 = require("../lib"); +describe('extension', () => { + test('simple extension with lambda', () => { + const stack = new cdk.Stack(); + const func = new lambda.Function(stack, 'MyFunction', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + lib_1.ActionPoint.ON_DEPLOYMENT_ROLLED_BACK, + ], + eventDestination: new lib_1.LambdaDestination(func), + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: { 'Fn::GetAtt': ['MyFunction3BAA72D1', 'Arn'] }, + }, + ], + ON_DEPLOYMENT_ROLLED_BACK: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: { 'Fn::GetAtt': ['MyFunction3BAA72D1', 'Arn'] }, + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: { 'Fn::GetAtt': ['MyFunction3BAA72D1', 'Arn'] }, + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('simple extension with two lambdas', () => { + const stack = new cdk.Stack(); + const func1 = new lambda.Function(stack, 'MyFunction1', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + const func2 = new lambda.Function(stack, 'MyFunction2', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + Object.defineProperty(func1, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + Object.defineProperty(func2, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-diff-function', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + ], + eventDestination: new lib_1.LambdaDestination(func1), + }), + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_ROLLED_BACK, + ], + eventDestination: new lib_1.LambdaDestination(func2), + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + ON_DEPLOYMENT_ROLLED_BACK: [ + { + Name: 'MyExtension-1', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRoleBE614F182C70A', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-diff-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).resourcePropertiesCountIs('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:lambda:us-east-1:123456789012:function:my-function', + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }, 1); + assertions_1.Template.fromStack(stack).resourcePropertiesCountIs('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:lambda:us-east-1:123456789012:function:my-diff-function', + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }, 1); + }); + test('extension with all props using lambda', () => { + const stack = new cdk.Stack(); + const func = new lambda.Function(stack, 'MyFunction', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + const appconfig = new lib_1.Application(stack, 'MyApplication', { + applicationName: 'MyApplication', + }); + const ext = new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + ], + eventDestination: new lib_1.LambdaDestination(func), + }), + ], + extensionName: 'TestExtension', + description: 'This is my extension', + parameters: [ + lib_1.Parameter.required('testVariable', 'hello'), + lib_1.Parameter.notRequired('testNotRequiredVariable'), + ], + latestVersionNumber: 1, + }); + appconfig.addExtension(ext); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'TestExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'TestExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRoleCA98491716207', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + Description: 'This is my extension', + Parameters: { + testVariable: { Required: true }, + testNotRequiredVariable: { Required: false }, + }, + LatestVersionNumber: 1, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'VersionNumber'], + }, + Parameters: { + testVariable: 'hello', + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyApplication5C63EC1D' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:lambda:us-east-1:123456789012:function:my-function', + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('extension with queue', () => { + const stack = new cdk.Stack(); + const queue = new aws_sqs_1.Queue(stack, 'MyQueue'); + Object.defineProperty(queue, 'queueArn', { + value: 'arn:sqs:us-east-1:123456789012:my-queue', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_ROLLED_BACK, + ], + eventDestination: new lib_1.SqsDestination(queue), + name: 'ActionTestName', + description: 'This is my action description', + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_ROLLED_BACK: [ + { + Description: 'This is my action description', + Name: 'ActionTestName', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole76B022BC4F2BC', 'Arn'] }, + Uri: 'arn:sqs:us-east-1:123456789012:my-queue', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:sqs:us-east-1:123456789012:my-queue', + Action: 'sqs:SendMessage', + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('extension with topic', () => { + const stack = new cdk.Stack(); + const topic = new aws_sns_1.Topic(stack, 'MyTopic'); + Object.defineProperty(topic, 'topicArn', { + value: 'arn:sns:us-east-1:123456789012:my-topic', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_BAKING, + ], + eventDestination: new lib_1.SnsDestination(topic), + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_BAKING: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: 'arn:sns:us-east-1:123456789012:my-topic', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:sns:us-east-1:123456789012:my-topic', + Action: 'sns:Publish', + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('extension with bus', () => { + const stack = new cdk.Stack(); + const bus = new aws_events_1.EventBus(stack, 'MyEventBus'); + Object.defineProperty(bus, 'eventBusArn', { + value: 'arn:aws:events:us-east-1:123456789012:event-bus/aws.partner/PartnerName/acct1/repo1', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_BAKING, + ], + eventDestination: new lib_1.EventBridgeDestination(bus), + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_BAKING: [ + { + Name: 'MyExtension-0', + Uri: 'arn:aws:events:us-east-1:123456789012:event-bus/aws.partner/PartnerName/acct1/repo1', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::IAM::Role', 0); + }); + test('extension with associated environment', () => { + const stack = new cdk.Stack(); + const func = new lambda.Function(stack, 'MyFunction', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + const app = new lib_1.Application(stack, 'MyApplication'); + const env = app.addEnvironment('MyEnvironment'); + const ext = new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + ], + eventDestination: new lib_1.LambdaDestination(func), + }), + ], + }); + env.addExtension(ext); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyApplication5C63EC1D' }, + '/environment/', + { Ref: 'MyApplicationMyEnvironment10D94356' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:lambda:us-east-1:123456789012:function:my-function', + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('extension with associated configuration profile', () => { + const stack = new cdk.Stack(); + const func = new lambda.Function(stack, 'MyFunction', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + const app = new lib_1.Application(stack, 'MyApplication'); + const configProfile = new lib_1.HostedConfiguration(stack, 'MyConfiguration', { + application: app, + content: lib_1.ConfigurationContent.fromInlineJson('This is my content.'), + }); + const ext = new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + ], + eventDestination: new lib_1.LambdaDestination(func), + }), + ], + }); + configProfile.addExtension(ext); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyExtension-0', + RoleArn: { 'Fn::GetAtt': ['MyExtensionRole467D6FCDEEFA5', 'Arn'] }, + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::ExtensionAssociation', { + ExtensionIdentifier: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'Id'], + }, + ExtensionVersionNumber: { + 'Fn::GetAtt': ['MyExtension89A915D0', 'VersionNumber'], + }, + ResourceIdentifier: { + 'Fn::Join': [ + '', + [ + 'arn:', + { Ref: 'AWS::Partition' }, + ':appconfig:', + { Ref: 'AWS::Region' }, + ':', + { Ref: 'AWS::AccountId' }, + ':application/', + { Ref: 'MyApplication5C63EC1D' }, + '/configurationprofile/', + { Ref: 'MyConfigurationConfigurationProfileEE0ECA85' }, + ], + ], + }, + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [ + { + PolicyDocument: { + Statement: [ + { + Effect: aws_iam_1.Effect.ALLOW, + Resource: 'arn:lambda:us-east-1:123456789012:function:my-function', + Action: [ + 'lambda:InvokeFunction', + 'lambda:InvokeAsync', + ], + }, + ], + }, + PolicyName: 'AllowAppConfigInvokeExtensionEventSourcePolicy', + }, + ], + }); + }); + test('extension with execution role', () => { + const stack = new cdk.Stack(); + const func = new lambda.Function(stack, 'MyFunction', { + runtime: lambda.Runtime.PYTHON_3_8, + code: lambda.Code.fromInline('# dummy func'), + handler: 'index.handler', + }); + Object.defineProperty(func, 'functionArn', { + value: 'arn:lambda:us-east-1:123456789012:function:my-function', + }); + const role = new aws_iam_1.Role(stack, 'MyRole', { + assumedBy: new aws_iam_1.ServicePrincipal('appconfig.amazonaws.com'), + }); + Object.defineProperty(role, 'roleArn', { + value: 'arn:iam::123456789012:role/my-role', + }); + new lib_1.Extension(stack, 'MyExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_COMPLETE, + ], + eventDestination: new lib_1.LambdaDestination(func), + executionRole: role, + }), + ], + }); + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::AppConfig::Extension', { + Name: 'MyExtension', + Actions: { + ON_DEPLOYMENT_COMPLETE: [ + { + Name: 'MyExtension-0', + RoleArn: 'arn:iam::123456789012:role/my-role', + Uri: 'arn:lambda:us-east-1:123456789012:function:my-function', + }, + ], + }, + }); + }); + test('from extension arn', () => { + const stack = new cdk.Stack(); + const extension = lib_1.Extension.fromExtensionArn(stack, 'MyExtension', 'arn:aws:appconfig:us-west-2:123456789012:extension/abc123/1'); + expect(extension.extensionId).toEqual('abc123'); + expect(extension.extensionVersionNumber).toEqual(1); + expect(extension.env.account).toEqual('123456789012'); + expect(extension.env.region).toEqual('us-west-2'); + }); + test('from extension arn with no resource name', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Extension.fromExtensionArn(stack, 'MyExtension', 'arn:aws:appconfig:us-west-2:123456789012:extension/'); + }).toThrow('Missing required /$/{extensionId}//$/{extensionVersionNumber} from configuration profile ARN:'); + }); + test('from extension arn with no extension id', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Extension.fromExtensionArn(stack, 'MyExtension', 'arn:aws:appconfig:us-west-2:123456789012:extension//1'); + }).toThrow('Missing required parameters for extension ARN: format should be /$/{extensionId}//$/{extensionVersionNumber}'); + }); + test('from extension arn with no extension version number', () => { + const stack = new cdk.Stack(); + expect(() => { + lib_1.Extension.fromExtensionArn(stack, 'MyExtension', 'arn:aws:appconfig:us-west-2:123456789012:extension/abc123/'); + }).toThrow('Missing required parameters for extension ARN: format should be /$/{extensionId}//$/{extensionVersionNumber}'); + }); + test('from extension id', () => { + const cdkApp = new aws_cdk_lib_1.App(); + const stack = new cdk.Stack(cdkApp, 'Stack', { + env: { + region: 'us-west-2', + account: '123456789012', + }, + }); + const extension = lib_1.Extension.fromExtensionAttributes(stack, 'Extension', { + extensionId: 'abc123', + extensionVersionNumber: 1, + }); + expect(extension.extensionId).toEqual('abc123'); + expect(extension.extensionVersionNumber).toEqual(1); + expect(extension.env.account).toEqual('123456789012'); + expect(extension.env.region).toEqual('us-west-2'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJleHRlbnNpb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUFtQztBQUNuQyw2Q0FBa0M7QUFDbEMsdURBQWtEO0FBQ2xELHVEQUFrRDtBQUNsRCxpREFBcUU7QUFDckUsaURBQWlEO0FBQ2pELGlEQUE0QztBQUM1QyxpREFBNEM7QUFDNUMsZ0NBWWdCO0FBRWhCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7WUFDcEQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUNsQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxlQUFlO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksZUFBUyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDbEMsT0FBTyxFQUFFO2dCQUNQLElBQUksWUFBTSxDQUFDO29CQUNULFlBQVksRUFBRTt3QkFDWixpQkFBVyxDQUFDLHNCQUFzQjt3QkFDbEMsaUJBQVcsQ0FBQyx5QkFBeUI7cUJBQ3RDO29CQUNELGdCQUFnQixFQUFFLElBQUksdUJBQWlCLENBQUMsSUFBSSxDQUFDO2lCQUM5QyxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQywyQkFBMkIsRUFBRTtZQUMzRSxJQUFJLEVBQUUsYUFBYTtZQUNuQixPQUFPLEVBQUU7Z0JBQ1Asc0JBQXNCLEVBQUU7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QUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0IHsgRWZmZWN0LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBUb3BpYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3FzJztcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQWN0aW9uUG9pbnQsXG4gIEFwcGxpY2F0aW9uLFxuICBDb25maWd1cmF0aW9uQ29udGVudCxcbiAgRXh0ZW5zaW9uLFxuICBIb3N0ZWRDb25maWd1cmF0aW9uLFxuICBQYXJhbWV0ZXIsXG4gIExhbWJkYURlc3RpbmF0aW9uLFxuICBTcXNEZXN0aW5hdGlvbixcbiAgU25zRGVzdGluYXRpb24sXG4gIEV2ZW50QnJpZGdlRGVzdGluYXRpb24sXG59IGZyb20gJy4uL2xpYic7XG5cbmRlc2NyaWJlKCdleHRlbnNpb24nLCAoKSA9PiB7XG4gIHRlc3QoJ3NpbXBsZSBleHRlbnNpb24gd2l0aCBsYW1iZGEnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOCxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21JbmxpbmUoJyMgZHVtbXkgZnVuYycpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgIH0pO1xuICAgIG5ldyBFeHRlbnNpb24oc3RhY2ssICdNeUV4dGVuc2lvbicsIHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IEFjdGlvbih7XG4gICAgICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgICAgICBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX0NPTVBMRVRFLFxuICAgICAgICAgICAgQWN0aW9uUG9pbnQuT05fREVQTE9ZTUVOVF9ST0xMRURfQkFDSyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGV2ZW50RGVzdGluYXRpb246IG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jKSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb24nLCB7XG4gICAgICBOYW1lOiAnTXlFeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX0NPTVBMRVRFOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015RXh0ZW5zaW9uLTAnLFxuICAgICAgICAgICAgUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb25Sb2xlNDY3RDZGQ0RFRUZBNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiB7ICdGbjo6R2V0QXR0JzogWydNeUZ1bmN0aW9uM0JBQTcyRDEnLCAnQXJuJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBPTl9ERVBMT1lNRU5UX1JPTExFRF9CQUNLOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015RXh0ZW5zaW9uLTAnLFxuICAgICAgICAgICAgUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb25Sb2xlNDY3RDZGQ0RFRUZBNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiB7ICdGbjo6R2V0QXR0JzogWydNeUZ1bmN0aW9uM0JBQTcyRDEnLCAnQXJuJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgICBQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IHsgJ0ZuOjpHZXRBdHQnOiBbJ015RnVuY3Rpb24zQkFBNzJEMScsICdBcm4nXSB9LFxuICAgICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICAgJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAnbGFtYmRhOkludm9rZUFzeW5jJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBvbGljeU5hbWU6ICdBbGxvd0FwcENvbmZpZ0ludm9rZUV4dGVuc2lvbkV2ZW50U291cmNlUG9saWN5JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NpbXBsZSBleHRlbnNpb24gd2l0aCB0d28gbGFtYmRhcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBmdW5jMSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmN0aW9uMScsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzgsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tSW5saW5lKCcjIGR1bW15IGZ1bmMnKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICB9KTtcbiAgICBjb25zdCBmdW5jMiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmN0aW9uMicsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzgsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tSW5saW5lKCcjIGR1bW15IGZ1bmMnKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYzEsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYzIsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWRpZmYtZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIG5ldyBFeHRlbnNpb24oc3RhY2ssICdNeUV4dGVuc2lvbicsIHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IEFjdGlvbih7XG4gICAgICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgICAgICBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX0NPTVBMRVRFLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZXZlbnREZXN0aW5hdGlvbjogbmV3IExhbWJkYURlc3RpbmF0aW9uKGZ1bmMxKSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBBY3Rpb24oe1xuICAgICAgICAgIGFjdGlvblBvaW50czogW1xuICAgICAgICAgICAgQWN0aW9uUG9pbnQuT05fREVQTE9ZTUVOVF9ST0xMRURfQkFDSyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGV2ZW50RGVzdGluYXRpb246IG5ldyBMYW1iZGFEZXN0aW5hdGlvbihmdW5jMiksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uJywge1xuICAgICAgTmFtZTogJ015RXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9DT01QTEVURTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015RXh0ZW5zaW9uUm9sZTQ2N0Q2RkNERUVGQTUnLCAnQXJuJ10gfSxcbiAgICAgICAgICAgIFVyaTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgT05fREVQTE9ZTUVOVF9ST0xMRURfQkFDSzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbi0xJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015RXh0ZW5zaW9uUm9sZUJFNjE0RjE4MkM3MEEnLCAnQXJuJ10gfSxcbiAgICAgICAgICAgIFVyaTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1kaWZmLWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlUHJvcGVydGllc0NvdW50SXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICAgICAgICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgJ2xhbWJkYTpJbnZva2VBc3luYycsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdJbnZva2VFeHRlbnNpb25FdmVudFNvdXJjZVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sIDEpO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VQcm9wZXJ0aWVzQ291bnRJcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgICBQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6ICdhcm46bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246bXktZGlmZi1mdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgICAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICdsYW1iZGE6SW52b2tlQXN5bmMnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0FsbG93QXBwQ29uZmlnSW52b2tlRXh0ZW5zaW9uRXZlbnRTb3VyY2VQb2xpY3knLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LCAxKTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZW5zaW9uIHdpdGggYWxsIHByb3BzIHVzaW5nIGxhbWJkYScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ015RnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUlubGluZSgnIyBkdW1teSBmdW5jJyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCBhcHBjb25maWcgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcGxpY2F0aW9uJywge1xuICAgICAgYXBwbGljYXRpb25OYW1lOiAnTXlBcHBsaWNhdGlvbicsXG4gICAgfSk7XG4gICAgY29uc3QgZXh0ID0gbmV3IEV4dGVuc2lvbihzdGFjaywgJ015RXh0ZW5zaW9uJywge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQ09NUExFVEUsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBldmVudERlc3RpbmF0aW9uOiBuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYyksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGV4dGVuc2lvbk5hbWU6ICdUZXN0RXh0ZW5zaW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBleHRlbnNpb24nLFxuICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICBQYXJhbWV0ZXIucmVxdWlyZWQoJ3Rlc3RWYXJpYWJsZScsICdoZWxsbycpLFxuICAgICAgICBQYXJhbWV0ZXIubm90UmVxdWlyZWQoJ3Rlc3ROb3RSZXF1aXJlZFZhcmlhYmxlJyksXG4gICAgICBdLFxuICAgICAgbGF0ZXN0VmVyc2lvbk51bWJlcjogMSxcbiAgICB9KTtcbiAgICBhcHBjb25maWcuYWRkRXh0ZW5zaW9uKGV4dCk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdUZXN0RXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9DT01QTEVURTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdUZXN0RXh0ZW5zaW9uLTAnLFxuICAgICAgICAgICAgUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb25Sb2xlQ0E5ODQ5MTcxNjIwNycsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBleHRlbnNpb24nLFxuICAgICAgUGFyYW1ldGVyczoge1xuICAgICAgICB0ZXN0VmFyaWFibGU6IHsgUmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgdGVzdE5vdFJlcXVpcmVkVmFyaWFibGU6IHsgUmVxdWlyZWQ6IGZhbHNlIH0sXG4gICAgICB9LFxuICAgICAgTGF0ZXN0VmVyc2lvbk51bWJlcjogMSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb244OUE5MTVEMCcsICdJZCddLFxuICAgICAgfSxcbiAgICAgIEV4dGVuc2lvblZlcnNpb25OdW1iZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015RXh0ZW5zaW9uODlBOTE1RDAnLCAnVmVyc2lvbk51bWJlciddLFxuICAgICAgfSxcbiAgICAgIFBhcmFtZXRlcnM6IHtcbiAgICAgICAgdGVzdFZhcmlhYmxlOiAnaGVsbG8nLFxuICAgICAgfSxcbiAgICAgIFJlc291cmNlSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ2FybjonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlBhcnRpdGlvbicgfSxcbiAgICAgICAgICAgICc6YXBwY29uZmlnOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UmVnaW9uJyB9LFxuICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICc6YXBwbGljYXRpb24vJyxcbiAgICAgICAgICAgIHsgUmVmOiAnTXlBcHBsaWNhdGlvbjVDNjNFQzFEJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgICAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICdsYW1iZGE6SW52b2tlQXN5bmMnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0FsbG93QXBwQ29uZmlnSW52b2tlRXh0ZW5zaW9uRXZlbnRTb3VyY2VQb2xpY3knLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZW5zaW9uIHdpdGggcXVldWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUoc3RhY2ssICdNeVF1ZXVlJyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHF1ZXVlLCAncXVldWVBcm4nLCB7XG4gICAgICB2YWx1ZTogJ2FybjpzcXM6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpteS1xdWV1ZScsXG4gICAgfSk7XG4gICAgbmV3IEV4dGVuc2lvbihzdGFjaywgJ015RXh0ZW5zaW9uJywge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfUk9MTEVEX0JBQ0ssXG4gICAgICAgICAgXSxcbiAgICAgICAgICBldmVudERlc3RpbmF0aW9uOiBuZXcgU3FzRGVzdGluYXRpb24ocXVldWUpLFxuICAgICAgICAgIG5hbWU6ICdBY3Rpb25UZXN0TmFtZScsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIG15IGFjdGlvbiBkZXNjcmlwdGlvbicsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uJywge1xuICAgICAgTmFtZTogJ015RXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9ST0xMRURfQkFDSzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBhY3Rpb24gZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgTmFtZTogJ0FjdGlvblRlc3ROYW1lJyxcbiAgICAgICAgICAgIFJvbGVBcm46IHsgJ0ZuOjpHZXRBdHQnOiBbJ015RXh0ZW5zaW9uUm9sZTc2QjAyMkJDNEYyQkMnLCAnQXJuJ10gfSxcbiAgICAgICAgICAgIFVyaTogJ2FybjpzcXM6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpteS1xdWV1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnYXJuOnNxczp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOm15LXF1ZXVlJyxcbiAgICAgICAgICAgICAgICBBY3Rpb246ICdzcXM6U2VuZE1lc3NhZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBvbGljeU5hbWU6ICdBbGxvd0FwcENvbmZpZ0ludm9rZUV4dGVuc2lvbkV2ZW50U291cmNlUG9saWN5JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2V4dGVuc2lvbiB3aXRoIHRvcGljJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICAgIGNvbnN0IHRvcGljID0gbmV3IFRvcGljKHN0YWNrLCAnTXlUb3BpYycpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0b3BpYywgJ3RvcGljQXJuJywge1xuICAgICAgdmFsdWU6ICdhcm46c25zOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6bXktdG9waWMnLFxuICAgIH0pO1xuICAgIG5ldyBFeHRlbnNpb24oc3RhY2ssICdNeUV4dGVuc2lvbicsIHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IEFjdGlvbih7XG4gICAgICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgICAgICBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX0JBS0lORyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGV2ZW50RGVzdGluYXRpb246IG5ldyBTbnNEZXN0aW5hdGlvbih0b3BpYyksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uJywge1xuICAgICAgTmFtZTogJ015RXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9CQUtJTkc6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOYW1lOiAnTXlFeHRlbnNpb24tMCcsXG4gICAgICAgICAgICBSb2xlQXJuOiB7ICdGbjo6R2V0QXR0JzogWydNeUV4dGVuc2lvblJvbGU0NjdENkZDREVFRkE1JywgJ0FybiddIH0sXG4gICAgICAgICAgICBVcmk6ICdhcm46c25zOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6bXktdG9waWMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJ2FybjpzbnM6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpteS10b3BpYycsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnc25zOlB1Ymxpc2gnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBvbGljeU5hbWU6ICdBbGxvd0FwcENvbmZpZ0ludm9rZUV4dGVuc2lvbkV2ZW50U291cmNlUG9saWN5JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2V4dGVuc2lvbiB3aXRoIGJ1cycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBidXMgPSBuZXcgRXZlbnRCdXMoc3RhY2ssICdNeUV2ZW50QnVzJyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1cywgJ2V2ZW50QnVzQXJuJywge1xuICAgICAgdmFsdWU6ICdhcm46YXdzOmV2ZW50czp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmV2ZW50LWJ1cy9hd3MucGFydG5lci9QYXJ0bmVyTmFtZS9hY2N0MS9yZXBvMScsXG4gICAgfSk7XG4gICAgbmV3IEV4dGVuc2lvbihzdGFjaywgJ015RXh0ZW5zaW9uJywge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQkFLSU5HLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZXZlbnREZXN0aW5hdGlvbjogbmV3IEV2ZW50QnJpZGdlRGVzdGluYXRpb24oYnVzKSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb24nLCB7XG4gICAgICBOYW1lOiAnTXlFeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX0JBS0lORzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFVyaTogJ2Fybjphd3M6ZXZlbnRzOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZXZlbnQtYnVzL2F3cy5wYXJ0bmVyL1BhcnRuZXJOYW1lL2FjY3QxL3JlcG8xJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQVdTOjpJQU06OlJvbGUnLCAwKTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZW5zaW9uIHdpdGggYXNzb2NpYXRlZCBlbnZpcm9ubWVudCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ015RnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUlubGluZSgnIyBkdW1teSBmdW5jJyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcGxpY2F0aW9uJyk7XG4gICAgY29uc3QgZW52ID0gYXBwLmFkZEVudmlyb25tZW50KCdNeUVudmlyb25tZW50Jyk7XG4gICAgY29uc3QgZXh0ID0gbmV3IEV4dGVuc2lvbihzdGFjaywgJ015RXh0ZW5zaW9uJywge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQ09NUExFVEUsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBldmVudERlc3RpbmF0aW9uOiBuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYyksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBlbnYuYWRkRXh0ZW5zaW9uKGV4dCk7XG5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbicsIHtcbiAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbicsXG4gICAgICBBY3Rpb25zOiB7XG4gICAgICAgIE9OX0RFUExPWU1FTlRfQ09NUExFVEU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOYW1lOiAnTXlFeHRlbnNpb24tMCcsXG4gICAgICAgICAgICBSb2xlQXJuOiB7ICdGbjo6R2V0QXR0JzogWydNeUV4dGVuc2lvblJvbGU0NjdENkZDREVFRkE1JywgJ0FybiddIH0sXG4gICAgICAgICAgICBVcmk6ICdhcm46bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246bXktZnVuY3Rpb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uQXNzb2NpYXRpb24nLCB7XG4gICAgICBFeHRlbnNpb25JZGVudGlmaWVyOiB7XG4gICAgICAgICdGbjo6R2V0QXR0JzogWydNeUV4dGVuc2lvbjg5QTkxNUQwJywgJ0lkJ10sXG4gICAgICB9LFxuICAgICAgRXh0ZW5zaW9uVmVyc2lvbk51bWJlcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb244OUE5MTVEMCcsICdWZXJzaW9uTnVtYmVyJ10sXG4gICAgICB9LFxuICAgICAgUmVzb3VyY2VJZGVudGlmaWVyOiB7XG4gICAgICAgICdGbjo6Sm9pbic6IFtcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICAnYXJuOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UGFydGl0aW9uJyB9LFxuICAgICAgICAgICAgJzphcHBjb25maWc6JyxcbiAgICAgICAgICAgIHsgUmVmOiAnQVdTOjpSZWdpb24nIH0sXG4gICAgICAgICAgICAnOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6QWNjb3VudElkJyB9LFxuICAgICAgICAgICAgJzphcHBsaWNhdGlvbi8nLFxuICAgICAgICAgICAgeyBSZWY6ICdNeUFwcGxpY2F0aW9uNUM2M0VDMUQnIH0sXG4gICAgICAgICAgICAnL2Vudmlyb25tZW50LycsXG4gICAgICAgICAgICB7IFJlZjogJ015QXBwbGljYXRpb25NeUVudmlyb25tZW50MTBEOTQzNTYnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICAgICAgICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgJ2xhbWJkYTpJbnZva2VBc3luYycsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQb2xpY3lOYW1lOiAnQWxsb3dBcHBDb25maWdJbnZva2VFeHRlbnNpb25FdmVudFNvdXJjZVBvbGljeScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdleHRlbnNpb24gd2l0aCBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gcHJvZmlsZScsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBmdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ015RnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUlubGluZSgnIyBkdW1teSBmdW5jJyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmMsICdmdW5jdGlvbkFybicsIHtcbiAgICAgIHZhbHVlOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcGxpY2F0aW9uJyk7XG4gICAgY29uc3QgY29uZmlnUHJvZmlsZSA9IG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnTXlDb25maWd1cmF0aW9uJywge1xuICAgICAgYXBwbGljYXRpb246IGFwcCxcbiAgICAgIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21JbmxpbmVKc29uKCdUaGlzIGlzIG15IGNvbnRlbnQuJyksXG4gICAgfSk7XG4gICAgY29uc3QgZXh0ID0gbmV3IEV4dGVuc2lvbihzdGFjaywgJ015RXh0ZW5zaW9uJywge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfQ09NUExFVEUsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBldmVudERlc3RpbmF0aW9uOiBuZXcgTGFtYmRhRGVzdGluYXRpb24oZnVuYyksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBjb25maWdQcm9maWxlLmFkZEV4dGVuc2lvbihleHQpO1xuXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBwQ29uZmlnOjpFeHRlbnNpb24nLCB7XG4gICAgICBOYW1lOiAnTXlFeHRlbnNpb24nLFxuICAgICAgQWN0aW9uczoge1xuICAgICAgICBPTl9ERVBMT1lNRU5UX0NPTVBMRVRFOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgTmFtZTogJ015RXh0ZW5zaW9uLTAnLFxuICAgICAgICAgICAgUm9sZUFybjogeyAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb25Sb2xlNDY3RDZGQ0RFRUZBNScsICdBcm4nXSB9LFxuICAgICAgICAgICAgVXJpOiAnYXJuOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZ1bmN0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcHBDb25maWc6OkV4dGVuc2lvbkFzc29jaWF0aW9uJywge1xuICAgICAgRXh0ZW5zaW9uSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkdldEF0dCc6IFsnTXlFeHRlbnNpb244OUE5MTVEMCcsICdJZCddLFxuICAgICAgfSxcbiAgICAgIEV4dGVuc2lvblZlcnNpb25OdW1iZXI6IHtcbiAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ015RXh0ZW5zaW9uODlBOTE1RDAnLCAnVmVyc2lvbk51bWJlciddLFxuICAgICAgfSxcbiAgICAgIFJlc291cmNlSWRlbnRpZmllcjoge1xuICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgJycsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ2FybjonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OlBhcnRpdGlvbicgfSxcbiAgICAgICAgICAgICc6YXBwY29uZmlnOicsXG4gICAgICAgICAgICB7IFJlZjogJ0FXUzo6UmVnaW9uJyB9LFxuICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgeyBSZWY6ICdBV1M6OkFjY291bnRJZCcgfSxcbiAgICAgICAgICAgICc6YXBwbGljYXRpb24vJyxcbiAgICAgICAgICAgIHsgUmVmOiAnTXlBcHBsaWNhdGlvbjVDNjNFQzFEJyB9LFxuICAgICAgICAgICAgJy9jb25maWd1cmF0aW9ucHJvZmlsZS8nLFxuICAgICAgICAgICAgeyBSZWY6ICdNeUNvbmZpZ3VyYXRpb25Db25maWd1cmF0aW9uUHJvZmlsZUVFMEVDQTg1JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIFBvbGljaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBFZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiBbXG4gICAgICAgICAgICAgICAgICAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICdsYW1iZGE6SW52b2tlQXN5bmMnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUG9saWN5TmFtZTogJ0FsbG93QXBwQ29uZmlnSW52b2tlRXh0ZW5zaW9uRXZlbnRTb3VyY2VQb2xpY3knLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZXh0ZW5zaW9uIHdpdGggZXhlY3V0aW9uIHJvbGUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOCxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21JbmxpbmUoJyMgZHVtbXkgZnVuYycpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jLCAnZnVuY3Rpb25Bcm4nLCB7XG4gICAgICB2YWx1ZTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgfSk7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHN0YWNrLCAnTXlSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBwY29uZmlnLmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9sZSwgJ3JvbGVBcm4nLCB7XG4gICAgICB2YWx1ZTogJ2FybjppYW06OjEyMzQ1Njc4OTAxMjpyb2xlL215LXJvbGUnLFxuICAgIH0pO1xuICAgIG5ldyBFeHRlbnNpb24oc3RhY2ssICdNeUV4dGVuc2lvbicsIHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IEFjdGlvbih7XG4gICAgICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgICAgICBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX0NPTVBMRVRFLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZXZlbnREZXN0aW5hdGlvbjogbmV3IExhbWJkYURlc3RpbmF0aW9uKGZ1bmMpLFxuICAgICAgICAgIGV4ZWN1dGlvblJvbGU6IHJvbGUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwcENvbmZpZzo6RXh0ZW5zaW9uJywge1xuICAgICAgTmFtZTogJ015RXh0ZW5zaW9uJyxcbiAgICAgIEFjdGlvbnM6IHtcbiAgICAgICAgT05fREVQTE9ZTUVOVF9DT01QTEVURTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5hbWU6ICdNeUV4dGVuc2lvbi0wJyxcbiAgICAgICAgICAgIFJvbGVBcm46ICdhcm46aWFtOjoxMjM0NTY3ODkwMTI6cm9sZS9teS1yb2xlJyxcbiAgICAgICAgICAgIFVyaTogJ2FybjpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpteS1mdW5jdGlvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZXh0ZW5zaW9uIGFybicsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBFeHRlbnNpb24uZnJvbUV4dGVuc2lvbkFybihzdGFjaywgJ015RXh0ZW5zaW9uJyxcbiAgICAgICdhcm46YXdzOmFwcGNvbmZpZzp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmV4dGVuc2lvbi9hYmMxMjMvMScpO1xuXG4gICAgZXhwZWN0KGV4dGVuc2lvbi5leHRlbnNpb25JZCkudG9FcXVhbCgnYWJjMTIzJyk7XG4gICAgZXhwZWN0KGV4dGVuc2lvbi5leHRlbnNpb25WZXJzaW9uTnVtYmVyKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChleHRlbnNpb24uZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChleHRlbnNpb24uZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZXh0ZW5zaW9uIGFybiB3aXRoIG5vIHJlc291cmNlIG5hbWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIEV4dGVuc2lvbi5mcm9tRXh0ZW5zaW9uQXJuKHN0YWNrLCAnTXlFeHRlbnNpb24nLFxuICAgICAgICAnYXJuOmF3czphcHBjb25maWc6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpleHRlbnNpb24vJyk7XG4gICAgfSkudG9UaHJvdygnTWlzc2luZyByZXF1aXJlZCAvJC97ZXh0ZW5zaW9uSWR9Ly8kL3tleHRlbnNpb25WZXJzaW9uTnVtYmVyfSBmcm9tIGNvbmZpZ3VyYXRpb24gcHJvZmlsZSBBUk46Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb20gZXh0ZW5zaW9uIGFybiB3aXRoIG5vIGV4dGVuc2lvbiBpZCcsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgRXh0ZW5zaW9uLmZyb21FeHRlbnNpb25Bcm4oc3RhY2ssICdNeUV4dGVuc2lvbicsXG4gICAgICAgICdhcm46YXdzOmFwcGNvbmZpZzp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOmV4dGVuc2lvbi8vMScpO1xuICAgIH0pLnRvVGhyb3coJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgZXh0ZW5zaW9uIEFSTjogZm9ybWF0IHNob3VsZCBiZSAvJC97ZXh0ZW5zaW9uSWR9Ly8kL3tleHRlbnNpb25WZXJzaW9uTnVtYmVyfScpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIGV4dGVuc2lvbiBhcm4gd2l0aCBubyBleHRlbnNpb24gdmVyc2lvbiBudW1iZXInLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIEV4dGVuc2lvbi5mcm9tRXh0ZW5zaW9uQXJuKHN0YWNrLCAnTXlFeHRlbnNpb24nLFxuICAgICAgICAnYXJuOmF3czphcHBjb25maWc6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpleHRlbnNpb24vYWJjMTIzLycpO1xuICAgIH0pLnRvVGhyb3coJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyBmb3IgZXh0ZW5zaW9uIEFSTjogZm9ybWF0IHNob3VsZCBiZSAvJC97ZXh0ZW5zaW9uSWR9Ly8kL3tleHRlbnNpb25WZXJzaW9uTnVtYmVyfScpO1xuICB9KTtcblxuICB0ZXN0KCdmcm9tIGV4dGVuc2lvbiBpZCcsICgpID0+IHtcbiAgICBjb25zdCBjZGtBcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGNka0FwcCwgJ1N0YWNrJywge1xuICAgICAgZW52OiB7XG4gICAgICAgIHJlZ2lvbjogJ3VzLXdlc3QtMicsXG4gICAgICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBFeHRlbnNpb24uZnJvbUV4dGVuc2lvbkF0dHJpYnV0ZXMoc3RhY2ssICdFeHRlbnNpb24nLCB7XG4gICAgICBleHRlbnNpb25JZDogJ2FiYzEyMycsXG4gICAgICBleHRlbnNpb25WZXJzaW9uTnVtYmVyOiAxLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4dGVuc2lvbi5leHRlbnNpb25JZCkudG9FcXVhbCgnYWJjMTIzJyk7XG4gICAgZXhwZWN0KGV4dGVuc2lvbi5leHRlbnNpb25WZXJzaW9uTnVtYmVyKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChleHRlbnNpb24uZW52LmFjY291bnQpLnRvRXF1YWwoJzEyMzQ1Njc4OTAxMicpO1xuICAgIGV4cGVjdChleHRlbnNpb24uZW52LnJlZ2lvbikudG9FcXVhbCgndXMtd2VzdC0yJyk7XG4gIH0pO1xufSk7Il19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.js b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.js new file mode 100644 index 0000000000000..5c32225713b7b --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.application.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_ecs_1 = require("aws-cdk-lib/aws-ecs"); +const lib_1 = require("../lib"); +const app = new aws_cdk_lib_1.App(); +const stack = new aws_cdk_lib_1.Stack(app, 'aws-appconfig-application'); +new lib_1.Application(stack, 'MyAppConfig', { + description: 'This is my application for testing', + applicationName: 'MySampleApplication', +}); +const taskDef = new aws_ecs_1.FargateTaskDefinition(stack, 'MyTaskDef'); +lib_1.Application.addAgentToEcs(taskDef); +/* resource deployment alone is sufficient because we already have the + corresponding resource handler tests to assert that resources can be + used after created */ +new integ_tests_alpha_1.IntegTest(app, 'appconfig-application', { + testCases: [stack], +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy5hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtFQUF1RDtBQUN2RCw2Q0FBeUM7QUFDekMsaURBQTREO0FBQzVELGdDQUFxQztBQUVyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDLENBQUM7QUFFMUQsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7SUFDcEMsV0FBVyxFQUFFLG9DQUFvQztJQUNqRCxlQUFlLEVBQUUscUJBQXFCO0NBQ3ZDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXFCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzlELGlCQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRW5DOzt3QkFFd0I7QUFFeEIsSUFBSSw2QkFBUyxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRTtJQUMxQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7Q0FDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZWdUZXN0IH0gZnJvbSAnQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEnO1xuaW1wb3J0IHsgU3RhY2ssIEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEZhcmdhdGVUYXNrRGVmaW5pdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICcuLi9saWInO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5cbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ2F3cy1hcHBjb25maWctYXBwbGljYXRpb24nKTtcblxubmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBDb25maWcnLCB7XG4gIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBhcHBsaWNhdGlvbiBmb3IgdGVzdGluZycsXG4gIGFwcGxpY2F0aW9uTmFtZTogJ015U2FtcGxlQXBwbGljYXRpb24nLFxufSk7XG5cbmNvbnN0IHRhc2tEZWYgPSBuZXcgRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHN0YWNrLCAnTXlUYXNrRGVmJyk7XG5BcHBsaWNhdGlvbi5hZGRBZ2VudFRvRWNzKHRhc2tEZWYpO1xuXG4vKiByZXNvdXJjZSBkZXBsb3ltZW50IGFsb25lIGlzIHN1ZmZpY2llbnQgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgdGhlXG4gICBjb3JyZXNwb25kaW5nIHJlc291cmNlIGhhbmRsZXIgdGVzdHMgdG8gYXNzZXJ0IHRoYXQgcmVzb3VyY2VzIGNhbiBiZVxuICAgdXNlZCBhZnRlciBjcmVhdGVkICovXG5cbm5ldyBJbnRlZ1Rlc3QoYXBwLCAnYXBwY29uZmlnLWFwcGxpY2F0aW9uJywge1xuICB0ZXN0Q2FzZXM6IFtzdGFja10sXG59KTsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.js b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.js new file mode 100644 index 0000000000000..aa41e4b9aea53 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.configuration.js @@ -0,0 +1,208 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_codepipeline_1 = require("aws-cdk-lib/aws-codepipeline"); +const aws_codepipeline_actions_1 = require("aws-cdk-lib/aws-codepipeline-actions"); +const aws_kms_1 = require("aws-cdk-lib/aws-kms"); +const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); +const aws_s3_1 = require("aws-cdk-lib/aws-s3"); +const s3Deployment = require("aws-cdk-lib/aws-s3-deployment"); +const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager"); +const aws_ssm_1 = require("aws-cdk-lib/aws-ssm"); +const lib_1 = require("../lib"); +const SCHEMA_STR = `{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "string" +}`; +const LAMBDA_CODE = ` +def handler(event, context): + print('This is my dummy validator') +`; +const app = new aws_cdk_lib_1.App({ + postCliContext: { + '@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2': false, + }, +}); +const stack = new aws_cdk_lib_1.Stack(app, 'aws-appconfig-configuration'); +// create application for config profile +const appConfigApp = new lib_1.Application(stack, 'MyAppConfig', { + applicationName: 'AppForConfigTest', +}); +const deploymentStrategy = new lib_1.DeploymentStrategy(stack, 'MyDeployStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 100, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(0), + }), +}); +// hosted config from file +new lib_1.HostedConfiguration(stack, 'MyHostedConfigFromFile', { + application: appConfigApp, + content: lib_1.ConfigurationContent.fromFile('config.json'), +}); +// create basic config profile and add config version +const hostedEnv = appConfigApp.addEnvironment('HostedEnv'); +new lib_1.HostedConfiguration(stack, 'MyHostedConfig', { + application: appConfigApp, + content: lib_1.ConfigurationContent.fromInlineText('This is my configuration content.'), + deployTo: [hostedEnv], + validators: [ + lib_1.JsonSchemaValidator.fromInline(SCHEMA_STR), + lib_1.JsonSchemaValidator.fromFile('schema.json'), + ], + deploymentStrategy, +}); +// create basic config profile from add config version from file +const hostedEnvFromJson = appConfigApp.addEnvironment('HostedEnvFromJson'); +const config = new lib_1.HostedConfiguration(stack, 'MyHostedConfigFromJson', { + application: appConfigApp, + content: lib_1.ConfigurationContent.fromInlineText('This is the configuration content'), + deployTo: [hostedEnvFromJson], + deploymentStrategy, +}); +const hostedEnvFromYaml = appConfigApp.addEnvironment('HostedEnvFromYaml'); +new lib_1.HostedConfiguration(stack, 'MyHostedConfigFromYaml', { + application: appConfigApp, + content: lib_1.ConfigurationContent.fromInlineYaml('This is the configuration content'), + deployTo: [hostedEnvFromYaml], + deploymentStrategy, +}); +// verify a configuration can be deployed through the deploy method +const envToDeployLater = appConfigApp.addEnvironment('EnvDeployLater'); +config.deploy(envToDeployLater); +// ssm paramter as configuration source +const func = new aws_lambda_1.Function(stack, 'MyValidatorFunction', { + runtime: aws_lambda_1.Runtime.PYTHON_3_8, + handler: 'index.handler', + code: aws_lambda_1.Code.fromInline(LAMBDA_CODE), +}); +const parameterEnv = appConfigApp.addEnvironment('ParameterEnv'); +const ssmParameter = new aws_ssm_1.StringParameter(stack, 'MyParameter', { + stringValue: 'This is the content stored in ssm parameter', +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromParameter', { + name: 'TestConfigProfileStoredAsParamater', + application: appConfigApp, + description: 'This is a configuration profile used for integ testing', + location: lib_1.ConfigurationSource.fromParameter(ssmParameter), + versionNumber: '1', + deployTo: [parameterEnv], + validators: [ + lib_1.LambdaValidator.fromFunction(func), + ], + deploymentStrategy, +}); +// ssm document as configuration source +const documentEnv = appConfigApp.addEnvironment('DocumentEnv'); +const ssmDocument = new aws_ssm_1.CfnDocument(stack, 'MyDocument', { + content: { + schemaVersion: '2.2', + description: 'Sample SSM Document', + mainSteps: [ + { + action: 'aws:runShellScript', + name: 'step1', + inputs: { + runCommand: [ + 'echo "Hello, World!"', + ], + }, + }, + ], + }, + documentType: 'Command', + name: 'TestDocument', +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromDocument', { + application: appConfigApp, + location: lib_1.ConfigurationSource.fromCfnDocument(ssmDocument), + versionNumber: '1', + deployTo: [documentEnv], + deploymentStrategy, +}); +// S3 as configuration source +const bucketEnv = appConfigApp.addEnvironment('BucketEnv'); +const bucket = new aws_s3_1.Bucket(stack, 'MyBucket', { + versioned: true, + removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, +}); +bucket.applyRemovalPolicy(aws_cdk_lib_1.RemovalPolicy.DESTROY); +const deployment = new s3Deployment.BucketDeployment(stack, 'DeployConfigInBucket', { + sources: [s3Deployment.Source.data('hello/world/file.txt', 'This is the content stored in S3')], + destinationBucket: bucket, + retainOnDelete: false, +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromBucket', { + application: appConfigApp, + location: lib_1.ConfigurationSource.fromBucket(bucket, 'hello/world/file.txt'), + description: `Sourced from ${aws_cdk_lib_1.Fn.select(0, deployment.objectKeys)}`, + deployTo: [bucketEnv], +}); +// secrets manager as configuration source (without key) +const secretEnv = appConfigApp.addEnvironment('SecretEnv'); +const secret = new aws_secretsmanager_1.Secret(stack, 'MySecret', { + secretStringValue: aws_cdk_lib_1.SecretValue.unsafePlainText('This is the content stored in secrets manager'), +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromSecret', { + application: appConfigApp, + location: lib_1.ConfigurationSource.fromSecret(secret), + deployTo: [secretEnv], +}); +// secrets manager as configuration source (with key) +const secretWithKeyEnv = appConfigApp.addEnvironment('SecretEnvWithKey'); +const key = new aws_kms_1.Key(stack, 'MyKey'); +const secretWithKey = new aws_secretsmanager_1.Secret(stack, 'MySecretWithKey', { + secretStringValue: aws_cdk_lib_1.SecretValue.unsafePlainText('This is the content stored in secrets manager'), + encryptionKey: key, +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromSecretWithKey', { + location: lib_1.ConfigurationSource.fromSecret(secretWithKey), + deploymentKey: key, + application: appConfigApp, + deployTo: [secretWithKeyEnv], +}); +// code pipeline as configuration source +deployment.addSource(s3Deployment.Source.data('hello/world/codepipeline.txt', 'This is the content stored in code pipeline')); +const sourceAction = new aws_codepipeline_actions_1.S3SourceAction({ + actionName: 'Source', + bucket: bucket, + bucketKey: 'hello/world/codepipeline.txt', + output: new aws_codepipeline_1.Artifact('SourceOutput'), +}); +const deployAction = new aws_codepipeline_actions_1.S3DeployAction({ + actionName: 'Deploy', + input: aws_codepipeline_1.Artifact.artifact('SourceOutput'), + bucket: bucket, + extract: true, +}); +const pipeline = new aws_codepipeline_1.Pipeline(stack, 'MyPipeline', { + crossAccountKeys: true, + stages: [ + { + stageName: 'beta', + actions: [sourceAction], + }, + { + stageName: 'prod', + actions: [deployAction], + }, + ], +}); +new lib_1.SourcedConfiguration(stack, 'MyConfigFromPipeline', { + application: appConfigApp, + location: lib_1.ConfigurationSource.fromPipeline(pipeline), +}); +/* resource deployment alone is sufficient because we already have the + corresponding resource handler tests to assert that resources can be + used after created */ +new integ_tests_alpha_1.IntegTest(app, 'appconfig-configuration', { + testCases: [stack], + cdkCommandOptions: { + destroy: { + args: { + force: true, + }, + }, + }, +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLmNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrRUFBdUQ7QUFDdkQsNkNBQW1GO0FBQ25GLG1FQUFrRTtBQUNsRSxtRkFBc0Y7QUFDdEYsaURBQTBDO0FBQzFDLHVEQUFpRTtBQUNqRSwrQ0FBNEM7QUFDNUMsOERBQThEO0FBQzlELHVFQUF3RDtBQUN4RCxpREFBbUU7QUFDbkUsZ0NBVWdCO0FBRWhCLE1BQU0sVUFBVSxHQUNoQjs7O0VBR0UsQ0FBQztBQUVILE1BQU0sV0FBVyxHQUNqQjs7O0NBR0MsQ0FBQztBQUVGLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQUcsQ0FBQztJQUNsQixjQUFjLEVBQUU7UUFDZCxtREFBbUQsRUFBRSxLQUFLO0tBQzNEO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0FBRTVELHdDQUF3QztBQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLGlCQUFXLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtJQUN6RCxlQUFlLEVBQUUsa0JBQWtCO0NBQ3BDLENBQUMsQ0FBQztBQUVILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSx3QkFBa0IsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7SUFDM0UsZUFBZSxFQUFFLHFCQUFlLENBQUMsTUFBTSxDQUFDO1FBQ3RDLFlBQVksRUFBRSxHQUFHO1FBQ2pCLGtCQUFrQixFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUN4QyxDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBRUgsMEJBQTBCO0FBQzFCLElBQUkseUJBQW1CLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFO0lBQ3ZELFdBQVcsRUFBRSxZQUFZO0lBQ3pCLE9BQU8sRUFBRSwwQkFBb0IsQ0FBQyxR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RCxDQUFDLENBQUM7QUFFSDs7d0JBRXdCO0FBRXhCLElBQUksNkJBQVMsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLEVBQUU7SUFDNUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ2xCLGlCQUFpQixFQUFFO1FBQ2pCLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0Y7S0FDRjtDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVnVGVzdCB9IGZyb20gJ0Bhd3MtY2RrL2ludGVnLXRlc3RzLWFscGhhJztcbmltcG9ydCB7IEFwcCwgRHVyYXRpb24sIFN0YWNrLCBSZW1vdmFsUG9saWN5LCBGbiwgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcnRpZmFjdCwgUGlwZWxpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCB7IFMzRGVwbG95QWN0aW9uLCBTM1NvdXJjZUFjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9ucyc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNEZXBsb3ltZW50IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50JztcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBDZm5Eb2N1bWVudCwgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbixcbiAgQ29uZmlndXJhdGlvbkNvbnRlbnQsXG4gIENvbmZpZ3VyYXRpb25Tb3VyY2UsXG4gIERlcGxveW1lbnRTdHJhdGVneSxcbiAgSG9zdGVkQ29uZmlndXJhdGlvbixcbiAgSnNvblNjaGVtYVZhbGlkYXRvcixcbiAgTGFtYmRhVmFsaWRhdG9yLFxuICBSb2xsb3V0U3RyYXRlZ3ksXG4gIFNvdXJjZWRDb25maWd1cmF0aW9uLFxufSBmcm9tICcuLi9saWInO1xuXG5jb25zdCBTQ0hFTUFfU1RSID1cbmB7XG4gIFwiJHNjaGVtYVwiOiBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiLFxuICBcInR5cGVcIjogXCJzdHJpbmdcIlxufWA7XG5cbmNvbnN0IExBTUJEQV9DT0RFID1cbmBcbmRlZiBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTpcbiAgcHJpbnQoJ1RoaXMgaXMgbXkgZHVtbXkgdmFsaWRhdG9yJylcbmA7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoe1xuICBwb3N0Q2xpQ29udGV4dDoge1xuICAgICdAYXdzLWNkay9hd3MtY29kZXBpcGVsaW5lOmRlZmF1bHRQaXBlbGluZVR5cGVUb1YyJzogZmFsc2UsXG4gIH0sXG59KTtcblxuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnYXdzLWFwcGNvbmZpZy1jb25maWd1cmF0aW9uJyk7XG5cbi8vIGNyZWF0ZSBhcHBsaWNhdGlvbiBmb3IgY29uZmlnIHByb2ZpbGVcbmNvbnN0IGFwcENvbmZpZ0FwcCA9IG5ldyBBcHBsaWNhdGlvbihzdGFjaywgJ015QXBwQ29uZmlnJywge1xuICBhcHBsaWNhdGlvbk5hbWU6ICdBcHBGb3JDb25maWdUZXN0Jyxcbn0pO1xuXG5jb25zdCBkZXBsb3ltZW50U3RyYXRlZ3kgPSBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3lTdHJhdGVneScsIHtcbiAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICBncm93dGhGYWN0b3I6IDEwMCxcbiAgICBkZXBsb3ltZW50RHVyYXRpb246IER1cmF0aW9uLm1pbnV0ZXMoMCksXG4gIH0pLFxufSk7XG5cbi8vIGhvc3RlZCBjb25maWcgZnJvbSBmaWxlXG5uZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnRnJvbUZpbGUnLCB7XG4gIGFwcGxpY2F0aW9uOiBhcHBDb25maWdBcHAsXG4gIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21GaWxlKCdjb25maWcuanNvbicpLFxufSk7XG5cbi8vIGNyZWF0ZSBiYXNpYyBjb25maWcgcHJvZmlsZSBhbmQgYWRkIGNvbmZpZyB2ZXJzaW9uXG5jb25zdCBob3N0ZWRFbnYgPSBhcHBDb25maWdBcHAuYWRkRW52aXJvbm1lbnQoJ0hvc3RlZEVudicpO1xubmV3IEhvc3RlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeUhvc3RlZENvbmZpZycsIHtcbiAgYXBwbGljYXRpb246IGFwcENvbmZpZ0FwcCxcbiAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZVRleHQoJ1RoaXMgaXMgbXkgY29uZmlndXJhdGlvbiBjb250ZW50LicpLFxuICBkZXBsb3lUbzogW2hvc3RlZEVudl0sXG4gIHZhbGlkYXRvcnM6IFtcbiAgICBKc29uU2NoZW1hVmFsaWRhdG9yLmZyb21JbmxpbmUoU0NIRU1BX1NUUiksXG4gICAgSnNvblNjaGVtYVZhbGlkYXRvci5mcm9tRmlsZSgnc2NoZW1hLmpzb24nKSxcbiAgXSxcbiAgZGVwbG95bWVudFN0cmF0ZWd5LFxufSk7XG5cbi8vIGNyZWF0ZSBiYXNpYyBjb25maWcgcHJvZmlsZSBmcm9tIGFkZCBjb25maWcgdmVyc2lvbiBmcm9tIGZpbGVcbmNvbnN0IGhvc3RlZEVudkZyb21Kc29uID0gYXBwQ29uZmlnQXBwLmFkZEVudmlyb25tZW50KCdIb3N0ZWRFbnZGcm9tSnNvbicpO1xuY29uc3QgY29uZmlnID0gbmV3IEhvc3RlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeUhvc3RlZENvbmZpZ0Zyb21Kc29uJywge1xuICBhcHBsaWNhdGlvbjogYXBwQ29uZmlnQXBwLFxuICBjb250ZW50OiBDb25maWd1cmF0aW9uQ29udGVudC5mcm9tSW5saW5lVGV4dCgnVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50JyksXG4gIGRlcGxveVRvOiBbaG9zdGVkRW52RnJvbUpzb25dLFxuICBkZXBsb3ltZW50U3RyYXRlZ3ksXG59KTtcblxuY29uc3QgaG9zdGVkRW52RnJvbVlhbWwgPSBhcHBDb25maWdBcHAuYWRkRW52aXJvbm1lbnQoJ0hvc3RlZEVudkZyb21ZYW1sJyk7XG5uZXcgSG9zdGVkQ29uZmlndXJhdGlvbihzdGFjaywgJ015SG9zdGVkQ29uZmlnRnJvbVlhbWwnLCB7XG4gIGFwcGxpY2F0aW9uOiBhcHBDb25maWdBcHAsXG4gIGNvbnRlbnQ6IENvbmZpZ3VyYXRpb25Db250ZW50LmZyb21JbmxpbmVZYW1sKCdUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIGNvbnRlbnQnKSxcbiAgZGVwbG95VG86IFtob3N0ZWRFbnZGcm9tWWFtbF0sXG4gIGRlcGxveW1lbnRTdHJhdGVneSxcbn0pO1xuXG4vLyB2ZXJpZnkgYSBjb25maWd1cmF0aW9uIGNhbiBiZSBkZXBsb3llZCB0aHJvdWdoIHRoZSBkZXBsb3kgbWV0aG9kXG5jb25zdCBlbnZUb0RlcGxveUxhdGVyID0gYXBwQ29uZmlnQXBwLmFkZEVudmlyb25tZW50KCdFbnZEZXBsb3lMYXRlcicpO1xuY29uZmlnLmRlcGxveShlbnZUb0RlcGxveUxhdGVyKTtcblxuLy8gc3NtIHBhcmFtdGVyIGFzIGNvbmZpZ3VyYXRpb24gc291cmNlXG5jb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKHN0YWNrLCAnTXlWYWxpZGF0b3JGdW5jdGlvbicsIHtcbiAgcnVudGltZTogUnVudGltZS5QWVRIT05fM184LFxuICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gIGNvZGU6IENvZGUuZnJvbUlubGluZShMQU1CREFfQ09ERSksXG59KTtcbmNvbnN0IHBhcmFtZXRlckVudiA9IGFwcENvbmZpZ0FwcC5hZGRFbnZpcm9ubWVudCgnUGFyYW1ldGVyRW52Jyk7XG5jb25zdCBzc21QYXJhbWV0ZXIgPSBuZXcgU3RyaW5nUGFyYW1ldGVyKHN0YWNrLCAnTXlQYXJhbWV0ZXInLCB7XG4gIHN0cmluZ1ZhbHVlOiAnVGhpcyBpcyB0aGUgY29udGVudCBzdG9yZWQgaW4gc3NtIHBhcmFtZXRlcicsXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbVBhcmFtZXRlcicsIHtcbiAgbmFtZTogJ1Rlc3RDb25maWdQcm9maWxlU3RvcmVkQXNQYXJhbWF0ZXInLFxuICBhcHBsaWNhdGlvbjogYXBwQ29uZmlnQXBwLFxuICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgYSBjb25maWd1cmF0aW9uIHByb2ZpbGUgdXNlZCBmb3IgaW50ZWcgdGVzdGluZycsXG4gIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21QYXJhbWV0ZXIoc3NtUGFyYW1ldGVyKSxcbiAgdmVyc2lvbk51bWJlcjogJzEnLFxuICBkZXBsb3lUbzogW3BhcmFtZXRlckVudl0sXG4gIHZhbGlkYXRvcnM6IFtcbiAgICBMYW1iZGFWYWxpZGF0b3IuZnJvbUZ1bmN0aW9uKGZ1bmMpLFxuICBdLFxuICBkZXBsb3ltZW50U3RyYXRlZ3ksXG59KTtcblxuLy8gc3NtIGRvY3VtZW50IGFzIGNvbmZpZ3VyYXRpb24gc291cmNlXG5jb25zdCBkb2N1bWVudEVudiA9IGFwcENvbmZpZ0FwcC5hZGRFbnZpcm9ubWVudCgnRG9jdW1lbnRFbnYnKTtcbmNvbnN0IHNzbURvY3VtZW50ID0gbmV3IENmbkRvY3VtZW50KHN0YWNrLCAnTXlEb2N1bWVudCcsIHtcbiAgY29udGVudDoge1xuICAgIHNjaGVtYVZlcnNpb246ICcyLjInLFxuICAgIGRlc2NyaXB0aW9uOiAnU2FtcGxlIFNTTSBEb2N1bWVudCcsXG4gICAgbWFpblN0ZXBzOiBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgIG5hbWU6ICdzdGVwMScsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICdlY2hvIFwiSGVsbG8sIFdvcmxkIVwiJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBkb2N1bWVudFR5cGU6ICdDb21tYW5kJyxcbiAgbmFtZTogJ1Rlc3REb2N1bWVudCcsXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbURvY3VtZW50Jywge1xuICBhcHBsaWNhdGlvbjogYXBwQ29uZmlnQXBwLFxuICBsb2NhdGlvbjogQ29uZmlndXJhdGlvblNvdXJjZS5mcm9tQ2ZuRG9jdW1lbnQoc3NtRG9jdW1lbnQpLFxuICB2ZXJzaW9uTnVtYmVyOiAnMScsXG4gIGRlcGxveVRvOiBbZG9jdW1lbnRFbnZdLFxuICBkZXBsb3ltZW50U3RyYXRlZ3ksXG59KTtcblxuLy8gUzMgYXMgY29uZmlndXJhdGlvbiBzb3VyY2VcbmNvbnN0IGJ1Y2tldEVudiA9IGFwcENvbmZpZ0FwcC5hZGRFbnZpcm9ubWVudCgnQnVja2V0RW52Jyk7XG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnTXlCdWNrZXQnLCB7XG4gIHZlcnNpb25lZDogdHJ1ZSxcbiAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxufSk7XG5idWNrZXQuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5jb25zdCBkZXBsb3ltZW50ID0gbmV3IHMzRGVwbG95bWVudC5CdWNrZXREZXBsb3ltZW50KHN0YWNrLCAnRGVwbG95Q29uZmlnSW5CdWNrZXQnLCB7XG4gIHNvdXJjZXM6IFtzM0RlcGxveW1lbnQuU291cmNlLmRhdGEoJ2hlbGxvL3dvcmxkL2ZpbGUudHh0JywgJ1RoaXMgaXMgdGhlIGNvbnRlbnQgc3RvcmVkIGluIFMzJyldLFxuICBkZXN0aW5hdGlvbkJ1Y2tldDogYnVja2V0LFxuICByZXRhaW5PbkRlbGV0ZTogZmFsc2UsXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbUJ1Y2tldCcsIHtcbiAgYXBwbGljYXRpb246IGFwcENvbmZpZ0FwcCxcbiAgbG9jYXRpb246IENvbmZpZ3VyYXRpb25Tb3VyY2UuZnJvbUJ1Y2tldChidWNrZXQsICdoZWxsby93b3JsZC9maWxlLnR4dCcpLFxuICBkZXNjcmlwdGlvbjogYFNvdXJjZWQgZnJvbSAke0ZuLnNlbGVjdCgwLCBkZXBsb3ltZW50Lm9iamVjdEtleXMpfWAsXG4gIGRlcGxveVRvOiBbYnVja2V0RW52XSxcbn0pO1xuXG4vLyBzZWNyZXRzIG1hbmFnZXIgYXMgY29uZmlndXJhdGlvbiBzb3VyY2UgKHdpdGhvdXQga2V5KVxuY29uc3Qgc2VjcmV0RW52ID0gYXBwQ29uZmlnQXBwLmFkZEVudmlyb25tZW50KCdTZWNyZXRFbnYnKTtcbmNvbnN0IHNlY3JldCA9IG5ldyBTZWNyZXQoc3RhY2ssICdNeVNlY3JldCcsIHtcbiAgc2VjcmV0U3RyaW5nVmFsdWU6IFNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dCgnVGhpcyBpcyB0aGUgY29udGVudCBzdG9yZWQgaW4gc2VjcmV0cyBtYW5hZ2VyJyksXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbVNlY3JldCcsIHtcbiAgYXBwbGljYXRpb246IGFwcENvbmZpZ0FwcCxcbiAgbG9jYXRpb246IENvbmZpZ3VyYXRpb25Tb3VyY2UuZnJvbVNlY3JldChzZWNyZXQpLFxuICBkZXBsb3lUbzogW3NlY3JldEVudl0sXG59KTtcblxuLy8gc2VjcmV0cyBtYW5hZ2VyIGFzIGNvbmZpZ3VyYXRpb24gc291cmNlICh3aXRoIGtleSlcbmNvbnN0IHNlY3JldFdpdGhLZXlFbnYgPSBhcHBDb25maWdBcHAuYWRkRW52aXJvbm1lbnQoJ1NlY3JldEVudldpdGhLZXknKTtcbmNvbnN0IGtleSA9IG5ldyBLZXkoc3RhY2ssICdNeUtleScpO1xuY29uc3Qgc2VjcmV0V2l0aEtleSA9IG5ldyBTZWNyZXQoc3RhY2ssICdNeVNlY3JldFdpdGhLZXknLCB7XG4gIHNlY3JldFN0cmluZ1ZhbHVlOiBTZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHQoJ1RoaXMgaXMgdGhlIGNvbnRlbnQgc3RvcmVkIGluIHNlY3JldHMgbWFuYWdlcicpLFxuICBlbmNyeXB0aW9uS2V5OiBrZXksXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbVNlY3JldFdpdGhLZXknLCB7XG4gIGxvY2F0aW9uOiBDb25maWd1cmF0aW9uU291cmNlLmZyb21TZWNyZXQoc2VjcmV0V2l0aEtleSksXG4gIGRlcGxveW1lbnRLZXk6IGtleSxcbiAgYXBwbGljYXRpb246IGFwcENvbmZpZ0FwcCxcbiAgZGVwbG95VG86IFtzZWNyZXRXaXRoS2V5RW52XSxcbn0pO1xuXG4vLyBjb2RlIHBpcGVsaW5lIGFzIGNvbmZpZ3VyYXRpb24gc291cmNlXG5kZXBsb3ltZW50LmFkZFNvdXJjZShzM0RlcGxveW1lbnQuU291cmNlLmRhdGEoJ2hlbGxvL3dvcmxkL2NvZGVwaXBlbGluZS50eHQnLCAnVGhpcyBpcyB0aGUgY29udGVudCBzdG9yZWQgaW4gY29kZSBwaXBlbGluZScpKTtcbmNvbnN0IHNvdXJjZUFjdGlvbiA9IG5ldyBTM1NvdXJjZUFjdGlvbih7XG4gIGFjdGlvbk5hbWU6ICdTb3VyY2UnLFxuICBidWNrZXQ6IGJ1Y2tldCxcbiAgYnVja2V0S2V5OiAnaGVsbG8vd29ybGQvY29kZXBpcGVsaW5lLnR4dCcsXG4gIG91dHB1dDogbmV3IEFydGlmYWN0KCdTb3VyY2VPdXRwdXQnKSxcbn0pO1xuY29uc3QgZGVwbG95QWN0aW9uID0gbmV3IFMzRGVwbG95QWN0aW9uKHtcbiAgYWN0aW9uTmFtZTogJ0RlcGxveScsXG4gIGlucHV0OiBBcnRpZmFjdC5hcnRpZmFjdCgnU291cmNlT3V0cHV0JyksXG4gIGJ1Y2tldDogYnVja2V0LFxuICBleHRyYWN0OiB0cnVlLFxufSk7XG5jb25zdCBwaXBlbGluZSA9IG5ldyBQaXBlbGluZShzdGFjaywgJ015UGlwZWxpbmUnLCB7XG4gIGNyb3NzQWNjb3VudEtleXM6IHRydWUsXG4gIHN0YWdlczogW1xuICAgIHtcbiAgICAgIHN0YWdlTmFtZTogJ2JldGEnLFxuICAgICAgYWN0aW9uczogW3NvdXJjZUFjdGlvbl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgIGFjdGlvbnM6IFtkZXBsb3lBY3Rpb25dLFxuICAgIH0sXG4gIF0sXG59KTtcbm5ldyBTb3VyY2VkQ29uZmlndXJhdGlvbihzdGFjaywgJ015Q29uZmlnRnJvbVBpcGVsaW5lJywge1xuICBhcHBsaWNhdGlvbjogYXBwQ29uZmlnQXBwLFxuICBsb2NhdGlvbjogQ29uZmlndXJhdGlvblNvdXJjZS5mcm9tUGlwZWxpbmUocGlwZWxpbmUpLFxufSk7XG5cbi8qIHJlc291cmNlIGRlcGxveW1lbnQgYWxvbmUgaXMgc3VmZmljaWVudCBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgaGFuZGxlciB0ZXN0cyB0byBhc3NlcnQgdGhhdCByZXNvdXJjZXMgY2FuIGJlXG4gICB1c2VkIGFmdGVyIGNyZWF0ZWQgKi9cblxubmV3IEludGVnVGVzdChhcHAsICdhcHBjb25maWctY29uZmlndXJhdGlvbicsIHtcbiAgdGVzdENhc2VzOiBbc3RhY2tdLFxuICBjZGtDb21tYW5kT3B0aW9uczoge1xuICAgIGRlc3Ryb3k6IHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTsiXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.js b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.js new file mode 100644 index 0000000000000..c6c9305678fb4 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.deployment-strategy.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const lib_1 = require("../lib"); +const app = new aws_cdk_lib_1.App(); +const stack = new aws_cdk_lib_1.Stack(app, 'aws-appconfig-deployment-strategy'); +// create basic deployment strategy +new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 15, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(5), + }), +}); +/* resource deployment alone is sufficient because we already have the + corresponding resource handler tests to assert that resources can be + used after created */ +new integ_tests_alpha_1.IntegTest(app, 'appconfig-deployment-strategy', { + testCases: [stack], +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuZGVwbG95bWVudC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLmRlcGxveW1lbnQtc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrRUFBdUQ7QUFDdkQsNkNBQW1EO0FBQ25ELGdDQUE2RDtBQUU3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7QUFFbEUsbUNBQW1DO0FBQ25DLElBQUksd0JBQWtCLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFO0lBQ3BELGVBQWUsRUFBRSxxQkFBZSxDQUFDLE1BQU0sQ0FBQztRQUN0QyxZQUFZLEVBQUUsRUFBRTtRQUNoQixrQkFBa0IsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDeEMsQ0FBQztDQUNILENBQUMsQ0FBQztBQUVIOzt3QkFFd0I7QUFFeEIsSUFBSSw2QkFBUyxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsRUFBRTtJQUNsRCxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7Q0FDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZWdUZXN0IH0gZnJvbSAnQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEnO1xuaW1wb3J0IHsgQXBwLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBEZXBsb3ltZW50U3RyYXRlZ3ksIFJvbGxvdXRTdHJhdGVneSB9IGZyb20gJy4uL2xpYic7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnYXdzLWFwcGNvbmZpZy1kZXBsb3ltZW50LXN0cmF0ZWd5Jyk7XG5cbi8vIGNyZWF0ZSBiYXNpYyBkZXBsb3ltZW50IHN0cmF0ZWd5XG5uZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gIHJvbGxvdXRTdHJhdGVneTogUm9sbG91dFN0cmF0ZWd5LmxpbmVhcih7XG4gICAgZ3Jvd3RoRmFjdG9yOiAxNSxcbiAgICBkZXBsb3ltZW50RHVyYXRpb246IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gIH0pLFxufSk7XG5cbi8qIHJlc291cmNlIGRlcGxveW1lbnQgYWxvbmUgaXMgc3VmZmljaWVudCBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgaGFuZGxlciB0ZXN0cyB0byBhc3NlcnQgdGhhdCByZXNvdXJjZXMgY2FuIGJlXG4gICB1c2VkIGFmdGVyIGNyZWF0ZWQgKi9cblxubmV3IEludGVnVGVzdChhcHAsICdhcHBjb25maWctZGVwbG95bWVudC1zdHJhdGVneScsIHtcbiAgdGVzdENhc2VzOiBbc3RhY2tdLFxufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.js b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.js new file mode 100644 index 0000000000000..29ff2f38a205d --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.environment.js @@ -0,0 +1,82 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); +const aws_iam_1 = require("aws-cdk-lib/aws-iam"); +const lib_1 = require("../lib"); +const app = new aws_cdk_lib_1.App(); +const stack = new aws_cdk_lib_1.Stack(app, 'aws-appconfig-environment'); +// create resources needed for environment +const appForEnv = new lib_1.Application(stack, 'MyApplicationForEnv', { + applicationName: 'AppForEnvTest', +}); +const alarm = new aws_cloudwatch_1.Alarm(stack, 'StartDeploymentCallCountAlarm', { + alarmName: 'AppConfigStartDeploymentCallCountAlarm', + metric: new aws_cloudwatch_1.Metric({ + namespace: 'AWS/AppConfig', + metricName: 'CallCount', + dimensionsMap: { + Type: 'API', + Resource: 'StartDeployment', + Service: 'AWS AppConfig', + }, + statistic: 'SUM', + period: aws_cdk_lib_1.Duration.minutes(5), + }), + threshold: 300, + comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, + evaluationPeriods: 3, + treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, + actionsEnabled: false, +}); +const policy = new aws_iam_1.PolicyStatement({ + effect: aws_iam_1.Effect.ALLOW, + actions: ['cloudwatch:DescribeAlarms'], + resources: ['*'], +}); +const document = new aws_iam_1.PolicyDocument({ + statements: [policy], +}); +const role = new aws_iam_1.Role(stack, 'MyRole', { + roleName: aws_cdk_lib_1.PhysicalName.GENERATE_IF_NEEDED, + assumedBy: new aws_iam_1.ServicePrincipal('appconfig.amazonaws.com'), + inlinePolicies: { + ['AllowAppConfigMonitorAlarmPolicy']: document, + }, +}); +const compositeAlarm = new aws_cloudwatch_1.CompositeAlarm(stack, 'MyCompositeAlarm', { + alarmRule: alarm, +}); +// create environment with all props defined +const env = new lib_1.Environment(stack, 'MyEnvironment', { + application: appForEnv, + description: 'This is the environment for integ testing', + monitors: [ + lib_1.Monitor.fromCloudWatchAlarm(alarm), + lib_1.Monitor.fromCfnMonitorsProperty({ + alarmArn: alarm.alarmArn, + alarmRoleArn: role.roleArn, + }), + lib_1.Monitor.fromCloudWatchAlarm(compositeAlarm), + ], +}); +// ensure the service can track the monitors in the environment +new lib_1.HostedConfiguration(stack, 'MyConfig', { + application: appForEnv, + content: lib_1.ConfigurationContent.fromInline('config content'), + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeploymentStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + deploymentDuration: aws_cdk_lib_1.Duration.minutes(1), + growthFactor: 50, + }), + }), + deployTo: [env], +}); +/* resource deployment alone is sufficient because we already have the + corresponding resource handler tests to assert that resources can be + used after created */ +new integ_tests_alpha_1.IntegTest(app, 'appconfig-environment', { + testCases: [stack], +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy5lbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtFQUF1RDtBQUN2RCw2Q0FBaUU7QUFDakUsK0RBQWlIO0FBQ2pILGlEQUFzRztBQUN0RyxnQ0FBMkk7QUFFM0ksTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7QUFFdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0FBRTFELDBDQUEwQztBQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGlCQUFXLENBQUMsS0FBSyxFQUFFLHFCQUFxQixFQUFFO0lBQzlELGVBQWUsRUFBRSxlQUFlO0NBQ2pDLENBQUMsQ0FBQztBQUNILE1BQU0sS0FBSyxHQUFHLElBQUksc0JBQUssQ0FBQyxLQUFLLEVBQUUsK0JBQStCLEVBQUU7SUFDOUQsU0FBUyxFQUFFLHdDQUF3QztJQUNuRCxNQUFNLEVBQUUsSUFBSSx1QkFBTSxDQUFDO1FBQ2pCLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixPQUFPLEVBQUUsZUFBZTtTQUN6QjtRQUNELFNBQVMsRUFBRSxLQUFLO1FBQ2hCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDNUIsQ0FBQztJQUNGLFNBQVMsRUFBRSxHQUFHO0lBQ2Qsa0JBQWtCLEVBQUUsbUNBQWtCLENBQUMsa0NBQWtDO0lBQ3pFLGlCQUFpQixFQUFFLENBQUM7SUFDcEIsZ0JBQWdCLEVBQUUsaUNBQWdCLENBQUMsYUFBYTtJQUNoRCxjQUFjLEVBQUUsS0FBSztDQUN0QixDQUFDLENBQUM7QUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLHlCQUFlLENBQUM7SUFDakMsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztJQUNwQixPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUN0QyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7Q0FDakIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSx3QkFBYyxDQUFDO0lBQ2xDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQztDQUNyQixDQUFDLENBQUM7QUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLGNBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ3JDLFFBQVEsRUFBRSwwQkFBWSxDQUFDLGtCQUFrQjtJQUN6QyxTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztJQUMxRCxjQUFjLEVBQUU7UUFDZCxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsUUFBUTtLQUMvQztDQUNGLENBQUMsQ0FBQztBQUNILE1BQU0sY0FBYyxHQUFHLElBQUksK0JBQWMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7SUFDbkUsU0FBUyxFQUFFLEtBQUs7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsNENBQTRDO0FBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQVcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFO0lBQ2xELFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFdBQVcsRUFBRSwyQ0FBMkM7SUFDeEQsUUFBUSxFQUFFO1FBQ1IsYUFBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUNsQyxhQUFPLENBQUMsdUJBQXVCLENBQUM7WUFDOUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTztTQUMzQixDQUFDO1FBQ0YsYUFBTyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQztLQUM1QztDQUNGLENBQUMsQ0FBQztBQUVILCtEQUErRDtBQUMvRCxJQUFJLHlCQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7SUFDekMsV0FBVyxFQUFFLFNBQVM7SUFDdEIsT0FBTyxFQUFFLDBCQUFvQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMxRCxrQkFBa0IsRUFBRSxJQUFJLHdCQUFrQixDQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtRQUN4RSxlQUFlLEVBQUUscUJBQWUsQ0FBQyxNQUFNLENBQUM7WUFDdEMsa0JBQWtCLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLFlBQVksRUFBRSxFQUFFO1NBQ2pCLENBQUM7S0FDSCxDQUFDO0lBQ0YsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDO0NBQ2hCLENBQUMsQ0FBQztBQUVIOzt3QkFFd0I7QUFFeEIsSUFBSSw2QkFBUyxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRTtJQUMxQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7Q0FDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZWdUZXN0IH0gZnJvbSAnQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEnO1xuaW1wb3J0IHsgQXBwLCBEdXJhdGlvbiwgUGh5c2ljYWxOYW1lLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFsYXJtLCBDb21wYXJpc29uT3BlcmF0b3IsIENvbXBvc2l0ZUFsYXJtLCBNZXRyaWMsIFRyZWF0TWlzc2luZ0RhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsLCBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCwgUG9saWN5RG9jdW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uLCBDb25maWd1cmF0aW9uQ29udGVudCwgRGVwbG95bWVudFN0cmF0ZWd5LCBFbnZpcm9ubWVudCwgSG9zdGVkQ29uZmlndXJhdGlvbiwgTW9uaXRvciwgUm9sbG91dFN0cmF0ZWd5IH0gZnJvbSAnLi4vbGliJztcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuXG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdhd3MtYXBwY29uZmlnLWVudmlyb25tZW50Jyk7XG5cbi8vIGNyZWF0ZSByZXNvdXJjZXMgbmVlZGVkIGZvciBlbnZpcm9ubWVudFxuY29uc3QgYXBwRm9yRW52ID0gbmV3IEFwcGxpY2F0aW9uKHN0YWNrLCAnTXlBcHBsaWNhdGlvbkZvckVudicsIHtcbiAgYXBwbGljYXRpb25OYW1lOiAnQXBwRm9yRW52VGVzdCcsXG59KTtcbmNvbnN0IGFsYXJtID0gbmV3IEFsYXJtKHN0YWNrLCAnU3RhcnREZXBsb3ltZW50Q2FsbENvdW50QWxhcm0nLCB7XG4gIGFsYXJtTmFtZTogJ0FwcENvbmZpZ1N0YXJ0RGVwbG95bWVudENhbGxDb3VudEFsYXJtJyxcbiAgbWV0cmljOiBuZXcgTWV0cmljKHtcbiAgICBuYW1lc3BhY2U6ICdBV1MvQXBwQ29uZmlnJyxcbiAgICBtZXRyaWNOYW1lOiAnQ2FsbENvdW50JyxcbiAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICBUeXBlOiAnQVBJJyxcbiAgICAgIFJlc291cmNlOiAnU3RhcnREZXBsb3ltZW50JyxcbiAgICAgIFNlcnZpY2U6ICdBV1MgQXBwQ29uZmlnJyxcbiAgICB9LFxuICAgIHN0YXRpc3RpYzogJ1NVTScsXG4gICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICB9KSxcbiAgdGhyZXNob2xkOiAzMDAsXG4gIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gIGV2YWx1YXRpb25QZXJpb2RzOiAzLFxuICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gIGFjdGlvbnNFbmFibGVkOiBmYWxzZSxcbn0pO1xuY29uc3QgcG9saWN5ID0gbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICBhY3Rpb25zOiBbJ2Nsb3Vkd2F0Y2g6RGVzY3JpYmVBbGFybXMnXSxcbiAgcmVzb3VyY2VzOiBbJyonXSxcbn0pO1xuY29uc3QgZG9jdW1lbnQgPSBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICBzdGF0ZW1lbnRzOiBbcG9saWN5XSxcbn0pO1xuY29uc3Qgcm9sZSA9IG5ldyBSb2xlKHN0YWNrLCAnTXlSb2xlJywge1xuICByb2xlTmFtZTogUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBwY29uZmlnLmFtYXpvbmF3cy5jb20nKSxcbiAgaW5saW5lUG9saWNpZXM6IHtcbiAgICBbJ0FsbG93QXBwQ29uZmlnTW9uaXRvckFsYXJtUG9saWN5J106IGRvY3VtZW50LFxuICB9LFxufSk7XG5jb25zdCBjb21wb3NpdGVBbGFybSA9IG5ldyBDb21wb3NpdGVBbGFybShzdGFjaywgJ015Q29tcG9zaXRlQWxhcm0nLCB7XG4gIGFsYXJtUnVsZTogYWxhcm0sXG59KTtcblxuLy8gY3JlYXRlIGVudmlyb25tZW50IHdpdGggYWxsIHByb3BzIGRlZmluZWRcbmNvbnN0IGVudiA9IG5ldyBFbnZpcm9ubWVudChzdGFjaywgJ015RW52aXJvbm1lbnQnLCB7XG4gIGFwcGxpY2F0aW9uOiBhcHBGb3JFbnYsXG4gIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZW52aXJvbm1lbnQgZm9yIGludGVnIHRlc3RpbmcnLFxuICBtb25pdG9yczogW1xuICAgIE1vbml0b3IuZnJvbUNsb3VkV2F0Y2hBbGFybShhbGFybSksXG4gICAgTW9uaXRvci5mcm9tQ2ZuTW9uaXRvcnNQcm9wZXJ0eSh7XG4gICAgICBhbGFybUFybjogYWxhcm0uYWxhcm1Bcm4sXG4gICAgICBhbGFybVJvbGVBcm46IHJvbGUucm9sZUFybixcbiAgICB9KSxcbiAgICBNb25pdG9yLmZyb21DbG91ZFdhdGNoQWxhcm0oY29tcG9zaXRlQWxhcm0pLFxuICBdLFxufSk7XG5cbi8vIGVuc3VyZSB0aGUgc2VydmljZSBjYW4gdHJhY2sgdGhlIG1vbml0b3JzIGluIHRoZSBlbnZpcm9ubWVudFxubmV3IEhvc3RlZENvbmZpZ3VyYXRpb24oc3RhY2ssICdNeUNvbmZpZycsIHtcbiAgYXBwbGljYXRpb246IGFwcEZvckVudixcbiAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZSgnY29uZmlnIGNvbnRlbnQnKSxcbiAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3ltZW50U3RyYXRlZ3knLCB7XG4gICAgcm9sbG91dFN0cmF0ZWd5OiBSb2xsb3V0U3RyYXRlZ3kubGluZWFyKHtcbiAgICAgIGRlcGxveW1lbnREdXJhdGlvbjogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIGdyb3d0aEZhY3RvcjogNTAsXG4gICAgfSksXG4gIH0pLFxuICBkZXBsb3lUbzogW2Vudl0sXG59KTtcblxuLyogcmVzb3VyY2UgZGVwbG95bWVudCBhbG9uZSBpcyBzdWZmaWNpZW50IGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIHRoZVxuICAgY29ycmVzcG9uZGluZyByZXNvdXJjZSBoYW5kbGVyIHRlc3RzIHRvIGFzc2VydCB0aGF0IHJlc291cmNlcyBjYW4gYmVcbiAgIHVzZWQgYWZ0ZXIgY3JlYXRlZCAqL1xuXG5uZXcgSW50ZWdUZXN0KGFwcCwgJ2FwcGNvbmZpZy1lbnZpcm9ubWVudCcsIHtcbiAgdGVzdENhc2VzOiBbc3RhY2tdLFxufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.d.ts b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.js b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.js new file mode 100644 index 0000000000000..47e0b265c82a8 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/test/integ.extension.js @@ -0,0 +1,105 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const aws_events_1 = require("aws-cdk-lib/aws-events"); +const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); +const aws_sns_1 = require("aws-cdk-lib/aws-sns"); +const aws_sqs_1 = require("aws-cdk-lib/aws-sqs"); +const lib_1 = require("../lib"); +const cdkApp = new aws_cdk_lib_1.App(); +const stack = new aws_cdk_lib_1.Stack(cdkApp, 'aws-appconfig-extension'); +// create extension through lambda +const lambda = new aws_lambda_1.Function(stack, 'MyFunction', { + runtime: aws_lambda_1.Runtime.PYTHON_3_8, + handler: 'index.handler', + code: aws_lambda_1.Code.fromInline('def handler(event, context):\n\tprint(\'The function has been invoked.\')'), +}); +const app = new lib_1.Application(stack, 'MyApplication', { + applicationName: 'AppForExtensionTest', +}); +const lambdaExtension = new lib_1.Extension(stack, 'MyLambdaExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.PRE_CREATE_HOSTED_CONFIGURATION_VERSION, + lib_1.ActionPoint.ON_DEPLOYMENT_START, + ], + eventDestination: new lib_1.LambdaDestination(lambda), + }), + ], +}); +app.addExtension(lambdaExtension); +// create extension through sqs queue +const queue = new aws_sqs_1.Queue(stack, 'MyQueue'); +const queueExtension = new lib_1.Extension(stack, 'MyQueueExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_START, + ], + eventDestination: new lib_1.SqsDestination(queue), + }), + ], +}); +app.addExtension(queueExtension); +// create extension through sns topic +const topic = new aws_sns_1.Topic(stack, 'MyTopic'); +const topicExtension = new lib_1.Extension(stack, 'MyTopicExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_START, + ], + eventDestination: new lib_1.SnsDestination(topic), + }), + ], +}); +app.addExtension(topicExtension); +// create extension through event bus (with parameters) +const bus = aws_events_1.EventBus.fromEventBusName(stack, 'MyEventBus', 'default'); +const busExtension = new lib_1.Extension(stack, 'MyEventBusExtension', { + actions: [ + new lib_1.Action({ + actionPoints: [ + lib_1.ActionPoint.ON_DEPLOYMENT_START, + ], + eventDestination: new lib_1.EventBridgeDestination(bus), + description: 'My event bus action', + name: 'MyEventBusPreHostedConfigVersionAction', + }), + ], + parameters: [ + lib_1.Parameter.required('testParam', 'true'), + lib_1.Parameter.notRequired('testNotRequiredParam'), + ], +}); +app.addExtension(busExtension); +// invoke the extension actions +const env = app.addEnvironment('MyEnv'); +const hostedConfig = new lib_1.HostedConfiguration(stack, 'HostedConfiguration', { + application: app, + content: lib_1.ConfigurationContent.fromInlineJson('This is my configuration content'), + deployTo: [env], + deploymentStrategy: new lib_1.DeploymentStrategy(stack, 'MyDeployStrategy', { + rolloutStrategy: lib_1.RolloutStrategy.linear({ + growthFactor: 100, + deploymentDuration: aws_cdk_lib_1.Duration.minutes(0), + }), + }), +}); +hostedConfig.node.addDependency(lambdaExtension, topicExtension, busExtension, queueExtension); +/* resource deployment alone is sufficient because we already have the + corresponding resource handler tests to assert that resources can be + used after created */ +new integ_tests_alpha_1.IntegTest(app, 'appconfig-extension', { + testCases: [stack], + cdkCommandOptions: { + destroy: { + args: { + force: true, + }, + }, + }, +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcuZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0VBQXVEO0FBQ3ZELDZDQUFtRDtBQUNuRCx1REFBa0Q7QUFDbEQsdURBQWlFO0FBQ2pFLGlEQUE0QztBQUM1QyxpREFBNEM7QUFDNUMsZ0NBY2dCO0FBRWhCLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQUcsRUFBRSxDQUFDO0FBRXpCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztBQUUzRCxrQ0FBa0M7QUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUU7SUFDL0MsT0FBTyxFQUFFLG9CQUFPLENBQUMsVUFBVTtJQUMzQixPQUFPLEVBQUUsZUFBZTtJQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMsMkVBQTJFLENBQUM7Q0FDbkcsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUU7SUFDbEQsZUFBZSxFQUFFLHFCQUFxQjtDQUN2QyxDQUFDLENBQUM7QUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQVMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7SUFDaEUsT0FBTyxFQUFFO1FBQ1AsSUFBSSxZQUFNLENBQUM7WUFDVCxZQUFZLEVBQUU7Z0JBQ1osaUJBQVcsQ0FBQyx1Q0FBdUM7Z0JBQ25ELGlCQUFXLENBQUMsbUJBQW1CO2FBQ2hDO1lBQ0QsZ0JBQWdCLEVBQUUsSUFBSSx1QkFBaUIsQ0FBQyxNQUFNLENBQUM7U0FDaEQsQ0FBQztLQUNIO0NBQ0YsQ0FBQyxDQUFDO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUVsQyxxQ0FBcUM7QUFDckMsTUFBTSxLQUFL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O0tBQ0Y7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICdAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYSc7XG5pbXBvcnQgeyBTdGFjaywgQXBwLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgVG9waWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQge1xuICBEZXBsb3ltZW50U3RyYXRlZ3ksXG4gIEV4dGVuc2lvbixcbiAgQWN0aW9uLFxuICBBY3Rpb25Qb2ludCxcbiAgUGFyYW1ldGVyLFxuICBBcHBsaWNhdGlvbixcbiAgUm9sbG91dFN0cmF0ZWd5LFxuICBIb3N0ZWRDb25maWd1cmF0aW9uLFxuICBDb25maWd1cmF0aW9uQ29udGVudCxcbiAgTGFtYmRhRGVzdGluYXRpb24sXG4gIFNxc0Rlc3RpbmF0aW9uLFxuICBTbnNEZXN0aW5hdGlvbixcbiAgRXZlbnRCcmlkZ2VEZXN0aW5hdGlvbixcbn0gZnJvbSAnLi4vbGliJztcblxuY29uc3QgY2RrQXBwID0gbmV3IEFwcCgpO1xuXG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhjZGtBcHAsICdhd3MtYXBwY29uZmlnLWV4dGVuc2lvbicpO1xuXG4vLyBjcmVhdGUgZXh0ZW5zaW9uIHRocm91Z2ggbGFtYmRhXG5jb25zdCBsYW1iZGEgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNeUZ1bmN0aW9uJywge1xuICBydW50aW1lOiBSdW50aW1lLlBZVEhPTl8zXzgsXG4gIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdkZWYgaGFuZGxlcihldmVudCwgY29udGV4dCk6XFxuXFx0cHJpbnQoXFwnVGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGludm9rZWQuXFwnKScpLFxufSk7XG5jb25zdCBhcHAgPSBuZXcgQXBwbGljYXRpb24oc3RhY2ssICdNeUFwcGxpY2F0aW9uJywge1xuICBhcHBsaWNhdGlvbk5hbWU6ICdBcHBGb3JFeHRlbnNpb25UZXN0Jyxcbn0pO1xuY29uc3QgbGFtYmRhRXh0ZW5zaW9uID0gbmV3IEV4dGVuc2lvbihzdGFjaywgJ015TGFtYmRhRXh0ZW5zaW9uJywge1xuICBhY3Rpb25zOiBbXG4gICAgbmV3IEFjdGlvbih7XG4gICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgQWN0aW9uUG9pbnQuUFJFX0NSRUFURV9IT1NURURfQ09ORklHVVJBVElPTl9WRVJTSU9OLFxuICAgICAgICBBY3Rpb25Qb2ludC5PTl9ERVBMT1lNRU5UX1NUQVJULFxuICAgICAgXSxcbiAgICAgIGV2ZW50RGVzdGluYXRpb246IG5ldyBMYW1iZGFEZXN0aW5hdGlvbihsYW1iZGEpLFxuICAgIH0pLFxuICBdLFxufSk7XG5hcHAuYWRkRXh0ZW5zaW9uKGxhbWJkYUV4dGVuc2lvbik7XG5cbi8vIGNyZWF0ZSBleHRlbnNpb24gdGhyb3VnaCBzcXMgcXVldWVcbmNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlKHN0YWNrLCAnTXlRdWV1ZScpO1xuY29uc3QgcXVldWVFeHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKHN0YWNrLCAnTXlRdWV1ZUV4dGVuc2lvbicsIHtcbiAgYWN0aW9uczogW1xuICAgIG5ldyBBY3Rpb24oe1xuICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfU1RBUlQsXG4gICAgICBdLFxuICAgICAgZXZlbnREZXN0aW5hdGlvbjogbmV3IFNxc0Rlc3RpbmF0aW9uKHF1ZXVlKSxcbiAgICB9KSxcbiAgXSxcbn0pO1xuYXBwLmFkZEV4dGVuc2lvbihxdWV1ZUV4dGVuc2lvbik7XG5cbi8vIGNyZWF0ZSBleHRlbnNpb24gdGhyb3VnaCBzbnMgdG9waWNcbmNvbnN0IHRvcGljID0gbmV3IFRvcGljKHN0YWNrLCAnTXlUb3BpYycpO1xuY29uc3QgdG9waWNFeHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKHN0YWNrLCAnTXlUb3BpY0V4dGVuc2lvbicsIHtcbiAgYWN0aW9uczogW1xuICAgIG5ldyBBY3Rpb24oe1xuICAgICAgYWN0aW9uUG9pbnRzOiBbXG4gICAgICAgIEFjdGlvblBvaW50Lk9OX0RFUExPWU1FTlRfU1RBUlQsXG4gICAgICBdLFxuICAgICAgZXZlbnREZXN0aW5hdGlvbjogbmV3IFNuc0Rlc3RpbmF0aW9uKHRvcGljKSxcbiAgICB9KSxcbiAgXSxcbn0pO1xuYXBwLmFkZEV4dGVuc2lvbih0b3BpY0V4dGVuc2lvbik7XG5cbi8vIGNyZWF0ZSBleHRlbnNpb24gdGhyb3VnaCBldmVudCBidXMgKHdpdGggcGFyYW1ldGVycylcbmNvbnN0IGJ1cyA9IEV2ZW50QnVzLmZyb21FdmVudEJ1c05hbWUoc3RhY2ssICdNeUV2ZW50QnVzJywgJ2RlZmF1bHQnKTtcbmNvbnN0IGJ1c0V4dGVuc2lvbiA9IG5ldyBFeHRlbnNpb24oc3RhY2ssICdNeUV2ZW50QnVzRXh0ZW5zaW9uJywge1xuICBhY3Rpb25zOiBbXG4gICAgbmV3IEFjdGlvbih7XG4gICAgICBhY3Rpb25Qb2ludHM6IFtcbiAgICAgICAgQWN0aW9uUG9pbnQuT05fREVQTE9ZTUVOVF9TVEFSVCxcbiAgICAgIF0sXG4gICAgICBldmVudERlc3RpbmF0aW9uOiBuZXcgRXZlbnRCcmlkZ2VEZXN0aW5hdGlvbihidXMpLFxuICAgICAgZGVzY3JpcHRpb246ICdNeSBldmVudCBidXMgYWN0aW9uJyxcbiAgICAgIG5hbWU6ICdNeUV2ZW50QnVzUHJlSG9zdGVkQ29uZmlnVmVyc2lvbkFjdGlvbicsXG4gICAgfSksXG4gIF0sXG4gIHBhcmFtZXRlcnM6IFtcbiAgICBQYXJhbWV0ZXIucmVxdWlyZWQoJ3Rlc3RQYXJhbScsICd0cnVlJyksXG4gICAgUGFyYW1ldGVyLm5vdFJlcXVpcmVkKCd0ZXN0Tm90UmVxdWlyZWRQYXJhbScpLFxuICBdLFxufSk7XG5hcHAuYWRkRXh0ZW5zaW9uKGJ1c0V4dGVuc2lvbik7XG5cbi8vIGludm9rZSB0aGUgZXh0ZW5zaW9uIGFjdGlvbnNcbmNvbnN0IGVudiA9IGFwcC5hZGRFbnZpcm9ubWVudCgnTXlFbnYnKTtcbmNvbnN0IGhvc3RlZENvbmZpZyA9IG5ldyBIb3N0ZWRDb25maWd1cmF0aW9uKHN0YWNrLCAnSG9zdGVkQ29uZmlndXJhdGlvbicsIHtcbiAgYXBwbGljYXRpb246IGFwcCxcbiAgY29udGVudDogQ29uZmlndXJhdGlvbkNvbnRlbnQuZnJvbUlubGluZUpzb24oJ1RoaXMgaXMgbXkgY29uZmlndXJhdGlvbiBjb250ZW50JyksXG4gIGRlcGxveVRvOiBbZW52XSxcbiAgZGVwbG95bWVudFN0cmF0ZWd5OiBuZXcgRGVwbG95bWVudFN0cmF0ZWd5KHN0YWNrLCAnTXlEZXBsb3lTdHJhdGVneScsIHtcbiAgICByb2xsb3V0U3RyYXRlZ3k6IFJvbGxvdXRTdHJhdGVneS5saW5lYXIoe1xuICAgICAgZ3Jvd3RoRmFjdG9yOiAxMDAsXG4gICAgICBkZXBsb3ltZW50RHVyYXRpb246IER1cmF0aW9uLm1pbnV0ZXMoMCksXG4gICAgfSksXG4gIH0pLFxufSk7XG5ob3N0ZWRDb25maWcubm9kZS5hZGREZXBlbmRlbmN5KGxhbWJkYUV4dGVuc2lvbiwgdG9waWNFeHRlbnNpb24sIGJ1c0V4dGVuc2lvbiwgcXVldWVFeHRlbnNpb24pO1xuXG4vKiByZXNvdXJjZSBkZXBsb3ltZW50IGFsb25lIGlzIHN1ZmZpY2llbnQgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgdGhlXG4gICBjb3JyZXNwb25kaW5nIHJlc291cmNlIGhhbmRsZXIgdGVzdHMgdG8gYXNzZXJ0IHRoYXQgcmVzb3VyY2VzIGNhbiBiZVxuICAgdXNlZCBhZnRlciBjcmVhdGVkICovXG5cbm5ldyBJbnRlZ1Rlc3QoYXBwLCAnYXBwY29uZmlnLWV4dGVuc2lvbicsIHtcbiAgdGVzdENhc2VzOiBbc3RhY2tdLFxuICBjZGtDb21tYW5kT3B0aW9uczoge1xuICAgIGRlc3Ryb3k6IHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appconfig-alpha/tsconfig.json b/packages/@aws-cdk/aws-appconfig-alpha/tsconfig.json new file mode 100644 index 0000000000000..295717ba7dc35 --- /dev/null +++ b/packages/@aws-cdk/aws-appconfig-alpha/tsconfig.json @@ -0,0 +1,53 @@ +{ + "compilerOptions": { + "declarationMap": false, + "inlineSourceMap": true, + "inlineSources": true, + "alwaysStrict": true, + "declaration": true, + "experimentalDecorators": true, + "incremental": true, + "lib": [ + "es2020" + ], + "module": "commonjs", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "stripInternal": false, + "target": "es2020", + "composite": true, + "tsBuildInfoFile": "tsconfig.tsbuildinfo" + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules", + ".types-compat" + ], + "references": [ + { + "path": "../../../tools/@aws-cdk/cdk-build-tools" + }, + { + "path": "../integ-runner" + }, + { + "path": "../integ-tests-alpha" + }, + { + "path": "../../../tools/@aws-cdk/pkglint" + } + ], + "_generated_by_jsii_": "Generated by jsii - safe to delete, and ideally should be in .gitignore" +} \ No newline at end of file From 454744b8f6ba0f9276d7e3cea6b58fd9937ba7e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Sun, 14 Jul 2024 14:07:48 +0200 Subject: [PATCH 21/23] Update principals.test.ts --- .../aws-iam/test/principals.test.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 6067c30dbdddd..0fbfaf94175b6 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -307,6 +307,7 @@ test('PrincipalWithConditions inherits principalAccount from AccountPrincipal ', }); test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { +<<<<<<< HEAD expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); }); @@ -316,6 +317,17 @@ test('Passing string with invalid pattern in AccountPrincipal constructor should test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); +======= + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); +}); + + test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); +}); + + test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); +>>>>>>> a3875db62f (Update principals.test.ts) }); test('AccountPrincipal can specify an organization', () => { @@ -380,6 +392,18 @@ describe('deprecated ServicePrincipal behavior', () => { expect(afSouthStack.resolve(principalName)).toEqual('states.amazonaws.com'); }); + test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); + }); + + test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); + }); + + test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { + expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); + }); + }); describe('standardized Service Principal behavior', () => { From 1aa09bb1bdb2c878b67a83bd111ea25e97a83f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Durand?= Date: Sun, 14 Jul 2024 15:31:56 +0200 Subject: [PATCH 22/23] fix indent --- packages/aws-cdk-lib/aws-iam/test/principals.test.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts index 0fbfaf94175b6..548d436e5cea6 100644 --- a/packages/aws-cdk-lib/aws-iam/test/principals.test.ts +++ b/packages/aws-cdk-lib/aws-iam/test/principals.test.ts @@ -307,7 +307,6 @@ test('PrincipalWithConditions inherits principalAccount from AccountPrincipal ', }); test('Passing non-string as accountId parameter in AccountPrincipal constructor should throw error', () => { -<<<<<<< HEAD expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); }); @@ -317,17 +316,6 @@ test('Passing string with invalid pattern in AccountPrincipal constructor should test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); -======= - expect(() => new iam.AccountPrincipal(1234)).toThrowError('accountId should be of type string'); -}); - - test('Passing string with invalid pattern in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('123456')).toThrowError('accountId should be composed of 12 digits'); -}); - - test('Passing string with only letters in AccountPrincipal constructor should throw error', () => { - expect(() => new iam.AccountPrincipal('test')).toThrowError('accountId should be composed of 12 digits'); ->>>>>>> a3875db62f (Update principals.test.ts) }); test('AccountPrincipal can specify an organization', () => { From eb7276b17123ff5320104a2421916e7c6ba56c5b Mon Sep 17 00:00:00 2001 From: John Dukewich <37190801+jdukewich@users.noreply.github.com> Date: Wed, 7 Aug 2024 18:00:08 -0400 Subject: [PATCH 23/23] feat(ec2): security group lookup via filters (#30625) Closes #30331. This will improve the security group lookup functionality for importing existing security groups into a CDK stack. I added the ability to lookup existing security groups via more filters. Filters are supported by the [DescribeSecurityGroups API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html), and using these filters can be immensely useful for looking up existing security groups, especially if your account or organization follows predictable rules regarding things like security group tags. I added unit tests similar to the ones that test the normal lookup by ID or name. - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .../context-providers/security-groups.test.ts | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/packages/aws-cdk/test/context-providers/security-groups.test.ts b/packages/aws-cdk/test/context-providers/security-groups.test.ts index 86cadb58e9c8e..02362cda782f8 100644 --- a/packages/aws-cdk/test/context-providers/security-groups.test.ts +++ b/packages/aws-cdk/test/context-providers/security-groups.test.ts @@ -1,7 +1,11 @@ import * as AWS from 'aws-sdk-mock'; +import * as AWS from 'aws-sdk-mock'; /* eslint-disable import/order */ import * as aws from 'aws-sdk'; +import { SecurityGroupContextProviderPlugin, hasAllTrafficEgress } from '../../lib/context-providers/security-groups'; + + import { SecurityGroupContextProviderPlugin, hasAllTrafficEgress } from '../../lib/context-providers/security-groups'; import { MockSdkProvider } from '../util/mock-sdk'; @@ -296,6 +300,74 @@ describe('security group context provider plugin', () => { expect(res.allowAllOutbound).toEqual(true); }); + test('looks up by security group description, owner id, tag keys, and tags', async () => { + // GIVEN + const provider = new SecurityGroupContextProviderPlugin(mockSDK); + + AWS.mock('EC2', 'describeSecurityGroups', (_params: aws.EC2.DescribeSecurityGroupsRequest, cb: AwsCallback) => { + expect(_params).toEqual({ + GroupIds: undefined, + Filters: [ + { + Name: 'description', + Values: ['my description'], + }, + { + Name: 'tag-key', + Values: ['tagA', 'tagB'], + }, + { + Name: 'owner-id', + Values: ['012345678901'], + }, + { + Name: 'tag:tagC', + Values: ['valueC', 'otherValueC'], + }, + { + Name: 'tag:tagD', + Values: ['valueD'], + }, + ], + }); + cb(null, { + SecurityGroups: [ + { + GroupId: 'sg-1234', + IpPermissionsEgress: [ + { + IpProtocol: '-1', + IpRanges: [ + { CidrIp: '0.0.0.0/0' }, + ], + }, + { + IpProtocol: '-1', + Ipv6Ranges: [ + { CidrIpv6: '::/0' }, + ], + }, + ], + }, + ], + }); + }); + + // WHEN + const res = await provider.getValue({ + account: '1234', + region: 'us-east-1', + ownerId: '012345678901', + description: 'my description', + tagKeys: ['tagA', 'tagB'], + tags: { tagC: ['valueC', 'otherValueC'], tagD: ['valueD'] }, + }); + + // THEN + expect(res.securityGroupId).toEqual('sg-1234'); + expect(res.allowAllOutbound).toEqual(true); + }); + test('detects non all-outbound egress', async () => { // GIVEN const provider = new SecurityGroupContextProviderPlugin(mockSDK); @@ -389,6 +461,22 @@ describe('security group context provider plugin', () => { ).rejects.toThrow(/\'securityGroupId\' and \'securityGroupName\' can not be specified both when looking up a security group/i); }); +<<<<<<< HEAD + test('errors when neither securityGroupId nor securityGroupName are specified', async () => { + // GIVEN + const provider = new SecurityGroupContextProviderPlugin(mockSDK); + + // WHEN + await expect( + provider.getValue({ + account: '123456789012', + region: 'us-east-1', + }), + ).rejects.toThrow(/\'securityGroupId\' or \'securityGroupName\' must be specified to look up a security group/i); + }); + +======= +>>>>>>> abc78bfa61 (feat(ec2): security group lookup via filters (#30625)) test('identifies allTrafficEgress from SecurityGroup permissions', () => { expect( hasAllTrafficEgress({