@fjall/components-infrastructure 0.75.3 → 0.77.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 (184) hide show
  1. package/dist/lib/app.d.ts +125 -20
  2. package/dist/lib/app.js +171 -56
  3. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  4. package/dist/lib/aspects/resourceInventory.js +56 -0
  5. package/dist/lib/config/audit.d.ts +18 -0
  6. package/dist/lib/config/audit.js +22 -0
  7. package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
  8. package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
  9. package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +1 -1
  12. package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
  13. package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
  14. package/dist/lib/config/aws/identityCenter.d.ts +3 -3
  15. package/dist/lib/config/aws/identityCenter.js +1 -1
  16. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
  17. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
  18. package/dist/lib/config/aws/ipam.js +2 -4
  19. package/dist/lib/config/aws/organisation.d.ts +3 -3
  20. package/dist/lib/config/aws/organisation.js +1 -1
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
  22. package/dist/lib/config/aws/organisationsAccess.js +1 -1
  23. package/dist/lib/config/monitoring.d.ts +18 -0
  24. package/dist/lib/config/monitoring.js +22 -0
  25. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  26. package/dist/lib/patterns/aws/auditRole.js +58 -0
  27. package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
  28. package/dist/lib/patterns/aws/buildkite.js +1 -1
  29. package/dist/lib/patterns/aws/compute.d.ts +17 -11
  30. package/dist/lib/patterns/aws/compute.js +7 -7
  31. package/dist/lib/patterns/aws/database.d.ts +185 -24
  32. package/dist/lib/patterns/aws/database.js +280 -42
  33. package/dist/lib/patterns/aws/ec2.d.ts +43 -0
  34. package/dist/lib/patterns/aws/ec2.js +123 -0
  35. package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
  36. package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
  37. package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
  38. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  39. package/dist/lib/patterns/aws/index.d.ts +1 -0
  40. package/dist/lib/patterns/aws/index.js +2 -1
  41. package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
  42. package/dist/lib/patterns/aws/managedAccount.js +1 -1
  43. package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
  44. package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
  45. package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
  46. package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
  47. package/dist/lib/patterns/aws/managedPlatform.js +2 -4
  48. package/dist/lib/patterns/aws/network.d.ts +75 -0
  49. package/dist/lib/patterns/aws/network.js +99 -0
  50. package/dist/lib/patterns/aws/storage.d.ts +4 -55
  51. package/dist/lib/patterns/aws/storage.js +3 -103
  52. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  53. package/dist/lib/resources/aws/audit/auditRole.js +46 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
  55. package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
  56. package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
  57. package/dist/lib/resources/aws/backup/backupVault.js +1 -1
  58. package/dist/lib/resources/aws/base/awsStack.js +1 -4
  59. package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
  60. package/dist/lib/resources/aws/compute/ec2.js +5 -3
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
  62. package/dist/lib/resources/aws/compute/ecs.js +68 -20
  63. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
  64. package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
  65. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
  66. package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
  67. package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
  68. package/dist/lib/resources/aws/compute/lambda.js +27 -19
  69. package/dist/lib/resources/aws/database/database.d.ts +2 -2
  70. package/dist/lib/resources/aws/database/database.js +1 -1
  71. package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
  72. package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
  73. package/dist/lib/resources/aws/database/index.d.ts +0 -1
  74. package/dist/lib/resources/aws/database/index.js +1 -2
  75. package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
  76. package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
  77. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
  78. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
  80. package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
  81. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
  83. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
  84. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  85. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
  86. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
  88. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  89. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
  90. package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
  91. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
  92. package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
  93. package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
  94. package/dist/lib/resources/aws/iam/policy.js +1 -1
  95. package/dist/lib/resources/aws/iam/role.d.ts +1 -1
  96. package/dist/lib/resources/aws/iam/role.js +1 -1
  97. package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
  98. package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
  99. package/dist/lib/resources/aws/index.d.ts +1 -0
  100. package/dist/lib/resources/aws/index.js +2 -1
  101. package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
  102. package/dist/lib/resources/aws/logging/logGroup.js +1 -1
  103. package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
  104. package/dist/lib/resources/aws/monitoring/index.js +18 -0
  105. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  106. package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
  107. package/dist/lib/resources/aws/networking/index.d.ts +0 -1
  108. package/dist/lib/resources/aws/networking/index.js +1 -2
  109. package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
  110. package/dist/lib/resources/aws/networking/ipam.js +1 -1
  111. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  112. package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
  113. package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
  114. package/dist/lib/resources/aws/networking/vpc.js +185 -36
  115. package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
  116. package/dist/lib/resources/aws/secrets/alias.js +1 -1
  117. package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
  118. package/dist/lib/resources/aws/secrets/parameter.js +1 -1
  119. package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
  120. package/dist/lib/resources/aws/secrets/secret.js +19 -2
  121. package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
  122. package/dist/lib/resources/aws/storage/ecr.js +1 -1
  123. package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
  124. package/dist/lib/resources/aws/storage/s3.js +1 -1
  125. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
  126. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  127. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
  128. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
  129. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
  130. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  131. package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
  132. package/dist/lib/resources/aws/utilities/customResource.js +35 -11
  133. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
  134. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
  135. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
  136. package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
  137. package/dist/lib/utils/getAsync.d.ts +1 -1
  138. package/dist/lib/utils/getAsync.js +1 -1
  139. package/dist/lib/utils/getCidr.d.ts +8 -0
  140. package/dist/lib/utils/getCidr.js +40 -0
  141. package/dist/lib/utils/getConfig.d.ts +2 -2
  142. package/dist/lib/utils/getConfig.js +3 -3
  143. package/dist/lib/utils/index.d.ts +1 -0
  144. package/dist/lib/utils/index.js +2 -1
  145. package/dist/lib/utils/resourceNaming.d.ts +41 -0
  146. package/dist/lib/utils/resourceNaming.js +77 -0
  147. package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
  148. package/dist/lib/utils/standardTagsAspect.js +6 -5
  149. package/dist/lib/utils/tagResource.d.ts +1 -1
  150. package/dist/lib/utils/tagResource.js +1 -1
  151. package/package.json +3 -3
  152. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  153. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  154. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  155. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  156. package/dist/lib/__tests__/simple.test.js +0 -12
  157. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  158. package/dist/lib/resources/aws/organisations/account.js +0 -220
  159. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  160. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  161. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  162. package/dist/lib/resources/aws/organisations/index.js +0 -22
  163. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  164. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  165. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  166. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  167. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  168. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  169. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  170. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  171. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  172. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  173. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  174. package/dist/lib/resources/aws/organisations/types.js +0 -36
  175. package/dist/lib/utils/directTagging.d.ts +0 -31
  176. package/dist/lib/utils/directTagging.js +0 -86
  177. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  178. package/dist/lib/utils/fjallConstruct.js +0 -18
  179. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  180. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  181. package/dist/lib/utils/tagContext.d.ts +0 -28
  182. package/dist/lib/utils/tagContext.js +0 -53
  183. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  184. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -39,15 +39,15 @@ class FargateCluster extends constructs_1.Construct {
39
39
  this.addContainerDefinition(props);
40
40
  this.addFargateService(props);
41
41
  this.addLoadBalancer(props);
42
- if (!!props.domainConfig)
42
+ if (props.domainConfig)
43
43
  this.addHostedZone(props);
44
44
  this.addLoadBalancerListener(props);
45
45
  this.registerLoadBalancerTargets(props);
46
- this.connections = this.fargateService.connections;
47
- //todo: fix connections not working automatically
48
- if (props.databaseConnection) {
49
- this.fargateService.connections.allowTo(props.databaseConnection, aws_ec2_1.Port.POSTGRES);
50
- }
46
+ const containerPort = props.containerPort || 80;
47
+ this.connections = new aws_ec2_1.Connections({
48
+ securityGroups: this.fargateService.connections.securityGroups,
49
+ defaultPort: aws_ec2_1.Port.tcp(containerPort)
50
+ });
51
51
  }
52
52
  addCluster(props) {
53
53
  this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
@@ -62,6 +62,13 @@ class FargateCluster extends constructs_1.Construct {
62
62
  exportName: `${props.clusterName}DeployableCluster`,
63
63
  value: this.cluster.clusterArn
64
64
  });
65
+ // Export cluster ARN for monitoring
66
+ new cfnOutput_1.CfnOutput(this, `${props.clusterName}ClusterArn`, {
67
+ key: "ClusterArn",
68
+ exportName: `${props.clusterName}ClusterArn`,
69
+ value: this.cluster.clusterArn,
70
+ description: `ECS Cluster ARN for ${props.clusterName}`
71
+ });
65
72
  }
66
73
  /**
67
74
  * #todo: change this to create new secrets instead
@@ -161,12 +168,15 @@ class FargateCluster extends constructs_1.Construct {
161
168
  ...this.secrets
162
169
  },
163
170
  //todo: provide health check options
164
- // healthCheck: {
165
- // command: [
166
- // "CMD-SHELL",
167
- // `timeout 10s /bin/sh -c ':> /dev/tcp/127.0.0.1/${props.containerPort}' || exit 1`
168
- // ]
169
- // },
171
+ healthCheck: {
172
+ command: [
173
+ "CMD-SHELL",
174
+ // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/view-container-health.html
175
+ // >> proc/1/fd/1 2>&1 redirects stdout and stderr of the health check to CloudWatch logs
176
+ // `curl -f http://localhost:${props.containerPort}/ >> /proc/1/fd/1 2>&1 || exit 1`
177
+ `curl -f http://localhost:${props.containerPort}/ || exit 1`
178
+ ]
179
+ },
170
180
  logging: new aws_ecs_1.AwsLogDriver({
171
181
  streamPrefix: `/ecs/${props.clusterName}/${props.serviceName}`,
172
182
  logRetention: 14
@@ -195,6 +205,13 @@ class FargateCluster extends constructs_1.Construct {
195
205
  exportName: `${props.clusterName}DeployableService`,
196
206
  value: this.fargateService.serviceArn
197
207
  });
208
+ // Export service ARN for monitoring
209
+ new cfnOutput_1.CfnOutput(this, `${props.clusterName}ServiceArn`, {
210
+ key: "ServiceArn",
211
+ exportName: `${props.clusterName}ServiceArn`,
212
+ value: this.fargateService.serviceArn,
213
+ description: `ECS Service ARN for ${props.serviceName}`
214
+ });
198
215
  }
199
216
  addScalingPolicy(props) {
200
217
  this.scalingPolicy = new aws_applicationautoscaling_1.TargetTrackingScalingPolicy(this, `${props.serviceName}ScalingPolicy`, {
@@ -253,9 +270,16 @@ class FargateCluster extends constructs_1.Construct {
253
270
  exportName: `${props.clusterName}LoadBalancerDnsName`,
254
271
  value: this.loadBalancer.loadBalancerDnsName
255
272
  });
273
+ // Export load balancer URL for monitoring
274
+ new cfnOutput_1.CfnOutput(this, `${props.clusterName}LoadBalancerUrl`, {
275
+ key: "LoadBalancerUrl",
276
+ exportName: `${props.clusterName}LoadBalancerUrl`,
277
+ value: `http://${this.loadBalancer.loadBalancerDnsName}`,
278
+ description: `Load Balancer URL for ${props.clusterName}`
279
+ });
256
280
  }
257
281
  addLoadBalancerListener(props) {
258
- if (!!this.certificate) {
282
+ if (this.certificate) {
259
283
  this.loadBalancerListener = this.loadBalancer.addListener(`${props.serviceName}Listener`, {
260
284
  port: props.protocol == Protocol.HTTP ? 80 : 443,
261
285
  certificates: [this.certificate]
@@ -272,7 +296,7 @@ class FargateCluster extends constructs_1.Construct {
272
296
  return;
273
297
  if (!props.domainConfig.hostedZone) {
274
298
  // Create a new hosted zone if one is not provided
275
- var hostedZone = new hostedZone_1.HostedZone(this, `${props.serviceName}HostedZone`, {
299
+ const hostedZone = new hostedZone_1.HostedZone(this, `${props.serviceName}HostedZone`, {
276
300
  zoneName: props.domainConfig.domainName
277
301
  });
278
302
  this.hostedZone = hostedZone.getInternalHostedZone();
@@ -288,15 +312,39 @@ class FargateCluster extends constructs_1.Construct {
288
312
  validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone)
289
313
  });
290
314
  }
315
+ // Check if this is a multi-region/weighted/geo routing configuration
316
+ const latencyConfig = props.domainConfig;
317
+ const weightedConfig = props.domainConfig;
318
+ const geoConfig = props.domainConfig;
319
+ const hasRoutingPolicy = !!latencyConfig?.region ||
320
+ weightedConfig?.weight !== undefined ||
321
+ !!geoConfig?.geoLocation;
322
+ // Generate setIdentifier if not provided and using routing policies
323
+ // AWS requires setIdentifier for all routing policies (latency, weighted, geo, failover, multivalue)
324
+ let setIdentifier = props.domainConfig.setIdentifier;
325
+ if (hasRoutingPolicy && !setIdentifier) {
326
+ if (latencyConfig?.region) {
327
+ setIdentifier = `${props.serviceName}-${latencyConfig.region}`;
328
+ }
329
+ else if (weightedConfig?.weight !== undefined) {
330
+ setIdentifier = `${props.serviceName}-weight-${weightedConfig.weight}`;
331
+ }
332
+ else if (geoConfig?.geoLocation) {
333
+ setIdentifier = `${props.serviceName}-geo`;
334
+ }
335
+ }
291
336
  // Always create a new ARecord for this domain and attach it to the load balancer
292
337
  this.aRecord = new aws_route53_1.ARecord(this, `${props.serviceName}.${props.clusterName}.${props.domainConfig.domainName}ARecord`, {
293
338
  recordName: props.domainConfig.domainName,
294
339
  zone: this.hostedZone,
295
- target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.LoadBalancerTarget(this.loadBalancer)),
296
- region: props.domainConfig?.region,
297
- weight: props.domainConfig?.weight,
298
- geoLocation: props.domainConfig
299
- ?.geoLocation
340
+ target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.LoadBalancerTarget(this.loadBalancer, {
341
+ evaluateTargetHealth: hasRoutingPolicy
342
+ })),
343
+ region: latencyConfig?.region,
344
+ weight: weightedConfig?.weight,
345
+ geoLocation: geoConfig?.geoLocation,
346
+ // Set identifier is required for routing policies (latency, weighted, geo, failover, multivalue)
347
+ setIdentifier: setIdentifier
300
348
  });
301
349
  }
302
350
  getImage(props) {
@@ -322,4 +370,4 @@ class FargateCluster extends constructs_1.Construct {
322
370
  }
323
371
  }
324
372
  exports.default = FargateCluster;
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBVzZCO0FBQzdCLGlEQU02QjtBQUM3QiwyQ0FBdUM7QUFFdkMsNkNBQStEO0FBQy9ELHVGQUlnRDtBQUNoRCxpREFRNkI7QUFDN0IsdUZBS2dEO0FBQ2hELGlEQUEwRDtBQUMxRCx1RUFBd0Q7QUFDeEQsK0VBRzRDO0FBQzVDLHlEQU1pQztBQUNqQyx5RUFBcUU7QUFDckUsaURBQWlEO0FBR2pELHNEQUFtRDtBQUNuRCxpRUFBaUY7QUFJakYsSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLHVDQUFJLENBQUE7SUFDSix5Q0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQUhXLFFBQVEsd0JBQVIsUUFBUSxRQUduQjtBQUVELElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixzREFBMEQsQ0FBQTtJQUMxRCw0REFBZ0UsQ0FBQTtBQUNsRSxDQUFDLEVBSFcsV0FBVywyQkFBWCxXQUFXLFFBR3RCO0FBb0VELE1BQXFCLGNBQWUsU0FBUSxzQkFBUztJQXFCbkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUFgsWUFBTyxHQUVYLEVBQUUsQ0FBQztRQU9MLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxD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Q0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQ1YsRUFBVSxFQUNWLEtBQTBCO1FBRTFCLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQXdCO2dCQUNwQyxHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBVyxJQUFJLEtBQUssQ0FBQyxHQUFHO2lCQUM1QzthQUNGLENBQUM7WUFDRixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcmFELGlDQXFhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlcixcbiAgQ2x1c3RlciBhcyBDZGtDbHVzdGVyLFxuICBDb250YWluZXJJbWFnZSxcbiAgRmFyZ2F0ZVNlcnZpY2UsXG4gIEZhcmdhdGVUYXNrRGVmaW5pdGlvbixcbiAgTGlzdGVuZXJDb25maWcsXG4gIFByb3BhZ2F0ZWRUYWdTb3VyY2UsXG4gIFJlcG9zaXRvcnlJbWFnZSxcbiAgQ29udGFpbmVyRGVmaW5pdGlvbixcbiAgQ29udGFpbmVySW5zaWdodHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBTZWNyZXRWYWx1ZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uTGlzdGVuZXIsXG4gIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICBBcHBsaWNhdGlvblByb3RvY29sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlUHJpbmNpcGFsLFxuICBFZmZlY3QsXG4gIElNYW5hZ2VkUG9saWN5LFxuICBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBSb2xlLFxuICBTZXJ2aWNlUHJpbmNpcGFsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBQcmVkZWZpbmVkTWV0cmljLFxuICBTY2FsYWJsZVRhcmdldCxcbiAgU2VydmljZU5hbWVzcGFjZSxcbiAgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBwbGljYXRpb25hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgU2VjcmV0IGFzIEVjc1NlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZSxcbiAgQ2VydGlmaWNhdGVWYWxpZGF0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBUmVjb3JkLFxuICBIb3N0ZWRab25lLFxuICBSZWNvcmRUYXJnZXQsXG4gIElIb3N0ZWRab25lLFxuICBHZW9Mb2NhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IExvYWRCYWxhbmNlclRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcblxuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5pbXBvcnQgeyBIb3N0ZWRab25lIGFzIEZqYWxsSG9zdGVkWm9uZSB9IGZyb20gXCIuLi8uLi8uLi9wYXR0ZXJucy9hd3MvaG9zdGVkWm9uZVwiO1xuXG5pbXBvcnQgeyBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuXG5leHBvcnQgZW51bSBQcm90b2NvbCB7XG4gIEhUVFAsXG4gIEhUVFBTXG59XG5cbmV4cG9ydCBlbnVtIFNjYWxpbmdUeXBlIHtcbiAgQ1BVID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTixcbiAgTUVNT1JZID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclNlY3JldCB7XG4gIFtrZXk6IHN0cmluZ106IFNlY3JldFZhbHVlO1xufVxuXG4vKipcbiAqIERvbWFpbkNvbmZpZ3VyYXRpb25cbiAqIC0gV2hlbiBzdXBwbGllZCBhIGRvbWFpbiBuYW1lLCBhIGhvc3RlZCB6b25lLCBjZXJ0aWZpY2F0ZSBhbmQgQVJlY29yZCB3aWxsIGJlIGNyZWF0ZWRcbiAqIC0gV2hlbiBzdXBwbGllZCBhIGRvbWFpbiBuYW1lIGFuZCBob3N0ZWQgem9uZSwgYSBjZXJ0aWZpY2F0ZSBhbmQgQVJlY29yZCB3aWxsIGJlIGNyZWF0ZWRcbiAqIC0gV2hlbiBhbGwgcHJvcGVydGllcyBhcmUgc3VwcGxpZWQgb25seSBhIHRhcmdldCB3aWxsIGJlIGNyZWF0ZWRcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIERvbWFpbkJhc2VDb25maWcge1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU/OiBGamFsbEhvc3RlZFpvbmU7XG4gIGNlcnRpZmljYXRlPzogQ2VydGlmaWNhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZW5jeURvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICAvLyBTZXQgdG8gZW5hYmxlIGxhdGVuY3kgYmFzZWQgcm91dGluZ1xuICByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWlnaHRlZERvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICAvLyBTZXQgdG8gZW5hYmxlIHdlaWdodGVkIHJvdXRpbmdcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvTG9jYXRpb25Eb21haW5Db25maWcgZXh0ZW5kcyBEb21haW5CYXNlQ29uZmlnIHtcbiAgLy8gU2V0IHRvIGVuYWJsZSBnZW9sb2NhdGlvbiBiYXNlZCByb3V0aW5nXG4gIGdlb0xvY2F0aW9uOiBHZW9Mb2NhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgRG9tYWluQ29uZmlnID1cbiAgfCBEb21haW5CYXNlQ29uZmlnXG4gIHwgTGF0ZW5jeURvbWFpbkNvbmZpZ1xuICB8IFdlaWdodGVkRG9tYWluQ29uZmlnXG4gIHwgR2VvTG9jYXRpb25Eb21haW5Db25maWc7XG5cbmV4cG9ydCB0eXBlIEZhcmdhdGVDbHVzdGVyUHJvcHMgPSB7XG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG4gIGNsdXN0ZXJOYW1lOiBzdHJpbmc7XG4gIGNvbnRhaW5lckNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgY29udGFpbmVyRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcbiAgY29udGFpbmVyU2VjcmV0cz86IENvbnRhaW5lclNlY3JldDtcbiAgY29udGFpbmVyU2VjcmV0c0ltcG9ydD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQ7XG4gIH07XG4gIGNvbnRhaW5lclBvcnQ/OiBudW1iZXI7XG4gIGNwdT86IG51bWJlcjtcbiAgZGF0YWJhc2VDb25uZWN0aW9uPzogSUNvbm5lY3RhYmxlO1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG4gIGRlc2lyZWRDb3VudD86IG51bWJlcjtcbiAgaGVhbHRoQ2hlY2tQYXRoPzogc3RyaW5nO1xuICBsaXN0ZW5lclBvcnQ/OiBudW1iZXI7XG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuICBwdWJsaWNMb2FkQmFsYW5jZXI/OiBib29sZWFuO1xuICBwcm90b2NvbDogUHJvdG9jb2w7XG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHRhc2tSb2xlSW5saW5lUG9saWNpZXM/OiB7XG4gICAgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50O1xuICB9O1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG4gIHZwYz86IElWcGM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYXJnYXRlQ2x1c3RlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBjbHVzdGVyOiBDZGtDbHVzdGVyO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlcjogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByaXZhdGUgZXhlY3V0aW9uUm9sZTogUm9sZTtcbiAgcHJpdmF0ZSB0YXNrRGVmaW5pdGlvbjogRmFyZ2F0ZVRhc2tEZWZpbml0aW9uO1xuICBwcml2YXRlIGNvbnRhaW5lckRlZmluaXRpb246IENvbnRhaW5lckRlZmluaXRpb247XG4gIHByaXZhdGUgZmFyZ2F0ZVNlcnZpY2U6IEZhcmdhdGVTZXJ2aWNlO1xuICBwcml2YXRlIHNjYWxpbmdQb2xpY3k6IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeTtcbiAgcHJpdmF0ZSBob3N0ZWRab25lOiBJSG9zdGVkWm9uZTtcbiAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGU7XG4gIHByaXZhdGUgYVJlY29yZDogQVJlY29yZDtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogQXBwbGljYXRpb25MaXN0ZW5lcjtcblxuICBwcml2YXRlIHNlY3JldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFY3NTZWNyZXQ7XG4gIH0gPSB7fTtcblxuICBwcml2YXRlIHNjb3BlOiBDb25zdHJ1Y3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgdGhpcy5hZGRDbHVzdGVyKHByb3BzKTtcbiAgICB0aGlzLmFkZFNlY3JldHMocHJvcHMpO1xuICAgIHRoaXMuaW1wb3J0U2VjcmV0cyhwcm9wcyk7XG4gICAgdGhpcy5hZGRFeGVjdXRpb25Sb2xlKHByb3BzKTtcbiAgICB0aGlzLmFkZFRhc2tEZWZpbml0aW9uKHByb3BzKTtcbiAgICB0aGlzLmFkZENvbnRhaW5lckRlZmluaXRpb24ocHJvcHMpO1xuICAgIHRoaXMuYWRkRmFyZ2F0ZVNlcnZpY2UocHJvcHMpO1xuICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyKHByb3BzKTtcblxuICAgIGlmICghIXByb3BzLmRvbWFpbkNvbmZpZykgdGhpcy5hZGRIb3N0ZWRab25lKHByb3BzKTtcblxuICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJMb2FkQmFsYW5jZXJUYXJnZXRzKHByb3BzKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmZhcmdhdGVTZXJ2aWNlLmNvbm5lY3Rpb25zO1xuXG4gICAgLy90b2RvOiBmaXggY29ubmVjdGlvbnMgbm90IHdvcmtpbmcgYXV0b21hdGljYWxseVxuICAgIGlmIChwcm9wcy5kYXRhYmFzZUNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuZmFyZ2F0ZVNlcnZpY2UuY29ubmVjdGlvbnMuYWxsb3dUbyhcbiAgICAgICAgcHJvcHMuZGF0YWJhc2VDb25uZWN0aW9uLFxuICAgICAgICBQb3J0LlBPU1RHUkVTXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZENsdXN0ZXIocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgQ2RrQ2x1c3Rlcih0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1gLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSxcbiAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRUQsXG4gICAgICBlbmFibGVGYXJnYXRlQ2FwYWNpdHlQcm92aWRlcnM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIE91dHB1dCB1c2VkIHRvIGF1dG8tZGV0ZWN0IGRlcGxveWFibGUgY2x1dGVyXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZUNsdXN0ZXJgLFxuICAgICAgdmFsdWU6IHRoaXMuY2x1c3Rlci5jbHVzdGVyQXJuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogI3RvZG86IGNoYW5nZSB0aGlzIHRvIGNyZWF0ZSBuZXcgc2VjcmV0cyBpbnN0ZWFkXG4gICAqIEBkZXByZWNhdGVkIHVzZSBpbXBvcnRTZWNyZXRzIGluc3RlYWRcbiAgICovXG4gIGFkZFNlY3JldHMocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBDb250YWluZXIgU2VjcmV0c1xuICAgIGNvbnN0IGNvbnRhaW5lclNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfVNlY3JldGAsXG4gICAgICBgLyR7cHJvcHMuY2x1c3Rlck5hbWV9LyR7cHJvcHMuc2VydmljZU5hbWV9YFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHNlY3JldEZpZWxkIGluIHByb3BzLmNvbnRhaW5lclNlY3JldHMpIHtcbiAgICAgIHRoaXMuc2VjcmV0c1tzZWNyZXRGaWVsZF0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICBjb250YWluZXJTZWNyZXQsXG4gICAgICAgIHNlY3JldEZpZWxkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGltcG9ydCBzZWNyZXRzIGZyb20gYW5vdGhlciByZXNvdXJjZSBvciBzdGFja1xuICAgKi9cbiAgaW1wb3J0U2VjcmV0cyhwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIGlmICghcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydCkge1xuICAgICAgY29uc3QgaW1wb3J0U2VjcmV0ID0gcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydFtrZXldO1xuXG4gICAgICAvLyB0b2RvOiBJIHRoaW5rIElEIG5lZWRzIHRvIGJlIGEgbmV3IHZhbHVlIGFzIGl0IElEJ3MgdGhlIElNUE9SVCBub3QgdGhlIHNlY3JldCBpdHNlbGY/XG5cbiAgICAgIC8vIENvbnN0cnVjdCB0aGUgQVdTIElTZWNyZXQgb2JqZWN0XG4gICAgICBjb25zdCBpU2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGltcG9ydFNlY3JldC5pZCxcbiAgICAgICAgaW1wb3J0U2VjcmV0Lm5hbWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc2VjcmV0c1trZXldID0gRWNzU2VjcmV0LmZyb21TZWNyZXRzTWFuYWdlcihcbiAgICAgICAgaVNlY3JldCxcbiAgICAgICAgaW1wb3J0U2VjcmV0LmZpZWxkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEV4ZWN1dGlvblJvbGUocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJvbGUgPSBuZXcgUm9sZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1FeGVjdXRpb25Sb2xlJHtTdGFjay5vZih0aGlzKS5yZWdpb259YCxcbiAgICAgIHtcbiAgICAgICAgcm9sZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGUke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn1gLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuc2VydmljZU5hbWV9IEV4ZWN1dGlvbiBSb2xlYCxcbiAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFuYWdlZFBvbGljeUFybjpcbiAgICAgICAgICAgICAgXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQW1hem9uRUNTVGFza0V4ZWN1dGlvblJvbGVQb2xpY3lcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICBbXCJyZWFkU2VjcmV0c1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpEZXNjcmliZVNlY3JldFwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIHNlY3JldCBBUk5cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBbXCJkZWNyeXB0U2VjcmV0c1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIl0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdIC8vIFRPRE86IFNldCB0aGlzIHRvIHRoZSBLTVMgQXJuXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSksXG4gICAgICAgICAgW1wiZWNzRXhlY3V0ZUNvbW1hbmRcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6Q3JlYXRlQ29udHJvbENoYW5uZWxcIixcbiAgICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6Q3JlYXRlRGF0YUNoYW5uZWxcIixcbiAgICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgICBcInNzbW1lc3NhZ2VzOk9wZW5EYXRhQ2hhbm5lbFwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFkZFRhc2tEZWZpbml0aW9uKHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy50YXNrRGVmaW5pdGlvbiA9IG5ldyBGYXJnYXRlVGFza0RlZmluaXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9VGFza0RlZmluaXRpb25gLFxuICAgICAge1xuICAgICAgICBjcHU6IHByb3BzLmNwdSB8fCAyNTYsXG4gICAgICAgIGV4ZWN1dGlvblJvbGU6IHRoaXMuZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGU6IG5ldyBSb2xlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9VGFza1JvbGUke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJvbGVOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrUm9sZSR7U3RhY2sub2YodGhpcykucmVnaW9ufWAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuc2VydmljZU5hbWV9IFRhc2sgUm9sZWAsXG4gICAgICAgICAgICBpbmxpbmVQb2xpY2llczogcHJvcHMudGFza1JvbGVJbmxpbmVQb2xpY2llcyxcbiAgICAgICAgICAgIG1hbmFnZWRQb2xpY2llczogcHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQiB8fCA1MTJcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkQ29udGFpbmVyRGVmaW5pdGlvbihwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuY29udGFpbmVyRGVmaW5pdGlvbiA9IHRoaXMudGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9Q29udGFpbmVyRGVmaW5pdGlvbmAsXG4gICAgICB7XG4gICAgICAgIGltYWdlOiB0aGlzLmdldEltYWdlKHByb3BzKSxcbiAgICAgICAgY29udGFpbmVyTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgLi4ucHJvcHMuY29udGFpbmVyRW52aXJvbm1lbnRcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDogcHJvcHMuY29udGFpbmVyQ29tbWFuZCxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIC4uLnRoaXMuc2VjcmV0c1xuICAgICAgICB9LFxuICAgICAgICAvL3RvZG86IHByb3ZpZGUgaGVhbHRoIGNoZWNrIG9wdGlvbnNcbiAgICAgICAgLy8gaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgLy8gICBjb21tYW5kOiBbXG4gICAgICAgIC8vICAgICBcIkNNRC1TSEVMTFwiLFxuICAgICAgICAvLyAgICAgYHRpbWVvdXQgMTBzIC9iaW4vc2ggLWMgJzo+IC9kZXYvdGNwLzEyNy4wLjAuMS8ke3Byb3BzLmNvbnRhaW5lclBvcnR9JyB8fCBleGl0IDFgXG4gICAgICAgIC8vICAgXVxuICAgICAgICAvLyB9LFxuICAgICAgICBsb2dnaW5nOiBuZXcgQXdzTG9nRHJpdmVyKHtcbiAgICAgICAgICBzdHJlYW1QcmVmaXg6IGAvZWNzLyR7cHJvcHMuY2x1c3Rlck5hbWV9LyR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICBsb2dSZXRlbnRpb246IDE0XG4gICAgICAgIH0pLFxuICAgICAgICBwb3J0TWFwcGluZ3M6IHByb3BzLmNvbnRhaW5lclBvcnRcbiAgICAgICAgICA/IFt7IGNvbnRhaW5lclBvcnQ6IHByb3BzLmNvbnRhaW5lclBvcnQgfV1cbiAgICAgICAgICA6IFt7IGNvbnRhaW5lclBvcnQ6IDgwIH1dXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFkZEZhcmdhdGVTZXJ2aWNlKHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5mYXJnYXRlU2VydmljZSA9IG5ldyBGYXJnYXRlU2VydmljZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1GYXJnYXRlU2VydmljZWAsXG4gICAgICB7XG4gICAgICAgIGNpcmN1aXRCcmVha2VyOiB7IHJvbGxiYWNrOiB0cnVlIH0sXG4gICAgICAgIGNsdXN0ZXI6IHRoaXMuY2x1c3RlcixcbiAgICAgICAgZGVzaXJlZENvdW50OiAyLFxuICAgICAgICBlbmFibGVFQ1NNYW5hZ2VkVGFnczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICAgIHByb3BhZ2F0ZVRhZ3M6IFByb3BhZ2F0ZWRUYWdTb3VyY2UuU0VSVklDRSxcbiAgICAgICAgc2VydmljZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfWAsXG4gICAgICAgIHRhc2tEZWZpbml0aW9uOiB0aGlzLnRhc2tEZWZpbml0aW9uLFxuICAgICAgICBtaW5IZWFsdGh5UGVyY2VudDogMTAwLFxuICAgICAgICBtYXhIZWFsdGh5UGVyY2VudDogMjAwXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIE91dHB1dCB1c2VkIHRvIGRldGVjdCBkZXBsb3lhYmxlIHNlcnZpY2VcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVTZXJ2aWNlYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlU2VydmljZWAsXG4gICAgICB2YWx1ZTogdGhpcy5mYXJnYXRlU2VydmljZS5zZXJ2aWNlQXJuXG4gICAgfSk7XG4gIH1cblxuICBhZGRTY2FsaW5nUG9saWN5KHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5zY2FsaW5nUG9saWN5ID0gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgcG9saWN5TmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICAgIHNjYWxpbmdUYXJnZXQ6IG5ldyBTY2FsYWJsZVRhcmdldChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfXNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhDYXBhY2l0eTogMTAsXG4gICAgICAgICAgICBtaW5DYXBhY2l0eTogMixcbiAgICAgICAgICAgIHJlc291cmNlSWQ6IGBzZXJ2aWNlLyR7dGhpcy5jbHVzdGVyLmNsdXN0ZXJOYW1lfS8ke3RoaXMuZmFyZ2F0ZVNlcnZpY2Uuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIHNjYWxhYmxlRGltZW5zaW9uOiBcImVjczpzZXJ2aWNlOkRlc2lyZWRDb3VudFwiLFxuICAgICAgICAgICAgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZS5FQ1NcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHRhcmdldFZhbHVlOiA1MCxcbiAgICAgICAgc2NhbGVPdXRDb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHNjYWxlSW5Db29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHByZWRlZmluZWRNZXRyaWM6XG4gICAgICAgICAgcHJvcHMuc2NhbGluZ1R5cGUgPT0gU2NhbGluZ1R5cGUuTUVNT1JZXG4gICAgICAgICAgICA/IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbiAgICAgICAgICAgIDogUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTlxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlLnJlZ2lzdGVyTG9hZEJhbGFuY2VyVGFyZ2V0cyh7XG4gICAgICBjb250YWluZXJOYW1lOiB0aGlzLmNvbnRhaW5lckRlZmluaXRpb24uY29udGFpbmVyTmFtZSxcbiAgICAgIGNvbnRhaW5lclBvcnQ6IHRoaXMuY29udGFpbmVyRGVmaW5pdGlvbi5jb250YWluZXJQb3J0LFxuICAgICAgbmV3VGFyZ2V0R3JvdXBJZDogYCR7cHJvcHMuc2VydmljZU5hbWV9VGFyZ2V0R3JvdXBgLFxuICAgICAgbGlzdGVuZXI6IExpc3RlbmVyQ29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXIodGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciwge1xuICAgICAgICBwb3J0OiBwcm9wcy5jb250YWluZXJQb3J0LFxuICAgICAgICBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgICAgcGF0aDogcHJvcHMuaGVhbHRoQ2hlY2tQYXRoIHx8IFwiL1wiLFxuICAgICAgICAgIHBvcnQ6IHByb3BzLmNvbnRhaW5lclBvcnQgPyBgJHtwcm9wcy5jb250YWluZXJQb3J0fWAgOiBcInRyYWZmaWMtcG9ydFwiLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBhZGRMb2FkQmFsYW5jZXIocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBUcnVuY2F0ZSB0aGUgbG9hZCBiYWxhbmNlciBuYW1lIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIDMyIGNoYXJhY3RlciBBV1MgbGltaXRcbiAgICBjb25zdCBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZSA9IGAke3Byb3BzLnNlcnZpY2VOYW1lfUxvYWRCYWxhbmNlcmA7XG4gICAgY29uc3Qgc3VwcG9ydGVkTmFtZUxlbmd0aCA9IDMyO1xuXG4gICAgbGV0IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPVxuICAgICAgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUubGVuZ3RoID4gc3VwcG9ydGVkTmFtZUxlbmd0aFxuICAgICAgICA/IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLnN1YnN0cmluZygwLCBzdXBwb3J0ZWROYW1lTGVuZ3RoKVxuICAgICAgICA6IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lO1xuXG4gICAgLy8gUmVtb3ZlIGFueSB0cmFpbGluZyBoeXBoZW5zIHRoYXQgbWlnaHQgYmUgaW50cm9kdWNlZCBieSB0cnVuY2F0aW9uXG4gICAgdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSA9IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUucmVwbGFjZSgvLSskLywgXCJcIik7XG5cbiAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgIGludGVybmV0RmFjaW5nOiB0cnVlLFxuICAgICAgICBsb2FkQmFsYW5jZXJOYW1lOiB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyRG5zTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZVxuICAgIH0pO1xuICB9XG5cbiAgYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICBpZiAoISF0aGlzLmNlcnRpZmljYXRlKSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQ6IHByb3BzLnByb3RvY29sID09IFByb3RvY29sLkhUVFAgPyA4MCA6IDQ0MyxcbiAgICAgICAgICBjZXJ0aWZpY2F0ZXM6IFt0aGlzLmNlcnRpZmljYXRlXVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUxpc3RlbmVyYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnQ6IHByb3BzLnByb3RvY29sID09IFByb3RvY29sLkhUVFAgPyA4MCA6IDQ0M1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEhvc3RlZFpvbmUocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLmRvbWFpbkNvbmZpZykgcmV0dXJuO1xuXG4gICAgaWYgKCFwcm9wcy5kb21haW5Db25maWcuaG9zdGVkWm9uZSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGhvc3RlZCB6b25lIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcbiAgICAgIHZhciBob3N0ZWRab25lID0gbmV3IEZqYWxsSG9zdGVkWm9uZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9SG9zdGVkWm9uZWAsXG4gICAgICAgIHtcbiAgICAgICAgICB6b25lTmFtZTogcHJvcHMuZG9tYWluQ29uZmlnLmRvbWFpbk5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5ob3N0ZWRab25lID0gaG9zdGVkWm9uZS5nZXRJbnRlcm5hbEhvc3RlZFpvbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgcHJvdmlkZWQgaG9zdGVkIHpvbmVcbiAgICAgIHRoaXMuaG9zdGVkWm9uZSA9IHByb3BzLmRvbWFpbkNvbmZpZy5ob3N0ZWRab25lLmdldEludGVybmFsSG9zdGVkWm9uZSgpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMuZG9tYWluQ29uZmlnLmNlcnRpZmljYXRlKSB7XG4gICAgICAvLyBJZiBubyBjZXJ0aWZpY2F0ZSBpcyBwcm92aWRlZCAtIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgQ2VydGlmaWNhdGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUNlcnRpZmljYXRlYCxcbiAgICAgICAge1xuICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbkNvbmZpZy5kb21haW5OYW1lLFxuICAgICAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgY3JlYXRlIGEgbmV3IEFSZWNvcmQgZm9yIHRoaXMgZG9tYWluIGFuZCBhdHRhY2ggaXQgdG8gdGhlIGxvYWQgYmFsYW5jZXJcbiAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0uJHtwcm9wcy5jbHVzdGVyTmFtZX0uJHtwcm9wcy5kb21haW5Db25maWcuZG9tYWluTmFtZX1BUmVjb3JkYCxcbiAgICAgIHtcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluQ29uZmlnLmRvbWFpbk5hbWUsXG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBMb2FkQmFsYW5jZXJUYXJnZXQodGhpcy5sb2FkQmFsYW5jZXIpXG4gICAgICAgICksXG4gICAgICAgIHJlZ2lvbjogKHByb3BzLmRvbWFpbkNvbmZpZyBhcyBMYXRlbmN5RG9tYWluQ29uZmlnKT8ucmVnaW9uLFxuICAgICAgICB3ZWlnaHQ6IChwcm9wcy5kb21haW5Db25maWcgYXMgV2VpZ2h0ZWREb21haW5Db25maWcpPy53ZWlnaHQsXG4gICAgICAgIGdlb0xvY2F0aW9uOiAocHJvcHMuZG9tYWluQ29uZmlnIGFzIEdlb0xvY2F0aW9uRG9tYWluQ29uZmlnKVxuICAgICAgICAgID8uZ2VvTG9jYXRpb25cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZ2V0SW1hZ2UocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpOiBDb250YWluZXJJbWFnZSB7XG4gICAgaWYgKCFwcm9wcy5lY3JSZXBvc2l0b3J5KVxuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiKTtcbiAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIENvbnRhaW5lckltYWdlKVxuICAgICAgcmV0dXJuIHByb3BzLmVjclJlcG9zaXRvcnk7XG4gICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkocHJvcHMuZWNyUmVwb3NpdG9yeSwgXCJsYXRlc3RcIik7XG4gICAgfVxuICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wc1xuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBJVnBjKSB8fCBwcm9wcy52cGNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgdGhpcyhzYi5nZXRTdGFjaygpLCBpZCwgbmV3UHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBVzZCO0FBQzdCLGlEQU02QjtBQUM3QiwyQ0FBdUM7QUFFdkMsNkNBQWdFO0FBQ2hFLHVGQUlnRDtBQUNoRCxpREFRNkI7QUFDN0IsdUZBS2dEO0FBQ2hELGlEQUEwRDtBQUMxRCx1RUFBd0Q7QUFDeEQsK0VBRzRDO0FBQzVDLHlEQUtpQztBQUNqQyx5RUFBcUU7QUFDckUsaURBQWlEO0FBR2pELHNEQUFtRDtBQUNuRCxpRUFBaUY7QUFJakYsSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLHVDQUFJLENBQUE7SUFDSix5Q0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQUhXLFFBQVEsd0JBQVIsUUFBUSxRQUduQjtBQUVELElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixzREFBMEQsQ0FBQTtJQUMxRCw0REFBZ0UsQ0FBQTtBQUNsRSxDQUFDLEVBSFcsV0FBVywyQkFBWCxXQUFXLFFBR3RCO0FBcUVELE1BQXFCLGNBQWUsU0FBUSxzQkFBUztJQXFCbkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUFgsWUFBTyxHQUVYLEVBQUUsQ0FBQztRQU9MLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxD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Q0osQ0FBQztDQUNGO0FBdGRELGlDQXNkQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlcixcbiAgQ2x1c3RlciBhcyBDZGtDbHVzdGVyLFxuICBDb250YWluZXJJbWFnZSxcbiAgRmFyZ2F0ZVNlcnZpY2UsXG4gIEZhcmdhdGVUYXNrRGVmaW5pdGlvbixcbiAgTGlzdGVuZXJDb25maWcsXG4gIFByb3BhZ2F0ZWRUYWdTb3VyY2UsXG4gIHR5cGUgUmVwb3NpdG9yeUltYWdlLFxuICB0eXBlIENvbnRhaW5lckRlZmluaXRpb24sXG4gIENvbnRhaW5lckluc2lnaHRzXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVZwYyxcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IER1cmF0aW9uLCB0eXBlIFNlY3JldFZhbHVlLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyLFxuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgQXBwbGljYXRpb25Qcm90b2NvbFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7XG4gIENvbXBvc2l0ZVByaW5jaXBhbCxcbiAgRWZmZWN0LFxuICB0eXBlIElNYW5hZ2VkUG9saWN5LFxuICBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBSb2xlLFxuICBTZXJ2aWNlUHJpbmNpcGFsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBQcmVkZWZpbmVkTWV0cmljLFxuICBTY2FsYWJsZVRhcmdldCxcbiAgU2VydmljZU5hbWVzcGFjZSxcbiAgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBwbGljYXRpb25hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgU2VjcmV0IGFzIEVjc1NlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZSxcbiAgQ2VydGlmaWNhdGVWYWxpZGF0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBUmVjb3JkLFxuICBSZWNvcmRUYXJnZXQsXG4gIHR5cGUgSUhvc3RlZFpvbmUsXG4gIHR5cGUgR2VvTG9jYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQgeyBMb2FkQmFsYW5jZXJUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5cbmltcG9ydCB7IHR5cGUgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5pbXBvcnQgeyBIb3N0ZWRab25lIGFzIEZqYWxsSG9zdGVkWm9uZSB9IGZyb20gXCIuLi8uLi8uLi9wYXR0ZXJucy9hd3MvaG9zdGVkWm9uZVwiO1xuXG5pbXBvcnQgeyB0eXBlIFNlY3JldEltcG9ydCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5cbmV4cG9ydCBlbnVtIFByb3RvY29sIHtcbiAgSFRUUCxcbiAgSFRUUFNcbn1cblxuZXhwb3J0IGVudW0gU2NhbGluZ1R5cGUge1xuICBDUFUgPSBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfQ1BVX1VUSUxJWkFUSU9OLFxuICBNRU1PUlkgPSBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfTUVNT1JZX1VUSUxJWkFUSU9OXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyU2VjcmV0IHtcbiAgW2tleTogc3RyaW5nXTogU2VjcmV0VmFsdWU7XG59XG5cbi8qKlxuICogRG9tYWluQ29uZmlndXJhdGlvblxuICogLSBXaGVuIHN1cHBsaWVkIGEgZG9tYWluIG5hbWUsIGEgaG9zdGVkIHpvbmUsIGNlcnRpZmljYXRlIGFuZCBBUmVjb3JkIHdpbGwgYmUgY3JlYXRlZFxuICogLSBXaGVuIHN1cHBsaWVkIGEgZG9tYWluIG5hbWUgYW5kIGhvc3RlZCB6b25lLCBhIGNlcnRpZmljYXRlIGFuZCBBUmVjb3JkIHdpbGwgYmUgY3JlYXRlZFxuICogLSBXaGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBzdXBwbGllZCBvbmx5IGEgdGFyZ2V0IHdpbGwgYmUgY3JlYXRlZFxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9tYWluQmFzZUNvbmZpZyB7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgaG9zdGVkWm9uZT86IEZqYWxsSG9zdGVkWm9uZTtcbiAgY2VydGlmaWNhdGU/OiBDZXJ0aWZpY2F0ZTtcbiAgLy8gT3B0aW9uYWw6IFNldCBpZGVudGlmaWVyIGZvciByb3V0aW5nIHBvbGljaWVzIChhdXRvLWdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQpXG4gIHNldElkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF0ZW5jeURvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICAvLyBTZXQgdG8gZW5hYmxlIGxhdGVuY3kgYmFzZWQgcm91dGluZ1xuICByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWlnaHRlZERvbWFpbkNvbmZpZyBleHRlbmRzIERvbWFpbkJhc2VDb25maWcge1xuICAvLyBTZXQgdG8gZW5hYmxlIHdlaWdodGVkIHJvdXRpbmdcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvTG9jYXRpb25Eb21haW5Db25maWcgZXh0ZW5kcyBEb21haW5CYXNlQ29uZmlnIHtcbiAgLy8gU2V0IHRvIGVuYWJsZSBnZW9sb2NhdGlvbiBiYXNlZCByb3V0aW5nXG4gIGdlb0xvY2F0aW9uOiBHZW9Mb2NhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgRG9tYWluQ29uZmlnID1cbiAgfCBEb21haW5CYXNlQ29uZmlnXG4gIHwgTGF0ZW5jeURvbWFpbkNvbmZpZ1xuICB8IFdlaWdodGVkRG9tYWluQ29uZmlnXG4gIHwgR2VvTG9jYXRpb25Eb21haW5Db25maWc7XG5cbmV4cG9ydCB0eXBlIEZhcmdhdGVDbHVzdGVyUHJvcHMgPSB7XG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG4gIGNsdXN0ZXJOYW1lOiBzdHJpbmc7XG4gIGNvbnRhaW5lckNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgY29udGFpbmVyRW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcbiAgY29udGFpbmVyU2VjcmV0cz86IENvbnRhaW5lclNlY3JldDtcbiAgY29udGFpbmVyU2VjcmV0c0ltcG9ydD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQ7XG4gIH07XG4gIGNvbnRhaW5lclBvcnQ/OiBudW1iZXI7XG4gIGNwdT86IG51bWJlcjtcbiAgZG9tYWluQ29uZmlnPzogRG9tYWluQ29uZmlnO1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbiAgbGlzdGVuZXJQb3J0PzogbnVtYmVyO1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcbiAgcHVibGljTG9hZEJhbGFuY2VyPzogYm9vbGVhbjtcbiAgcHJvdG9jb2w6IFByb3RvY29sO1xuICBzY2FsaW5nVHlwZT86IFNjYWxpbmdUeXBlO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuICB2cGM/OiBJVnBjO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFyZ2F0ZUNsdXN0ZXIgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgY2x1c3RlcjogQ2RrQ2x1c3RlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXI6IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICBwcml2YXRlIGV4ZWN1dGlvblJvbGU6IFJvbGU7XG4gIHByaXZhdGUgdGFza0RlZmluaXRpb246IEZhcmdhdGVUYXNrRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBjb250YWluZXJEZWZpbml0aW9uOiBDb250YWluZXJEZWZpbml0aW9uO1xuICBwcml2YXRlIGZhcmdhdGVTZXJ2aWNlOiBGYXJnYXRlU2VydmljZTtcbiAgcHJpdmF0ZSBzY2FsaW5nUG9saWN5OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG4gIHByaXZhdGUgaG9zdGVkWm9uZTogSUhvc3RlZFpvbmU7XG4gIHByaXZhdGUgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlO1xuICBwcml2YXRlIGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyTGlzdGVuZXI6IEFwcGxpY2F0aW9uTGlzdGVuZXI7XG5cbiAgcHJpdmF0ZSBzZWNyZXRzOiB7XG4gICAgW2tleTogc3RyaW5nXTogRWNzU2VjcmV0O1xuICB9ID0ge307XG5cbiAgcHJpdmF0ZSBzY29wZTogQ29uc3RydWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIHRoaXMuYWRkQ2x1c3Rlcihwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWNyZXRzKHByb3BzKTtcbiAgICB0aGlzLmltcG9ydFNlY3JldHMocHJvcHMpO1xuICAgIHRoaXMuYWRkRXhlY3V0aW9uUm9sZShwcm9wcyk7XG4gICAgdGhpcy5hZGRUYXNrRGVmaW5pdGlvbihwcm9wcyk7XG4gICAgdGhpcy5hZGRDb250YWluZXJEZWZpbml0aW9uKHByb3BzKTtcbiAgICB0aGlzLmFkZEZhcmdhdGVTZXJ2aWNlKHByb3BzKTtcbiAgICB0aGlzLmFkZExvYWRCYWxhbmNlcihwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuZG9tYWluQ29uZmlnKSB0aGlzLmFkZEhvc3RlZFpvbmUocHJvcHMpO1xuXG4gICAgdGhpcy5hZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMocHJvcHMpO1xuXG4gICAgY29uc3QgY29udGFpbmVyUG9ydCA9IHByb3BzLmNvbnRhaW5lclBvcnQgfHwgODA7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogdGhpcy5mYXJnYXRlU2VydmljZS5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3VwcyxcbiAgICAgIGRlZmF1bHRQb3J0OiBQb3J0LnRjcChjb250YWluZXJQb3J0KVxuICAgIH0pO1xuICB9XG5cbiAgYWRkQ2x1c3Rlcihwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuY2x1c3RlciA9IG5ldyBDZGtDbHVzdGVyKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfWAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAgY29udGFpbmVySW5zaWdodHNWMjogQ29udGFpbmVySW5zaWdodHMuRU5BQkxFRCxcbiAgICAgIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gT3V0cHV0IHVzZWQgdG8gYXV0by1kZXRlY3QgZGVwbG95YWJsZSBjbHV0ZXJcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVDbHVzdGVyYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1EZXBsb3lhYmxlQ2x1c3RlcmAsXG4gICAgICB2YWx1ZTogdGhpcy5jbHVzdGVyLmNsdXN0ZXJBcm5cbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBjbHVzdGVyIEFSTiBmb3IgbW9uaXRvcmluZ1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9Q2x1c3RlckFybmAsIHtcbiAgICAgIGtleTogXCJDbHVzdGVyQXJuXCIsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1DbHVzdGVyQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmNsdXN0ZXIuY2x1c3RlckFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgRUNTIENsdXN0ZXIgQVJOIGZvciAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjdG9kbzogY2hhbmdlIHRoaXMgdG8gY3JlYXRlIG5ldyBzZWNyZXRzIGluc3RlYWRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGltcG9ydFNlY3JldHMgaW5zdGVhZFxuICAgKi9cbiAgYWRkU2VjcmV0cyhwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIC8vIENvbnRhaW5lciBTZWNyZXRzXG4gICAgY29uc3QgY29udGFpbmVyU2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9U2VjcmV0YCxcbiAgICAgIGAvJHtwcm9wcy5jbHVzdGVyTmFtZX0vJHtwcm9wcy5zZXJ2aWNlTmFtZX1gXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgc2VjcmV0RmllbGQgaW4gcHJvcHMuY29udGFpbmVyU2VjcmV0cykge1xuICAgICAgdGhpcy5zZWNyZXRzW3NlY3JldEZpZWxkXSA9IEVjc1NlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIoXG4gICAgICAgIGNvbnRhaW5lclNlY3JldCxcbiAgICAgICAgc2VjcmV0RmllbGRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9tYXRpY2FsbHkgaW1wb3J0IHNlY3JldHMgZnJvbSBhbm90aGVyIHJlc291cmNlIG9yIHN0YWNrXG4gICAqL1xuICBpbXBvcnRTZWNyZXRzKHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy5jb250YWluZXJTZWNyZXRzSW1wb3J0KSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcy5jb250YWluZXJTZWNyZXRzSW1wb3J0KSB7XG4gICAgICBjb25zdCBpbXBvcnRTZWNyZXQgPSBwcm9wcy5jb250YWluZXJTZWNyZXRzSW1wb3J0W2tleV07XG5cbiAgICAgIC8vIHRvZG86IEkgdGhpbmsgSUQgbmVlZHMgdG8gYmUgYSBuZXcgdmFsdWUgYXMgaXQgSUQncyB0aGUgSU1QT1JUIG5vdCB0aGUgc2VjcmV0IGl0c2VsZj9cblxuICAgICAgLy8gQ29uc3RydWN0IHRoZSBBV1MgSVNlY3JldCBvYmplY3RcbiAgICAgIGNvbnN0IGlTZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgaW1wb3J0U2VjcmV0LmlkLFxuICAgICAgICBpbXBvcnRTZWNyZXQubmFtZVxuICAgICAgKTtcblxuICAgICAgdGhpcy5zZWNyZXRzW2tleV0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICBpU2VjcmV0LFxuICAgICAgICBpbXBvcnRTZWNyZXQuZmllbGRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYWRkRXhlY3V0aW9uUm9sZShwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IG5ldyBSb2xlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGUke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn1gLFxuICAgICAge1xuICAgICAgICByb2xlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZSR7U3RhY2sub2YodGhpcykucmVnaW9ufWAsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0gRXhlY3V0aW9uIFJvbGVgLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYW5hZ2VkUG9saWN5QXJuOlxuICAgICAgICAgICAgICBcImFybjphd3M6aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BbWF6b25FQ1NUYXNrRXhlY3V0aW9uUm9sZVBvbGljeVwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICAgIFtcInJlYWRTZWNyZXRzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcInNlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICBcInNlY3JldHNtYW5hZ2VyOkRlc2NyaWJlU2VjcmV0XCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSAvLyBUT0RPOiBTZXQgdGhpcyB0byB0aGUgc2VjcmV0IEFSTlxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIFtcImRlY3J5cHRTZWNyZXRzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIEtNUyBBcm5cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBbXCJlY3NFeGVjdXRlQ29tbWFuZFwiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVDb250cm9sQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuQ29udHJvbENoYW5uZWxcIixcbiAgICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkRhdGFDaGFubmVsXCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IENvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbChcImVjcy10YXNrcy5hbWF6b25hd3MuY29tXCIpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkVGFza0RlZmluaXRpb24ocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IEZhcmdhdGVUYXNrRGVmaW5pdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrRGVmaW5pdGlvbmAsXG4gICAgICB7XG4gICAgICAgIGNwdTogcHJvcHMuY3B1IHx8IDI1NixcbiAgICAgICAgZXhlY3V0aW9uUm9sZTogdGhpcy5leGVjdXRpb25Sb2xlLFxuICAgICAgICB0YXNrUm9sZTogbmV3IFJvbGUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrUm9sZSR7U3RhY2sub2YodGhpcykucmVnaW9ufWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcm9sZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tSb2xlJHtTdGFjay5vZih0aGlzKS5yZWdpb259YCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0gVGFzayBSb2xlYCxcbiAgICAgICAgICAgIGlubGluZVBvbGljaWVzOiBwcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBwcm9wcy50YXNrUm9sZU1hbmFnZWRQb2xpY2llcyxcbiAgICAgICAgICAgIGFzc3VtZWRCeTogbmV3IENvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgbWVtb3J5TGltaXRNaUI6IHByb3BzLm1lbW9yeUxpbWl0TWlCIHx8IDUxMlxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhZGRDb250YWluZXJEZWZpbml0aW9uKHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5jb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Db250YWluZXJEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0SW1hZ2UocHJvcHMpLFxuICAgICAgICBjb250YWluZXJOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAuLi5wcm9wcy5jb250YWluZXJFbnZpcm9ubWVudFxuICAgICAgICB9LFxuICAgICAgICBjb21tYW5kOiBwcm9wcy5jb250YWluZXJDb21tYW5kLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgLi4udGhpcy5zZWNyZXRzXG4gICAgICAgIH0sXG4gICAgICAgIC8vdG9kbzogcHJvdmlkZSBoZWFsdGggY2hlY2sgb3B0aW9uc1xuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS92aWV3LWNvbnRhaW5lci1oZWFsdGguaHRtbFxuICAgICAgICAgICAgLy8gID4+IHByb2MvMS9mZC8xIDI+JjEgcmVkaXJlY3RzIHN0ZG91dCBhbmQgc3RkZXJyIG9mIHRoZSBoZWFsdGggY2hlY2sgdG8gQ2xvdWRXYXRjaCBsb2dzXG4gICAgICAgICAgICAvLyBgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0OiR7cHJvcHMuY29udGFpbmVyUG9ydH0vID4+IC9wcm9jLzEvZmQvMSAyPiYxICB8fCBleGl0IDFgXG4gICAgICAgICAgICBgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0OiR7cHJvcHMuY29udGFpbmVyUG9ydH0vIHx8IGV4aXQgMWBcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgIHN0cmVhbVByZWZpeDogYC9lY3MvJHtwcm9wcy5jbHVzdGVyTmFtZX0vJHtwcm9wcy5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgfSksXG4gICAgICAgIHBvcnRNYXBwaW5nczogcHJvcHMuY29udGFpbmVyUG9ydFxuICAgICAgICAgID8gW3sgY29udGFpbmVyUG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCB9XVxuICAgICAgICAgIDogW3sgY29udGFpbmVyUG9ydDogODAgfV1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkRmFyZ2F0ZVNlcnZpY2UocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlID0gbmV3IEZhcmdhdGVTZXJ2aWNlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUZhcmdhdGVTZXJ2aWNlYCxcbiAgICAgIHtcbiAgICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgcm9sbGJhY2s6IHRydWUgfSxcbiAgICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgICBkZXNpcmVkQ291bnQ6IDIsXG4gICAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgICBlbmFibGVFeGVjdXRlQ29tbWFuZDogdHJ1ZSxcbiAgICAgICAgcHJvcGFnYXRlVGFnczogUHJvcGFnYXRlZFRhZ1NvdXJjZS5TRVJWSUNFLFxuICAgICAgICBzZXJ2aWNlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgICAgdGFza0RlZmluaXRpb246IHRoaXMudGFza0RlZmluaXRpb24sXG4gICAgICAgIG1pbkhlYWx0aHlQZXJjZW50OiAxMDAsXG4gICAgICAgIG1heEhlYWx0aHlQZXJjZW50OiAyMDBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gT3V0cHV0IHVzZWQgdG8gZGV0ZWN0IGRlcGxveWFibGUgc2VydmljZVxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9RGVwbG95YWJsZVNlcnZpY2VgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfURlcGxveWFibGVTZXJ2aWNlYCxcbiAgICAgIHZhbHVlOiB0aGlzLmZhcmdhdGVTZXJ2aWNlLnNlcnZpY2VBcm5cbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBzZXJ2aWNlIEFSTiBmb3IgbW9uaXRvcmluZ1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuY2x1c3Rlck5hbWV9U2VydmljZUFybmAsIHtcbiAgICAgIGtleTogXCJTZXJ2aWNlQXJuXCIsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1TZXJ2aWNlQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmZhcmdhdGVTZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYEVDUyBTZXJ2aWNlIEFSTiBmb3IgJHtwcm9wcy5zZXJ2aWNlTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBhZGRTY2FsaW5nUG9saWN5KHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5zY2FsaW5nUG9saWN5ID0gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgcG9saWN5TmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICAgIHNjYWxpbmdUYXJnZXQ6IG5ldyBTY2FsYWJsZVRhcmdldChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfXNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhDYXBhY2l0eTogMTAsXG4gICAgICAgICAgICBtaW5DYXBhY2l0eTogMixcbiAgICAgICAgICAgIHJlc291cmNlSWQ6IGBzZXJ2aWNlLyR7dGhpcy5jbHVzdGVyLmNsdXN0ZXJOYW1lfS8ke3RoaXMuZmFyZ2F0ZVNlcnZpY2Uuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIHNjYWxhYmxlRGltZW5zaW9uOiBcImVjczpzZXJ2aWNlOkRlc2lyZWRDb3VudFwiLFxuICAgICAgICAgICAgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZS5FQ1NcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHRhcmdldFZhbHVlOiA1MCxcbiAgICAgICAgc2NhbGVPdXRDb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHNjYWxlSW5Db29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIHByZWRlZmluZWRNZXRyaWM6XG4gICAgICAgICAgcHJvcHMuc2NhbGluZ1R5cGUgPT0gU2NhbGluZ1R5cGUuTUVNT1JZXG4gICAgICAgICAgICA/IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbiAgICAgICAgICAgIDogUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTlxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlLnJlZ2lzdGVyTG9hZEJhbGFuY2VyVGFyZ2V0cyh7XG4gICAgICBjb250YWluZXJOYW1lOiB0aGlzLmNvbnRhaW5lckRlZmluaXRpb24uY29udGFpbmVyTmFtZSxcbiAgICAgIGNvbnRhaW5lclBvcnQ6IHRoaXMuY29udGFpbmVyRGVmaW5pdGlvbi5jb250YWluZXJQb3J0LFxuICAgICAgbmV3VGFyZ2V0R3JvdXBJZDogYCR7cHJvcHMuc2VydmljZU5hbWV9VGFyZ2V0R3JvdXBgLFxuICAgICAgbGlzdGVuZXI6IExpc3RlbmVyQ29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXIodGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciwge1xuICAgICAgICBwb3J0OiBwcm9wcy5jb250YWluZXJQb3J0LFxuICAgICAgICBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgICAgcGF0aDogcHJvcHMuaGVhbHRoQ2hlY2tQYXRoIHx8IFwiL1wiLFxuICAgICAgICAgIHBvcnQ6IHByb3BzLmNvbnRhaW5lclBvcnQgPyBgJHtwcm9wcy5jb250YWluZXJQb3J0fWAgOiBcInRyYWZmaWMtcG9ydFwiLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBhZGRMb2FkQmFsYW5jZXIocHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBUcnVuY2F0ZSB0aGUgbG9hZCBiYWxhbmNlciBuYW1lIHRvIGVuc3VyZSBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIDMyIGNoYXJhY3RlciBBV1MgbGltaXRcbiAgICBjb25zdCBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZSA9IGAke3Byb3BzLnNlcnZpY2VOYW1lfUxvYWRCYWxhbmNlcmA7XG4gICAgY29uc3Qgc3VwcG9ydGVkTmFtZUxlbmd0aCA9IDMyO1xuXG4gICAgbGV0IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPVxuICAgICAgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUubGVuZ3RoID4gc3VwcG9ydGVkTmFtZUxlbmd0aFxuICAgICAgICA/IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLnN1YnN0cmluZygwLCBzdXBwb3J0ZWROYW1lTGVuZ3RoKVxuICAgICAgICA6IGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lO1xuXG4gICAgLy8gUmVtb3ZlIGFueSB0cmFpbGluZyBoeXBoZW5zIHRoYXQgbWlnaHQgYmUgaW50cm9kdWNlZCBieSB0cnVuY2F0aW9uXG4gICAgdHJ1bmNhdGVkTG9hZEJhbGFuY2VyTmFtZSA9IHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUucmVwbGFjZSgvLSskLywgXCJcIik7XG5cbiAgICB0aGlzLmxvYWRCYWxhbmNlciA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgIGludGVybmV0RmFjaW5nOiB0cnVlLFxuICAgICAgICBsb2FkQmFsYW5jZXJOYW1lOiB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlckRuc05hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyRG5zTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5sb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZVxuICAgIH0pO1xuXG4gICAgLy8gRXhwb3J0IGxvYWQgYmFsYW5jZXIgVVJMIGZvciBtb25pdG9yaW5nXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLCB7XG4gICAgICBrZXk6IFwiTG9hZEJhbGFuY2VyVXJsXCIsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1Mb2FkQmFsYW5jZXJVcmxgLFxuICAgICAgdmFsdWU6IGBodHRwOi8vJHt0aGlzLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogYExvYWQgQmFsYW5jZXIgVVJMIGZvciAke3Byb3BzLmNsdXN0ZXJOYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIGFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKHRoaXMuY2VydGlmaWNhdGUpIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIgPSB0aGlzLmxvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcbiAgICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9TGlzdGVuZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydDogcHJvcHMucHJvdG9jb2wgPT0gUHJvdG9jb2wuSFRUUCA/IDgwIDogNDQzLFxuICAgICAgICAgIGNlcnRpZmljYXRlczogW3RoaXMuY2VydGlmaWNhdGVdXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIgPSB0aGlzLmxvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcbiAgICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9TGlzdGVuZXJgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydDogcHJvcHMucHJvdG9jb2wgPT0gUHJvdG9jb2wuSFRUUCA/IDgwIDogNDQzXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYWRkSG9zdGVkWm9uZShwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcykge1xuICAgIGlmICghcHJvcHMuZG9tYWluQ29uZmlnKSByZXR1cm47XG5cbiAgICBpZiAoIXByb3BzLmRvbWFpbkNvbmZpZy5ob3N0ZWRab25lKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaG9zdGVkIHpvbmUgaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IG5ldyBGamFsbEhvc3RlZFpvbmUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUhvc3RlZFpvbmVgLFxuICAgICAgICB7XG4gICAgICAgICAgem9uZU5hbWU6IHByb3BzLmRvbWFpbkNvbmZpZy5kb21haW5OYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaG9zdGVkWm9uZSA9IGhvc3RlZFpvbmUuZ2V0SW50ZXJuYWxIb3N0ZWRab25lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZSB1c2UgdGhlIHByb3ZpZGVkIGhvc3RlZCB6b25lXG4gICAgICB0aGlzLmhvc3RlZFpvbmUgPSBwcm9wcy5kb21haW5Db25maWcuaG9zdGVkWm9uZS5nZXRJbnRlcm5hbEhvc3RlZFpvbmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmRvbWFpbkNvbmZpZy5jZXJ0aWZpY2F0ZSkge1xuICAgICAgLy8gSWYgbm8gY2VydGlmaWNhdGUgaXMgcHJvdmlkZWQgLSBjcmVhdGUgYSBuZXcgb25lXG4gICAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1DZXJ0aWZpY2F0ZWAsXG4gICAgICAgIHtcbiAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5Db25maWcuZG9tYWluTmFtZSxcbiAgICAgICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG11bHRpLXJlZ2lvbi93ZWlnaHRlZC9nZW8gcm91dGluZyBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgbGF0ZW5jeUNvbmZpZyA9IHByb3BzLmRvbWFpbkNvbmZpZyBhcyBMYXRlbmN5RG9tYWluQ29uZmlnO1xuICAgIGNvbnN0IHdlaWdodGVkQ29uZmlnID0gcHJvcHMuZG9tYWluQ29uZmlnIGFzIFdlaWdodGVkRG9tYWluQ29uZmlnO1xuICAgIGNvbnN0IGdlb0NvbmZpZyA9IHByb3BzLmRvbWFpbkNvbmZpZyBhcyBHZW9Mb2NhdGlvbkRvbWFpbkNvbmZpZztcblxuICAgIGNvbnN0IGhhc1JvdXRpbmdQb2xpY3k6IGJvb2xlYW4gPVxuICAgICAgISFsYXRlbmN5Q29uZmlnPy5yZWdpb24gfHxcbiAgICAgIHdlaWdodGVkQ29uZmlnPy53ZWlnaHQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgISFnZW9Db25maWc/Lmdlb0xvY2F0aW9uO1xuXG4gICAgLy8gR2VuZXJhdGUgc2V0SWRlbnRpZmllciBpZiBub3QgcHJvdmlkZWQgYW5kIHVzaW5nIHJvdXRpbmcgcG9saWNpZXNcbiAgICAvLyBBV1MgcmVxdWlyZXMgc2V0SWRlbnRpZmllciBmb3IgYWxsIHJvdXRpbmcgcG9saWNpZXMgKGxhdGVuY3ksIHdlaWdodGVkLCBnZW8sIGZhaWxvdmVyLCBtdWx0aXZhbHVlKVxuICAgIGxldCBzZXRJZGVudGlmaWVyID0gcHJvcHMuZG9tYWluQ29uZmlnLnNldElkZW50aWZpZXI7XG4gICAgaWYgKGhhc1JvdXRpbmdQb2xpY3kgJiYgIXNldElkZW50aWZpZXIpIHtcbiAgICAgIGlmIChsYXRlbmN5Q29uZmlnPy5yZWdpb24pIHtcbiAgICAgICAgc2V0SWRlbnRpZmllciA9IGAke3Byb3BzLnNlcnZpY2VOYW1lfS0ke2xhdGVuY3lDb25maWcucmVnaW9ufWA7XG4gICAgICB9IGVsc2UgaWYgKHdlaWdodGVkQ29uZmlnPy53ZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRJZGVudGlmaWVyID0gYCR7cHJvcHMuc2VydmljZU5hbWV9LXdlaWdodC0ke3dlaWdodGVkQ29uZmlnLndlaWdodH1gO1xuICAgICAgfSBlbHNlIGlmIChnZW9Db25maWc/Lmdlb0xvY2F0aW9uKSB7XG4gICAgICAgIHNldElkZW50aWZpZXIgPSBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0tZ2VvYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgY3JlYXRlIGEgbmV3IEFSZWNvcmQgZm9yIHRoaXMgZG9tYWluIGFuZCBhdHRhY2ggaXQgdG8gdGhlIGxvYWQgYmFsYW5jZXJcbiAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0uJHtwcm9wcy5jbHVzdGVyTmFtZX0uJHtwcm9wcy5kb21haW5Db25maWcuZG9tYWluTmFtZX1BUmVjb3JkYCxcbiAgICAgIHtcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluQ29uZmlnLmRvbWFpbk5hbWUsXG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBMb2FkQmFsYW5jZXJUYXJnZXQodGhpcy5sb2FkQmFsYW5jZXIsIHtcbiAgICAgICAgICAgIGV2YWx1YXRlVGFyZ2V0SGVhbHRoOiBoYXNSb3V0aW5nUG9saWN5XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgcmVnaW9uOiBsYXRlbmN5Q29uZmlnPy5yZWdpb24sXG4gICAgICAgIHdlaWdodDogd2VpZ2h0ZWRDb25maWc/LndlaWdodCxcbiAgICAgICAgZ2VvTG9jYXRpb246IGdlb0NvbmZpZz8uZ2VvTG9jYXRpb24sXG4gICAgICAgIC8vIFNldCBpZGVudGlmaWVyIGlzIHJlcXVpcmVkIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvLCBmYWlsb3ZlciwgbXVsdGl2YWx1ZSlcbiAgICAgICAgc2V0SWRlbnRpZmllcjogc2V0SWRlbnRpZmllclxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRJbWFnZShwcm9wczogRmFyZ2F0ZUNsdXN0ZXJQcm9wcyk6IENvbnRhaW5lckltYWdlIHtcbiAgICBpZiAoIXByb3BzLmVjclJlcG9zaXRvcnkpXG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIpO1xuICAgIGlmIChwcm9wcy5lY3JSZXBvc2l0b3J5IGluc3RhbmNlb2YgQ29udGFpbmVySW1hZ2UpXG4gICAgICByZXR1cm4gcHJvcHMuZWNyUmVwb3NpdG9yeTtcbiAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShwcm9wcy5lY3JSZXBvc2l0b3J5LCBcImxhdGVzdFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBGYXJnYXRlQ2x1c3RlclByb3BzXG4gICk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IEZhcmdhdGVDbHVzdGVyUHJvcHMgPSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiAoc2IuZ2V0TmV0d29yaygpIGFzIElWcGMpIHx8IHByb3BzLnZwY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,11 +1,11 @@
1
- import { ContainerImage, RepositoryImage } from "aws-cdk-lib/aws-ecs";
2
- import { Connections, IConnectable, IVpc } from "aws-cdk-lib/aws-ec2";
1
+ import { ContainerImage, type RepositoryImage } from "aws-cdk-lib/aws-ecs";
2
+ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
3
3
  import { Construct } from "constructs";
4
- import { StackBuilder } from "../base/awsStack";
5
- import { SecretValue } from "aws-cdk-lib";
6
- import { IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
4
+ import { type StackBuilder } from "../base/awsStack";
5
+ import { type SecretValue } from "aws-cdk-lib";
6
+ import { type IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
7
7
  import { Repository } from "aws-cdk-lib/aws-ecr";
8
- import { KeyValue } from "../../../types";
8
+ import { type KeyValue } from "../../../types";
9
9
  export declare enum ScalingType {
10
10
  CPU = "ECSServiceAverageCPUUtilization",
11
11
  MEMORY = "ECSServiceAverageMemoryUtilization"
@@ -22,7 +22,6 @@ type Ec2ClusterProps = {
22
22
  containerSecrets?: ContainerSecret;
23
23
  containerPort?: number;
24
24
  cpu?: number;
25
- databaseConnection?: IConnectable;
26
25
  parentDomain?: string;
27
26
  desiredCount?: number;
28
27
  healthCheckPath?: string;
@@ -39,10 +39,13 @@ class Ec2Cluster extends constructs_1.Construct {
39
39
  this.removeAutoScalingGroup();
40
40
  this.addLoadBalancerListener(props);
41
41
  this.registerLoadBalancerTargets(props);
42
- if (!!props.parentDomain)
42
+ if (props.parentDomain)
43
43
  this.addHostedZone(props);
44
- // Set connections to allow the Compute pattern to manage them uniformly
45
- this.connections = this.asgSecurityGroup.connections;
44
+ const containerPort = props.containerPort || 80;
45
+ this.connections = new aws_ec2_1.Connections({
46
+ securityGroups: [this.asgSecurityGroup],
47
+ defaultPort: aws_ec2_1.Port.tcp(containerPort)
48
+ });
46
49
  }
47
50
  addCluster(props) {
48
51
  this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
@@ -56,10 +59,6 @@ class Ec2Cluster extends constructs_1.Construct {
56
59
  vpc: this.cluster.vpc,
57
60
  description: `Security group for the ${props.clusterName} auto scaling group`
58
61
  });
59
- // Allows the asgSecurityGroup to talk to the Database on port 5432
60
- if (props.databaseConnection) {
61
- this.asgSecurityGroup.connections.allowTo(props.databaseConnection, aws_ec2_1.Port.POSTGRES);
62
- }
63
62
  this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
64
63
  autoScalingGroupName: `${props.clusterName}AutoScalingGroup`,
65
64
  vpc: this.cluster.vpc,
@@ -216,11 +215,19 @@ class Ec2Cluster extends constructs_1.Construct {
216
215
  // this.asgSecurityGroup,
217
216
  // Port.allTcp()
218
217
  // );
218
+ // Truncate the load balancer name to ensure it does not exceed the 32 character AWS limit
219
+ const defaultLoadBalancerName = `${props.serviceName}LoadBalancer`;
220
+ const supportedNameLength = 32;
221
+ let truncatedLoadBalancerName = defaultLoadBalancerName.length > supportedNameLength
222
+ ? defaultLoadBalancerName.substring(0, supportedNameLength)
223
+ : defaultLoadBalancerName;
224
+ // Remove any trailing hyphens that might be introduced by truncation
225
+ truncatedLoadBalancerName = truncatedLoadBalancerName.replace(/-+$/, "");
219
226
  this.loadBalancer = new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(this, `${props.clusterName}LoadBalancer`, {
220
227
  vpc: this.cluster.vpc,
221
228
  internetFacing: true,
222
229
  securityGroup: this.loadBalancerSecurityGroup,
223
- loadBalancerName: `${props.serviceName}LoadBalancer`,
230
+ loadBalancerName: truncatedLoadBalancerName,
224
231
  vpcSubnets: {
225
232
  subnetType: aws_ec2_1.SubnetType.PUBLIC
226
233
  }
@@ -263,7 +270,7 @@ class Ec2Cluster extends constructs_1.Construct {
263
270
  // }
264
271
  addLoadBalancerListener(props) {
265
272
  let addListenerProps = {};
266
- if (!!props.parentDomain) {
273
+ if (props.parentDomain) {
267
274
  this.certificate = new aws_certificatemanager_1.Certificate(this, `${props.serviceName}Certificate`, {
268
275
  domainName: `${props.serviceName}.${props.clusterName}.${props.parentDomain}`,
269
276
  validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone)
@@ -342,4 +349,4 @@ class Ec2Cluster extends constructs_1.Construct {
342
349
  }
343
350
  }
344
351
  exports.default = Ec2Cluster;
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzRnJlZVRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc0ZyZWVUaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQWM2QjtBQUM3QixpREFPNkI7QUFDN0IsMkNBQXVDO0FBRXZDLDZDQUF3RDtBQUN4RCx1RkFLZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELCtFQUc0QztBQUM1Qyx5REFLaUM7QUFDakMseUVBQXFFO0FBQ3JFLGlEQUFpRDtBQUNqRCxpRUFBMkU7QUFFM0Usd0RBQXFEO0FBQ3JELHNFQUFtRTtBQUNuRSxtRUFBa0U7QUFDbEUsc0RBQW1EO0FBR25ELElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixzREFBMEQsQ0FBQTtJQUMxRCw0REFBZ0UsQ0FBQTtBQUNsRSxDQUFDLEVBSFcsV0FBVywyQkFBWCxXQUFXLFFBR3RCO0FBZ0NELE1BQXFCLFVBQVcsU0FBUSxzQkFBUztJQXVCL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsWUFBTyxHQUVYLEVBQUUsQ0FBQztRQUtMLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxL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QUssQ0FBQyxhQUFhLFlBQVksd0JBQWM7WUFDL0MsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzdCLElBQUksS0FBSyxDQUFDLGFBQWEsWUFBWSxvQkFBVSxFQUFFLENBQUM7WUFDOUMsT0FBTyx3QkFBYyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE9BQU8sd0JBQWMsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FDVixFQUFVLEVBQ1YsS0FBc0I7UUFFdEIsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBRTtZQUMxQixNQUFNLFFBQVEsR0FBb0I7Z0JBQ2hDLEdBQUcsS0FBSztnQkFDUixHQUFHO29CQUNELEdBQUcsRUFBRyxFQUFFLENBQUMsVUFBVSxFQUFXLElBQUksS0FBSyxDQUFDLEdBQUc7aUJBQzVDO2FBQ0YsQ0FBQztZQUNGLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEzYkQsNkJBMmJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzTG9nRHJpdmVyLFxuICBDbHVzdGVyIGFzIENka0NsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBFYzJTZXJ2aWNlLFxuICBFYzJUYXNrRGVmaW5pdGlvbixcbiAgTGlzdGVuZXJDb25maWcsXG4gIFJlcG9zaXRvcnlJbWFnZSxcbiAgQ29udGFpbmVyRGVmaW5pdGlvbixcbiAgUGxhY2VtZW50U3RyYXRlZ3ksXG4gIEFzZ0NhcGFjaXR5UHJvdmlkZXIsXG4gIEVjc09wdGltaXplZEltYWdlLFxuICBBbWlIYXJkd2FyZVR5cGUsXG4gIENvbnRhaW5lckluc2lnaHRzXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgSUNvbm5lY3RhYmxlLFxuICBJbnN0YW5jZVR5cGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBTZWNyZXRWYWx1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25MaXN0ZW5lcixcbiAgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gIEFwcGxpY2F0aW9uUHJvdG9jb2wsXG4gIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQge1xuICBDb21wb3NpdGVQcmluY2lwYWwsXG4gIEVmZmVjdCxcbiAgSU1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIFByZWRlZmluZWRNZXRyaWMsXG4gIFNjYWxhYmxlVGFyZ2V0LFxuICBTZXJ2aWNlTmFtZXNwYWNlLFxuICBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcHBsaWNhdGlvbmF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBTZWNyZXQgYXMgRWNzU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFSZWNvcmQsXG4gIEhvc3RlZFpvbmUsXG4gIFJlY29yZFRhcmdldCxcbiAgSUhvc3RlZFpvbmVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQgeyBMb2FkQmFsYW5jZXJUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQgeyBBdXRvU2NhbGluZ0dyb3VwLCBNb25pdG9yaW5nIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtL3NlY3VyaXR5R3JvdXBcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHsgUGh5c2ljYWxSZXNvdXJjZUlkIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5pbXBvcnQgdGFnUmVzb3VyY2UgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RhZ1Jlc291cmNlXCI7XG5cbmV4cG9ydCBlbnVtIFNjYWxpbmdUeXBlIHtcbiAgQ1BVID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTixcbiAgTUVNT1JZID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclNlY3JldCB7XG4gIFtrZXk6IHN0cmluZ106IFNlY3JldFZhbHVlO1xufVxuXG50eXBlIEVjMkNsdXN0ZXJQcm9wcyA9IHtcbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZSB8IHN0cmluZztcbiAgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgY29udGFpbmVyRW50cnlQb2ludD86IHN0cmluZ1tdO1xuICBjb250YWluZXJDb21tYW5kPzogc3RyaW5nW107XG4gIGNvbnRhaW5lckVudmlyb25tZW50PzogS2V5VmFsdWU7XG4gIGNvbnRhaW5lclNlY3JldHM/OiBDb250YWluZXJTZWNyZXQ7XG4gIC8vIFRPRE86IENvbnRhaW5lciBQb3J0IHNob3VsZCBiZSBzZXQgaW4gcmF3UHJvcHNcbiAgY29udGFpbmVyUG9ydD86IG51bWJlcjtcbiAgY3B1PzogbnVtYmVyO1xuICBkYXRhYmFzZUNvbm5lY3Rpb24/OiBJQ29ubmVjdGFibGU7XG4gIHBhcmVudERvbWFpbj86IHN0cmluZzsgLy8gVE9ETzogQnJlYWsgb3V0IGEgSFRUUCBhbmQgSFRUUFMgc2VydmljZSB3aGVyZSB0aGlzIGlzIG9wdGlvbmFsXG4gIGRlc2lyZWRDb3VudD86IG51bWJlcjtcbiAgaGVhbHRoQ2hlY2tQYXRoPzogc3RyaW5nO1xuICBsaXN0ZW5lclBvcnQ/OiBudW1iZXI7XG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuICBwdWJsaWNMb2FkQmFsYW5jZXI/OiBib29sZWFuO1xuICBzY2FsaW5nVHlwZT86IFNjYWxpbmdUeXBlO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuICB2cGM/OiBJVnBjO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWMyQ2x1c3RlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBjbHVzdGVyOiBDZGtDbHVzdGVyO1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA6IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUgYXNnU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSBhc2dDYXBhY2l0eVByb3ZpZGVyOiBBc2dDYXBhY2l0eVByb3ZpZGVyO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlcjogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogQXBwbGljYXRpb25MaXN0ZW5lcjtcbiAgcHJpdmF0ZSBleGVjdXRpb25Sb2xlOiBSb2xlO1xuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uOiBFYzJUYXNrRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBjb250YWluZXJEZWZpbml0aW9uOiBDb250YWluZXJEZWZpbml0aW9uO1xuICBwcml2YXRlIGVjMlNlcnZpY2U6IEVjMlNlcnZpY2U7XG4gIHByaXZhdGUgc2NhbGluZ1BvbGljeTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5O1xuICBwcml2YXRlIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBwcml2YXRlIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZTtcbiAgcHJpdmF0ZSBhUmVjb3JkOiBBUmVjb3JkO1xuXG4gIHByaXZhdGUgc2VjcmV0czoge1xuICAgIFtrZXk6IHN0cmluZ106IEVjc1NlY3JldDtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hZGRDbHVzdGVyKHByb3BzKTtcbiAgICB0aGlzLmFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHMpO1xuICAgIHRoaXMuYWRkU2VjcmV0cyhwcm9wcyk7XG4gICAgdGhpcy5hZGRFeGVjdXRpb25Sb2xlKHByb3BzKTtcbiAgICB0aGlzLmFkZFRhc2tEZWZpbml0aW9uKHByb3BzKTtcbiAgICB0aGlzLmFkZENvbnRhaW5lckRlZmluaXRpb24ocHJvcHMpO1xuICAgIHRoaXMuYWRkRWMyU2VydmljZShwcm9wcyk7XG4gICAgdGhpcy5hZGRMb2FkQmFsYW5jZXIocHJvcHMpO1xuICAgIHRoaXMucmVtb3ZlQXV0b1NjYWxpbmdHcm91cCgpO1xuICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJMb2FkQmFsYW5jZXJUYXJnZXRzKHByb3BzKTtcblxuICAgIGlmICghIXByb3BzLnBhcmVudERvbWFpbikgdGhpcy5hZGRIb3N0ZWRab25lKHByb3BzKTtcblxuICAgIC8vIFNldCBjb25uZWN0aW9ucyB0byBhbGxvdyB0aGUgQ29tcHV0ZSBwYXR0ZXJuIHRvIG1hbmFnZSB0aGVtIHVuaWZvcm1seVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAuY29ubmVjdGlvbnM7XG4gIH1cblxuICBhZGRDbHVzdGVyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgQ2RrQ2x1c3Rlcih0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1gLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSxcbiAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRURcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIGBBc2dTZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgdGhlICR7cHJvcHMuY2x1c3Rlck5hbWV9IGF1dG8gc2NhbGluZyBncm91cGBcbiAgICB9KTtcblxuICAgIC8vIEFsbG93cyB0aGUgYXNnU2VjdXJpdHlHcm91cCB0byB0YWxrIHRvIHRoZSBEYXRhYmFzZSBvbiBwb3J0IDU0MzJcbiAgICBpZiAocHJvcHMuZGF0YWJhc2VDb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAuY29ubmVjdGlvbnMuYWxsb3dUbyhcbiAgICAgICAgcHJvcHMuZGF0YWJhc2VDb25uZWN0aW9uLFxuICAgICAgICBQb3J0LlBPU1RHUkVTXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKHRoaXMsIFwiQXV0b1NjYWxpbmdHcm91cFwiLCB7XG4gICAgICBhdXRvU2NhbGluZ0dyb3VwTmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cGAsXG4gICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgbWluQ2FwYWNpdHk6IDEsXG4gICAgICBtYXhDYXBhY2l0eTogMSxcbiAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShcInQzLm1pY3JvXCIpLFxuICAgICAgY2FwYWNpdHlSZWJhbGFuY2U6IHRydWUsXG4gICAgICBpbnN0YW5jZU1vbml0b3Jpbmc6IE1vbml0b3JpbmcuQkFTSUMsXG4gICAgICBtYWNoaW5lSW1hZ2U6IEVjc09wdGltaXplZEltYWdlLmFtYXpvbkxpbnV4MihBbWlIYXJkd2FyZVR5cGUuU1RBTkRBUkQpXG4gICAgfSk7XG5cbiAgICB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXIgPSBuZXcgQXNnQ2FwYWNpdHlQcm92aWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBcIkFzZ0NhcGFjaXR5UHJvdmlkZXJcIixcbiAgICAgIHtcbiAgICAgICAgYXV0b1NjYWxpbmdHcm91cDogdGhpcy5hdXRvU2NhbGluZ0dyb3VwXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuY2x1c3Rlci5hZGRBc2dDYXBhY2l0eVByb3ZpZGVyKHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlcik7XG4gIH1cblxuICBhZGRTZWNyZXRzKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBDb250YWluZXIgU2VjcmV0c1xuICAgIGNvbnN0IGNvbnRhaW5lclNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfVNlY3JldGAsXG4gICAgICBgLyR7cHJvcHMuY2x1c3Rlck5hbWV9LyR7cHJvcHMuc2VydmljZU5hbWV9YFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHNlY3JldEZpZWxkIGluIHByb3BzLmNvbnRhaW5lclNlY3JldHMpIHtcbiAgICAgIHRoaXMuc2VjcmV0c1tzZWNyZXRGaWVsZF0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICBjb250YWluZXJTZWNyZXQsXG4gICAgICAgIHNlY3JldEZpZWxkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEV4ZWN1dGlvblJvbGUocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGVgLCB7XG4gICAgICByb2xlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZWAsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuc2VydmljZU5hbWV9IEV4ZWN1dGlvbiBSb2xlYCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWFuYWdlZFBvbGljeUFybjpcbiAgICAgICAgICAgIFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5XCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFtcInJlYWRTZWNyZXRzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwic2VjcmV0c21hbmFnZXI6RGVzY3JpYmVTZWNyZXRcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIHNlY3JldCBBUk5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZGVjcnlwdFNlY3JldHNcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIEtNUyBBcm5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZWNzRXhlY3V0ZUNvbW1hbmRcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWxcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICAgIClcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFRhc2tEZWZpbml0aW9uKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IEVjMlRhc2tEZWZpbml0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgLy8gaXBjTW9kZTogSXBjTW9kZS5IT1NULCBUT0RPOiBGaWd1cmUgb3V0IGlmIHdlIHdhbnQgdGhpcyB0byBhbGxvdyBlYXN5IGludGVyLWNvbnRhaW5lciBjb21tdW5pY2F0aW9uXG4gICAgICAgIGV4ZWN1dGlvblJvbGU6IHRoaXMuZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGU6IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tSb2xlYCwge1xuICAgICAgICAgIHJvbGVOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrUm9sZWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3Byb3BzLnNlcnZpY2VOYW1lfSBUYXNrIFJvbGVgLFxuICAgICAgICAgIGlubGluZVBvbGljaWVzOiBwcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgIG1hbmFnZWRQb2xpY2llczogcHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkQ29udGFpbmVyRGVmaW5pdGlvbihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5jb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Db250YWluZXJEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0SW1hZ2UocHJvcHMpLFxuICAgICAgICBtZW1vcnlMaW1pdE1pQjogNDAwLFxuICAgICAgICBjb250YWluZXJOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAuLi5wcm9wcy5jb250YWluZXJFbnZpcm9ubWVudFxuICAgICAgICB9LFxuICAgICAgICBlbnRyeVBvaW50OiBwcm9wcy5jb250YWluZXJFbnRyeVBvaW50IHx8IFtcIm5vZGVcIiwgXCJtYWluLmpzXCJdLFxuICAgICAgICBjb21tYW5kOiBwcm9wcy5jb250YWluZXJDb21tYW5kIHx8IFtgJHtwcm9wcy5jb250YWluZXJQb3J0fWBdLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgLi4udGhpcy5zZWNyZXRzXG4gICAgICAgIH0sXG4gICAgICAgIC8vdG9kbzogcHJvdmlkZSBoZWFsdGggY2hlY2sgb3B0aW9uc1xuICAgICAgICAvLyBoZWFsdGhDaGVjazoge1xuICAgICAgICAvLyAgIGNvbW1hbmQ6IFtcbiAgICAgICAgLy8gICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgIC8vICAgICBgdGltZW91dCAxMHMgL2Jpbi9zaCAtYyAnOj4gL2Rldi90Y3AvMTI3LjAuMC4xLyR7cHJvcHMuY29udGFpbmVyUG9ydH0nIHx8IGV4aXQgMWBcbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgIHN0cmVhbVByZWZpeDogYC9lY3MvJHtwcm9wcy5jbHVzdGVyTmFtZX0vJHtwcm9wcy5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgfSksXG4gICAgICAgIHBvcnRNYXBwaW5nczogcHJvcHMuY29udGFpbmVyUG9ydFxuICAgICAgICAgID8gW3sgY29udGFpbmVyUG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCwgaG9zdFBvcnQ6IDAgfV1cbiAgICAgICAgICA6IFt7IGNvbnRhaW5lclBvcnQ6IDgwLCBob3N0UG9ydDogMCB9XVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhZGRFYzJTZXJ2aWNlKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmVjMlNlcnZpY2UgPSBuZXcgRWMyU2VydmljZSh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1FYzJTZXJ2aWNlYCwge1xuICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgcm9sbGJhY2s6IHRydWUgfSxcbiAgICAgIGNsdXN0ZXI6IHRoaXMuY2x1c3RlcixcbiAgICAgIGRlc2lyZWRDb3VudDogMSxcbiAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICBzZXJ2aWNlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgIHRhc2tEZWZpbml0aW9uOiB0aGlzLnRhc2tEZWZpbml0aW9uLFxuICAgICAgcGxhY2VtZW50U3RyYXRlZ2llczogW1BsYWNlbWVudFN0cmF0ZWd5LnNwcmVhZEFjcm9zc0luc3RhbmNlcygpXVxuICAgIH0pO1xuICB9XG5cbiAgYWRkU2NhbGluZ1BvbGljeShwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5zY2FsaW5nUG9saWN5ID0gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgcG9saWN5TmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICAgIHNjYWxpbmdUYXJnZXQ6IG5ldyBTY2FsYWJsZVRhcmdldChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfXNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhDYXBhY2l0eTogMSxcbiAgICAgICAgICAgIG1pbkNhcGFjaXR5OiAxLFxuICAgICAgICAgICAgcmVzb3VyY2VJZDogYHNlcnZpY2UvJHt0aGlzLmNsdXN0ZXIuY2x1c3Rlck5hbWV9LyR7dGhpcy5lYzJTZXJ2aWNlLnNlcnZpY2VOYW1lfWAsXG4gICAgICAgICAgICBzY2FsYWJsZURpbWVuc2lvbjogXCJlY3M6c2VydmljZTpEZXNpcmVkQ291bnRcIixcbiAgICAgICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IFNlcnZpY2VOYW1lc3BhY2UuRUNTXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICB0YXJnZXRWYWx1ZTogNTAsXG4gICAgICAgIHNjYWxlT3V0Q29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBzY2FsZUluQ29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBwcmVkZWZpbmVkTWV0cmljOlxuICAgICAgICAgIHByb3BzLnNjYWxpbmdUeXBlID09IFNjYWxpbmdUeXBlLk1FTU9SWVxuICAgICAgICAgICAgPyBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfTUVNT1JZX1VUSUxJWkFUSU9OXG4gICAgICAgICAgICA6IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT05cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkTG9hZEJhbGFuY2VyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgTG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cGAsXG4gICAgICB7XG4gICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgdGhlICR7cHJvcHMuY2x1c3Rlck5hbWV9IGxvYWQgYmFsYW5jZXJgXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC5hbGxUY3AoKVxuICAgICk7XG5cbiAgICAvLyB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuYWRkRWdyZXNzUnVsZShcbiAgICAvLyAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAvLyAgIFBvcnQuYWxsVGNwKClcbiAgICAvLyApO1xuXG4gICAgdGhpcy5sb2FkQmFsYW5jZXIgPSBuZXcgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICBsb2FkQmFsYW5jZXJOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Mb2FkQmFsYW5jZXJgLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBbGxvdyBjb25uZWN0aW9ucyB0byBlcGhlbWVyYWwgcG9ydHNcbiAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAuY29ubmVjdGlvbnMuYWxsb3dGcm9tKFxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3BSYW5nZSg0OTE1MiwgNjU1MzUpXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUF1dG9TY2FsaW5nR3JvdXAoKSB7XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiZGVsZXRlQXV0b3NjYWxpbmdHcm91cFwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IFwiZGVsZXRlQXV0b3NjYWxpbmdHcm91cFwiLFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJBdXRvU2NhbGluZ1wiLFxuICAgICAgICBhY3Rpb246IFwiRGVsZXRlQXV0b1NjYWxpbmdHcm91cENvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEF1dG9TY2FsaW5nR3JvdXBOYW1lOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgRm9yY2VEZWxldGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXCJkZWxldGVBdXRvc2NhbGluZ0dyb3VwXCIpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gIC8vICAgaWYgKCEhdGhpcy5jZXJ0aWZpY2F0ZSkge1xuICAvLyAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAvLyAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1MaXN0ZW5lcmAsXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICBwb3J0OiBwcm9wcy5wcm90b2NvbCA9PSBQcm90b2NvbC5IVFRQID8gODAgOiA0NDMsXG4gIC8vICAgICAgICAgY2VydGlmaWNhdGVzOiBbdGhpcy5jZXJ0aWZpY2F0ZV1cbiAgLy8gICAgICAgfVxuICAvLyAgICAgKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAvLyAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1MaXN0ZW5lcmAsXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICBwb3J0OiBwcm9wcy5wcm90b2NvbCA9PSBQcm90b2NvbC5IVFRQID8gODAgOiA0NDNcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKTtcbiAgLy8gICB9XG5cbiAgLy8gICB0YWdSZXNvdXJjZSh0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyLCBwcm9wcy50YWdzKTtcbiAgLy8gfVxuXG4gIGFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICBsZXQgYWRkTGlzdGVuZXJQcm9wczogQmFzZUFwcGxpY2F0aW9uTGlzdGVuZXJQcm9wcyA9IHt9O1xuXG4gICAgaWYgKCEhcHJvcHMucGFyZW50RG9tYWluKSB7XG4gICAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1DZXJ0aWZpY2F0ZWAsXG4gICAgICAgIHtcbiAgICAgICAgICBkb21haW5OYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0uJHtwcm9wcy5jbHVzdGVyTmFtZX0uJHtwcm9wcy5wYXJlbnREb21haW59YCxcbiAgICAgICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGFkZExpc3RlbmVyUHJvcHMgPSB7XG4gICAgICAgIHBvcnQ6IDQ0MyxcbiAgICAgICAgY2VydGlmaWNhdGVzOiBbdGhpcy5jZXJ0aWZpY2F0ZV1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZExpc3RlbmVyUHJvcHMgPSB7XG4gICAgICAgIHBvcnQ6IDgwXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIgPSB0aGlzLmxvYWRCYWxhbmNlci5hZGRMaXN0ZW5lcihcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUxpc3RlbmVyYCxcbiAgICAgIGFkZExpc3RlbmVyUHJvcHNcbiAgICApO1xuICB9XG5cbiAgYWRkSG9zdGVkWm9uZShwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy5wYXJlbnREb21haW4pIHJldHVybjtcblxuICAgIHRoaXMuaG9zdGVkWm9uZSA9IEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsIFwiaG9zdGVkWm9uZVwiLCB7XG4gICAgICBob3N0ZWRab25lSWQ6IEZuLmltcG9ydFZhbHVlKFxuICAgICAgICBgJHtwcm9wcy5wYXJlbnREb21haW4uc3BsaXQoXCIuXCIpLmpvaW4oXCJcIil9SG9zdGVkWm9uZUlkYFxuICAgICAgKSxcbiAgICAgIHpvbmVOYW1lOiBwcm9wcy5wYXJlbnREb21haW5cbiAgICB9KTtcblxuICAgIHRoaXMuYVJlY29yZCA9IG5ldyBBUmVjb3JkKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfS4ke3Byb3BzLmNsdXN0ZXJOYW1lfS4ke3Byb3BzLnBhcmVudERvbWFpbn1BUmVjb3JkYCxcbiAgICAgIHtcbiAgICAgICAgcmVjb3JkTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9LiR7cHJvcHMuY2x1c3Rlck5hbWV9LiR7cHJvcHMucGFyZW50RG9tYWlufWAsXG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBMb2FkQmFsYW5jZXJUYXJnZXQodGhpcy5sb2FkQmFsYW5jZXIpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1BUmVjb3JkYCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1BUmVjb3JkYCxcbiAgICAgIHZhbHVlOiB0aGlzLmFSZWNvcmQuZG9tYWluTmFtZSxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUFSZWNvcmRgXG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZWMyU2VydmljZS5yZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMoe1xuICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5jb250YWluZXJEZWZpbml0aW9uLmNvbnRhaW5lck5hbWUsXG4gICAgICBjb250YWluZXJQb3J0OiB0aGlzLmNvbnRhaW5lckRlZmluaXRpb24uY29udGFpbmVyUG9ydCxcbiAgICAgIG5ld1RhcmdldEdyb3VwSWQ6IGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhcmdldEdyb3VwYCxcbiAgICAgIGxpc3RlbmVyOiBMaXN0ZW5lckNvbmZpZy5hcHBsaWNhdGlvbkxpc3RlbmVyKHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIsIHtcbiAgICAgICAgcG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IEFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICAgICAgaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICAgIHVuaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICAgIHBhdGg6IHByb3BzLmhlYWx0aENoZWNrUGF0aCB8fCBcIi9cIixcbiAgICAgICAgICBwb3J0OiBcInRyYWZmaWMtcG9ydFwiLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBnZXRJbWFnZShwcm9wczogRWMyQ2x1c3RlclByb3BzKTogQ29udGFpbmVySW1hZ2Uge1xuICAgIGlmICghcHJvcHMuZWNyUmVwb3NpdG9yeSlcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5lY3JSZXBvc2l0b3J5ID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KFxuICAgICAgICBSZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5TmFtZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIFwiZWNyUmVwb3NpdG9yeVwiLFxuICAgICAgICAgIHByb3BzLmVjclJlcG9zaXRvcnlcbiAgICAgICAgKSxcbiAgICAgICAgXCJsYXRlc3RcIlxuICAgICAgKTtcbiAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIENvbnRhaW5lckltYWdlKVxuICAgICAgcmV0dXJuIHByb3BzLmVjclJlcG9zaXRvcnk7XG4gICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkocHJvcHMuZWNyUmVwb3NpdG9yeSwgXCJsYXRlc3RcIik7XG4gICAgfVxuICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIik7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogRWMyQ2x1c3RlclByb3BzXG4gICk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IEVjMkNsdXN0ZXJQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgSVZwYykgfHwgcHJvcHMudnBjXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IHRoaXMoc2IuZ2V0U3RhY2soKSwgaWQsIG5ld1Byb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzRnJlZVRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc0ZyZWVUaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQWM2QjtBQUM3QixpREFPNkI7QUFDN0IsMkNBQXVDO0FBRXZDLDZDQUE2RDtBQUM3RCx1RkFLZ0Q7QUFDaEQsaURBUTZCO0FBQzdCLHVGQUtnRDtBQUNoRCxpREFBMEQ7QUFDMUQsdUVBQXdEO0FBQ3hELCtFQUc0QztBQUM1Qyx5REFLaUM7QUFDakMseUVBQXFFO0FBQ3JFLGlEQUFpRDtBQUNqRCxpRUFBMkU7QUFFM0Usd0RBQXFEO0FBQ3JELHNFQUFtRTtBQUNuRSxtRUFBa0U7QUFDbEUsc0RBQW1EO0FBR25ELElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixzREFBMEQsQ0FBQTtJQUMxRCw0REFBZ0UsQ0FBQTtBQUNsRSxDQUFDLEVBSFcsV0FBVywyQkFBWCxXQUFXLFFBR3RCO0FBK0JELE1BQXFCLFVBQVcsU0FBUSxzQkFBUztJQXVCL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsWUFBTyxHQUVYLEVBQUUsQ0FBQztRQUtMLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxL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QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDdEIsT0FBTyx3QkFBYyxDQUFDLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2pFLElBQUksT0FBTyxLQUFLLENBQUMsYUFBYSxLQUFLLFFBQVE7WUFDekMsT0FBTyx3QkFBYyxDQUFDLGlCQUFpQixDQUNyQyxvQkFBVSxDQUFDLGtCQUFrQixDQUMzQixJQUFJLEVBQ0osZUFBZSxFQUNmLEtBQUssQ0FBQyxhQUFhLENBQ3BCLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFDSixJQUFJLEtBQUssQ0FBQyxhQUFhLFlBQVksd0JBQWM7WUFDL0MsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzdCLElBQUksS0FBSyxDQUFDLGFBQWEsWUFBWSxvQkFBVSxFQUFFLENBQUM7WUFDOUMsT0FBTyx3QkFBYyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE9BQU8sd0JBQWMsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FDVixFQUFVLEVBQ1YsS0FBc0I7UUFFdEIsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBRTtZQUMxQixNQUFNLFFBQVEsR0FBb0I7Z0JBQ2hDLEdBQUcsS0FBSztnQkFDUixHQUFHO29CQUNELEdBQUcsRUFBRyxFQUFFLENBQUMsVUFBVSxFQUFXLElBQUksS0FBSyxDQUFDLEdBQUc7aUJBQzVDO2FBQ0YsQ0FBQztZQUNGLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsY0QsNkJBa2NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzTG9nRHJpdmVyLFxuICBDbHVzdGVyIGFzIENka0NsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBFYzJTZXJ2aWNlLFxuICBFYzJUYXNrRGVmaW5pdGlvbixcbiAgTGlzdGVuZXJDb25maWcsXG4gIHR5cGUgUmVwb3NpdG9yeUltYWdlLFxuICB0eXBlIENvbnRhaW5lckRlZmluaXRpb24sXG4gIFBsYWNlbWVudFN0cmF0ZWd5LFxuICBBc2dDYXBhY2l0eVByb3ZpZGVyLFxuICBFY3NPcHRpbWl6ZWRJbWFnZSxcbiAgQW1pSGFyZHdhcmVUeXBlLFxuICBDb250YWluZXJJbnNpZ2h0c1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICBJbnN0YW5jZVR5cGUsXG4gIHR5cGUgSVZwYyxcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IER1cmF0aW9uLCBGbiwgdHlwZSBTZWNyZXRWYWx1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyLFxuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgQXBwbGljYXRpb25Qcm90b2NvbCxcbiAgdHlwZSBCYXNlQXBwbGljYXRpb25MaXN0ZW5lclByb3BzXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlUHJpbmNpcGFsLFxuICBFZmZlY3QsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIFByZWRlZmluZWRNZXRyaWMsXG4gIFNjYWxhYmxlVGFyZ2V0LFxuICBTZXJ2aWNlTmFtZXNwYWNlLFxuICBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcHBsaWNhdGlvbmF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBTZWNyZXQgYXMgRWNzU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFSZWNvcmQsXG4gIEhvc3RlZFpvbmUsXG4gIFJlY29yZFRhcmdldCxcbiAgdHlwZSBJSG9zdGVkWm9uZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IExvYWRCYWxhbmNlclRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXAsIE1vbml0b3JpbmcgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyB0eXBlIEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbS9zZWN1cml0eUdyb3VwXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IFBoeXNpY2FsUmVzb3VyY2VJZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2Nmbk91dHB1dFwiO1xuaW1wb3J0IHRhZ1Jlc291cmNlIGZyb20gXCIuLi8uLi8uLi91dGlscy90YWdSZXNvdXJjZVwiO1xuXG5leHBvcnQgZW51bSBTY2FsaW5nVHlwZSB7XG4gIENQVSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT04sXG4gIE1FTU9SWSA9IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9NRU1PUllfVVRJTElaQVRJT05cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJTZWNyZXQge1xuICBba2V5OiBzdHJpbmddOiBTZWNyZXRWYWx1ZTtcbn1cblxudHlwZSBFYzJDbHVzdGVyUHJvcHMgPSB7XG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2UgfCBzdHJpbmc7XG4gIGNsdXN0ZXJOYW1lOiBzdHJpbmc7XG4gIGNvbnRhaW5lckVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgY29udGFpbmVyQ29tbWFuZD86IHN0cmluZ1tdO1xuICBjb250YWluZXJFbnZpcm9ubWVudD86IEtleVZhbHVlO1xuICBjb250YWluZXJTZWNyZXRzPzogQ29udGFpbmVyU2VjcmV0O1xuICAvLyBUT0RPOiBDb250YWluZXIgUG9ydCBzaG91bGQgYmUgc2V0IGluIHJhd1Byb3BzXG4gIGNvbnRhaW5lclBvcnQ/OiBudW1iZXI7XG4gIGNwdT86IG51bWJlcjtcbiAgcGFyZW50RG9tYWluPzogc3RyaW5nOyAvLyBUT0RPOiBCcmVhayBvdXQgYSBIVFRQIGFuZCBIVFRQUyBzZXJ2aWNlIHdoZXJlIHRoaXMgaXMgb3B0aW9uYWxcbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG4gIGxpc3RlbmVyUG9ydD86IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gIHB1YmxpY0xvYWRCYWxhbmNlcj86IGJvb2xlYW47XG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHRhc2tSb2xlSW5saW5lUG9saWNpZXM/OiB7XG4gICAgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50O1xuICB9O1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG4gIHZwYz86IElWcGM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFYzJDbHVzdGVyIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGNsdXN0ZXI6IENka0NsdXN0ZXI7XG4gIHByaXZhdGUgYXV0b1NjYWxpbmdHcm91cDogQXV0b1NjYWxpbmdHcm91cDtcbiAgcHJpdmF0ZSBhc2dTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGFzZ0NhcGFjaXR5UHJvdmlkZXI6IEFzZ0NhcGFjaXR5UHJvdmlkZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcjtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlckxpc3RlbmVyOiBBcHBsaWNhdGlvbkxpc3RlbmVyO1xuICBwcml2YXRlIGV4ZWN1dGlvblJvbGU6IFJvbGU7XG4gIHByaXZhdGUgdGFza0RlZmluaXRpb246IEVjMlRhc2tEZWZpbml0aW9uO1xuICBwcml2YXRlIGNvbnRhaW5lckRlZmluaXRpb246IENvbnRhaW5lckRlZmluaXRpb247XG4gIHByaXZhdGUgZWMyU2VydmljZTogRWMyU2VydmljZTtcbiAgcHJpdmF0ZSBzY2FsaW5nUG9saWN5OiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG4gIHByaXZhdGUgaG9zdGVkWm9uZTogSUhvc3RlZFpvbmU7XG4gIHByaXZhdGUgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlO1xuICBwcml2YXRlIGFSZWNvcmQ6IEFSZWNvcmQ7XG5cbiAgcHJpdmF0ZSBzZWNyZXRzOiB7XG4gICAgW2tleTogc3RyaW5nXTogRWNzU2VjcmV0O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFkZENsdXN0ZXIocHJvcHMpO1xuICAgIHRoaXMuYWRkQXV0b1NjYWxpbmdHcm91cChwcm9wcyk7XG4gICAgdGhpcy5hZGRTZWNyZXRzKHByb3BzKTtcbiAgICB0aGlzLmFkZEV4ZWN1dGlvblJvbGUocHJvcHMpO1xuICAgIHRoaXMuYWRkVGFza0RlZmluaXRpb24ocHJvcHMpO1xuICAgIHRoaXMuYWRkQ29udGFpbmVyRGVmaW5pdGlvbihwcm9wcyk7XG4gICAgdGhpcy5hZGRFYzJTZXJ2aWNlKHByb3BzKTtcbiAgICB0aGlzLmFkZExvYWRCYWxhbmNlcihwcm9wcyk7XG4gICAgdGhpcy5yZW1vdmVBdXRvU2NhbGluZ0dyb3VwKCk7XG4gICAgdGhpcy5hZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlckxvYWRCYWxhbmNlclRhcmdldHMocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnBhcmVudERvbWFpbikgdGhpcy5hZGRIb3N0ZWRab25lKHByb3BzKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPSBwcm9wcy5jb250YWluZXJQb3J0IHx8IDgwO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLmFzZ1NlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKGNvbnRhaW5lclBvcnQpXG4gICAgfSk7XG4gIH1cblxuICBhZGRDbHVzdGVyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgQ2RrQ2x1c3Rlcih0aGlzLCBgJHtwcm9wcy5jbHVzdGVyTmFtZX1gLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSxcbiAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRURcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIGBBc2dTZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgdGhlICR7cHJvcHMuY2x1c3Rlck5hbWV9IGF1dG8gc2NhbGluZyBncm91cGBcbiAgICB9KTtcblxuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKHRoaXMsIFwiQXV0b1NjYWxpbmdHcm91cFwiLCB7XG4gICAgICBhdXRvU2NhbGluZ0dyb3VwTmFtZTogYCR7cHJvcHMuY2x1c3Rlck5hbWV9QXV0b1NjYWxpbmdHcm91cGAsXG4gICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgbWluQ2FwYWNpdHk6IDEsXG4gICAgICBtYXhDYXBhY2l0eTogMSxcbiAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShcInQzLm1pY3JvXCIpLFxuICAgICAgY2FwYWNpdHlSZWJhbGFuY2U6IHRydWUsXG4gICAgICBpbnN0YW5jZU1vbml0b3Jpbmc6IE1vbml0b3JpbmcuQkFTSUMsXG4gICAgICBtYWNoaW5lSW1hZ2U6IEVjc09wdGltaXplZEltYWdlLmFtYXpvbkxpbnV4MihBbWlIYXJkd2FyZVR5cGUuU1RBTkRBUkQpXG4gICAgfSk7XG5cbiAgICB0aGlzLmFzZ0NhcGFjaXR5UHJvdmlkZXIgPSBuZXcgQXNnQ2FwYWNpdHlQcm92aWRlcihcbiAgICAgIHRoaXMsXG4gICAgICBcIkFzZ0NhcGFjaXR5UHJvdmlkZXJcIixcbiAgICAgIHtcbiAgICAgICAgYXV0b1NjYWxpbmdHcm91cDogdGhpcy5hdXRvU2NhbGluZ0dyb3VwXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuY2x1c3Rlci5hZGRBc2dDYXBhY2l0eVByb3ZpZGVyKHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlcik7XG4gIH1cblxuICBhZGRTZWNyZXRzKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBDb250YWluZXIgU2VjcmV0c1xuICAgIGNvbnN0IGNvbnRhaW5lclNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfVNlY3JldGAsXG4gICAgICBgLyR7cHJvcHMuY2x1c3Rlck5hbWV9LyR7cHJvcHMuc2VydmljZU5hbWV9YFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHNlY3JldEZpZWxkIGluIHByb3BzLmNvbnRhaW5lclNlY3JldHMpIHtcbiAgICAgIHRoaXMuc2VjcmV0c1tzZWNyZXRGaWVsZF0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICBjb250YWluZXJTZWNyZXQsXG4gICAgICAgIHNlY3JldEZpZWxkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEV4ZWN1dGlvblJvbGUocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGVgLCB7XG4gICAgICByb2xlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZWAsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuc2VydmljZU5hbWV9IEV4ZWN1dGlvbiBSb2xlYCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWFuYWdlZFBvbGljeUFybjpcbiAgICAgICAgICAgIFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5XCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFtcInJlYWRTZWNyZXRzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwic2VjcmV0c21hbmFnZXI6RGVzY3JpYmVTZWNyZXRcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIHNlY3JldCBBUk5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZGVjcnlwdFNlY3JldHNcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIEtNUyBBcm5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZWNzRXhlY3V0ZUNvbW1hbmRcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWxcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICAgIClcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFRhc2tEZWZpbml0aW9uKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IEVjMlRhc2tEZWZpbml0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgLy8gaXBjTW9kZTogSXBjTW9kZS5IT1NULCBUT0RPOiBGaWd1cmUgb3V0IGlmIHdlIHdhbnQgdGhpcyB0byBhbGxvdyBlYXN5IGludGVyLWNvbnRhaW5lciBjb21tdW5pY2F0aW9uXG4gICAgICAgIGV4ZWN1dGlvblJvbGU6IHRoaXMuZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGU6IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tSb2xlYCwge1xuICAgICAgICAgIHJvbGVOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrUm9sZWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3Byb3BzLnNlcnZpY2VOYW1lfSBUYXNrIFJvbGVgLFxuICAgICAgICAgIGlubGluZVBvbGljaWVzOiBwcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgIG1hbmFnZWRQb2xpY2llczogcHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkQ29udGFpbmVyRGVmaW5pdGlvbihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5jb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Db250YWluZXJEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0SW1hZ2UocHJvcHMpLFxuICAgICAgICBtZW1vcnlMaW1pdE1pQjogNDAwLFxuICAgICAgICBjb250YWluZXJOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAuLi5wcm9wcy5jb250YWluZXJFbnZpcm9ubWVudFxuICAgICAgICB9LFxuICAgICAgICBlbnRyeVBvaW50OiBwcm9wcy5jb250YWluZXJFbnRyeVBvaW50IHx8IFtcIm5vZGVcIiwgXCJtYWluLmpzXCJdLFxuICAgICAgICBjb21tYW5kOiBwcm9wcy5jb250YWluZXJDb21tYW5kIHx8IFtgJHtwcm9wcy5jb250YWluZXJQb3J0fWBdLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgLi4udGhpcy5zZWNyZXRzXG4gICAgICAgIH0sXG4gICAgICAgIC8vdG9kbzogcHJvdmlkZSBoZWFsdGggY2hlY2sgb3B0aW9uc1xuICAgICAgICAvLyBoZWFsdGhDaGVjazoge1xuICAgICAgICAvLyAgIGNvbW1hbmQ6IFtcbiAgICAgICAgLy8gICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgIC8vICAgICBgdGltZW91dCAxMHMgL2Jpbi9zaCAtYyAnOj4gL2Rldi90Y3AvMTI3LjAuMC4xLyR7cHJvcHMuY29udGFpbmVyUG9ydH0nIHx8IGV4aXQgMWBcbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgIHN0cmVhbVByZWZpeDogYC9lY3MvJHtwcm9wcy5jbHVzdGVyTmFtZX0vJHtwcm9wcy5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgfSksXG4gICAgICAgIHBvcnRNYXBwaW5nczogcHJvcHMuY29udGFpbmVyUG9ydFxuICAgICAgICAgID8gW3sgY29udGFpbmVyUG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCwgaG9zdFBvcnQ6IDAgfV1cbiAgICAgICAgICA6IFt7IGNvbnRhaW5lclBvcnQ6IDgwLCBob3N0UG9ydDogMCB9XVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhZGRFYzJTZXJ2aWNlKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmVjMlNlcnZpY2UgPSBuZXcgRWMyU2VydmljZSh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1FYzJTZXJ2aWNlYCwge1xuICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgcm9sbGJhY2s6IHRydWUgfSxcbiAgICAgIGNsdXN0ZXI6IHRoaXMuY2x1c3RlcixcbiAgICAgIGRlc2lyZWRDb3VudDogMSxcbiAgICAgIGVuYWJsZUVDU01hbmFnZWRUYWdzOiB0cnVlLFxuICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICBzZXJ2aWNlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgIHRhc2tEZWZpbml0aW9uOiB0aGlzLnRhc2tEZWZpbml0aW9uLFxuICAgICAgcGxhY2VtZW50U3RyYXRlZ2llczogW1BsYWNlbWVudFN0cmF0ZWd5LnNwcmVhZEFjcm9zc0luc3RhbmNlcygpXVxuICAgIH0pO1xuICB9XG5cbiAgYWRkU2NhbGluZ1BvbGljeShwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5zY2FsaW5nUG9saWN5ID0gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1TY2FsaW5nUG9saWN5YCxcbiAgICAgIHtcbiAgICAgICAgcG9saWN5TmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICAgIHNjYWxpbmdUYXJnZXQ6IG5ldyBTY2FsYWJsZVRhcmdldChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfXNjYWxhYmxlVGFyZ2V0YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhDYXBhY2l0eTogMSxcbiAgICAgICAgICAgIG1pbkNhcGFjaXR5OiAxLFxuICAgICAgICAgICAgcmVzb3VyY2VJZDogYHNlcnZpY2UvJHt0aGlzLmNsdXN0ZXIuY2x1c3Rlck5hbWV9LyR7dGhpcy5lYzJTZXJ2aWNlLnNlcnZpY2VOYW1lfWAsXG4gICAgICAgICAgICBzY2FsYWJsZURpbWVuc2lvbjogXCJlY3M6c2VydmljZTpEZXNpcmVkQ291bnRcIixcbiAgICAgICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IFNlcnZpY2VOYW1lc3BhY2UuRUNTXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICB0YXJnZXRWYWx1ZTogNTAsXG4gICAgICAgIHNjYWxlT3V0Q29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBzY2FsZUluQ29vbGRvd246IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBwcmVkZWZpbmVkTWV0cmljOlxuICAgICAgICAgIHByb3BzLnNjYWxpbmdUeXBlID09IFNjYWxpbmdUeXBlLk1FTU9SWVxuICAgICAgICAgICAgPyBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfTUVNT1JZX1VUSUxJWkFUSU9OXG4gICAgICAgICAgICA6IFByZWRlZmluZWRNZXRyaWMuRUNTX1NFUlZJQ0VfQVZFUkFHRV9DUFVfVVRJTElaQVRJT05cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWRkTG9hZEJhbGFuY2VyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgTG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cGAsXG4gICAgICB7XG4gICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgdGhlICR7cHJvcHMuY2x1c3Rlck5hbWV9IGxvYWQgYmFsYW5jZXJgXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC5hbGxUY3AoKVxuICAgICk7XG5cbiAgICAvLyB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuYWRkRWdyZXNzUnVsZShcbiAgICAvLyAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAvLyAgIFBvcnQuYWxsVGNwKClcbiAgICAvLyApO1xuXG4gICAgLy8gVHJ1bmNhdGUgdGhlIGxvYWQgYmFsYW5jZXIgbmFtZSB0byBlbnN1cmUgaXQgZG9lcyBub3QgZXhjZWVkIHRoZSAzMiBjaGFyYWN0ZXIgQVdTIGxpbWl0XG4gICAgY29uc3QgZGVmYXVsdExvYWRCYWxhbmNlck5hbWUgPSBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Mb2FkQmFsYW5jZXJgO1xuICAgIGNvbnN0IHN1cHBvcnRlZE5hbWVMZW5ndGggPSAzMjtcblxuICAgIGxldCB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lID1cbiAgICAgIGRlZmF1bHRMb2FkQmFsYW5jZXJOYW1lLmxlbmd0aCA+IHN1cHBvcnRlZE5hbWVMZW5ndGhcbiAgICAgICAgPyBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZS5zdWJzdHJpbmcoMCwgc3VwcG9ydGVkTmFtZUxlbmd0aClcbiAgICAgICAgOiBkZWZhdWx0TG9hZEJhbGFuY2VyTmFtZTtcblxuICAgIC8vIFJlbW92ZSBhbnkgdHJhaWxpbmcgaHlwaGVucyB0aGF0IG1pZ2h0IGJlIGludHJvZHVjZWQgYnkgdHJ1bmNhdGlvblxuICAgIHRydW5jYXRlZExvYWRCYWxhbmNlck5hbWUgPSB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLnJlcGxhY2UoLy0rJC8sIFwiXCIpO1xuXG4gICAgdGhpcy5sb2FkQmFsYW5jZXIgPSBuZXcgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuY2x1c3Rlck5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLmNsdXN0ZXIudnBjLFxuICAgICAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgICBsb2FkQmFsYW5jZXJOYW1lOiB0cnVuY2F0ZWRMb2FkQmFsYW5jZXJOYW1lLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBbGxvdyBjb25uZWN0aW9ucyB0byBlcGhlbWVyYWwgcG9ydHNcbiAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAuY29ubmVjdGlvbnMuYWxsb3dGcm9tKFxuICAgICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3BSYW5nZSg0OTE1MiwgNjU1MzUpXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUF1dG9TY2FsaW5nR3JvdXAoKSB7XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiZGVsZXRlQXV0b3NjYWxpbmdHcm91cFwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IFwiZGVsZXRlQXV0b3NjYWxpbmdHcm91cFwiLFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJBdXRvU2NhbGluZ1wiLFxuICAgICAgICBhY3Rpb246IFwiRGVsZXRlQXV0b1NjYWxpbmdHcm91cENvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEF1dG9TY2FsaW5nR3JvdXBOYW1lOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgRm9yY2VEZWxldGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXCJkZWxldGVBdXRvc2NhbGluZ0dyb3VwXCIpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGRMb2FkQmFsYW5jZXJMaXN0ZW5lcihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gIC8vICAgaWYgKCEhdGhpcy5jZXJ0aWZpY2F0ZSkge1xuICAvLyAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAvLyAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1MaXN0ZW5lcmAsXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICBwb3J0OiBwcm9wcy5wcm90b2NvbCA9PSBQcm90b2NvbC5IVFRQID8gODAgOiA0NDMsXG4gIC8vICAgICAgICAgY2VydGlmaWNhdGVzOiBbdGhpcy5jZXJ0aWZpY2F0ZV1cbiAgLy8gICAgICAgfVxuICAvLyAgICAgKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAvLyAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1MaXN0ZW5lcmAsXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICBwb3J0OiBwcm9wcy5wcm90b2NvbCA9PSBQcm90b2NvbC5IVFRQID8gODAgOiA0NDNcbiAgLy8gICAgICAgfVxuICAvLyAgICAgKTtcbiAgLy8gICB9XG5cbiAgLy8gICB0YWdSZXNvdXJjZSh0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyLCBwcm9wcy50YWdzKTtcbiAgLy8gfVxuXG4gIGFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICBsZXQgYWRkTGlzdGVuZXJQcm9wczogQmFzZUFwcGxpY2F0aW9uTGlzdGVuZXJQcm9wcyA9IHt9O1xuXG4gICAgaWYgKHByb3BzLnBhcmVudERvbWFpbikge1xuICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9Q2VydGlmaWNhdGVgLFxuICAgICAgICB7XG4gICAgICAgICAgZG9tYWluTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9LiR7cHJvcHMuY2x1c3Rlck5hbWV9LiR7cHJvcHMucGFyZW50RG9tYWlufWAsXG4gICAgICAgICAgdmFsaWRhdGlvbjogQ2VydGlmaWNhdGVWYWxpZGF0aW9uLmZyb21EbnModGhpcy5ob3N0ZWRab25lKVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBhZGRMaXN0ZW5lclByb3BzID0ge1xuICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgIGNlcnRpZmljYXRlczogW3RoaXMuY2VydGlmaWNhdGVdXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRMaXN0ZW5lclByb3BzID0ge1xuICAgICAgICBwb3J0OiA4MFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1MaXN0ZW5lcmAsXG4gICAgICBhZGRMaXN0ZW5lclByb3BzXG4gICAgKTtcbiAgfVxuXG4gIGFkZEhvc3RlZFpvbmUocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIGlmICghcHJvcHMucGFyZW50RG9tYWluKSByZXR1cm47XG5cbiAgICB0aGlzLmhvc3RlZFpvbmUgPSBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBcImhvc3RlZFpvbmVcIiwge1xuICAgICAgaG9zdGVkWm9uZUlkOiBGbi5pbXBvcnRWYWx1ZShcbiAgICAgICAgYCR7cHJvcHMucGFyZW50RG9tYWluLnNwbGl0KFwiLlwiKS5qb2luKFwiXCIpfUhvc3RlZFpvbmVJZGBcbiAgICAgICksXG4gICAgICB6b25lTmFtZTogcHJvcHMucGFyZW50RG9tYWluXG4gICAgfSk7XG5cbiAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0uJHtwcm9wcy5jbHVzdGVyTmFtZX0uJHtwcm9wcy5wYXJlbnREb21haW59QVJlY29yZGAsXG4gICAgICB7XG4gICAgICAgIHJlY29yZE5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfS4ke3Byb3BzLmNsdXN0ZXJOYW1lfS4ke3Byb3BzLnBhcmVudERvbWFpbn1gLFxuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICBuZXcgTG9hZEJhbGFuY2VyVGFyZ2V0KHRoaXMubG9hZEJhbGFuY2VyKVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuc2VydmljZU5hbWV9QVJlY29yZGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuc2VydmljZU5hbWV9QVJlY29yZGAsXG4gICAgICB2YWx1ZTogdGhpcy5hUmVjb3JkLmRvbWFpbk5hbWUsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1BUmVjb3JkYFxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJMb2FkQmFsYW5jZXJUYXJnZXRzKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLmVjMlNlcnZpY2UucmVnaXN0ZXJMb2FkQmFsYW5jZXJUYXJnZXRzKHtcbiAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuY29udGFpbmVyRGVmaW5pdGlvbi5jb250YWluZXJOYW1lLFxuICAgICAgY29udGFpbmVyUG9ydDogdGhpcy5jb250YWluZXJEZWZpbml0aW9uLmNvbnRhaW5lclBvcnQsXG4gICAgICBuZXdUYXJnZXRHcm91cElkOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXJnZXRHcm91cGAsXG4gICAgICBsaXN0ZW5lcjogTGlzdGVuZXJDb25maWcuYXBwbGljYXRpb25MaXN0ZW5lcih0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyLCB7XG4gICAgICAgIHBvcnQ6IHByb3BzLmNvbnRhaW5lclBvcnQsXG4gICAgICAgIHByb3RvY29sOiBBcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgICAgaW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgICB1bmhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgICBwYXRoOiBwcm9wcy5oZWFsdGhDaGVja1BhdGggfHwgXCIvXCIsXG4gICAgICAgICAgcG9ydDogXCJ0cmFmZmljLXBvcnRcIixcbiAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDE1KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0SW1hZ2UocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcyk6IENvbnRhaW5lckltYWdlIHtcbiAgICBpZiAoIXByb3BzLmVjclJlcG9zaXRvcnkpXG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZWNyUmVwb3NpdG9yeSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShcbiAgICAgICAgUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcImVjclJlcG9zaXRvcnlcIixcbiAgICAgICAgICBwcm9wcy5lY3JSZXBvc2l0b3J5XG4gICAgICAgICksXG4gICAgICAgIFwibGF0ZXN0XCJcbiAgICAgICk7XG4gICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBDb250YWluZXJJbWFnZSlcbiAgICAgIHJldHVybiBwcm9wcy5lY3JSZXBvc2l0b3J5O1xuICAgIGlmIChwcm9wcy5lY3JSZXBvc2l0b3J5IGluc3RhbmNlb2YgUmVwb3NpdG9yeSkge1xuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KHByb3BzLmVjclJlcG9zaXRvcnksIFwibGF0ZXN0XCIpO1xuICAgIH1cbiAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEVjMkNsdXN0ZXJQcm9wc1xuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBFYzJDbHVzdGVyUHJvcHMgPSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiAoc2IuZ2V0TmV0d29yaygpIGFzIElWcGMpIHx8IHByb3BzLnZwY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,11 +1,11 @@
1
- import { ContainerImage, RepositoryImage } from "aws-cdk-lib/aws-ecs";
2
- import { Connections, IConnectable, IVpc } from "aws-cdk-lib/aws-ec2";
1
+ import { ContainerImage, type RepositoryImage } from "aws-cdk-lib/aws-ecs";
2
+ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
3
3
  import { Construct } from "constructs";
4
- import { StackBuilder } from "../base/awsStack";
5
- import { SecretValue } from "aws-cdk-lib";
6
- import { IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
4
+ import { type StackBuilder } from "../base/awsStack";
5
+ import { type SecretValue } from "aws-cdk-lib";
6
+ import { type IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
7
7
  import { Repository } from "aws-cdk-lib/aws-ecr";
8
- import { KeyValue } from "../../../types";
8
+ import { type KeyValue } from "../../../types";
9
9
  export declare enum ScalingType {
10
10
  CPU = "ECSServiceAverageCPUUtilization",
11
11
  MEMORY = "ECSServiceAverageMemoryUtilization"
@@ -22,7 +22,6 @@ type Ec2ClusterProps = {
22
22
  containerSecrets?: ContainerSecret;
23
23
  containerPort?: number;
24
24
  cpu?: number;
25
- databaseConnection?: IConnectable;
26
25
  parentDomain?: string;
27
26
  desiredCount?: number;
28
27
  healthCheckPath?: string;