@fjall/components-infrastructure 0.88.3 → 0.89.2

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/dist/lib/app.d.ts +33 -10
  3. package/dist/lib/app.js +79 -36
  4. package/dist/lib/aspects/index.d.ts +1 -0
  5. package/dist/lib/aspects/index.js +6 -0
  6. package/dist/lib/config/aws/accountAuditRole.d.ts +20 -0
  7. package/dist/lib/config/aws/accountAuditRole.js +38 -0
  8. package/dist/lib/config/aws/accountMonitoringRole.d.ts +22 -0
  9. package/dist/lib/config/aws/accountMonitoringRole.js +133 -0
  10. package/dist/lib/config/aws/cloudTrail.d.ts +0 -3
  11. package/dist/lib/config/aws/cloudTrail.js +2 -2
  12. package/dist/lib/config/aws/disasterRecovery.js +53 -20
  13. package/dist/lib/config/aws/ecrDefaultImage.js +4 -3
  14. package/dist/lib/config/aws/index.d.ts +4 -0
  15. package/dist/lib/config/aws/index.js +5 -1
  16. package/dist/lib/config/aws/oidcConnector.d.ts +8 -0
  17. package/dist/lib/config/aws/oidcConnector.js +46 -0
  18. package/dist/lib/config/aws/platform.d.ts +2 -0
  19. package/dist/lib/config/aws/platform.js +6 -0
  20. package/dist/lib/config/index.d.ts +2 -0
  21. package/dist/lib/config/index.js +21 -0
  22. package/dist/lib/patterns/aws/account.js +22 -10
  23. package/dist/lib/patterns/aws/cdn.d.ts +19 -40
  24. package/dist/lib/patterns/aws/cdn.js +21 -17
  25. package/dist/lib/patterns/aws/compute.d.ts +9 -720
  26. package/dist/lib/patterns/aws/compute.js +27 -432
  27. package/dist/lib/patterns/aws/computeEc2.d.ts +67 -0
  28. package/dist/lib/patterns/aws/computeEc2.js +46 -0
  29. package/dist/lib/patterns/aws/computeEcs.d.ts +446 -0
  30. package/dist/lib/patterns/aws/computeEcs.js +246 -0
  31. package/dist/lib/patterns/aws/computeLambda.d.ts +220 -0
  32. package/dist/lib/patterns/aws/computeLambda.js +147 -0
  33. package/dist/lib/patterns/aws/database.d.ts +7 -87
  34. package/dist/lib/patterns/aws/database.js +15 -38
  35. package/dist/lib/patterns/aws/domainDelegation.d.ts +8 -0
  36. package/dist/lib/patterns/aws/domainDelegation.js +54 -0
  37. package/dist/lib/patterns/aws/domainFactory.d.ts +8 -0
  38. package/dist/lib/patterns/aws/domainFactory.js +23 -0
  39. package/dist/lib/patterns/aws/index.d.ts +4 -1
  40. package/dist/lib/patterns/aws/index.js +6 -2
  41. package/dist/lib/patterns/aws/interfaces/cdn.d.ts +26 -0
  42. package/dist/lib/patterns/aws/interfaces/cdn.js +14 -0
  43. package/dist/lib/patterns/aws/interfaces/connector.d.ts +4 -181
  44. package/dist/lib/patterns/aws/interfaces/connector.js +16 -113
  45. package/dist/lib/patterns/aws/interfaces/domain.d.ts +2 -0
  46. package/dist/lib/patterns/aws/interfaces/domain.js +6 -0
  47. package/dist/lib/patterns/aws/interfaces/index.d.ts +2 -0
  48. package/dist/lib/patterns/aws/interfaces/index.js +5 -2
  49. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +9 -6
  50. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  51. package/dist/lib/patterns/aws/network.js +6 -9
  52. package/dist/lib/patterns/aws/organisation.d.ts +4 -2
  53. package/dist/lib/patterns/aws/organisation.js +21 -8
  54. package/dist/lib/patterns/aws/payload.js +21 -12
  55. package/dist/lib/patterns/aws/storage.d.ts +3 -2
  56. package/dist/lib/patterns/aws/storage.js +1 -1
  57. package/dist/lib/resources/aws/audit/auditRole.js +4 -4
  58. package/dist/lib/resources/aws/audit/index.d.ts +1 -0
  59. package/dist/lib/resources/aws/audit/index.js +6 -0
  60. package/dist/lib/resources/aws/backup/backupPlan.js +3 -2
  61. package/dist/lib/resources/aws/backup/backupVault.js +5 -3
  62. package/dist/lib/resources/aws/base/awsStack.d.ts +4 -2
  63. package/dist/lib/resources/aws/base/awsStack.js +8 -2
  64. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +14 -0
  65. package/dist/lib/resources/aws/cdn/cloudFront.js +52 -18
  66. package/dist/lib/resources/aws/compute/ec2.js +18 -22
  67. package/dist/lib/resources/aws/compute/ecs.d.ts +23 -10
  68. package/dist/lib/resources/aws/compute/ecs.js +121 -64
  69. package/dist/lib/resources/aws/compute/index.d.ts +1 -0
  70. package/dist/lib/resources/aws/compute/index.js +2 -1
  71. package/dist/lib/resources/aws/compute/lambda.d.ts +0 -2
  72. package/dist/lib/resources/aws/compute/lambda.js +12 -27
  73. package/dist/lib/resources/aws/database/dynamodb.js +3 -13
  74. package/dist/lib/resources/aws/database/index.d.ts +8 -2
  75. package/dist/lib/resources/aws/database/index.js +19 -3
  76. package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -3
  77. package/dist/lib/resources/aws/database/rdsAurora.js +32 -68
  78. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +6 -6
  79. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +25 -29
  80. package/dist/lib/resources/aws/database/rdsDefaults.d.ts +11 -0
  81. package/dist/lib/resources/aws/database/rdsDefaults.js +15 -0
  82. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +39 -0
  83. package/dist/lib/resources/aws/database/rdsHelpers.js +75 -0
  84. package/dist/lib/resources/aws/database/rdsInstance.d.ts +7 -8
  85. package/dist/lib/resources/aws/database/rdsInstance.js +40 -84
  86. package/dist/lib/resources/aws/database/rdsProxyOutput.d.ts +7 -0
  87. package/dist/lib/resources/aws/database/rdsProxyOutput.js +18 -0
  88. package/dist/lib/resources/aws/iam/index.d.ts +0 -1
  89. package/dist/lib/resources/aws/iam/index.js +1 -2
  90. package/dist/lib/resources/aws/index.d.ts +0 -1
  91. package/dist/lib/resources/aws/index.js +1 -2
  92. package/dist/lib/resources/aws/logging/cloudTrail.js +13 -3
  93. package/dist/lib/resources/aws/logging/index.d.ts +2 -0
  94. package/dist/lib/resources/aws/logging/index.js +19 -0
  95. package/dist/lib/resources/aws/messaging/index.d.ts +3 -2
  96. package/dist/lib/resources/aws/messaging/index.js +4 -3
  97. package/dist/lib/resources/aws/messaging/sqs.js +14 -11
  98. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -2
  99. package/dist/lib/resources/aws/messaging/utils.js +3 -4
  100. package/dist/lib/resources/aws/monitoring/index.d.ts +0 -1
  101. package/dist/lib/resources/aws/monitoring/index.js +4 -17
  102. package/dist/lib/resources/aws/networking/domain.d.ts +13 -0
  103. package/dist/lib/resources/aws/networking/domain.js +102 -0
  104. package/dist/lib/resources/aws/networking/domainCertificate.d.ts +13 -0
  105. package/dist/lib/resources/aws/networking/domainCertificate.js +28 -0
  106. package/dist/lib/resources/aws/networking/hostedZone.d.ts +28 -0
  107. package/dist/lib/resources/aws/networking/hostedZone.js +150 -0
  108. package/dist/lib/resources/aws/networking/index.d.ts +4 -0
  109. package/dist/lib/resources/aws/networking/index.js +5 -1
  110. package/dist/lib/resources/aws/networking/ipamPool.js +57 -31
  111. package/dist/lib/resources/aws/networking/securityGroup.d.ts +5 -0
  112. package/dist/lib/resources/aws/networking/securityGroup.js +14 -0
  113. package/dist/lib/resources/aws/networking/vpc.js +9 -4
  114. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +17 -0
  115. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +66 -0
  116. package/dist/lib/resources/aws/organisation/index.d.ts +1 -0
  117. package/dist/lib/resources/aws/organisation/index.js +4 -2
  118. package/dist/lib/resources/aws/secrets/index.d.ts +0 -1
  119. package/dist/lib/resources/aws/secrets/index.js +1 -2
  120. package/dist/lib/resources/aws/storage/ecr.d.ts +0 -1
  121. package/dist/lib/resources/aws/storage/ecr.js +5 -5
  122. package/dist/lib/resources/aws/storage/s3.d.ts +3 -3
  123. package/dist/lib/resources/aws/storage/s3.js +1 -1
  124. package/dist/lib/resources/aws/utilities/index.d.ts +5 -0
  125. package/dist/lib/resources/aws/utilities/index.js +22 -0
  126. package/dist/lib/utils/backupTierMapping.d.ts +11 -0
  127. package/dist/lib/utils/backupTierMapping.js +17 -0
  128. package/dist/lib/utils/capitaliseString.d.ts +1 -12
  129. package/dist/lib/utils/capitaliseString.js +8 -28
  130. package/dist/lib/utils/connections.d.ts +46 -0
  131. package/dist/lib/utils/connections.js +159 -0
  132. package/dist/lib/utils/connector.d.ts +183 -0
  133. package/dist/lib/utils/connector.js +117 -0
  134. package/dist/lib/utils/databaseTypes.d.ts +85 -0
  135. package/dist/lib/utils/databaseTypes.js +34 -0
  136. package/dist/lib/utils/dnsRecords.d.ts +4 -0
  137. package/dist/lib/utils/dnsRecords.js +108 -0
  138. package/dist/lib/utils/domainTypes.d.ts +37 -0
  139. package/dist/lib/utils/domainTypes.js +10 -0
  140. package/dist/lib/utils/env.d.ts +42 -0
  141. package/dist/lib/utils/env.js +122 -0
  142. package/dist/lib/utils/getConfig.d.ts +0 -5
  143. package/dist/lib/utils/getConfig.js +42 -19
  144. package/dist/lib/utils/index.d.ts +7 -0
  145. package/dist/lib/utils/index.js +8 -1
  146. package/dist/lib/utils/removalPolicy.d.ts +2 -0
  147. package/dist/lib/utils/removalPolicy.js +16 -0
  148. package/dist/lib/utils/standardTagsAspect.d.ts +4 -0
  149. package/dist/lib/utils/standardTagsAspect.js +8 -8
  150. package/dist/lib/utils/vpcUtils.d.ts +14 -0
  151. package/dist/lib/utils/vpcUtils.js +28 -0
  152. package/package.json +7 -6
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fjall
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/lib/app.d.ts CHANGED
@@ -12,6 +12,7 @@ import { type AnyMessaging } from "./patterns/aws/messaging";
12
12
  import { type AnyCompute } from "./patterns/aws/compute";
13
13
  import { type Storage, type StorageFactoryFn } from "./patterns/aws/storage";
14
14
  import { type AnyPattern } from "./patterns/aws/pattern";
15
+ import { type BackupTier } from "./utils/backupTierMapping";
15
16
  import { type ResourceInventory } from "./aspects/resourceInventory";
16
17
  import { type ManifestCollector } from "./utils/manifestWriter";
17
18
  /**
@@ -43,6 +44,23 @@ export interface IAppOptions {
43
44
  network?: INetworkProps | false | {
44
45
  useExisting: string;
45
46
  };
47
+ /**
48
+ * Backup configuration for automatic AWS Backup enrolment.
49
+ * - Object with tier: Tags all resources with `fjall:disasterRecovery:tier`
50
+ * - false: Explicitly disabled (no backup tag)
51
+ */
52
+ backup?: {
53
+ tier: BackupTier;
54
+ } | false;
55
+ /**
56
+ * Tunnel configuration for secure database access via SSM Session Manager.
57
+ * - true or {}: Create bastion with default t4g.micro instance
58
+ * - { instanceType: string }: Create bastion with custom instance type
59
+ * - false: Explicitly disabled (no bastion)
60
+ */
61
+ tunnel?: {
62
+ instanceType?: string;
63
+ } | boolean;
46
64
  }
47
65
  /**
48
66
  * The basic corner-stone of all Fjall-hosted applications.
@@ -58,15 +76,25 @@ export declare class App extends CdkApp {
58
76
  private vpc?;
59
77
  private additionalVpcs;
60
78
  private defaultEcr;
61
- private defaultMonitoringRole;
62
79
  private defaultAuditRole;
63
80
  private auditRoleExternalId?;
81
+ private bastion?;
64
82
  private networkDisabled;
65
83
  private globalTags;
66
84
  private aspectApplied;
67
85
  private resourceInventory?;
68
86
  private manifestCollector;
69
87
  private constructor();
88
+ /**
89
+ * Apply backup tier tag to all resources in the app.
90
+ * Maps tier names to AWS Backup plan tag values.
91
+ */
92
+ private applyBackupTag;
93
+ /**
94
+ * Initialise the tunnel bastion in the network stack.
95
+ * Creates a minimal EC2 instance for SSM port forwarding to databases.
96
+ */
97
+ private initialiseTunnel;
70
98
  /**
71
99
  * Initialise the network (VPC) for this application.
72
100
  */
@@ -181,14 +209,6 @@ export declare class App extends CdkApp {
181
209
  * it will be created.
182
210
  */
183
211
  getDefaultContainerRegistry(): Ecr;
184
- /**
185
- * Create a cross-account monitoring role in the Network stack that allows
186
- * the Fjall webapp to query CloudWatch metrics and ECS status.
187
- *
188
- * @param webappAccountId - Optional AWS account ID of the Fjall webapp. Defaults to configured platform account.
189
- * @returns {Role} The created monitoring role
190
- */
191
- createMonitoringRole(webappAccountId?: string): Role;
192
212
  /**
193
213
  * Create a cross-account audit role in the Network stack that allows
194
214
  * the Fjall platform to use CloudQuery for comprehensive AWS resource auditing.
@@ -213,7 +233,6 @@ export declare class App extends CdkApp {
213
233
  private generateAuditExternalId;
214
234
  /**
215
235
  * Add a compute resource to the default compute stack using the factory pattern.
216
- * Automatically creates monitoring role if not already created.
217
236
  *
218
237
  * Returns the appropriate compute type based on the factory configuration:
219
238
  * - EcsCompute for type: "ecs"
@@ -262,6 +281,10 @@ export declare class App extends CdkApp {
262
281
  * cache.getTableName(); // Available
263
282
  */
264
283
  addDatabase<T extends AnyDatabase>(fn: (app: App, scope: Construct) => T): T;
284
+ /**
285
+ * Type guard for IConnectable — checks if a construct has a connections property.
286
+ */
287
+ private isConnectable;
265
288
  /**
266
289
  * Add a storage resource (S3) to the default storage stack using the factory pattern.
267
290
  *
package/dist/lib/app.js CHANGED
@@ -3,19 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.App = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const vpc_1 = require("./resources/aws/networking/vpc");
6
+ const aws_cdk_lib_2 = require("aws-cdk-lib");
7
+ const ec2_1 = require("./resources/aws/compute/ec2");
6
8
  const resources_1 = require("./resources");
7
9
  const ecr_1 = require("./resources/aws/storage/ecr");
8
10
  const network_1 = require("./patterns/aws/network");
9
11
  const standardTagsAspect_1 = require("./utils/standardTagsAspect");
12
+ const backupTierMapping_1 = require("./utils/backupTierMapping");
10
13
  const crypto_1 = require("crypto");
11
14
  const getConfig_1 = require("./utils/getConfig");
12
- const monitoringRole_1 = require("./resources/aws/monitoring/monitoringRole");
13
- const monitoring_1 = require("./config/monitoring");
14
15
  const auditRole_1 = require("./resources/aws/audit/auditRole");
15
16
  const audit_1 = require("./config/audit");
16
17
  const validationLogger_1 = require("./utils/validationLogger");
17
18
  const manifestWriter_1 = require("./utils/manifestWriter");
18
19
  const capitaliseString_1 = require("./utils/capitaliseString");
20
+ const COST_ALLOCATION_ENVIRONMENT_TAG = "fjall:costAllocation:environment";
21
+ const COST_ALLOCATION_SERVICE_TAG = "fjall:costAllocation:service";
19
22
  /**
20
23
  * The basic corner-stone of all Fjall-hosted applications.
21
24
  * This class is a singleton and should be used to create and manage
@@ -35,6 +38,10 @@ class App extends aws_cdk_lib_1.App {
35
38
  // Initialise manifest collector for build-time service discovery
36
39
  this.manifestCollector = (0, manifestWriter_1.getManifestCollector)(this.name);
37
40
  this.initialiseStandardTags();
41
+ // Apply backup tier tag if configured
42
+ if (options?.backup && typeof options.backup === "object") {
43
+ this.applyBackupTag(options.backup.tier);
44
+ }
38
45
  // Initialise network immediately if configured
39
46
  if (options?.network === false) {
40
47
  this.networkDisabled = true;
@@ -42,6 +49,49 @@ class App extends aws_cdk_lib_1.App {
42
49
  else if (options?.network) {
43
50
  this.initialiseNetwork(options.network);
44
51
  }
52
+ // Initialise tunnel bastion if configured
53
+ if (options?.tunnel) {
54
+ this.initialiseTunnel(options.tunnel);
55
+ }
56
+ }
57
+ /**
58
+ * Apply backup tier tag to all resources in the app.
59
+ * Maps tier names to AWS Backup plan tag values.
60
+ */
61
+ applyBackupTag(tier) {
62
+ this.globalTags[backupTierMapping_1.BACKUP_TIER_TAG_KEY] = backupTierMapping_1.BACKUP_TIER_TAG_MAP[tier];
63
+ }
64
+ /**
65
+ * Initialise the tunnel bastion in the network stack.
66
+ * Creates a minimal EC2 instance for SSM port forwarding to databases.
67
+ */
68
+ initialiseTunnel(config) {
69
+ if (this.networkDisabled || !this.vpc) {
70
+ throw new Error("Tunnel requires a network. Configure network before enabling tunnel.");
71
+ }
72
+ const instanceType = typeof config === "object" && config.instanceType
73
+ ? config.instanceType
74
+ : "t4g.micro";
75
+ const networkStack = this.getDefaultNetworkStack();
76
+ const bastionId = `${this.stackPrefix}Bastion`;
77
+ this.bastion = new ec2_1.Ec2Instance(networkStack.getStack(), bastionId, {
78
+ serviceName: `${this.stackPrefix}Bastion`,
79
+ instanceType,
80
+ vpc: this.vpc,
81
+ enableSSH: false,
82
+ minCapacity: 1,
83
+ maxCapacity: 1
84
+ });
85
+ networkStack.addConstruct(this.bastion);
86
+ const outputPrefix = (0, capitaliseString_1.toPascalCase)(this.name);
87
+ new aws_cdk_lib_2.CfnOutput(networkStack.getStack(), `${outputPrefix}BastionInstanceId`, {
88
+ value: this.bastion.getAutoScalingGroup().autoScalingGroupName,
89
+ description: "Bastion ASG name for SSM tunnel discovery"
90
+ });
91
+ new aws_cdk_lib_2.CfnOutput(networkStack.getStack(), `${outputPrefix}BastionSecurityGroupId`, {
92
+ value: this.bastion.asgSecurityGroup.securityGroupId,
93
+ description: "Bastion security group ID"
94
+ });
45
95
  }
46
96
  /**
47
97
  * Initialise the network (VPC) for this application.
@@ -90,9 +140,7 @@ class App extends aws_cdk_lib_1.App {
90
140
  * const app = App.getApp(appName, { network: false });
91
141
  */
92
142
  static getApp(name, options) {
93
- const app = App.getInstance(name, options);
94
- app.initialiseStandardTags();
95
- return app;
143
+ return App.getInstance(name, options);
96
144
  }
97
145
  /**
98
146
  * Get/Create the singleton instance of the App
@@ -129,6 +177,16 @@ class App extends aws_cdk_lib_1.App {
129
177
  !App.instance.networkDisabled) {
130
178
  App.instance.initialiseNetwork(options.network);
131
179
  }
180
+ // Apply backup tag if configured and not already set
181
+ if (options?.backup &&
182
+ typeof options.backup === "object" &&
183
+ !App.instance.globalTags[backupTierMapping_1.BACKUP_TIER_TAG_KEY]) {
184
+ App.instance.applyBackupTag(options.backup.tier);
185
+ }
186
+ // Initialise tunnel if configured and not already created
187
+ if (options?.tunnel && !App.instance.bastion) {
188
+ App.instance.initialiseTunnel(options.tunnel);
189
+ }
132
190
  }
133
191
  return App.instance;
134
192
  }
@@ -266,29 +324,6 @@ class App extends aws_cdk_lib_1.App {
266
324
  }
267
325
  return this.defaultEcr;
268
326
  }
269
- /**
270
- * Create a cross-account monitoring role in the Network stack that allows
271
- * the Fjall webapp to query CloudWatch metrics and ECS status.
272
- *
273
- * @param webappAccountId - Optional AWS account ID of the Fjall webapp. Defaults to configured platform account.
274
- * @returns {Role} The created monitoring role
275
- */
276
- createMonitoringRole(webappAccountId) {
277
- if (!this.defaultMonitoringRole) {
278
- const networkStack = this.getDefaultNetworkStack();
279
- const accountId = webappAccountId || monitoring_1.FJALL_MONITORING_CONFIG.webappAwsAccountId;
280
- const role = monitoringRole_1.default.build(`${this.stackPrefix}MonitoringRole`, {
281
- webappAccountId: accountId,
282
- appName: this.name,
283
- roleNamePrefix: monitoring_1.FJALL_MONITORING_CONFIG.roleNamePrefix,
284
- rolePath: monitoring_1.FJALL_MONITORING_CONFIG.rolePath
285
- })(this, networkStack.getStack());
286
- networkStack.addConstruct(role);
287
- this.defaultMonitoringRole = role;
288
- return role;
289
- }
290
- return this.defaultMonitoringRole;
291
- }
292
327
  /**
293
328
  * Create a cross-account audit role in the Network stack that allows
294
329
  * the Fjall platform to use CloudQuery for comprehensive AWS resource auditing.
@@ -335,7 +370,6 @@ class App extends aws_cdk_lib_1.App {
335
370
  }
336
371
  /**
337
372
  * Add a compute resource to the default compute stack using the factory pattern.
338
- * Automatically creates monitoring role if not already created.
339
373
  *
340
374
  * Returns the appropriate compute type based on the factory configuration:
341
375
  * - EcsCompute for type: "ecs"
@@ -359,10 +393,6 @@ class App extends aws_cdk_lib_1.App {
359
393
  * worker.getFunction("process"); // Available on LambdaCompute
360
394
  */
361
395
  addCompute(fn) {
362
- // Auto-create monitoring role when compute is added
363
- if (!this.defaultMonitoringRole) {
364
- this.createMonitoringRole();
365
- }
366
396
  const computeStack = this.getDefaultComputeStack();
367
397
  const construct = fn(this, computeStack.getStack());
368
398
  computeStack.addConstruct(construct);
@@ -399,8 +429,21 @@ class App extends aws_cdk_lib_1.App {
399
429
  const databaseStack = this.getDefaultDatabaseStack();
400
430
  const databaseConstruct = fn(this, databaseStack.getStack());
401
431
  databaseStack.addConstruct(databaseConstruct);
432
+ // Wire bastion → database security group for tunnel access
433
+ if (this.bastion && this.isConnectable(databaseConstruct)) {
434
+ databaseConstruct.connections.allowDefaultPortFrom(this.bastion);
435
+ }
402
436
  return databaseConstruct;
403
437
  }
438
+ /**
439
+ * Type guard for IConnectable — checks if a construct has a connections property.
440
+ */
441
+ isConnectable(construct) {
442
+ return (typeof construct === "object" &&
443
+ construct !== null &&
444
+ "connections" in construct &&
445
+ typeof construct.connections === "object");
446
+ }
404
447
  /**
405
448
  * Add a storage resource (S3) to the default storage stack using the factory pattern.
406
449
  *
@@ -565,8 +608,8 @@ class App extends aws_cdk_lib_1.App {
565
608
  initialiseStandardTags() {
566
609
  const config = (0, getConfig_1.getConfig)();
567
610
  this.globalTags = {
568
- "fjall:costAllocation:environment": config.environment,
569
- "fjall:costAllocation:service": this.name
611
+ [COST_ALLOCATION_ENVIRONMENT_TAG]: config.environment,
612
+ [COST_ALLOCATION_SERVICE_TAG]: this.name
570
613
  };
571
614
  }
572
615
  /**
@@ -648,4 +691,4 @@ class App extends aws_cdk_lib_1.App {
648
691
  exports.App = App;
649
692
  App.instance = null;
650
693
  exports.default = App;
651
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBR3JELDJDQUF1QztBQUN2QyxxREFBbUU7QUFFbkUsb0RBSWdDO0FBTWhDLG1FQUFnRTtBQUNoRSxtQ0FBcUM7QUFLckMsaURBQThDO0FBQzlDLDhFQUE4RTtBQUM5RSxvREFBOEQ7QUFDOUQsK0RBQStEO0FBQy9ELDBDQUFvRDtBQUNwRCwrREFBdUQ7QUFDdkQsMkRBSWdDO0FBQ2hDLCtEQUFpRTtBQStCakU7Ozs7R0FJRztBQUNILE1BQWEsR0FBSSxTQUFRLGlCQUFNO0lBb0I3QixZQUFvQixJQUFhLEVBQUUsT0FBcUI7UUFDdEQsS0FBSyxFQUFFLENBQUM7UUFmRixXQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUd6QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBS3pDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTzVCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsK0JBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFBLHFDQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENB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LElBQUksQ0FBQyxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUErQjtRQUMxQywwQkFBMEI7UUFDMUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0QyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsSUFBQSw4QkFBYSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDRDQUE0QztZQUM1QyxNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELDhCQUFXLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQTl1Qkgsa0JBK3VCQztBQTl1QmdCLFlBQVEsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0FBZ3ZCN0Msa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwIGFzIENka0FwcCxcbiAgQXNwZWN0cyxcbiAgVGFncyxcbiAgdHlwZSBTdGFnZVN5bnRoZXNpc09wdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIENsb3VkQXNzZW1ibHkgfSBmcm9tIFwiYXdzLWNkay1saWIvY3gtYXBpXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvdnBjXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBSb2xlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4vcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIEVjciwgRWNyRmFjdG9yeSB9IGZyb20gXCIuL3Jlc291cmNlcy9hd3Mvc3RvcmFnZS9lY3JcIjtcbmltcG9ydCB7IHR5cGUgQW55RGF0YWJhc2UgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgSU5ldHdvcmtQcm9wcyxcbiAgTmV0d29ya0ZhY3RvcnksXG4gIHR5cGUgTmV0d29ya1xufSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvbmV0d29ya1wiO1xuaW1wb3J0IHsgdHlwZSBDZG4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvY2RuXCI7XG5pbXBvcnQgeyB0eXBlIEFueU1lc3NhZ2luZyB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9tZXNzYWdpbmdcIjtcbmltcG9ydCB7IHR5cGUgQW55Q29tcHV0ZSB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9jb21wdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIHR5cGUgU3RvcmFnZUZhY3RvcnlGbiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEFueVBhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvcGF0dGVyblwiO1xuaW1wb3J0IHsgU3RhbmRhcmRUYWdzQXNwZWN0IH0gZnJvbSBcIi4vdXRpbHMvc3RhbmRhcmRUYWdzQXNwZWN0XCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlBc3BlY3QsXG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlcbn0gZnJvbSBcIi4vYXNwZWN0cy9yZXNvdXJjZUludmVudG9yeVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5pbXBvcnQgTW9uaXRvcmluZ1JvbGVGYWN0b3J5IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvbW9uaXRvcmluZy9tb25pdG9yaW5nUm9sZVwiO1xuaW1wb3J0IHsgRkpBTExfTU9OSVRPUklOR19DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvbW9uaXRvcmluZ1wiO1xuaW1wb3J0IEF1ZGl0Um9sZUZhY3RvcnkgZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9hdWRpdC9hdWRpdFJvbGVcIjtcbmltcG9ydCB7IEZKQUxMX0FVRElUX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZy9hdWRpdFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyXCI7XG5pbXBvcnQge1xuICBnZXRNYW5pZmVzdENvbGxlY3RvcixcbiAgd3JpdGVNYW5pZmVzdCxcbiAgdHlwZSBNYW5pZmVzdENvbGxlY3RvclxufSBmcm9tIFwiLi91dGlscy9tYW5pZmVzdFdyaXRlclwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCB0b0tlYmFiIH0gZnJvbSBcIi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQXBwLmdldEFwcCgpLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHdpdGggbmV3IFZQQ1xuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgdXNpbmcgZXhpc3RpbmcgVlBDXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB3aXRob3V0IG5ldHdvcmsgKFMzLW9ubHkgYXBwcylcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT2JqZWN0IHdpdGggSU5ldHdvcmtQcm9wczogQ3JlYXRlIG5ldyBWUEMgd2l0aCBjb25maWdcbiAgICogLSBmYWxzZTogTm8gbmV0d29yayAoZm9yIFMzLW9ubHkgYXBwcylcbiAgICogLSB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfTogVXNlIGV4aXN0aW5nIFZQQyBieSBJRFxuICAgKi9cbiAgbmV0d29yaz86IElOZXR3b3JrUHJvcHMgfCBmYWxzZSB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNpYyBjb3JuZXItc3RvbmUgb2YgYWxsIEZqYWxsLWhvc3RlZCBhcHBsaWNhdGlvbnMuXG4gKiAgVGhpcyBjbGFzcyBpcyBhIHNpbmdsZXRvbiBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2VcbiAqICAgYWxsIHJlc291cmNlcyBpbiBhIEZqYWxsIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ2RrQXBwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwcCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAvKiogUGFzY2FsQ2FzZSBmb3JtIG9mIG5hbWUsIHVzZWQgYXMgc3RhY2stbmFtZSBwcmVmaXggYW5kIGNvbnN0cnVjdCBJRHMuICovXG4gIHByaXZhdGUgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFja3M6IHsgW2tleTogc3RyaW5nXTogQXdzU3RhY2sgfSA9IHt9O1xuXG4gIHByaXZhdGUgdnBjPzogSVZwYztcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsVnBjcyA9IG5ldyBNYXA8c3RyaW5nLCBJVnBjPigpO1xuICBwcml2YXRlIGRlZmF1bHRFY3I6IEVjciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZWZhdWx0TW9uaXRvcmluZ1JvbGU6IFJvbGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdEF1ZGl0Um9sZTogUm9sZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhdWRpdFJvbGVFeHRlcm5hbElkPzogc3RyaW5nO1xuICBwcml2YXRlIG5ldHdvcmtEaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdsb2JhbFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSBhc3BlY3RBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb3VyY2VJbnZlbnRvcnk/OiBSZXNvdXJjZUludmVudG9yeUFzcGVjdDtcbiAgcHJpdmF0ZSBtYW5pZmVzdENvbGxlY3RvcjogTWFuaWZlc3RDb2xsZWN0b3I7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgQXBwLmluc3RhbmNlID0gdGhpcztcblxuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gXCJGamFsbEFwcFwiO1xuICAgIHRoaXMuc3RhY2tQcmVmaXggPSB0b1Bhc2NhbENhc2UodGhpcy5uYW1lKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbWFuaWZlc3QgY29sbGVjdG9yIGZvciBidWlsZC10aW1lIHNlcnZpY2UgZGlzY292ZXJ5XG4gICAgdGhpcy5tYW5pZmVzdENvbGxlY3RvciA9IGdldE1hbmlmZXN0Q29sbGVjdG9yKHRoaXMubmFtZSk7XG5cbiAgICB0aGlzLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbmV0d29yayBpbW1lZGlhdGVseSBpZiBjb25maWd1cmVkXG4gICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm5ldHdvcmtEaXNhYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5uZXR3b3JrKSB7XG4gICAgICB0aGlzLmluaXRpYWxpc2VOZXR3b3JrKG9wdGlvbnMubmV0d29yayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2UgdGhlIG5ldHdvcmsgKFZQQykgZm9yIHRoaXMgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VOZXR3b3JrKFxuICAgIGNvbmZpZzogSU5ldHdvcmtQcm9wcyB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgaWYgKFwidXNlRXhpc3RpbmdcIiBpbiBjb25maWcpIHtcbiAgICAgIHRoaXMudnBjID0gVnBjLmZyb21Mb29rdXAoXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpLFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fUltcG9ydGVkVnBjYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwY0lkOiBjb25maWcudXNlRXhpc3RpbmdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV0d29ya0NvbmZpZyA9IHsgLi4uY29uZmlnLCB2cGNOYW1lOiBjb25maWcudnBjTmFtZSA/PyB0aGlzLm5hbWUgfTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRmFjdG9yeS5idWlsZChcbiAgICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1WcGNgLFxuICAgICAgICBuZXR3b3JrQ29uZmlnXG4gICAgICApKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcbiAgICAgIHRoaXMudnBjID0gbmV0d29yay5nZXRWcGMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXBwbGljYXRpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldC9DcmVhdGUgYSBiYXNpYyBGamFsbCBBcHBsaWNhdGlvbiB3aXRoIHN0YW5kYXJkIHRhZ3MgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB3aXRoIG5ldyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHVzaW5nIGV4aXN0aW5nIFZQQ1xuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAgICogICBuZXR3b3JrOiB7IHVzZUV4aXN0aW5nOiBcInZwYy0xMjM0NTY3OFwiIH1cbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aG91dCBuZXR3b3JrIChTMy1vbmx5IGFwcHMpXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucyk6IEFwcCB7XG4gICAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKG5hbWUsIG9wdGlvbnMpO1xuICAgIGFwcC5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEFwcFxuICAgKiBAcGFyYW0gbmFtZSBBcHBsaWNhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgbmV0d29yayBzZXR0aW5nc1xuICAgKiBAcmV0dXJucyB7QXBwfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKG5hbWUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBzaW5nbGV0b24gZXhpc3RzIGJ1dCBuYW1lIGRpZmZlcnMsIHVwZGF0ZSBpdCAoYmVmb3JlIGFueSBpbmZyYSBpcyBkZWZpbmVkKVxuICAgICAgaWYgKG5hbWUgJiYgQXBwLmluc3RhbmNlLm5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgLy8gV2FybiBpZiBuZXR3b3JrIGFscmVhZHkgaW5pdGlhbGlzZWQgLSBjaGFuZ2luZyBuYW1lIGFmdGVyIG5ldHdvcmsgZXhpc3RzIGNyZWF0ZXMgYSBtaXNtYXRjaFxuICAgICAgICBpZiAoQXBwLmluc3RhbmNlLnZwYykge1xuICAgICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgQXBwIG5hbWUgY2hhbmdlZCBmcm9tIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1cIiB0byBcIiR7bmFtZX1cIiBhZnRlciBuZXR3b3JrIHdhcyBpbml0aWFsaXNlZC4gYCArXG4gICAgICAgICAgICAgIGBWUEMgd2lsbCBoYXZlIG5hbWUgXCIke0FwcC5pbnN0YW5jZS5uYW1lfVZwY1wiIGJ1dCBhcHAgbmFtZSBpcyBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBFbnN1cmUgQXBwLmdldEFwcCgpIGlzIGNhbGxlZCB3aXRoIHRoZSBmaW5hbCBuYW1lIGJlZm9yZSBpbml0aWFsaXNpbmcgbmV0d29yay5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBBcHAuaW5zdGFuY2UubmFtZSA9IG5hbWU7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5zdGFja1ByZWZpeCA9IHRvUGFzY2FsQ2FzZShuYW1lKTtcbiAgICAgICAgLy8gUmVpbml0aWFsaXNlIHN0YW5kYXJkIHRhZ3Mgd2l0aCB0aGUgbmV3IG5hbWVcbiAgICAgICAgQXBwLmluc3RhbmNlLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgb3B0aW9ucyBwcm92aWRlZCBidXQgbmV0d29yayBub3QgeWV0IGluaXRpYWxpc2VkLCBpbml0aWFsaXNlIGl0IG5vd1xuICAgICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgb3B0aW9ucz8ubmV0d29yayAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLnZwYyAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLm5ldHdvcmtEaXNhYmxlZFxuICAgICAgKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcHAuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBzdGFjayBieSBrZXkuIElmIHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiAgRGVwZW5kZW5jaWVzIGFyZSBvbmx5IGFwcGxpZWQgdGhlIGZpcnN0IHRpbWUgYSBzdGFjayBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc3RhY2tcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyAtIFRoZSBzdGFjayhzKSB0aGF0IHRoaXMgc3RhY2sgZGVwZW5kcyBvblxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhY2soa2V5OiBzdHJpbmcsIGRlcGVuZGVuY2llcz86IEF3c1N0YWNrIHwgQXdzU3RhY2tbXSk6IEF3c1N0YWNrIHtcbiAgICAvLyBBcHBseSB0aGUgYXNwZWN0IG9uY2UgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaXJzdCBzdGFja1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFzcGVjdEFwcGxpZWQgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RhY2tzKS5sZW5ndGggPT09IDAgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsVGFncykubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5hcHBseVRhZ3NBc3BlY3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhY2tzW2tleV0pIHtcbiAgICAgIHRoaXMuc3RhY2tzW2tleV0gPSBuZXcgQXdzU3RhY2soa2V5LCBkZXBlbmRlbmNpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YWNrc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1Db21wdXRlYFxuICAgKlxuICAgKiBPbmx5IGRlcGVuZHMgb24gTmV0d29yay4gRGF0YWJhc2UgZGVwZW5kZW5jeSBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIGJ5IENESyB3aGVuIGNvbXB1dGUgcmVzb3VyY2VzIHJlZmVyZW5jZSBkYXRhYmFzZSByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9Q29tcHV0ZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBuZXR3b3JrIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU5ldHdvcmtgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TmV0d29ya1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLnN0YWNrUHJlZml4fU5ldHdvcmtgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfURhdGFiYXNlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1EYXRhYmFzZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfVN0b3JhZ2VgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9U3RvcmFnZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBDRE4gc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q2RuYFxuICAgKlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsuIENvbXB1dGUvU3RvcmFnZSBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHlcbiAgICogYnkgQ0RLIHdoZW4gQ0ROIHJlc291cmNlcyByZWZlcmVuY2UgQUxCIG9yIFMzIGJ1Y2tldCByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q2RuU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1DZG5gLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgbWVzc2FnaW5nIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU1lc3NhZ2luZ2BcbiAgICpcbiAgICogVXNlZCBmb3IgU1FTIHF1ZXVlcywgU05TIHRvcGljcywgYW5kIEV2ZW50QnJpZGdlIGV2ZW50IGJ1c2VzLlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsgb25seS4gVGhlc2UgYXJlIHJlZ2lvbmFsIHNlcnZpY2VzIHRoYXQgZG9uJ3RcbiAgICogcmVxdWlyZSBWUEMsIGJ1dCB3ZSBtYWludGFpbiBjb25zaXN0ZW50IHN0YWNrIGRlcGVuZGVuY3kgcGF0dGVybnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1NZXNzYWdpbmdgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFZQQyBieSBuYW1lLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICpcbiAgICogVGhpcyBpcyBhIHB1cmUgZ2V0dGVyIC0gaXQgbmV2ZXIgY3JlYXRlcyBpbmZyYXN0cnVjdHVyZS5cbiAgICogTmV0d29yayBtdXN0IGJlIGNvbmZpZ3VyZWQgdmlhIEFwcC5nZXRBcHAoKSBvcHRpb25zIG9yIGFwcC5hZGROZXR3b3JrKCkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgVlBDIHRvIHJldHJpZXZlLiBJZiBub3QgcHJvdmlkZWQsIHJldHVybnMgdGhlIGRlZmF1bHQgVlBDLlxuICAgKiBAcmV0dXJucyB7SVZwY30gVGhlIGNvbmZpZ3VyZWQgVlBDXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBuZXR3b3JrIGlzIGRpc2FibGVkLCBub3QgY29uZmlndXJlZCwgb3IgbmFtZWQgVlBDIG5vdCBmb3VuZFxuICAgKi9cbiAgcHVibGljIGdldFZwYyhuYW1lPzogc3RyaW5nKTogSVZwYyB7XG4gICAgaWYgKHRoaXMubmV0d29ya0Rpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBpcyBkaXNhYmxlZCBmb3IgdGhpcyBhcHAuIENhbm5vdCBnZXQgVlBDLiBcIiArXG4gICAgICAgICAgXCJQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKSB0byBlbmFibGUgbmV0d29ya2luZy5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBuYW1lIGlzIHByb3ZpZGVkLCBsb29rIGluIGFkZGl0aW9uYWwgVlBDcyBmaXJzdFxuICAgIGlmIChuYW1lKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsVnBjID0gdGhpcy5hZGRpdGlvbmFsVnBjcy5nZXQobmFtZSk7XG4gICAgICBpZiAoYWRkaXRpb25hbFZwYykge1xuICAgICAgICByZXR1cm4gYWRkaXRpb25hbFZwYztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZQQyAnJHtuYW1lfScgbm90IGZvdW5kLiBBdmFpbGFibGUgVlBDczogJHt0aGlzLmdldFZwY05hbWVzKCkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJDcmVhdGUgYWRkaXRpb25hbCBWUENzIHVzaW5nIGFwcC5hZGROZXR3b3JrKE5ldHdvcmtGYWN0b3J5LmJ1aWxkKC4uLikpLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IFZQQ1xuICAgIGlmICghdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJOZXR3b3JrIG5vdCBjb25maWd1cmVkLiBQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKS4gXCIgK1xuICAgICAgICAgIFwiRXhhbXBsZTogQXBwLmdldEFwcChhcHBOYW1lLCB7IG5ldHdvcms6IHsgbWF4QXpzOiAyIH0gfSlcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudnBjO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZSBWUENzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IG9mIFZQQyBuYW1lcy4gSW5jbHVkZXMgXCJkZWZhdWx0XCIgaWYgdGhlIGRlZmF1bHQgVlBDIGlzIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0VnBjTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZwYykge1xuICAgICAgbmFtZXMucHVzaChcImRlZmF1bHRcIik7XG4gICAgfVxuICAgIG5hbWVzLnB1c2goLi4udGhpcy5hZGRpdGlvbmFsVnBjcy5rZXlzKCkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250YWluZXIgcmVnaXN0cnkuIElmIHRoZSByZWdpc3RyeSBkb2VzIG5vdCBleGlzdFxuICAgKiAgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpOiBFY3Ige1xuICAgIGlmICghdGhpcy5kZWZhdWx0RWNyKSB7XG4gICAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgICAgY29uc3QgZWNyID0gRWNyRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUVjcmAsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHRvS2ViYWIodGhpcy5uYW1lKVxuICAgICAgfSkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgICAgdGhpcy5kZWZhdWx0RWNyID0gZWNyO1xuICAgICAgcmV0dXJuIGVjcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCB3ZWJhcHAgdG8gcXVlcnkgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBFQ1Mgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgbW9uaXRvcmluZyByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTW9uaXRvcmluZ1JvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfTU9OSVRPUklOR19DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICBjb25zdCByb2xlID0gTW9uaXRvcmluZ1JvbGVGYWN0b3J5LmJ1aWxkKFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fU1vbml0b3JpbmdSb2xlYCxcbiAgICAgICAge1xuICAgICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfTU9OSVRPUklOR19DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgICAgcm9sZVBhdGg6IEZKQUxMX01PTklUT1JJTkdfQ09ORklHLnJvbGVQYXRoXG4gICAgICAgIH1cbiAgICAgICkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHJvbGUpO1xuICAgICAgdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgYXVkaXQgcm9sZSBpbiB0aGUgTmV0d29yayBzdGFjayB0aGF0IGFsbG93c1xuICAgKiB0aGUgRmphbGwgcGxhdGZvcm0gdG8gdXNlIENsb3VkUXVlcnkgZm9yIGNvbXByZWhlbnNpdmUgQVdTIHJlc291cmNlIGF1ZGl0aW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IG9wdC1pbiBmZWF0dXJlLiBDYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBDbG91ZFF1ZXJ5XG4gICAqIGF1ZGl0IGNhcGFiaWxpdGllcyBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdlYmFwcEFjY291bnRJZCAtIE9wdGlvbmFsIEFXUyBhY2NvdW50IElEIG9mIHRoZSBGamFsbCB3ZWJhcHAuIERlZmF1bHRzIHRvIGNvbmZpZ3VyZWQgcGxhdGZvcm0gYWNjb3VudC5cbiAgICogQHBhcmFtIGV4dGVybmFsSWQgLSBPcHRpb25hbCBleHRlcm5hbCBJRCBmb3IgYWRkaXRpb25hbCBzZWN1cml0eS4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBJRCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogQHJldHVybnMge1JvbGV9IFRoZSBjcmVhdGVkIGF1ZGl0IHJvbGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBdWRpdFJvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRBdWRpdFJvbGUpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgd2ViYXBwQWNjb3VudElkIHx8IEZKQUxMX0FVRElUX0NPTkZJRy53ZWJhcHBBd3NBY2NvdW50SWQ7XG5cbiAgICAgIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQgfHwgdGhpcy5nZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpO1xuXG4gICAgICBjb25zdCByb2xlID0gQXVkaXRSb2xlRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUF1ZGl0Um9sZWAsIHtcbiAgICAgICAgd2ViYXBwQWNjb3VudElkOiBhY2NvdW50SWQsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZXh0ZXJuYWxJZDogdGhpcy5hdWRpdFJvbGVFeHRlcm5hbElkLFxuICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVOYW1lUHJlZml4LFxuICAgICAgICByb2xlUGF0aDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVQYXRoXG4gICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG5cbiAgICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3Qocm9sZSk7XG4gICAgICB0aGlzLmRlZmF1bHRBdWRpdFJvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF1ZGl0Um9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVybmFsIElEIHVzZWQgZm9yIHRoZSBhdWRpdCByb2xlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBleHRlcm5hbCBJRCBpZiBhdWRpdCByb2xlIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRBdWRpdFJvbGVFeHRlcm5hbElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBleHRlcm5hbCBJRCBmb3IgYXVkaXQgcm9sZVxuICAgKiBGb3JtYXQ6IGZqYWxsLWF1ZGl0LXthcHBOYW1lfS17dGltZXN0YW1wfVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgcmV0dXJuIGBmamFsbC1hdWRpdC0ke3RvS2ViYWIodGhpcy5uYW1lKX0tJHt1bmlxdWVJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXB1dGUgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbW9uaXRvcmluZyByb2xlIGlmIG5vdCBhbHJlYWR5IGNyZWF0ZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbXB1dGUgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uOlxuICAgKiAtIEVjc0NvbXB1dGUgZm9yIHR5cGU6IFwiZWNzXCJcbiAgICogLSBMYW1iZGFDb21wdXRlIGZvciB0eXBlOiBcImxhbWJkYVwiXG4gICAqIC0gRWMyQ29tcHV0ZSBmb3IgdHlwZTogXCJlYzJcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFQ1MgY29tcHV0ZSAtIHJldHVybnMgRWNzQ29tcHV0ZVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7XG4gICAqICAgdHlwZTogXCJlY3NcIixcbiAgICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJhcGlcIiwgLi4uIH1dXG4gICAqIH0pKTtcbiAgICogYXBpLmdldExvYWRCYWxhbmNlcigpOyAvLyBBdmFpbGFibGUgb24gRWNzQ29tcHV0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBMYW1iZGEgY29tcHV0ZSAtIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICAgKiBjb25zdCB3b3JrZXIgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlclwiLCB7XG4gICAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICogICBmdW5jdGlvbnM6IFt7IG5hbWU6IFwicHJvY2Vzc1wiLCAuLi4gfV1cbiAgICogfSkpO1xuICAgKiB3b3JrZXIuZ2V0RnVuY3Rpb24oXCJwcm9jZXNzXCIpOyAvLyBBdmFpbGFibGUgb24gTGFtYmRhQ29tcHV0ZVxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGU8VCBleHRlbmRzIEFueUNvbXB1dGU+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgLy8gQXV0by1jcmVhdGUgbW9uaXRvcmluZyByb2xlIHdoZW4gY29tcHV0ZSBpcyBhZGRlZFxuICAgIGlmICghdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1JvbGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBjb25zdHJ1Y3QgPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChjb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBjb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRhdGFiYXNlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgdXNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gICAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAgICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAgICogfSkpO1xuICAgKiBkYi5nZXRIb3N0RW5kcG9pbnQoKTsgLy8gQXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIER5bmFtb0RCIHRhYmxlIC0gcmV0dXJucyBEeW5hbW9EQkRhdGFiYXNlXG4gICAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAgICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAqICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJTXCIgfVxuICAgKiB9KSk7XG4gICAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZTxUIGV4dGVuZHMgQW55RGF0YWJhc2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBjb25zdCBkYXRhYmFzZUNvbnN0cnVjdCA9IGZuKHRoaXMsIGRhdGFiYXNlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QoZGF0YWJhc2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgKFMzKSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFByaXZhdGUgYnVja2V0IChkZWZhdWx0KVxuICAgKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7XG4gICAqICAgdmVyc2lvbmVkOiB0cnVlXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gV2Vic2l0ZSBidWNrZXRcbiAgICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7XG4gICAqICAgd2Vic2l0ZUhvc3Rpbmc6IHsgaW5kZXhEb2N1bWVudDogXCJpbmRleC5odG1sXCIgfVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZShmbjogU3RvcmFnZUZhY3RvcnlGbik6IFN0b3JhZ2Uge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IGZuLnN0YWNrUGxhY2VtZW50ID8/IFwic3RvcmFnZVwiO1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5yZXNvbHZlU3RvcmFnZVN0YWNrKHBsYWNlbWVudCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0YWNrLmdldFN0YWNrKCkpO1xuICAgIHN0YWNrLmFkZENvbnN0cnVjdChzdG9yYWdlQ29uc3RydWN0KTtcbiAgICByZXR1cm4gc3RvcmFnZUNvbnN0cnVjdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0b3JhZ2VTdGFjayhwbGFjZW1lbnQ6IHN0cmluZyk6IEF3c1N0YWNrIHtcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSBcImNkblwiOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0Q2RuU3RhY2soKTtcbiAgICAgIGNhc2UgXCJjb21wdXRlXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgQ0ROIHJlc291cmNlIChDbG91ZEZyb250KSB0byB0aGUgZGVmYXVsdCBDRE4gc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUzMgb3JpZ2luXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHt9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFzc2V0c0NkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJzM1wiLFxuICAgKiAgIGJ1Y2tldDogYXNzZXRzXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQUxCIG9yaWdpbiAoRUNTKVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7IHR5cGU6IFwiZWNzXCIsIC4uLiB9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFwaUNkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJhbGJcIixcbiAgICogICBsb2FkQmFsYW5jZXI6IGFwaVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkQ2RuKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IENkbik6IENkbiB7XG4gICAgY29uc3QgY2RuU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDZG5TdGFjaygpO1xuICAgIGNvbnN0IGNkbiA9IGZuKHRoaXMsIGNkblN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNkblN0YWNrLmFkZENvbnN0cnVjdChjZG4pO1xuXG4gICAgcmV0dXJuIGNkbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZXNzYWdpbmcgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgcXVldWUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnaW5nIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgY29uZmlndXJhdGlvbi5cbiAgICogQ3VycmVudGx5IHN1cHBvcnRzIHF1ZXVlIChTUVMpLCB3aXRoIGZ1dHVyZSBzdXBwb3J0IHBsYW5uZWQgZm9yXG4gICAqIHRvcGljIChTTlMpLCBldmVudGJ1cyAoRXZlbnRCcmlkZ2UpLCBhbmQgc3RyZWFtIChLaW5lc2lzKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUXVldWUgbWVzc2FnaW5nIC0gcmV0dXJucyBRdWV1ZU1lc3NhZ2luZ1xuICAgKiBjb25zdCBub3RpZmljYXRpb25zID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAqICAgdHlwZTogXCJxdWV1ZVwiLFxuICAgKiAgIHF1ZXVlVHlwZTogXCJzdGFuZGFyZFwiLFxuICAgKiAgIGRlYWRMZXR0ZXJRdWV1ZTogeyBlbmFibGVkOiB0cnVlLCBtYXhSZWNlaXZlQ291bnQ6IDMgfVxuICAgKiB9KSk7XG4gICAqIG5vdGlmaWNhdGlvbnMuZ3JhbnRTZW5kTWVzc2FnZXMoYXBpRnVuY3Rpb24pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGSUZPIHF1ZXVlIGZvciBPcGVuTmV4dCByZXZhbGlkYXRpb25cbiAgICogY29uc3QgcmV2YWxpZGF0aW9uID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiUmV2YWxpZGF0aW9uXCIsIHtcbiAgICogICB0eXBlOiBcInF1ZXVlXCIsXG4gICAqICAgcXVldWVUeXBlOiBcImZpZm9cIixcbiAgICogICB2aXNpYmlsaXR5VGltZW91dDogMzAwLFxuICAgKiAgIGNvbnRlbnRCYXNlZERlZHVwbGljYXRpb246IHRydWVcbiAgICogfSkpO1xuICAgKi9cbiAgcHVibGljIGFkZE1lc3NhZ2luZzxUIGV4dGVuZHMgQW55TWVzc2FnaW5nPihcbiAgICBmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBUXG4gICk6IFQge1xuICAgIGNvbnN0IG1lc3NhZ2luZ1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTtcbiAgICBjb25zdCBtZXNzYWdpbmcgPSBmbih0aGlzLCBtZXNzYWdpbmdTdGFjay5nZXRTdGFjaygpKTtcbiAgICBtZXNzYWdpbmdTdGFjay5hZGRDb25zdHJ1Y3QobWVzc2FnaW5nIGFzIHVua25vd24gYXMgQ29uc3RydWN0KTtcblxuICAgIHJldHVybiBtZXNzYWdpbmc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgaGlnaC1sZXZlbCBpbmZyYXN0cnVjdHVyZSBwYXR0ZXJuIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogUGF0dGVybnMgYXJlIGNvbXBvc2l0ZSBjb25zdHJ1Y3RzIHRoYXQgY3JlYXRlIG11bHRpcGxlIHJlbGF0ZWQgcmVzb3VyY2VzXG4gICAqIGFzIGEgc2luZ2xlLCBjb2hlc2l2ZSB1bml0LiBUaGV5IGVuY2Fwc3VsYXRlIGJlc3QgcHJhY3RpY2VzIGFuZCByZWR1Y2VcbiAgICogYm9pbGVycGxhdGUgZm9yIGNvbW1vbiBkZXBsb3ltZW50IHNjZW5hcmlvcy5cbiAgICpcbiAgICogQ3VycmVudGx5IHN1cHBvcnRlZCBwYXR0ZXJuczpcbiAgICogLSBgcGF5bG9hZGA6IFBheWxvYWQgQ01TIGRlcGxveW1lbnQgd2l0aCBPcGVuTmV4dFxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBwYXR0ZXJuIGludGVyZmFjZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uLFxuICAgKiBwcm92aWRpbmcgYWNjZXNzIHRvIGFsbCB1bmRlcmx5aW5nIHJlc291cmNlcyB2aWEgZXNjYXBlIGhhdGNoZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBheWxvYWQgQ01TIHBhdHRlcm4gLSByZXR1cm5zIFBheWxvYWRcbiAgICogY29uc3QgcGF5bG9hZCA9IGFwcC5hZGRQYXR0ZXJuKFBhdHRlcm5GYWN0b3J5LmJ1aWxkKFwiUGF5bG9hZEFwcFwiLCB7XG4gICAqICAgdHlwZTogXCJwYXlsb2FkXCIsXG4gICAqICAgbmFtZTogXCJteS1jbXNcIixcbiAgICogICBzb3VyY2U6IFwiLi4vLi5cIlxuICAgKiB9KSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEVzY2FwZSBoYXRjaGVzIC0gYWNjZXNzIHVuZGVybHlpbmcgcmVzb3VyY2VzXG4gICAqIHBheWxvYWQuZ2V0RGF0YWJhc2UoKS5ncmFudENvbm5lY3Qob3RoZXJMYW1iZGEpO1xuICAgKiBwYXlsb2FkLmdldFNlcnZlcigpLmdldExhbWJkYUZ1bmN0aW9uKCkuYWRkRW52aXJvbm1lbnQoXCJDVVNUT01cIiwgXCJ2YWx1ZVwiKTtcbiAgICogcGF5bG9hZC5nZXRDZG4oKS5nZXREaXN0cmlidXRpb24oKS5hZGRCZWhhdmlvcihcIi9jdXN0b20vKlwiLCBjdXN0b21PcmlnaW4pO1xuICAgKi9cbiAgcHVibGljIGFkZFBhdHRlcm48VCBleHRlbmRzIEFueVBhdHRlcm4+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29uc3QgcGF0dGVybiA9IGZuKHRoaXMsIGNvbXB1dGVTdGFjay5nZXRTdGFjaygpKTtcbiAgICBjb21wdXRlU3RhY2suYWRkQ29uc3RydWN0KHBhdHRlcm4gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBhZGRpdGlvbmFsIG5ldHdvcmsgKFZQQykgdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBjcmVhdGUgYWRkaXRpb25hbCBWUENzIGJleW9uZCB0aGUgZGVmYXVsdCBWUEMgY29uZmlndXJlZCB2aWEgQXBwLmdldEFwcCgpLlxuICAgKiBBZGRpdGlvbmFsIFZQQ3MgY2FuIGJlIHJldHJpZXZlZCBieSBuYW1lIHVzaW5nIGFwcC5nZXRWcGMobmFtZSkuXG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBOZXR3b3JrIGNvbnN0cnVjdFxuICAgKiBAcmV0dXJucyB7TmV0d29ya30gVGhlIGNyZWF0ZWQgTmV0d29yayBjb25zdHJ1Y3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgaXNvbGF0ZWRWcGMgPSBhcHAuYWRkTmV0d29yayhcbiAgICogICBOZXR3b3JrRmFjdG9yeS5idWlsZChcIklzb2xhdGVkVnBjXCIsIHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfSlcbiAgICogKTtcbiAgICovXG4gIHB1YmxpYyBhZGROZXR3b3JrKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IE5ldHdvcmspOiBOZXR3b3JrIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICBjb25zdCBuZXR3b3JrID0gZm4odGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbnN0IHZwY05hbWUgPSBuZXR3b3JrLm5vZGUuaWQ7XG5cbiAgICAvLyBTdG9yZSBpbiBhZGRpdGlvbmFsIFZQQ3MgbWFwIGZvciByZXRyaWV2YWwgdmlhIGdldFZwYyhuYW1lKVxuICAgIHRoaXMuYWRkaXRpb25hbFZwY3Muc2V0KHZwY05hbWUsIG5ldHdvcmsuZ2V0VnBjKCkpO1xuICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3QobmV0d29yayk7XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhYmFzZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0RGF0YWJhc2VTdGFjaygpO1xuICAgIGRhdGFiYXNlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2VSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgc3RvcmFnZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBjb25maWcuZW52aXJvbm1lbnQsXG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOnNlcnZpY2VcIjogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbGwgdGFncyB1c2luZyBDREsncyBuYXRpdmUgVGFncy5vZigpLmFkZCgpIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVRhZ3NBc3BlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFzcGVjdEFwcGxpZWQgJiYgT2JqZWN0LmtleXModGhpcy5nbG9iYWxUYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBcHBseSBzdGFuZGFyZCB0YWdzIHVzaW5nIFRhZ3Mub2YodGhpcykuYWRkKClcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2xvYmFsVGFncykpIHtcbiAgICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGFzcGVjdCBmb3IgcmVzb3VyY2Utc3BlY2lmaWMgdGFncyAoSVBBTSBwb29sLCBiYWNrdXAgdGllcilcbiAgICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBTdGFuZGFyZFRhZ3NBc3BlY3QoKSk7XG5cbiAgICAgIHRoaXMuYXNwZWN0QXBwbGllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gdGFncyB0byBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHAuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIEN1c3RvbSB0YWdzIHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZXNcbiAgICogQGV4YW1wbGVcbiAgICogYXBwLmFkZFRhZ3Moe1xuICAgKiAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJwbGF0Zm9ybS10ZWFtXCIsXG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpjb3N0LWNlbnRlclwiOiBcIkNDLTEyM1wiLFxuICAgKiAgIFwidGVhbTpzbGFjay1jaGFubmVsXCI6IFwiI3BsYXRmb3JtLWFsZXJ0c1wiXG4gICAqIH0pO1xuICAgKi9cbiAgcHVibGljIGFkZFRhZ3ModGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IEFwcCB7XG4gICAgLy8gTWVyZ2UgdGFncyBpbnRvIGdsb2JhbFRhZ3MgZm9yIHRyYWNraW5nXG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgLi4udGhpcy5nbG9iYWxUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCByZXNvdXJjZSBpbnZlbnRvcnkgY29sbGVjdGVkIGR1cmluZyBzeW50aGVzaXNcbiAgICogQ2FsbCB0aGlzIGFmdGVyIGFwcC5zeW50aCgpIHRvIGdldCBjb21wbGV0ZSByZXNvdXJjZSBpbnZlbnRvcnlcbiAgICogQHJldHVybnMge1Jlc291cmNlSW52ZW50b3J5fSBDb21wbGV0ZSBpbnZlbnRvcnkgb2YgYWxsIHJlc291cmNlcyBpbiB0aGUgYXBwXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0UmVzb3VyY2VJbnZlbnRvcnkoKTogUmVzb3VyY2VJbnZlbnRvcnkge1xuICAgIGlmICghdGhpcy5yZXNvdXJjZUludmVudG9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJlc291cmNlIGludmVudG9yeSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgYSBSZXNvdXJjZUludmVudG9yeUFzcGVjdCBoYXMgYmVlbiBhZGRlZCBiZWZvcmUgY2FsbGluZyBleHBvcnRSZXNvdXJjZUludmVudG9yeSgpLlwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlSW52ZW50b3J5LmdldEludmVudG9yeSgpLFxuICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIHJlZ2lzdGVyaW5nIHNlcnZpY2VzIGFuZCBwYXR0ZXJucy5cbiAgICogVXNlZCBieSBDb21wdXRlRmFjdG9yeSBhbmQgUGF0dGVybkZhY3RvcnkgdG8gcmVnaXN0ZXIgdGhlaXIgY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTogTWFuaWZlc3RDb2xsZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0Q29sbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHN5bnRoIHRvIGF1dG9tYXRpY2FsbHkgZXhwb3J0IHJlc291cmNlIGludmVudG9yeSBhbmQgbWFuaWZlc3RcbiAgICovXG4gIHB1YmxpYyBzeW50aChvcHRpb25zPzogU3RhZ2VTeW50aGVzaXNPcHRpb25zKTogQ2xvdWRBc3NlbWJseSB7XG4gICAgLy8gQ2FsbCBwYXJlbnQgc3ludGggZmlyc3RcbiAgICBjb25zdCBhc3NlbWJseSA9IHN1cGVyLnN5bnRoKG9wdGlvbnMpO1xuXG4gICAgLy8gQWZ0ZXIgc3ludGhlc2lzLCB3cml0ZSBGamFsbCBtYW5pZmVzdCB0byBjZGsub3V0XG4gICAgdHJ5IHtcbiAgICAgIHdyaXRlTWFuaWZlc3QoYXNzZW1ibHksIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEb24ndCBmYWlsIHN5bnRoIGlmIG1hbmlmZXN0IGV4cG9ydCBmYWlsc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgRmphbGxMb2dnZXIud2FybihgRmFpbGVkIHRvIGV4cG9ydCBGamFsbCBtYW5pZmVzdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdfQ==
694
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBRXJELDZDQUF3QztBQUV4QyxxREFBMEQ7QUFDMUQsMkNBQXVDO0FBQ3ZDLHFEQUFtRTtBQUVuRSxvREFJZ0M7QUFNaEMsbUVBQWdFO0FBQ2hFLGlFQUltQztBQUNuQyxtQ0FBcUM7QUFLckMsaURBQThDO0FBQzlDLCtEQUErRDtBQUMvRCwwQ0FBb0Q7QUFDcEQsK0RBQXVEO0FBQ3ZELDJEQUlnQztBQUNoQywrREFBaUU7QUFFakUsTUFBTSwrQkFBK0IsR0FBRyxrQ0FBa0MsQ0FBQztBQUMzRSxNQUFNLDJCQUEyQixHQUFHLDhCQUE4QixDQUFDO0FBNENuRTs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsaUJBQU07SUFvQjdCLFlBQW9CLElBQWEsRUFBRSxPQUFxQjtRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQWZGLFdBQU0sR0FBZ0MsRUFBRSxDQUFDO1FBR3pDLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWdCLENBQUM7UUFLekMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE4QixFQUFFLENBQUM7UUFDM0Msa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFPNUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBQSwrQkFBWSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUEscUNBQW9CLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLHNDQUFzQztRQUN0QyxJQUFJLE9BQU8sRUFBRSxNQUFNLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLElBQUksT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO2FBQU0sSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsMENBQTBDO1FBQzFDLElBQUksT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxjQUFjLENBQUMsSUFBZ0I7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyx1Q0FBbUIsQ0FBQyxHQUFHLHVDQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxNQUF3QztRQUMvRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FDYixzRUFBc0UsQ0FDdkUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFlBQVksR0FDaEIsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxZQUFZO1lBQy9DLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWTtZQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDO1FBRWxCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsU0FBUyxDQUFDO1FBRS9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUU7WUFDakUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsU0FBUztZQUN6QyxZQUFZO1lBQ1osR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLENBQUM7WUFDZCxXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUMsQ0FBQztRQUVILFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLE1BQU0sWUFBWSxHQUFHLElBQUEsK0JBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSx1QkFBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLFlBQVksbUJBQW1CLEVBQUU7WUFDekUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxvQkFBb0I7WUFDOUQsV0FBVyxFQUFFLDJDQUEyQztTQUN6RCxDQUFDLENBQUM7UUFDSCxJQUFJLHVCQUFTLENBQ1gsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUN2QixHQUFHLFlBQVksd0JBQXdCLEVBQ3ZDO1lBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZTtZQUNwRCxXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUN2QixNQUErQztRQUUvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVuRCxJQUFJLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQUcsQ0FBQyxVQUFVLENBQ3ZCLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFDdkIsR0FBRyxJQUFJLENBQUMsV0FBVyxhQUFhLEVBQ2hDO2dCQUNFLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVzthQUMxQixDQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFFLE1BQU0sT0FBTyxHQUFHLHdCQUFjLENBQUMsS0FBSyxDQUNsQyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssRUFDeEIsYUFBYSxDQUNkLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzQkc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQWEsRUFBRSxPQUFxQjtRQUN2RCxPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBYSxFQUFFLE9BQXFCO1FBQzVELDZEQUE2RDtRQUM3RCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGdGQUFnRjtZQUNoRixJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDdkMsOEZBQThGO2dCQUM5RixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3JCLDhCQUFXLENBQUMsSUFBSSxDQUNkLDBCQUEwQixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxJQUFJLG1DQUFtQzt3QkFDekYsdUJBQXVCLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSx5QkFBeUIsSUFBSSxLQUFLO3dCQUMxRSxnRkFBZ0YsQ0FDbkYsQ0FBQztnQkFDSixDQUFDO2dCQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDekIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBQSwrQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QywrQ0FBK0M7Z0JBQy9DLEdBQUcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1lBRUQseUVBQXlFO1lBQ3pFLElBQUksT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDL0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sSUFDTCxPQUFPLEVBQUUsT0FBTztnQkFDaEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQ2pCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQzdCLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELHFEQUFxRDtZQUNyRCxJQUNFLE9BQU8sRUFBRSxNQUFNO2dCQUNmLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUNsQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLHVDQUFtQixDQUFDLEVBQzdDLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBRUQsMERBQTBEO1lBQzFELElBQUksT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksUUFBUSxDQUFDLEdBQVcsRUFBRSxZQUFvQztRQUMvRCx3REFBd0Q7UUFDeEQsSUFDRSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3ZDLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLG9CQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNsQixHQUFHLElBQUksQ0FBQyxXQUFXLFNBQVMsRUFDNUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNsQixHQUFHLElBQUksQ0FBQyxXQUFXLFVBQVUsRUFDN0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FDbEIsR0FBRyxJQUFJLENBQUMsV0FBVyxTQUFTLEVBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNsQixHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssRUFDeEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNsQixHQUFHLElBQUksQ0FBQyxXQUFXLFdBQVcsRUFDOUIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLElBQWE7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDYixvREFBb0Q7Z0JBQ2xELDJEQUEyRCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsUUFBUSxJQUFJLGdDQUFnQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUMzRSx5RUFBeUUsQ0FDNUUsQ0FBQztRQUNKLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStEO2dCQUM3RCwwREFBMEQsQ0FDN0QsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXO1FBQ2hCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFbkQsTUFBTSxHQUFHLEdBQUcsZ0JBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUU7Z0JBQ3JELGNBQWMsRUFBRSxJQUFBLDBCQUFPLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNuQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGVBQWUsQ0FBQyxlQUF3QixFQUFFLFVBQW1CO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFNBQVMsR0FDYixlQUFlLElBQUksMEJBQWtCLENBQUMsa0JBQWtCLENBQUM7WUFFM0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUV4RSxNQUFNLElBQUksR0FBRyxtQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxXQUFXLEVBQUU7Z0JBQ2xFLGVBQWUsRUFBRSxTQUFTO2dCQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2dCQUNwQyxjQUFjLEVBQUUsMEJBQWtCLENBQUMsY0FBYztnQkFDakQsUUFBUSxFQUFFLDBCQUFrQixDQUFDLFFBQVE7YUFDdEMsQ0FBQyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUVsQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssdUJBQXVCO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsT0FBTyxlQUFlLElBQUEsMEJBQU8sRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNJLFVBQVUsQ0FDZixFQUFxQztRQUVyQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBaUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQixDQUFDLFFBQW1CO1FBQzNDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25ELFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0ksV0FBVyxDQUNoQixFQUFxQztRQUVyQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNyRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0QsYUFBYSxDQUFDLFlBQVksQ0FBQyxpQkFBeUMsQ0FBQyxDQUFDO1FBRXRFLDJEQUEyRDtRQUMzRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDMUQsaUJBQWlCLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsU0FBa0I7UUFDdEMsT0FBTyxDQUNMLE9BQU8sU0FBUyxLQUFLLFFBQVE7WUFDN0IsU0FBUyxLQUFLLElBQUk7WUFDbEIsYUFBYSxJQUFJLFNBQVM7WUFDMUIsT0FBUSxTQUEwQixDQUFDLFdBQVcsS0FBSyxRQUFRLENBQzVELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSSxVQUFVLENBQUMsRUFBb0I7UUFDcEMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRCxLQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckMsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBaUI7UUFDM0MsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNsQixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2QztnQkFDRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNJLE1BQU0sQ0FBQyxFQUF1QztRQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCRztJQUNJLFlBQVksQ0FDakIsRUFBcUM7UUFFckMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RCxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQWlDLENBQUMsQ0FBQztRQUUvRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ0ksVUFBVSxDQUNmLEVBQXFDO1FBRXJDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUErQixDQUFDLENBQUM7UUFDM0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxVQUFVLENBQUMsRUFBMkM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUVoQyw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQUMsUUFBbUI7UUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDckQsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxRQUFtQjtRQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuRCxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFTLEdBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLENBQUMsK0JBQStCLENBQUMsRUFBRSxNQUFNLENBQUMsV0FBVztZQUNyRCxDQUFDLDJCQUEyQixDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25FLGdEQUFnRDtZQUNoRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDM0Qsa0JBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsbUVBQW1FO1lBQ25FLHFCQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHVDQUFrQixFQUFFLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxPQUFPLENBQUMsSUFBK0I7UUFDNUMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsR0FBRyxJQUFJLENBQUMsVUFBVTtZQUNsQixHQUFHLElBQUk7U0FDUixDQUFDO1FBQ0YsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksdUJBQXVCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUNiLDZIQUE2SCxDQUM5SCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRTtZQUNoRCxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUErQjtRQUMxQywwQkFBMEI7UUFDMUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0QyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsSUFBQSw4QkFBYSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDRDQUE0QztZQUM1QyxNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELDhCQUFXLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQXJ5Qkgsa0JBc3lCQztBQXJ5QmdCLFlBQVEsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0FBdXlCN0Msa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwIGFzIENka0FwcCxcbiAgQXNwZWN0cyxcbiAgVGFncyxcbiAgdHlwZSBTdGFnZVN5bnRoZXNpc09wdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIENsb3VkQXNzZW1ibHkgfSBmcm9tIFwiYXdzLWNkay1saWIvY3gtYXBpXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvdnBjXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMsIHR5cGUgSUNvbm5lY3RhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBSb2xlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7IHR5cGUgRWNyLCBFY3JGYWN0b3J5IH0gZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlL2VjclwiO1xuaW1wb3J0IHsgdHlwZSBBbnlEYXRhYmFzZSB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBJTmV0d29ya1Byb3BzLFxuICBOZXR3b3JrRmFjdG9yeSxcbiAgdHlwZSBOZXR3b3JrXG59IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9uZXR3b3JrXCI7XG5pbXBvcnQgeyB0eXBlIENkbiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9jZG5cIjtcbmltcG9ydCB7IHR5cGUgQW55TWVzc2FnaW5nIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL21lc3NhZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBBbnlDb21wdXRlIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL2NvbXB1dGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZSwgdHlwZSBTdG9yYWdlRmFjdG9yeUZuIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL3N0b3JhZ2VcIjtcbmltcG9ydCB7IHR5cGUgQW55UGF0dGVybiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9wYXR0ZXJuXCI7XG5pbXBvcnQgeyBTdGFuZGFyZFRhZ3NBc3BlY3QgfSBmcm9tIFwiLi91dGlscy9zdGFuZGFyZFRhZ3NBc3BlY3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQmFja3VwVGllcixcbiAgQkFDS1VQX1RJRVJfVEFHX0tFWSxcbiAgQkFDS1VQX1RJRVJfVEFHX01BUFxufSBmcm9tIFwiLi91dGlscy9iYWNrdXBUaWVyTWFwcGluZ1wiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge1xuICB0eXBlIFJlc291cmNlSW52ZW50b3J5QXNwZWN0LFxuICB0eXBlIFJlc291cmNlSW52ZW50b3J5XG59IGZyb20gXCIuL2FzcGVjdHMvcmVzb3VyY2VJbnZlbnRvcnlcIjtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuL3V0aWxzL2dldENvbmZpZ1wiO1xuaW1wb3J0IEF1ZGl0Um9sZUZhY3RvcnkgZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9hdWRpdC9hdWRpdFJvbGVcIjtcbmltcG9ydCB7IEZKQUxMX0FVRElUX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZy9hdWRpdFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyXCI7XG5pbXBvcnQge1xuICBnZXRNYW5pZmVzdENvbGxlY3RvcixcbiAgd3JpdGVNYW5pZmVzdCxcbiAgdHlwZSBNYW5pZmVzdENvbGxlY3RvclxufSBmcm9tIFwiLi91dGlscy9tYW5pZmVzdFdyaXRlclwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCB0b0tlYmFiIH0gZnJvbSBcIi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuXG5jb25zdCBDT1NUX0FMTE9DQVRJT05fRU5WSVJPTk1FTlRfVEFHID0gXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiO1xuY29uc3QgQ09TVF9BTExPQ0FUSU9OX1NFUlZJQ0VfVEFHID0gXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpzZXJ2aWNlXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBBcHAuZ2V0QXBwKCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgd2l0aCBuZXcgVlBDXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAqICAgbmV0d29yazogeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB1c2luZyBleGlzdGluZyBWUENcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwge1xuICogICBuZXR3b3JrOiB7IHVzZUV4aXN0aW5nOiBcInZwYy0xMjM0NTY3OFwiIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHdpdGhvdXQgbmV0d29yayAoUzMtb25seSBhcHBzKVxuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7IG5ldHdvcms6IGZhbHNlIH0pO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHBPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAgICogLSBPYmplY3Qgd2l0aCBJTmV0d29ya1Byb3BzOiBDcmVhdGUgbmV3IFZQQyB3aXRoIGNvbmZpZ1xuICAgKiAtIGZhbHNlOiBObyBuZXR3b3JrIChmb3IgUzMtb25seSBhcHBzKVxuICAgKiAtIHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9OiBVc2UgZXhpc3RpbmcgVlBDIGJ5IElEXG4gICAqL1xuICBuZXR3b3JrPzogSU5ldHdvcmtQcm9wcyB8IGZhbHNlIHwgeyB1c2VFeGlzdGluZzogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBCYWNrdXAgY29uZmlndXJhdGlvbiBmb3IgYXV0b21hdGljIEFXUyBCYWNrdXAgZW5yb2xtZW50LlxuICAgKiAtIE9iamVjdCB3aXRoIHRpZXI6IFRhZ3MgYWxsIHJlc291cmNlcyB3aXRoIGBmamFsbDpkaXNhc3RlclJlY292ZXJ5OnRpZXJgXG4gICAqIC0gZmFsc2U6IEV4cGxpY2l0bHkgZGlzYWJsZWQgKG5vIGJhY2t1cCB0YWcpXG4gICAqL1xuICBiYWNrdXA/OiB7IHRpZXI6IEJhY2t1cFRpZXIgfSB8IGZhbHNlO1xuICAvKipcbiAgICogVHVubmVsIGNvbmZpZ3VyYXRpb24gZm9yIHNlY3VyZSBkYXRhYmFzZSBhY2Nlc3MgdmlhIFNTTSBTZXNzaW9uIE1hbmFnZXIuXG4gICAqIC0gdHJ1ZSBvciB7fTogQ3JlYXRlIGJhc3Rpb24gd2l0aCBkZWZhdWx0IHQ0Zy5taWNybyBpbnN0YW5jZVxuICAgKiAtIHsgaW5zdGFuY2VUeXBlOiBzdHJpbmcgfTogQ3JlYXRlIGJhc3Rpb24gd2l0aCBjdXN0b20gaW5zdGFuY2UgdHlwZVxuICAgKiAtIGZhbHNlOiBFeHBsaWNpdGx5IGRpc2FibGVkIChubyBiYXN0aW9uKVxuICAgKi9cbiAgdHVubmVsPzogeyBpbnN0YW5jZVR5cGU/OiBzdHJpbmcgfSB8IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGJhc2ljIGNvcm5lci1zdG9uZSBvZiBhbGwgRmphbGwtaG9zdGVkIGFwcGxpY2F0aW9ucy5cbiAqICBUaGlzIGNsYXNzIGlzIGEgc2luZ2xldG9uIGFuZCBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZVxuICogICBhbGwgcmVzb3VyY2VzIGluIGEgRmphbGwgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHAgZXh0ZW5kcyBDZGtBcHAge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQXBwIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBQYXNjYWxDYXNlIGZvcm0gb2YgbmFtZSwgdXNlZCBhcyBzdGFjay1uYW1lIHByZWZpeCBhbmQgY29uc3RydWN0IElEcy4gKi9cbiAgcHJpdmF0ZSBzdGFja1ByZWZpeDogc3RyaW5nO1xuICBwcml2YXRlIHN0YWNrczogeyBba2V5OiBzdHJpbmddOiBBd3NTdGFjayB9ID0ge307XG5cbiAgcHJpdmF0ZSB2cGM/OiBJVnBjO1xuICBwcml2YXRlIGFkZGl0aW9uYWxWcGNzID0gbmV3IE1hcDxzdHJpbmcsIElWcGM+KCk7XG4gIHByaXZhdGUgZGVmYXVsdEVjcjogRWNyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRlZmF1bHRBdWRpdFJvbGU6IFJvbGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgYXVkaXRSb2xlRXh0ZXJuYWxJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBiYXN0aW9uPzogRWMySW5zdGFuY2U7XG4gIHByaXZhdGUgbmV0d29ya0Rpc2FibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgZ2xvYmFsVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIGFzcGVjdEFwcGxpZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvdXJjZUludmVudG9yeT86IFJlc291cmNlSW52ZW50b3J5QXNwZWN0O1xuICBwcml2YXRlIG1hbmlmZXN0Q29sbGVjdG9yOiBNYW5pZmVzdENvbGxlY3RvcjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBBcHAuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyBcIkZqYWxsQXBwXCI7XG4gICAgdGhpcy5zdGFja1ByZWZpeCA9IHRvUGFzY2FsQ2FzZSh0aGlzLm5hbWUpO1xuXG4gICAgLy8gSW5pdGlhbGlzZSBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIGJ1aWxkLXRpbWUgc2VydmljZSBkaXNjb3ZlcnlcbiAgICB0aGlzLm1hbmlmZXN0Q29sbGVjdG9yID0gZ2V0TWFuaWZlc3RDb2xsZWN0b3IodGhpcy5uYW1lKTtcblxuICAgIHRoaXMuaW5pdGlhbGlzZVN0YW5kYXJkVGFncygpO1xuXG4gICAgLy8gQXBwbHkgYmFja3VwIHRpZXIgdGFnIGlmIGNvbmZpZ3VyZWRcbiAgICBpZiAob3B0aW9ucz8uYmFja3VwICYmIHR5cGVvZiBvcHRpb25zLmJhY2t1cCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5hcHBseUJhY2t1cFRhZyhvcHRpb25zLmJhY2t1cC50aWVyKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXNlIG5ldHdvcmsgaW1tZWRpYXRlbHkgaWYgY29uZmlndXJlZFxuICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8ubmV0d29yaykge1xuICAgICAgdGhpcy5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpc2UgdHVubmVsIGJhc3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChvcHRpb25zPy50dW5uZWwpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzZVR1bm5lbChvcHRpb25zLnR1bm5lbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGJhY2t1cCB0aWVyIHRhZyB0byBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHAuXG4gICAqIE1hcHMgdGllciBuYW1lcyB0byBBV1MgQmFja3VwIHBsYW4gdGFnIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlCYWNrdXBUYWcodGllcjogQmFja3VwVGllcik6IHZvaWQge1xuICAgIHRoaXMuZ2xvYmFsVGFnc1tCQUNLVVBfVElFUl9UQUdfS0VZXSA9IEJBQ0tVUF9USUVSX1RBR19NQVBbdGllcl07XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZSB0aGUgdHVubmVsIGJhc3Rpb24gaW4gdGhlIG5ldHdvcmsgc3RhY2suXG4gICAqIENyZWF0ZXMgYSBtaW5pbWFsIEVDMiBpbnN0YW5jZSBmb3IgU1NNIHBvcnQgZm9yd2FyZGluZyB0byBkYXRhYmFzZXMuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VUdW5uZWwoY29uZmlnOiB7IGluc3RhbmNlVHlwZT86IHN0cmluZyB9IHwgdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5ldHdvcmtEaXNhYmxlZCB8fCAhdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUdW5uZWwgcmVxdWlyZXMgYSBuZXR3b3JrLiBDb25maWd1cmUgbmV0d29yayBiZWZvcmUgZW5hYmxpbmcgdHVubmVsLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9XG4gICAgICB0eXBlb2YgY29uZmlnID09PSBcIm9iamVjdFwiICYmIGNvbmZpZy5pbnN0YW5jZVR5cGVcbiAgICAgICAgPyBjb25maWcuaW5zdGFuY2VUeXBlXG4gICAgICAgIDogXCJ0NGcubWljcm9cIjtcblxuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgIGNvbnN0IGJhc3Rpb25JZCA9IGAke3RoaXMuc3RhY2tQcmVmaXh9QmFzdGlvbmA7XG5cbiAgICB0aGlzLmJhc3Rpb24gPSBuZXcgRWMySW5zdGFuY2UobmV0d29ya1N0YWNrLmdldFN0YWNrKCksIGJhc3Rpb25JZCwge1xuICAgICAgc2VydmljZU5hbWU6IGAke3RoaXMuc3RhY2tQcmVmaXh9QmFzdGlvbmAsXG4gICAgICBpbnN0YW5jZVR5cGUsXG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgZW5hYmxlU1NIOiBmYWxzZSxcbiAgICAgIG1pbkNhcGFjaXR5OiAxLFxuICAgICAgbWF4Q2FwYWNpdHk6IDFcbiAgICB9KTtcblxuICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3QodGhpcy5iYXN0aW9uKTtcblxuICAgIGNvbnN0IG91dHB1dFByZWZpeCA9IHRvUGFzY2FsQ2FzZSh0aGlzLm5hbWUpO1xuICAgIG5ldyBDZm5PdXRwdXQobmV0d29ya1N0YWNrLmdldFN0YWNrKCksIGAke291dHB1dFByZWZpeH1CYXN0aW9uSW5zdGFuY2VJZGAsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmJhc3Rpb24uZ2V0QXV0b1NjYWxpbmdHcm91cCgpLmF1dG9TY2FsaW5nR3JvdXBOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IFwiQmFzdGlvbiBBU0cgbmFtZSBmb3IgU1NNIHR1bm5lbCBkaXNjb3ZlcnlcIlxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQoXG4gICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgIGAke291dHB1dFByZWZpeH1CYXN0aW9uU2VjdXJpdHlHcm91cElkYCxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuYmFzdGlvbi5hc2dTZWN1cml0eUdyb3VwLnNlY3VyaXR5R3JvdXBJZCxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQmFzdGlvbiBzZWN1cml0eSBncm91cCBJRFwiXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBuZXR3b3JrIChWUEMpIGZvciB0aGlzIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXNlTmV0d29yayhcbiAgICBjb25maWc6IElOZXR3b3JrUHJvcHMgfCB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgIGlmIChcInVzZUV4aXN0aW5nXCIgaW4gY29uZmlnKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKFxuICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1JbXBvcnRlZFZwY2AsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGNJZDogY29uZmlnLnVzZUV4aXN0aW5nXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtDb25maWcgPSB7IC4uLmNvbmZpZywgdnBjTmFtZTogY29uZmlnLnZwY05hbWUgPz8gdGhpcy5uYW1lIH07XG4gICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29ya0ZhY3RvcnkuYnVpbGQoXG4gICAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9VnBjYCxcbiAgICAgICAgbmV0d29ya0NvbmZpZ1xuICAgICAgKSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgICB0aGlzLnZwYyA9IG5ldHdvcmsuZ2V0VnBjKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwbGljYXRpb24gbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGFwcGxpY2F0aW9uIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIGEgYmFzaWMgRmphbGwgQXBwbGljYXRpb24gd2l0aCBzdGFuZGFyZCB0YWdzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIEFwcGxpY2F0aW9uIG5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBuZXR3b3JrIHNldHRpbmdzXG4gICAqIEByZXR1cm5zIHtBcHB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aCBuZXcgVlBDXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwge1xuICAgKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICAgKiB9KTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB1c2luZyBleGlzdGluZyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHdpdGhvdXQgbmV0d29yayAoUzMtb25seSBhcHBzKVxuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHsgbmV0d29yazogZmFsc2UgfSk7XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEFwcChuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIHJldHVybiBBcHAuZ2V0SW5zdGFuY2UobmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0L0NyZWF0ZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBBcHBcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UobmFtZT86IHN0cmluZywgb3B0aW9ucz86IElBcHBPcHRpb25zKTogQXBwIHtcbiAgICAvLyBEZXNwaXRlIHN1cHBvcnRpbmcgbXVsdGlwbGUgc3RhY2tzIHlvdSBjYW4gc3RpbGwgb25seSBldmVyXG4gICAgLy8gaGF2ZSBhIHNpbmdsZSBBcHBsaWNhdGlvbiBwZXIgQ0RLIGRlcGxveW1lbnRcbiAgICBpZiAoIUFwcC5pbnN0YW5jZSkge1xuICAgICAgQXBwLmluc3RhbmNlID0gbmV3IEFwcChuYW1lLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgc2luZ2xldG9uIGV4aXN0cyBidXQgbmFtZSBkaWZmZXJzLCB1cGRhdGUgaXQgKGJlZm9yZSBhbnkgaW5mcmEgaXMgZGVmaW5lZClcbiAgICAgIGlmIChuYW1lICYmIEFwcC5pbnN0YW5jZS5uYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIC8vIFdhcm4gaWYgbmV0d29yayBhbHJlYWR5IGluaXRpYWxpc2VkIC0gY2hhbmdpbmcgbmFtZSBhZnRlciBuZXR3b3JrIGV4aXN0cyBjcmVhdGVzIGEgbWlzbWF0Y2hcbiAgICAgICAgaWYgKEFwcC5pbnN0YW5jZS52cGMpIHtcbiAgICAgICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICAgICAgYEFwcCBuYW1lIGNoYW5nZWQgZnJvbSBcIiR7QXBwLmluc3RhbmNlLm5hbWV9XCIgdG8gXCIke25hbWV9XCIgYWZ0ZXIgbmV0d29yayB3YXMgaW5pdGlhbGlzZWQuIGAgK1xuICAgICAgICAgICAgICBgVlBDIHdpbGwgaGF2ZSBuYW1lIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1WcGNcIiBidXQgYXBwIG5hbWUgaXMgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBgRW5zdXJlIEFwcC5nZXRBcHAoKSBpcyBjYWxsZWQgd2l0aCB0aGUgZmluYWwgbmFtZSBiZWZvcmUgaW5pdGlhbGlzaW5nIG5ldHdvcmsuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgQXBwLmluc3RhbmNlLm5hbWUgPSBuYW1lO1xuICAgICAgICBBcHAuaW5zdGFuY2Uuc3RhY2tQcmVmaXggPSB0b1Bhc2NhbENhc2UobmFtZSk7XG4gICAgICAgIC8vIFJlaW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzIHdpdGggdGhlIG5ldyBuYW1lXG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG9wdGlvbnMgcHJvdmlkZWQgYnV0IG5ldHdvcmsgbm90IHlldCBpbml0aWFsaXNlZCwgaW5pdGlhbGlzZSBpdCBub3dcbiAgICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgICBBcHAuaW5zdGFuY2UubmV0d29ya0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG9wdGlvbnM/Lm5ldHdvcmsgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS52cGMgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWRcbiAgICAgICkge1xuICAgICAgICBBcHAuaW5zdGFuY2UuaW5pdGlhbGlzZU5ldHdvcmsob3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYmFja3VwIHRhZyBpZiBjb25maWd1cmVkIGFuZCBub3QgYWxyZWFkeSBzZXRcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucz8uYmFja3VwICYmXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmJhY2t1cCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLmdsb2JhbFRhZ3NbQkFDS1VQX1RJRVJfVEFHX0tFWV1cbiAgICAgICkge1xuICAgICAgICBBcHAuaW5zdGFuY2UuYXBwbHlCYWNrdXBUYWcob3B0aW9ucy5iYWNrdXAudGllcik7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpc2UgdHVubmVsIGlmIGNvbmZpZ3VyZWQgYW5kIG5vdCBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgIGlmIChvcHRpb25zPy50dW5uZWwgJiYgIUFwcC5pbnN0YW5jZS5iYXN0aW9uKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlVHVubmVsKG9wdGlvbnMudHVubmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXBwLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEgc3RhY2sgYnkga2V5LiBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogIERlcGVuZGVuY2llcyBhcmUgb25seSBhcHBsaWVkIHRoZSBmaXJzdCB0aW1lIGEgc3RhY2sgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIHN0YWNrXG4gICAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgc3RhY2socykgdGhhdCB0aGlzIHN0YWNrIGRlcGVuZHMgb25cbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldFN0YWNrKGtleTogc3RyaW5nLCBkZXBlbmRlbmNpZXM/OiBBd3NTdGFjayB8IEF3c1N0YWNrW10pOiBBd3NTdGFjayB7XG4gICAgLy8gQXBwbHkgdGhlIGFzcGVjdCBvbmNlIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlyc3Qgc3RhY2tcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hc3BlY3RBcHBsaWVkICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0YWNrcykubGVuZ3RoID09PSAwICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdzQXNwZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YWNrc1trZXldKSB7XG4gICAgICB0aGlzLnN0YWNrc1trZXldID0gbmV3IEF3c1N0YWNrKGtleSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFja3Nba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q29tcHV0ZWBcbiAgICpcbiAgICogT25seSBkZXBlbmRzIG9uIE5ldHdvcmsuIERhdGFiYXNlIGRlcGVuZGVuY3kgaXMgYWRkZWQgYXV0b21hdGljYWxseVxuICAgKiBieSBDREsgd2hlbiBjb21wdXRlIHJlc291cmNlcyByZWZlcmVuY2UgZGF0YWJhc2UgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soXG4gICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fUNvbXB1dGVgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgbmV0d29yayBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1OZXR3b3JrYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5zdGFja1ByZWZpeH1OZXR3b3JrYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1EYXRhYmFzZWBcbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHREYXRhYmFzZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9RGF0YWJhc2VgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgc3RvcmFnZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1TdG9yYWdlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soXG4gICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fVN0b3JhZ2VgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgQ0ROIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfUNkbmBcbiAgICpcbiAgICogRGVwZW5kcyBvbiBOZXR3b3JrLiBDb21wdXRlL1N0b3JhZ2UgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIGJ5IENESyB3aGVuIENETiByZXNvdXJjZXMgcmVmZXJlbmNlIEFMQiBvciBTMyBidWNrZXQgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdENkblN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9Q2RuYCxcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IG1lc3NhZ2luZyBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1NZXNzYWdpbmdgXG4gICAqXG4gICAqIFVzZWQgZm9yIFNRUyBxdWV1ZXMsIFNOUyB0b3BpY3MsIGFuZCBFdmVudEJyaWRnZSBldmVudCBidXNlcy5cbiAgICogRGVwZW5kcyBvbiBOZXR3b3JrIG9ubHkuIFRoZXNlIGFyZSByZWdpb25hbCBzZXJ2aWNlcyB0aGF0IGRvbid0XG4gICAqIHJlcXVpcmUgVlBDLCBidXQgd2UgbWFpbnRhaW4gY29uc2lzdGVudCBzdGFjayBkZXBlbmRlbmN5IHBhdHRlcm5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdE1lc3NhZ2luZ1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9TWVzc2FnaW5nYCxcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBWUEMgYnkgbmFtZS4gSWYgbm8gbmFtZSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgZGVmYXVsdCBWUEMuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBwdXJlIGdldHRlciAtIGl0IG5ldmVyIGNyZWF0ZXMgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqIE5ldHdvcmsgbXVzdCBiZSBjb25maWd1cmVkIHZpYSBBcHAuZ2V0QXBwKCkgb3B0aW9ucyBvciBhcHAuYWRkTmV0d29yaygpLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIFZQQyB0byByZXRyaWV2ZS4gSWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICogQHJldHVybnMge0lWcGN9IFRoZSBjb25maWd1cmVkIFZQQ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbmV0d29yayBpcyBkaXNhYmxlZCwgbm90IGNvbmZpZ3VyZWQsIG9yIG5hbWVkIFZQQyBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBnZXRWcGMobmFtZT86IHN0cmluZyk6IElWcGMge1xuICAgIGlmICh0aGlzLm5ldHdvcmtEaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk5ldHdvcmsgaXMgZGlzYWJsZWQgZm9yIHRoaXMgYXBwLiBDYW5ub3QgZ2V0IFZQQy4gXCIgK1xuICAgICAgICAgIFwiUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkgdG8gZW5hYmxlIG5ldHdvcmtpbmcuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgbmFtZSBpcyBwcm92aWRlZCwgbG9vayBpbiBhZGRpdGlvbmFsIFZQQ3MgZmlyc3RcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFZwYyA9IHRoaXMuYWRkaXRpb25hbFZwY3MuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGFkZGl0aW9uYWxWcGMpIHtcbiAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxWcGM7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWUEMgJyR7bmFtZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlIFZQQ3M6ICR7dGhpcy5nZXRWcGNOYW1lcygpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgIFwiQ3JlYXRlIGFkZGl0aW9uYWwgVlBDcyB1c2luZyBhcHAuYWRkTmV0d29yayhOZXR3b3JrRmFjdG9yeS5idWlsZCguLi4pKS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZGVmYXVsdCBWUENcbiAgICBpZiAoIXRoaXMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBub3QgY29uZmlndXJlZC4gUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkuIFwiICtcbiAgICAgICAgICBcIkV4YW1wbGU6IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiB7IG1heEF6czogMiB9IH0pXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZwYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hbWVzIG9mIGFsbCBhdmFpbGFibGUgVlBDcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiBWUEMgbmFtZXMuIEluY2x1ZGVzIFwiZGVmYXVsdFwiIGlmIHRoZSBkZWZhdWx0IFZQQyBpcyBjb25maWd1cmVkLlxuICAgKi9cbiAgcHVibGljIGdldFZwY05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy52cGMpIHtcbiAgICAgIG5hbWVzLnB1c2goXCJkZWZhdWx0XCIpO1xuICAgIH1cbiAgICBuYW1lcy5wdXNoKC4uLnRoaXMuYWRkaXRpb25hbFZwY3Mua2V5cygpKTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIHJlZ2lzdHJ5LiBJZiB0aGUgcmVnaXN0cnkgZG9lcyBub3QgZXhpc3RcbiAgICogIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTogRWNyIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEVjcikge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG5cbiAgICAgIGNvbnN0IGVjciA9IEVjckZhY3RvcnkuYnVpbGQoYCR7dGhpcy5zdGFja1ByZWZpeH1FY3JgLCB7XG4gICAgICAgIHJlcG9zaXRvcnlOYW1lOiB0b0tlYmFiKHRoaXMubmFtZSlcbiAgICAgIH0pKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcbiAgICAgIHRoaXMuZGVmYXVsdEVjciA9IGVjcjtcbiAgICAgIHJldHVybiBlY3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEVjcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjcm9zcy1hY2NvdW50IGF1ZGl0IHJvbGUgaW4gdGhlIE5ldHdvcmsgc3RhY2sgdGhhdCBhbGxvd3NcbiAgICogdGhlIEZqYWxsIHBsYXRmb3JtIHRvIHVzZSBDbG91ZFF1ZXJ5IGZvciBjb21wcmVoZW5zaXZlIEFXUyByZXNvdXJjZSBhdWRpdGluZy5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBleHBsaWNpdCBvcHQtaW4gZmVhdHVyZS4gQ2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUgQ2xvdWRRdWVyeVxuICAgKiBhdWRpdCBjYXBhYmlsaXRpZXMgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJhcHBBY2NvdW50SWQgLSBPcHRpb25hbCBBV1MgYWNjb3VudCBJRCBvZiB0aGUgRmphbGwgd2ViYXBwLiBEZWZhdWx0cyB0byBjb25maWd1cmVkIHBsYXRmb3JtIGFjY291bnQuXG4gICAqIEBwYXJhbSBleHRlcm5hbElkIC0gT3B0aW9uYWwgZXh0ZXJuYWwgSUQgZm9yIGFkZGl0aW9uYWwgc2VjdXJpdHkuIElmIG5vdCBwcm92aWRlZCwgYSB1bmlxdWUgSUQgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqIEByZXR1cm5zIHtSb2xlfSBUaGUgY3JlYXRlZCBhdWRpdCByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQXVkaXRSb2xlKHdlYmFwcEFjY291bnRJZD86IHN0cmluZywgZXh0ZXJuYWxJZD86IHN0cmluZyk6IFJvbGUge1xuICAgIGlmICghdGhpcy5kZWZhdWx0QXVkaXRSb2xlKSB7XG4gICAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICAgIGNvbnN0IGFjY291bnRJZCA9XG4gICAgICAgIHdlYmFwcEFjY291bnRJZCB8fCBGSkFMTF9BVURJVF9DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICB0aGlzLmF1ZGl0Um9sZUV4dGVybmFsSWQgPSBleHRlcm5hbElkIHx8IHRoaXMuZ2VuZXJhdGVBdWRpdEV4dGVybmFsSWQoKTtcblxuICAgICAgY29uc3Qgcm9sZSA9IEF1ZGl0Um9sZUZhY3RvcnkuYnVpbGQoYCR7dGhpcy5zdGFja1ByZWZpeH1BdWRpdFJvbGVgLCB7XG4gICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICBhcHBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGV4dGVybmFsSWQ6IHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZCxcbiAgICAgICAgcm9sZU5hbWVQcmVmaXg6IEZKQUxMX0FVRElUX0NPTkZJRy5yb2xlTmFtZVByZWZpeCxcbiAgICAgICAgcm9sZVBhdGg6IEZKQUxMX0FVRElUX0NPTkZJRy5yb2xlUGF0aFxuICAgICAgfSkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHJvbGUpO1xuICAgICAgdGhpcy5kZWZhdWx0QXVkaXRSb2xlID0gcm9sZTtcbiAgICAgIHJldHVybiByb2xlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdWRpdFJvbGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBleHRlcm5hbCBJRCB1c2VkIGZvciB0aGUgYXVkaXQgcm9sZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgZXh0ZXJuYWwgSUQgaWYgYXVkaXQgcm9sZSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0QXVkaXRSb2xlRXh0ZXJuYWxJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1ZGl0Um9sZUV4dGVybmFsSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSB1bmlxdWUgZXh0ZXJuYWwgSUQgZm9yIGF1ZGl0IHJvbGVcbiAgICogRm9ybWF0OiBmamFsbC1hdWRpdC17YXBwTmFtZX0te3RpbWVzdGFtcH1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBdWRpdEV4dGVybmFsSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bmlxdWVJZCA9IHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKFwiaGV4XCIpO1xuICAgIHJldHVybiBgZmphbGwtYXVkaXQtJHt0b0tlYmFiKHRoaXMubmFtZSl9LSR7dW5pcXVlSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wdXRlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgY29tcHV0ZSB0eXBlIGJhc2VkIG9uIHRoZSBmYWN0b3J5IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gRWNzQ29tcHV0ZSBmb3IgdHlwZTogXCJlY3NcIlxuICAgKiAtIExhbWJkYUNvbXB1dGUgZm9yIHR5cGU6IFwibGFtYmRhXCJcbiAgICogLSBFYzJDb21wdXRlIGZvciB0eXBlOiBcImVjMlwiXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlXG4gICAqIGNvbnN0IGFwaSA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpXCIsIHtcbiAgICogICB0eXBlOiBcImVjc1wiLFxuICAgKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcImFwaVwiLCAuLi4gfV1cbiAgICogfSkpO1xuICAgKiBhcGkuZ2V0TG9hZEJhbGFuY2VyKCk7IC8vIEF2YWlsYWJsZSBvbiBFY3NDb21wdXRlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIExhbWJkYSBjb21wdXRlIC0gcmV0dXJucyBMYW1iZGFDb21wdXRlXG4gICAqIGNvbnN0IHdvcmtlciA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV29ya2VyXCIsIHtcbiAgICogICB0eXBlOiBcImxhbWJkYVwiLFxuICAgKiAgIGZ1bmN0aW9uczogW3sgbmFtZTogXCJwcm9jZXNzXCIsIC4uLiB9XVxuICAgKiB9KSk7XG4gICAqIHdvcmtlci5nZXRGdW5jdGlvbihcInByb2Nlc3NcIik7IC8vIEF2YWlsYWJsZSBvbiBMYW1iZGFDb21wdXRlXG4gICAqL1xuICBwdWJsaWMgYWRkQ29tcHV0ZTxUIGV4dGVuZHMgQW55Q29tcHV0ZT4oXG4gICAgZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gVFxuICApOiBUIHtcbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBjb25zdHJ1Y3QgPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChjb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBjb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRhdGFiYXNlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgdXNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gICAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAgICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAgICogfSkpO1xuICAgKiBkYi5nZXRIb3N0RW5kcG9pbnQoKTsgLy8gQXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIER5bmFtb0RCIHRhYmxlIC0gcmV0dXJucyBEeW5hbW9EQkRhdGFiYXNlXG4gICAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAgICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAqICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJTXCIgfVxuICAgKiB9KSk7XG4gICAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZTxUIGV4dGVuZHMgQW55RGF0YWJhc2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBjb25zdCBkYXRhYmFzZUNvbnN0cnVjdCA9IGZuKHRoaXMsIGRhdGFiYXNlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QoZGF0YWJhc2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuXG4gICAgLy8gV2lyZSBiYXN0aW9uIOKGkiBkYXRhYmFzZSBzZWN1cml0eSBncm91cCBmb3IgdHVubmVsIGFjY2Vzc1xuICAgIGlmICh0aGlzLmJhc3Rpb24gJiYgdGhpcy5pc0Nvbm5lY3RhYmxlKGRhdGFiYXNlQ29uc3RydWN0KSkge1xuICAgICAgZGF0YWJhc2VDb25zdHJ1Y3QuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20odGhpcy5iYXN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YWJhc2VDb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCBmb3IgSUNvbm5lY3RhYmxlIOKAlCBjaGVja3MgaWYgYSBjb25zdHJ1Y3QgaGFzIGEgY29ubmVjdGlvbnMgcHJvcGVydHkuXG4gICAqL1xuICBwcml2YXRlIGlzQ29ubmVjdGFibGUoY29uc3RydWN0OiB1bmtub3duKTogY29uc3RydWN0IGlzIElDb25uZWN0YWJsZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBjb25zdHJ1Y3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIGNvbnN0cnVjdCAhPT0gbnVsbCAmJlxuICAgICAgXCJjb25uZWN0aW9uc1wiIGluIGNvbnN0cnVjdCAmJlxuICAgICAgdHlwZW9mIChjb25zdHJ1Y3QgYXMgSUNvbm5lY3RhYmxlKS5jb25uZWN0aW9ucyA9PT0gXCJvYmplY3RcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3RvcmFnZSByZXNvdXJjZSAoUzMpIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUHJpdmF0ZSBidWNrZXQgKGRlZmF1bHQpXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHtcbiAgICogICB2ZXJzaW9uZWQ6IHRydWVcbiAgICogfSkpO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBXZWJzaXRlIGJ1Y2tldFxuICAgKiBjb25zdCBzaXRlID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJTaXRlXCIsIHtcbiAgICogICB3ZWJzaXRlSG9zdGluZzogeyBpbmRleERvY3VtZW50OiBcImluZGV4Lmh0bWxcIiB9XG4gICAqIH0pKTtcbiAgICovXG4gIHB1YmxpYyBhZGRTdG9yYWdlKGZuOiBTdG9yYWdlRmFjdG9yeUZuKTogU3RvcmFnZSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZm4uc3RhY2tQbGFjZW1lbnQgPz8gXCJzdG9yYWdlXCI7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLnJlc29sdmVTdG9yYWdlU3RhY2socGxhY2VtZW50KTtcbiAgICBjb25zdCBzdG9yYWdlQ29uc3RydWN0ID0gZm4odGhpcywgc3RhY2suZ2V0U3RhY2soKSk7XG4gICAgc3RhY2suYWRkQ29uc3RydWN0KHN0b3JhZ2VDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBzdG9yYWdlQ29uc3RydWN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU3RvcmFnZVN0YWNrKHBsYWNlbWVudDogc3RyaW5nKTogQXdzU3RhY2sge1xuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlIFwiY2RuXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDZG5TdGFjaygpO1xuICAgICAgY2FzZSBcImNvbXB1dGVcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDRE4gcmVzb3VyY2UgKENsb3VkRnJvbnQpIHRvIHRoZSBkZWZhdWx0IENETiBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTMyBvcmlnaW5cbiAgICogY29uc3QgYXNzZXRzID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJBc3NldHNcIiwge30pKTtcbiAgICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXNzZXRzQ2RuXCIsIHtcbiAgICogICBvcmlnaW5UeXBlOiBcInMzXCIsXG4gICAqICAgYnVja2V0OiBhc3NldHNcbiAgICogfSkpO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBBTEIgb3JpZ2luIChFQ1MpXG4gICAqIGNvbnN0IGFwaSA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpXCIsIHsgdHlwZTogXCJlY3NcIiwgLi4uIH0pKTtcbiAgICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXBpQ2RuXCIsIHtcbiAgICogICBvcmlnaW5UeXBlOiBcImFsYlwiLFxuICAgKiAgIGxvYWRCYWxhbmNlcjogYXBpXG4gICAqIH0pKTtcbiAgICovXG4gIHB1YmxpYyBhZGRDZG4oZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQ2RuKTogQ2RuIHtcbiAgICBjb25zdCBjZG5TdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENkblN0YWNrKCk7XG4gICAgY29uc3QgY2RuID0gZm4odGhpcywgY2RuU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY2RuU3RhY2suYWRkQ29uc3RydWN0KGNkbik7XG5cbiAgICByZXR1cm4gY2RuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lc3NhZ2luZyByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBxdWV1ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdpbmcgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uLlxuICAgKiBDdXJyZW50bHkgc3VwcG9ydHMgcXVldWUgKFNRUyksIHdpdGggZnV0dXJlIHN1cHBvcnQgcGxhbm5lZCBmb3JcbiAgICogdG9waWMgKFNOUyksIGV2ZW50YnVzIChFdmVudEJyaWRnZSksIGFuZCBzdHJlYW0gKEtpbmVzaXMpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBRdWV1ZSBtZXNzYWdpbmcgLSByZXR1cm5zIFF1ZXVlTWVzc2FnaW5nXG4gICAqIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBhcHAuYWRkTWVzc2FnaW5nKE1lc3NhZ2luZ0ZhY3RvcnkuYnVpbGQoXCJOb3RpZmljYXRpb25zXCIsIHtcbiAgICogICB0eXBlOiBcInF1ZXVlXCIsXG4gICAqICAgcXVldWVUeXBlOiBcInN0YW5kYXJkXCIsXG4gICAqICAgZGVhZExldHRlclF1ZXVlOiB7IGVuYWJsZWQ6IHRydWUsIG1heFJlY2VpdmVDb3VudDogMyB9XG4gICAqIH0pKTtcbiAgICogbm90aWZpY2F0aW9ucy5ncmFudFNlbmRNZXNzYWdlcyhhcGlGdW5jdGlvbik7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEZJRk8gcXVldWUgZm9yIE9wZW5OZXh0IHJldmFsaWRhdGlvblxuICAgKiBjb25zdCByZXZhbGlkYXRpb24gPSBhcHAuYWRkTWVzc2FnaW5nKE1lc3NhZ2luZ0ZhY3RvcnkuYnVpbGQoXCJSZXZhbGlkYXRpb25cIiwge1xuICAgKiAgIHR5cGU6IFwicXVldWVcIixcbiAgICogICBxdWV1ZVR5cGU6IFwiZmlmb1wiLFxuICAgKiAgIHZpc2liaWxpdHlUaW1lb3V0OiAzMDAsXG4gICAqICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogdHJ1ZVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkTWVzc2FnaW5nPFQgZXh0ZW5kcyBBbnlNZXNzYWdpbmc+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgbWVzc2FnaW5nU3RhY2sgPSB0aGlzLmdldERlZmF1bHRNZXNzYWdpbmdTdGFjaygpO1xuICAgIGNvbnN0IG1lc3NhZ2luZyA9IGZuKHRoaXMsIG1lc3NhZ2luZ1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIG1lc3NhZ2luZ1N0YWNrLmFkZENvbnN0cnVjdChtZXNzYWdpbmcgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIG1lc3NhZ2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBoaWdoLWxldmVsIGluZnJhc3RydWN0dXJlIHBhdHRlcm4gdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBQYXR0ZXJucyBhcmUgY29tcG9zaXRlIGNvbnN0cnVjdHMgdGhhdCBjcmVhdGUgbXVsdGlwbGUgcmVsYXRlZCByZXNvdXJjZXNcbiAgICogYXMgYSBzaW5nbGUsIGNvaGVzaXZlIHVuaXQuIFRoZXkgZW5jYXBzdWxhdGUgYmVzdCBwcmFjdGljZXMgYW5kIHJlZHVjZVxuICAgKiBib2lsZXJwbGF0ZSBmb3IgY29tbW9uIGRlcGxveW1lbnQgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIHBhdHRlcm5zOlxuICAgKiAtIGBwYXlsb2FkYDogUGF5bG9hZCBDTVMgZGVwbG95bWVudCB3aXRoIE9wZW5OZXh0XG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHBhdHRlcm4gaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBmYWN0b3J5IGNvbmZpZ3VyYXRpb24sXG4gICAqIHByb3ZpZGluZyBhY2Nlc3MgdG8gYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzIHZpYSBlc2NhcGUgaGF0Y2hlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUGF5bG9hZCBDTVMgcGF0dGVybiAtIHJldHVybnMgUGF5bG9hZFxuICAgKiBjb25zdCBwYXlsb2FkID0gYXBwLmFkZFBhdHRlcm4oUGF0dGVybkZhY3RvcnkuYnVpbGQoXCJQYXlsb2FkQXBwXCIsIHtcbiAgICogICB0eXBlOiBcInBheWxvYWRcIixcbiAgICogICBuYW1lOiBcIm15LWNtc1wiLFxuICAgKiAgIHNvdXJjZTogXCIuLi8uLlwiXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRXNjYXBlIGhhdGNoZXMgLSBhY2Nlc3MgdW5kZXJseWluZyByZXNvdXJjZXNcbiAgICogcGF5bG9hZC5nZXREYXRhYmFzZSgpLmdyYW50Q29ubmVjdChvdGhlckxhbWJkYSk7XG4gICAqIHBheWxvYWQuZ2V0U2VydmVyKCkuZ2V0TGFtYmRhRnVuY3Rpb24oKS5hZGRFbnZpcm9ubWVudChcIkNVU1RPTVwiLCBcInZhbHVlXCIpO1xuICAgKiBwYXlsb2FkLmdldENkbigpLmdldERpc3RyaWJ1dGlvbigpLmFkZEJlaGF2aW9yKFwiL2N1c3RvbS8qXCIsIGN1c3RvbU9yaWdpbik7XG4gICAqL1xuICBwdWJsaWMgYWRkUGF0dGVybjxUIGV4dGVuZHMgQW55UGF0dGVybj4oXG4gICAgZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gVFxuICApOiBUIHtcbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gZm4odGhpcywgY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocGF0dGVybiBhcyB1bmtub3duIGFzIENvbnN0cnVjdCk7XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGFkZGl0aW9uYWwgbmV0d29yayAoVlBDKSB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIFZQQ3MgYmV5b25kIHRoZSBkZWZhdWx0IFZQQyBjb25maWd1cmVkIHZpYSBBcHAuZ2V0QXBwKCkuXG4gICAqIEFkZGl0aW9uYWwgVlBDcyBjYW4gYmUgcmV0cmlldmVkIGJ5IG5hbWUgdXNpbmcgYXBwLmdldFZwYyhuYW1lKS5cbiAgICpcbiAgICogQHBhcmFtIGZuIC0gRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIE5ldHdvcmsgY29uc3RydWN0XG4gICAqIEByZXR1cm5zIHtOZXR3b3JrfSBUaGUgY3JlYXRlZCBOZXR3b3JrIGNvbnN0cnVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBpc29sYXRlZFZwYyA9IGFwcC5hZGROZXR3b3JrKFxuICAgKiAgIE5ldHdvcmtGYWN0b3J5LmJ1aWxkKFwiSXNvbGF0ZWRWcGNcIiwgeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9KVxuICAgKiApO1xuICAgKi9cbiAgcHVibGljIGFkZE5ldHdvcmsoZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gTmV0d29yayk6IE5ldHdvcmsge1xuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgIGNvbnN0IG5ldHdvcmsgPSBmbih0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29uc3QgdnBjTmFtZSA9IG5ldHdvcmsubm9kZS5pZDtcblxuICAgIC8vIFN0b3JlIGluIGFkZGl0aW9uYWwgVlBDcyBtYXAgZm9yIHJldHJpZXZhbCB2aWEgZ2V0VnBjKG5hbWUpXG4gICAgdGhpcy5hZGRpdGlvbmFsVnBjcy5zZXQodnBjTmFtZSwgbmV0d29yay5nZXRWcGMoKSk7XG4gICAgbmV0d29ya1N0YWNrLmFkZENvbnN0cnVjdChuZXR3b3JrKTtcblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZERhdGFiYXNlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFiYXNlU3RhY2sgPSB0aGlzLmdldERlZmF1bHREYXRhYmFzZVN0YWNrKCk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yYWdlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHN0YW5kYXJkIHRhZ3NcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGlzZVN0YW5kYXJkVGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICB0aGlzLmdsb2JhbFRhZ3MgPSB7XG4gICAgICBbQ09TVF9BTExPQ0FUSU9OX0VOVklST05NRU5UX1RBR106IGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIFtDT1NUX0FMTE9DQVRJT05fU0VSVklDRV9UQUddOiB0aGlzLm5hbWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCB0YWdzIHVzaW5nIENESydzIG5hdGl2ZSBUYWdzLm9mKCkuYWRkKCkgQVBJXG4gICAqL1xuICBwcml2YXRlIGFwcGx5VGFnc0FzcGVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXNwZWN0QXBwbGllZCAmJiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFwcGx5IHN0YW5kYXJkIHRhZ3MgdXNpbmcgVGFncy5vZih0aGlzKS5hZGQoKVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5nbG9iYWxUYWdzKSkge1xuICAgICAgICBUYWdzLm9mKHRoaXMpLmFkZChrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYXNwZWN0IGZvciByZXNvdXJjZS1zcGVjaWZpYyB0YWdzIChJUEFNIHBvb2wsIGJhY2t1cCB0aWVyKVxuICAgICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IFN0YW5kYXJkVGFnc0FzcGVjdCgpKTtcblxuICAgICAgdGhpcy5hc3BlY3RBcHBsaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGN1c3RvbSB0YWdzIHRvIGFsbCByZXNvdXJjZXMgaW4gdGhlIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgQ3VzdG9tIHRhZ3MgdG8gYXBwbHkgdG8gYWxsIHJlc291cmNlc1xuICAgKiBAZXhhbXBsZVxuICAgKiBhcHAuYWRkVGFncyh7XG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpvd25lclwiOiBcInBsYXRmb3JtLXRlYW1cIixcbiAgICogICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmNvc3QtY2VudGVyXCI6IFwiQ0MtMTIzXCIsXG4gICAqICAgXCJ0ZWFtOnNsYWNrLWNoYW5uZWxcIjogXCIjcGxhdGZvcm0tYWxlcnRzXCJcbiAgICogfSk7XG4gICAqL1xuICBwdWJsaWMgYWRkVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogQXBwIHtcbiAgICAvLyBNZXJnZSB0YWdzIGludG8gZ2xvYmFsVGFncyBmb3IgdHJhY2tpbmdcbiAgICB0aGlzLmdsb2JhbFRhZ3MgPSB7XG4gICAgICAuLi50aGlzLmdsb2JhbFRhZ3MsXG4gICAgICAuLi50YWdzXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHJlc291cmNlIGludmVudG9yeSBjb2xsZWN0ZWQgZHVyaW5nIHN5bnRoZXNpc1xuICAgKiBDYWxsIHRoaXMgYWZ0ZXIgYXBwLnN5bnRoKCkgdG8gZ2V0IGNvbXBsZXRlIHJlc291cmNlIGludmVudG9yeVxuICAgKiBAcmV0dXJucyB7UmVzb3VyY2VJbnZlbnRvcnl9IENvbXBsZXRlIGludmVudG9yeSBvZiBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHBcbiAgICovXG4gIHB1YmxpYyBleHBvcnRSZXNvdXJjZUludmVudG9yeSgpOiBSZXNvdXJjZUludmVudG9yeSB7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlSW52ZW50b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUmVzb3VyY2UgaW52ZW50b3J5IG5vdCBhdmFpbGFibGUuIEVuc3VyZSBhIFJlc291cmNlSW52ZW50b3J5QXNwZWN0IGhhcyBiZWVuIGFkZGVkIGJlZm9yZSBjYWxsaW5nIGV4cG9ydFJlc291cmNlSW52ZW50b3J5KCkuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXNvdXJjZXM6IHRoaXMucmVzb3VyY2VJbnZlbnRvcnkuZ2V0SW52ZW50b3J5KCksXG4gICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgYXBwTmFtZTogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgcmVnaXN0ZXJpbmcgc2VydmljZXMgYW5kIHBhdHRlcm5zLlxuICAgKiBVc2VkIGJ5IENvbXB1dGVGYWN0b3J5IGFuZCBQYXR0ZXJuRmFjdG9yeSB0byByZWdpc3RlciB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBnZXRNYW5pZmVzdENvbGxlY3RvcigpOiBNYW5pZmVzdENvbGxlY3RvciB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3RDb2xsZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgc3ludGggdG8gYXV0b21hdGljYWxseSBleHBvcnQgcmVzb3VyY2UgaW52ZW50b3J5IGFuZCBtYW5pZmVzdFxuICAgKi9cbiAgcHVibGljIHN5bnRoKG9wdGlvbnM/OiBTdGFnZVN5bnRoZXNpc09wdGlvbnMpOiBDbG91ZEFzc2VtYmx5IHtcbiAgICAvLyBDYWxsIHBhcmVudCBzeW50aCBmaXJzdFxuICAgIGNvbnN0IGFzc2VtYmx5ID0gc3VwZXIuc3ludGgob3B0aW9ucyk7XG5cbiAgICAvLyBBZnRlciBzeW50aGVzaXMsIHdyaXRlIEZqYWxsIG1hbmlmZXN0IHRvIGNkay5vdXRcbiAgICB0cnkge1xuICAgICAgd3JpdGVNYW5pZmVzdChhc3NlbWJseSwgdGhpcy5tYW5pZmVzdENvbGxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IGZhaWwgc3ludGggaWYgbWFuaWZlc3QgZXhwb3J0IGZhaWxzXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBGamFsbExvZ2dlci53YXJuKGBGYWlsZWQgdG8gZXhwb3J0IEZqYWxsIG1hbmlmZXN0OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzZW1ibHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl19
@@ -0,0 +1 @@
1
+ export { ResourceInventoryAspect, type ResourceMetadata, type ResourceInventory } from "./resourceInventory";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceInventoryAspect = void 0;
4
+ var resourceInventory_1 = require("./resourceInventory");
5
+ Object.defineProperty(exports, "ResourceInventoryAspect", { enumerable: true, get: function () { return resourceInventory_1.ResourceInventoryAspect; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYXNwZWN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5REFJNkI7QUFIM0IsNEhBQUEsdUJBQXVCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBSZXNvdXJjZUludmVudG9yeUFzcGVjdCxcbiAgdHlwZSBSZXNvdXJjZU1ldGFkYXRhLFxuICB0eXBlIFJlc291cmNlSW52ZW50b3J5XG59IGZyb20gXCIuL3Jlc291cmNlSW52ZW50b3J5XCI7XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { Role } from "aws-cdk-lib/aws-iam";
2
+ import { Construct } from "constructs";
3
+ export interface AccountAuditRoleProps {
4
+ /**
5
+ * The Fjall organisation ID. Used as a suffix in the role name
6
+ * (`FjallAudit{orgId}`) and as the ExternalId condition.
7
+ */
8
+ fjallOrgId: string;
9
+ }
10
+ /**
11
+ * Per-account audit role for the Fjall platform.
12
+ *
13
+ * Creates a `FjallAudit{orgId}` IAM role with ReadOnlyAccess and SecurityAudit
14
+ * managed policies, trusting the Fjall platform account. Only instantiated when
15
+ * a `fjallOrgId` context value is provided to the Account stack.
16
+ */
17
+ export declare class AccountAuditRole extends Construct {
18
+ readonly role: Role;
19
+ constructor(scope: Construct, id: string, props: AccountAuditRoleProps);
20
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountAuditRole = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const constructs_1 = require("constructs");
7
+ const platform_1 = require("./platform");
8
+ /**
9
+ * Per-account audit role for the Fjall platform.
10
+ *
11
+ * Creates a `FjallAudit{orgId}` IAM role with ReadOnlyAccess and SecurityAudit
12
+ * managed policies, trusting the Fjall platform account. Only instantiated when
13
+ * a `fjallOrgId` context value is provided to the Account stack.
14
+ */
15
+ class AccountAuditRole extends constructs_1.Construct {
16
+ constructor(scope, id, props) {
17
+ super(scope, id);
18
+ this.role = new aws_iam_1.Role(this, "Role", {
19
+ roleName: `FjallAudit${props.fjallOrgId}`,
20
+ path: "/",
21
+ assumedBy: new aws_iam_1.AccountPrincipal(platform_1.FJALL_PLATFORM_ACCOUNT_ID),
22
+ description: `Cross-account audit role for Fjall organisation ${props.fjallOrgId}. Grants read-only access for asset discovery and compliance auditing.`,
23
+ externalIds: [props.fjallOrgId],
24
+ managedPolicies: [
25
+ aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"),
26
+ aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName("SecurityAudit")
27
+ ]
28
+ });
29
+ new aws_cdk_lib_1.CfnOutput(this, "FjallAuditRoleArn", {
30
+ key: "FjallAuditRoleArn",
31
+ value: this.role.roleArn,
32
+ description: `ARN of the Fjall audit role for organisation ${props.fjallOrgId}`,
33
+ exportName: "FjallAuditRoleArn"
34
+ });
35
+ }
36
+ }
37
+ exports.AccountAuditRole = AccountAuditRole;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudEF1ZGl0Um9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL2FjY291bnRBdWRpdFJvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXdDO0FBQ3hDLGlEQUE0RTtBQUM1RSwyQ0FBdUM7QUFDdkMseUNBQXVEO0FBVXZEOzs7Ozs7R0FNRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFHN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxjQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNqQyxRQUFRLEVBQUUsYUFBYSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3pDLElBQUksRUFBRSxHQUFHO1lBQ1QsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsb0NBQXlCLENBQUM7WUFDMUQsV0FBVyxFQUFFLG1EQUFtRCxLQUFLLENBQUMsVUFBVSx3RUFBd0U7WUFDeEosV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUMvQixlQUFlLEVBQUU7Z0JBQ2YsdUJBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDeEQsdUJBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUM7YUFDeEQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3ZDLEdBQUcsRUFBRSxtQkFBbUI7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN4QixXQUFXLEVBQUUsZ0RBQWdELEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDL0UsVUFBVSxFQUFFLG1CQUFtQjtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6QkQsNENBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBSb2xlLCBBY2NvdW50UHJpbmNpcGFsLCBNYW5hZ2VkUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBGSkFMTF9QTEFURk9STV9BQ0NPVU5UX0lEIH0gZnJvbSBcIi4vcGxhdGZvcm1cIjtcblxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QXVkaXRSb2xlUHJvcHMge1xuICAvKipcbiAgICogVGhlIEZqYWxsIG9yZ2FuaXNhdGlvbiBJRC4gVXNlZCBhcyBhIHN1ZmZpeCBpbiB0aGUgcm9sZSBuYW1lXG4gICAqIChgRmphbGxBdWRpdHtvcmdJZH1gKSBhbmQgYXMgdGhlIEV4dGVybmFsSWQgY29uZGl0aW9uLlxuICAgKi9cbiAgZmphbGxPcmdJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlci1hY2NvdW50IGF1ZGl0IHJvbGUgZm9yIHRoZSBGamFsbCBwbGF0Zm9ybS5cbiAqXG4gKiBDcmVhdGVzIGEgYEZqYWxsQXVkaXR7b3JnSWR9YCBJQU0gcm9sZSB3aXRoIFJlYWRPbmx5QWNjZXNzIGFuZCBTZWN1cml0eUF1ZGl0XG4gKiBtYW5hZ2VkIHBvbGljaWVzLCB0cnVzdGluZyB0aGUgRmphbGwgcGxhdGZvcm0gYWNjb3VudC4gT25seSBpbnN0YW50aWF0ZWQgd2hlblxuICogYSBgZmphbGxPcmdJZGAgY29udGV4dCB2YWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgQWNjb3VudCBzdGFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnRBdWRpdFJvbGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogUm9sZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjb3VudEF1ZGl0Um9sZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucm9sZSA9IG5ldyBSb2xlKHRoaXMsIFwiUm9sZVwiLCB7XG4gICAgICByb2xlTmFtZTogYEZqYWxsQXVkaXQke3Byb3BzLmZqYWxsT3JnSWR9YCxcbiAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgQWNjb3VudFByaW5jaXBhbChGSkFMTF9QTEFURk9STV9BQ0NPVU5UX0lEKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ3Jvc3MtYWNjb3VudCBhdWRpdCByb2xlIGZvciBGamFsbCBvcmdhbmlzYXRpb24gJHtwcm9wcy5mamFsbE9yZ0lkfS4gR3JhbnRzIHJlYWQtb25seSBhY2Nlc3MgZm9yIGFzc2V0IGRpc2NvdmVyeSBhbmQgY29tcGxpYW5jZSBhdWRpdGluZy5gLFxuICAgICAgZXh0ZXJuYWxJZHM6IFtwcm9wcy5mamFsbE9yZ0lkXSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIlJlYWRPbmx5QWNjZXNzXCIpLFxuICAgICAgICBNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIlNlY3VyaXR5QXVkaXRcIilcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJGamFsbEF1ZGl0Um9sZUFyblwiLCB7XG4gICAgICBrZXk6IFwiRmphbGxBdWRpdFJvbGVBcm5cIixcbiAgICAgIHZhbHVlOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgQVJOIG9mIHRoZSBGamFsbCBhdWRpdCByb2xlIGZvciBvcmdhbmlzYXRpb24gJHtwcm9wcy5mamFsbE9yZ0lkfWAsXG4gICAgICBleHBvcnROYW1lOiBcIkZqYWxsQXVkaXRSb2xlQXJuXCJcbiAgICB9KTtcbiAgfVxufVxuIl19