terraconstructs 0.0.10 → 0.0.12

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 (410) hide show
  1. package/.jsii +104486 -34582
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.d.ts +1 -1
  4. package/lib/aws/aws-construct.js +28 -2
  5. package/lib/aws/aws-stack.d.ts +2 -4
  6. package/lib/aws/aws-stack.js +21 -8
  7. package/lib/aws/aws-tags.d.ts +58 -0
  8. package/lib/aws/aws-tags.js +77 -0
  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/alarm-base.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  13. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  14. package/lib/aws/cloudwatch/alarm.js +1 -1
  15. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  16. package/lib/aws/cloudwatch/dashboard.js +1 -1
  17. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  18. package/lib/aws/cloudwatch/graph.js +8 -8
  19. package/lib/aws/cloudwatch/layout.js +3 -3
  20. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  21. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  22. package/lib/aws/cloudwatch/log-group.js +1 -1
  23. package/lib/aws/cloudwatch/log-query.js +1 -1
  24. package/lib/aws/cloudwatch/log-stream.js +1 -1
  25. package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
  26. package/lib/aws/cloudwatch/metric-filter.js +4 -4
  27. package/lib/aws/cloudwatch/metric.js +2 -2
  28. package/lib/aws/cloudwatch/pattern.js +3 -3
  29. package/lib/aws/cloudwatch/policy.js +1 -1
  30. package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
  31. package/lib/aws/cloudwatch/private/metric-util.js +4 -5
  32. package/lib/aws/cloudwatch/private/object.js +2 -3
  33. package/lib/aws/cloudwatch/private/rendering.js +3 -3
  34. package/lib/aws/cloudwatch/private/statistic.js +6 -7
  35. package/lib/aws/cloudwatch/query-definition.js +2 -2
  36. package/lib/aws/cloudwatch/stats.js +1 -1
  37. package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
  38. package/lib/aws/cloudwatch/subscription-filter.js +4 -4
  39. package/lib/aws/cloudwatch/text.js +1 -1
  40. package/lib/aws/cloudwatch/variable.js +3 -3
  41. package/lib/aws/cloudwatch/widget.d.ts +1 -1
  42. package/lib/aws/cloudwatch/widget.js +4 -4
  43. package/lib/aws/compute/activity.js +3 -2
  44. package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
  45. package/lib/aws/compute/alb/application-listener-action.js +281 -0
  46. package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
  47. package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
  48. package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
  49. package/lib/aws/compute/alb/application-listener-rule.js +220 -0
  50. package/lib/aws/compute/alb/application-listener.d.ts +574 -0
  51. package/lib/aws/compute/alb/application-listener.js +538 -0
  52. package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
  53. package/lib/aws/compute/alb/application-load-balancer.js +780 -0
  54. package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
  55. package/lib/aws/compute/alb/application-target-group.js +427 -0
  56. package/lib/aws/compute/alb/conditions.d.ts +61 -0
  57. package/lib/aws/compute/alb/conditions.js +164 -0
  58. package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
  59. package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
  60. package/lib/aws/compute/alb/trust-store.d.ts +86 -0
  61. package/lib/aws/compute/alb/trust-store.js +79 -0
  62. package/lib/aws/compute/architecture.js +1 -1
  63. package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
  64. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
  65. package/lib/aws/compute/bastion-host.d.ts +172 -0
  66. package/lib/aws/compute/bastion-host.js +114 -0
  67. package/lib/aws/compute/chain.js +1 -1
  68. package/lib/aws/compute/cidr-splits.d.ts +49 -0
  69. package/lib/aws/compute/cidr-splits.js +59 -0
  70. package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
  71. package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
  72. package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
  73. package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
  74. package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
  75. package/lib/aws/compute/client-vpn-endpoint.js +259 -0
  76. package/lib/aws/compute/client-vpn-route.d.ts +67 -0
  77. package/lib/aws/compute/client-vpn-route.js +57 -0
  78. package/lib/aws/compute/condition.js +1 -1
  79. package/lib/aws/compute/connections.d.ts +137 -0
  80. package/lib/aws/compute/connections.js +208 -0
  81. package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
  82. package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
  83. package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
  84. package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
  85. package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
  86. package/lib/aws/compute/ec2-util-v2.js +286 -0
  87. package/lib/aws/compute/ec2-util.d.ts +52 -0
  88. package/lib/aws/compute/ec2-util.js +138 -0
  89. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
  90. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
  91. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
  92. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
  93. package/lib/aws/compute/event-invoke-config.js +1 -1
  94. package/lib/aws/compute/event-source-filter.js +2 -2
  95. package/lib/aws/compute/event-source-mapping.js +1 -1
  96. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  97. package/lib/aws/compute/event-sources/s3.js +1 -1
  98. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  99. package/lib/aws/compute/event-sources/sqs.js +1 -1
  100. package/lib/aws/compute/fields.js +4 -4
  101. package/lib/aws/compute/function-alias.js +1 -1
  102. package/lib/aws/compute/function-base.js +2 -2
  103. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  104. package/lib/aws/compute/function-destinations/function.js +1 -1
  105. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  106. package/lib/aws/compute/function-nodejs.js +1 -1
  107. package/lib/aws/compute/function-url.js +1 -1
  108. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  109. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  110. package/lib/aws/compute/function.d.ts +1 -1
  111. package/lib/aws/compute/function.js +5 -5
  112. package/lib/aws/compute/index-alpha.d.ts +5 -0
  113. package/lib/aws/compute/index-alpha.js +22 -0
  114. package/lib/aws/compute/index.d.ts +60 -0
  115. package/lib/aws/compute/index.js +70 -2
  116. package/lib/aws/compute/instance-types.d.ts +1354 -0
  117. package/lib/aws/compute/instance-types.js +1683 -0
  118. package/lib/aws/compute/instance.d.ts +436 -0
  119. package/lib/aws/compute/instance.js +262 -0
  120. package/lib/aws/compute/ip-addresses.d.ts +249 -0
  121. package/lib/aws/compute/ip-addresses.js +248 -0
  122. package/lib/aws/compute/ipam.d.ts +309 -0
  123. package/lib/aws/compute/ipam.js +306 -0
  124. package/lib/aws/compute/key-pair.d.ts +178 -0
  125. package/lib/aws/compute/key-pair.js +194 -0
  126. package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
  127. package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
  128. package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
  129. package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
  130. package/lib/aws/compute/launch-template.d.ts +540 -0
  131. package/lib/aws/compute/launch-template.js +468 -0
  132. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
  133. package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
  134. package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
  135. package/lib/aws/compute/lb-shared/base-listener.js +181 -0
  136. package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
  137. package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
  138. package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
  139. package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
  140. package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
  141. package/lib/aws/compute/lb-shared/enums.js +301 -0
  142. package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
  143. package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
  144. package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
  145. package/lib/aws/compute/lb-shared/imported.js +27 -0
  146. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
  147. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
  148. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
  149. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
  150. package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
  151. package/lib/aws/compute/lb-shared/listener-action.js +4 -0
  152. package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
  153. package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
  154. package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
  155. package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
  156. package/lib/aws/compute/lb-shared/util.d.ts +113 -0
  157. package/lib/aws/compute/lb-shared/util.js +264 -0
  158. package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
  159. package/lib/aws/compute/lb-targets/alb-target.js +100 -0
  160. package/lib/aws/compute/lb-targets/index.d.ts +4 -0
  161. package/lib/aws/compute/lb-targets/index.js +22 -0
  162. package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
  163. package/lib/aws/compute/lb-targets/instance-target.js +67 -0
  164. package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
  165. package/lib/aws/compute/lb-targets/ip-target.js +79 -0
  166. package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
  167. package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
  168. package/lib/aws/compute/load-balancer.d.ts +336 -0
  169. package/lib/aws/compute/load-balancer.js +287 -0
  170. package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
  171. package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
  172. package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
  173. package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
  174. package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
  175. package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
  176. package/lib/aws/compute/machine-image/common.d.ts +181 -0
  177. package/lib/aws/compute/machine-image/common.js +122 -0
  178. package/lib/aws/compute/machine-image/index.d.ts +5 -0
  179. package/lib/aws/compute/machine-image/index.js +22 -0
  180. package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
  181. package/lib/aws/compute/machine-image/machine-image.js +566 -0
  182. package/lib/aws/compute/machine-image/utils.d.ts +2 -0
  183. package/lib/aws/compute/machine-image/utils.js +17 -0
  184. package/lib/aws/compute/nat.d.ts +325 -0
  185. package/lib/aws/compute/nat.js +455 -0
  186. package/lib/aws/compute/network-acl-types.d.ts +152 -0
  187. package/lib/aws/compute/network-acl-types.js +156 -0
  188. package/lib/aws/compute/network-acl.d.ts +285 -0
  189. package/lib/aws/compute/network-acl.js +207 -0
  190. package/lib/aws/compute/network-util.d.ts +116 -0
  191. package/lib/aws/compute/network-util.js +241 -0
  192. package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
  193. package/lib/aws/compute/nlb/network-listener-action.js +146 -0
  194. package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
  195. package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
  196. package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
  197. package/lib/aws/compute/nlb/network-listener.js +217 -0
  198. package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
  199. package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
  200. package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
  201. package/lib/aws/compute/nlb/network-target-group.js +223 -0
  202. package/lib/aws/compute/peer.d.ts +64 -0
  203. package/lib/aws/compute/peer.js +235 -0
  204. package/lib/aws/compute/placement-group.d.ts +161 -0
  205. package/lib/aws/compute/placement-group.js +133 -0
  206. package/lib/aws/compute/port.d.ts +287 -0
  207. package/lib/aws/compute/port.js +390 -0
  208. package/lib/aws/compute/prefix-list.d.ts +131 -0
  209. package/lib/aws/compute/prefix-list.js +114 -0
  210. package/lib/aws/compute/private/context-stub.d.ts +7 -0
  211. package/lib/aws/compute/private/context-stub.js +43 -0
  212. package/lib/aws/compute/private/ebs-util.d.ts +14 -0
  213. package/lib/aws/compute/private/ebs-util.js +145 -0
  214. package/lib/aws/compute/private/intrinstics.js +2 -1
  215. package/lib/aws/compute/private/json-path.js +8 -8
  216. package/lib/aws/compute/private/util.js +2 -3
  217. package/lib/aws/compute/route.d.ts +547 -0
  218. package/lib/aws/compute/route.js +469 -0
  219. package/lib/aws/compute/security-group.d.ts +414 -0
  220. package/lib/aws/compute/security-group.js +538 -0
  221. package/lib/aws/compute/state-graph.js +1 -1
  222. package/lib/aws/compute/state-machine-fragment.js +1 -1
  223. package/lib/aws/compute/state-machine.d.ts +2 -2
  224. package/lib/aws/compute/state-machine.js +14 -12
  225. package/lib/aws/compute/states/choice.js +1 -1
  226. package/lib/aws/compute/states/custom-state.js +1 -1
  227. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  228. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  229. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  230. package/lib/aws/compute/states/distributed-map.js +1 -1
  231. package/lib/aws/compute/states/fail.js +1 -1
  232. package/lib/aws/compute/states/map-base.js +1 -1
  233. package/lib/aws/compute/states/map.js +1 -1
  234. package/lib/aws/compute/states/parallel.js +1 -1
  235. package/lib/aws/compute/states/pass.js +2 -2
  236. package/lib/aws/compute/states/state.js +5 -5
  237. package/lib/aws/compute/states/succeed.js +1 -1
  238. package/lib/aws/compute/states/task-base.js +2 -2
  239. package/lib/aws/compute/states/task.js +1 -1
  240. package/lib/aws/compute/states/wait.js +2 -2
  241. package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
  242. package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
  243. package/lib/aws/compute/subnet-v2.d.ts +213 -0
  244. package/lib/aws/compute/subnet-v2.js +405 -0
  245. package/lib/aws/compute/subnet.d.ts +37 -0
  246. package/lib/aws/compute/subnet.js +181 -0
  247. package/lib/aws/compute/task-credentials.js +1 -1
  248. package/lib/aws/compute/task-input.js +1 -1
  249. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  250. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  251. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  252. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  253. package/lib/aws/compute/tasks/private/task-utils.js +3 -4
  254. package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
  255. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  256. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  257. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  258. package/lib/aws/compute/types.js +2 -2
  259. package/lib/aws/compute/user-data.d.ts +270 -0
  260. package/lib/aws/compute/user-data.js +487 -0
  261. package/lib/aws/compute/util.d.ts +1 -1
  262. package/lib/aws/compute/util.js +4 -5
  263. package/lib/aws/compute/volume.d.ts +480 -0
  264. package/lib/aws/compute/volume.js +426 -0
  265. package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
  266. package/lib/aws/compute/vpc-endpoint-service.js +90 -0
  267. package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
  268. package/lib/aws/compute/vpc-endpoint.js +811 -0
  269. package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
  270. package/lib/aws/compute/vpc-flow-logs.js +693 -0
  271. package/lib/aws/compute/vpc-lookup.d.ts +73 -0
  272. package/lib/aws/compute/vpc-lookup.js +3 -0
  273. package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
  274. package/lib/aws/compute/vpc-v2-base.js +493 -0
  275. package/lib/aws/compute/vpc-v2.d.ts +385 -0
  276. package/lib/aws/compute/vpc-v2.js +408 -0
  277. package/lib/aws/compute/vpc.d.ts +1448 -0
  278. package/lib/aws/compute/vpc.js +1495 -0
  279. package/lib/aws/compute/vpn.d.ts +443 -0
  280. package/lib/aws/compute/vpn.js +397 -0
  281. package/lib/aws/compute/windows-versions.d.ts +418 -0
  282. package/lib/aws/compute/windows-versions.js +426 -0
  283. package/lib/aws/edge/certificate-base.d.ts +20 -0
  284. package/lib/aws/edge/certificate-base.js +28 -0
  285. package/lib/aws/edge/certificate.d.ts +23 -2
  286. package/lib/aws/edge/certificate.js +54 -4
  287. package/lib/aws/edge/distribution.js +3 -3
  288. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  289. package/lib/aws/edge/dns-record.js +16 -16
  290. package/lib/aws/edge/dns-zone.d.ts +20 -2
  291. package/lib/aws/edge/dns-zone.js +25 -10
  292. package/lib/aws/edge/function.js +2 -2
  293. package/lib/aws/edge/index.d.ts +1 -0
  294. package/lib/aws/edge/index.js +2 -1
  295. package/lib/aws/edge/key-value-store.js +4 -4
  296. package/lib/aws/edge/origin.js +8 -6
  297. package/lib/aws/edge/response-headers-policy.js +1 -1
  298. package/lib/aws/encryption/alias.js +1 -1
  299. package/lib/aws/encryption/key.js +1 -1
  300. package/lib/aws/encryption/via-service-principal.js +1 -1
  301. package/lib/aws/iam/grant.js +2 -2
  302. package/lib/aws/iam/index.d.ts +1 -0
  303. package/lib/aws/iam/index.js +2 -1
  304. package/lib/aws/iam/instance-profile.d.ts +155 -0
  305. package/lib/aws/iam/instance-profile.js +124 -0
  306. package/lib/aws/iam/managed-policy.js +1 -1
  307. package/lib/aws/iam/oidc-provider.js +1 -1
  308. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  309. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  310. package/lib/aws/iam/policy-document.js +1 -1
  311. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  312. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  313. package/lib/aws/iam/policy-statement.js +9 -9
  314. package/lib/aws/iam/policy.js +1 -1
  315. package/lib/aws/iam/principals.js +26 -26
  316. package/lib/aws/iam/private/assume-role-policy.js +2 -3
  317. package/lib/aws/iam/private/comparable-principal.js +2 -3
  318. package/lib/aws/iam/private/immutable-role.d.ts +2 -1
  319. package/lib/aws/iam/private/immutable-role.js +3 -3
  320. package/lib/aws/iam/private/imported-role.d.ts +1 -1
  321. package/lib/aws/iam/private/imported-role.js +3 -3
  322. package/lib/aws/iam/private/merge-statements.js +2 -3
  323. package/lib/aws/iam/private/util.js +4 -4
  324. package/lib/aws/iam/role.js +1 -1
  325. package/lib/aws/iam/saml-provider.d.ts +1 -1
  326. package/lib/aws/iam/saml-provider.js +6 -6
  327. package/lib/aws/iam/unknown-principal.js +1 -1
  328. package/lib/aws/iam/utils.js +2 -3
  329. package/lib/aws/index.d.ts +1 -0
  330. package/lib/aws/index.js +4 -1
  331. package/lib/aws/network/simple-ipv4-vpc.js +5 -5
  332. package/lib/aws/network/subnet-group.js +3 -3
  333. package/lib/aws/network/subnet.d.ts +1 -1
  334. package/lib/aws/network/subnet.js +7 -7
  335. package/lib/aws/notify/archive.js +3 -2
  336. package/lib/aws/notify/connection.js +5 -4
  337. package/lib/aws/notify/event-bus.js +5 -4
  338. package/lib/aws/notify/event-pattern.js +3 -3
  339. package/lib/aws/notify/index.js +3 -1
  340. package/lib/aws/notify/input.js +4 -3
  341. package/lib/aws/notify/kinesis-stream.js +3 -2
  342. package/lib/aws/notify/on-event-options.js +2 -1
  343. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  344. package/lib/aws/notify/queue-config.generated.js +1 -1
  345. package/lib/aws/notify/queue-policy.js +1 -1
  346. package/lib/aws/notify/queue.js +1 -1
  347. package/lib/aws/notify/resource-policy.js +1 -1
  348. package/lib/aws/notify/rule.js +3 -2
  349. package/lib/aws/notify/schedule.js +2 -2
  350. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  351. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  352. package/lib/aws/notify/target.js +2 -1
  353. package/lib/aws/notify/targets/event-bus.js +1 -1
  354. package/lib/aws/notify/targets/function.js +1 -1
  355. package/lib/aws/notify/targets/log-group.js +2 -2
  356. package/lib/aws/notify/targets/sqs.js +1 -1
  357. package/lib/aws/notify/targets/state-machine.js +1 -1
  358. package/lib/aws/notify/targets/util.d.ts +1 -1
  359. package/lib/aws/notify/targets/util.js +10 -11
  360. package/lib/aws/notify/util.js +4 -4
  361. package/lib/aws/provider-config.generated.d.ts +33 -33
  362. package/lib/aws/provider-config.generated.js +1 -1
  363. package/lib/aws/storage/bucket-notifications.js +1 -1
  364. package/lib/aws/storage/bucket-policy.js +1 -1
  365. package/lib/aws/storage/bucket-source.js +1 -1
  366. package/lib/aws/storage/bucket.d.ts +298 -65
  367. package/lib/aws/storage/bucket.js +548 -225
  368. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  369. package/lib/aws/storage/cors-config.generated.js +1 -1
  370. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  371. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  372. package/lib/aws/storage/index.d.ts +1 -0
  373. package/lib/aws/storage/index.js +2 -1
  374. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  375. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  376. package/lib/aws/storage/notification-targets/function.js +6 -6
  377. package/lib/aws/storage/notification-targets/queue.js +1 -1
  378. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  379. package/lib/aws/storage/origin-access-identity.js +5 -4
  380. package/lib/aws/storage/parameter-util.d.ts +12 -0
  381. package/lib/aws/storage/parameter-util.js +65 -0
  382. package/lib/aws/storage/parameter.d.ts +526 -0
  383. package/lib/aws/storage/parameter.js +606 -0
  384. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  386. package/lib/aws/storage/util.d.ts +25 -3
  387. package/lib/aws/storage/util.js +84 -17
  388. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  389. package/lib/aws/storage/website-config.generated.js +1 -1
  390. package/lib/aws/util.js +2 -3
  391. package/lib/construct-base.d.ts +10 -1
  392. package/lib/construct-base.js +9 -6
  393. package/lib/duration.js +1 -1
  394. package/lib/expiration.d.ts +48 -0
  395. package/lib/expiration.js +68 -0
  396. package/lib/helpers-internal/index.d.ts +1 -0
  397. package/lib/helpers-internal/index.js +7 -0
  398. package/lib/index.d.ts +2 -0
  399. package/lib/index.js +3 -1
  400. package/lib/private/md5.d.ts +4 -0
  401. package/lib/private/md5.js +14 -0
  402. package/lib/private/unique-resource-name.js +3 -4
  403. package/lib/size.js +2 -2
  404. package/lib/stack-base.d.ts +4 -23
  405. package/lib/stack-base.js +9 -30
  406. package/lib/terra-func.d.ts +103 -0
  407. package/lib/terra-func.js +170 -0
  408. package/lib/token.js +5 -5
  409. package/package.json +15 -8
  410. package/bun.lockb +0 -0
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.mergePrincipal = exports.defaultAddPrincipalToAssumeRole = exports.SessionTagsPrincipal = exports.PrincipalWithConditions = exports.ComparablePrincipal = exports.CompositePrincipal = exports.StarPrincipal = exports.Anyone = exports.AnyPrincipal = exports.AccountRootPrincipal = exports.SamlConsolePrincipal = exports.SamlPrincipal = exports.OpenIdConnectPrincipal = exports.WebIdentityPrincipal = exports.FederatedPrincipal = exports.CanonicalUserPrincipal = exports.OrganizationPrincipal = exports.ServicePrincipal = exports.AccountPrincipal = exports.ArnPrincipal = exports.PrincipalBase = exports.toPrincipalJson = exports.fromPrincipalJson = exports.PrincipalPolicyFragment = exports.PrincipalType = void 0;
4
+ exports.SessionTagsPrincipal = exports.PrincipalWithConditions = exports.ComparablePrincipal = exports.CompositePrincipal = exports.StarPrincipal = exports.Anyone = exports.AnyPrincipal = exports.AccountRootPrincipal = exports.SamlConsolePrincipal = exports.SamlPrincipal = exports.OpenIdConnectPrincipal = exports.WebIdentityPrincipal = exports.FederatedPrincipal = exports.CanonicalUserPrincipal = exports.OrganizationPrincipal = exports.ServicePrincipal = exports.AccountPrincipal = exports.ArnPrincipal = exports.PrincipalBase = exports.PrincipalPolicyFragment = exports.PrincipalType = void 0;
5
+ exports.fromPrincipalJson = fromPrincipalJson;
6
+ exports.toPrincipalJson = toPrincipalJson;
7
+ exports.defaultAddPrincipalToAssumeRole = defaultAddPrincipalToAssumeRole;
8
+ exports.mergePrincipal = mergePrincipal;
5
9
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
10
  const cdktf_1 = require("cdktf");
7
11
  const aws_stack_1 = require("../aws-stack");
@@ -70,7 +74,7 @@ class PrincipalPolicyFragment {
70
74
  }
71
75
  exports.PrincipalPolicyFragment = PrincipalPolicyFragment;
72
76
  _a = JSII_RTTI_SYMBOL_1;
73
- PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.0.10" };
77
+ PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.0.12" };
74
78
  /**
75
79
  * Read from AWS Principal JSON to Terraform principals block(s)
76
80
  *
@@ -107,7 +111,6 @@ function fromPrincipalJson(principalJson = {}) {
107
111
  }
108
112
  return result;
109
113
  }
110
- exports.fromPrincipalJson = fromPrincipalJson;
111
114
  /**
112
115
  * Convert Terraform principals blocks back to AWS Principal JSON
113
116
  */
@@ -126,7 +129,6 @@ function toPrincipalJson(...principalProps) {
126
129
  }
127
130
  return result;
128
131
  }
129
- exports.toPrincipalJson = toPrincipalJson;
130
132
  /**
131
133
  * Base class for policy principals
132
134
  */
@@ -191,7 +193,7 @@ class PrincipalBase {
191
193
  }
192
194
  exports.PrincipalBase = PrincipalBase;
193
195
  _b = JSII_RTTI_SYMBOL_1;
194
- PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.0.10" };
196
+ PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.0.12" };
195
197
  /**
196
198
  * Specify a principal by the Amazon Resource Name (ARN).
197
199
  * You can specify AWS accounts, IAM users, Federated SAML users, IAM roles, and specific assumed-role sessions.
@@ -236,7 +238,7 @@ class ArnPrincipal extends PrincipalBase {
236
238
  }
237
239
  exports.ArnPrincipal = ArnPrincipal;
238
240
  _c = JSII_RTTI_SYMBOL_1;
239
- ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.0.10" };
241
+ ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.0.12" };
240
242
  /**
241
243
  * Specify AWS account ID as the principal entity in a policy to delegate authority to the account.
242
244
  */
@@ -259,7 +261,7 @@ class AccountPrincipal extends ArnPrincipal {
259
261
  }
260
262
  exports.AccountPrincipal = AccountPrincipal;
261
263
  _d = JSII_RTTI_SYMBOL_1;
262
- AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.0.10" };
264
+ AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.0.12" };
263
265
  /**
264
266
  * An IAM principal that represents an AWS service (i.e. `sqs.amazonaws.com`).
265
267
  */
@@ -316,7 +318,7 @@ class ServicePrincipal extends PrincipalBase {
316
318
  }
317
319
  exports.ServicePrincipal = ServicePrincipal;
318
320
  _e = JSII_RTTI_SYMBOL_1;
319
- ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.0.10" };
321
+ ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.0.12" };
320
322
  /**
321
323
  * A principal that represents an AWS Organization
322
324
  */
@@ -347,7 +349,7 @@ class OrganizationPrincipal extends PrincipalBase {
347
349
  }
348
350
  exports.OrganizationPrincipal = OrganizationPrincipal;
349
351
  _f = JSII_RTTI_SYMBOL_1;
350
- OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.0.10" };
352
+ OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.0.12" };
351
353
  /**
352
354
  * A policy principal for canonicalUserIds - useful for S3 bucket policies that use
353
355
  * Origin Access identities.
@@ -389,7 +391,7 @@ class CanonicalUserPrincipal extends PrincipalBase {
389
391
  }
390
392
  exports.CanonicalUserPrincipal = CanonicalUserPrincipal;
391
393
  _g = JSII_RTTI_SYMBOL_1;
392
- CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.0.10" };
394
+ CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.0.12" };
393
395
  /**
394
396
  * Principal entity that represents a federated identity provider such as Amazon Cognito,
395
397
  * that can be used to provide temporary security credentials to users who have been authenticated.
@@ -422,7 +424,7 @@ class FederatedPrincipal extends PrincipalBase {
422
424
  }
423
425
  exports.FederatedPrincipal = FederatedPrincipal;
424
426
  _h = JSII_RTTI_SYMBOL_1;
425
- FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.0.10" };
427
+ FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.0.12" };
426
428
  /**
427
429
  * A principal that represents a federated identity provider as Web Identity such as Cognito, Amazon,
428
430
  * Facebook, Google, etc.
@@ -447,7 +449,7 @@ class WebIdentityPrincipal extends FederatedPrincipal {
447
449
  }
448
450
  exports.WebIdentityPrincipal = WebIdentityPrincipal;
449
451
  _j = JSII_RTTI_SYMBOL_1;
450
- WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.0.10" };
452
+ WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.0.12" };
451
453
  /**
452
454
  * A principal that represents a federated identity provider as from a OpenID Connect provider.
453
455
  */
@@ -470,7 +472,7 @@ class OpenIdConnectPrincipal extends WebIdentityPrincipal {
470
472
  }
471
473
  exports.OpenIdConnectPrincipal = OpenIdConnectPrincipal;
472
474
  _k = JSII_RTTI_SYMBOL_1;
473
- OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.0.10" };
475
+ OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.0.12" };
474
476
  /**
475
477
  * Principal entity that represents a SAML federated identity provider
476
478
  */
@@ -484,7 +486,7 @@ class SamlPrincipal extends FederatedPrincipal {
484
486
  }
485
487
  exports.SamlPrincipal = SamlPrincipal;
486
488
  _l = JSII_RTTI_SYMBOL_1;
487
- SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.0.10" };
489
+ SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.0.12" };
488
490
  /**
489
491
  * Principal entity that represents a SAML federated identity provider for
490
492
  * programmatic and AWS Management Console access.
@@ -527,7 +529,7 @@ class SamlConsolePrincipal extends SamlPrincipal {
527
529
  }
528
530
  exports.SamlConsolePrincipal = SamlConsolePrincipal;
529
531
  _m = JSII_RTTI_SYMBOL_1;
530
- SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.0.10" };
532
+ SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.0.12" };
531
533
  /**
532
534
  * Use the AWS account into which a stack is deployed as the principal entity in a policy
533
535
  */
@@ -541,7 +543,7 @@ class AccountRootPrincipal extends AccountPrincipal {
541
543
  }
542
544
  exports.AccountRootPrincipal = AccountRootPrincipal;
543
545
  _o = JSII_RTTI_SYMBOL_1;
544
- AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.0.10" };
546
+ AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.0.12" };
545
547
  /**
546
548
  * A principal representing all AWS identities in all accounts
547
549
  *
@@ -562,7 +564,7 @@ class AnyPrincipal extends ArnPrincipal {
562
564
  }
563
565
  exports.AnyPrincipal = AnyPrincipal;
564
566
  _p = JSII_RTTI_SYMBOL_1;
565
- AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.0.10" };
567
+ AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.0.12" };
566
568
  /**
567
569
  * A principal representing all identities in all accounts
568
570
  * @deprecated use `AnyPrincipal`
@@ -571,7 +573,7 @@ class Anyone extends AnyPrincipal {
571
573
  }
572
574
  exports.Anyone = Anyone;
573
575
  _q = JSII_RTTI_SYMBOL_1;
574
- Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.0.10" };
576
+ Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.0.12" };
575
577
  /**
576
578
  * A principal that uses a literal '*' in the IAM JSON language
577
579
  *
@@ -600,7 +602,7 @@ class StarPrincipal extends PrincipalBase {
600
602
  }
601
603
  exports.StarPrincipal = StarPrincipal;
602
604
  _r = JSII_RTTI_SYMBOL_1;
603
- StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.0.10" };
605
+ StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.0.12" };
604
606
  /**
605
607
  * Represents a principal that has multiple types of principals. A composite principal cannot
606
608
  * have conditions. i.e. multiple ServicePrincipals that form a composite principal
@@ -665,7 +667,7 @@ class CompositePrincipal extends PrincipalBase {
665
667
  }
666
668
  exports.CompositePrincipal = CompositePrincipal;
667
669
  _s = JSII_RTTI_SYMBOL_1;
668
- CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.0.10" };
670
+ CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.0.12" };
669
671
  /**
670
672
  * Base class for Principals that wrap other principals
671
673
  */
@@ -713,7 +715,7 @@ class ComparablePrincipal {
713
715
  }
714
716
  exports.ComparablePrincipal = ComparablePrincipal;
715
717
  _t = JSII_RTTI_SYMBOL_1;
716
- ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.0.10" };
718
+ ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.0.12" };
717
719
  /**
718
720
  * An IAM principal with additional conditions specifying when the policy is in effect.
719
721
  *
@@ -868,7 +870,7 @@ class PrincipalWithConditions extends PrincipalAdapter {
868
870
  }
869
871
  exports.PrincipalWithConditions = PrincipalWithConditions;
870
872
  _u = JSII_RTTI_SYMBOL_1;
871
- PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.0.10" };
873
+ PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.0.12" };
872
874
  /**
873
875
  * Enables session tags on role assumptions from a principal
874
876
  *
@@ -895,7 +897,7 @@ class SessionTagsPrincipal extends PrincipalAdapter {
895
897
  }
896
898
  exports.SessionTagsPrincipal = SessionTagsPrincipal;
897
899
  _v = JSII_RTTI_SYMBOL_1;
898
- SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.0.10" };
900
+ SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.0.12" };
899
901
  /**
900
902
  * Add a principal to an AssumeRolePolicyDocument in the right way
901
903
  *
@@ -914,7 +916,6 @@ function defaultAddPrincipalToAssumeRole(principal, doc) {
914
916
  }));
915
917
  }
916
918
  }
917
- exports.defaultAddPrincipalToAssumeRole = defaultAddPrincipalToAssumeRole;
918
919
  function isAssumeRolePrincipal(principal) {
919
920
  return !!principal.addToAssumeRolePolicy;
920
921
  }
@@ -1012,7 +1013,6 @@ function mergePrincipal(target, source) {
1012
1013
  }
1013
1014
  }
1014
1015
  }
1015
- exports.mergePrincipal = mergePrincipal;
1016
1016
  /**
1017
1017
  * Detect if the PrincipalProps array contains the StarPrincipal:
1018
1018
  * type = PrincipalType.ANY and identifiers = ["*"]
@@ -1029,4 +1029,4 @@ function hasStarPrincipal(principals) {
1029
1029
  }
1030
1030
  return false;
1031
1031
  }
1032
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ2tCLFVBQWlDO0lBQ2pEOzs7T0FHRztJQUNhLGFBQXlCLEVBQUU7UUFMM0IsZUFBVSxHQUFW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RSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBekNELHdDQXlDQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBNEI7SUFDcEQsMEZBQTBGO0lBQzFGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQ0UsU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsR0FBRztZQUNwQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUNoQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJRGVwZW5kYWJsZSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IElPcGVuSWRDb25uZWN0UHJvdmlkZXIgfSBmcm9tIFwiLi9vaWRjLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBJUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktZG9jdW1lbnRcIjtcbmltcG9ydCB7XG4gIFBvbGljeVN0YXRlbWVudCxcbiAgQ29uZGl0aW9uLFxuICBDb25kaXRpb25zLFxuICBpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3MsXG4gIHRvQ29uZGl0aW9uSnNvbixcbiAgZnJvbUNvbmRpdGlvbkpzb24sXG4gIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0LFxuICBDb25kaXRpb25NYXAsXG4gIHRvQ29uZGl0aW9ucyxcbn0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudFwiO1xuaW1wb3J0IHsgSVNhbWxQcm92aWRlciB9IGZyb20gXCIuL3NhbWwtcHJvdmlkZXJcIjtcbi8qKlxuICogVGVycmFmb3JtIFByaW5jaXBhbCBQcm9wc1xuICpcbiAqIFRoZSBgcHJpbmNpcGFsc2AgYW5kIGBub3RfcHJpbmNpcGFsc2AgYmxvY2tzIG9mIGEgcG9saWN5IHN0YXRlbWVudFxuICpcbiAqIFJlZjogaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvbGF0ZXN0L2RvY3MvZGF0YS1zb3VyY2VzL2lhbV9wb2xpY3lfZG9jdW1lbnQjcHJpbmNpcGFscy1hbmQtbm90X3ByaW5jaXBhbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmluY2lwYWxQcm9wcyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGlkZW50aWZpZXJzIGZvciBwcmluY2lwYWxzLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQVdTLCB0aGVzZSBhcmUgSUFNIHByaW5jaXBhbCBBUk5zLCBlLmcuLCBhcm46YXdzOmlhbTo6MTIzNDU2Nzg5MDE6cm9sZS95YWstcm9sZS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIFNlcnZpY2UsIHRoZXNlIGFyZSBBV1MgU2VydmljZSByb2xlcywgZS5nLiwgbGFtYmRhLmFtYXpvbmF3cy5jb20uXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBGZWRlcmF0ZWQsIHRoZXNlIGFyZSB3ZWIgaWRlbnRpdHkgdXNlcnMgb3IgU0FNTCBwcm92aWRlciBBUk5zLFxuICAgKiBlLmcuLCBhY2NvdW50cy5nb29nbGUuY29tIG9yIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpzYW1sLXByb3ZpZGVyL3lhay1zYW1sLXByb3ZpZGVyLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQ2Fub25pY2FsVXNlciwgdGhlc2UgYXJlIGNhbm9uaWNhbCB1c2VyIElEcyxcbiAgICogZS5nLiwgNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZS5cbiAgICpcbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNpZGVudGlmaWVycyBEYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQjaWRlbnRpZmllcnN9XG4gICAqL1xuICByZWFkb25seSBpZGVudGlmaWVyczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUeXBlIG9mIHByaW5jaXBhbC5cbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCN0eXBlIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCN0eXBlfVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogUHJpbmNpcGFsVHlwZTtcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsVHlwZSB7XG4gIEFXUyA9IFwiQVdTXCIsXG4gIEZFREVSQVRFRCA9IFwiRmVkZXJhdGVkXCIsXG4gIFNFUlZJQ0UgPSBcIlNlcnZpY2VcIixcbiAgQ0FOT05JQ0FMVVNFUiA9IFwiQ2Fub25pY2FsVXNlclwiLFxuICBBTlkgPSBcIipcIixcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFByaW5jaXBhbFR5cGUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cHBlckNhc2VWYWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB1cHBlckNhc2VWYWx1ZSBpbiBQcmluY2lwYWxUeXBlO1xufVxuXG4vKipcbiAqIEFueSBvYmplY3QgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBwcmluY2lwYWwgdGhhdCBhIHBlcm1pc3Npb24gY2FuIGJlIGdyYW50ZWQgdG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2dpY2FsIElBTSBwcmluY2lwYWwuXG4gKlxuICogQW4gSVByaW5jaXBhbCBkZXNjcmliZXMgYSBsb2dpY2FsIGVudGl0eSB0aGF0IGNhbiBwZXJmb3JtIEFXUyBBUEkgY2FsbHNcbiAqIGFnYWluc3Qgc2V0cyBvZiByZXNvdXJjZXMsIG9wdGlvbmFsbHkgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIEV4YW1wbGVzIG9mIHNpbXBsZSBwcmluY2lwYWxzIGFyZSBJQU0gb2JqZWN0cyB0aGF0IHlvdSBjcmVhdGUsIHN1Y2hcbiAqIGFzIFVzZXJzIG9yIFJvbGVzLlxuICpcbiAqIEFuIGV4YW1wbGUgb2YgYSBtb3JlIGNvbXBsZXggcHJpbmNpcGFscyBpcyBhIGBTZXJ2aWNlUHJpbmNpcGFsYCAoc3VjaCBhc1xuICogYG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwic25zLmFtYXpvbmF3cy5jb21cIilgLCB3aGljaCByZXByZXNlbnRzIHRoZSBTaW1wbGVcbiAqIE5vdGlmaWNhdGlvbnMgU2VydmljZSkuXG4gKlxuICogQSBzaW5nbGUgbG9naWNhbCBQcmluY2lwYWwgbWF5IGFsc28gbWFwIHRvIGEgc2V0IG9mIHBoeXNpY2FsIHByaW5jaXBhbHMuXG4gKiBGb3IgZXhhbXBsZSwgYG5ldyBPcmdhbml6YXRpb25QcmluY2lwYWwoJ28tMTIzNCcpYCByZXByZXNlbnRzIGFsbFxuICogaWRlbnRpdGllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBnaXZlbiBBV1MgT3JnYW5pemF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQcmluY2lwYWwgZXh0ZW5kcyBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBQcmluY2lwYWwgaXMgdXNlZCBpbiBhbiBBc3N1bWVSb2xlIHBvbGljeSwgdGhlIGFjdGlvbiB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcG9saWN5IGZyYWdtZW50IHRoYXQgaWRlbnRpZmllcyB0aGlzIHByaW5jaXBhbCBpbiBhIFBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogVGhlIEFXUyBhY2NvdW50IElEIG9mIHRoaXMgcHJpbmNpcGFsLlxuICAgKiBDYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIGFjY291bnQgaXMgbm90IGtub3duXG4gICAqIChmb3IgZXhhbXBsZSwgZm9yIHNlcnZpY2UgcHJpbmNpcGFscykuXG4gICAqIENhbiBiZSBhIFRva2VuIC0gaW4gdGhhdCBjYXNlLFxuICAgKiBpdCdzIGFzc3VtZWQgdG8gYmUgYSByZWZlcmVuY2UgdG8gdGhlIERhdGFBd3NDYWxsZXJJZGVudGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlbWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHRoZSBwcmluY2lwYWwgaW5cbiAgICogcXVlc3Rpb24gZG9lcyBub3QgaGF2ZSBhIHBvbGljeSBkb2N1bWVudCB0byBhZGQgdGhlIHN0YXRlbWVudCB0by5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBhZGRUb1ByaW5jaXBhbFBvbGljeWAgaW5zdGVhZC5cbiAgICovXG4gIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqL1xuICBhZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0O1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB0aGUgZmllbGRzIGluIGEgUG9saWN5U3RhdGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBwcmluY2lwYWwuXG4gKlxuICogVGhpcyBjb25zaXN0cyBvZiB0aGUgVGVycmFmb3JtIFByaW5jaXBhbFByb3BzIHJlcHJlc2VudGluZyB0aGVcbiAqIGBwcmluY2lwYWxzYCBibG9jayhzKSBpbiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gKlxuICogR2VuZXJhbGx5LCBBV1MgcHJpbmNpcGFsIEpTT04gbG9va3MgbGlrZTpcbiAqXG4gKiAgICAgeyAnPFRZUEU+JzogWydJRCcsICdJRCcsIC4uLl0gfVxuICpcbiAqIEFuZCB0aGlzIGlzIGFsc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGBwcmluY2lwYWxKc29uYC5cbiAqXG4gKiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBpcyBqdXN0IHRoZSBzdHJpbmcgJyonLFxuICogd2hpY2ggaXMgdHJlYXRlZCBkaWZmZXJlbnRseSBieSBzb21lIHNlcnZpY2VzLlxuICpcbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCwgYHByaW5jaXBhbEpzb25gIHNob3VsZCBjb250YWluIGAqYC5cbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCBpbiBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKSwgdGhlXG4gKiB0eXBlIHNob3VsZCBiZSBgUHJpbmNpcGFsVHlwZS5BTllgIGFuZCB0aGUgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGBbJyonXWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKU09OIG9iamVjdCB3aXRoIHRoZSBBV1MgSUFNIFByaW5jaXBhbCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogUmVmZXIgdG8gdGhlIGBmcm9tUHJpbmNpcGFsSnNvbmAgYW5kIGBmcm9tQ29uZGl0aW9uSnNvbmAgZnVuY3Rpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKFxuICAgIHByaW5jaXBhbEpzb246IGFueSxcbiAgICBjb25kaXRpb25zSnNvbjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICApOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb24pLFxuICAgICAgZnJvbUNvbmRpdGlvbkpzb24oY29uZGl0aW9uc0pzb24pLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhY3R1YWxseSBiZSB1c2VkIGFueXdoZXJlP1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbEpzb24oKTogQXdzUHJpbmNpcGFsSnNvbiB7XG4gICAgcmV0dXJuIHRvUHJpbmNpcGFsSnNvbiguLi50aGlzLnByaW5jaXBhbHMpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9uc0pzb24oKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9uSnNvbiguLi50aGlzLmNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIEFycmF5IG9mIFwicHJpbmNpcGFsc1wiIGJsb2NrIGluIGEgcG9saWN5IHN0YXRlbWVudFxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBjb25kaXRpb25zIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkIHRvIHRoaXMgcG9saWN5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsczogQXJyYXk8UHJpbmNpcGFsUHJvcHM+LFxuICAgIC8qKlxuICAgICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHt9XG59XG5cbi8qKlxuICogVHlwZWQgcmVwcmVzZW50YXRpb24gb2YgQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCB0eXBlIEF3c1ByaW5jaXBhbEpzb24gPSBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG5cbi8qKlxuICogUmVhZCBmcm9tIEFXUyBQcmluY2lwYWwgSlNPTiB0byBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKVxuICpcbiAqIEhhbmRsZXMgc3BlY2lhbCBjYXNlOiBpZiBwcmluY2lwYWwgaXMgXCIqXCIgYW5kIHR1cm5zIGl0IGludG8gdGhlIGBTdGFyUHJpbmNpcGFsYCxcbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgSUFNIERvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgXCJQcmluY2lwYWxcIjogXCIqXCIgYW5kIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0gYXJlIGVxdWl2YWxlbnQsXG4gKiB0aG9zZSBwcmluY2lwYWwgZWxlbWVudHMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaW4gc29tZSBzaXR1YXRpb25zLCBlLmcuLCBJQU0gUm9sZSBUcnVzdCBQb2xpY3kuXG4gKlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiBcIipcIiwgdXNlIHR5cGUgPSBcIipcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiB7XCJBV1NcIjogXCIqXCJ9LCB1c2UgdHlwZSA9IFwiQVdTXCIgYW5kIGlkZW50aWZpZXJzID0gW1wiKlwiXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb246IGFueSA9IHt9KTogUHJpbmNpcGFsUHJvcHNbXSB7XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChwcmluY2lwYWxKc29uID09PSBcIipcIikge1xuICAgICAgcmV0dXJuIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgaGFuZGxlIG90aGVyIHNjZW5hcmlvcyAoaS5lLiBUb2tlbnM/KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaW5jaXBhbCB0eXBlOiAke3ByaW5jaXBhbEpzb259YCk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBKU09OIElBTSBwcmluY2lwYWwgc2hvdWxkIGJlIGFuIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJpbmNpcGFsSnNvbil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBpZGVudGlmaWVyc10gb2YgT2JqZWN0LmVudHJpZXMocHJpbmNpcGFsSnNvbikpIHtcbiAgICBpZiAoIWlzVmFsaWRQcmluY2lwYWxUeXBlKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7a2V5fSwgdmFsaWQgdmFsdWVzIGFyZTogJHtPYmplY3QudmFsdWVzKFByaW5jaXBhbFR5cGUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBpZGVudGlmaWVyczogQXJyYXkuaXNBcnJheShpZGVudGlmaWVycykgPyBpZGVudGlmaWVycyA6IFtpZGVudGlmaWVyc10sXG4gICAgICB0eXBlOiBrZXkgYXMgUHJpbmNpcGFsVHlwZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgVGVycmFmb3JtIHByaW5jaXBhbHMgYmxvY2tzIGJhY2sgdG8gQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1ByaW5jaXBhbEpzb24oXG4gIC4uLnByaW5jaXBhbFByb3BzOiBQcmluY2lwYWxQcm9wc1tdXG4pOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgaWYgKFxuICAgIHByaW5jaXBhbFByb3BzLmxlbmd0aCA9PT0gMSAmJlxuICAgIHByaW5jaXBhbFByb3BzWzBdLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gIClcbiAgICByZXR1cm4gXCIqXCI7XG5cbiAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFsUHJvcHMpIHtcbiAgICByZXN1bHRbcHJpbmNpcGFsLnR5cGVdID1cbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF1cbiAgICAgICAgOiBwcmluY2lwYWwuaWRlbnRpZmllcnM7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHR5cGUgb2YgcHJpbmNpcGFsIHRoYXQgaGFzIG1vcmUgY29udHJvbCBvdmVyIGl0cyBvd24gcmVwcmVzZW50YXRpb24gaW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50c1xuICpcbiAqIE1vcmUgY29tcGxleCB0eXBlcyBvZiBpZGVudGl0eSBwcm92aWRlcnMgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciBSb2xlJ3MgcG9saWN5IGRvY3VtZW50c1xuICogdGhhbiBzaW1wbHkgYHsgRWZmZWN0OiAnQWxsb3cnLCBBY3Rpb246ICdBc3N1bWVSb2xlJywgUHJpbmNpcGFsOiA8V2hhdGV2ZXI+IH1gLlxuICpcbiAqIElmIHRoYXQgY29udHJvbCBpcyBuZWNlc3NhcnksIHRoZXkgY2FuIGltcGxlbWVudCBgSUFzc3VtZVJvbGVQcmluY2lwYWxgIHRvIGdldCBmdWxsXG4gKiBhY2Nlc3MgdG8gYSBSb2xlJ3MgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBc3N1bWVSb2xlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIHByaW5jaXBhbCB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50XG4gICAqXG4gICAqIEFkZCB0aGUgc3RhdGVtZW50cyB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IG5lY2Vzc2FyeSB0byBnaXZlIHRoaXMgcHJpbmNpcGFsXG4gICAqIHBlcm1pc3Npb25zIHRvIGFzc3VtZSB0aGUgZ2l2ZW4gcm9sZS5cbiAgICovXG4gIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2N1bWVudDogSVBvbGljeURvY3VtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY2FsbGluZyBgYWRkVG9QcmluY2lwYWxQb2xpY3lgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCB0byB0aGUgaWRlbnRpdHkncyBwb2xpY2llcy5cbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlbWVudEFkZGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXBlbmRhYmxlIHdoaWNoIGFsbG93cyBkZXBlbmRpbmcgb24gdGhlIHBvbGljeSBjaGFuZ2UgYmVpbmcgYXBwbGllZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFJlcXVpcmVkIGlmIGBzdGF0ZW1lbnRBZGRlZGAgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeURlcGVuZGFibGU/OiBJRGVwZW5kYWJsZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBwb2xpY3kgcHJpbmNpcGFsc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJpbmNpcGFsQmFzZSBpbXBsZW1lbnRzIElBc3N1bWVSb2xlUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmcgPSBcInN0czpBc3N1bWVSb2xlXCI7XG5cbiAgcHVibGljIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KS5zdGF0ZW1lbnRBZGRlZDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBfc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsXG4gICk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IHtcbiAgICAvLyBUaGlzIGJhc2UgY2xhc3MgaXMgdXNlZCBmb3Igbm9uLWlkZW50aXR5IHByaW5jaXBhbHMuIE5vbmUgb2YgdGhlbVxuICAgIC8vIGhhdmUgYSBQb2xpY3lEb2N1bWVudCB0byBhZGQgdG8uXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkIHtcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2xcbiAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFt0aGlzLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbdGhpc10sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmaXJzdCBwYXNzIHRvIG1ha2UgdGhlIG9iamVjdCByZWFkYWJsZS4gRGVzY2VuZGFudCBwcmluY2lwYWxzXG4gICAgLy8gc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbmljZXIuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbik7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyB1c2luZyB0aGlzIHByaW5jaXBhbCBhcyB0aGUgYmFzZSwgd2l0aCB0aGVcbiAgICogcGFzc2VkIGNvbmRpdGlvbnMgYWRkZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdGhlIHNhbWUgb3BlcmF0b3IgYW5kIGtleSBpbiBib3RoIHRoZSBwcmluY2lwYWwgYW5kIHRoZVxuICAgKiBjb25kaXRpb25zIHBhcmFtZXRlciwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgYSBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHdpdGhDb25kaXRpb25zKC4uLmNvbmRpdGlvbnM6IENvbmRpdGlvbnMpOiBQcmluY2lwYWxCYXNlIHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zKHRoaXMsIGNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgcHJpbmNpcGFsIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHNlc3Npb24gdGFncyBlbmFibGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aFNlc3Npb25UYWdzKCk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgU2Vzc2lvblRhZ3NQcmluY2lwYWwodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJpbmNpcGFsIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwZWNpZnkgYSBwcmluY2lwYWwgYnkgdGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pLlxuICogWW91IGNhbiBzcGVjaWZ5IEFXUyBhY2NvdW50cywgSUFNIHVzZXJzLCBGZWRlcmF0ZWQgU0FNTCB1c2VycywgSUFNIHJvbGVzLCBhbmQgc3BlY2lmaWMgYXNzdW1lZC1yb2xlIHNlc3Npb25zLlxuICogWW91IGNhbm5vdCBzcGVjaWZ5IElBTSBncm91cHMgb3IgaW5zdGFuY2UgcHJvZmlsZXMgYXMgcHJpbmNpcGFsc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19wcmluY2lwYWwuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQXJuUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBwcmluY2lwYWwgZW50aXR5IChpLmUuIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTI6dXNlci91c2VyLW5hbWUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuYXJuXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWwoJHt0aGlzLmFybn0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgYWRkaW5nIGEgY29uZGl0aW9uIHRoYXQgdGhlIHByaW5jaXBhbCBpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpZWRcbiAgICogQVdTIE9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBpbk9yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aENvbmRpdGlvbnMoe1xuICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgIHZhcmlhYmxlOiBcImF3czpQcmluY2lwYWxPcmdJRFwiLFxuICAgICAgdmFsdWVzOiBbb3JnYW5pemF0aW9uSWRdLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgQXJuUHJpbmNpcGFsOiR7dGhpcy5hcm59YDtcbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZnkgQVdTIGFjY291bnQgSUQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3kgdG8gZGVsZWdhdGUgYXV0aG9yaXR5IHRvIHRoZSBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgQVdTIGFjY291bnQgSUQgKGkuZS4gJzEyMzQ1Njc4OTAxMicpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBhbnkpIHtcbiAgICBzdXBlcihcbiAgICAgIG5ldyBBd3NTdGFja0RlcGVuZGVudFRva2VuKFxuICAgICAgICAoYXdzU3RhY2spID0+IGBhcm46JHthd3NTdGFjay5wYXJ0aXRpb259OmlhbTo6JHthY2NvdW50SWR9OnJvb3RgLFxuICAgICAgKS50b1N0cmluZygpLFxuICAgICk7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYWNjb3VudElkKSAmJiB0eXBlb2YgYWNjb3VudElkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhY2NvdW50SWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nXCIpO1xuICAgIH1cbiAgICB0aGlzLnByaW5jaXBhbEFjY291bnQgPSBhY2NvdW50SWQ7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBY2NvdW50UHJpbmNpcGFsKCR7dGhpcy5hY2NvdW50SWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIHNlcnZpY2UgcHJpbmNpcGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcmluY2lwYWxPcHRzIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gaW4gd2hpY2ggeW91IHdhbnQgdG8gcmVmZXJlbmNlIHRoZSBzZXJ2aWNlXG4gICAqXG4gICAqIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yICpjcm9zcy1yZWdpb24qIHJlZmVyZW5jZXMuXG4gICAqXG4gICAqIE5vdGU6IFdlIGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgc2VydmljZSBwcmluY2lwYWwgbmFtZSwgaW5jbHVkaW5nIHRoZSByZWdpb24uXG4gICAqIE5vcm1hbGx5LCB0aGUgcmVnaW9uIGlzIG9ubHkgcmVxdWlyZWQgZm9yICpvcHQtaW4qIHJlZ2lvbnMuIEluIHRob3NlXG4gICAqIGNhc2VzLCB0aGUgcmVnaW9uIG5hbWUgbmVlZHMgdG8gYmUgaW5jbHVkZWQgdG8gcmVmZXJlbmNlIHRoZSBjb3JyZWN0IHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBnbG9iYWwgc2VydmljZSBwcmluY2lwYWwgbmFtZSBpcyBzdWZmaWNpZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSByZXNvbHZpbmcgU3RhY2sncyByZWdpb24uXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgY29uZGl0aW9ucyB0byBhZGQgdG8gdGhlIFNlcnZpY2UgUHJpbmNpcGFsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29uZGl0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9ucz86IENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYW4gQVdTIHNlcnZpY2UgKGkuZS4gYHNxcy5hbWF6b25hd3MuY29tYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG5hbWUgYmFzZWQgb24gdGhlIHJlZ2lvbiBpdCdzIHVzZWQgaW4uXG4gICAqXG4gICAqIFNvbWUgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgdXNlZCB0byBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBwYXJ0aXRpb25zLFxuICAgKiBhbmQgc29tZSB3ZXJlIG5vdC5cbiAgICpcbiAgICogVGhlc2UgZGF5cyBhbGwgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgYXJlIHN0YW5kYXJkaXplZCwgYW5kIHRoZXkgYXJlIGFsbFxuICAgKiBvZiB0aGUgZm9ybSBgPHNlcnZpY2VuYW1lPi5hbWF6b25hd3MuY29tYC5cbiAgICpcbiAgICogVG8gYXZvaWQgYnJlYWtpbmcgY2hhbmdlcywgaGFuZGxpbmcgaXMgcHJvdmlkZWQgZm9yIHNlcnZpY2VzIGFkZGVkIHdpdGggdGhlIGZvcm1hdHMgYmVsb3csXG4gICAqIGhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgaGFuZGxpbmcgd2lsbCBiZSBhZGRlZCBmb3IgbmV3IHJlZ2lvbnMgb3IgcGFydGl0aW9ucy5cbiAgICogICAtIHMzXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tLmNuXG4gICAqICAgLSBzMy5jMnMuaWMuZ292XG4gICAqICAgLSBzMy5zYzJzLnNnb3YuZ292XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHByaW5jaXBhbE5hbWUgPSBpYW0uU2VydmljZVByaW5jaXBhbC5zZXJ2aWNlUHJpbmNpcGFsTmFtZSgnZWMyJyk7XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcnZpY2VQcmluY2lwYWxOYW1lKHNlcnZpY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4oc2VydmljZSwge30pLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIGFuIEFXUyBzZXJ2aWNlLCBvcHRpb25hbGx5IGluIGEgZ2l2ZW4gcmVnaW9uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIEFXUyBzZXJ2aWNlIChpLmUuIHNxcy5hbWF6b25hd3MuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IFNlcnZpY2VQcmluY2lwYWxPcHRzID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5TRVJWSUNFLFxuICAgICAgICAgIGlkZW50aWZpZXJzOiBbXG4gICAgICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbFRva2VuKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzKS50b1N0cmluZygpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGhpcy5vcHRzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWwoJHt0aGlzLnNlcnZpY2V9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBTZXJ2aWNlUHJpbmNpcGFsOiR7dGhpcy5zZXJ2aWNlfToke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0cyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1MgT3JnYW5pemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKElEKSBvZiBhbiBvcmdhbml6YXRpb24gKGkuZS4gby0xMjM0NWFiY2RlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICAgICAgdmFsdWVzOiBbdGhpcy5vcmdhbml6YXRpb25JZF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWwoJHt0aGlzLm9yZ2FuaXphdGlvbklkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgT3JnYW5pemF0aW9uUHJpbmNpcGFsOiR7dGhpcy5vcmdhbml6YXRpb25JZH1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwb2xpY3kgcHJpbmNpcGFsIGZvciBjYW5vbmljYWxVc2VySWRzIC0gdXNlZnVsIGZvciBTMyBidWNrZXQgcG9saWNpZXMgdGhhdCB1c2VcbiAqIE9yaWdpbiBBY2Nlc3MgaWRlbnRpdGllcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL2FjY3QtaWRlbnRpZmllcnMuaHRtbFxuICpcbiAqIGFuZFxuICpcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLXMzLmh0bWxcbiAqXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENhbm9uaWNhbFVzZXJQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjYW5vbmljYWxVc2VySWQgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgQVdTIGZvciBldmVyeSBhY2NvdW50LlxuICAgKiAgIHJvb3QgdXNlciBhbmQgSUFNIHVzZXJzIGZvciBhbiBhY2NvdW50IGFsbCBzZWUgdGhlIHNhbWUgSUQuXG4gICAqICAgKGkuZS4gNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjYW5vbmljYWxVc2VySWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5DQU5PTklDQUxVU0VSLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuY2Fub25pY2FsVXNlcklkXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsKCR7dGhpcy5jYW5vbmljYWxVc2VySWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsOiR7dGhpcy5jYW5vbmljYWxVc2VySWR9YDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIHN1Y2ggYXMgQW1hem9uIENvZ25pdG8sXG4gKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGVtcG9yYXJ5IHNlY3VyaXR5IGNyZWRlbnRpYWxzIHRvIHVzZXJzIHdobyBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC5cbiAqIEFkZGl0aW9uYWwgY29uZGl0aW9uIGtleXMgYXJlIGF2YWlsYWJsZSB3aGVuIHRoZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHVzZWQgdG8gbWFrZSBhIHJlcXVlc3QuXG4gKiBZb3UgY2FuIHVzZSB0aGVzZSBrZXlzIHRvIHdyaXRlIHBvbGljaWVzIHRoYXQgbGltaXQgdGhlIGFjY2VzcyBvZiBmZWRlcmF0ZWQgdXNlcnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2lhbS1jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXdpZlxuICovXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZmVkZXJhdGVkIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBzZXNzaW9uVGFncyBXaGV0aGVyIHRvIGVuYWJsZSBzZXNzaW9uIHRhZ2dpbmcgKHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmVkZXJhdGVkOiBzdHJpbmcsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICAgIGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29uZGl0aW9ucyA9IGNvbmRpdGlvbnM7XG4gICAgdGhpcy5hc3N1bWVSb2xlQWN0aW9uID0gYXNzdW1lUm9sZUFjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEZlZGVyYXRlZFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsOiR7dGhpcy5mZWRlcmF0ZWR9OiR7dGhpcy5hc3N1bWVSb2xlQWN0aW9ufToke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBXZWIgSWRlbnRpdHkgc3VjaCBhcyBDb2duaXRvLCBBbWF6b24sXG4gKiBGYWNlYm9vaywgR29vZ2xlLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJJZGVudGl0eVByaW5jaXBhbCBleHRlbmRzIEZlZGVyYXRlZFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHlQcm92aWRlciBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiAgIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5UHJvdmlkZXI6IHN0cmluZywgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdKSB7XG4gICAgc3VwZXIoaWRlbnRpdHlQcm92aWRlciwgY29uZGl0aW9ucyA/PyB7fSwgXCJzdHM6QXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFdlYklkZW50aXR5UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgYXMgZnJvbSBhIE9wZW5JRCBDb25uZWN0IHByb3ZpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbklkQ29ubmVjdFByaW5jaXBhbCBleHRlbmRzIFdlYklkZW50aXR5UHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcGVuSWRDb25uZWN0UHJvdmlkZXIgT3BlbklEIENvbm5lY3QgcHJvdmlkZXJcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgb3BlbklkQ29ubmVjdFByb3ZpZGVyOiBJT3BlbklkQ29ubmVjdFByb3ZpZGVyLFxuICAgIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSxcbiAgKSB7XG4gICAgc3VwZXIob3BlbklkQ29ubmVjdFByb3ZpZGVyLm9wZW5JZENvbm5lY3RQcm92aWRlckFybiwgY29uZGl0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5GRURFUkFURUQsIGlkZW50aWZpZXJzOiBbdGhpcy5mZWRlcmF0ZWRdIH1dLFxuICAgICAgdGhpcy5jb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcGVuSWRDb25uZWN0UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sUHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIoc2FtbFByb3ZpZGVyLnNhbWxQcm92aWRlckFybiwgY29uZGl0aW9ucywgXCJzdHM6QXNzdW1lUm9sZVdpdGhTQU1MXCIpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2FtbFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBTQU1MIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBmb3JcbiAqIHByb2dyYW1tYXRpYyBhbmQgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sQ29uc29sZVByaW5jaXBhbCBleHRlbmRzIFNhbWxQcmluY2lwYWwge1xuICAvKipcbiAgICogZW51bSBQYXJ0aXRpb24ge1xuICAgKiAgIERlZmF1bHQgPSAnYXdzJyxcbiAgICogICBDbiA9ICdhd3MtY24nLFxuICAgKiAgIFVzR292ID0gJ2F3cy11cy1nb3YnLFxuICAgKiAgIFVzSXNvID0gJ2F3cy1pc28nLFxuICAgKiAgIFVzSXNvQiA9ICdhd3MtaXNvLWInLFxuICAgKiAgIFVzSXNvRiA9ICdhd3MtaXNvLWYnLFxuICAgKiAgIEV1SXNvRSA9ICdhd3MtaXNvLWUnLFxuICAgKiB9XG4gICAqIFNBTUwgU2lnbiBPbiB1cmxzIGNvdWxkIGJlLi4uXG4gICAqIFtQYXJ0aXRpb24uRGVmYXVsdF06ICdodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Dbl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MuY24vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNHb3ZdOiAnaHR0cHM6Ly9zaWduaW4uYW1hem9uYXdzLXVzLWdvdi5jb20vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29dOiAnaHR0cHM6Ly9zaWduaW4uYzJzaG9tZS5pYy5nb3Yvc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29CXTogJ2h0dHBzOi8vc2lnbmluLnNjMnNob21lLnNnb3YuZ292L3NhbWwnLFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHNhbWxQcm92aWRlciBUaGUgU0FNTCBwcm92aWRlclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIsIFtcbiAgICAgIC4uLmNvbmRpdGlvbnMsXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgY29sbGlzaW9ucyBvbiBcIlNBTUw6YXVkXCI/XG4gICAgICB7XG4gICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgIHZhcmlhYmxlOiBcIlNBTUw6YXVkXCIsXG4gICAgICAgIHZhbHVlczogW1wiaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbFwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sQ29uc29sZVByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogVXNlIHRoZSBBV1MgYWNjb3VudCBpbnRvIHdoaWNoIGEgc3RhY2sgaXMgZGVwbG95ZWQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3lcbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnRSb290UHJpbmNpcGFsIGV4dGVuZHMgQWNjb3VudFByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oKGF3c1N0YWNrKSA9PiBhd3NTdGFjay5hY2NvdW50KS50b1N0cmluZygpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQWNjb3VudFJvb3RQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBBV1MgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6ICcqJ2BcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYEFueVByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiB7IEFXUzogXCIqXCIgfWAuIFRoaXMgaXMgY29ycmVjdFxuICogbW9zdCBvZiB0aGUgdGltZSwgYnV0IGluIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBvdGhlciBwcmluY2lwYWwsXG4gKiB1c2UgYFN0YXJQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlQcmluY2lwYWwgZXh0ZW5kcyBBcm5QcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIipcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQW55UHJpbmNpcGFsKClcIjtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHJlcHJlc2VudGluZyBhbGwgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqIEBkZXByZWNhdGVkIHVzZSBgQW55UHJpbmNpcGFsYFxuICovXG5leHBvcnQgY2xhc3MgQW55b25lIGV4dGVuZHMgQW55UHJpbmNpcGFsIHt9XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCB1c2VzIGEgbGl0ZXJhbCAnKicgaW4gdGhlIElBTSBKU09OIGxhbmd1YWdlXG4gKlxuICogU29tZSBzZXJ2aWNlcyBiZWhhdmUgZGlmZmVyZW50bHkgd2hlbiB5b3Ugc3BlY2lmeSBgUHJpbmNpcGFsOiBcIipcImBcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYFN0YXJQcmluY2lwYWxgIHJlbmRlcnMgdG8gYFByaW5jaXBhbDogKmAuIE1vc3Qgb2YgdGhlIHRpbWUsIHlvdVxuICogc2hvdWxkIHVzZSBgQW55UHJpbmNpcGFsYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgU3RhclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50ID1cbiAgICBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkFOWSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFtcIipcIl0sXG4gICAgICB9LFxuICAgIF0pO1xuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsKClcIjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHJpbmNpcGFsIHRoYXQgaGFzIG11bHRpcGxlIHR5cGVzIG9mIHByaW5jaXBhbHMuIEEgY29tcG9zaXRlIHByaW5jaXBhbCBjYW5ub3RcbiAqIGhhdmUgY29uZGl0aW9ucy4gaS5lLiBtdWx0aXBsZSBTZXJ2aWNlUHJpbmNpcGFscyB0aGF0IGZvcm0gYSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJpbmNpcGFscyA9IG5ldyBBcnJheTxJUHJpbmNpcGFsPigpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLnByaW5jaXBhbHM6IElQcmluY2lwYWxbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHByaW5jaXBhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ29tcG9zaXRlUHJpbmNpcGFscyBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYXQgbGVhc3QgMSBQcmluY2lwYWwgYnV0IG5vbmUgd2VyZSBwYXNzZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBwcmluY2lwYWxzWzBdLmFzc3VtZVJvbGVBY3Rpb247XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKC4uLnByaW5jaXBhbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgSUFNIHByaW5jaXBhbHMgdG8gdGhlIGNvbXBvc2l0ZSBwcmluY2lwYWwuIENvbXBvc2l0ZSBwcmluY2lwYWxzIGNhbm5vdCBoYXZlXG4gICAqIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIElBTSBwcmluY2lwYWxzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKTogdGhpcyB7XG4gICAgdGhpcy5fcHJpbmNpcGFscy5wdXNoKC4uLnByaW5jaXBhbHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9wcmluY2lwYWxzKSB7XG4gICAgICBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKHAsIGRvYyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgLy8gV2Ugb25seSBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbmRpdGlvbnMgaWYgd2UgYXJlIHRyeWluZyB0byByZW5kZXIgY29tcG9zaXRlXG4gICAgLy8gcHJpbmNpcGFscyBpbnRvIGEgc2luZ2xlIHN0YXRlbWVudCAod2hpY2ggaXMgd2hlbiBgcG9saWN5RnJhZ21lbnRgIHdvdWxkIGdldCBjYWxsZWQpXG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gcC5wb2xpY3lGcmFnbWVudDtcbiAgICAgIGlmIChmcmFnbWVudC5jb25kaXRpb25zICYmIGZyYWdtZW50LmNvbmRpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb21wb25lbnRzIG9mIGEgQ29tcG9zaXRlUHJpbmNpcGFsIG11c3Qgbm90IGhhdmUgY29uZGl0aW9ucy4gXCIgK1xuICAgICAgICAgICAgYFRyaWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZyYWdtZW50OiAke0pTT04uc3RyaW5naWZ5KGZyYWdtZW50KX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBuZXcgQXJyYXk8UHJpbmNpcGFsUHJvcHM+KCk7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIG1lcmdlUHJpbmNpcGFsKHByaW5jaXBhbHMsIHAucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQocHJpbmNpcGFscyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDb21wb3NpdGVQcmluY2lwYWwoJHt0aGlzLl9wcmluY2lwYWxzfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gdGhpcy5fcHJpbmNpcGFscy5tYXAoQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IpO1xuICAgIGlmIChpbm5lci5zb21lKCh4KSA9PiB4ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbFske2lubmVyLmpvaW4oXCIsXCIpfV1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByaW5jaXBhbHMgdGhhdCBtYWtlIHVwIHRoZSBDb21wb3NpdGVQcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgUHJpbmNpcGFscyB0aGF0IHdyYXAgb3RoZXIgcHJpbmNpcGFsc1xuICovXG5hYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxBZGFwdGVyIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uID0gdGhpcy53cmFwcGVkLmFzc3VtZVJvbGVBY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50ID0gdGhpcy53cmFwcGVkLnByaW5jaXBhbEFjY291bnQ7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHdyYXBwZWQ6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5wb2xpY3lGcmFnbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgd3JhcHBlZCBwcmluY2lwYWwncyBkZWR1cGUgc3RyaW5nIChpZiBhdmFpbGFibGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwZW5kRGVkdXBlKGFwcGVuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbm5lciA9IENvbXBhcmFibGVQcmluY2lwYWwuZGVkdXBlU3RyaW5nRm9yKHRoaXMud3JhcHBlZCk7XG4gICAgcmV0dXJuIGlubmVyICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfToke2lubmVyfToke2FwcGVuZH1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgcHJpbmNpcGFscyB0aGF0IGNhbiBiZSBjb21wYXJlZC5cbiAqXG4gKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIHByaW5jaXBhbHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSB2YWx1ZS1lcXVhbC5cbiAqIElkZW50aXR5LWVxdWFsIHByaW5jaXBhbHMgd2lsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21wYXJhYmxlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzdHJpbmcgZm9ybWF0IG9mIHRoaXMgcHJpbmNpcGFsIHdoaWNoIHNob3VsZCBiZSBpZGVudGljYWwgaWYgdGhlIHR3b1xuICAgKiBwcmluY2lwYWxzIGFyZSB0aGUgc2FtZS5cbiAgICovXG4gIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggYElDb21wYXJhYmxlUHJpbmNpcGFsYHNcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBhcmFibGVQcmluY2lwYWwge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHByaW5jaXBhbCBpcyBhIGNvbXBhcmFibGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ29tcGFyYWJsZVByaW5jaXBhbChcbiAgICB4OiBJUHJpbmNpcGFsLFxuICApOiB4IGlzIElDb21wYXJhYmxlUHJpbmNpcGFsIHtcbiAgICByZXR1cm4gXCJkZWR1cGVTdHJpbmdcIiBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGVkdXBlU3RyaW5nIG9mIHRoZSBnaXZlbiBwcmluY2lwYWwsIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWR1cGVTdHJpbmdGb3IoeDogSVByaW5jaXBhbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbXBhcmFibGVQcmluY2lwYWwuaXNDb21wYXJhYmxlUHJpbmNpcGFsKHgpXG4gICAgICA/IHguZGVkdXBlU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB3aXRoIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBzcGVjaWZ5aW5nIHdoZW4gdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9ucywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICovXG5leHBvcnQgY2xhc3MgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgZXh0ZW5kcyBQcmluY2lwYWxBZGFwdGVyIHtcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpbmNpcGFsOiBJUHJpbmNpcGFsLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIocHJpbmNpcGFsKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGlmIChkb2Mubm9kZS5zY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCBhIGNvbmRpdGlvbiB0byBhIHByaW5jaXBhbCBvdXRzaWRlIG9mIGEgc3RhY2sgc2NvcGVcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnModGhpcy5hc3N1bWVSb2xlQWN0aW9uKTtcbiAgICAgICAgc3RhdGVtZW50LmFkZENvbmRpdGlvbnMoLi4udGhpcy5jb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XSA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZGl0aW9uID1cbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV07XG4gICAgaWYgKGV4aXN0aW5nQ29uZGl0aW9uKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0ge1xuICAgICAgICAuLi5leGlzdGluZ0NvbmRpdGlvbixcbiAgICAgICAgLi4uY29uZGl0aW9uLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IGNvbmRpdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uT2JqZWN0IHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogQSBjb25kaXRpb25PYmplY3QgaGFzIHRoZSBmb3JtYXQgb2YgdGVzdDogeyB2YXJpYWJsZTogdmFsdWUgfCB2YWx1ZXNbXSB9XG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBjb25kaXRpb24xID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogJzEnIH19O1xuICAgKiAvLyBvclxuICAgKiBjb25zdCBjb25kaXRpb24yID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogWycxJywgJzInXSB9fTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKHYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuIEdvdCAke3Z9IGZvciBrZXkgJHtrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICAgIHRlc3Q6IGtleSxcbiAgICAgICAgdmFyaWFibGU6IGssXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25zIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9ucyhjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgY29uZGl0aW9ucy5tYXAoKGMpID0+IHtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKGMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgY29uZGl0aW9uT2JqZWN0cyB0byB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFZhbHVlcyBmcm9tIHRoZSBjb25kaXRpb25zIHBhcmFtZXRlciB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBvcGVyYXRvclxuICAgKiBhbmQga2V5LlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHMoY29uZGl0aW9uczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25PYmplY3Qoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDb25kaXRpb25zKFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LmNvbmRpdGlvbnMsXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucykpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmRpdGlvbnMoXG4gICAgcHJpbmNpcGFsQ29uZGl0aW9uczogQ29uZGl0aW9ucyxcbiAgICBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwLFxuICApOiBDb25kaXRpb25zIHtcbiAgICBjb25zdCBtZXJnZWRDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcbiAgICBwcmluY2lwYWxDb25kaXRpb25zLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGlmICghbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdKSB7XG4gICAgICAgIG1lcmdlZENvbmRpdGlvbnNbYy50ZXN0XSA9IHt9O1xuICAgICAgfVxuICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdW2MudmFyaWFibGVdID0gYztcbiAgICB9KTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxDb25kaXRpb25zKS5mb3JFYWNoKChbdGVzdCwgY29uZGl0aW9uXSkgPT4ge1xuICAgICAgLy8gbWVyZ2UgdGhlIGNvbmRpdGlvbnMgaWYgb25lIG9mIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgdXNlcyBhblxuICAgICAgLy8gb3BlcmF0b3IgdGhhdCdzIGFscmVhZHkgdXNlZCBieSB0aGUgcHJpbmNpcGFsJ3MgY29uZGl0aW9ucyBtZXJnZSB0aGVcbiAgICAgIC8vIGlubmVyIHN0cnVjdHVyZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XSA9IGNvbmRpdGlvbjtcbiAgICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBTdXBwb3J0IElSZXNvbHZhYmxlIENvbmRpdGlvbj9cbiAgICAgIC8vIC8vIGlmIGVpdGhlciB0aGUgZXhpc3RpbmcgY29uZGl0aW9uIG9yIHRoZSBuZXcgb25lIGNvbnRhaW4gdW5yZXNvbHZlZFxuICAgICAgLy8gLy8gdG9rZW5zLCBmYWlsIHRoZSBtZXJnZS4gdGhpcyBpcyBhcyBmYXIgYXMgd2UgZ28gYXQgdGhpcyBwb2ludC5cbiAgICAgIC8vIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29uZGl0aW9uKSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoZXhpc3RpbmcpKSB7XG4gICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIC8vICAgICBgbXVsdGlwbGUgXCIke3Rlc3R9XCIgY29uZGl0aW9ucyBjYW5ub3QgYmUgbWVyZ2VkIGlmIG9uZSBvZiB0aGVtIGNvbnRhaW5zIGFuIHVucmVzb2x2ZWQgdG9rZW5gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBjb25kaXRpb24/XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChleGlzdGluZyk7XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChjb25kaXRpb24pO1xuXG4gICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0geyAuLi5leGlzdGluZywgLi4uY29uZGl0aW9uIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9ucyhtZXJnZWRDb25kaXRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgc2Vzc2lvbiB0YWdzIG9uIHJvbGUgYXNzdW1wdGlvbnMgZnJvbSBhIHByaW5jaXBhbFxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb24gdGFncywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnMoXCJzdHM6VGFnU2Vzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKFwiXCIpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgcHJpbmNpcGFsIHRvIGFuIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCBpbiB0aGUgcmlnaHQgd2F5XG4gKlxuICogRGVsZWdhdGUgdG8gdGhlIHByaW5jaXBhbCBpZiBpdCBjYW4gZG8gdGhlIGpvYiBpdHNlbGYsIGRvIGEgZGVmYXVsdCBqb2IgaWYgaXQgY2FuJ3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4gIGRvYzogSVBvbGljeURvY3VtZW50LFxuKSB7XG4gIGlmIChpc0Fzc3VtZVJvbGVQcmluY2lwYWwocHJpbmNpcGFsKSkge1xuICAgIC8vIFByaW5jaXBhbCBrbm93cyBob3cgdG8gYWRkIGl0c2VsZlxuICAgIHByaW5jaXBhbC5hZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcmluY2lwYWwgY2FuJ3QgYWRkIGl0c2VsZiwgd2UgZG8gaXQgZm9yIHRoZW1cbiAgICBkb2MuYWRkU3RhdGVtZW50cyhcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbcHJpbmNpcGFsLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbcHJpbmNpcGFsXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBc3N1bWVSb2xlUHJpbmNpcGFsKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4pOiBwcmluY2lwYWwgaXMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICByZXR1cm4gISEocHJpbmNpcGFsIGFzIElBc3N1bWVSb2xlUHJpbmNpcGFsKS5hZGRUb0Fzc3VtZVJvbGVQb2xpY3k7XG59XG5cbi8qKlxuICogQSBsYXp5IHRva2VuIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgU3RhY2sgdG8gZXZhbHVhdGVcbiAqL1xuY2xhc3MgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbiBpbXBsZW1lbnRzIElSZXNvbHZhYmxlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZuOiAoc3BlYzogQXdzU3RhY2spID0+IGFueSkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5mbihBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjb250ZXh0LnNjb3BlKSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04taWZ5IHRoZSB0b2tlblxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIFwiPHVucmVzb2x2ZWQtdG9rZW4+XCI7XG4gIH1cbn1cblxuY2xhc3MgU2VydmljZVByaW5jaXBhbFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMsXG4gICkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjdHg6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIGNvbnN0IGF3c1N0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QoY3R4LnNjb3BlKTtcbiAgICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgT3B0LUluIHJlZ2lvbnM/P1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3ByaW5jaXBhbHMudHMjTDUwNi1MNTEwXG4gICAgcmV0dXJuIGF3c1N0YWNrLnNlcnZpY2VQcmluY2lwYWxOYW1lKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzLnJlZ2lvbik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMsIHtcbiAgICAgIGRpc3BsYXlIaW50OiB0aGlzLnNlcnZpY2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gYDwke3RoaXMuc2VydmljZX0+YDtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBhcnJheXMgdGhhdCByZXByZXNlbnQgSUFNIHByaW5jaXBhbHNcbiAqXG4gKiBEb2VzIGFuIGluLXBsYWNlIG1lcmdlIGludG8gdGFyZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmluY2lwYWwoXG4gIHRhcmdldDogUHJpbmNpcGFsUHJvcHNbXSxcbiAgc291cmNlOiBQcmluY2lwYWxQcm9wc1tdLFxuKSB7XG4gIC8vIGlmIG9uZSByZXByZXNlbnRzIHRoZSBzdGFyUHJpbmNpcGFsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBlbXB0eVxuICBpZiAoXG4gICAgKGhhc1N0YXJQcmluY2lwYWwodGFyZ2V0KSAmJiBzb3VyY2UubGVuZ3RoID4gMCkgfHxcbiAgICAoaGFzU3RhclByaW5jaXBhbChzb3VyY2UpICYmIHRhcmdldC5sZW5ndGggPiAwKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IG1lcmdlIHByaW5jaXBhbHMgJHtKU09OLnN0cmluZ2lmeSh0YXJnZXQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfTsgaWYgb25lIHVzZXMgYSB0aGUgU3RhclByaW5jaXBhbCBzdHJpbmcgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0TWFwOiBNYXA8UHJpbmNpcGFsVHlwZSwgUHJpbmNpcGFsUHJvcHM+ID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiB0YXJnZXQpIHtcbiAgICB0YXJnZXRNYXAuc2V0KHByaW5jaXBhbC50eXBlLCBwcmluY2lwYWwpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQcmluY2lwYWwgb2Ygc291cmNlKSB7XG4gICAgY29uc3QgeyB0eXBlLCBpZGVudGlmaWVyczogc291cmNlSWRlbnRpZmllcnMgfSA9IHNvdXJjZVByaW5jaXBhbDtcbiAgICBpZiAodGFyZ2V0TWFwLmhhcyh0eXBlKSkge1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZW50aWZpZXJTZXQgPSBuZXcgU2V0KHRhcmdldE1hcC5nZXQodHlwZSkhLmlkZW50aWZpZXJzKTtcbiAgICAgIGZvciAoY29uc3QgaWQgb2Ygc291cmNlSWRlbnRpZmllcnMpIHtcbiAgICAgICAgdGFyZ2V0SW5kZW50aWZpZXJTZXQuYWRkKGlkKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IGlkZW50aWZpZXJzIGluLXBsYWNlXG4gICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5maW5kSW5kZXgoKHByaW5jaXBhbCkgPT4gcHJpbmNpcGFsLnR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0ge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IEFycmF5LmZyb20odGFyZ2V0SW5kZW50aWZpZXJTZXQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbLi4uc291cmNlSWRlbnRpZmllcnNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBQcmluY2lwYWxQcm9wcyBhcnJheSBjb250YWlucyB0aGUgU3RhclByaW5jaXBhbDpcbiAqIHR5cGUgPSBQcmluY2lwYWxUeXBlLkFOWSBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdXG4gKi9cbmZ1bmN0aW9uIGhhc1N0YXJQcmluY2lwYWwocHJpbmNpcGFsczogUHJpbmNpcGFsUHJvcHNbXSkge1xuICAvLyBUT0RPOiBEb2VzIGhhdmluZyBtb3JlIHRoYW4gMSBwcmluY2lwYWwgbWFrZSBzZW5zZSBpZiBvbmUgb2YgdGhlbSBpcyB0aGUgU3RhclByaW5jaXBhbD9cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByaW5jaXBhbHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJpbmNpcGFsID0gcHJpbmNpcGFsc1tpbmRleF07XG4gICAgaWYgKFxuICAgICAgcHJpbmNpcGFsLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
1032
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXNNQSw4Q0EyQkM7QUFLRCwwQ0FtQkM7QUE4N0JELDBFQWdCQztBQThFRCx3Q0F5Q0M7O0FBOXpDRCxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlB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O2dCQUNKLFdBQVcsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUE0QjtJQUNwRCwwRkFBMEY7SUFDMUYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFDRSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHO1lBQ3BDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDbEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ2hDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4sIElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0IHsgSU9wZW5JZENvbm5lY3RQcm92aWRlciB9IGZyb20gXCIuL29pZGMtcHJvdmlkZXJcIjtcbmltcG9ydCB7IElQb2xpY3lEb2N1bWVudCB9IGZyb20gXCIuL3BvbGljeS1kb2N1bWVudFwiO1xuaW1wb3J0IHtcbiAgUG9saWN5U3RhdGVtZW50LFxuICBDb25kaXRpb24sXG4gIENvbmRpdGlvbnMsXG4gIGlzU3RyaW5nT3JBcnJheU9mU3RyaW5ncyxcbiAgdG9Db25kaXRpb25Kc29uLFxuICBmcm9tQ29uZGl0aW9uSnNvbixcbiAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QsXG4gIENvbmRpdGlvbk1hcCxcbiAgdG9Db25kaXRpb25zLFxufSBmcm9tIFwiLi9wb2xpY3ktc3RhdGVtZW50XCI7XG5pbXBvcnQgeyBJU2FtbFByb3ZpZGVyIH0gZnJvbSBcIi4vc2FtbC1wcm92aWRlclwiO1xuLyoqXG4gKiBUZXJyYWZvcm0gUHJpbmNpcGFsIFByb3BzXG4gKlxuICogVGhlIGBwcmluY2lwYWxzYCBhbmQgYG5vdF9wcmluY2lwYWxzYCBibG9ja3Mgb2YgYSBwb2xpY3kgc3RhdGVtZW50XG4gKlxuICogUmVmOiBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy9sYXRlc3QvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNwcmluY2lwYWxzLWFuZC1ub3RfcHJpbmNpcGFsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW5jaXBhbFByb3BzIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgaWRlbnRpZmllcnMgZm9yIHByaW5jaXBhbHMuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBBV1MsIHRoZXNlIGFyZSBJQU0gcHJpbmNpcGFsIEFSTnMsIGUuZy4sIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpyb2xlL3lhay1yb2xlLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgU2VydmljZSwgdGhlc2UgYXJlIEFXUyBTZXJ2aWNlIHJvbGVzLCBlLmcuLCBsYW1iZGEuYW1hem9uYXdzLmNvbS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIEZlZGVyYXRlZCwgdGhlc2UgYXJlIHdlYiBpZGVudGl0eSB1c2VycyBvciBTQU1MIHByb3ZpZGVyIEFSTnMsXG4gICAqIGUuZy4sIGFjY291bnRzLmdvb2dsZS5jb20gb3IgYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxOnNhbWwtcHJvdmlkZXIveWFrLXNhbWwtcHJvdmlkZXIuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBDYW5vbmljYWxVc2VyLCB0aGVzZSBhcmUgY2Fub25pY2FsIHVzZXIgSURzLFxuICAgKiBlLmcuLCA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I2lkZW50aWZpZXJzIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCNpZGVudGlmaWVyc31cbiAgICovXG4gIHJlYWRvbmx5IGlkZW50aWZpZXJzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFR5cGUgb2YgcHJpbmNpcGFsLlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I3R5cGUgRGF0YUF3c0lhbVBvbGljeURvY3VtZW50I3R5cGV9XG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQcmluY2lwYWxUeXBlO1xufVxuXG5leHBvcnQgZW51bSBQcmluY2lwYWxUeXBlIHtcbiAgQVdTID0gXCJBV1NcIixcbiAgRkVERVJBVEVEID0gXCJGZWRlcmF0ZWRcIixcbiAgU0VSVklDRSA9IFwiU2VydmljZVwiLFxuICBDQU5PTklDQUxVU0VSID0gXCJDYW5vbmljYWxVc2VyXCIsXG4gIEFOWSA9IFwiKlwiLFxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUHJpbmNpcGFsVHlwZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVwcGVyQ2FzZVZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIHVwcGVyQ2FzZVZhbHVlIGluIFByaW5jaXBhbFR5cGU7XG59XG5cbi8qKlxuICogQW55IG9iamVjdCB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIHByaW5jaXBhbCB0aGF0IGEgcGVybWlzc2lvbiBjYW4gYmUgZ3JhbnRlZCB0b1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElHcmFudGFibGUge1xuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvZ2ljYWwgSUFNIHByaW5jaXBhbC5cbiAqXG4gKiBBbiBJUHJpbmNpcGFsIGRlc2NyaWJlcyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgY2FuIHBlcmZvcm0gQVdTIEFQSSBjYWxsc1xuICogYWdhaW5zdCBzZXRzIG9mIHJlc291cmNlcywgb3B0aW9uYWxseSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuXG4gKlxuICogRXhhbXBsZXMgb2Ygc2ltcGxlIHByaW5jaXBhbHMgYXJlIElBTSBvYmplY3RzIHRoYXQgeW91IGNyZWF0ZSwgc3VjaFxuICogYXMgVXNlcnMgb3IgUm9sZXMuXG4gKlxuICogQW4gZXhhbXBsZSBvZiBhIG1vcmUgY29tcGxleCBwcmluY2lwYWxzIGlzIGEgYFNlcnZpY2VQcmluY2lwYWxgIChzdWNoIGFzXG4gKiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJzbnMuYW1hem9uYXdzLmNvbVwiKWAsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFNpbXBsZVxuICogTm90aWZpY2F0aW9ucyBTZXJ2aWNlKS5cbiAqXG4gKiBBIHNpbmdsZSBsb2dpY2FsIFByaW5jaXBhbCBtYXkgYWxzbyBtYXAgdG8gYSBzZXQgb2YgcGh5c2ljYWwgcHJpbmNpcGFscy5cbiAqIEZvciBleGFtcGxlLCBgbmV3IE9yZ2FuaXphdGlvblByaW5jaXBhbCgnby0xMjM0JylgIHJlcHJlc2VudHMgYWxsXG4gKiBpZGVudGl0aWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdpdmVuIEFXUyBPcmdhbml6YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByaW5jaXBhbCBleHRlbmRzIElHcmFudGFibGUge1xuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnQgSUQgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqIENhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgYWNjb3VudCBpcyBub3Qga25vd25cbiAgICogKGZvciBleGFtcGxlLCBmb3Igc2VydmljZSBwcmluY2lwYWxzKS5cbiAgICogQ2FuIGJlIGEgVG9rZW4gLSBpbiB0aGF0IGNhc2UsXG4gICAqIGl0J3MgYXNzdW1lZCB0byBiZSBhIHJlZmVyZW5jZSB0byB0aGUgRGF0YUF3c0NhbGxlcklkZW50aXR5XG4gICAqL1xuICByZWFkb25seSBwcmluY2lwYWxBY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCwgZmFsc2UgaWYgdGhlIHByaW5jaXBhbCBpblxuICAgKiBxdWVzdGlvbiBkb2VzIG5vdCBoYXZlIGEgcG9saWN5IGRvY3VtZW50IHRvIGFkZCB0aGUgc3RhdGVtZW50IHRvLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFkZFRvUHJpbmNpcGFsUG9saWN5YCBpbnN0ZWFkLlxuICAgKi9cbiAgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICovXG4gIGFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQ7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHRoZSBmaWVsZHMgaW4gYSBQb2xpY3lTdGF0ZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBhIHByaW5jaXBhbC5cbiAqXG4gKiBUaGlzIGNvbnNpc3RzIG9mIHRoZSBUZXJyYWZvcm0gUHJpbmNpcGFsUHJvcHMgcmVwcmVzZW50aW5nIHRoZVxuICogYHByaW5jaXBhbHNgIGJsb2NrKHMpIGluIGEgcG9saWN5IHN0YXRlbWVudC5cbiAqXG4gKiBHZW5lcmFsbHksIEFXUyBwcmluY2lwYWwgSlNPTiBsb29rcyBsaWtlOlxuICpcbiAqICAgICB7ICc8VFlQRT4nOiBbJ0lEJywgJ0lEJywgLi4uXSB9XG4gKlxuICogQW5kIHRoaXMgaXMgYWxzbyB0aGUgdHlwZSBvZiB0aGUgZmllbGQgYHByaW5jaXBhbEpzb25gLlxuICpcbiAqIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIHByaW5jaXBhbCB0aGF0IGlzIGp1c3QgdGhlIHN0cmluZyAnKicsXG4gKiB3aGljaCBpcyB0cmVhdGVkIGRpZmZlcmVudGx5IGJ5IHNvbWUgc2VydmljZXMuXG4gKlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsLCBgcHJpbmNpcGFsSnNvbmAgc2hvdWxkIGNvbnRhaW4gYCpgLlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsIGluIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpLCB0aGVcbiAqIHR5cGUgc2hvdWxkIGJlIGBQcmluY2lwYWxUeXBlLkFOWWAgYW5kIHRoZSBpZGVudGlmaWVycyBzaG91bGQgYmUgYFsnKiddYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT04gb2JqZWN0IHdpdGggdGhlIEFXUyBJQU0gUHJpbmNpcGFsIHN0cnVjdHVyZVxuICAgKlxuICAgKiBSZWZlciB0byB0aGUgYGZyb21QcmluY2lwYWxKc29uYCBhbmQgYGZyb21Db25kaXRpb25Kc29uYCBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpzb24oXG4gICAgcHJpbmNpcGFsSnNvbjogYW55LFxuICAgIGNvbmRpdGlvbnNKc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbiksXG4gICAgICBmcm9tQ29uZGl0aW9uSnNvbihjb25kaXRpb25zSnNvbiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFNob3VsZCB0aGlzIGFjdHVhbGx5IGJlIHVzZWQgYW55d2hlcmU/XG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFsSnNvbigpOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgICByZXR1cm4gdG9QcmluY2lwYWxKc29uKC4uLnRoaXMucHJpbmNpcGFscyk7XG4gIH1cbiAgcHVibGljIGdldCBjb25kaXRpb25zSnNvbigpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdG9Db25kaXRpb25Kc29uKC4uLnRoaXMuY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgQXJyYXkgb2YgXCJwcmluY2lwYWxzXCIgYmxvY2sgaW4gYSBwb2xpY3kgc3RhdGVtZW50XG4gICAqIEBwYXJhbSBjb25kaXRpb25zIGNvbmRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBwb2xpY3lcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxzOiBBcnJheTxQcmluY2lwYWxQcm9wcz4sXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAgICogU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICkge31cbn1cblxuLyoqXG4gKiBUeXBlZCByZXByZXNlbnRhdGlvbiBvZiBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IHR5cGUgQXdzUHJpbmNpcGFsSnNvbiA9IHN0cmluZyB8IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcblxuLyoqXG4gKiBSZWFkIGZyb20gQVdTIFByaW5jaXBhbCBKU09OIHRvIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpXG4gKlxuICogSGFuZGxlcyBzcGVjaWFsIGNhc2U6IGlmIHByaW5jaXBhbCBpcyBcIipcIiBhbmQgdHVybnMgaXQgaW50byB0aGUgYFN0YXJQcmluY2lwYWxgLFxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBJQU0gRG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBcIlByaW5jaXBhbFwiOiBcIipcIiBhbmQgXCJQcmluY2lwYWxcIjoge1wiQVdTXCI6IFwiKlwifSBhcmUgZXF1aXZhbGVudCxcbiAqIHRob3NlIHByaW5jaXBhbCBlbGVtZW50cyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvciBpbiBzb21lIHNpdHVhdGlvbnMsIGUuZy4sIElBTSBSb2xlIFRydXN0IFBvbGljeS5cbiAqXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IFwiKlwiLCB1c2UgdHlwZSA9IFwiKlwiIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl0uXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0sIHVzZSB0eXBlID0gXCJBV1NcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbjogYW55ID0ge30pOiBQcmluY2lwYWxQcm9wc1tdIHtcbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHByaW5jaXBhbEpzb24gPT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BTlksIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBoYW5kbGUgb3RoZXIgc2NlbmFyaW9zIChpLmUuIFRva2Vucz8pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7cHJpbmNpcGFsSnNvbn1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEpTT04gSUFNIHByaW5jaXBhbCBzaG91bGQgYmUgYW4gb2JqZWN0LCBnb3QgJHtKU09OLnN0cmluZ2lmeShwcmluY2lwYWxKc29uKX1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFByaW5jaXBhbFByb3BzPigpO1xuICBmb3IgKGNvbnN0IFtrZXksIGlkZW50aWZpZXJzXSBvZiBPYmplY3QuZW50cmllcyhwcmluY2lwYWxKc29uKSkge1xuICAgIGlmICghaXNWYWxpZFByaW5jaXBhbFR5cGUoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwcmluY2lwYWwgdHlwZTogJHtrZXl9LCB2YWxpZCB2YWx1ZXMgYXJlOiAke09iamVjdC52YWx1ZXMoUHJpbmNpcGFsVHlwZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIGlkZW50aWZpZXJzOiBBcnJheS5pc0FycmF5KGlkZW50aWZpZXJzKSA/IGlkZW50aWZpZXJzIDogW2lkZW50aWZpZXJzXSxcbiAgICAgIHR5cGU6IGtleSBhcyBQcmluY2lwYWxUeXBlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydCBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9ja3MgYmFjayB0byBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJpbmNpcGFsSnNvbihcbiAgLi4ucHJpbmNpcGFsUHJvcHM6IFByaW5jaXBhbFByb3BzW11cbik6IEF3c1ByaW5jaXBhbEpzb24ge1xuICBpZiAoXG4gICAgcHJpbmNpcGFsUHJvcHMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0udHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgKVxuICAgIHJldHVybiBcIipcIjtcblxuICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxQcm9wcykge1xuICAgIHJlc3VsdFtwcmluY2lwYWwudHlwZV0gPVxuICAgICAgcHJpbmNpcGFsLmlkZW50aWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHByaW5jaXBhbC5pZGVudGlmaWVyc1swXVxuICAgICAgICA6IHByaW5jaXBhbC5pZGVudGlmaWVycztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBoYXMgbW9yZSBjb250cm9sIG92ZXIgaXRzIG93biByZXByZXNlbnRhdGlvbiBpbiBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRzXG4gKlxuICogTW9yZSBjb21wbGV4IHR5cGVzIG9mIGlkZW50aXR5IHByb3ZpZGVycyBuZWVkIG1vcmUgY29udHJvbCBvdmVyIFJvbGUncyBwb2xpY3kgZG9jdW1lbnRzXG4gKiB0aGFuIHNpbXBseSBgeyBFZmZlY3Q6ICdBbGxvdycsIEFjdGlvbjogJ0Fzc3VtZVJvbGUnLCBQcmluY2lwYWw6IDxXaGF0ZXZlcj4gfWAuXG4gKlxuICogSWYgdGhhdCBjb250cm9sIGlzIG5lY2Vzc2FyeSwgdGhleSBjYW4gaW1wbGVtZW50IGBJQXNzdW1lUm9sZVByaW5jaXBhbGAgdG8gZ2V0IGZ1bGxcbiAqIGFjY2VzcyB0byBhIFJvbGUncyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFzc3VtZVJvbGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIEFkZCB0aGUgcHJpbmNpcGFsIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRcbiAgICpcbiAgICogQWRkIHRoZSBzdGF0ZW1lbnRzIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgbmVjZXNzYXJ5IHRvIGdpdmUgdGhpcyBwcmluY2lwYWxcbiAgICogcGVybWlzc2lvbnMgdG8gYXNzdW1lIHRoZSBnaXZlbiByb2xlLlxuICAgKi9cbiAgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjYWxsaW5nIGBhZGRUb1ByaW5jaXBhbFBvbGljeWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGF0ZW1lbnQgd2FzIGFkZGVkIHRvIHRoZSBpZGVudGl0eSdzIHBvbGljaWVzLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50QWRkZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGVuZGFibGUgd2hpY2ggYWxsb3dzIGRlcGVuZGluZyBvbiB0aGUgcG9saWN5IGNoYW5nZSBiZWluZyBhcHBsaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVxdWlyZWQgaWYgYHN0YXRlbWVudEFkZGVkYCBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVwZW5kYWJsZT86IElEZXBlbmRhYmxlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBvbGljeSBwcmluY2lwYWxzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxCYXNlIGltcGxlbWVudHMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWwgPSB0aGlzO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHBvbGljeSBmcmFnbWVudCB0aGF0IGlkZW50aWZpZXMgdGhpcyBwcmluY2lwYWwgaW4gYSBQb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgUHJpbmNpcGFsIGlzIHVzZWQgaW4gYW4gQXNzdW1lUm9sZSBwb2xpY3ksIHRoZSBhY3Rpb24gdG8gdXNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICBwdWJsaWMgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIF9zdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIC8vIFRoaXMgYmFzZSBjbGFzcyBpcyB1c2VkIGZvciBub24taWRlbnRpdHkgcHJpbmNpcGFscy4gTm9uZSBvZiB0aGVtXG4gICAgLy8gaGF2ZSBhIFBvbGljeURvY3VtZW50IHRvIGFkZCB0by5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jdW1lbnQ6IElQb2xpY3lEb2N1bWVudCk6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwcm90b2NvbFxuICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMoXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW3RoaXMuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFt0aGlzXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZpcnN0IHBhc3MgdG8gbWFrZSB0aGUgb2JqZWN0IHJlYWRhYmxlLiBEZXNjZW5kYW50IHByaW5jaXBhbHNcbiAgICAvLyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBuaWNlci5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxKc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHRoZVxuICAgKiBwYXNzZWQgY29uZGl0aW9ucyBhZGRlZC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBhIHZhbHVlIGZvciB0aGUgc2FtZSBvcGVyYXRvciBhbmQga2V5IGluIGJvdGggdGhlIHByaW5jaXBhbCBhbmQgdGhlXG4gICAqIGNvbmRpdGlvbnMgcGFyYW1ldGVyLCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aENvbmRpdGlvbnMoLi4uY29uZGl0aW9uczogQ29uZGl0aW9ucyk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnModGhpcywgY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBwcmluY2lwYWwgdXNpbmcgdGhpcyBwcmluY2lwYWwgYXMgdGhlIGJhc2UsIHdpdGggc2Vzc2lvbiB0YWdzIGVuYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbmV3IFNlc3Npb25UYWdzUHJpbmNpcGFsIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyB3aXRoU2Vzc2lvblRhZ3MoKTogUHJpbmNpcGFsQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBwcmluY2lwYWwgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3BlY2lmeSBhIHByaW5jaXBhbCBieSB0aGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikuXG4gKiBZb3UgY2FuIHNwZWNpZnkgQVdTIGFjY291bnRzLCBJQU0gdXNlcnMsIEZlZGVyYXRlZCBTQU1MIHVzZXJzLCBJQU0gcm9sZXMsIGFuZCBzcGVjaWZpYyBhc3N1bWVkLXJvbGUgc2Vzc2lvbnMuXG4gKiBZb3UgY2Fubm90IHNwZWNpZnkgSUFNIGdyb3VwcyBvciBpbnN0YW5jZSBwcm9maWxlcyBhcyBwcmluY2lwYWxzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3ByaW5jaXBhbC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBcm5QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHByaW5jaXBhbCBlbnRpdHkgKGkuZS4gYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjp1c2VyL3VzZXItbmFtZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5hcm5dLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFyblByaW5jaXBhbCgke3RoaXMuYXJufSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBhZGRpbmcgYSBjb25kaXRpb24gdGhhdCB0aGUgcHJpbmNpcGFsIGlzIHBhcnQgb2YgdGhlIHNwZWNpZmllZFxuICAgKiBBV1MgT3JnYW5pemF0aW9uLlxuICAgKi9cbiAgcHVibGljIGluT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoQ29uZGl0aW9ucyh7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICB2YWx1ZXM6IFtvcmdhbml6YXRpb25JZF0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWw6JHt0aGlzLmFybn1gO1xuICB9XG59XG5cbi8qKlxuICogU3BlY2lmeSBBV1MgYWNjb3VudCBJRCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeSB0byBkZWxlZ2F0ZSBhdXRob3JpdHkgdG8gdGhlIGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2NvdW50UHJpbmNpcGFsIGV4dGVuZHMgQXJuUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRJZCBBV1MgYWNjb3VudCBJRCAoaS5lLiAnMTIzNDU2Nzg5MDEyJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhY2NvdW50SWQ6IGFueSkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oXG4gICAgICAgIChhd3NTdGFjaykgPT4gYGFybjoke2F3c1N0YWNrLnBhcnRpdGlvbn06aWFtOjoke2FjY291bnRJZH06cm9vdGAsXG4gICAgICApLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhY2NvdW50SWQpICYmIHR5cGVvZiBhY2NvdW50SWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFjY291bnRJZCBzaG91bGQgYmUgb2YgdHlwZSBzdHJpbmdcIik7XG4gICAgfVxuICAgIHRoaXMucHJpbmNpcGFsQWNjb3VudCA9IGFjY291bnRJZDtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFjY291bnRQcmluY2lwYWwoJHt0aGlzLmFjY291bnRJZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByaW5jaXBhbE9wdHMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiBpbiB3aGljaCB5b3Ugd2FudCB0byByZWZlcmVuY2UgdGhlIHNlcnZpY2VcbiAgICpcbiAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgKmNyb3NzLXJlZ2lvbiogcmVmZXJlbmNlcy5cbiAgICpcbiAgICogTm90ZTogV2UgYWx3YXlzIHJldHVybiB0aGUgZnVsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lLCBpbmNsdWRpbmcgdGhlIHJlZ2lvbi5cbiAgICogTm9ybWFsbHksIHRoZSByZWdpb24gaXMgb25seSByZXF1aXJlZCBmb3IgKm9wdC1pbiogcmVnaW9ucy4gSW4gdGhvc2VcbiAgICogY2FzZXMsIHRoZSByZWdpb24gbmFtZSBuZWVkcyB0byBiZSBpbmNsdWRlZCB0byByZWZlcmVuY2UgdGhlIGNvcnJlY3Qgc2VydmljZSBwcmluY2lwYWwuXG4gICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGdsb2JhbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lIGlzIHN1ZmZpY2llbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHJlc29sdmluZyBTdGFjaydzIHJlZ2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb25kaXRpb25zIHRvIGFkZCB0byB0aGUgU2VydmljZSBQcmluY2lwYWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb25kaXRpb25zXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb25zPzogQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1Mgc2VydmljZSAoaS5lLiBgc3FzLmFtYXpvbmF3cy5jb21gKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VydmljZSBwcmluY2lwYWwgbmFtZSBiYXNlZCBvbiB0aGUgcmVnaW9uIGl0J3MgdXNlZCBpbi5cbiAgICpcbiAgICogU29tZSBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyB1c2VkIHRvIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IHBhcnRpdGlvbnMsXG4gICAqIGFuZCBzb21lIHdlcmUgbm90LlxuICAgKlxuICAgKiBUaGVzZSBkYXlzIGFsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyBhcmUgc3RhbmRhcmRpemVkLCBhbmQgdGhleSBhcmUgYWxsXG4gICAqIG9mIHRoZSBmb3JtIGA8c2VydmljZW5hbWU+LmFtYXpvbmF3cy5jb21gLlxuICAgKlxuICAgKiBUbyBhdm9pZCBicmVha2luZyBjaGFuZ2VzLCBoYW5kbGluZyBpcyBwcm92aWRlZCBmb3Igc2VydmljZXMgYWRkZWQgd2l0aCB0aGUgZm9ybWF0cyBiZWxvdyxcbiAgICogaG93ZXZlciwgbm8gYWRkaXRpb25hbCBoYW5kbGluZyB3aWxsIGJlIGFkZGVkIGZvciBuZXcgcmVnaW9ucyBvciBwYXJ0aXRpb25zLlxuICAgKiAgIC0gczNcbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb21cbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb20uY25cbiAgICogICAtIHMzLmMycy5pYy5nb3ZcbiAgICogICAtIHMzLnNjMnMuc2dvdi5nb3ZcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcHJpbmNpcGFsTmFtZSA9IGlhbS5TZXJ2aWNlUHJpbmNpcGFsLnNlcnZpY2VQcmluY2lwYWxOYW1lKCdlYzInKTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VydmljZVByaW5jaXBhbE5hbWUoc2VydmljZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWxUb2tlbihzZXJ2aWNlLCB7fSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gQVdTIHNlcnZpY2UsIG9wdGlvbmFsbHkgaW4gYSBnaXZlbiByZWdpb25cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgQVdTIHNlcnZpY2UgKGkuZS4gc3FzLmFtYXpvbmF3cy5jb20pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLlNFUlZJQ0UsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4odGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMpLnRvU3RyaW5nKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0aGlzLm9wdHMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2VydmljZVByaW5jaXBhbCgke3RoaXMuc2VydmljZX0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWw6JHt0aGlzLnNlcnZpY2V9OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5vcHRzKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGFuIEFXUyBPcmdhbml6YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIFRoZSB1bmlxdWUgaWRlbnRpZmllciAoSUQpIG9mIGFuIG9yZ2FuaXphdGlvbiAoaS5lLiBvLTEyMzQ1YWJjZGUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgb3JnYW5pemF0aW9uSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6UHJpbmNpcGFsT3JnSURcIixcbiAgICAgICAgICB2YWx1ZXM6IFt0aGlzLm9yZ2FuaXphdGlvbklkXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9yZ2FuaXphdGlvblByaW5jaXBhbCgke3RoaXMub3JnYW5pemF0aW9uSWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWw6JHt0aGlzLm9yZ2FuaXphdGlvbklkfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBvbGljeSBwcmluY2lwYWwgZm9yIGNhbm9uaWNhbFVzZXJJZHMgLSB1c2VmdWwgZm9yIFMzIGJ1Y2tldCBwb2xpY2llcyB0aGF0IHVzZVxuICogT3JpZ2luIEFjY2VzcyBpZGVudGl0aWVzLlxuICpcbiAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3IvYWNjdC1pZGVudGlmaWVycy5odG1sXG4gKlxuICogYW5kXG4gKlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3ByaXZhdGUtY29udGVudC1yZXN0cmljdGluZy1hY2Nlc3MtdG8tczMuaHRtbFxuICpcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2Fub25pY2FsVXNlclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNhbm9uaWNhbFVzZXJJZCB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSBBV1MgZm9yIGV2ZXJ5IGFjY291bnQuXG4gICAqICAgcm9vdCB1c2VyIGFuZCBJQU0gdXNlcnMgZm9yIGFuIGFjY291bnQgYWxsIHNlZSB0aGUgc2FtZSBJRC5cbiAgICogICAoaS5lLiA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNhbm9uaWNhbFVzZXJJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkNBTk9OSUNBTFVTRVIsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5jYW5vbmljYWxVc2VySWRdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWwoJHt0aGlzLmNhbm9uaWNhbFVzZXJJZH0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWw6JHt0aGlzLmNhbm9uaWNhbFVzZXJJZH1gO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgc3VjaCBhcyBBbWF6b24gQ29nbml0byxcbiAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgdG8gdXNlcnMgd2hvIGhhdmUgYmVlbiBhdXRoZW50aWNhdGVkLlxuICogQWRkaXRpb25hbCBjb25kaXRpb24ga2V5cyBhcmUgYXZhaWxhYmxlIHdoZW4gdGhlIHRlbXBvcmFyeSBzZWN1cml0eSBjcmVkZW50aWFscyBhcmUgdXNlZCB0byBtYWtlIGEgcmVxdWVzdC5cbiAqIFlvdSBjYW4gdXNlIHRoZXNlIGtleXMgdG8gd3JpdGUgcG9saWNpZXMgdGhhdCBsaW1pdCB0aGUgYWNjZXNzIG9mIGZlZGVyYXRlZCB1c2Vycy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfaWFtLWNvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtd2lmXG4gKi9cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmRpdGlvbnM6IENvbmRpdGlvbnM7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmZWRlcmF0ZWQgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBmZWRlcmF0ZWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICAgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nID0gXCJzdHM6QXNzdW1lUm9sZVwiLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBhc3N1bWVSb2xlQWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBGZWRlcmF0ZWRQcmluY2lwYWw6JHt0aGlzLmZlZGVyYXRlZH06JHt0aGlzLmFzc3VtZVJvbGVBY3Rpb259OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGFzIFdlYiBJZGVudGl0eSBzdWNoIGFzIENvZ25pdG8sIEFtYXpvbixcbiAqIEZhY2Vib29rLCBHb29nbGUsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYklkZW50aXR5UHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eVByb3ZpZGVyIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKiBAcGFyYW0gc2Vzc2lvblRhZ3MgV2hldGhlciB0byBlbmFibGUgc2Vzc2lvbiB0YWdnaW5nIChzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sKVxuICAgKi9cbiAgY29uc3RydWN0b3IoaWRlbnRpdHlQcm92aWRlcjogc3RyaW5nLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihpZGVudGl0eVByb3ZpZGVyLCBjb25kaXRpb25zID8/IHt9LCBcInN0czpBc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5XCIpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgV2ViSWRlbnRpdHlQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBmcm9tIGEgT3BlbklEIENvbm5lY3QgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuSWRDb25uZWN0UHJpbmNpcGFsIGV4dGVuZHMgV2ViSWRlbnRpdHlQcmluY2lwYWwge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wZW5JZENvbm5lY3RQcm92aWRlciBPcGVuSUQgQ29ubmVjdCBwcm92aWRlclxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAgICogICBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcGVuSWRDb25uZWN0UHJvdmlkZXI6IElPcGVuSWRDb25uZWN0UHJvdmlkZXIsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHtcbiAgICBzdXBlcihvcGVuSWRDb25uZWN0UHJvdmlkZXIub3BlbklkQ29ubmVjdFByb3ZpZGVyQXJuLCBjb25kaXRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9wZW5JZENvbm5lY3RQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgU0FNTCBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxQcmluY2lwYWwgZXh0ZW5kcyBGZWRlcmF0ZWRQcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIuc2FtbFByb3ZpZGVyQXJuLCBjb25kaXRpb25zLCBcInN0czpBc3N1bWVSb2xlV2l0aFNBTUxcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGZvclxuICogcHJvZ3JhbW1hdGljIGFuZCBBV1MgTWFuYWdlbWVudCBDb25zb2xlIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxDb25zb2xlUHJpbmNpcGFsIGV4dGVuZHMgU2FtbFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBlbnVtIFBhcnRpdGlvbiB7XG4gICAqICAgRGVmYXVsdCA9ICdhd3MnLFxuICAgKiAgIENuID0gJ2F3cy1jbicsXG4gICAqICAgVXNHb3YgPSAnYXdzLXVzLWdvdicsXG4gICAqICAgVXNJc28gPSAnYXdzLWlzbycsXG4gICAqICAgVXNJc29CID0gJ2F3cy1pc28tYicsXG4gICAqICAgVXNJc29GID0gJ2F3cy1pc28tZicsXG4gICAqICAgRXVJc29FID0gJ2F3cy1pc28tZScsXG4gICAqIH1cbiAgICogU0FNTCBTaWduIE9uIHVybHMgY291bGQgYmUuLi5cbiAgICogW1BhcnRpdGlvbi5EZWZhdWx0XTogJ2h0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwnLFxuICAgKiBbUGFydGl0aW9uLkNuXTogJ2h0dHBzOi8vc2lnbmluLmFtYXpvbmF3cy5jbi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0dvdl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MtdXMtZ292LmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb106ICdodHRwczovL3NpZ25pbi5jMnNob21lLmljLmdvdi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb0JdOiAnaHR0cHM6Ly9zaWduaW4uc2Myc2hvbWUuc2dvdi5nb3Yvc2FtbCcsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2FtbFByb3ZpZGVyIFRoZSBTQU1MIHByb3ZpZGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSkge1xuICAgIHN1cGVyKHNhbWxQcm92aWRlciwgW1xuICAgICAgLi4uY29uZGl0aW9ucyxcbiAgICAgIC8vIFRPRE86IGhhbmRsZSBjb2xsaXNpb25zIG9uIFwiU0FNTDphdWRcIj9cbiAgICAgIHtcbiAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgdmFyaWFibGU6IFwiU0FNTDphdWRcIixcbiAgICAgICAgdmFsdWVzOiBbXCJodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sXCJdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNhbWxDb25zb2xlUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgdGhlIEFXUyBhY2NvdW50IGludG8gd2hpY2ggYSBzdGFjayBpcyBkZXBsb3llZCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeVxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFJvb3RQcmluY2lwYWwgZXh0ZW5kcyBBY2NvdW50UHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBuZXcgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbigoYXdzU3RhY2spID0+IGF3c1N0YWNrLmFjY291bnQpLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBY2NvdW50Um9vdFByaW5jaXBhbCgpXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCByZXByZXNlbnRpbmcgYWxsIEFXUyBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICpcbiAqIFNvbWUgc2VydmljZXMgYmVoYXZlIGRpZmZlcmVudGx5IHdoZW4geW91IHNwZWNpZnkgYFByaW5jaXBhbDogJyonYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgQW55UHJpbmNpcGFsYCByZW5kZXJzIHRvIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YC4gVGhpcyBpcyBjb3JyZWN0XG4gKiBtb3N0IG9mIHRoZSB0aW1lLCBidXQgaW4gY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIG90aGVyIHByaW5jaXBhbCxcbiAqIHVzZSBgU3RhclByaW5jaXBhbGAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFueVByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiKlwiKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBbnlQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICogQGRlcHJlY2F0ZWQgdXNlIGBBbnlQcmluY2lwYWxgXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlvbmUgZXh0ZW5kcyBBbnlQcmluY2lwYWwge31cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHVzZXMgYSBsaXRlcmFsICcqJyBpbiB0aGUgSUFNIEpTT04gbGFuZ3VhZ2VcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6IFwiKlwiYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgU3RhclByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiAqYC4gTW9zdCBvZiB0aGUgdGltZSwgeW91XG4gKiBzaG91bGQgdXNlIGBBbnlQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFyUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQgPVxuICAgIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLFxuICAgICAgICBpZGVudGlmaWVyczogW1wiKlwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWwoKVwiO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWxcIjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwcmluY2lwYWwgdGhhdCBoYXMgbXVsdGlwbGUgdHlwZXMgb2YgcHJpbmNpcGFscy4gQSBjb21wb3NpdGUgcHJpbmNpcGFsIGNhbm5vdFxuICogaGF2ZSBjb25kaXRpb25zLiBpLmUuIG11bHRpcGxlIFNlcnZpY2VQcmluY2lwYWxzIHRoYXQgZm9ybSBhIGNvbXBvc2l0ZSBwcmluY2lwYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWxzID0gbmV3IEFycmF5PElQcmluY2lwYWw+KCk7XG5cbiAgY29uc3RydWN0b3IoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAocHJpbmNpcGFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDb21wb3NpdGVQcmluY2lwYWxzIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhdCBsZWFzdCAxIFByaW5jaXBhbCBidXQgbm9uZSB3ZXJlIHBhc3NlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYXNzdW1lUm9sZUFjdGlvbiA9IHByaW5jaXBhbHNbMF0uYXNzdW1lUm9sZUFjdGlvbjtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFscyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBJQU0gcHJpbmNpcGFscyB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbC4gQ29tcG9zaXRlIHByaW5jaXBhbHMgY2Fubm90IGhhdmVcbiAgICogY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgSUFNIHByaW5jaXBhbHMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgYWRkUHJpbmNpcGFscyguLi5wcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pOiB0aGlzIHtcbiAgICB0aGlzLl9wcmluY2lwYWxzLnB1c2goLi4ucHJpbmNpcGFscyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUocCwgZG9jKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uZGl0aW9ucyBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHJlbmRlciBjb21wb3NpdGVcbiAgICAvLyBwcmluY2lwYWxzIGludG8gYSBzaW5nbGUgc3RhdGVtZW50ICh3aGljaCBpcyB3aGVuIGBwb2xpY3lGcmFnbWVudGAgd291bGQgZ2V0IGNhbGxlZClcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBwLnBvbGljeUZyYWdtZW50O1xuICAgICAgaWYgKGZyYWdtZW50LmNvbmRpdGlvbnMgJiYgZnJhZ21lbnQuY29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNvbXBvbmVudHMgb2YgYSBDb21wb3NpdGVQcmluY2lwYWwgbXVzdCBub3QgaGF2ZSBjb25kaXRpb25zLiBcIiArXG4gICAgICAgICAgICBgVHJpZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZnJhZ21lbnQpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgbWVyZ2VQcmluY2lwYWwocHJpbmNpcGFscywgcC5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChwcmluY2lwYWxzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbCgke3RoaXMuX3ByaW5jaXBhbHN9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5uZXIgPSB0aGlzLl9wcmluY2lwYWxzLm1hcChDb21wYXJhYmxlUHJpbmNpcGFsLmRlZHVwZVN0cmluZ0Zvcik7XG4gICAgaWYgKGlubmVyLnNvbWUoKHgpID0+IHggPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBgQ29tcG9zaXRlUHJpbmNpcGFsWyR7aW5uZXIuam9pbihcIixcIil9XWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJpbmNpcGFscyB0aGF0IG1ha2UgdXAgdGhlIENvbXBvc2l0ZVByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdldCBwcmluY2lwYWxzKCk6IElQcmluY2lwYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaW5jaXBhbHM7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBQcmluY2lwYWxzIHRoYXQgd3JhcCBvdGhlciBwcmluY2lwYWxzXG4gKi9cbmFic3RyYWN0IGNsYXNzIFByaW5jaXBhbEFkYXB0ZXIgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb24gPSB0aGlzLndyYXBwZWQuYXNzdW1lUm9sZUFjdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQgPSB0aGlzLndyYXBwZWQucHJpbmNpcGFsQWNjb3VudDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgd3JhcHBlZDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50O1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICApOiBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSB3cmFwcGVkIHByaW5jaXBhbCdzIGRlZHVwZSBzdHJpbmcgKGlmIGF2YWlsYWJsZSlcbiAgICovXG4gIHByb3RlY3RlZCBhcHBlbmREZWR1cGUoYXBwZW5kOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IodGhpcy53cmFwcGVkKTtcbiAgICByZXR1cm4gaW5uZXIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiR7aW5uZXJ9OiR7YXBwZW5kfWBcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBwcmluY2lwYWxzIHRoYXQgY2FuIGJlIGNvbXBhcmVkLlxuICpcbiAqIFRoaXMgb25seSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgcHJpbmNpcGFscyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHZhbHVlLWVxdWFsLlxuICogSWRlbnRpdHktZXF1YWwgcHJpbmNpcGFscyB3aWxsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBhcmFibGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIHN0cmluZyBmb3JtYXQgb2YgdGhpcyBwcmluY2lwYWwgd2hpY2ggc2hvdWxkIGJlIGlkZW50aWNhbCBpZiB0aGUgdHdvXG4gICAqIHByaW5jaXBhbHMgYXJlIHRoZSBzYW1lLlxuICAgKi9cbiAgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBgSUNvbXBhcmFibGVQcmluY2lwYWxgc1xuICovXG5leHBvcnQgY2xhc3MgQ29tcGFyYWJsZVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlzIGEgY29tcGFyYWJsZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb21wYXJhYmxlUHJpbmNpcGFsKFxuICAgIHg6IElQcmluY2lwYWwsXG4gICk6IHggaXMgSUNvbXBhcmFibGVQcmluY2lwYWwge1xuICAgIHJldHVybiBcImRlZHVwZVN0cmluZ1wiIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZWR1cGVTdHJpbmcgb2YgdGhlIGdpdmVuIHByaW5jaXBhbCwgaWYgYXZhaWxhYmxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZHVwZVN0cmluZ0Zvcih4OiBJUHJpbmNpcGFsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ29tcGFyYWJsZVByaW5jaXBhbC5pc0NvbXBhcmFibGVQcmluY2lwYWwoeClcbiAgICAgID8geC5kZWR1cGVTdHJpbmcoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHdpdGggYWRkaXRpb25hbCBjb25kaXRpb25zIHNwZWNpZnlpbmcgd2hlbiB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25zLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBwcml2YXRlIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICAgIGZvciAoY29uc3QgYyBvZiBjb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICB9XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgaWYgKGRvYy5ub2RlLnNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGEgY29uZGl0aW9uIHRvIGEgcHJpbmNpcGFsIG91dHNpZGUgb2YgYSBzdGFjayBzY29wZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyh0aGlzLmFzc3VtZVJvbGVBY3Rpb24pO1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9ucyguLi50aGlzLmNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb24gdG8gdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF0pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdDb25kaXRpb24gPVxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXTtcbiAgICBpZiAoZXhpc3RpbmdDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQ29uZGl0aW9uLFxuICAgICAgICAuLi5jb25kaXRpb24sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0gY29uZGl0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb25PYmplY3QgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBBIGNvbmRpdGlvbk9iamVjdCBoYXMgdGhlIGZvcm1hdCBvZiB0ZXN0OiB7IHZhcmlhYmxlOiB2YWx1ZSB8IHZhbHVlc1tdIH1cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGNvbmRpdGlvbjEgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMScgfX07XG4gICAqIC8vIG9yXG4gICAqIGNvbnN0IGNvbmRpdGlvbjIgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiBbJzEnLCAnMiddIH19O1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QodmFsdWUpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKCFpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3ModikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGaWVsZHMgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gR290ICR7dn0gZm9yIGtleSAke2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKHtcbiAgICAgICAgdGVzdDoga2V5LFxuICAgICAgICB2YXJpYWJsZTogayxcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGNvbmRpdGlvbnMgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBWYWx1ZXMgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWVzIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAgICogYW5kIGtleS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25zKGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBjb25kaXRpb25zLm1hcCgoYykgPT4ge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25PYmplY3RzIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0cyhjb25kaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbk9iamVjdChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNvbmRpdGlvbnMoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQuY29uZGl0aW9ucyxcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZGl0aW9ucyhcbiAgICBwcmluY2lwYWxDb25kaXRpb25zOiBDb25kaXRpb25zLFxuICAgIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAsXG4gICk6IENvbmRpdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZENvbmRpdGlvbnM6IENvbmRpdGlvbk1hcCA9IHt9O1xuICAgIHByaW5jaXBhbENvbmRpdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgaWYgKCFtZXJnZWRDb25kaXRpb25zW2MudGVzdF0pIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdID0ge307XG4gICAgICB9XG4gICAgICBtZXJnZWRDb25kaXRpb25zW2MudGVzdF1bYy52YXJpYWJsZV0gPSBjO1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbENvbmRpdGlvbnMpLmZvckVhY2goKFt0ZXN0LCBjb25kaXRpb25dKSA9PiB7XG4gICAgICAvLyBtZXJnZSB0aGUgY29uZGl0aW9ucyBpZiBvbmUgb2YgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9ucyB1c2VzIGFuXG4gICAgICAvLyBvcGVyYXRvciB0aGF0J3MgYWxyZWFkeSB1c2VkIGJ5IHRoZSBwcmluY2lwYWwncyBjb25kaXRpb25zIG1lcmdlIHRoZVxuICAgICAgLy8gaW5uZXIgc3RydWN0dXJlLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtZXJnZWRDb25kaXRpb25zW3Rlc3RdO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0gY29uZGl0aW9uO1xuICAgICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFN1cHBvcnQgSVJlc29sdmFibGUgQ29uZGl0aW9uP1xuICAgICAgLy8gLy8gaWYgZWl0aGVyIHRoZSBleGlzdGluZyBjb25kaXRpb24gb3IgdGhlIG5ldyBvbmUgY29udGFpbiB1bnJlc29sdmVkXG4gICAgICAvLyAvLyB0b2tlbnMsIGZhaWwgdGhlIG1lcmdlLiB0aGlzIGlzIGFzIGZhciBhcyB3ZSBnbyBhdCB0aGlzIHBvaW50LlxuICAgICAgLy8gaWYgKFRva2VuLmlzVW5yZXNvbHZlZChjb25kaXRpb24pIHx8IFRva2VuLmlzVW5yZXNvbHZlZChleGlzdGluZykpIHtcbiAgICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgLy8gICAgIGBtdWx0aXBsZSBcIiR7dGVzdH1cIiBjb25kaXRpb25zIGNhbm5vdCBiZSBtZXJnZWQgaWYgb25lIG9mIHRoZW0gY29udGFpbnMgYW4gdW5yZXNvbHZlZCB0b2tlbmAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIGNvbmRpdGlvbj9cbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGV4aXN0aW5nKTtcbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGNvbmRpdGlvbik7XG5cbiAgICAgIG1lcmdlZENvbmRpdGlvbnNbdGVzdF0gPSB7IC4uLmV4aXN0aW5nLCAuLi5jb25kaXRpb24gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9Db25kaXRpb25zKG1lcmdlZENvbmRpdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBzZXNzaW9uIHRhZ3Mgb24gcm9sZSBhc3N1bXB0aW9ucyBmcm9tIGEgcHJpbmNpcGFsXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbiB0YWdzLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25UYWdzUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaW5jaXBhbDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKHByaW5jaXBhbCk7XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyhcInN0czpUYWdTZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoXCJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgYSBwcmluY2lwYWwgdG8gYW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IGluIHRoZSByaWdodCB3YXlcbiAqXG4gKiBEZWxlZ2F0ZSB0byB0aGUgcHJpbmNpcGFsIGlmIGl0IGNhbiBkbyB0aGUgam9iIGl0c2VsZiwgZG8gYSBkZWZhdWx0IGpvYiBpZiBpdCBjYW4ndC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbiAgZG9jOiBJUG9saWN5RG9jdW1lbnQsXG4pIHtcbiAgaWYgKGlzQXNzdW1lUm9sZVByaW5jaXBhbChwcmluY2lwYWwpKSB7XG4gICAgLy8gUHJpbmNpcGFsIGtub3dzIGhvdyB0byBhZGQgaXRzZWxmXG4gICAgcHJpbmNpcGFsLmFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2MpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByaW5jaXBhbCBjYW4ndCBhZGQgaXRzZWxmLCB3ZSBkbyBpdCBmb3IgdGhlbVxuICAgIGRvYy5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtwcmluY2lwYWwuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFtwcmluY2lwYWxdLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0Fzc3VtZVJvbGVQcmluY2lwYWwoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbik6IHByaW5jaXBhbCBpcyBJQXNzdW1lUm9sZVByaW5jaXBhbCB7XG4gIHJldHVybiAhIShwcmluY2lwYWwgYXMgSUFzc3VtZVJvbGVQcmluY2lwYWwpLmFkZFRvQXNzdW1lUm9sZVBvbGljeTtcbn1cblxuLyoqXG4gKiBBIGxhenkgdG9rZW4gdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBTdGFjayB0byBldmFsdWF0ZVxuICovXG5jbGFzcyBBd3NTdGFja0RlcGVuZGVudFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZm46IChzcGVjOiBBd3NTdGFjaykgPT4gYW55KSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLmZuKEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KGNvbnRleHQuc2NvcGUpKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gXCI8dW5yZXNvbHZlZC10b2tlbj5cIjtcbiAgfVxufVxuXG5jbGFzcyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4gaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGlvblN0YWNrOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBTZXJ2aWNlUHJpbmNpcGFsT3B0cyxcbiAgKSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGN0eDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgYXdzU3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjdHguc2NvcGUpO1xuICAgIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBPcHQtSW4gcmVnaW9ucz8/XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcHJpbmNpcGFscy50cyNMNTA2LUw1MTBcbiAgICByZXR1cm4gYXdzU3RhY2suc2VydmljZVByaW5jaXBhbE5hbWUodGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMucmVnaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcywge1xuICAgICAgZGlzcGxheUhpbnQ6IHRoaXMuc2VydmljZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgdG9rZW5cbiAgICpcbiAgICogVXNlZCB3aGVuIEpTT04uc3RyaW5naWZ5KCkgaXMgY2FsbGVkXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCkge1xuICAgIHJldHVybiBgPCR7dGhpcy5zZXJ2aWNlfT5gO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIGFycmF5cyB0aGF0IHJlcHJlc2VudCBJQU0gcHJpbmNpcGFsc1xuICpcbiAqIERvZXMgYW4gaW4tcGxhY2UgbWVyZ2UgaW50byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByaW5jaXBhbChcbiAgdGFyZ2V0OiBQcmluY2lwYWxQcm9wc1tdLFxuICBzb3VyY2U6IFByaW5jaXBhbFByb3BzW10sXG4pIHtcbiAgLy8gaWYgb25lIHJlcHJlc2VudHMgdGhlIHN0YXJQcmluY2lwYWwgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5XG4gIGlmIChcbiAgICAoaGFzU3RhclByaW5jaXBhbCh0YXJnZXQpICYmIHNvdXJjZS5sZW5ndGggPiAwKSB8fFxuICAgIChoYXNTdGFyUHJpbmNpcGFsKHNvdXJjZSkgJiYgdGFyZ2V0Lmxlbmd0aCA+IDApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgbWVyZ2UgcHJpbmNpcGFscyAke0pTT04uc3RyaW5naWZ5KHRhcmdldCl9IGFuZCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9OyBpZiBvbmUgdXNlcyBhIHRoZSBTdGFyUHJpbmNpcGFsIHN0cmluZyB0aGUgb3RoZXIgb25lIG11c3QgYmUgZW1wdHlgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRNYXA6IE1hcDxQcmluY2lwYWxUeXBlLCBQcmluY2lwYWxQcm9wcz4gPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHRhcmdldCkge1xuICAgIHRhcmdldE1hcC5zZXQocHJpbmNpcGFsLnR5cGUsIHByaW5jaXBhbCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVByaW5jaXBhbCBvZiBzb3VyY2UpIHtcbiAgICBjb25zdCB7IHR5cGUsIGlkZW50aWZpZXJzOiBzb3VyY2VJZGVudGlmaWVycyB9ID0gc291cmNlUHJpbmNpcGFsO1xuICAgIGlmICh0YXJnZXRNYXAuaGFzKHR5cGUpKSB7XG4gICAgICBjb25zdCB0YXJnZXRJbmRlbnRpZmllclNldCA9IG5ldyBTZXQodGFyZ2V0TWFwLmdldCh0eXBlKSEuaWRlbnRpZmllcnMpO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBzb3VyY2VJZGVudGlmaWVycykge1xuICAgICAgICB0YXJnZXRJbmRlbnRpZmllclNldC5hZGQoaWQpO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB0YXJnZXQgaWRlbnRpZmllcnMgaW4tcGxhY2VcbiAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0LmZpbmRJbmRleCgocHJpbmNpcGFsKSA9PiBwcmluY2lwYWwudHlwZSA9PT0gdHlwZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpZGVudGlmaWVyczogQXJyYXkuZnJvbSh0YXJnZXRJbmRlbnRpZmllclNldCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wdXNoKHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFsuLi5zb3VyY2VJZGVudGlmaWVyc10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIFByaW5jaXBhbFByb3BzIGFycmF5IGNvbnRhaW5zIHRoZSBTdGFyUHJpbmNpcGFsOlxuICogdHlwZSA9IFByaW5jaXBhbFR5cGUuQU5ZIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl1cbiAqL1xuZnVuY3Rpb24gaGFzU3RhclByaW5jaXBhbChwcmluY2lwYWxzOiBQcmluY2lwYWxQcm9wc1tdKSB7XG4gIC8vIFRPRE86IERvZXMgaGF2aW5nIG1vcmUgdGhhbiAxIHByaW5jaXBhbCBtYWtlIHNlbnNlIGlmIG9uZSBvZiB0aGVtIGlzIHRoZSBTdGFyUHJpbmNpcGFsP1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJpbmNpcGFscy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcmluY2lwYWwgPSBwcmluY2lwYWxzW2luZGV4XTtcbiAgICBpZiAoXG4gICAgICBwcmluY2lwYWwudHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=