@cloudsnorkel/cdk-github-runners 0.9.4 → 0.9.5

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.
Files changed (93) hide show
  1. package/.gitattributes +3 -3
  2. package/.jsii +315 -267
  3. package/API.md +43 -7
  4. package/README.md +15 -2
  5. package/assets/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda/index.js +2 -2
  6. package/assets/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda/index.js +1 -1
  7. package/assets/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda/index.js +2 -2
  8. package/lib/access.js +1 -1
  9. package/lib/image-builders/api.js +47 -0
  10. package/lib/{providers/image-builders → image-builders}/aws-image-builder/ami.d.ts +2 -3
  11. package/lib/image-builders/aws-image-builder/ami.js +93 -0
  12. package/lib/{providers/image-builders → image-builders}/aws-image-builder/builder.d.ts +9 -2
  13. package/lib/image-builders/aws-image-builder/builder.js +529 -0
  14. package/lib/image-builders/aws-image-builder/common.js +46 -0
  15. package/lib/{providers/image-builders → image-builders}/aws-image-builder/container.d.ts +1 -1
  16. package/lib/image-builders/aws-image-builder/container.js +63 -0
  17. package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami-function.d.ts +1 -1
  18. package/lib/image-builders/aws-image-builder/delete-ami-function.js +23 -0
  19. package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
  20. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/ami.d.ts +2 -2
  21. package/lib/image-builders/aws-image-builder/deprecated/ami.js +240 -0
  22. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/common.d.ts +1 -1
  23. package/lib/image-builders/aws-image-builder/deprecated/common.js +144 -0
  24. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/container.d.ts +1 -1
  25. package/lib/image-builders/aws-image-builder/deprecated/container.js +222 -0
  26. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.js +1 -1
  27. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/linux-components.d.ts +1 -1
  28. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +172 -0
  29. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/windows-components.d.ts +1 -1
  30. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +126 -0
  31. package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds-function.d.ts +1 -1
  32. package/lib/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
  33. package/lib/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
  34. package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.js +1 -1
  35. package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner-function.d.ts +1 -1
  36. package/lib/image-builders/aws-image-builder/versioner-function.js +23 -0
  37. package/lib/image-builders/aws-image-builder/versioner.lambda.js +96 -0
  38. package/lib/{providers/image-builders → image-builders}/codebuild-deprecated.d.ts +2 -2
  39. package/lib/image-builders/codebuild-deprecated.js +373 -0
  40. package/lib/{providers/image-builders → image-builders}/codebuild.d.ts +2 -2
  41. package/lib/image-builders/codebuild.js +287 -0
  42. package/lib/{providers/image-builders → image-builders}/common.d.ts +4 -2
  43. package/lib/image-builders/common.js +61 -0
  44. package/lib/{providers/image-builders → image-builders}/components.d.ts +8 -2
  45. package/lib/image-builders/components.js +568 -0
  46. package/lib/{providers/image-builders → image-builders}/index.js +1 -1
  47. package/lib/{providers/image-builders → image-builders}/static.d.ts +1 -1
  48. package/lib/image-builders/static.js +58 -0
  49. package/lib/providers/codebuild.d.ts +1 -1
  50. package/lib/providers/codebuild.js +4 -4
  51. package/lib/providers/common.js +3 -3
  52. package/lib/providers/ec2.d.ts +1 -1
  53. package/lib/providers/ec2.js +4 -4
  54. package/lib/providers/ecs.d.ts +1 -1
  55. package/lib/providers/ecs.js +3 -3
  56. package/lib/providers/fargate.d.ts +1 -1
  57. package/lib/providers/fargate.js +4 -4
  58. package/lib/providers/index.d.ts +1 -1
  59. package/lib/providers/index.js +2 -2
  60. package/lib/providers/lambda.d.ts +1 -1
  61. package/lib/providers/lambda.js +4 -4
  62. package/lib/runner.js +1 -1
  63. package/lib/secrets.js +1 -1
  64. package/package.json +10 -10
  65. package/lib/providers/image-builders/api.js +0 -47
  66. package/lib/providers/image-builders/aws-image-builder/ami.js +0 -81
  67. package/lib/providers/image-builders/aws-image-builder/builder.js +0 -520
  68. package/lib/providers/image-builders/aws-image-builder/common.js +0 -46
  69. package/lib/providers/image-builders/aws-image-builder/container.js +0 -63
  70. package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +0 -23
  71. package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +0 -87
  72. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +0 -240
  73. package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +0 -144
  74. package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +0 -222
  75. package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +0 -172
  76. package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +0 -129
  77. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +0 -23
  78. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +0 -18
  79. package/lib/providers/image-builders/aws-image-builder/versioner-function.js +0 -23
  80. package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +0 -96
  81. package/lib/providers/image-builders/codebuild-deprecated.js +0 -373
  82. package/lib/providers/image-builders/codebuild.js +0 -287
  83. package/lib/providers/image-builders/common.js +0 -61
  84. package/lib/providers/image-builders/components.js +0 -535
  85. package/lib/providers/image-builders/static.js +0 -58
  86. /package/lib/{providers/image-builders → image-builders}/api.d.ts +0 -0
  87. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/common.d.ts +0 -0
  88. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda.d.ts +0 -0
  89. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.d.ts +0 -0
  90. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda.d.ts +0 -0
  91. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.d.ts +0 -0
  92. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda.d.ts +0 -0
  93. /package/lib/{providers/image-builders → image-builders}/index.d.ts +0 -0
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeBuildImageBuilderFailedBuildNotifier = exports.CodeBuildRunnerImageBuilder = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
7
+ const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
8
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
9
+ const aws_image_builder_1 = require("./aws-image-builder");
10
+ const common_1 = require("./common");
11
+ const build_image_function_1 = require("../providers/build-image-function");
12
+ const common_2 = require("../providers/common");
13
+ const utils_1 = require("../utils");
14
+ /**
15
+ * @internal
16
+ */
17
+ class CodeBuildRunnerImageBuilder extends common_1.RunnerImageBuilderBase {
18
+ constructor(scope, id, props) {
19
+ super(scope, id, props);
20
+ if (props?.awsImageBuilderOptions) {
21
+ aws_cdk_lib_1.Annotations.of(this).addWarning('awsImageBuilderOptions are ignored when using CodeBuild runner image builder.');
22
+ }
23
+ this.os = props?.os ?? common_2.Os.LINUX_UBUNTU;
24
+ this.architecture = props?.architecture ?? common_2.Architecture.X86_64;
25
+ this.rebuildInterval = props?.rebuildInterval ?? aws_cdk_lib_1.Duration.days(7);
26
+ this.logRetention = props?.logRetention ?? aws_logs_1.RetentionDays.ONE_MONTH;
27
+ this.logRemovalPolicy = props?.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY;
28
+ this.vpc = props?.vpc;
29
+ this.securityGroups = props?.securityGroups;
30
+ this.subnetSelection = props?.subnetSelection;
31
+ this.timeout = props?.codeBuildOptions?.timeout ?? aws_cdk_lib_1.Duration.hours(1);
32
+ this.computeType = props?.codeBuildOptions?.computeType ?? aws_codebuild_1.ComputeType.SMALL;
33
+ this.baseImage = props?.baseDockerImage ?? (0, aws_image_builder_1.defaultBaseDockerImage)(this.os);
34
+ this.buildImage = props?.codeBuildOptions?.buildImage ?? this.getDefaultBuildImage();
35
+ // warn against isolated networks
36
+ if (props?.subnetSelection?.subnetType == aws_cdk_lib_1.aws_ec2.SubnetType.PRIVATE_ISOLATED) {
37
+ aws_cdk_lib_1.Annotations.of(this).addWarning('Private isolated subnets cannot pull from public ECR and VPC endpoint is not supported yet. ' +
38
+ 'See https://github.com/aws/containers-roadmap/issues/1160');
39
+ }
40
+ // create service role for CodeBuild
41
+ this.role = new aws_cdk_lib_1.aws_iam.Role(this, 'Role', {
42
+ assumedBy: new aws_cdk_lib_1.aws_iam.ServicePrincipal('codebuild.amazonaws.com'),
43
+ });
44
+ // create repository that only keeps one tag
45
+ this.repository = new aws_cdk_lib_1.aws_ecr.Repository(this, 'Repository', {
46
+ imageScanOnPush: true,
47
+ imageTagMutability: aws_ecr_1.TagMutability.MUTABLE,
48
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
49
+ lifecycleRules: [
50
+ {
51
+ description: 'Remove untagged images that have been replaced by CodeBuild',
52
+ tagStatus: aws_ecr_1.TagStatus.UNTAGGED,
53
+ maxImageAge: aws_cdk_lib_1.Duration.days(1),
54
+ },
55
+ ],
56
+ });
57
+ }
58
+ bindAmi() {
59
+ throw new Error('CodeBuild image builder cannot be used to build AMI');
60
+ }
61
+ bindDockerImage() {
62
+ if (this.boundDockerImage) {
63
+ return this.boundDockerImage;
64
+ }
65
+ // log group for the image builds
66
+ const logGroup = new aws_cdk_lib_1.aws_logs.LogGroup(this, 'Logs', {
67
+ retention: this.logRetention ?? aws_logs_1.RetentionDays.ONE_MONTH,
68
+ removalPolicy: this.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY,
69
+ });
70
+ // generate buildSpec
71
+ const buildSpec = this.getBuildSpec(this.repository, logGroup);
72
+ // create CodeBuild project that builds Dockerfile and pushes to repository
73
+ const project = new aws_cdk_lib_1.aws_codebuild.Project(this, 'CodeBuild', {
74
+ description: `Build docker image for self-hosted GitHub runner ${this.node.path} (${this.os.name}/${this.architecture.name})`,
75
+ buildSpec,
76
+ vpc: this.vpc,
77
+ securityGroups: this.securityGroups,
78
+ subnetSelection: this.subnetSelection,
79
+ role: this.role,
80
+ timeout: this.timeout,
81
+ environment: {
82
+ buildImage: this.buildImage,
83
+ computeType: this.computeType,
84
+ privileged: true,
85
+ },
86
+ logging: {
87
+ cloudWatch: {
88
+ logGroup,
89
+ },
90
+ },
91
+ });
92
+ // permissions
93
+ this.repository.grantPullPush(project);
94
+ // call CodeBuild during deployment and delete all images from repository during destruction
95
+ const cr = this.customResource(project, buildSpec.toBuildSpec());
96
+ // rebuild image on a schedule
97
+ this.rebuildImageOnSchedule(project, this.rebuildInterval);
98
+ // return the image
99
+ this.boundDockerImage = {
100
+ imageRepository: aws_cdk_lib_1.aws_ecr.Repository.fromRepositoryAttributes(this, 'Dependable Image', {
101
+ // There are simpler ways to get name and ARN, but we want an image object that depends on the custom resource.
102
+ // We want whoever is using this image to automatically wait for CodeBuild to start and finish through the custom resource.
103
+ repositoryName: cr.getAttString('Name'),
104
+ repositoryArn: cr.ref,
105
+ }),
106
+ imageTag: 'latest',
107
+ architecture: this.architecture,
108
+ os: this.os,
109
+ logGroup,
110
+ runnerVersion: common_2.RunnerVersion.specific('unknown'),
111
+ };
112
+ return this.boundDockerImage;
113
+ }
114
+ getDefaultBuildImage() {
115
+ if (this.os.is(common_2.Os.LINUX_UBUNTU) || this.os.is(common_2.Os.LINUX_AMAZON_2) || this.os.is(common_2.Os.LINUX)) {
116
+ // CodeBuild just runs `docker build` so its OS doesn't really matter
117
+ if (this.architecture.is(common_2.Architecture.X86_64)) {
118
+ return aws_cdk_lib_1.aws_codebuild.LinuxBuildImage.STANDARD_6_0;
119
+ }
120
+ else if (this.architecture.is(common_2.Architecture.ARM64)) {
121
+ return aws_cdk_lib_1.aws_codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0;
122
+ }
123
+ }
124
+ if (this.os.is(common_2.Os.WINDOWS)) {
125
+ throw new Error('CodeBuild cannot be used to build Windows Docker images https://github.com/docker-library/docker/issues/49');
126
+ }
127
+ throw new Error(`Unable to find CodeBuild image for ${this.os.name}/${this.architecture.name}`);
128
+ }
129
+ getDockerfileGenerationCommands() {
130
+ let commands = [];
131
+ let dockerfile = `FROM ${this.baseImage}\nVOLUME /var/lib/docker\n`;
132
+ for (let i = 0; i < this.components.length; i++) {
133
+ const componentName = this.components[i].name;
134
+ const assetDescriptors = this.components[i].getAssets(this.os, this.architecture);
135
+ for (let j = 0; j < assetDescriptors.length; j++) {
136
+ if (this.os.is(common_2.Os.WINDOWS)) {
137
+ throw new Error("Can't add asset as we can't build Windows Docker images on CodeBuild");
138
+ }
139
+ const asset = new aws_cdk_lib_1.aws_s3_assets.Asset(this, `Component ${i} ${componentName} Asset ${j}`, {
140
+ path: assetDescriptors[j].source,
141
+ });
142
+ if (asset.isFile) {
143
+ commands.push(`aws s3 cp ${asset.s3ObjectUrl} asset${i}-${componentName}-${j}`);
144
+ }
145
+ else if (asset.isZipArchive) {
146
+ commands.push(`aws s3 cp ${asset.s3ObjectUrl} asset${i}-${componentName}-${j}.zip`);
147
+ commands.push(`unzip asset${i}-${componentName}-${j}.zip -d "asset${i}-${componentName}-${j}"`);
148
+ }
149
+ else {
150
+ throw new Error(`Unknown asset type: ${asset}`);
151
+ }
152
+ dockerfile += `COPY asset${i}-${componentName}-${j} ${assetDescriptors[j].target}\n`;
153
+ asset.grantRead(this);
154
+ }
155
+ const componentCommands = this.components[i].getCommands(this.os, this.architecture);
156
+ const script = '#!/bin/bash\nset -exuo pipefail\n' + componentCommands.join('\n');
157
+ commands.push(`cat > component${i}-${componentName}.sh <<'EOFGITHUBRUNNERSDOCKERFILE'\n${script}\nEOFGITHUBRUNNERSDOCKERFILE`);
158
+ commands.push(`chmod +x component${i}-${componentName}.sh`);
159
+ dockerfile += `COPY component${i}-${componentName}.sh /tmp\n`;
160
+ dockerfile += `RUN /tmp/component${i}-${componentName}.sh\n`;
161
+ dockerfile += this.components[i].getDockerCommands(this.os, this.architecture).join('\n') + '\n';
162
+ }
163
+ commands.push(`cat > Dockerfile <<'EOFGITHUBRUNNERSDOCKERFILE'\n${dockerfile}\nEOFGITHUBRUNNERSDOCKERFILE`);
164
+ return commands;
165
+ }
166
+ getBuildSpec(repository, logGroup) {
167
+ const thisStack = cdk.Stack.of(this);
168
+ return aws_cdk_lib_1.aws_codebuild.BuildSpec.fromObject({
169
+ version: '0.2',
170
+ env: {
171
+ variables: {
172
+ REPO_ARN: repository.repositoryArn,
173
+ REPO_URI: repository.repositoryUri,
174
+ STACK_ID: 'unspecified',
175
+ REQUEST_ID: 'unspecified',
176
+ LOGICAL_RESOURCE_ID: 'unspecified',
177
+ RESPONSE_URL: 'unspecified',
178
+ },
179
+ },
180
+ phases: {
181
+ pre_build: {
182
+ commands: [
183
+ `aws ecr get-login-password --region "$AWS_DEFAULT_REGION" | docker login --username AWS --password-stdin ${thisStack.account}.dkr.ecr.${thisStack.region}.amazonaws.com`,
184
+ ],
185
+ },
186
+ build: {
187
+ commands: this.getDockerfileGenerationCommands().concat([
188
+ 'docker build . -t "$REPO_URI"',
189
+ 'docker push "$REPO_URI"',
190
+ ]),
191
+ },
192
+ post_build: {
193
+ commands: [
194
+ 'STATUS="SUCCESS"',
195
+ 'if [ $CODEBUILD_BUILD_SUCCEEDING -ne 1 ]; then STATUS="FAILED"; fi',
196
+ 'cat <<EOF > /tmp/payload.json\n' +
197
+ '{\n' +
198
+ ' "StackId": "$STACK_ID",\n' +
199
+ ' "RequestId": "$REQUEST_ID",\n' +
200
+ ' "LogicalResourceId": "$LOGICAL_RESOURCE_ID",\n' +
201
+ ' "PhysicalResourceId": "$REPO_ARN",\n' +
202
+ ' "Status": "$STATUS",\n' +
203
+ ` "Reason": "See logs in ${logGroup.logGroupName}/$CODEBUILD_LOG_PATH (deploy again with \'cdk deploy -R\' or logRemovalPolicy=RemovalPolicy.RETAIN if they are already deleted)",\n` +
204
+ ` "Data": {"Name": "${repository.repositoryName}"}\n` +
205
+ '}\n' +
206
+ 'EOF',
207
+ 'if [ "$RESPONSE_URL" != "unspecified" ]; then jq . /tmp/payload.json; curl -fsSL -X PUT -H "Content-Type:" -d "@/tmp/payload.json" "$RESPONSE_URL"; fi',
208
+ ],
209
+ },
210
+ },
211
+ });
212
+ }
213
+ customResource(project, buildSpec) {
214
+ const crHandler = (0, utils_1.singletonLambda)(build_image_function_1.BuildImageFunction, this, 'build-image', {
215
+ description: 'Custom resource handler that triggers CodeBuild to build runner images, and cleans-up images on deletion',
216
+ timeout: cdk.Duration.minutes(3),
217
+ logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH,
218
+ });
219
+ const policy = new aws_cdk_lib_1.aws_iam.Policy(this, 'CR Policy', {
220
+ statements: [
221
+ new aws_cdk_lib_1.aws_iam.PolicyStatement({
222
+ actions: ['codebuild:StartBuild'],
223
+ resources: [project.projectArn],
224
+ }),
225
+ new aws_cdk_lib_1.aws_iam.PolicyStatement({
226
+ actions: ['ecr:BatchDeleteImage', 'ecr:ListImages'],
227
+ resources: [this.repository.repositoryArn],
228
+ }),
229
+ ],
230
+ });
231
+ crHandler.role.attachInlinePolicy(policy);
232
+ const cr = new aws_cdk_lib_1.CustomResource(this, 'Builder', {
233
+ serviceToken: crHandler.functionArn,
234
+ resourceType: 'Custom::ImageBuilder',
235
+ properties: {
236
+ RepoName: this.repository.repositoryName,
237
+ ProjectName: project.projectName,
238
+ // We include the full buildSpec so the image is built immediately on changes, and we don't have to wait for its scheduled build.
239
+ // This also helps make sure the changes are good. If they have a bug, the deployment will fail instead of just the scheduled build.
240
+ BuildSpec: buildSpec,
241
+ },
242
+ });
243
+ // add dependencies to make sure resources are there when we need them
244
+ cr.node.addDependency(project);
245
+ cr.node.addDependency(this.role);
246
+ cr.node.addDependency(policy);
247
+ cr.node.addDependency(crHandler.role);
248
+ cr.node.addDependency(crHandler);
249
+ return cr;
250
+ }
251
+ rebuildImageOnSchedule(project, rebuildInterval) {
252
+ rebuildInterval = rebuildInterval ?? aws_cdk_lib_1.Duration.days(7);
253
+ if (rebuildInterval.toMilliseconds() != 0) {
254
+ const scheduleRule = new aws_cdk_lib_1.aws_events.Rule(this, 'Build Schedule', {
255
+ description: `Rebuild runner image for ${this.repository.repositoryName}`,
256
+ schedule: aws_cdk_lib_1.aws_events.Schedule.rate(rebuildInterval),
257
+ });
258
+ scheduleRule.addTarget(new aws_cdk_lib_1.aws_events_targets.CodeBuildProject(project));
259
+ }
260
+ }
261
+ get connections() {
262
+ return new aws_cdk_lib_1.aws_ec2.Connections({
263
+ securityGroups: this.securityGroups,
264
+ });
265
+ }
266
+ get grantPrincipal() {
267
+ return this.role;
268
+ }
269
+ }
270
+ exports.CodeBuildRunnerImageBuilder = CodeBuildRunnerImageBuilder;
271
+ /**
272
+ * @internal
273
+ */
274
+ class CodeBuildImageBuilderFailedBuildNotifier {
275
+ constructor(topic) {
276
+ this.topic = topic;
277
+ }
278
+ visit(node) {
279
+ if (node instanceof CodeBuildRunnerImageBuilder) {
280
+ const builder = node;
281
+ const project = builder.node.findChild('CodeBuild');
282
+ project.notifyOnBuildFailed('BuildFailed', this.topic);
283
+ }
284
+ }
285
+ }
286
+ exports.CodeBuildImageBuilderFailedBuildNotifier = CodeBuildImageBuilderFailedBuildNotifier;
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2NvZGVidWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBY3FCO0FBQ3JCLDZEQUF3RDtBQUN4RCxpREFBK0Q7QUFDL0QsbURBQXFEO0FBRXJELDJEQUE2RDtBQUM3RCxxQ0FBMkU7QUFDM0UsNEVBQXVFO0FBQ3ZFLGdEQUE4RjtBQUM5RixvQ0FBMkM7QUErQjNDOztHQUVHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSwrQkFBc0I7SUFpQnJFLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7WUFDakMseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLCtFQUErRSxDQUFDLENBQUM7U0FDbEg7UUFFRCxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLElBQUksV0FBRSxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUkscUJBQVksQ0FBQyxNQUFNLENBQUM7UUFDL0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLEVBQUUsZUFBZSxJQUFJLHNCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxFQUFFLFlBQVksSUFBSSx3QkFBYSxDQUFDLFNBQVMsQ0FBQztRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLGdCQUFnQixJQUFJLDJCQUFhLENBQUMsT0FBTyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUN0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QUFhLHdDQUF3QztJQUNuRCxZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO0lBQ3JDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsSUFBSSxJQUFJLFlBQVksMkJBQTJCLEVBQUU7WUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBbUMsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQXNCLENBQUM7WUFDekUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0NBQ0Y7QUFYRCw0RkFXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgYXdzX2NvZGVidWlsZCBhcyBjb2RlYnVpbGQsXG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfZWNyIGFzIGVjcixcbiAgYXdzX2V2ZW50cyBhcyBldmVudHMsXG4gIGF3c19ldmVudHNfdGFyZ2V0cyBhcyBldmVudHNfdGFyZ2V0cyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19sb2dzIGFzIGxvZ3MsXG4gIGF3c19zM19hc3NldHMgYXMgczNfYXNzZXRzLFxuICBhd3Nfc25zIGFzIHNucyxcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBSZW1vdmFsUG9saWN5LFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb21wdXRlVHlwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgVGFnTXV0YWJpbGl0eSwgVGFnU3RhdHVzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBkZWZhdWx0QmFzZURvY2tlckltYWdlIH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBSdW5uZXJJbWFnZUJ1aWxkZXJCYXNlLCBSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcyB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IEJ1aWxkSW1hZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3Byb3ZpZGVycy9idWlsZC1pbWFnZS1mdW5jdGlvbic7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUsIE9zLCBSdW5uZXJBbWksIFJ1bm5lckltYWdlLCBSdW5uZXJWZXJzaW9uIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBzaW5nbGV0b25MYW1iZGEgfSBmcm9tICcuLi91dGlscyc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBjb21wdXRlIHRvIHVzZSBmb3IgdGhpcyBidWlsZC5cbiAgICogU2VlIHRoZSB7QGxpbmsgQ29tcHV0ZVR5cGV9IGVudW0gZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBDb21wdXRlVHlwZSNTTUFMTH1cbiAgICovXG4gIHJlYWRvbmx5IGNvbXB1dGVUeXBlPzogY29kZWJ1aWxkLkNvbXB1dGVUeXBlO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBpbWFnZSB0byB1c2UgaW4gQ29kZUJ1aWxkLiBUaGlzIGlzIHRoZSBpbWFnZSB0aGF0J3MgZ29pbmcgdG8gcnVuIHRoZSBjb2RlIHRoYXQgYnVpbGRzIHRoZSBydW5uZXIgaW1hZ2UuXG4gICAqXG4gICAqIFRoZSBvbmx5IGFjdGlvbiB0YWtlbiBpbiBDb2RlQnVpbGQgaXMgcnVubmluZyBgZG9ja2VyIGJ1aWxkYC4gWW91IHdvdWxkIHRoZXJlZm9yZSBub3QgbmVlZCB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nIG9mdGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBVYnVudHUgMjIuMDQgZm9yIHg2NCBhbmQgQW1hem9uIExpbnV4IDIgZm9yIEFSTTY0XG4gICAqL1xuICByZWFkb25seSBidWlsZEltYWdlPzogY29kZWJ1aWxkLklCdWlsZEltYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgYWZ0ZXIgd2hpY2ggQVdTIENvZGVCdWlsZCBzdG9wcyB0aGUgYnVpbGQgaWYgaXQnc1xuICAgKiBub3QgY29tcGxldGUuIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgdGltZW91dEluTWludXRlcyBmaWVsZCBpbiB0aGUgQVdTXG4gICAqIENvZGVCdWlsZCBVc2VyIEd1aWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygxKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyIGV4dGVuZHMgUnVubmVySW1hZ2VCdWlsZGVyQmFzZSB7XG4gIHByaXZhdGUgYm91bmREb2NrZXJJbWFnZT86IFJ1bm5lckltYWdlO1xuICBwcml2YXRlIHJlYWRvbmx5IG9zOiBPcztcbiAgcHJpdmF0ZSByZWFkb25seSBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlSW1hZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeTtcbiAgcHJpdmF0ZSByZWFkb25seSB2cGM6IGVjMi5JVnBjIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBlYzIuSVNlY3VyaXR5R3JvdXBbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBidWlsZEltYWdlOiBjb2RlYnVpbGQuSUJ1aWxkSW1hZ2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3NpdG9yeTogZWNyLlJlcG9zaXRvcnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uOiBlYzIuU3VibmV0U2VsZWN0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQ6IGNkay5EdXJhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wdXRlVHlwZTogY29kZWJ1aWxkLkNvbXB1dGVUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYnVpbGRJbnRlcnZhbDogY2RrLkR1cmF0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvbGU6IGlhbS5Sb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcz8uYXdzSW1hZ2VCdWlsZGVyT3B0aW9ucykge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZygnYXdzSW1hZ2VCdWlsZGVyT3B0aW9ucyBhcmUgaWdub3JlZCB3aGVuIHVzaW5nIENvZGVCdWlsZCBydW5uZXIgaW1hZ2UgYnVpbGRlci4nKTtcbiAgICB9XG5cbiAgICB0aGlzLm9zID0gcHJvcHM/Lm9zID8/IE9zLkxJTlVYX1VCVU5UVTtcbiAgICB0aGlzLmFyY2hpdGVjdHVyZSA9IHByb3BzPy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICB0aGlzLnJlYnVpbGRJbnRlcnZhbCA9IHByb3BzPy5yZWJ1aWxkSW50ZXJ2YWwgPz8gRHVyYXRpb24uZGF5cyg3KTtcbiAgICB0aGlzLmxvZ1JldGVudGlvbiA9IHByb3BzPy5sb2dSZXRlbnRpb24gPz8gUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEg7XG4gICAgdGhpcy5sb2dSZW1vdmFsUG9saWN5ID0gcHJvcHM/LmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICAgIHRoaXMudnBjID0gcHJvcHM/LnZwYztcbiAgICB0aGlzLnNlY3VyaXR5R3JvdXBzID0gcHJvcHM/LnNlY3VyaXR5R3JvdXBzO1xuICAgIHRoaXMuc3VibmV0U2VsZWN0aW9uID0gcHJvcHM/LnN1Ym5ldFNlbGVjdGlvbjtcbiAgICB0aGlzLnRpbWVvdXQgPSBwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8udGltZW91dCA/PyBEdXJhdGlvbi5ob3VycygxKTtcbiAgICB0aGlzLmNvbXB1dGVUeXBlID0gcHJvcHM/LmNvZGVCdWlsZE9wdGlvbnM/LmNvbXB1dGVUeXBlID8/IENvbXB1dGVUeXBlLlNNQUxMO1xuICAgIHRoaXMuYmFzZUltYWdlID0gcHJvcHM/LmJhc2VEb2NrZXJJbWFnZSA/PyBkZWZhdWx0QmFzZURvY2tlckltYWdlKHRoaXMub3MpO1xuICAgIHRoaXMuYnVpbGRJbWFnZSA9IHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5idWlsZEltYWdlID8/IHRoaXMuZ2V0RGVmYXVsdEJ1aWxkSW1hZ2UoKTtcblxuICAgIC8vIHdhcm4gYWdhaW5zdCBpc29sYXRlZCBuZXR3b3Jrc1xuICAgIGlmIChwcm9wcz8uc3VibmV0U2VsZWN0aW9uPy5zdWJuZXRUeXBlID09IGVjMi5TdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURUQpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoJ1ByaXZhdGUgaXNvbGF0ZWQgc3VibmV0cyBjYW5ub3QgcHVsbCBmcm9tIHB1YmxpYyBFQ1IgYW5kIFZQQyBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIHlldC4gJyArXG4gICAgICAgICdTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9jb250YWluZXJzLXJvYWRtYXAvaXNzdWVzLzExNjAnKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgc2VydmljZSByb2xlIGZvciBDb2RlQnVpbGRcbiAgICB0aGlzLnJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcblxuICAgIC8vIGNyZWF0ZSByZXBvc2l0b3J5IHRoYXQgb25seSBrZWVwcyBvbmUgdGFnXG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gbmV3IGVjci5SZXBvc2l0b3J5KHRoaXMsICdSZXBvc2l0b3J5Jywge1xuICAgICAgaW1hZ2VTY2FuT25QdXNoOiB0cnVlLFxuICAgICAgaW1hZ2VUYWdNdXRhYmlsaXR5OiBUYWdNdXRhYmlsaXR5Lk1VVEFCTEUsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBsaWZlY3ljbGVSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdSZW1vdmUgdW50YWdnZWQgaW1hZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IENvZGVCdWlsZCcsXG4gICAgICAgICAgdGFnU3RhdHVzOiBUYWdTdGF0dXMuVU5UQUdHRUQsXG4gICAgICAgICAgbWF4SW1hZ2VBZ2U6IER1cmF0aW9uLmRheXMoMSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgYmluZEFtaSgpOiBSdW5uZXJBbWkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29kZUJ1aWxkIGltYWdlIGJ1aWxkZXIgY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgQU1JJyk7XG4gIH1cblxuICBiaW5kRG9ja2VySW1hZ2UoKTogUnVubmVySW1hZ2Uge1xuICAgIGlmICh0aGlzLmJvdW5kRG9ja2VySW1hZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvdW5kRG9ja2VySW1hZ2U7XG4gICAgfVxuXG4gICAgLy8gbG9nIGdyb3VwIGZvciB0aGUgaW1hZ2UgYnVpbGRzXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICAnTG9ncycsXG4gICAgICB7XG4gICAgICAgIHJldGVudGlvbjogdGhpcy5sb2dSZXRlbnRpb24gPz8gUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMubG9nUmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBnZW5lcmF0ZSBidWlsZFNwZWNcbiAgICBjb25zdCBidWlsZFNwZWMgPSB0aGlzLmdldEJ1aWxkU3BlYyh0aGlzLnJlcG9zaXRvcnksIGxvZ0dyb3VwKTtcblxuICAgIC8vIGNyZWF0ZSBDb2RlQnVpbGQgcHJvamVjdCB0aGF0IGJ1aWxkcyBEb2NrZXJmaWxlIGFuZCBwdXNoZXMgdG8gcmVwb3NpdG9yeVxuICAgIGNvbnN0IHByb2plY3QgPSBuZXcgY29kZWJ1aWxkLlByb2plY3QodGhpcywgJ0NvZGVCdWlsZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgQnVpbGQgZG9ja2VyIGltYWdlIGZvciBzZWxmLWhvc3RlZCBHaXRIdWIgcnVubmVyICR7dGhpcy5ub2RlLnBhdGh9ICgke3RoaXMub3MubmFtZX0vJHt0aGlzLmFyY2hpdGVjdHVyZS5uYW1lfSlgLFxuICAgICAgYnVpbGRTcGVjLFxuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uOiB0aGlzLnN1Ym5ldFNlbGVjdGlvbixcbiAgICAgIHJvbGU6IHRoaXMucm9sZSxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IHRoaXMuYnVpbGRJbWFnZSxcbiAgICAgICAgY29tcHV0ZVR5cGU6IHRoaXMuY29tcHV0ZVR5cGUsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgbG9nZ2luZzoge1xuICAgICAgICBjbG91ZFdhdGNoOiB7XG4gICAgICAgICAgbG9nR3JvdXAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gcGVybWlzc2lvbnNcbiAgICB0aGlzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChwcm9qZWN0KTtcblxuICAgIC8vIGNhbGwgQ29kZUJ1aWxkIGR1cmluZyBkZXBsb3ltZW50IGFuZCBkZWxldGUgYWxsIGltYWdlcyBmcm9tIHJlcG9zaXRvcnkgZHVyaW5nIGRlc3RydWN0aW9uXG4gICAgY29uc3QgY3IgPSB0aGlzLmN1c3RvbVJlc291cmNlKHByb2plY3QsIGJ1aWxkU3BlYy50b0J1aWxkU3BlYygpKTtcblxuICAgIC8vIHJlYnVpbGQgaW1hZ2Ugb24gYSBzY2hlZHVsZVxuICAgIHRoaXMucmVidWlsZEltYWdlT25TY2hlZHVsZShwcm9qZWN0LCB0aGlzLnJlYnVpbGRJbnRlcnZhbCk7XG5cbiAgICAvLyByZXR1cm4gdGhlIGltYWdlXG4gICAgdGhpcy5ib3VuZERvY2tlckltYWdlID0ge1xuICAgICAgaW1hZ2VSZXBvc2l0b3J5OiBlY3IuUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeUF0dHJpYnV0ZXModGhpcywgJ0RlcGVuZGFibGUgSW1hZ2UnLCB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBzaW1wbGVyIHdheXMgdG8gZ2V0IG5hbWUgYW5kIEFSTiwgYnV0IHdlIHdhbnQgYW4gaW1hZ2Ugb2JqZWN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgY3VzdG9tIHJlc291cmNlLlxuICAgICAgICAvLyBXZSB3YW50IHdob2V2ZXIgaXMgdXNpbmcgdGhpcyBpbWFnZSB0byBhdXRvbWF0aWNhbGx5IHdhaXQgZm9yIENvZGVCdWlsZCB0byBzdGFydCBhbmQgZmluaXNoIHRocm91Z2ggdGhlIGN1c3RvbSByZXNvdXJjZS5cbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IGNyLmdldEF0dFN0cmluZygnTmFtZScpLFxuICAgICAgICByZXBvc2l0b3J5QXJuOiBjci5yZWYsXG4gICAgICB9KSxcbiAgICAgIGltYWdlVGFnOiAnbGF0ZXN0JyxcbiAgICAgIGFyY2hpdGVjdHVyZTogdGhpcy5hcmNoaXRlY3R1cmUsXG4gICAgICBvczogdGhpcy5vcyxcbiAgICAgIGxvZ0dyb3VwLFxuICAgICAgcnVubmVyVmVyc2lvbjogUnVubmVyVmVyc2lvbi5zcGVjaWZpYygndW5rbm93bicpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYm91bmREb2NrZXJJbWFnZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdEJ1aWxkSW1hZ2UoKTogY29kZWJ1aWxkLklCdWlsZEltYWdlIHtcbiAgICBpZiAodGhpcy5vcy5pcyhPcy5MSU5VWF9VQlVOVFUpIHx8IHRoaXMub3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpIHx8IHRoaXMub3MuaXMoT3MuTElOVVgpKSB7XG4gICAgICAvLyBDb2RlQnVpbGQganVzdCBydW5zIGBkb2NrZXIgYnVpbGRgIHNvIGl0cyBPUyBkb2Vzbid0IHJlYWxseSBtYXR0ZXJcbiAgICAgIGlmICh0aGlzLmFyY2hpdGVjdHVyZS5pcyhBcmNoaXRlY3R1cmUuWDg2XzY0KSkge1xuICAgICAgICByZXR1cm4gY29kZWJ1aWxkLkxpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF82XzA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5BUk02NCkpIHtcbiAgICAgICAgcmV0dXJuIGNvZGVidWlsZC5MaW51eEFybUJ1aWxkSW1hZ2UuQU1BWk9OX0xJTlVYXzJfU1RBTkRBUkRfMl8wO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5vcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlQnVpbGQgY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgV2luZG93cyBEb2NrZXIgaW1hZ2VzIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2NrZXItbGlicmFyeS9kb2NrZXIvaXNzdWVzLzQ5Jyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBDb2RlQnVpbGQgaW1hZ2UgZm9yICR7dGhpcy5vcy5uYW1lfS8ke3RoaXMuYXJjaGl0ZWN0dXJlLm5hbWV9YCk7XG4gIH1cblxuICBwcml2YXRlIGdldERvY2tlcmZpbGVHZW5lcmF0aW9uQ29tbWFuZHMoKSB7XG4gICAgbGV0IGNvbW1hbmRzID0gW107XG4gICAgbGV0IGRvY2tlcmZpbGUgPSBgRlJPTSAke3RoaXMuYmFzZUltYWdlfVxcblZPTFVNRSAvdmFyL2xpYi9kb2NrZXJcXG5gO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSB0aGlzLmNvbXBvbmVudHNbaV0ubmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0RGVzY3JpcHRvcnMgPSB0aGlzLmNvbXBvbmVudHNbaV0uZ2V0QXNzZXRzKHRoaXMub3MsIHRoaXMuYXJjaGl0ZWN0dXJlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhc3NldERlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLm9zLmlzKE9zLldJTkRPV1MpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYWRkIGFzc2V0IGFzIHdlIGNhbid0IGJ1aWxkIFdpbmRvd3MgRG9ja2VyIGltYWdlcyBvbiBDb2RlQnVpbGRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3NldCA9IG5ldyBzM19hc3NldHMuQXNzZXQodGhpcywgYENvbXBvbmVudCAke2l9ICR7Y29tcG9uZW50TmFtZX0gQXNzZXQgJHtqfWAsIHtcbiAgICAgICAgICBwYXRoOiBhc3NldERlc2NyaXB0b3JzW2pdLnNvdXJjZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFzc2V0LmlzRmlsZSkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goYGF3cyBzMyBjcCAke2Fzc2V0LnMzT2JqZWN0VXJsfSBhc3NldCR7aX0tJHtjb21wb25lbnROYW1lfS0ke2p9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXNzZXQuaXNaaXBBcmNoaXZlKSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaChgYXdzIHMzIGNwICR7YXNzZXQuczNPYmplY3RVcmx9IGFzc2V0JHtpfS0ke2NvbXBvbmVudE5hbWV9LSR7an0uemlwYCk7XG4gICAgICAgICAgY29tbWFuZHMucHVzaChgdW56aXAgYXNzZXQke2l9LSR7Y29tcG9uZW50TmFtZX0tJHtqfS56aXAgLWQgXCJhc3NldCR7aX0tJHtjb21wb25lbnROYW1lfS0ke2p9XCJgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXNzZXQgdHlwZTogJHthc3NldH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY2tlcmZpbGUgKz0gYENPUFkgYXNzZXQke2l9LSR7Y29tcG9uZW50TmFtZX0tJHtqfSAke2Fzc2V0RGVzY3JpcHRvcnNbal0udGFyZ2V0fVxcbmA7XG5cbiAgICAgICAgYXNzZXQuZ3JhbnRSZWFkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb25lbnRDb21tYW5kcyA9IHRoaXMuY29tcG9uZW50c1tpXS5nZXRDb21tYW5kcyh0aGlzLm9zLCB0aGlzLmFyY2hpdGVjdHVyZSk7XG4gICAgICBjb25zdCBzY3JpcHQgPSAnIyEvYmluL2Jhc2hcXG5zZXQgLWV4dW8gcGlwZWZhaWxcXG4nICsgY29tcG9uZW50Q29tbWFuZHMuam9pbignXFxuJyk7XG4gICAgICBjb21tYW5kcy5wdXNoKGBjYXQgPiBjb21wb25lbnQke2l9LSR7Y29tcG9uZW50TmFtZX0uc2ggPDwnRU9GR0lUSFVCUlVOTkVSU0RPQ0tFUkZJTEUnXFxuJHtzY3JpcHR9XFxuRU9GR0lUSFVCUlVOTkVSU0RPQ0tFUkZJTEVgKTtcbiAgICAgIGNvbW1hbmRzLnB1c2goYGNobW9kICt4IGNvbXBvbmVudCR7aX0tJHtjb21wb25lbnROYW1lfS5zaGApO1xuICAgICAgZG9ja2VyZmlsZSArPSBgQ09QWSBjb21wb25lbnQke2l9LSR7Y29tcG9uZW50TmFtZX0uc2ggL3RtcFxcbmA7XG4gICAgICBkb2NrZXJmaWxlICs9IGBSVU4gL3RtcC9jb21wb25lbnQke2l9LSR7Y29tcG9uZW50TmFtZX0uc2hcXG5gO1xuXG4gICAgICBkb2NrZXJmaWxlICs9IHRoaXMuY29tcG9uZW50c1tpXS5nZXREb2NrZXJDb21tYW5kcyh0aGlzLm9zLCB0aGlzLmFyY2hpdGVjdHVyZSkuam9pbignXFxuJykgKyAnXFxuJztcbiAgICB9XG5cbiAgICBjb21tYW5kcy5wdXNoKGBjYXQgPiBEb2NrZXJmaWxlIDw8J0VPRkdJVEhVQlJVTk5FUlNET0NLRVJGSUxFJ1xcbiR7ZG9ja2VyZmlsZX1cXG5FT0ZHSVRIVUJSVU5ORVJTRE9DS0VSRklMRWApO1xuXG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZFNwZWMocmVwb3NpdG9yeTogZWNyLlJlcG9zaXRvcnksIGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwKTogY29kZWJ1aWxkLkJ1aWxkU3BlYyB7XG4gICAgY29uc3QgdGhpc1N0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuXG4gICAgcmV0dXJuIGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbU9iamVjdCh7XG4gICAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgICAgIGVudjoge1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBSRVBPX0FSTjogcmVwb3NpdG9yeS5yZXBvc2l0b3J5QXJuLFxuICAgICAgICAgIFJFUE9fVVJJOiByZXBvc2l0b3J5LnJlcG9zaXRvcnlVcmksXG4gICAgICAgICAgU1RBQ0tfSUQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgUkVRVUVTVF9JRDogJ3Vuc3BlY2lmaWVkJyxcbiAgICAgICAgICBMT0dJQ0FMX1JFU09VUkNFX0lEOiAndW5zcGVjaWZpZWQnLFxuICAgICAgICAgIFJFU1BPTlNFX1VSTDogJ3Vuc3BlY2lmaWVkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwaGFzZXM6IHtcbiAgICAgICAgcHJlX2J1aWxkOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgIGBhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiBcIiRBV1NfREVGQVVMVF9SRUdJT05cIiB8IGRvY2tlciBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGluICR7dGhpc1N0YWNrLmFjY291bnR9LmRrci5lY3IuJHt0aGlzU3RhY2sucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBidWlsZDoge1xuICAgICAgICAgIGNvbW1hbmRzOiB0aGlzLmdldERvY2tlcmZpbGVHZW5lcmF0aW9uQ29tbWFuZHMoKS5jb25jYXQoW1xuICAgICAgICAgICAgJ2RvY2tlciBidWlsZCAuIC10IFwiJFJFUE9fVVJJXCInLFxuICAgICAgICAgICAgJ2RvY2tlciBwdXNoIFwiJFJFUE9fVVJJXCInLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgICBwb3N0X2J1aWxkOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdTVEFUVVM9XCJTVUNDRVNTXCInLFxuICAgICAgICAgICAgJ2lmIFsgJENPREVCVUlMRF9CVUlMRF9TVUNDRUVESU5HIC1uZSAxIF07IHRoZW4gU1RBVFVTPVwiRkFJTEVEXCI7IGZpJyxcbiAgICAgICAgICAgICdjYXQgPDxFT0YgPiAvdG1wL3BheWxvYWQuanNvblxcbicgK1xuICAgICAgICAgICAgICAne1xcbicgK1xuICAgICAgICAgICAgICAnICBcIlN0YWNrSWRcIjogXCIkU1RBQ0tfSURcIixcXG4nICtcbiAgICAgICAgICAgICAgJyAgXCJSZXF1ZXN0SWRcIjogXCIkUkVRVUVTVF9JRFwiLFxcbicgK1xuICAgICAgICAgICAgICAnICBcIkxvZ2ljYWxSZXNvdXJjZUlkXCI6IFwiJExPR0lDQUxfUkVTT1VSQ0VfSURcIixcXG4nICtcbiAgICAgICAgICAgICAgJyAgXCJQaHlzaWNhbFJlc291cmNlSWRcIjogXCIkUkVQT19BUk5cIixcXG4nICtcbiAgICAgICAgICAgICAgJyAgXCJTdGF0dXNcIjogXCIkU1RBVFVTXCIsXFxuJyArXG4gICAgICAgICAgICAgIGAgIFwiUmVhc29uXCI6IFwiU2VlIGxvZ3MgaW4gJHtsb2dHcm91cC5sb2dHcm91cE5hbWV9LyRDT0RFQlVJTERfTE9HX1BBVEggKGRlcGxveSBhZ2FpbiB3aXRoIFxcJ2NkayBkZXBsb3kgLVJcXCcgb3IgbG9nUmVtb3ZhbFBvbGljeT1SZW1vdmFsUG9saWN5LlJFVEFJTiBpZiB0aGV5IGFyZSBhbHJlYWR5IGRlbGV0ZWQpXCIsXFxuYCArXG4gICAgICAgICAgICAgIGAgIFwiRGF0YVwiOiB7XCJOYW1lXCI6IFwiJHtyZXBvc2l0b3J5LnJlcG9zaXRvcnlOYW1lfVwifVxcbmAgK1xuICAgICAgICAgICAgICAnfVxcbicgK1xuICAgICAgICAgICAgICAnRU9GJyxcbiAgICAgICAgICAgICdpZiBbIFwiJFJFU1BPTlNFX1VSTFwiICE9IFwidW5zcGVjaWZpZWRcIiBdOyB0aGVuIGpxIC4gL3RtcC9wYXlsb2FkLmpzb247IGN1cmwgLWZzU0wgLVggUFVUIC1IIFwiQ29udGVudC1UeXBlOlwiIC1kIFwiQC90bXAvcGF5bG9hZC5qc29uXCIgXCIkUkVTUE9OU0VfVVJMXCI7IGZpJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3VzdG9tUmVzb3VyY2UocHJvamVjdDogY29kZWJ1aWxkLlByb2plY3QsIGJ1aWxkU3BlYzogc3RyaW5nKSB7XG4gICAgY29uc3QgY3JIYW5kbGVyID0gc2luZ2xldG9uTGFtYmRhKEJ1aWxkSW1hZ2VGdW5jdGlvbiwgdGhpcywgJ2J1aWxkLWltYWdlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b20gcmVzb3VyY2UgaGFuZGxlciB0aGF0IHRyaWdnZXJzIENvZGVCdWlsZCB0byBidWlsZCBydW5uZXIgaW1hZ2VzLCBhbmQgY2xlYW5zLXVwIGltYWdlcyBvbiBkZWxldGlvbicsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygzKSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvbGljeSA9IG5ldyBpYW0uUG9saWN5KHRoaXMsICdDUiBQb2xpY3knLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NvZGVidWlsZDpTdGFydEJ1aWxkJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbcHJvamVjdC5wcm9qZWN0QXJuXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2VjcjpCYXRjaERlbGV0ZUltYWdlJywgJ2VjcjpMaXN0SW1hZ2VzJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlBcm5dLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgY3JIYW5kbGVyLnJvbGUhLmF0dGFjaElubGluZVBvbGljeShwb2xpY3kpO1xuXG4gICAgY29uc3QgY3IgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0J1aWxkZXInLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGNySGFuZGxlci5mdW5jdGlvbkFybixcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6SW1hZ2VCdWlsZGVyJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVwb05hbWU6IHRoaXMucmVwb3NpdG9yeS5yZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgUHJvamVjdE5hbWU6IHByb2plY3QucHJvamVjdE5hbWUsXG4gICAgICAgIC8vIFdlIGluY2x1ZGUgdGhlIGZ1bGwgYnVpbGRTcGVjIHNvIHRoZSBpbWFnZSBpcyBidWlsdCBpbW1lZGlhdGVseSBvbiBjaGFuZ2VzLCBhbmQgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBpdHMgc2NoZWR1bGVkIGJ1aWxkLlxuICAgICAgICAvLyBUaGlzIGFsc28gaGVscHMgbWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGFyZSBnb29kLiBJZiB0aGV5IGhhdmUgYSBidWcsIHRoZSBkZXBsb3ltZW50IHdpbGwgZmFpbCBpbnN0ZWFkIG9mIGp1c3QgdGhlIHNjaGVkdWxlZCBidWlsZC5cbiAgICAgICAgQnVpbGRTcGVjOiBidWlsZFNwZWMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgcmVzb3VyY2VzIGFyZSB0aGVyZSB3aGVuIHdlIG5lZWQgdGhlbVxuICAgIGNyLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9qZWN0KTtcbiAgICBjci5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBjci5ub2RlLmFkZERlcGVuZGVuY3kocG9saWN5KTtcbiAgICBjci5ub2RlLmFkZERlcGVuZGVuY3koY3JIYW5kbGVyLnJvbGUhKTtcbiAgICBjci5ub2RlLmFkZERlcGVuZGVuY3koY3JIYW5kbGVyKTtcblxuICAgIHJldHVybiBjcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVidWlsZEltYWdlT25TY2hlZHVsZShwcm9qZWN0OiBjb2RlYnVpbGQuUHJvamVjdCwgcmVidWlsZEludGVydmFsPzogRHVyYXRpb24pIHtcbiAgICByZWJ1aWxkSW50ZXJ2YWwgPSByZWJ1aWxkSW50ZXJ2YWwgPz8gRHVyYXRpb24uZGF5cyg3KTtcbiAgICBpZiAocmVidWlsZEludGVydmFsLnRvTWlsbGlzZWNvbmRzKCkgIT0gMCkge1xuICAgICAgY29uc3Qgc2NoZWR1bGVSdWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdCdWlsZCBTY2hlZHVsZScsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBSZWJ1aWxkIHJ1bm5lciBpbWFnZSBmb3IgJHt0aGlzLnJlcG9zaXRvcnkucmVwb3NpdG9yeU5hbWV9YCxcbiAgICAgICAgc2NoZWR1bGU6IGV2ZW50cy5TY2hlZHVsZS5yYXRlKHJlYnVpbGRJbnRlcnZhbCksXG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlUnVsZS5hZGRUYXJnZXQobmV3IGV2ZW50c190YXJnZXRzLkNvZGVCdWlsZFByb2plY3QocHJvamVjdCkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnMge1xuICAgIHJldHVybiBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLnNlY3VyaXR5R3JvdXBzLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGdyYW50UHJpbmNpcGFsKCk6IGlhbS5JUHJpbmNpcGFsIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlQnVpbGRJbWFnZUJ1aWxkZXJGYWlsZWRCdWlsZE5vdGlmaWVyIGltcGxlbWVudHMgY2RrLklBc3BlY3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRvcGljOiBzbnMuSVRvcGljKSB7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbm9kZSBhcyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXI7XG4gICAgICBjb25zdCBwcm9qZWN0ID0gYnVpbGRlci5ub2RlLmZpbmRDaGlsZCgnQ29kZUJ1aWxkJykgYXMgY29kZWJ1aWxkLlByb2plY3Q7XG4gICAgICBwcm9qZWN0Lm5vdGlmeU9uQnVpbGRGYWlsZWQoJ0J1aWxkRmFpbGVkJywgdGhpcy50b3BpYyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -3,7 +3,7 @@ import { Construct } from 'constructs';
3
3
  import { AwsImageBuilderRunnerImageBuilderProps } from './aws-image-builder';
4
4
  import { CodeBuildRunnerImageBuilderProps } from './codebuild';
5
5
  import { RunnerImageComponent } from './components';
6
- import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../common';
6
+ import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../providers/common';
7
7
  /**
8
8
  * @internal
9
9
  */
@@ -126,7 +126,9 @@ export interface RunnerImageBuilderProps {
126
126
  /**
127
127
  * Base AMI from which runner AMIs will be built.
128
128
  *
129
- * @default latest Ubuntu 20.04 AMI for Os.LINUX_UBUNTU, latest Amazon Linux 2 AMI for Os.LINUX_AMAZON_2, latest Windows Server 2022 AMI for Os.WINDOWS
129
+ * This can be an actual AMI or an AWS Image Builder ARN that points to the latest AMI. For example `arn:aws:imagebuilder:us-east-1:aws:image/ubuntu-server-22-lts-x86/x.x.x` would always use the latest version of Ubuntu 22.04 in each build. If you want a specific version, you can replace `x.x.x` with that version.
130
+ *
131
+ * @default latest Ubuntu 22.04 AMI for Os.LINUX_UBUNTU, latest Amazon Linux 2 AMI for Os.LINUX_AMAZON_2, latest Windows Server 2022 AMI for Os.WINDOWS
130
132
  */
131
133
  readonly baseAmi?: string;
132
134
  /**
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunnerImageBuilderBase = exports.RunnerImageBuilderType = exports.uniqueImageBuilderName = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ /**
7
+ * @internal
8
+ */
9
+ function uniqueImageBuilderName(scope) {
10
+ return cdk.Names.uniqueResourceName(scope, {
11
+ maxLength: 126,
12
+ separator: '-',
13
+ allowedSpecialCharacters: '_-',
14
+ });
15
+ }
16
+ exports.uniqueImageBuilderName = uniqueImageBuilderName;
17
+ var RunnerImageBuilderType;
18
+ (function (RunnerImageBuilderType) {
19
+ /**
20
+ * Build runner images using AWS CodeBuild.
21
+ *
22
+ * Faster than AWS Image Builder, but can only be used to build Linux Docker images.
23
+ */
24
+ RunnerImageBuilderType["CODE_BUILD"] = "CodeBuild";
25
+ /**
26
+ * Build runner images using AWS Image Builder.
27
+ *
28
+ * Slower than CodeBuild, but can be used to build any type of image including AMIs and Windows images.
29
+ */
30
+ RunnerImageBuilderType["AWS_IMAGE_BUILDER"] = "AwsImageBuilder";
31
+ })(RunnerImageBuilderType = exports.RunnerImageBuilderType || (exports.RunnerImageBuilderType = {}));
32
+ /**
33
+ * @internal
34
+ */
35
+ class RunnerImageBuilderBase extends constructs_1.Construct {
36
+ constructor(scope, id, props) {
37
+ super(scope, id);
38
+ this.components = [];
39
+ if (props?.components) {
40
+ this.components.push(...props.components);
41
+ }
42
+ }
43
+ /**
44
+ * Add a component to the image builder. The component will be added to the end of the list of components.
45
+ *
46
+ * @param component component to add
47
+ */
48
+ addComponent(component) {
49
+ this.components.push(component);
50
+ }
51
+ /**
52
+ * Remove a component from the image builder. Removal is done by component name. Multiple components with the same name will all be removed.
53
+ *
54
+ * @param component component to remove
55
+ */
56
+ removeComponent(component) {
57
+ this.components = this.components.filter(c => c.name !== component.name);
58
+ }
59
+ }
60
+ exports.RunnerImageBuilderBase = RunnerImageBuilderBase;
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFFbkMsMkNBQXVDO0FBTXZDOztHQUVHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsS0FBZ0I7SUFDckQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtRQUN6QyxTQUFTLEVBQUUsR0FBRztRQUNkLFNBQVMsRUFBRSxHQUFHO1FBQ2Qsd0JBQXdCLEVBQUUsSUFBSTtLQUMvQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBTkQsd0RBTUM7QUE0TkQsSUFBWSxzQkFjWDtBQWRELFdBQVksc0JBQXNCO0lBQ2hDOzs7O09BSUc7SUFDSCxrREFBd0IsQ0FBQTtJQUV4Qjs7OztPQUlHO0lBQ0gsK0RBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQWRXLHNCQUFzQixHQUF0Qiw4QkFBc0IsS0FBdEIsOEJBQXNCLFFBY2pDO0FBNkJEOztHQUVHO0FBQ0gsTUFBc0Isc0JBQXVCLFNBQVEsc0JBQVM7SUFHNUQsWUFBc0IsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDakYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhULGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBS2hELElBQUksS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFTRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLFNBQStCO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZSxDQUFDLFNBQStCO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0Y7QUFuQ0Qsd0RBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGF3c19lYzIgYXMgZWMyLCBhd3NfaWFtIGFzIGlhbSwgYXdzX2xvZ3MgYXMgbG9ncywgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEF3c0ltYWdlQnVpbGRlclJ1bm5lckltYWdlQnVpbGRlclByb3BzIH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcyB9IGZyb20gJy4vY29kZWJ1aWxkJztcbmltcG9ydCB7IFJ1bm5lckltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgT3MsIFJ1bm5lckFtaSwgUnVubmVySW1hZ2UsIFJ1bm5lclZlcnNpb24gfSBmcm9tICcuLi9wcm92aWRlcnMvY29tbW9uJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUltYWdlQnVpbGRlck5hbWUoc2NvcGU6IENvbnN0cnVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBjZGsuTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHNjb3BlLCB7XG4gICAgbWF4TGVuZ3RoOiAxMjYsXG4gICAgc2VwYXJhdG9yOiAnLScsXG4gICAgYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzOiAnXy0nLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZUJ1aWxkZXJCYXNlUHJvcHMge1xuICAvKipcbiAgICogSW1hZ2UgYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHtAbGluayBhcmNoaXRlY3R1cmV9LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcG9ydGVkQXJjaGl0ZWN0dXJlczogQXJjaGl0ZWN0dXJlW107XG5cbiAgLyoqXG4gICAqIEltYWdlIE9TLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPUy5MSU5VWFxuICAgKi9cbiAgcmVhZG9ubHkgb3M/OiBPcztcblxuICAvKipcbiAgICogTGlzdCBvZiBzdXBwb3J0ZWQgT1MgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHtAbGluayBvc30uXG4gICAqL1xuICByZWFkb25seSBzdXBwb3J0ZWRPczogT3NbXTtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBHaXRIdWIgUnVubmVycyB0byBpbnN0YWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYXRlc3QgdmVyc2lvbiBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHJ1bm5lclZlcnNpb24/OiBSdW5uZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSB0aGUgQU1JIHRvIGJlIHJlYnVpbHQgZXZlcnkgZ2l2ZW4gaW50ZXJ2YWwuIFVzZWZ1bCBmb3Iga2VlcGluZyB0aGUgQU1JIHVwLWRvLWRhdGUgd2l0aCB0aGUgbGF0ZXN0IEdpdEh1YiBydW5uZXIgdmVyc2lvbiBhbmQgbGF0ZXN0IE9TIHVwZGF0ZXMuXG4gICAqXG4gICAqIFNldCB0byB6ZXJvIHRvIGRpc2FibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmRheXMoNylcbiAgICovXG4gIHJlYWRvbmx5IHJlYnVpbGRJbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBWUEMgd2hlcmUgYnVpbGRlciBpbnN0YW5jZXMgd2lsbCBiZSBsYXVuY2hlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdCBhY2NvdW50IFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwcyB0byBhc3NpZ24gdG8gbGF1bmNoZWQgYnVpbGRlciBpbnN0YW5jZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5ldyBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdCBWUEMgc3VibmV0XG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgdHlwZSB1c2VkIHRvIGJ1aWxkIHRoZSBpbWFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgbTUubGFyZ2VcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZT86IGVjMi5JbnN0YW5jZVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBsb2cgZXZlbnRzIGFyZSBrZXB0IGluIENsb3VkV2F0Y2ggTG9ncy4gV2hlbiB1cGRhdGluZ1xuICAgKiB0aGlzIHByb3BlcnR5LCB1bnNldHRpbmcgaXQgZG9lc24ndCByZW1vdmUgdGhlIGxvZyByZXRlbnRpb24gcG9saWN5LiBUb1xuICAgKiByZW1vdmUgdGhlIHJldGVudGlvbiBwb2xpY3ksIHNldCB0aGUgdmFsdWUgdG8gYElORklOSVRFYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9ncyBvZiBpbWFnZSBidWlsZHMuIElmIGRlcGxveW1lbnQgZmFpbHMgb24gdGhlIGN1c3RvbSByZXNvdXJjZSwgdHJ5IHNldHRpbmcgdGhpcyB0byBgUmVtb3ZhbFBvbGljeS5SRVRBSU5gLiBUaGlzIHdheSB0aGUgbG9ncyBjYW4gc3RpbGwgYmUgdmlld2VkLCBhbmQgeW91IGNhbiBzZWUgd2h5IHRoZSBidWlsZCBmYWlsZWQuXG4gICAqXG4gICAqIFdlIHRyeSB0byBub3QgbGVhdmUgYW55dGhpbmcgYmVoaW5kIHdoZW4gcmVtb3ZlZC4gQnV0IHNvbWV0aW1lcyBhIGxvZyBzdGF5aW5nIGJlaGluZCBpcyB1c2VmdWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIGFuZCBpbmZyYXN0cnVjdHVyZSBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVHlwZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBc3NldCB0byBjb3B5IGludG8gYSBidWlsdCBpbWFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5uZXJJbWFnZUFzc2V0IHtcbiAgLyoqXG4gICAqIFBhdGggb24gbG9jYWwgc3lzdGVtIHRvIGNvcHkgaW50byB0aGUgaW1hZ2UuIENhbiBiZSBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGFyZ2V0IHBhdGggaW4gdGhlIGJ1aWx0IGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMge1xuICAvKipcbiAgICogSW1hZ2UgYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIEltYWdlIE9TLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPUy5MSU5VWFxuICAgKi9cbiAgcmVhZG9ubHkgb3M/OiBPcztcblxuICAvKipcbiAgICogQmFzZSBpbWFnZSBmcm9tIHdoaWNoIERvY2tlciBydW5uZXIgaW1hZ2VzIHdpbGwgYmUgYnVpbHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHB1YmxpYy5lY3IuYXdzL2x0cy91YnVudHU6MjIuMDQgZm9yIE9zLkxJTlVYX1VCVU5UVSwgcHVibGljLmVjci5hd3MvYW1hem9ubGludXgvYW1hem9ubGludXg6MiBmb3IgT3MuTElOVVhfQU1BWk9OXzIsIG1jci5taWNyb3NvZnQuY29tL3dpbmRvd3Mvc2VydmVyY29yZTpsdHNjMjAxOS1hbWQ2NCBmb3IgT3MuV0lORE9XU1xuICAgKi9cbiAgcmVhZG9ubHkgYmFzZURvY2tlckltYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCYXNlIEFNSSBmcm9tIHdoaWNoIHJ1bm5lciBBTUlzIHdpbGwgYmUgYnVpbHQuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIGFuIGFjdHVhbCBBTUkgb3IgYW4gQVdTIEltYWdlIEJ1aWxkZXIgQVJOIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXRlc3QgQU1JLiBGb3IgZXhhbXBsZSBgYXJuOmF3czppbWFnZWJ1aWxkZXI6dXMtZWFzdC0xOmF3czppbWFnZS91YnVudHUtc2VydmVyLTIyLWx0cy14ODYveC54LnhgIHdvdWxkIGFsd2F5cyB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFVidW50dSAyMi4wNCBpbiBlYWNoIGJ1aWxkLiBJZiB5b3Ugd2FudCBhIHNwZWNpZmljIHZlcnNpb24sIHlvdSBjYW4gcmVwbGFjZSBgeC54LnhgIHdpdGggdGhhdCB2ZXJzaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYXRlc3QgVWJ1bnR1IDIyLjA0IEFNSSBmb3IgT3MuTElOVVhfVUJVTlRVLCBsYXRlc3QgQW1hem9uIExpbnV4IDIgQU1JIGZvciBPcy5MSU5VWF9BTUFaT05fMiwgbGF0ZXN0IFdpbmRvd3MgU2VydmVyIDIwMjIgQU1JIGZvciBPcy5XSU5ET1dTXG4gICAqL1xuICByZWFkb25seSBiYXNlQW1pPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIEdpdEh1YiBSdW5uZXJzIHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhdGVzdCB2ZXJzaW9uIGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyVmVyc2lvbj86IFJ1bm5lclZlcnNpb247XG5cbiAgLyoqXG4gICAqIENvbXBvbmVudHMgdG8gaW5zdGFsbCBvbiB0aGUgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBSdW5uZXJJbWFnZUNvbXBvbmVudFtdO1xuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSB0aGUgaW1hZ2UgdG8gYmUgcmVidWlsdCBldmVyeSBnaXZlbiBpbnRlcnZhbC4gVXNlZnVsIGZvciBrZWVwaW5nIHRoZSBpbWFnZSB1cC1kby1kYXRlIHdpdGggdGhlIGxhdGVzdCBHaXRIdWIgcnVubmVyIHZlcnNpb24gYW5kIGxhdGVzdCBPUyB1cGRhdGVzLlxuICAgKlxuICAgKiBTZXQgdG8gemVybyB0byBkaXNhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDcpXG4gICAqL1xuICByZWFkb25seSByZWJ1aWxkSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVlBDIHRvIGJ1aWxkIHRoZSBpbWFnZSBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gVlBDXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogU2VjdXJpdHkgR3JvdXBzIHRvIGFzc2lnbiB0byB0aGlzIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gc3VibmV0XG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBDbG91ZFdhdGNoIExvZ3MuIFdoZW4gdXBkYXRpbmdcbiAgICogdGhpcyBwcm9wZXJ0eSwgdW5zZXR0aW5nIGl0IGRvZXNuJ3QgcmVtb3ZlIHRoZSBsb2cgcmV0ZW50aW9uIHBvbGljeS4gVG9cbiAgICogcmVtb3ZlIHRoZSByZXRlbnRpb24gcG9saWN5LCBzZXQgdGhlIHZhbHVlIHRvIGBJTkZJTklURWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEhcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIGxvZ3Mgb2YgaW1hZ2UgYnVpbGRzLiBJZiBkZXBsb3ltZW50IGZhaWxzIG9uIHRoZSBjdXN0b20gcmVzb3VyY2UsIHRyeSBzZXR0aW5nIHRoaXMgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYC4gVGhpcyB3YXkgdGhlIENvZGVCdWlsZCBsb2dzIGNhbiBzdGlsbCBiZSB2aWV3ZWQsIGFuZCB5b3UgY2FuIHNlZSB3aHkgdGhlIGJ1aWxkIGZhaWxlZC5cbiAgICpcbiAgICogV2UgdHJ5IHRvIG5vdCBsZWF2ZSBhbnl0aGluZyBiZWhpbmQgd2hlbiByZW1vdmVkLiBCdXQgc29tZXRpbWVzIGEgbG9nIHN0YXlpbmcgYmVoaW5kIGlzIHVzZWZ1bC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogQGRlZmF1bHQgQ29kZUJ1aWxkIGZvciBMaW51eCBEb2NrZXIgaW1hZ2UsIEFXUyBJbWFnZSBCdWlsZGVyIGZvciBXaW5kb3dzIERvY2tlciBpbWFnZSBhbmQgYW55IEFNSVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRlclR5cGU/OiBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHNwZWNpZmljIHRvIENvZGVCdWlsZCBpbWFnZSBidWlsZGVyLiBPbmx5IHVzZWQgd2hlbiBidWlsZGVyVHlwZSBpcyBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkNPREVfQlVJTEQuXG4gICAqL1xuICByZWFkb25seSBjb2RlQnVpbGRPcHRpb25zPzogQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyUHJvcHM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgc3BlY2lmaWMgdG8gQVdTIEltYWdlIEJ1aWxkZXIuIE9ubHkgdXNlZCB3aGVuIGJ1aWxkZXJUeXBlIGlzIFJ1bm5lckltYWdlQnVpbGRlclR5cGUuQVdTX0lNQUdFX0JVSUxERVIuXG4gICAqL1xuICByZWFkb25seSBhd3NJbWFnZUJ1aWxkZXJPcHRpb25zPzogQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyUHJvcHM7XG59XG5cbmV4cG9ydCBlbnVtIFJ1bm5lckltYWdlQnVpbGRlclR5cGUge1xuICAvKipcbiAgICogQnVpbGQgcnVubmVyIGltYWdlcyB1c2luZyBBV1MgQ29kZUJ1aWxkLlxuICAgKlxuICAgKiBGYXN0ZXIgdGhhbiBBV1MgSW1hZ2UgQnVpbGRlciwgYnV0IGNhbiBvbmx5IGJlIHVzZWQgdG8gYnVpbGQgTGludXggRG9ja2VyIGltYWdlcy5cbiAgICovXG4gIENPREVfQlVJTEQgPSAnQ29kZUJ1aWxkJyxcblxuICAvKipcbiAgICogQnVpbGQgcnVubmVyIGltYWdlcyB1c2luZyBBV1MgSW1hZ2UgQnVpbGRlci5cbiAgICpcbiAgICogU2xvd2VyIHRoYW4gQ29kZUJ1aWxkLCBidXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYW55IHR5cGUgb2YgaW1hZ2UgaW5jbHVkaW5nIEFNSXMgYW5kIFdpbmRvd3MgaW1hZ2VzLlxuICAgKi9cbiAgQVdTX0lNQUdFX0JVSUxERVIgPSAnQXdzSW1hZ2VCdWlsZGVyJyxcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbnN0cnVjdHMgdGhhdCBidWlsZCBhbiBpbWFnZSB0aGF0IGNhbiBiZSB1c2VkIGluIHtAbGluayBJUnVubmVyUHJvdmlkZXJ9LlxuICpcbiAqIEFuIGltYWdlIGNhbiBiZSBhIERvY2tlciBpbWFnZSBvciBBTUkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJ1bm5lckltYWdlQnVpbGRlciB7XG4gIC8qKlxuICAgKiBCdWlsZCBhbmQgcmV0dXJuIGEgRG9ja2VyIGltYWdlIHdpdGggR2l0SHViIFJ1bm5lciBpbnN0YWxsZWQgaW4gaXQuXG4gICAqXG4gICAqIEFueXRoaW5nIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEVDUiByZXBvc2l0b3J5IGNvbnRhaW5pbmcgYSBEb2NrZXIgaW1hZ2UgdGhhdCBydW5zIEdpdEh1YiBzZWxmLWhvc3RlZCBydW5uZXJzIGNhbiBiZSB1c2VkLiBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCBldmVuIHBvaW50IHRvIGFuIGV4aXN0aW5nIGltYWdlIGFuZCBub3RoaW5nIGVsc2UuXG4gICAqXG4gICAqIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIHNwZWNpZmllZCBpbWFnZSB0YWcgYmUgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSByZXBvc2l0b3J5IGlzIGF2YWlsYWJsZS4gUHJvdmlkZXJzIHVzdWFsbHkgYXNzdW1lIHRoZSBpbWFnZSBpcyByZWFkeSBhbmQgd2lsbCBmYWlsIGlmIGl0J3Mgbm90LlxuICAgKlxuICAgKiBUaGUgaW1hZ2UgY2FuIGJlIGZ1cnRoZXIgdXBkYXRlZCBvdmVyIHRpbWUgbWFudWFsbHkgb3IgdXNpbmcgYSBzY2hlZHVsZSBhcyBsb25nIGFzIGl0IGlzIGFsd2F5cyB3cml0dGVuIHRvIHRoZSBzYW1lIHRhZy5cbiAgICovXG4gIGJpbmREb2NrZXJJbWFnZSgpOiBSdW5uZXJJbWFnZTtcblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhbiBBTUkgd2l0aCBHaXRIdWIgUnVubmVyIGluc3RhbGxlZCBpbiBpdC5cbiAgICpcbiAgICogQW55dGhpbmcgdGhhdCBlbmRzIHVwIHdpdGggYSBsYXVuY2ggdGVtcGxhdGUgcG9pbnRpbmcgdG8gYW4gQU1JIHRoYXQgcnVucyBHaXRIdWIgc2VsZi1ob3N0ZWQgcnVubmVycyBjYW4gYmUgdXNlZC4gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gY291bGQgZXZlbiBwb2ludCB0byBhbiBleGlzdGluZyBBTUkgYW5kIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogVGhlIEFNSSBjYW4gYmUgZnVydGhlciB1cGRhdGVkIG92ZXIgdGltZSBtYW51YWxseSBvciB1c2luZyBhIHNjaGVkdWxlIGFzIGxvbmcgYXMgaXQgaXMgYWx3YXlzIHdyaXR0ZW4gdG8gdGhlIHNhbWUgbGF1bmNoIHRlbXBsYXRlLlxuICAgKi9cbiAgYmluZEFtaSgpOiBSdW5uZXJBbWk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSdW5uZXJJbWFnZUJ1aWxkZXJCYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgZWMyLklDb25uZWN0YWJsZSwgaWFtLklHcmFudGFibGUsIElSdW5uZXJJbWFnZUJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgY29tcG9uZW50czogUnVubmVySW1hZ2VDb21wb25lbnRbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFJ1bm5lckltYWdlQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcz8uY29tcG9uZW50cykge1xuICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goLi4ucHJvcHMuY29tcG9uZW50cyk7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgYmluZERvY2tlckltYWdlKCk6IFJ1bm5lckltYWdlO1xuXG4gIGFic3RyYWN0IGJpbmRBbWkoKTogUnVubmVyQW1pO1xuXG4gIGFic3RyYWN0IGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnM7XG4gIGFic3RyYWN0IGdldCBncmFudFByaW5jaXBhbCgpOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQWRkIGEgY29tcG9uZW50IHRvIHRoZSBpbWFnZSBidWlsZGVyLiBUaGUgY29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50IGNvbXBvbmVudCB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRDb21wb25lbnQoY29tcG9uZW50OiBSdW5uZXJJbWFnZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29tcG9uZW50IGZyb20gdGhlIGltYWdlIGJ1aWxkZXIuIFJlbW92YWwgaXMgZG9uZSBieSBjb21wb25lbnQgbmFtZS4gTXVsdGlwbGUgY29tcG9uZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgd2lsbCBhbGwgYmUgcmVtb3ZlZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbXBvbmVudCBjb21wb25lbnQgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudDogUnVubmVySW1hZ2VDb21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYy5uYW1lICE9PSBjb21wb25lbnQubmFtZSk7XG4gIH1cbn1cblxuIl19
@@ -1,7 +1,7 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { ImageBuilderComponent } from './aws-image-builder';
3
3
  import { RunnerImageAsset } from './common';
4
- import { Architecture, Os, RunnerVersion } from '../common';
4
+ import { Architecture, Os, RunnerVersion } from '../providers';
5
5
  export interface RunnerImageComponentCustomProps {
6
6
  /**
7
7
  * Component name used for (1) image build logging and (2) identifier for {@link ImageRunnerBuilder.removeComponent}.
@@ -67,7 +67,9 @@ export declare abstract class RunnerImageComponent {
67
67
  */
68
68
  static githubRunner(runnerVersion: RunnerVersion): RunnerImageComponent;
69
69
  /**
70
- * A component to install Docker. On Windows this installs Docker Desktop.
70
+ * A component to install Docker.
71
+ *
72
+ * On Windows this sets up dockerd for Windows containers without Docker Desktop. If you need Linux containers on Windows, you'll need to install Docker Desktop which doesn't seem to play well with servers (PRs welcome).
71
73
  */
72
74
  static docker(): RunnerImageComponent;
73
75
  /**
@@ -105,6 +107,10 @@ export declare abstract class RunnerImageComponent {
105
107
  * Docker commands are added after assets and normal commands.
106
108
  */
107
109
  getDockerCommands(_os: Os, _architecture: Architecture): string[];
110
+ /**
111
+ * Returns true if the image builder should be rebooted after this component is installed.
112
+ */
113
+ shouldReboot(_os: Os, _architecture: Architecture): boolean;
108
114
  /**
109
115
  * Convert component to an AWS Image Builder component.
110
116
  *