@aws-cdk/aws-imagebuilder-alpha 2.229.0-alpha.0 → 2.230.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtYW5kLXBpcGVsaW5lLXByb3BzLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImltYWdlLWFuZC1waXBlbGluZS1wcm9wcy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBS25DOzs7OztHQUtHO0FBQ0ksTUFBTSw0QkFBNEIsR0FBRyxDQUkxQyxLQUFhLEVBQ1EsRUFBRTtJQUN2QixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBYSxDQUFDO0FBQ25FLENBQUMsQ0FBQztBQVhXLFFBQUEsNEJBQTRCLGdDQVd2QztBQUVGOzs7Ozs7R0FNRztBQUNJLE1BQU0sK0JBQStCLEdBQUcsQ0FJN0MsS0FBZ0IsRUFDaEIsS0FBYSxFQUNRLEVBQUU7SUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMEVBQTBFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25GLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9FQUFvRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUE4QztRQUNsRSxHQUFHLENBQUMsS0FBSyxDQUFDLDBCQUEwQixLQUFLLFNBQVMsSUFBSTtZQUNwRCxjQUFjLEVBQUUsS0FBSyxDQUFDLDBCQUEwQixDQUFDLGNBQWM7U0FDaEUsQ0FBQztRQUNGLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDaEcsQ0FBQztJQUVGLE1BQU0sMEJBQTBCLEdBQUc7UUFDakMsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLElBQUksRUFBRSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNyRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7S0FDbEUsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsMEJBQXNDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5RyxDQUFDLENBQUM7QUE1QlcsUUFBQSwrQkFBK0IsbUNBNEIxQztBQUVGOzs7OztHQUtHO0FBQ0ksTUFBTSxjQUFjLEdBQUcsQ0FJNUIsS0FBYSxFQUNRLEVBQUU7SUFDdkIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSTtZQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztTQUNuQixDQUFDLENBQUMsQ0FBQztRQUNKLE9BQU87WUFDTCxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXO1lBQzFDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7WUFDckMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztTQUN6QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFFLFlBQXdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFwQlcsUUFBQSxjQUFjLGtCQW9CekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuSW1hZ2UsIENmbkltYWdlUGlwZWxpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaW1hZ2VidWlsZGVyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW1hZ2VQaXBlbGluZVByb3BzIH0gZnJvbSAnLi4vaW1hZ2UtcGlwZWxpbmUnO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgaW1hZ2UgdGVzdHMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbnRvIHRoZSBgSW1hZ2VUZXN0c0NvbmZpZ3VyYXRpb25gIHR5cGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIEwxXG4gKiBkZWZpbml0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9wcyBQcm9wcyBpbnB1dCBmb3IgdGhlIGNvbnN0cnVjdFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRJbWFnZVRlc3RzQ29uZmlndXJhdGlvbiA9IDxcbiAgUHJvcHNUIGV4dGVuZHMgSW1hZ2VQaXBlbGluZVByb3BzLFxuICBPdXRwdXRUIGV4dGVuZHMgQ2ZuSW1hZ2VQaXBlbGluZS5JbWFnZVRlc3RzQ29uZmlndXJhdGlvblByb3BlcnR5IHwgQ2ZuSW1hZ2UuSW1hZ2VUZXN0c0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSxcbj4oXG4gIHByb3BzOiBQcm9wc1QsXG4pOiBPdXRwdXRUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHByb3BzLmltYWdlVGVzdHNFbmFibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHsgaW1hZ2VUZXN0c0VuYWJsZWQ6IHByb3BzLmltYWdlVGVzdHNFbmFibGVkIH0gYXMgT3V0cHV0VDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBpbWFnZSBzY2FubmluZyBjb25maWd1cmF0aW9uIHByb3BlcnR5IGludG8gdGhlIGBJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb25cbiAqIEwxIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAqIEBwYXJhbSBwcm9wcyBQcm9wcyBpbnB1dCBmb3IgdGhlIGNvbnN0cnVjdFxuICovXG5leHBvcnQgY29uc3QgYnVpbGRJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiA9IDxcbiAgUHJvcHNUIGV4dGVuZHMgSW1hZ2VQaXBlbGluZVByb3BzLFxuICBPdXRwdXRUIGV4dGVuZHMgQ2ZuSW1hZ2VQaXBlbGluZS5JbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvblByb3BlcnR5IHwgQ2ZuSW1hZ2UuSW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSxcbj4oXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHByb3BzOiBQcm9wc1QsXG4pOiBPdXRwdXRUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFwcm9wcy5yZWNpcGUuX2lzQ29udGFpbmVyUmVjaXBlKCkgJiYgcHJvcHMuaW1hZ2VTY2FubmluZ0VjclJlcG9zaXRvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdpbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY29udGFpbmVyIHJlY2lwZSBidWlsZHMnLCBzY29wZSk7XG4gIH1cblxuICBpZiAoIXByb3BzLnJlY2lwZS5faXNDb250YWluZXJSZWNpcGUoKSAmJiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2ltYWdlU2Nhbm5pbmdFY3JUYWdzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjb250YWluZXIgcmVjaXBlIGJ1aWxkcycsIHNjb3BlKTtcbiAgfVxuXG4gIGNvbnN0IGVjckNvbmZpZ3VyYXRpb246IENmbkltYWdlUGlwZWxpbmUuRWNyQ29uZmlndXJhdGlvblByb3BlcnR5ID0ge1xuICAgIC4uLihwcm9wcy5pbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeSAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyUmVwb3NpdG9yeS5yZXBvc2l0b3J5TmFtZSxcbiAgICB9KSxcbiAgICAuLi4oKHByb3BzLmltYWdlU2Nhbm5pbmdFY3JUYWdzID8/IFtdKS5sZW5ndGggJiYgeyBjb250YWluZXJUYWdzOiBwcm9wcy5pbWFnZVNjYW5uaW5nRWNyVGFncyB9KSxcbiAgfTtcblxuICBjb25zdCBpbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAuLi4ocHJvcHMuaW1hZ2VTY2FubmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiB7IGltYWdlU2Nhbm5pbmdFbmFibGVkOiBwcm9wcy5pbWFnZVNjYW5uaW5nRW5hYmxlZCB9KSxcbiAgICAuLi4oT2JqZWN0LmtleXMoZWNyQ29uZmlndXJhdGlvbikubGVuZ3RoICYmIHsgZWNyQ29uZmlndXJhdGlvbiB9KSxcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoaW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb24pLmxlbmd0aCA/IChpbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvbiBhcyBPdXRwdXRUKSA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSB3b3JrZmxvd3MgcHJvcGVydHkgaW50byB0aGUgYFdvcmtmbG93Q29uZmlndXJhdGlvbmAgdHlwZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gTDFcbiAqIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIHByb3BzIFByb3BzIGlucHV0IGZvciB0aGUgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZFdvcmtmbG93cyA9IDxcbiAgUHJvcHNUIGV4dGVuZHMgSW1hZ2VQaXBlbGluZVByb3BzLFxuICBPdXRwdXRUIGV4dGVuZHMgQ2ZuSW1hZ2VQaXBlbGluZS5Xb3JrZmxvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdIHwgQ2ZuSW1hZ2UuV29ya2Zsb3dDb25maWd1cmF0aW9uUHJvcGVydHlbXSxcbj4oXG4gIHByb3BzOiBQcm9wc1QsXG4pOiBPdXRwdXRUIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgY2ZuV29ya2Zsb3dzID0gcHJvcHMud29ya2Zsb3dzPy5tYXAoKHdvcmtmbG93KSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHdvcmtmbG93LnBhcmFtZXRlcnMgPz8ge30pLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUudmFsdWUsXG4gICAgfSkpO1xuICAgIHJldHVybiB7XG4gICAgICB3b3JrZmxvd0Fybjogd29ya2Zsb3cud29ya2Zsb3cud29ya2Zsb3dBcm4sXG4gICAgICBvbkZhaWx1cmU6IHdvcmtmbG93Lm9uRmFpbHVyZSxcbiAgICAgIHBhcmFsbGVsR3JvdXA6IHdvcmtmbG93LnBhcmFsbGVsR3JvdXAsXG4gICAgICAuLi4ocGFyYW1ldGVycy5sZW5ndGggJiYgeyBwYXJhbWV0ZXJzIH0pLFxuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiBjZm5Xb3JrZmxvd3M/Lmxlbmd0aCA/IChjZm5Xb3JrZmxvd3MgYXMgT3V0cHV0VCkgOiB1bmRlZmluZWQ7XG59O1xuIl19
@@ -0,0 +1,20 @@
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 { ImagePipelineProps } from '../image-pipeline';
5
+ import { WorkflowConfiguration } from '../workflow';
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
+ export declare const defaultExecutionRolePolicy: <PropsT extends ImagePipelineProps>(scope: Construct, props?: PropsT) => iam.PolicyStatement[];
15
+ export declare const getExecutionRole: (scope: Construct, grantDefaultExecutionRolePermissions: (grantee: iam.IGrantable) => void, { executionRole, workflows, imageLogGroup, imagePipelineLogGroup, }: {
16
+ executionRole?: iam.IRole;
17
+ imageLogGroup?: logs.ILogGroup;
18
+ imagePipelineLogGroup?: logs.ILogGroup;
19
+ workflows?: WorkflowConfiguration[];
20
+ }) => 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvbGljeS1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQU0zQzs7Ozs7OztHQU9HO0FBQ0ksTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxLQUFnQixFQUNoQixLQUFjLEVBQ1MsRUFBRTtJQUN6QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUU5QixrSUFBa0k7SUFDbEksbUdBQW1HO0lBQ25HLE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDOUIsU0FBUyxFQUFFLENBQUMsT0FBTyxTQUFTLGlCQUFpQixDQUFDO1lBQzlDLFVBQVUsRUFBRTtnQkFDVixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsbUJBQW1CO2lCQUNoRDthQUNGO1NBQ0YsQ0FBQztRQUNGLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO1lBQzlCLFNBQVMsRUFBRSxDQUFDLE9BQU8sU0FBUyxvQkFBb0IsQ0FBQztZQUNqRCxVQUFVLEVBQUU7Z0JBQ1YsWUFBWSxFQUFFO29CQUNaLDJCQUEyQixFQUFFLG1CQUFtQjtpQkFDakQ7YUFDRjtTQUNGLENBQUM7UUFD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SUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTztRQUNMLHFCQUFxQixFQUFFLFlBQVksSUFBSSwyQkFBMkIsSUFBSSw4QkFBOEI7UUFDcEcsV0FBVyxFQUFFLENBQUMsSUFBZSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW1hZ2VQaXBlbGluZVByb3BzIH0gZnJvbSAnLi4vaW1hZ2UtcGlwZWxpbmUnO1xuaW1wb3J0IHsgV29ya2Zsb3dDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vd29ya2Zsb3cnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgZXhlY3V0aW9uIHJvbGUgcG9saWN5LCBmb3IgYXV0by1nZW5lcmF0ZWQgZXhlY3V0aW9uIHJvbGVzLlxuICpcbiAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gKiBAcGFyYW0gcHJvcHMgUHJvcHMgaW5wdXQgZm9yIHRoZSBjb25zdHJ1Y3RcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hd3MtbWFuYWdlZC1wb2xpY3kvbGF0ZXN0L3JlZmVyZW5jZS9BV1NTZXJ2aWNlUm9sZUZvckltYWdlQnVpbGRlci5odG1sXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RXhlY3V0aW9uUm9sZVBvbGljeSA9IDxQcm9wc1QgZXh0ZW5kcyBJbWFnZVBpcGVsaW5lUHJvcHM+KFxuICBzY29wZTogQ29uc3RydWN0LFxuICBwcm9wcz86IFByb3BzVCxcbik6IGlhbS5Qb2xpY3lTdGF0ZW1lbnRbXSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHNjb3BlKTtcbiAgY29uc3QgcGFydGl0aW9uID0gc3RhY2sucGFydGl0aW9uO1xuICBjb25zdCByZWdpb24gPSBzdGFjay5yZWdpb247XG4gIGNvbnN0IGFjY291bnQgPSBzdGFjay5hY2NvdW50O1xuXG4gIC8vIFBlcm1pc3Npb25zIGFyZSBpZGVudGljYWwgdG8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F3cy1tYW5hZ2VkLXBvbGljeS9sYXRlc3QvcmVmZXJlbmNlL0FXU1NlcnZpY2VSb2xlRm9ySW1hZ2VCdWlsZGVyLmh0bWxcbiAgLy8gU0xSIHBvbGljaWVzIGNhbm5vdCBiZSBhdHRhY2hlZCB0byByb2xlcywgYW5kIG5vIG1hbmFnZWQgcG9saWN5IGV4aXN0cyBmb3IgdGhlc2UgcGVybWlzc2lvbnMgeWV0XG4gIGNvbnN0IHBvbGljaWVzID0gW1xuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOlJlZ2lzdGVySW1hZ2UnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOjppbWFnZS8qYF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdhd3M6UmVxdWVzdFRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2VjMjpSZWdpc3RlckltYWdlJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6c25hcHNob3QvKmBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnZWMyOlJlc291cmNlVGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOlJ1bkluc3RhbmNlcyddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOjppbWFnZS8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6OnNuYXBzaG90LypgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOnN1Ym5ldC8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpuZXR3b3JrLWludGVyZmFjZS8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpzZWN1cml0eS1ncm91cC8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjprZXktcGFpci8qYCxcbiAgICAgICAgYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjpsYXVuY2gtdGVtcGxhdGUvKmAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OmxpY2Vuc2UtbWFuYWdlcjoqOio6bGljZW5zZS1jb25maWd1cmF0aW9uOipgLFxuICAgICAgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2VjMjpSdW5JbnN0YW5jZXMnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6dm9sdW1lLypgLCBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmluc3RhbmNlLypgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpSZXF1ZXN0VGFnL0NyZWF0ZWRCeSc6IFsnRUMyIEltYWdlIEJ1aWxkZXInLCAnRUMyIEZhc3QgTGF1bmNoJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnaWFtOlBhc3NSb2xlJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnaWFtOlBhc3NlZFRvU2VydmljZSc6IFsnZWMyLmFtYXpvbmF3cy5jb20nLCAnZWMyLmFtYXpvbmF3cy5jb20uY24nLCAndm1pZS5hbWF6b25hd3MuY29tJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOlN0b3BJbnN0YW5jZXMnLCAnZWMyOlN0YXJ0SW5zdGFuY2VzJywgJ2VjMjpUZXJtaW5hdGVJbnN0YW5jZXMnXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdlYzI6UmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnZWMyOkNvcHlJbWFnZScsXG4gICAgICAgICdlYzI6Q3JlYXRlSW1hZ2UnLFxuICAgICAgICAnZWMyOkNyZWF0ZUxhdW5jaFRlbXBsYXRlJyxcbiAgICAgICAgJ2VjMjpEZXJlZ2lzdGVySW1hZ2UnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW1hZ2VzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlQXR0cmlidXRlJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlU3RhdHVzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICdlYzI6RGVzY3JpYmVJbnN0YW5jZVR5cGVPZmZlcmluZ3MnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VUeXBlcycsXG4gICAgICAgICdlYzI6RGVzY3JpYmVTdWJuZXRzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZVRhZ3MnLFxuICAgICAgICAnZWMyOk1vZGlmeUltYWdlQXR0cmlidXRlJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUltcG9ydEltYWdlVGFza3MnLFxuICAgICAgICAnZWMyOkRlc2NyaWJlU25hcHNob3RzJyxcbiAgICAgICAgJ2VjMjpEZXNjcmliZUhvc3RzJyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOk1vZGlmeVNuYXBzaG90QXR0cmlidXRlJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6c25hcHNob3QvKmBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnZWMyOlJlc291cmNlVGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnZWMyOkNyZWF0ZVRhZ3MnXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdlYzI6Q3JlYXRlQWN0aW9uJzogWydSdW5JbnN0YW5jZXMnLCAnQ3JlYXRlSW1hZ2UnXSxcbiAgICAgICAgICAnYXdzOlJlcXVlc3RUYWcvQ3JlYXRlZEJ5JzogWydFQzIgSW1hZ2UgQnVpbGRlcicsICdFQzIgRmFzdCBMYXVuY2gnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydlYzI6Q3JlYXRlVGFncyddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOio6OmltYWdlLypgLCBgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmV4cG9ydC1pbWFnZS10YXNrLypgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2VjMjpDcmVhdGVUYWdzJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6c25hcHNob3QvKmAsIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6bGF1bmNoLXRlbXBsYXRlLypgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpSZXF1ZXN0VGFnL0NyZWF0ZWRCeSc6IFsnRUMyIEltYWdlIEJ1aWxkZXInLCAnRUMyIEZhc3QgTGF1bmNoJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc25zOlB1Ymxpc2gnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OnNuczoke3JlZ2lvbn06JHthY2NvdW50fToqYF0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnc3NtOkxpc3RDb21tYW5kcycsXG4gICAgICAgICdzc206TGlzdENvbW1hbmRJbnZvY2F0aW9ucycsXG4gICAgICAgICdzc206QWRkVGFnc1RvUmVzb3VyY2UnLFxuICAgICAgICAnc3NtOkRlc2NyaWJlSW5zdGFuY2VJbmZvcm1hdGlvbicsXG4gICAgICAgICdzc206TGlzdEludmVudG9yeUVudHJpZXMnLFxuICAgICAgICAnc3NtOkRlc2NyaWJlSW5zdGFuY2VBc3NvY2lhdGlvbnNTdGF0dXMnLFxuICAgICAgICAnc3NtOkRlc2NyaWJlQXNzb2NpYXRpb25FeGVjdXRpb25zJyxcbiAgICAgICAgJ3NzbTpHZXRDb21tYW5kSW52b2NhdGlvbicsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3NzbTpTZW5kQ29tbWFuZCddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnNzbToqOio6ZG9jdW1lbnQvQVdTLVJ1blBvd2VyU2hlbGxTY3JpcHRgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTpzc206KjoqOmRvY3VtZW50L0FXUy1SdW5TaGVsbFNjcmlwdGAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnNzbToqOio6ZG9jdW1lbnQvQVdTRUMyLVJ1blN5c3ByZXBgLFxuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTpzMzo6OipgLFxuICAgICAgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3NzbTpTZW5kQ29tbWFuZCddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOio6KjppbnN0YW5jZS8qYF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdzc206cmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogWydFQzIgSW1hZ2UgQnVpbGRlciddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3NzbTpDcmVhdGVBc3NvY2lhdGlvbicsICdzc206RGVsZXRlQXNzb2NpYXRpb24nXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOiR7cGFydGl0aW9ufTpzc206KjoqOmRvY3VtZW50L0FXUy1HYXRoZXJTb2Z0d2FyZUludmVudG9yeWAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OnNzbToqOio6YXNzb2NpYXRpb24vKmAsXG4gICAgICAgIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6aW5zdGFuY2UvKmAsXG4gICAgICBdLFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2ttczpFbmNyeXB0JyxcbiAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgJ2ttczpSZUVuY3J5cHRGcm9tJyxcbiAgICAgICAgJ2ttczpSZUVuY3J5cHRUbycsXG4gICAgICAgICdrbXM6R2VuZXJhdGVEYXRhS2V5V2l0aG91dFBsYWludGV4dCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgJ0ZvckFsbFZhbHVlczpTdHJpbmdFcXVhbHMnOiB7XG4gICAgICAgICAgJ2ttczpFbmNyeXB0aW9uQ29udGV4dEtleXMnOiBbJ2F3czplYnM6aWQnXSxcbiAgICAgICAgfSxcbiAgICAgICAgJ1N0cmluZ0xpa2UnOiB7XG4gICAgICAgICAgJ2ttczpWaWFTZXJ2aWNlJzogWydlYzIuKi5hbWF6b25hd3MuY29tJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsna21zOkRlc2NyaWJlS2V5J10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdMaWtlOiB7XG4gICAgICAgICAgJ2ttczpWaWFTZXJ2aWNlJzogWydlYzIuKi5hbWF6b25hd3MuY29tJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsna21zOkNyZWF0ZUdyYW50J10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBCb29sOiB7XG4gICAgICAgICAgJ2ttczpHcmFudElzRm9yQVdTUmVzb3VyY2UnOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBTdHJpbmdMaWtlOiB7XG4gICAgICAgICAgJ2ttczpWaWFTZXJ2aWNlJzogWydlYzIuKi5hbWF6b25hd3MuY29tJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpDcmVhdGVMb2dHcm91cCcsICdsb2dzOlB1dExvZ0V2ZW50cyddLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06bG9nczoqOio6bG9nLWdyb3VwOi9hd3MvaW1hZ2VidWlsZGVyLypgXSxcbiAgICB9KSxcbiAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2lhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZSddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2lhbTpBV1NTZXJ2aWNlTmFtZSc6IFsnc3NtLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnZXZlbnRzOkRlbGV0ZVJ1bGUnLFxuICAgICAgICAnZXZlbnRzOkRlc2NyaWJlUnVsZScsXG4gICAgICAgICdldmVudHM6UHV0UnVsZScsXG4gICAgICAgICdldmVudHM6UHV0VGFyZ2V0cycsXG4gICAgICAgICdldmVudHM6UmVtb3ZlVGFyZ2V0cycsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZXZlbnRzOio6KjpydWxlL0ltYWdlQnVpbGRlci0qYF0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzc206R2V0UGFyYW1ldGVyJywgJ3NzbTpQdXRQYXJhbWV0ZXInXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OnNzbToqOio6cGFyYW1ldGVyL2ltYWdlYnVpbGRlci8qYF0sXG4gICAgfSksXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzc206R2V0UGFyYW1ldGVyJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTpzc206Kjo6cGFyYW1ldGVyL2F3cy9zZXJ2aWNlLypgXSxcbiAgICB9KSxcbiAgXTtcblxuICBjb25zdCBoYXNQcm9wcyA9IHByb3BzICE9PSB1bmRlZmluZWQ7XG4gIGlmICghaGFzUHJvcHMgfHwgKHByb3BzLnJlY2lwZS5faXNJbWFnZVJlY2lwZSgpICYmIHByb3BzLmRpc3RyaWJ1dGlvbkNvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAvLyBEaXN0cmlidXRpb24tc3BlY2lmaWMgcGVybWlzc2lvbnMgaWYgZGlzdHJpYnV0aW9uIHNldHRpbmdzIGFyZSBwcm92aWRlZC4gQWxsIHBlcm1pc3Npb25zIGhlcmUgYXJlIGZvciBBTUkgYnVpbGRzXG4gICAgLy8gc3BlY2lmaWNhbGx5LlxuICAgIHBvbGljaWVzLnB1c2goXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6RGVzY3JpYmVFeHBvcnRJbWFnZVRhc2tzJ10sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2xpY2Vuc2UtbWFuYWdlcjpVcGRhdGVMaWNlbnNlU3BlY2lmaWNhdGlvbnNGb3JSZXNvdXJjZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTpsaWNlbnNlLW1hbmFnZXI6Kjoke2FjY291bnR9OmxpY2Vuc2UtY29uZmlndXJhdGlvbjoqYF0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ3N0czpBc3N1bWVSb2xlJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmlhbTo6Kjpyb2xlL0VDMkltYWdlQnVpbGRlckRpc3RyaWJ1dGlvbkNyb3NzQWNjb3VudFJvbGVgXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnZWMyOkRlc2NyaWJlTGF1bmNoVGVtcGxhdGVzJywgJ2VjMjpEZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnZWMyOkNyZWF0ZUxhdW5jaFRlbXBsYXRlVmVyc2lvbicsICdlYzI6TW9kaWZ5TGF1bmNoVGVtcGxhdGUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbYGFybjoke3BhcnRpdGlvbn06ZWMyOiR7cmVnaW9ufToke2FjY291bnR9OmxhdW5jaC10ZW1wbGF0ZS8qYF0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2VjMjpFeHBvcnRJbWFnZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6aW1hZ2UvKmBdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnZWMyOlJlc291cmNlVGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnZWMyOkV4cG9ydEltYWdlJ10sXG4gICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6ZXhwb3J0LWltYWdlLXRhc2svKmBdLFxuICAgICAgfSksXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6Q2FuY2VsRXhwb3J0VGFzayddLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6KjoqOmV4cG9ydC1pbWFnZS10YXNrLypgXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ2VjMjpSZXNvdXJjZVRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ2lhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZSddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnaWFtOkFXU1NlcnZpY2VOYW1lJzogWydlYzJmYXN0bGF1bmNoLmFtYXpvbmF3cy5jb20nXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydlYzI6RW5hYmxlRmFzdExhdW5jaCddLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplYzI6Kjo6aW1hZ2UvKmAsIGBhcm46JHtwYXJ0aXRpb259OmVjMjoqOio6bGF1bmNoLXRlbXBsYXRlLypgXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ2VjMjpSZXNvdXJjZVRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wcyB8fCBwcm9wcy5pbWFnZVNjYW5uaW5nRW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAvLyBBZGQgSW5zcGVjdG9yIHBlcm1pc3Npb25zIGlmIHNjYW5uaW5nIGlzIGVuYWJsZWRcbiAgICBwb2xpY2llcy5wdXNoKFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnaW5zcGVjdG9yMjpMaXN0Q292ZXJhZ2UnLCAnaW5zcGVjdG9yMjpMaXN0RmluZGluZ3MnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBBZGQgaW1hZ2Ugc2Nhbm5pbmcgRUNSIHBlcm1pc3Npb25zIGZvciBjb250YWluZXIgYnVpbGRzXG4gICAgaWYgKCFoYXNQcm9wcyB8fCBwcm9wcy5yZWNpcGUuX2lzQ29udGFpbmVyUmVjaXBlKCkpIHtcbiAgICAgIHBvbGljaWVzLnB1c2goXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydlY3I6Q3JlYXRlUmVwb3NpdG9yeSddLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAgICdhd3M6UmVxdWVzdFRhZy9DcmVhdGVkQnknOiAnRUMyIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2VjcjpUYWdSZXNvdXJjZSddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46JHtwYXJ0aXRpb259OmVjcjoqOio6cmVwb3NpdG9yeS9pbWFnZS1idWlsZGVyLSpgXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2F3czpSZXF1ZXN0VGFnL0NyZWF0ZWRCeSc6ICdFQzIgSW1hZ2UgQnVpbGRlcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnZWNyOkJhdGNoRGVsZXRlSW1hZ2UnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOiR7cGFydGl0aW9ufTplY3I6KjoqOnJlcG9zaXRvcnkvaW1hZ2UtYnVpbGRlci0qYF0sXG4gICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAgICdlY3I6UmVzb3VyY2VUYWcvQ3JlYXRlZEJ5JzogJ0VDMiBJbWFnZSBCdWlsZGVyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb2xpY2llcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeGVjdXRpb25Sb2xlID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBncmFudERlZmF1bHRFeGVjdXRpb25Sb2xlUGVybWlzc2lvbnM6IChncmFudGVlOiBpYW0uSUdyYW50YWJsZSkgPT4gdm9pZCxcbiAge1xuICAgIGV4ZWN1dGlvblJvbGUsXG4gICAgd29ya2Zsb3dzLFxuICAgIGltYWdlTG9nR3JvdXAsXG4gICAgaW1hZ2VQaXBlbGluZUxvZ0dyb3VwLFxuICB9OiB7XG4gICAgZXhlY3V0aW9uUm9sZT86IGlhbS5JUm9sZTtcbiAgICBpbWFnZUxvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG4gICAgaW1hZ2VQaXBlbGluZUxvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG4gICAgd29ya2Zsb3dzPzogV29ya2Zsb3dDb25maWd1cmF0aW9uW107XG4gIH0sXG4pOiBpYW0uSVJvbGUgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB7IGV4ZWN1dGlvblJvbGVSZXF1aXJlZCwgYXBwbHlHcmFudHMgfSA9IGdldEV4ZWN1dGlvblJvbGVSZXF1aXJlbWVudHMoe1xuICAgIHdvcmtmbG93cyxcbiAgICBpbWFnZUxvZ0dyb3VwLFxuICAgIGltYWdlUGlwZWxpbmVMb2dHcm91cCxcbiAgfSk7XG4gIGlmICghZXhlY3V0aW9uUm9sZVJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGlvblJvbGU7XG4gIH1cblxuICBpZiAoZXhlY3V0aW9uUm9sZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXBwbHlHcmFudHMoZXhlY3V0aW9uUm9sZSk7XG4gICAgcmV0dXJuIGV4ZWN1dGlvblJvbGU7XG4gIH1cblxuICBjb25zdCBhdXRvR2VuZXJhdGVkRXhlY3V0aW9uUm9sZSA9IG5ldyBpYW0uUm9sZShzY29wZSwgJ0V4ZWN1dGlvblJvbGUnLCB7XG4gICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2ltYWdlYnVpbGRlci5hbWF6b25hd3MuY29tJyksXG4gIH0pO1xuICBncmFudERlZmF1bHRFeGVjdXRpb25Sb2xlUGVybWlzc2lvbnMoYXV0b0dlbmVyYXRlZEV4ZWN1dGlvblJvbGUpO1xuICBhcHBseUdyYW50cyhhdXRvR2VuZXJhdGVkRXhlY3V0aW9uUm9sZSk7XG5cbiAgcmV0dXJuIGF1dG9HZW5lcmF0ZWRFeGVjdXRpb25Sb2xlO1xufTtcblxuY29uc3QgZ2V0RXhlY3V0aW9uUm9sZVJlcXVpcmVtZW50cyA9ICh7XG4gIHdvcmtmbG93cyxcbiAgaW1hZ2VMb2dHcm91cCxcbiAgaW1hZ2VQaXBlbGluZUxvZ0dyb3VwLFxufToge1xuICBpbWFnZUxvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG4gIGltYWdlUGlwZWxpbmVMb2dHcm91cD86IGxvZ3MuSUxvZ0dyb3VwO1xuICB3b3JrZmxvd3M/OiBXb3JrZmxvd0NvbmZpZ3VyYXRpb25bXTtcbn0pOiB7IGV4ZWN1dGlvblJvbGVSZXF1aXJlZDogYm9vbGVhbjsgYXBwbHlHcmFudHM6IChyb2xlOiBpYW0uSVJvbGUpID0+IHZvaWQgfSA9PiB7XG4gIGNvbnN0IGdyYW50ZXJzOiBBcnJheTwocm9sZTogaWFtLklSb2xlKSA9PiB2b2lkPiA9IFtdO1xuXG4gIGNvbnN0IGhhc1dvcmtmbG93cyA9IEJvb2xlYW4od29ya2Zsb3dzPy5sZW5ndGgpO1xuICBjb25zdCBhZGRJbWFnZUxvZ0dyb3VwUGVybWlzc2lvbnMgPVxuICAgIGltYWdlTG9nR3JvdXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGltYWdlTG9nR3JvdXAubG9nR3JvdXBOYW1lKSAmJlxuICAgICFpbWFnZUxvZ0dyb3VwLmxvZ0dyb3VwTmFtZS5zdGFydHNXaXRoKCcvYXdzL2ltYWdlYnVpbGRlci8nKTtcbiAgY29uc3QgYWRkUGlwZWxpbmVMb2dHcm91cFBlcm1pc3Npb25zID1cbiAgICBpbWFnZVBpcGVsaW5lTG9nR3JvdXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGltYWdlUGlwZWxpbmVMb2dHcm91cC5sb2dHcm91cE5hbWUpICYmXG4gICAgIWltYWdlUGlwZWxpbmVMb2dHcm91cC5sb2dHcm91cE5hbWUuc3RhcnRzV2l0aCgnL2F3cy9pbWFnZWJ1aWxkZXIvJyk7XG5cbiAgaWYgKGFkZEltYWdlTG9nR3JvdXBQZXJtaXNzaW9ucykge1xuICAgIGdyYW50ZXJzLnB1c2goKHJvbGUpID0+IGltYWdlTG9nR3JvdXAhLmdyYW50V3JpdGUocm9sZSkpO1xuICB9XG5cbiAgaWYgKGFkZFBpcGVsaW5lTG9nR3JvdXBQZXJtaXNzaW9ucykge1xuICAgIGdyYW50ZXJzLnB1c2goKHJvbGUpID0+IGltYWdlUGlwZWxpbmVMb2dHcm91cCEuZ3JhbnRXcml0ZShyb2xlKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4ZWN1dGlvblJvbGVSZXF1aXJlZDogaGFzV29ya2Zsb3dzIHx8IGFkZEltYWdlTG9nR3JvdXBQZXJtaXNzaW9ucyB8fCBhZGRQaXBlbGluZUxvZ0dyb3VwUGVybWlzc2lvbnMsXG4gICAgYXBwbHlHcmFudHM6IChyb2xlOiBpYW0uSVJvbGUpID0+IGdyYW50ZXJzLmZvckVhY2goKGdyYW50ZXIpID0+IGdyYW50ZXIocm9sZSkpLFxuICB9O1xufTtcbiJdfQ==
@@ -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.0-alpha.0" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentParameterValue", version: "2.230.0-alpha.0" };
10
10
  /**
11
11
  * The value of the parameter as a string
12
12
  *