@rio-cloud/cdk-v2-constructs 8.8.2 → 9.0.0-alpha.1

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 (67) hide show
  1. package/.jsii +3550 -7420
  2. package/lib/contributions/cop-frontend/cloudfront/rio-cloudfront-distribution.js +1 -5
  3. package/lib/contributions/smart-route/gitlab-runner/autoscaling-runner.js +1 -5
  4. package/lib/contributions/smart-route/gitlab-runner/runner-roles.js +1 -5
  5. package/lib/contributions/smart-route/gitlab-runner/spot-role.js +1 -5
  6. package/lib/contributions/team-claid/aws-backup-monitoring/aws-backup-monitoring.js +1 -7
  7. package/lib/contributions/team-claid/aws-glue/csv-table.js +1 -5
  8. package/lib/contributions/team-claid/aws-glue/schema.js +1 -5
  9. package/lib/contributions/team-claid/aws-glue/view-table.js +1 -5
  10. package/lib/contributions/team-claid/datadog-usage-monitoring/datadog-usage-monitoring.js +1 -5
  11. package/lib/contributions/team-outbound-order-book/aws-ecs-abruptly-stopped-monitor/aws-ecs-abruptly-stopped-monitor.js +1 -5
  12. package/lib/contributions/team-outbound-order-book/index.d.ts +1 -0
  13. package/lib/contributions/team-outbound-order-book/index.js +18 -0
  14. package/lib/contributions/team-shipper-inbound-blue/index.d.ts +1 -0
  15. package/lib/contributions/team-shipper-inbound-blue/index.js +18 -0
  16. package/lib/contributions/team-shipper-inbound-blue/pipeline/code-build-project.js +1 -5
  17. package/lib/contributions/team-shipper-inbound-blue/pipeline/pipeline-build-stage-actions.js +1 -5
  18. package/lib/contributions/team-transport/datadog/datadog-dashboard-construct.js +41 -0
  19. package/lib/contributions/team-transport/datadog/datadog-dashboard-downloader.js +120 -0
  20. package/lib/contributions/{team-transport-two → team-transport}/datadog/index.js +1 -1
  21. package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/datadog-synthetics-test-custom-resource/handler.cjs +109 -106
  22. package/lib/contributions/team-transport/datadog-synthetics/datadog-synthetics-test.js +77 -0
  23. package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/index.js +1 -1
  24. package/lib/contributions/team-transport/index.d.ts +3 -0
  25. package/lib/contributions/team-transport/index.js +20 -0
  26. package/lib/contributions/team-transport/pipeline/application-stage.js +16 -0
  27. package/lib/contributions/team-transport/pipeline/build-project.js +39 -0
  28. package/lib/contributions/{team-transport-two → team-transport}/pipeline/buildspecs.d.ts +3 -3
  29. package/lib/contributions/team-transport/pipeline/buildspecs.js +227 -0
  30. package/lib/contributions/team-transport/pipeline/datadog-monitors.js +45 -0
  31. package/lib/contributions/{team-transport-two → team-transport}/pipeline/index.js +1 -1
  32. package/lib/contributions/team-transport/pipeline/monitoring-deploy-step.js +28 -0
  33. package/lib/contributions/{team-transport-two → team-transport}/pipeline/pipeline-stack.d.ts +2 -0
  34. package/lib/contributions/team-transport/pipeline/pipeline-stack.js +430 -0
  35. package/lib/datadogv2/datadog-lambda-instrumentation.d.ts +1 -1
  36. package/lib/datadogv2/datadog-lambda-instrumentation.js +5 -2
  37. package/lib/datadogv2/secret-locator-custom-resource/on-create.cjs +85 -76
  38. package/lib/datadogv2/service-catalog-custom-resource/on-create.cjs +85 -82
  39. package/lib/datadogv2/validate-lambda-environment.d.ts +3 -0
  40. package/lib/datadogv2/validate-lambda-environment.js +33 -0
  41. package/lib/fargate/codedeploy-custom-resources/create-deployment-is-complete.cjs +85 -76
  42. package/lib/fargate/codedeploy-custom-resources/create-deployment-on-create.cjs +85 -76
  43. package/lib/fargate/codedeploy-custom-resources/run-monitoring-test-suite-runner.cjs +90 -81
  44. package/lib/index.d.ts +0 -8
  45. package/lib/index.js +1 -9
  46. package/lib/sbom-catalog/lambda/handler.cjs +88 -84
  47. package/package.json +22 -11
  48. package/version.json +1 -1
  49. package/lib/contributions/team-transport-two/datadog/datadog-dashboard-construct.js +0 -45
  50. package/lib/contributions/team-transport-two/datadog/datadog-dashboard-downloader.js +0 -120
  51. package/lib/contributions/team-transport-two/datadog-synthetics/datadog-synthetics-test.js +0 -81
  52. package/lib/contributions/team-transport-two/pipeline/application-stage.js +0 -16
  53. package/lib/contributions/team-transport-two/pipeline/build-project.js +0 -39
  54. package/lib/contributions/team-transport-two/pipeline/buildspecs.js +0 -205
  55. package/lib/contributions/team-transport-two/pipeline/datadog-monitors.js +0 -45
  56. package/lib/contributions/team-transport-two/pipeline/monitoring-deploy-step.js +0 -28
  57. package/lib/contributions/team-transport-two/pipeline/pipeline-stack.js +0 -432
  58. /package/lib/contributions/{team-transport-two → team-transport}/datadog/datadog-dashboard-construct.d.ts +0 -0
  59. /package/lib/contributions/{team-transport-two → team-transport}/datadog/datadog-dashboard-downloader.d.ts +0 -0
  60. /package/lib/contributions/{team-transport-two → team-transport}/datadog/index.d.ts +0 -0
  61. /package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/datadog-synthetics-test.d.ts +0 -0
  62. /package/lib/contributions/{team-transport-two → team-transport}/datadog-synthetics/index.d.ts +0 -0
  63. /package/lib/contributions/{team-transport-two → team-transport}/pipeline/application-stage.d.ts +0 -0
  64. /package/lib/contributions/{team-transport-two → team-transport}/pipeline/build-project.d.ts +0 -0
  65. /package/lib/contributions/{team-transport-two → team-transport}/pipeline/datadog-monitors.d.ts +0 -0
  66. /package/lib/contributions/{team-transport-two → team-transport}/pipeline/index.d.ts +0 -0
  67. /package/lib/contributions/{team-transport-two → team-transport}/pipeline/monitoring-deploy-step.d.ts +0 -0
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipelineStack = exports.PipelineType = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
6
+ const codepipeline = require("aws-cdk-lib/aws-codepipeline");
7
+ const codepipeline_actions = require("aws-cdk-lib/aws-codepipeline-actions");
8
+ const events = require("aws-cdk-lib/aws-events");
9
+ const targets = require("aws-cdk-lib/aws-events-targets");
10
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
11
+ const s3 = require("aws-cdk-lib/aws-s3");
12
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
13
+ const ssm = require("aws-cdk-lib/aws-ssm");
14
+ const pipelines = require("aws-cdk-lib/pipelines");
15
+ const pipelines_1 = require("aws-cdk-lib/pipelines");
16
+ const fs = require("fs");
17
+ const yaml = require("js-yaml");
18
+ const path = require("path");
19
+ const iam_1 = require("../../../iam");
20
+ const rio = require("../../../index");
21
+ const index_1 = require("../../../index");
22
+ const application_stage_1 = require("./application-stage");
23
+ const build_project_1 = require("./build-project");
24
+ const buildspecs_1 = require("./buildspecs");
25
+ const datadog_monitors_1 = require("./datadog-monitors");
26
+ const monitoring_deploy_step_1 = require("./monitoring-deploy-step");
27
+ var PipelineType;
28
+ (function (PipelineType) {
29
+ /**
30
+ * Self-mutating codepipeline deploying the provided AppStack. Be aware: The provided service won't have access to Kafka.
31
+ *
32
+ * Comes with a pre-defined buildspec.yaml for a gradle project. This buildspec.yaml is used for both the main and
33
+ * branch pipeline and includes the following steps
34
+ * - build and test of the artifact via command "./gradlew clean build".
35
+ * <p> This gradle command must be provided by the gradle project.
36
+ * - license-check and upload of license-check-file using @rio-cloud/rio-license-checker.
37
+ * <p> This gradle command must be provided by the gradle project.
38
+ * - create a self-signed certificate to make TLS communication possible, e.g. with a loadbalancer.
39
+ * - build the container image via command "./gradlew jibBuildTar".
40
+ * <p> This gradle command must be provided by the gradle project.
41
+ */
42
+ PipelineType["STANDARD_GRADLE"] = "STANDARD_GRADLE";
43
+ /**
44
+ * Self-mutating codepipeline deploying the provided AppStack with additional steps needed to access Kafka.
45
+ *
46
+ * Comes with a pre-defined buildspec.yaml for a gradle project. This buildspec.yaml is used for both the main and
47
+ * branch pipeline and includes the following steps
48
+ * - build and test of the artifact via command "./gradlew clean build".
49
+ * <p> This gradle command must be provided by the gradle project.
50
+ * - license-check and upload of license-check-file using @rio-cloud/rio-license-checker.
51
+ * <p> This gradle command must be provided by the gradle project.
52
+ * - create a self-signed certificate to make TLS communication possible, e.g. with a loadbalancer.
53
+ * - request a certificate to authenticate against Kafka via mutual TLS
54
+ * - build the container image via command "./gradlew jibBuildTar".
55
+ * <p> This gradle command must be provided by the gradle project.
56
+ */
57
+ PipelineType["STANDARD_GRADLE_KAFKA"] = "STANDARD_GRADLE_KAFKA";
58
+ /**
59
+ * Self-mutating codepipeline deploying the provided AppStack.
60
+ *
61
+ * Comes with a pre-defined buildspec.yaml to synthesize the AppStack.
62
+ * No branch or vulnerability pipeline is created.
63
+ */
64
+ PipelineType["STANDARD_INFRASTRUCTURE"] = "STANDARD_INFRASTRUCTURE";
65
+ })(PipelineType || (exports.PipelineType = PipelineType = {}));
66
+ class PipelineStack extends aws_cdk_lib_1.Stack {
67
+ constructor(scope, id, props) {
68
+ super(scope, id, props);
69
+ this._features = this.parseFeatures(props);
70
+ // populate external parameters
71
+ this._bucket = s3.Bucket.fromBucketName(this, 'TriggerBucket', aws_cdk_lib_1.Fn.importValue('bitbucket-integration-s3-bucket'));
72
+ this._cacheBucket = new s3.Bucket(this, 'CacheBucket', {
73
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
74
+ autoDeleteObjects: true,
75
+ lifecycleRules: [
76
+ {
77
+ expiration: aws_cdk_lib_1.Duration.days(30),
78
+ abortIncompleteMultipartUploadAfter: aws_cdk_lib_1.Duration.days(7),
79
+ },
80
+ ],
81
+ });
82
+ this._hostedZone = rio.RioLandingZone.getDefaultHostedZone(this);
83
+ this._inputMasterTriggerFile = pipelines.CodePipelineSource.s3(this._bucket, `${props.serviceName}/trigger/${rio.TriggerKey.MASTER_REPO}`, { trigger: codepipeline_actions.S3Trigger.EVENTS });
84
+ this._inputBranchTriggerFile = pipelines.CodePipelineSource.s3(this._bucket, `${props.serviceName}/trigger/${rio.TriggerKey.BRANCH_REPO}`, { trigger: codepipeline_actions.S3Trigger.EVENTS });
85
+ this._ossLicensesBucketParameter = ssm.StringParameter.fromStringParameterAttributes(this, 'OssLicensesBucketParameter', { parameterName: '/config/oss-licenses/bucket-name' });
86
+ this._ossLicensesBucket = s3.Bucket.fromBucketName(this, 'OssLicensesBucket', this._ossLicensesBucketParameter.stringValue);
87
+ this._serviceKeystorePassword = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'KeystorePassword', {
88
+ parameterName: `/config/${props.serviceName}/service-keystore-password`,
89
+ version: 1,
90
+ });
91
+ this._accountNameParameter = ssm.StringParameter.fromStringParameterName(this, 'AccountNameParameter', '/config/account/name');
92
+ this._teamIdentifierParameter = ssm.StringParameter.fromStringParameterName(this, 'TeamIdentifierParameter', '/config/team/identifier');
93
+ this._nistDataMirrorUrl = ssm.StringParameter.fromSecureStringParameterAttributes(this, 'NistDataMirrorUrl', {
94
+ parameterName: '/config/nist-data-mirror/url',
95
+ version: 1,
96
+ });
97
+ this._codePipelineType = props.codePipelineType ?? codepipeline.PipelineType.V1;
98
+ this._mainCodeBuildProject = this.createMainCodeBuildProject(props);
99
+ this.addMainPipeline(this._mainCodeBuildProject, props);
100
+ if (this._features.branchPipeline) {
101
+ this._branchCodeBuildProject = this.createBranchCodeBuildProject(props);
102
+ this.addBranchPipeline(this._branchCodeBuildProject);
103
+ }
104
+ if (this._features.vulnerabilityPipeline) {
105
+ this._vulnerabilityCodeBuildProject = this.createVulnerabilityBuildProject(props);
106
+ this.addVulnerabilityPipeline(this._vulnerabilityCodeBuildProject, props);
107
+ }
108
+ const [feature, packageName] = __dirname.split(path.sep).reverse();
109
+ new index_1.Claidometer(this, 'Claidometer', {
110
+ product: index_1.ClaidometerProduct.CDK_CONTRIBUTION,
111
+ packageName,
112
+ feature,
113
+ version: '1.6.0',
114
+ });
115
+ }
116
+ get mainCodebuildProject() {
117
+ return this._mainCodeBuildProject;
118
+ }
119
+ get branchCodeBuildProject() {
120
+ if (this._branchCodeBuildProject === undefined) {
121
+ throw Error('The pipeline type you have selected does not support a branch codebuild project');
122
+ }
123
+ return this._branchCodeBuildProject;
124
+ }
125
+ get vulnerabilityCodeBuildProject() {
126
+ if (this._vulnerabilityCodeBuildProject === undefined) {
127
+ throw Error('The pipeline type you have selected does not support a vulnerability codebuild project');
128
+ }
129
+ return this._vulnerabilityCodeBuildProject;
130
+ }
131
+ parseFeatures(props) {
132
+ if (props.pipelineType && props.features) {
133
+ throw Error('You cannot provide both a pipelineType and features. Please use features only.');
134
+ }
135
+ if (props.features?.kafkaIntegration && !props.features?.gradleBuild) {
136
+ throw Error('Kafka integration is only supported for pipelines with gradle build');
137
+ }
138
+ if (props.features?.frontendBucketName && !props.features?.npmBuild) {
139
+ throw Error('Frontend bucket name can only be set when npm build is enabled');
140
+ }
141
+ if (props.features?.additionalBuildCommands && props.codeBuildOptions?.partialBuildSpecPath) {
142
+ throw Error('You cannot provide additionalBuildCommands if you use a partialBuildSpecPath.');
143
+ }
144
+ if (props.features && props.codeBuildOptions?.partialBuildSpecPath) {
145
+ console.warn('You are using the pipeline features in combination with a partialBuildSpecPath. Please keep in mind, that all buildspec related features are ignored and the partialBuildSpec is applied.');
146
+ }
147
+ if (props.pipelineType) {
148
+ switch (props.pipelineType) {
149
+ case PipelineType.STANDARD_GRADLE:
150
+ return {
151
+ branchPipeline: true,
152
+ vulnerabilityPipeline: true,
153
+ gradleBuild: true,
154
+ npmBuild: false,
155
+ kafkaIntegration: false,
156
+ enablePipelineMonitors: true,
157
+ };
158
+ case PipelineType.STANDARD_GRADLE_KAFKA:
159
+ return {
160
+ branchPipeline: true,
161
+ vulnerabilityPipeline: true,
162
+ gradleBuild: true,
163
+ npmBuild: false,
164
+ kafkaIntegration: true,
165
+ enablePipelineMonitors: true,
166
+ };
167
+ case PipelineType.STANDARD_INFRASTRUCTURE:
168
+ return {
169
+ branchPipeline: false,
170
+ vulnerabilityPipeline: false,
171
+ gradleBuild: false,
172
+ npmBuild: false,
173
+ kafkaIntegration: false,
174
+ enablePipelineMonitors: true,
175
+ };
176
+ }
177
+ }
178
+ return {
179
+ branchPipeline: props.features?.branchPipeline ?? true,
180
+ vulnerabilityPipeline: props.features?.vulnerabilityPipeline ?? true,
181
+ gradleBuild: props.features?.gradleBuild ?? false,
182
+ npmBuild: props.features?.npmBuild ?? false,
183
+ kafkaIntegration: props.features?.kafkaIntegration ?? false,
184
+ frontendBucketName: props.features?.frontendBucketName,
185
+ additionalBuildCommands: props.features?.additionalBuildCommands,
186
+ enablePipelineMonitors: props.features?.enablePipelineMonitors ?? true,
187
+ };
188
+ }
189
+ createRioCodeBuildProject(name, cdkOutputDirectory, triggerFile, buildSpec, props) {
190
+ return new build_project_1.RioCodeBuildProject(this, name, {
191
+ input: triggerFile,
192
+ cdkOutDirectory: cdkOutputDirectory,
193
+ partialBuildSpec: buildSpec,
194
+ buildEnvironment: props?.codeBuildOptions?.buildEnvironment,
195
+ hostedZoneName: this._hostedZone.zoneName,
196
+ serviceName: props.serviceName,
197
+ cacheBucket: this._cacheBucket,
198
+ });
199
+ }
200
+ createMainCodeBuildProject(props) {
201
+ const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath) ||
202
+ (0, buildspecs_1.createMainBuildSpec)(this._features, props.codeBuildOptions);
203
+ return this.createRioCodeBuildProject('MainBuild', 'infrastructure/cdk.out', this._inputMasterTriggerFile, buildSpec, props);
204
+ }
205
+ createBranchCodeBuildProject(props) {
206
+ const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.partialBuildSpecPath) ||
207
+ (0, buildspecs_1.createMainBuildSpec)(this._features, props.codeBuildOptions);
208
+ return this.createRioCodeBuildProject('BranchBuild', 'infrastructure/cdk.out', this._inputBranchTriggerFile, buildSpec, props);
209
+ }
210
+ createVulnerabilityBuildProject(props) {
211
+ const buildSpec = this.loadBuildSpecFromFile(props?.codeBuildOptions?.vulnerabilityPartialBuildSpecPath) ||
212
+ (0, buildspecs_1.createVulnerabilityBuildSpec)(this._features, props.codeBuildOptions);
213
+ return this.createRioCodeBuildProject('VulnerabilityChecks', './', this._inputMasterTriggerFile, buildSpec, props);
214
+ }
215
+ addMainPipeline(mainBuild, props) {
216
+ const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
217
+ artifactBucket: this._cacheBucket,
218
+ pipelineType: this._codePipelineType,
219
+ restartExecutionOnUpdate: true,
220
+ });
221
+ const codePipeline = new pipelines.CodePipeline(pipeline, 'CodePipeline', {
222
+ codePipeline: pipeline,
223
+ synth: mainBuild,
224
+ selfMutationCodeBuildDefaults: {
225
+ buildEnvironment: {
226
+ buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
227
+ computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
228
+ },
229
+ },
230
+ });
231
+ aws_cdk_lib_1.Tags.of(pipeline).add('pipeline_type', 'build');
232
+ const stripAssetsStep = this.createStripAssetsStep(codePipeline);
233
+ codePipeline.addWave('BeforeDeploy', { pre: [stripAssetsStep] });
234
+ const capabilityMonitoringDeployStep = this.createCapabilityMonitoringDeployStep(mainBuild, props);
235
+ const secretsDeployStepProps = this.createSecretsDeployStep(props);
236
+ const frontendDeployStep = this.createDeployFrontendDeployStep(mainBuild);
237
+ const postSteps = [];
238
+ if (capabilityMonitoringDeployStep) {
239
+ postSteps.push(capabilityMonitoringDeployStep);
240
+ }
241
+ if (frontendDeployStep) {
242
+ postSteps.push(frontendDeployStep);
243
+ }
244
+ codePipeline.addStage(new application_stage_1.Application(this, 'DeployApplicationStacks', {
245
+ appStackFactory: props.appStackFactory,
246
+ serviceName: props.serviceName,
247
+ version: process.env.PIPELINE_EXECUTION_ID ?? 'PIPELINE_EXECUTION_ID not set',
248
+ }), {
249
+ pre: secretsDeployStepProps ? [secretsDeployStepProps] : undefined,
250
+ post: postSteps,
251
+ });
252
+ codePipeline.buildPipeline();
253
+ this.tagCodeBuildProject(stripAssetsStep, 'project_type', 'strip_assets');
254
+ this.tagCodeBuildProject(secretsDeployStepProps, 'project_type', 'deploy_secrets');
255
+ this.tagCodeBuildProject(mainBuild, 'project_type', 'build');
256
+ this.tagCodeBuildProject(capabilityMonitoringDeployStep, 'project_type', 'deploy_capability_monitoring');
257
+ this.tagCodeBuildProject(frontendDeployStep, 'project_type', 'deploy_frontend');
258
+ if (capabilityMonitoringDeployStep) {
259
+ const monitoringTestsuiteRunnerBucket = aws_s3_1.Bucket.fromBucketName(this, 'MonitoringTestsuiteRunnerBucket', `monitoring-testsuite-runner-${this.account}`);
260
+ monitoringTestsuiteRunnerBucket.grantWrite(capabilityMonitoringDeployStep);
261
+ }
262
+ if (frontendDeployStep) {
263
+ const frontendBucket = s3.Bucket.fromBucketName(this, 'FrontendBucket', this._features.frontendBucketName);
264
+ frontendBucket.grantReadWrite(frontendDeployStep);
265
+ }
266
+ const rule = new events.Rule(this, 'PipelineSchedule', {
267
+ schedule: events.Schedule.expression(props.pipelineSchedules?.mainPipeline || 'cron(0 9 ? * 2#1 *)'),
268
+ });
269
+ rule.addTarget(new targets.CodePipeline(codePipeline.pipeline));
270
+ this._ossLicensesBucket.grantReadWrite(mainBuild);
271
+ this._ossLicensesBucketParameter.grantRead(mainBuild);
272
+ this._serviceKeystorePassword.grantRead(mainBuild);
273
+ this._accountNameParameter.grantRead(mainBuild);
274
+ this._teamIdentifierParameter.grantRead(mainBuild);
275
+ if (this._features.kafkaIntegration) {
276
+ this.grantPermissionsForKafkaIntegration(mainBuild, 'KafkaIntegrationPolicy');
277
+ }
278
+ codePipeline.pipeline.artifactBucket.grantReadWrite(stripAssetsStep.project);
279
+ if (this._features?.enablePipelineMonitors) {
280
+ new datadog_monitors_1.DatadogPipelineErrorAlert(this, 'DatadogPipelineErrorMonitor', {
281
+ serviceName: props.serviceName,
282
+ pipelineName: pipeline.pipelineName,
283
+ accountId: this.account,
284
+ });
285
+ }
286
+ }
287
+ addBranchPipeline(branchBuild) {
288
+ const branchPipeline = new codepipeline.Pipeline(this, 'BranchPipeline', {
289
+ artifactBucket: this._cacheBucket,
290
+ pipelineType: this._codePipelineType,
291
+ restartExecutionOnUpdate: true,
292
+ });
293
+ const branchCodePipeline = new pipelines.CodePipeline(branchPipeline, 'CodePipeline', {
294
+ codePipeline: branchPipeline,
295
+ synth: branchBuild,
296
+ selfMutation: false,
297
+ });
298
+ aws_cdk_lib_1.Tags.of(branchPipeline).add('pipeline_type', 'branch');
299
+ branchCodePipeline.addWave('BranchBuild').addPost(branchBuild);
300
+ branchCodePipeline.buildPipeline();
301
+ this.tagCodeBuildProject(branchBuild, 'project_type', 'branch_build');
302
+ this._ossLicensesBucket.grantReadWrite(branchBuild);
303
+ this._ossLicensesBucketParameter.grantRead(branchBuild);
304
+ this._serviceKeystorePassword.grantRead(branchBuild);
305
+ this._accountNameParameter.grantRead(branchBuild);
306
+ this._teamIdentifierParameter.grantRead(branchBuild);
307
+ if (this._features.kafkaIntegration) {
308
+ this.grantPermissionsForKafkaIntegration(branchBuild, 'BranchKafkaIntegrationPolicy');
309
+ }
310
+ }
311
+ addVulnerabilityPipeline(vulnerabilityBuild, props) {
312
+ const vulnerabilityPipeline = new codepipeline.Pipeline(this, 'VulnerabilityPipeline', {
313
+ artifactBucket: this._cacheBucket,
314
+ pipelineType: this._codePipelineType,
315
+ restartExecutionOnUpdate: true,
316
+ });
317
+ const vulnerabilityCodePipeline = new pipelines.CodePipeline(vulnerabilityPipeline, 'CodePipeline', {
318
+ codePipeline: vulnerabilityPipeline,
319
+ synth: vulnerabilityBuild,
320
+ selfMutation: false,
321
+ });
322
+ aws_cdk_lib_1.Tags.of(vulnerabilityPipeline).add('pipeline_type', 'vulnerability');
323
+ vulnerabilityCodePipeline.addWave('VulnerabilityChecks').addPost(vulnerabilityBuild);
324
+ vulnerabilityCodePipeline.buildPipeline();
325
+ aws_cdk_lib_1.Tags.of(vulnerabilityBuild.project).add('project_type', 'vulnerability_check');
326
+ this._nistDataMirrorUrl.grantRead(vulnerabilityBuild);
327
+ iam_1.SonatypeOssIndexCredentials.allowAccessTo(this, vulnerabilityBuild);
328
+ const vulnerabilityRule = new events.Rule(this, 'VulnerabilityPipelineSchedule', {
329
+ schedule: events.Schedule.expression(props.pipelineSchedules?.vulnerabilityPipeline || 'cron(0 5 ? * MON-FRI *)'),
330
+ });
331
+ vulnerabilityRule.addTarget(new targets.CodePipeline(vulnerabilityCodePipeline.pipeline));
332
+ if (props.datadogAlertType === 'opsgenie') {
333
+ throw Error('The OpsGenie alertType is not supported anymore. Please use the vulnerabilityNotification property instead.');
334
+ }
335
+ if (this._features?.enablePipelineMonitors) {
336
+ new datadog_monitors_1.DataDogPipelineErrorAlertForVulnerabilityChecks(this, 'DataDogPipelineErrorForVulnerabilityChecksMonitor', {
337
+ serviceName: props.serviceName,
338
+ pipelineName: vulnerabilityPipeline.pipelineName,
339
+ accountId: this.account,
340
+ notification: props.vulnerabilityNotification,
341
+ });
342
+ }
343
+ }
344
+ createStripAssetsStep(pipeline) {
345
+ // CloudAssemblyArtifacts must be smaller than 256MB. Due to the gradle artifact we are exceeding this limit and pipeline fails in deployment step.
346
+ // Issue is known and not fixed for already some years. See: https://github.com/aws/aws-cdk/issues/9917
347
+ // Dirty fix: Assets are already uploaded and thus not needed. Remove them from pipeline artifact.
348
+ return new pipelines_1.CodeBuildStep('StripAssetsFromAssembly', {
349
+ input: pipeline.cloudAssemblyFileSet,
350
+ commands: [
351
+ 'S3_PATH=${CODEBUILD_SOURCE_VERSION#"arn:aws:s3:::"}',
352
+ 'ZIP_ARCHIVE=$(basename $S3_PATH)',
353
+ 'rm -rfv asset.*',
354
+ 'zip -r -q -A $ZIP_ARCHIVE *',
355
+ 'aws s3 cp $ZIP_ARCHIVE s3://$S3_PATH',
356
+ ],
357
+ buildEnvironment: {
358
+ buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
359
+ computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
360
+ },
361
+ });
362
+ }
363
+ createCapabilityMonitoringDeployStep(mainBuild, props) {
364
+ if (props.monitoringDeployStepProps) {
365
+ const monitoringArtifacts = Object.keys(props.monitoringDeployStepProps.monitoringArtifacts).map(key => {
366
+ const output = mainBuild.addOutputDirectory(key);
367
+ return {
368
+ input: output,
369
+ files: props.monitoringDeployStepProps.monitoringArtifacts[key],
370
+ };
371
+ });
372
+ return new monitoring_deploy_step_1.RioCapabilityMonitoringDeployStep(this, 'DeployCapabilityMonitoring', {
373
+ monitoringArtifacts: monitoringArtifacts,
374
+ });
375
+ }
376
+ else {
377
+ return undefined;
378
+ }
379
+ }
380
+ createSecretsDeployStep(props) {
381
+ if (props.secretsDeployStepProps) {
382
+ return new rio.RioSecretsDeployStep(this, 'DeploySecrets', {
383
+ ...props.secretsDeployStepProps,
384
+ input: this._inputMasterTriggerFile,
385
+ });
386
+ }
387
+ else {
388
+ return undefined;
389
+ }
390
+ }
391
+ createDeployFrontendDeployStep(mainBuild) {
392
+ if (!this._features.frontendBucketName) {
393
+ return undefined;
394
+ }
395
+ const frontendBuildOutput = mainBuild.addOutputDirectory('build');
396
+ return new pipelines_1.CodeBuildStep('DeployFrontend', {
397
+ input: frontendBuildOutput,
398
+ buildEnvironment: {
399
+ buildImage: aws_codebuild_1.LinuxLambdaBuildImage.AMAZON_LINUX_2023_NODE_20,
400
+ computeType: aws_codebuild_1.ComputeType.LAMBDA_1GB,
401
+ },
402
+ commands: [
403
+ `aws s3 sync --exclude index.html --cache-control max-age=31536000 ./ 's3://${this._features.frontendBucketName}'`,
404
+ `aws s3 cp --cache-control no-cache index.html 's3://${this._features.frontendBucketName}'`,
405
+ ],
406
+ });
407
+ }
408
+ grantPermissionsForKafkaIntegration(buildProject, policyId) {
409
+ const buildProjectRole = buildProject.project.role;
410
+ if (buildProjectRole) {
411
+ buildProjectRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromManagedPolicyArn(this, policyId, aws_cdk_lib_1.Fn.importValue('kafka-integration-policy-arn')));
412
+ }
413
+ else {
414
+ throw Error(`Could not add managed policy for kafka-integration to CodeBuild project of ${buildProject.id} due to missing role.`);
415
+ }
416
+ }
417
+ loadBuildSpecFromFile(buildSpecPath) {
418
+ if (!buildSpecPath) {
419
+ return undefined;
420
+ }
421
+ return aws_codebuild_1.BuildSpec.fromObject(yaml.load(fs.readFileSync(buildSpecPath, { encoding: 'utf-8' })));
422
+ }
423
+ tagCodeBuildProject(project, key, value) {
424
+ if (project) {
425
+ aws_cdk_lib_1.Tags.of(project.project).add(key, value);
426
+ }
427
+ }
428
+ }
429
+ exports.PipelineStack = PipelineStack;
430
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29udHJpYnV0aW9ucy90ZWFtLXRyYW5zcG9ydC9waXBlbGluZS9waXBlbGluZS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBbUY7QUFDbkYsNkRBQTRHO0FBQzVHLDZEQUE2RDtBQUM3RCw2RUFBNkU7QUFDN0UsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBb0Q7QUFFcEQseUNBQXlDO0FBQ3pDLCtDQUFxRDtBQUNyRCwyQ0FBMkM7QUFFM0MsbURBQW1EO0FBQ25ELHFEQUEwRTtBQUUxRSx5QkFBeUI7QUFDekIsZ0NBQWdDO0FBQ2hDLDZCQUE2QjtBQUc3QixzQ0FBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLDBDQUFpRTtBQUNqRSwyREFBa0Q7QUFDbEQsbURBQXNEO0FBQ3RELDZDQUFpRjtBQUNqRix5REFBZ0g7QUFDaEgscUVBQTZFO0FBMkw3RSxJQUFZLFlBcUNYO0FBckNELFdBQVksWUFBWTtJQUN0Qjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxtREFBbUMsQ0FBQTtJQUNuQzs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsK0RBQStDLENBQUE7SUFDL0M7Ozs7O09BS0c7SUFDSCxtRUFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBckNXLFlBQVksNEJBQVosWUFBWSxRQXFDdkI7QUFtQkQsTUFBYSxhQUFjLFNBQVEsbUJBQUs7SUFrQnRDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElB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Q0FBQztJQUVPLG1DQUFtQyxDQUFDLFlBQWlDLEVBQUUsUUFBZ0I7UUFDN0YsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQy9CLHVCQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxnQkFBRSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQ25HLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxDQUNULDhFQUE4RSxZQUFZLENBQUMsRUFBRSx1QkFBdUIsQ0FDckgsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsYUFBc0I7UUFDbEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLHlCQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBVyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQWtDLEVBQUUsR0FBVyxFQUFFLEtBQWE7UUFDeEYsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLGtCQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE5ZEQsc0NBOGRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgU3RhY2tQcm9wcywgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkU3BlYywgQ29tcHV0ZVR5cGUsIExpbnV4TGFtYmRhQnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUnO1xuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lX2FjdGlvbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1hbmFnZWRQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElIb3N0ZWRab25lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEJ1Y2tldCwgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBJU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgKiBhcyBwaXBlbGluZXMgZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvZGVCdWlsZFN0ZXAsIENvZGVQaXBlbGluZVNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRGF0YWRvZ0FsZXJ0VHlwZSB9IGZyb20gJy4uLy4uLy4uL2RhdGFkb2cnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGFkb2d2Mic7XG5pbXBvcnQgeyBTb25hdHlwZU9zc0luZGV4Q3JlZGVudGlhbHMgfSBmcm9tICcuLi8uLi8uLi9pYW0nO1xuaW1wb3J0ICogYXMgcmlvIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENsYWlkb21ldGVyLCBDbGFpZG9tZXRlclByb2R1Y3QgfSBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RhZ2UnO1xuaW1wb3J0IHsgUmlvQ29kZUJ1aWxkUHJvamVjdCB9IGZyb20gJy4vYnVpbGQtcHJvamVjdCc7XG5pbXBvcnQgeyBjcmVhdGVNYWluQnVpbGRTcGVjLCBjcmVhdGVWdWxuZXJhYmlsaXR5QnVpbGRTcGVjIH0gZnJvbSAnLi9idWlsZHNwZWNzJztcbmltcG9ydCB7IERhdGFEb2dQaXBlbGluZUVycm9yQWxlcnRGb3JWdWxuZXJhYmlsaXR5Q2hlY2tzLCBEYXRhZG9nUGlwZWxpbmVFcnJvckFsZXJ0IH0gZnJvbSAnLi9kYXRhZG9nLW1vbml0b3JzJztcbmltcG9ydCB7IFJpb0NhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCB9IGZyb20gJy4vbW9uaXRvcmluZy1kZXBsb3ktc3RlcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTY2hlZHVsZXNQcm9wcyB7XG4gIHJlYWRvbmx5IG1haW5QaXBlbGluZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhpcyBoYXMgdG8gYmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVwb3NpdG9yeSBhcyB0aGUgczMgdHJpZ2dlciBmaWxlIGNyZWF0ZWQgYnkgdGhlIGJpdGJ1Y2tldC1pbnRlZ3JhdGlvbiB1c2VzIHRoaXMgYXMgYSBwcmVmaXhcbiAgICogLSBUaGUgc2VydmljZU5hbWUgaXMgYXZhaWxhYmxlIGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIFNFUlZJQ0VfTkFNRSBpbiB0aGUgQ29kZUJ1aWxkU3RlcFxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcFN0YWNrUHJvcHMgaW4gdGhlIGFwcFN0YWNrRmFjdG9yeVxuICAgKiAtIFRoZSBzZXJ2aWNlTmFtZSBpcyBhdmFpbGFibGUgYXMgc3RhY2tOYW1lIHByb3BlcnR5IGluIHRoZSBBcHBTdGFja1Byb3BzIGluIHRoZSBhcHBTdGFja0ZhY3RvcnkuIEkuZS4gdGhlIHN0YWNrIGlzIG5hbWVkIGFmdGVyIHRoZSBzZXJ2aWNlXG4gICAqIC0gVGhlIHNlcnZpY2VOYW1lIGlzIGhhbmRlZCBvdmVyIHRvIGFsbCBEYXRhZG9nIG1vbml0b3JzXG4gICAqIC0gUklPIGNvbnZlbnRpb24gaXMgdGhhdCB1cGxvYWRlZCBsaWNlbnNlLWNoZWNrLWZpbGVzIGFyZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZSwgaS5lLiBzZXJ2aWNlTmFtZS50eHRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVyIGZvciBhcHBTdGFjayB0byBiZSBkZXBsb3llZC5cbiAgICpcbiAgICogVGhpcyBhY3RzIGFzIGEgd3JhcHBlciBmb3IgYWxsIHJlc291cmNlcyB5b3Ugd2FudCB0byBkZXBsb3kgdmlhIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFN0YWNrRmFjdG9yeTogSUFwcFN0YWNrRmFjdG9yeTtcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBVc2UgdGhlIGZlYXR1cmVzIHRvIGNvbWJpbmUgZGlmZmVyZW50IG9waW5pb25hdGVkLCBSSU8tc3BlY2lmaWMgcGlwZWxpbmUgZmVhdHVyZXMgc3VjaCBhcyBhZGRpbmcgYSBicmFuY2ggcGlwZWxpbmUgb3Igc3VwcG9ydGluZyBLYWZrYS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogUGlwZWxpbmVGZWF0dXJlcztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgZmVhdHVyZXNgIHByb3BlcnR5IGluc3RlYWQuIEZvciBub3csIHRoZSBwaXBlbGluZSB0eXBlcyBhcmUgbWFwcGVkIHRvIHRoZSBmZWF0dXJlcy5cbiAgICogRGVmaW5lcyB3aGljaCBraW5kIG9mIHBpcGVsaW5lIGlzIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVUeXBlPzogUGlwZWxpbmVUeXBlO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGhvdyBvZnRlbiB0aGUgcGlwZWxpbmUgaXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkuIElzIGRlZmluZWQgdmlhIGEgY3JvbiBleHByZXNzaW9uLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2V2ZW50cy9TY2hlZHVsZWRFdmVudHMuaHRtbFxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlczpcbiAgICogLSBtYWluIHBpcGVsaW5lOiBjcm9uKDAgOSA/ICogMiMxICopXG4gICAqIC0gdnVsbmVyYWJpbGl0eSBwaXBlbGluZTogY3JvbigwIDUgPyAqIE1PTi1GUkkgKilcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lU2NoZWR1bGVzPzogUGlwZWxpbmVTY2hlZHVsZXNQcm9wcztcblxuICAvKipcbiAgICogUGF0aCB0byBzZWNyZXRzIGZpbGUgY29udGFpbmluZyBlbmNyeXB0ZWQgc2VjcmV0cy5cbiAgICpcbiAgICogVGhlIFJpb1NlY3JldHNEZXBsb3lTdGVwIGlzIGFkZGVkIHByaW9yIHRvIGRlcGxveW1lbnQgb2YgdGhlIEFwcFN0YWNrIGlmIGEgcGF0aCBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogTm8gc2VjcmV0cyBhcmUgZGVwbG95ZWQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldHNEZXBsb3lTdGVwUHJvcHM/OiBQaXBlbGluZVN0YWNrUmlvU2VjcmV0c0RlcGxveVN0ZXBQcm9wcztcblxuICAvKipcbiAgICogQ29kZUJ1aWxkIG9wdGlvbnMgb3ZlcnJpZGluZyB0aGUgcmlvLXNwZWNpZmljIGRlZmF1bHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUJ1aWxkT3B0aW9ucz86IENvZGVCdWlsZE9wdGlvbnM7XG4gIC8qKlxuICAgKiBJZiBwcmVzZW50LCB0aGUgY2FwYWJpbGl0eSBtb25pdG9yaW5nIGRlcGxveSBzdGVwIGlzIGFkZGVkIHRvIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHM/OiBQaXBlbGluZVN0YWNrUmlvTW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcztcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIGB2dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uYCBwcm9wZXJ0eSBpbnN0ZWFkLlxuICAgKiBJZiBgb3BzZ2VuaWVgIGlzIHNwZWNpZmllZCwgYW4gRXhjZXB0aW9uIGlzIHRocm93biwgYXMgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuXG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nQWxlcnRUeXBlPzogRGF0YWRvZ0FsZXJ0VHlwZTtcbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbiB0eXBlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgdnVsbmVyYWJpbGl0eSBwaXBlbGluZSBtb25pdG9yLiBEZWZhdWx0cyB0byBzbGFjay5cbiAgICovXG4gIHJlYWRvbmx5IHZ1bG5lcmFiaWxpdHlOb3RpZmljYXRpb24/OiBJTm90aWZpY2F0aW9uO1xuICAvKipcbiAgICogQ29kZVBpcGVsaW5lIFBpcGVsaW5lVHlwZSAoVjEgb3IgVjIpLiBEZWZhdWx0cyB0byBWMS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVQaXBlbGluZVR5cGU/OiBjb2RlcGlwZWxpbmUuUGlwZWxpbmVUeXBlO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGludGVyZmFjZSB0byBjcmVhdGUgdGhlIEFwcFN0YWNrIHdpdGhpbiB0aGUgc3BlY2lmaWMgc2NvcGVcbiAqXG4gKiBTaW1wbHkgcGxhY2UgdGhlIEFwcFN0YWNrIGNyZWF0aW9uIGludG8gdGhlIGNyZWF0ZS1tZXRob2Q6XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFVzZSBlLmcuIHdpdGhpbiBBcHBsaWNhdGlvblByb3BzIGFzIEpTT05PYmplY3Q6XG4gKiBcXHsgY3JlYXRlOiAoY29uc3RydWN0LCBwcm9wcykgPVxcPiBuZXcgU3RhY2soY29uc3RydWN0LCAnQXBwU3RhY2snLCBwcm9wcykgXFx9XG4gKlxuICogLy8gb3Igc2ltcGx5IGFzIGNsYXNzIGludGVyZmFjZSB3aXRoaW4geW91ciBzdGFjayBpbXBsZW1lbnRhdGlvbjpcbiAqIGNsYXNzIFBpcGVsaW5lU3RhZ2UgZXh0ZW5kcyBTdGFnZSBpbXBsZW1lbnRzIElBcHBTdGFja0ZhY3RvcnkgXFx7XG4gKiAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGFnZVByb3BzKSBcXHtcbiAqICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAqICAgICAvLyB5b3VyIHN0YWdlIGRlZmluaXRpb25cbiAqICAgXFx9XG4gKlxuICogICBjcmVhdGUoc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IEFwcFN0YWNrUHJvcHMpOiB2b2lkIFxce1xuICogICAgIC8vIGFwcCBzdGFjayBpbml0aWF0aW9uIGdvZXMgaW4gaGVyZVxuICogICBcXH1cbiAqIFxcfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHBTdGFja0ZhY3Rvcnkge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QsIGJlaW5nIGludm9rZWQgd2l0aCB0aGUgc3BlY2lmaWMgc2NvcGUgZHVyaW5nIHBpcGVsaW5lIGluc3RhbnRpYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHBhcmVudCBjb25zdHJ1Y3QgZm9yIHRoZSBhcHAgc3RhY2tcbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIGFwcCBzdGFja3MgcHJvcGVydGllc1xuICAgKi9cbiAgY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBcHBTdGFja1Byb3BzKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RlZCBwcm9wZXJ0aWVzIGJlaW5nIGhhbmRlZCBvdmVyIHRvIFJpb1NlY3JldHNEZXBsb3lTdGVwLlxuICpcbiAqIEBzZWUgcmlvLlJpb1NlY3JldHNEZXBsb3lTdGVwXG4gKiBAc2VlIHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcFByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFja1Jpb1NlY3JldHNEZXBsb3lTdGVwUHJvcHMge1xuICByZWFkb25seSBzZWNyZXRzRmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0YWNrUmlvTW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcyB7XG4gIC8qKlxuICAgKiBNYXAgXFx7ZGlyZWN0b3J5OiBmaWxlbmFtZXNcXH0gY29udGFpbmluZyAgLmphciBvciAuemlwIGZpbGVzIGNyZWF0ZWQgaW4gbWFpbiBidWlsZCBzdGVwIHRvIGJlIHVwbG9hZGVkIHRvIHRoZSBtb25pdG9yaW5nLXRlc3RzdWl0ZS1ydW5uZXIgYnVja2V0LCBlLmcuXG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAnYXZhaWxhYmlsaXR5LW1vbml0b3JpbmcvYnVpbGQvbGlicyc6IFsnZm9vLWF2YWlsYWJpbGl0eS5qYXInXSxcbiAgICogICdwZXJmb3JtYW5jZS1tb25pdG9yaW5nL2J1aWxkL2xpYnMnOiBbJ2FwaS1jaGVjay56aXAnLCAnZm9vLXBlcmZvcm1hbmNlLmphciddLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcmluZ0FydGlmYWN0czogeyBbZGlyZWN0b3J5OiBzdHJpbmddOiBzdHJpbmdbXSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRmVhdHVyZXMge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYnJhbmNoIHBpcGVsaW5lIHVzZWQgYnkgcmVub3ZhdGUuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaFBpcGVsaW5lPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUgdG8gc2NhbiBkZXBlbmRlbmNpZXMgZm9yIHZ1bG5lcmFiaWxpdGllcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBpcGVsaW5lPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJ1biBhIHN0YW5kYXJkIGdyYWRsZSBidWlsZCBpbiB0aGUgcmVwb3NpdG9yeSByb290LiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiAtIGJ1aWxkIGFuZCB0ZXN0IG9mIHRoZSBhcnRpZmFjdCB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBjbGVhbiBidWlsZFwiXG4gICAqIC0gbGljZW5zZS1jaGVjayBhbmQgdXBsb2FkIG9mIGxpY2Vuc2UtY2hlY2stZmlsZSB1c2luZyBAcmlvLWNsb3VkL3Jpby1saWNlbnNlLWNoZWNrZXIuXG4gICAqIC0gY3JlYXRlIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgdG8gbWFrZSBUTFMgY29tbXVuaWNhdGlvbiBwb3NzaWJsZSwgZS5nLiB3aXRoIGEgbG9hZGJhbGFuY2VyXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiXG4gICAqL1xuICByZWFkb25seSBncmFkbGVCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gYSBzdGFuZGFyZCBucG0gYnVpbGQgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdC4gRGVmYXVsdHMgdG8gYGZhbHNlYDpcbiAgICogLSBydW4gbGludGVyIHZpYSBjb21tYW5kIFwibnBtIHJ1biBsaW50XCJcbiAgICogLSBydW4gdGVzdHMgdmlhIGNvbW1hbmQgXCJucG0gcnVuIHRlc3Q6Y2lcIlxuICAgKiAtIHJ1biBhIGxpY2Vuc2UgY2hlY2sgYnkgY2FsbGluZyB0aGUgc2NyaXB0IFwiY2hlY2stb3NzLWxpY2Vuc2VzLnNoXCIgKGZyb20gdGhlIFJJTyBmcm9udGVuZCB0ZW1wbGF0ZSlcbiAgICogLSBidWlsZCB0aGUgYXJ0aWZhY3QgdmlhIGNvbW1hbmQgXCJucG0gcnVuIGJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IG5wbUJ1aWxkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFkZCByZXF1aXJlZCBzdGVwcyBhbmQgcGVybWlzc2lvbnMgdG8gc3VwcG9ydCBLYWZrYS4gQ3VycmVudGx5LCB0aGlzIHJlcXVpcmVzIGBncmFkbGVCdWlsZGAgdG8gYmUgc2V0IHRvIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGthZmthSW50ZWdyYXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogUzMgQnVja2V0IHRvIGRlcGxveSBmcm9udGVuZCB0by4gUmVxdWlyZXMgYG5wbUJ1aWxkYCB0byBiZSBzZXQgdG8gYHRydWVgLiBJZiBzZXQsIHRoZSBvdXRwdXQgb2YgdGhlIG5wbSBidWlsZCBpcyBkZXBsb3llZCB0byB0aGUgcHJvdmlkZWQgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRlbmRCdWNrZXROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBidWlsZCBjb21tYW5kcyBmb3IgbWFpbiBhbmQgYnJhbmNoIHBpcGVsaW5lLiBXaWxsIGJlIGFkZGVkIGFmdGVyIGFsbCBidWlsZCAmIHRlc3QgY29tbWFuZHMsIGJlZm9yZSB0aGUgaW5mcmFzdHJ1Y3R1cmUgYnVpbGQuIERvZXMgbm90IHdvcmsgd2l0aCBwYXJ0aWFsQnVpbGRzcGVjLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJ1aWxkQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIHNldCB0byBmYWxzZSwgbm8gRGF0YWRvZyBtb25pdG9ycyBmb3IgbWFpbiBhbmQgdnVsbmVyYWJpbGl0eSBwaXBlbGluZXMgd2lsbCBiZSBjcmVhdGVkLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGlwZWxpbmVNb25pdG9ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBlbnVtIFBpcGVsaW5lVHlwZSB7XG4gIC8qKlxuICAgKiBTZWxmLW11dGF0aW5nIGNvZGVwaXBlbGluZSBkZXBsb3lpbmcgdGhlIHByb3ZpZGVkIEFwcFN0YWNrLiBCZSBhd2FyZTogVGhlIHByb3ZpZGVkIHNlcnZpY2Ugd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gS2Fma2EuXG4gICAqXG4gICAqIENvbWVzIHdpdGggYSBwcmUtZGVmaW5lZCBidWlsZHNwZWMueWFtbCBmb3IgYSBncmFkbGUgcHJvamVjdC4gVGhpcyBidWlsZHNwZWMueWFtbCBpcyB1c2VkIGZvciBib3RoIHRoZSBtYWluIGFuZFxuICAgKiBicmFuY2ggcGlwZWxpbmUgYW5kIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc3RlcHNcbiAgICogLSBidWlsZCBhbmQgdGVzdCBvZiB0aGUgYXJ0aWZhY3QgdmlhIGNvbW1hbmQgXCIuL2dyYWRsZXcgY2xlYW4gYnVpbGRcIi5cbiAgICogPHA+IFRoaXMgZ3JhZGxlIGNvbW1hbmQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgZ3JhZGxlIHByb2plY3QuXG4gICAqIC0gbGljZW5zZS1jaGVjayBhbmQgdXBsb2FkIG9mIGxpY2Vuc2UtY2hlY2stZmlsZSB1c2luZyBAcmlvLWNsb3VkL3Jpby1saWNlbnNlLWNoZWNrZXIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGNyZWF0ZSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHRvIG1ha2UgVExTIGNvbW11bmljYXRpb24gcG9zc2libGUsIGUuZy4gd2l0aCBhIGxvYWRiYWxhbmNlci5cbiAgICogLSBidWlsZCB0aGUgY29udGFpbmVyIGltYWdlIHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGppYkJ1aWxkVGFyXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKi9cbiAgU1RBTkRBUkRfR1JBRExFID0gJ1NUQU5EQVJEX0dSQURMRScsXG4gIC8qKlxuICAgKiBTZWxmLW11dGF0aW5nIGNvZGVwaXBlbGluZSBkZXBsb3lpbmcgdGhlIHByb3ZpZGVkIEFwcFN0YWNrIHdpdGggYWRkaXRpb25hbCBzdGVwcyBuZWVkZWQgdG8gYWNjZXNzIEthZmthLlxuICAgKlxuICAgKiBDb21lcyB3aXRoIGEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZm9yIGEgZ3JhZGxlIHByb2plY3QuIFRoaXMgYnVpbGRzcGVjLnlhbWwgaXMgdXNlZCBmb3IgYm90aCB0aGUgbWFpbiBhbmRcbiAgICogYnJhbmNoIHBpcGVsaW5lIGFuZCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHN0ZXBzXG4gICAqIC0gYnVpbGQgYW5kIHRlc3Qgb2YgdGhlIGFydGlmYWN0IHZpYSBjb21tYW5kIFwiLi9ncmFkbGV3IGNsZWFuIGJ1aWxkXCIuXG4gICAqIDxwPiBUaGlzIGdyYWRsZSBjb21tYW5kIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGdyYWRsZSBwcm9qZWN0LlxuICAgKiAtIGxpY2Vuc2UtY2hlY2sgYW5kIHVwbG9hZCBvZiBsaWNlbnNlLWNoZWNrLWZpbGUgdXNpbmcgQHJpby1jbG91ZC9yaW8tbGljZW5zZS1jaGVja2VyLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICogLSBjcmVhdGUgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSB0byBtYWtlIFRMUyBjb21tdW5pY2F0aW9uIHBvc3NpYmxlLCBlLmcuIHdpdGggYSBsb2FkYmFsYW5jZXIuXG4gICAqIC0gcmVxdWVzdCBhIGNlcnRpZmljYXRlIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IEthZmthIHZpYSBtdXR1YWwgVExTXG4gICAqIC0gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZSB2aWEgY29tbWFuZCBcIi4vZ3JhZGxldyBqaWJCdWlsZFRhclwiLlxuICAgKiA8cD4gVGhpcyBncmFkbGUgY29tbWFuZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFkbGUgcHJvamVjdC5cbiAgICovXG4gIFNUQU5EQVJEX0dSQURMRV9LQUZLQSA9ICdTVEFOREFSRF9HUkFETEVfS0FGS0EnLFxuICAvKipcbiAgICogU2VsZi1tdXRhdGluZyBjb2RlcGlwZWxpbmUgZGVwbG95aW5nIHRoZSBwcm92aWRlZCBBcHBTdGFjay5cbiAgICpcbiAgICogQ29tZXMgd2l0aCBhIHByZS1kZWZpbmVkIGJ1aWxkc3BlYy55YW1sIHRvIHN5bnRoZXNpemUgdGhlIEFwcFN0YWNrLlxuICAgKiBObyBicmFuY2ggb3IgdnVsbmVyYWJpbGl0eSBwaXBlbGluZSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkUgPSAnU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkUnLFxufVxuXG4vKipcbiAqIEBwYXJhbSBwYXJ0aWFsQnVpbGRTcGVjUGF0aCAtIFBhdGggdG8gYSBjdXN0b20gYnVpbGQtc3BlYyBmaWxlIHRvIHVzZSBmb3IgdGhlIG1haW4gYW5kIGJyYW5jaCBwaXBlbGluZS5cbiAqIEEgcHJlLWRlZmluZWQgYnVpbGRzcGVjLnlhbWwgZml0dGluZyB0aGUgcGlwZWxpbmVUeXBlIGlzIHVzZWQgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIHZ1bG5lcmFiaWxpdHlQYXJ0aWFsQnVpbGRTcGVjUGF0aCAtIFBhdGggdG8gYSBjdXN0b20gYnVpbGQtc3BlYyBmaWxlIHRvIHVzZSBmb3IgdGhlIHZ1bG5lcmFiaWxpdHkgcGlwZWxpbmUuXG4gKiBBIHByZS1kZWZpbmVkIHZ1bG5lcmFiaWxpdHkgYnVpbGRzcGVjLnlhbWwgZml0dGluZyB0aGUgcGlwZWxpbmVUeXBlIGlzIHVzZWQgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIGJ1aWxkRW52aXJvbm1lbnQgLSBDdXN0b20gQ29kZUJ1aWxkIGJ1aWxkIGVudmlyb25tZW50IG92ZXJyaWRpbmcgdGhlIHJpby1zcGVjaWZpYyBkZWZhdWx0cy4gVGhlIGRlZmF1bHRzIGFyZTpcbiAqICAgICAgICAgIGJ1aWxkSW1hZ2U6IEFNQVpPTl9MSU5VWF8yXzVcbiAqICAgICAgICAgIGNvbXB1dGVUeXBlOiBMQVJHRVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBwYXJ0aWFsQnVpbGRTcGVjUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgdnVsbmVyYWJpbGl0eVBhcnRpYWxCdWlsZFNwZWNQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBidWlsZEVudmlyb25tZW50PzogQnVpbGRFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgbm9kZWpzVmVyc2lvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgbnBtVmVyc2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZlYXR1cmVzOiBQaXBlbGluZUZlYXR1cmVzO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYWluQ29kZUJ1aWxkUHJvamVjdDogQ29kZUJ1aWxkU3RlcDtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnJhbmNoQ29kZUJ1aWxkUHJvamVjdDogQ29kZUJ1aWxkU3RlcCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdnVsbmVyYWJpbGl0eUNvZGVCdWlsZFByb2plY3Q6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1Y2tldDogSUJ1Y2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGVCdWNrZXQ6IElCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dE1hc3RlclRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0QnJhbmNoVHJpZ2dlckZpbGU6IENvZGVQaXBlbGluZVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29zc0xpY2Vuc2VzQnVja2V0OiBJQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWNjb3VudE5hbWVQYXJhbWV0ZXI6IElTdHJpbmdQYXJhbWV0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RlYW1JZGVudGlmaWVyUGFyYW1ldGVyOiBJU3RyaW5nUGFyYW1ldGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uaXN0RGF0YU1pcnJvclVybDogSVN0cmluZ1BhcmFtZXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29kZVBpcGVsaW5lVHlwZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLl9mZWF0dXJlcyA9IHRoaXMucGFyc2VGZWF0dXJlcyhwcm9wcyk7XG5cbiAgICAvLyBwb3B1bGF0ZSBleHRlcm5hbCBwYXJhbWV0ZXJzXG4gICAgdGhpcy5fYnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdUcmlnZ2VyQnVja2V0JywgRm4uaW1wb3J0VmFsdWUoJ2JpdGJ1Y2tldC1pbnRlZ3JhdGlvbi1zMy1idWNrZXQnKSk7XG4gICAgdGhpcy5fY2FjaGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsICdDYWNoZUJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzApLFxuICAgICAgICAgIGFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZEFmdGVyOiBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLl9ob3N0ZWRab25lID0gcmlvLlJpb0xhbmRpbmdab25lLmdldERlZmF1bHRIb3N0ZWRab25lKHRoaXMpO1xuICAgIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUgPSBwaXBlbGluZXMuQ29kZVBpcGVsaW5lU291cmNlLnMzKFxuICAgICAgdGhpcy5fYnVja2V0LFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9L3RyaWdnZXIvJHtyaW8uVHJpZ2dlcktleS5NQVNURVJfUkVQT31gLFxuICAgICAgeyB0cmlnZ2VyOiBjb2RlcGlwZWxpbmVfYWN0aW9ucy5TM1RyaWdnZXIuRVZFTlRTIH1cbiAgICApO1xuICAgIHRoaXMuX2lucHV0QnJhbmNoVHJpZ2dlckZpbGUgPSBwaXBlbGluZXMuQ29kZVBpcGVsaW5lU291cmNlLnMzKFxuICAgICAgdGhpcy5fYnVja2V0LFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9L3RyaWdnZXIvJHtyaW8uVHJpZ2dlcktleS5CUkFOQ0hfUkVQT31gLFxuICAgICAgeyB0cmlnZ2VyOiBjb2RlcGlwZWxpbmVfYWN0aW9ucy5TM1RyaWdnZXIuRVZFTlRTIH1cbiAgICApO1xuXG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKFxuICAgICAgdGhpcyxcbiAgICAgICdPc3NMaWNlbnNlc0J1Y2tldFBhcmFtZXRlcicsXG4gICAgICB7IHBhcmFtZXRlck5hbWU6ICcvY29uZmlnL29zcy1saWNlbnNlcy9idWNrZXQtbmFtZScgfVxuICAgICk7XG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgJ09zc0xpY2Vuc2VzQnVja2V0JyxcbiAgICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0UGFyYW1ldGVyLnN0cmluZ1ZhbHVlXG4gICAgKTtcbiAgICB0aGlzLl9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZCA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgJ0tleXN0b3JlUGFzc3dvcmQnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBgL2NvbmZpZy8ke3Byb3BzLnNlcnZpY2VOYW1lfS9zZXJ2aWNlLWtleXN0b3JlLXBhc3N3b3JkYCxcbiAgICAgIHZlcnNpb246IDEsXG4gICAgfSk7XG4gICAgdGhpcy5fYWNjb3VudE5hbWVQYXJhbWV0ZXIgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKFxuICAgICAgdGhpcyxcbiAgICAgICdBY2NvdW50TmFtZVBhcmFtZXRlcicsXG4gICAgICAnL2NvbmZpZy9hY2NvdW50L25hbWUnXG4gICAgKTtcbiAgICB0aGlzLl90ZWFtSWRlbnRpZmllclBhcmFtZXRlciA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgJ1RlYW1JZGVudGlmaWVyUGFyYW1ldGVyJyxcbiAgICAgICcvY29uZmlnL3RlYW0vaWRlbnRpZmllcidcbiAgICApO1xuICAgIHRoaXMuX25pc3REYXRhTWlycm9yVXJsID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCAnTmlzdERhdGFNaXJyb3JVcmwnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiAnL2NvbmZpZy9uaXN0LWRhdGEtbWlycm9yL3VybCcsXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29kZVBpcGVsaW5lVHlwZSA9IHByb3BzLmNvZGVQaXBlbGluZVR5cGUgPz8gY29kZXBpcGVsaW5lLlBpcGVsaW5lVHlwZS5WMTtcblxuICAgIHRoaXMuX21haW5Db2RlQnVpbGRQcm9qZWN0ID0gdGhpcy5jcmVhdGVNYWluQ29kZUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgdGhpcy5hZGRNYWluUGlwZWxpbmUodGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3QsIHByb3BzKTtcblxuICAgIGlmICh0aGlzLl9mZWF0dXJlcy5icmFuY2hQaXBlbGluZSkge1xuICAgICAgdGhpcy5fYnJhbmNoQ29kZUJ1aWxkUHJvamVjdCA9IHRoaXMuY3JlYXRlQnJhbmNoQ29kZUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgICB0aGlzLmFkZEJyYW5jaFBpcGVsaW5lKHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmVhdHVyZXMudnVsbmVyYWJpbGl0eVBpcGVsaW5lKSB7XG4gICAgICB0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCA9IHRoaXMuY3JlYXRlVnVsbmVyYWJpbGl0eUJ1aWxkUHJvamVjdChwcm9wcyk7XG4gICAgICB0aGlzLmFkZFZ1bG5lcmFiaWxpdHlQaXBlbGluZSh0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCwgcHJvcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IFtmZWF0dXJlLCBwYWNrYWdlTmFtZV0gPSBfX2Rpcm5hbWUuc3BsaXQocGF0aC5zZXApLnJldmVyc2UoKTtcbiAgICBuZXcgQ2xhaWRvbWV0ZXIodGhpcywgJ0NsYWlkb21ldGVyJywge1xuICAgICAgcHJvZHVjdDogQ2xhaWRvbWV0ZXJQcm9kdWN0LkNES19DT05UUklCVVRJT04sXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGZlYXR1cmUsXG4gICAgICB2ZXJzaW9uOiAnMS42LjAnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBtYWluQ29kZWJ1aWxkUHJvamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpbkNvZGVCdWlsZFByb2plY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJyYW5jaENvZGVCdWlsZFByb2plY3QoKTogQ29kZUJ1aWxkU3RlcCB7XG4gICAgaWYgKHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBwaXBlbGluZSB0eXBlIHlvdSBoYXZlIHNlbGVjdGVkIGRvZXMgbm90IHN1cHBvcnQgYSBicmFuY2ggY29kZWJ1aWxkIHByb2plY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2JyYW5jaENvZGVCdWlsZFByb2plY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZ1bG5lcmFiaWxpdHlDb2RlQnVpbGRQcm9qZWN0KCk6IENvZGVCdWlsZFN0ZXAge1xuICAgIGlmICh0aGlzLl92dWxuZXJhYmlsaXR5Q29kZUJ1aWxkUHJvamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignVGhlIHBpcGVsaW5lIHR5cGUgeW91IGhhdmUgc2VsZWN0ZWQgZG9lcyBub3Qgc3VwcG9ydCBhIHZ1bG5lcmFiaWxpdHkgY29kZWJ1aWxkIHByb2plY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Z1bG5lcmFiaWxpdHlDb2RlQnVpbGRQcm9qZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZlYXR1cmVzKHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpOiBQaXBlbGluZUZlYXR1cmVzIHtcbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlICYmIHByb3BzLmZlYXR1cmVzKSB7XG4gICAgICB0aHJvdyBFcnJvcignWW91IGNhbm5vdCBwcm92aWRlIGJvdGggYSBwaXBlbGluZVR5cGUgYW5kIGZlYXR1cmVzLiBQbGVhc2UgdXNlIGZlYXR1cmVzIG9ubHkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mZWF0dXJlcz8ua2Fma2FJbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZmVhdHVyZXM/LmdyYWRsZUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignS2Fma2EgaW50ZWdyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIHBpcGVsaW5lcyB3aXRoIGdyYWRsZSBidWlsZCcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmVhdHVyZXM/LmZyb250ZW5kQnVja2V0TmFtZSAmJiAhcHJvcHMuZmVhdHVyZXM/Lm5wbUJ1aWxkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRnJvbnRlbmQgYnVja2V0IG5hbWUgY2FuIG9ubHkgYmUgc2V0IHdoZW4gbnBtIGJ1aWxkIGlzIGVuYWJsZWQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmZlYXR1cmVzPy5hZGRpdGlvbmFsQnVpbGRDb21tYW5kcyAmJiBwcm9wcy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhZGRpdGlvbmFsQnVpbGRDb21tYW5kcyBpZiB5b3UgdXNlIGEgcGFydGlhbEJ1aWxkU3BlY1BhdGguJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mZWF0dXJlcyAmJiBwcm9wcy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcGlwZWxpbmUgZmVhdHVyZXMgaW4gY29tYmluYXRpb24gd2l0aCBhIHBhcnRpYWxCdWlsZFNwZWNQYXRoLiBQbGVhc2Uga2VlcCBpbiBtaW5kLCB0aGF0IGFsbCBidWlsZHNwZWMgcmVsYXRlZCBmZWF0dXJlcyBhcmUgaWdub3JlZCBhbmQgdGhlIHBhcnRpYWxCdWlsZFNwZWMgaXMgYXBwbGllZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMucGlwZWxpbmVUeXBlKSB7XG4gICAgICBzd2l0Y2ggKHByb3BzLnBpcGVsaW5lVHlwZSkge1xuICAgICAgICBjYXNlIFBpcGVsaW5lVHlwZS5TVEFOREFSRF9HUkFETEU6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJyYW5jaFBpcGVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgdnVsbmVyYWJpbGl0eVBpcGVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgZ3JhZGxlQnVpbGQ6IHRydWUsXG4gICAgICAgICAgICBucG1CdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBrYWZrYUludGVncmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfR1JBRExFX0tBRktBOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicmFuY2hQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGdyYWRsZUJ1aWxkOiB0cnVlLFxuICAgICAgICAgICAgbnBtQnVpbGQ6IGZhbHNlLFxuICAgICAgICAgICAga2Fma2FJbnRlZ3JhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQaXBlbGluZVR5cGUuU1RBTkRBUkRfSU5GUkFTVFJVQ1RVUkU6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJyYW5jaFBpcGVsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogZmFsc2UsXG4gICAgICAgICAgICBncmFkbGVCdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBucG1CdWlsZDogZmFsc2UsXG4gICAgICAgICAgICBrYWZrYUludGVncmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGVuYWJsZVBpcGVsaW5lTW9uaXRvcnM6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyYW5jaFBpcGVsaW5lOiBwcm9wcy5mZWF0dXJlcz8uYnJhbmNoUGlwZWxpbmUgPz8gdHJ1ZSxcbiAgICAgIHZ1bG5lcmFiaWxpdHlQaXBlbGluZTogcHJvcHMuZmVhdHVyZXM/LnZ1bG5lcmFiaWxpdHlQaXBlbGluZSA/PyB0cnVlLFxuICAgICAgZ3JhZGxlQnVpbGQ6IHByb3BzLmZlYXR1cmVzPy5ncmFkbGVCdWlsZCA/PyBmYWxzZSxcbiAgICAgIG5wbUJ1aWxkOiBwcm9wcy5mZWF0dXJlcz8ubnBtQnVpbGQgPz8gZmFsc2UsXG4gICAgICBrYWZrYUludGVncmF0aW9uOiBwcm9wcy5mZWF0dXJlcz8ua2Fma2FJbnRlZ3JhdGlvbiA/PyBmYWxzZSxcbiAgICAgIGZyb250ZW5kQnVja2V0TmFtZTogcHJvcHMuZmVhdHVyZXM/LmZyb250ZW5kQnVja2V0TmFtZSxcbiAgICAgIGFkZGl0aW9uYWxCdWlsZENvbW1hbmRzOiBwcm9wcy5mZWF0dXJlcz8uYWRkaXRpb25hbEJ1aWxkQ29tbWFuZHMsXG4gICAgICBlbmFibGVQaXBlbGluZU1vbml0b3JzOiBwcm9wcy5mZWF0dXJlcz8uZW5hYmxlUGlwZWxpbmVNb25pdG9ycyA/PyB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNka091dHB1dERpcmVjdG9yeTogc3RyaW5nLFxuICAgIHRyaWdnZXJGaWxlOiBDb2RlUGlwZWxpbmVTb3VyY2UsXG4gICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMsXG4gICAgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wc1xuICApIHtcbiAgICByZXR1cm4gbmV3IFJpb0NvZGVCdWlsZFByb2plY3QodGhpcywgbmFtZSwge1xuICAgICAgaW5wdXQ6IHRyaWdnZXJGaWxlLFxuICAgICAgY2RrT3V0RGlyZWN0b3J5OiBjZGtPdXRwdXREaXJlY3RvcnksXG4gICAgICBwYXJ0aWFsQnVpbGRTcGVjOiBidWlsZFNwZWMsXG4gICAgICBidWlsZEVudmlyb25tZW50OiBwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8uYnVpbGRFbnZpcm9ubWVudCxcbiAgICAgIGhvc3RlZFpvbmVOYW1lOiB0aGlzLl9ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNYWluQ29kZUJ1aWxkUHJvamVjdChwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgY29uc3QgYnVpbGRTcGVjID1cbiAgICAgIHRoaXMubG9hZEJ1aWxkU3BlY0Zyb21GaWxlKHByb3BzPy5jb2RlQnVpbGRPcHRpb25zPy5wYXJ0aWFsQnVpbGRTcGVjUGF0aCkgfHxcbiAgICAgIGNyZWF0ZU1haW5CdWlsZFNwZWModGhpcy5fZmVhdHVyZXMsIHByb3BzLmNvZGVCdWlsZE9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVJpb0NvZGVCdWlsZFByb2plY3QoXG4gICAgICAnTWFpbkJ1aWxkJyxcbiAgICAgICdpbmZyYXN0cnVjdHVyZS9jZGsub3V0JyxcbiAgICAgIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsXG4gICAgICBidWlsZFNwZWMsXG4gICAgICBwcm9wc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJyYW5jaENvZGVCdWlsZFByb2plY3QocHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcykge1xuICAgIGNvbnN0IGJ1aWxkU3BlYyA9XG4gICAgICB0aGlzLmxvYWRCdWlsZFNwZWNGcm9tRmlsZShwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8ucGFydGlhbEJ1aWxkU3BlY1BhdGgpIHx8XG4gICAgICBjcmVhdGVNYWluQnVpbGRTcGVjKHRoaXMuX2ZlYXR1cmVzLCBwcm9wcy5jb2RlQnVpbGRPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVSaW9Db2RlQnVpbGRQcm9qZWN0KFxuICAgICAgJ0JyYW5jaEJ1aWxkJyxcbiAgICAgICdpbmZyYXN0cnVjdHVyZS9jZGsub3V0JyxcbiAgICAgIHRoaXMuX2lucHV0QnJhbmNoVHJpZ2dlckZpbGUsXG4gICAgICBidWlsZFNwZWMsXG4gICAgICBwcm9wc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZ1bG5lcmFiaWxpdHlCdWlsZFByb2plY3QocHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcykge1xuICAgIGNvbnN0IGJ1aWxkU3BlYyA9XG4gICAgICB0aGlzLmxvYWRCdWlsZFNwZWNGcm9tRmlsZShwcm9wcz8uY29kZUJ1aWxkT3B0aW9ucz8udnVsbmVyYWJpbGl0eVBhcnRpYWxCdWlsZFNwZWNQYXRoKSB8fFxuICAgICAgY3JlYXRlVnVsbmVyYWJpbGl0eUJ1aWxkU3BlYyh0aGlzLl9mZWF0dXJlcywgcHJvcHMuY29kZUJ1aWxkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUmlvQ29kZUJ1aWxkUHJvamVjdCgnVnVsbmVyYWJpbGl0eUNoZWNrcycsICcuLycsIHRoaXMuX2lucHV0TWFzdGVyVHJpZ2dlckZpbGUsIGJ1aWxkU3BlYywgcHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNYWluUGlwZWxpbmUobWFpbkJ1aWxkOiBDb2RlQnVpbGRTdGVwLCBwcm9wczogUGlwZWxpbmVTdGFja1Byb3BzKSB7XG4gICAgY29uc3QgcGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsICdQaXBlbGluZScsIHtcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLl9jYWNoZUJ1Y2tldCxcbiAgICAgIHBpcGVsaW5lVHlwZTogdGhpcy5fY29kZVBpcGVsaW5lVHlwZSxcbiAgICAgIHJlc3RhcnRFeGVjdXRpb25PblVwZGF0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBjb2RlUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZShwaXBlbGluZSwgJ0NvZGVQaXBlbGluZScsIHtcbiAgICAgIGNvZGVQaXBlbGluZTogcGlwZWxpbmUsXG4gICAgICBzeW50aDogbWFpbkJ1aWxkLFxuICAgICAgc2VsZk11dGF0aW9uQ29kZUJ1aWxkRGVmYXVsdHM6IHtcbiAgICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4TGFtYmRhQnVpbGRJbWFnZS5BTUFaT05fTElOVVhfMjAyM19OT0RFXzIwLFxuICAgICAgICAgIGNvbXB1dGVUeXBlOiBDb21wdXRlVHlwZS5MQU1CREFfMUdCLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBUYWdzLm9mKHBpcGVsaW5lKS5hZGQoJ3BpcGVsaW5lX3R5cGUnLCAnYnVpbGQnKTtcblxuICAgIGNvbnN0IHN0cmlwQXNzZXRzU3RlcCA9IHRoaXMuY3JlYXRlU3RyaXBBc3NldHNTdGVwKGNvZGVQaXBlbGluZSk7XG4gICAgY29kZVBpcGVsaW5lLmFkZFdhdmUoJ0JlZm9yZURlcGxveScsIHsgcHJlOiBbc3RyaXBBc3NldHNTdGVwXSB9KTtcblxuICAgIGNvbnN0IGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCA9IHRoaXMuY3JlYXRlQ2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKG1haW5CdWlsZCwgcHJvcHMpO1xuICAgIGNvbnN0IHNlY3JldHNEZXBsb3lTdGVwUHJvcHMgPSB0aGlzLmNyZWF0ZVNlY3JldHNEZXBsb3lTdGVwKHByb3BzKTtcbiAgICBjb25zdCBmcm9udGVuZERlcGxveVN0ZXAgPSB0aGlzLmNyZWF0ZURlcGxveUZyb250ZW5kRGVwbG95U3RlcChtYWluQnVpbGQpO1xuICAgIGNvbnN0IHBvc3RTdGVwcyA9IFtdO1xuICAgIGlmIChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXApIHtcbiAgICAgIHBvc3RTdGVwcy5wdXNoKGNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcCk7XG4gICAgfVxuICAgIGlmIChmcm9udGVuZERlcGxveVN0ZXApIHtcbiAgICAgIHBvc3RTdGVwcy5wdXNoKGZyb250ZW5kRGVwbG95U3RlcCk7XG4gICAgfVxuXG4gICAgY29kZVBpcGVsaW5lLmFkZFN0YWdlKFxuICAgICAgbmV3IEFwcGxpY2F0aW9uKHRoaXMsICdEZXBsb3lBcHBsaWNhdGlvblN0YWNrcycsIHtcbiAgICAgICAgYXBwU3RhY2tGYWN0b3J5OiBwcm9wcy5hcHBTdGFja0ZhY3RvcnksXG4gICAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogcHJvY2Vzcy5lbnYuUElQRUxJTkVfRVhFQ1VUSU9OX0lEID8/ICdQSVBFTElORV9FWEVDVVRJT05fSUQgbm90IHNldCcsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgcHJlOiBzZWNyZXRzRGVwbG95U3RlcFByb3BzID8gW3NlY3JldHNEZXBsb3lTdGVwUHJvcHNdIDogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0OiBwb3N0U3RlcHMsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvZGVQaXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG5cbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3Qoc3RyaXBBc3NldHNTdGVwLCAncHJvamVjdF90eXBlJywgJ3N0cmlwX2Fzc2V0cycpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChzZWNyZXRzRGVwbG95U3RlcFByb3BzLCAncHJvamVjdF90eXBlJywgJ2RlcGxveV9zZWNyZXRzJyk7XG4gICAgdGhpcy50YWdDb2RlQnVpbGRQcm9qZWN0KG1haW5CdWlsZCwgJ3Byb2plY3RfdHlwZScsICdidWlsZCcpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXAsICdwcm9qZWN0X3R5cGUnLCAnZGVwbG95X2NhcGFiaWxpdHlfbW9uaXRvcmluZycpO1xuICAgIHRoaXMudGFnQ29kZUJ1aWxkUHJvamVjdChmcm9udGVuZERlcGxveVN0ZXAsICdwcm9qZWN0X3R5cGUnLCAnZGVwbG95X2Zyb250ZW5kJyk7XG5cbiAgICBpZiAoY2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKSB7XG4gICAgICBjb25zdCBtb25pdG9yaW5nVGVzdHN1aXRlUnVubmVyQnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnTW9uaXRvcmluZ1Rlc3RzdWl0ZVJ1bm5lckJ1Y2tldCcsXG4gICAgICAgIGBtb25pdG9yaW5nLXRlc3RzdWl0ZS1ydW5uZXItJHt0aGlzLmFjY291bnR9YFxuICAgICAgKTtcbiAgICAgIG1vbml0b3JpbmdUZXN0c3VpdGVSdW5uZXJCdWNrZXQuZ3JhbnRXcml0ZShjYXBhYmlsaXR5TW9uaXRvcmluZ0RlcGxveVN0ZXApO1xuICAgIH1cbiAgICBpZiAoZnJvbnRlbmREZXBsb3lTdGVwKSB7XG4gICAgICBjb25zdCBmcm9udGVuZEJ1Y2tldCA9IHMzLkJ1Y2tldC5mcm9tQnVja2V0TmFtZSh0aGlzLCAnRnJvbnRlbmRCdWNrZXQnLCB0aGlzLl9mZWF0dXJlcy5mcm9udGVuZEJ1Y2tldE5hbWUhISk7XG4gICAgICBmcm9udGVuZEJ1Y2tldC5ncmFudFJlYWRXcml0ZShmcm9udGVuZERlcGxveVN0ZXApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1BpcGVsaW5lU2NoZWR1bGUnLCB7XG4gICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMucGlwZWxpbmVTY2hlZHVsZXM/Lm1haW5QaXBlbGluZSB8fCAnY3JvbigwIDkgPyAqIDIjMSAqKScpLFxuICAgIH0pO1xuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkNvZGVQaXBlbGluZShjb2RlUGlwZWxpbmUucGlwZWxpbmUpKTtcblxuICAgIHRoaXMuX29zc0xpY2Vuc2VzQnVja2V0LmdyYW50UmVhZFdyaXRlKG1haW5CdWlsZCk7XG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIuZ3JhbnRSZWFkKG1haW5CdWlsZCk7XG4gICAgdGhpcy5fc2VydmljZUtleXN0b3JlUGFzc3dvcmQuZ3JhbnRSZWFkKG1haW5CdWlsZCk7XG4gICAgdGhpcy5fYWNjb3VudE5hbWVQYXJhbWV0ZXIuZ3JhbnRSZWFkKG1haW5CdWlsZCk7XG4gICAgdGhpcy5fdGVhbUlkZW50aWZpZXJQYXJhbWV0ZXIuZ3JhbnRSZWFkKG1haW5CdWlsZCk7XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVzLmthZmthSW50ZWdyYXRpb24pIHtcbiAgICAgIHRoaXMuZ3JhbnRQZXJtaXNzaW9uc0ZvckthZmthSW50ZWdyYXRpb24obWFpbkJ1aWxkLCAnS2Fma2FJbnRlZ3JhdGlvblBvbGljeScpO1xuICAgIH1cbiAgICBjb2RlUGlwZWxpbmUucGlwZWxpbmUuYXJ0aWZhY3RCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoc3RyaXBBc3NldHNTdGVwLnByb2plY3QpO1xuXG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVzPy5lbmFibGVQaXBlbGluZU1vbml0b3JzKSB7XG4gICAgICBuZXcgRGF0YWRvZ1BpcGVsaW5lRXJyb3JBbGVydCh0aGlzLCAnRGF0YWRvZ1BpcGVsaW5lRXJyb3JNb25pdG9yJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogcGlwZWxpbmUucGlwZWxpbmVOYW1lLFxuICAgICAgICBhY2NvdW50SWQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQnJhbmNoUGlwZWxpbmUoYnJhbmNoQnVpbGQ6IENvZGVCdWlsZFN0ZXApIHtcbiAgICBjb25zdCBicmFuY2hQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgJ0JyYW5jaFBpcGVsaW5lJywge1xuICAgICAgYXJ0aWZhY3RCdWNrZXQ6IHRoaXMuX2NhY2hlQnVja2V0LFxuICAgICAgcGlwZWxpbmVUeXBlOiB0aGlzLl9jb2RlUGlwZWxpbmVUeXBlLFxuICAgICAgcmVzdGFydEV4ZWN1dGlvbk9uVXBkYXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGJyYW5jaENvZGVQaXBlbGluZSA9IG5ldyBwaXBlbGluZXMuQ29kZVBpcGVsaW5lKGJyYW5jaFBpcGVsaW5lLCAnQ29kZVBpcGVsaW5lJywge1xuICAgICAgY29kZVBpcGVsaW5lOiBicmFuY2hQaXBlbGluZSxcbiAgICAgIHN5bnRoOiBicmFuY2hCdWlsZCxcbiAgICAgIHNlbGZNdXRhdGlvbjogZmFsc2UsXG4gICAgfSk7XG4gICAgVGFncy5vZihicmFuY2hQaXBlbGluZSkuYWRkKCdwaXBlbGluZV90eXBlJywgJ2JyYW5jaCcpO1xuICAgIGJyYW5jaENvZGVQaXBlbGluZS5hZGRXYXZlKCdCcmFuY2hCdWlsZCcpLmFkZFBvc3QoYnJhbmNoQnVpbGQpO1xuICAgIGJyYW5jaENvZGVQaXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG5cbiAgICB0aGlzLnRhZ0NvZGVCdWlsZFByb2plY3QoYnJhbmNoQnVpbGQsICdwcm9qZWN0X3R5cGUnLCAnYnJhbmNoX2J1aWxkJyk7XG5cbiAgICB0aGlzLl9vc3NMaWNlbnNlc0J1Y2tldC5ncmFudFJlYWRXcml0ZShicmFuY2hCdWlsZCk7XG4gICAgdGhpcy5fb3NzTGljZW5zZXNCdWNrZXRQYXJhbWV0ZXIuZ3JhbnRSZWFkKGJyYW5jaEJ1aWxkKTtcbiAgICB0aGlzLl9zZXJ2aWNlS2V5c3RvcmVQYXNzd29yZC5ncmFudFJlYWQoYnJhbmNoQnVpbGQpO1xuICAgIHRoaXMuX2FjY291bnROYW1lUGFyYW1ldGVyLmdyYW50UmVhZChicmFuY2hCdWlsZCk7XG4gICAgdGhpcy5fdGVhbUlkZW50aWZpZXJQYXJhbWV0ZXIuZ3JhbnRSZWFkKGJyYW5jaEJ1aWxkKTtcbiAgICBpZiAodGhpcy5fZmVhdHVyZXMua2Fma2FJbnRlZ3JhdGlvbikge1xuICAgICAgdGhpcy5ncmFudFBlcm1pc3Npb25zRm9yS2Fma2FJbnRlZ3JhdGlvbihicmFuY2hCdWlsZCwgJ0JyYW5jaEthZmthSW50ZWdyYXRpb25Qb2xpY3knKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFZ1bG5lcmFiaWxpdHlQaXBlbGluZSh2dWxuZXJhYmlsaXR5QnVpbGQ6IENvZGVCdWlsZFN0ZXAsIHByb3BzOiBQaXBlbGluZVN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5UGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsICdWdWxuZXJhYmlsaXR5UGlwZWxpbmUnLCB7XG4gICAgICBhcnRpZmFjdEJ1Y2tldDogdGhpcy5fY2FjaGVCdWNrZXQsXG4gICAgICBwaXBlbGluZVR5cGU6IHRoaXMuX2NvZGVQaXBlbGluZVR5cGUsXG4gICAgICByZXN0YXJ0RXhlY3V0aW9uT25VcGRhdGU6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgdnVsbmVyYWJpbGl0eUNvZGVQaXBlbGluZSA9IG5ldyBwaXBlbGluZXMuQ29kZVBpcGVsaW5lKHZ1bG5lcmFiaWxpdHlQaXBlbGluZSwgJ0NvZGVQaXBlbGluZScsIHtcbiAgICAgIGNvZGVQaXBlbGluZTogdnVsbmVyYWJpbGl0eVBpcGVsaW5lLFxuICAgICAgc3ludGg6IHZ1bG5lcmFiaWxpdHlCdWlsZCxcbiAgICAgIHNlbGZNdXRhdGlvbjogZmFsc2UsXG4gICAgfSk7XG4gICAgVGFncy5vZih2dWxuZXJhYmlsaXR5UGlwZWxpbmUpLmFkZCgncGlwZWxpbmVfdHlwZScsICd2dWxuZXJhYmlsaXR5Jyk7XG5cbiAgICB2dWxuZXJhYmlsaXR5Q29kZVBpcGVsaW5lLmFkZFdhdmUoJ1Z1bG5lcmFiaWxpdHlDaGVja3MnKS5hZGRQb3N0KHZ1bG5lcmFiaWxpdHlCdWlsZCk7XG4gICAgdnVsbmVyYWJpbGl0eUNvZGVQaXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG4gICAgVGFncy5vZih2dWxuZXJhYmlsaXR5QnVpbGQucHJvamVjdCkuYWRkKCdwcm9qZWN0X3R5cGUnLCAndnVsbmVyYWJpbGl0eV9jaGVjaycpO1xuICAgIHRoaXMuX25pc3REYXRhTWlycm9yVXJsLmdyYW50UmVhZCh2dWxuZXJhYmlsaXR5QnVpbGQpO1xuICAgIFNvbmF0eXBlT3NzSW5kZXhDcmVkZW50aWFscy5hbGxvd0FjY2Vzc1RvKHRoaXMsIHZ1bG5lcmFiaWxpdHlCdWlsZCk7XG5cbiAgICBjb25zdCB2dWxuZXJhYmlsaXR5UnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnVnVsbmVyYWJpbGl0eVBpcGVsaW5lU2NoZWR1bGUnLCB7XG4gICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMucGlwZWxpbmVTY2hlZHVsZXM/LnZ1bG5lcmFiaWxpdHlQaXBlbGluZSB8fCAnY3JvbigwIDUgPyAqIE1PTi1GUkkgKiknKSxcbiAgICB9KTtcbiAgICB2dWxuZXJhYmlsaXR5UnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHZ1bG5lcmFiaWxpdHlDb2RlUGlwZWxpbmUucGlwZWxpbmUpKTtcblxuICAgIGlmIChwcm9wcy5kYXRhZG9nQWxlcnRUeXBlID09PSAnb3BzZ2VuaWUnKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ1RoZSBPcHNHZW5pZSBhbGVydFR5cGUgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBQbGVhc2UgdXNlIHRoZSB2dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uIHByb3BlcnR5IGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVzPy5lbmFibGVQaXBlbGluZU1vbml0b3JzKSB7XG4gICAgICBuZXcgRGF0YURvZ1BpcGVsaW5lRXJyb3JBbGVydEZvclZ1bG5lcmFiaWxpdHlDaGVja3ModGhpcywgJ0RhdGFEb2dQaXBlbGluZUVycm9yRm9yVnVsbmVyYWJpbGl0eUNoZWNrc01vbml0b3InLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgcGlwZWxpbmVOYW1lOiB2dWxuZXJhYmlsaXR5UGlwZWxpbmUucGlwZWxpbmVOYW1lLFxuICAgICAgICBhY2NvdW50SWQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgbm90aWZpY2F0aW9uOiBwcm9wcy52dWxuZXJhYmlsaXR5Tm90aWZpY2F0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdHJpcEFzc2V0c1N0ZXAocGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUpOiBDb2RlQnVpbGRTdGVwIHtcbiAgICAvLyBDbG91ZEFzc2VtYmx5QXJ0aWZhY3RzIG11c3QgYmUgc21hbGxlciB0aGFuIDI1Nk1CLiBEdWUgdG8gdGhlIGdyYWRsZSBhcnRpZmFjdCB3ZSBhcmUgZXhjZWVkaW5nIHRoaXMgbGltaXQgYW5kIHBpcGVsaW5lIGZhaWxzIGluIGRlcGxveW1lbnQgc3RlcC5cbiAgICAvLyBJc3N1ZSBpcyBrbm93biBhbmQgbm90IGZpeGVkIGZvciBhbHJlYWR5IHNvbWUgeWVhcnMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy85OTE3XG4gICAgLy8gRGlydHkgZml4OiBBc3NldHMgYXJlIGFscmVhZHkgdXBsb2FkZWQgYW5kIHRodXMgbm90IG5lZWRlZC4gUmVtb3ZlIHRoZW0gZnJvbSBwaXBlbGluZSBhcnRpZmFjdC5cbiAgICByZXR1cm4gbmV3IENvZGVCdWlsZFN0ZXAoJ1N0cmlwQXNzZXRzRnJvbUFzc2VtYmx5Jywge1xuICAgICAgaW5wdXQ6IHBpcGVsaW5lLmNsb3VkQXNzZW1ibHlGaWxlU2V0LFxuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgJ1MzX1BBVEg9JHtDT0RFQlVJTERfU09VUkNFX1ZFUlNJT04jXCJhcm46YXdzOnMzOjo6XCJ9JyxcbiAgICAgICAgJ1pJUF9BUkNISVZFPSQoYmFzZW5hbWUgJFMzX1BBVEgpJyxcbiAgICAgICAgJ3JtIC1yZnYgYXNzZXQuKicsXG4gICAgICAgICd6aXAgLXIgLXEgLUEgJFpJUF9BUkNISVZFIConLFxuICAgICAgICAnYXdzIHMzIGNwICRaSVBfQVJDSElWRSBzMzovLyRTM19QQVRIJyxcbiAgICAgIF0sXG4gICAgICBidWlsZEVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4TGFtYmRhQnVpbGRJbWFnZS5BTUFaT05fTElOVVhfMjAyM19OT0RFXzIwLFxuICAgICAgICBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUuTEFNQkRBXzFHQixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNhcGFiaWxpdHlNb25pdG9yaW5nRGVwbG95U3RlcChcbiAgICBtYWluQnVpbGQ6IENvZGVCdWlsZFN0ZXAsXG4gICAgcHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wc1xuICApOiBDb2RlQnVpbGRTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJvcHMubW9uaXRvcmluZ0RlcGxveVN0ZXBQcm9wcykge1xuICAgICAgY29uc3QgbW9uaXRvcmluZ0FydGlmYWN0cyA9IE9iamVjdC5rZXlzKHByb3BzLm1vbml0b3JpbmdEZXBsb3lTdGVwUHJvcHMubW9uaXRvcmluZ0FydGlmYWN0cykubWFwKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG1haW5CdWlsZC5hZGRPdXRwdXREaXJlY3Rvcnkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnB1dDogb3V0cHV0LFxuICAgICAgICAgIGZpbGVzOiBwcm9wcy5tb25pdG9yaW5nRGVwbG95U3RlcFByb3BzIS5tb25pdG9yaW5nQXJ0aWZhY3RzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUmlvQ2FwYWJpbGl0eU1vbml0b3JpbmdEZXBsb3lTdGVwKHRoaXMsICdEZXBsb3lDYXBhYmlsaXR5TW9uaXRvcmluZycsIHtcbiAgICAgICAgbW9uaXRvcmluZ0FydGlmYWN0czogbW9uaXRvcmluZ0FydGlmYWN0cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VjcmV0c0RlcGxveVN0ZXAocHJvcHM6IFBpcGVsaW5lU3RhY2tQcm9wcyk6IHJpby5SaW9TZWNyZXRzRGVwbG95U3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLnNlY3JldHNEZXBsb3lTdGVwUHJvcHMpIHtcbiAgICAgIHJldHVybiBuZXcgcmlvLlJpb1NlY3JldHNEZXBsb3lTdGVwKHRoaXMsICdEZXBsb3lTZWNyZXRzJywge1xuICAgICAgICAuLi5wcm9wcy5zZWNyZXRzRGVwbG95U3RlcFByb3BzLFxuICAgICAgICBpbnB1dDogdGhpcy5faW5wdXRNYXN0ZXJUcmlnZ2VyRmlsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95RnJvbnRlbmREZXBsb3lTdGVwKG1haW5CdWlsZDogQ29kZUJ1aWxkU3RlcCk6IENvZGVCdWlsZFN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fZmVhdHVyZXMuZnJvbnRlbmRCdWNrZXROYW1lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBmcm9udGVuZEJ1aWxkT3V0cHV0ID0gbWFpbkJ1aWxkLmFkZE91dHB1dERpcmVjdG9yeSgnYnVpbGQnKTtcbiAgICByZXR1cm4gbmV3IENvZGVCdWlsZFN0ZXAoJ0RlcGxveUZyb250ZW5kJywge1xuICAgICAgaW5wdXQ6IGZyb250ZW5kQnVpbGRPdXRwdXQsXG4gICAgICBidWlsZEVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4TGFtYmRhQnVpbGRJbWFnZS5BTUFaT05fTElOVVhfMjAyM19OT0RFXzIwLFxuICAgICAgICBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUuTEFNQkRBXzFHQixcbiAgICAgIH0sXG4gICAgICBjb21tYW5kczogW1xuICAgICAgICBgYXdzIHMzIHN5bmMgLS1leGNsdWRlIGluZGV4Lmh0bWwgLS1jYWNoZS1jb250cm9sIG1heC1hZ2U9MzE1MzYwMDAgLi8gJ3MzOi8vJHt0aGlzLl9mZWF0dXJlcy5mcm9udGVuZEJ1Y2tldE5hbWV9J2AsXG4gICAgICAgIGBhd3MgczMgY3AgLS1jYWNoZS1jb250cm9sIG5vLWNhY2hlIGluZGV4Lmh0bWwgJ3MzOi8vJHt0aGlzLl9mZWF0dXJlcy5mcm9udGVuZEJ1Y2tldE5hbWV9J2AsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudFBlcm1pc3Npb25zRm9yS2Fma2FJbnRlZ3JhdGlvbihidWlsZFByb2plY3Q6IFJpb0NvZGVCdWlsZFByb2plY3QsIHBvbGljeUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWlsZFByb2plY3RSb2xlID0gYnVpbGRQcm9qZWN0LnByb2plY3Qucm9sZTtcbiAgICBpZiAoYnVpbGRQcm9qZWN0Um9sZSkge1xuICAgICAgYnVpbGRQcm9qZWN0Um9sZS5hZGRNYW5hZ2VkUG9saWN5KFxuICAgICAgICBNYW5hZ2VkUG9saWN5LmZyb21NYW5hZ2VkUG9saWN5QXJuKHRoaXMsIHBvbGljeUlkLCBGbi5pbXBvcnRWYWx1ZSgna2Fma2EtaW50ZWdyYXRpb24tcG9saWN5LWFybicpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgYWRkIG1hbmFnZWQgcG9saWN5IGZvciBrYWZrYS1pbnRlZ3JhdGlvbiB0byBDb2RlQnVpbGQgcHJvamVjdCBvZiAke2J1aWxkUHJvamVjdC5pZH0gZHVlIHRvIG1pc3Npbmcgcm9sZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJ1aWxkU3BlY0Zyb21GaWxlKGJ1aWxkU3BlY1BhdGg/OiBzdHJpbmcpOiBCdWlsZFNwZWMgfCB1bmRlZmluZWQge1xuICAgIGlmICghYnVpbGRTcGVjUGF0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHlhbWwubG9hZChmcy5yZWFkRmlsZVN5bmMoYnVpbGRTcGVjUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSkgYXMgT2JqZWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgdGFnQ29kZUJ1aWxkUHJvamVjdChwcm9qZWN0OiBDb2RlQnVpbGRTdGVwIHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmIChwcm9qZWN0KSB7XG4gICAgICBUYWdzLm9mKHByb2plY3QucHJvamVjdCkuYWRkKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -75,7 +75,7 @@ export interface DatadogLambdaInstrumentationProps {
75
75
  *
76
76
  * To use it, install Datadog CDK Constructs package:
77
77
  * ```bash
78
- * npm i -D datadog-cdk-constructs-v2
78
+ * npm i -D datadog-cdk-constructs-v2@^5
79
79
  * ```
80
80
  */
81
81
  export declare class DatadogLambdaInstrumentation extends Construct {