@fjall/components-infrastructure 0.86.0 → 0.87.3

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 (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +3 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
@@ -1,13 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Compute = exports.ComputeFactory = exports.HttpMethod = exports.ECS_CAPACITY_PROVIDER_CONFIG = exports.COMPUTE_TYPE_CONFIG = void 0;
3
+ exports.isEc2Compute = exports.isLambdaCompute = exports.isEcsCompute = exports.isCompute = exports.Ec2Compute = exports.LambdaCompute = exports.EcsCompute = exports.ComputeFactory = exports.InvokeMode = exports.HttpMethod = exports.Architecture = exports.COMPUTE_DEFAULTS = exports.ECS_CAPACITY_PROVIDER_CONFIG = exports.COMPUTE_TYPE_CONFIG = exports.ScalingType = void 0;
4
4
  exports.getComputeTypeConfig = getComputeTypeConfig;
5
5
  exports.getEcsCapacityProviderConfig = getEcsCapacityProviderConfig;
6
+ exports.buildContainerConfigs = buildContainerConfigs;
7
+ exports.resolveScalingConfig = resolveScalingConfig;
8
+ exports.resolveLambdaDeployment = resolveLambdaDeployment;
6
9
  const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
7
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
8
10
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
11
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
9
12
  const constructs_1 = require("constructs");
13
+ // Import type-safe interfaces
14
+ const compute_js_1 = require("./interfaces/compute.js");
15
+ Object.defineProperty(exports, "isCompute", { enumerable: true, get: function () { return compute_js_1.isCompute; } });
16
+ Object.defineProperty(exports, "isEcsCompute", { enumerable: true, get: function () { return compute_js_1.isEcsCompute; } });
17
+ Object.defineProperty(exports, "isLambdaCompute", { enumerable: true, get: function () { return compute_js_1.isLambdaCompute; } });
18
+ Object.defineProperty(exports, "isEc2Compute", { enumerable: true, get: function () { return compute_js_1.isEc2Compute; } });
19
+ const connections_js_1 = require("./connections.js");
20
+ const validationLogger_js_1 = require("../../utils/validationLogger.js");
10
21
  const ecs_1 = require("../../resources/aws/compute/ecs");
22
+ Object.defineProperty(exports, "ScalingType", { enumerable: true, get: function () { return ecs_1.ScalingType; } });
11
23
  const ec2_1 = require("../../resources/aws/compute/ec2");
12
24
  const lambda_1 = require("../../resources/aws/compute/lambda");
13
25
  exports.COMPUTE_TYPE_CONFIG = {
@@ -44,6 +56,27 @@ exports.ECS_CAPACITY_PROVIDER_CONFIG = {
44
56
  usesEc2Instances: true
45
57
  }
46
58
  };
59
+ /**
60
+ * Default values for compute resource configuration.
61
+ * Centralised constants to ensure consistency across the codebase.
62
+ */
63
+ exports.COMPUTE_DEFAULTS = {
64
+ EC2: {
65
+ INSTANCE_TYPE: "t3.micro",
66
+ MIN_CAPACITY: 1,
67
+ MAX_CAPACITY: 1
68
+ },
69
+ ECS: {
70
+ /** AWS sample image used when no ECR repository is provided */
71
+ FALLBACK_IMAGE: "amazon/amazon-ecs-sample",
72
+ /** Default tag for ECR images */
73
+ IMAGE_TAG: "latest"
74
+ },
75
+ LAMBDA: {
76
+ HANDLER: "index.handler",
77
+ RUNTIME: aws_lambda_1.Runtime.NODEJS_18_X
78
+ }
79
+ };
47
80
  function getComputeTypeConfig(type) {
48
81
  return exports.COMPUTE_TYPE_CONFIG[type];
49
82
  }
@@ -52,65 +85,22 @@ function getEcsCapacityProviderConfig(provider) {
52
85
  }
53
86
  // Re-export Lambda types from CDK for user convenience
54
87
  var aws_lambda_2 = require("aws-cdk-lib/aws-lambda");
88
+ Object.defineProperty(exports, "Architecture", { enumerable: true, get: function () { return aws_lambda_2.Architecture; } });
55
89
  Object.defineProperty(exports, "HttpMethod", { enumerable: true, get: function () { return aws_lambda_2.HttpMethod; } });
90
+ Object.defineProperty(exports, "InvokeMode", { enumerable: true, get: function () { return aws_lambda_2.InvokeMode; } });
56
91
  /**
57
92
  * Validates compute props and logs warnings for ignored or misconfigured options.
58
93
  * These checks help catch issues when props come from dynamic sources where
59
94
  * TypeScript's compile-time checks may not apply.
60
95
  */
61
96
  function validateComputeProps(props) {
62
- const propsAny = props;
63
97
  // ECS-specific options on non-ECS compute
64
- if (props.type !== "ecs") {
65
- if ("capacityProvider" in propsAny &&
66
- propsAny.capacityProvider !== undefined) {
67
- console.warn(`[Fjall] Warning: 'capacityProvider' is ignored for ${props.type} compute. ` +
68
- "Capacity provider configuration only applies to ECS compute.");
69
- }
70
- if ("ec2Config" in propsAny && propsAny.ec2Config !== undefined) {
71
- console.warn(`[Fjall] Warning: 'ec2Config' is ignored for ${props.type} compute. ` +
72
- "EC2 capacity configuration only applies to ECS compute.");
73
- }
74
- if ("services" in propsAny && propsAny.services !== undefined) {
75
- console.warn(`[Fjall] Warning: 'services' is ignored for ${props.type} compute. ` +
76
- "Services configuration only applies to ECS compute.");
77
- }
78
- if ("cluster" in propsAny && propsAny.cluster !== undefined) {
79
- console.warn(`[Fjall] Warning: 'cluster' is ignored for ${props.type} compute. ` +
80
- "Cluster configuration only applies to ECS compute.");
81
- }
82
- }
98
+ (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["capacityProvider", "ec2Config", "services", "cluster"], "ecs", "ECS compute");
83
99
  // Lambda-specific options on non-Lambda compute
84
- if (props.type !== "lambda") {
85
- if ("functionUrl" in propsAny && propsAny.functionUrl !== undefined) {
86
- console.warn(`[Fjall] Warning: 'functionUrl' is ignored for ${props.type} compute. ` +
87
- "Function URL configuration only applies to Lambda compute.");
88
- }
89
- if ("handler" in propsAny && propsAny.handler !== undefined) {
90
- console.warn(`[Fjall] Warning: 'handler' is ignored for ${props.type} compute. ` +
91
- "Handler configuration only applies to Lambda compute.");
92
- }
93
- if ("runtime" in propsAny && propsAny.runtime !== undefined) {
94
- console.warn(`[Fjall] Warning: 'runtime' is ignored for ${props.type} compute. ` +
95
- "Runtime configuration only applies to Lambda compute.");
96
- }
97
- }
100
+ (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["functionUrl", "handler", "runtime"], "lambda", "Lambda compute");
98
101
  // EC2-specific options on non-EC2 compute
99
- if (props.type !== "ec2") {
100
- if ("ssh" in propsAny && propsAny.ssh !== undefined) {
101
- console.warn(`[Fjall] Warning: 'ssh' is ignored for ${props.type} compute. ` +
102
- "SSH configuration only applies to EC2 compute.");
103
- }
104
- if ("userData" in propsAny && propsAny.userData !== undefined) {
105
- console.warn(`[Fjall] Warning: 'userData' is ignored for ${props.type} compute. ` +
106
- "User data only applies to EC2 compute.");
107
- }
108
- if ("machineImage" in propsAny && propsAny.machineImage !== undefined) {
109
- console.warn(`[Fjall] Warning: 'machineImage' is ignored for ${props.type} compute. ` +
110
- "Machine image only applies to EC2 compute.");
111
- }
112
- }
113
- // ECS-specific validation
102
+ (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["ssh", "userData", "machineImage"], "ec2", "EC2 compute");
103
+ // ECS-specific validation - type narrowing handled by discriminated union
114
104
  if (props.type === "ecs") {
115
105
  validateEcsProps(props);
116
106
  }
@@ -165,44 +155,117 @@ function validateEcsProps(props) {
165
155
  }
166
156
  // Warn if service ec2Config is defined but capacityProvider is not EC2
167
157
  if (service.ec2Config && service.capacityProvider !== "EC2") {
168
- console.warn(`[Fjall] Warning: Service '${service.name}' has ec2Config but capacityProvider is not 'EC2'. ` +
158
+ validationLogger_js_1.FjallLogger.warn(`Service '${service.name}' has ec2Config but capacityProvider is not 'EC2'. ` +
169
159
  "The ec2Config will be ignored unless capacityProvider is set to 'EC2'.");
170
160
  }
171
161
  }
172
162
  }
173
163
  /**
174
- * Factory for creating compute resources.
164
+ * Build container configurations for an ECS service.
165
+ * Converts user-facing EcsContainerConfig to internal EcsClusterProps format.
166
+ * @internal Exported for testing only
167
+ */
168
+ function buildContainerConfigs(service) {
169
+ if (service.containers && service.containers.length > 0) {
170
+ return service.containers.map((c, index) => ({
171
+ name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
172
+ image: c.image,
173
+ port: c.port,
174
+ environment: c.environment,
175
+ secrets: c.secrets,
176
+ secretsImport: c.secretsImport,
177
+ command: c.command,
178
+ entryPoint: c.entryPoint,
179
+ essential: c.essential,
180
+ healthCheck: c.healthCheck
181
+ }));
182
+ }
183
+ // Default container (no port = worker)
184
+ return [{ name: `${service.name}Container` }];
185
+ }
186
+ /**
187
+ * Resolve scaling configuration from service props.
188
+ * Handles the three cases: explicit config, disabled (false), or default (undefined).
189
+ * @internal Exported for testing only
190
+ */
191
+ function resolveScalingConfig(scaling) {
192
+ if (scaling === false) {
193
+ return {
194
+ scalingType: undefined,
195
+ minCapacity: undefined,
196
+ maxCapacity: undefined
197
+ };
198
+ }
199
+ if (scaling === undefined) {
200
+ return {
201
+ scalingType: ecs_1.ScalingType.CPU,
202
+ minCapacity: undefined,
203
+ maxCapacity: undefined
204
+ };
205
+ }
206
+ return {
207
+ scalingType: scaling.scalingType ?? ecs_1.ScalingType.CPU,
208
+ minCapacity: scaling.minCapacity,
209
+ maxCapacity: scaling.maxCapacity
210
+ };
211
+ }
212
+ /**
213
+ * Resolve Lambda deployment configuration from props.
214
+ * Handles container vs code deployment types.
215
+ */
216
+ function resolveLambdaDeployment(props) {
217
+ if (props.deployment === "container") {
218
+ if (!(props.ecrRepository instanceof aws_ecr_1.Repository)) {
219
+ throw new Error("ecrRepository must be a Repository instance for Lambda compute type");
220
+ }
221
+ return {
222
+ code: aws_lambda_1.Code.fromEcrImage(props.ecrRepository, {
223
+ tagOrDigest: exports.COMPUTE_DEFAULTS.ECS.IMAGE_TAG
224
+ }),
225
+ handler: aws_lambda_1.Handler.FROM_IMAGE,
226
+ runtime: aws_lambda_1.Runtime.FROM_IMAGE
227
+ };
228
+ }
229
+ return {
230
+ code: props.code,
231
+ handler: props.handler || exports.COMPUTE_DEFAULTS.LAMBDA.HANDLER,
232
+ runtime: props.runtime || exports.COMPUTE_DEFAULTS.LAMBDA.RUNTIME
233
+ };
234
+ }
235
+ /**
236
+ * Factory for creating compute resources with type-safe return types.
237
+ *
238
+ * The factory uses overloads to infer the specific compute type from props,
239
+ * ensuring TypeScript provides only the relevant methods for each compute type.
175
240
  *
176
241
  * @example
177
- * // Single service cluster
178
- * app.addCompute(ComputeFactory.build("WebApp", {
242
+ * // ECS compute - returns EcsCompute with ECS-specific methods
243
+ * const ecs = app.addCompute(ComputeFactory.build("WebApp", {
179
244
  * type: "ecs",
180
245
  * cluster: { domain: "app.example.com" },
181
246
  * services: [{ name: "web", containers: [{ port: 3000 }] }]
182
247
  * }));
248
+ * ecs.getLoadBalancer(); // Available on EcsCompute
183
249
  *
184
250
  * @example
185
- * // Multi-service cluster with routing
186
- * app.addCompute(ComputeFactory.build("ApiCluster", {
187
- * type: "ecs",
188
- * cluster: { domain: "api.example.com" },
189
- * services: [
190
- * { name: "users", containers: [{ port: 3000 }], routing: { path: "/users/*" } },
191
- * { name: "orders", containers: [{ port: 3001 }], routing: { path: "/orders/*" } }
192
- * ]
251
+ * // Lambda compute - returns LambdaCompute with Lambda-specific methods
252
+ * const lambda = app.addCompute(ComputeFactory.build("Fn", {
253
+ * type: "lambda",
254
+ * deployment: "code",
255
+ * code: Code.fromAsset("./lambda")
193
256
  * }));
257
+ * lambda.getFunctionUrl(); // Available on LambdaCompute
194
258
  *
195
259
  * @example
196
- * // Worker cluster (no ALB)
197
- * app.addCompute(ComputeFactory.build("Workers", {
198
- * type: "ecs",
199
- * cluster: { loadBalancer: false },
200
- * services: [
201
- * { name: "processor", containers: [{ command: ["node", "worker.js"] }] }
202
- * ]
260
+ * // EC2 compute - returns Ec2Compute with EC2-specific methods
261
+ * const ec2 = app.addCompute(ComputeFactory.build("Instance", {
262
+ * type: "ec2",
263
+ * instanceType: "t3.micro"
203
264
  * }));
265
+ * ec2.getAutoScalingGroup(); // Available on Ec2Compute
204
266
  */
205
267
  class ComputeFactory {
268
+ // Implementation signature
206
269
  static build(id, props) {
207
270
  return (app, scope) => {
208
271
  validateComputeProps(props);
@@ -214,95 +277,102 @@ class ComputeFactory {
214
277
  },
215
278
  ...props
216
279
  };
217
- if (computeProps.type === "ecs" && !computeProps.appName) {
218
- computeProps = { ...computeProps, appName: app.getName() };
280
+ if (computeProps.type === "ecs") {
281
+ computeProps = {
282
+ ...computeProps,
283
+ appName: computeProps.appName ?? app.getName()
284
+ };
285
+ }
286
+ // Create specific compute class based on type discriminator
287
+ switch (computeProps.type) {
288
+ case "ecs": {
289
+ // Register ECS services with manifest collector for CLI discovery
290
+ const collector = app.getManifestCollector();
291
+ const clusterName = id;
292
+ const appName = computeProps.appName ?? app.getName();
293
+ for (const service of computeProps.services) {
294
+ const manifestService = {
295
+ name: service.name,
296
+ clusterName
297
+ };
298
+ // Include dockerfilePath if specified (metadata for CLI)
299
+ if (service.dockerfilePath) {
300
+ manifestService.dockerfilePath = service.dockerfilePath;
301
+ }
302
+ // Include dockerTarget if specified (metadata for CLI)
303
+ if (service.dockerTarget) {
304
+ manifestService.dockerTarget = service.dockerTarget;
305
+ }
306
+ // Find container port from first container with a port
307
+ const containerWithPort = service.containers?.find((c) => c.port !== undefined);
308
+ if (containerWithPort?.port !== undefined) {
309
+ manifestService.containerPort = containerWithPort.port;
310
+ }
311
+ // Aggregate secrets from all containers (deduplicated)
312
+ const allSecrets = new Set();
313
+ for (const container of service.containers ?? []) {
314
+ if (container.secrets) {
315
+ for (const secret of container.secrets) {
316
+ allSecrets.add(secret);
317
+ }
318
+ }
319
+ }
320
+ if (allSecrets.size > 0) {
321
+ manifestService.secrets = Array.from(allSecrets);
322
+ }
323
+ // Include ssmSecretsPath (explicit or derived)
324
+ manifestService.ssmSecretsPath =
325
+ service.ssmSecretsPath ??
326
+ `/${appName}/${clusterName}/${service.name}`;
327
+ collector.addService(manifestService);
328
+ }
329
+ return new EcsCompute(scope, id, computeProps);
330
+ }
331
+ case "lambda": {
332
+ // Add appName to props for Lambda (needed for secrets path derivation)
333
+ const lambdaComputeProps = {
334
+ ...computeProps,
335
+ appName: app.getName()
336
+ };
337
+ // Always register Lambda with manifest collector for CLI discovery
338
+ // This ensures all Lambdas are discoverable for secrets management,
339
+ // even those that don't currently have secrets configured
340
+ const collector = app.getManifestCollector();
341
+ const manifestLambda = {
342
+ name: id,
343
+ ssmSecretsPath: lambdaComputeProps.ssmSecretsPath ||
344
+ `/${lambdaComputeProps.appName}/lambda/${id}`
345
+ };
346
+ if (lambdaComputeProps.secrets &&
347
+ lambdaComputeProps.secrets.length > 0) {
348
+ manifestLambda.secrets = lambdaComputeProps.secrets;
349
+ }
350
+ collector.addLambda(manifestLambda);
351
+ return new LambdaCompute(scope, id, lambdaComputeProps);
352
+ }
353
+ case "ec2":
354
+ return new Ec2Compute(scope, id, computeProps);
355
+ default: {
356
+ const _exhaustive = computeProps;
357
+ throw new Error(`Unsupported compute type: ${String(_exhaustive.type)}`);
358
+ }
219
359
  }
220
- return new Compute(scope, id, computeProps);
221
360
  };
222
361
  }
223
362
  }
224
363
  exports.ComputeFactory = ComputeFactory;
225
- class Compute extends constructs_1.Construct {
364
+ /**
365
+ * ECS compute wrapper implementing IEcsCompute.
366
+ * Provides type-safe access to ECS-specific resources.
367
+ */
368
+ class EcsCompute extends constructs_1.Construct {
226
369
  constructor(scope, id, props) {
227
370
  super(scope, id);
228
- this.id = id;
229
- this.scope = scope;
230
- this.addCompute(props);
231
- }
232
- addCompute(props) {
233
- switch (props.type) {
234
- case "ecs":
235
- this.addEcsCompute(props);
236
- break;
237
- case "ec2":
238
- this.addEc2Compute(props);
239
- break;
240
- case "lambda":
241
- this.addLambdaCompute(props);
242
- break;
243
- default: {
244
- // Exhaustiveness check - TypeScript will error if a case is missing
245
- const _exhaustive = props;
246
- throw new Error(`Unsupported compute type: ${_exhaustive.type}`);
247
- }
248
- }
249
- }
250
- addEc2Compute(props) {
251
- const enableSSH = props.ssh !== undefined && props.ssh !== false;
252
- const ec2Props = {
253
- serviceName: `${this.id}Service`,
254
- instanceType: props.instanceType || "t3.micro",
255
- enableSSH,
256
- userData: props.userData,
257
- machineImage: props.machineImage,
258
- minCapacity: props.minCapacity || 1,
259
- maxCapacity: props.maxCapacity || 1,
260
- vpc: props.vpc
261
- };
262
- this.compute = new ec2_1.Ec2Instance(this.scope, `${this.id}Ec2`, ec2Props);
263
- this.connections = this.compute.connections;
264
- }
265
- addEcsCompute(props) {
371
+ this.computeType = "ecs";
266
372
  // Transform EcsServiceConfig[] to EcsServiceProps[] for EcsCluster
267
373
  const services = props.services.map((service) => {
268
- // Build container configurations for this service
269
- let containers;
270
- if (service.containers && service.containers.length > 0) {
271
- // Map containers, auto-generating names if not provided
272
- containers = service.containers.map((c, index) => ({
273
- name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
274
- image: c.image,
275
- port: c.port,
276
- environment: c.environment,
277
- secretsImport: c.secretsImport,
278
- ssmSecrets: c.ssmSecrets,
279
- command: c.command,
280
- entryPoint: c.entryPoint,
281
- essential: c.essential,
282
- healthCheck: c.healthCheck
283
- }));
284
- }
285
- else {
286
- // Default container (no port = worker)
287
- containers = [
288
- {
289
- name: `${service.name}Container`
290
- }
291
- ];
292
- }
293
- // Determine scaling config
294
- let scalingType;
295
- let minCapacity;
296
- let maxCapacity;
297
- if (service.scaling !== false && service.scaling !== undefined) {
298
- scalingType = service.scaling.scalingType ?? ecs_1.ScalingType.CPU;
299
- minCapacity = service.scaling.minCapacity;
300
- maxCapacity = service.scaling.maxCapacity;
301
- }
302
- else if (service.scaling === undefined) {
303
- // Default: enable scaling with CPU
304
- scalingType = ecs_1.ScalingType.CPU;
305
- }
374
+ const containers = buildContainerConfigs(service);
375
+ const { scalingType, minCapacity, maxCapacity } = resolveScalingConfig(service.scaling);
306
376
  return {
307
377
  name: service.name,
308
378
  image: service.image,
@@ -320,7 +390,6 @@ class Compute extends constructs_1.Construct {
320
390
  capacityProvider: service.capacityProvider,
321
391
  ec2Config: service.ec2Config,
322
392
  ssmSecretsPath: service.ssmSecretsPath,
323
- dockerfilePath: service.dockerfilePath,
324
393
  dockerTarget: service.dockerTarget
325
394
  };
326
395
  });
@@ -334,40 +403,75 @@ class Compute extends constructs_1.Construct {
334
403
  }
335
404
  : undefined;
336
405
  const ecsProps = {
337
- clusterName: `${this.id}Cluster`,
406
+ clusterName: `${id}Cluster`,
338
407
  appName: props.appName,
339
408
  vpc: props.vpc,
340
- ecrRepository: props.ecrRepository || "amazon/amazon-ecs-sample",
409
+ ecrRepository: props.ecrRepository || exports.COMPUTE_DEFAULTS.ECS.FALLBACK_IMAGE,
341
410
  cluster,
342
411
  services
343
412
  };
344
- this.compute = new ecs_1.default(this.scope, `${this.id}Ecs`, ecsProps);
345
- this.connections = this.compute.connections;
346
- }
347
- addLambdaCompute(props) {
348
- let code;
349
- let handler;
350
- let runtime;
351
- if (props.deployment === "container") {
352
- // Container-based Lambda using ECR
353
- if (props.ecrRepository instanceof aws_ecr_1.Repository) {
354
- code = aws_lambda_1.Code.fromEcrImage(props.ecrRepository, {
355
- tagOrDigest: "latest"
356
- });
357
- }
358
- else {
359
- throw new Error("ecrRepository must be a Repository instance for Lambda compute type");
360
- }
361
- // Container Lambda requires these special values
362
- handler = aws_lambda_1.Handler.FROM_IMAGE;
363
- runtime = aws_lambda_1.Runtime.FROM_IMAGE;
364
- }
365
- else {
366
- // Code-based Lambda - props.deployment === "code"
367
- code = props.code;
368
- handler = props.handler || "index.handler";
369
- runtime = props.runtime || aws_lambda_1.Runtime.NODEJS_18_X;
413
+ this.ecsCluster = new ecs_1.default(scope, `${id}Ecs`, ecsProps);
414
+ this.connections = this.ecsCluster.connections;
415
+ }
416
+ /** Get the ECS cluster. */
417
+ getCluster() {
418
+ return this.ecsCluster.getCluster();
419
+ }
420
+ /** Get the Application Load Balancer if one was created. */
421
+ getLoadBalancer() {
422
+ return this.ecsCluster.getLoadBalancer();
423
+ }
424
+ /** Get a specific service by name. */
425
+ getService(name) {
426
+ return this.ecsCluster.getService(name);
427
+ }
428
+ /** Get all services in the cluster. */
429
+ getAllServices() {
430
+ const servicesMap = this.ecsCluster.getServices();
431
+ return Array.from(servicesMap.values());
432
+ }
433
+ /** Get the security group for the cluster. */
434
+ getSecurityGroup() {
435
+ // Return the first security group from connections
436
+ const securityGroups = this.connections.securityGroups;
437
+ if (securityGroups.length === 0) {
438
+ throw new Error("No security groups found for ECS cluster");
370
439
  }
440
+ return securityGroups[0];
441
+ }
442
+ /**
443
+ * Get the ALB listener if this is an ECS compute with ALB.
444
+ */
445
+ getListener() {
446
+ return this.ecsCluster.getListener();
447
+ }
448
+ /**
449
+ * Get the underlying ECS cluster construct.
450
+ */
451
+ getEcsCluster() {
452
+ return this.ecsCluster;
453
+ }
454
+ /**
455
+ * Grants ecs:ExecuteCommand permission for ECS services.
456
+ */
457
+ grantExecuteCommand(grantee) {
458
+ return aws_iam_1.Grant.addToPrincipal({
459
+ grantee,
460
+ actions: ["ecs:ExecuteCommand"],
461
+ resourceArns: ["*"]
462
+ });
463
+ }
464
+ }
465
+ exports.EcsCompute = EcsCompute;
466
+ /**
467
+ * Lambda compute wrapper implementing ILambdaCompute.
468
+ * Provides type-safe access to Lambda-specific resources.
469
+ */
470
+ class LambdaCompute extends constructs_1.Construct {
471
+ constructor(scope, id, props) {
472
+ super(scope, id);
473
+ this.computeType = "lambda";
474
+ const { code, handler, runtime } = resolveLambdaDeployment(props);
371
475
  // Convert presence-based functionUrl config to legacy boolean format
372
476
  const functionUrlConfig = props.functionUrl;
373
477
  const enableFunctionUrl = functionUrlConfig !== undefined && functionUrlConfig !== false;
@@ -377,11 +481,15 @@ class Compute extends constructs_1.Construct {
377
481
  const functionUrlCors = enableFunctionUrl && typeof functionUrlConfig === "object"
378
482
  ? functionUrlConfig.cors
379
483
  : undefined;
484
+ const functionUrlInvokeMode = enableFunctionUrl && typeof functionUrlConfig === "object"
485
+ ? functionUrlConfig.invokeMode
486
+ : undefined;
380
487
  const lambdaProps = {
381
- code: code,
488
+ code,
382
489
  vpc: props.vpc,
383
490
  handler,
384
491
  runtime,
492
+ architecture: props.architecture,
385
493
  timeout: props.timeout,
386
494
  memorySize: props.memorySize,
387
495
  lambdaDescription: props.description,
@@ -390,18 +498,106 @@ class Compute extends constructs_1.Construct {
390
498
  enableFunctionUrl,
391
499
  functionUrlAuthType,
392
500
  functionUrlCors,
501
+ functionUrlInvokeMode,
393
502
  scheduleExpression: props.scheduleExpression,
394
503
  ephemeralStorageSize: props.ephemeralStorageSize,
395
- containerSecretsImport: props.containerSecretsImport, // Pass through
396
- environment: props.environment
504
+ secrets: props.secrets,
505
+ ssmSecretsPath: props.ssmSecretsPath,
506
+ secretsImport: props.secretsImport,
507
+ environment: props.environment,
508
+ appName: props.appName,
509
+ functionName: id
397
510
  };
398
- this.compute = new lambda_1.LambdaFunction(this.scope, `${this.id}Lambda`, lambdaProps);
399
- if (props.connections) {
400
- for (const conn of props.connections) {
401
- this.compute.connections.allowTo(conn, aws_ec2_1.Port.allTcp());
511
+ this.lambdaFunction = new lambda_1.LambdaFunction(scope, `${id}Lambda`, lambdaProps);
512
+ this.connections = this.lambdaFunction.connections;
513
+ // Process connections using the unified connector interface
514
+ if (props.connections && props.connections.length > 0) {
515
+ try {
516
+ (0, connections_js_1.processConnections)(props.connections, this.lambdaFunction, // IGrantable (execution role)
517
+ this.lambdaFunction // IConnectable (security group)
518
+ );
519
+ }
520
+ catch (error) {
521
+ throw new Error(`Failed to process connections for Lambda '${id}': ${error instanceof Error ? error.message : String(error)}`);
402
522
  }
403
523
  }
404
524
  }
525
+ /**
526
+ * Get a Lambda function by name.
527
+ * Since we only have one function, name is ignored.
528
+ */
529
+ getFunction(_name) {
530
+ return this.lambdaFunction;
531
+ }
532
+ /** Get all Lambda functions. */
533
+ getAllFunctions() {
534
+ return [this.lambdaFunction];
535
+ }
536
+ /**
537
+ * Get the function URL for a Lambda function.
538
+ */
539
+ getFunctionUrl(_name) {
540
+ return this.lambdaFunction.getFunctionUrl();
541
+ }
542
+ /**
543
+ * Grant invoke permissions to a grantee.
544
+ */
545
+ grantInvoke(grantee, _functionName) {
546
+ return this.lambdaFunction.grantInvoke(grantee);
547
+ }
548
+ /**
549
+ * Get the security group for VPC-enabled Lambda functions.
550
+ * Returns undefined if the Lambda is not VPC-enabled.
551
+ */
552
+ getSecurityGroup() {
553
+ const securityGroups = this.connections.securityGroups;
554
+ return securityGroups.length > 0 ? securityGroups[0] : undefined;
555
+ }
556
+ /**
557
+ * Get the underlying Lambda function construct.
558
+ */
559
+ getLambdaFunction() {
560
+ return this.lambdaFunction;
561
+ }
562
+ }
563
+ exports.LambdaCompute = LambdaCompute;
564
+ /**
565
+ * EC2 compute wrapper implementing IEc2Compute.
566
+ * Provides type-safe access to EC2-specific resources.
567
+ */
568
+ class Ec2Compute extends constructs_1.Construct {
569
+ constructor(scope, id, props) {
570
+ super(scope, id);
571
+ this.computeType = "ec2";
572
+ const enableSSH = props.ssh !== undefined && props.ssh !== false;
573
+ const ec2Props = {
574
+ serviceName: `${id}Service`,
575
+ instanceType: props.instanceType || exports.COMPUTE_DEFAULTS.EC2.INSTANCE_TYPE,
576
+ enableSSH,
577
+ userData: props.userData,
578
+ machineImage: props.machineImage,
579
+ minCapacity: props.minCapacity || exports.COMPUTE_DEFAULTS.EC2.MIN_CAPACITY,
580
+ maxCapacity: props.maxCapacity || exports.COMPUTE_DEFAULTS.EC2.MAX_CAPACITY,
581
+ vpc: props.vpc,
582
+ spotCapacityPercentage: props.spotCapacityPercentage
583
+ };
584
+ this.ec2Instance = new ec2_1.Ec2Instance(scope, `${id}Ec2`, ec2Props);
585
+ this.connections = this.ec2Instance.connections;
586
+ }
587
+ /** Get the Auto Scaling Group. */
588
+ getAutoScalingGroup() {
589
+ return this.ec2Instance.getAutoScalingGroup();
590
+ }
591
+ /** Get the security group. */
592
+ getSecurityGroup() {
593
+ return this.ec2Instance.asgSecurityGroup;
594
+ }
595
+ /**
596
+ * Get the underlying EC2 instance construct.
597
+ */
598
+ getEc2Instance() {
599
+ return this.ec2Instance;
600
+ }
405
601
  }
406
- exports.Compute = Compute;
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2R0Esb0RBRUM7QUFFRCxvRUFJQztBQXBIRCxpREFBaUQ7QUFDakQsaURBTzZCO0FBQzdCLHVEQU1nQztBQU9oQywyQ0FBdUM7QUFJdkMseURBTXlDO0FBQ3pDLHlEQUE4RDtBQUM5RCwrREFBb0U7QUF5QnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxXQUFXLEVBQUUsRUFBRTtRQUNmLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUNsRCxtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCLFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLENBQUM7UUFDZCxjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDcEQsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRCQUE0QixHQUdyQztJQUNGLE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLFFBQVEsRUFBRSxJQUFJO1FBQ2QsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELEdBQUcsRUFBRTtRQUNILFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsSUFBSTtLQUN2QjtDQUNGLENBQUM7QUFFRixTQUFnQixvQkFBb0IsQ0FBQyxJQUFpQjtJQUNwRCxPQUFPLDJCQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFnQiw0QkFBNEIsQ0FDMUMsUUFBNkI7SUFFN0IsT0FBTyxvQ0FBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELHFEQUdnQztBQUY5Qix3R0FBQSxVQUFVLE9BQUE7QUFtaEJaOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQW9CO0lBQ2hELE1BQU0sUUFBUSxHQUFHLEtBQTJDLENBQUM7SUFFN0QsMENBQTBDO0lBQzFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUNFLGtCQUFrQixJQUFJLFFBQVE7WUFDOUIsUUFBUSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFDdkMsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0RBQXNELEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQzFFLDhEQUE4RCxDQUNqRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksV0FBVyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0NBQStDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ25FLHlEQUF5RCxDQUM1RCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxJQUFJLENBQ1YsOENBQThDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ2xFLHFEQUFxRCxDQUN4RCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ2pFLG9EQUFvRCxDQUN2RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksYUFBYSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaURBQWlELEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ3JFLDREQUE0RCxDQUMvRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ2pFLHVEQUF1RCxDQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ2pFLHVEQUF1RCxDQUMxRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQ1YseUNBQXlDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQzdELGdEQUFnRCxDQUNuRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksVUFBVSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxJQUFJLENBQ1YsOENBQThDLEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ2xFLHdDQUF3QyxDQUMzQyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksY0FBYyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysa0RBQWtELEtBQUssQ0FBQyxJQUFJLFlBQVk7Z0JBQ3RFLDRDQUE0QyxDQUMvQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixDQUFDLEtBQXdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsa0RBQWtEO0lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsNkRBQTZELENBQzlELENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FDeEMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FDdEQsQ0FBQztJQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQy9DLENBQUM7SUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUN0RSx3RkFBd0YsQ0FDM0YsQ0FBQztJQUNKLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3BELENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ2xDLENBQUM7SUFFRixJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQzVDLENBQUM7UUFDRixJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDYixpRkFBaUY7Z0JBQy9FLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDbkQsNEVBQTRFLENBQy9FLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsNkVBQTZFO1lBQzdFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVO2lCQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FDbkQsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FDeEQsQ0FBQztZQUNGLElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLElBQUksS0FBSyxDQUNiLFlBQVksT0FBTyxDQUFDLElBQUksZ0NBQWdDO29CQUN0RCxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3hELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLGdCQUFnQixLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksS0FBSyxDQUNiLFlBQVksT0FBTyxDQUFDLElBQUksNERBQTREO2dCQUNsRixtQ0FBbUMsQ0FDdEMsQ0FBQztRQUNKLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUNWLDZCQUE2QixPQUFPLENBQUMsSUFBSSxxREFBcUQ7Z0JBQzVGLHdFQUF3RSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFhLGNBQWM7SUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBb0I7UUFDM0MsT0FBTyxDQUFDLEdBQVEsRUFBRSxLQUFnQixFQUFXLEVBQUU7WUFDN0Msb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUIsd0RBQXdEO1lBQ3hELElBQUksWUFBWSxHQUFrQjtnQkFDaEMsR0FBRztvQkFDRCxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRTtvQkFDakIsYUFBYSxFQUFFLEdBQUcsQ0FBQywyQkFBMkIsRUFBRTtpQkFDakQ7Z0JBQ0QsR0FBRyxLQUFLO2FBQ1QsQ0FBQztZQUVGLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pELFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM3RCxDQUFDO1lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJCRCx3Q0FxQkM7QUFFRCxNQUFhLE9BQVEsU0FBUSxzQkFBUztJQVNwQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBb0I7UUFDN0IsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxLQUFLO2dCQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU07WUFDUixLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLE1BQU07WUFDUixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLG9FQUFvRTtnQkFDcEUsTUFBTSxXQUFXLEdBQVUsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE4QixXQUE2QixDQUFDLElBQUksRUFBRSxDQUNuRSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQXNCO1FBQzFDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDO1FBRWpFLE1BQU0sUUFBUSxHQUFHO1lBQ2YsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsU0FBUztZQUNoQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxVQUFVO1lBQzlDLFNBQVM7WUFDVCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUM7WUFDbkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQztZQUNuQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7U0FDZixDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQzlDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBc0I7UUFDMUMsbUVBQW1FO1FBQ25FLE1BQU0sUUFBUSxHQUFnQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDOUQsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNWLGtEQUFrRDtZQUNsRCxJQUFJLFVBQTZELENBQUM7WUFFbEUsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCx3REFBd0Q7Z0JBQ3hELFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2pELElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksWUFBWSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDbkUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNkLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7b0JBQzFCLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtvQkFDOUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO29CQUN4QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtvQkFDeEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUN0QixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7aUJBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHVDQUF1QztnQkFDdkMsVUFBVSxHQUFHO29CQUNYO3dCQUNFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLFdBQVc7cUJBQ2pDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLElBQUksV0FBb0MsQ0FBQztZQUN6QyxJQUFJLFdBQStCLENBQUM7WUFDcEMsSUFBSSxXQUErQixDQUFDO1lBRXBDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDL0QsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLGlCQUFXLENBQUMsR0FBRyxDQUFDO2dCQUM3RCxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQzFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM1QyxDQUFDO2lCQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsbUNBQW1DO2dCQUNuQyxXQUFXLEdBQUcsaUJBQVcsQ0FBQyxHQUFHLENBQUM7WUFDaEMsQ0FBQztZQUVELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUNsQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLFVBQVU7Z0JBQ1YsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7Z0JBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsV0FBVztnQkFDWCxXQUFXO2dCQUNYLFdBQVc7Z0JBQ1gsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCO2dCQUN0RCx1QkFBdUIsRUFBRSxPQUFPLENBQUMsdUJBQXVCO2dCQUN4RCxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7Z0JBQzFDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO2dCQUN0QyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7Z0JBQ3RDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTthQUNuQyxDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7UUFFRix1QkFBdUI7UUFDdkIsTUFBTSxPQUFPLEdBQStCLEtBQUssQ0FBQyxPQUFPO1lBQ3ZELENBQUMsQ0FBQztnQkFDRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUM1QixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2dCQUN4QyxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2dCQUN4QyxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2FBQ3pDO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE1BQU0sUUFBUSxHQUFvQjtZQUNoQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxTQUFTO1lBQ2hDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSwwQkFBMEI7WUFDaEUsT0FBTztZQUNQLFFBQVE7U0FDVCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGFBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXlCO1FBQ2hELElBQUksSUFBVSxDQUFDO1FBQ2YsSUFBSSxPQUFlLENBQUM7UUFDcEIsSUFBSSxPQUFnQixDQUFDO1FBRXJCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxtQ0FBbUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsYUFBYSxZQUFZLG9CQUFVLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxHQUFHLGlCQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7b0JBQzVDLFdBQVcsRUFBRSxRQUFRO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7WUFFRCxpREFBaUQ7WUFDakQsT0FBTyxHQUFHLG9CQUFPLENBQUMsVUFBVSxDQUFDO1lBQzdCLE9BQU8sR0FBRyxvQkFBTyxDQUFDLFVBQVUsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLGtEQUFrRDtZQUNsRCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNsQixPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxlQUFlLENBQUM7WUFDM0MsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXLENBQUM7UUFDakQsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxpQkFBaUIsR0FDckIsaUJBQWlCLEtBQUssU0FBUyxJQUFJLGlCQUFpQixLQUFLLEtBQUssQ0FBQztRQUNqRSxNQUFNLG1CQUFtQixHQUN2QixpQkFBaUIsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVE7WUFDeEQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7WUFDNUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixNQUFNLGVBQWUsR0FDbkIsaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsS0FBSyxRQUFRO1lBQ3hELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFaEIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSSxFQUFFLElBQUk7WUFDVixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxPQUFPO1lBQ1AsT0FBTztZQUNQLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDcEMsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDdEMsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQixlQUFlO1lBQ2Ysa0JBQWtCLEVBQUcsS0FBYSxDQUFDLGtCQUFrQjtZQUNyRCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsb0JBQW9CO1lBQ2hELHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxlQUFlO1lBQ3JFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztTQUMvQixDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLHVCQUFjLENBQy9CLElBQUksQ0FBQyxLQUFLLEVBQ1YsR0FBRyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQ2xCLFdBQVcsQ0FDWixDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF6TkQsMEJBeU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZXBvc2l0b3J5SW1hZ2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbm5lY3Rpb25zLFxuICB0eXBlIElDb25uZWN0YWJsZSxcbiAgdHlwZSBJVnBjLFxuICB0eXBlIFVzZXJEYXRhLFxuICB0eXBlIElNYWNoaW5lSW1hZ2UsXG4gIFBvcnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIENvZGUsXG4gIFJ1bnRpbWUsXG4gIEhhbmRsZXIsXG4gIHR5cGUgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICB0eXBlIFBvbGljeVN0YXRlbWVudCxcbiAgdHlwZSBQb2xpY3lEb2N1bWVudCxcbiAgdHlwZSBJTWFuYWdlZFBvbGljeVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuXG5pbXBvcnQgRWNzQ2x1c3Rlciwge1xuICB0eXBlIEVjc0NsdXN0ZXJQcm9wcyxcbiAgU2NhbGluZ1R5cGUsXG4gIHR5cGUgRG9tYWluQ29uZmlnLFxuICB0eXBlIEVjc0NhcGFjaXR5UHJvdmlkZXIsXG4gIHR5cGUgRWMyQ2FwYWNpdHlDb25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NcIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lYzJcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGFcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuXG5leHBvcnQgdHlwZSBDb21wdXRlVHlwZSA9IFwiZWNzXCIgfCBcImVjMlwiIHwgXCJsYW1iZGFcIjtcblxuLy8gUmUtZXhwb3J0IGZyb20gZWNzLnRzIHRvIG1haW50YWluIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGhcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHN1cHBvcnRzIHNlY3VyaXR5IGdyb3VwIGNvbm5lY3Rpb25zICovXG4gIHN1cHBvcnRzQ29ubmVjdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGxhbWJkYToge1xuICAgIGRlZmF1bHRQb3J0OiAwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAwLCBtYXhDYXBhY2l0eTogMTAwIH0sXG4gICAgc3VwcG9ydHNDb25uZWN0aW9uczogZmFsc2UsXG4gICAgcmVxdWlyZXNWcGM6IGZhbHNlXG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRUNTIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdGhpcyB1c2VzIFNwb3QgcHJpY2luZyAqL1xuICB1c2VzU3BvdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBydW5zIG9uIEVDMiBpbnN0YW5jZXMgKHZzIHNlcnZlcmxlc3MgRmFyZ2F0ZSkgKi9cbiAgdXNlc0VjMkluc3RhbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUc6IFJlY29yZDxcbiAgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZ1xuPiA9IHtcbiAgRkFSR0FURToge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBGQVJHQVRFX1NQT1Q6IHtcbiAgICB1c2VzU3BvdDogdHJ1ZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBFQzI6IHtcbiAgICB1c2VzU3BvdDogZmFsc2UsXG4gICAgdXNlc0VjMkluc3RhbmNlczogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGVDb25maWcodHlwZTogQ29tcHV0ZVR5cGUpOiBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIHJldHVybiBDT01QVVRFX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyhcbiAgcHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXJcbik6IEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICByZXR1cm4gRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJR1twcm92aWRlcl07XG59XG5cbi8vIFJlLWV4cG9ydCBMYW1iZGEgdHlwZXMgZnJvbSBDREsgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIEh0dHBNZXRob2QsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGFuIEVDUyB0YXNrLlxuICpcbiAqIEZvciBzaW5nbGUtY29udGFpbmVyIHNlcnZpY2VzLCBgbmFtZWAgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIGAke3NlcnZpY2VOYW1lfUNvbnRhaW5lcmAuXG4gKiBGb3IgbXVsdGktY29udGFpbmVyIHRhc2tzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBgcG9ydGAgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICogdGhhdCByZWNlaXZlcyBsb2FkIGJhbGFuY2VyIHRyYWZmaWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBjb250YWluZXIgKG5hbWUgYXV0by1nZW5lcmF0ZWQpXG4gKiBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLWNvbnRhaW5lciB3aXRoIHNpZGVjYXJzXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAgICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbnRhaW5lckNvbmZpZyB7XG4gIC8qKiBDb250YWluZXIgbmFtZS4gT3B0aW9uYWwgZm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UuIE9wdGlvbnM6XG4gICAqIC0gT21pdDogVXNlcyBhcHAncyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5IChwcmltYXJ5IGNvbnRhaW5lciBvbmx5KVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24uXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgYmVjb21lcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gICAqIGFuZCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFNlY3JldHMgaW1wb3J0ZWQgZnJvbSBvdGhlciByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTZWNyZXRzIGF0IC9teWFwcC9hcGktY2x1c3Rlci91c2Vycy9BUElfS0VZIGFuZCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvREJfUEFTU1dPUkRcbiAgICogc3NtU2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIkRCX1BBU1NXT1JEXCJdXG4gICAqL1xuICBzc21TZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBDb21tYW5kIHRvIHJ1biBpbiB0aGUgY29udGFpbmVyICovXG4gIGNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgLyoqIEVudHJ5IHBvaW50IGZvciB0aGUgY29udGFpbmVyICovXG4gIGVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgZXNzZW50aWFsLlxuICAgKiBJZiBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHN0b3BzLCBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzayBzdG9wLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogRUNTIHNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBgeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDEwIH1gOiBjdXN0b20gc2NhbGluZ1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2NhbGluZ0NvbmZpZyB7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgc2NhbGluZ1R5cGU/OiBTY2FsaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VkIGRvbWFpbiBjb25maWd1cmF0aW9uIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKS5cbiAgICogT25seSB1c2VkIHdoZW4gZG9tYWluIGlzIHNwZWNpZmllZC5cbiAgICogQWxsb3dzIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMgd2l0aCBhZHZhbmNlZCBETlMgcm91dGluZy5cbiAgICovXG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcbn1cblxuLyoqXG4gKiBSb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIHBhdGgvaG9zdC1iYXNlZCByb3V0aW5nIG9uIHRoZSBBTEIuXG4gKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgYWxsIHRyYWZmaWMgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzUm91dGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIHBhdHRlcm4gZm9yIHJvdXRpbmcgKGUuZy4sIFwiL2FwaS8qXCIsIFwiL3VzZXJzLypcIikuXG4gICAqIFVzZXMgQUxCIHBhdGgtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3QgaGVhZGVyIGZvciByb3V0aW5nIChlLmcuLCBcImFwaS5leGFtcGxlLmNvbVwiKS5cbiAgICogVXNlcyBBTEIgaG9zdC1iYXNlZCByb3V0aW5nLlxuICAgKi9cbiAgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgZm9yIHRoaXMgcm91dGluZyBydWxlICgxLTUwMDAwKS5cbiAgICogTG93ZXIgbnVtYmVyID0gaGlnaGVyIHByaW9yaXR5LlxuICAgKiBBdXRvLWFzc2lnbmVkIGlmIG9taXR0ZWQuXG4gICAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHBhdGggZm9yIHRoaXMgc2VydmljZSdzIHRhcmdldCBncm91cC5cbiAgICogRGVmYXVsdDogXCIvXCJcbiAgICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZyBjb25maWcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbXBsZSBzZXJ2aWNlXG4gKiB7IG5hbWU6IFwiYXBpXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggcm91dGluZyAoZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMpXG4gKiB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIsIHByaW9yaXR5OiAxMDAgfSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKiBDUFUgdW5pdHMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICgyNTYtNDA5NikgKi9cbiAgY3B1PzogbnVtYmVyO1xuXG4gIC8qKiBNZW1vcnkgaW4gTWlCIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoNTEyLTMwNzIwKSAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgdGFza3MuIERlZmF1bHQ6IDIgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gZmFsc2U6IGRpc2FibGVkXG4gICAqL1xuICBzY2FsaW5nPzogRWNzU2NhbGluZ0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIHRoaXMgc2VydmljZSdzIGltYWdlLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBidWlsZCB0YXJnZXQgc3RhZ2UgZm9yIG11bHRpLXN0YWdlIERvY2tlcmZpbGVzLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBCdWlsZCBcImFwaVwiIHN0YWdlIGZyb20gRG9ja2VyZmlsZVxuICAgKiBkb2NrZXJUYXJnZXQ6IFwiYXBpXCJcbiAgICovXG4gIGRvY2tlclRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbmxpbmUgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKiBVc2UgZm9yIHNlcnZpY2Utc3BlY2lmaWMgQVdTIHBlcm1pc3Npb25zIChTMywgRHluYW1vREIsIFNRUywgZXRjLikuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzogUmVjb3JkPHN0cmluZywgUG9saWN5RG9jdW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1hbmFnZWQgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBzZXJ2aWNlIG5lZWRzIHRvIGNvbm5lY3QgdG8gKGUuZy4sIGRhdGFiYXNlcykuXG4gICAqIENyZWF0ZXMgc2VjdXJpdHkgZ3JvdXAgcnVsZXMgdG8gYWxsb3cgdHJhZmZpYyBmcm9tIHRoaXMgc2VydmljZS5cbiAgICogRm9sbG93cyBsZWFzdC1wcml2aWxlZ2UgLSBvbmx5IHRoaXMgc2VydmljZSBnZXRzIGFjY2Vzcywgbm90IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gT25seSBiYWNrZW5kIHNlcnZpY2UgY29ubmVjdHMgdG8gZGF0YWJhc2VcbiAgICogc2VydmljZXM6IFtcbiAgICogICB7IG5hbWU6IFwiZnJvbnRlbmRcIiB9LFxuICAgKiAgIHsgbmFtZTogXCJiYWNrZW5kXCIsIGNvbm5lY3Rpb25zOiBbYXBwRGF0YWJhc2VdIH1cbiAgICogXVxuICAgKi9cbiAgY29ubmVjdGlvbnM/OiBJQ29ubmVjdGFibGVbXTtcblxuICAvKipcbiAgICogQ2FwYWNpdHkgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZS4gUkVRVUlSRUQuXG4gICAqIEVhY2ggc2VydmljZSBzcGVjaWZpZXMgaXRzIG93biBjYXBhY2l0eSBwcm92aWRlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWl4ZWQgRkFSR0FURSBhbmQgRUMyIHNlcnZpY2VzIGluIHNhbWUgY2x1c3RlclxuICAgKiB7XG4gICAqICAgc2VydmljZXM6IFtcbiAgICogICAgIHsgbmFtZTogXCJhcGlcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJGQVJHQVRFXCIgfSxcbiAgICogICAgIHsgbmFtZTogXCJ3b3JrZXJcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJFQzJcIiwgZWMyQ29uZmlnOiB7IGluc3RhbmNlVHlwZTogXCJ0My5taWNyb1wiIH0gfVxuICAgKiAgIF1cbiAgICogfVxuICAgKi9cbiAgY2FwYWNpdHlQcm92aWRlcjogRWNzQ2FwYWNpdHlQcm92aWRlcjtcblxuICAvKipcbiAgICogRUMyIGNhcGFjaXR5IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmljZS5cbiAgICogT25seSB1c2VkIHdoZW4gc2VydmljZSBjYXBhY2l0eVByb3ZpZGVyIGlzIFwiRUMyXCIuXG4gICAqIFNlcnZpY2VzIHdpdGggbWF0Y2hpbmcgZWMyQ29uZmlnIHNoYXJlIGFuIEFTRyBmb3IgZWZmaWNpZW5jeS5cbiAgICovXG4gIGVjMkNvbmZpZz86IEVjMkNhcGFjaXR5Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBTU00gUGFyYW1ldGVyIFN0b3JlIHBhdGggZm9yIHNlY3JldHMuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHNlY3JldHMgYXJlIGZldGNoZWQgZnJvbSAvPGFwcD4vPGNsdXN0ZXI+LzxzZXJ2aWNlPi5cbiAgICogVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udmVudGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gT3ZlcnJpZGUgZGVmYXVsdCBwYXRoXG4gICAqIHNzbVNlY3JldHNQYXRoOiBcIi9jdXN0b20vcGF0aC90by9zZWNyZXRzXCJcbiAgICovXG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbiBmb3IgRUMyIGluc3RhbmNlcy5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBhdXRvLWdlbmVyYXRlZCBrZXlcbiAqIC0gYHsga2V5TmFtZTogXCJteS1rZXlcIiB9YDogZW5hYmxlZCB3aXRoIGV4aXN0aW5nIGtleVxuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NoQ29uZmlnIHtcbiAgLyoqIFNTSCBrZXkgcGFpciBuYW1lICovXG4gIGtleU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBbGxvd2VkIENJRFIgYmxvY2tzIGZvciBTU0ggYWNjZXNzICovXG4gIGFsbG93ZWRDaWRycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiBVUkwgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICogLSBgeyBhdXRoVHlwZTogXCJOT05FXCIsIGNvcnM6IHsuLi59IH1gOiBwdWJsaWMgd2l0aCBDT1JTXG4gKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblVybENvbmZpZyB7XG4gIC8qKiBBdXRoZW50aWNhdGlvbiB0eXBlLiBEZWZhdWx0OiBBV1NfSUFNICovXG4gIGF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgLyoqIENPUlMgY29uZmlndXJhdGlvbiAqL1xuICBjb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcbn1cblxuaW50ZXJmYWNlIEJhc2VDb21wdXRlUHJvcHMge1xuICB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIEVDUyBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKiBDcmVhdGVzIGFuIEVDUyBjbHVzdGVyIHdpdGggb25lIG9yIG1vcmUgc2VydmljZXMgc2hhcmluZyBhIGxvYWQgYmFsYW5jZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBzZXJ2aWNlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpQ2x1c3RlclwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbnRlcm5hbCB3b3JrZXJzIChubyBBTEIpXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlcnNcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwicHJvY2Vzc29yXCIgfSwgeyBuYW1lOiBcImVtYWlsZXJcIiB9XVxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbXB1dGVQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImVjc1wiO1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBuYW1lc3BhY2UuXG4gICAqIFdoZW4gY29udGFpbmVycyB1c2Ugc3NtU2VjcmV0cywgdGhlIHBhdGggaXMgZGVyaXZlZCBhczogLzxhcHBOYW1lPi88Y2x1c3Rlck5hbWU+LzxzZXJ2aWNlTmFtZT5cbiAgICogQXV0by1kZXJpdmVkIGZyb20gQXBwLmdldE5hbWUoKSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ2x1c3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAgICogLSBPbWl0OiBBTEIgY3JlYXRlZCB3aXRoIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogLSBgeyBkb21haW46IFwiLi4uXCIgfWA6IEFMQiB3aXRoIEhUVFBTICsgRE5TXG4gICAqIC0gYHsgbG9hZEJhbGFuY2VyOiBmYWxzZSB9YDogTm8gQUxCIChpbnRlcm5hbCB3b3JrZXJzKVxuICAgKi9cbiAgY2x1c3Rlcj86IEVjc0NsdXN0ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAgICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gICAqIEVhY2ggc2VydmljZSBNVVNUIHNwZWNpZnkgaXRzIG93biBjYXBhY2l0eVByb3ZpZGVyLlxuICAgKiBBbGwgc2VydmljZXMgc2hhcmUgdGhlIGNsdXN0ZXIncyBBTEIgKHVubGVzcyBkaXNhYmxlZCkuXG4gICAqL1xuICBzZXJ2aWNlczogRWNzU2VydmljZUNvbmZpZ1tdO1xuXG4gIC8qKlxuICAgKiBFQ1IgcmVwb3NpdG9yeSBmb3IgYWxsIHNlcnZpY2VzIChkZWZhdWx0IGltYWdlKS5cbiAgICogSW5kaXZpZHVhbCBzZXJ2aWNlcyBjYW4gb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24gYGltYWdlYCBwcm9wZXJ0eS5cbiAgICovXG4gIGVjclJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5IHwgUmVwb3NpdG9yeUltYWdlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIGN1c3RvbSBpbWFnZS5cbiAgICogTm90ZTogVGhpcyBpcyBtZXRhZGF0YSBmb3IgdGhlIENMSSBidWlsZCBwcm9jZXNzLFxuICAgKiBub3QgdXNlZCBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICovXG4gIGRvY2tlcmZpbGVQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVjMkNvbXB1dGVQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImVjMlwiO1xuXG4gIC8qKiBFQzIgaW5zdGFuY2UgdHlwZS4gRGVmYXVsdDogXCJ0My5taWNyb1wiICovXG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogU1NIIGFjY2VzcyBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIHNzaD86IFNzaENvbmZpZyB8IGZhbHNlO1xuICAvKiogVXNlciBkYXRhIHNjcmlwdCAqL1xuICB1c2VyRGF0YT86IFVzZXJEYXRhO1xuICAvKiogTWFjaGluZSBpbWFnZSAoQU1JKSAqL1xuICBtYWNoaW5lSW1hZ2U/OiBJTWFjaGluZUltYWdlO1xuICAvKiogTWluaW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzLiBEZWZhdWx0OiAxICovXG4gIG1heENhcGFjaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhc2UgTGFtYmRhIGNvbmZpZ3VyYXRpb24gc2hhcmVkIGJ5IGJvdGggY29udGFpbmVyIGFuZCBjb2RlIGRlcGxveW1lbnRzLlxuICovXG5pbnRlcmZhY2UgQmFzZUxhbWJkYVByb3BzIGV4dGVuZHMgQmFzZUNvbXB1dGVQcm9wcyB7XG4gIHR5cGU6IFwibGFtYmRhXCI7XG4gIC8qKiBUaW1lb3V0IGluIHNlY29uZHMuIERlZmF1bHQ6IDMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1lbW9yeSBzaXplIGluIE1CLiBEZWZhdWx0OiAxMjggKi9cbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXI7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBkZXNjcmlwdGlvbiAqL1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gSW5saW5lIHBvbGljaWVzIC0gcm91dGVkIHRvIGV4ZWN1dGlvbiByb2xlIGZvciBFQ1MsIHRhc2sgcm9sZSBmb3IgTGFtYmRhXG4gIC8qKiBJbmxpbmUgSUFNIHBvbGljeSBzdGF0ZW1lbnRzICovXG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gICAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiIH1gOiBwdWJsaWMgYWNjZXNzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybENvbmZpZyB8IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKiogQ29udGFpbmVyIHNlY3JldHMgaW1wb3J0IChrZXk6IGVudiB2YXIsIHZhbHVlOiBTZWNyZXRJbXBvcnQpICovXG4gIGNvbnRhaW5lclNlY3JldHNJbXBvcnQ/OiB7XG4gICAgW2tleTogc3RyaW5nXTogU2VjcmV0SW1wb3J0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBMYW1iZGEgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyB0byBhbGxvdyB0cmFmZmljIGZyb20gdGhpcyBMYW1iZGEuXG4gICAqL1xuICBjb25uZWN0aW9ucz86IElDb25uZWN0YWJsZVtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSIGltYWdlLlxuICpcbiAqIFVzZXMgRG9ja2VyIGltYWdlIGZyb20gRUNSIHJlcG9zaXRvcnkuIEhhbmRsZXIgYW5kIHJ1bnRpbWUgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IHNldCB0byBGUk9NX0lNQUdFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkltYWdlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb250YWluZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29udGFpbmVyLWJhc2VkIGRlcGxveW1lbnQgdXNpbmcgRUNSIGltYWdlICovXG4gIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCI7XG4gIC8qKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBMYW1iZGEgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG59XG5cbi8qKlxuICogQ29kZS1iYXNlZCBMYW1iZGEgdXNpbmcgaW5saW5lIGNvZGUgb3IgUzMuXG4gKlxuICogVXNlcyB0cmFkaXRpb25hbCBMYW1iZGEgZGVwbG95bWVudCB3aXRoIGNvZGUsIGhhbmRsZXIsIGFuZCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkNvZGVMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSxcbiAqICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1hcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29kZS1iYXNlZCBkZXBsb3ltZW50ICovXG4gIGRlcGxveW1lbnQ6IFwiY29kZVwiO1xuICAvKiogTGFtYmRhIGNvZGUgKGZyb20gYXNzZXQsIFMzLCBvciBpbmxpbmUpICovXG4gIGNvZGU6IENvZGU7XG4gIC8qKiBIYW5kbGVyIGZ1bmN0aW9uLiBEZWZhdWx0OiBcImluZGV4LmhhbmRsZXJcIiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogTGFtYmRhIHJ1bnRpbWUuIERlZmF1bHQ6IE5PREVKU18xOF9YICovXG4gIHJ1bnRpbWU/OiBSdW50aW1lO1xufVxuXG4vKipcbiAqIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBlbnN1cmluZyB0eXBlLXNhZmUgTGFtYmRhIGNvbmZpZ3VyYXRpb246XG4gKiAtIGBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiYCByZXF1aXJlcyBgZWNyUmVwb3NpdG9yeWBcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29kZVwiYCByZXF1aXJlcyBgY29kZWAgYW5kIGFsbG93cyBgaGFuZGxlcmAvYHJ1bnRpbWVgXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb250YWluZXJcIiwgZWNyUmVwb3NpdG9yeTogZWNyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29kZS1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb2RlXCIsIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIikgfVxuICovXG5leHBvcnQgdHlwZSBMYW1iZGFDb21wdXRlUHJvcHMgPSBDb250YWluZXJMYW1iZGFQcm9wcyB8IENvZGVMYW1iZGFQcm9wcztcblxuZXhwb3J0IHR5cGUgSUNvbXB1dGVQcm9wcyA9XG4gIHwgRWNzQ29tcHV0ZVByb3BzXG4gIHwgRWMyQ29tcHV0ZVByb3BzXG4gIHwgTGFtYmRhQ29tcHV0ZVByb3BzO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21wdXRlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIFRoZXNlIGNoZWNrcyBoZWxwIGNhdGNoIGlzc3VlcyB3aGVuIHByb3BzIGNvbWUgZnJvbSBkeW5hbWljIHNvdXJjZXMgd2hlcmVcbiAqIFR5cGVTY3JpcHQncyBjb21waWxlLXRpbWUgY2hlY2tzIG1heSBub3QgYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzOiBJQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIGNvbnN0IHByb3BzQW55ID0gcHJvcHMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUNTIGNvbXB1dGVcbiAgaWYgKHByb3BzLnR5cGUgIT09IFwiZWNzXCIpIHtcbiAgICBpZiAoXG4gICAgICBcImNhcGFjaXR5UHJvdmlkZXJcIiBpbiBwcm9wc0FueSAmJlxuICAgICAgcHJvcHNBbnkuY2FwYWNpdHlQcm92aWRlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdjYXBhY2l0eVByb3ZpZGVyJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiQ2FwYWNpdHkgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcImVjMkNvbmZpZ1wiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmVjMkNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdlYzJDb25maWcnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInNlcnZpY2VzXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkuc2VydmljZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnc2VydmljZXMnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJTZXJ2aWNlcyBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBFQ1MgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwiY2x1c3RlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmNsdXN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnY2x1c3RlcicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkNsdXN0ZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUNTIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUxhbWJkYSBjb21wdXRlXG4gIGlmIChwcm9wcy50eXBlICE9PSBcImxhbWJkYVwiKSB7XG4gICAgaWYgKFwiZnVuY3Rpb25VcmxcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5mdW5jdGlvblVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdmdW5jdGlvblVybCcgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBMYW1iZGEgY29tcHV0ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwiaGFuZGxlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LmhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnaGFuZGxlcicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBjb21wdXRlLiBgICtcbiAgICAgICAgICBcIkhhbmRsZXIgY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gTGFtYmRhIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInJ1bnRpbWVcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5ydW50aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtGamFsbF0gV2FybmluZzogJ3J1bnRpbWUnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJSdW50aW1lIGNvbmZpZ3VyYXRpb24gb25seSBhcHBsaWVzIHRvIExhbWJkYSBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVDMi1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQzIgY29tcHV0ZVxuICBpZiAocHJvcHMudHlwZSAhPT0gXCJlYzJcIikge1xuICAgIGlmIChcInNzaFwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LnNzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdzc2gnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJTU0ggY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gRUMyIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcInVzZXJEYXRhXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkudXNlckRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAndXNlckRhdGEnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gY29tcHV0ZS4gYCArXG4gICAgICAgICAgXCJVc2VyIGRhdGEgb25seSBhcHBsaWVzIHRvIEVDMiBjb21wdXRlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXCJtYWNoaW5lSW1hZ2VcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5tYWNoaW5lSW1hZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnbWFjaGluZUltYWdlJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGNvbXB1dGUuIGAgK1xuICAgICAgICAgIFwiTWFjaGluZSBpbWFnZSBvbmx5IGFwcGxpZXMgdG8gRUMyIGNvbXB1dGUuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRUNTLXNwZWNpZmljIHZhbGlkYXRpb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICB2YWxpZGF0ZUVjc1Byb3BzKHByb3BzIGFzIEVjc0NvbXB1dGVQcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgRUNTLXNwZWNpZmljIHByb3BzLlxuICogRXh0cmFjdGVkIGZvciBjbGFyaXR5IGFuZCBkZXRhaWwgcGFyaXR5IHdpdGggZGF0YWJhc2UvbmV0d29yayBwYXR0ZXJucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFY3NQcm9wcyhwcm9wczogRWNzQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gIGlmICghcHJvcHMuc2VydmljZXMgfHwgcHJvcHMuc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdCBsZWFzdCBvbmUgc2VydmljZSBtdXN0IGJlIHNwZWNpZmllZCBpbiAnc2VydmljZXMnIGFycmF5LlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVuaXF1ZSBzZXJ2aWNlIG5hbWVzXG4gIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgY29uc3QgZHVwbGljYXRlTmFtZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgIChuYW1lLCBpbmRleCkgPT4gc2VydmljZU5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICk7XG4gIGlmIChkdXBsaWNhdGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZU5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdFxuICBjb25zdCBpbnZhbGlkTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoXG4gICAgKHMpID0+ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dKiQvLnRlc3Qocy5uYW1lKVxuICApO1xuICBpZiAoaW52YWxpZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzZXJ2aWNlIG5hbWVzOiAke2ludmFsaWROYW1lcy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgIFwiU2VydmljZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucy5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSByb3V0aW5nIHdoZW4gbXVsdGlwbGUgc2VydmljZXMgaGF2ZSBwb3J0c1xuICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICBzLmNvbnRhaW5lcnM/LnNvbWUoKGMpID0+IGMucG9ydClcbiAgKTtcblxuICBpZiAoc2VydmljZXNXaXRoUG9ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6IFNlcnZpY2UgJyR7c2VydmljZS5uYW1lfScgaGFzIGVjMkNvbmZpZyBidXQgY2FwYWNpdHlQcm92aWRlciBpcyBub3QgJ0VDMicuIGAgK1xuICAgICAgICAgIFwiVGhlIGVjMkNvbmZpZyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGNhcGFjaXR5UHJvdmlkZXIgaXMgc2V0IHRvICdFQzInLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbXB1dGUgcmVzb3VyY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZSBjbHVzdGVyXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXNlcnZpY2UgY2x1c3RlciB3aXRoIHJvdXRpbmdcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpQ2x1c3RlclwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwaS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiIH0gfSxcbiAqICAgICB7IG5hbWU6IFwib3JkZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDEgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvb3JkZXJzLypcIiB9IH1cbiAqICAgXVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXb3JrZXIgY2x1c3RlciAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbXG4gKiAgICAgeyBuYW1lOiBcInByb2Nlc3NvclwiLCBjb250YWluZXJzOiBbeyBjb21tYW5kOiBbXCJub2RlXCIsIFwid29ya2VyLmpzXCJdIH1dIH1cbiAqICAgXVxuICogfSkpO1xuICovXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQ29tcHV0ZSA9PiB7XG4gICAgICB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wcyk7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFwcE5hbWUgZnJvbSBBcHAgaW5zdGFuY2UgZm9yIEVDUyBjb21wdXRlXG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0VnBjKCksXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnR5cGUgPT09IFwiZWNzXCIgJiYgIWNvbXB1dGVQcm9wcy5hcHBOYW1lKSB7XG4gICAgICAgIGNvbXB1dGVQcm9wcyA9IHsgLi4uY29tcHV0ZVByb3BzLCBhcHBOYW1lOiBhcHAuZ2V0TmFtZSgpIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQ29tcHV0ZShzY29wZSwgaWQsIGNvbXB1dGVQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHVibGljIHZwYzogSVZwYztcblxuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgY29tcHV0ZTogRWNzQ2x1c3RlciB8IEVjMkluc3RhbmNlIHwgTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmFkZENvbXB1dGUocHJvcHMpO1xuICB9XG5cbiAgYWRkQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcImVjc1wiOlxuICAgICAgICB0aGlzLmFkZEVjc0NvbXB1dGUocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlYzJcIjpcbiAgICAgICAgdGhpcy5hZGRFYzJDb21wdXRlKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibGFtYmRhXCI6XG4gICAgICAgIHRoaXMuYWRkTGFtYmRhQ29tcHV0ZShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBjaGVjayAtIFR5cGVTY3JpcHQgd2lsbCBlcnJvciBpZiBhIGNhc2UgaXMgbWlzc2luZ1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb21wdXRlIHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIElDb21wdXRlUHJvcHMpLnR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRWMyQ29tcHV0ZShwcm9wczogRWMyQ29tcHV0ZVByb3BzKSB7XG4gICAgY29uc3QgZW5hYmxlU1NIID0gcHJvcHMuc3NoICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuc3NoICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IGVjMlByb3BzID0ge1xuICAgICAgc2VydmljZU5hbWU6IGAke3RoaXMuaWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBcInQzLm1pY3JvXCIsXG4gICAgICBlbmFibGVTU0gsXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBhY2l0eSB8fCAxLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5IHx8IDEsXG4gICAgICB2cGM6IHByb3BzLnZwY1xuICAgIH07XG5cbiAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRWMySW5zdGFuY2UodGhpcy5zY29wZSwgYCR7dGhpcy5pZH1FYzJgLCBlYzJQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuY29tcHV0ZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkRWNzQ29tcHV0ZShwcm9wczogRWNzQ29tcHV0ZVByb3BzKSB7XG4gICAgLy8gVHJhbnNmb3JtIEVjc1NlcnZpY2VDb25maWdbXSB0byBFY3NTZXJ2aWNlUHJvcHNbXSBmb3IgRWNzQ2x1c3RlclxuICAgIGNvbnN0IHNlcnZpY2VzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXSA9IHByb3BzLnNlcnZpY2VzLm1hcChcbiAgICAgIChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIC8vIEJ1aWxkIGNvbnRhaW5lciBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICAgIGxldCBjb250YWluZXJzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXVtudW1iZXJdW1wiY29udGFpbmVyc1wiXTtcblxuICAgICAgICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTWFwIGNvbnRhaW5lcnMsIGF1dG8tZ2VuZXJhdGluZyBuYW1lcyBpZiBub3QgcHJvdmlkZWRcbiAgICAgICAgICBjb250YWluZXJzID0gc2VydmljZS5jb250YWluZXJzLm1hcCgoYywgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBjLm5hbWUgfHwgYCR7c2VydmljZS5uYW1lfUNvbnRhaW5lciR7aW5kZXggPiAwID8gaW5kZXggOiBcIlwifWAsXG4gICAgICAgICAgICBpbWFnZTogYy5pbWFnZSxcbiAgICAgICAgICAgIHBvcnQ6IGMucG9ydCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBjLmVudmlyb25tZW50LFxuICAgICAgICAgICAgc2VjcmV0c0ltcG9ydDogYy5zZWNyZXRzSW1wb3J0LFxuICAgICAgICAgICAgc3NtU2VjcmV0czogYy5zc21TZWNyZXRzLFxuICAgICAgICAgICAgY29tbWFuZDogYy5jb21tYW5kLFxuICAgICAgICAgICAgZW50cnlQb2ludDogYy5lbnRyeVBvaW50LFxuICAgICAgICAgICAgZXNzZW50aWFsOiBjLmVzc2VudGlhbCxcbiAgICAgICAgICAgIGhlYWx0aENoZWNrOiBjLmhlYWx0aENoZWNrXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlZmF1bHQgY29udGFpbmVyIChubyBwb3J0ID0gd29ya2VyKVxuICAgICAgICAgIGNvbnRhaW5lcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBzY2FsaW5nIGNvbmZpZ1xuICAgICAgICBsZXQgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG1heENhcGFjaXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNlcnZpY2Uuc2NhbGluZyAhPT0gZmFsc2UgJiYgc2VydmljZS5zY2FsaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY2FsaW5nVHlwZSA9IHNlcnZpY2Uuc2NhbGluZy5zY2FsaW5nVHlwZSA/PyBTY2FsaW5nVHlwZS5DUFU7XG4gICAgICAgICAgbWluQ2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWluQ2FwYWNpdHk7XG4gICAgICAgICAgbWF4Q2FwYWNpdHkgPSBzZXJ2aWNlLnNjYWxpbmcubWF4Q2FwYWNpdHk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZS5zY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBEZWZhdWx0OiBlbmFibGUgc2NhbGluZyB3aXRoIENQVVxuICAgICAgICAgIHNjYWxpbmdUeXBlID0gU2NhbGluZ1R5cGUuQ1BVO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgaW1hZ2U6IHNlcnZpY2UuaW1hZ2UsXG4gICAgICAgICAgY29udGFpbmVycyxcbiAgICAgICAgICBjcHU6IHNlcnZpY2UuY3B1LFxuICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiBzZXJ2aWNlLm1lbW9yeUxpbWl0TWlCLFxuICAgICAgICAgIGRlc2lyZWRDb3VudDogc2VydmljZS5kZXNpcmVkQ291bnQsXG4gICAgICAgICAgc2NhbGluZ1R5cGUsXG4gICAgICAgICAgbWluQ2FwYWNpdHksXG4gICAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgICAgcm91dGluZzogc2VydmljZS5yb3V0aW5nLFxuICAgICAgICAgIHRhc2tSb2xlSW5saW5lUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVJbmxpbmVQb2xpY2llcyxcbiAgICAgICAgICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llczogc2VydmljZS50YXNrUm9sZU1hbmFnZWRQb2xpY2llcyxcbiAgICAgICAgICBjb25uZWN0aW9uczogc2VydmljZS5jb25uZWN0aW9ucyxcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiBzZXJ2aWNlLmNhcGFjaXR5UHJvdmlkZXIsXG4gICAgICAgICAgZWMyQ29uZmlnOiBzZXJ2aWNlLmVjMkNvbmZpZyxcbiAgICAgICAgICBzc21TZWNyZXRzUGF0aDogc2VydmljZS5zc21TZWNyZXRzUGF0aCxcbiAgICAgICAgICBkb2NrZXJmaWxlUGF0aDogc2VydmljZS5kb2NrZXJmaWxlUGF0aCxcbiAgICAgICAgICBkb2NrZXJUYXJnZXQ6IHNlcnZpY2UuZG9ja2VyVGFyZ2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEJ1aWxkIGNsdXN0ZXIgY29uZmlnXG4gICAgY29uc3QgY2x1c3RlcjogRWNzQ2x1c3RlclByb3BzW1wiY2x1c3RlclwiXSA9IHByb3BzLmNsdXN0ZXJcbiAgICAgID8ge1xuICAgICAgICAgIGRvbWFpbjogcHJvcHMuY2x1c3Rlci5kb21haW4sXG4gICAgICAgICAgbG9hZEJhbGFuY2VyOiBwcm9wcy5jbHVzdGVyLmxvYWRCYWxhbmNlcixcbiAgICAgICAgICBkaXJlY3RBY2Nlc3M6IHByb3BzLmNsdXN0ZXIuZGlyZWN0QWNjZXNzLFxuICAgICAgICAgIGRvbWFpbkNvbmZpZzogcHJvcHMuY2x1c3Rlci5kb21haW5Db25maWdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlY3NQcm9wczogRWNzQ2x1c3RlclByb3BzID0ge1xuICAgICAgY2x1c3Rlck5hbWU6IGAke3RoaXMuaWR9Q2x1c3RlcmAsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBlY3JSZXBvc2l0b3J5OiBwcm9wcy5lY3JSZXBvc2l0b3J5IHx8IFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIsXG4gICAgICBjbHVzdGVyLFxuICAgICAgc2VydmljZXNcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IEVjc0NsdXN0ZXIodGhpcy5zY29wZSwgYCR7dGhpcy5pZH1FY3NgLCBlY3NQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuY29tcHV0ZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkTGFtYmRhQ29tcHV0ZShwcm9wczogTGFtYmRhQ29tcHV0ZVByb3BzKSB7XG4gICAgbGV0IGNvZGU6IENvZGU7XG4gICAgbGV0IGhhbmRsZXI6IHN0cmluZztcbiAgICBsZXQgcnVudGltZTogUnVudGltZTtcblxuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50ID09PSBcImNvbnRhaW5lclwiKSB7XG4gICAgICAvLyBDb250YWluZXItYmFzZWQgTGFtYmRhIHVzaW5nIEVDUlxuICAgICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICAgIGNvZGUgPSBDb2RlLmZyb21FY3JJbWFnZShwcm9wcy5lY3JSZXBvc2l0b3J5LCB7XG4gICAgICAgICAgdGFnT3JEaWdlc3Q6IFwibGF0ZXN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJlY3JSZXBvc2l0b3J5IG11c3QgYmUgYSBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGFpbmVyIExhbWJkYSByZXF1aXJlcyB0aGVzZSBzcGVjaWFsIHZhbHVlc1xuICAgICAgaGFuZGxlciA9IEhhbmRsZXIuRlJPTV9JTUFHRTtcbiAgICAgIHJ1bnRpbWUgPSBSdW50aW1lLkZST01fSU1BR0U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvZGUtYmFzZWQgTGFtYmRhIC0gcHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb2RlXCJcbiAgICAgIGNvZGUgPSBwcm9wcy5jb2RlO1xuICAgICAgaGFuZGxlciA9IHByb3BzLmhhbmRsZXIgfHwgXCJpbmRleC5oYW5kbGVyXCI7XG4gICAgICBydW50aW1lID0gcHJvcHMucnVudGltZSB8fCBSdW50aW1lLk5PREVKU18xOF9YO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgcHJlc2VuY2UtYmFzZWQgZnVuY3Rpb25VcmwgY29uZmlnIHRvIGxlZ2FjeSBib29sZWFuIGZvcm1hdFxuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQ29uZmlnID0gcHJvcHMuZnVuY3Rpb25Vcmw7XG4gICAgY29uc3QgZW5hYmxlRnVuY3Rpb25VcmwgPVxuICAgICAgZnVuY3Rpb25VcmxDb25maWcgIT09IHVuZGVmaW5lZCAmJiBmdW5jdGlvblVybENvbmZpZyAhPT0gZmFsc2U7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxBdXRoVHlwZSA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5hdXRoVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmdW5jdGlvblVybENvcnMgPVxuICAgICAgZW5hYmxlRnVuY3Rpb25VcmwgJiYgdHlwZW9mIGZ1bmN0aW9uVXJsQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gZnVuY3Rpb25VcmxDb25maWcuY29yc1xuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGxhbWJkYVByb3BzID0ge1xuICAgICAgY29kZTogY29kZSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHJ1bnRpbWUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBzY2hlZHVsZUV4cHJlc3Npb246IChwcm9wcyBhcyBhbnkpLnNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICAgIGNvbnRhaW5lclNlY3JldHNJbXBvcnQ6IHByb3BzLmNvbnRhaW5lclNlY3JldHNJbXBvcnQsIC8vIFBhc3MgdGhyb3VnaFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfTtcblxuICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBMYW1iZGFGdW5jdGlvbihcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBgJHt0aGlzLmlkfUxhbWJkYWAsXG4gICAgICBsYW1iZGFQcm9wc1xuICAgICk7XG5cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29ubiBvZiBwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgICB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnMuYWxsb3dUbyhjb25uLCBQb3J0LmFsbFRjcCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
602
+ exports.Ec2Compute = Ec2Compute;
603
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1S0Esb0RBRUM7QUFFRCxvRUFJQztBQWd2QkQsc0RBbUJDO0FBaUJELG9EQXNCQztBQWVELDBEQXNCQztBQXovQkQsaURBQWlEO0FBUWpELHVEQVNnQztBQUNoQyxpREFNNkI7QUFPN0IsMkNBQXVDO0FBRXZDLDhCQUE4QjtBQUM5Qix3REFTaUM7QUE2NUN4QiwwRkFqNkNQLHNCQUFTLE9BaTZDTztBQUFFLDZGQWg2Q2xCLHlCQUFZLE9BZzZDa0I7QUFBRSxnR0EvNUNoQyw0QkFBZSxPQSs1Q2dDO0FBQUUsNkZBOTVDakQseUJBQVksT0E4NUNpRDtBQTM1Qy9ELHFEQUFzRDtBQUd0RCx5RUFHeUM7QUFNekMseURBTXlDO0FBUWhDLDRGQVpQLGlCQUFXLE9BWU87QUFQcEIseURBQThEO0FBQzlELCtEQUFvRTtBQTBCdkQsUUFBQSxtQkFBbUIsR0FBMkM7SUFDekUsR0FBRyxFQUFFO1FBQ0gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7UUFDbEQsbUJBQW1CLEVBQUUsSUFBSTtRQUN6QixXQUFXLEVBQUUsSUFBSTtLQUNsQjtJQUNELEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxtQkFBbUIsRUFB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QUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzQ0QsZ0NBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBSZXBvc2l0b3J5SW1hZ2UsXG4gIHR5cGUgSUNsdXN0ZXIsXG4gIHR5cGUgSUJhc2VTZXJ2aWNlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICBIYW5kbGVyLFxuICB0eXBlIEFyY2hpdGVjdHVyZSxcbiAgdHlwZSBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSUZ1bmN0aW9uLFxuICB0eXBlIEludm9rZU1vZGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIHR5cGUgUG9saWN5U3RhdGVtZW50LFxuICB0eXBlIFBvbGljeURvY3VtZW50LFxuICB0eXBlIElNYW5hZ2VkUG9saWN5LFxuICB0eXBlIElHcmFudGFibGUsXG4gIEdyYW50XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICB0eXBlIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgdHlwZSBJQXV0b1NjYWxpbmdHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLy8gSW1wb3J0IHR5cGUtc2FmZSBpbnRlcmZhY2VzXG5pbXBvcnQge1xuICB0eXBlIElFY3NDb21wdXRlLFxuICB0eXBlIElMYW1iZGFDb21wdXRlLFxuICB0eXBlIElFYzJDb21wdXRlLFxuICB0eXBlIEFueUNvbXB1dGUsXG4gIGlzQ29tcHV0ZSxcbiAgaXNFY3NDb21wdXRlLFxuICBpc0xhbWJkYUNvbXB1dGUsXG4gIGlzRWMyQ29tcHV0ZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NvbXB1dGUuanNcIjtcbmltcG9ydCB7IHR5cGUgQ29ubmVjdGlvblNwZWMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuaW1wb3J0IHsgcHJvY2Vzc0Nvbm5lY3Rpb25zIH0gZnJvbSBcIi4vY29ubmVjdGlvbnMuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIEZqYWxsTG9nZ2VyLFxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5pZmVzdFNlcnZpY2UsXG4gIHR5cGUgTWFuaWZlc3RMYW1iZGFcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5cbmltcG9ydCBFY3NDbHVzdGVyLCB7XG4gIHR5cGUgRWNzQ2x1c3RlclByb3BzLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZ1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuaW1wb3J0IHsgRWMySW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBlY3MudHMgdG8gbWFpbnRhaW4gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuZXhwb3J0IHsgU2NhbGluZ1R5cGUgfTtcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHN1cHBvcnRzIHNlY3VyaXR5IGdyb3VwIGNvbm5lY3Rpb25zICovXG4gIHN1cHBvcnRzQ29ubmVjdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGxhbWJkYToge1xuICAgIGRlZmF1bHRQb3J0OiAwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAwLCBtYXhDYXBhY2l0eTogMTAwIH0sXG4gICAgc3VwcG9ydHNDb25uZWN0aW9uczogZmFsc2UsXG4gICAgcmVxdWlyZXNWcGM6IGZhbHNlXG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRUNTIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdGhpcyB1c2VzIFNwb3QgcHJpY2luZyAqL1xuICB1c2VzU3BvdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBydW5zIG9uIEVDMiBpbnN0YW5jZXMgKHZzIHNlcnZlcmxlc3MgRmFyZ2F0ZSkgKi9cbiAgdXNlc0VjMkluc3RhbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUc6IFJlY29yZDxcbiAgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZ1xuPiA9IHtcbiAgRkFSR0FURToge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBGQVJHQVRFX1NQT1Q6IHtcbiAgICB1c2VzU3BvdDogdHJ1ZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBFQzI6IHtcbiAgICB1c2VzU3BvdDogZmFsc2UsXG4gICAgdXNlc0VjMkluc3RhbmNlczogdHJ1ZVxuICB9XG59O1xuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBjb21wdXRlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBDZW50cmFsaXNlZCBjb25zdGFudHMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0RFRkFVTFRTID0ge1xuICBFQzI6IHtcbiAgICBJTlNUQU5DRV9UWVBFOiBcInQzLm1pY3JvXCIsXG4gICAgTUlOX0NBUEFDSVRZOiAxLFxuICAgIE1BWF9DQVBBQ0lUWTogMVxuICB9LFxuICBFQ1M6IHtcbiAgICAvKiogQVdTIHNhbXBsZSBpbWFnZSB1c2VkIHdoZW4gbm8gRUNSIHJlcG9zaXRvcnkgaXMgcHJvdmlkZWQgKi9cbiAgICBGQUxMQkFDS19JTUFHRTogXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAvKiogRGVmYXVsdCB0YWcgZm9yIEVDUiBpbWFnZXMgKi9cbiAgICBJTUFHRV9UQUc6IFwibGF0ZXN0XCJcbiAgfSxcbiAgTEFNQkRBOiB7XG4gICAgSEFORExFUjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgUlVOVElNRTogUnVudGltZS5OT0RFSlNfMThfWFxuICB9XG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGVDb25maWcodHlwZTogQ29tcHV0ZVR5cGUpOiBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIHJldHVybiBDT01QVVRFX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyhcbiAgcHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXJcbik6IEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICByZXR1cm4gRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJR1twcm92aWRlcl07XG59XG5cbi8vIFJlLWV4cG9ydCBMYW1iZGEgdHlwZXMgZnJvbSBDREsgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgSHR0cE1ldGhvZCxcbiAgSW52b2tlTW9kZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb250YWluZXIgaW4gYW4gRUNTIHRhc2suXG4gKlxuICogRm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMsIGBuYW1lYCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gYCR7c2VydmljZU5hbWV9Q29udGFpbmVyYC5cbiAqIEZvciBtdWx0aS1jb250YWluZXIgdGFza3MsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIGBwb3J0YCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gKiB0aGF0IHJlY2VpdmVzIGxvYWQgYmFsYW5jZXIgdHJhZmZpYy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIGNvbnRhaW5lciAobmFtZSBhdXRvLWdlbmVyYXRlZClcbiAqIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktY29udGFpbmVyIHdpdGggc2lkZWNhcnNcbiAqIGNvbnRhaW5lcnM6IFtcbiAqICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IC0gcmVjZWl2ZXMgQUxCIHRyYWZmaWNcbiAqICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH0gICAgIC8vIFNpZGVjYXIgLSBtb25pdG9yaW5nXG4gKiBdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqIENvbnRhaW5lciBuYW1lLiBPcHRpb25hbCBmb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcy4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGFwcCdzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTZWNyZXRzIGF0IC9teWFwcC9hcGktY2x1c3Rlci91c2Vycy9BUElfS0VZIGFuZCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvREJfUEFTU1dPUkRcbiAgICogc2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIkRCX1BBU1NXT1JEXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikgKi9cbiAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD47XG4gIC8qKiBDb21tYW5kIHRvIHJ1biBpbiB0aGUgY29udGFpbmVyICovXG4gIGNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgLyoqIEVudHJ5IHBvaW50IGZvciB0aGUgY29udGFpbmVyICovXG4gIGVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgZXNzZW50aWFsLlxuICAgKiBJZiBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHN0b3BzLCBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzayBzdG9wLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogRUNTIHNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBgeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDEwIH1gOiBjdXN0b20gc2NhbGluZ1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2NhbGluZ0NvbmZpZyB7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgc2NhbGluZ1R5cGU/OiBTY2FsaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VkIGRvbWFpbiBjb25maWd1cmF0aW9uIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKS5cbiAgICogT25seSB1c2VkIHdoZW4gZG9tYWluIGlzIHNwZWNpZmllZC5cbiAgICogQWxsb3dzIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMgd2l0aCBhZHZhbmNlZCBETlMgcm91dGluZy5cbiAgICovXG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcbn1cblxuLyoqXG4gKiBSb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIHBhdGgvaG9zdC1iYXNlZCByb3V0aW5nIG9uIHRoZSBBTEIuXG4gKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgYWxsIHRyYWZmaWMgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzUm91dGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIHBhdHRlcm4gZm9yIHJvdXRpbmcgKGUuZy4sIFwiL2FwaS8qXCIsIFwiL3VzZXJzLypcIikuXG4gICAqIFVzZXMgQUxCIHBhdGgtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3QgaGVhZGVyIGZvciByb3V0aW5nIChlLmcuLCBcImFwaS5leGFtcGxlLmNvbVwiKS5cbiAgICogVXNlcyBBTEIgaG9zdC1iYXNlZCByb3V0aW5nLlxuICAgKi9cbiAgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgZm9yIHRoaXMgcm91dGluZyBydWxlICgxLTUwMDAwKS5cbiAgICogTG93ZXIgbnVtYmVyID0gaGlnaGVyIHByaW9yaXR5LlxuICAgKiBBdXRvLWFzc2lnbmVkIGlmIG9taXR0ZWQuXG4gICAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHBhdGggZm9yIHRoaXMgc2VydmljZSdzIHRhcmdldCBncm91cC5cbiAgICogRGVmYXVsdDogXCIvXCJcbiAgICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZyBjb25maWcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbXBsZSBzZXJ2aWNlXG4gKiB7IG5hbWU6IFwiYXBpXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggcm91dGluZyAoZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMpXG4gKiB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIsIHByaW9yaXR5OiAxMDAgfSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICovXG4gIHJvdXRpbmc/OiBFY3NSb3V0aW5nQ29uZmlnO1xuXG4gIC8qKiBDUFUgdW5pdHMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICgyNTYtNDA5NikgKi9cbiAgY3B1PzogbnVtYmVyO1xuXG4gIC8qKiBNZW1vcnkgaW4gTWlCIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoNTEyLTMwNzIwKSAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKiogRGVzaXJlZCBudW1iZXIgb2YgdGFza3MuIERlZmF1bHQ6IDIgKi9cbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gZmFsc2U6IGRpc2FibGVkXG4gICAqL1xuICBzY2FsaW5nPzogRWNzU2NhbGluZ0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgZm9yIGJ1aWxkaW5nIHRoaXMgc2VydmljZSdzIGltYWdlLlxuICAgKiBNZXRhZGF0YSBmb3IgQ0xJIGJ1aWxkIHByb2Nlc3MsIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY2tlciBidWlsZCB0YXJnZXQgc3RhZ2UgZm9yIG11bHRpLXN0YWdlIERvY2tlcmZpbGVzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgdGhlIENMSSBidWlsZHMgd2l0aCBgLS10YXJnZXQgPGRvY2tlclRhcmdldD5gLlxuICAgKiBUaGUgaW1hZ2UgdGFnIHN1ZmZpeCBpcyBhbHNvIHVwZGF0ZWQ6IGA8c2VydmljZT4tPHRhcmdldD4tbGF0ZXN0YC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRG9ja2VyZmlsZTogRlJPTSBub2RlIEFTIGJhc2UgLi4uIEZST00gYmFzZSBBUyBhcGkgLi4uIEZST00gYmFzZSBBUyB3b3JrZXJcbiAgICogeyBuYW1lOiBcImFwaVwiLCBkb2NrZXJUYXJnZXQ6IFwiYXBpXCIgfSAgIC8vIGJ1aWxkczogbXlhcHAtYXBpLWFwaS1sYXRlc3RcbiAgICogeyBuYW1lOiBcIndvcmtlclwiLCBkb2NrZXJUYXJnZXQ6IFwid29ya2VyXCIgfSAgLy8gYnVpbGRzOiBteWFwcC13b3JrZXItd29ya2VyLWxhdGVzdFxuICAgKi9cbiAgZG9ja2VyVGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGlubGluZSBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqIFVzZSBmb3Igc2VydmljZS1zcGVjaWZpYyBBV1MgcGVybWlzc2lvbnMgKFMzLCBEeW5hbW9EQiwgU1FTLCBldGMuKS5cbiAgICovXG4gIHRhc2tSb2xlSW5saW5lUG9saWNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBQb2xpY3lEb2N1bWVudD47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgbWFuYWdlZCBwb2xpY2llcyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFzayByb2xlLlxuICAgKiBBZGRlZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgRUNTIEV4ZWMgcGVybWlzc2lvbnMuXG4gICAqL1xuICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llcz86IElNYW5hZ2VkUG9saWN5W107XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIHNlcnZpY2UgbmVlZHMgdG8gY29ubmVjdCB0byAoZS5nLiwgZGF0YWJhc2VzLCBTMyBidWNrZXRzLCBTUVMgcXVldWVzKS5cbiAgICogQ3JlYXRlcyBzZWN1cml0eSBncm91cCBydWxlcyBmb3IgSUNvbm5lY3RhYmxlIHJlc291cmNlcyBhbmQgSUFNIGdyYW50cyBmb3IgSUFNIHJlc291cmNlcy5cbiAgICogRm9sbG93cyBsZWFzdC1wcml2aWxlZ2UgLSBvbmx5IHRoaXMgc2VydmljZSBnZXRzIGFjY2Vzcywgbm90IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gSUNvbm5lY3RhYmxlOiBTZWN1cml0eSBncm91cCByZXNvdXJjZXMgKFJEUywgRUNTLCBldGMuKVxuICAgKiAtIElTdG9yYWdlQ29ubmVjdG9yOiBTMyBidWNrZXRzIChJQU0gZ3JhbnRzKVxuICAgKiAtIElEeW5hbW9EQkNvbm5lY3RvcjogRHluYW1vREIgdGFibGVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIElRdWV1ZUNvbm5lY3RvcjogU1FTIHF1ZXVlcyAoSUFNIGdyYW50cylcbiAgICogLSBDb25uZWN0aW9uQ29uZmlnOiBFeHBsaWNpdCBhY2Nlc3MgbGV2ZWwgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTaW1wbGUgY29ubmVjdGlvbnMgKGRlZmF1bHQgcGVybWlzc2lvbnMpXG4gICAqIGNvbm5lY3Rpb25zOiBbZGF0YWJhc2UsIGJ1Y2tldCwgY2FjaGUsIHF1ZXVlXVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFeHBsaWNpdCBhY2Nlc3MgbGV2ZWxzXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgZ3JvdXAgKFJEUylcbiAgICogICB7IHJlc291cmNlOiBjYWNoZSwgYWNjZXNzOiBcInJlYWRcIiB9LCAgIC8vIFJlYWQtb25seSBEeW5hbW9EQlxuICAgKiAgIHsgcmVzb3VyY2U6IGJ1Y2tldCwgYWNjZXNzOiBcIndyaXRlXCIgfSwgLy8gV3JpdGUtb25seSBTM1xuICAgKiAgIHsgcmVzb3VyY2U6IHF1ZXVlLCBhY2Nlc3M6IFwiY29uc3VtZVwiIH0gLy8gQ29uc3VtZS1vbmx5IFNRU1xuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIENhcGFjaXR5IHByb3ZpZGVyIGZvciB0aGlzIHNlcnZpY2UuIFJFUVVJUkVELlxuICAgKiBFYWNoIHNlcnZpY2Ugc3BlY2lmaWVzIGl0cyBvd24gY2FwYWNpdHkgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE1peGVkIEZBUkdBVEUgYW5kIEVDMiBzZXJ2aWNlcyBpbiBzYW1lIGNsdXN0ZXJcbiAgICoge1xuICAgKiAgIHNlcnZpY2VzOiBbXG4gICAqICAgICB7IG5hbWU6IFwiYXBpXCIsIGNhcGFjaXR5UHJvdmlkZXI6IFwiRkFSR0FURVwiIH0sXG4gICAqICAgICB7IG5hbWU6IFwid29ya2VyXCIsIGNhcGFjaXR5UHJvdmlkZXI6IFwiRUMyXCIsIGVjMkNvbmZpZzogeyBpbnN0YW5jZVR5cGU6IFwidDMubWljcm9cIiB9IH1cbiAgICogICBdXG4gICAqIH1cbiAgICovXG4gIGNhcGFjaXR5UHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHNlcnZpY2UgY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICAgKiBTZXJ2aWNlcyB3aXRoIG1hdGNoaW5nIGVjMkNvbmZpZyBzaGFyZSBhbiBBU0cgZm9yIGVmZmljaWVuY3kuXG4gICAqL1xuICBlYzJDb25maWc/OiBFYzJDYXBhY2l0eUNvbmZpZztcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBzZWNyZXRzIGFyZSBmZXRjaGVkIGZyb20gLzxhcHA+LzxjbHVzdGVyPi88c2VydmljZT4uXG4gICAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE92ZXJyaWRlIGRlZmF1bHQgcGF0aFxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvY3VzdG9tL3BhdGgvdG8vc2VjcmV0c1wiXG4gICAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24gZm9yIEVDMiBpbnN0YW5jZXMuXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggYXV0by1nZW5lcmF0ZWQga2V5XG4gKiAtIGB7IGtleU5hbWU6IFwibXkta2V5XCIgfWA6IGVuYWJsZWQgd2l0aCBleGlzdGluZyBrZXlcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzaENvbmZpZyB7XG4gIC8qKiBTU0gga2V5IHBhaXIgbmFtZSAqL1xuICBrZXlOYW1lPzogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBDSURSIGJsb2NrcyBmb3IgU1NIIGFjY2VzcyAqL1xuICBhbGxvd2VkQ2lkcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgZnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggSUFNIGF1dGhcbiAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiLCBjb3JzOiB7Li4ufSB9YDogcHVibGljIHdpdGggQ09SU1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25VcmxDb25maWcge1xuICAvKiogQXV0aGVudGljYXRpb24gdHlwZS4gRGVmYXVsdDogQVdTX0lBTSAqL1xuICBhdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIC8qKiBDT1JTIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZS4gVXNlIFJFU1BPTlNFX1NUUkVBTSBmb3IgTGFtYmRhIHN0cmVhbWluZy4gRGVmYXVsdDogQlVGRkVSRUQgKi9cbiAgaW52b2tlTW9kZT86IEludm9rZU1vZGU7XG59XG5cbmludGVyZmFjZSBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSBjb25maWd1cmF0aW9uLlxuICogQ3JlYXRlcyBhbiBFQ1MgY2x1c3RlciB3aXRoIG9uZSBvciBtb3JlIHNlcnZpY2VzIHNoYXJpbmcgYSBsb2FkIGJhbGFuY2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXZWJBcHBcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcHAuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSB9XVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaUNsdXN0ZXJcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ1c2Vyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL3VzZXJzLypcIiB9IH0sXG4gKiAgICAgeyBuYW1lOiBcIm9yZGVyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAxIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL29yZGVycy8qXCIgfSB9XG4gKiAgIF1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW50ZXJuYWwgd29ya2VycyAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcInByb2Nlc3NvclwiIH0sIHsgbmFtZTogXCJlbWFpbGVyXCIgfV1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlY3NcIjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSBmb3IgU1NNIHNlY3JldHMgbmFtZXNwYWNlLlxuICAgKiBXaGVuIGNvbnRhaW5lcnMgdXNlIHNlY3JldHMsIHRoZSBwYXRoIGlzIGRlcml2ZWQgYXM6IC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+XG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcC5nZXROYW1lKCkgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgY29uZmlndXJhdGlvbi5cbiAgICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAqIC0gYHsgZG9tYWluOiBcIi4uLlwiIH1gOiBBTEIgd2l0aCBIVFRQUyArIEROU1xuICAgKiAtIGB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfWA6IE5vIEFMQiAoaW50ZXJuYWwgd29ya2VycylcbiAgICovXG4gIGNsdXN0ZXI/OiBFY3NDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VDb25maWdbXTtcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgZm9yIGFsbCBzZXJ2aWNlcyAoZGVmYXVsdCBpbWFnZSkuXG4gICAqIEluZGl2aWR1YWwgc2VydmljZXMgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGBpbWFnZWAgcHJvcGVydHkuXG4gICAqL1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYzJDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlYzJcIjtcblxuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDMubWljcm9cIiAqL1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNTSCBhY2Nlc3MgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0OiBkaXNhYmxlZCAoZGVmYXVsdClcbiAgICogLSBge31gOiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAgICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAqL1xuICBzc2g/OiBTc2hDb25maWcgfCBmYWxzZTtcbiAgLyoqIFVzZXIgZGF0YSBzY3JpcHQgKi9cbiAgdXNlckRhdGE/OiBVc2VyRGF0YTtcbiAgLyoqIE1hY2hpbmUgaW1hZ2UgKEFNSSkgKi9cbiAgbWFjaGluZUltYWdlPzogSU1hY2hpbmVJbWFnZTtcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGluc3RhbmNlcy4gRGVmYXVsdDogMSAqL1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBlcmNlbnRhZ2Ugb2YgY2FwYWNpdHkgdG8gcnVuIG9uIFNwb3QgaW5zdGFuY2VzICgwLTEwMCkuXG4gICAqIC0gT21pdCBvciAwOiBBbGwgT24tRGVtYW5kIGluc3RhbmNlcyAoZGVmYXVsdClcbiAgICogLSAxMDA6IEFsbCBTcG90IGluc3RhbmNlc1xuICAgKiAtIDUwOiBIYWxmIFNwb3QsIGhhbGYgT24tRGVtYW5kXG4gICAqXG4gICAqIFNwb3QgaW5zdGFuY2VzIGNhbiByZWR1Y2UgY29zdHMgYnkgdXAgdG8gOTAlIGJ1dCBtYXkgYmUgaW50ZXJydXB0ZWQuXG4gICAqIFVzZSBmb3IgZmF1bHQtdG9sZXJhbnQgd29ya2xvYWRzLlxuICAgKi9cbiAgc3BvdENhcGFjaXR5UGVyY2VudGFnZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCYXNlIExhbWJkYSBjb25maWd1cmF0aW9uIHNoYXJlZCBieSBib3RoIGNvbnRhaW5lciBhbmQgY29kZSBkZXBsb3ltZW50cy5cbiAqL1xuaW50ZXJmYWNlIEJhc2VMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VDb21wdXRlUHJvcHMge1xuICB0eXBlOiBcImxhbWJkYVwiO1xuICAvKiogVGltZW91dCBpbiBzZWNvbmRzLiBEZWZhdWx0OiAzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgc2l6ZSBpbiBNQi4gRGVmYXVsdDogMTI4ICovXG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogbnVtYmVyO1xuICAvKiogQ1BVIGFyY2hpdGVjdHVyZS4gRGVmYXVsdDogeDg2XzY0LiBVc2UgQXJjaGl0ZWN0dXJlLkFSTV82NCBmb3IgR3Jhdml0b24yLiAqL1xuICBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBkZXNjcmlwdGlvbiAqL1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gSW5saW5lIHBvbGljaWVzIC0gcm91dGVkIHRvIGV4ZWN1dGlvbiByb2xlIGZvciBFQ1MsIHRhc2sgcm9sZSBmb3IgTGFtYmRhXG4gIC8qKiBJbmxpbmUgSUFNIHBvbGljeSBzdGF0ZW1lbnRzICovXG4gIGlubGluZVBvbGljeT86IFBvbGljeVN0YXRlbWVudFtdO1xuICAvKipcbiAgICogRnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gICAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiIH1gOiBwdWJsaWMgYWNjZXNzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybENvbmZpZyB8IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgTGFtYmRhJ3MgU1NNIG5hbWVzcGFjZS5cbiAgICogVGhlIG5hbWVzcGFjZSBwYXRoIGlzIGF1dG8tZGV0ZXJtaW5lZCBhczogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIlNUUklQRV9TRUNSRVRcIl1cbiAgICovXG4gIHNlY3JldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBzZWNyZXRzIGFyZSBkZWZpbmVkLCB0aGlzIHBhdGggaXMgdXNlZCBhcyB0aGUgYmFzZSBwYXRoLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB1c2VzOiAvPGFwcE5hbWU+L2xhbWJkYS88ZnVuY3Rpb25OYW1lPlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvbXlhcHAvY3VzdG9tL3BhdGhcIlxuICAgKi9cbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgaW1wb3J0ZWQgZnJvbSBvdGhlciBDREsgcmVzb3VyY2VzIChBV1MgU2VjcmV0cyBNYW5hZ2VyKS5cbiAgICogVXNlZCBmb3IgQ0RLLW1hbmFnZWQgc2VjcmV0cyBsaWtlIGRhdGFiYXNlIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWNyZXRzSW1wb3J0OiB7XG4gICAqICAgREFUQUJBU0VfVVNFUk5BTUU6IGRhdGFiYXNlLmdldENyZWRlbnRpYWxzKCkuZ2V0SW1wb3J0KFwidXNlcm5hbWVcIiksXG4gICAqICAgREFUQUJBU0VfUEFTU1dPUkQ6IGRhdGFiYXNlLmdldENyZWRlbnRpYWxzKCkuZ2V0SW1wb3J0KFwicGFzc3dvcmRcIilcbiAgICogfVxuICAgKi9cbiAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD47XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgZm9yIFNTTSBzZWNyZXRzIHBhdGggZGVyaXZhdGlvbi5cbiAgICogQXV0by1kZXJpdmVkIGZyb20gQXBwIGluc3RhbmNlIHdoZW4gdXNpbmcgQ29tcHV0ZUZhY3RvcnkuXG4gICAqIE9ubHkgc3BlY2lmeSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLlxuICAgKi9cbiAgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgTGFtYmRhIG5lZWRzIHRvIGNvbm5lY3QgdG8gKGUuZy4sIGRhdGFiYXNlcywgUzMgYnVja2V0cywgU1FTIHF1ZXVlcykuXG4gICAqIENyZWF0ZXMgc2VjdXJpdHkgZ3JvdXAgcnVsZXMgZm9yIElDb25uZWN0YWJsZSByZXNvdXJjZXMgYW5kIElBTSBncmFudHMgZm9yIElBTSByZXNvdXJjZXMuXG4gICAqXG4gICAqIFN1cHBvcnRzOlxuICAgKiAtIElDb25uZWN0YWJsZTogU2VjdXJpdHkgZ3JvdXAgcmVzb3VyY2VzIChSRFMsIEVDUywgZXRjLilcbiAgICogLSBJU3RvcmFnZUNvbm5lY3RvcjogUzMgYnVja2V0cyAoSUFNIGdyYW50cylcbiAgICogLSBJRHluYW1vREJDb25uZWN0b3I6IER5bmFtb0RCIHRhYmxlcyAoSUFNIGdyYW50cylcbiAgICogLSBJUXVldWVDb25uZWN0b3I6IFNRUyBxdWV1ZXMgKElBTSBncmFudHMpXG4gICAqIC0gQ29ubmVjdGlvbkNvbmZpZzogRXhwbGljaXQgYWNjZXNzIGxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29ubmVjdGlvbnM6IFtcbiAgICogICBkYXRhYmFzZSxcbiAgICogICB7IHJlc291cmNlOiBxdWV1ZSwgYWNjZXNzOiBcInNlbmRcIiB9XG4gICAqIF1cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogQ29ubmVjdGlvblNwZWNbXTtcblxuICAvKipcbiAgICogRXZlbnRCcmlkZ2Ugc2NoZWR1bGUgZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIExhbWJkYSBpbnZvY2F0aW9ucy5cbiAgICogVXNlcyBjcm9uIG9yIHJhdGUgc3ludGF4OiBcInJhdGUoMSBob3VyKVwiIG9yIFwiY3JvbigwIDEyICogKiA/ICopXCIuXG4gICAqL1xuICBzY2hlZHVsZUV4cHJlc3Npb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGFpbmVyLWJhc2VkIExhbWJkYSB1c2luZyBFQ1IgaW1hZ2UuXG4gKlxuICogVXNlcyBEb2NrZXIgaW1hZ2UgZnJvbSBFQ1IgcmVwb3NpdG9yeS4gSGFuZGxlciBhbmQgcnVudGltZSBhcmVcbiAqIGF1dG9tYXRpY2FsbHkgc2V0IHRvIEZST01fSU1BR0UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiSW1hZ2VMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiLFxuICogICBlY3JSZXBvc2l0b3J5OiBhcHAuZ2V0RGVmYXVsdENvbnRhaW5lclJlZ2lzdHJ5KClcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VMYW1iZGFQcm9wcyB7XG4gIC8qKiBDb250YWluZXItYmFzZWQgZGVwbG95bWVudCB1c2luZyBFQ1IgaW1hZ2UgKi9cbiAgZGVwbG95bWVudDogXCJjb250YWluZXJcIjtcbiAgLyoqIEVDUiByZXBvc2l0b3J5IGNvbnRhaW5pbmcgdGhlIExhbWJkYSBjb250YWluZXIgaW1hZ2UgKi9cbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcbn1cblxuLyoqXG4gKiBDb2RlLWJhc2VkIExhbWJkYSB1c2luZyBpbmxpbmUgY29kZSBvciBTMy5cbiAqXG4gKiBVc2VzIHRyYWRpdGlvbmFsIExhbWJkYSBkZXBsb3ltZW50IHdpdGggY29kZSwgaGFuZGxlciwgYW5kIHJ1bnRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQ29kZUxhbWJkYVwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpLFxuICogICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAqICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWFxuICogfSkpO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVMYW1iZGFQcm9wcyBleHRlbmRzIEJhc2VMYW1iZGFQcm9wcyB7XG4gIC8qKiBDb2RlLWJhc2VkIGRlcGxveW1lbnQgKi9cbiAgZGVwbG95bWVudDogXCJjb2RlXCI7XG4gIC8qKiBMYW1iZGEgY29kZSAoZnJvbSBhc3NldCwgUzMsIG9yIGlubGluZSkgKi9cbiAgY29kZTogQ29kZTtcbiAgLyoqIEhhbmRsZXIgZnVuY3Rpb24uIERlZmF1bHQ6IFwiaW5kZXguaGFuZGxlclwiICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBMYW1iZGEgcnVudGltZS4gRGVmYXVsdDogTk9ERUpTXzE4X1ggKi9cbiAgcnVudGltZT86IFJ1bnRpbWU7XG59XG5cbi8qKlxuICogTGFtYmRhIGNvbXB1dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIGVuc3VyaW5nIHR5cGUtc2FmZSBMYW1iZGEgY29uZmlndXJhdGlvbjpcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCJgIHJlcXVpcmVzIGBlY3JSZXBvc2l0b3J5YFxuICogLSBgZGVwbG95bWVudDogXCJjb2RlXCJgIHJlcXVpcmVzIGBjb2RlYCBhbmQgYWxsb3dzIGBoYW5kbGVyYC9gcnVudGltZWBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udGFpbmVyLWJhc2VkIExhbWJkYVxuICogeyB0eXBlOiBcImxhbWJkYVwiLCBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiLCBlY3JSZXBvc2l0b3J5OiBlY3IgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb2RlLWJhc2VkIExhbWJkYVxuICogeyB0eXBlOiBcImxhbWJkYVwiLCBkZXBsb3ltZW50OiBcImNvZGVcIiwgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSB9XG4gKi9cbmV4cG9ydCB0eXBlIExhbWJkYUNvbXB1dGVQcm9wcyA9IENvbnRhaW5lckxhbWJkYVByb3BzIHwgQ29kZUxhbWJkYVByb3BzO1xuXG4vLyBUeXBlLXNhZmUgcHJvcHMgd2l0aCBsaXRlcmFsIGRpc2NyaW1pbmF0b3JzIGZvciBmYWN0b3J5IG92ZXJsb2Fkc1xuZXhwb3J0IHR5cGUgSUVjc0NvbXB1dGVQcm9wcyA9IEVjc0NvbXB1dGVQcm9wcztcbmV4cG9ydCB0eXBlIElMYW1iZGFDb21wdXRlUHJvcHMgPSBMYW1iZGFDb21wdXRlUHJvcHM7XG5leHBvcnQgdHlwZSBJRWMyQ29tcHV0ZVByb3BzID0gRWMyQ29tcHV0ZVByb3BzO1xuXG5leHBvcnQgdHlwZSBJQ29tcHV0ZVByb3BzID1cbiAgfCBJRWNzQ29tcHV0ZVByb3BzXG4gIHwgSUxhbWJkYUNvbXB1dGVQcm9wc1xuICB8IElFYzJDb21wdXRlUHJvcHM7XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbXB1dGUgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wdXRlUHJvcHMocHJvcHM6IElDb21wdXRlUHJvcHMpOiB2b2lkIHtcbiAgLy8gRUNTLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUVDUyBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcImNhcGFjaXR5UHJvdmlkZXJcIiwgXCJlYzJDb25maWdcIiwgXCJzZXJ2aWNlc1wiLCBcImNsdXN0ZXJcIl0sXG4gICAgXCJlY3NcIixcbiAgICBcIkVDUyBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBMYW1iZGEtc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tTGFtYmRhIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wiZnVuY3Rpb25VcmxcIiwgXCJoYW5kbGVyXCIsIFwicnVudGltZVwiXSxcbiAgICBcImxhbWJkYVwiLFxuICAgIFwiTGFtYmRhIGNvbXB1dGVcIlxuICApO1xuXG4gIC8vIEVDMi1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQzIgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJzc2hcIiwgXCJ1c2VyRGF0YVwiLCBcIm1hY2hpbmVJbWFnZVwiXSxcbiAgICBcImVjMlwiLFxuICAgIFwiRUMyIGNvbXB1dGVcIlxuICApO1xuXG4gIC8vIEVDUy1zcGVjaWZpYyB2YWxpZGF0aW9uIC0gdHlwZSBuYXJyb3dpbmcgaGFuZGxlZCBieSBkaXNjcmltaW5hdGVkIHVuaW9uXG4gIGlmIChwcm9wcy50eXBlID09PSBcImVjc1wiKSB7XG4gICAgdmFsaWRhdGVFY3NQcm9wcyhwcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgRUNTLXNwZWNpZmljIHByb3BzLlxuICogRXh0cmFjdGVkIGZvciBjbGFyaXR5IGFuZCBkZXRhaWwgcGFyaXR5IHdpdGggZGF0YWJhc2UvbmV0d29yayBwYXR0ZXJucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFY3NQcm9wcyhwcm9wczogRWNzQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHNlcnZpY2VzIGFycmF5IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gIGlmICghcHJvcHMuc2VydmljZXMgfHwgcHJvcHMuc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdCBsZWFzdCBvbmUgc2VydmljZSBtdXN0IGJlIHNwZWNpZmllZCBpbiAnc2VydmljZXMnIGFycmF5LlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVuaXF1ZSBzZXJ2aWNlIG5hbWVzXG4gIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHByb3BzLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgY29uc3QgZHVwbGljYXRlTmFtZXMgPSBzZXJ2aWNlTmFtZXMuZmlsdGVyKFxuICAgIChuYW1lLCBpbmRleCkgPT4gc2VydmljZU5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICk7XG4gIGlmIChkdXBsaWNhdGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYER1cGxpY2F0ZSBzZXJ2aWNlIG5hbWVzOiAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZU5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdFxuICBjb25zdCBpbnZhbGlkTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoXG4gICAgKHMpID0+ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dKiQvLnRlc3Qocy5uYW1lKVxuICApO1xuICBpZiAoaW52YWxpZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzZXJ2aWNlIG5hbWVzOiAke2ludmFsaWROYW1lcy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgIFwiU2VydmljZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucy5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSByb3V0aW5nIHdoZW4gbXVsdGlwbGUgc2VydmljZXMgaGF2ZSBwb3J0c1xuICBjb25zdCBzZXJ2aWNlc1dpdGhQb3J0cyA9IHByb3BzLnNlcnZpY2VzLmZpbHRlcigocykgPT5cbiAgICBzLmNvbnRhaW5lcnM/LnNvbWUoKGMpID0+IGMucG9ydClcbiAgKTtcblxuICBpZiAoc2VydmljZXNXaXRoUG9ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG1pc3NpbmdSb3V0aW5nID0gc2VydmljZXNXaXRoUG9ydHMuZmlsdGVyKFxuICAgICAgKHMpID0+ICFzLnJvdXRpbmc/LnBhdGggJiYgIXMucm91dGluZz8uaG9zdFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyBoYXMgZWMyQ29uZmlnIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gYCArXG4gICAgICAgICAgXCJUaGUgZWMyQ29uZmlnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgY2FwYWNpdHlQcm92aWRlciBpcyBzZXQgdG8gJ0VDMicuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciBhbiBFQ1Mgc2VydmljZS5cbiAqIENvbnZlcnRzIHVzZXItZmFjaW5nIEVjc0NvbnRhaW5lckNvbmZpZyB0byBpbnRlcm5hbCBFY3NDbHVzdGVyUHJvcHMgZm9ybWF0LlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29udGFpbmVyQ29uZmlncyhcbiAgc2VydmljZTogRWNzU2VydmljZUNvbmZpZ1xuKTogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl1bbnVtYmVyXVtcImNvbnRhaW5lcnNcIl0ge1xuICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogYy5uYW1lIHx8IGAke3NlcnZpY2UubmFtZX1Db250YWluZXIke2luZGV4ID4gMCA/IGluZGV4IDogXCJcIn1gLFxuICAgICAgaW1hZ2U6IGMuaW1hZ2UsXG4gICAgICBwb3J0OiBjLnBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogYy5lbnZpcm9ubWVudCxcbiAgICAgIHNlY3JldHM6IGMuc2VjcmV0cyxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IGMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIGNvbW1hbmQ6IGMuY29tbWFuZCxcbiAgICAgIGVudHJ5UG9pbnQ6IGMuZW50cnlQb2ludCxcbiAgICAgIGVzc2VudGlhbDogYy5lc3NlbnRpYWwsXG4gICAgICBoZWFsdGhDaGVjazogYy5oZWFsdGhDaGVja1xuICAgIH0pKTtcbiAgfVxuICAvLyBEZWZhdWx0IGNvbnRhaW5lciAobm8gcG9ydCA9IHdvcmtlcilcbiAgcmV0dXJuIFt7IG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgIH1dO1xufVxuXG4vKipcbiAqIFJlc29sdmVkIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmb3IgYW4gRUNTIHNlcnZpY2UuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZSB8IHVuZGVmaW5lZDtcbiAgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbWF4Q2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmcm9tIHNlcnZpY2UgcHJvcHMuXG4gKiBIYW5kbGVzIHRoZSB0aHJlZSBjYXNlczogZXhwbGljaXQgY29uZmlnLCBkaXNhYmxlZCAoZmFsc2UpLCBvciBkZWZhdWx0ICh1bmRlZmluZWQpLlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICBzY2FsaW5nOiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIGlmIChzY2FsaW5nID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2FsaW5nVHlwZTogdW5kZWZpbmVkLFxuICAgICAgbWluQ2FwYWNpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG1heENhcGFjaXR5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGlmIChzY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgIG1pbkNhcGFjaXR5OiB1bmRlZmluZWQsXG4gICAgICBtYXhDYXBhY2l0eTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjYWxpbmdUeXBlOiBzY2FsaW5nLnNjYWxpbmdUeXBlID8/IFNjYWxpbmdUeXBlLkNQVSxcbiAgICBtaW5DYXBhY2l0eTogc2NhbGluZy5taW5DYXBhY2l0eSxcbiAgICBtYXhDYXBhY2l0eTogc2NhbGluZy5tYXhDYXBhY2l0eVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVkIExhbWJkYSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50IHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFtYmRhIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBmcm9tIHByb3BzLlxuICogSGFuZGxlcyBjb250YWluZXIgdnMgY29kZSBkZXBsb3ltZW50IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQoXG4gIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4pOiBSZXNvbHZlZExhbWJkYURlcGxveW1lbnQge1xuICBpZiAocHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb250YWluZXJcIikge1xuICAgIGlmICghKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgdGFnT3JEaWdlc3Q6IENPTVBVVEVfREVGQVVMVFMuRUNTLklNQUdFX1RBR1xuICAgICAgfSksXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0VcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcHJvcHMuY29kZSxcbiAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkhBTkRMRVIsXG4gICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBDT01QVVRFX0RFRkFVTFRTLkxBTUJEQS5SVU5USU1FXG4gIH07XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMgd2l0aCB0eXBlLXNhZmUgcmV0dXJuIHR5cGVzLlxuICpcbiAqIFRoZSBmYWN0b3J5IHVzZXMgb3ZlcmxvYWRzIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBjb21wdXRlIHR5cGUgZnJvbSBwcm9wcyxcbiAqIGVuc3VyaW5nIFR5cGVTY3JpcHQgcHJvdmlkZXMgb25seSB0aGUgcmVsZXZhbnQgbWV0aG9kcyBmb3IgZWFjaCBjb21wdXRlIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlIHdpdGggRUNTLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjcyA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqIGVjcy5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGUgd2l0aCBMYW1iZGEtc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgbGFtYmRhID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJGblwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpXG4gKiB9KSk7XG4gKiBsYW1iZGEuZ2V0RnVuY3Rpb25VcmwoKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRUMyIGNvbXB1dGUgLSByZXR1cm5zIEVjMkNvbXB1dGUgd2l0aCBFQzItc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgZWMyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbnN0YW5jZVwiLCB7XG4gKiAgIHR5cGU6IFwiZWMyXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0My5taWNyb1wiXG4gKiB9KSk7XG4gKiBlYzIuZ2V0QXV0b1NjYWxpbmdHcm91cCgpOyAvLyBBdmFpbGFibGUgb24gRWMyQ29tcHV0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUZhY3Rvcnkge1xuICAvLyBPdmVybG9hZDogRUNTIHByb3BzIHJldHVybnMgRWNzQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUVjc0NvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEVjc0NvbXB1dGU7XG4gIC8vIE92ZXJsb2FkOiBMYW1iZGEgcHJvcHMgcmV0dXJucyBMYW1iZGFDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gTGFtYmRhQ29tcHV0ZTtcbiAgLy8gT3ZlcmxvYWQ6IEVDMiBwcm9wcyByZXR1cm5zIEVjMkNvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElFYzJDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFYzJDb21wdXRlO1xuICAvLyBJbXBsZW1lbnRhdGlvbiBzaWduYXR1cmVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBBbnlDb21wdXRlIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQW55Q29tcHV0ZSA9PiB7XG4gICAgICB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wcyk7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFwcE5hbWUgZnJvbSBBcHAgaW5zdGFuY2UgZm9yIEVDUyBjb21wdXRlXG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0VnBjKCksXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICAgICAgY29tcHV0ZVByb3BzID0ge1xuICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICBhcHBOYW1lOiBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzcGVjaWZpYyBjb21wdXRlIGNsYXNzIGJhc2VkIG9uIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgc3dpdGNoIChjb21wdXRlUHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiZWNzXCI6IHtcbiAgICAgICAgICAvLyBSZWdpc3RlciBFQ1Mgc2VydmljZXMgd2l0aCBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIENMSSBkaXNjb3ZlcnlcbiAgICAgICAgICBjb25zdCBjb2xsZWN0b3IgPSBhcHAuZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTtcbiAgICAgICAgICBjb25zdCBjbHVzdGVyTmFtZSA9IGlkO1xuICAgICAgICAgIGNvbnN0IGFwcE5hbWUgPSBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIGNvbXB1dGVQcm9wcy5zZXJ2aWNlcykge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RTZXJ2aWNlOiBNYW5pZmVzdFNlcnZpY2UgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHNlcnZpY2UubmFtZSxcbiAgICAgICAgICAgICAgY2x1c3Rlck5hbWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgZG9ja2VyZmlsZVBhdGggaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmRvY2tlcmZpbGVQYXRoID0gc2VydmljZS5kb2NrZXJmaWxlUGF0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBkb2NrZXJUYXJnZXQgaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyVGFyZ2V0KSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5kb2NrZXJUYXJnZXQgPSBzZXJ2aWNlLmRvY2tlclRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluZCBjb250YWluZXIgcG9ydCBmcm9tIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydFxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2l0aFBvcnQgPSBzZXJ2aWNlLmNvbnRhaW5lcnM/LmZpbmQoXG4gICAgICAgICAgICAgIChjKSA9PiBjLnBvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJXaXRoUG9ydD8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5jb250YWluZXJQb3J0ID0gY29udGFpbmVyV2l0aFBvcnQucG9ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWdncmVnYXRlIHNlY3JldHMgZnJvbSBhbGwgY29udGFpbmVycyAoZGVkdXBsaWNhdGVkKVxuICAgICAgICAgICAgY29uc3QgYWxsU2VjcmV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc2VydmljZS5jb250YWluZXJzID8/IFtdKSB7XG4gICAgICAgICAgICAgIGlmIChjb250YWluZXIuc2VjcmV0cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjcmV0IG9mIGNvbnRhaW5lci5zZWNyZXRzKSB7XG4gICAgICAgICAgICAgICAgICBhbGxTZWNyZXRzLmFkZChzZWNyZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbFNlY3JldHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNlY3JldHMgPSBBcnJheS5mcm9tKGFsbFNlY3JldHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHNzbVNlY3JldHNQYXRoIChleHBsaWNpdCBvciBkZXJpdmVkKVxuICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNzbVNlY3JldHNQYXRoID1cbiAgICAgICAgICAgICAgc2VydmljZS5zc21TZWNyZXRzUGF0aCA/P1xuICAgICAgICAgICAgICBgLyR7YXBwTmFtZX0vJHtjbHVzdGVyTmFtZX0vJHtzZXJ2aWNlLm5hbWV9YDtcblxuICAgICAgICAgICAgY29sbGVjdG9yLmFkZFNlcnZpY2UobWFuaWZlc3RTZXJ2aWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBFY3NDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibGFtYmRhXCI6IHtcbiAgICAgICAgICAvLyBBZGQgYXBwTmFtZSB0byBwcm9wcyBmb3IgTGFtYmRhIChuZWVkZWQgZm9yIHNlY3JldHMgcGF0aCBkZXJpdmF0aW9uKVxuICAgICAgICAgIGNvbnN0IGxhbWJkYUNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICAgIGFwcE5hbWU6IGFwcC5nZXROYW1lKClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQWx3YXlzIHJlZ2lzdGVyIExhbWJkYSB3aXRoIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgQ0xJIGRpc2NvdmVyeVxuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgTGFtYmRhcyBhcmUgZGlzY292ZXJhYmxlIGZvciBzZWNyZXRzIG1hbmFnZW1lbnQsXG4gICAgICAgICAgLy8gZXZlbiB0aG9zZSB0aGF0IGRvbid0IGN1cnJlbnRseSBoYXZlIHNlY3JldHMgY29uZmlndXJlZFxuICAgICAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGFwcC5nZXRNYW5pZmVzdENvbGxlY3RvcigpO1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0TGFtYmRhOiBNYW5pZmVzdExhbWJkYSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGlkLFxuICAgICAgICAgICAgc3NtU2VjcmV0c1BhdGg6XG4gICAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zc21TZWNyZXRzUGF0aCB8fFxuICAgICAgICAgICAgICBgLyR7bGFtYmRhQ29tcHV0ZVByb3BzLmFwcE5hbWV9L2xhbWJkYS8ke2lkfWBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzICYmXG4gICAgICAgICAgICBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cy5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYW5pZmVzdExhbWJkYS5zZWNyZXRzID0gbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbGxlY3Rvci5hZGRMYW1iZGEobWFuaWZlc3RMYW1iZGEpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFDb21wdXRlKHNjb3BlLCBpZCwgbGFtYmRhQ29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZWMyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFYzJDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IGNvbXB1dGVQcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29tcHV0ZSB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSUNvbXB1dGVQcm9wcykudHlwZSl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRUNTIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUVjc0NvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIEVDUy1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFY3NDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUVjc0NvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImVjc1wiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWNzQ2x1c3RlcjogRWNzQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUVjc0NvbXB1dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gRWNzU2VydmljZUNvbmZpZ1tdIHRvIEVjc1NlcnZpY2VQcm9wc1tdIGZvciBFY3NDbHVzdGVyXG4gICAgY29uc3Qgc2VydmljZXM6IEVjc0NsdXN0ZXJQcm9wc1tcInNlcnZpY2VzXCJdID0gcHJvcHMuc2VydmljZXMubWFwKFxuICAgICAgKHNlcnZpY2UpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IGJ1aWxkQ29udGFpbmVyQ29uZmlncyhzZXJ2aWNlKTtcbiAgICAgICAgY29uc3QgeyBzY2FsaW5nVHlwZSwgbWluQ2FwYWNpdHksIG1heENhcGFjaXR5IH0gPSByZXNvbHZlU2NhbGluZ0NvbmZpZyhcbiAgICAgICAgICBzZXJ2aWNlLnNjYWxpbmdcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHNlcnZpY2UubmFtZSxcbiAgICAgICAgICBpbWFnZTogc2VydmljZS5pbWFnZSxcbiAgICAgICAgICBjb250YWluZXJzLFxuICAgICAgICAgIGNwdTogc2VydmljZS5jcHUsXG4gICAgICAgICAgbWVtb3J5TGltaXRNaUI6IHNlcnZpY2UubWVtb3J5TGltaXRNaUIsXG4gICAgICAgICAgZGVzaXJlZENvdW50OiBzZXJ2aWNlLmRlc2lyZWRDb3VudCxcbiAgICAgICAgICBzY2FsaW5nVHlwZSxcbiAgICAgICAgICBtaW5DYXBhY2l0eSxcbiAgICAgICAgICBtYXhDYXBhY2l0eSxcbiAgICAgICAgICByb3V0aW5nOiBzZXJ2aWNlLnJvdXRpbmcsXG4gICAgICAgICAgdGFza1JvbGVJbmxpbmVQb2xpY2llczogc2VydmljZS50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzOiBzZXJ2aWNlLnRhc2tSb2xlTWFuYWdlZFBvbGljaWVzLFxuICAgICAgICAgIGNvbm5lY3Rpb25zOiBzZXJ2aWNlLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIGNhcGFjaXR5UHJvdmlkZXI6IHNlcnZpY2UuY2FwYWNpdHlQcm92aWRlcixcbiAgICAgICAgICBlYzJDb25maWc6IHNlcnZpY2UuZWMyQ29uZmlnLFxuICAgICAgICAgIHNzbVNlY3JldHNQYXRoOiBzZXJ2aWNlLnNzbVNlY3JldHNQYXRoLFxuICAgICAgICAgIGRvY2tlclRhcmdldDogc2VydmljZS5kb2NrZXJUYXJnZXRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQnVpbGQgY2x1c3RlciBjb25maWdcbiAgICBjb25zdCBjbHVzdGVyOiBFY3NDbHVzdGVyUHJvcHNbXCJjbHVzdGVyXCJdID0gcHJvcHMuY2x1c3RlclxuICAgICAgPyB7XG4gICAgICAgICAgZG9tYWluOiBwcm9wcy5jbHVzdGVyLmRvbWFpbixcbiAgICAgICAgICBsb2FkQmFsYW5jZXI6IHByb3BzLmNsdXN0ZXIubG9hZEJhbGFuY2VyLFxuICAgICAgICAgIGRpcmVjdEFjY2VzczogcHJvcHMuY2x1c3Rlci5kaXJlY3RBY2Nlc3MsXG4gICAgICAgICAgZG9tYWluQ29uZmlnOiBwcm9wcy5jbHVzdGVyLmRvbWFpbkNvbmZpZ1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVjc1Byb3BzOiBFY3NDbHVzdGVyUHJvcHMgPSB7XG4gICAgICBjbHVzdGVyTmFtZTogYCR7aWR9Q2x1c3RlcmAsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBlY3JSZXBvc2l0b3J5OiBwcm9wcy5lY3JSZXBvc2l0b3J5IHx8IENPTVBVVEVfREVGQVVMVFMuRUNTLkZBTExCQUNLX0lNQUdFLFxuICAgICAgY2x1c3RlcixcbiAgICAgIHNlcnZpY2VzXG4gICAgfTtcblxuICAgIHRoaXMuZWNzQ2x1c3RlciA9IG5ldyBFY3NDbHVzdGVyKHNjb3BlLCBgJHtpZH1FY3NgLCBlY3NQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZWNzQ2x1c3Rlci5jb25uZWN0aW9ucztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEVDUyBjbHVzdGVyLiAqL1xuICBnZXRDbHVzdGVyKCk6IElDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldENsdXN0ZXIoKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgaWYgb25lIHdhcyBjcmVhdGVkLiAqL1xuICBnZXRMb2FkQmFsYW5jZXIoKTogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldExvYWRCYWxhbmNlcigpO1xuICB9XG5cbiAgLyoqIEdldCBhIHNwZWNpZmljIHNlcnZpY2UgYnkgbmFtZS4gKi9cbiAgZ2V0U2VydmljZShuYW1lOiBzdHJpbmcpOiBJQmFzZVNlcnZpY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0U2VydmljZShuYW1lKTtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLiAqL1xuICBnZXRBbGxTZXJ2aWNlcygpOiBJQmFzZVNlcnZpY2VbXSB7XG4gICAgY29uc3Qgc2VydmljZXNNYXAgPSB0aGlzLmVjc0NsdXN0ZXIuZ2V0U2VydmljZXMoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXJ2aWNlc01hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzZWN1cml0eSBncm91cCBmb3IgdGhlIGNsdXN0ZXIuICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAge1xuICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgc2VjdXJpdHkgZ3JvdXAgZnJvbSBjb25uZWN0aW9uc1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3VwcztcbiAgICBpZiAoc2VjdXJpdHlHcm91cHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZWN1cml0eSBncm91cHMgZm91bmQgZm9yIEVDUyBjbHVzdGVyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2VjdXJpdHlHcm91cHNbMF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBBTEIgbGlzdGVuZXIgaWYgdGhpcyBpcyBhbiBFQ1MgY29tcHV0ZSB3aXRoIEFMQi5cbiAgICovXG4gIGdldExpc3RlbmVyKCk6IEFwcGxpY2F0aW9uTGlzdGVuZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0TGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgRUNTIGNsdXN0ZXIgY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0RWNzQ2x1c3RlcigpOiBFY3NDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBlY3M6RXhlY3V0ZUNvbW1hbmQgcGVybWlzc2lvbiBmb3IgRUNTIHNlcnZpY2VzLlxuICAgKi9cbiAgZ3JhbnRFeGVjdXRlQ29tbWFuZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW1wiZWNzOkV4ZWN1dGVDb21tYW5kXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYW1iZGEgY29tcHV0ZSB3cmFwcGVyIGltcGxlbWVudGluZyBJTGFtYmRhQ29tcHV0ZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gTGFtYmRhLXNwZWNpZmljIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUNvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTGFtYmRhQ29tcHV0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlVHlwZSA9IFwibGFtYmRhXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElMYW1iZGFDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBoYW5kbGVyLCBydW50aW1lIH0gPSByZXNvbHZlTGFtYmRhRGVwbG95bWVudChwcm9wcyk7XG5cbiAgICAvLyBDb252ZXJ0IHByZXNlbmNlLWJhc2VkIGZ1bmN0aW9uVXJsIGNvbmZpZyB0byBsZWdhY3kgYm9vbGVhbiBmb3JtYXRcbiAgICBjb25zdCBmdW5jdGlvblVybENvbmZpZyA9IHByb3BzLmZ1bmN0aW9uVXJsO1xuICAgIGNvbnN0IGVuYWJsZUZ1bmN0aW9uVXJsID1cbiAgICAgIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSB1bmRlZmluZWQgJiYgZnVuY3Rpb25VcmxDb25maWcgIT09IGZhbHNlO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQXV0aFR5cGUgPVxuICAgICAgZW5hYmxlRnVuY3Rpb25VcmwgJiYgdHlwZW9mIGZ1bmN0aW9uVXJsQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gZnVuY3Rpb25VcmxDb25maWcuYXV0aFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb3JzID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmNvcnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxJbnZva2VNb2RlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmludm9rZU1vZGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBsYW1iZGFQcm9wcyA9IHtcbiAgICAgIGNvZGUsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBydW50aW1lLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBmdW5jdGlvblVybEludm9rZU1vZGUsXG4gICAgICBzY2hlZHVsZUV4cHJlc3Npb246IHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICAgIHNlY3JldHM6IHByb3BzLnNlY3JldHMsXG4gICAgICBzc21TZWNyZXRzUGF0aDogcHJvcHMuc3NtU2VjcmV0c1BhdGgsXG4gICAgICBzZWNyZXRzSW1wb3J0OiBwcm9wcy5zZWNyZXRzSW1wb3J0LFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgYXBwTmFtZTogcHJvcHMuYXBwTmFtZSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogaWRcbiAgICB9O1xuXG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYCR7aWR9TGFtYmRhYCwgbGFtYmRhUHJvcHMpO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmxhbWJkYUZ1bmN0aW9uLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucyB1c2luZyB0aGUgdW5pZmllZCBjb25uZWN0b3IgaW50ZXJmYWNlXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zICYmIHByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3NDb25uZWN0aW9ucyhcbiAgICAgICAgICBwcm9wcy5jb25uZWN0aW9ucyxcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uLCAvLyBJR3JhbnRhYmxlIChleGVjdXRpb24gcm9sZSlcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uIC8vIElDb25uZWN0YWJsZSAoc2VjdXJpdHkgZ3JvdXApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBwcm9jZXNzIGNvbm5lY3Rpb25zIGZvciBMYW1iZGEgJyR7aWR9JzogJHtcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIExhbWJkYSBmdW5jdGlvbiBieSBuYW1lLlxuICAgKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGZ1bmN0aW9uLCBuYW1lIGlzIGlnbm9yZWQuXG4gICAqL1xuICBnZXRGdW5jdGlvbihfbmFtZT86IHN0cmluZyk6IElGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb247XG4gIH1cblxuICAvKiogR2V0IGFsbCBMYW1iZGEgZnVuY3Rpb25zLiAqL1xuICBnZXRBbGxGdW5jdGlvbnMoKTogSUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbdGhpcy5sYW1iZGFGdW5jdGlvbl07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdW5jdGlvbiBVUkwgZm9yIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ2V0RnVuY3Rpb25VcmwoX25hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmdldEZ1bmN0aW9uVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IElHcmFudGFibGUsIF9mdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb24uZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWN1cml0eSBncm91cCBmb3IgVlBDLWVuYWJsZWQgTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIExhbWJkYSBpcyBub3QgVlBDLWVuYWJsZWQuXG4gICAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWN1cml0eUdyb3VwcyA9IHRoaXMuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHM7XG4gICAgcmV0dXJuIHNlY3VyaXR5R3JvdXBzLmxlbmd0aCA+IDAgPyBzZWN1cml0eUdyb3Vwc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIGNvbnN0cnVjdC5cbiAgICovXG4gIGdldExhbWJkYUZ1bmN0aW9uKCk6IExhbWJkYUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEVDMiBjb21wdXRlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElFYzJDb21wdXRlLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBFQzItc3BlY2lmaWMgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRWMyQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElFYzJDb21wdXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVUeXBlID0gXCJlYzJcIiBhcyBjb25zdDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGVjMkluc3RhbmNlOiBFYzJJbnN0YW5jZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUVjMkNvbXB1dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBlbmFibGVTU0ggPSBwcm9wcy5zc2ggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zc2ggIT09IGZhbHNlO1xuXG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7aWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDMi5JTlNUQU5DRV9UWVBFLFxuICAgICAgZW5hYmxlU1NILFxuICAgICAgdXNlckRhdGE6IHByb3BzLnVzZXJEYXRhLFxuICAgICAgbWFjaGluZUltYWdlOiBwcm9wcy5tYWNoaW5lSW1hZ2UsXG4gICAgICBtaW5DYXBhY2l0eTogcHJvcHMubWluQ2FwYWNpdHkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQzIuTUlOX0NBUEFDSVRZLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5IHx8IENPTVBVVEVfREVGQVVMVFMuRUMyLk1BWF9DQVBBQ0lUWSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgc3BvdENhcGFjaXR5UGVyY2VudGFnZTogcHJvcHMuc3BvdENhcGFjaXR5UGVyY2VudGFnZVxuICAgIH07XG5cbiAgICB0aGlzLmVjMkluc3RhbmNlID0gbmV3IEVjMkluc3RhbmNlKHNjb3BlLCBgJHtpZH1FYzJgLCBlYzJQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZWMySW5zdGFuY2UuY29ubmVjdGlvbnM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBBdXRvIFNjYWxpbmcgR3JvdXAuICovXG4gIGdldEF1dG9TY2FsaW5nR3JvdXAoKTogSUF1dG9TY2FsaW5nR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlLmdldEF1dG9TY2FsaW5nR3JvdXAoKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwLiAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5lYzJJbnN0YW5jZS5hc2dTZWN1cml0eUdyb3VwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBFQzIgaW5zdGFuY2UgY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0RWMySW5zdGFuY2UoKTogRWMySW5zdGFuY2Uge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlIGd1YXJkcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB7IGlzQ29tcHV0ZSwgaXNFY3NDb21wdXRlLCBpc0xhbWJkYUNvbXB1dGUsIGlzRWMyQ29tcHV0ZSB9O1xuZXhwb3J0IHR5cGUgeyBJRWNzQ29tcHV0ZSwgSUxhbWJkYUNvbXB1dGUsIElFYzJDb21wdXRlLCBBbnlDb21wdXRlIH07XG4iXX0=