terraconstructs 0.2.1 → 0.2.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 (277) hide show
  1. package/.jsii +1081 -229
  2. package/lib/asset-staging.js +1 -1
  3. package/lib/aws/arn.js +1 -1
  4. package/lib/aws/aws-asset-manager.js +1 -1
  5. package/lib/aws/aws-construct.js +1 -1
  6. package/lib/aws/aws-stack.js +1 -1
  7. package/lib/aws/aws-tags.js +2 -2
  8. package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/actions/sns.js +1 -1
  12. package/lib/aws/cloudwatch/actions/ssm.js +2 -2
  13. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  14. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  15. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  16. package/lib/aws/cloudwatch/alarm.js +1 -1
  17. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  18. package/lib/aws/cloudwatch/dashboard.js +1 -1
  19. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  20. package/lib/aws/cloudwatch/graph.js +8 -8
  21. package/lib/aws/cloudwatch/layout.js +3 -3
  22. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  23. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  24. package/lib/aws/cloudwatch/log-group.js +1 -1
  25. package/lib/aws/cloudwatch/log-query.js +1 -1
  26. package/lib/aws/cloudwatch/log-stream.js +1 -1
  27. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  28. package/lib/aws/cloudwatch/metric.js +2 -2
  29. package/lib/aws/cloudwatch/pattern.js +3 -3
  30. package/lib/aws/cloudwatch/policy.js +1 -1
  31. package/lib/aws/cloudwatch/query-definition.js +2 -2
  32. package/lib/aws/cloudwatch/stats.js +1 -1
  33. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  34. package/lib/aws/cloudwatch/text.js +1 -1
  35. package/lib/aws/cloudwatch/variable.js +3 -3
  36. package/lib/aws/cloudwatch/widget.js +1 -1
  37. package/lib/aws/compute/access-log.js +4 -4
  38. package/lib/aws/compute/activity.js +1 -1
  39. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  40. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  41. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  42. package/lib/aws/compute/alb/application-listener.js +1 -1
  43. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  44. package/lib/aws/compute/alb/application-target-group.js +1 -1
  45. package/lib/aws/compute/alb/conditions.js +1 -1
  46. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  47. package/lib/aws/compute/alb/trust-store.js +1 -1
  48. package/lib/aws/compute/api-definition.js +3 -3
  49. package/lib/aws/compute/api-key.js +2 -2
  50. package/lib/aws/compute/architecture.js +1 -1
  51. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  52. package/lib/aws/compute/authorizer.js +1 -1
  53. package/lib/aws/compute/authorizers/identity-source.js +1 -1
  54. package/lib/aws/compute/authorizers/lambda.js +2 -2
  55. package/lib/aws/compute/base-path-mapping.js +1 -1
  56. package/lib/aws/compute/base-scalable-attribute.js +1 -1
  57. package/lib/aws/compute/bastion-host.js +1 -1
  58. package/lib/aws/compute/chain.js +1 -1
  59. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  60. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  61. package/lib/aws/compute/client-vpn-route.js +2 -2
  62. package/lib/aws/compute/code.js +8 -8
  63. package/lib/aws/compute/condition.js +1 -1
  64. package/lib/aws/compute/connections.js +1 -1
  65. package/lib/aws/compute/cors.js +1 -1
  66. package/lib/aws/compute/deployment.js +1 -1
  67. package/lib/aws/compute/domain-name.js +1 -1
  68. package/lib/aws/compute/event-invoke-config.js +1 -1
  69. package/lib/aws/compute/event-source-filter.js +2 -2
  70. package/lib/aws/compute/event-source-mapping.js +1 -1
  71. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  72. package/lib/aws/compute/event-sources/s3.js +1 -1
  73. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  74. package/lib/aws/compute/event-sources/sqs.js +1 -1
  75. package/lib/aws/compute/fields.js +4 -4
  76. package/lib/aws/compute/function-alias.js +1 -1
  77. package/lib/aws/compute/function-base.js +2 -2
  78. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  79. package/lib/aws/compute/function-destinations/function.js +1 -1
  80. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  81. package/lib/aws/compute/function-nodejs/function.js +1 -1
  82. package/lib/aws/compute/function-url.js +1 -1
  83. package/lib/aws/compute/function.js +1 -1
  84. package/lib/aws/compute/gateway-response.js +2 -2
  85. package/lib/aws/compute/handler.js +1 -1
  86. package/lib/aws/compute/instance-types.js +1 -1
  87. package/lib/aws/compute/instance.js +1 -1
  88. package/lib/aws/compute/integration.js +1 -1
  89. package/lib/aws/compute/integrations/aws.js +1 -1
  90. package/lib/aws/compute/integrations/http.js +1 -1
  91. package/lib/aws/compute/integrations/lambda.js +1 -1
  92. package/lib/aws/compute/integrations/mock.js +1 -1
  93. package/lib/aws/compute/integrations/stepfunctions.js +1 -1
  94. package/lib/aws/compute/ip-addresses.js +2 -2
  95. package/lib/aws/compute/ipam.js +1 -1
  96. package/lib/aws/compute/key-pair.js +1 -1
  97. package/lib/aws/compute/lambda-api.js +1 -1
  98. package/lib/aws/compute/launch-template.js +2 -2
  99. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  100. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  101. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  102. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  103. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  104. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  105. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  106. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  107. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  108. package/lib/aws/compute/load-balancer.js +3 -3
  109. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  110. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  111. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  112. package/lib/aws/compute/machine-image/common.js +1 -1
  113. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  114. package/lib/aws/compute/method.js +1 -1
  115. package/lib/aws/compute/model.js +3 -3
  116. package/lib/aws/compute/nat.js +5 -5
  117. package/lib/aws/compute/network-acl-types.js +2 -2
  118. package/lib/aws/compute/network-acl.js +3 -3
  119. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  120. package/lib/aws/compute/nlb/network-listener.js +1 -1
  121. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  122. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  123. package/lib/aws/compute/peer.js +1 -1
  124. package/lib/aws/compute/placement-group.js +1 -1
  125. package/lib/aws/compute/port.js +1 -1
  126. package/lib/aws/compute/prefix-list.js +1 -1
  127. package/lib/aws/compute/requestvalidator.js +1 -1
  128. package/lib/aws/compute/resource.js +3 -3
  129. package/lib/aws/compute/restapi.js +3 -3
  130. package/lib/aws/compute/route.js +8 -8
  131. package/lib/aws/compute/runtime.js +1 -1
  132. package/lib/aws/compute/scalable-target.js +1 -1
  133. package/lib/aws/compute/schedule.js +1 -1
  134. package/lib/aws/compute/security-group.js +1 -1
  135. package/lib/aws/compute/stage.js +2 -2
  136. package/lib/aws/compute/state-graph.js +1 -1
  137. package/lib/aws/compute/state-machine-fragment.js +1 -1
  138. package/lib/aws/compute/state-machine.js +4 -4
  139. package/lib/aws/compute/states/choice.js +1 -1
  140. package/lib/aws/compute/states/custom-state.js +1 -1
  141. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  142. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  143. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  144. package/lib/aws/compute/states/distributed-map.js +1 -1
  145. package/lib/aws/compute/states/fail.js +1 -1
  146. package/lib/aws/compute/states/map-base.js +1 -1
  147. package/lib/aws/compute/states/map.js +1 -1
  148. package/lib/aws/compute/states/parallel.js +1 -1
  149. package/lib/aws/compute/states/pass.js +2 -2
  150. package/lib/aws/compute/states/state.js +1 -1
  151. package/lib/aws/compute/states/succeed.js +1 -1
  152. package/lib/aws/compute/states/task-base.js +2 -2
  153. package/lib/aws/compute/states/task.js +1 -1
  154. package/lib/aws/compute/states/wait.js +2 -2
  155. package/lib/aws/compute/step-scaling-action.js +1 -1
  156. package/lib/aws/compute/step-scaling-policy.js +1 -1
  157. package/lib/aws/compute/stepfunctions-api.js +1 -1
  158. package/lib/aws/compute/subnet-v2.js +2 -2
  159. package/lib/aws/compute/subnet.js +1 -1
  160. package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
  161. package/lib/aws/compute/task-credentials.js +1 -1
  162. package/lib/aws/compute/task-input.js +1 -1
  163. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  164. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  165. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  166. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  167. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  168. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  169. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  170. package/lib/aws/compute/types.js +1 -1
  171. package/lib/aws/compute/usage-plan.js +1 -1
  172. package/lib/aws/compute/user-data.js +3 -3
  173. package/lib/aws/compute/volume.js +2 -2
  174. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  175. package/lib/aws/compute/vpc-endpoint.js +6 -6
  176. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  177. package/lib/aws/compute/vpc-link.js +1 -1
  178. package/lib/aws/compute/vpc-v2-base.js +1 -1
  179. package/lib/aws/compute/vpc-v2.js +2 -2
  180. package/lib/aws/compute/vpc.js +4 -4
  181. package/lib/aws/compute/vpn.js +3 -3
  182. package/lib/aws/edge/certificate.js +1 -1
  183. package/lib/aws/edge/distribution.js +3 -3
  184. package/lib/aws/edge/dns-alias-record-targets.js +6 -6
  185. package/lib/aws/edge/dns-record.js +13 -13
  186. package/lib/aws/edge/dns-zone.js +1 -1
  187. package/lib/aws/edge/function.js +2 -2
  188. package/lib/aws/edge/key-value-store.js +4 -4
  189. package/lib/aws/edge/origin.js +3 -3
  190. package/lib/aws/edge/response-headers-policy.js +1 -1
  191. package/lib/aws/encryption/alias.js +1 -1
  192. package/lib/aws/encryption/key.js +1 -1
  193. package/lib/aws/encryption/via-service-principal.js +1 -1
  194. package/lib/aws/iam/grant.js +3 -3
  195. package/lib/aws/iam/group.js +1 -1
  196. package/lib/aws/iam/instance-profile.js +1 -1
  197. package/lib/aws/iam/managed-policy.js +1 -1
  198. package/lib/aws/iam/oidc-provider.js +1 -1
  199. package/lib/aws/iam/policy-document.js +1 -1
  200. package/lib/aws/iam/policy-statement.js +1 -1
  201. package/lib/aws/iam/policy.js +1 -1
  202. package/lib/aws/iam/principals.js +20 -20
  203. package/lib/aws/iam/role.js +14 -5
  204. package/lib/aws/iam/saml-provider.js +2 -2
  205. package/lib/aws/iam/unknown-principal.js +1 -1
  206. package/lib/aws/iam/user.js +1 -1
  207. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  208. package/lib/aws/network/subnet-group.js +3 -3
  209. package/lib/aws/network/subnet.js +4 -4
  210. package/lib/aws/notify/archive.js +1 -1
  211. package/lib/aws/notify/connection.js +3 -3
  212. package/lib/aws/notify/event-bus.js +3 -3
  213. package/lib/aws/notify/event-pattern.js +1 -1
  214. package/lib/aws/notify/input.js +2 -2
  215. package/lib/aws/notify/kinesis-stream.js +1 -1
  216. package/lib/aws/notify/notification-rule.js +1 -1
  217. package/lib/aws/notify/policy.js +1 -1
  218. package/lib/aws/notify/queue-base.js +1 -1
  219. package/lib/aws/notify/queue-policy.js +1 -1
  220. package/lib/aws/notify/queue.js +1 -1
  221. package/lib/aws/notify/resource-policy.js +1 -1
  222. package/lib/aws/notify/rule.js +1 -1
  223. package/lib/aws/notify/schedule.js +1 -1
  224. package/lib/aws/notify/sqs-grants.generated.js +1 -1
  225. package/lib/aws/notify/subscription-filter.js +1 -1
  226. package/lib/aws/notify/subscription.js +4 -4
  227. package/lib/aws/notify/subscriptions/email.js +1 -1
  228. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  229. package/lib/aws/notify/subscriptions/sms.js +1 -1
  230. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  231. package/lib/aws/notify/subscriptions/url.js +1 -1
  232. package/lib/aws/notify/targets/event-bus.js +1 -1
  233. package/lib/aws/notify/targets/function.js +1 -1
  234. package/lib/aws/notify/targets/log-group.js +2 -2
  235. package/lib/aws/notify/targets/sqs.js +1 -1
  236. package/lib/aws/notify/targets/state-machine.js +1 -1
  237. package/lib/aws/notify/topic-base.js +1 -1
  238. package/lib/aws/notify/topic.js +1 -1
  239. package/lib/aws/storage/assets/image-asset.js +3 -3
  240. package/lib/aws/storage/assets/s3.js +1 -1
  241. package/lib/aws/storage/auth-token.js +2 -2
  242. package/lib/aws/storage/billing.js +1 -1
  243. package/lib/aws/storage/bucket-notifications.js +1 -1
  244. package/lib/aws/storage/bucket-policy.js +1 -1
  245. package/lib/aws/storage/bucket-source.js +1 -1
  246. package/lib/aws/storage/bucket.js +2 -2
  247. package/lib/aws/storage/capacity.js +1 -1
  248. package/lib/aws/storage/dynamodb-perms.d.ts +2 -2
  249. package/lib/aws/storage/dynamodb-perms.js +9 -16
  250. package/lib/aws/storage/ecr-repository.js +3 -3
  251. package/lib/aws/storage/encryption.js +1 -1
  252. package/lib/aws/storage/index.d.ts +2 -0
  253. package/lib/aws/storage/index.js +3 -1
  254. package/lib/aws/storage/notification-targets/function.js +1 -1
  255. package/lib/aws/storage/notification-targets/queue.js +1 -1
  256. package/lib/aws/storage/origin-access-identity.js +1 -1
  257. package/lib/aws/storage/parameter.js +2 -2
  258. package/lib/aws/storage/shared.d.ts +31 -2
  259. package/lib/aws/storage/shared.js +29 -2
  260. package/lib/aws/storage/stream-grants.d.ts +61 -0
  261. package/lib/aws/storage/stream-grants.js +72 -0
  262. package/lib/aws/storage/table-grants.d.ts +98 -0
  263. package/lib/aws/storage/table-grants.js +137 -0
  264. package/lib/aws/storage/table.d.ts +280 -8
  265. package/lib/aws/storage/table.js +350 -148
  266. package/lib/bundling.js +3 -3
  267. package/lib/construct-base.js +2 -2
  268. package/lib/duration.js +1 -1
  269. package/lib/errors.js +1 -1
  270. package/lib/expiration.js +1 -1
  271. package/lib/fs/ignore.js +4 -4
  272. package/lib/fs/index.js +1 -1
  273. package/lib/size.js +1 -1
  274. package/lib/stack-base.js +1 -1
  275. package/lib/terra-func.js +1 -1
  276. package/lib/time-zone.js +1 -1
  277. package/package.json +1 -1
@@ -74,7 +74,7 @@ class PrincipalPolicyFragment {
74
74
  }
75
75
  exports.PrincipalPolicyFragment = PrincipalPolicyFragment;
76
76
  _a = JSII_RTTI_SYMBOL_1;
77
- PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.2.1" };
77
+ PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.2.2" };
78
78
  /**
79
79
  * Read from AWS Principal JSON to Terraform principals block(s)
80
80
  *
@@ -193,7 +193,7 @@ class PrincipalBase {
193
193
  }
194
194
  exports.PrincipalBase = PrincipalBase;
195
195
  _b = JSII_RTTI_SYMBOL_1;
196
- PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.2.1" };
196
+ PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.2.2" };
197
197
  /**
198
198
  * Specify a principal by the Amazon Resource Name (ARN).
199
199
  * You can specify AWS accounts, IAM users, Federated SAML users, IAM roles, and specific assumed-role sessions.
@@ -238,7 +238,7 @@ class ArnPrincipal extends PrincipalBase {
238
238
  }
239
239
  exports.ArnPrincipal = ArnPrincipal;
240
240
  _c = JSII_RTTI_SYMBOL_1;
241
- ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.2.1" };
241
+ ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.2.2" };
242
242
  /**
243
243
  * Specify AWS account ID as the principal entity in a policy to delegate authority to the account.
244
244
  */
@@ -261,7 +261,7 @@ class AccountPrincipal extends ArnPrincipal {
261
261
  }
262
262
  exports.AccountPrincipal = AccountPrincipal;
263
263
  _d = JSII_RTTI_SYMBOL_1;
264
- AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.2.1" };
264
+ AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.2.2" };
265
265
  /**
266
266
  * An IAM principal that represents an AWS service (i.e. `sqs.amazonaws.com`).
267
267
  */
@@ -318,7 +318,7 @@ class ServicePrincipal extends PrincipalBase {
318
318
  }
319
319
  exports.ServicePrincipal = ServicePrincipal;
320
320
  _e = JSII_RTTI_SYMBOL_1;
321
- ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.2.1" };
321
+ ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.2.2" };
322
322
  /**
323
323
  * A principal that represents an AWS Organization
324
324
  */
@@ -349,7 +349,7 @@ class OrganizationPrincipal extends PrincipalBase {
349
349
  }
350
350
  exports.OrganizationPrincipal = OrganizationPrincipal;
351
351
  _f = JSII_RTTI_SYMBOL_1;
352
- OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.2.1" };
352
+ OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.2.2" };
353
353
  /**
354
354
  * A policy principal for canonicalUserIds - useful for S3 bucket policies that use
355
355
  * Origin Access identities.
@@ -391,7 +391,7 @@ class CanonicalUserPrincipal extends PrincipalBase {
391
391
  }
392
392
  exports.CanonicalUserPrincipal = CanonicalUserPrincipal;
393
393
  _g = JSII_RTTI_SYMBOL_1;
394
- CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.2.1" };
394
+ CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.2.2" };
395
395
  /**
396
396
  * Principal entity that represents a federated identity provider such as Amazon Cognito,
397
397
  * that can be used to provide temporary security credentials to users who have been authenticated.
@@ -424,7 +424,7 @@ class FederatedPrincipal extends PrincipalBase {
424
424
  }
425
425
  exports.FederatedPrincipal = FederatedPrincipal;
426
426
  _h = JSII_RTTI_SYMBOL_1;
427
- FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.2.1" };
427
+ FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.2.2" };
428
428
  /**
429
429
  * A principal that represents a federated identity provider as Web Identity such as Cognito, Amazon,
430
430
  * Facebook, Google, etc.
@@ -449,7 +449,7 @@ class WebIdentityPrincipal extends FederatedPrincipal {
449
449
  }
450
450
  exports.WebIdentityPrincipal = WebIdentityPrincipal;
451
451
  _j = JSII_RTTI_SYMBOL_1;
452
- WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.2.1" };
452
+ WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.2.2" };
453
453
  /**
454
454
  * A principal that represents a federated identity provider as from a OpenID Connect provider.
455
455
  */
@@ -472,7 +472,7 @@ class OpenIdConnectPrincipal extends WebIdentityPrincipal {
472
472
  }
473
473
  exports.OpenIdConnectPrincipal = OpenIdConnectPrincipal;
474
474
  _k = JSII_RTTI_SYMBOL_1;
475
- OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.2.1" };
475
+ OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.2.2" };
476
476
  /**
477
477
  * Principal entity that represents a SAML federated identity provider
478
478
  */
@@ -486,7 +486,7 @@ class SamlPrincipal extends FederatedPrincipal {
486
486
  }
487
487
  exports.SamlPrincipal = SamlPrincipal;
488
488
  _l = JSII_RTTI_SYMBOL_1;
489
- SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.2.1" };
489
+ SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.2.2" };
490
490
  /**
491
491
  * Principal entity that represents a SAML federated identity provider for
492
492
  * programmatic and AWS Management Console access.
@@ -529,7 +529,7 @@ class SamlConsolePrincipal extends SamlPrincipal {
529
529
  }
530
530
  exports.SamlConsolePrincipal = SamlConsolePrincipal;
531
531
  _m = JSII_RTTI_SYMBOL_1;
532
- SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.2.1" };
532
+ SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.2.2" };
533
533
  /**
534
534
  * Use the AWS account into which a stack is deployed as the principal entity in a policy
535
535
  */
@@ -543,7 +543,7 @@ class AccountRootPrincipal extends AccountPrincipal {
543
543
  }
544
544
  exports.AccountRootPrincipal = AccountRootPrincipal;
545
545
  _o = JSII_RTTI_SYMBOL_1;
546
- AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.2.1" };
546
+ AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.2.2" };
547
547
  /**
548
548
  * A principal representing all AWS identities in all accounts
549
549
  *
@@ -564,7 +564,7 @@ class AnyPrincipal extends ArnPrincipal {
564
564
  }
565
565
  exports.AnyPrincipal = AnyPrincipal;
566
566
  _p = JSII_RTTI_SYMBOL_1;
567
- AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.2.1" };
567
+ AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.2.2" };
568
568
  /**
569
569
  * A principal representing all identities in all accounts
570
570
  * @deprecated use `AnyPrincipal`
@@ -573,7 +573,7 @@ class Anyone extends AnyPrincipal {
573
573
  }
574
574
  exports.Anyone = Anyone;
575
575
  _q = JSII_RTTI_SYMBOL_1;
576
- Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.2.1" };
576
+ Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.2.2" };
577
577
  /**
578
578
  * A principal that uses a literal '*' in the IAM JSON language
579
579
  *
@@ -602,7 +602,7 @@ class StarPrincipal extends PrincipalBase {
602
602
  }
603
603
  exports.StarPrincipal = StarPrincipal;
604
604
  _r = JSII_RTTI_SYMBOL_1;
605
- StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.2.1" };
605
+ StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.2.2" };
606
606
  /**
607
607
  * Represents a principal that has multiple types of principals. A composite principal cannot
608
608
  * have conditions. i.e. multiple ServicePrincipals that form a composite principal
@@ -667,7 +667,7 @@ class CompositePrincipal extends PrincipalBase {
667
667
  }
668
668
  exports.CompositePrincipal = CompositePrincipal;
669
669
  _s = JSII_RTTI_SYMBOL_1;
670
- CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.2.1" };
670
+ CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.2.2" };
671
671
  /**
672
672
  * Base class for Principals that wrap other principals
673
673
  */
@@ -715,7 +715,7 @@ class ComparablePrincipal {
715
715
  }
716
716
  exports.ComparablePrincipal = ComparablePrincipal;
717
717
  _t = JSII_RTTI_SYMBOL_1;
718
- ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.2.1" };
718
+ ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.2.2" };
719
719
  /**
720
720
  * An IAM principal with additional conditions specifying when the policy is in effect.
721
721
  *
@@ -870,7 +870,7 @@ class PrincipalWithConditions extends PrincipalAdapter {
870
870
  }
871
871
  exports.PrincipalWithConditions = PrincipalWithConditions;
872
872
  _u = JSII_RTTI_SYMBOL_1;
873
- PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.2.1" };
873
+ PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.2.2" };
874
874
  /**
875
875
  * Enables session tags on role assumptions from a principal
876
876
  *
@@ -897,7 +897,7 @@ class SessionTagsPrincipal extends PrincipalAdapter {
897
897
  }
898
898
  exports.SessionTagsPrincipal = SessionTagsPrincipal;
899
899
  _v = JSII_RTTI_SYMBOL_1;
900
- SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.2.1" };
900
+ SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.2.2" };
901
901
  /**
902
902
  * Add a principal to an AssumeRolePolicyDocument in the right way
903
903
  *
@@ -151,12 +151,16 @@ class Role extends aws_construct_1.AwsConstructBase {
151
151
  externalIds.push(props.externalId);
152
152
  }
153
153
  this.assumeRolePolicy = createAssumeRolePolicy(this, "AssumeRolePolicy", props.assumedBy, externalIds);
154
- this.managedPolicies.push(...(props.managedPolicies || []));
154
+ if (props.managedPolicies && props.managedPolicies.length > 0) {
155
+ for (const policy of props.managedPolicies) {
156
+ this.addManagedPolicy(policy);
157
+ }
158
+ }
155
159
  this.inlinePolicies = props.inlinePolicies || {};
156
160
  this.permissionsBoundary = props.permissionsBoundary;
157
161
  const maxSessionDuration = props.maxSessionDuration && props.maxSessionDuration.toSeconds();
158
162
  validateMaxSessionDuration(maxSessionDuration);
159
- const description = props.description && props.description?.length > 0
163
+ const description = props.description && props.description.length > 0
160
164
  ? props.description
161
165
  : undefined;
162
166
  if (description && description.length > 1000) {
@@ -173,7 +177,11 @@ class Role extends aws_construct_1.AwsConstructBase {
173
177
  this.resource = new provider_aws_1.iamRole.IamRole(this, "Resource", {
174
178
  ...props, // copy over Terraform Meta Arguments from ConstructProps
175
179
  assumeRolePolicy: this.assumeRolePolicy.json,
176
- managedPolicyArns: util_1.UniqueStringSet.from(() => this.managedPolicies.map((p) => p.managedPolicyArn)),
180
+ // Deprecated as documented here:
181
+ // https://github.com/hashicorp/terraform-provider-aws/blob/main/docs/design-decisions/exclusive-relationship-management-resources.md
182
+ // managedPolicyArns: UniqueStringSet.from(() =>
183
+ // this.managedPolicies.map((p) => p.managedPolicyArn),
184
+ // ),
177
185
  inlinePolicy: _flatten(this.inlinePolicies),
178
186
  path: props.path,
179
187
  permissionsBoundary: this.permissionsBoundary
@@ -281,6 +289,7 @@ class Role extends aws_construct_1.AwsConstructBase {
281
289
  return;
282
290
  }
283
291
  this.managedPolicies.push(policy);
292
+ policy.attachToRole(this);
284
293
  }
285
294
  /**
286
295
  * Attaches a policy to this role.
@@ -361,7 +370,7 @@ class Role extends aws_construct_1.AwsConstructBase {
361
370
  }
362
371
  exports.Role = Role;
363
372
  _a = JSII_RTTI_SYMBOL_1;
364
- Role[_a] = { fqn: "terraconstructs.aws.iam.Role", version: "0.2.1" };
373
+ Role[_a] = { fqn: "terraconstructs.aws.iam.Role", version: "0.2.2" };
365
374
  function createAssumeRolePolicy(scope, id, principal, externalIds) {
366
375
  const actualDoc = new policy_document_1.PolicyDocument(scope, id);
367
376
  // If requested, add externalIds to every statement added to this doc
@@ -404,4 +413,4 @@ Object.defineProperty(Role.prototype, IAM_ROLE_SYMBOL, {
404
413
  enumerable: false,
405
414
  writable: false,
406
415
  });
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3JvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBOEM7QUFDOUMsaUNBQThCO0FBRTlCLGdDQUFtQztBQUNuQyxvREFBdUU7QUFDdkUsNENBQXdDO0FBQ3hDLG1DQUFnQztBQUdoQyxxQ0FBa0M7QUFDbEMsdURBQW1EO0FBRW5ELDZDQU9zQjtBQUV0QiwrQ0FBa0U7QUFDbEUscUVBQStFO0FBQy9FLDZEQUF5RDtBQUN6RCwyREFBdUQ7QUFDdkQsOERBQThEO0FBQzlELHlDQUFtRTtBQUNuRSx1Q0FBbUU7QUFFbkUseUJBQXlCO0FBQ3pCLGtHQUFrRztBQUVsRywrQ0FBK0M7QUFDL0MsaUNBQWlDO0FBQ2pDLG9DQUFvQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUErTXZFOzs7OztHQUtHO0FBQ0gsTUFBYSxJQUFLLFNBQVEsZ0NBQWdCO0lBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FDdkIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLE9BQWUsRUFDZixVQUE4QixFQUFFO1FBRWhDLE1BQU0sVUFBVSxHQUFHLG9CQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQ25DLE9BQU8sRUFDUCxlQUFTLENBQUMsbUJBQW1CLENBQzlCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBYSxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdEMsdUZBQXVGO1FBQ3ZGLGtHQUFrRztRQUNsRyxpR0FBaUc7UUFDakcsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxH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TUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRTtJQUNyRCxLQUFLLEVBQUUsSUFBSTtJQUNYLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlhbVJvbGUgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQgfSBmcm9tIFwiLi4vYXJuXCI7XG5pbXBvcnQgeyBBd3NDb25zdHJ1Y3RCYXNlLCBBd3NDb25zdHJ1Y3RQcm9wcyB9IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IEdyYW50IH0gZnJvbSBcIi4vZ3JhbnRcIjtcbmltcG9ydCB7IElJZGVudGl0eSB9IGZyb20gXCIuL2lkZW50aXR5LWJhc2VcIjtcbmltcG9ydCB7IElNYW5hZ2VkUG9saWN5IH0gZnJvbSBcIi4vbWFuYWdlZC1wb2xpY3lcIjtcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gXCIuL3BvbGljeVwiO1xuaW1wb3J0IHsgUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktZG9jdW1lbnRcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCIuL3BvbGljeS1zdGF0ZW1lbnRcIjtcbmltcG9ydCB7XG4gIEFjY291bnRQcmluY2lwYWwsXG4gIEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0LFxuICBBcm5QcmluY2lwYWwsXG4gIElQcmluY2lwYWwsXG4gIFByaW5jaXBhbFBvbGljeUZyYWdtZW50LFxuICBTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tIFwiLi9wcmluY2lwYWxzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IHsgTXV0YXRpbmdQb2xpY3lEb2N1bWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9wcml2YXRlL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUgfSBmcm9tIFwiLi9wcml2YXRlL2Fzc3VtZS1yb2xlLXBvbGljeVwiO1xuaW1wb3J0IHsgSW1tdXRhYmxlUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvaW1tdXRhYmxlLXJvbGVcIjtcbmltcG9ydCB7IEltcG9ydGVkUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvaW1wb3J0ZWQtcm9sZVwiO1xuLy8gaW1wb3J0IHsgUHJlY3JlYXRlZFJvbGUgfSBmcm9tIFwiLi9wcml2YXRlL3ByZWNyZWF0ZWQtcm9sZVwiO1xuaW1wb3J0IHsgQXR0YWNoZWRQb2xpY2llcywgVW5pcXVlU3RyaW5nU2V0IH0gZnJvbSBcIi4vcHJpdmF0ZS91dGlsXCI7XG5pbXBvcnQgeyBUb2tlbkNvbXBhcmlzb24sIHRva2VuQ29tcGFyZVN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vdG9rZW5cIjtcblxuLy8gVE9ETzogUmUtQWRkIExhenlSb2xlP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9sYXp5LXJvbGUudHNcblxuLy8gVE9ETzogcmUtaW1wbGVtZW50IGlhbSByb2xlIHBvbGljeSBzcGxpdHRpbmdcbi8vIGNvbnN0IE1BWF9JTkxJTkVfU0laRSA9IDEwMDAwO1xuLy8gY29uc3QgTUFYX01BTkFHRURQT0xfU0laRSA9IDYwMDA7XG5jb25zdCBJQU1fUk9MRV9TWU1CT0wgPSBTeW1ib2wuZm9yKFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MvaWFtLlJvbGVcIik7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZGVmaW5pbmcgYW4gSUFNIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHByaW5jaXBhbCAoaS5lLiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3Nucy5hbWF6b25hd3MuY29tJylgKVxuICAgKiB3aGljaCBjYW4gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBsYXRlciBtb2RpZnkgdGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBieSBhY2Nlc3NpbmcgaXQgdmlhXG4gICAqIHRoZSBgYXNzdW1lUm9sZVBvbGljeWAgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVkQnk6IElQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIElEIHRoYXQgdGhlIHJvbGUgYXNzdW1lciBuZWVkcyB0byBwcm92aWRlIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzZWUgYGV4dGVybmFsSWRzYFxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBJRHMgdGhhdCB0aGUgcm9sZSBhc3N1bWVyIG5lZWRzIHRvIHByb3ZpZGUgb25lIG9mIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1hbmFnZWQgcG9saWNpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBhZGQgbWFuYWdlZCBwb2xpY2llcyBsYXRlciB1c2luZ1xuICAgKiBgYWRkTWFuYWdlZFBvbGljeShNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShwb2xpY3lOYW1lKSlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmFnZWQgcG9saWNpZXMuXG4gICAqL1xuICByZWFkb25seSBtYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbmFtZWQgcG9saWNpZXMgdG8gaW5saW5lIGludG8gdGhpcyByb2xlLiBUaGVzZSBwb2xpY2llcyB3aWxsIGJlXG4gICAqIGNyZWF0ZWQgd2l0aCB0aGUgcm9sZSwgd2hlcmVhcyB0aG9zZSBhZGRlZCBieSBgYGFkZFRvUG9saWN5YGAgYXJlIGFkZGVkXG4gICAqIHVzaW5nIGEgc2VwYXJhdGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgKGFsbG93aW5nIGEgd2F5IGFyb3VuZCBjaXJjdWxhclxuICAgKiBkZXBlbmRlbmNpZXMgdGhhdCBjb3VsZCBvdGhlcndpc2UgYmUgaW50cm9kdWNlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcG9saWN5IGlzIGlubGluZWQgaW4gdGhlIFJvbGUgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVQb2xpY2llcz86IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBJQU0gcGF0aHMsIHNlZVxuICAgKiBGcmllbmRseSBOYW1lcyBhbmQgUGF0aHMgaW4gSUFNIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC9cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFXUyBzdXBwb3J0cyBwZXJtaXNzaW9ucyBib3VuZGFyaWVzIGZvciBJQU0gZW50aXRpZXMgKHVzZXJzIG9yIHJvbGVzKS5cbiAgICogQSBwZXJtaXNzaW9ucyBib3VuZGFyeSBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIGZvciB1c2luZyBhIG1hbmFnZWQgcG9saWN5XG4gICAqIHRvIHNldCB0aGUgbWF4aW11bSBwZXJtaXNzaW9ucyB0aGF0IGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBjYW4gZ3JhbnQgdG9cbiAgICogYW4gSUFNIGVudGl0eS4gQW4gZW50aXR5J3MgcGVybWlzc2lvbnMgYm91bmRhcnkgYWxsb3dzIGl0IHRvIHBlcmZvcm0gb25seVxuICAgKiB0aGUgYWN0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIGJ5IGJvdGggaXRzIGlkZW50aXR5LWJhc2VkIHBvbGljaWVzIGFuZCBpdHNcbiAgICogcGVybWlzc2lvbnMgYm91bmRhcmllcy5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWlhbS1yb2xlLmh0bWwjY2ZuLWlhbS1yb2xlLXBlcm1pc3Npb25zYm91bmRhcnlcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2FjY2Vzc19wb2xpY2llc19ib3VuZGFyaWVzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwZXJtaXNzaW9ucyBib3VuZGFyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgSUFNIHJvbGUuIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUm9sZU5hbWUgcGFyYW1ldGVyIGZvclxuICAgKiB0aGUgQ3JlYXRlUm9sZSBhY3Rpb24gaW4gdGhlIElBTSBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBJTVBPUlRBTlQ6IElmIHlvdSBzcGVjaWZ5IGEgbmFtZSwgeW91IGNhbm5vdCBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlXG4gICAqIHJlcGxhY2VtZW50IG9mIHRoaXMgcmVzb3VyY2UuIFlvdSBjYW4gcGVyZm9ybSB1cGRhdGVzIHRoYXQgcmVxdWlyZSBubyBvclxuICAgKiBzb21lIGludGVycnVwdGlvbi4gSWYgeW91IG11c3QgcmVwbGFjZSB0aGUgcmVzb3VyY2UsIHNwZWNpZnkgYSBuZXcgbmFtZS5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSByb2xlLlxuICAgKlxuICAgKiBTZWUgW0lBTSBJZGVudGlmaWVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL1VzaW5nX0lkZW50aWZpZXJzLmh0bWwpXG4gICAqIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgUmVmZXIgdG8gYHJvbGVOYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqIENvbmZsaWN0cyB3aXRoIGByb2xlTmFtZWAuXG4gICAqXG4gICAqIElNUE9SVEFOVDogSWYgeW91IHNwZWNpZnkgYSBuYW1lUHJlZml4LCB5b3UgY2Fubm90IHBlcmZvcm0gdXBkYXRlcyB0aGF0IHJlcXVpcmVcbiAgICogcmVwbGFjZW1lbnQgb2YgdGhpcyByZXNvdXJjZS4gWW91IGNhbiBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlIG5vIG9yXG4gICAqIHNvbWUgaW50ZXJydXB0aW9uLiBJZiB5b3UgbXVzdCByZXBsYWNlIHRoZSByZXNvdXJjZSwgc3BlY2lmeSBhIG5ldyBuYW1lLlxuICAgKlxuICAgKiBVc2UgW1RlcnJhZm9ybSBSZXNvdXJjZSBNZXRhIEFyZ3VtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvcmVzb3VyY2VzL3N5bnRheCNtZXRhLWFyZ3VtZW50cylcbiAgICogdG8gY29udHJvbCBsaWZlY3ljbGUgd2hlbiByZXBsYWNpbmcgdGhlIHJvbGUuXG4gICAqXG4gICAqIFNlZSBbSUFNIElkZW50aWZpZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvVXNpbmdfSWRlbnRpZmllcnMuaHRtbClcbiAgICogZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSByb2xlTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc2Vzc2lvbiBkdXJhdGlvbiBpbiBzZWNvbmRzIHRoYXQgeW91IHdhbnQgdG8gc2V0IGZvciB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAqIFRoaXMgc2V0dGluZyBjYW4gaGF2ZSBhIHZhbHVlIGZyb20gMSBob3VyICgzNjAwc2VjKSB0byAxMiAoNDMyMDBzZWMpIGhvdXJzLlxuICAgKlxuICAgKiBBbnlvbmUgd2hvIGFzc3VtZXMgdGhlIHJvbGUgZnJvbSB0aGUgQVdTIENMSSBvciBBUEkgY2FuIHVzZSB0aGVcbiAgICogRHVyYXRpb25TZWNvbmRzIEFQSSBwYXJhbWV0ZXIgb3IgdGhlIGR1cmF0aW9uLXNlY29uZHMgQ0xJIHBhcmFtZXRlciB0b1xuICAgKiByZXF1ZXN0IGEgbG9uZ2VyIHNlc3Npb24uIFRoZSBNYXhTZXNzaW9uRHVyYXRpb24gc2V0dGluZyBkZXRlcm1pbmVzIHRoZVxuICAgKiBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgY2FuIGJlIHJlcXVlc3RlZCB1c2luZyB0aGUgRHVyYXRpb25TZWNvbmRzXG4gICAqIHBhcmFtZXRlci5cbiAgICpcbiAgICogSWYgdXNlcnMgZG9uJ3Qgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgRHVyYXRpb25TZWNvbmRzIHBhcmFtZXRlciwgdGhlaXJcbiAgICogc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHZhbGlkIGZvciBvbmUgaG91ciBieSBkZWZhdWx0LiBUaGlzIGFwcGxpZXMgd2hlblxuICAgKiB5b3UgdXNlIHRoZSBBc3N1bWVSb2xlKiBBUEkgb3BlcmF0aW9ucyBvciB0aGUgYXNzdW1lLXJvbGUqIENMSSBvcGVyYXRpb25zXG4gICAqIGJ1dCBkb2VzIG5vdCBhcHBseSB3aGVuIHlvdSB1c2UgdGhvc2Ugb3BlcmF0aW9ucyB0byBjcmVhdGUgYSBjb25zb2xlIFVSTC5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3JvbGVzX3VzZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDEpXG4gICAqL1xuICByZWFkb25seSBtYXhTZXNzaW9uRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcm9sZS4gSXQgY2FuIGJlIHVwIHRvIDEwMDAgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgZGV0YWNoaW5nIGFueSBwb2xpY2llcyB0aGUgcm9sZSBoYXMgYmVmb3JlIGRlc3Ryb3lpbmcgaXRcbiAgICogSWYgcG9saWNpZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb2xlIHZpYSB0aGUgYGF3c19pYW1fcG9saWN5X2F0dGFjaG1lbnRgXG4gICAqIHJlc291cmNlIGFuZCB5b3UgYXJlIG1vZGlmeWluZyB0aGUgcm9sZSBgbmFtZWAgb3IgYHBhdGhgLCB0aGlzIG11c3QgYmVcbiAgICogc2V0IHRvIGB0cnVlYCBhbmQgYXBwbGllZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGUgb3BlcmF0aW9uIG90aGVyd2lzZSB5b3VcbiAgICogd2lsbCBlbmNvdW50ZXIgYSBgRGVsZXRlQ29uZmxpY3RgIGVycm9yLlxuICAgKlxuICAgKiBUaGUgYGF3c19pYW1fcm9sZV9wb2xpY3lfYXR0YWNobWVudGAgcmVzb3VyY2UgKHJlY29tbWVuZGVkKSBkb2VzIG5vdFxuICAgKiBoYXZlIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAqXG4gICAqIE5PVEU6IFRoZSBgaWFtLlBvbGljeWAgdXNlcyBgYXdzX2lhbV9yb2xlX3BvbGljeV9hdHRhY2htZW50YCB1bmRlclxuICAgKiB0aGUgaG9vZCBhbmQgdGhpcyBzaG91bGQgbm90IGJlIGEgY29uY2Vybi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXRhY2hQb2xpY2llcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBhbGxvd2luZyBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Igb2YgYFJvbGUuZnJvbVJvbGVBcm5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb21Sb2xlQXJuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbXBvcnRlZCByb2xlIGNhbiBiZSBtb2RpZmllZCBieSBhdHRhY2hpbmcgcG9saWN5IHJlc291cmNlcyB0byBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbXV0YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBpbW11dGFibGUgcm9sZXM6IGFkZCBncmFudHMgdG8gcmVzb3VyY2VzIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlbVxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBmYWxzZWAgb3Igbm90IHNwZWNpZmllZCwgZ3JhbnQgcGVybWlzc2lvbnMgYWRkZWQgdG8gdGhpcyByb2xlIGFyZSBpZ25vcmVkLlxuICAgKiBJdCBpcyB5b3VyIG93biByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIHJvbGUgaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdHJ1ZWAsIGFueSBncmFudCBwZXJtaXNzaW9ucyB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZXNvdXJjZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkR3JhbnRzVG9SZXNvdXJjZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbnkgcG9saWNpZXMgY3JlYXRlZCBieSB0aGlzIHJvbGUgd2lsbCB1c2UgdGhpcyB2YWx1ZSBhcyB0aGVpciBJRCwgaWYgc3BlY2lmaWVkLlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgaW1wb3J0aW5nIHRoZSBzYW1lIHJvbGUgaW4gbXVsdGlwbGUgc3RhY2tzLCBhbmQgZ3JhbnRpbmcgaXRcbiAgICogZGlmZmVyZW50IHBlcm1pc3Npb25zIGluIGF0IGxlYXN0IHR3byBzdGFja3MuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZFxuICAgKiAob3IgaWYgdGhlIHNhbWUgbmFtZSBpcyBzcGVjaWZpZWQgaW4gbW9yZSB0aGFuIG9uZSBzdGFjayksXG4gICAqIGEgVGVycmFmb3JtIGlzc3VlIHdpbGwgcmVzdWx0IGluIHRoZSBwb2xpY3kgY3JlYXRlZCBpbiB3aGljaGV2ZXIgc3RhY2tcbiAgICogaXMgZGVwbG95ZWQgbGFzdCBvdmVyd3JpdGluZyB0aGUgcG9saWNpZXMgY3JlYXRlZCBieSB0aGUgb3RoZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnUG9saWN5J1xuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFBvbGljeU5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIFRPRE86IHN1cHBvcnQgZm9yIHByZS1jcmVhdGVkIHJvbGVzP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9yb2xlLnRzI0wxODZcbi8vIE5PVEU6IGluIFRlcnJhQ29uc3RydWN0IHByZS1jcmVhdGVkIHJvbGVzIGFyZSBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgR3JpZCwgc28gdGhpcyBzZWVtcyBub3QgbmVlZGVkLlxuXG4vKipcbiAqIE9wdGlvbnMgYWxsb3dpbmcgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIGBSb2xlLmZyb21Sb2xlTmFtZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVJvbGVOYW1lT3B0aW9ucyBleHRlbmRzIEZyb21Sb2xlQXJuT3B0aW9ucyB7fVxuXG4vKipcbiAqIElBTSBSb2xlXG4gKlxuICogRGVmaW5lcyBhbiBJQU0gcm9sZS4gVGhlIHJvbGUgaXMgY3JlYXRlZCB3aXRoIGFuIGFzc3VtZSBwb2xpY3kgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoXG4gKiB0aGUgc3BlY2lmaWVkIEFXUyBzZXJ2aWNlIHByaW5jaXBhbCBkZWZpbmVkIGluIGBzZXJ2aWNlQXNzdW1lUm9sZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSb2xlIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IEFSTi5cbiAgICpcbiAgICogSWYgdGhlIGltcG9ydGVkIFJvbGUgQVJOIGlzIGEgVG9rZW4gKHN1Y2ggYXMgYVxuICAgKiBgQ2ZuUGFyYW1ldGVyLnZhbHVlQXNTdHJpbmdgIG9yIGEgYEZuLmltcG9ydFZhbHVlKClgKSAqYW5kKiB0aGUgcmVmZXJlbmNlZFxuICAgKiByb2xlIGhhcyBhIGBwYXRoYCAobGlrZSBgYXJuOi4uLjpyb2xlL0FkbWluUm9sZXMvQWxpY2VgKSwgdGhlXG4gICAqIGByb2xlTmFtZWAgcHJvcGVydHkgd2lsbCBub3QgcmVzb2x2ZSB0byB0aGUgY29ycmVjdCB2YWx1ZS4gSW5zdGVhZCBpdFxuICAgKiB3aWxsIHJlc29sdmUgdG8gdGhlIGZpcnN0IHBhdGggY29tcG9uZW50LiBXZSB1bmZvcnR1bmF0ZWx5IGNhbm5vdCBleHByZXNzXG4gICAqIHRoZSBjb3JyZWN0IGNhbGN1bGF0aW9uIG9mIHRoZSBmdWxsIHBhdGggbmFtZSBhcyBhIENsb3VkRm9ybWF0aW9uXG4gICAqIGV4cHJlc3Npb24uIEluIHRoaXMgc2NlbmFyaW8gdGhlIFJvbGUgQVJOIHNob3VsZCBiZSBzdXBwbGllZCB3aXRob3V0IHRoZVxuICAgKiBgcGF0aGAgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCByb2xlIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIHJvbGVBcm4gdGhlIEFSTiBvZiB0aGUgcm9sZSB0byBpbXBvcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgYWxsb3cgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSByZXR1cm5lZCByb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICByb2xlQXJuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVBcm5PcHRpb25zID0ge30sXG4gICk6IElSb2xlIHtcbiAgICBjb25zdCBzY29wZVN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGNvbnN0IHBhcnNlZEFybiA9IHNjb3BlU3RhY2suc3BsaXRBcm4oXG4gICAgICByb2xlQXJuLFxuICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgKTtcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBwYXJzZWRBcm4ucmVzb3VyY2VOYW1lITtcbiAgICBjb25zdCByb2xlQWNjb3VudCA9IHBhcnNlZEFybi5hY2NvdW50O1xuICAgIC8vIHNlcnZpY2Ugcm9sZXMgaGF2ZSBhbiBBUk4gbGlrZSAnYXJuOmF3czppYW06OjxhY2NvdW50Pjpyb2xlL3NlcnZpY2Utcm9sZS88cm9sZU5hbWU+J1xuICAgIC8vIG9yICdhcm46YXdzOmlhbTo6PGFjY291bnQ+OnJvbGUvc2VydmljZS1yb2xlL3NlcnZpY2VuYW1lLmFtYXpvbmF3cy5jb20vc2VydmljZS1yb2xlLzxyb2xlTmFtZT4nXG4gICAgLy8gd2Ugd2FudCB0byBzdXBwb3J0IHRoZXNlIGFzIHdlbGwsIHNvIHdlIGp1c3QgdXNlIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IHNsYXNoIGFzIHJvbGUgbmFtZVxuICAgIGNvbnN0IHJvbGVOYW1lID0gcmVzb3VyY2VOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSE7XG5cbiAgICAvLyBpZiAoZ2V0Q3VzdG9taXplUm9sZXNDb25maWcoc2NvcGUpLmVuYWJsZWQpIHtcbiAgICAvLyAgIHJldHVybiBuZXcgUHJlY3JlYXRlZFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgLy8gICAgIHJvbGVQYXRoOiBgJHtzY29wZS5ub2RlLnBhdGh9LyR7aWR9YCxcbiAgICAvLyAgICAgcm9sZTogbmV3IEltcG9ydGVkUm9sZShzY29wZSwgYEltcG9ydCR7aWR9YCwge1xuICAgIC8vICAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgIC8vICAgICAgIHJvbGVBcm4sXG4gICAgLy8gICAgICAgcm9sZU5hbWUsXG4gICAgLy8gICAgICAgLi4ub3B0aW9ucyxcbiAgICAvLyAgICAgfSksXG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2VcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCInYWRkR3JhbnRzVG9SZXNvdXJjZXMnIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiAnbXV0YWJsZTogZmFsc2UnXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPSB0b2tlbkNvbXBhcmVTdHJpbmdzKFxuICAgICAgcm9sZUFjY291bnQgPz8gXCJcIixcbiAgICAgIHNjb3BlU3RhY2suYWNjb3VudCxcbiAgICApO1xuICAgIGNvbnN0IGVxdWFsT3JBbnlVbnJlc29sdmVkID1cbiAgICAgIHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPT09IFRva2VuQ29tcGFyaXNvbi5TQU1FIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PVxuICAgICAgICBUb2tlbkNvbXBhcmlzb24uQk9USF9VTlJFU09MVkVEIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PSBUb2tlbkNvbXBhcmlzb24uT05FX1VOUkVTT0xWRUQ7XG5cbiAgICAvLyBpZiB3ZSBhcmUgcmV0dXJuaW5nIGFuIGltbXV0YWJsZSByb2xlIHRoZW4gdGhlICdpbXBvcnRlZFJvbGUnIGlzIGp1c3QgYSB0aHJvd2F3YXkgY29uc3RydWN0XG4gICAgLy8gc28gZ2l2ZSBpdCBhIGRpZmZlcmVudCBpZFxuICAgIGNvbnN0IG11dGFibGVSb2xlSWQgPVxuICAgICAgb3B0aW9ucy5tdXRhYmxlICE9PSBmYWxzZSAmJiBlcXVhbE9yQW55VW5yZXNvbHZlZFxuICAgICAgICA/IGlkXG4gICAgICAgIDogYE11dGFibGVSb2xlJHtpZH1gO1xuICAgIGNvbnN0IGltcG9ydGVkUm9sZSA9IG5ldyBJbXBvcnRlZFJvbGUoc2NvcGUsIG11dGFibGVSb2xlSWQsIHtcbiAgICAgIHJvbGVBcm4sXG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIHdlIG9ubHkgcmV0dXJuIGFuIGltbXV0YWJsZSBSb2xlIGlmIGJvdGggYWNjb3VudHMgd2VyZSBleHBsaWNpdGx5IHByb3ZpZGVkLCBhbmQgZGlmZmVyZW50XG4gICAgcmV0dXJuIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2UgJiYgZXF1YWxPckFueVVucmVzb2x2ZWRcbiAgICAgID8gaW1wb3J0ZWRSb2xlXG4gICAgICA6IG5ldyBJbW11dGFibGVSb2xlKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGltcG9ydGVkUm9sZSxcbiAgICAgICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzID8/IGZhbHNlLFxuICAgICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBSb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzUm9sZSh4OiBhbnkpOiB4IGlzIFJvbGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIElBTV9ST0xFX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IG5hbWUuXG4gICAqXG4gICAqIFRoZSBpbXBvcnRlZCByb2xlIGlzIGFzc3VtZWQgdG8gZXhpc3QgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgYWNjb3VudFxuICAgKiB0aGUgc2NvcGUncyBjb250YWluaW5nIFN0YWNrIGlzIGJlaW5nIGRlcGxveWVkIHRvLlxuXG4gICAqIEBwYXJhbSBzY29wZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gaW1wb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zIGFsbG93IGN1c3RvbWl6aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgcmV0dXJuZWQgcm9sZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHJvbGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVOYW1lT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gUm9sZS5mcm9tUm9sZUFybihcbiAgICAgIHNjb3BlLFxuICAgICAgaWQsXG4gICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgcmVnaW9uOiBcIlwiLFxuICAgICAgICBzZXJ2aWNlOiBcImlhbVwiLFxuICAgICAgICByZXNvdXJjZTogXCJyb2xlXCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICB9KSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgY3VzdG9tIHJvbGUgY3JlYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcm9sZS50cyNMMzU1XG5cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuZW52LmFjY291bnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICAvKipcbiAgICogVGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVQb2xpY3k/OiBQb2xpY3lEb2N1bWVudDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQVJOIG9mIHRoaXMgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb25zIGJvdW5kYXJ5IGF0dGFjaGVkIHRvIHRoaXMgcm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKiogU3Ryb25nbHkgdHlwZWQgT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IHJvbGVPdXRwdXRzKCk6IFJvbGVPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXJuOiB0aGlzLnJvbGVBcm4sXG4gICAgICBuYW1lOiB0aGlzLnJvbGVOYW1lLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIFRlcnJhZm9ybSByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogaWFtUm9sZS5JYW1Sb2xlO1xuICBwcml2YXRlIGRlZmF1bHRQb2xpY3k/OiBQb2xpY3k7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuYWdlZFBvbGljaWVzOiBJTWFuYWdlZFBvbGljeVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0YWNoZWRQb2xpY2llcyA9IG5ldyBBdHRhY2hlZFBvbGljaWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5saW5lUG9saWNpZXM6IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kYWJsZXMgPSBuZXcgTWFwPFBvbGljeVN0YXRlbWVudCwgRGVwZW5kZW5jeUdyb3VwPigpO1xuICBwcml2YXRlIGltbXV0YWJsZVJvbGU/OiBJUm9sZTtcbiAgLy8gcHJpdmF0ZSBfZGlkU3BsaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm9sZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvbGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucm9sZU5hbWUgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMucm9sZU5hbWUpICYmXG4gICAgICAhL15bXFx3Kz0sLkAtXXsxLDY0fSQvLnRlc3QocHJvcHMucm9sZU5hbWUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW52YWxpZCByb2xlTmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvbnNpc3Rpbmcgb2YgdXBwZXIgYW5kIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIG5vIHNwYWNlcy4gWW91IGNhbiBhbHNvIGluY2x1ZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogXys9LC5ALS4gTGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucm9sZU5hbWUgJiYgcHJvcHMucm9sZU5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdyb2xlTmFtZScgYW5kICdyb2xlTmFtZVByZWZpeCcuIFVzZSBvbmx5IG9uZS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZXJuYWxJZHMgPSBwcm9wcy5leHRlcm5hbElkcyB8fCBbXTtcbiAgICBpZiAocHJvcHMuZXh0ZXJuYWxJZCkge1xuICAgICAgZXh0ZXJuYWxJZHMucHVzaChwcm9wcy5leHRlcm5hbElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc3VtZVJvbGVQb2xpY3kgPSBjcmVhdGVBc3N1bWVSb2xlUG9saWN5KFxuICAgICAgdGhpcyxcbiAgICAgIFwiQXNzdW1lUm9sZVBvbGljeVwiLFxuICAgICAgcHJvcHMuYXNzdW1lZEJ5LFxuICAgICAgZXh0ZXJuYWxJZHMsXG4gICAgKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKC4uLihwcm9wcy5tYW5hZ2VkUG9saWNpZXMgfHwgW10pKTtcbiAgICB0aGlzLmlubGluZVBvbGljaWVzID0gcHJvcHMuaW5saW5lUG9saWNpZXMgfHwge307XG4gICAgdGhpcy5wZXJtaXNzaW9uc0JvdW5kYXJ5ID0gcHJvcHMucGVybWlzc2lvbnNCb3VuZGFyeTtcbiAgICBjb25zdCBtYXhTZXNzaW9uRHVyYXRpb24gPVxuICAgICAgcHJvcHMubWF4U2Vzc2lvbkR1cmF0aW9uICYmIHByb3BzLm1heFNlc3Npb25EdXJhdGlvbi50b1NlY29uZHMoKTtcbiAgICB2YWxpZGF0ZU1heFNlc3Npb25EdXJhdGlvbihtYXhTZXNzaW9uRHVyYXRpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID1cbiAgICAgIHByb3BzLmRlc2NyaXB0aW9uICYmIHByb3BzLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAwXG4gICAgICAgID8gcHJvcHMuZGVzY3JpcHRpb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJvbGUgZGVzY3JpcHRpb24gbXVzdCBiZSBubyBsb25nZXIgdGhhbiAxMDAwIGNoYXJhY3RlcnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhbGlkYXRlUm9sZVBhdGgocHJvcHMucGF0aCk7XG5cbiAgICAvLyBwcmUtY3JlYXRlZCByb2xlIHNuaXBwZWRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9yb2xlLnRzI0w0MzlcblxuICAgIGNvbnN0IG5hbWVQcmVmaXggPSB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZVByZWZpeCh0aGlzLCB7XG4gICAgICBwcmVmaXg6IHByb3BzLnJvbGVOYW1lUHJlZml4ID8/IHRoaXMuZ3JpZFVVSUQgKyBcIi1cIixcbiAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCJfKz0sLkAtXCIsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBpYW1Sb2xlLklhbVJvbGUodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICAuLi5wcm9wcywgLy8gY29weSBvdmVyIFRlcnJhZm9ybSBNZXRhIEFyZ3VtZW50cyBmcm9tIENvbnN0cnVjdFByb3BzXG4gICAgICBhc3N1bWVSb2xlUG9saWN5OiB0aGlzLmFzc3VtZVJvbGVQb2xpY3kuanNvbixcbiAgICAgIG1hbmFnZWRQb2xpY3lBcm5zOiBVbmlxdWVTdHJpbmdTZXQuZnJvbSgoKSA9PlxuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5tYXAoKHApID0+IHAubWFuYWdlZFBvbGljeUFybiksXG4gICAgICApLFxuICAgICAgaW5saW5lUG9saWN5OiBfZmxhdHRlbih0aGlzLmlubGluZVBvbGljaWVzKSxcbiAgICAgIHBhdGg6IHByb3BzLnBhdGgsXG4gICAgICBwZXJtaXNzaW9uc0JvdW5kYXJ5OiB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnlcbiAgICAgICAgPyB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnkubWFuYWdlZFBvbGljeUFyblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgbmFtZVByZWZpeDogIXByb3BzLnJvbGVOYW1lID8gbmFtZVByZWZpeCA6IHVuZGVmaW5lZCxcbiAgICAgIG1heFNlc3Npb25EdXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZm9yY2VEZXRhY2hQb2xpY2llczogcHJvcHMuZm9yY2VEZXRhY2hQb2xpY2llcyxcbiAgICB9KTtcblxuICAgIC8vIFN0YWJsZSBhbmQgdW5pcXVlIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcm9sZS5cbiAgICB0aGlzLl9yb2xlSWQgPSB0aGlzLnJlc291cmNlLnVuaXF1ZUlkO1xuXG4gICAgLy8gVE9ETzogTmVlZCB0byBoYW5kbGUgY3Jvc3MgZW52IEFSTiByZWZzP1xuICAgIC8vIENESzogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcmVzb3VyY2UudHMjTDI4OFxuICAgIHRoaXMucm9sZUFybiA9IHRoaXMucmVzb3VyY2UuYXJuO1xuICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGNyb3NzIGVudiBOYW1lIHJlZnM/XG4gICAgLy8gQ0RLOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9yZXNvdXJjZS50cyNMMjU0XG4gICAgdGhpcy5yb2xlTmFtZSA9IHRoaXMucmVzb3VyY2UubmFtZTtcblxuICAgIC8vIFRPRE86IFJlLWFkZCBwb2xpY3kgc3BsaXR0aW5nP1xuICAgIC8vIEFzcGVjdHMub2YodGhpcykuYWRkKHtcbiAgICAvLyAgIHZpc2l0OiAoYykgPT4ge1xuICAgIC8vICAgICBpZiAoYyA9PT0gdGhpcykge1xuICAgIC8vICAgICAgIHRoaXMuc3BsaXRMYXJnZVBvbGljeSgpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH0pO1xuXG4gICAgdGhpcy5wb2xpY3lGcmFnbWVudCA9IG5ldyBBcm5QcmluY2lwYWwodGhpcy5yb2xlQXJuKS5wb2xpY3lGcmFnbWVudDtcblxuICAgIGZ1bmN0aW9uIF9mbGF0dGVuKHBvbGljaWVzPzogeyBbbmFtZTogc3RyaW5nXTogUG9saWN5RG9jdW1lbnQgfSkge1xuICAgICAgaWYgKHBvbGljaWVzID09IG51bGwgfHwgT2JqZWN0LmtleXMocG9saWNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PGlhbVJvbGUuSWFtUm9sZUlubGluZVBvbGljeT4oKTtcbiAgICAgIGZvciAoY29uc3QgcG9saWN5TmFtZSBvZiBPYmplY3Qua2V5cyhwb2xpY2llcykpIHtcbiAgICAgICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBwb2xpY2llc1twb2xpY3lOYW1lXTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG5hbWU6IHBvbGljeU5hbWUsXG4gICAgICAgICAgcG9saWN5OiBwb2xpY3lEb2N1bWVudC5qc29uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVJvbGUoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgcm9sZSdzIGRlZmF1bHQgcG9saWN5IGRvY3VtZW50LlxuICAgKiBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IHBvbGljeSBhdHRhY2hlZCB0byB0aGlzIHJvbGUsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcGVybWlzc2lvbiBzdGF0ZW1lbnQgdG8gYWRkIHRvIHRoZSBwb2xpY3kgZG9jdW1lbnRcbiAgICovXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5kZWZhdWx0UG9saWN5KSB7XG4gICAgICB0aGlzLmRlZmF1bHRQb2xpY3kgPSBuZXcgUG9saWN5KHRoaXMsIFwiRGVmYXVsdFBvbGljeVwiKTtcbiAgICAgIHRoaXMuYXR0YWNoSW5saW5lUG9saWN5KHRoaXMuZGVmYXVsdFBvbGljeSk7XG4gICAgfVxuICAgIHRoaXMuZGVmYXVsdFBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG5cbiAgICAvLyAvLyBXZSBtaWdodCBzcGxpdCB0aGlzIHN0YXRlbWVudCBvZmYgaW50byBhIGRpZmZlcmVudCBwb2xpY3ksIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAvLyAvLyBsYXRlLWJpbmQgdGhlIGRlcGVuZGFibGUuXG4gICAgLy8gY29uc3QgcG9saWN5RGVwZW5kYWJsZSA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcbiAgICAvLyB0aGlzLmRlcGVuZGFibGVzLnNldChzdGF0ZW1lbnQsIHBvbGljeURlcGVuZGFibGUpO1xuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1BvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCkuc3RhdGVtZW50QWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBtYW5hZ2VkIHBvbGljeSB0byB0aGlzIHJvbGUuXG4gICAqXG4gICAqIE5PVEU6IFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgdGhlIHJvbGUgdG8gdGFrZSBvdmVyXG4gICAqIGV4Y2x1c2l2ZSBtYW5hZ2VtZW50IG9mIHRoZSByb2xlJ3MgTWFuYWdlZFBvbGljeSBhdHRhY2htZW50c1xuICAgKiBUaGVzZSBhcmd1bWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHdheXMgb2YgbWFuYWdpbmdcbiAgICogYSByb2xlJ3Mgc3VjaCBhcyBhdHRhY2hpbmcgdGhlIHBvbGljeSB0byB0aGUgcm9sZSB0aHJvdWdoIGl0c1xuICAgKiBgcG9saWN5LmF0dGFjaFRvUm9sZShyb2xlKWAgbWV0aG9kLlxuICAgKlxuICAgKiBJZiB5b3UgYXR0ZW1wdCB0byBtYW5hZ2UgYSByb2xlJ3MgcG9saWNpZXMgYnkgbXVsdGlwbGUgbWVhbnMsXG4gICAqIHlvdSB3aWxsIGdldCByZXNvdXJjZSBjeWNsaW5nIGFuZC9vciBlcnJvcnMuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcG9saWN5MSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnUG9saWN5Jywge1xuICAgKiAgIG1hbmFnZWRQb2xpY3lOYW1lOiAnTXlQb2xpY3kxJyxcbiAgICogICBkZXNjcmlwdGlvbjogJ0EgZGVzY3JpcHRpb24gb2YgdGhlIHBvbGljeScsXG4gICAqIH0pO1xuICAgKiBjb25zdCBwb2xpY3kyID0gbmV3IGlhbS5NYW5hZ2VkUG9saWN5KHRoaXMsICdQb2xpY3knLCB7XG4gICAqICAgbWFuYWdlZFBvbGljeU5hbWU6ICdNeVBvbGljeTInLFxuICAgKiAgIGRlc2NyaXB0aW9uOiAnQSBkZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5JyxcbiAgICogfSk7XG4gICAqXG4gICAqIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAqICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc25zLmFtYXpvbmF3cy5jb20nKSxcbiAgICogfSk7XG4gICAqIC8vIHJvbGUgYmVjb21lcyB0aGUgbWFuYWdlciBvZiBhbGwgYXR0YWNoZWQgcG9saWNpZXNcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnU2VjdXJpdHlBdWRpdCcpKTtcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTEpO1xuICAgKlxuICAgKiAvLyB0aGlzIGludHJvZHVjZXMgcmVzb3VyY2UgY3ljbGluZ1xuICAgKiAvLyBET04nVCBETyBUSElTXG4gICAqIHBvbGljeTIuYXR0YWNoVG9Sb2xlKHJvbGUpO1xuICAgKlxuICAgKiAvLyBETyBUSElTIElOU1RFQURcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTIpO1xuICAgKiBgYGBcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgdGhlIG1hbmFnZWQgcG9saWN5IHRvIGF0dGFjaC5cbiAgICovXG4gIHB1YmxpYyBhZGRNYW5hZ2VkUG9saWN5KHBvbGljeTogSU1hbmFnZWRQb2xpY3kpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5zb21lKFxuICAgICAgICAobXApID0+IG1wLm1hbmFnZWRQb2xpY3lBcm4gPT09IHBvbGljeS5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBwb2xpY3kgdG8gdGhpcyByb2xlLlxuICAgKlxuICAgKiBOT1RFOiBVc2luZyB0aGlzIG1ldGhvZCB3aWxsIGZvcmNlIHRoZSByb2xlIHRvIHRha2Ugb3ZlclxuICAgKiBleGNsdXNpdmUgbWFuYWdlbWVudCBvZiB0aGUgcm9sZSdzIGlubGluZSBQb2xpY3kgYXR0YWNobWVudHNcbiAgICogVGhlc2UgYXJndW1lbnRzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBvdGhlciB3YXlzIG9mIG1hbmFnaW5nXG4gICAqIGEgcm9sZSdzIHN1Y2ggYXMgYXR0YWNoaW5nIGEgcG9saWN5IHRvIHRoZSByb2xlLlxuICAgKiBJZiB5b3UgYXR0ZW1wdCB0byBtYW5hZ2UgYSByb2xlJ3MgcG9saWNpZXMgYnkgbXVsdGlwbGUgbWVhbnMsXG4gICAqIHlvdSB3aWxsIGdldCByZXNvdXJjZSBjeWNsaW5nIGFuZC9vciBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeSB0byBhdHRhY2hcbiAgICovXG4gIHB1YmxpYyBhdHRhY2hJbmxpbmVQb2xpY3kocG9saWN5OiBQb2xpY3kpIHtcbiAgICB0aGlzLmF0dGFjaGVkUG9saWNpZXMuYXR0YWNoKHBvbGljeSk7XG4gICAgcG9saWN5LmF0dGFjaFRvUm9sZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgYWN0aW9ucyBkZWZpbmVkIGluIGFjdGlvbnMgdG8gdGhlIGlkZW50aXR5IFByaW5jaXBhbCBvbiB0aGlzIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IElQcmluY2lwYWwsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy5yb2xlQXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gcGFzcyB0aGlzIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRQYXNzUm9sZShpZGVudGl0eTogSVByaW5jaXBhbCkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGlkZW50aXR5LCBcImlhbTpQYXNzUm9sZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gcHJpbmNpcGFsIHRvIGFzc3VtZSB0aGlzIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRBc3N1bWVSb2xlKGlkZW50aXR5OiBJUHJpbmNpcGFsKSB7XG4gICAgLy8gU2VydmljZSBhbmQgYWNjb3VudCBwcmluY2lwYWxzIG11c3QgdXNlIGFzc3VtZVJvbGVQb2xpY3lcbiAgICBpZiAoXG4gICAgICBpZGVudGl0eSBpbnN0YW5jZW9mIFNlcnZpY2VQcmluY2lwYWwgfHxcbiAgICAgIGlkZW50aXR5IGluc3RhbmNlb2YgQWNjb3VudFByaW5jaXBhbFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCB1c2UgYSBzZXJ2aWNlIG9yIGFjY291bnQgcHJpbmNpcGFsIHdpdGggZ3JhbnRBc3N1bWVSb2xlLCB1c2UgYXNzdW1lUm9sZVBvbGljeSBpbnN0ZWFkLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoaWRlbnRpdHksIFwic3RzOkFzc3VtZVJvbGVcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhYmxlIGFuZCB1bmlxdWUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSByb2xlLiBGb3IgZXhhbXBsZSxcbiAgICogQUlEQUpRQUJMWlM0QTNRRFU1NzZRLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvbGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yb2xlSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSBvZiB0aGlzIFJvbGUgb2JqZWN0IHdob3NlIFBvbGljaWVzIHdpbGwgbm90IGJlIHVwZGF0ZWRcbiAgICpcbiAgICogVXNlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdGhpcyBSb2xlIHRvIGJlIHVzZWQgYnlcbiAgICogYSBjb25zdHJ1Y3Qgd2l0aG91dCBpdCBhdXRvbWF0aWNhbGx5IHVwZGF0aW5nIHRoZSBSb2xlJ3MgUG9saWNpZXMuXG4gICAqXG4gICAqIElmIHlvdSBkbywgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgYWRkaW5nIHRoZSBjb3JyZWN0IHN0YXRlbWVudHMgdG8gdGhlXG4gICAqIFJvbGUncyBwb2xpY2llcyB5b3Vyc2VsZi5cbiAgICovXG4gIHB1YmxpYyB3aXRob3V0UG9saWN5VXBkYXRlcyhcbiAgICBvcHRpb25zOiBXaXRob3V0UG9saWN5VXBkYXRlc09wdGlvbnMgPSB7fSxcbiAgKTogSVJvbGUge1xuICAgIGlmICghdGhpcy5pbW11dGFibGVSb2xlKSB7XG4gICAgICB0aGlzLmltbXV0YWJsZVJvbGUgPSBuZXcgSW1tdXRhYmxlUm9sZShcbiAgICAgICAgdGhpcy5ub2RlLnNjb3BlIGFzIENvbnN0cnVjdCxcbiAgICAgICAgYEltbXV0YWJsZVJvbGUke3RoaXMubm9kZS5pZH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzID8/IGZhbHNlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbW11dGFibGVSb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJvbGUoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZXJyb3JzLnB1c2goLi4uKHRoaXMuYXNzdW1lUm9sZVBvbGljeT8udmFsaWRhdGVGb3JSZXNvdXJjZVBvbGljeSgpID8/IFtdKSk7XG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmlubGluZVBvbGljaWVzKSkge1xuICAgICAgZXJyb3JzLnB1c2goLi4ucG9saWN5LnZhbGlkYXRlRm9ySWRlbnRpdHlQb2xpY3koKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBTcGxpdCBsYXJnZSBpbmxpbmUgcG9saWNpZXMgaW50byBtYW5hZ2VkIHBvbGljaWVzXG4gIC8vICAqXG4gIC8vICAqIFRoaXMgZ2V0cyBhcm91bmQgdGhlIDEwayBieXRlcyBsaW1pdCBvbiByb2xlIHBvbGljaWVzLlxuICAvLyAgKi9cbiAgLy8gcHJpdmF0ZSBzcGxpdExhcmdlUG9saWN5KCkge1xuICAvLyAgIGlmICghdGhpcy5kZWZhdWx0UG9saWN5IHx8IHRoaXMuX2RpZFNwbGl0KSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuX2RpZFNwbGl0ID0gdHJ1ZTtcblxuICAvLyAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAvLyAgIGNvbnN0IG9yaWdpbmFsRG9jID0gdGhpcy5kZWZhdWx0UG9saWN5LmRvY3VtZW50O1xuXG4gIC8vICAgY29uc3Qgc3BsaXRPZmZEb2NzID0gb3JpZ2luYWxEb2MuX3NwbGl0RG9jdW1lbnQoXG4gIC8vICAgICB0aGlzLFxuICAvLyAgICAgTUFYX0lOTElORV9TSVpFLFxuICAvLyAgICAgTUFYX01BTkFHRURQT0xfU0laRSxcbiAgLy8gICApO1xuICAvLyAgIC8vIEluY2x1ZGVzIHRoZSBcImN1cnJlbnRcIiBkb2N1bWVudFxuXG4gIC8vICAgY29uc3QgbXBDb3VudCA9IHRoaXMubWFuYWdlZFBvbGljaWVzLmxlbmd0aCArIChzcGxpdE9mZkRvY3Muc2l6ZSAtIDEpO1xuICAvLyAgIGlmIChtcENvdW50ID4gMjApIHtcbiAgLy8gICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgLy8gICAgICAgXCJAYXdzLWNkay9hd3MtaWFtOnJvbGVQb2xpY3lUb29MYXJnZVwiLFxuICAvLyAgICAgICBgUG9saWN5IHRvbyBsYXJnZTogJHttcENvdW50fSBleGNlZWRzIHRoZSBtYXhpbXVtIG9mIDIwIG1hbmFnZWQgcG9saWNpZXMgYXR0YWNoZWQgdG8gYSBSb2xlYCxcbiAgLy8gICAgICk7XG4gIC8vICAgfSBlbHNlIGlmIChtcENvdW50ID4gMTApIHtcbiAgLy8gICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgLy8gICAgICAgXCJAYXdzLWNkay9hd3MtaWFtOnJvbGVQb2xpY3lMYXJnZVwiLFxuICAvLyAgICAgICBgUG9saWN5IGxhcmdlOiAke21wQ291bnR9IGV4Y2VlZHMgMTAgbWFuYWdlZCBwb2xpY2llcyBhdHRhY2hlZCB0byBhIFJvbGUsIHRoaXMgcmVxdWlyZXMgYSBxdW90YSBpbmNyZWFzZWAsXG4gIC8vICAgICApO1xuICAvLyAgIH1cblxuICAvLyAgIC8vIENyZWF0ZSB0aGUgbWFuYWdlZCBwb2xpY2llcyBhbmQgZml4IHVwIHRoZSBkZXBlbmRlbmNpZXNcbiAgLy8gICBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KG9yaWdpbmFsRG9jLCB0aGlzLmRlZmF1bHRQb2xpY3kpO1xuXG4gIC8vICAgbGV0IGkgPSAxO1xuICAvLyAgIGZvciAoY29uc3QgbmV3RG9jIG9mIHNwbGl0T2ZmRG9jcy5rZXlzKCkpIHtcbiAgLy8gICAgIGlmIChuZXdEb2MgPT09IG9yaWdpbmFsRG9jKSB7XG4gIC8vICAgICAgIGNvbnRpbnVlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBtcCA9IG5ldyBBd3NNYW5hZ2VkUG9saWN5KHRoaXMsIGBPdmVyZmxvd1BvbGljeSR7aSsrfWAsIHtcbiAgLy8gICAgICAgZGVzY3JpcHRpb246IGBQYXJ0IG9mIHRoZSBwb2xpY2llcyBmb3IgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAvLyAgICAgICBkb2N1bWVudDogbmV3RG9jLFxuICAvLyAgICAgICByb2xlczogW3RoaXNdLFxuICAvLyAgICAgfSk7XG4gIC8vICAgICBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KG5ld0RvYywgbXApO1xuICAvLyAgIH1cblxuICAvLyAgIC8qKlxuICAvLyAgICAqIFVwZGF0ZSB0aGUgRGVwZW5kYWJsZXMgZm9yIHRoZSBzdGF0ZW1lbnRzIGluIHRoZSBnaXZlbiBQb2xpY3lEb2N1bWVudCB0byBwb2ludCB0byB0aGUgYWN0dWFsIGRlY2xhcmluZyBjb25zdHJ1Y3RcbiAgLy8gICAgKi9cbiAgLy8gICBmdW5jdGlvbiBtYXJrRGVjbGFyaW5nQ29uc3RydWN0KFxuICAvLyAgICAgZG9jOiBQb2xpY3lEb2N1bWVudCxcbiAgLy8gICAgIGRlY2xhcmluZ0NvbnN0cnVjdDogSUNvbnN0cnVjdCxcbiAgLy8gICApIHtcbiAgLy8gICAgIGZvciAoY29uc3Qgb3JpZ2luYWwgb2Ygc3BsaXRPZmZEb2NzLmdldChkb2MpID8/IFtdKSB7XG4gIC8vICAgICAgIHNlbGYuZGVwZW5kYWJsZXMuZ2V0KG9yaWdpbmFsKT8uYWRkKGRlY2xhcmluZ0NvbnN0cnVjdCk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG59XG5cbi8qKlxuICogT3V0cHV0cyB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBmb3Igb3V0cHV0IHZpYSB0aGUgR3JpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlT3V0cHV0cyB7XG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBSb2xlIG9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb2xlIGV4dGVuZHMgSUlkZW50aXR5IHtcbiAgLyoqXG4gICAqIHN0cm9uZ2x5IHR5cGVkIHJvbGVPdXRwdXRzXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVPdXRwdXRzOiBSb2xlT3V0cHV0cztcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEFSTiBvZiB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBhY3Rpb25zIGRlZmluZWQgaW4gYWN0aW9ucyB0byB0aGUgaWRlbnRpdHkgUHJpbmNpcGFsIG9uIHRoaXMgcmVzb3VyY2UuXG4gICAqL1xuICBncmFudChncmFudGVlOiBJUHJpbmNpcGFsLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IEdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gcHJpbmNpcGFsIHRvIHBhc3MgdGhpcyByb2xlLlxuICAgKi9cbiAgZ3JhbnRQYXNzUm9sZShncmFudGVlOiBJUHJpbmNpcGFsKTogR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICovXG4gIGdyYW50QXNzdW1lUm9sZShncmFudGVlOiBJUHJpbmNpcGFsKTogR3JhbnQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFzc3VtZVJvbGVQb2xpY3koXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbiAgZXh0ZXJuYWxJZHM6IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IGFjdHVhbERvYyA9IG5ldyBQb2xpY3lEb2N1bWVudChzY29wZSwgaWQpO1xuXG4gIC8vIElmIHJlcXVlc3RlZCwgYWRkIGV4dGVybmFsSWRzIHRvIGV2ZXJ5IHN0YXRlbWVudCBhZGRlZCB0byB0aGlzIGRvY1xuICBjb25zdCBhZGREb2MgPVxuICAgIGV4dGVybmFsSWRzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBhY3R1YWxEb2NcbiAgICAgIDogbmV3IE11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGFjdHVhbERvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgIHN0YXRlbWVudC5hZGRDb25kaXRpb24oe1xuICAgICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgICAgIHZhcmlhYmxlOiBcInN0czpFeHRlcm5hbElkXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IGV4dGVybmFsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUocHJpbmNpcGFsLCBhZGREb2MpO1xuXG4gIHJldHVybiBhY3R1YWxEb2M7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUm9sZVBhdGgocGF0aD86IHN0cmluZykge1xuICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChwYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkUm9sZVBhdGggPSAvXihcXC98XFwvW1xcdTAwMjEtXFx1MDA3Rl0rXFwvKSQvO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA9PSAwIHx8IHBhdGgubGVuZ3RoID4gNTEyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFJvbGUgcGF0aCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTEyIGNoYXJhY3RlcnMuIFRoZSBwcm92aWRlZCByb2xlIHBhdGggaXMgJHtwYXRoLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkUm9sZVBhdGgudGVzdChwYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiUm9sZSBwYXRoIG11c3QgYmUgZWl0aGVyIGEgc2xhc2ggb3IgdmFsaWQgY2hhcmFjdGVycyAoYWxwaGFudW1lcmljcyBhbmQgc3ltYm9scykgc3Vycm91bmRlZCBieSBzbGFzaGVzLiBcIiArXG4gICAgICAgIGBWYWxpZCBjaGFyYWN0ZXJzIGFyZSB1bmljb2RlIGNoYXJhY3RlcnMgaW4gW1xcXFx1MDAyMS1cXFxcdTAwN0ZdLiBIb3dldmVyLCAke3BhdGh9IGlzIHByb3ZpZGVkLmAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1heFNlc3Npb25EdXJhdGlvbihkdXJhdGlvbj86IG51bWJlcikge1xuICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkdXJhdGlvbiA8IDM2MDAgfHwgZHVyYXRpb24gPiA0MzIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtYXhTZXNzaW9uRHVyYXRpb24gaXMgc2V0IHRvICR7ZHVyYXRpb259LCBidXQgbXVzdCBiZSA+PSAzNjAwc2VjICgxaHIpIGFuZCA8PSA0MzIwMHNlYyAoMTJocnMpYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGB3aXRob3V0UG9saWN5VXBkYXRlcygpYCBtb2RpZmllciBvZiBhIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaXRob3V0UG9saWN5VXBkYXRlc09wdGlvbnMge1xuICAvKipcbiAgICogQWRkIGdyYW50cyB0byByZXNvdXJjZXMgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYGZhbHNlYCBvciBub3Qgc3BlY2lmaWVkLCBncmFudCBwZXJtaXNzaW9ucyBhZGRlZCB0byB0aGlzIHJvbGUgYXJlIGlnbm9yZWQuXG4gICAqIEl0IGlzIHlvdXIgb3duIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGUgcm9sZSBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGB0cnVlYCwgYW55IGdyYW50IHBlcm1pc3Npb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlc291cmNlIGluc3RlYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhZGRHcmFudHNUb1Jlc291cmNlcz86IGJvb2xlYW47XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb2xlLnByb3RvdHlwZSwgSUFNX1JPTEVfU1lNQk9MLCB7XG4gIHZhbHVlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG4iXX0=
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3JvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBOEM7QUFDOUMsaUNBQThCO0FBRTlCLGdDQUFtQztBQUNuQyxvREFBdUU7QUFDdkUsNENBQXdDO0FBQ3hDLG1DQUFnQztBQUdoQyxxQ0FBa0M7QUFDbEMsdURBQW1EO0FBRW5ELDZDQU9zQjtBQUV0QiwrQ0FBa0U7QUFDbEUscUVBQStFO0FBQy9FLDZEQUF5RDtBQUN6RCwyREFBdUQ7QUFDdkQsOERBQThEO0FBQzlELHlDQUFrRDtBQUNsRCx1Q0FBbUU7QUFFbkUseUJBQXlCO0FBQ3pCLGtHQUFrRztBQUVsRywrQ0FBK0M7QUFDL0MsaUNBQWlDO0FBQ2pDLG9DQUFvQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUErTXZFOzs7OztHQUtHO0FBQ0gsTUFBYSxJQUFLLFNBQVEsZ0NBQWdCO0lBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FDdkIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLE9BQWUsRUFDZixVQUE4QixFQUFFO1FBRWhDLE1BQU0sVUFBVSxHQUFHLG9CQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQ25DLE9BQU8sRUFDUCxlQUFTLENBQUMsbUJBQW1CLENBQzlCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBYSxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdEMsdUZBQXVGO1FBQ3ZGLGtHQUFrRztRQUNsRyxpR0FBaUc7UUFDakcsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxH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SUFBSSxLQUFLLENBQ2IsZ0NBQWdDLFFBQVEsd0RBQXdELENBQ2pHLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQW1CRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFO0lBQ3JELEtBQUssRUFBRSxJQUFJO0lBQ1gsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEtBQUs7Q0FDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaWFtUm9sZSB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybkZvcm1hdCB9IGZyb20gXCIuLi9hcm5cIjtcbmltcG9ydCB7IEF3c0NvbnN0cnVjdEJhc2UsIEF3c0NvbnN0cnVjdFByb3BzIH0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0IHsgR3JhbnQgfSBmcm9tIFwiLi9ncmFudFwiO1xuaW1wb3J0IHsgSUlkZW50aXR5IH0gZnJvbSBcIi4vaWRlbnRpdHktYmFzZVwiO1xuaW1wb3J0IHsgSU1hbmFnZWRQb2xpY3kgfSBmcm9tIFwiLi9tYW5hZ2VkLXBvbGljeVwiO1xuaW1wb3J0IHsgUG9saWN5IH0gZnJvbSBcIi4vcG9saWN5XCI7XG5pbXBvcnQgeyBQb2xpY3lEb2N1bWVudCB9IGZyb20gXCIuL3BvbGljeS1kb2N1bWVudFwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudFwiO1xuaW1wb3J0IHtcbiAgQWNjb3VudFByaW5jaXBhbCxcbiAgQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQsXG4gIEFyblByaW5jaXBhbCxcbiAgSVByaW5jaXBhbCxcbiAgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gXCIuL3ByaW5jaXBhbHNcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uXCI7XG5pbXBvcnQgeyBNdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlciB9IGZyb20gXCIuL3ByaXZhdGUvYWRhcHRlclwiO1xuaW1wb3J0IHsgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvYXNzdW1lLXJvbGUtcG9saWN5XCI7XG5pbXBvcnQgeyBJbW11dGFibGVSb2xlIH0gZnJvbSBcIi4vcHJpdmF0ZS9pbW11dGFibGUtcm9sZVwiO1xuaW1wb3J0IHsgSW1wb3J0ZWRSb2xlIH0gZnJvbSBcIi4vcHJpdmF0ZS9pbXBvcnRlZC1yb2xlXCI7XG4vLyBpbXBvcnQgeyBQcmVjcmVhdGVkUm9sZSB9IGZyb20gXCIuL3ByaXZhdGUvcHJlY3JlYXRlZC1yb2xlXCI7XG5pbXBvcnQgeyBBdHRhY2hlZFBvbGljaWVzIH0gZnJvbSBcIi4vcHJpdmF0ZS91dGlsXCI7XG5pbXBvcnQgeyBUb2tlbkNvbXBhcmlzb24sIHRva2VuQ29tcGFyZVN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vdG9rZW5cIjtcblxuLy8gVE9ETzogUmUtQWRkIExhenlSb2xlP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9sYXp5LXJvbGUudHNcblxuLy8gVE9ETzogcmUtaW1wbGVtZW50IGlhbSByb2xlIHBvbGljeSBzcGxpdHRpbmdcbi8vIGNvbnN0IE1BWF9JTkxJTkVfU0laRSA9IDEwMDAwO1xuLy8gY29uc3QgTUFYX01BTkFHRURQT0xfU0laRSA9IDYwMDA7XG5jb25zdCBJQU1fUk9MRV9TWU1CT0wgPSBTeW1ib2wuZm9yKFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MvaWFtLlJvbGVcIik7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZGVmaW5pbmcgYW4gSUFNIFJvbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHByaW5jaXBhbCAoaS5lLiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3Nucy5hbWF6b25hd3MuY29tJylgKVxuICAgKiB3aGljaCBjYW4gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBsYXRlciBtb2RpZnkgdGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBieSBhY2Nlc3NpbmcgaXQgdmlhXG4gICAqIHRoZSBgYXNzdW1lUm9sZVBvbGljeWAgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVkQnk6IElQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIElEIHRoYXQgdGhlIHJvbGUgYXNzdW1lciBuZWVkcyB0byBwcm92aWRlIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzZWUgYGV4dGVybmFsSWRzYFxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBJRHMgdGhhdCB0aGUgcm9sZSBhc3N1bWVyIG5lZWRzIHRvIHByb3ZpZGUgb25lIG9mIHdoZW4gYXNzdW1pbmcgdGhpcyByb2xlXG4gICAqXG4gICAqIElmIHRoZSBjb25maWd1cmVkIGFuZCBwcm92aWRlZCBleHRlcm5hbCBJRHMgZG8gbm90IG1hdGNoLCB0aGVcbiAgICogQXNzdW1lUm9sZSBvcGVyYXRpb24gd2lsbCBmYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBleHRlcm5hbCBJRCByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1hbmFnZWQgcG9saWNpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBhZGQgbWFuYWdlZCBwb2xpY2llcyBsYXRlciB1c2luZ1xuICAgKiBgYWRkTWFuYWdlZFBvbGljeShNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShwb2xpY3lOYW1lKSlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmFnZWQgcG9saWNpZXMuXG4gICAqL1xuICByZWFkb25seSBtYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbmFtZWQgcG9saWNpZXMgdG8gaW5saW5lIGludG8gdGhpcyByb2xlLiBUaGVzZSBwb2xpY2llcyB3aWxsIGJlXG4gICAqIGNyZWF0ZWQgd2l0aCB0aGUgcm9sZSwgd2hlcmVhcyB0aG9zZSBhZGRlZCBieSBgYGFkZFRvUG9saWN5YGAgYXJlIGFkZGVkXG4gICAqIHVzaW5nIGEgc2VwYXJhdGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgKGFsbG93aW5nIGEgd2F5IGFyb3VuZCBjaXJjdWxhclxuICAgKiBkZXBlbmRlbmNpZXMgdGhhdCBjb3VsZCBvdGhlcndpc2UgYmUgaW50cm9kdWNlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcG9saWN5IGlzIGlubGluZWQgaW4gdGhlIFJvbGUgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVQb2xpY2llcz86IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBJQU0gcGF0aHMsIHNlZVxuICAgKiBGcmllbmRseSBOYW1lcyBhbmQgUGF0aHMgaW4gSUFNIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC9cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFXUyBzdXBwb3J0cyBwZXJtaXNzaW9ucyBib3VuZGFyaWVzIGZvciBJQU0gZW50aXRpZXMgKHVzZXJzIG9yIHJvbGVzKS5cbiAgICogQSBwZXJtaXNzaW9ucyBib3VuZGFyeSBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIGZvciB1c2luZyBhIG1hbmFnZWQgcG9saWN5XG4gICAqIHRvIHNldCB0aGUgbWF4aW11bSBwZXJtaXNzaW9ucyB0aGF0IGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBjYW4gZ3JhbnQgdG9cbiAgICogYW4gSUFNIGVudGl0eS4gQW4gZW50aXR5J3MgcGVybWlzc2lvbnMgYm91bmRhcnkgYWxsb3dzIGl0IHRvIHBlcmZvcm0gb25seVxuICAgKiB0aGUgYWN0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIGJ5IGJvdGggaXRzIGlkZW50aXR5LWJhc2VkIHBvbGljaWVzIGFuZCBpdHNcbiAgICogcGVybWlzc2lvbnMgYm91bmRhcmllcy5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWlhbS1yb2xlLmh0bWwjY2ZuLWlhbS1yb2xlLXBlcm1pc3Npb25zYm91bmRhcnlcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2FjY2Vzc19wb2xpY2llc19ib3VuZGFyaWVzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwZXJtaXNzaW9ucyBib3VuZGFyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgSUFNIHJvbGUuIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUm9sZU5hbWUgcGFyYW1ldGVyIGZvclxuICAgKiB0aGUgQ3JlYXRlUm9sZSBhY3Rpb24gaW4gdGhlIElBTSBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBJTVBPUlRBTlQ6IElmIHlvdSBzcGVjaWZ5IGEgbmFtZSwgeW91IGNhbm5vdCBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlXG4gICAqIHJlcGxhY2VtZW50IG9mIHRoaXMgcmVzb3VyY2UuIFlvdSBjYW4gcGVyZm9ybSB1cGRhdGVzIHRoYXQgcmVxdWlyZSBubyBvclxuICAgKiBzb21lIGludGVycnVwdGlvbi4gSWYgeW91IG11c3QgcmVwbGFjZSB0aGUgcmVzb3VyY2UsIHNwZWNpZnkgYSBuZXcgbmFtZS5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSByb2xlLlxuICAgKlxuICAgKiBTZWUgW0lBTSBJZGVudGlmaWVyc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL1VzaW5nX0lkZW50aWZpZXJzLmh0bWwpXG4gICAqIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgUmVmZXIgdG8gYHJvbGVOYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqIENvbmZsaWN0cyB3aXRoIGByb2xlTmFtZWAuXG4gICAqXG4gICAqIElNUE9SVEFOVDogSWYgeW91IHNwZWNpZnkgYSBuYW1lUHJlZml4LCB5b3UgY2Fubm90IHBlcmZvcm0gdXBkYXRlcyB0aGF0IHJlcXVpcmVcbiAgICogcmVwbGFjZW1lbnQgb2YgdGhpcyByZXNvdXJjZS4gWW91IGNhbiBwZXJmb3JtIHVwZGF0ZXMgdGhhdCByZXF1aXJlIG5vIG9yXG4gICAqIHNvbWUgaW50ZXJydXB0aW9uLiBJZiB5b3UgbXVzdCByZXBsYWNlIHRoZSByZXNvdXJjZSwgc3BlY2lmeSBhIG5ldyBuYW1lLlxuICAgKlxuICAgKiBVc2UgW1RlcnJhZm9ybSBSZXNvdXJjZSBNZXRhIEFyZ3VtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvcmVzb3VyY2VzL3N5bnRheCNtZXRhLWFyZ3VtZW50cylcbiAgICogdG8gY29udHJvbCBsaWZlY3ljbGUgd2hlbiByZXBsYWNpbmcgdGhlIHJvbGUuXG4gICAqXG4gICAqIFNlZSBbSUFNIElkZW50aWZpZXJzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvVXNpbmdfSWRlbnRpZmllcnMuaHRtbClcbiAgICogZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBFVCB3aWxsIGFzc2lnbiBhIHJhbmRvbSwgdW5pcXVlIG5hbWUgcHJlZml4ZWQgYnkgR3JpZFVVSUQuXG4gICAqL1xuICByZWFkb25seSByb2xlTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc2Vzc2lvbiBkdXJhdGlvbiBpbiBzZWNvbmRzIHRoYXQgeW91IHdhbnQgdG8gc2V0IGZvciB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAqIFRoaXMgc2V0dGluZyBjYW4gaGF2ZSBhIHZhbHVlIGZyb20gMSBob3VyICgzNjAwc2VjKSB0byAxMiAoNDMyMDBzZWMpIGhvdXJzLlxuICAgKlxuICAgKiBBbnlvbmUgd2hvIGFzc3VtZXMgdGhlIHJvbGUgZnJvbSB0aGUgQVdTIENMSSBvciBBUEkgY2FuIHVzZSB0aGVcbiAgICogRHVyYXRpb25TZWNvbmRzIEFQSSBwYXJhbWV0ZXIgb3IgdGhlIGR1cmF0aW9uLXNlY29uZHMgQ0xJIHBhcmFtZXRlciB0b1xuICAgKiByZXF1ZXN0IGEgbG9uZ2VyIHNlc3Npb24uIFRoZSBNYXhTZXNzaW9uRHVyYXRpb24gc2V0dGluZyBkZXRlcm1pbmVzIHRoZVxuICAgKiBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgY2FuIGJlIHJlcXVlc3RlZCB1c2luZyB0aGUgRHVyYXRpb25TZWNvbmRzXG4gICAqIHBhcmFtZXRlci5cbiAgICpcbiAgICogSWYgdXNlcnMgZG9uJ3Qgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgRHVyYXRpb25TZWNvbmRzIHBhcmFtZXRlciwgdGhlaXJcbiAgICogc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHZhbGlkIGZvciBvbmUgaG91ciBieSBkZWZhdWx0LiBUaGlzIGFwcGxpZXMgd2hlblxuICAgKiB5b3UgdXNlIHRoZSBBc3N1bWVSb2xlKiBBUEkgb3BlcmF0aW9ucyBvciB0aGUgYXNzdW1lLXJvbGUqIENMSSBvcGVyYXRpb25zXG4gICAqIGJ1dCBkb2VzIG5vdCBhcHBseSB3aGVuIHlvdSB1c2UgdGhvc2Ugb3BlcmF0aW9ucyB0byBjcmVhdGUgYSBjb25zb2xlIFVSTC5cbiAgICpcbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3JvbGVzX3VzZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDEpXG4gICAqL1xuICByZWFkb25seSBtYXhTZXNzaW9uRHVyYXRpb24/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcm9sZS4gSXQgY2FuIGJlIHVwIHRvIDEwMDAgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgZGV0YWNoaW5nIGFueSBwb2xpY2llcyB0aGUgcm9sZSBoYXMgYmVmb3JlIGRlc3Ryb3lpbmcgaXRcbiAgICogSWYgcG9saWNpZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb2xlIHZpYSB0aGUgYGF3c19pYW1fcG9saWN5X2F0dGFjaG1lbnRgXG4gICAqIHJlc291cmNlIGFuZCB5b3UgYXJlIG1vZGlmeWluZyB0aGUgcm9sZSBgbmFtZWAgb3IgYHBhdGhgLCB0aGlzIG11c3QgYmVcbiAgICogc2V0IHRvIGB0cnVlYCBhbmQgYXBwbGllZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGUgb3BlcmF0aW9uIG90aGVyd2lzZSB5b3VcbiAgICogd2lsbCBlbmNvdW50ZXIgYSBgRGVsZXRlQ29uZmxpY3RgIGVycm9yLlxuICAgKlxuICAgKiBUaGUgYGF3c19pYW1fcm9sZV9wb2xpY3lfYXR0YWNobWVudGAgcmVzb3VyY2UgKHJlY29tbWVuZGVkKSBkb2VzIG5vdFxuICAgKiBoYXZlIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAqXG4gICAqIE5PVEU6IFRoZSBgaWFtLlBvbGljeWAgdXNlcyBgYXdzX2lhbV9yb2xlX3BvbGljeV9hdHRhY2htZW50YCB1bmRlclxuICAgKiB0aGUgaG9vZCBhbmQgdGhpcyBzaG91bGQgbm90IGJlIGEgY29uY2Vybi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXRhY2hQb2xpY2llcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBhbGxvd2luZyBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Igb2YgYFJvbGUuZnJvbVJvbGVBcm5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb21Sb2xlQXJuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbXBvcnRlZCByb2xlIGNhbiBiZSBtb2RpZmllZCBieSBhdHRhY2hpbmcgcG9saWN5IHJlc291cmNlcyB0byBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbXV0YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBpbW11dGFibGUgcm9sZXM6IGFkZCBncmFudHMgdG8gcmVzb3VyY2VzIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlbVxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBmYWxzZWAgb3Igbm90IHNwZWNpZmllZCwgZ3JhbnQgcGVybWlzc2lvbnMgYWRkZWQgdG8gdGhpcyByb2xlIGFyZSBpZ25vcmVkLlxuICAgKiBJdCBpcyB5b3VyIG93biByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIHJvbGUgaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgdHJ1ZWAsIGFueSBncmFudCBwZXJtaXNzaW9ucyB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZXNvdXJjZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkR3JhbnRzVG9SZXNvdXJjZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbnkgcG9saWNpZXMgY3JlYXRlZCBieSB0aGlzIHJvbGUgd2lsbCB1c2UgdGhpcyB2YWx1ZSBhcyB0aGVpciBJRCwgaWYgc3BlY2lmaWVkLlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgaW1wb3J0aW5nIHRoZSBzYW1lIHJvbGUgaW4gbXVsdGlwbGUgc3RhY2tzLCBhbmQgZ3JhbnRpbmcgaXRcbiAgICogZGlmZmVyZW50IHBlcm1pc3Npb25zIGluIGF0IGxlYXN0IHR3byBzdGFja3MuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZFxuICAgKiAob3IgaWYgdGhlIHNhbWUgbmFtZSBpcyBzcGVjaWZpZWQgaW4gbW9yZSB0aGFuIG9uZSBzdGFjayksXG4gICAqIGEgVGVycmFmb3JtIGlzc3VlIHdpbGwgcmVzdWx0IGluIHRoZSBwb2xpY3kgY3JlYXRlZCBpbiB3aGljaGV2ZXIgc3RhY2tcbiAgICogaXMgZGVwbG95ZWQgbGFzdCBvdmVyd3JpdGluZyB0aGUgcG9saWNpZXMgY3JlYXRlZCBieSB0aGUgb3RoZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnUG9saWN5J1xuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFBvbGljeU5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIFRPRE86IHN1cHBvcnQgZm9yIHByZS1jcmVhdGVkIHJvbGVzP1xuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9yb2xlLnRzI0wxODZcbi8vIE5PVEU6IGluIFRlcnJhQ29uc3RydWN0IHByZS1jcmVhdGVkIHJvbGVzIGFyZSBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgR3JpZCwgc28gdGhpcyBzZWVtcyBub3QgbmVlZGVkLlxuXG4vKipcbiAqIE9wdGlvbnMgYWxsb3dpbmcgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIGBSb2xlLmZyb21Sb2xlTmFtZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVJvbGVOYW1lT3B0aW9ucyBleHRlbmRzIEZyb21Sb2xlQXJuT3B0aW9ucyB7fVxuXG4vKipcbiAqIElBTSBSb2xlXG4gKlxuICogRGVmaW5lcyBhbiBJQU0gcm9sZS4gVGhlIHJvbGUgaXMgY3JlYXRlZCB3aXRoIGFuIGFzc3VtZSBwb2xpY3kgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoXG4gKiB0aGUgc3BlY2lmaWVkIEFXUyBzZXJ2aWNlIHByaW5jaXBhbCBkZWZpbmVkIGluIGBzZXJ2aWNlQXNzdW1lUm9sZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSb2xlIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IEFSTi5cbiAgICpcbiAgICogSWYgdGhlIGltcG9ydGVkIFJvbGUgQVJOIGlzIGEgVG9rZW4gKHN1Y2ggYXMgYVxuICAgKiBgQ2ZuUGFyYW1ldGVyLnZhbHVlQXNTdHJpbmdgIG9yIGEgYEZuLmltcG9ydFZhbHVlKClgKSAqYW5kKiB0aGUgcmVmZXJlbmNlZFxuICAgKiByb2xlIGhhcyBhIGBwYXRoYCAobGlrZSBgYXJuOi4uLjpyb2xlL0FkbWluUm9sZXMvQWxpY2VgKSwgdGhlXG4gICAqIGByb2xlTmFtZWAgcHJvcGVydHkgd2lsbCBub3QgcmVzb2x2ZSB0byB0aGUgY29ycmVjdCB2YWx1ZS4gSW5zdGVhZCBpdFxuICAgKiB3aWxsIHJlc29sdmUgdG8gdGhlIGZpcnN0IHBhdGggY29tcG9uZW50LiBXZSB1bmZvcnR1bmF0ZWx5IGNhbm5vdCBleHByZXNzXG4gICAqIHRoZSBjb3JyZWN0IGNhbGN1bGF0aW9uIG9mIHRoZSBmdWxsIHBhdGggbmFtZSBhcyBhIENsb3VkRm9ybWF0aW9uXG4gICAqIGV4cHJlc3Npb24uIEluIHRoaXMgc2NlbmFyaW8gdGhlIFJvbGUgQVJOIHNob3VsZCBiZSBzdXBwbGllZCB3aXRob3V0IHRoZVxuICAgKiBgcGF0aGAgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCByb2xlIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIHJvbGVBcm4gdGhlIEFSTiBvZiB0aGUgcm9sZSB0byBpbXBvcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgYWxsb3cgY3VzdG9taXppbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSByZXR1cm5lZCByb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICByb2xlQXJuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVBcm5PcHRpb25zID0ge30sXG4gICk6IElSb2xlIHtcbiAgICBjb25zdCBzY29wZVN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIGNvbnN0IHBhcnNlZEFybiA9IHNjb3BlU3RhY2suc3BsaXRBcm4oXG4gICAgICByb2xlQXJuLFxuICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgKTtcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBwYXJzZWRBcm4ucmVzb3VyY2VOYW1lITtcbiAgICBjb25zdCByb2xlQWNjb3VudCA9IHBhcnNlZEFybi5hY2NvdW50O1xuICAgIC8vIHNlcnZpY2Ugcm9sZXMgaGF2ZSBhbiBBUk4gbGlrZSAnYXJuOmF3czppYW06OjxhY2NvdW50Pjpyb2xlL3NlcnZpY2Utcm9sZS88cm9sZU5hbWU+J1xuICAgIC8vIG9yICdhcm46YXdzOmlhbTo6PGFjY291bnQ+OnJvbGUvc2VydmljZS1yb2xlL3NlcnZpY2VuYW1lLmFtYXpvbmF3cy5jb20vc2VydmljZS1yb2xlLzxyb2xlTmFtZT4nXG4gICAgLy8gd2Ugd2FudCB0byBzdXBwb3J0IHRoZXNlIGFzIHdlbGwsIHNvIHdlIGp1c3QgdXNlIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IHNsYXNoIGFzIHJvbGUgbmFtZVxuICAgIGNvbnN0IHJvbGVOYW1lID0gcmVzb3VyY2VOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSE7XG5cbiAgICAvLyBpZiAoZ2V0Q3VzdG9taXplUm9sZXNDb25maWcoc2NvcGUpLmVuYWJsZWQpIHtcbiAgICAvLyAgIHJldHVybiBuZXcgUHJlY3JlYXRlZFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgLy8gICAgIHJvbGVQYXRoOiBgJHtzY29wZS5ub2RlLnBhdGh9LyR7aWR9YCxcbiAgICAvLyAgICAgcm9sZTogbmV3IEltcG9ydGVkUm9sZShzY29wZSwgYEltcG9ydCR7aWR9YCwge1xuICAgIC8vICAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgIC8vICAgICAgIHJvbGVBcm4sXG4gICAgLy8gICAgICAgcm9sZU5hbWUsXG4gICAgLy8gICAgICAgLi4ub3B0aW9ucyxcbiAgICAvLyAgICAgfSksXG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2VcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCInYWRkR3JhbnRzVG9SZXNvdXJjZXMnIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiAnbXV0YWJsZTogZmFsc2UnXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPSB0b2tlbkNvbXBhcmVTdHJpbmdzKFxuICAgICAgcm9sZUFjY291bnQgPz8gXCJcIixcbiAgICAgIHNjb3BlU3RhY2suYWNjb3VudCxcbiAgICApO1xuICAgIGNvbnN0IGVxdWFsT3JBbnlVbnJlc29sdmVkID1cbiAgICAgIHJvbGVBcm5BbmRTY29wZVN0YWNrQWNjb3VudENvbXBhcmlzb24gPT09IFRva2VuQ29tcGFyaXNvbi5TQU1FIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PVxuICAgICAgICBUb2tlbkNvbXBhcmlzb24uQk9USF9VTlJFU09MVkVEIHx8XG4gICAgICByb2xlQXJuQW5kU2NvcGVTdGFja0FjY291bnRDb21wYXJpc29uID09PSBUb2tlbkNvbXBhcmlzb24uT05FX1VOUkVTT0xWRUQ7XG5cbiAgICAvLyBpZiB3ZSBhcmUgcmV0dXJuaW5nIGFuIGltbXV0YWJsZSByb2xlIHRoZW4gdGhlICdpbXBvcnRlZFJvbGUnIGlzIGp1c3QgYSB0aHJvd2F3YXkgY29uc3RydWN0XG4gICAgLy8gc28gZ2l2ZSBpdCBhIGRpZmZlcmVudCBpZFxuICAgIGNvbnN0IG11dGFibGVSb2xlSWQgPVxuICAgICAgb3B0aW9ucy5tdXRhYmxlICE9PSBmYWxzZSAmJiBlcXVhbE9yQW55VW5yZXNvbHZlZFxuICAgICAgICA/IGlkXG4gICAgICAgIDogYE11dGFibGVSb2xlJHtpZH1gO1xuICAgIGNvbnN0IGltcG9ydGVkUm9sZSA9IG5ldyBJbXBvcnRlZFJvbGUoc2NvcGUsIG11dGFibGVSb2xlSWQsIHtcbiAgICAgIHJvbGVBcm4sXG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFjY291bnQ6IHJvbGVBY2NvdW50LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIHdlIG9ubHkgcmV0dXJuIGFuIGltbXV0YWJsZSBSb2xlIGlmIGJvdGggYWNjb3VudHMgd2VyZSBleHBsaWNpdGx5IHByb3ZpZGVkLCBhbmQgZGlmZmVyZW50XG4gICAgcmV0dXJuIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2UgJiYgZXF1YWxPckFueVVucmVzb2x2ZWRcbiAgICAgID8gaW1wb3J0ZWRSb2xlXG4gICAgICA6IG5ldyBJbW11dGFibGVSb2xlKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGltcG9ydGVkUm9sZSxcbiAgICAgICAgICBvcHRpb25zLmFkZEdyYW50c1RvUmVzb3VyY2VzID8/IGZhbHNlLFxuICAgICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBSb2xlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzUm9sZSh4OiBhbnkpOiB4IGlzIFJvbGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIElBTV9ST0xFX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleHRlcm5hbCByb2xlIGJ5IG5hbWUuXG4gICAqXG4gICAqIFRoZSBpbXBvcnRlZCByb2xlIGlzIGFzc3VtZWQgdG8gZXhpc3QgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgYWNjb3VudFxuICAgKiB0aGUgc2NvcGUncyBjb250YWluaW5nIFN0YWNrIGlzIGJlaW5nIGRlcGxveWVkIHRvLlxuXG4gICAqIEBwYXJhbSBzY29wZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gcm9sZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvbGUgdG8gaW1wb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zIGFsbG93IGN1c3RvbWl6aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgcmV0dXJuZWQgcm9sZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZU5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHJvbGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRnJvbVJvbGVOYW1lT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gUm9sZS5mcm9tUm9sZUFybihcbiAgICAgIHNjb3BlLFxuICAgICAgaWQsXG4gICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgcmVnaW9uOiBcIlwiLFxuICAgICAgICBzZXJ2aWNlOiBcImlhbVwiLFxuICAgICAgICByZXNvdXJjZTogXCJyb2xlXCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICB9KSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgY3VzdG9tIHJvbGUgY3JlYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcm9sZS50cyNMMzU1XG5cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuZW52LmFjY291bnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICAvKipcbiAgICogVGhlIGFzc3VtZSByb2xlIHBvbGljeSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVQb2xpY3k/OiBQb2xpY3lEb2N1bWVudDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQVJOIG9mIHRoaXMgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBlcm1pc3Npb25zIGJvdW5kYXJ5IGF0dGFjaGVkIHRvIHRoaXMgcm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICAvKiogU3Ryb25nbHkgdHlwZWQgT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IHJvbGVPdXRwdXRzKCk6IFJvbGVPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXJuOiB0aGlzLnJvbGVBcm4sXG4gICAgICBuYW1lOiB0aGlzLnJvbGVOYW1lLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVPdXRwdXRzO1xuICB9XG4gIC8qKlxuICAgKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIFRlcnJhZm9ybSByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogaWFtUm9sZS5JYW1Sb2xlO1xuICBwcml2YXRlIGRlZmF1bHRQb2xpY3k/OiBQb2xpY3k7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuYWdlZFBvbGljaWVzOiBJTWFuYWdlZFBvbGljeVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0YWNoZWRQb2xpY2llcyA9IG5ldyBBdHRhY2hlZFBvbGljaWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5saW5lUG9saWNpZXM6IHsgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50IH07XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kYWJsZXMgPSBuZXcgTWFwPFBvbGljeVN0YXRlbWVudCwgRGVwZW5kZW5jeUdyb3VwPigpO1xuICBwcml2YXRlIGltbXV0YWJsZVJvbGU/OiBJUm9sZTtcbiAgLy8gcHJpdmF0ZSBfZGlkU3BsaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm9sZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvbGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMucm9sZU5hbWUgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMucm9sZU5hbWUpICYmXG4gICAgICAhL15bXFx3Kz0sLkAtXXsxLDY0fSQvLnRlc3QocHJvcHMucm9sZU5hbWUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW52YWxpZCByb2xlTmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvbnNpc3Rpbmcgb2YgdXBwZXIgYW5kIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIG5vIHNwYWNlcy4gWW91IGNhbiBhbHNvIGluY2x1ZGUgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogXys9LC5ALS4gTGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucm9sZU5hbWUgJiYgcHJvcHMucm9sZU5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdyb2xlTmFtZScgYW5kICdyb2xlTmFtZVByZWZpeCcuIFVzZSBvbmx5IG9uZS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZXJuYWxJZHMgPSBwcm9wcy5leHRlcm5hbElkcyB8fCBbXTtcbiAgICBpZiAocHJvcHMuZXh0ZXJuYWxJZCkge1xuICAgICAgZXh0ZXJuYWxJZHMucHVzaChwcm9wcy5leHRlcm5hbElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc3VtZVJvbGVQb2xpY3kgPSBjcmVhdGVBc3N1bWVSb2xlUG9saWN5KFxuICAgICAgdGhpcyxcbiAgICAgIFwiQXNzdW1lUm9sZVBvbGljeVwiLFxuICAgICAgcHJvcHMuYXNzdW1lZEJ5LFxuICAgICAgZXh0ZXJuYWxJZHMsXG4gICAgKTtcbiAgICBpZiAocHJvcHMubWFuYWdlZFBvbGljaWVzICYmIHByb3BzLm1hbmFnZWRQb2xpY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHBvbGljeSBvZiBwcm9wcy5tYW5hZ2VkUG9saWNpZXMpIHtcbiAgICAgICAgdGhpcy5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5saW5lUG9saWNpZXMgPSBwcm9wcy5pbmxpbmVQb2xpY2llcyB8fCB7fTtcbiAgICB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnkgPSBwcm9wcy5wZXJtaXNzaW9uc0JvdW5kYXJ5O1xuICAgIGNvbnN0IG1heFNlc3Npb25EdXJhdGlvbiA9XG4gICAgICBwcm9wcy5tYXhTZXNzaW9uRHVyYXRpb24gJiYgcHJvcHMubWF4U2Vzc2lvbkR1cmF0aW9uLnRvU2Vjb25kcygpO1xuICAgIHZhbGlkYXRlTWF4U2Vzc2lvbkR1cmF0aW9uKG1heFNlc3Npb25EdXJhdGlvbik7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgcHJvcHMuZGVzY3JpcHRpb24gJiYgcHJvcHMuZGVzY3JpcHRpb24ubGVuZ3RoID4gMFxuICAgICAgICA/IHByb3BzLmRlc2NyaXB0aW9uXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGRlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJSb2xlIGRlc2NyaXB0aW9uIG11c3QgYmUgbm8gbG9uZ2VyIHRoYW4gMTAwMCBjaGFyYWN0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVJvbGVQYXRoKHByb3BzLnBhdGgpO1xuXG4gICAgLy8gcHJlLWNyZWF0ZWQgcm9sZSBzbmlwcGVkXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcm9sZS50cyNMNDM5XG5cbiAgICBjb25zdCBuYW1lUHJlZml4ID0gdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWVQcmVmaXgodGhpcywge1xuICAgICAgcHJlZml4OiBwcm9wcy5yb2xlTmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEICsgXCItXCIsXG4gICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiXys9LC5ALVwiLFxuICAgICAgbWF4TGVuZ3RoOiA2NCxcbiAgICB9KTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgaWFtUm9sZS5JYW1Sb2xlKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgLi4ucHJvcHMsIC8vIGNvcHkgb3ZlciBUZXJyYWZvcm0gTWV0YSBBcmd1bWVudHMgZnJvbSBDb25zdHJ1Y3RQcm9wc1xuICAgICAgYXNzdW1lUm9sZVBvbGljeTogdGhpcy5hc3N1bWVSb2xlUG9saWN5Lmpzb24sXG4gICAgICAvLyBEZXByZWNhdGVkIGFzIGRvY3VtZW50ZWQgaGVyZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9ibG9iL21haW4vZG9jcy9kZXNpZ24tZGVjaXNpb25zL2V4Y2x1c2l2ZS1yZWxhdGlvbnNoaXAtbWFuYWdlbWVudC1yZXNvdXJjZXMubWRcbiAgICAgIC8vIG1hbmFnZWRQb2xpY3lBcm5zOiBVbmlxdWVTdHJpbmdTZXQuZnJvbSgoKSA9PlxuICAgICAgLy8gICB0aGlzLm1hbmFnZWRQb2xpY2llcy5tYXAoKHApID0+IHAubWFuYWdlZFBvbGljeUFybiksXG4gICAgICAvLyApLFxuICAgICAgaW5saW5lUG9saWN5OiBfZmxhdHRlbih0aGlzLmlubGluZVBvbGljaWVzKSxcbiAgICAgIHBhdGg6IHByb3BzLnBhdGgsXG4gICAgICBwZXJtaXNzaW9uc0JvdW5kYXJ5OiB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnlcbiAgICAgICAgPyB0aGlzLnBlcm1pc3Npb25zQm91bmRhcnkubWFuYWdlZFBvbGljeUFyblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgbmFtZVByZWZpeDogIXByb3BzLnJvbGVOYW1lID8gbmFtZVByZWZpeCA6IHVuZGVmaW5lZCxcbiAgICAgIG1heFNlc3Npb25EdXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZm9yY2VEZXRhY2hQb2xpY2llczogcHJvcHMuZm9yY2VEZXRhY2hQb2xpY2llcyxcbiAgICB9KTtcblxuICAgIC8vIFN0YWJsZSBhbmQgdW5pcXVlIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcm9sZS5cbiAgICB0aGlzLl9yb2xlSWQgPSB0aGlzLnJlc291cmNlLnVuaXF1ZUlkO1xuXG4gICAgLy8gVE9ETzogTmVlZCB0byBoYW5kbGUgY3Jvc3MgZW52IEFSTiByZWZzP1xuICAgIC8vIENESzogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcmVzb3VyY2UudHMjTDI4OFxuICAgIHRoaXMucm9sZUFybiA9IHRoaXMucmVzb3VyY2UuYXJuO1xuICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGNyb3NzIGVudiBOYW1lIHJlZnM/XG4gICAgLy8gQ0RLOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDMuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9yZXNvdXJjZS50cyNMMjU0XG4gICAgdGhpcy5yb2xlTmFtZSA9IHRoaXMucmVzb3VyY2UubmFtZTtcblxuICAgIC8vIFRPRE86IFJlLWFkZCBwb2xpY3kgc3BsaXR0aW5nP1xuICAgIC8vIEFzcGVjdHMub2YodGhpcykuYWRkKHtcbiAgICAvLyAgIHZpc2l0OiAoYykgPT4ge1xuICAgIC8vICAgICBpZiAoYyA9PT0gdGhpcykge1xuICAgIC8vICAgICAgIHRoaXMuc3BsaXRMYXJnZVBvbGljeSgpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH0pO1xuXG4gICAgdGhpcy5wb2xpY3lGcmFnbWVudCA9IG5ldyBBcm5QcmluY2lwYWwodGhpcy5yb2xlQXJuKS5wb2xpY3lGcmFnbWVudDtcblxuICAgIGZ1bmN0aW9uIF9mbGF0dGVuKHBvbGljaWVzPzogeyBbbmFtZTogc3RyaW5nXTogUG9saWN5RG9jdW1lbnQgfSkge1xuICAgICAgaWYgKHBvbGljaWVzID09IG51bGwgfHwgT2JqZWN0LmtleXMocG9saWNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PGlhbVJvbGUuSWFtUm9sZUlubGluZVBvbGljeT4oKTtcbiAgICAgIGZvciAoY29uc3QgcG9saWN5TmFtZSBvZiBPYmplY3Qua2V5cyhwb2xpY2llcykpIHtcbiAgICAgICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBwb2xpY2llc1twb2xpY3lOYW1lXTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG5hbWU6IHBvbGljeU5hbWUsXG4gICAgICAgICAgcG9saWN5OiBwb2xpY3lEb2N1bWVudC5qc29uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZVJvbGUoKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgcm9sZSdzIGRlZmF1bHQgcG9saWN5IGRvY3VtZW50LlxuICAgKiBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IHBvbGljeSBhdHRhY2hlZCB0byB0aGlzIHJvbGUsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcGVybWlzc2lvbiBzdGF0ZW1lbnQgdG8gYWRkIHRvIHRoZSBwb2xpY3kgZG9jdW1lbnRcbiAgICovXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5kZWZhdWx0UG9saWN5KSB7XG4gICAgICB0aGlzLmRlZmF1bHRQb2xpY3kgPSBuZXcgUG9saWN5KHRoaXMsIFwiRGVmYXVsdFBvbGljeVwiKTtcbiAgICAgIHRoaXMuYXR0YWNoSW5saW5lUG9saWN5KHRoaXMuZGVmYXVsdFBvbGljeSk7XG4gICAgfVxuICAgIHRoaXMuZGVmYXVsdFBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG5cbiAgICAvLyAvLyBXZSBtaWdodCBzcGxpdCB0aGlzIHN0YXRlbWVudCBvZmYgaW50byBhIGRpZmZlcmVudCBwb2xpY3ksIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAvLyAvLyBsYXRlLWJpbmQgdGhlIGRlcGVuZGFibGUuXG4gICAgLy8gY29uc3QgcG9saWN5RGVwZW5kYWJsZSA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcbiAgICAvLyB0aGlzLmRlcGVuZGFibGVzLnNldChzdGF0ZW1lbnQsIHBvbGljeURlcGVuZGFibGUpO1xuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1BvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCkuc3RhdGVtZW50QWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBtYW5hZ2VkIHBvbGljeSB0byB0aGlzIHJvbGUuXG4gICAqXG4gICAqIE5PVEU6IFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgdGhlIHJvbGUgdG8gdGFrZSBvdmVyXG4gICAqIGV4Y2x1c2l2ZSBtYW5hZ2VtZW50IG9mIHRoZSByb2xlJ3MgTWFuYWdlZFBvbGljeSBhdHRhY2htZW50c1xuICAgKiBUaGVzZSBhcmd1bWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHdheXMgb2YgbWFuYWdpbmdcbiAgICogYSByb2xlJ3Mgc3VjaCBhcyBhdHRhY2hpbmcgdGhlIHBvbGljeSB0byB0aGUgcm9sZSB0aHJvdWdoIGl0c1xuICAgKiBgcG9saWN5LmF0dGFjaFRvUm9sZShyb2xlKWAgbWV0aG9kLlxuICAgKlxuICAgKiBJZiB5b3UgYXR0ZW1wdCB0byBtYW5hZ2UgYSByb2xlJ3MgcG9saWNpZXMgYnkgbXVsdGlwbGUgbWVhbnMsXG4gICAqIHlvdSB3aWxsIGdldCByZXNvdXJjZSBjeWNsaW5nIGFuZC9vciBlcnJvcnMuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcG9saWN5MSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnUG9saWN5Jywge1xuICAgKiAgIG1hbmFnZWRQb2xpY3lOYW1lOiAnTXlQb2xpY3kxJyxcbiAgICogICBkZXNjcmlwdGlvbjogJ0EgZGVzY3JpcHRpb24gb2YgdGhlIHBvbGljeScsXG4gICAqIH0pO1xuICAgKiBjb25zdCBwb2xpY3kyID0gbmV3IGlhbS5NYW5hZ2VkUG9saWN5KHRoaXMsICdQb2xpY3knLCB7XG4gICAqICAgbWFuYWdlZFBvbGljeU5hbWU6ICdNeVBvbGljeTInLFxuICAgKiAgIGRlc2NyaXB0aW9uOiAnQSBkZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5JyxcbiAgICogfSk7XG4gICAqXG4gICAqIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAqICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc25zLmFtYXpvbmF3cy5jb20nKSxcbiAgICogfSk7XG4gICAqIC8vIHJvbGUgYmVjb21lcyB0aGUgbWFuYWdlciBvZiBhbGwgYXR0YWNoZWQgcG9saWNpZXNcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnU2VjdXJpdHlBdWRpdCcpKTtcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTEpO1xuICAgKlxuICAgKiAvLyB0aGlzIGludHJvZHVjZXMgcmVzb3VyY2UgY3ljbGluZ1xuICAgKiAvLyBET04nVCBETyBUSElTXG4gICAqIHBvbGljeTIuYXR0YWNoVG9Sb2xlKHJvbGUpO1xuICAgKlxuICAgKiAvLyBETyBUSElTIElOU1RFQURcbiAgICogcm9sZS5hZGRNYW5hZ2VkUG9saWN5KHBvbGljeTIpO1xuICAgKiBgYGBcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgdGhlIG1hbmFnZWQgcG9saWN5IHRvIGF0dGFjaC5cbiAgICovXG4gIHB1YmxpYyBhZGRNYW5hZ2VkUG9saWN5KHBvbGljeTogSU1hbmFnZWRQb2xpY3kpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5zb21lKFxuICAgICAgICAobXApID0+IG1wLm1hbmFnZWRQb2xpY3lBcm4gPT09IHBvbGljeS5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKHBvbGljeSk7XG4gICAgcG9saWN5LmF0dGFjaFRvUm9sZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIHBvbGljeSB0byB0aGlzIHJvbGUuXG4gICAqXG4gICAqIE5PVEU6IFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgdGhlIHJvbGUgdG8gdGFrZSBvdmVyXG4gICAqIGV4Y2x1c2l2ZSBtYW5hZ2VtZW50IG9mIHRoZSByb2xlJ3MgaW5saW5lIFBvbGljeSBhdHRhY2htZW50c1xuICAgKiBUaGVzZSBhcmd1bWVudHMgYXJlIGluY29tcGF0aWJsZSB3aXRoIG90aGVyIHdheXMgb2YgbWFuYWdpbmdcbiAgICogYSByb2xlJ3Mgc3VjaCBhcyBhdHRhY2hpbmcgYSBwb2xpY3kgdG8gdGhlIHJvbGUuXG4gICAqIElmIHlvdSBhdHRlbXB0IHRvIG1hbmFnZSBhIHJvbGUncyBwb2xpY2llcyBieSBtdWx0aXBsZSBtZWFucyxcbiAgICogeW91IHdpbGwgZ2V0IHJlc291cmNlIGN5Y2xpbmcgYW5kL29yIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgcG9saWN5IHRvIGF0dGFjaFxuICAgKi9cbiAgcHVibGljIGF0dGFjaElubGluZVBvbGljeShwb2xpY3k6IFBvbGljeSkge1xuICAgIHRoaXMuYXR0YWNoZWRQb2xpY2llcy5hdHRhY2gocG9saWN5KTtcbiAgICBwb2xpY3kuYXR0YWNoVG9Sb2xlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBhY3Rpb25zIGRlZmluZWQgaW4gYWN0aW9ucyB0byB0aGUgaWRlbnRpdHkgUHJpbmNpcGFsIG9uIHRoaXMgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnQoZ3JhbnRlZTogSVByaW5jaXBhbCwgLi4uYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLnJvbGVBcm5dLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIHByaW5jaXBhbCB0byBwYXNzIHRoaXMgcm9sZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFBhc3NSb2xlKGlkZW50aXR5OiBJUHJpbmNpcGFsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoaWRlbnRpdHksIFwiaWFtOlBhc3NSb2xlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gYXNzdW1lIHRoaXMgcm9sZS5cbiAgICovXG4gIHB1YmxpYyBncmFudEFzc3VtZVJvbGUoaWRlbnRpdHk6IElQcmluY2lwYWwpIHtcbiAgICAvLyBTZXJ2aWNlIGFuZCBhY2NvdW50IHByaW5jaXBhbHMgbXVzdCB1c2UgYXNzdW1lUm9sZVBvbGljeVxuICAgIGlmIChcbiAgICAgIGlkZW50aXR5IGluc3RhbmNlb2YgU2VydmljZVByaW5jaXBhbCB8fFxuICAgICAgaWRlbnRpdHkgaW5zdGFuY2VvZiBBY2NvdW50UHJpbmNpcGFsXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHVzZSBhIHNlcnZpY2Ugb3IgYWNjb3VudCBwcmluY2lwYWwgd2l0aCBncmFudEFzc3VtZVJvbGUsIHVzZSBhc3N1bWVSb2xlUG9saWN5IGluc3RlYWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ncmFudChpZGVudGl0eSwgXCJzdHM6QXNzdW1lUm9sZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFibGUgYW5kIHVuaXF1ZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHJvbGUuIEZvciBleGFtcGxlLFxuICAgKiBBSURBSlFBQkxaUzRBM1FEVTU3NlEuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcm9sZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGVJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgUm9sZSBvYmplY3Qgd2hvc2UgUG9saWNpZXMgd2lsbCBub3QgYmUgdXBkYXRlZFxuICAgKlxuICAgKiBVc2UgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpZiB5b3Ugd2FudCB0aGlzIFJvbGUgdG8gYmUgdXNlZCBieVxuICAgKiBhIGNvbnN0cnVjdCB3aXRob3V0IGl0IGF1dG9tYXRpY2FsbHkgdXBkYXRpbmcgdGhlIFJvbGUncyBQb2xpY2llcy5cbiAgICpcbiAgICogSWYgeW91IGRvLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgdGhlIGNvcnJlY3Qgc3RhdGVtZW50cyB0byB0aGVcbiAgICogUm9sZSdzIHBvbGljaWVzIHlvdXJzZWxmLlxuICAgKi9cbiAgcHVibGljIHdpdGhvdXRQb2xpY3lVcGRhdGVzKFxuICAgIG9wdGlvbnM6IFdpdGhvdXRQb2xpY3lVcGRhdGVzT3B0aW9ucyA9IHt9LFxuICApOiBJUm9sZSB7XG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZVJvbGUpIHtcbiAgICAgIHRoaXMuaW1tdXRhYmxlUm9sZSA9IG5ldyBJbW11dGFibGVSb2xlKFxuICAgICAgICB0aGlzLm5vZGUuc2NvcGUgYXMgQ29uc3RydWN0LFxuICAgICAgICBgSW1tdXRhYmxlUm9sZSR7dGhpcy5ub2RlLmlkfWAsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG9wdGlvbnMuYWRkR3JhbnRzVG9SZXNvdXJjZXMgPz8gZmFsc2UsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmltbXV0YWJsZVJvbGU7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUm9sZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBlcnJvcnMucHVzaCguLi4odGhpcy5hc3N1bWVSb2xlUG9saWN5Py52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10pKTtcbiAgICBmb3IgKGNvbnN0IHBvbGljeSBvZiBPYmplY3QudmFsdWVzKHRoaXMuaW5saW5lUG9saWNpZXMpKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi5wb2xpY3kudmFsaWRhdGVGb3JJZGVudGl0eVBvbGljeSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLy8gLyoqXG4gIC8vICAqIFNwbGl0IGxhcmdlIGlubGluZSBwb2xpY2llcyBpbnRvIG1hbmFnZWQgcG9saWNpZXNcbiAgLy8gICpcbiAgLy8gICogVGhpcyBnZXRzIGFyb3VuZCB0aGUgMTBrIGJ5dGVzIGxpbWl0IG9uIHJvbGUgcG9saWNpZXMuXG4gIC8vICAqL1xuICAvLyBwcml2YXRlIHNwbGl0TGFyZ2VQb2xpY3koKSB7XG4gIC8vICAgaWYgKCF0aGlzLmRlZmF1bHRQb2xpY3kgfHwgdGhpcy5fZGlkU3BsaXQpIHtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy5fZGlkU3BsaXQgPSB0cnVlO1xuXG4gIC8vICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIC8vICAgY29uc3Qgb3JpZ2luYWxEb2MgPSB0aGlzLmRlZmF1bHRQb2xpY3kuZG9jdW1lbnQ7XG5cbiAgLy8gICBjb25zdCBzcGxpdE9mZkRvY3MgPSBvcmlnaW5hbERvYy5fc3BsaXREb2N1bWVudChcbiAgLy8gICAgIHRoaXMsXG4gIC8vICAgICBNQVhfSU5MSU5FX1NJWkUsXG4gIC8vICAgICBNQVhfTUFOQUdFRFBPTF9TSVpFLFxuICAvLyAgICk7XG4gIC8vICAgLy8gSW5jbHVkZXMgdGhlIFwiY3VycmVudFwiIGRvY3VtZW50XG5cbiAgLy8gICBjb25zdCBtcENvdW50ID0gdGhpcy5tYW5hZ2VkUG9saWNpZXMubGVuZ3RoICsgKHNwbGl0T2ZmRG9jcy5zaXplIC0gMSk7XG4gIC8vICAgaWYgKG1wQ291bnQgPiAyMCkge1xuICAvLyAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAvLyAgICAgICBcIkBhd3MtY2RrL2F3cy1pYW06cm9sZVBvbGljeVRvb0xhcmdlXCIsXG4gIC8vICAgICAgIGBQb2xpY3kgdG9vIGxhcmdlOiAke21wQ291bnR9IGV4Y2VlZHMgdGhlIG1heGltdW0gb2YgMjAgbWFuYWdlZCBwb2xpY2llcyBhdHRhY2hlZCB0byBhIFJvbGVgLFxuICAvLyAgICAgKTtcbiAgLy8gICB9IGVsc2UgaWYgKG1wQ291bnQgPiAxMCkge1xuICAvLyAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAvLyAgICAgICBcIkBhd3MtY2RrL2F3cy1pYW06cm9sZVBvbGljeUxhcmdlXCIsXG4gIC8vICAgICAgIGBQb2xpY3kgbGFyZ2U6ICR7bXBDb3VudH0gZXhjZWVkcyAxMCBtYW5hZ2VkIHBvbGljaWVzIGF0dGFjaGVkIHRvIGEgUm9sZSwgdGhpcyByZXF1aXJlcyBhIHF1b3RhIGluY3JlYXNlYCxcbiAgLy8gICAgICk7XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gQ3JlYXRlIHRoZSBtYW5hZ2VkIHBvbGljaWVzIGFuZCBmaXggdXAgdGhlIGRlcGVuZGVuY2llc1xuICAvLyAgIG1hcmtEZWNsYXJpbmdDb25zdHJ1Y3Qob3JpZ2luYWxEb2MsIHRoaXMuZGVmYXVsdFBvbGljeSk7XG5cbiAgLy8gICBsZXQgaSA9IDE7XG4gIC8vICAgZm9yIChjb25zdCBuZXdEb2Mgb2Ygc3BsaXRPZmZEb2NzLmtleXMoKSkge1xuICAvLyAgICAgaWYgKG5ld0RvYyA9PT0gb3JpZ2luYWxEb2MpIHtcbiAgLy8gICAgICAgY29udGludWU7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnN0IG1wID0gbmV3IEF3c01hbmFnZWRQb2xpY3kodGhpcywgYE92ZXJmbG93UG9saWN5JHtpKyt9YCwge1xuICAvLyAgICAgICBkZXNjcmlwdGlvbjogYFBhcnQgb2YgdGhlIHBvbGljaWVzIGZvciAke3RoaXMubm9kZS5wYXRofWAsXG4gIC8vICAgICAgIGRvY3VtZW50OiBuZXdEb2MsXG4gIC8vICAgICAgIHJvbGVzOiBbdGhpc10sXG4gIC8vICAgICB9KTtcbiAgLy8gICAgIG1hcmtEZWNsYXJpbmdDb25zdHJ1Y3QobmV3RG9jLCBtcCk7XG4gIC8vICAgfVxuXG4gIC8vICAgLyoqXG4gIC8vICAgICogVXBkYXRlIHRoZSBEZXBlbmRhYmxlcyBmb3IgdGhlIHN0YXRlbWVudHMgaW4gdGhlIGdpdmVuIFBvbGljeURvY3VtZW50IHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgZGVjbGFyaW5nIGNvbnN0cnVjdFxuICAvLyAgICAqL1xuICAvLyAgIGZ1bmN0aW9uIG1hcmtEZWNsYXJpbmdDb25zdHJ1Y3QoXG4gIC8vICAgICBkb2M6IFBvbGljeURvY3VtZW50LFxuICAvLyAgICAgZGVjbGFyaW5nQ29uc3RydWN0OiBJQ29uc3RydWN0LFxuICAvLyAgICkge1xuICAvLyAgICAgZm9yIChjb25zdCBvcmlnaW5hbCBvZiBzcGxpdE9mZkRvY3MuZ2V0KGRvYykgPz8gW10pIHtcbiAgLy8gICAgICAgc2VsZi5kZXBlbmRhYmxlcy5nZXQob3JpZ2luYWwpPy5hZGQoZGVjbGFyaW5nQ29uc3RydWN0KTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cbn1cblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVPdXRwdXRzIHtcbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFJvbGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJvbGUgZXh0ZW5kcyBJSWRlbnRpdHkge1xuICAvKipcbiAgICogc3Ryb25nbHkgdHlwZWQgcm9sZU91dHB1dHNcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU91dHB1dHM6IFJvbGVPdXRwdXRzO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgQVJOIG9mIHRoaXMgcm9sZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcm9sZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgdGhlIGFjdGlvbnMgZGVmaW5lZCBpbiBhY3Rpb25zIHRvIHRoZSBpZGVudGl0eSBQcmluY2lwYWwgb24gdGhpcyByZXNvdXJjZS5cbiAgICovXG4gIGdyYW50KGdyYW50ZWU6IElQcmluY2lwYWwsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBwcmluY2lwYWwgdG8gcGFzcyB0aGlzIHJvbGUuXG4gICAqL1xuICBncmFudFBhc3NSb2xlKGdyYW50ZWU6IElQcmluY2lwYWwpOiBHcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIHByaW5jaXBhbCB0byBhc3N1bWUgdGhpcyByb2xlLlxuICAgKi9cbiAgZ3JhbnRBc3N1bWVSb2xlKGdyYW50ZWU6IElQcmluY2lwYWwpOiBHcmFudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXNzdW1lUm9sZVBvbGljeShcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgcHJpbmNpcGFsOiBJUHJpbmNpcGFsLFxuICBleHRlcm5hbElkczogc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgYWN0dWFsRG9jID0gbmV3IFBvbGljeURvY3VtZW50KHNjb3BlLCBpZCk7XG5cbiAgLy8gSWYgcmVxdWVzdGVkLCBhZGQgZXh0ZXJuYWxJZHMgdG8gZXZlcnkgc3RhdGVtZW50IGFkZGVkIHRvIHRoaXMgZG9jXG4gIGNvbnN0IGFkZERvYyA9XG4gICAgZXh0ZXJuYWxJZHMubGVuZ3RoID09PSAwXG4gICAgICA/IGFjdHVhbERvY1xuICAgICAgOiBuZXcgTXV0YXRpbmdQb2xpY3lEb2N1bWVudEFkYXB0ZXIoYWN0dWFsRG9jLCAoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgc3RhdGVtZW50LmFkZENvbmRpdGlvbih7XG4gICAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgICAgdmFyaWFibGU6IFwic3RzOkV4dGVybmFsSWRcIixcbiAgICAgICAgICAgIHZhbHVlczogZXh0ZXJuYWxJZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShwcmluY2lwYWwsIGFkZERvYyk7XG5cbiAgcmV0dXJuIGFjdHVhbERvYztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSb2xlUGF0aChwYXRoPzogc3RyaW5nKSB7XG4gIGlmIChwYXRoID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmFsaWRSb2xlUGF0aCA9IC9eKFxcL3xcXC9bXFx1MDAyMS1cXHUwMDdGXStcXC8pJC87XG5cbiAgaWYgKHBhdGgubGVuZ3RoID09IDAgfHwgcGF0aC5sZW5ndGggPiA1MTIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUm9sZSBwYXRoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MTIgY2hhcmFjdGVycy4gVGhlIHByb3ZpZGVkIHJvbGUgcGF0aCBpcyAke3BhdGgubGVuZ3RofSBjaGFyYWN0ZXJzLmAsXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdmFsaWRSb2xlUGF0aC50ZXN0KHBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJSb2xlIHBhdGggbXVzdCBiZSBlaXRoZXIgYSBzbGFzaCBvciB2YWxpZCBjaGFyYWN0ZXJzIChhbHBoYW51bWVyaWNzIGFuZCBzeW1ib2xzKSBzdXJyb3VuZGVkIGJ5IHNsYXNoZXMuIFwiICtcbiAgICAgICAgYFZhbGlkIGNoYXJhY3RlcnMgYXJlIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBbXFxcXHUwMDIxLVxcXFx1MDA3Rl0uIEhvd2V2ZXIsICR7cGF0aH0gaXMgcHJvdmlkZWQuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWF4U2Vzc2lvbkR1cmF0aW9uKGR1cmF0aW9uPzogbnVtYmVyKSB7XG4gIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGR1cmF0aW9uIDwgMzYwMCB8fCBkdXJhdGlvbiA+IDQzMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYG1heFNlc3Npb25EdXJhdGlvbiBpcyBzZXQgdG8gJHtkdXJhdGlvbn0sIGJ1dCBtdXN0IGJlID49IDM2MDBzZWMgKDFocikgYW5kIDw9IDQzMjAwc2VjICgxMmhycylgLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgYHdpdGhvdXRQb2xpY3lVcGRhdGVzKClgIG1vZGlmaWVyIG9mIGEgUm9sZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhvdXRQb2xpY3lVcGRhdGVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBZGQgZ3JhbnRzIHRvIHJlc291cmNlcyBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRoZW1cbiAgICpcbiAgICogSWYgdGhpcyBpcyBgZmFsc2VgIG9yIG5vdCBzcGVjaWZpZWQsIGdyYW50IHBlcm1pc3Npb25zIGFkZGVkIHRvIHRoaXMgcm9sZSBhcmUgaWdub3JlZC5cbiAgICogSXQgaXMgeW91ciBvd24gcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb2xlIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgYHRydWVgLCBhbnkgZ3JhbnQgcGVybWlzc2lvbnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVzb3VyY2UgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFkZEdyYW50c1RvUmVzb3VyY2VzPzogYm9vbGVhbjtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvbGUucHJvdG90eXBlLCBJQU1fUk9MRV9TWU1CT0wsIHtcbiAgdmFsdWU6IHRydWUsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICB3cml0YWJsZTogZmFsc2UsXG59KTtcbiJdfQ==
@@ -26,7 +26,7 @@ class SamlMetadataDocument {
26
26
  }
27
27
  exports.SamlMetadataDocument = SamlMetadataDocument;
28
28
  _a = JSII_RTTI_SYMBOL_1;
29
- SamlMetadataDocument[_a] = { fqn: "terraconstructs.aws.iam.SamlMetadataDocument", version: "0.2.1" };
29
+ SamlMetadataDocument[_a] = { fqn: "terraconstructs.aws.iam.SamlMetadataDocument", version: "0.2.2" };
30
30
  /**
31
31
  * A SAML provider
32
32
  */
@@ -75,5 +75,5 @@ class SamlProvider extends aws_construct_1.AwsConstructBase {
75
75
  }
76
76
  exports.SamlProvider = SamlProvider;
77
77
  _b = JSII_RTTI_SYMBOL_1;
78
- SamlProvider[_b] = { fqn: "terraconstructs.aws.iam.SamlProvider", version: "0.2.1" };
78
+ SamlProvider[_b] = { fqn: "terraconstructs.aws.iam.SamlProvider", version: "0.2.2" };
79
79
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3NhbWwtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsc0RBQXNEO0FBQ3RELGlDQUE4QjtBQUU5QixvREFJMEI7QUFxRDFCOztHQUVHO0FBQ0gsTUFBc0Isb0JBQW9CO0lBQ3hDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXO1FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ2pELENBQUM7O0FBYkgsb0RBbUJDOzs7QUFFRDs7R0FFRztBQUNILE1BQWEsWUFBYSxTQUFRLGdDQUFnQjtJQUNoRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDL0IsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLGVBQXVCO1FBRXZCLE1BQU0sTUFBTyxTQUFRLGdDQUFnQjtZQUFyQzs7Z0JBQ2tCLG9CQUFlLEdBQUcsZUFBZSxDQUFDO2dCQUNsQyx3QkFBbUIsR0FBRztvQkFDcEMsR0FBRyxFQUFFLGVBQWU7aUJBQ3JCLENBQUM7WUFJSixDQUFDO1lBSEMsSUFBVyxPQUFPO2dCQUNoQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUNsQyxDQUFDO1NBQ0Y7UUFDRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBS0QsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUNFLEtBQUssQ0FBQyxJQUFJO1lBQ1YsQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUN2QyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwyUEFBMlAsQ0FDNVAsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksOEJBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwRSxJQUFJLEVBQ0YsS0FBSyxDQUFDLElBQUk7Z0JBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xDLHdCQUF3QixFQUFFLFNBQVM7b0JBQ25DLFNBQVMsRUFBRSxHQUFHO2lCQUNmLENBQUM7WUFDSixvQkFBb0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRztTQUNqRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN6QixHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDMUIsQ0FBQztJQUNKLENBQUM7O0FBdkRILG9DQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgaWFtU2FtbFByb3ZpZGVyIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgSUF3c0NvbnN0cnVjdCxcbiAgQXdzQ29uc3RydWN0QmFzZSxcbiAgQXdzQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FtbFByb3ZpZGVyT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIFNBTUwgcHJvdmlkZXIuXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFNBTUwgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2FtbFByb3ZpZGVyIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8vIHN0cm9uZ2x5IHR5cGVkIG91dHB1dHNcbiAgcmVhZG9ubHkgc2FtbFByb3ZpZGVyT3V0cHV0czogU2FtbFByb3ZpZGVyT3V0cHV0cztcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBwcm92aWRlclxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBzYW1sUHJvdmlkZXJBcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFNBTUwgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW1sUHJvdmlkZXJQcm9wcyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciB0byBjcmVhdGUuXG4gICAqXG4gICAqIFRoaXMgcGFyYW1ldGVyIGFsbG93cyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGNvbnNpc3Rpbmcgb2YgdXBwZXIgYW5kXG4gICAqIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIG5vIHNwYWNlcy4gWW91IGNhbiBhbHNvIGluY2x1ZGVcbiAgICogYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczogXys9LC5ALVxuICAgKlxuICAgKiBMZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOCBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgdW5pcXVlIG5hbWUgYmFzZWQgb24gcGF0aCB3aXRoaW4gc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFhNTCBkb2N1bWVudCBnZW5lcmF0ZWQgYnkgYW4gaWRlbnRpdHkgcHJvdmlkZXIgKElkUCkgdGhhdCBzdXBwb3J0c1xuICAgKiBTQU1MIDIuMC4gVGhlIGRvY3VtZW50IGluY2x1ZGVzIHRoZSBpc3N1ZXIncyBuYW1lLCBleHBpcmF0aW9uIGluZm9ybWF0aW9uLFxuICAgKiBhbmQga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBTQU1MIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlXG4gICAqIChhc3NlcnRpb25zKSB0aGF0IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBJZFAuIFlvdSBtdXN0IGdlbmVyYXRlIHRoZSBtZXRhZGF0YVxuICAgKiBkb2N1bWVudCB1c2luZyB0aGUgaWRlbnRpdHkgbWFuYWdlbWVudCBzb2Z0d2FyZSB0aGF0IGlzIHVzZWQgYXMgeW91clxuICAgKiBvcmdhbml6YXRpb24ncyBJZFAuXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YURvY3VtZW50OiBTYW1sTWV0YWRhdGFEb2N1bWVudDtcbn1cblxuLyoqXG4gKiBBIFNBTUwgbWV0YWRhdGEgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNhbWxNZXRhZGF0YURvY3VtZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNBTUwgbWV0YWRhdGEgZG9jdW1lbnQgZnJvbSBhIFhNTCBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVhtbCh4bWw6IHN0cmluZyk6IFNhbWxNZXRhZGF0YURvY3VtZW50IHtcbiAgICByZXR1cm4geyB4bWwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBTQU1MIG1ldGFkYXRhIGRvY3VtZW50IGZyb20gYSBYTUwgZmlsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShwYXRoOiBzdHJpbmcpOiBTYW1sTWV0YWRhdGFEb2N1bWVudCB7XG4gICAgcmV0dXJuIHsgeG1sOiBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGYtOFwiKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBYTUwgY29udGVudCBvZiB0aGUgbWV0YWRhdGEgZG9jdW1lbnRcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB4bWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFNBTUwgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxQcm92aWRlciBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJU2FtbFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2FtbFByb3ZpZGVyQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzYW1sUHJvdmlkZXJBcm46IHN0cmluZyxcbiAgKTogSVNhbWxQcm92aWRlciB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElTYW1sUHJvdmlkZXIge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNhbWxQcm92aWRlckFybiA9IHNhbWxQcm92aWRlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzYW1sUHJvdmlkZXJPdXRwdXRzID0ge1xuICAgICAgICBhcm46IHNhbWxQcm92aWRlckFybixcbiAgICAgIH07XG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbWxQcm92aWRlck91dHB1dHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCwge30pO1xuICB9XG4gIHB1YmxpYyByZWFkb25seSBzYW1sUHJvdmlkZXJPdXRwdXRzOiBTYW1sUHJvdmlkZXJPdXRwdXRzO1xuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2FtbFByb3ZpZGVyT3V0cHV0cztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogaWFtU2FtbFByb3ZpZGVyLklhbVNhbWxQcm92aWRlcjtcbiAgcHVibGljIHJlYWRvbmx5IHNhbWxQcm92aWRlckFybjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTYW1sUHJvdmlkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubmFtZSAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5uYW1lKSAmJlxuICAgICAgIS9eW1xcdys9LC5ALV17MSwxMjh9JC8udGVzdChwcm9wcy5uYW1lKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkludmFsaWQgU0FNTCBwcm92aWRlciBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgY29uc2lzdGluZyBvZiB1cHBlciBhbmQgbG93ZXJjYXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHdpdGggbm8gc3BhY2VzLiBZb3UgY2FuIGFsc28gaW5jbHVkZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBfKz0sLkAtLiBMZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOCBjaGFyYWN0ZXJzLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IGlhbVNhbWxQcm92aWRlci5JYW1TYW1sUHJvdmlkZXIodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuYW1lOlxuICAgICAgICBwcm9wcy5uYW1lID8/XG4gICAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiXys9LC5ALVwiLFxuICAgICAgICAgIG1heExlbmd0aDogMTI4LFxuICAgICAgICB9KSxcbiAgICAgIHNhbWxNZXRhZGF0YURvY3VtZW50OiBwcm9wcy5tZXRhZGF0YURvY3VtZW50LnhtbCxcbiAgICB9KTtcblxuICAgIHRoaXMuc2FtbFByb3ZpZGVyQXJuID0gdGhpcy5yZXNvdXJjZS5hcm47XG4gICAgdGhpcy5zYW1sUHJvdmlkZXJPdXRwdXRzID0ge1xuICAgICAgYXJuOiB0aGlzLnNhbWxQcm92aWRlckFybixcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -41,5 +41,5 @@ class UnknownPrincipal {
41
41
  }
42
42
  exports.UnknownPrincipal = UnknownPrincipal;
43
43
  _a = JSII_RTTI_SYMBOL_1;
44
- UnknownPrincipal[_a] = { fqn: "terraconstructs.aws.iam.UnknownPrincipal", version: "0.2.1" };
44
+ UnknownPrincipal[_a] = { fqn: "terraconstructs.aws.iam.UnknownPrincipal", version: "0.2.2" };
45
45
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi1wcmluY2lwYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2lhbS91bmtub3duLXByaW5jaXBhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFHQUFxRztBQUNyRyxpQ0FBb0M7QUFDcEMsMkNBQStEO0FBQy9ELDRDQUF3QztBQWtCeEM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsZ0JBQWdCO0lBSzNCLFlBQVksS0FBNEI7UUFKeEIscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFLMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYixpQ0FBaUMsaUJBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksb0NBQW9DLENBQ2pHLENBQUM7SUFDSixDQUFDO0lBRU0sb0JBQW9CLENBQ3pCLFNBQTBCO1FBRTFCLE1BQU0sS0FBSyxHQUFHLG9CQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN0RCx5REFBeUQ7UUFDekQsbUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FDdEMsMENBQTBDLElBQUksRUFBRSxDQUNqRCxDQUFDO1FBQ0Ysb0VBQW9FO1FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksNEJBQWUsRUFBRSxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUVNLFdBQVcsQ0FBQyxTQUEwQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDN0QsQ0FBQzs7QUEvQkgsNENBZ0NDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTU2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvdW5rbm93bi1wcmluY2lwYWwudHNcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5R3JvdXAsIElDb25zdHJ1Y3QsIE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktc3RhdGVtZW50XCI7XG5pbXBvcnQge1xuICBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCxcbiAgSVByaW5jaXBhbCxcbiAgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQsXG59IGZyb20gXCIuL3ByaW5jaXBhbHNcIjtcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBVbmtub3duUHJpbmNpcGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5rbm93blByaW5jaXBhbFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSB0aGUgcm9sZSBwcm94eSBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlOiBJQ29uc3RydWN0O1xufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIGZvciB1c2UgaW4gcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBoYXZlIGEgcm9sZSBidXQgaXQncyB1bmtub3duXG4gKlxuICogU29tZSByZXNvdXJjZXMgaGF2ZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlbSB3aGljaCB0aGV5IGFzc3VtZSwgc3VjaCBhc1xuICogTGFtYmRhIEZ1bmN0aW9ucywgQ29kZUJ1aWxkIHByb2plY3RzLCBTdGVwRnVuY3Rpb25zIG1hY2hpbmVzLCBldGMuXG4gKlxuICogV2hlbiB0aG9zZSByZXNvdXJjZXMgYXJlIGltcG9ydGVkLCB0aGVpciBhY3R1YWwgcm9sZXMgYXJlIG5vdCBhbHdheXNcbiAqIGltcG9ydGVkIHdpdGggdGhlbS4gV2hlbiB0aGF0IGhhcHBlbnMsIHdlIHVzZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzXG4gKiBpbnN0ZWFkLCB3aGljaCB3aWxsIGFkZCB1c2VyIHdhcm5pbmdzIHdoZW4gc3RhdGVtZW50cyBhcmUgYXR0ZW1wdGVkIHRvIGJlXG4gKiBhZGRlZCB0byBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25QcmluY2lwYWwgaW1wbGVtZW50cyBJUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBJQ29uc3RydWN0O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBVbmtub3duUHJpbmNpcGFsUHJvcHMpIHtcbiAgICB0aGlzLnJlc291cmNlID0gcHJvcHMucmVzb3VyY2U7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IGdldCBwb2xpY3kgZnJhZ21lbnQgb2YgJHtOb2RlLm9mKHRoaXMucmVzb3VyY2UpLnBhdGh9LCByZXNvdXJjZSBpbXBvcnRlZCB3aXRob3V0IGEgcm9sZWAsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcy5yZXNvdXJjZSk7XG4gICAgY29uc3QgcmVwciA9IEpTT04uc3RyaW5naWZ5KHN0YWNrLnJlc29sdmUoc3RhdGVtZW50KSk7XG4gICAgLy8gXCJAYXdzLWNkay9hd3MtaWFtOnVua25vd25QcmluY2lwYWxBZGRTdGF0ZW1lbnRUb1JvbGVcIixcbiAgICBBbm5vdGF0aW9ucy5vZih0aGlzLnJlc291cmNlKS5hZGRXYXJuaW5nKFxuICAgICAgYEFkZCBzdGF0ZW1lbnQgdG8gdGhpcyByZXNvdXJjZSdzIHJvbGU6ICR7cmVwcn1gLFxuICAgICk7XG4gICAgLy8gUHJldGVuZCB3ZSBkaWQgdGhlIHdvcmsuIFRoZSBodW1hbiB3aWxsIGRvIGl0IGZvciB1cywgZXZlbnR1YWxseS5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogbmV3IERlcGVuZGVuY3lHcm91cCgpIH07XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICB9XG59XG4iXX0=
@@ -232,5 +232,5 @@ class User extends aws_construct_1.AwsConstructBase {
232
232
  }
233
233
  exports.User = User;
234
234
  _a = JSII_RTTI_SYMBOL_1;
235
- User[_a] = { fqn: "terraconstructs.aws.iam.User", version: "0.2.1" };
235
+ User[_a] = { fqn: "terraconstructs.aws.iam.User", version: "0.2.2" };
236
236
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3VzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3SEFBd0g7QUFFeEgsc0RBSzZCO0FBRzdCLGdDQUF3QztBQUN4QyxvREFBdUU7QUFDdkUsNENBQXdDO0FBR3hDLHFDQUFrQztBQUVsQyw2Q0FLc0I7QUFDdEIseUNBQWtEO0FBbUhsRDs7R0FFRztBQUNILE1BQWEsSUFBSyxTQUFRLGdDQUFnQjtJQUN4Qyx3QkFBd0I7SUFFeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUN4QixLQUFnQixFQUNoQixFQUFVLEVBQ1YsUUFBZ0I7UUFFaEIsTUFBTSxPQUFPLEdBQUcsb0JBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZELE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsTUFBTTtZQUNoQixZQUFZLEVBQUUsUUFBUTtTQUN2QixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUN2QixLQUFnQixFQUNoQixFQUFVLEVBQ1YsT0FBZTtRQUVmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDOUIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQXFCO1FBRXJCLE1BQU0sTUFBTyxTQUFRLGdDQUFnQjtZQUFyQzs7Z0JBVWtCLG1CQUFjLEdBQWUsSUFBSSxDQUFDO2dCQUNsQyxxQkFBZ0IsR0FBRyxvQkFBUSxD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Qjs7Ozs7O1dBTUc7UUFDSCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELHlFQUF5RTtRQUN6RSw0SEFBNEg7UUFDNUgsNkNBQTZDO1FBQzdDLDJFQUEyRTtRQUMzRSxzR0FBc0c7UUFDdEcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsb0NBQW9DO1lBQzVFLDhCQUE4QjtZQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFBRSxTQUFTO1lBRXpDLElBQUksc0NBQXVCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtnQkFDNUQsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7YUFDcEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7QUEvUkgsb0JBZ1NDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvZjlmMzY4MWJlOWZjNmEwYzk5OGNkMjYxMTkwNTNjNTgzMmVmOTgwNi9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi91c2VyLnRzXG5cbmltcG9ydCB7XG4gIGlhbVVzZXIsXG4gIGlhbVVzZXJQb2xpY3lBdHRhY2htZW50LFxuICBpYW1Vc2VyR3JvdXBNZW1iZXJzaGlwLFxuICBpYW1Vc2VyTG9naW5Qcm9maWxlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgQXJuLCBBcm5Gb3JtYXQgfSBmcm9tIFwiLi4vYXJuXCI7XG5pbXBvcnQgeyBBd3NDb25zdHJ1Y3RCYXNlLCBBd3NDb25zdHJ1Y3RQcm9wcyB9IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IElHcm91cCB9IGZyb20gXCIuL2dyb3VwXCI7XG5pbXBvcnQgeyBJTWFuYWdlZFBvbGljeSB9IGZyb20gXCIuL21hbmFnZWQtcG9saWN5XCI7XG5pbXBvcnQgeyBQb2xpY3kgfSBmcm9tIFwiLi9wb2xpY3lcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCIuL3BvbGljeS1zdGF0ZW1lbnRcIjtcbmltcG9ydCB7XG4gIEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0LFxuICBBcm5QcmluY2lwYWwsXG4gIElQcmluY2lwYWwsXG4gIFByaW5jaXBhbFBvbGljeUZyYWdtZW50LFxufSBmcm9tIFwiLi9wcmluY2lwYWxzXCI7XG5pbXBvcnQgeyBBdHRhY2hlZFBvbGljaWVzIH0gZnJvbSBcIi4vcHJpdmF0ZS91dGlsXCI7XG5cbi8qKlxuICogT3V0cHV0cyB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBmb3Igb3V0cHV0IHZpYSB0aGUgR3JpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyT3V0cHV0cyB7XG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJQU0gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVXNlciBleHRlbmRzIGlhbS5JSWRlbnRpdHkge1xuICAvKipcbiAgICogc3Ryb25nbHkgdHlwZWQgcm9sZU91dHB1dHNcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlck91dHB1dHM6IFVzZXJPdXRwdXRzO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBuYW1lLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlcidzIEFSTi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlckFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRzIHRoaXMgdXNlciB0byBhIGdyb3VwLlxuICAgKi9cbiAgYWRkVG9Hcm91cChncm91cDogSUdyb3VwKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhbiBJQU0gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBHcm91cHMgdG8gYWRkIHRoaXMgdXNlciB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBncm91cHMuXG4gICAqL1xuICByZWFkb25seSBncm91cHM/OiBJR3JvdXBbXTtcblxuICAvKipcbiAgICogTWFuYWdlZCBwb2xpY2llcyB0byBhdHRhY2ggdG8gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmFnZWQgcG9saWNpZXMuXG4gICAqL1xuICByZWFkb25seSBtYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBmb3IgdGhlIHVzZXIgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIvXCJcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYW5hZ2VkIHBvbGljeSB0byB1c2UgYXMgdGhlIHBlcm1pc3Npb25zIGJvdW5kYXJ5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBlcm1pc3Npb25zIGJvdW5kYXJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnNCb3VuZGFyeT86IElNYW5hZ2VkUG9saWN5O1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBJQU0gdXNlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBHZW5lcmF0ZWQgYnkgQ2xvdWRGb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSB1c2VyTmFtZT86IHN0cmluZztcblxuICAvLyBhZGQgU3VwcG9ydCBmb3IgcGdwS2V5IGZvciBVc2VyUHJvZmlsZVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSBhIGxvZ2luIHByb2ZpbGUgZm9yIHRoZSBVc2VyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29uc29sZSBhY2Nlc3MuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVMb2dpblByb2ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDIwXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZExlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgbXVzdCByZXNldCB0aGUgcGFzc3dvcmQgdXBvbiBmaXJzdCBzaWdu4oCTaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZFJlc2V0UmVxdWlyZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBJQU0gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSB1c2VyLlxuICAgKlxuICAgKiBGb3JtYXQ6IGFybjo8cGFydGl0aW9uPjppYW06OjxhY2NvdW50LWlkPjp1c2VyLzx1c2VyLW5hbWUtd2l0aC1wYXRoPlxuICAgKi9cbiAgcmVhZG9ubHkgdXNlckFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBuZXcgSUFNIHVzZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElVc2VyIHtcbiAgLy8gU3RhdGljIGltcG9ydCBtZXRob2RzXG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyB1c2VyIGdpdmVuIGEgdXNlcm5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Vc2VyTmFtZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlck5hbWU6IHN0cmluZyxcbiAgKTogSVVzZXIge1xuICAgIGNvbnN0IHVzZXJBcm4gPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6IFwiaWFtXCIsXG4gICAgICByZWdpb246IFwiXCIsXG4gICAgICByZXNvdXJjZTogXCJ1c2VyXCIsXG4gICAgICByZXNvdXJjZU5hbWU6IHVzZXJOYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBVc2VyLmZyb21Vc2VyQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgdXNlckFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgdXNlciBnaXZlbiBhIHVzZXIgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVXNlckFybihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlckFybjogc3RyaW5nLFxuICApOiBJVXNlciB7XG4gICAgcmV0dXJuIFVzZXIuZnJvbVVzZXJBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB1c2VyQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyB1c2VyIGdpdmVuIHVzZXIgYXR0cmlidXRlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVVzZXJBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogVXNlckF0dHJpYnV0ZXMsXG4gICk6IElVc2VyIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSVVzZXIge1xuICAgICAgcHVibGljIGdldCB1c2VyT3V0cHV0cygpOiBVc2VyT3V0cHV0cyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXJuOiB0aGlzLnVzZXJBcm4sXG4gICAgICAgICAgbmFtZTogdGhpcy51c2VyTmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlck91dHB1dHM7XG4gICAgICB9XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWwgPSB0aGlzO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChcbiAgICAgICAgc2NvcGUsXG4gICAgICApLnNwbGl0QXJuKGF0dHJzLnVzZXJBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5hY2NvdW50O1xuICAgICAgLy8gRXh0cmFjdCB0aGUgdXNlciBuYW1lIGZyb20gdGhlIEFSTi4gRm9yIGEgdXNlciBBUk4sIHRoZSByZXNvdXJjZSBwYXJ0IGluY2x1ZGVzIHRoZSBwYXRoLlxuICAgICAgcHVibGljIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmcgPSBBcm4uZXh0cmFjdFJlc291cmNlTmFtZShcbiAgICAgICAgYXR0cnMudXNlckFybixcbiAgICAgICAgXCJ1c2VyXCIsXG4gICAgICApXG4gICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgLnBvcCgpITtcbiAgICAgIHB1YmxpYyByZWFkb25seSB1c2VyQXJuOiBzdHJpbmcgPSBhdHRycy51c2VyQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQgPVxuICAgICAgICBuZXcgQXJuUHJpbmNpcGFsKGF0dHJzLnVzZXJBcm4pLnBvbGljeUZyYWdtZW50O1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBhdHRhY2hlZFBvbGljaWVzID0gbmV3IEF0dGFjaGVkUG9saWNpZXMoKTtcbiAgICAgIHByaXZhdGUgZGVmYXVsdFBvbGljeT86IFBvbGljeTtcbiAgICAgIHByaXZhdGUgZ3JvdXBJZCA9IDA7XG5cbiAgICAgIHB1YmxpYyBhZGRUb1BvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICAgICAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFBvbGljeSkge1xuICAgICAgICAgIHRoaXMuZGVmYXVsdFBvbGljeSA9IG5ldyBQb2xpY3kodGhpcywgXCJQb2xpY3lcIik7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UG9saWN5LmF0dGFjaFRvVXNlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlZmF1bHRQb2xpY3kuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogdGhpcy5kZWZhdWx0UG9saWN5IH07XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBhZGRUb0dyb3VwKGdyb3VwOiBJR3JvdXApOiB2b2lkIHtcbiAgICAgICAgbmV3IGlhbVVzZXJHcm91cE1lbWJlcnNoaXAuSWFtVXNlckdyb3VwTWVtYmVyc2hpcChcbiAgICAgICAgICBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChncm91cCksXG4gICAgICAgICAgYCR7dGhpcy51c2VyTmFtZX1Hcm91cCR7dGhpcy5ncm91cElkfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZ3JvdXBzOiBbZ3JvdXAuZ3JvdXBOYW1lXSxcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlck5hbWUsXG4gICAgICAgICAgICAvLyBncm91cHM6IGdyb3VwLmdyb3VwTmFtZSxcbiAgICAgICAgICAgIC8vIHVzZXJzOiBbdGhpcy51c2VyTmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ncm91cElkICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBhdHRhY2hJbmxpbmVQb2xpY3kocG9saWN5OiBQb2xpY3kpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hdHRhY2hlZFBvbGljaWVzLmF0dGFjaChwb2xpY3kpO1xuICAgICAgICBwb2xpY3kuYXR0YWNoVG9Vc2VyKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgYWRkTWFuYWdlZFBvbGljeShfcG9saWN5OiBJTWFuYWdlZFBvbGljeSk6IHZvaWQge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIG1hbmFnZWQgcG9saWN5IHRvIGltcG9ydGVkIFVzZXJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWwgPSB0aGlzO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5lbnYuYWNjb3VudDtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcbiAgcHVibGljIGdldCB1c2VyT3V0cHV0cygpOiBVc2VyT3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFybjogdGhpcy51c2VyQXJuLFxuICAgICAgbmFtZTogdGhpcy51c2VyTmFtZSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy51c2VyT3V0cHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHVzZXIncyBuYW1lLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSB1c2VyJ3MgQVJOLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlckFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgYm91bmRhcnkgYXNzaWduZWQgdG8gdGhpcyB1c2VyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zQm91bmRhcnk/OiBJTWFuYWdlZFBvbGljeTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hbmFnZWRQb2xpY2llczogSU1hbmFnZWRQb2xpY3lbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFjaGVkUG9saWNpZXMgPSBuZXcgQXR0YWNoZWRQb2xpY2llcygpO1xuICBwcml2YXRlIGRlZmF1bHRQb2xpY3k/OiBQb2xpY3k7XG4gIHByaXZhdGUgZ3JvdXBJZCA9IDA7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFVzZXJQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3QgdXNlck5hbWUgPVxuICAgICAgcHJvcHMudXNlck5hbWUgfHxcbiAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiB0aGlzLmdyaWRVVUlELFxuICAgICAgfSk7XG5cbiAgICBpZiAocHJvcHMubWFuYWdlZFBvbGljaWVzKSB7XG4gICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5wdXNoKC4uLnByb3BzLm1hbmFnZWRQb2xpY2llcyk7XG4gICAgfVxuICAgIHRoaXMucGVybWlzc2lvbnNCb3VuZGFyeSA9IHByb3BzLnBlcm1pc3Npb25zQm91bmRhcnk7XG5cbiAgICBjb25zdCB1c2VyUmVzb3VyY2UgPSBuZXcgaWFtVXNlci5JYW1Vc2VyKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICBwYXRoOiBwcm9wcy5wYXRoLFxuICAgICAgcGVybWlzc2lvbnNCb3VuZGFyeTogdGhpcy5wZXJtaXNzaW9uc0JvdW5kYXJ5XG4gICAgICAgID8gdGhpcy5wZXJtaXNzaW9uc0JvdW5kYXJ5Lm1hbmFnZWRQb2xpY3lBcm5cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmb3JjZURlc3Ryb3k6IGZhbHNlLFxuICAgICAgLy8gbG9naW5Qcm9maWxlOiB0aGlzLnBhcnNlTG9naW5Qcm9maWxlKHByb3BzKSxcbiAgICAgIC8vIHRhZ3M6IHVuZGVmaW5lZElmRW1wdHkoKCkgPT4gdGhpcy50YWdzKSxcbiAgICB9KTtcblxuICAgIHRoaXMudXNlck5hbWUgPSB1c2VyUmVzb3VyY2UubmFtZTtcbiAgICB0aGlzLnVzZXJBcm4gPSB1c2VyUmVzb3VyY2UuYXJuO1xuICAgIC8vIHRoaXMuZ2V0UmVzb3VyY2VBcm5BdHRyaWJ1dGUodXNlclJlc291cmNlLmFybiwge1xuICAgIC8vICAgcmVnaW9uOiBcIlwiLFxuICAgIC8vICAgc2VydmljZTogXCJpYW1cIixcbiAgICAvLyAgIHJlc291cmNlOiBcInVzZXJcIixcbiAgICAvLyAgIC8vIFJlbW92ZSBhIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgcGF0aCBpZiBwcmVzZW50LlxuICAgIC8vICAgcmVzb3VyY2VOYW1lOiBgJHtwcm9wcy5wYXRoID8gcHJvcHMucGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgOiBcIlwifSR7dGhpcy5waHlzaWNhbE5hbWV9YCxcbiAgICAvLyB9KTtcblxuICAgIGlmIChwcm9wcy5jcmVhdGVMb2dpblByb2ZpbGUpIHtcbiAgICAgIG5ldyBpYW1Vc2VyTG9naW5Qcm9maWxlLklhbVVzZXJMb2dpblByb2ZpbGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3VzZXJOYW1lfS1Mb2dpblByb2ZpbGVgLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcjogdGhpcy51c2VyTmFtZSxcbiAgICAgICAgICBwYXNzd29yZExlbmd0aDogcHJvcHMucGFzc3dvcmRMZW5ndGgsXG4gICAgICAgICAgcGFzc3dvcmRSZXNldFJlcXVpcmVkOiBwcm9wcy5wYXNzd29yZFJlc2V0UmVxdWlyZWQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucG9saWN5RnJhZ21lbnQgPSBuZXcgQXJuUHJpbmNpcGFsKHRoaXMudXNlckFybikucG9saWN5RnJhZ21lbnQ7XG5cbiAgICBpZiAocHJvcHMuZ3JvdXBzKSB7XG4gICAgICBwcm9wcy5ncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5hZGRUb0dyb3VwKGcpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGlzIHVzZXIgdG8gdGhlIHNwZWNpZmllZCBncm91cC5cbiAgICovXG4gIHB1YmxpYyBhZGRUb0dyb3VwKGdyb3VwOiBJR3JvdXApOiB2b2lkIHtcbiAgICAvLyBgJHt0aGlzLnVzZXJOYW1lfS1Hcm91cCR7dGhpcy5ncm91cElkfWAsXG4gICAgY29uc3QgaWQgPSBgR3JvdXAke3RoaXMuZ3JvdXBJZH1gO1xuICAgIG5ldyBpYW1Vc2VyR3JvdXBNZW1iZXJzaGlwLklhbVVzZXJHcm91cE1lbWJlcnNoaXAodGhpcywgaWQsIHtcbiAgICAgIGdyb3VwczogW2dyb3VwLmdyb3VwTmFtZV0sXG4gICAgICB1c2VyOiB0aGlzLnVzZXJOYW1lLFxuICAgICAgLy8gZ3JvdXBOYW1lOiBncm91cC5ncm91cE5hbWUsXG4gICAgICAvLyB1c2VyczogW3RoaXMudXNlck5hbWVdLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JvdXBJZCsrO1xuICAgIHRoaXMuZ3JvdXBzLnB1c2goZ3JvdXAuZ3JvdXBOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIG1hbmFnZWQgcG9saWN5IHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHVibGljIGFkZE1hbmFnZWRQb2xpY3kocG9saWN5OiBJTWFuYWdlZFBvbGljeSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hbmFnZWRQb2xpY2llcy5maW5kKChtcCkgPT4gbXAgPT09IHBvbGljeSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYW5hZ2VkUG9saWNpZXMucHVzaChwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGFuIGlubGluZSBwb2xpY3kgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoSW5saW5lUG9saWN5KHBvbGljeTogUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hlZFBvbGljaWVzLmF0dGFjaChwb2xpY3kpO1xuICAgIHBvbGljeS5hdHRhY2hUb1VzZXIodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBJQU0gc3RhdGVtZW50IHRvIHRoZSBkZWZhdWx0IGlubGluZSBwb2xpY3kuXG4gICAqXG4gICAqIElmIG5vIGRlZmF1bHQgcG9saWN5IGV4aXN0cyB5ZXQsIG9uZSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICApOiBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRQb2xpY3kpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFBvbGljeSA9IG5ldyBQb2xpY3kodGhpcywgXCJEZWZhdWx0UG9saWN5XCIpO1xuICAgICAgdGhpcy5kZWZhdWx0UG9saWN5LmF0dGFjaFRvVXNlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0UG9saWN5LmFkZFN0YXRlbWVudHMoc3RhdGVtZW50KTtcbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogdGhpcy5kZWZhdWx0UG9saWN5IH07XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIHRlcnJhZm9ybSBKU09OIG91dHB1dC5cbiAgICpcbiAgICogY2FsbGVkIGJ5IFRlcnJhZm9ybVN0YWNrLnByZXBhcmVTdGFjaygpXG4gICAqL1xuICBwdWJsaWMgdG9UZXJyYWZvcm0oKTogYW55IHtcbiAgICAvKipcbiAgICAgKiBBIHByZXBhcmluZyByZXNvbHZlIHJ1biBtaWdodCBhZGQgbmV3IHJlc291cmNlcyB0byB0aGUgc3RhY2tcbiAgICAgKlxuICAgICAqIHNob3VsZCBub3QgYWRkIHJlc291cmNlcyBpZiBgZm9yY2VgIGlzIGBmYWxzZWAgYW5kIHRoZSBwb2xpY3lcbiAgICAgKiBkb2N1bWVudCBpcyBlbXB0eSBvciBub3QgYXR0YWNoZWRcbiAgICAgKiByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0My4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3BvbGljeS50cyNMMTQ5XG4gICAgICovXG4gICAgaWYgKHRoaXMubWFuYWdlZFBvbGljaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8vIGFkZCBpYW1Vc2VyUG9saWN5QXR0YWNobWVudCByZXNvdXJjZSBmb3IgZWFjaCByZWZlcmVuY2VkIE1hbmFnZWRQb2xpY3lcbiAgICAvLyBOT1RFOiBUaGUgVGVycmFmb3JtRGVwZW5kZW5kYWJsZUFzcGVjdCB3aWxsIHByb3BnYXRlIGNvbnN0cnVjdCBkZXBlbmRlbmNpZXMgb24gdGhpcyBwb2xpY3kgdG8gaXRzIElhbVJvbGVQb2xpY3kgcmVzb3VyY2VzXG4gICAgLy8gbm90IHN1cmUgaWYgdGltZS5zbGVlcCBpcyBzdGlsbCBuZWNlc3Nhcnk/XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3B1bHVtaS9wdWx1bWktYXdzL2lzc3Vlcy8yMjYwI2lzc3VlY29tbWVudC0xOTc3NjA2NTA5XG4gICAgLy8gZWxzZSBuZWVkOiBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvaXNzdWVzLzI5ODI4I2lzc3VlY29tbWVudC0xNjkzMzA3NTAwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hbmFnZWRQb2xpY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaWQgPSBgUmVzb3VyY2VNYW5hZ2VkUG9saWN5JHtpfWA7IC8vIHVuaXF1ZSBpZCBmb3IgZWFjaCBtYW5hZ2VkIHBvbGljeVxuICAgICAgLy8gaWdub3JlIGlmIGFscmVhZHkgZ2VuZXJhdGVkXG4gICAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChpZCkpIGNvbnRpbnVlO1xuXG4gICAgICBuZXcgaWFtVXNlclBvbGljeUF0dGFjaG1lbnQuSWFtVXNlclBvbGljeUF0dGFjaG1lbnQodGhpcywgaWQsIHtcbiAgICAgICAgdXNlcjogdGhpcy51c2VyTmFtZSxcbiAgICAgICAgcG9saWN5QXJuOiB0aGlzLm1hbmFnZWRQb2xpY2llc1tpXS5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuIl19