@aws-cdk/aws-imagebuilder-alpha 2.229.1-alpha.0 → 2.231.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildWorkflows = exports.buildImageScanningConfiguration = exports.buildImageTestsConfiguration = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ /**
6
+ * Generates the image tests configuration property into the `ImageTestsConfiguration` type in the CloudFormation L1
7
+ * definition.
8
+ *
9
+ * @param props Props input for the construct
10
+ */
11
+ const buildImageTestsConfiguration = (props) => {
12
+ if (props.imageTestsEnabled === undefined) {
13
+ return undefined;
14
+ }
15
+ return { imageTestsEnabled: props.imageTestsEnabled };
16
+ };
17
+ exports.buildImageTestsConfiguration = buildImageTestsConfiguration;
18
+ /**
19
+ * Generates the image scanning configuration property into the `ImageScanningConfiguration` type in the CloudFormation
20
+ * L1 definition.
21
+ *
22
+ * @param scope The construct scope
23
+ * @param props Props input for the construct
24
+ */
25
+ const buildImageScanningConfiguration = (scope, props) => {
26
+ if (!props.recipe._isContainerRecipe() && props.imageScanningEcrRepository !== undefined) {
27
+ throw new cdk.ValidationError('imageScanningEcrRepository is only supported for container recipe builds', scope);
28
+ }
29
+ if (!props.recipe._isContainerRecipe() && props.imageScanningEcrTags !== undefined) {
30
+ throw new cdk.ValidationError('imageScanningEcrTags is only supported for container recipe builds', scope);
31
+ }
32
+ const ecrConfiguration = {
33
+ ...(props.imageScanningEcrRepository !== undefined && {
34
+ repositoryName: props.imageScanningEcrRepository.repositoryName,
35
+ }),
36
+ ...((props.imageScanningEcrTags ?? []).length && { containerTags: props.imageScanningEcrTags }),
37
+ };
38
+ const imageScanningConfiguration = {
39
+ ...(props.imageScanningEnabled !== undefined && { imageScanningEnabled: props.imageScanningEnabled }),
40
+ ...(Object.keys(ecrConfiguration).length && { ecrConfiguration }),
41
+ };
42
+ return Object.keys(imageScanningConfiguration).length ? imageScanningConfiguration : undefined;
43
+ };
44
+ exports.buildImageScanningConfiguration = buildImageScanningConfiguration;
45
+ /**
46
+ * Generates the workflows property into the `WorkflowConfiguration` type in the CloudFormation L1
47
+ * definition.
48
+ *
49
+ * @param props Props input for the construct
50
+ */
51
+ const buildWorkflows = (props) => {
52
+ const cfnWorkflows = props.workflows?.map((workflow) => {
53
+ const parameters = Object.entries(workflow.parameters ?? {}).map(([name, value]) => ({
54
+ name,
55
+ value: value.value,
56
+ }));
57
+ return {
58
+ workflowArn: workflow.workflow.workflowArn,
59
+ onFailure: workflow.onFailure,
60
+ parallelGroup: workflow.parallelGroup,
61
+ ...(parameters.length && { parameters }),
62
+ };
63
+ });
64
+ return cfnWorkflows?.length ? cfnWorkflows : undefined;
65
+ };
66
+ exports.buildWorkflows = buildWorkflows;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtYW5kLXBpcGVsaW5lLXByb3BzLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImltYWdlLWFuZC1waXBlbGluZS1wcm9wcy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBTW5DOzs7OztHQUtHO0FBQ0ksTUFBTSw0QkFBNEIsR0FBRyxDQUkxQyxLQUFhLEVBQ1EsRUFBRTtJQUN2QixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBYSxDQUFDO0FBQ25FLENBQUMsQ0FBQztBQVhXLFFBQUEsNEJBQTRCLGdDQVd2QztBQUVGOzs7Ozs7R0FNRztBQUNJLE1BQU0sK0JBQStCLEdBQUcsQ0FJN0MsS0FBZ0IsRUFDaEIsS0FBYSxFQUNRLEVBQUU7SUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMEVBQTBFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25GLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9FQUFvRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUE4QztRQUNsRSxHQUFHLENBQUMsS0FBSyxDQUFDLDBCQUEwQixLQUFLLFNBQVMsSUFBSTtZQUNwRCxjQUFjLEVBQUUsS0FBSyxDQUFDLDBCQUEwQixDQUFDLGNBQWM7U0FDaEUsQ0FBQztRQUNGLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDaEcsQ0FBQztJQUVGLE1BQU0sMEJBQTBCLEdBQUc7UUFDakMsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLElBQUksRUFBRSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNyRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7S0FDbEUsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsMEJBQXNDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5RyxDQUFDLENBQUM7QUE1QlcsUUFBQSwrQkFBK0IsbUNBNEIxQztBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxjQUFjLEdBQUcsQ0FJNUIsS0FBYSxFQUNRLEVBQUU7SUFDdkIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSTtZQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztTQUNuQixDQUFDLENBQUMsQ0FBQztRQUNKLE9BQU87WUFDTCxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXO1lBQzFDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7WUFDckMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztTQUN6QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFFLFlBQXdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFwQlcsUUFBQSxjQUFjLGtCQW9CekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuSW1hZ2UsIENmbkltYWdlUGlwZWxpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaW1hZ2VidWlsZGVyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW1hZ2VQcm9wcyB9IGZyb20gJy4uL2ltYWdlJztcbmltcG9ydCB7IEltYWdlUGlwZWxpbmVQcm9wcyB9IGZyb20gJy4uL2ltYWdlLXBpcGVsaW5lJztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGltYWdlIHRlc3RzIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW50byB0aGUgYEltYWdlVGVzdHNDb25maWd1cmF0aW9uYCB0eXBlIGluIHRoZSBDbG91ZEZvcm1hdGlvbiBMMVxuICogZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvcHMgUHJvcHMgaW5wdXQgZm9yIHRoZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkSW1hZ2VUZXN0c0NvbmZpZ3VyYXRpb24gPSA8XG4gIFByb3BzVCBleHRlbmRzIEltYWdlUGlwZWxpbmVQcm9wcyB8IEltYWdlUHJvcHMsXG4gIE91dHB1dFQgZXh0ZW5kcyBDZm5JbWFnZVBpcGVsaW5lLkltYWdlVGVzdHNDb25maWd1cmF0aW9uUHJvcGVydHkgfCBDZm5JbWFnZS5JbWFnZVRlc3RzQ29uZmlndXJhdGlvblByb3BlcnR5LFxuPihcbiAgcHJvcHM6IFByb3BzVCxcbik6IE91dHB1dFQgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAocHJvcHMuaW1hZ2VUZXN0c0VuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4geyBpbWFnZVRlc3RzRW5hYmxlZDogcHJvcHMuaW1hZ2VUZXN0c0VuYWJsZWQgfSBhcyBPdXRwdXRUO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGltYWdlIHNjYW5uaW5nIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW50byB0aGUgYEltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uYCB0eXBlIGluIHRoZSBDbG91ZEZvcm1hdGlvblxuICogTDEgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICogQHBhcmFtIHByb3BzIFByb3BzIGlucHV0IGZvciB0aGUgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZEltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uID0gPFxuICBQcm9wc1QgZXh0ZW5kcyBJbWFnZVBpcGVsaW5lUHJvcHMgfCBJbWFnZVByb3BzLFxuICBPdXRwdXRUIGV4dGVuZHMgQ2ZuSW1hZ2VQaXBlbGluZS5JbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvblByb3BlcnR5IHwgQ2ZuSW1hZ2UuSW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSxcbj4oXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHByb3BzOiBQcm9wc1QsXG4pOiBPdXRwdXRUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFwcm9wcy5yZWNpcGUuX2lzQ29udGFpbmVyUmVjaXBlKCkgJiYgcHJvcHMuaW1hZ2VTY2FubmluZ0VjclJlcG9zaXRvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdpbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY29udGFpbmVyIHJlY2lwZSBidWlsZHMnLCBzY29wZSk7XG4gIH1cblxuICBpZiAoIXByb3BzLnJlY2lwZS5faXNDb250YWluZXJSZWNpcGUoKSAmJiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2ltYWdlU2Nhbm5pbmdFY3JUYWdzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjb250YWluZXIgcmVjaXBlIGJ1aWxkcycsIHNjb3BlKTtcbiAgfVxuXG4gIGNvbnN0IGVjckNvbmZpZ3VyYXRpb246IENmbkltYWdlUGlwZWxpbmUuRWNyQ29uZmlndXJhdGlvblByb3BlcnR5ID0ge1xuICAgIC4uLihwcm9wcy5pbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeSAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeS5yZXBvc2l0b3J5TmFtZSxcbiAgICB9KSxcbiAgICAuLi4oKHByb3BzLmltYWdlU2Nhbm5pbmdFY3JUYWdzID8/IFtdKS5sZW5ndGggJiYgeyBjb250YWluZXJUYWdzOiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyVGFncyB9KSxcbiAgfTtcblxuICBjb25zdCBpbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAuLi4ocHJvcHMuaW1hZ2VTY2FubmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiB7IGltYWdlU2Nhbm5pbmdFbmFibGVkOiBwcm9wcy5pbWFnZVNjYW5uaW5nRW5hYmxlZCB9KSxcbiAgICAuLi4oT2JqZWN0LmtleXMoZWNyQ29uZmlndXJhdGlvbikubGVuZ3RoICYmIHsgZWNyQ29uZmlndXJhdGlvbiB9KSxcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoaW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb24pLmxlbmd0aCA/IChpbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiBhcyBPdXRwdXRUKSA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSB3b3JrZmxvd3MgcHJvcGVydHkgaW50byB0aGUgYFdvcmtmbG93Q29uZmlndXJhdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDFcbiAqIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIHByb3BzIFByb3BzIGlucHV0IGZvciB0aGUgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZFdvcmtmbG93cyA9IDxcbiAgUHJvcHNUIGV4dGVuZHMgSW1hZ2VQaXBlbGluZVByb3BzIHwgSW1hZ2VQcm9wcyxcbiAgT3V0cHV0VCBleHRlbmRzIENmbkltYWdlUGlwZWxpbmUuV29ya2Zsb3dDb25maWd1cmF0aW9uUHJvcGVydHlbXSB8IENmbkltYWdlLldvcmtmbG93Q29uZmlndXJhdGlvblByb3BlcnR5W10sXG4+KFxuICBwcm9wczogUHJvcHNULFxuKTogT3V0cHV0VCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGNmbldvcmtmbG93cyA9IHByb3BzLndvcmtmbG93cz8ubWFwKCh3b3JrZmxvdykgPT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5wYXJhbWV0ZXJzID8/IHt9KS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLnZhbHVlLFxuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2Zsb3dBcm46IHdvcmtmbG93LndvcmtmbG93LndvcmtmbG93QXJuLFxuICAgICAgb25GYWlsdXJlOiB3b3JrZmxvdy5vbkZhaWx1cmUsXG4gICAgICBwYXJhbGxlbEdyb3VwOiB3b3JrZmxvdy5wYXJhbGxlbEdyb3VwLFxuICAgICAgLi4uKHBhcmFtZXRlcnMubGVuZ3RoICYmIHsgcGFyYW1ldGVycyB9KSxcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4gY2ZuV29ya2Zsb3dzPy5sZW5ndGggPyAoY2ZuV29ya2Zsb3dzIGFzIE91dHB1dFQpIDogdW5kZWZpbmVkO1xufTtcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import * as logs from 'aws-cdk-lib/aws-logs';
3
+ import { Construct } from 'constructs';
4
+ import { ImageProps } from '../image';
5
+ import { ImagePipelineProps } from '../image-pipeline';
6
+ import { WorkflowConfiguration } from '../workflow';
7
+ /**
8
+ * Returns the default execution role policy, for auto-generated execution roles.
9
+ *
10
+ * @param scope The construct scope
11
+ * @param props Props input for the construct
12
+ *
13
+ * @see https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSServiceRoleForImageBuilder.html
14
+ */
15
+ export declare const defaultExecutionRolePolicy: <PropsT extends ImagePipelineProps | ImageProps>(scope: Construct, props?: PropsT) => iam.PolicyStatement[];
16
+ export declare const getExecutionRole: (scope: Construct, grantDefaultExecutionRolePermissions: (grantee: iam.IGrantable) => void, { executionRole, workflows, imageLogGroup, imagePipelineLogGroup, }: {
17
+ executionRole?: iam.IRole;
18
+ imageLogGroup?: logs.ILogGroup;
19
+ imagePipelineLogGroup?: logs.ILogGroup;
20
+ workflows?: WorkflowConfiguration[];
21
+ }) => iam.IRole | undefined;
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExecutionRole = exports.defaultExecutionRolePolicy = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const iam = require("aws-cdk-lib/aws-iam");
6
+ /**
7
+ * Returns the default execution role policy, for auto-generated execution roles.
8
+ *
9
+ * @param scope The construct scope
10
+ * @param props Props input for the construct
11
+ *
12
+ * @see https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSServiceRoleForImageBuilder.html
13
+ */
14
+ const defaultExecutionRolePolicy = (scope, props) => {
15
+ const stack = cdk.Stack.of(scope);
16
+ const partition = stack.partition;
17
+ const region = stack.region;
18
+ const account = stack.account;
19
+ // Permissions are identical to https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSServiceRoleForImageBuilder.html
20
+ // SLR policies cannot be attached to roles, and no managed policy exists for these permissions yet
21
+ const policies = [
22
+ new iam.PolicyStatement({
23
+ effect: iam.Effect.ALLOW,
24
+ actions: ['ec2:RegisterImage'],
25
+ resources: [`arn:${partition}:ec2:*::image/*`],
26
+ conditions: {
27
+ StringEquals: {
28
+ 'aws:RequestTag/CreatedBy': 'EC2 Image Builder',
29
+ },
30
+ },
31
+ }),
32
+ new iam.PolicyStatement({
33
+ effect: iam.Effect.ALLOW,
34
+ actions: ['ec2:RegisterImage'],
35
+ resources: [`arn:${partition}:ec2:*::snapshot/*`],
36
+ conditions: {
37
+ StringEquals: {
38
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
39
+ },
40
+ },
41
+ }),
42
+ new iam.PolicyStatement({
43
+ effect: iam.Effect.ALLOW,
44
+ actions: ['ec2:RunInstances'],
45
+ resources: [
46
+ `arn:${partition}:ec2:*::image/*`,
47
+ `arn:${partition}:ec2:*::snapshot/*`,
48
+ `arn:${partition}:ec2:*:*:subnet/*`,
49
+ `arn:${partition}:ec2:*:*:network-interface/*`,
50
+ `arn:${partition}:ec2:*:*:security-group/*`,
51
+ `arn:${partition}:ec2:*:*:key-pair/*`,
52
+ `arn:${partition}:ec2:*:*:launch-template/*`,
53
+ `arn:${partition}:license-manager:*:*:license-configuration:*`,
54
+ ],
55
+ }),
56
+ new iam.PolicyStatement({
57
+ effect: iam.Effect.ALLOW,
58
+ actions: ['ec2:RunInstances'],
59
+ resources: [`arn:${partition}:ec2:*:*:volume/*`, `arn:${partition}:ec2:*:*:instance/*`],
60
+ conditions: {
61
+ StringEquals: {
62
+ 'aws:RequestTag/CreatedBy': ['EC2 Image Builder', 'EC2 Fast Launch'],
63
+ },
64
+ },
65
+ }),
66
+ new iam.PolicyStatement({
67
+ effect: iam.Effect.ALLOW,
68
+ actions: ['iam:PassRole'],
69
+ resources: ['*'],
70
+ conditions: {
71
+ StringEquals: {
72
+ 'iam:PassedToService': ['ec2.amazonaws.com', 'ec2.amazonaws.com.cn', 'vmie.amazonaws.com'],
73
+ },
74
+ },
75
+ }),
76
+ new iam.PolicyStatement({
77
+ effect: iam.Effect.ALLOW,
78
+ actions: ['ec2:StopInstances', 'ec2:StartInstances', 'ec2:TerminateInstances'],
79
+ resources: ['*'],
80
+ conditions: {
81
+ StringEquals: {
82
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
83
+ },
84
+ },
85
+ }),
86
+ new iam.PolicyStatement({
87
+ effect: iam.Effect.ALLOW,
88
+ actions: [
89
+ 'ec2:CopyImage',
90
+ 'ec2:CreateImage',
91
+ 'ec2:CreateLaunchTemplate',
92
+ 'ec2:DeregisterImage',
93
+ 'ec2:DescribeImages',
94
+ 'ec2:DescribeInstanceAttribute',
95
+ 'ec2:DescribeInstanceStatus',
96
+ 'ec2:DescribeInstances',
97
+ 'ec2:DescribeInstanceTypeOfferings',
98
+ 'ec2:DescribeInstanceTypes',
99
+ 'ec2:DescribeSubnets',
100
+ 'ec2:DescribeTags',
101
+ 'ec2:ModifyImageAttribute',
102
+ 'ec2:DescribeImportImageTasks',
103
+ 'ec2:DescribeSnapshots',
104
+ 'ec2:DescribeHosts',
105
+ ],
106
+ resources: ['*'],
107
+ }),
108
+ new iam.PolicyStatement({
109
+ effect: iam.Effect.ALLOW,
110
+ actions: ['ec2:ModifySnapshotAttribute'],
111
+ resources: [`arn:${partition}:ec2:*::snapshot/*`],
112
+ conditions: {
113
+ StringEquals: {
114
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
115
+ },
116
+ },
117
+ }),
118
+ new iam.PolicyStatement({
119
+ effect: iam.Effect.ALLOW,
120
+ actions: ['ec2:CreateTags'],
121
+ resources: ['*'],
122
+ conditions: {
123
+ StringEquals: {
124
+ 'ec2:CreateAction': ['RunInstances', 'CreateImage'],
125
+ 'aws:RequestTag/CreatedBy': ['EC2 Image Builder', 'EC2 Fast Launch'],
126
+ },
127
+ },
128
+ }),
129
+ new iam.PolicyStatement({
130
+ effect: iam.Effect.ALLOW,
131
+ actions: ['ec2:CreateTags'],
132
+ resources: [`arn:${partition}:ec2:*::image/*`, `arn:${partition}:ec2:*:*:export-image-task/*`],
133
+ }),
134
+ new iam.PolicyStatement({
135
+ effect: iam.Effect.ALLOW,
136
+ actions: ['ec2:CreateTags'],
137
+ resources: [`arn:${partition}:ec2:*::snapshot/*`, `arn:${partition}:ec2:*:*:launch-template/*`],
138
+ conditions: {
139
+ StringEquals: {
140
+ 'aws:RequestTag/CreatedBy': ['EC2 Image Builder', 'EC2 Fast Launch'],
141
+ },
142
+ },
143
+ }),
144
+ new iam.PolicyStatement({
145
+ effect: iam.Effect.ALLOW,
146
+ actions: ['sns:Publish'],
147
+ resources: [`arn:${partition}:sns:${region}:${account}:*`],
148
+ }),
149
+ new iam.PolicyStatement({
150
+ effect: iam.Effect.ALLOW,
151
+ actions: [
152
+ 'ssm:ListCommands',
153
+ 'ssm:ListCommandInvocations',
154
+ 'ssm:AddTagsToResource',
155
+ 'ssm:DescribeInstanceInformation',
156
+ 'ssm:ListInventoryEntries',
157
+ 'ssm:DescribeInstanceAssociationsStatus',
158
+ 'ssm:DescribeAssociationExecutions',
159
+ 'ssm:GetCommandInvocation',
160
+ ],
161
+ resources: ['*'],
162
+ }),
163
+ new iam.PolicyStatement({
164
+ effect: iam.Effect.ALLOW,
165
+ actions: ['ssm:SendCommand'],
166
+ resources: [
167
+ `arn:${partition}:ssm:*:*:document/AWS-RunPowerShellScript`,
168
+ `arn:${partition}:ssm:*:*:document/AWS-RunShellScript`,
169
+ `arn:${partition}:ssm:*:*:document/AWSEC2-RunSysprep`,
170
+ `arn:${partition}:s3:::*`,
171
+ ],
172
+ }),
173
+ new iam.PolicyStatement({
174
+ effect: iam.Effect.ALLOW,
175
+ actions: ['ssm:SendCommand'],
176
+ resources: [`arn:${partition}:ec2:*:*:instance/*`],
177
+ conditions: {
178
+ StringEquals: {
179
+ 'ssm:resourceTag/CreatedBy': ['EC2 Image Builder'],
180
+ },
181
+ },
182
+ }),
183
+ new iam.PolicyStatement({
184
+ effect: iam.Effect.ALLOW,
185
+ actions: ['ssm:CreateAssociation', 'ssm:DeleteAssociation'],
186
+ resources: [
187
+ `arn:${partition}:ssm:*:*:document/AWS-GatherSoftwareInventory`,
188
+ `arn:${partition}:ssm:*:*:association/*`,
189
+ `arn:${partition}:ec2:*:*:instance/*`,
190
+ ],
191
+ }),
192
+ new iam.PolicyStatement({
193
+ effect: iam.Effect.ALLOW,
194
+ actions: [
195
+ 'kms:Encrypt',
196
+ 'kms:Decrypt',
197
+ 'kms:ReEncryptFrom',
198
+ 'kms:ReEncryptTo',
199
+ 'kms:GenerateDataKeyWithoutPlaintext',
200
+ ],
201
+ resources: ['*'],
202
+ conditions: {
203
+ 'ForAllValues:StringEquals': {
204
+ 'kms:EncryptionContextKeys': ['aws:ebs:id'],
205
+ },
206
+ 'StringLike': {
207
+ 'kms:ViaService': ['ec2.*.amazonaws.com'],
208
+ },
209
+ },
210
+ }),
211
+ new iam.PolicyStatement({
212
+ effect: iam.Effect.ALLOW,
213
+ actions: ['kms:DescribeKey'],
214
+ resources: ['*'],
215
+ conditions: {
216
+ StringLike: {
217
+ 'kms:ViaService': ['ec2.*.amazonaws.com'],
218
+ },
219
+ },
220
+ }),
221
+ new iam.PolicyStatement({
222
+ effect: iam.Effect.ALLOW,
223
+ actions: ['kms:CreateGrant'],
224
+ resources: ['*'],
225
+ conditions: {
226
+ Bool: {
227
+ 'kms:GrantIsForAWSResource': true,
228
+ },
229
+ StringLike: {
230
+ 'kms:ViaService': ['ec2.*.amazonaws.com'],
231
+ },
232
+ },
233
+ }),
234
+ new iam.PolicyStatement({
235
+ effect: iam.Effect.ALLOW,
236
+ actions: ['logs:CreateLogStream', 'logs:CreateLogGroup', 'logs:PutLogEvents'],
237
+ resources: [`arn:${partition}:logs:*:*:log-group:/aws/imagebuilder/*`],
238
+ }),
239
+ new iam.PolicyStatement({
240
+ effect: iam.Effect.ALLOW,
241
+ actions: ['iam:CreateServiceLinkedRole'],
242
+ resources: ['*'],
243
+ conditions: {
244
+ StringEquals: {
245
+ 'iam:AWSServiceName': ['ssm.amazonaws.com'],
246
+ },
247
+ },
248
+ }),
249
+ new iam.PolicyStatement({
250
+ effect: iam.Effect.ALLOW,
251
+ actions: [
252
+ 'events:DeleteRule',
253
+ 'events:DescribeRule',
254
+ 'events:PutRule',
255
+ 'events:PutTargets',
256
+ 'events:RemoveTargets',
257
+ ],
258
+ resources: [`arn:${partition}:events:*:*:rule/ImageBuilder-*`],
259
+ }),
260
+ new iam.PolicyStatement({
261
+ effect: iam.Effect.ALLOW,
262
+ actions: ['ssm:GetParameter', 'ssm:PutParameter'],
263
+ resources: [`arn:${partition}:ssm:*:*:parameter/imagebuilder/*`],
264
+ }),
265
+ new iam.PolicyStatement({
266
+ effect: iam.Effect.ALLOW,
267
+ actions: ['ssm:GetParameter'],
268
+ resources: [`arn:${partition}:ssm:*::parameter/aws/service/*`],
269
+ }),
270
+ ];
271
+ const hasProps = props !== undefined;
272
+ if (!hasProps || (props.recipe._isImageRecipe() && props.distributionConfiguration !== undefined)) {
273
+ // Distribution-specific permissions if distribution settings are provided. All permissions here are for AMI builds
274
+ // specifically.
275
+ policies.push(new iam.PolicyStatement({
276
+ effect: iam.Effect.ALLOW,
277
+ actions: ['ec2:DescribeExportImageTasks'],
278
+ resources: ['*'],
279
+ }), new iam.PolicyStatement({
280
+ effect: iam.Effect.ALLOW,
281
+ actions: ['license-manager:UpdateLicenseSpecificationsForResource'],
282
+ resources: [`arn:${partition}:license-manager:*:${account}:license-configuration:*`],
283
+ }), new iam.PolicyStatement({
284
+ effect: iam.Effect.ALLOW,
285
+ actions: ['sts:AssumeRole'],
286
+ resources: [`arn:${partition}:iam::*:role/EC2ImageBuilderDistributionCrossAccountRole`],
287
+ }), new iam.PolicyStatement({
288
+ effect: iam.Effect.ALLOW,
289
+ actions: ['ec2:DescribeLaunchTemplates', 'ec2:DescribeLaunchTemplateVersions'],
290
+ resources: ['*'],
291
+ }), new iam.PolicyStatement({
292
+ effect: iam.Effect.ALLOW,
293
+ actions: ['ec2:CreateLaunchTemplateVersion', 'ec2:ModifyLaunchTemplate'],
294
+ resources: [`arn:${partition}:ec2:${region}:${account}:launch-template/*`],
295
+ }), new iam.PolicyStatement({
296
+ effect: iam.Effect.ALLOW,
297
+ actions: ['ec2:ExportImage'],
298
+ resources: [`arn:${partition}:ec2:*::image/*`],
299
+ conditions: {
300
+ StringEquals: {
301
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
302
+ },
303
+ },
304
+ }), new iam.PolicyStatement({
305
+ effect: iam.Effect.ALLOW,
306
+ actions: ['ec2:ExportImage'],
307
+ resources: [`arn:${partition}:ec2:*:*:export-image-task/*`],
308
+ }), new iam.PolicyStatement({
309
+ effect: iam.Effect.ALLOW,
310
+ actions: ['ec2:CancelExportTask'],
311
+ resources: [`arn:${partition}:ec2:*:*:export-image-task/*`],
312
+ conditions: {
313
+ StringEquals: {
314
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
315
+ },
316
+ },
317
+ }), new iam.PolicyStatement({
318
+ effect: iam.Effect.ALLOW,
319
+ actions: ['iam:CreateServiceLinkedRole'],
320
+ resources: ['*'],
321
+ conditions: {
322
+ StringEquals: {
323
+ 'iam:AWSServiceName': ['ec2fastlaunch.amazonaws.com'],
324
+ },
325
+ },
326
+ }), new iam.PolicyStatement({
327
+ effect: iam.Effect.ALLOW,
328
+ actions: ['ec2:EnableFastLaunch'],
329
+ resources: [`arn:${partition}:ec2:*::image/*`, `arn:${partition}:ec2:*:*:launch-template/*`],
330
+ conditions: {
331
+ StringEquals: {
332
+ 'ec2:ResourceTag/CreatedBy': 'EC2 Image Builder',
333
+ },
334
+ },
335
+ }));
336
+ }
337
+ if (!hasProps || props.imageScanningEnabled !== false) {
338
+ // Add Inspector permissions if scanning is enabled
339
+ policies.push(new iam.PolicyStatement({
340
+ effect: iam.Effect.ALLOW,
341
+ actions: ['inspector2:ListCoverage', 'inspector2:ListFindings'],
342
+ resources: ['*'],
343
+ }));
344
+ // Add image scanning ECR permissions for container builds
345
+ if (!hasProps || props.recipe._isContainerRecipe()) {
346
+ policies.push(new iam.PolicyStatement({
347
+ effect: iam.Effect.ALLOW,
348
+ actions: ['ecr:CreateRepository'],
349
+ resources: ['*'],
350
+ conditions: {
351
+ StringEquals: {
352
+ 'aws:RequestTag/CreatedBy': 'EC2 Image Builder',
353
+ },
354
+ },
355
+ }), new iam.PolicyStatement({
356
+ effect: iam.Effect.ALLOW,
357
+ actions: ['ecr:TagResource'],
358
+ resources: [`arn:${partition}:ecr:*:*:repository/image-builder-*`],
359
+ conditions: {
360
+ StringEquals: {
361
+ 'aws:RequestTag/CreatedBy': 'EC2 Image Builder',
362
+ },
363
+ },
364
+ }), new iam.PolicyStatement({
365
+ effect: iam.Effect.ALLOW,
366
+ actions: ['ecr:BatchDeleteImage'],
367
+ resources: [`arn:${partition}:ecr:*:*:repository/image-builder-*`],
368
+ conditions: {
369
+ StringEquals: {
370
+ 'ecr:ResourceTag/CreatedBy': 'EC2 Image Builder',
371
+ },
372
+ },
373
+ }));
374
+ }
375
+ }
376
+ return policies;
377
+ };
378
+ exports.defaultExecutionRolePolicy = defaultExecutionRolePolicy;
379
+ const getExecutionRole = (scope, grantDefaultExecutionRolePermissions, { executionRole, workflows, imageLogGroup, imagePipelineLogGroup, }) => {
380
+ const { executionRoleRequired, applyGrants } = getExecutionRoleRequirements({
381
+ workflows,
382
+ imageLogGroup,
383
+ imagePipelineLogGroup,
384
+ });
385
+ if (!executionRoleRequired) {
386
+ return executionRole;
387
+ }
388
+ if (executionRole !== undefined) {
389
+ applyGrants(executionRole);
390
+ return executionRole;
391
+ }
392
+ const autoGeneratedExecutionRole = new iam.Role(scope, 'ExecutionRole', {
393
+ assumedBy: new iam.ServicePrincipal('imagebuilder.amazonaws.com'),
394
+ });
395
+ grantDefaultExecutionRolePermissions(autoGeneratedExecutionRole);
396
+ applyGrants(autoGeneratedExecutionRole);
397
+ return autoGeneratedExecutionRole;
398
+ };
399
+ exports.getExecutionRole = getExecutionRole;
400
+ const getExecutionRoleRequirements = ({ workflows, imageLogGroup, imagePipelineLogGroup, }) => {
401
+ const granters = [];
402
+ const hasWorkflows = Boolean(workflows?.length);
403
+ const addImageLogGroupPermissions = imageLogGroup !== undefined &&
404
+ !cdk.Token.isUnresolved(imageLogGroup.logGroupName) &&
405
+ !imageLogGroup.logGroupName.startsWith('/aws/imagebuilder/');
406
+ const addPipelineLogGroupPermissions = imagePipelineLogGroup !== undefined &&
407
+ !cdk.Token.isUnresolved(imagePipelineLogGroup.logGroupName) &&
408
+ !imagePipelineLogGroup.logGroupName.startsWith('/aws/imagebuilder/');
409
+ if (addImageLogGroupPermissions) {
410
+ granters.push((role) => imageLogGroup.grantWrite(role));
411
+ }
412
+ if (addPipelineLogGroupPermissions) {
413
+ granters.push((role) => imagePipelineLogGroup.grantWrite(role));
414
+ }
415
+ return {
416
+ executionRoleRequired: hasWorkflows || addImageLogGroupPermissions || addPipelineLogGroupPermissions,
417
+ applyGrants: (role) => granters.forEach((granter) => granter(role)),
418
+ };
419
+ };
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvbGljeS1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQU8zQzs7Ozs7OztHQU9HO0FBQ0ksTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxLQUFnQixFQUNoQixLQUFjLEVBQ1MsRUFBRTtJQUN6QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUU5QixrSUFBa0k7SUFDbEksbUdBQW1HO0lBQ25HLE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDOUIsU0FBUyxFQUFFLENBQUMsT0FBTyxTQUFTLGlCQUFpQixDQUFDO1lBQzlDLFVBQVUsRUFBRTtnQkFDVixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsbUJBQW1CO2lCQUNoRDthQUNGO1NBQ0YsQ0FBQztRQUNGLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO1lBQzlCLFNBQVMsRUFBRSxDQUFDLE9BQU8sU0FBUyxvQkFBb0IsQ0FBQztZQUNqRCxVQUFVLEVBQUU7Z0JBQ1YsWUFBWSxFQUFFO29CQUNaLDJCQUEyQixFQUFFLG1CQUFtQjtpQkFDakQ7YUFDRjtTQUNGLENBQUM7UUFD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SUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTztRQUNMLHFCQUFxQixFQUFFLFlBQVksSUFBSSwyQkFBMkIsSUFBSSw4QkFBOEI7UUFDcEcsV0FBVyxFQUFFLENBQUMsSUFBZSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW1hZ2VQcm9wcyB9IGZyb20gJy4uL2ltYWdlJztcbmltcG9ydCB7IEltYWdlUGlwZWxpbmVQcm9wcyB9IGZyb20gJy4uL2ltYWdlLXBpcGVsaW5lJztcbmltcG9ydCB7IFdvcmtmbG93Q29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3dvcmtmbG93JztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGV4ZWN1dGlvbiByb2xlIHBvbGljeSwgZm9yIGF1dG8tZ2VuZXJhdGVkIGV4ZWN1dGlvbiByb2xlcy5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICogQHBhcmFtIHByb3BzIFByb3BzIGlucHV0IGZvciB0aGUgY29uc3RydWN0XG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXdzLW1hbmFnZWQtcG9saWN5L2xhdGVzdC9yZWZlcmVuY2UvQVdTU2VydmljZVJvbGVGb3JJbWFnZUJ1aWxkZXIuaHRtbFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4ZWN1dGlvblJvbGVQb2xpY3kgPSA8UHJvcHNUIGV4dGVuZHMgSW1hZ2VQaXBlbGluZVByb3BzIHwgSW1hZ2VQcm9wcz4oXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHByb3BzPzogUHJvcHNULFxuKTogaWFtLlBvbGljeVN0YXRlbWVudFtdID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBjZGsuU3RhY2sub2Yoc2NvcGUpO1xuICBjb25zdCBwYXJ0aXRpb24gPSBzdGFjay5wYXJ0aXRpb247XG4gIGNvbnN0IHJlZ2lvbiA9IHN0YWNrLnJlZ2lvbjtcbiAgY29uc3QgYWNjb3VudCA9IHN0YWNrLmFjY291bnQ7XG5cbiAgLy8gUGVybWlzc2lvbnMgYXJlIGlkZW50aWNhbCB0byBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXdzLW1hbmFnZWQtcG9saWN5L2xhdGVzdC9yZWZlcmVuY2UvQVdTU2VydmljZVJvbGVGb3JJbWFnZUJ1aWxkZXIuaHRtbFxuICAvLyBTTFIgcG9saWNpZXMgY2Fubm90IGJlIGF0dGFjaGVkIHRvIHJvbGVzLCBhbmQgbm8gbWFuYWdlZCBwb2xpY3kgZXhpc3RzIGZvciB0aGVzZSBwZXJtaXNzaW9ucyB5ZXRcbiAgY29uc3QgcG9saWNpZXMgPSBbXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6UmVnaXN0ZXJJbWFnZSddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOio6OmltYWdlLypgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpSZXF1ZXN0VGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOlJlZ2lzdGVySW1hZ2UnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjpzbmFwc2hvdC8qYF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdlYzI6UmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6UnVuSW5zdGFuY2VzJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6OmltYWdlLypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6c25hcHNob3QvKmAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6c3VibmV0LypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOm5ldHdvcmstaW50ZXJmYWNlLypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOnNlY3VyaXR5LWdyb3VwLypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmtleS1wYWlyLypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmxhdW5jaC10ZW1wbGF0ZS8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06bGljZW5zZS1tYW5hZ2VyOio6KjpsaWNlbnNlLWNvbmZpZ3VyYXRpb246KmAsXG4gICAgICBdLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOlJ1bkluc3RhbmNlcyddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOio6Kjp2b2x1bWUvKmAsIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6aW5zdGFuY2UvKmBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnYXdzOlJlcXVlc3RUYWcvQ3JlYXRlZEJ5JzogWydFQzIgSW1hZ2UgQnVpbGRlcicsICdFQzIgRmFzdCBMYXVuY2gnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydpYW06UGFzc1JvbGUnXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogWydlYzIuYW1hem9uYXdzLmNvbScsICdlYzIuYW1hem9uYXdzLmNvbS5jbicsICd2bWllLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6U3RvcEluc3RhbmNlcycsICdlYzI6U3RhcnRJbnN0YW5jZXMnLCAnZWMyOlRlcm1pbmF0ZUluc3RhbmNlcyddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2VjMjpSZXNvdXJjZVRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdlYzI6Q29weUltYWdlJyxcbiAgICAgICAgJ2VjMjpDcmVhdGVJbWFnZScsXG4gICAgICAgICdlYzI6Q3JlYXRlTGF1bmNoVGVtcGxhdGUnLFxuICAgICAgICAnZWMyOkRlcmVnaXN0ZXJJbWFnZScsXG4gICAgICAgICdlYzI6RGVzY3JpYmVJbWFnZXMnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VTdGF0dXMnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlVHlwZU9mZmVyaW5ncycsXG4gICAgICAgICdlYzI6RGVzY3JpYmVJbnN0YW5jZVR5cGVzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZVN1Ym5ldHMnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlVGFncycsXG4gICAgICAgICdlYzI6TW9kaWZ5SW1hZ2VBdHRyaWJ1dGUnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW1wb3J0SW1hZ2VUYXNrcycsXG4gICAgICAgICdlYzI6RGVzY3JpYmVTbmFwc2hvdHMnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSG9zdHMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6TW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjpzbmFwc2hvdC8qYF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdlYzI6UmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6Q3JlYXRlVGFncyddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2VjMjpDcmVhdGVBY3Rpb24nOiBbJ1J1bkluc3RhbmNlcycsICdDcmVhdGVJbWFnZSddLFxuICAgICAgICAgICdhd3M6UmVxdWVzdFRhZy9DcmVhdGVkQnknOiBbJ0VDMiBJbWFnZSBCdWlsZGVyJywgJ0VDMiBGYXN0IExhdW5jaCddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2VjMjpDcmVhdGVUYWdzJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6aW1hZ2UvKmAsIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6ZXhwb3J0LWltYWdlLXRhc2svKmBdLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOkNyZWF0ZVRhZ3MnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjpzbmFwc2hvdC8qYCwgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpsYXVuY2gtdGVtcGxhdGUvKmBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnYXdzOlJlcXVlc3RUYWcvQ3JlYXRlZEJ5JzogWydFQzIgSW1hZ2UgQnVpbGRlcicsICdFQzIgRmFzdCBMYXVuY2gnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzbnM6UHVibGlzaCddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06c25zOiR7cmVnaW9ufToke2FjY291bnR9OipgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdzc206TGlzdENvbW1hbmRzJyxcbiAgICAgICAgJ3NzbTpMaXN0Q29tbWFuZEludm9jYXRpb25zJyxcbiAgICAgICAgJ3NzbTpBZGRUYWdzVG9SZXNvdXJjZScsXG4gICAgICAgICdzc206RGVzY3JpYmVJbnN0YW5jZUluZm9ybWF0aW9uJyxcbiAgICAgICAgJ3NzbTpMaXN0SW52ZW50b3J5RW50cmllcycsXG4gICAgICAgICdzc206RGVzY3JpYmVJbnN0YW5jZUFzc29jaWF0aW9uc1N0YXR1cycsXG4gICAgICAgICdzc206RGVzY3JpYmVBc3NvY2lhdGlvbkV4ZWN1dGlvbnMnLFxuICAgICAgICAnc3NtOkdldENvbW1hbmRJbnZvY2F0aW9uJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3NtOlNlbmRDb21tYW5kJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06c3NtOio6Kjpkb2N1bWVudC9BV1MtUnVuUG93ZXJTaGVsbFNjcmlwdGAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnNzbToqOio6ZG9jdW1lbnQvQVdTLVJ1blNoZWxsU2NyaXB0YCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06c3NtOio6Kjpkb2N1bWVudC9BV1NFQzItUnVuU3lzcHJlcGAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnMzOjo6KmAsXG4gICAgICBdLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3NtOlNlbmRDb21tYW5kJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmluc3RhbmNlLypgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ3NzbTpyZXNvdXJjZVRhZy9DcmVhdGVkQnknOiBbJ0VDMiBJbWFnZSBCdWlsZGVyJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3NtOkNyZWF0ZUFzc29jaWF0aW9uJywgJ3NzbTpEZWxldGVBc3NvY2lhdGlvbiddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnNzbToqOio6ZG9jdW1lbnQvQVdTLUdhdGhlclNvZnR3YXJlSW52ZW50b3J5YCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06c3NtOio6Kjphc3NvY2lhdGlvbi8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjppbnN0YW5jZS8qYCxcbiAgICAgIF0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAna21zOkVuY3J5cHQnLFxuICAgICAgICAna21zOkRlY3J5cHQnLFxuICAgICAgICAna21zOlJlRW5jcnlwdEZyb20nLFxuICAgICAgICAna21zOlJlRW5jcnlwdFRvJyxcbiAgICAgICAgJ2ttczpHZW5lcmF0ZURhdGFLZXlXaXRob3V0UGxhaW50ZXh0JyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAnRm9yQWxsVmFsdWVzOlN0cmluZ0VxdWFscyc6IHtcbiAgICAgICAgICAna21zOkVuY3J5cHRpb25Db250ZXh0S2V5cyc6IFsnYXdzOmViczppZCddLFxuICAgICAgICB9LFxuICAgICAgICAnU3RyaW5nTGlrZSc6IHtcbiAgICAgICAgICAna21zOlZpYVNlcnZpY2UnOiBbJ2VjMi4qLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydrbXM6RGVzY3JpYmVLZXknXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAna21zOlZpYVNlcnZpY2UnOiBbJ2VjMi4qLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydrbXM6Q3JlYXRlR3JhbnQnXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIEJvb2w6IHtcbiAgICAgICAgICAna21zOkdyYW50SXNGb3JBV1NSZXNvdXJjZSc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAna21zOlZpYVNlcnZpY2UnOiBbJ2VjMi4qLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsICdsb2dzOkNyZWF0ZUxvZ0dyb3VwJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTpsb2dzOio6Kjpsb2ctZ3JvdXA6L2F3cy9pbWFnZWJ1aWxkZXIvKmBdLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnaWFtOkNyZWF0ZVNlcnZpY2VMaW5rZWRSb2xlJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnaWFtOkFXU1NlcnZpY2VOYW1lJzogWydzc20uYW1hem9uYXdzLmNvbSddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdldmVudHM6RGVsZXRlUnVsZScsXG4gICAgICAgICdldmVudHM6RGVzY3JpYmVSdWxlJyxcbiAgICAgICAgJ2V2ZW50czpQdXRSdWxlJyxcbiAgICAgICAgJ2V2ZW50czpQdXRUYXJnZXRzJyxcbiAgICAgICAgJ2V2ZW50czpSZW1vdmVUYXJnZXRzJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTpldmVudHM6KjoqOnJ1bGUvSW1hZ2VCdWlsZGVyLSpgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3NzbTpHZXRQYXJhbWV0ZXInLCAnc3NtOlB1dFBhcmFtZXRlciddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06c3NtOio6KjpwYXJhbWV0ZXIvaW1hZ2VidWlsZGVyLypgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3NzbTpHZXRQYXJhbWV0ZXInXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OnNzbToqOjpwYXJhbWV0ZXIvYXdzL3NlcnZpY2UvKmBdLFxuICAgIH0pLFxuICBdO1xuXG4gIGNvbnN0IGhhc1Byb3BzID0gcHJvcHMgIT09IHVuZGVmaW5lZDtcbiAgaWYgKCFoYXNQcm9wcyB8fCAocHJvcHMucmVjaXBlLl9pc0ltYWdlUmVjaXBlKCkgJiYgcHJvcHMuZGlzdHJpYnV0aW9uQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSkge1xuICAgIC8vIERpc3RyaWJ1dGlvbi1zcGVjaWZpYyBwZXJtaXNzaW9ucyBpZiBkaXN0cmlidXRpb24gc2V0dGluZ3MgYXJlIHByb3ZpZGVkLiBBbGwgcGVybWlzc2lvbnMgaGVyZSBhcmUgZm9yIEFNSSBidWlsZHNcbiAgICAvLyBzcGVjaWZpY2FsbHkuXG4gICAgcG9saWNpZXMucHVzaChcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2VjMjpEZXNjcmliZUV4cG9ydEltYWdlVGFza3MnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnbGljZW5zZS1tYW5hZ2VyOlVwZGF0ZUxpY2Vuc2VTcGVjaWZpY2F0aW9uc0ZvclJlc291cmNlJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmxpY2Vuc2UtbWFuYWdlcjoqOiR7YWNjb3VudH06bGljZW5zZS1jb25maWd1cmF0aW9uOipgXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06aWFtOjoqOnJvbGUvRUMySW1hZ2VCdWlsZGVyRGlzdHJpYnV0aW9uQ3Jvc3NBY2NvdW50Um9sZWBdLFxuICAgICAgfSksXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6RGVzY3JpYmVMYXVuY2hUZW1wbGF0ZXMnLCAnZWMyOkRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucyddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6Q3JlYXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9uJywgJ2VjMjpNb2RpZnlMYXVuY2hUZW1wbGF0ZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6JHtyZWdpb259OiR7YWNjb3VudH06bGF1bmNoLXRlbXBsYXRlLypgXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnZWMyOkV4cG9ydEltYWdlJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjppbWFnZS8qYF0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICdlYzI6UmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6RXhwb3J0SW1hZ2UnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpleHBvcnQtaW1hZ2UtdGFzay8qYF0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2VjMjpDYW5jZWxFeHBvcnRUYXNrJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6ZXhwb3J0LWltYWdlLXRhc2svKmBdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnZWMyOlJlc291cmNlVGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnaWFtOkNyZWF0ZVNlcnZpY2VMaW5rZWRSb2xlJ10sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICdpYW06QVdTU2VydmljZU5hbWUnOiBbJ2VjMmZhc3RsYXVuY2guYW1hem9uYXdzLmNvbSddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2VjMjpFbmFibGVGYXN0TGF1bmNoJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjppbWFnZS8qYCwgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpsYXVuY2gtdGVtcGxhdGUvKmBdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnZWMyOlJlc291cmNlVGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BzIHx8IHByb3BzLmltYWdlU2Nhbm5pbmdFbmFibGVkICE9PSBmYWxzZSkge1xuICAgIC8vIEFkZCBJbnNwZWN0b3IgcGVybWlzc2lvbnMgaWYgc2Nhbm5pbmcgaXMgZW5hYmxlZFxuICAgIHBvbGljaWVzLnB1c2goXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydpbnNwZWN0b3IyOkxpc3RDb3ZlcmFnZScsICdpbnNwZWN0b3IyOkxpc3RGaW5kaW5ncyddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEFkZCBpbWFnZSBzY2FubmluZyBFQ1IgcGVybWlzc2lvbnMgZm9yIGNvbnRhaW5lciBidWlsZHNcbiAgICBpZiAoIWhhc1Byb3BzIHx8IHByb3BzLnJlY2lwZS5faXNDb250YWluZXJSZWNpcGUoKSkge1xuICAgICAgcG9saWNpZXMucHVzaChcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2VjcjpDcmVhdGVSZXBvc2l0b3J5J10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2F3czpSZXF1ZXN0VGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnZWNyOlRhZ1Jlc291cmNlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWNyOio6KjpyZXBvc2l0b3J5L2ltYWdlLWJ1aWxkZXItKmBdLFxuICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgICAnYXdzOlJlcXVlc3RUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydlY3I6QmF0Y2hEZWxldGVJbWFnZSddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjcjoqOio6cmVwb3NpdG9yeS9pbWFnZS1idWlsZGVyLSpgXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2VjcjpSZXNvdXJjZVRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvbGljaWVzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4ZWN1dGlvblJvbGUgPSAoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGdyYW50RGVmYXVsdEV4ZWN1dGlvblJvbGVQZXJtaXNzaW9uczogKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKSA9PiB2b2lkLFxuICB7XG4gICAgZXhlY3V0aW9uUm9sZSxcbiAgICB3b3JrZmxvd3MsXG4gICAgaW1hZ2VMb2dHcm91cCxcbiAgICBpbWFnZVBpcGVsaW5lTG9nR3JvdXAsXG4gIH06IHtcbiAgICBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuICAgIGltYWdlTG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcbiAgICBpbWFnZVBpcGVsaW5lTG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcbiAgICB3b3JrZmxvd3M/OiBXb3JrZmxvd0NvbmZpZ3VyYXRpb25bXTtcbiAgfSxcbik6IGlhbS5JUm9sZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHsgZXhlY3V0aW9uUm9sZVJlcXVpcmVkLCBhcHBseUdyYW50cyB9ID0gZ2V0RXhlY3V0aW9uUm9sZVJlcXVpcmVtZW50cyh7XG4gICAgd29ya2Zsb3dzLFxuICAgIGltYWdlTG9nR3JvdXAsXG4gICAgaW1hZ2VQaXBlbGluZUxvZ0dyb3VwLFxuICB9KTtcbiAgaWYgKCFleGVjdXRpb25Sb2xlUmVxdWlyZWQpIHtcbiAgICByZXR1cm4gZXhlY3V0aW9uUm9sZTtcbiAgfVxuXG4gIGlmIChleGVjdXRpb25Sb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhcHBseUdyYW50cyhleGVjdXRpb25Sb2xlKTtcbiAgICByZXR1cm4gZXhlY3V0aW9uUm9sZTtcbiAgfVxuXG4gIGNvbnN0IGF1dG9HZW5lcmF0ZWRFeGVjdXRpb25Sb2xlID0gbmV3IGlhbS5Sb2xlKHNjb3BlLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnaW1hZ2VidWlsZGVyLmFtYXpvbmF3cy5jb20nKSxcbiAgfSk7XG4gIGdyYW50RGVmYXVsdEV4ZWN1dGlvblJvbGVQZXJtaXNzaW9ucyhhdXRvR2VuZXJhdGVkRXhlY3V0aW9uUm9sZSk7XG4gIGFwcGx5R3JhbnRzKGF1dG9HZW5lcmF0ZWRFeGVjdXRpb25Sb2xlKTtcblxuICByZXR1cm4gYXV0b0dlbmVyYXRlZEV4ZWN1dGlvblJvbGU7XG59O1xuXG5jb25zdCBnZXRFeGVjdXRpb25Sb2xlUmVxdWlyZW1lbnRzID0gKHtcbiAgd29ya2Zsb3dzLFxuICBpbWFnZUxvZ0dyb3VwLFxuICBpbWFnZVBpcGVsaW5lTG9nR3JvdXAsXG59OiB7XG4gIGltYWdlTG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcbiAgaW1hZ2VQaXBlbGluZUxvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG4gIHdvcmtmbG93cz86IFdvcmtmbG93Q29uZmlndXJhdGlvbltdO1xufSk6IHsgZXhlY3V0aW9uUm9sZVJlcXVpcmVkOiBib29sZWFuOyBhcHBseUdyYW50czogKHJvbGU6IGlhbS5JUm9sZSkgPT4gdm9pZCB9ID0+IHtcbiAgY29uc3QgZ3JhbnRlcnM6IEFycmF5PChyb2xlOiBpYW0uSVJvbGUpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3QgaGFzV29ya2Zsb3dzID0gQm9vbGVhbih3b3JrZmxvd3M/Lmxlbmd0aCk7XG4gIGNvbnN0IGFkZEltYWdlTG9nR3JvdXBQZXJtaXNzaW9ucyA9XG4gICAgaW1hZ2VMb2dHcm91cCAhPT0gdW5kZWZpbmVkICYmXG4gICAgIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoaW1hZ2VMb2dHcm91cC5sb2dHcm91cE5hbWUpICYmXG4gICAgIWltYWdlTG9nR3JvdXAubG9nR3JvdXBOYW1lLnN0YXJ0c1dpdGgoJy9hd3MvaW1hZ2VidWlsZGVyLycpO1xuICBjb25zdCBhZGRQaXBlbGluZUxvZ0dyb3VwUGVybWlzc2lvbnMgPVxuICAgIGltYWdlUGlwZWxpbmVMb2dHcm91cCAhPT0gdW5kZWZpbmVkICYmXG4gICAgIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoaW1hZ2VQaXBlbGluZUxvZ0dyb3VwLmxvZ0dyb3VwTmFtZSkgJiZcbiAgICAhaW1hZ2VQaXBlbGluZUxvZ0dyb3VwLmxvZ0dyb3VwTmFtZS5zdGFydHNXaXRoKCcvYXdzL2ltYWdlYnVpbGRlci8nKTtcblxuICBpZiAoYWRkSW1hZ2VMb2dHcm91cFBlcm1pc3Npb25zKSB7XG4gICAgZ3JhbnRlcnMucHVzaCgocm9sZSkgPT4gaW1hZ2VMb2dHcm91cCEuZ3JhbnRXcml0ZShyb2xlKSk7XG4gIH1cblxuICBpZiAoYWRkUGlwZWxpbmVMb2dHcm91cFBlcm1pc3Npb25zKSB7XG4gICAgZ3JhbnRlcnMucHVzaCgocm9sZSkgPT4gaW1hZ2VQaXBlbGluZUxvZ0dyb3VwIS5ncmFudFdyaXRlKHJvbGUpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhlY3V0aW9uUm9sZVJlcXVpcmVkOiBoYXNXb3JrZmxvd3MgfHwgYWRkSW1hZ2VMb2dHcm91cFBlcm1pc3Npb25zIHx8IGFkZFBpcGVsaW5lTG9nR3JvdXBQZXJtaXNzaW9ucyxcbiAgICBhcHBseUdyYW50czogKHJvbGU6IGlhbS5JUm9sZSkgPT4gZ3JhbnRlcnMuZm9yRWFjaCgoZ3JhbnRlcikgPT4gZ3JhbnRlcihyb2xlKSksXG4gIH07XG59O1xuIl19
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * The parameter value for a component parameter
7
7
  */
8
8
  class ComponentParameterValue {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentParameterValue", version: "2.229.1-alpha.0" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentParameterValue", version: "2.231.0-alpha.0" };
10
10
  /**
11
11
  * The value of the parameter as a string
12
12
  *