cdk-ecr-deployment 4.2.8 → 4.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
package/README.md CHANGED
@@ -19,7 +19,7 @@ CDK construct to synchronize single docker image between docker registries.
19
19
  - Copy image or multi-architecture image index from ECR/external registry to (another) ECR/external registry
20
20
  - Copy an archive tarball image from s3 to ECR/external registry
21
21
 
22
- ## Examples
22
+ ## Usage
23
23
 
24
24
  ```ts
25
25
  import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
@@ -82,52 +82,43 @@ new ecrdeploy.ECRDeployment(this, 'DeployDockerImage5', {
82
82
  });
83
83
  ```
84
84
 
85
- ## Sample: [test/example.ecr-deployment.ts](./test/example.ecr-deployment.ts)
85
+ ## Examples: [examples/](./examples)
86
+
87
+ The [examples/](./examples) directory contains a runnable CDK app per scenario
88
+ (local image asset, specific architecture, multi-arch index, retry config, S3
89
+ archive, and private-registry credentials). See [examples/README.md](./examples/README.md).
86
90
 
87
91
  After cloning the repository, install dependencies and run a full build:
88
92
 
89
93
  ```console
90
- yarn --frozen-lockfile --check-files
94
+ yarn install --immutable
91
95
  yarn build
92
96
  ```
93
97
 
94
- Then run the example like this:
98
+ Then synth or deploy any example:
95
99
 
96
100
  ```shell
97
- # Run the following command to try the sample.
98
- npx cdk deploy -a "npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/example.ecr-deployment.ts"
101
+ npx cdk synth --app "npx ts-node examples/docker-image-asset.ts"
102
+ npx cdk deploy --app "npx ts-node examples/docker-image-asset.ts"
99
103
  ```
100
104
 
101
- To run the DockerHub example you will first need to setup a Secret in AWS Secrets Manager to provide DockerHub credentials.
102
- Replace `username:access-token` with your credentials.
103
- **Please note that Secrets will occur a cost.**
105
+ The [private-registry-credentials](./examples/private-registry-credentials.ts) example needs a
106
+ Secret in AWS Secrets Manager with your DockerHub credentials (**note: secrets incur a cost**):
104
107
 
105
108
  ```console
106
109
  aws secretsmanager create-secret --name DockerHubCredentials --secret-string "username:access-token"
107
- ```
108
-
109
- From the output, copy the ARN of your new secret and export it as env variable
110
-
111
- ```console
112
110
  export DOCKERHUB_SECRET_ARN="<ARN>"
113
111
  ```
114
112
 
115
- Finally run:
116
-
117
- ```shell
118
- # Run the following command to try the sample.
119
- npx cdk deploy -a "npx ts-node -P tsconfig.dev.json --prefer-ts-exts test/dockerhub-example.ecr-deployment.ts"
120
- ```
121
-
122
- If your Secret is encrypted, you might have to adjust the example to also grant decrypt permissions.
113
+ If your secret is encrypted, you might have to adjust the example to also grant decrypt permissions.
123
114
 
124
115
  ## [API](./API.md)
125
116
 
126
- ## Tech Details & Contribution
117
+ ## Tech Details & Contributions
127
118
 
128
- The core of this project relies on [containers/image](https://github.com/containers/image) which is used by [Skopeo](https://github.com/containers/skopeo).
129
- Please take a look at those projects before contribution.
119
+ The core of this project relies on [containers/image](https://github.com/containers/container-libs/tree/main/image) (published as the Go module `go.podman.io/image/v5`) which is used by [Skopeo](https://github.com/containers/skopeo).
120
+ Please take a look at those projects before contributing.
130
121
 
131
- To support a new docker image source(like docker tarball in s3), you need to implement [image transport interface](https://github.com/containers/image/blob/master/types/types.go). You could take a look at [docker-archive](https://github.com/containers/image/blob/ccb87a8d0f45cf28846e307eb0ec2b9d38a458c2/docker/archive/transport.go) transport for a good start.
122
+ To support a new docker image source (like docker tarball in s3), you need to implement [image transport interface](https://github.com/containers/container-libs/blob/main/image/types/types.go). You could take a look at [docker-archive](https://github.com/containers/container-libs/blob/main/image/docker/archive/transport.go) transport for a good start.
132
123
 
133
124
  Any error in the custom resource provider will show up in the CloudFormation error log as `Invalid PhysicalResourceId`, because of this: <https://github.com/aws/aws-lambda-go/issues/107>. You need to go into the CloudWatch Log Group to find the real error.
@@ -0,0 +1,5 @@
1
+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ # Tiny base used by the Docker image asset examples.
5
+ FROM public.ecr.aws/nginx/nginx:alpine-slim@sha256:5b52c95c8eeda19dfa9dae708c4e66dce9f0910a6ac5e85dc19779160615b5b2
@@ -0,0 +1,40 @@
1
+ # cdk-ecr-deployment examples
2
+
3
+ Each file is a self-contained CDK app demonstrating one `ECRDeployment` scenario.
4
+ The header comment in each file explains what it does.
5
+
6
+ | Example | Scenario |
7
+ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
8
+ | [docker-image-asset.ts](./docker-image-asset.ts) | Copy a local Docker image asset (built from [`Dockerfile`](./Dockerfile)) to ECR |
9
+ | [specific-architecture.ts](./specific-architecture.ts) | Copy a single architecture with `imageArch` |
10
+ | [multi-arch-index.ts](./multi-arch-index.ts) | Copy a full multi-arch image index with `copyImageIndex` + `archImageTags` |
11
+ | [retry-config.ts](./retry-config.ts) | Tune ECR PutImage retry/backoff with `retryConfigs` |
12
+ | [s3-archive.ts](./s3-archive.ts) | Copy from a `docker save` tarball stored in S3 via `S3ArchiveName` |
13
+ | [private-registry-credentials.ts](./private-registry-credentials.ts) | Copy from a private registry (DockerHub) using a Secrets Manager secret |
14
+
15
+ ## Running
16
+
17
+ First build the project from the repo root:
18
+
19
+ ```console
20
+ yarn install --immutable
21
+ yarn build
22
+ ```
23
+
24
+ Synthesize any example:
25
+
26
+ ```console
27
+ npx cdk synth --app "npx ts-node examples/docker-image-asset.ts"
28
+ ```
29
+
30
+ Deploy it (creates real resources):
31
+
32
+ ```console
33
+ npx cdk deploy --app "npx ts-node examples/docker-image-asset.ts"
34
+ ```
35
+
36
+ ## Prerequisites
37
+
38
+ - **Docker** must be running for the asset-based examples (`docker-image-asset.ts`, `specific-architecture.ts`).
39
+ - **`private-registry-credentials.ts`** needs a Secrets Manager secret with DockerHub credentials. Set `DOCKERHUB_SECRET_ARN` to synth or deploy (the example fails fast without it). Secrets incur a cost.
40
+ - **`s3-archive.ts`** needs a `docker save` tarball uploaded to the referenced S3 bucket/key before deploying.
@@ -0,0 +1,36 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: copy a local Docker image asset into your own ECR repository.
6
+ *
7
+ * The Dockerfile in this directory is built as a CDK `DockerImageAsset` (CDK
8
+ * pushes it to the bootstrapped CDK assets repo), then `ECRDeployment` copies
9
+ * that image into the `TargetRepo` under the `latest` tag.
10
+ *
11
+ * Run:
12
+ * npx cdk synth --app "npx ts-node examples/docker-image-asset.ts"
13
+ */
14
+ import * as path from 'path';
15
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr, aws_ecr_assets as assets } from 'aws-cdk-lib';
16
+ import * as ecrDeploy from '../src/index';
17
+
18
+ const app = new App();
19
+ const stack = new Stack(app, 'ecr-deploy-docker-image-asset');
20
+
21
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
22
+ removalPolicy: RemovalPolicy.DESTROY,
23
+ emptyOnDelete: true,
24
+ });
25
+
26
+ const image = new assets.DockerImageAsset(stack, 'Image', {
27
+ directory: path.join(__dirname),
28
+ file: 'Dockerfile',
29
+ });
30
+
31
+ new ecrDeploy.ECRDeployment(stack, 'DeployImage', {
32
+ src: new ecrDeploy.DockerImageName(image.imageUri),
33
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:latest`),
34
+ });
35
+
36
+ app.synth();
@@ -0,0 +1,35 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: copy a full multi-architecture image index (manifest list).
6
+ *
7
+ * `copyImageIndex: true` copies every architecture referenced by the source
8
+ * manifest list rather than a single platform. `archImageTags` additionally
9
+ * tags each per-architecture image so they can be pulled individually.
10
+ *
11
+ * Run:
12
+ * npx cdk synth --app "npx ts-node examples/multi-arch-index.ts"
13
+ */
14
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr } from 'aws-cdk-lib';
15
+ import * as ecrDeploy from '../src/index';
16
+
17
+ const app = new App();
18
+ const stack = new Stack(app, 'ecr-deploy-multi-arch-index');
19
+
20
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
21
+ removalPolicy: RemovalPolicy.DESTROY,
22
+ emptyOnDelete: true,
23
+ });
24
+
25
+ new ecrDeploy.ECRDeployment(stack, 'DeployImageIndex', {
26
+ src: new ecrDeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),
27
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:nginx-manifest`),
28
+ copyImageIndex: true,
29
+ archImageTags: {
30
+ amd64: 'nginx-amd64',
31
+ arm64: 'nginx-arm64',
32
+ },
33
+ });
34
+
35
+ app.synth();
@@ -0,0 +1,45 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: copy from a private registry (DockerHub) using credentials stored in
6
+ * AWS Secrets Manager.
7
+ *
8
+ * Pass the secret ARN as the second `DockerImageName` argument. The secret must
9
+ * be either plain text `username:password` or JSON
10
+ * `{"username":"...","password":"..."}`. The deployment lambda is granted
11
+ * `secretsmanager:GetSecretValue` on that secret via `addToPrincipalPolicy`.
12
+ *
13
+ * Provide a real secret (required to synth or deploy):
14
+ * export DOCKERHUB_SECRET_ARN=arn:aws:secretsmanager:<region>:<account>:secret:<name>
15
+ *
16
+ * Run:
17
+ * npx cdk synth --app "npx ts-node examples/private-registry-credentials.ts"
18
+ */
19
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr, aws_iam as iam, aws_secretsmanager as sm } from 'aws-cdk-lib';
20
+ import * as ecrDeploy from '../src/index';
21
+
22
+ const app = new App();
23
+ const stack = new Stack(app, 'ecr-deploy-private-registry-credentials');
24
+
25
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
26
+ removalPolicy: RemovalPolicy.DESTROY,
27
+ emptyOnDelete: true,
28
+ });
29
+
30
+ const secretArn = process.env.DOCKERHUB_SECRET_ARN;
31
+ if (!secretArn) {
32
+ throw new Error('DOCKERHUB_SECRET_ARN is required; see examples/README.md');
33
+ }
34
+ const dockerHubSecret = sm.Secret.fromSecretCompleteArn(stack, 'DockerHubSecret', secretArn);
35
+
36
+ new ecrDeploy.ECRDeployment(stack, 'DeployFromDockerHub', {
37
+ src: new ecrDeploy.DockerImageName('alpine:latest', dockerHubSecret.secretFullArn),
38
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:alpine-from-dockerhub`),
39
+ }).addToPrincipalPolicy(new iam.PolicyStatement({
40
+ effect: iam.Effect.ALLOW,
41
+ actions: ['secretsmanager:GetSecretValue'],
42
+ resources: [dockerHubSecret.secretArn],
43
+ }));
44
+
45
+ app.synth();
@@ -0,0 +1,35 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: tune retry behaviour for ECR PutImage throttling.
6
+ *
7
+ * ECR allows ~10 PutImage TPS by default, so copying many images in parallel
8
+ * can hit rate limits. `retryConfigs` adds exponential backoff with jitter:
9
+ * `numAttempts` total tries, `baseDelay`/`maxDelay` (seconds) bound the wait.
10
+ *
11
+ * Run:
12
+ * npx cdk synth --app "npx ts-node examples/retry-config.ts"
13
+ */
14
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr } from 'aws-cdk-lib';
15
+ import * as ecrDeploy from '../src/index';
16
+
17
+ const app = new App();
18
+ const stack = new Stack(app, 'ecr-deploy-retry-config');
19
+
20
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
21
+ removalPolicy: RemovalPolicy.DESTROY,
22
+ emptyOnDelete: true,
23
+ });
24
+
25
+ new ecrDeploy.ECRDeployment(stack, 'DeployImage', {
26
+ src: new ecrDeploy.DockerImageName('public.ecr.aws/nginx/nginx:latest'),
27
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:latest`),
28
+ retryConfigs: {
29
+ numAttempts: 3,
30
+ baseDelay: 1,
31
+ maxDelay: 30,
32
+ },
33
+ });
34
+
35
+ app.synth();
@@ -0,0 +1,38 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: copy an image from a docker-archive tarball stored in S3.
6
+ *
7
+ * `S3ArchiveName(path, ref)` references a `docker save`-format tarball at
8
+ * `s3://<path>`; `ref` selects an image by RepoTag inside the archive (omit it
9
+ * to copy the only image). The deployment lambda needs `s3:GetObject` on the
10
+ * object, granted here via `addToPrincipalPolicy`.
11
+ *
12
+ * Run:
13
+ * npx cdk synth --app "npx ts-node examples/s3-archive.ts"
14
+ */
15
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr, aws_iam as iam } from 'aws-cdk-lib';
16
+ import * as ecrDeploy from '../src/index';
17
+
18
+ const app = new App();
19
+ const stack = new Stack(app, 'ecr-deploy-s3-archive');
20
+
21
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
22
+ removalPolicy: RemovalPolicy.DESTROY,
23
+ emptyOnDelete: true,
24
+ });
25
+
26
+ const bucket = 'my-bucket';
27
+ const key = 'nginx.tar';
28
+
29
+ new ecrDeploy.ECRDeployment(stack, 'DeployFromS3', {
30
+ src: new ecrDeploy.S3ArchiveName(`${bucket}/${key}`, 'nginx:latest'),
31
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:latest`),
32
+ }).addToPrincipalPolicy(new iam.PolicyStatement({
33
+ effect: iam.Effect.ALLOW,
34
+ actions: ['s3:GetObject'],
35
+ resources: [`arn:aws:s3:::${bucket}/${key}`],
36
+ }));
37
+
38
+ app.synth();
@@ -0,0 +1,38 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Example: copy a single, specific architecture of an image.
6
+ *
7
+ * When a source reference points at a multi-architecture image, `imageArch`
8
+ * selects exactly one platform to copy (here `arm64`). The arm64 asset is
9
+ * copied to ECR under the `latest-arm64` tag.
10
+ *
11
+ * Run:
12
+ * npx cdk synth --app "npx ts-node examples/specific-architecture.ts"
13
+ */
14
+ import * as path from 'path';
15
+ import { App, RemovalPolicy, Stack, aws_ecr as ecr, aws_ecr_assets as assets } from 'aws-cdk-lib';
16
+ import * as ecrDeploy from '../src/index';
17
+
18
+ const app = new App();
19
+ const stack = new Stack(app, 'ecr-deploy-specific-architecture');
20
+
21
+ const repo = new ecr.Repository(stack, 'TargetRepo', {
22
+ removalPolicy: RemovalPolicy.DESTROY,
23
+ emptyOnDelete: true,
24
+ });
25
+
26
+ const imageArm = new assets.DockerImageAsset(stack, 'ImageArm', {
27
+ directory: path.join(__dirname),
28
+ file: 'Dockerfile',
29
+ platform: assets.Platform.LINUX_ARM64,
30
+ });
31
+
32
+ new ecrDeploy.ECRDeployment(stack, 'DeployImageArm', {
33
+ src: new ecrDeploy.DockerImageName(imageArm.imageUri),
34
+ dest: new ecrDeploy.DockerImageName(`${repo.repositoryUri}:latest-arm64`),
35
+ imageArch: ['arm64'],
36
+ });
37
+
38
+ app.synth();
Binary file
package/lib/index.js CHANGED
@@ -25,7 +25,7 @@ class DockerImageName {
25
25
  }
26
26
  exports.DockerImageName = DockerImageName;
27
27
  _a = JSII_RTTI_SYMBOL_1;
28
- DockerImageName[_a] = { fqn: "cdk-ecr-deployment.DockerImageName", version: "4.2.8" };
28
+ DockerImageName[_a] = { fqn: "cdk-ecr-deployment.DockerImageName", version: "4.2.10" };
29
29
  class S3ArchiveName {
30
30
  /**
31
31
  * @param p - the S3 bucket name and path of the archive (a S3 URI without the s3://)
@@ -46,7 +46,7 @@ class S3ArchiveName {
46
46
  }
47
47
  exports.S3ArchiveName = S3ArchiveName;
48
48
  _b = JSII_RTTI_SYMBOL_1;
49
- S3ArchiveName[_b] = { fqn: "cdk-ecr-deployment.S3ArchiveName", version: "4.2.8" };
49
+ S3ArchiveName[_b] = { fqn: "cdk-ecr-deployment.S3ArchiveName", version: "4.2.10" };
50
50
  class ECRDeployment extends constructs_1.Construct {
51
51
  constructor(scope, id, props) {
52
52
  super(scope, id);
@@ -191,5 +191,5 @@ class ECRDeployment extends constructs_1.Construct {
191
191
  }
192
192
  exports.ECRDeployment = ECRDeployment;
193
193
  _c = JSII_RTTI_SYMBOL_1;
194
- ECRDeployment[_c] = { fqn: "cdk-ecr-deployment.ECRDeployment", version: "4.2.8" };
194
+ ECRDeployment[_c] = { fqn: "cdk-ecr-deployment.ECRDeployment", version: "4.2.10" };
195
195
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLDZCQUE2QjtBQUM3Qiw2Q0FBcUk7QUFFckksdURBQXVEO0FBQ3ZELDJDQUF1QztBQXlIdkMsTUFBYSxlQUFlO0lBQzFCOzs7Ozs7T0FNRztJQUNILFlBQTJCLElBQVksRUFBUyxLQUFjO1FBQW5DLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFTO0lBQUksQ0FBQztJQUNuRSxJQUFXLEdBQUcsS0FBYSxPQUFPLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFUOUQsMENBVUM7OztBQUVELE1BQWEsYUFBYTtJQUd4Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBbUIsQ0FBUyxFQUFFLEdBQVksRUFBUyxLQUFjO1FBQWQsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUMvRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFXLEdBQUcsS0FBYSxPQUFPLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFqQjFELHNDQWtCQzs7O0FBRUQsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFHMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx3QkFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUks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LElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFBQyxDQUFDO1FBRTdGLE9BQU8sV0FBVyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxXQUFvQjtRQUM5QyxJQUFJLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztRQUVsRCwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDRDQUE0QztRQUM1QyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtSEFBbUgsQ0FBQyxDQUFDO1lBQ3ZJLENBQUM7WUFFRCxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOztBQXRKSCxzQ0F1SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBhd3NfZWMyIGFzIGVjMiwgYXdzX2lhbSBhcyBpYW0sIGF3c19sYW1iZGEgYXMgbGFtYmRhLCBBcm4sIEF3cywgRHVyYXRpb24sIEN1c3RvbVJlc291cmNlLCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBSdW50aW1lRmFtaWx5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBFQ1JEZXBsb3ltZW50UHJvcHMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBvZiB0aGUgZG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjOiBJSW1hZ2VOYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGRvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3Q6IElJbWFnZU5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBhcmNoaXRlY3R1cmUgdG8gYmUgY29waWVkLlxuICAgKlxuICAgKiBUaGUgJ2FtZDY0JyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBjb3BpZWQgYnkgZGVmYXVsdC4gU3BlY2lmeSB0aGVcbiAgICogYXJjaGl0ZWN0dXJlIG9yIGFyY2hpdGVjdHVyZXMgdG8gY29weSBoZXJlLlxuICAgKlxuICAgKiBJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGNvcHkgbW9yZSB0aGFuIG9uZSBhcmNoaXRlY3R1cmVcbiAgICogYXQgYSB0aW1lOiB0aGUgYXJyYXkgeW91IHNwZWNpZnkgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgWydhbWQ2NCddXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFyY2g/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjb3B5IGEgc291cmNlIGRvY2tlciBpbWFnZSBpbmRleCAobXVsdGktYXJjaCBtYW5pZmVzdCkgdG8gdGhlIGRlc3RpbmF0aW9uLlxuICAgKlxuICAgKiBXaGVuIHRydWUsIGNvcGllcyB0aGUgaW1hZ2UgaW5kZXggYW5kIGFsbCB1bmRlcmx5aW5nIGFyY2hpdGVjdHVyZS1zcGVjaWZpY1xuICAgKiBpbWFnZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBGYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29weUltYWdlSW5kZXg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIGFwcGx5IHRvIGluZGl2aWR1YWwgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGltYWdlcyB3aGVuXG4gICAqIGNvcHlJbWFnZUluZGV4IGlzIHRydWUuXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGNvcHlJbWFnZUluZGV4IGlzIHRydWUuIE1hcHMgYXJjaGl0ZWN0dXJlIG5hbWVzIHRvXG4gICAqIHRoZWlyIHJlc3BlY3RpdmUgdGFncy4gVGhpcyBtYWtlcyBpbmRpdmlkdWFsIGFyY2hpdGVjdHVyZXMgZGlzY292ZXJhYmxlXG4gICAqIGJ5IGh1bWFuLXJlYWRhYmxlIHRhZ3MgaW4gYWRkaXRpb24gdG8gdGhlIGltYWdlIGluZGV4IHRhZy5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHsgJ2FybTY0JzogJ2ltYWdlLWFybTY0JywgJ2FtZDY0JzogJ2ltYWdlLWFtZDY0JyB9LlxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaEltYWdlVGFncz86IHsgW2FyY2hpdGVjdHVyZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFJldHJ5IGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkgdG8gd2hlbiBjb3B5aW5nIGltYWdlcyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgcmV0cnkgYXR0ZW10cHMsXG4gICAqIHRoZSBiYXNlIGFtb3VudCBvZiBkZWxheSAoaW4gc2Vjb25kcykgYmV0d2VlbiBlYWNoIHJldHJ5LCBhbmQgdGhlIG1heCBhbW91bnQgb2YgZGVsYXkgKGluIHNlY29uZHMpXG4gICAqIGJldHdlZW4gZWFjaCByZXRyeS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHsgJ251bUF0dGVtcHRzJzogMywgJ2Jhc2VEZWxheSc6IDEsICdtYXhEZWxheSc6IDUgfVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlDb25maWdzPzogeyBbZmllbGRzOiBzdHJpbmddOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBtZW1vcnkgKGluIE1pQikgdG8gYWxsb2NhdGUgdG8gdGhlIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2hcbiAgICogcmVwbGljYXRlcyB0aGUgZmlsZXMgZnJvbSB0aGUgQ0RLIGJ1Y2tldCB0byB0aGUgZGVzdGluYXRpb24gYnVja2V0LlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIGRlcGxveWluZyBsYXJnZSBmaWxlcywgeW91IHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGlzIG51bWJlclxuICAgKiBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSA1MTJcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgcm9sZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgZGVwbG95bWVudCBsYW1iZGEgaGFuZGxlciBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogV2hlcmUgaW4gdGhlIFZQQyB0byBwbGFjZSB0aGUgZGVwbG95bWVudCBsYW1iZGEgaGFuZGxlci5cbiAgICogT25seSB1c2VkIGlmICd2cGMnIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBWcGMgZGVmYXVsdCBzdHJhdGVneSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXBzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBMYW1iZGEncyBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgZnVuY3Rpb24gaXMgcGxhY2VkIHdpdGhpbiBhIFZQQyBhbmQgYSBzZWN1cml0eSBncm91cCBpc1xuICAgKiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgYnkgdGhpcyBvciBzZWN1cml0eUdyb3VwIHByb3AsIGEgZGVkaWNhdGVkIHNlY3VyaXR5XG4gICAqIGdyb3VwIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogZWMyLlNlY3VyaXR5R3JvdXBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW1hZ2VOYW1lIHtcbiAgLyoqXG4gICAqICBUaGUgdXJpIG9mIHRoZSBkb2NrZXIgaW1hZ2UuXG4gICAqXG4gICAqICBUaGUgdXJpIHNwZWMgZm9sbG93cyBodHRwczovL2dpdGh1Yi5jb20vY29udGFpbmVycy9za29wZW9cbiAgICovXG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JlZGVudGlhbHMgb2YgdGhlIGRvY2tlciBpbWFnZS4gRm9ybWF0IGB1c2VyOnBhc3N3b3JkYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgYXJuYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZWAuXG4gICAqXG4gICAqIElmIHNwZWNpZnlpbmcgYW4gQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQsIHRoZSBmb3JtYXQgb2YgdGhlIHNlY3JldCBzaG91bGQgYmUgZWl0aGVyIHBsYWluIHRleHQgKGB1c2VyOnBhc3N3b3JkYCkgb3JcbiAgICogSlNPTiAoYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWApLlxuICAgKlxuICAgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIEpTT04gZm9ybWF0LCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcHJpdmF0ZS1hdXRoLmh0bWxcbiAgICovXG4gIGNyZWRzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRG9ja2VySW1hZ2VOYW1lIGltcGxlbWVudHMgSUltYWdlTmFtZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpbWFnZSwgZS5nLiByZXRyaWV2ZWQgZnJvbSBgRG9ja2VySW1hZ2VBc3NldC5pbWFnZVVyaWBcbiAgICogQHBhcmFtIGNyZWRzIC0gVGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBkb2NrZXIgaW1hZ2UuIEZvcm1hdCBgdXNlcjpwYXNzd29yZGAgb3IgYEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGFybmAgb3IgYEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IG5hbWVgLlxuICAgKiAgICAgSWYgc3BlY2lmeWluZyBhbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCwgdGhlIGZvcm1hdCBvZiB0aGUgc2VjcmV0IHNob3VsZCBiZSBlaXRoZXIgcGxhaW4gdGV4dCAoYHVzZXI6cGFzc3dvcmRgKSBvclxuICAgKiAgICAgSlNPTiAoYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWApLlxuICAgKiAgICAgRm9yIG1vcmUgZGV0YWlscyBvbiBKU09OIGZvcm1hdCwgc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3ByaXZhdGUtYXV0aC5odG1sXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBuYW1lOiBzdHJpbmcsIHB1YmxpYyBjcmVkcz86IHN0cmluZykgeyB9XG4gIHB1YmxpYyBnZXQgdXJpKCk6IHN0cmluZyB7IHJldHVybiBgZG9ja2VyOi8vJHt0aGlzLm5hbWV9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUzNBcmNoaXZlTmFtZSBpbXBsZW1lbnRzIElJbWFnZU5hbWUge1xuICBwcml2YXRlIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHAgLSB0aGUgUzMgYnVja2V0IG5hbWUgYW5kIHBhdGggb2YgdGhlIGFyY2hpdmUgKGEgUzMgVVJJIHdpdGhvdXQgdGhlIHMzOi8vKVxuICAgKiBAcGFyYW0gcmVmIC0gYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbmFtZSB3aXRoIGEgYDpgLCBlLmcuIGA6bGF0ZXN0YFxuICAgKiBAcGFyYW0gY3JlZHMgLSBUaGUgY3JlZGVudGlhbHMgb2YgdGhlIGRvY2tlciBpbWFnZS4gRm9ybWF0IGB1c2VyOnBhc3N3b3JkYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgYXJuYCBvciBgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgbmFtZWAuXG4gICAqICAgICBJZiBzcGVjaWZ5aW5nIGFuIEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LCB0aGUgZm9ybWF0IG9mIHRoZSBzZWNyZXQgc2hvdWxkIGJlIGVpdGhlciBwbGFpbiB0ZXh0IChgdXNlcjpwYXNzd29yZGApIG9yXG4gICAqICAgICBKU09OIChge1widXNlcm5hbWVcIjpcIjx1c2VybmFtZT5cIixcInBhc3N3b3JkXCI6XCI8cGFzc3dvcmQ+XCJ9YCkuXG4gICAqICAgICBGb3IgbW9yZSBkZXRhaWxzIG9uIEpTT04gZm9ybWF0LCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcHJpdmF0ZS1hdXRoLmh0bWxcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwOiBzdHJpbmcsIHJlZj86IHN0cmluZywgcHVibGljIGNyZWRzPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gcDtcbiAgICBpZiAocmVmKSB7XG4gICAgICB0aGlzLm5hbWUgKz0gJzonICsgcmVmO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHVyaSgpOiBzdHJpbmcgeyByZXR1cm4gYHMzOi8vJHt0aGlzLm5hbWV9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgRUNSRGVwbG95bWVudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgaGFuZGxlcjogbGFtYmRhLlNpbmdsZXRvbkZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQ1JEZXBsb3ltZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IG1lbW9yeUxpbWl0ID0gcHJvcHMubWVtb3J5TGltaXQgPz8gNTEyO1xuICAgIHRoaXMuaGFuZGxlciA9IG5ldyBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlSGFuZGxlcicsIHtcbiAgICAgIHV1aWQ6IHRoaXMucmVuZGVyU2luZ2xldG9uVXVpZChtZW1vcnlMaW1pdCksXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS1iaW4nKSksXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ3Byb3ZpZGVkLmFsMjAyMycsIFJ1bnRpbWVGYW1pbHkuT1RIRVIpLCAvLyBub3QgdXNpbmcgUnVudGltZS5QUk9WSURFRF9BTDIwMjMgdG8gc3VwcG9ydCBvbGRlciBDREsgdmVyc2lvbnMgKDwgMi4xMDUuMClcbiAgICAgIGhhbmRsZXI6ICdib290c3RyYXAnLFxuICAgICAgbGFtYmRhUHVycG9zZTogJ0N1c3RvbTo6Q0RLRUNSRGVwbG95bWVudCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbSByZXNvdXJjZSBoYW5kbGVyIGZvciBjb3B5aW5nIERvY2tlciBpbWFnZXMgYmV0d2VlbiBkb2NrZXIgcmVnaXN0cmllcy4nLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgbWVtb3J5U2l6ZTogbWVtb3J5TGltaXQsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICBzZWN1cml0eUdyb3VwczogcHJvcHMuc2VjdXJpdHlHcm91cHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVyUm9sZSA9IHRoaXMuaGFuZGxlci5yb2xlO1xuICAgIGlmICghaGFuZGxlclJvbGUpIHsgdGhyb3cgbmV3IEVycm9yKCdsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24gc2hvdWxkIGhhdmUgY3JlYXRlZCBhIFJvbGUnKTsgfVxuXG4gICAgaGFuZGxlclJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgICAnZWNyOkdldFJlcG9zaXRvcnlQb2xpY3knLFxuICAgICAgICAgICdlY3I6RGVzY3JpYmVSZXBvc2l0b3JpZXMnLFxuICAgICAgICAgICdlY3I6TGlzdEltYWdlcycsXG4gICAgICAgICAgJ2VjcjpEZXNjcmliZUltYWdlcycsXG4gICAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgICAnZWNyOkxpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgICAgICdlY3I6RGVzY3JpYmVJbWFnZVNjYW5GaW5kaW5ncycsXG4gICAgICAgICAgJ2VjcjpJbml0aWF0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyOlVwbG9hZExheWVyUGFydCcsXG4gICAgICAgICAgJ2VjcjpDb21wbGV0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyOlB1dEltYWdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pKTtcbiAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQXV0by1hdHRhY2ggcHVibGljIEVDUiBwZXJtaXNzaW9ucyB3aGVuIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHB1YmxpYyBFQ1IgcmVnaXN0cnkuXG4gICAgLy8gV2hlbiBkZXN0IGlzIHB1YmxpYyBFQ1IsIHRoZSBhdXRoIHRva2VuIHBlcm1pc3Npb25zIGFsc28gY292ZXIgc291cmNlLXNpZGUgYXV0aFxuICAgIC8vIGlmIHRoZSBzb3VyY2UgaGFwcGVucyB0byBiZSBwdWJsaWMgRUNSIHRvby5cbiAgICBpZiAocHJvcHMuZGVzdC51cmkuaW5jbHVkZXMoJ3B1YmxpYy5lY3IuYXdzJykpIHtcbiAgICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Vjci1wdWJsaWM6R2V0QXV0aG9yaXphdGlvblRva2VuJyxcbiAgICAgICAgICAnc3RzOkdldFNlcnZpY2VCZWFyZXJUb2tlbicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG5cbiAgICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Vjci1wdWJsaWM6QmF0Y2hDaGVja0xheWVyQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAnZWNyLXB1YmxpYzpJbml0aWF0ZUxheWVyVXBsb2FkJyxcbiAgICAgICAgICAnZWNyLXB1YmxpYzpVcGxvYWRMYXllclBhcnQnLFxuICAgICAgICAgICdlY3ItcHVibGljOkNvbXBsZXRlTGF5ZXJVcGxvYWQnLFxuICAgICAgICAgICdlY3ItcHVibGljOlB1dEltYWdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgLy8gUHVibGljIEVDUiBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgJ2F3cycgcGFydGl0aW9uIChub3QgYXdzLWNuIG9yIGF3cy11cy1nb3YpXG4gICAgICAgICAgQXJuLmZvcm1hdCh7XG4gICAgICAgICAgICBwYXJ0aXRpb246ICdhd3MnLFxuICAgICAgICAgICAgc2VydmljZTogJ2Vjci1wdWJsaWMnLFxuICAgICAgICAgICAgcmVnaW9uOiAnJyxcbiAgICAgICAgICAgIGFjY291bnQ6IEF3cy5BQ0NPVU5UX0lELFxuICAgICAgICAgICAgcmVzb3VyY2U6ICdyZXBvc2l0b3J5JyxcbiAgICAgICAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgICAgIH0sIFN0YWNrLm9mKHRoaXMpKSxcbiAgICAgICAgXSxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnNyYy51cmkuaW5jbHVkZXMoJ3B1YmxpYy5lY3IuYXdzJykpIHtcbiAgICAgIC8vIFdoZW4gcmVhZGluZyBmcm9tIHB1YmxpYyBFQ1IsIHRoZSBMYW1iZGEgc3RpbGwgYXV0aGVudGljYXRlcyB2aWFcbiAgICAgIC8vIGVjci1wdWJsaWM6R2V0QXV0aG9yaXphdGlvblRva2VuLiBHcmFudCB0aGUgbWluaW1hbCByZWFkLWF1dGggcGVybWlzc2lvbnMuXG4gICAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlY3ItcHVibGljOkdldEF1dGhvcml6YXRpb25Ub2tlbicsXG4gICAgICAgICAgJ3N0czpHZXRTZXJ2aWNlQmVhcmVyVG9rZW4nLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5pbWFnZUFyY2ggJiYgcHJvcHMuY29weUltYWdlSW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW1hZ2VBcmNoIGFuZCBjb3B5SW1hZ2VJbmRleCBjYW5ub3QgYm90aCBiZSBzZXQnKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5jb3B5SW1hZ2VJbmRleCAmJiBwcm9wcy5hcmNoSW1hZ2VUYWdzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FyY2hJbWFnZVRhZ3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gY29weUltYWdlSW5kZXggaXMgdHJ1ZScpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaW1hZ2VBcmNoICYmIHByb3BzLmltYWdlQXJjaC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW1hZ2VBcmNoIG11c3QgY29udGFpbiBleGFjdGx5IDEgZWxlbWVudCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuaW1hZ2VBcmNoKX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VBcmNoID0gcHJvcHMuaW1hZ2VBcmNoID8gcHJvcHMuaW1hZ2VBcmNoWzBdIDogJyc7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0N1c3RvbVJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICAvLyBUaGlzIGhhcyBiZWVuIGNvcHkvcGFzdGVkIGFuZCBpcyBhIHB1cmUgbGllLCBidXQgY2hhbmdpbmcgaXQgaXMgZ29pbmcgdG8gY2hhbmdlIHBlb3BsZSdzIGluZnJhISEgWChcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6Q0RLRUNSRGVwbG95bWVudCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNyY0ltYWdlOiBwcm9wcy5zcmMudXJpLFxuICAgICAgICBTcmNDcmVkczogcHJvcHMuc3JjLmNyZWRzLFxuICAgICAgICBEZXN0SW1hZ2U6IHByb3BzLmRlc3QudXJpLFxuICAgICAgICBEZXN0Q3JlZHM6IHByb3BzLmRlc3QuY3JlZHMsXG4gICAgICAgIC4uLmltYWdlQXJjaCA/IHsgSW1hZ2VBcmNoOiBpbWFnZUFyY2ggfSA6IHt9LFxuICAgICAgICAuLi5wcm9wcy5jb3B5SW1hZ2VJbmRleCA/IHsgQ29weUltYWdlSW5kZXg6IHByb3BzLmNvcHlJbWFnZUluZGV4IH0gOiB7fSxcbiAgICAgICAgLi4ucHJvcHMuYXJjaEltYWdlVGFncyA/IHsgQXJjaEltYWdlVGFnczogSlNPTi5zdHJpbmdpZnkocHJvcHMuYXJjaEltYWdlVGFncykgfSA6IHt9LFxuICAgICAgICAuLi5wcm9wcy5yZXRyeUNvbmZpZ3MgPyB7IFJldHJ5Q29uZmlnczogSlNPTi5zdHJpbmdpZnkocHJvcHMucmV0cnlDb25maWdzKSB9IDoge30sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGNvbnN0IGhhbmRsZXJSb2xlID0gdGhpcy5oYW5kbGVyLnJvbGU7XG4gICAgaWYgKCFoYW5kbGVyUm9sZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ2xhbWJkYS5TaW5nbGV0b25GdW5jdGlvbiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgUm9sZScpOyB9XG5cbiAgICByZXR1cm4gaGFuZGxlclJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU2luZ2xldG9uVXVpZChtZW1vcnlMaW1pdD86IG51bWJlcikge1xuICAgIGxldCB1dWlkID0gJ2JkMDdjOTMwLWVkYjktNDExMi1hMjBmLTAzZjA5NmY1MzY2Nic7XG5cbiAgICAvLyBpZiB1c2VyIHNwZWNpZnkgYSBjdXN0b20gbWVtb3J5IGxpbWl0LCBkZWZpbmUgYW5vdGhlciBzaW5nbGV0b24gaGFuZGxlclxuICAgIC8vIHdpdGggdGhpcyBjb25maWd1cmF0aW9uLiBvdGhlcndpc2UsIGl0IHdvbid0IGJlIHBvc3NpYmxlIHRvIHVzZSBtdWx0aXBsZVxuICAgIC8vIGNvbmZpZ3VyYXRpb25zIHNpbmNlIHdlIGhhdmUgYSBzaW5nbGV0b24uXG4gICAgaWYgKG1lbW9yeUxpbWl0KSB7XG4gICAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG1lbW9yeUxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgdXNlIHRva2VucyB3aGVuIHNwZWNpZnlpbmcgXCJtZW1vcnlMaW1pdFwiIHNpbmNlIHdlIHVzZSBpdCB0byBpZGVudGlmeSB0aGUgc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBoYW5kbGVyJyk7XG4gICAgICB9XG5cbiAgICAgIHV1aWQgKz0gYC0ke21lbW9yeUxpbWl0LnRvU3RyaW5nKCl9TWlCYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdXVpZDtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -74,6 +74,10 @@
74
74
  "aws-cdk-lib": "^2.80.0",
75
75
  "constructs": "^10.5.1"
76
76
  },
77
+ "resolutions": {
78
+ "@aws-cdk/integ-tests-alpha": "2.257.0-alpha.0",
79
+ "aws-cdk-lib": "2.257.0"
80
+ },
77
81
  "keywords": [
78
82
  "cdk"
79
83
  ],
@@ -89,7 +93,7 @@
89
93
  "publishConfig": {
90
94
  "access": "public"
91
95
  },
92
- "version": "4.2.8",
96
+ "version": "4.2.10",
93
97
  "packageManager": "yarn@4.13.0",
94
98
  "jest": {
95
99
  "coverageProvider": "v8",