terraconstructs 0.0.11 → 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 +7 -5
  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,210 +1,45 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.EventType = exports.StorageClass = exports.Bucket = void 0;
4
+ exports.EventType = exports.BucketEncryption = exports.StorageClass = exports.Bucket = exports.BucketBase = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const node_os_1 = require("node:os");
6
7
  const provider_aws_1 = require("@cdktf/provider-aws");
7
8
  const provider_time_1 = require("@cdktf/provider-time");
9
+ const cdktf_1 = require("cdktf");
8
10
  const _1 = require(".");
9
- const __1 = require("..");
11
+ const aws_construct_1 = require("../aws-construct");
12
+ const aws_stack_1 = require("../aws-stack");
13
+ const util_1 = require("./util");
14
+ const kms = require("../encryption");
10
15
  const iam = require("../iam");
11
16
  const perms = require("./bucket-perms");
12
- /**
13
- * The `Bucket` beacon provides an [AWS S3 Bucket](https://aws.amazon.com/s3/).
14
- *
15
- * ```ts
16
- * new storage.Bucket(stack, "MyWebsite", {
17
- * path: path.join(__dirname, "dist"),
18
- * });
19
- * ```
20
- *
21
- * #### Public read access
22
- *
23
- * Enables `public` read access for all the files in the bucket. Dangerous and
24
- * recommended to use edge.Distribution instead.
25
- *
26
- * Useful for hosting public files directly from S3.
27
- *
28
- * ```ts
29
- * new storage.Bucket("MyBucket", {
30
- * public: true
31
- * });
32
- * ```
33
- *
34
- * @resource aws_s3_bucket
35
- * @terraconstruct storage.IBucket
36
- */
37
- class Bucket extends __1.AwsConstructBase {
38
- get versioned() {
39
- return this._versioned;
40
- }
17
+ class BucketBase extends aws_construct_1.AwsConstructBase {
41
18
  get bucketOutputs() {
42
- return this._outputs;
19
+ return {
20
+ name: this.bucketName,
21
+ arn: this.bucketArn,
22
+ domainName: this.resource.bucketDomainName,
23
+ regionalDomainName: this.resource.bucketRegionalDomainName,
24
+ websiteDomainName: this.websiteDomainName,
25
+ websiteUrl: this.websiteEndpoint,
26
+ originAccessIdentity: this.originAccessIdentity?.cloudFrontOriginAccessIdentityPath,
27
+ encryptionKey: this.encryptionKey?.keyOutputs,
28
+ };
43
29
  }
44
30
  get outputs() {
45
31
  return this.bucketOutputs;
46
32
  }
47
- get bucketName() {
48
- return this.resource.bucket;
49
- }
50
- get bucketArn() {
51
- return this.resource.arn;
52
- }
53
- get hostedZoneId() {
54
- return this.resource.hostedZoneId;
55
- }
56
- get websiteDomainName() {
57
- return this.websiteConfig?.websiteDomain;
58
- }
59
- constructor(scope, name, props = {}) {
60
- super(scope, name, props);
33
+ // TODO: re-add ownership control parsing based on access controls
34
+ // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-s3/lib/bucket.ts#L2363
35
+ // protected objectOwnership?: ObjectOwnership;
36
+ constructor(scope, id, props = {}) {
37
+ super(scope, id, props);
61
38
  /** @internal */
62
39
  this.sources = [];
63
40
  this.node.addValidation({
64
41
  validate: () => this.policy?.document.validateForResourcePolicy() ?? [],
65
42
  });
66
- const { websiteConfig, corsConfig, cloudfrontAccess } = props;
67
- this._isWebsite = false;
68
- if (props.bucketName && props.namePrefix) {
69
- throw new Error("Cannot specify both 'bucketName' and 'namePrefix'. Use only one.");
70
- }
71
- let bucketPrefix;
72
- if (!props.bucketName) {
73
- // Bucket names must be lowercase and between 3 (min) and 63 (max) characters long.
74
- bucketPrefix = this.stack.uniqueResourceNamePrefix(this, {
75
- prefix: (props.namePrefix ?? this.gridUUID) + "-",
76
- lowerCase: true,
77
- allowedSpecialCharacters: ".-",
78
- maxLength: 63,
79
- });
80
- }
81
- this.resource = new provider_aws_1.s3Bucket.S3Bucket(this, "Resource", {
82
- bucket: props.bucketName,
83
- forceDestroy: props.forceDestroy,
84
- bucketPrefix,
85
- });
86
- this._versioned = props.versioned ?? false;
87
- if (this._versioned) {
88
- new provider_aws_1.s3BucketVersioning.S3BucketVersioningA(this, "Versioning", {
89
- bucket: this.resource.bucket,
90
- versioningConfiguration: {
91
- status: this._versioned ? "Enabled" : "Suspended",
92
- },
93
- });
94
- }
95
- this.eventBridgeEnabled = props.eventBridgeEnabled;
96
- if (props.sources) {
97
- if (typeof props.sources === "string") {
98
- this.addSource({ path: props.sources });
99
- }
100
- else if (Array.isArray(props.sources)) {
101
- for (const sourceProps of props.sources) {
102
- if (typeof sourceProps === "string") {
103
- this.addSource({ path: sourceProps });
104
- }
105
- else {
106
- this.addSource(sourceProps);
107
- }
108
- }
109
- }
110
- }
111
- if (props.lifecycleRules) {
112
- new provider_aws_1.s3BucketLifecycleConfiguration.S3BucketLifecycleConfiguration(this, "LifeCycleConfig", {
113
- bucket: this.resource.bucket,
114
- rule: props.lifecycleRules.map((rule) => ({
115
- ...rule,
116
- status: rule.enabled ? "Enabled" : "Disabled",
117
- })),
118
- });
119
- }
120
- // Enforce AWS Foundational Security Best Practice
121
- if (props.enforceSSL) {
122
- this.enforceSSLStatement();
123
- this.minimumTLSVersionStatement(props.minimumTLSVersion);
124
- }
125
- else if (props.minimumTLSVersion) {
126
- throw new Error("'enforceSSL' must be enabled for 'minimumTLSVersion' to be applied");
127
- }
128
- if (websiteConfig && websiteConfig.enabled) {
129
- this._isWebsite = true;
130
- this.websiteConfig =
131
- new provider_aws_1.s3BucketWebsiteConfiguration.S3BucketWebsiteConfiguration(this, "WebsiteConfig", {
132
- bucket: this.resource.bucket,
133
- ...websiteConfig,
134
- indexDocument: websiteConfig?.indexDocument
135
- ? {
136
- suffix: websiteConfig.indexDocument,
137
- }
138
- : {
139
- suffix: "index.html",
140
- },
141
- });
142
- }
143
- this.public = props.public ?? false;
144
- if (this.public) {
145
- // TODO: switch to Lazy config using "grantPublicAccess" mechanism instead?
146
- // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-s3/lib/bucket.ts#L850
147
- const ownershipControls = new provider_aws_1.s3BucketOwnershipControls.S3BucketOwnershipControls(this, "OwnershipControls", {
148
- bucket: this.resource.bucket,
149
- rule: {
150
- objectOwnership: "BucketOwnerPreferred",
151
- },
152
- });
153
- const publicAccessBlock = new provider_aws_1.s3BucketPublicAccessBlock.S3BucketPublicAccessBlock(this, "PublicAccessBlock", {
154
- bucket: this.resource.bucket,
155
- blockPublicAcls: false,
156
- blockPublicPolicy: false,
157
- ignorePublicAcls: false,
158
- restrictPublicBuckets: false,
159
- });
160
- new provider_aws_1.s3BucketAcl.S3BucketAcl(this, "PublicAcl", {
161
- bucket: this.resource.bucket,
162
- acl: "public-read",
163
- dependsOn: [ownershipControls, publicAccessBlock],
164
- });
165
- this.addToResourcePolicy(new iam.PolicyStatement({
166
- resources: [this.arnForObjects("*")],
167
- actions: ["s3:GetObject"],
168
- principals: [new iam.AnyPrincipal()],
169
- }));
170
- // // policy depends on public access block?
171
- // // is this needed?
172
- // if (policyDependable && policyDependable instanceof Construct) {
173
- // policyDependable.node.addDependency(publicAccessBlock);
174
- // }
175
- }
176
- if (corsConfig) {
177
- this.corsConfig = new provider_aws_1.s3BucketCorsConfiguration.S3BucketCorsConfiguration(this, "CorsConfig", {
178
- bucket: this.resource.bucket,
179
- ...corsConfig,
180
- });
181
- }
182
- let originAccessIdentity;
183
- if (cloudfrontAccess?.enabled) {
184
- const oai = new _1.OriginAccessIdentity(this, "OriginAccessIdentity", {
185
- comment: `OAI for ${this.resource.bucket}`,
186
- });
187
- originAccessIdentity = oai.cloudFrontOriginAccessIdentityPath;
188
- const resources = (cloudfrontAccess.keyPatterns ?? ["*"]).map((keyPattern) => this.arnForObjects(keyPattern));
189
- this.addToResourcePolicy(new iam.PolicyStatement({
190
- resources,
191
- actions: ["s3:GetObject"],
192
- principals: [oai.grantPrincipal],
193
- }));
194
- }
195
- if (this.eventBridgeEnabled) {
196
- this.enableEventBridgeNotification();
197
- }
198
- //register outputs
199
- this._outputs = {
200
- name: this.resource.bucket,
201
- arn: this.resource.arn,
202
- domainName: this.resource.bucketDomainName,
203
- regionalDomainName: this.resource.bucketRegionalDomainName,
204
- websiteDomainName: this.websiteConfig?.websiteDomain,
205
- websiteUrl: this.websiteConfig?.websiteEndpoint,
206
- originAccessIdentity,
207
- };
208
43
  }
209
44
  /**
210
45
  * Adds a statement to the resource policy for a principal (i.e.
@@ -227,9 +62,7 @@ class Bucket extends __1.AwsConstructBase {
227
62
  * silently, which may be confusing.
228
63
  */
229
64
  addToResourcePolicy(permission) {
230
- // TODO: re-add autoCreatePolicy option?
231
- // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-s3/lib/bucket.ts#L652
232
- if (!this.policy) {
65
+ if (!this.policy && this.autoCreatePolicy) {
233
66
  this.policy = new _1.BucketPolicy(this, "Policy", { bucket: this });
234
67
  }
235
68
  if (this.policy) {
@@ -289,7 +122,8 @@ class Bucket extends __1.AwsConstructBase {
289
122
  ];
290
123
  return this.grant(identity, bucketActions, keyActions, this.resource.arn, this.arnForObjects(objectsKeyPattern));
291
124
  }
292
- // TODO: currently only supported through `props.public` in constructor
125
+ // TODO: currently only supported through `props.public` in constructor,
126
+ // TODO: re-add ObjectOwnership and BucketAccessControl
293
127
  // /**
294
128
  // * Allows unrestricted access to objects from this bucket.
295
129
  // *
@@ -365,6 +199,8 @@ class Bucket extends __1.AwsConstructBase {
365
199
  this.withNotifications((notifications) => notifications.addNotification(event, dest, ...filters));
366
200
  }
367
201
  withNotifications(cb) {
202
+ // TODO: Use Custom Resources to manage bucket notifications outside of the stack
203
+ // handlerRole: this.notificationsHandlerRole,
368
204
  if (!this.notifications) {
369
205
  this.notifications = new _1.BucketNotifications(this, "Notifications", {
370
206
  bucket: this,
@@ -411,7 +247,7 @@ class Bucket extends __1.AwsConstructBase {
411
247
  enableEventBridgeNotification() {
412
248
  this.withNotifications((notifications) => notifications.enableEventBridgeNotification());
413
249
  }
414
- grant(grantee, bucketActions, _keyActions, resourceArn, ...otherResourceArns) {
250
+ grant(grantee, bucketActions, keyActions, resourceArn, ...otherResourceArns) {
415
251
  const resources = [resourceArn, ...otherResourceArns];
416
252
  const ret = iam.Grant.addToPrincipalOrResource({
417
253
  grantee,
@@ -419,10 +255,9 @@ class Bucket extends __1.AwsConstructBase {
419
255
  resourceArns: resources,
420
256
  resource: this,
421
257
  });
422
- // TODO: re-add KMS support
423
- // if (this.encryptionKey && keyActions && keyActions.length !== 0) {
424
- // this.encryptionKey.grant(grantee, ...keyActions);
425
- // }
258
+ if (this.encryptionKey && keyActions && keyActions.length !== 0) {
259
+ this.encryptionKey.grant(grantee, ...keyActions);
260
+ }
426
261
  return ret;
427
262
  }
428
263
  get writeActions() {
@@ -487,7 +322,7 @@ class Bucket extends __1.AwsConstructBase {
487
322
  * @returns an ObjectS3Url token
488
323
  */
489
324
  urlForObject(key) {
490
- const stack = __1.AwsStack.ofAwsConstruct(this);
325
+ const stack = aws_stack_1.AwsStack.ofAwsConstruct(this);
491
326
  const prefix = `https://s3.${this.env.region}.${stack.urlSuffix}/`;
492
327
  if (typeof key !== "string") {
493
328
  return this.urlJoin(prefix, this.bucketName);
@@ -535,6 +370,482 @@ class Bucket extends __1.AwsConstructBase {
535
370
  return `${result}/${component}`;
536
371
  });
537
372
  }
373
+ /**
374
+ * Adds resource to the Terraform JSON output at Synth time.
375
+ *
376
+ * called by TerraformStack.prepareStack()
377
+ */
378
+ toTerraform() {
379
+ /**
380
+ * A preparing resolve might add new resources to the stack
381
+ *
382
+ * should not add resources if no bucket sources are defined
383
+ */
384
+ if (Object.keys(this.sources).length === 0) {
385
+ return {};
386
+ }
387
+ for (const source of this.sources) {
388
+ // TODO: Ideally we should have used IResolvable.resolve and use the IResolveContext.preparing flag
389
+ // ref: https://github.com/aws/aws-cdk/blob/v2.170.0/packages/aws-cdk-lib/aws-iam/lib/policy-document.ts#L48
390
+ if (this.node.tryFindChild(source.id))
391
+ continue; // ignore if already generated
392
+ new _1.BucketSource(this, source.id, source.props);
393
+ }
394
+ return {};
395
+ }
396
+ }
397
+ exports.BucketBase = BucketBase;
398
+ _a = JSII_RTTI_SYMBOL_1;
399
+ BucketBase[_a] = { fqn: "terraconstructs.aws.storage.BucketBase", version: "0.0.12" };
400
+ /**
401
+ * The `Bucket` provides an [AWS S3 Bucket](https://aws.amazon.com/s3/).
402
+ *
403
+ * ```ts
404
+ * new storage.Bucket(stack, "MyWebsite", {
405
+ * path: path.join(__dirname, "dist"),
406
+ * });
407
+ * ```
408
+ *
409
+ * #### Public read access
410
+ *
411
+ * Enables `public` read access for all the files in the bucket. Dangerous and
412
+ * recommended to use edge.Distribution instead.
413
+ *
414
+ * Useful for hosting public files directly from S3.
415
+ *
416
+ * ```ts
417
+ * new storage.Bucket("MyBucket", {
418
+ * public: true
419
+ * });
420
+ * ```
421
+ *
422
+ * @resource aws_s3_bucket
423
+ * @terraconstruct storage.IBucket
424
+ */
425
+ class Bucket extends BucketBase {
426
+ // TODO: Add static fromLookup?
427
+ static fromBucketName(scope, id, bucketName) {
428
+ return Bucket.fromBucketAttributes(scope, id, { bucketName });
429
+ }
430
+ /**
431
+ * Creates a Bucket construct that represents an external bucket.
432
+ *
433
+ * @param scope The parent creating construct (usually `this`).
434
+ * @param id The construct's name.
435
+ * @param attrs A `BucketAttributes` object. Can be obtained from a call to
436
+ * `bucket.export()` or manually created.
437
+ */
438
+ static fromBucketAttributes(scope, id, attrs) {
439
+ // const stack = AwsStack.ofAwsConstruct(scope);
440
+ // const region = attrs.region ?? stack.region;
441
+ // const urlSuffix = stack.urlSuffix;
442
+ const bucketName = (0, util_1.parseBucketName)(scope, attrs);
443
+ if (!bucketName) {
444
+ throw new Error("Bucket name is required");
445
+ }
446
+ Bucket.validateBucketName(bucketName, true);
447
+ // let staticDomainEndpoint = s3StaticWebsiteEndpoint(region);
448
+ // TODO: support lazy lookup based on Unresolved region
449
+ // Lazy.stringValue({
450
+ // produce: () =>
451
+ // stack.regionalFact(
452
+ // regionInformation.FactName.S3_STATIC_WEBSITE_ENDPOINT,
453
+ // newEndpoint,
454
+ // ),
455
+ // });
456
+ // const websiteDomain = `${bucketName}.${staticDomainEndpoint}`;
457
+ class Import extends BucketBase {
458
+ constructor() {
459
+ super(...arguments);
460
+ this.resource = new provider_aws_1.dataAwsS3Bucket.DataAwsS3Bucket(scope, bucketName, // make id is unique
461
+ {
462
+ bucket: bucketName,
463
+ });
464
+ this.public = attrs.public ?? false;
465
+ this.versioned = attrs.versioned ?? false;
466
+ this.policy = undefined;
467
+ this.encryptionKey = attrs.encryptionKey;
468
+ this.originAccessIdentity = attrs.originAccessIdentity;
469
+ this._isWebsite = !!attrs.isWebsite;
470
+ this.autoCreatePolicy = false;
471
+ // protected disallowPublicAccess = false;
472
+ // protected notificationsHandlerRole = attrs.notificationsHandlerRole;
473
+ }
474
+ // public readonly bucketName = bucketName!;
475
+ get bucketName() {
476
+ return this.resource.bucket;
477
+ }
478
+ // public readonly bucketArn = parseBucketArn(scope, attrs);
479
+ get bucketArn() {
480
+ return this.resource.arn;
481
+ }
482
+ get websiteDomainName() {
483
+ return this.resource.websiteDomain;
484
+ }
485
+ get websiteEndpoint() {
486
+ return this.resource.websiteEndpoint;
487
+ }
488
+ get hostedZoneId() {
489
+ return this.resource.hostedZoneId;
490
+ }
491
+ isWebsite() {
492
+ return attrs.isWebsite ?? false;
493
+ }
494
+ }
495
+ return new Import(scope, id, {
496
+ account: attrs.account,
497
+ region: attrs.region,
498
+ });
499
+ }
500
+ /**
501
+ * Thrown an exception if the given bucket name is not valid.
502
+ *
503
+ * @param physicalName name of the bucket.
504
+ * @param allowLegacyBucketNaming allow legacy bucket naming style, default is false.
505
+ */
506
+ static validateBucketName(physicalName, allowLegacyBucketNaming = false) {
507
+ const bucketName = physicalName;
508
+ if (!bucketName || cdktf_1.Token.isUnresolved(bucketName)) {
509
+ // the name is a late-bound value, not a defined string,
510
+ // so skip validation
511
+ return;
512
+ }
513
+ const errors = [];
514
+ // Rules codified from https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
515
+ if (bucketName.length < 3 || bucketName.length > 63) {
516
+ errors.push("Bucket name must be at least 3 and no more than 63 characters");
517
+ }
518
+ const illegalCharsetRegEx = allowLegacyBucketNaming
519
+ ? /[^A-Za-z0-9._-]/
520
+ : /[^a-z0-9.-]/;
521
+ const allowedEdgeCharsetRegEx = allowLegacyBucketNaming
522
+ ? /[A-Za-z0-9]/
523
+ : /[a-z0-9]/;
524
+ const illegalCharMatch = bucketName.match(illegalCharsetRegEx);
525
+ if (illegalCharMatch) {
526
+ errors.push(allowLegacyBucketNaming
527
+ ? "Bucket name must only contain uppercase or lowercase characters and the symbols, period (.), underscore (_), and dash (-)"
528
+ : "Bucket name must only contain lowercase characters and the symbols, period (.) and dash (-)" +
529
+ ` (offset: ${illegalCharMatch.index})`);
530
+ }
531
+ if (!allowedEdgeCharsetRegEx.test(bucketName.charAt(0))) {
532
+ errors.push(allowLegacyBucketNaming
533
+ ? "Bucket name must start with an uppercase, lowercase character or number"
534
+ : "Bucket name must start with a lowercase character or number" +
535
+ " (offset: 0)");
536
+ }
537
+ if (!allowedEdgeCharsetRegEx.test(bucketName.charAt(bucketName.length - 1))) {
538
+ errors.push(allowLegacyBucketNaming
539
+ ? "Bucket name must end with an uppercase, lowercase character or number"
540
+ : "Bucket name must end with a lowercase character or number" +
541
+ ` (offset: ${bucketName.length - 1})`);
542
+ }
543
+ const consecSymbolMatch = bucketName.match(/\.-|-\.|\.\./);
544
+ if (consecSymbolMatch) {
545
+ errors.push("Bucket name must not have dash next to period, or period next to dash, or consecutive periods" +
546
+ ` (offset: ${consecSymbolMatch.index})`);
547
+ }
548
+ if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(bucketName)) {
549
+ errors.push("Bucket name must not resemble an IP address");
550
+ }
551
+ if (errors.length > 0) {
552
+ throw new Error(`Invalid S3 bucket name (value: ${bucketName})${node_os_1.EOL}${errors.join(node_os_1.EOL)}`);
553
+ }
554
+ }
555
+ get bucketArn() {
556
+ return this.resource.arn;
557
+ }
558
+ get bucketName() {
559
+ return this.resource.bucket;
560
+ }
561
+ get websiteDomainName() {
562
+ return this.websiteConfig?.websiteDomain;
563
+ }
564
+ get websiteEndpoint() {
565
+ return this.websiteConfig?.websiteEndpoint;
566
+ }
567
+ get versioned() {
568
+ return this._versioned;
569
+ }
570
+ get hostedZoneId() {
571
+ return this.resource.hostedZoneId;
572
+ }
573
+ constructor(scope, name, props = {}) {
574
+ super(scope, name, props);
575
+ this.autoCreatePolicy = true;
576
+ const { bucketEncryption, encryptionKey } = this.parseEncryption(props);
577
+ const { websiteConfig, corsConfig, cloudfrontAccess } = props;
578
+ this._isWebsite = false;
579
+ if (props.bucketName && props.namePrefix) {
580
+ throw new Error("Cannot specify both 'bucketName' and 'namePrefix'. Use only one.");
581
+ }
582
+ let bucketPrefix;
583
+ if (!props.bucketName) {
584
+ // Bucket names must be lowercase and between 3 (min) and 63 (max) characters long.
585
+ bucketPrefix = this.stack.uniqueResourceNamePrefix(this, {
586
+ prefix: (props.namePrefix ?? this.gridUUID) + "-",
587
+ lowerCase: true,
588
+ allowedSpecialCharacters: ".-",
589
+ maxLength: 63,
590
+ });
591
+ }
592
+ this.resource = new provider_aws_1.s3Bucket.S3Bucket(this, "Resource", {
593
+ bucket: props.bucketName,
594
+ forceDestroy: props.forceDestroy,
595
+ bucketPrefix,
596
+ });
597
+ this._versioned = props.versioned ?? false;
598
+ if (this._versioned) {
599
+ new provider_aws_1.s3BucketVersioning.S3BucketVersioningA(this, "Versioning", {
600
+ bucket: this.resource.bucket,
601
+ versioningConfiguration: {
602
+ status: this._versioned ? "Enabled" : "Suspended",
603
+ },
604
+ });
605
+ }
606
+ this.eventBridgeEnabled = props.eventBridgeEnabled;
607
+ if (props.sources) {
608
+ if (typeof props.sources === "string") {
609
+ this.addSource({ path: props.sources });
610
+ }
611
+ else if (Array.isArray(props.sources)) {
612
+ for (const sourceProps of props.sources) {
613
+ if (typeof sourceProps === "string") {
614
+ this.addSource({ path: sourceProps });
615
+ }
616
+ else {
617
+ this.addSource(sourceProps);
618
+ }
619
+ }
620
+ }
621
+ }
622
+ if (props.lifecycleRules) {
623
+ new provider_aws_1.s3BucketLifecycleConfiguration.S3BucketLifecycleConfiguration(this, "LifeCycleConfig", {
624
+ bucket: this.resource.bucket,
625
+ rule: props.lifecycleRules.map((rule) => ({
626
+ ...rule,
627
+ status: rule.enabled ? "Enabled" : "Disabled",
628
+ })),
629
+ });
630
+ }
631
+ // Enforce AWS Foundational Security Best Practice
632
+ if (props.enforceSSL) {
633
+ this.enforceSSLStatement();
634
+ this.minimumTLSVersionStatement(props.minimumTLSVersion);
635
+ }
636
+ else if (props.minimumTLSVersion) {
637
+ throw new Error("'enforceSSL' must be enabled for 'minimumTLSVersion' to be applied");
638
+ }
639
+ if (websiteConfig && websiteConfig.enabled) {
640
+ this._isWebsite = true;
641
+ this.websiteConfig =
642
+ new provider_aws_1.s3BucketWebsiteConfiguration.S3BucketWebsiteConfiguration(this, "WebsiteConfig", {
643
+ bucket: this.resource.bucket,
644
+ ...websiteConfig,
645
+ indexDocument: websiteConfig?.indexDocument
646
+ ? {
647
+ suffix: websiteConfig.indexDocument,
648
+ }
649
+ : {
650
+ suffix: "index.html",
651
+ },
652
+ });
653
+ }
654
+ this.public = props.public ?? false;
655
+ if (this.public) {
656
+ // TODO: switch to Lazy config using "grantPublicAccess" mechanism instead?
657
+ // ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-s3/lib/bucket.ts#L850
658
+ const ownershipControls = new provider_aws_1.s3BucketOwnershipControls.S3BucketOwnershipControls(this, "OwnershipControls", {
659
+ bucket: this.resource.bucket,
660
+ rule: {
661
+ objectOwnership: "BucketOwnerPreferred",
662
+ },
663
+ });
664
+ const publicAccessBlock = new provider_aws_1.s3BucketPublicAccessBlock.S3BucketPublicAccessBlock(this, "PublicAccessBlock", {
665
+ bucket: this.resource.bucket,
666
+ blockPublicAcls: false,
667
+ blockPublicPolicy: false,
668
+ ignorePublicAcls: false,
669
+ restrictPublicBuckets: false,
670
+ });
671
+ new provider_aws_1.s3BucketAcl.S3BucketAcl(this, "PublicAcl", {
672
+ bucket: this.resource.bucket,
673
+ acl: "public-read",
674
+ dependsOn: [ownershipControls, publicAccessBlock],
675
+ });
676
+ this.addToResourcePolicy(new iam.PolicyStatement({
677
+ resources: [this.arnForObjects("*")],
678
+ actions: ["s3:GetObject"],
679
+ principals: [new iam.AnyPrincipal()],
680
+ }));
681
+ // // policy depends on public access block?
682
+ // // is this needed?
683
+ // if (policyDependable && policyDependable instanceof Construct) {
684
+ // policyDependable.node.addDependency(publicAccessBlock);
685
+ // }
686
+ }
687
+ if (corsConfig) {
688
+ this.corsConfig = new provider_aws_1.s3BucketCorsConfiguration.S3BucketCorsConfiguration(this, "CorsConfig", {
689
+ bucket: this.resource.bucket,
690
+ ...corsConfig,
691
+ });
692
+ }
693
+ if (cloudfrontAccess?.enabled) {
694
+ const oai = new _1.OriginAccessIdentity(this, "OriginAccessIdentity", {
695
+ comment: `OAI for ${this.resource.bucket}`,
696
+ });
697
+ this.originAccessIdentity = oai;
698
+ const resources = (cloudfrontAccess.keyPatterns ?? ["*"]).map((keyPattern) => this.arnForObjects(keyPattern));
699
+ this.addToResourcePolicy(new iam.PolicyStatement({
700
+ resources,
701
+ actions: ["s3:GetObject"],
702
+ principals: [oai.grantPrincipal],
703
+ }));
704
+ }
705
+ if (this.eventBridgeEnabled) {
706
+ this.enableEventBridgeNotification();
707
+ }
708
+ this.encryptionKey = encryptionKey;
709
+ if (bucketEncryption) {
710
+ new provider_aws_1.s3BucketServerSideEncryptionConfiguration.S3BucketServerSideEncryptionConfigurationA(this, "Encryption", {
711
+ bucket: this.resource.bucket,
712
+ ...bucketEncryption,
713
+ });
714
+ }
715
+ }
716
+ /**
717
+ * Set up key properties and return the Bucket encryption property from the
718
+ * user's configuration, according to the following table:
719
+ *
720
+ * | props.encryption | props.encryptionKey | props.bucketKeyEnabled | bucketEncryption (return value) | encryptionKey (return value) |
721
+ * |------------------|---------------------|------------------------|---------------------------------|------------------------------|
722
+ * | undefined | undefined | e | undefined | undefined |
723
+ * | UNENCRYPTED | undefined | false | undefined | undefined |
724
+ * | undefined | k | e | SSE-KMS, bucketKeyEnabled = e | k |
725
+ * | KMS | k | e | SSE-KMS, bucketKeyEnabled = e | k |
726
+ * | KMS | undefined | e | SSE-KMS, bucketKeyEnabled = e | new key |
727
+ * | KMS_MANAGED | undefined | e | SSE-KMS, bucketKeyEnabled = e | undefined |
728
+ * | S3_MANAGED | undefined | false | SSE-S3 | undefined |
729
+ * | S3_MANAGED | undefined | e | SSE-S3, bucketKeyEnabled = e | undefined |
730
+ * | UNENCRYPTED | undefined | true | ERROR! | ERROR! |
731
+ * | UNENCRYPTED | k | e | ERROR! | ERROR! |
732
+ * | KMS_MANAGED | k | e | ERROR! | ERROR! |
733
+ * | S3_MANAGED | undefined | true | ERROR! | ERROR! |
734
+ * | S3_MANAGED | k | e | ERROR! | ERROR! |
735
+ */
736
+ parseEncryption(props) {
737
+ // default based on whether encryptionKey is specified
738
+ let encryptionType = props.encryption;
739
+ if (encryptionType === undefined) {
740
+ encryptionType = props.encryptionKey
741
+ ? BucketEncryption.KMS
742
+ : BucketEncryption.UNENCRYPTED;
743
+ }
744
+ // if encryption key is set, encryption must be set to KMS or DSSE.
745
+ if (encryptionType !== BucketEncryption.DSSE &&
746
+ encryptionType !== BucketEncryption.KMS &&
747
+ props.encryptionKey) {
748
+ throw new Error(`encryptionKey is specified, so 'encryption' must be set to KMS or DSSE (value: ${encryptionType})`);
749
+ }
750
+ // if bucketKeyEnabled is set, encryption can not be BucketEncryption.UNENCRYPTED
751
+ if (props.bucketKeyEnabled &&
752
+ encryptionType === BucketEncryption.UNENCRYPTED) {
753
+ throw new Error(`bucketKeyEnabled is specified, so 'encryption' must be set to KMS, DSSE or S3 (value: ${encryptionType})`);
754
+ }
755
+ if (encryptionType === BucketEncryption.UNENCRYPTED) {
756
+ return { bucketEncryption: undefined, encryptionKey: undefined };
757
+ }
758
+ if (encryptionType === BucketEncryption.KMS) {
759
+ const encryptionKey = props.encryptionKey ||
760
+ new kms.Key(this, "Key", {
761
+ description: `Created by ${this.node.path}`,
762
+ enableKeyRotation: true,
763
+ });
764
+ return {
765
+ encryptionKey,
766
+ bucketEncryption: {
767
+ // (Optional) Account ID of the expected bucket owner.
768
+ // expectedBucketOwner
769
+ rule: [
770
+ {
771
+ bucketKeyEnabled: props.bucketKeyEnabled,
772
+ applyServerSideEncryptionByDefault: {
773
+ sseAlgorithm: "aws:kms",
774
+ kmsMasterKeyId: encryptionKey.keyArn,
775
+ },
776
+ },
777
+ ],
778
+ },
779
+ };
780
+ }
781
+ if (encryptionType === BucketEncryption.S3_MANAGED) {
782
+ return {
783
+ bucketEncryption: {
784
+ // (Optional) Account ID of the expected bucket owner.
785
+ // expectedBucketOwner
786
+ rule: [
787
+ {
788
+ bucketKeyEnabled: props.bucketKeyEnabled,
789
+ applyServerSideEncryptionByDefault: { sseAlgorithm: "AES256" },
790
+ },
791
+ ],
792
+ },
793
+ };
794
+ }
795
+ if (encryptionType === BucketEncryption.KMS_MANAGED) {
796
+ return {
797
+ bucketEncryption: {
798
+ // (Optional) Account ID of the expected bucket owner.
799
+ // expectedBucketOwner
800
+ rule: [
801
+ {
802
+ bucketKeyEnabled: props.bucketKeyEnabled,
803
+ applyServerSideEncryptionByDefault: { sseAlgorithm: "aws:kms" },
804
+ },
805
+ ],
806
+ },
807
+ };
808
+ }
809
+ if (encryptionType === BucketEncryption.DSSE) {
810
+ const encryptionKey = props.encryptionKey ||
811
+ new kms.Key(this, "Key", {
812
+ description: `Created by ${this.node.path}`,
813
+ });
814
+ return {
815
+ encryptionKey,
816
+ bucketEncryption: {
817
+ // (Optional) Account ID of the expected bucket owner.
818
+ // expectedBucketOwner
819
+ rule: [
820
+ {
821
+ bucketKeyEnabled: props.bucketKeyEnabled,
822
+ applyServerSideEncryptionByDefault: {
823
+ sseAlgorithm: "aws:kms:dsse",
824
+ kmsMasterKeyId: encryptionKey.keyArn,
825
+ },
826
+ },
827
+ ],
828
+ },
829
+ };
830
+ }
831
+ if (encryptionType === BucketEncryption.DSSE_MANAGED) {
832
+ return {
833
+ bucketEncryption: {
834
+ // (Optional) Account ID of the expected bucket owner.
835
+ // expectedBucketOwner
836
+ rule: [
837
+ {
838
+ bucketKeyEnabled: props.bucketKeyEnabled,
839
+ applyServerSideEncryptionByDefault: {
840
+ sseAlgorithm: "aws:kms:dsse",
841
+ },
842
+ },
843
+ ],
844
+ },
845
+ };
846
+ }
847
+ throw new Error(`Unexpected 'encryptionType': ${encryptionType}`);
848
+ }
538
849
  /**
539
850
  * Adds an iam statement to enforce SSL requests only.
540
851
  */
@@ -576,33 +887,10 @@ class Bucket extends __1.AwsConstructBase {
576
887
  });
577
888
  this.addToResourcePolicy(statement);
578
889
  }
579
- /**
580
- * Adds resource to the Terraform JSON output at Synth time.
581
- *
582
- * called by TerraformStack.prepareStack()
583
- */
584
- toTerraform() {
585
- /**
586
- * A preparing resolve might add new resources to the stack
587
- *
588
- * should not add resources if no bucket sources are defined
589
- */
590
- if (Object.keys(this.sources).length === 0) {
591
- return {};
592
- }
593
- for (const source of this.sources) {
594
- // TODO: Ideally we should have used IResolvable.resolve and use the IResolveContext.preparing flag
595
- // ref: https://github.com/aws/aws-cdk/blob/v2.170.0/packages/aws-cdk-lib/aws-iam/lib/policy-document.ts#L48
596
- if (this.node.tryFindChild(source.id))
597
- continue; // ignore if already generated
598
- new _1.BucketSource(this, source.id, source.props);
599
- }
600
- return {};
601
- }
602
890
  }
603
891
  exports.Bucket = Bucket;
604
- _a = JSII_RTTI_SYMBOL_1;
605
- Bucket[_a] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.0.11" };
892
+ _b = JSII_RTTI_SYMBOL_1;
893
+ Bucket[_b] = { fqn: "terraconstructs.aws.storage.Bucket", version: "0.0.12" };
606
894
  /**
607
895
  * Storage class to move an object to
608
896
  */
@@ -663,6 +951,41 @@ var StorageClass;
663
951
  */
664
952
  StorageClass["INTELLIGENT_TIERING"] = "INTELLIGENT_TIERING";
665
953
  })(StorageClass || (exports.StorageClass = StorageClass = {}));
954
+ /**
955
+ * What kind of server-side encryption to apply to this bucket
956
+ */
957
+ var BucketEncryption;
958
+ (function (BucketEncryption) {
959
+ /**
960
+ * Previous option. Buckets can not be unencrypted now.
961
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html
962
+ * @deprecated S3 applies server-side encryption with SSE-S3 for every bucket
963
+ * that default encryption is not configured.
964
+ */
965
+ BucketEncryption["UNENCRYPTED"] = "UNENCRYPTED";
966
+ /**
967
+ * Server-side KMS encryption with a master key managed by KMS.
968
+ */
969
+ BucketEncryption["KMS_MANAGED"] = "KMS_MANAGED";
970
+ /**
971
+ * Server-side encryption with a master key managed by S3.
972
+ */
973
+ BucketEncryption["S3_MANAGED"] = "S3_MANAGED";
974
+ /**
975
+ * Server-side encryption with a KMS key managed by the user.
976
+ * If `encryptionKey` is specified, this key will be used, otherwise, one will be defined.
977
+ */
978
+ BucketEncryption["KMS"] = "KMS";
979
+ /**
980
+ * Double server-side KMS encryption with a master key managed by KMS.
981
+ */
982
+ BucketEncryption["DSSE_MANAGED"] = "DSSE_MANAGED";
983
+ /**
984
+ * Double server-side encryption with a KMS key managed by the user.
985
+ * If `encryptionKey` is specified, this key will be used, otherwise, one will be defined.
986
+ */
987
+ BucketEncryption["DSSE"] = "DSSE";
988
+ })(BucketEncryption || (exports.BucketEncryption = BucketEncryption = {}));
666
989
  /**
667
990
  * Notification event types.
668
991
  * @link https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html#supported-notification-event-types
@@ -866,4 +1189,4 @@ var EventType;
866
1189
  */
867
1190
  EventType["OBJECT_ACL_PUT"] = "s3:ObjectAcl:Put";
868
1191
  })(EventType || (exports.EventType = EventType = {}));
869
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNEQVM2QjtBQUM3Qix3REFBNkM7QUFFN0Msd0JBVVc7QUFDWCwwQkFLWTtBQUNaLDhCQUE4QjtBQUM5Qix3Q0FBd0M7QUF1ZnhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxNQUFhLE1BQU8sU0FBUSxvQkFBZ0I7SUFVMUMsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBU0QsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQztJQUMzQyxDQUFDO0lBV0QsWUFBWSxLQUFnQixFQUFFLElBQVksRUFBRSxRQUFxQixFQUFFO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBN0M1QixnQkFBZ0I7UUFDQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQThDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDdEIsUUFBUSxFQUFFLEdBQUcsRUFBRSxD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QyxDQUFBO0lBRXJDOzs7Ozs7T0FNRztJQUNILHdEQUEyQyxDQUFBO0lBRTNDOzs7Ozs7T0FNRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7Ozs7T0FNRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7Ozs7T0FNRztJQUNILGtHQUFxRixDQUFBO0lBRXJGOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsa0RBQXFDLENBQUE7SUFFckM7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILDBGQUE2RSxDQUFBO0lBRTdFOzs7Ozs7O09BT0c7SUFDSCwwREFBNkMsQ0FBQTtJQUU3Qzs7Ozs7OztPQU9HO0lBQ0gsb0VBQXVELENBQUE7SUFFdkQ7Ozs7Ozs7T0FPRztJQUNILDhEQUFpRCxDQUFBO0lBRWpEOzs7O09BSUc7SUFDSCw4RUFBaUUsQ0FBQTtJQUVqRTs7O09BR0c7SUFDSCxtR0FBc0YsQ0FBQTtJQUV0Rjs7OztPQUlHO0lBQ0gsK0ZBQWtGLENBQUE7SUFFbEY7Ozs7T0FJRztJQUNILGtIQUFxRyxDQUFBO0lBRXJHOzs7O09BSUc7SUFDSCxxRkFBd0UsQ0FBQTtJQUV4RTs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILDBFQUE2RCxDQUFBO0lBRTdEOzs7O09BSUc7SUFDSCxzR0FBeUYsQ0FBQTtJQUV6Rjs7O09BR0c7SUFDSCw0REFBK0MsQ0FBQTtJQUUvQzs7OztPQUlHO0lBQ0gsMERBQTZDLENBQUE7SUFFN0M7OztPQUdHO0lBQ0gsa0RBQXFDLENBQUE7SUFFckM7Ozs7T0FJRztJQUNILHdEQUEyQyxDQUFBO0lBRTNDOzs7T0FHRztJQUNILDhEQUFpRCxDQUFBO0lBRWpEOzs7OztPQUtHO0lBQ0gsZ0RBQW1DLENBQUE7QUFDckMsQ0FBQyxFQTdOVyxTQUFTLHlCQUFULFNBQVMsUUE2TnBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgczNCdWNrZXQsXG4gIHMzQnVja2V0QWNsLFxuICBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzLFxuICBzM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrLFxuICBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLFxuICBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0VmVyc2lvbmluZyxcbn0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci10aW1lXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgQnVja2V0U291cmNlLFxuICBCdWNrZXRTb3VyY2VQcm9wcyxcbiAgV2Vic2l0ZUNvbmZpZyxcbiAgQ29yc0NvbmZpZyxcbiAgTGlmZWN5Y2xlQ29uZmlndXJhdGlvblJ1bGUsXG4gIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICBCdWNrZXRQb2xpY3ksXG4gIEJ1Y2tldE5vdGlmaWNhdGlvbnMsXG4gIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbn0gZnJvbSBcIi5cIjtcbmltcG9ydCB7XG4gIEF3c0NvbnN0cnVjdEJhc2UsXG4gIElBd3NDb25zdHJ1Y3QsXG4gIEF3c0NvbnN0cnVjdFByb3BzLFxuICBBd3NTdGFjayxcbn0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0ICogYXMgcGVybXMgZnJvbSBcIi4vYnVja2V0LXBlcm1zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRmcm9udEFjY2Vzc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogT2JqZWN0IGtleSBwYXR0ZXJucyBmb3IgY2xvdWRmcm9udCBhY2Nlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiKlwiXG4gICAqL1xuICByZWFkb25seSBrZXlQYXR0ZXJucz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIHBhdGgocykgdG8gc3RhdGljIGRpcmVjdG9yaWVzIG9yIGZpbGVzIHRvIHVwbG9hZCwgcmVsYXRpdmUgdG8gdGhlIFN0YWNrIGZpbGUuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLi9kaXN0XCJcbiAgICogQGRlZmF1bHQgLSBObyBmaWxlcyBhcmUgdXBsb2FkZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VzPzogc3RyaW5nIHwgc3RyaW5nW10gfCBBZGRTb3VyY2VPcHRpb25zW107XG5cbiAgLy8gVE9ETzogQWRkIHN1cHBvcnQgdG8gcGFzcyBkb21haW4gcHJvcHMgKGZvciByb3V0ZTUzIGFsaWFzPylcblxuICAvKipcbiAgICogRW5hYmxlIHB1YmxpYyByZWFkIGFjY2VzcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBFbmFibGUgdGhpcyBvbmx5IGlmIHlvdSdyZSBub3QgdXNpbmcgQ0ROIChDbG91ZEZyb250KSB0byBzZXJ2ZSBmaWxlcyBmcm9tIHRoZSBidWNrZXQuXG4gICAqIFNob3VsZCBvbmx5IGJlIHR1cm5lZCBvbiBpZiB5b3Ugd2FudCB0byBob3N0IHB1YmxpYyBmaWxlcyBkaXJlY3RseSBmcm9tIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBmb3IgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogTXVzdCBiZSBsb3dlcmNhc2UgYW5kIGJldHdlZW4gMyAobWluKSBhbmQgNjMgKG1heCkgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBUaGUgbmFtZSBtdXN0IG5vdCBiZSBpbiB0aGUgZm9ybWF0IFtidWNrZXRfbmFtZV0tLVthemlkXS0teC1zMy4gVXNlIHRoZVxuICAgKiBgYXdzX3MzX2RpcmVjdG9yeV9idWNrZXRgIHJlc291cmNlIHRvIG1hbmFnZSBTMyBFeHByZXNzIGJ1Y2tldHMuXG4gICAqXG4gICAqIEEgZnVsbCBsaXN0IG9mIGJ1Y2tldCBuYW1pbmcgcnVsZXMgW21heSBiZSBmb3VuZCBoZXJlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9idWNrZXRuYW1pbmdydWxlcy5odG1sKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBSZWZlciB0byBgbmFtZVByZWZpeGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqIENvbmZsaWN0cyB3aXRoIGBidWNrZXROYW1lYC5cbiAgICpcbiAgICogVGVycmFmb3JtIFByZWZpeGVzIG11c3QgcmVzZXJ2ZSAyNiBjaGFyYWN0ZXJzIGZvciB0aGUgdGVycmFmb3JtIGdlbmVyYXRlZCBzdWZmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgRVQgd2lsbCBhc3NpZ24gYSByYW5kb20sIHVuaXF1ZSBuYW1lIHByZWZpeGVkIGJ5IEdyaWRVVUlELlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQm9vbGVhbiB0aGF0IGluZGljYXRlcyBhbGwgb2JqZWN0cyAoaW5jbHVkaW5nIGFueSBsb2NrZWQgb2JqZWN0cylcbiAgICogc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbSB0aGUgYnVja2V0IHdoZW4gdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWRcbiAgICogc28gdGhhdCB0aGUgYnVja2V0IGNhbiBiZSBkZXN0cm95ZWQgd2l0aG91dCBlcnJvci5cbiAgICpcbiAgICogVGhlc2Ugb2JqZWN0cyBhcmUgbm90IHJlY292ZXJhYmxlLiBUaGlzIG9ubHkgZGVsZXRlcyBvYmplY3RzIHdoZW5cbiAgICogdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWQsIG5vdCB3aGVuIHNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZS5cbiAgICpcbiAgICogT25jZSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlcmUgbXVzdCBiZSBhIHN1Y2Nlc3NmdWxcbiAgICogdGVycmFmb3JtIGFwcGx5IHJ1biBiZWZvcmUgYSBkZXN0cm95IGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSB0aGlzXG4gICAqIHZhbHVlIGluIHRoZSByZXNvdXJjZSBzdGF0ZS5cbiAgICpcbiAgICogV2l0aG91dCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5IGFmdGVyIHRoaXMgcGFyYW1ldGVyIGlzIHNldCxcbiAgICogdGhpcyBmbGFnIHdpbGwgaGF2ZSBubyBlZmZlY3QuIElmIHNldHRpbmcgdGhpcyBmaWVsZCBpbiB0aGUgc2FtZVxuICAgKiBvcGVyYXRpb24gdGhhdCB3b3VsZCByZXF1aXJlIHJlcGxhY2luZyB0aGUgYnVja2V0IG9yIGRlc3Ryb3lpbmdcbiAgICogdGhlIGJ1Y2tldCwgdGhpcyBmbGFnIHdpbGwgbm90IHdvcmsuXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSB3aGVuIGltcG9ydGluZyBhIGJ1Y2tldCwgYSBzdWNjZXNzZnVsIHRlcnJhZm9ybSBhcHBseVxuICAgKiBpcyByZXF1aXJlZCB0byBzZXQgdGhpcyB2YWx1ZSBpbiBzdGF0ZSBiZWZvcmUgaXQgd2lsbCB0YWtlIGVmZmVjdFxuICAgKiBvbiBhIGRlc3Ryb3kgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXN0cm95PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYW4gUzMgYnVja2V0IHdlYnNpdGUgY29uZmlndXJhdGlvbiByZXNvdXJjZS5cbiAgICpcbiAgICogSW1wb3J0YW50OiBBbWF6b24gUzMgd2Vic2l0ZSBlbmRwb2ludHMgZG8gbm90IHN1cHBvcnQgSFRUUFMgb3IgYWNjZXNzIHBvaW50cy5cbiAgICogSWYgeW91IHdhbnQgdG8gdXNlIEhUVFBTLCB5b3UgY2FuIHVzZSBlZGdlIERpc3RyaWJ1dGlvbiB0byBzZXJ2ZSBhIHN0YXRpY1xuICAgKiB3ZWJzaXRlIGhvc3RlZCBpbiBhIGJ1Y2tldC5cbiAgICpcbiAgICogVXNlIE9yaWdpbkFjY2Vzc0lkZW50aXR5IHByb3BlcnR5IHRvIGNvbnRyb2wgaW5ncmVzcyB0aHJvdWdoIGVkZ2UgRGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtIb3N0aW5nIFdlYnNpdGVzIG9uIFMzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9XZWJzaXRlSG9zdGluZy5odG1sKS5cbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVDb25maWc/OiBXZWJzaXRlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgQ09SUyBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDT1JTLCBnbyB0b1xuICAgKiBbRW5hYmxpbmcgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NvcnMuaHRtbClcbiAgICogaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0NvbmZpZz86IENvcnNDb25maWc7XG5cbiAgLyoqXG4gICAqIE9uZSBvciBtb3JlIExpZmVjeWNsZSBydWxlcy4gRWFjaCBydWxlIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqXG4gICAqICAtIFJ1bGUgaWRcbiAgICogIC0gRmlsdGVyIGlkZW50aWZ5aW5nIG9iamVjdHMgdG8gd2hpY2ggdGhlIHJ1bGUgYXBwbGllc1xuICAgKiAgLSBPbmUgb3IgbW9yZSB0cmFuc2l0aW9uIG9yIGV4cGlyYXRpb24gYWN0aW9uc1xuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlIG9uIFtMaWZlY3ljbGUgQ29uZmlndXJhdGlvbiBFbGVtZW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvaW50cm8tbGlmZWN5Y2xlLXJ1bGVzLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlmZWN5Y2xlUnVsZXM/OiBMaWZlY3ljbGVDb25maWd1cmF0aW9uUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB2ZXJzaW9uaW5nIG9uIHRoZSBTMyBidWNrZXQuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB3aWxsIHN1c3BlbmQgdmVyc2lvbmluZyBpZiB0aGUgYXNzb2NpYXRlZCBTMyBidWNrZXQgaXMgdmVyc2lvbmVkLlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIGVuYWJsaW5nIHZlcnNpb25pbmcgb24gdGhlIGJ1Y2tldCBmb3IgdGhlIGZpcnN0IHRpbWUsIEFXUyByZWNvbW1lbmRzIHRoYXQgeW91IHdhaXQgZm9yIDE1IG1pbnV0ZXMgYWZ0ZXIgZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAqIFRoaXMgd2lsbCBjYXVzZSAxNW0gZGVsYXkgaWYgYHBhdGhgIGlzIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgYnVja2V0IHNob3VsZCBzZW5kIG5vdGlmaWNhdGlvbnMgdG8gQW1hem9uIEV2ZW50QnJpZGdlIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50QnJpZGdlRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuZm9yY2VzIFNTTCBmb3IgcmVxdWVzdHMuIFMzLjUgb2YgdGhlIEFXUyBGb3VuZGF0aW9uYWwgU2VjdXJpdHkgQmVzdCBQcmFjdGljZXMgUmVnYXJkaW5nIFMzLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25maWcvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3MzLWJ1Y2tldC1zc2wtcmVxdWVzdHMtb25seS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmZvcmNlU1NMPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5mb3JjZXMgbWluaW11bSBUTFMgdmVyc2lvbiBmb3IgcmVxdWVzdHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIGBlbmZvcmNlU1NMYCB0byBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2FtYXpvbi1zMy1wb2xpY3kta2V5cy5odG1sI2V4YW1wbGUtb2JqZWN0LXRscy12ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIG1pbmltdW0gVExTIHZlcnNpb24gaXMgZW5mb3JjZWQuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtVExTVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRW5hYmxlIENsb3VkZnJvbnQgYWNjZXNzIHZpYSBPcmlnaW4gQWNjZXNzIElkZW50aXR5LlxuICAgKlxuICAgKiBOb3RlOiByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIE9BQyBpbiBmdXR1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2xvdWRmcm9udCBhY2Nlc3NcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkZnJvbnRBY2Nlc3M/OiBDbG91ZGZyb250QWNjZXNzQ29uZmlnO1xuXG4gIC8vIFRPRE86IEFkZCBmbGFnIHRvIHJlZ2lzdGVyIEJ1Y2tldCBTb3VyY2Ugb3V0cHV0cz9cbn1cblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldE91dHB1dHMge1xuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBhcm5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlRG9tYWluTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjQgRE5TIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3JpZ2luIEFjY2VzcyBJZGVudGl0eSwgaWYgY2xvdWRmcm9udEFjY2VzcyBpcyBlbmFibGVkLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbXBvcnRlZCBvciBjcmVhdGVkIEJ1Y2tldCBhdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1Y2tldCBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICAvKiogU3Ryb25nbHkgdHlwZWQgb3V0cHV0cyAqL1xuICByZWFkb25seSBidWNrZXRPdXRwdXRzOiBCdWNrZXRPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKiogV2hldGhlciB0aGUgYnVja2V0IGhhcyB2ZXJzaW9uaW5nIGVuYWJsZWQgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbmVkOiBib29sZWFuO1xuXG4gIC8qKiBUaGUgaG9zdGVkIFpvbmUgSWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcHVibGljIHJlYWQgYWNjZXNzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIFRoaXMgZXhwbGljaXRseSBkaXNhYmxlcyB0aGUgZGVmYXVsdCBTMyBidWNrZXQgc2VjdXJpdHkgc2V0dGluZ3MuIFRoaXNcbiAgICogc2hvdWxkIGJlIGRvbmUgd2l0aCBjYXV0aW9uLCBhcyBhbGwgYnVja2V0IG9iamVjdHMgYmVjb21lIHB1YmxpY2x5IGV4cG9zZWQuXG4gICAqXG4gICAqIFlvdSBkb24ndCBuZWVkIHRvIGVuYWJsZSB0aGlzIGlmIHlvdSdyZSB1c2luZyBDbG91ZEZyb250IHRvIHNlcnZlIGZpbGVzIGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhIGBCdWNrZXRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSBvZiBmaWxlcyBmb3IgdXBsb2FkIHRvIHRoZSBidWNrZXQuXG4gICAqL1xuICBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGJ1Y2tldCBoYXMgYmVlbiBjb25maWd1cmVkIGZvciBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICAgKi9cbiAgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgIHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmc7XG4gICAgYnVja2V0T3V0cHV0czogeyB3ZWJzaXRlVXJsOiBzdHJpbmc7IHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmcgfTtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGh0dHBzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL29ubHlidWNrZXRgXG4gICAqIC0gYGh0dHBzOi8vczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20vYnVja2V0L2tleWBcbiAgICogLSBgaHR0cHM6Ly9zMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24vY2hpbmEtYnVja2V0L215a2V5YFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICB1cmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgVVJMIG9mIGFuIFMzIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gICAqIC0gYHMzOi8vb25seWJ1Y2tldGBcbiAgICogLSBgczM6Ly9idWNrZXQva2V5YFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFMzIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBzM1VybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gQVJOIHRoYXQgcmVwcmVzZW50cyBhbGwgb2JqZWN0cyB3aXRoaW4gdGhlIGJ1Y2tldCB0aGF0IG1hdGNoXG4gICAqIHRoZSBrZXkgcGF0dGVybiBzcGVjaWZpZWQuIFRvIHJlcHJlc2VudCBhbGwga2V5cywgc3BlY2lmeSBgYFwiKlwiYGAuXG4gICAqL1xuICBhcm5Gb3JPYmplY3RzKGtleVBhdHRlcm46IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBwZXJtaXNzaW9uOiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRSZWFkKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICogQHBhcmFtIGFsbG93ZWRBY3Rpb25QYXR0ZXJucyBSZXN0cmljdCB0aGUgcGVybWlzc2lvbnMgdG8gY2VydGFpbiBsaXN0IG9mIGFjdGlvbiBwYXR0ZXJuc1xuICAgKi9cbiAgZ3JhbnRXcml0ZShcbiAgICBpZGVudGl0eTogaWFtLklHcmFudGFibGUsXG4gICAgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnksXG4gICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zPzogc3RyaW5nW10sXG4gICk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRQdXQoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIElBTSBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2Ygb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gQnVja2V0LlxuICAgKlxuICAgKiBjYWxsaW5nIGBncmFudFdyaXRlYCBvciBgZ3JhbnRSZWFkV3JpdGVgIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyBvZiB0aGUgb2JqZWN0cztcbiAgICogaW4gdGhpcyBjYXNlLCBpZiB5b3UgbmVlZCB0byBtb2RpZnkgb2JqZWN0IEFDTHMsIGNhbGwgdGhpcyBtZXRob2QgZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpXG4gICAqL1xuICBncmFudFB1dEFjbChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogc3RyaW5nKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgczM6RGVsZXRlT2JqZWN0KiBwZXJtaXNzaW9uIHRvIGFuIElBTSBwcmluY2lwYWwgZm9yIG9iamVjdHNcbiAgICogaW4gdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqL1xuICBncmFudERlbGV0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgYW4gZW5jcnlwdGlvbiBrZXkgaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSBmb3JcbiAgICogZW5jcnlwdC9kZWNyeXB0IHdpbGwgYWxzbyBiZSBncmFudGVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYHMzOlB1dE9iamVjdEFjbGAsIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gZ3JhbnQgcmVhZC93cml0ZSBvYmplY3QgYWNjZXNzIHRvIElBTSBwcmluY2lwYWxzIGluIG90aGVyIGFjY291bnRzLlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0aGUgcHJpbmNpcGFsIHRvIGhhdmUgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzLFxuICAgKiB1c2UgdGhlIGBncmFudFB1dEFjbGAgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvLyAvKipcbiAgLy8gICogQWxsb3dzIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gb2JqZWN0cyBmcm9tIHRoaXMgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBJTVBPUlRBTlQ6IFRoaXMgcGVybWlzc2lvbiBhbGxvd3MgYW55b25lIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiBTMyBvYmplY3RzXG4gIC8vICAqIGluIHRoaXMgYnVja2V0LCB3aGljaCBpcyB1c2VmdWwgZm9yIHdoZW4geW91IGNvbmZpZ3VyZSB5b3VyIGJ1Y2tldCBhcyBhXG4gIC8vICAqIHdlYnNpdGUgYW5kIHdhbnQgZXZlcnlvbmUgdG8gYmUgYWJsZSB0byByZWFkIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCB3aXRob3V0XG4gIC8vICAqIG5lZWRpbmcgdG8gYXV0aGVudGljYXRlLlxuICAvLyAgKlxuICAvLyAgKiBXaXRob3V0IGFyZ3VtZW50cywgdGhpcyBtZXRob2Qgd2lsbCBncmFudCByZWFkIChcInMzOkdldE9iamVjdFwiKSBhY2Nlc3MgdG9cbiAgLy8gICogYWxsIG9iamVjdHMgKFwiKlwiKSBpbiB0aGUgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGBpYW0uR3JhbnRgIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgbW9kaWZpZWRcbiAgLy8gICogYXMgbmVlZGVkLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQgYSBjb25kaXRpb24gdGhhdCB3aWxsIHJlc3RyaWN0IGFjY2VzcyBvbmx5XG4gIC8vICAqIHRvIGFuIElQdjQgcmFuZ2UgbGlrZSB0aGlzOlxuICAvLyAgKlxuICAvLyAgKiAgICAgY29uc3QgZ3JhbnQgPSBidWNrZXQuZ3JhbnRQdWJsaWNBY2Nlc3MoKTtcbiAgLy8gICogICAgIGdyYW50LnJlc291cmNlU3RhdGVtZW50IS5hZGRDb25kaXRpb24o4oCYSXBBZGRyZXNz4oCZLCB7IOKAnGF3czpTb3VyY2VJcOKAnTog4oCcNTQuMjQwLjE0My4wLzI04oCdIH0pO1xuICAvLyAgKlxuICAvLyAgKlxuICAvLyAgKiBAcGFyYW0ga2V5UHJlZml4IHRoZSBwcmVmaXggb2YgUzMgb2JqZWN0IGtleXMgKGUuZy4gYGhvbWUvKmApLiBEZWZhdWx0IGlzIFwiKlwiLlxuICAvLyAgKiBAcGFyYW0gYWxsb3dlZEFjdGlvbnMgdGhlIHNldCBvZiBTMyBhY3Rpb25zIHRvIGFsbG93LiBEZWZhdWx0IGlzIFwiczM6R2V0T2JqZWN0XCIuXG4gIC8vICAqIEByZXR1cm5zIFRoZSBgaWFtLlBvbGljeVN0YXRlbWVudGAgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBhcHBseSBlLmcuIGNvbmRpdGlvbnMuXG4gIC8vICAqL1xuICAvLyBncmFudFB1YmxpY0FjY2VzcyhrZXlQcmVmaXg/OiBzdHJpbmcsIC4uLmFsbG93ZWRBY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gdHJpZ2dlciB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKExhbWJkYSwgU05TIFRvcGljIG9yIFNRUyBRdWV1ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcnMgUzMgb2JqZWN0IGtleSBmaWx0ZXIgcnVsZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9iamVjdHNcbiAgICogdHJpZ2dlciB0aGlzIGV2ZW50LiBFYWNoIGZpbHRlciBtdXN0IGluY2x1ZGUgYSBgcHJlZml4YCBhbmQvb3IgYHN1ZmZpeGBcbiAgICogdGhhdCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgczMgb2JqZWN0IGtleS4gUmVmZXIgdG8gdGhlIFMzIERldmVsb3BlciBHdWlkZVxuICAgKiBmb3IgZGV0YWlscyBhYm91dCBhbGxvd2VkIGZpbHRlciBydWxlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sI25vdGlmaWNhdGlvbi1ob3ctdG8tZmlsdGVyaW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgbXlMYW1iZGE6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICogICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUxhbWJkYSksIHtwcmVmaXg6ICdob21lL215dXNlcm5hbWUvKid9KVxuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogY3JlYXRlZCBpbiB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBhZGRPYmplY3RDcmVhdGVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGV2ZW50IGJyaWRnZSBub3RpZmljYXRpb24sIGNhdXNpbmcgYWxsIGV2ZW50cyBiZWxvdyB0byBiZSBzZW50IHRvIEV2ZW50QnJpZGdlOlxuICAgKlxuICAgKiAtIE9iamVjdCBEZWxldGVkIChEZWxldGVPYmplY3QpXG4gICAqIC0gT2JqZWN0IERlbGV0ZWQgKExpZmVjeWNsZSBleHBpcmF0aW9uKVxuICAgKiAtIE9iamVjdCBSZXN0b3JlIEluaXRpYXRlZFxuICAgKiAtIE9iamVjdCBSZXN0b3JlIENvbXBsZXRlZFxuICAgKiAtIE9iamVjdCBSZXN0b3JlIEV4cGlyZWRcbiAgICogLSBPYmplY3QgU3RvcmFnZSBDbGFzcyBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFjY2VzcyBUaWVyIENoYW5nZWRcbiAgICogLSBPYmplY3QgQUNMIFVwZGF0ZWRcbiAgICogLSBPYmplY3QgVGFncyBBZGRlZFxuICAgKiAtIE9iamVjdCBUYWdzIERlbGV0ZWRcbiAgICovXG4gIGVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIGJlYWNvbiBwcm92aWRlcyBhbiBbQVdTIFMzIEJ1Y2tldF0oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zMy8pLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoc3RhY2ssIFwiTXlXZWJzaXRlXCIsIHtcbiAqICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgXCJkaXN0XCIpLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFB1YmxpYyByZWFkIGFjY2Vzc1xuICpcbiAqIEVuYWJsZXMgYHB1YmxpY2AgcmVhZCBhY2Nlc3MgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGJ1Y2tldC4gRGFuZ2Vyb3VzIGFuZFxuICogcmVjb21tZW5kZWQgdG8gdXNlIGVkZ2UuRGlzdHJpYnV0aW9uIGluc3RlYWQuXG4gKlxuICogVXNlZnVsIGZvciBob3N0aW5nIHB1YmxpYyBmaWxlcyBkaXJlY3RseSBmcm9tIFMzLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoXCJNeUJ1Y2tldFwiLCB7XG4gKiAgIHB1YmxpYzogdHJ1ZVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcmVzb3VyY2UgYXdzX3MzX2J1Y2tldFxuICogQHRlcnJhY29uc3RydWN0IHN0b3JhZ2UuSUJ1Y2tldFxuICovXG5cbmV4cG9ydCBjbGFzcyBCdWNrZXQgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSUJ1Y2tldCB7XG4gIC8vIFRPRE86IEFkZCBzdGF0aWMgZnJvbUxvb2t1cD9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOiBzM0J1Y2tldC5TM0J1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdlYnNpdGVDb25maWc/OiBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLlMzQnVja2V0V2Vic2l0ZUNvbmZpZ3VyYXRpb247XG4gIHByb3RlY3RlZCByZWFkb25seSBjb3JzQ29uZmlnPzogczNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbi5TM0J1Y2tldENvcnNDb25maWd1cmF0aW9uO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzOiBTb3VyY2VJbmRleFtdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdmVyc2lvbmVkOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0IHZlcnNpb25lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbmVkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfb3V0cHV0czogQnVja2V0T3V0cHV0cztcbiAgcHVibGljIGdldCBidWNrZXRPdXRwdXRzKCk6IEJ1Y2tldE91dHB1dHMge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXRPdXRwdXRzO1xuICB9XG5cbiAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYnVja2V0O1xuICB9XG4gIHB1YmxpYyBnZXQgYnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYXJuO1xuICB9XG4gIHB1YmxpYyBnZXQgaG9zdGVkWm9uZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuaG9zdGVkWm9uZUlkO1xuICB9XG4gIHB1YmxpYyBnZXQgd2Vic2l0ZURvbWFpbk5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRG9tYWluO1xuICB9XG5cbiAgcHVibGljIHBvbGljeT86IEJ1Y2tldFBvbGljeTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHdlYnNpdGVDb25maWcsIGNvcnNDb25maWcsIGNsb3VkZnJvbnRBY2Nlc3MgfSA9IHByb3BzO1xuICAgIHRoaXMuX2lzV2Vic2l0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHByb3BzLmJ1Y2tldE5hbWUgJiYgcHJvcHMubmFtZVByZWZpeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGJvdGggJ2J1Y2tldE5hbWUnIGFuZCAnbmFtZVByZWZpeCcuIFVzZSBvbmx5IG9uZS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1Y2tldFByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghcHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgLy8gQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIGFuZCBiZXR3ZWVuIDMgKG1pbikgYW5kIDYzIChtYXgpIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgIGJ1Y2tldFByZWZpeCA9IHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiAocHJvcHMubmFtZVByZWZpeCA/PyB0aGlzLmdyaWRVVUlEKSArIFwiLVwiLFxuICAgICAgICBsb3dlckNhc2U6IHRydWUsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCIuLVwiLFxuICAgICAgICBtYXhMZW5ndGg6IDYzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzM0J1Y2tldC5TM0J1Y2tldCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGJ1Y2tldDogcHJvcHMuYnVja2V0TmFtZSxcbiAgICAgIGZvcmNlRGVzdHJveTogcHJvcHMuZm9yY2VEZXN0cm95LFxuICAgICAgYnVja2V0UHJlZml4LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdmVyc2lvbmVkID0gcHJvcHMudmVyc2lvbmVkID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLl92ZXJzaW9uZWQpIHtcbiAgICAgIG5ldyBzM0J1Y2tldFZlcnNpb25pbmcuUzNCdWNrZXRWZXJzaW9uaW5nQSh0aGlzLCBcIlZlcnNpb25pbmdcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICB2ZXJzaW9uaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHN0YXR1czogdGhpcy5fdmVyc2lvbmVkID8gXCJFbmFibGVkXCIgOiBcIlN1c3BlbmRlZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRCcmlkZ2VFbmFibGVkID0gcHJvcHMuZXZlbnRCcmlkZ2VFbmFibGVkO1xuXG4gICAgaWYgKHByb3BzLnNvdXJjZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuc291cmNlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmFkZFNvdXJjZSh7IHBhdGg6IHByb3BzLnNvdXJjZXMgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuc291cmNlcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQcm9wcyBvZiBwcm9wcy5zb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBzb3VyY2VQcm9wcyB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2Uoc291cmNlUHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5saWZlY3ljbGVSdWxlcykge1xuICAgICAgbmV3IHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5TM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiTGlmZUN5Y2xlQ29uZmlnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgIHJ1bGU6IHByb3BzLmxpZmVjeWNsZVJ1bGVzLm1hcCgocnVsZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnJ1bGUsXG4gICAgICAgICAgICBzdGF0dXM6IHJ1bGUuZW5hYmxlZCA/IFwiRW5hYmxlZFwiIDogXCJEaXNhYmxlZFwiLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5mb3JjZSBBV1MgRm91bmRhdGlvbmFsIFNlY3VyaXR5IEJlc3QgUHJhY3RpY2VcbiAgICBpZiAocHJvcHMuZW5mb3JjZVNTTCkge1xuICAgICAgdGhpcy5lbmZvcmNlU1NMU3RhdGVtZW50KCk7XG4gICAgICB0aGlzLm1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLm1pbmltdW1UTFNWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiJ2VuZm9yY2VTU0wnIG11c3QgYmUgZW5hYmxlZCBmb3IgJ21pbmltdW1UTFNWZXJzaW9uJyB0byBiZSBhcHBsaWVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh3ZWJzaXRlQ29uZmlnICYmIHdlYnNpdGVDb25maWcuZW5hYmxlZCkge1xuICAgICAgdGhpcy5faXNXZWJzaXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMud2Vic2l0ZUNvbmZpZyA9XG4gICAgICAgIG5ldyBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLlMzQnVja2V0V2Vic2l0ZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIldlYnNpdGVDb25maWdcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgICAgLi4ud2Vic2l0ZUNvbmZpZyxcbiAgICAgICAgICAgIGluZGV4RG9jdW1lbnQ6IHdlYnNpdGVDb25maWc/LmluZGV4RG9jdW1lbnRcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBzdWZmaXg6IHdlYnNpdGVDb25maWcuaW5kZXhEb2N1bWVudCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiBcImluZGV4Lmh0bWxcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5wdWJsaWMgPSBwcm9wcy5wdWJsaWMgPz8gZmFsc2U7XG4gICAgaWYgKHRoaXMucHVibGljKSB7XG4gICAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gTGF6eSBjb25maWcgdXNpbmcgXCJncmFudFB1YmxpY0FjY2Vzc1wiIG1lY2hhbmlzbSBpbnN0ZWFkP1xuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMODUwXG4gICAgICBjb25zdCBvd25lcnNoaXBDb250cm9scyA9XG4gICAgICAgIG5ldyBzM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzLlMzQnVja2V0T3duZXJzaGlwQ29udHJvbHMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIk93bmVyc2hpcENvbnRyb2xzXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIHJ1bGU6IHtcbiAgICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBcIkJ1Y2tldE93bmVyUHJlZmVycmVkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaWNBY2Nlc3NCbG9jayA9XG4gICAgICAgIG5ldyBzM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrLlMzQnVja2V0UHVibGljQWNjZXNzQmxvY2soXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIlB1YmxpY0FjY2Vzc0Jsb2NrXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICBibG9ja1B1YmxpY1BvbGljeTogZmFsc2UsXG4gICAgICAgICAgICBpZ25vcmVQdWJsaWNBY2xzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RyaWN0UHVibGljQnVja2V0czogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIG5ldyBzM0J1Y2tldEFjbC5TM0J1Y2tldEFjbCh0aGlzLCBcIlB1YmxpY0FjbFwiLCB7XG4gICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgIGFjbDogXCJwdWJsaWMtcmVhZFwiLFxuICAgICAgICBkZXBlbmRzT246IFtvd25lcnNoaXBDb250cm9scywgcHVibGljQWNjZXNzQmxvY2tdLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmFybkZvck9iamVjdHMoXCIqXCIpXSxcbiAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIl0sXG4gICAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyAvLyBwb2xpY3kgZGVwZW5kcyBvbiBwdWJsaWMgYWNjZXNzIGJsb2NrP1xuICAgICAgLy8gLy8gaXMgdGhpcyBuZWVkZWQ/XG4gICAgICAvLyBpZiAocG9saWN5RGVwZW5kYWJsZSAmJiBwb2xpY3lEZXBlbmRhYmxlIGluc3RhbmNlb2YgQ29uc3RydWN0KSB7XG4gICAgICAvLyAgIHBvbGljeURlcGVuZGFibGUubm9kZS5hZGREZXBlbmRlbmN5KHB1YmxpY0FjY2Vzc0Jsb2NrKTtcbiAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBpZiAoY29yc0NvbmZpZykge1xuICAgICAgdGhpcy5jb3JzQ29uZmlnID0gbmV3IHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24uUzNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJDb3JzQ29uZmlnXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICAgIC4uLmNvcnNDb25maWcsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBvcmlnaW5BY2Nlc3NJZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChjbG91ZGZyb250QWNjZXNzPy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBvYWkgPSBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgXCJPcmlnaW5BY2Nlc3NJZGVudGl0eVwiLCB7XG4gICAgICAgIGNvbW1lbnQ6IGBPQUkgZm9yICR7dGhpcy5yZXNvdXJjZS5idWNrZXR9YCxcbiAgICAgIH0pO1xuICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UGF0aDtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IChjbG91ZGZyb250QWNjZXNzLmtleVBhdHRlcm5zID8/IFtcIipcIl0pLm1hcChcbiAgICAgICAgKGtleVBhdHRlcm4pID0+IHRoaXMuYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtvYWkuZ3JhbnRQcmluY2lwYWxdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXZlbnRCcmlkZ2VFbmFibGVkKSB7XG4gICAgICB0aGlzLmVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy9yZWdpc3RlciBvdXRwdXRzXG4gICAgdGhpcy5fb3V0cHV0cyA9IHtcbiAgICAgIG5hbWU6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgYXJuOiB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMucmVzb3VyY2UuYnVja2V0RG9tYWluTmFtZSxcbiAgICAgIHJlZ2lvbmFsRG9tYWluTmFtZTogdGhpcy5yZXNvdXJjZS5idWNrZXRSZWdpb25hbERvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlRG9tYWluTmFtZTogdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRG9tYWluLFxuICAgICAgd2Vic2l0ZVVybDogdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQsXG4gICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYGJ1Y2tldEFybmAgYW5kIGBhcm5Gb3JPYmplY3RzKGtleXMpYCB0byBvYnRhaW4gQVJOcyBmb3JcbiAgICogdGhpcyBidWNrZXQgb3Igb2JqZWN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHBlcm1pc3Npb246IGlhbS5Qb2xpY3lTdGF0ZW1lbnQsXG4gICk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICAvLyBUT0RPOiByZS1hZGQgYXV0b0NyZWF0ZVBvbGljeSBvcHRpb24/XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMNjUyXG4gICAgaWYgKCF0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kgPSBuZXcgQnVja2V0UG9saWN5KHRoaXMsIFwiUG9saWN5XCIsIHsgYnVja2V0OiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwZXJtaXNzaW9uKTtcbiAgICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiB0cnVlLCBwb2xpY3lEZXBlbmRhYmxlOiB0aGlzLnBvbGljeSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IGFuZCBpdCdzIGNvbnRlbnRzIHRvIGFuIElBTVxuICAgKiBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBkZWNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuQlVDS0VUX1JFQURfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9SRUFEX0FDVElPTlMsXG4gICAgICB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICBjb25zdCBncmFudGVkV3JpdGVBY3Rpb25zID1cbiAgICAgIGFsbG93ZWRBY3Rpb25QYXR0ZXJucy5sZW5ndGggPiAwXG4gICAgICAgID8gYWxsb3dlZEFjdGlvblBhdHRlcm5zXG4gICAgICAgIDogdGhpcy53cml0ZUFjdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIGdyYW50ZWRXcml0ZUFjdGlvbnMsXG4gICAgICBwZXJtcy5LRVlfV1JJVEVfQUNUSU9OUyxcbiAgICAgIHRoaXMucmVzb3VyY2UuYXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpQdXRPYmplY3QqIGFuZCBzMzpBYm9ydCogcGVybWlzc2lvbnMgZm9yIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDVElPTlMsXG4gICAgICBwZXJtcy5LRVlfV1JJVEVfQUNUSU9OUyxcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFB1dEFjbChcbiAgICBpZGVudGl0eTogaWFtLklHcmFudGFibGUsXG4gICAgb2JqZWN0c0tleVBhdHRlcm46IHN0cmluZyA9IFwiKlwiLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuQlVDS0VUX1BVVF9BQ0xfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBzMzpEZWxldGVPYmplY3QqIHBlcm1pc3Npb24gdG8gYW4gSUFNIHByaW5jaXBhbCBmb3Igb2JqZWN0c1xuICAgKiBpbiB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICovXG4gIHB1YmxpYyBncmFudERlbGV0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfREVMRVRFX0FDVElPTlMsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFJlYWRXcml0ZShcbiAgICBpZGVudGl0eTogaWFtLklHcmFudGFibGUsXG4gICAgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiLFxuICApIHtcbiAgICBjb25zdCBidWNrZXRBY3Rpb25zID0gcGVybXMuQlVDS0VUX1JFQURfQUNUSU9OUy5jb25jYXQodGhpcy53cml0ZUFjdGlvbnMpO1xuICAgIC8vIHdlIG5lZWQgdW5pcXVlIHBlcm1pc3Npb25zIGJlY2F1c2Ugc29tZSBwZXJtaXNzaW9ucyBhcmUgY29tbW9uIGJldHdlZW4gcmVhZCBhbmQgd3JpdGUga2V5IGFjdGlvbnNcbiAgICBjb25zdCBrZXlBY3Rpb25zID0gW1xuICAgICAgLi4ubmV3IFNldChbLi4ucGVybXMuS0VZX1JFQURfQUNUSU9OUywgLi4ucGVybXMuS0VZX1dSSVRFX0FDVElPTlNdKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIGJ1Y2tldEFjdGlvbnMsXG4gICAgICBrZXlBY3Rpb25zLFxuICAgICAgdGhpcy5yZXNvdXJjZS5hcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgdGhyb3VnaCBgcHJvcHMucHVibGljYCBpbiBjb25zdHJ1Y3RvclxuICAvLyAvKipcbiAgLy8gICogQWxsb3dzIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gb2JqZWN0cyBmcm9tIHRoaXMgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBJTVBPUlRBTlQ6IFRoaXMgcGVybWlzc2lvbiBhbGxvd3MgYW55b25lIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiBTMyBvYmplY3RzXG4gIC8vICAqIGluIHRoaXMgYnVja2V0LCB3aGljaCBpcyB1c2VmdWwgZm9yIHdoZW4geW91IGNvbmZpZ3VyZSB5b3VyIGJ1Y2tldCBhcyBhXG4gIC8vICAqIHdlYnNpdGUgYW5kIHdhbnQgZXZlcnlvbmUgdG8gYmUgYWJsZSB0byByZWFkIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCB3aXRob3V0XG4gIC8vICAqIG5lZWRpbmcgdG8gYXV0aGVudGljYXRlLlxuICAvLyAgKlxuICAvLyAgKiBXaXRob3V0IGFyZ3VtZW50cywgdGhpcyBtZXRob2Qgd2lsbCBncmFudCByZWFkIChcInMzOkdldE9iamVjdFwiKSBhY2Nlc3MgdG9cbiAgLy8gICogYWxsIG9iamVjdHMgKFwiKlwiKSBpbiB0aGUgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGBpYW0uR3JhbnRgIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgbW9kaWZpZWRcbiAgLy8gICogYXMgbmVlZGVkLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQgYSBjb25kaXRpb24gdGhhdCB3aWxsIHJlc3RyaWN0IGFjY2VzcyBvbmx5XG4gIC8vICAqIHRvIGFuIElQdjQgcmFuZ2UgbGlrZSB0aGlzOlxuICAvLyAgKlxuICAvLyAgKiAgICAgY29uc3QgZ3JhbnQgPSBidWNrZXQuZ3JhbnRQdWJsaWNBY2Nlc3MoKTtcbiAgLy8gICogICAgIGdyYW50LnJlc291cmNlU3RhdGVtZW50IS5hZGRDb25kaXRpb24o4oCYSXBBZGRyZXNz4oCZLCB7IOKAnGF3czpTb3VyY2VJcOKAnTog4oCcNTQuMjQwLjE0My4wLzI04oCdIH0pO1xuICAvLyAgKlxuICAvLyAgKiBOb3RlIHRoYXQgaWYgdGhpcyBgSUJ1Y2tldGAgcmVmZXJzIHRvIGFuIGV4aXN0aW5nIGJ1Y2tldCwgcG9zc2libHkgbm90XG4gIC8vICAqIG1hbmFnZWQgYnkgQ2xvdWRGb3JtYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QsIHNpbmNlIGl0J3NcbiAgLy8gICogaW1wb3NzaWJsZSB0byBtb2RpZnkgdGhlIHBvbGljeSBvZiBhbiBleGlzdGluZyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIEBwYXJhbSBrZXlQcmVmaXggdGhlIHByZWZpeCBvZiBTMyBvYmplY3Qga2V5cyAoZS5nLiBgaG9tZS8qYCkuIERlZmF1bHQgaXMgXCIqXCIuXG4gIC8vICAqIEBwYXJhbSBhbGxvd2VkQWN0aW9ucyB0aGUgc2V0IG9mIFMzIGFjdGlvbnMgdG8gYWxsb3cuIERlZmF1bHQgaXMgXCJzMzpHZXRPYmplY3RcIi5cbiAgLy8gICovXG4gIC8vIHB1YmxpYyBncmFudFB1YmxpY0FjY2VzcyhrZXlQcmVmaXggPSBcIipcIiwgLi4uYWxsb3dlZEFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gIC8vICAgaWYgKCF0aGlzLnB1YmxpYykge1xuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdyYW50IHB1YmxpYyBhY2Nlc3Mgd2hlbiAncHVibGljJyBpcyBlbmFibGVkXCIpO1xuICAvLyAgIH1cbiAgLy8gICAvLyBURE9POiBUaGlzIHNob3VsZCBjcmVhdGUgcHVibGljQWNjZXNzIHJlc291cmNlXG4gIC8vICAgYWxsb3dlZEFjdGlvbnMgPVxuICAvLyAgICAgYWxsb3dlZEFjdGlvbnMubGVuZ3RoID4gMCA/IGFsbG93ZWRBY3Rpb25zIDogW1wiczM6R2V0T2JqZWN0XCJdO1xuXG4gIC8vICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAvLyAgICAgYWN0aW9uczogYWxsb3dlZEFjdGlvbnMsXG4gIC8vICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFybkZvck9iamVjdHMoa2V5UHJlZml4KV0sXG4gIC8vICAgICBncmFudGVlOiBuZXcgaWFtLkFueVByaW5jaXBhbCgpLFxuICAvLyAgICAgcmVzb3VyY2U6IHRoaXMsXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIFMzIEJ1Y2tldHMgb25seSBzdXBwb3J0IGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKiBEZWNsYXJpbmcgbXVsdGlwbGUgYGF3c19zM19idWNrZXRfbm90aWZpY2F0aW9uYCByZXNvdXJjZXMgdG8gdGhlIHNhbWVcbiAgICogUzMgQnVja2V0IHdpbGwgY2F1c2UgYSBwZXJwZXR1YWwgZGlmZmVyZW5jZSBpbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGV2ZW50IG5vdGlmaWNhdGlvbnMgY29uZmlndXJlZFxuICAgKiBmb3IgdGhlIFMzIGJ1Y2tldCBvdXRzaWRlIG9mIHRoaXMgYmVhY29uLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyaWdnZXIgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChMYW1iZGEsIFNOUyBUb3BpYyBvciBTUVMgUXVldWUpXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFMzIG9iamVjdCBrZXkgZmlsdGVyIHJ1bGVzIHRvIGRldGVybWluZSB3aGljaCBvYmplY3RzXG4gICAqIHRyaWdnZXIgdGhpcyBldmVudC4gRWFjaCBmaWx0ZXIgbXVzdCBpbmNsdWRlIGEgYHByZWZpeGAgYW5kL29yIGBzdWZmaXhgXG4gICAqIHRoYXQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHMzIG9iamVjdCBrZXkuIFJlZmVyIHRvIHRoZSBTMyBEZXZlbG9wZXIgR3VpZGVcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgYWxsb3dlZCBmaWx0ZXIgcnVsZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbCNub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBkZWNsYXJlIGNvbnN0IG15RnVuY3Rpb246IGNvbXB1dGUuRnVuY3Rpb247XG4gICAqICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzdG9yYWdlLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUZ1bmN0aW9uKSwge3ByZWZpeDogJ2hvbWUvbXl1c2VybmFtZS8qJ30pO1xuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICBldmVudDogRXZlbnRUeXBlLFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGJsb2NrcyBhZGRpbmcgbm90aWZpY2F0aW9ucyBvdXRzaWRlIG9mIHRoZSBTdGFjayBvd25pbmcgdGhlIGJ1Y2tldC4uLlxuICAgIC8vIEFXUy1DREsgd29ya3MgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBDdXN0b21SZXNvdXJjZSBoYW5kbGVyIChMYW1iZGEgZnVuY3Rpb24pIHdoaWNoIG1vZGlmaWVzXG4gICAgLy8gdGhlIGJ1Y2tldCBwb2xpY3kgaW4gcGxhY2UgKGFuZCBDRk4gZG9lcyBub3QgbWFuYWdlIHRoZSBhY3R1YWwgYnVja2V0IHBvbGljeSwgc28gbm8gdGYgc3RhdGUhKVxuICAgIHRoaXMud2l0aE5vdGlmaWNhdGlvbnMoKG5vdGlmaWNhdGlvbnMpID0+XG4gICAgICBub3RpZmljYXRpb25zLmFkZE5vdGlmaWNhdGlvbihldmVudCwgZGVzdCwgLi4uZmlsdGVycyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aE5vdGlmaWNhdGlvbnMoY2I6IChub3RpZmljYXRpb25zOiBCdWNrZXROb3RpZmljYXRpb25zKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBCdWNrZXROb3RpZmljYXRpb25zKHRoaXMsIFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAgICAgIGJ1Y2tldDogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYih0aGlzLm5vdGlmaWNhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogY3JlYXRlZCBpbiB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGNhbGxpbmdcbiAgICogYG9uRXZlbnQoRXZlbnRUeXBlLk9CSkVDVF9SRU1PVkVEKWAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKHNlZSBvbkV2ZW50KVxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJzIChzZWUgb25FdmVudClcbiAgICovXG4gIHB1YmxpYyBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5hZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICAgIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRCxcbiAgICAgIGRlc3QsXG4gICAgICAuLi5maWx0ZXJzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSB7XG4gICAgdGhpcy53aXRoTm90aWZpY2F0aW9ucygobm90aWZpY2F0aW9ucykgPT5cbiAgICAgIG5vdGlmaWNhdGlvbnMuZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICBidWNrZXRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBfa2V5QWN0aW9uczogc3RyaW5nW10sXG4gICAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgICAuLi5vdGhlclJlc291cmNlQXJuczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW3Jlc291cmNlQXJuLCAuLi5vdGhlclJlc291cmNlQXJuc107XG5cbiAgICBjb25zdCByZXQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBidWNrZXRBY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgICByZXNvdXJjZTogdGhpcyxcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IHJlLWFkZCBLTVMgc3VwcG9ydFxuICAgIC8vIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYga2V5QWN0aW9ucyAmJiBrZXlBY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgIC8vICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50KGdyYW50ZWUsIC4uLmtleUFjdGlvbnMpO1xuICAgIC8vIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGdldCB3cml0ZUFjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ucGVybXMuQlVDS0VUX0RFTEVURV9BQ1RJT05TLCAuLi5wZXJtcy5CVUNLRVRfUFVUX0FDVElPTlNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSB0byB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgeW91IGVuYWJsZSB2ZXJzaW9uaW5nIG9uIGEgYnVja2V0IGZvciB0aGUgZmlyc3QgdGltZSwgaXQgbWlnaHQgdGFrZSB1cCB0byAxNSBtaW51dGVzXG4gICAgICAgKiBmb3IgdGhlIGNoYW5nZSB0byBiZSBmdWxseSBwcm9wYWdhdGVkLiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugd2FpdCBmb3IgMTUgbWludXRlcyBhZnRlclxuICAgICAgICogZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAgICAgKlxuICAgICAgICogV3JpdGUgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoaXMgY29udmVyc2lvbiBpcyBjb21wbGV0ZSBtYXkgYXBwbHkgdG8gdW52ZXJzaW9uZWQgb2JqZWN0cy5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZVNsZWVwKSB7XG4gICAgICAgIHRoaXMuc291cmNlU2xlZXAgPSBuZXcgc2xlZXAuU2xlZXAodGhpcywgXCJWZXJzaW9uaW5nU2xlZXBcIiwge1xuICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uOiBcIjE1bVwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZFNvdXJjZSA9IHRoaXMuc291cmNlcy5maW5kKFxuICAgICAgKHNvdXJjZUluZGV4KSA9PiBzb3VyY2VJbmRleC5wcm9wcyA9PT0gcHJvcHMsXG4gICAgKTtcbiAgICBpZiAoaW5kZXhlZFNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZUlkICYmIHNvdXJjZUlkICE9PSBpbmRleGVkU291cmNlLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRHVwbGljYXRlIGJ1Y2tldCBzb3VyY2UgZm9yICR7aW5kZXhlZFNvdXJjZS5pZH0gYW5kICR7c291cmNlSWR9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXhlZFNvdXJjZS5pZDtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICBjb25zdCBpZCA9IHNvdXJjZUlkID8/IGBzb3VyY2UtJHtuZXh0SW5kZXh9YDtcbiAgICAvLyBlbnN1cmUgaWQgKGlmIHByb3ZpZGVkKSBpcyB1bmlxdWUgd2l0aGluIEJ1Y2tldFxuICAgIGlmICh0aGlzLnNvdXJjZXMuc29tZSgoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LmlkID09PSBpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYER1cGxpY2F0ZSBzb3VyY2UgaWQgJHtpZH0uIFNvdXJjZUlkcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBCdWNrZXQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlcy5wdXNoKHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBidWNrZXQ6IHRoaXMsXG4gICAgICAgIGRlcGVuZHNPbjogdGhpcy5zb3VyY2VTbGVlcCA/IFt0aGlzLnNvdXJjZVNsZWVwXSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBpZCxcbiAgICB9KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBwdWJsaWMgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgIHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmc7XG4gICAgYnVja2V0T3V0cHV0czogeyB3ZWJzaXRlVXJsOiBzdHJpbmc7IHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmcgfTtcbiAgfSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzV2Vic2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaHR0cHMgVVJMIG9mIGFuIFMzIG9iamVjdC4gU3BlY2lmeSBgcmVnaW9uYWw6IGZhbHNlYCBhdCB0aGUgb3B0aW9uc1xuICAgKiBmb3Igbm9uLXJlZ2lvbmFsIFVSTHMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL29ubHlidWNrZXRgXG4gICAqIC0gYGh0dHBzOi8vczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20vYnVja2V0L2tleWBcbiAgICogLSBgaHR0cHM6Ly9zMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24vY2hpbmEtYnVja2V0L215a2V5YFxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBwdWJsaWMgdXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdCh0aGlzKTtcbiAgICBjb25zdCBwcmVmaXggPSBgaHR0cHM6Ly9zMy4ke3RoaXMuZW52LnJlZ2lvbn0uJHtzdGFjay51cmxTdWZmaXh9L2A7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogLSBgczM6Ly9vbmx5YnVja2V0YFxuICAgKiAtIGBzMzovL2J1Y2tldC9rZXlgXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIFMzIGtleSBvZiB0aGUgb2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgUzMgVVJMIG9mIHRoZVxuICAgKiAgICAgIGJ1Y2tldCBpcyByZXR1cm5lZC5cbiAgICogQHJldHVybnMgYW4gT2JqZWN0UzNVcmwgdG9rZW5cbiAgICovXG4gIHB1YmxpYyBzM1VybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IFwiczM6Ly9cIjtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBBUk4gdGhhdCByZXByZXNlbnRzIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgYnVja2V0IHRoYXQgbWF0Y2hcbiAgICogdGhlIGtleSBwYXR0ZXJuIHNwZWNpZmllZC4gVG8gcmVwcmVzZW50IGFsbCBrZXlzLCBzcGVjaWZ5IGBgXCIqXCJgYC5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gc3BlY2lmeSBhIGtleVBhdHRlcm4gd2l0aCBtdWx0aXBsZSBjb21wb25lbnRzLCBjb25jYXRlbmF0ZSB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nLCBlLmcuOlxuICAgKlxuICAgKiAgIGFybkZvck9iamVjdHMoYGhvbWUvJHt0ZWFtfS8ke3VzZXJ9LypgKVxuICAgKlxuICAgKi9cbiAgcHVibGljIGFybkZvck9iamVjdHMoa2V5UGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yZXNvdXJjZS5hcm59LyR7a2V5UGF0dGVybn1gO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDk1M1xuICBwcml2YXRlIHVybEpvaW4oLi4uY29tcG9uZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb21wb25lbnRzLnJlZHVjZSgocmVzdWx0LCBjb21wb25lbnQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcG9uZW50LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5zbGljZSgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtyZXN1bHR9LyR7Y29tcG9uZW50fWA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGVuZm9yY2UgU1NMIHJlcXVlc3RzIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VTU0xTdGF0ZW1lbnQoKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJCb29sXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiLFxuICAgICAgICAgIHZhbHVlczogW1wiZmFsc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpYW0gc3RhdGVtZW50IHRvIGFsbG93IHJlcXVlc3RzIHdpdGggYSBtaW5pbXVtIFRMU1xuICAgKiB2ZXJzaW9uIG9ubHkuXG4gICAqL1xuICBwcml2YXRlIG1pbmltdW1UTFNWZXJzaW9uU3RhdGVtZW50KG1pbmltdW1UTFNWZXJzaW9uPzogbnVtYmVyKSB7XG4gICAgaWYgKCFtaW5pbXVtVExTVmVyc2lvbikgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICBjb25kaXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiTnVtZXJpY0xlc3NUaGFuXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiczM6VGxzVmVyc2lvblwiLFxuICAgICAgICAgIHZhbHVlczogW21pbmltdW1UTFNWZXJzaW9uLnRvU3RyaW5nKCldLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5yZXNvdXJjZS5hcm4sIHRoaXMuYXJuRm9yT2JqZWN0cyhcIipcIildLFxuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgdG8gdGhlIFRlcnJhZm9ybSBKU09OIG91dHB1dCBhdCBTeW50aCB0aW1lLlxuICAgKlxuICAgKiBjYWxsZWQgYnkgVGVycmFmb3JtU3RhY2sucHJlcGFyZVN0YWNrKClcbiAgICovXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIC8qKlxuICAgICAqIEEgcHJlcGFyaW5nIHJlc29sdmUgbWlnaHQgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrXG4gICAgICpcbiAgICAgKiBzaG91bGQgbm90IGFkZCByZXNvdXJjZXMgaWYgbm8gYnVja2V0IHNvdXJjZXMgYXJlIGRlZmluZWRcbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIC8vIFRPRE86IElkZWFsbHkgd2Ugc2hvdWxkIGhhdmUgdXNlZCBJUmVzb2x2YWJsZS5yZXNvbHZlIGFuZCB1c2UgdGhlIElSZXNvbHZlQ29udGV4dC5wcmVwYXJpbmcgZmxhZ1xuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wb2xpY3ktZG9jdW1lbnQudHMjTDQ4XG4gICAgICBpZiAodGhpcy5ub2RlLnRyeUZpbmRDaGlsZChzb3VyY2UuaWQpKSBjb250aW51ZTsgLy8gaWdub3JlIGlmIGFscmVhZHkgZ2VuZXJhdGVkXG4gICAgICBuZXcgQnVja2V0U291cmNlKHRoaXMsIHNvdXJjZS5pZCwgc291cmNlLnByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWZpeCB0byBhZGQgdG8gdGhlIHVwbG9hZGVkIG9iamVjdHNcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLy8gcHJpdmF0ZSBpbnRlcmZhY2UgdG8gaW5kZXggQnVja2V0IHNvdXJjZXMgYnkgaWRcbmludGVyZmFjZSBTb3VyY2VJbmRleCB7XG4gIHByb3BzOiBCdWNrZXRTb3VyY2VQcm9wcztcbiAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdG9yYWdlIGNsYXNzIHRvIG1vdmUgYW4gb2JqZWN0IHRvXG4gKi9cbmV4cG9ydCBlbnVtIFN0b3JhZ2VDbGFzcyB7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBkYXRhIHRoYXQgaXMgYWNjZXNzZWQgbGVzcyBmcmVxdWVudGx5LCBidXQgcmVxdWlyZXMgcmFwaWRcbiAgICogYWNjZXNzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gU3RhbmRhcmQgc3RvcmFnZS5cbiAgICovXG4gIElORlJFUVVFTlRfQUNDRVNTID0gXCJTVEFOREFSRF9JQVwiLFxuXG4gIC8qKlxuICAgKiBJbmZyZXF1ZW50IEFjY2VzcyB0aGF0J3Mgb25seSBzdG9yZWQgaW4gb25lIGF2YWlsYWJpbGl0eSB6b25lLlxuICAgKlxuICAgKiBIYXMgbG93ZXIgYXZhaWxhYmlsaXR5IHRoYW4gc3RhbmRhcmQgSW5mcmVxdWVudEFjY2Vzcy5cbiAgICovXG4gIE9ORV9aT05FX0lORlJFUVVFTlRfQUNDRVNTID0gXCJPTkVaT05FX0lBXCIsXG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGxvbmctdGVybSBhcmNoaXZhbCB0aGF0IGNhbiB0YWtlIGJldHdlZW4gbWludXRlcyBhbmRcbiAgICogaG91cnMgdG8gYWNjZXNzLlxuICAgKlxuICAgKiBVc2UgZm9yIGFyY2hpdmVzIHdoZXJlIHBvcnRpb25zIG9mIHRoZSBkYXRhIG1pZ2h0IG5lZWQgdG8gYmUgcmV0cmlldmVkIGluXG4gICAqIG1pbnV0ZXMuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlXG4gICAqIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW4gYXMgbGl0dGxlIGFzIDEtNSBtaW51dGVzXG4gICAqIHVzaW5nIGV4cGVkaXRlZCByZXRyaWV2YWwuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0IGJlZm9yZSB0aGUgOTAtZGF5XG4gICAqIG1pbmltdW0sIHlvdSBhcmUgY2hhcmdlZCBmb3IgOTAgZGF5cy5cbiAgICovXG4gIEdMQUNJRVIgPSBcIkdMQUNJRVJcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGluIGEgZmV3IG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogSXQgaXMgaWRlYWwgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBvbmNlIG9yIHR3aWNlIHBlciBxdWFydGVyLCBhbmRcbiAgICogdGhhdCByZXF1aXJlcyBpbW1lZGlhdGUgYWNjZXNzLiBEYXRhIHN0b3JlZCBpbiB0aGUgR0xBQ0lFUl9JUiBzdG9yYWdlIGNsYXNzXG4gICAqIGhhcyBhIG1pbmltdW0gc3RvcmFnZSBkdXJhdGlvbiBwZXJpb2Qgb2YgOTAgZGF5cyBhbmQgY2FuIGJlIGFjY2Vzc2VkIGluXG4gICAqIGFzIG1pbGxpc2Vjb25kcy4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXkgbWluaW11bSxcbiAgICogeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUl9JTlNUQU5UX1JFVFJJRVZBTCA9IFwiR0xBQ0lFUl9JUlwiLFxuXG4gIC8qKlxuICAgKiBVc2UgZm9yIGFyY2hpdmluZyBkYXRhIHRoYXQgcmFyZWx5IG5lZWRzIHRvIGJlIGFjY2Vzc2VkLiBEYXRhIHN0b3JlZCBpbiB0aGVcbiAgICogREVFUF9BUkNISVZFIHN0b3JhZ2UgY2xhc3MgaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiAxODBcbiAgICogZGF5cyBhbmQgYSBkZWZhdWx0IHJldHJpZXZhbCB0aW1lIG9mIDEyIGhvdXJzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdFxuICAgKiBiZWZvcmUgdGhlIDE4MC1kYXkgbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciAxODAgZGF5cy4gRm9yIHByaWNpbmdcbiAgICogaW5mb3JtYXRpb24sIHNlZSBBbWF6b24gUzMgUHJpY2luZy5cbiAgICovXG4gIERFRVBfQVJDSElWRSA9IFwiREVFUF9BUkNISVZFXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gb3B0aW1pemUgc3RvcmFnZSBjb3N0c1xuICAgKiBieSBhdXRvbWF0aWNhbGx5IG1vdmluZyBkYXRhIHRvIHRoZSBtb3N0IGNvc3QtZWZmZWN0aXZlIHN0b3JhZ2UgYWNjZXNzXG4gICAqIHRpZXIsIHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0IG9yIG9wZXJhdGlvbmFsIG92ZXJoZWFkLlxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIGRlbGl2ZXJzIGF1dG9tYXRpYyBjb3N0IHNhdmluZ3MgYnkgbW92aW5nIGRhdGEgb24gYVxuICAgKiBncmFudWxhciBvYmplY3QgbGV2ZWwgYmV0d2VlbiB0d28gYWNjZXNzIHRpZXJzLCBhIGZyZXF1ZW50IGFjY2VzcyB0aWVyIGFuZFxuICAgKiBhIGxvd2VyLWNvc3QgaW5mcmVxdWVudCBhY2Nlc3MgdGllciwgd2hlbiBhY2Nlc3MgcGF0dGVybnMgY2hhbmdlLiBUaGVcbiAgICogSU5URUxMSUdFTlRfVElFUklORyBzdG9yYWdlIGNsYXNzIGlzIGlkZWFsIGlmIHlvdSB3YW50IHRvIG9wdGltaXplIHN0b3JhZ2VcbiAgICogY29zdHMgYXV0b21hdGljYWxseSBmb3IgbG9uZy1saXZlZCBkYXRhIHdoZW4gYWNjZXNzIHBhdHRlcm5zIGFyZSB1bmtub3duIG9yXG4gICAqIHVucHJlZGljdGFibGUuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJTlRFTExJR0VOVF9USUVSSU5HXCIsXG59XG5cbi8qKlxuICogTm90aWZpY2F0aW9uIGV2ZW50IHR5cGVzLlxuICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvbm90aWZpY2F0aW9uLWhvdy10by1ldmVudC10eXBlcy1hbmQtZGVzdGluYXRpb25zLmh0bWwjc3VwcG9ydGVkLW5vdGlmaWNhdGlvbi1ldmVudC10eXBlc1xuICovXG5leHBvcnQgZW51bSBFdmVudFR5cGUge1xuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURUQgPSBcInMzOk9iamVjdENyZWF0ZWQ6KlwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9QVVQgPSBcInMzOk9iamVjdENyZWF0ZWQ6UHV0XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX1BPU1QgPSBcInMzOk9iamVjdENyZWF0ZWQ6UG9zdFwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9DT1BZID0gXCJzMzpPYmplY3RDcmVhdGVkOkNvcHlcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfQ09NUExFVEVfTVVMVElQQVJUX1VQTE9BRCA9IFwiczM6T2JqZWN0Q3JlYXRlZDpDb21wbGV0ZU11bHRpcGFydFVwbG9hZFwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRCA9IFwiczM6T2JqZWN0UmVtb3ZlZDoqXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEX0RFTEVURSA9IFwiczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRURfREVMRVRFX01BUktFUl9DUkVBVEVEID0gXCJzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWRcIixcblxuICAvKipcbiAgICogVXNpbmcgcmVzdG9yZSBvYmplY3QgZXZlbnQgdHlwZXMgeW91IGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZm9yXG4gICAqIGluaXRpYXRpb24gYW5kIGNvbXBsZXRpb24gd2hlbiByZXN0b3Jpbmcgb2JqZWN0cyBmcm9tIHRoZSBTMyBHbGFjaWVyXG4gICAqIHN0b3JhZ2UgY2xhc3MuXG4gICAqXG4gICAqIFlvdSB1c2UgczM6T2JqZWN0UmVzdG9yZTpQb3N0IHRvIHJlcXVlc3Qgbm90aWZpY2F0aW9uIG9mIG9iamVjdCByZXN0b3JhdGlvblxuICAgKiBpbml0aWF0aW9uLlxuICAgKi9cbiAgT0JKRUNUX1JFU1RPUkVfUE9TVCA9IFwiczM6T2JqZWN0UmVzdG9yZTpQb3N0XCIsXG5cbiAgLyoqXG4gICAqIFVzaW5nIHJlc3RvcmUgb2JqZWN0IGV2ZW50IHR5cGVzIHlvdSBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvclxuICAgKiBpbml0aWF0aW9uIGFuZCBjb21wbGV0aW9uIHdoZW4gcmVzdG9yaW5nIG9iamVjdHMgZnJvbSB0aGUgUzMgR2xhY2llclxuICAgKiBzdG9yYWdlIGNsYXNzLlxuICAgKlxuICAgKiBZb3UgdXNlIHMzOk9iamVjdFJlc3RvcmU6Q29tcGxldGVkIHRvIHJlcXVlc3Qgbm90aWZpY2F0aW9uIG9mXG4gICAqIHJlc3RvcmF0aW9uIGNvbXBsZXRpb24uXG4gICAqL1xuICBPQkpFQ1RfUkVTVE9SRV9DT01QTEVURUQgPSBcInMzOk9iamVjdFJlc3RvcmU6Q29tcGxldGVkXCIsXG5cbiAgLyoqXG4gICAqIFVzaW5nIHJlc3RvcmUgb2JqZWN0IGV2ZW50IHR5cGVzIHlvdSBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvclxuICAgKiBpbml0aWF0aW9uIGFuZCBjb21wbGV0aW9uIHdoZW4gcmVzdG9yaW5nIG9iamVjdHMgZnJvbSB0aGUgUzMgR2xhY2llclxuICAgKiBzdG9yYWdlIGNsYXNzLlxuICAgKlxuICAgKiBZb3UgdXNlIHMzOk9iamVjdFJlc3RvcmU6RGVsZXRlIHRvIHJlcXVlc3Qgbm90aWZpY2F0aW9uIG9mXG4gICAqIHJlc3RvcmF0aW9uIGNvbXBsZXRpb24uXG4gICAqL1xuICBPQkpFQ1RfUkVTVE9SRV9ERUxFVEUgPSBcInMzOk9iamVjdFJlc3RvcmU6RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB0byByZXF1ZXN0IEFtYXpvbiBTMyB0byBzZW5kIGEgbm90aWZpY2F0aW9uXG4gICAqIG1lc3NhZ2Ugd2hlbiBBbWF6b24gUzMgZGV0ZWN0cyB0aGF0IGFuIG9iamVjdCBvZiB0aGUgUlJTIHN0b3JhZ2UgY2xhc3MgaXNcbiAgICogbG9zdC5cbiAgICovXG4gIFJFRFVDRURfUkVEVU5EQU5DWV9MT1NUX09CSkVDVCA9IFwiczM6UmVkdWNlZFJlZHVuZGFuY3lMb3N0T2JqZWN0XCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGZhaWxlZCB0byByZXBsaWNhdGUuXG4gICAqL1xuICBSRVBMSUNBVElPTl9PUEVSQVRJT05fRkFJTEVEX1JFUExJQ0FUSU9OID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25GYWlsZWRSZXBsaWNhdGlvblwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBleGNlZWRlZCB0aGUgMTUtbWludXRlXG4gICAqIHRocmVzaG9sZCBmb3IgcmVwbGljYXRpb24uXG4gICAqL1xuICBSRVBMSUNBVElPTl9PUEVSQVRJT05fTUlTU0VEX1RIUkVTSE9MRCA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uTWlzc2VkVGhyZXNob2xkXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IGZvciBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIHRoZSBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGZlYXR1cmUgcmVwbGljYXRlZFxuICAgKiBhZnRlciB0aGUgMTUtbWludXRlIHRocmVzaG9sZC5cbiAgICovXG4gIFJFUExJQ0FUSU9OX09QRVJBVElPTl9SRVBMSUNBVEVEX0FGVEVSX1RIUkVTSE9MRCA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uUmVwbGljYXRlZEFmdGVyVGhyZXNob2xkXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IGZvciBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgYnV0IGlzIG5vIGxvbmdlciB0cmFja2VkXG4gICAqIGJ5IHJlcGxpY2F0aW9uIG1ldHJpY3MuXG4gICAqL1xuICBSRVBMSUNBVElPTl9PUEVSQVRJT05fTk9UX1RSQUNLRUQgPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbk5vdFRyYWNrZWRcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIExpZmVjeWNsZUV4cGlyYXRpb24gZXZlbnQgdHlwZXMsIHlvdSBjYW4gcmVjZWl2ZSBhIG5vdGlmaWNhdGlvblxuICAgKiB3aGVuIEFtYXpvbiBTMyBkZWxldGVzIGFuIG9iamVjdCBiYXNlZCBvbiB5b3VyIFMzIExpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT04gPSBcInMzOkxpZmVjeWNsZUV4cGlyYXRpb246KlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGUgZXZlbnQgdHlwZSBub3RpZmllcyB5b3Ugd2hlbiBhbiBvYmplY3RcbiAgICogaW4gYW4gdW52ZXJzaW9uZWQgYnVja2V0IGlzIGRlbGV0ZWQuXG4gICAqIEl0IGFsc28gbm90aWZpZXMgeW91IHdoZW4gYW4gb2JqZWN0IHZlcnNpb24gaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSBhblxuICAgKiBTMyBMaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OX0RFTEVURSA9IFwiczM6TGlmZWN5Y2xlRXhwaXJhdGlvbjpEZWxldGVcIixcblxuICAvKipcbiAgICogVGhlIHMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlTWFya2VyQ3JlYXRlZCBldmVudCB0eXBlIG5vdGlmaWVzIHlvdVxuICAgKiB3aGVuIFMzIExpZmVjeWNsZSBjcmVhdGVzIGEgZGVsZXRlIG1hcmtlciB3aGVuIGEgY3VycmVudCB2ZXJzaW9uIG9mIGFuXG4gICAqIG9iamVjdCBpbiB2ZXJzaW9uZWQgYnVja2V0IGlzIGRlbGV0ZWQuXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTl9ERUxFVEVfTUFSS0VSX0NSRUFURUQgPSBcInMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlTWFya2VyQ3JlYXRlZFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCBpcyB0cmFuc2l0aW9uZWQgdG9cbiAgICogYW5vdGhlciBBbWF6b24gUzMgc3RvcmFnZSBjbGFzcyBieSBhbiBTMyBMaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIExJRkVDWUNMRV9UUkFOU0lUSU9OID0gXCJzMzpMaWZlY3ljbGVUcmFuc2l0aW9uXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gb2JqZWN0IHdpdGhpbiB0aGVcbiAgICogUzMgSW50ZWxsaWdlbnQtVGllcmluZyBzdG9yYWdlIGNsYXNzIG1vdmVkIHRvIHRoZSBBcmNoaXZlIEFjY2VzcyB0aWVyIG9yXG4gICAqIERlZXAgQXJjaGl2ZSBBY2Nlc3MgdGllci5cbiAgICovXG4gIElOVEVMTElHRU5UX1RJRVJJTkcgPSBcInMzOkludGVsbGlnZW50VGllcmluZ1wiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0VGFnZ2luZyBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IHRhZyBpcyBhZGRlZCBvciBkZWxldGVkIGZyb20gYW4gb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX1RBR0dJTkcgPSBcInMzOk9iamVjdFRhZ2dpbmc6KlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6T2JqZWN0VGFnZ2luZzpQdXQgZXZlbnQgdHlwZSBub3RpZmllcyB5b3Ugd2hlbiBhIHRhZyBpcyBQVVQgb24gYW5cbiAgICogb2JqZWN0IG9yIGFuIGV4aXN0aW5nIHRhZyBpcyB1cGRhdGVkLlxuXG4gICAqL1xuICBPQkpFQ1RfVEFHR0lOR19QVVQgPSBcInMzOk9iamVjdFRhZ2dpbmc6UHV0XCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpPYmplY3RUYWdnaW5nOkRlbGV0ZSBldmVudCB0eXBlIG5vdGlmaWVzIHlvdSB3aGVuIGEgdGFnIGlzIHJlbW92ZWRcbiAgICogZnJvbSBhbiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfVEFHR0lOR19ERUxFVEUgPSBcInMzOk9iamVjdFRhZ2dpbmc6RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIFlvdSByZWNlaXZlIHRoaXMgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4gYW4gQUNMIGlzIFBVVCBvbiBhbiBvYmplY3Qgb3Igd2hlblxuICAgKiBhbiBleGlzdGluZyBBQ0wgaXMgY2hhbmdlZC5cbiAgICogQW4gZXZlbnQgaXMgbm90IGdlbmVyYXRlZCB3aGVuIGEgcmVxdWVzdCByZXN1bHRzIGluIG5vIGNoYW5nZSB0byBhblxuICAgKiBvYmplY3TigJlzIEFDTC5cbiAgICovXG4gIE9CSkVDVF9BQ0xfUFVUID0gXCJzMzpPYmplY3RBY2w6UHV0XCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uS2V5RmlsdGVyIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIG9mIHRoZSBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFMzIGtleXMgbXVzdCBoYXZlIHRoZSBzcGVjaWZpZWQgcHJlZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTMyBrZXlzIG11c3QgaGF2ZSB0aGUgc3BlY2lmaWVkIHN1ZmZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHN1ZmZpeD86IHN0cmluZztcbn1cbiJdfQ==
1192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL2J1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFDQUE4QjtBQUM5QixzREFXNkI7QUFDN0Isd0RBQTZDO0FBQzdDLGlDQUE4QjtBQUU5Qix3QkFVVztBQUNYLG9EQUkwQjtBQUMxQiw0Q0FBd0M7QUFDeEMsaUNBSWdCO0FBQ2hCLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIsd0NBQXdDO0FBdXBCeEMsTUFBc0IsVUFBVyxTQUFRLGdDQUFnQjtJQVl2RCxJQUFXLGFBQWE7UUFDdEIsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO1lBQzFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCO1lBQzFELGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ2hDLG9CQUFvQixFQUNsQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsa0NBQWtDO1lBQy9ELGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVU7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFzQ0Qsa0VBQWtFO0lBQ2xFLG9HQUFvRztJQUNwRywrQ0FBK0M7SUFFL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUEyQixFQUFFO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBakMxQixnQkFBZ0I7UUFDQyxZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQWtDM0MsSUFBSSxDQUFDLElBQUks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QUE7SUFFeEU7OztPQUdHO0lBQ0gsOERBQWlELENBQUE7SUFFakQ7Ozs7O09BS0c7SUFDSCwwRUFBNkQsQ0FBQTtJQUU3RDs7OztPQUlHO0lBQ0gsc0dBQXlGLENBQUE7SUFFekY7OztPQUdHO0lBQ0gsNERBQStDLENBQUE7SUFFL0M7Ozs7T0FJRztJQUNILDBEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILGtEQUFxQyxDQUFBO0lBRXJDOzs7O09BSUc7SUFDSCx3REFBMkMsQ0FBQTtJQUUzQzs7O09BR0c7SUFDSCw4REFBaUQsQ0FBQTtJQUVqRDs7Ozs7T0FLRztJQUNILGdEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUE3TlcsU0FBUyx5QkFBVCxTQUFTLFFBNk5wQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVPTCB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQge1xuICBzM0J1Y2tldCxcbiAgczNCdWNrZXRBY2wsXG4gIHMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0T3duZXJzaGlwQ29udHJvbHMsXG4gIHMzQnVja2V0UHVibGljQWNjZXNzQmxvY2ssXG4gIHMzQnVja2V0V2Vic2l0ZUNvbmZpZ3VyYXRpb24sXG4gIHMzQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbixcbiAgczNCdWNrZXRWZXJzaW9uaW5nLFxuICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbixcbiAgZGF0YUF3c1MzQnVja2V0LFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLXRpbWVcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgQnVja2V0U291cmNlLFxuICBCdWNrZXRTb3VyY2VQcm9wcyxcbiAgV2Vic2l0ZUNvbmZpZyxcbiAgQ29yc0NvbmZpZyxcbiAgTGlmZWN5Y2xlQ29uZmlndXJhdGlvblJ1bGUsXG4gIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICBCdWNrZXRQb2xpY3ksXG4gIEJ1Y2tldE5vdGlmaWNhdGlvbnMsXG4gIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbn0gZnJvbSBcIi5cIjtcbmltcG9ydCB7XG4gIEF3c0NvbnN0cnVjdEJhc2UsXG4gIElBd3NDb25zdHJ1Y3QsXG4gIEF3c0NvbnN0cnVjdFByb3BzLFxufSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQge1xuICAvLyBzM1N0YXRpY1dlYnNpdGVFbmRwb2ludCxcbiAgcGFyc2VCdWNrZXROYW1lLFxuICAvLyBwYXJzZUJ1Y2tldEFybixcbn0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0ICogYXMga21zIGZyb20gXCIuLi9lbmNyeXB0aW9uXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0ICogYXMgcGVybXMgZnJvbSBcIi4vYnVja2V0LXBlcm1zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRmcm9udEFjY2Vzc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRmcm9udCBhY2Nlc3MgdmlhIE9yaWdpbiBBY2Nlc3MgSWRlbnRpdHkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogT2JqZWN0IGtleSBwYXR0ZXJucyBmb3IgY2xvdWRmcm9udCBhY2Nlc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiKlwiXG4gICAqL1xuICByZWFkb25seSBrZXlQYXR0ZXJucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgYnVja2V0IG91dHNpZGUgdGhpcyBzdGFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnVja2V0LiBBdCBsZWFzdCBvbmUgb2YgYnVja2V0QXJuIG9yIGJ1Y2tldE5hbWUgbXVzdCBiZVxuICAgKiBkZWZpbmVkIGluIG9yZGVyIHRvIGluaXRpYWxpemUgYSBidWNrZXQgcmVmLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVja2V0LiBJZiB0aGUgdW5kZXJseWluZyB2YWx1ZSBvZiBBUk4gaXMgYSBzdHJpbmcsIHRoZVxuICAgKiBuYW1lIHdpbGwgYmUgcGFyc2VkIGZyb20gdGhlIEFSTi4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBpcyBvcHRpb25hbCwgYnV0XG4gICAqIHNvbWUgZmVhdHVyZXMgdGhhdCByZXF1aXJlIHRoZSBidWNrZXQgbmFtZSBzdWNoIGFzIGF1dG8tY3JlYXRpbmcgYSBidWNrZXRcbiAgICogcG9saWN5LCB3b24ndCB3b3JrLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSW5mZXJyZWQgZnJvbSBidWNrZXQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0RG9tYWluTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdlYnNpdGUgVVJMIG9mIHRoZSBidWNrZXQgKGlmIHN0YXRpYyB3ZWIgaG9zdGluZyBpcyBlbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJbmZlcnJlZCBmcm9tIGJ1Y2tldCBuYW1lIGFuZCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldFdlYnNpdGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb25hbCBkb21haW4gbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjYgRE5TIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXREdWFsU3RhY2tEb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLTVMgZW5jcnlwdGlvbiBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVuY3J5cHRpb24ga2V5XG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgYnVja2V0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc1dlYnNpdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudCB0aGlzIGV4aXN0aW5nIGJ1Y2tldCBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGl0J3MgYXNzdW1lZCB0aGUgYnVja2V0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgc2NvcGUgaXQncyBiZWluZyBpbXBvcnRlZCBpbnRvXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHRoaXMgZXhpc3RpbmcgYnVja2V0IGlzIGluLlxuICAgKiBGZWF0dXJlcyB0aGF0IHJlcXVpcmUgdGhlIHJlZ2lvbiAoZS5nLiBgYnVja2V0V2Vic2l0ZVVybGApIHdvbid0IGZ1bGx5IHdvcmtcbiAgICogaWYgdGhlIHJlZ2lvbiBjYW5ub3QgYmUgY29ycmVjdGx5IGluZmVycmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGl0J3MgYXNzdW1lZCB0aGUgYnVja2V0IGlzIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc2NvcGUgaXQncyBiZWluZyBpbXBvcnRlZCBpbnRvXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLy8gVE9ETzogVXNlIEN1c3RvbSBSZXNvdXJjZSBmb3Igd2l0aE5vdGlmaWNhdGlvbnMoKSBzdXBwb3J0XG4gIC8vIC8qKlxuICAvLyAgKiBUaGUgcm9sZSB0byBiZSB1c2VkIGJ5IHRoZSBub3RpZmljYXRpb25zIGhhbmRsZXJcbiAgLy8gICpcbiAgLy8gICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZC5cbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNIYW5kbGVyUm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwdWJsaWM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBidWNrZXQgaGFzIHZlcnNpb25pbmcgZW5hYmxlZFxuICAgKlxuICAgKiBJZiB5b3UgYXJlIGVuYWJsaW5nIHZlcnNpb25pbmcgb24gdGhlIGJ1Y2tldCBmb3IgdGhlIGZpcnN0IHRpbWUsIEFXUyByZWNvbW1lbmRzIHRoYXRcbiAgICogeW91IHdhaXQgZm9yIDE1IG1pbnV0ZXMgYWZ0ZXIgZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zXG4gICAqIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBjYXVzZSAxNW0gZGVsYXkgaWYgYHBhdGhgIGlzIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWFsIENsb3VkRnJvbnQgdXNlciB0aGF0IHlvdSBjYW4gYXNzb2NpYXRlIHdpdGggQW1hem9uIFMzIG9yaWdpbnMsIHNvIHRoYXQgeW91IGNhbiBzZWN1cmUgYWxsIG9yIGp1c3Qgc29tZSBvZlxuICAgKiB5b3VyIEFtYXpvbiBTMyBjb250ZW50LlxuICAgKlxuICAgKiBSZXF1aXJlZCB0byB1c2UgdGhlIGltcG9ydGVkIGJ1Y2tldCBpbiBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luQWNjZXNzSWRlbnRpdHk/OiBPcmlnaW5BY2Nlc3NJZGVudGl0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRQcm9wcyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gdG8gYXBwbHkgdG8gdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIElmIHlvdSBjaG9vc2UgS01TLCB5b3UgY2FuIHNwZWNpZnkgYSBLTVMga2V5IHZpYSBgZW5jcnlwdGlvbktleWAuIElmXG4gICAqIGVuY3J5cHRpb24ga2V5IGlzIG5vdCBzcGVjaWZpZWQsIGEga2V5IHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBLTVNgIGlmIGBlbmNyeXB0aW9uS2V5YCBpcyBzcGVjaWZpZWQsIG9yIGBVTkVOQ1JZUFRFRGAgb3RoZXJ3aXNlLlxuICAgKiBCdXQgaWYgYFVORU5DUllQVEVEYCBpcyBzcGVjaWZpZWQsIHRoZSBidWNrZXQgd2lsbCBiZSBlbmNyeXB0ZWQgYXMgYFMzX01BTkFHRURgIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRXh0ZXJuYWwgS01TIGtleSB0byB1c2UgZm9yIGJ1Y2tldCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGUgYGVuY3J5cHRpb25gIHByb3BlcnR5IG11c3QgYmUgZWl0aGVyIG5vdCBzcGVjaWZpZWQgb3Igc2V0IHRvIGBLTVNgIG9yIGBEU1NFYC5cbiAgICogQW4gZXJyb3Igd2lsbCBiZSBlbWl0dGVkIGlmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYFVORU5DUllQVEVEYCBvciBgUzNfTUFOQUdFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgS01TYCBhbmQgdGhpcyBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsXG4gICAqIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQW1hem9uIFMzIHNob3VsZCB1c2UgaXRzIG93biBpbnRlcm1lZGlhcnkga2V5IHRvIGdlbmVyYXRlIGRhdGEga2V5cy5cbiAgICpcbiAgICogT25seSByZWxldmFudCB3aGVuIHVzaW5nIEtNUyBmb3IgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogLSBJZiBub3QgZW5hYmxlZCwgZXZlcnkgb2JqZWN0IEdFVCBhbmQgUFVUIHdpbGwgY2F1c2UgYW4gQVBJIGNhbGwgdG8gS01TICh3aXRoIHRoZVxuICAgKiAgIGF0dGVuZGFudCBjb3N0IGltcGxpY2F0aW9ucyBvZiB0aGF0KS5cbiAgICogLSBJZiBlbmFibGVkLCBTMyB3aWxsIHVzZSBpdHMgb3duIHRpbWUtbGltaXRlZCBrZXkgaW5zdGVhZC5cbiAgICpcbiAgICogT25seSByZWxldmFudCwgd2hlbiBFbmNyeXB0aW9uIGlzIG5vdCBzZXQgdG8gYEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURURgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGgocykgdG8gc3RhdGljIGRpcmVjdG9yaWVzIG9yIGZpbGVzIHRvIHVwbG9hZCwgcmVsYXRpdmUgdG8gdGhlIFN0YWNrIGZpbGUuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiLi9kaXN0XCJcbiAgICogQGRlZmF1bHQgLSBObyBmaWxlcyBhcmUgdXBsb2FkZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VzPzogc3RyaW5nIHwgc3RyaW5nW10gfCBBZGRTb3VyY2VPcHRpb25zW107XG5cbiAgLy8gVE9ETzogQWRkIHN1cHBvcnQgdG8gcGFzcyBkb21haW4gcHJvcHMgKGZvciByb3V0ZTUzIGFsaWFzPylcblxuICAvKipcbiAgICogRW5hYmxlIHB1YmxpYyByZWFkIGFjY2VzcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBFbmFibGUgdGhpcyBvbmx5IGlmIHlvdSdyZSBub3QgdXNpbmcgQ0ROIChDbG91ZEZyb250KSB0byBzZXJ2ZSBmaWxlcyBmcm9tIHRoZSBidWNrZXQuXG4gICAqIFNob3VsZCBvbmx5IGJlIHR1cm5lZCBvbiBpZiB5b3Ugd2FudCB0byBob3N0IHB1YmxpYyBmaWxlcyBkaXJlY3RseSBmcm9tIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBmb3IgdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogTXVzdCBiZSBsb3dlcmNhc2UgYW5kIGJldHdlZW4gMyAobWluKSBhbmQgNjMgKG1heCkgY2hhcmFjdGVycyBsb25nLlxuICAgKlxuICAgKiBUaGUgbmFtZSBtdXN0IG5vdCBiZSBpbiB0aGUgZm9ybWF0IFtidWNrZXRfbmFtZV0tLVthemlkXS0teC1zMy4gVXNlIHRoZVxuICAgKiBgYXdzX3MzX2RpcmVjdG9yeV9idWNrZXRgIHJlc291cmNlIHRvIG1hbmFnZSBTMyBFeHByZXNzIGJ1Y2tldHMuXG4gICAqXG4gICAqIEEgZnVsbCBsaXN0IG9mIGJ1Y2tldCBuYW1pbmcgcnVsZXMgW21heSBiZSBmb3VuZCBoZXJlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9idWNrZXRuYW1pbmdydWxlcy5odG1sKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBSZWZlciB0byBgbmFtZVByZWZpeGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguXG4gICAqIENvbmZsaWN0cyB3aXRoIGBidWNrZXROYW1lYC5cbiAgICpcbiAgICogVGVycmFmb3JtIFByZWZpeGVzIG11c3QgcmVzZXJ2ZSAyNiBjaGFyYWN0ZXJzIGZvciB0aGUgdGVycmFmb3JtIGdlbmVyYXRlZCBzdWZmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgb21pdHRlZCwgRVQgd2lsbCBhc3NpZ24gYSByYW5kb20sIHVuaXF1ZSBuYW1lIHByZWZpeGVkIGJ5IEdyaWRVVUlELlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQm9vbGVhbiB0aGF0IGluZGljYXRlcyBhbGwgb2JqZWN0cyAoaW5jbHVkaW5nIGFueSBsb2NrZWQgb2JqZWN0cylcbiAgICogc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbSB0aGUgYnVja2V0IHdoZW4gdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWRcbiAgICogc28gdGhhdCB0aGUgYnVja2V0IGNhbiBiZSBkZXN0cm95ZWQgd2l0aG91dCBlcnJvci5cbiAgICpcbiAgICogVGhlc2Ugb2JqZWN0cyBhcmUgbm90IHJlY292ZXJhYmxlLiBUaGlzIG9ubHkgZGVsZXRlcyBvYmplY3RzIHdoZW5cbiAgICogdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWQsIG5vdCB3aGVuIHNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZS5cbiAgICpcbiAgICogT25jZSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlcmUgbXVzdCBiZSBhIHN1Y2Nlc3NmdWxcbiAgICogdGVycmFmb3JtIGFwcGx5IHJ1biBiZWZvcmUgYSBkZXN0cm95IGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSB0aGlzXG4gICAqIHZhbHVlIGluIHRoZSByZXNvdXJjZSBzdGF0ZS5cbiAgICpcbiAgICogV2l0aG91dCBhIHN1Y2Nlc3NmdWwgdGVycmFmb3JtIGFwcGx5IGFmdGVyIHRoaXMgcGFyYW1ldGVyIGlzIHNldCxcbiAgICogdGhpcyBmbGFnIHdpbGwgaGF2ZSBubyBlZmZlY3QuIElmIHNldHRpbmcgdGhpcyBmaWVsZCBpbiB0aGUgc2FtZVxuICAgKiBvcGVyYXRpb24gdGhhdCB3b3VsZCByZXF1aXJlIHJlcGxhY2luZyB0aGUgYnVja2V0IG9yIGRlc3Ryb3lpbmdcbiAgICogdGhlIGJ1Y2tldCwgdGhpcyBmbGFnIHdpbGwgbm90IHdvcmsuXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSB3aGVuIGltcG9ydGluZyBhIGJ1Y2tldCwgYSBzdWNjZXNzZnVsIHRlcnJhZm9ybSBhcHBseVxuICAgKiBpcyByZXF1aXJlZCB0byBzZXQgdGhpcyB2YWx1ZSBpbiBzdGF0ZSBiZWZvcmUgaXQgd2lsbCB0YWtlIGVmZmVjdFxuICAgKiBvbiBhIGRlc3Ryb3kgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXN0cm95PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYW4gUzMgYnVja2V0IHdlYnNpdGUgY29uZmlndXJhdGlvbiByZXNvdXJjZS5cbiAgICpcbiAgICogSW1wb3J0YW50OiBBbWF6b24gUzMgd2Vic2l0ZSBlbmRwb2ludHMgZG8gbm90IHN1cHBvcnQgSFRUUFMgb3IgYWNjZXNzIHBvaW50cy5cbiAgICogSWYgeW91IHdhbnQgdG8gdXNlIEhUVFBTLCB5b3UgY2FuIHVzZSBlZGdlIERpc3RyaWJ1dGlvbiB0byBzZXJ2ZSBhIHN0YXRpY1xuICAgKiB3ZWJzaXRlIGhvc3RlZCBpbiBhIGJ1Y2tldC5cbiAgICpcbiAgICogVXNlIE9yaWdpbkFjY2Vzc0lkZW50aXR5IHByb3BlcnR5IHRvIGNvbnRyb2wgaW5ncmVzcyB0aHJvdWdoIGVkZ2UgRGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtIb3N0aW5nIFdlYnNpdGVzIG9uIFMzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9XZWJzaXRlSG9zdGluZy5odG1sKS5cbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVDb25maWc/OiBXZWJzaXRlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBTMyBidWNrZXQgQ09SUyBjb25maWd1cmF0aW9uIHJlc291cmNlLlxuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDT1JTLCBnbyB0b1xuICAgKiBbRW5hYmxpbmcgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NvcnMuaHRtbClcbiAgICogaW4gdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29yc0NvbmZpZz86IENvcnNDb25maWc7XG5cbiAgLyoqXG4gICAqIE9uZSBvciBtb3JlIExpZmVjeWNsZSBydWxlcy4gRWFjaCBydWxlIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqXG4gICAqICAtIFJ1bGUgaWRcbiAgICogIC0gRmlsdGVyIGlkZW50aWZ5aW5nIG9iamVjdHMgdG8gd2hpY2ggdGhlIHJ1bGUgYXBwbGllc1xuICAgKiAgLSBPbmUgb3IgbW9yZSB0cmFuc2l0aW9uIG9yIGV4cGlyYXRpb24gYWN0aW9uc1xuICAgKlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIEFtYXpvbiBTMyBVc2VyIEd1aWRlIG9uIFtMaWZlY3ljbGUgQ29uZmlndXJhdGlvbiBFbGVtZW50c10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvaW50cm8tbGlmZWN5Y2xlLXJ1bGVzLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlmZWN5Y2xlUnVsZXM/OiBMaWZlY3ljbGVDb25maWd1cmF0aW9uUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB2ZXJzaW9uaW5nIG9uIHRoZSBTMyBidWNrZXQuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB3aWxsIHN1c3BlbmQgdmVyc2lvbmluZyBpZiB0aGUgYXNzb2NpYXRlZCBTMyBidWNrZXQgaXMgdmVyc2lvbmVkLlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIGVuYWJsaW5nIHZlcnNpb25pbmcgb24gdGhlIGJ1Y2tldCBmb3IgdGhlIGZpcnN0IHRpbWUsIEFXUyByZWNvbW1lbmRzIHRoYXQgeW91IHdhaXQgZm9yIDE1IG1pbnV0ZXMgYWZ0ZXIgZW5hYmxpbmcgdmVyc2lvbmluZyBiZWZvcmUgaXNzdWluZyB3cml0ZSBvcGVyYXRpb25zIChQVVQgb3IgREVMRVRFKSBvbiBvYmplY3RzIGluIHRoZSBidWNrZXQuXG4gICAqIFRoaXMgd2lsbCBjYXVzZSAxNW0gZGVsYXkgaWYgYHBhdGhgIGlzIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgYnVja2V0IHNob3VsZCBzZW5kIG5vdGlmaWNhdGlvbnMgdG8gQW1hem9uIEV2ZW50QnJpZGdlIG9yIG5vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50QnJpZGdlRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIE9iamVjdE93bmVyc2hpcCBhbmQgQnVja2V0QWNjZXNzQ29udHJvbFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMMTI4NFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMMTY0M1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMMTkzNlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMMjM2M1xuICAvLyBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zMy9saWIvYnVja2V0LnRzI0wyOTA1XG5cbiAgLyoqXG4gICAqIEVuZm9yY2VzIFNTTCBmb3IgcmVxdWVzdHMuIFMzLjUgb2YgdGhlIEFXUyBGb3VuZGF0aW9uYWwgU2VjdXJpdHkgQmVzdCBQcmFjdGljZXMgUmVnYXJkaW5nIFMzLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25maWcvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3MzLWJ1Y2tldC1zc2wtcmVxdWVzdHMtb25seS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmZvcmNlU1NMPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5mb3JjZXMgbWluaW11bSBUTFMgdmVyc2lvbiBmb3IgcmVxdWVzdHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIGBlbmZvcmNlU1NMYCB0byBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2FtYXpvbi1zMy1wb2xpY3kta2V5cy5odG1sI2V4YW1wbGUtb2JqZWN0LXRscy12ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIG1pbmltdW0gVExTIHZlcnNpb24gaXMgZW5mb3JjZWQuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtVExTVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRW5hYmxlIENsb3VkZnJvbnQgYWNjZXNzIHZpYSBPcmlnaW4gQWNjZXNzIElkZW50aXR5LlxuICAgKlxuICAgKiBOb3RlOiByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIE9BQyBpbiBmdXR1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2xvdWRmcm9udCBhY2Nlc3NcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkZnJvbnRBY2Nlc3M/OiBDbG91ZGZyb250QWNjZXNzQ29uZmlnO1xuXG4gIC8vIFRPRE86IEFkZCBmbGFnIHRvIHJlZ2lzdGVyIEJ1Y2tldCBTb3VyY2Ugb3V0cHV0cz9cbn1cblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldE91dHB1dHMge1xuICAvKipcbiAgICogQVdTIEJ1Y2tldCBuYW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIEJ1Y2tldCBhcm5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRG9tYWluIG5hbWUgb2YgdGhlIHN0YXRpYyB3ZWJzaXRlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlRG9tYWluTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjQgRE5TIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbmFsIGRvbWFpbiBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByZWdpb25hbERvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3JpZ2luIEFjY2VzcyBJZGVudGl0eSwgaWYgY2xvdWRmcm9udEFjY2VzcyBpcyBlbmFibGVkLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IHN0cmluZztcblxuICAvKipcbiAgICogS21zIEtleSBvdXRwdXRzLCBpZiBidWNrZXQgaGFzIGVuY3J5cHRpb24uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuS2V5T3V0cHV0cztcbn1cblxuLyoqXG4gKiBJbXBvcnRlZCBvciBjcmVhdGVkIEJ1Y2tldCBhdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1Y2tldCBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICAvKiogU3Ryb25nbHkgdHlwZWQgb3V0cHV0cyAqL1xuICByZWFkb25seSBidWNrZXRPdXRwdXRzOiBCdWNrZXRPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBBV1MgQnVja2V0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEFXUyBCdWNrZXQgYXJuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcm46IHN0cmluZztcblxuICAvKiogV2hldGhlciB0aGUgYnVja2V0IGhhcyB2ZXJzaW9uaW5nIGVuYWJsZWQgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbmVkOiBib29sZWFuO1xuXG4gIC8qKiBUaGUgaG9zdGVkIFpvbmUgSWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEb21haW4gbmFtZSBvZiB0aGUgc3RhdGljIHdlYnNpdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgUm91dGUgNTMgYWxpYXMgcmVjb3Jkcy5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZURvbWFpbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1Y2tldCBpcyBwdWJsaWMgb3Igbm90LlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgS01TIGVuY3J5cHRpb24ga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhIGBCdWNrZXRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNvdXJjZSBvZiBmaWxlcyBmb3IgdXBsb2FkIHRvIHRoZSBidWNrZXQuXG4gICAqL1xuICBhZGRTb3VyY2UocHJvcHM6IEFkZFNvdXJjZU9wdGlvbnMsIHNvdXJjZUlkPzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGJ1Y2tldCBoYXMgYmVlbiBjb25maWd1cmVkIGZvciBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICAgKi9cbiAgaXNXZWJzaXRlKCk6IHRoaXMgaXMge1xuICAgIHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmc7XG4gICAgYnVja2V0T3V0cHV0czogeyB3ZWJzaXRlVXJsOiBzdHJpbmc7IHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmcgfTtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGh0dHBzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAtIGBodHRwczovL3MzLnVzLXdlc3QtMS5hbWF6b25hd3MuY29tL29ubHlidWNrZXRgXG4gICAqIC0gYGh0dHBzOi8vczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20vYnVja2V0L2tleWBcbiAgICogLSBgaHR0cHM6Ly9zMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24vY2hpbmEtYnVja2V0L215a2V5YFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICB1cmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgVVJMIG9mIGFuIFMzIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gICAqIC0gYHMzOi8vb25seWJ1Y2tldGBcbiAgICogLSBgczM6Ly9idWNrZXQva2V5YFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIG9iamVjdC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIFMzIFVSTCBvZiB0aGVcbiAgICogICAgICBidWNrZXQgaXMgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIGFuIE9iamVjdFMzVXJsIHRva2VuXG4gICAqL1xuICBzM1VybEZvck9iamVjdChrZXk/OiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gQVJOIHRoYXQgcmVwcmVzZW50cyBhbGwgb2JqZWN0cyB3aXRoaW4gdGhlIGJ1Y2tldCB0aGF0IG1hdGNoXG4gICAqIHRoZSBrZXkgcGF0dGVybiBzcGVjaWZpZWQuIFRvIHJlcHJlc2VudCBhbGwga2V5cywgc3BlY2lmeSBgYFwiKlwiYGAuXG4gICAqL1xuICBhcm5Gb3JPYmplY3RzKGtleVBhdHRlcm46IHN0cmluZyk6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICBwZXJtaXNzaW9uOiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRSZWFkKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnkpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoaXMgYnVja2V0IHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB3cml0dGVuIGZpbGVzIHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGBzMzpQdXRPYmplY3RBY2xgLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIGdyYW50IHJlYWQvd3JpdGUgb2JqZWN0IGFjY2VzcyB0byBJQU0gcHJpbmNpcGFscyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdGhlIHByaW5jaXBhbCB0byBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyxcbiAgICogdXNlIHRoZSBgZ3JhbnRQdXRBY2xgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpLiBQYXJhbWV0ZXIgdHlwZSBpcyBgYW55YCBidXQgYHN0cmluZ2Agc2hvdWxkIGJlIHBhc3NlZCBpbi5cbiAgICogQHBhcmFtIGFsbG93ZWRBY3Rpb25QYXR0ZXJucyBSZXN0cmljdCB0aGUgcGVybWlzc2lvbnMgdG8gY2VydGFpbiBsaXN0IG9mIGFjdGlvbiBwYXR0ZXJuc1xuICAgKi9cbiAgZ3JhbnRXcml0ZShcbiAgICBpZGVudGl0eTogaWFtLklHcmFudGFibGUsXG4gICAgb2JqZWN0c0tleVBhdHRlcm4/OiBhbnksXG4gICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zPzogc3RyaW5nW10sXG4gICk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRQdXQoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIElBTSBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBtb2RpZnkgdGhlIEFDTHMgb2Ygb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gQnVja2V0LlxuICAgKlxuICAgKiBjYWxsaW5nIGBncmFudFdyaXRlYCBvciBgZ3JhbnRSZWFkV3JpdGVgIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgQUNMcyBvZiB0aGUgb2JqZWN0cztcbiAgICogaW4gdGhpcyBjYXNlLCBpZiB5b3UgbmVlZCB0byBtb2RpZnkgb2JqZWN0IEFDTHMsIGNhbGwgdGhpcyBtZXRob2QgZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIG9iamVjdHNLZXlQYXR0ZXJuIFJlc3RyaWN0IHRoZSBwZXJtaXNzaW9uIHRvIGEgY2VydGFpbiBrZXkgcGF0dGVybiAoZGVmYXVsdCAnKicpXG4gICAqL1xuICBncmFudFB1dEFjbChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogc3RyaW5nKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgczM6RGVsZXRlT2JqZWN0KiBwZXJtaXNzaW9uIHRvIGFuIElBTSBwcmluY2lwYWwgZm9yIG9iamVjdHNcbiAgICogaW4gdGhpcyBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBvYmplY3RzS2V5UGF0dGVybiBSZXN0cmljdCB0aGUgcGVybWlzc2lvbiB0byBhIGNlcnRhaW4ga2V5IHBhdHRlcm4gKGRlZmF1bHQgJyonKS4gUGFyYW1ldGVyIHR5cGUgaXMgYGFueWAgYnV0IGBzdHJpbmdgIHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqL1xuICBncmFudERlbGV0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuPzogYW55KTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgYW4gZW5jcnlwdGlvbiBrZXkgaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSBmb3JcbiAgICogZW5jcnlwdC9kZWNyeXB0IHdpbGwgYWxzbyBiZSBncmFudGVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYHMzOlB1dE9iamVjdEFjbGAsIHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gZ3JhbnQgcmVhZC93cml0ZSBvYmplY3QgYWNjZXNzIHRvIElBTSBwcmluY2lwYWxzIGluIG90aGVyIGFjY291bnRzLlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0aGUgcHJpbmNpcGFsIHRvIGhhdmUgcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoZSBBQ0xzLFxuICAgKiB1c2UgdGhlIGBncmFudFB1dEFjbGAgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCBvYmplY3RzS2V5UGF0dGVybj86IGFueSk6IGlhbS5HcmFudDtcblxuICAvLyAvKipcbiAgLy8gICogQWxsb3dzIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gb2JqZWN0cyBmcm9tIHRoaXMgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBJTVBPUlRBTlQ6IFRoaXMgcGVybWlzc2lvbiBhbGxvd3MgYW55b25lIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiBTMyBvYmplY3RzXG4gIC8vICAqIGluIHRoaXMgYnVja2V0LCB3aGljaCBpcyB1c2VmdWwgZm9yIHdoZW4geW91IGNvbmZpZ3VyZSB5b3VyIGJ1Y2tldCBhcyBhXG4gIC8vICAqIHdlYnNpdGUgYW5kIHdhbnQgZXZlcnlvbmUgdG8gYmUgYWJsZSB0byByZWFkIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCB3aXRob3V0XG4gIC8vICAqIG5lZWRpbmcgdG8gYXV0aGVudGljYXRlLlxuICAvLyAgKlxuICAvLyAgKiBXaXRob3V0IGFyZ3VtZW50cywgdGhpcyBtZXRob2Qgd2lsbCBncmFudCByZWFkIChcInMzOkdldE9iamVjdFwiKSBhY2Nlc3MgdG9cbiAgLy8gICogYWxsIG9iamVjdHMgKFwiKlwiKSBpbiB0aGUgYnVja2V0LlxuICAvLyAgKlxuICAvLyAgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGBpYW0uR3JhbnRgIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgbW9kaWZpZWRcbiAgLy8gICogYXMgbmVlZGVkLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQgYSBjb25kaXRpb24gdGhhdCB3aWxsIHJlc3RyaWN0IGFjY2VzcyBvbmx5XG4gIC8vICAqIHRvIGFuIElQdjQgcmFuZ2UgbGlrZSB0aGlzOlxuICAvLyAgKlxuICAvLyAgKiAgICAgY29uc3QgZ3JhbnQgPSBidWNrZXQuZ3JhbnRQdWJsaWNBY2Nlc3MoKTtcbiAgLy8gICogICAgIGdyYW50LnJlc291cmNlU3RhdGVtZW50IS5hZGRDb25kaXRpb24o4oCYSXBBZGRyZXNz4oCZLCB7IOKAnGF3czpTb3VyY2VJcOKAnTog4oCcNTQuMjQwLjE0My4wLzI04oCdIH0pO1xuICAvLyAgKlxuICAvLyAgKlxuICAvLyAgKiBAcGFyYW0ga2V5UHJlZml4IHRoZSBwcmVmaXggb2YgUzMgb2JqZWN0IGtleXMgKGUuZy4gYGhvbWUvKmApLiBEZWZhdWx0IGlzIFwiKlwiLlxuICAvLyAgKiBAcGFyYW0gYWxsb3dlZEFjdGlvbnMgdGhlIHNldCBvZiBTMyBhY3Rpb25zIHRvIGFsbG93LiBEZWZhdWx0IGlzIFwiczM6R2V0T2JqZWN0XCIuXG4gIC8vICAqIEByZXR1cm5zIFRoZSBgaWFtLlBvbGljeVN0YXRlbWVudGAgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBhcHBseSBlLmcuIGNvbmRpdGlvbnMuXG4gIC8vICAqL1xuICAvLyBncmFudFB1YmxpY0FjY2VzcyhrZXlQcmVmaXg/OiBzdHJpbmcsIC4uLmFsbG93ZWRBY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQWRkcyBhIGJ1Y2tldCBub3RpZmljYXRpb24gZXZlbnQgZGVzdGluYXRpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gdHJpZ2dlciB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKExhbWJkYSwgU05TIFRvcGljIG9yIFNRUyBRdWV1ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcnMgUzMgb2JqZWN0IGtleSBmaWx0ZXIgcnVsZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9iamVjdHNcbiAgICogdHJpZ2dlciB0aGlzIGV2ZW50LiBFYWNoIGZpbHRlciBtdXN0IGluY2x1ZGUgYSBgcHJlZml4YCBhbmQvb3IgYHN1ZmZpeGBcbiAgICogdGhhdCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgczMgb2JqZWN0IGtleS4gUmVmZXIgdG8gdGhlIFMzIERldmVsb3BlciBHdWlkZVxuICAgKiBmb3IgZGV0YWlscyBhYm91dCBhbGxvd2VkIGZpbHRlciBydWxlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sI25vdGlmaWNhdGlvbi1ob3ctdG8tZmlsdGVyaW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgbXlMYW1iZGE6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICogICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnTXlCdWNrZXQnKTtcbiAgICogICAgYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRCwgbmV3IHMzbi5MYW1iZGFEZXN0aW5hdGlvbihteUxhbWJkYSksIHtwcmVmaXg6ICdob21lL215dXNlcm5hbWUvKid9KVxuICAgKlxuICAgKiBAc2VlXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L05vdGlmaWNhdGlvbkhvd1RvLmh0bWxcbiAgICovXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogY3JlYXRlZCBpbiB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KHMzLkV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBhZGRPYmplY3RDcmVhdGVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGEgZGVzdGluYXRpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gYW4gb2JqZWN0IGlzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGV2ZW50IGJyaWRnZSBub3RpZmljYXRpb24sIGNhdXNpbmcgYWxsIGV2ZW50cyBiZWxvdyB0byBiZSBzZW50IHRvIEV2ZW50QnJpZGdlOlxuICAgKlxuICAgKiAtIE9iamVjdCBEZWxldGVkIChEZWxldGVPYmplY3QpXG4gICAqIC0gT2JqZWN0IERlbGV0ZWQgKExpZmVjeWNsZSBleHBpcmF0aW9uKVxuICAgKiAtIE9iamVjdCBSZXN0b3JlIEluaXRpYXRlZFxuICAgKiAtIE9iamVjdCBSZXN0b3JlIENvbXBsZXRlZFxuICAgKiAtIE9iamVjdCBSZXN0b3JlIEV4cGlyZWRcbiAgICogLSBPYmplY3QgU3RvcmFnZSBDbGFzcyBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFjY2VzcyBUaWVyIENoYW5nZWRcbiAgICogLSBPYmplY3QgQUNMIFVwZGF0ZWRcbiAgICogLSBPYmplY3QgVGFncyBBZGRlZFxuICAgKiAtIE9iamVjdCBUYWdzIERlbGV0ZWRcbiAgICovXG4gIGVuYWJsZUV2ZW50QnJpZGdlTm90aWZpY2F0aW9uKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCdWNrZXRCYXNlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElCdWNrZXQge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnVja2V0QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJzaXRlRG9tYWluTmFtZT86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYnNpdGVFbmRwb2ludD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHB1YmxpYz86IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB2ZXJzaW9uZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwdWJsaWMgZ2V0IGJ1Y2tldE91dHB1dHMoKTogQnVja2V0T3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgIGFybjogdGhpcy5idWNrZXRBcm4sXG4gICAgICBkb21haW5OYW1lOiB0aGlzLnJlc291cmNlLmJ1Y2tldERvbWFpbk5hbWUsXG4gICAgICByZWdpb25hbERvbWFpbk5hbWU6IHRoaXMucmVzb3VyY2UuYnVja2V0UmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgd2Vic2l0ZURvbWFpbk5hbWU6IHRoaXMud2Vic2l0ZURvbWFpbk5hbWUsXG4gICAgICB3ZWJzaXRlVXJsOiB0aGlzLndlYnNpdGVFbmRwb2ludCxcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OlxuICAgICAgICB0aGlzLm9yaWdpbkFjY2Vzc0lkZW50aXR5Py5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlQYXRoLFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5Py5rZXlPdXRwdXRzLFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvdXRwdXRzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldE91dHB1dHM7XG4gIH1cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHJlc291cmNlOlxuICAgIHwgczNCdWNrZXQuUzNCdWNrZXRcbiAgICB8IGRhdGFBd3NTM0J1Y2tldC5EYXRhQXdzUzNCdWNrZXQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5BY2Nlc3NJZGVudGl0eT86IE9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IF9pc1dlYnNpdGU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzb3VyY2VTbGVlcD86IHNsZWVwLlNsZWVwO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlczogU291cmNlSW5kZXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYEJ1Y2tldFBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBXaGV0aGVyIHRvIGRpc2FsbG93IHB1YmxpYyBhY2Nlc3NcbiAgLy8gICovXG4gIC8vIHByb3RlY3RlZCBhYnN0cmFjdCBkaXNhbGxvd1B1YmxpY0FjY2Vzcz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25zPzogQnVja2V0Tm90aWZpY2F0aW9ucztcblxuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uc0hhbmRsZXJSb2xlPzogaWFtLklSb2xlO1xuXG4gIHByb3RlY3RlZCBub3RpZmljYXRpb25zU2tpcERlc3RpbmF0aW9uVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLy8gVE9ETzogcmUtYWRkIG93bmVyc2hpcCBjb250cm9sIHBhcnNpbmcgYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDIzNjNcbiAgLy8gcHJvdGVjdGVkIG9iamVjdE93bmVyc2hpcD86IE9iamVjdE93bmVyc2hpcDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQ29uc3RydWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMucG9saWN5Py5kb2N1bWVudC52YWxpZGF0ZUZvclJlc291cmNlUG9saWN5KCkgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgYnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgcGVybWlzc2lvbjogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy5wb2xpY3kgJiYgdGhpcy5hdXRvQ3JlYXRlUG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeSA9IG5ldyBCdWNrZXRQb2xpY3kodGhpcywgXCJQb2xpY3lcIiwgeyBidWNrZXQ6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9saWN5KSB7XG4gICAgICB0aGlzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgYW5kIGl0J3MgY29udGVudHMgdG8gYW4gSUFNXG4gICAqIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIikge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNUSU9OUyxcbiAgICAgIHRoaXMucmVzb3VyY2UuYXJuLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50V3JpdGUoXG4gICAgaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLFxuICAgIG9iamVjdHNLZXlQYXR0ZXJuOiBhbnkgPSBcIipcIixcbiAgICBhbGxvd2VkQWN0aW9uUGF0dGVybnM6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIGNvbnN0IGdyYW50ZWRXcml0ZUFjdGlvbnMgPVxuICAgICAgYWxsb3dlZEFjdGlvblBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhbGxvd2VkQWN0aW9uUGF0dGVybnNcbiAgICAgICAgOiB0aGlzLndyaXRlQWN0aW9ucztcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZ3JhbnRlZFdyaXRlQWN0aW9ucyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5yZXNvdXJjZS5hcm4sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOlB1dE9iamVjdCogYW5kIHMzOkFib3J0KiBwZXJtaXNzaW9ucyBmb3IgdGhpcyBidWNrZXQgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHdyaXR0ZW4gZmlsZXMgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50UHV0KGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ1RJT05TLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UHV0QWNsKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogc3RyaW5nID0gXCIqXCIsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5CVUNLRVRfUFVUX0FDTF9BQ1RJT05TLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFybkZvck9iamVjdHMob2JqZWN0c0tleVBhdHRlcm4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHMzOkRlbGV0ZU9iamVjdCogcGVybWlzc2lvbiB0byBhbiBJQU0gcHJpbmNpcGFsIGZvciBvYmplY3RzXG4gICAqIGluIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gb2JqZWN0c0tleVBhdHRlcm4gUmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gdG8gYSBjZXJ0YWluIGtleSBwYXR0ZXJuIChkZWZhdWx0ICcqJykuIFBhcmFtZXRlciB0eXBlIGlzIGBhbnlgIGJ1dCBgc3RyaW5nYCBzaG91bGQgYmUgcGFzc2VkIGluLlxuICAgKi9cbiAgcHVibGljIGdyYW50RGVsZXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgb2JqZWN0c0tleVBhdHRlcm46IGFueSA9IFwiKlwiKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLkJVQ0tFVF9ERUxFVEVfQUNUSU9OUyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hcm5Gb3JPYmplY3RzKG9iamVjdHNLZXlQYXR0ZXJuKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKFxuICAgIGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSxcbiAgICBvYmplY3RzS2V5UGF0dGVybjogYW55ID0gXCIqXCIsXG4gICkge1xuICAgIGNvbnN0IGJ1Y2tldEFjdGlvbnMgPSBwZXJtcy5CVUNLRVRfUkVBRF9BQ1RJT05TLmNvbmNhdCh0aGlzLndyaXRlQWN0aW9ucyk7XG4gICAgLy8gd2UgbmVlZCB1bmlxdWUgcGVybWlzc2lvbnMgYmVjYXVzZSBzb21lIHBlcm1pc3Npb25zIGFyZSBjb21tb24gYmV0d2VlbiByZWFkIGFuZCB3cml0ZSBrZXkgYWN0aW9uc1xuICAgIGNvbnN0IGtleUFjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi5wZXJtcy5LRVlfUkVBRF9BQ1RJT05TLCAuLi5wZXJtcy5LRVlfV1JJVEVfQUNUSU9OU10pLFxuICAgIF07XG5cbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgYnVja2V0QWN0aW9ucyxcbiAgICAgIGtleUFjdGlvbnMsXG4gICAgICB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIHRoaXMuYXJuRm9yT2JqZWN0cyhvYmplY3RzS2V5UGF0dGVybiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB0aHJvdWdoIGBwcm9wcy5wdWJsaWNgIGluIGNvbnN0cnVjdG9yLFxuICAvLyBUT0RPOiByZS1hZGQgT2JqZWN0T3duZXJzaGlwIGFuZCBCdWNrZXRBY2Nlc3NDb250cm9sXG4gIC8vIC8qKlxuICAvLyAgKiBBbGxvd3MgdW5yZXN0cmljdGVkIGFjY2VzcyB0byBvYmplY3RzIGZyb20gdGhpcyBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIElNUE9SVEFOVDogVGhpcyBwZXJtaXNzaW9uIGFsbG93cyBhbnlvbmUgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIFMzIG9iamVjdHNcbiAgLy8gICogaW4gdGhpcyBidWNrZXQsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igd2hlbiB5b3UgY29uZmlndXJlIHlvdXIgYnVja2V0IGFzIGFcbiAgLy8gICogd2Vic2l0ZSBhbmQgd2FudCBldmVyeW9uZSB0byBiZSBhYmxlIHRvIHJlYWQgb2JqZWN0cyBpbiB0aGUgYnVja2V0IHdpdGhvdXRcbiAgLy8gICogbmVlZGluZyB0byBhdXRoZW50aWNhdGUuXG4gIC8vICAqXG4gIC8vICAqIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIG1ldGhvZCB3aWxsIGdyYW50IHJlYWQgKFwiczM6R2V0T2JqZWN0XCIpIGFjY2VzcyB0b1xuICAvLyAgKiBhbGwgb2JqZWN0cyAoXCIqXCIpIGluIHRoZSBidWNrZXQuXG4gIC8vICAqXG4gIC8vICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgYGlhbS5HcmFudGAgb2JqZWN0LCB3aGljaCBjYW4gdGhlbiBiZSBtb2RpZmllZFxuICAvLyAgKiBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCBhIGNvbmRpdGlvbiB0aGF0IHdpbGwgcmVzdHJpY3QgYWNjZXNzIG9ubHlcbiAgLy8gICogdG8gYW4gSVB2NCByYW5nZSBsaWtlIHRoaXM6XG4gIC8vICAqXG4gIC8vICAqICAgICBjb25zdCBncmFudCA9IGJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcygpO1xuICAvLyAgKiAgICAgZ3JhbnQucmVzb3VyY2VTdGF0ZW1lbnQhLmFkZENvbmRpdGlvbijigJhJcEFkZHJlc3PigJksIHsg4oCcYXdzOlNvdXJjZUlw4oCdOiDigJw1NC4yNDAuMTQzLjAvMjTigJ0gfSk7XG4gIC8vICAqXG4gIC8vICAqIE5vdGUgdGhhdCBpZiB0aGlzIGBJQnVja2V0YCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYnVja2V0LCBwb3NzaWJseSBub3RcbiAgLy8gICogbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdCwgc2luY2UgaXQnc1xuICAvLyAgKiBpbXBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgcG9saWN5IG9mIGFuIGV4aXN0aW5nIGJ1Y2tldC5cbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGtleVByZWZpeCB0aGUgcHJlZml4IG9mIFMzIG9iamVjdCBrZXlzIChlLmcuIGBob21lLypgKS4gRGVmYXVsdCBpcyBcIipcIi5cbiAgLy8gICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIHRoZSBzZXQgb2YgUzMgYWN0aW9ucyB0byBhbGxvdy4gRGVmYXVsdCBpcyBcInMzOkdldE9iamVjdFwiLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdyYW50UHVibGljQWNjZXNzKGtleVByZWZpeCA9IFwiKlwiLCAuLi5hbGxvd2VkQWN0aW9uczogc3RyaW5nW10pIHtcbiAgLy8gICBpZiAoIXRoaXMucHVibGljKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ3JhbnQgcHVibGljIGFjY2VzcyB3aGVuICdwdWJsaWMnIGlzIGVuYWJsZWRcIik7XG4gIC8vICAgfVxuICAvLyAgIC8vIFRET086IFRoaXMgc2hvdWxkIGNyZWF0ZSBwdWJsaWNBY2Nlc3MgcmVzb3VyY2VcbiAgLy8gICBhbGxvd2VkQWN0aW9ucyA9XG4gIC8vICAgICBhbGxvd2VkQWN0aW9ucy5sZW5ndGggPiAwID8gYWxsb3dlZEFjdGlvbnMgOiBbXCJzMzpHZXRPYmplY3RcIl07XG5cbiAgLy8gICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gIC8vICAgICBhY3Rpb25zOiBhbGxvd2VkQWN0aW9ucyxcbiAgLy8gICAgIHJlc291cmNlQXJuczogW3RoaXMuYXJuRm9yT2JqZWN0cyhrZXlQcmVmaXgpXSxcbiAgLy8gICAgIGdyYW50ZWU6IG5ldyBpYW0uQW55UHJpbmNpcGFsKCksXG4gIC8vICAgICByZXNvdXJjZTogdGhpcyxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYnVja2V0IG5vdGlmaWNhdGlvbiBldmVudCBkZXN0aW5hdGlvbi5cbiAgICpcbiAgICogUzMgQnVja2V0cyBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UuXG4gICAqIERlY2xhcmluZyBtdWx0aXBsZSBgYXdzX3MzX2J1Y2tldF9ub3RpZmljYXRpb25gIHJlc291cmNlcyB0byB0aGUgc2FtZVxuICAgKiBTMyBCdWNrZXQgd2lsbCBjYXVzZSBhIHBlcnBldHVhbCBkaWZmZXJlbmNlIGluIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZXZlbnQgbm90aWZpY2F0aW9ucyBjb25maWd1cmVkXG4gICAqIGZvciB0aGUgUzMgYnVja2V0IG91dHNpZGUgb2YgdGhpcyBiZWFjb24uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gdHJpZ2dlciB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKExhbWJkYSwgU05TIFRvcGljIG9yIFNRUyBRdWV1ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcnMgUzMgb2JqZWN0IGtleSBmaWx0ZXIgcnVsZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9iamVjdHNcbiAgICogdHJpZ2dlciB0aGlzIGV2ZW50LiBFYWNoIGZpbHRlciBtdXN0IGluY2x1ZGUgYSBgcHJlZml4YCBhbmQvb3IgYHN1ZmZpeGBcbiAgICogdGhhdCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgczMgb2JqZWN0IGtleS4gUmVmZXIgdG8gdGhlIFMzIERldmVsb3BlciBHdWlkZVxuICAgKiBmb3IgZGV0YWlscyBhYm91dCBhbGxvd2VkIGZpbHRlciBydWxlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Ob3RpZmljYXRpb25Ib3dUby5odG1sI25vdGlmaWNhdGlvbi1ob3ctdG8tZmlsdGVyaW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgbXlGdW5jdGlvbjogY29tcHV0ZS5GdW5jdGlvbjtcbiAgICogICAgY29uc3QgYnVja2V0ID0gbmV3IHN0b3JhZ2UuQnVja2V0KHRoaXMsICdNeUJ1Y2tldCcpO1xuICAgKiAgICBidWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oczMuRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVELCBuZXcgczNuLkxhbWJkYURlc3RpbmF0aW9uKG15RnVuY3Rpb24pLCB7cHJlZml4OiAnaG9tZS9teXVzZXJuYW1lLyonfSk7XG4gICAqXG4gICAqIEBzZWVcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvTm90aWZpY2F0aW9uSG93VG8uaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICkge1xuICAgIC8vIFRPRE86IFRoaXMgYmxvY2tzIGFkZGluZyBub3RpZmljYXRpb25zIG91dHNpZGUgb2YgdGhlIFN0YWNrIG93bmluZyB0aGUgYnVja2V0Li4uXG4gICAgLy8gQVdTLUNESyB3b3JrcyBhcm91bmQgdGhpcyBieSB1c2luZyBhIEN1c3RvbVJlc291cmNlIGhhbmRsZXIgKExhbWJkYSBmdW5jdGlvbikgd2hpY2ggbW9kaWZpZXNcbiAgICAvLyB0aGUgYnVja2V0IHBvbGljeSBpbiBwbGFjZSAoYW5kIENGTiBkb2VzIG5vdCBtYW5hZ2UgdGhlIGFjdHVhbCBidWNrZXQgcG9saWN5LCBzbyBubyB0ZiBzdGF0ZSEpXG4gICAgdGhpcy53aXRoTm90aWZpY2F0aW9ucygobm90aWZpY2F0aW9ucykgPT5cbiAgICAgIG5vdGlmaWNhdGlvbnMuYWRkTm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoTm90aWZpY2F0aW9ucyhjYjogKG5vdGlmaWNhdGlvbnM6IEJ1Y2tldE5vdGlmaWNhdGlvbnMpID0+IHZvaWQpIHtcbiAgICAvLyBUT0RPOiBVc2UgQ3VzdG9tIFJlc291cmNlcyB0byBtYW5hZ2UgYnVja2V0IG5vdGlmaWNhdGlvbnMgb3V0c2lkZSBvZiB0aGUgc3RhY2tcbiAgICAvLyBoYW5kbGVyUm9sZTogdGhpcy5ub3RpZmljYXRpb25zSGFuZGxlclJvbGUsXG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBCdWNrZXROb3RpZmljYXRpb25zKHRoaXMsIFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAgICAgIGJ1Y2tldDogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYih0aGlzLm5vdGlmaWNhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogY3JlYXRlZCBpbiB0aGUgYnVja2V0LiBUaGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nXG4gICAqIGBvbkV2ZW50KEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRClgLlxuICAgKlxuICAgKiBAcGFyYW0gZGVzdCBUaGUgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uIChzZWUgb25FdmVudClcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVycyAoc2VlIG9uRXZlbnQpXG4gICAqL1xuICBwdWJsaWMgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQsXG4gICAgICBkZXN0LFxuICAgICAgLi4uZmlsdGVycyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYSBkZXN0aW5hdGlvbiB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBvYmplY3QgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBidWNrZXQuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGNhbGxpbmdcbiAgICogYG9uRXZlbnQoRXZlbnRUeXBlLk9CSkVDVF9SRU1PVkVEKWAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb24gKHNlZSBvbkV2ZW50KVxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJzIChzZWUgb25FdmVudClcbiAgICovXG4gIHB1YmxpYyBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5hZGRFdmVudE5vdGlmaWNhdGlvbihcbiAgICAgIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRCxcbiAgICAgIGRlc3QsXG4gICAgICAuLi5maWx0ZXJzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBldmVudCBicmlkZ2Ugbm90aWZpY2F0aW9uLCBjYXVzaW5nIGFsbCBldmVudHMgYmVsb3cgdG8gYmUgc2VudCB0byBFdmVudEJyaWRnZTpcbiAgICpcbiAgICogLSBPYmplY3QgRGVsZXRlZCAoRGVsZXRlT2JqZWN0KVxuICAgKiAtIE9iamVjdCBEZWxldGVkIChMaWZlY3ljbGUgZXhwaXJhdGlvbilcbiAgICogLSBPYmplY3QgUmVzdG9yZSBJbml0aWF0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBDb21wbGV0ZWRcbiAgICogLSBPYmplY3QgUmVzdG9yZSBFeHBpcmVkXG4gICAqIC0gT2JqZWN0IFN0b3JhZ2UgQ2xhc3MgQ2hhbmdlZFxuICAgKiAtIE9iamVjdCBBY2Nlc3MgVGllciBDaGFuZ2VkXG4gICAqIC0gT2JqZWN0IEFDTCBVcGRhdGVkXG4gICAqIC0gT2JqZWN0IFRhZ3MgQWRkZWRcbiAgICogLSBPYmplY3QgVGFncyBEZWxldGVkXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSB7XG4gICAgdGhpcy53aXRoTm90aWZpY2F0aW9ucygobm90aWZpY2F0aW9ucykgPT5cbiAgICAgIG5vdGlmaWNhdGlvbnMuZW5hYmxlRXZlbnRCcmlkZ2VOb3RpZmljYXRpb24oKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICBidWNrZXRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBrZXlBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICByZXNvdXJjZUFybjogc3RyaW5nLFxuICAgIC4uLm90aGVyUmVzb3VyY2VBcm5zOiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBbcmVzb3VyY2VBcm4sIC4uLm90aGVyUmVzb3VyY2VBcm5zXTtcblxuICAgIGNvbnN0IHJldCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IGJ1Y2tldEFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IHJlc291cmNlcyxcbiAgICAgIHJlc291cmNlOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSAmJiBrZXlBY3Rpb25zICYmIGtleUFjdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnQoZ3JhbnRlZSwgLi4ua2V5QWN0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHdyaXRlQWN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi5wZXJtcy5CVUNLRVRfREVMRVRFX0FDVElPTlMsIC4uLnBlcm1zLkJVQ0tFVF9QVVRfQUNUSU9OU107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc291cmNlIHRvIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZFNvdXJjZShwcm9wczogQWRkU291cmNlT3B0aW9ucywgc291cmNlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZlcnNpb25lZCkge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB5b3UgZW5hYmxlIHZlcnNpb25pbmcgb24gYSBidWNrZXQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBtaWdodCB0YWtlIHVwIHRvIDE1IG1pbnV0ZXNcbiAgICAgICAqIGZvciB0aGUgY2hhbmdlIHRvIGJlIGZ1bGx5IHByb3BhZ2F0ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB3YWl0IGZvciAxNSBtaW51dGVzIGFmdGVyXG4gICAgICAgKiBlbmFibGluZyB2ZXJzaW9uaW5nIGJlZm9yZSBpc3N1aW5nIHdyaXRlIG9wZXJhdGlvbnMgKFBVVCBvciBERUxFVEUpIG9uIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5cbiAgICAgICAqXG4gICAgICAgKiBXcml0ZSBvcGVyYXRpb25zIGlzc3VlZCBiZWZvcmUgdGhpcyBjb252ZXJzaW9uIGlzIGNvbXBsZXRlIG1heSBhcHBseSB0byB1bnZlcnNpb25lZCBvYmplY3RzLlxuICAgICAgICovXG4gICAgICBpZiAoIXRoaXMuc291cmNlU2xlZXApIHtcbiAgICAgICAgdGhpcy5zb3VyY2VTbGVlcCA9IG5ldyBzbGVlcC5TbGVlcCh0aGlzLCBcIlZlcnNpb25pbmdTbGVlcFwiLCB7XG4gICAgICAgICAgY3JlYXRlRHVyYXRpb246IFwiMTVtXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbmRleGVkU291cmNlID0gdGhpcy5zb3VyY2VzLmZpbmQoXG4gICAgICAoc291cmNlSW5kZXgpID0+IHNvdXJjZUluZGV4LnByb3BzID09PSBwcm9wcyxcbiAgICApO1xuICAgIGlmIChpbmRleGVkU291cmNlKSB7XG4gICAgICBpZiAoc291cmNlSWQgJiYgc291cmNlSWQgIT09IGluZGV4ZWRTb3VyY2UuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgYnVja2V0IHNvdXJjZSBmb3IgJHtpbmRleGVkU291cmNlLmlkfSBhbmQgJHtzb3VyY2VJZH0uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleGVkU291cmNlLmlkO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLnNvdXJjZXMubGVuZ3RoO1xuICAgIGNvbnN0IGlkID0gc291cmNlSWQgPz8gYHNvdXJjZS0ke25leHRJbmRleH1gO1xuICAgIC8vIGVuc3VyZSBpZCAoaWYgcHJvdmlkZWQpIGlzIHVuaXF1ZSB3aXRoaW4gQnVja2V0XG4gICAgaWYgKHRoaXMuc291cmNlcy5zb21lKChzb3VyY2VJbmRleCkgPT4gc291cmNlSW5kZXguaWQgPT09IGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRHVwbGljYXRlIHNvdXJjZSBpZCAke2lkfS4gU291cmNlSWRzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIEJ1Y2tldC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2VzLnB1c2goe1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIGJ1Y2tldDogdGhpcyxcbiAgICAgICAgZGVwZW5kc09uOiB0aGlzLnNvdXJjZVNsZWVwID8gW3RoaXMuc291cmNlU2xlZXBdIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGlkLFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHB1YmxpYyBpc1dlYnNpdGUoKTogdGhpcyBpcyB7XG4gICAgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZztcbiAgICBidWNrZXRPdXRwdXRzOiB7IHdlYnNpdGVVcmw6IHN0cmluZzsgd2Vic2l0ZURvbWFpbk5hbWU6IHN0cmluZyB9O1xuICB9IHtcbiAgICByZXR1cm4gdGhpcy5faXNXZWJzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBodHRwcyBVUkwgb2YgYW4gUzMgb2JqZWN0LiBTcGVjaWZ5IGByZWdpb25hbDogZmFsc2VgIGF0IHRoZSBvcHRpb25zXG4gICAqIGZvciBub24tcmVnaW9uYWwgVVJMcy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIC0gYGh0dHBzOi8vczMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20vb25seWJ1Y2tldGBcbiAgICogLSBgaHR0cHM6Ly9zMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbS9idWNrZXQva2V5YFxuICAgKiAtIGBodHRwczovL3MzLmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbi9jaGluYS1idWNrZXQvbXlrZXlgXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIFMzIGtleSBvZiB0aGUgb2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgVVJMIG9mIHRoZVxuICAgKiAgICAgIGJ1Y2tldCBpcyByZXR1cm5lZC5cbiAgICogQHJldHVybnMgYW4gT2JqZWN0UzNVcmwgdG9rZW5cbiAgICovXG4gIHB1YmxpYyB1cmxGb3JPYmplY3Qoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjayA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHRoaXMpO1xuICAgIGNvbnN0IHByZWZpeCA9IGBodHRwczovL3MzLiR7dGhpcy5lbnYucmVnaW9ufS4ke3N0YWNrLnVybFN1ZmZpeH0vYDtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybEpvaW4ocHJlZml4LCB0aGlzLmJ1Y2tldE5hbWUsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFMzIFVSTCBvZiBhbiBTMyBvYmplY3QuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAtIGBzMzovL29ubHlidWNrZXRgXG4gICAqIC0gYHMzOi8vYnVja2V0L2tleWBcbiAgICpcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSBvYmplY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBTMyBVUkwgb2YgdGhlXG4gICAqICAgICAgYnVja2V0IGlzIHJldHVybmVkLlxuICAgKiBAcmV0dXJucyBhbiBPYmplY3RTM1VybCB0b2tlblxuICAgKi9cbiAgcHVibGljIHMzVXJsRm9yT2JqZWN0KGtleT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gXCJzMzovL1wiO1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmxKb2luKHByZWZpeCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsSm9pbihwcmVmaXgsIHRoaXMuYnVja2V0TmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEFSTiB0aGF0IHJlcHJlc2VudHMgYWxsIG9iamVjdHMgd2l0aGluIHRoZSBidWNrZXQgdGhhdCBtYXRjaFxuICAgKiB0aGUga2V5IHBhdHRlcm4gc3BlY2lmaWVkLiBUbyByZXByZXNlbnQgYWxsIGtleXMsIHNwZWNpZnkgYGBcIipcImBgLlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEga2V5UGF0dGVybiB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMsIGNvbmNhdGVuYXRlIHRoZW0gaW50byBhIHNpbmdsZSBzdHJpbmcsIGUuZy46XG4gICAqXG4gICAqICAgYXJuRm9yT2JqZWN0cyhgaG9tZS8ke3RlYW19LyR7dXNlcn0vKmApXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXJuRm9yT2JqZWN0cyhrZXlQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlc291cmNlLmFybn0vJHtrZXlQYXR0ZXJufWA7XG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNDAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtczMvbGliL2J1Y2tldC50cyNMOTUzXG4gIHByaXZhdGUgdXJsSm9pbiguLi5jb21wb25lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXBvbmVudHMucmVkdWNlKChyZXN1bHQsIGNvbXBvbmVudCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnQuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnNsaWNlKDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3Jlc3VsdH0vJHtjb21wb25lbnR9YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIHRvIHRoZSBUZXJyYWZvcm0gSlNPTiBvdXRwdXQgYXQgU3ludGggdGltZS5cbiAgICpcbiAgICogY2FsbGVkIGJ5IFRlcnJhZm9ybVN0YWNrLnByZXBhcmVTdGFjaygpXG4gICAqL1xuICBwdWJsaWMgdG9UZXJyYWZvcm0oKTogYW55IHtcbiAgICAvKipcbiAgICAgKiBBIHByZXBhcmluZyByZXNvbHZlIG1pZ2h0IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSBzdGFja1xuICAgICAqXG4gICAgICogc2hvdWxkIG5vdCBhZGQgcmVzb3VyY2VzIGlmIG5vIGJ1Y2tldCBzb3VyY2VzIGFyZSBkZWZpbmVkXG4gICAgICovXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAvLyBUT0RPOiBJZGVhbGx5IHdlIHNob3VsZCBoYXZlIHVzZWQgSVJlc29sdmFibGUucmVzb2x2ZSBhbmQgdXNlIHRoZSBJUmVzb2x2ZUNvbnRleHQucHJlcGFyaW5nIGZsYWdcbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTcwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcG9saWN5LWRvY3VtZW50LnRzI0w0OFxuICAgICAgaWYgKHRoaXMubm9kZS50cnlGaW5kQ2hpbGQoc291cmNlLmlkKSkgY29udGludWU7IC8vIGlnbm9yZSBpZiBhbHJlYWR5IGdlbmVyYXRlZFxuICAgICAgbmV3IEJ1Y2tldFNvdXJjZSh0aGlzLCBzb3VyY2UuaWQsIHNvdXJjZS5wcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgQnVja2V0YCBwcm92aWRlcyBhbiBbQVdTIFMzIEJ1Y2tldF0oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zMy8pLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoc3RhY2ssIFwiTXlXZWJzaXRlXCIsIHtcbiAqICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgXCJkaXN0XCIpLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFB1YmxpYyByZWFkIGFjY2Vzc1xuICpcbiAqIEVuYWJsZXMgYHB1YmxpY2AgcmVhZCBhY2Nlc3MgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGJ1Y2tldC4gRGFuZ2Vyb3VzIGFuZFxuICogcmVjb21tZW5kZWQgdG8gdXNlIGVkZ2UuRGlzdHJpYnV0aW9uIGluc3RlYWQuXG4gKlxuICogVXNlZnVsIGZvciBob3N0aW5nIHB1YmxpYyBmaWxlcyBkaXJlY3RseSBmcm9tIFMzLlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgc3RvcmFnZS5CdWNrZXQoXCJNeUJ1Y2tldFwiLCB7XG4gKiAgIHB1YmxpYzogdHJ1ZVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcmVzb3VyY2UgYXdzX3MzX2J1Y2tldFxuICogQHRlcnJhY29uc3RydWN0IHN0b3JhZ2UuSUJ1Y2tldFxuICovXG5cbmV4cG9ydCBjbGFzcyBCdWNrZXQgZXh0ZW5kcyBCdWNrZXRCYXNlIGltcGxlbWVudHMgSUJ1Y2tldCB7XG4gIC8vIFRPRE86IEFkZCBzdGF0aWMgZnJvbUxvb2t1cD9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0TmFtZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYnVja2V0TmFtZTogc3RyaW5nLFxuICApOiBJQnVja2V0IHtcbiAgICByZXR1cm4gQnVja2V0LmZyb21CdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBidWNrZXROYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCdWNrZXQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBCdWNrZXRBdHRyaWJ1dGVzYCBvYmplY3QuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0b1xuICAgKiBgYnVja2V0LmV4cG9ydCgpYCBvciBtYW51YWxseSBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnVja2V0QXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEJ1Y2tldEF0dHJpYnV0ZXMsXG4gICk6IElCdWNrZXQge1xuICAgIC8vIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3Qoc2NvcGUpO1xuICAgIC8vIGNvbnN0IHJlZ2lvbiA9IGF0dHJzLnJlZ2lvbiA/PyBzdGFjay5yZWdpb247XG4gICAgLy8gY29uc3QgdXJsU3VmZml4ID0gc3RhY2sudXJsU3VmZml4O1xuXG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHBhcnNlQnVja2V0TmFtZShzY29wZSwgYXR0cnMpO1xuICAgIGlmICghYnVja2V0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVja2V0IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuICAgIEJ1Y2tldC52YWxpZGF0ZUJ1Y2tldE5hbWUoYnVja2V0TmFtZSwgdHJ1ZSk7XG5cbiAgICAvLyBsZXQgc3RhdGljRG9tYWluRW5kcG9pbnQgPSBzM1N0YXRpY1dlYnNpdGVFbmRwb2ludChyZWdpb24pO1xuICAgIC8vIFRPRE86IHN1cHBvcnQgbGF6eSBsb29rdXAgYmFzZWQgb24gVW5yZXNvbHZlZCByZWdpb25cbiAgICAvLyBMYXp5LnN0cmluZ1ZhbHVlKHtcbiAgICAvLyAgIHByb2R1Y2U6ICgpID0+XG4gICAgLy8gICAgIHN0YWNrLnJlZ2lvbmFsRmFjdChcbiAgICAvLyAgICAgICByZWdpb25JbmZvcm1hdGlvbi5GYWN0TmFtZS5TM19TVEFUSUNfV0VCU0lURV9FTkRQT0lOVCxcbiAgICAvLyAgICAgICBuZXdFbmRwb2ludCxcbiAgICAvLyAgICAgKSxcbiAgICAvLyB9KTtcbiAgICAvLyBjb25zdCB3ZWJzaXRlRG9tYWluID0gYCR7YnVja2V0TmFtZX0uJHtzdGF0aWNEb21haW5FbmRwb2ludH1gO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQnVja2V0QmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2UgPSBuZXcgZGF0YUF3c1MzQnVja2V0LkRhdGFBd3NTM0J1Y2tldChcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGJ1Y2tldE5hbWUhLCAvLyBtYWtlIGlkIGlzIHVuaXF1ZVxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiBidWNrZXROYW1lISxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBwdWJsaWMgcmVhZG9ubHkgYnVja2V0TmFtZSA9IGJ1Y2tldE5hbWUhO1xuICAgICAgcHVibGljIGdldCBidWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLmJ1Y2tldDtcbiAgICAgIH1cbiAgICAgIC8vIHB1YmxpYyByZWFkb25seSBidWNrZXRBcm4gPSBwYXJzZUJ1Y2tldEFybihzY29wZSwgYXR0cnMpO1xuICAgICAgcHVibGljIGdldCBidWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYXJuO1xuICAgICAgfVxuICAgICAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS53ZWJzaXRlRG9tYWluO1xuICAgICAgfVxuICAgICAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2Uud2Vic2l0ZUVuZHBvaW50O1xuICAgICAgfVxuICAgICAgcHVibGljIGdldCBob3N0ZWRab25lSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuaG9zdGVkWm9uZUlkO1xuICAgICAgfVxuICAgICAgcHVibGljIHJlYWRvbmx5IHB1YmxpYyA9IGF0dHJzLnB1YmxpYyA/PyBmYWxzZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uZWQgPSBhdHRycy52ZXJzaW9uZWQgPz8gZmFsc2U7XG4gICAgICBwdWJsaWMgcG9saWN5PzogQnVja2V0UG9saWN5ID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0lkZW50aXR5ID0gYXR0cnMub3JpZ2luQWNjZXNzSWRlbnRpdHk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgX2lzV2Vic2l0ZSA9ICEhYXR0cnMuaXNXZWJzaXRlO1xuICAgICAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3kgPSBmYWxzZTtcbiAgICAgIHB1YmxpYyBpc1dlYnNpdGUoKTogdGhpcyBpcyB7XG4gICAgICAgIHdlYnNpdGVEb21haW5OYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldE91dHB1dHM6IHsgd2Vic2l0ZVVybDogc3RyaW5nOyB3ZWJzaXRlRG9tYWluTmFtZTogc3RyaW5nIH07XG4gICAgICB9IHtcbiAgICAgICAgcmV0dXJuIGF0dHJzLmlzV2Vic2l0ZSA/PyBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHByb3RlY3RlZCBkaXNhbGxvd1B1YmxpY0FjY2VzcyA9IGZhbHNlO1xuICAgICAgLy8gcHJvdGVjdGVkIG5vdGlmaWNhdGlvbnNIYW5kbGVyUm9sZSA9IGF0dHJzLm5vdGlmaWNhdGlvbnNIYW5kbGVyUm9sZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQsIHtcbiAgICAgIGFjY291bnQ6IGF0dHJzLmFjY291bnQsXG4gICAgICByZWdpb246IGF0dHJzLnJlZ2lvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd24gYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBidWNrZXQgbmFtZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBwaHlzaWNhbE5hbWUgbmFtZSBvZiB0aGUgYnVja2V0LlxuICAgKiBAcGFyYW0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmcgYWxsb3cgbGVnYWN5IGJ1Y2tldCBuYW1pbmcgc3R5bGUsIGRlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlQnVja2V0TmFtZShcbiAgICBwaHlzaWNhbE5hbWU6IHN0cmluZyxcbiAgICBhbGxvd0xlZ2FjeUJ1Y2tldE5hbWluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBidWNrZXROYW1lID0gcGh5c2ljYWxOYW1lO1xuICAgIGlmICghYnVja2V0TmFtZSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoYnVja2V0TmFtZSkpIHtcbiAgICAgIC8vIHRoZSBuYW1lIGlzIGEgbGF0ZS1ib3VuZCB2YWx1ZSwgbm90IGEgZGVmaW5lZCBzdHJpbmcsXG4gICAgICAvLyBzbyBza2lwIHZhbGlkYXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBSdWxlcyBjb2RpZmllZCBmcm9tIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L0J1Y2tldFJlc3RyaWN0aW9ucy5odG1sXG4gICAgaWYgKGJ1Y2tldE5hbWUubGVuZ3RoIDwgMyB8fCBidWNrZXROYW1lLmxlbmd0aCA+IDYzKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJCdWNrZXQgbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIG5vIG1vcmUgdGhhbiA2MyBjaGFyYWN0ZXJzXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyc2V0UmVnRXggPSBhbGxvd0xlZ2FjeUJ1Y2tldE5hbWluZ1xuICAgICAgPyAvW15BLVphLXowLTkuXy1dL1xuICAgICAgOiAvW15hLXowLTkuLV0vO1xuICAgIGNvbnN0IGFsbG93ZWRFZGdlQ2hhcnNldFJlZ0V4ID0gYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgID8gL1tBLVphLXowLTldL1xuICAgICAgOiAvW2EtejAtOV0vO1xuXG4gICAgY29uc3QgaWxsZWdhbENoYXJNYXRjaCA9IGJ1Y2tldE5hbWUubWF0Y2goaWxsZWdhbENoYXJzZXRSZWdFeCk7XG4gICAgaWYgKGlsbGVnYWxDaGFyTWF0Y2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBhbGxvd0xlZ2FjeUJ1Y2tldE5hbWluZ1xuICAgICAgICAgID8gXCJCdWNrZXQgbmFtZSBtdXN0IG9ubHkgY29udGFpbiB1cHBlcmNhc2Ugb3IgbG93ZXJjYXNlIGNoYXJhY3RlcnMgYW5kIHRoZSBzeW1ib2xzLCBwZXJpb2QgKC4pLCB1bmRlcnNjb3JlIChfKSwgYW5kIGRhc2ggKC0pXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMgYW5kIHRoZSBzeW1ib2xzLCBwZXJpb2QgKC4pIGFuZCBkYXNoICgtKVwiICtcbiAgICAgICAgICAgICAgYCAob2Zmc2V0OiAke2lsbGVnYWxDaGFyTWF0Y2guaW5kZXh9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWFsbG93ZWRFZGdlQ2hhcnNldFJlZ0V4LnRlc3QoYnVja2V0TmFtZS5jaGFyQXQoMCkpKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSwgbG93ZXJjYXNlIGNoYXJhY3RlciBvciBudW1iZXJcIlxuICAgICAgICAgIDogXCJCdWNrZXQgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsb3dlcmNhc2UgY2hhcmFjdGVyIG9yIG51bWJlclwiICtcbiAgICAgICAgICAgICAgXCIgKG9mZnNldDogMClcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KGJ1Y2tldE5hbWUubGVuZ3RoIC0gMSkpXG4gICAgKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgYWxsb3dMZWdhY3lCdWNrZXROYW1pbmdcbiAgICAgICAgICA/IFwiQnVja2V0IG5hbWUgbXVzdCBlbmQgd2l0aCBhbiB1cHBlcmNhc2UsIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCJcbiAgICAgICAgICA6IFwiQnVja2V0IG5hbWUgbXVzdCBlbmQgd2l0aCBhIGxvd2VyY2FzZSBjaGFyYWN0ZXIgb3IgbnVtYmVyXCIgK1xuICAgICAgICAgICAgICBgIChvZmZzZXQ6ICR7YnVja2V0TmFtZS5sZW5ndGggLSAxfSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25zZWNTeW1ib2xNYXRjaCA9IGJ1Y2tldE5hbWUubWF0Y2goL1xcLi18LVxcLnxcXC5cXC4vKTtcbiAgICBpZiAoY29uc2VjU3ltYm9sTWF0Y2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkJ1Y2tldCBuYW1lIG11c3Qgbm90IGhhdmUgZGFzaCBuZXh0IHRvIHBlcmlvZCwgb3IgcGVyaW9kIG5leHQgdG8gZGFzaCwgb3IgY29uc2VjdXRpdmUgcGVyaW9kc1wiICtcbiAgICAgICAgICBgIChvZmZzZXQ6ICR7Y29uc2VjU3ltYm9sTWF0Y2guaW5kZXh9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvLnRlc3QoYnVja2V0TmFtZSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKFwiQnVja2V0IG5hbWUgbXVzdCBub3QgcmVzZW1ibGUgYW4gSVAgYWRkcmVzc1wiKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgUzMgYnVja2V0IG5hbWUgKHZhbHVlOiAke2J1Y2tldE5hbWV9KSR7RU9MfSR7ZXJyb3JzLmpvaW4oRU9MKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2U6XG4gICAgfCBzM0J1Y2tldC5TM0J1Y2tldFxuICAgIHwgZGF0YUF3c1MzQnVja2V0LkRhdGFBd3NTM0J1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdlYnNpdGVDb25maWc/OiBzM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uLlMzQnVja2V0V2Vic2l0ZUNvbmZpZ3VyYXRpb247XG4gIHByb3RlY3RlZCByZWFkb25seSBjb3JzQ29uZmlnPzogczNCdWNrZXRDb3JzQ29uZmlndXJhdGlvbi5TM0J1Y2tldENvcnNDb25maWd1cmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3JpZ2luQWNjZXNzSWRlbnRpdHk/OiBPcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfaXNXZWJzaXRlOiBib29sZWFuO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnNpb25lZDogYm9vbGVhbjtcblxuICBwdWJsaWMgZ2V0IGJ1Y2tldEFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmFybjtcbiAgfVxuICBwdWJsaWMgZ2V0IGJ1Y2tldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5idWNrZXQ7XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRG9tYWluTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLndlYnNpdGVDb25maWc/LndlYnNpdGVEb21haW47XG4gIH1cbiAgcHVibGljIGdldCB3ZWJzaXRlRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53ZWJzaXRlQ29uZmlnPy53ZWJzaXRlRW5kcG9pbnQ7XG4gIH1cbiAgcHVibGljIGdldCB2ZXJzaW9uZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhvc3RlZFpvbmVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLmhvc3RlZFpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBwb2xpY3k/OiBCdWNrZXRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVja2V0IGlzIHB1YmxpYyBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJyaWRnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG5hbWU6IHN0cmluZywgcHJvcHM6IEJ1Y2tldFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgY29uc3QgeyB3ZWJzaXRlQ29uZmlnLCBjb3JzQ29uZmlnLCBjbG91ZGZyb250QWNjZXNzIH0gPSBwcm9wcztcbiAgICB0aGlzLl9pc1dlYnNpdGUgPSBmYWxzZTtcblxuICAgIGlmIChwcm9wcy5idWNrZXROYW1lICYmIHByb3BzLm5hbWVQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdidWNrZXROYW1lJyBhbmQgJ25hbWVQcmVmaXgnLiBVc2Ugb25seSBvbmUuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidWNrZXRQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXByb3BzLmJ1Y2tldE5hbWUpIHtcbiAgICAgIC8vIEJ1Y2tldCBuYW1lcyBtdXN0IGJlIGxvd2VyY2FzZSBhbmQgYmV0d2VlbiAzIChtaW4pIGFuZCA2MyAobWF4KSBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICBidWNrZXRQcmVmaXggPSB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZVByZWZpeCh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogKHByb3BzLm5hbWVQcmVmaXggPz8gdGhpcy5ncmlkVVVJRCkgKyBcIi1cIixcbiAgICAgICAgbG93ZXJDYXNlOiB0cnVlLFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiLi1cIixcbiAgICAgICAgbWF4TGVuZ3RoOiA2MyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgczNCdWNrZXQuUzNCdWNrZXQodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBidWNrZXQ6IHByb3BzLmJ1Y2tldE5hbWUsXG4gICAgICBmb3JjZURlc3Ryb3k6IHByb3BzLmZvcmNlRGVzdHJveSxcbiAgICAgIGJ1Y2tldFByZWZpeCxcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZlcnNpb25lZCA9IHByb3BzLnZlcnNpb25lZCA/PyBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkKSB7XG4gICAgICBuZXcgczNCdWNrZXRWZXJzaW9uaW5nLlMzQnVja2V0VmVyc2lvbmluZ0EodGhpcywgXCJWZXJzaW9uaW5nXCIsIHtcbiAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgdmVyc2lvbmluZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBzdGF0dXM6IHRoaXMuX3ZlcnNpb25lZCA/IFwiRW5hYmxlZFwiIDogXCJTdXNwZW5kZWRcIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCA9IHByb3BzLmV2ZW50QnJpZGdlRW5hYmxlZDtcblxuICAgIGlmIChwcm9wcy5zb3VyY2VzKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLnNvdXJjZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5hZGRTb3VyY2UoeyBwYXRoOiBwcm9wcy5zb3VyY2VzIH0pO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BzLnNvdXJjZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlUHJvcHMgb2YgcHJvcHMuc291cmNlcykge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKHsgcGF0aDogc291cmNlUHJvcHMgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKHNvdXJjZVByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcHMubGlmZWN5Y2xlUnVsZXMpIHtcbiAgICAgIG5ldyBzM0J1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUzNCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkxpZmVDeWNsZUNvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICBydWxlOiBwcm9wcy5saWZlY3ljbGVSdWxlcy5tYXAoKHJ1bGUpID0+ICh7XG4gICAgICAgICAgICAuLi5ydWxlLFxuICAgICAgICAgICAgc3RhdHVzOiBydWxlLmVuYWJsZWQgPyBcIkVuYWJsZWRcIiA6IFwiRGlzYWJsZWRcIixcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVuZm9yY2UgQVdTIEZvdW5kYXRpb25hbCBTZWN1cml0eSBCZXN0IFByYWN0aWNlXG4gICAgaWYgKHByb3BzLmVuZm9yY2VTU0wpIHtcbiAgICAgIHRoaXMuZW5mb3JjZVNTTFN0YXRlbWVudCgpO1xuICAgICAgdGhpcy5taW5pbXVtVExTVmVyc2lvblN0YXRlbWVudChwcm9wcy5taW5pbXVtVExTVmVyc2lvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5taW5pbXVtVExTVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIidlbmZvcmNlU1NMJyBtdXN0IGJlIGVuYWJsZWQgZm9yICdtaW5pbXVtVExTVmVyc2lvbicgdG8gYmUgYXBwbGllZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2Vic2l0ZUNvbmZpZyAmJiB3ZWJzaXRlQ29uZmlnLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX2lzV2Vic2l0ZSA9IHRydWU7XG4gICAgICB0aGlzLndlYnNpdGVDb25maWcgPVxuICAgICAgICBuZXcgczNCdWNrZXRXZWJzaXRlQ29uZmlndXJhdGlvbi5TM0J1Y2tldFdlYnNpdGVDb25maWd1cmF0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJXZWJzaXRlQ29uZmlnXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAgIC4uLndlYnNpdGVDb25maWcsXG4gICAgICAgICAgICBpbmRleERvY3VtZW50OiB3ZWJzaXRlQ29uZmlnPy5pbmRleERvY3VtZW50XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgc3VmZml4OiB3ZWJzaXRlQ29uZmlnLmluZGV4RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHN1ZmZpeDogXCJpbmRleC5odG1sXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHVibGljID0gcHJvcHMucHVibGljID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLnB1YmxpYykge1xuICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIExhenkgY29uZmlnIHVzaW5nIFwiZ3JhbnRQdWJsaWNBY2Nlc3NcIiBtZWNoYW5pc20gaW5zdGVhZD9cbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXMzL2xpYi9idWNrZXQudHMjTDg1MFxuICAgICAgY29uc3Qgb3duZXJzaGlwQ29udHJvbHMgPVxuICAgICAgICBuZXcgczNCdWNrZXRPd25lcnNoaXBDb250cm9scy5TM0J1Y2tldE93bmVyc2hpcENvbnRyb2xzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJPd25lcnNoaXBDb250cm9sc1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBydWxlOiB7XG4gICAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogXCJCdWNrZXRPd25lclByZWZlcnJlZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgY29uc3QgcHVibGljQWNjZXNzQmxvY2sgPVxuICAgICAgICBuZXcgczNCdWNrZXRQdWJsaWNBY2Nlc3NCbG9jay5TM0J1Y2tldFB1YmxpY0FjY2Vzc0Jsb2NrKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJQdWJsaWNBY2Nlc3NCbG9ja1wiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBuZXcgczNCdWNrZXRBY2wuUzNCdWNrZXRBY2wodGhpcywgXCJQdWJsaWNBY2xcIiwge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVzb3VyY2UuYnVja2V0LFxuICAgICAgICBhY2w6IFwicHVibGljLXJlYWRcIixcbiAgICAgICAgZGVwZW5kc09uOiBbb3duZXJzaGlwQ29udHJvbHMsIHB1YmxpY0FjY2Vzc0Jsb2NrXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gLy8gcG9saWN5IGRlcGVuZHMgb24gcHVibGljIGFjY2VzcyBibG9jaz9cbiAgICAgIC8vIC8vIGlzIHRoaXMgbmVlZGVkP1xuICAgICAgLy8gaWYgKHBvbGljeURlcGVuZGFibGUgJiYgcG9saWN5RGVwZW5kYWJsZSBpbnN0YW5jZW9mIENvbnN0cnVjdCkge1xuICAgICAgLy8gICBwb2xpY3lEZXBlbmRhYmxlLm5vZGUuYWRkRGVwZW5kZW5jeShwdWJsaWNBY2Nlc3NCbG9jayk7XG4gICAgICAvLyB9XG4gICAgfVxuXG4gICAgaWYgKGNvcnNDb25maWcpIHtcbiAgICAgIHRoaXMuY29yc0NvbmZpZyA9IG5ldyBzM0J1Y2tldENvcnNDb25maWd1cmF0aW9uLlMzQnVja2V0Q29yc0NvbmZpZ3VyYXRpb24oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiQ29yc0NvbmZpZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgYnVja2V0OiB0aGlzLnJlc291cmNlLmJ1Y2tldCxcbiAgICAgICAgICAuLi5jb3JzQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2xvdWRmcm9udEFjY2Vzcz8uZW5hYmxlZCkge1xuICAgICAgY29uc3Qgb2FpID0gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIiwge1xuICAgICAgICBjb21tZW50OiBgT0FJIGZvciAke3RoaXMucmVzb3VyY2UuYnVja2V0fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBvYWk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSAoY2xvdWRmcm9udEFjY2Vzcy5rZXlQYXR0ZXJucyA/PyBbXCIqXCJdKS5tYXAoXG4gICAgICAgIChrZXlQYXR0ZXJuKSA9PiB0aGlzLmFybkZvck9iamVjdHMoa2V5UGF0dGVybiksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbb2FpLmdyYW50UHJpbmNpcGFsXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV2ZW50QnJpZGdlRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVFdmVudEJyaWRnZU5vdGlmaWNhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuICAgIGlmIChidWNrZXRFbmNyeXB0aW9uKSB7XG4gICAgICBuZXcgczNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24uUzNCdWNrZXRTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25BKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkVuY3J5cHRpb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGJ1Y2tldDogdGhpcy5yZXNvdXJjZS5idWNrZXQsXG4gICAgICAgICAgLi4uYnVja2V0RW5jcnlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBrZXkgcHJvcGVydGllcyBhbmQgcmV0dXJuIHRoZSBCdWNrZXQgZW5jcnlwdGlvbiBwcm9wZXJ0eSBmcm9tIHRoZVxuICAgKiB1c2VyJ3MgY29uZmlndXJhdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gICAqXG4gICAqIHwgcHJvcHMuZW5jcnlwdGlvbiB8IHByb3BzLmVuY3J5cHRpb25LZXkgfCBwcm9wcy5idWNrZXRLZXlFbmFibGVkIHwgYnVja2V0RW5jcnlwdGlvbiAocmV0dXJuIHZhbHVlKSB8IGVuY3J5cHRpb25LZXkgKHJldHVybiB2YWx1ZSkgfFxuICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgVU5FTkNSWVBURUQgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBLTVMgICAgICAgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBTU0UtS01TLCBidWNrZXRLZXlFbmFibGVkID0gZSAgIHwgayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLUtNUywgYnVja2V0S2V5RW5hYmxlZCA9IGUgICB8IG5ldyBrZXkgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEtNU19NQU5BR0VEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgZSAgICAgICAgICAgICAgICAgICAgICB8IFNTRS1LTVMsIGJ1Y2tldEtleUVuYWJsZWQgPSBlICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgfCBTU0UtUzMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgU1NFLVMzLCBidWNrZXRLZXlFbmFibGVkID0gZSAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFVORU5DUllQVEVEICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBVTkVOQ1JZUFRFRCAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TX01BTkFHRUQgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBlICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IFMzX01BTkFHRUQgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICB8IEVSUk9SISAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGUgICAgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqL1xuICBwcml2YXRlIHBhcnNlRW5jcnlwdGlvbihwcm9wczogQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IE9taXQ8XG4gICAgICBzM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbi5TM0J1Y2tldFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbkFDb25maWcsXG4gICAgICBcImJ1Y2tldFwiXG4gICAgPjtcbiAgICBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG4gIH0ge1xuICAgIC8vIGRlZmF1bHQgYmFzZWQgb24gd2hldGhlciBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZFxuICAgIGxldCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY3J5cHRpb25UeXBlID0gcHJvcHMuZW5jcnlwdGlvbktleVxuICAgICAgICA/IEJ1Y2tldEVuY3J5cHRpb24uS01TXG4gICAgICAgIDogQnVja2V0RW5jcnlwdGlvbi5VTkVOQ1JZUFRFRDtcbiAgICB9XG5cbiAgICAvLyBpZiBlbmNyeXB0aW9uIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gbXVzdCBiZSBzZXQgdG8gS01TIG9yIERTU0UuXG4gICAgaWYgKFxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uRFNTRSAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgIT09IEJ1Y2tldEVuY3J5cHRpb24uS01TICYmXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBlbmNyeXB0aW9uS2V5IGlzIHNwZWNpZmllZCwgc28gJ2VuY3J5cHRpb24nIG11c3QgYmUgc2V0IHRvIEtNUyBvciBEU1NFICh2YWx1ZTogJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaWYgYnVja2V0S2V5RW5hYmxlZCBpcyBzZXQsIGVuY3J5cHRpb24gY2FuIG5vdCBiZSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEXG4gICAgaWYgKFxuICAgICAgcHJvcHMuYnVja2V0S2V5RW5hYmxlZCAmJlxuICAgICAgZW5jcnlwdGlvblR5cGUgPT09IEJ1Y2tldEVuY3J5cHRpb24uVU5FTkNSWVBURURcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGJ1Y2tldEtleUVuYWJsZWQgaXMgc3BlY2lmaWVkLCBzbyAnZW5jcnlwdGlvbicgbXVzdCBiZSBzZXQgdG8gS01TLCBEU1NFIG9yIFMzICh2YWx1ZTogJHtlbmNyeXB0aW9uVHlwZX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLlVORU5DUllQVEVEKSB7XG4gICAgICByZXR1cm4geyBidWNrZXRFbmNyeXB0aW9uOiB1bmRlZmluZWQsIGVuY3J5cHRpb25LZXk6IHVuZGVmaW5lZCB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5LTVMpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uS2V5IHx8XG4gICAgICAgIG5ldyBrbXMuS2V5KHRoaXMsIFwiS2V5XCIsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXNcIixcbiAgICAgICAgICAgICAgICBrbXNNYXN0ZXJLZXlJZDogZW5jcnlwdGlvbktleS5rZXlBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDogeyBzc2VBbGdvcml0aG06IFwiQUVTMjU2XCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBCdWNrZXRFbmNyeXB0aW9uLktNU19NQU5BR0VEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDogeyBzc2VBbGdvcml0aG06IFwiYXdzOmttc1wiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5EU1NFKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID1cbiAgICAgICAgcHJvcHMuZW5jcnlwdGlvbktleSB8fFxuICAgICAgICBuZXcga21zLktleSh0aGlzLCBcIktleVwiLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBDcmVhdGVkIGJ5ICR7dGhpcy5ub2RlLnBhdGh9YCxcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgLy8gKE9wdGlvbmFsKSBBY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuXG4gICAgICAgICAgLy8gZXhwZWN0ZWRCdWNrZXRPd25lclxuICAgICAgICAgIHJ1bGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYnVja2V0S2V5RW5hYmxlZDogcHJvcHMuYnVja2V0S2V5RW5hYmxlZCxcbiAgICAgICAgICAgICAgYXBwbHlTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHNzZUFsZ29yaXRobTogXCJhd3M6a21zOmRzc2VcIixcbiAgICAgICAgICAgICAgICBrbXNNYXN0ZXJLZXlJZDogZW5jcnlwdGlvbktleS5rZXlBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gQnVja2V0RW5jcnlwdGlvbi5EU1NFX01BTkFHRUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAvLyAoT3B0aW9uYWwpIEFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci5cbiAgICAgICAgICAvLyBleHBlY3RlZEJ1Y2tldE93bmVyXG4gICAgICAgICAgcnVsZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWNrZXRLZXlFbmFibGVkOiBwcm9wcy5idWNrZXRLZXlFbmFibGVkLFxuICAgICAgICAgICAgICBhcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBcImF3czprbXM6ZHNzZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJ2VuY3J5cHRpb25UeXBlJzogJHtlbmNyeXB0aW9uVHlwZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGlhbSBzdGF0ZW1lbnQgdG8gZW5mb3JjZSBTU0wgcmVxdWVzdHMgb25seS5cbiAgICovXG4gIHByaXZhdGUgZW5mb3JjZVNTTFN0YXRlbWVudCgpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXCJzMzoqXCJdLFxuICAgICAgY29uZGl0aW9uOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiBcIkJvb2xcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U2VjdXJlVHJhbnNwb3J0XCIsXG4gICAgICAgICAgdmFsdWVzOiBbXCJmYWxzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIHJlc291cmNlczogW3RoaXMucmVzb3VyY2UuYXJuLCB0aGlzLmFybkZvck9iamVjdHMoXCIqXCIpXSxcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGlhbSBzdGF0ZW1lbnQgdG8gYWxsb3cgcmVxdWVzdHMgd2l0aCBhIG1pbmltdW0gVExTXG4gICAqIHZlcnNpb24gb25seS5cbiAgICovXG4gIHByaXZhdGUgbWluaW11bVRMU1ZlcnNpb25TdGF0ZW1lbnQobWluaW11bVRMU1ZlcnNpb24/OiBudW1iZXIpIHtcbiAgICBpZiAoIW1pbmltdW1UTFNWZXJzaW9uKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1wiczM6KlwiXSxcbiAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJOdW1lcmljTGVzc1RoYW5cIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJzMzpUbHNWZXJzaW9uXCIsXG4gICAgICAgICAgdmFsdWVzOiBbbWluaW11bVRMU1ZlcnNpb24udG9TdHJpbmcoKV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnJlc291cmNlLmFybiwgdGhpcy5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRTb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIExvY2FsIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUHJlZml4IHRvIGFkZCB0byB0aGUgdXBsb2FkZWQgb2JqZWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vLyBwcml2YXRlIGludGVyZmFjZSB0byBpbmRleCBCdWNrZXQgc291cmNlcyBieSBpZFxuaW50ZXJmYWNlIFNvdXJjZUluZGV4IHtcbiAgcHJvcHM6IEJ1Y2tldFNvdXJjZVByb3BzO1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0b3JhZ2UgY2xhc3MgdG8gbW92ZSBhbiBvYmplY3QgdG9cbiAqL1xuZXhwb3J0IGVudW0gU3RvcmFnZUNsYXNzIHtcbiAgLyoqXG4gICAqIFN0b3JhZ2UgY2xhc3MgZm9yIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBsZXNzIGZyZXF1ZW50bHksIGJ1dCByZXF1aXJlcyByYXBpZFxuICAgKiBhY2Nlc3Mgd2hlbiBuZWVkZWQuXG4gICAqXG4gICAqIEhhcyBsb3dlciBhdmFpbGFiaWxpdHkgdGhhbiBTdGFuZGFyZCBzdG9yYWdlLlxuICAgKi9cbiAgSU5GUkVRVUVOVF9BQ0NFU1MgPSBcIlNUQU5EQVJEX0lBXCIsXG5cbiAgLyoqXG4gICAqIEluZnJlcXVlbnQgQWNjZXNzIHRoYXQncyBvbmx5IHN0b3JlZCBpbiBvbmUgYXZhaWxhYmlsaXR5IHpvbmUuXG4gICAqXG4gICAqIEhhcyBsb3dlciBhdmFpbGFiaWxpdHkgdGhhbiBzdGFuZGFyZCBJbmZyZXF1ZW50QWNjZXNzLlxuICAgKi9cbiAgT05FX1pPTkVfSU5GUkVRVUVOVF9BQ0NFU1MgPSBcIk9ORVpPTkVfSUFcIixcblxuICAvKipcbiAgICogU3RvcmFnZSBjbGFzcyBmb3IgbG9uZy10ZXJtIGFyY2hpdmFsIHRoYXQgY2FuIHRha2UgYmV0d2VlbiBtaW51dGVzIGFuZFxuICAgKiBob3VycyB0byBhY2Nlc3MuXG4gICAqXG4gICAqIFVzZSBmb3IgYXJjaGl2ZXMgd2hlcmUgcG9ydGlvbnMgb2YgdGhlIGRhdGEgbWlnaHQgbmVlZCB0byBiZSByZXRyaWV2ZWQgaW5cbiAgICogbWludXRlcy4gRGF0YSBzdG9yZWQgaW4gdGhlIEdMQUNJRVIgc3RvcmFnZSBjbGFzcyBoYXMgYSBtaW5pbXVtIHN0b3JhZ2VcbiAgICogZHVyYXRpb24gcGVyaW9kIG9mIDkwIGRheXMgYW5kIGNhbiBiZSBhY2Nlc3NlZCBpbiBhcyBsaXR0bGUgYXMgMS01IG1pbnV0ZXNcbiAgICogdXNpbmcgZXhwZWRpdGVkIHJldHJpZXZhbC4gSWYgeW91IGRlbGV0ZSBhbiBvYmplY3QgYmVmb3JlIHRoZSA5MC1kYXlcbiAgICogbWluaW11bSwgeW91IGFyZSBjaGFyZ2VkIGZvciA5MCBkYXlzLlxuICAgKi9cbiAgR0xBQ0lFUiA9IFwiR0xBQ0lFUlwiLFxuXG4gIC8qKlxuICAgKiBTdG9yYWdlIGNsYXNzIGZvciBsb25nLXRlcm0gYXJjaGl2YWwgdGhhdCBjYW4gYmUgYWNjZXNzZWQgaW4gYSBmZXcgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBJdCBpcyBpZGVhbCBmb3IgZGF0YSB0aGF0IGlzIGFjY2Vzc2VkIG9uY2Ugb3IgdHdpY2UgcGVyIHF1YXJ0ZXIsIGFuZFxuICAgKiB0aGF0IHJlcXVpcmVzIGltbWVkaWF0ZSBhY2Nlc3MuIERhdGEgc3RvcmVkIGluIHRoZSBHTEFDSUVSX0lSIHN0b3JhZ2UgY2xhc3NcbiAgICogaGFzIGEgbWluaW11bSBzdG9yYWdlIGR1cmF0aW9uIHBlcmlvZCBvZiA5MCBkYXlzIGFuZCBjYW4gYmUgYWNjZXNzZWQgaW5cbiAgICogYXMgbWlsbGlzZWNvbmRzLiBJZiB5b3UgZGVsZXRlIGFuIG9iamVjdCBiZWZvcmUgdGhlIDkwLWRheSBtaW5pbXVtLFxuICAgKiB5b3UgYXJlIGNoYXJnZWQgZm9yIDkwIGRheXMuXG4gICAqL1xuICBHTEFDSUVSX0lOU1RBTlRfUkVUUklFVkFMID0gXCJHTEFDSUVSX0lSXCIsXG5cbiAgLyoqXG4gICAqIFVzZSBmb3IgYXJjaGl2aW5nIGRhdGEgdGhhdCByYXJlbHkgbmVlZHMgdG8gYmUgYWNjZXNzZWQuIERhdGEgc3RvcmVkIGluIHRoZVxuICAgKiBERUVQX0FSQ0hJVkUgc3RvcmFnZSBjbGFzcyBoYXMgYSBtaW5pbXVtIHN0b3JhZ2UgZHVyYXRpb24gcGVyaW9kIG9mIDE4MFxuICAgKiBkYXlzIGFuZCBhIGRlZmF1bHQgcmV0cmlldmFsIHRpbWUgb2YgMTIgaG91cnMuIElmIHlvdSBkZWxldGUgYW4gb2JqZWN0XG4gICAqIGJlZm9yZSB0aGUgMTgwLWRheSBtaW5pbXVtLCB5b3UgYXJlIGNoYXJnZWQgZm9yIDE4MCBkYXlzLiBGb3IgcHJpY2luZ1xuICAgKiBpbmZvcm1hdGlvbiwgc2VlIEFtYXpvbiBTMyBQcmljaW5nLlxuICAgKi9cbiAgREVFUF9BUkNISVZFID0gXCJERUVQX0FSQ0hJVkVcIixcblxuICAvKipcbiAgICogVGhlIElOVEVMTElHRU5UX1RJRVJJTkcgc3RvcmFnZSBjbGFzcyBpcyBkZXNpZ25lZCB0byBvcHRpbWl6ZSBzdG9yYWdlIGNvc3RzXG4gICAqIGJ5IGF1dG9tYXRpY2FsbHkgbW92aW5nIGRhdGEgdG8gdGhlIG1vc3QgY29zdC1lZmZlY3RpdmUgc3RvcmFnZSBhY2Nlc3NcbiAgICogdGllciwgd2l0aG91dCBwZXJmb3JtYW5jZSBpbXBhY3Qgb3Igb3BlcmF0aW9uYWwgb3ZlcmhlYWQuXG4gICAqIElOVEVMTElHRU5UX1RJRVJJTkcgZGVsaXZlcnMgYXV0b21hdGljIGNvc3Qgc2F2aW5ncyBieSBtb3ZpbmcgZGF0YSBvbiBhXG4gICAqIGdyYW51bGFyIG9iamVjdCBsZXZlbCBiZXR3ZWVuIHR3byBhY2Nlc3MgdGllcnMsIGEgZnJlcXVlbnQgYWNjZXNzIHRpZXIgYW5kXG4gICAqIGEgbG93ZXItY29zdCBpbmZyZXF1ZW50IGFjY2VzcyB0aWVyLCB3aGVuIGFjY2VzcyBwYXR0ZXJucyBjaGFuZ2UuIFRoZVxuICAgKiBJTlRFTExJR0VOVF9USUVSSU5HIHN0b3JhZ2UgY2xhc3MgaXMgaWRlYWwgaWYgeW91IHdhbnQgdG8gb3B0aW1pemUgc3RvcmFnZVxuICAgKiBjb3N0cyBhdXRvbWF0aWNhbGx5IGZvciBsb25nLWxpdmVkIGRhdGEgd2hlbiBhY2Nlc3MgcGF0dGVybnMgYXJlIHVua25vd24gb3JcbiAgICogdW5wcmVkaWN0YWJsZS5cbiAgICovXG4gIElOVEVMTElHRU5UX1RJRVJJTkcgPSBcIklOVEVMTElHRU5UX1RJRVJJTkdcIixcbn1cblxuLyoqXG4gKiBXaGF0IGtpbmQgb2Ygc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB0byBhcHBseSB0byB0aGlzIGJ1Y2tldFxuICovXG5leHBvcnQgZW51bSBCdWNrZXRFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIFByZXZpb3VzIG9wdGlvbi4gQnVja2V0cyBjYW4gbm90IGJlIHVuZW5jcnlwdGVkIG5vdy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zZXJ2LXNpZGUtZW5jcnlwdGlvbi5odG1sXG4gICAqIEBkZXByZWNhdGVkIFMzIGFwcGxpZXMgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIFNTRS1TMyBmb3IgZXZlcnkgYnVja2V0XG4gICAqIHRoYXQgZGVmYXVsdCBlbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkLlxuICAgKi9cbiAgVU5FTkNSWVBURUQgPSBcIlVORU5DUllQVEVEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIEtNUyBlbmNyeXB0aW9uIHdpdGggYSBtYXN0ZXIga2V5IG1hbmFnZWQgYnkgS01TLlxuICAgKi9cbiAgS01TX01BTkFHRUQgPSBcIktNU19NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBhIG1hc3RlciBrZXkgbWFuYWdlZCBieSBTMy5cbiAgICovXG4gIFMzX01BTkFHRUQgPSBcIlMzX01BTkFHRURcIixcblxuICAvKipcbiAgICogU2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIGEgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSB1c2VyLlxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIEtNUyA9IFwiS01TXCIsXG5cbiAgLyoqXG4gICAqIERvdWJsZSBzZXJ2ZXItc2lkZSBLTVMgZW5jcnlwdGlvbiB3aXRoIGEgbWFzdGVyIGtleSBtYW5hZ2VkIGJ5IEtNUy5cbiAgICovXG4gIERTU0VfTUFOQUdFRCA9IFwiRFNTRV9NQU5BR0VEXCIsXG5cbiAgLyoqXG4gICAqIERvdWJsZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggYSBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIHVzZXIuXG4gICAqIElmIGBlbmNyeXB0aW9uS2V5YCBpcyBzcGVjaWZpZWQsIHRoaXMga2V5IHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlLCBvbmUgd2lsbCBiZSBkZWZpbmVkLlxuICAgKi9cbiAgRFNTRSA9IFwiRFNTRVwiLFxufVxuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBldmVudCB0eXBlcy5cbiAqIEBsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL25vdGlmaWNhdGlvbi1ob3ctdG8tZXZlbnQtdHlwZXMtYW5kLWRlc3RpbmF0aW9ucy5odG1sI3N1cHBvcnRlZC1ub3RpZmljYXRpb24tZXZlbnQtdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEID0gXCJzMzpPYmplY3RDcmVhdGVkOipcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfUFVUID0gXCJzMzpPYmplY3RDcmVhdGVkOlB1dFwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUzMgQVBJcyBzdWNoIGFzIFBVVCwgUE9TVCwgYW5kIENPUFkgY2FuIGNyZWF0ZSBhbiBvYmplY3QuIFVzaW5nXG4gICAqIHRoZXNlIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgY3JlYXRlZFxuICAgKiB1c2luZyBhIHNwZWNpZmljIEFQSSwgb3IgeW91IGNhbiB1c2UgdGhlIHMzOk9iamVjdENyZWF0ZWQ6KiBldmVudCB0eXBlIHRvXG4gICAqIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSBhblxuICAgKiBvYmplY3QuXG4gICAqL1xuICBPQkpFQ1RfQ1JFQVRFRF9QT1NUID0gXCJzMzpPYmplY3RDcmVhdGVkOlBvc3RcIixcblxuICAvKipcbiAgICogQW1hem9uIFMzIEFQSXMgc3VjaCBhcyBQVVQsIFBPU1QsIGFuZCBDT1BZIGNhbiBjcmVhdGUgYW4gb2JqZWN0LiBVc2luZ1xuICAgKiB0aGVzZSBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICogdXNpbmcgYSBzcGVjaWZpYyBBUEksIG9yIHlvdSBjYW4gdXNlIHRoZSBzMzpPYmplY3RDcmVhdGVkOiogZXZlbnQgdHlwZSB0b1xuICAgKiByZXF1ZXN0IG5vdGlmaWNhdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgYW5cbiAgICogb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX0NSRUFURURfQ09QWSA9IFwiczM6T2JqZWN0Q3JlYXRlZDpDb3B5XCIsXG5cbiAgLyoqXG4gICAqIEFtYXpvbiBTMyBBUElzIHN1Y2ggYXMgUFVULCBQT1NULCBhbmQgQ09QWSBjYW4gY3JlYXRlIGFuIG9iamVjdC4gVXNpbmdcbiAgICogdGhlc2UgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBjcmVhdGVkXG4gICAqIHVzaW5nIGEgc3BlY2lmaWMgQVBJLCBvciB5b3UgY2FuIHVzZSB0aGUgczM6T2JqZWN0Q3JlYXRlZDoqIGV2ZW50IHR5cGUgdG9cbiAgICogcmVxdWVzdCBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGFuXG4gICAqIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9DUkVBVEVEX0NPTVBMRVRFX01VTFRJUEFSVF9VUExPQUQgPSBcInMzOk9iamVjdENyZWF0ZWQ6Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFJlbW92ZWQgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCBvciBhIGJhdGNoIG9mIG9iamVjdHMgaXMgcmVtb3ZlZCBmcm9tIGEgYnVja2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgb3IgYSB2ZXJzaW9uZWRcbiAgICogb2JqZWN0IGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgdXNpbmcgdGhlIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlIGV2ZW50XG4gICAqIHR5cGUuIE9yIHlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhIGRlbGV0ZSBtYXJrZXIgaXMgY3JlYXRlZCBmb3JcbiAgICogYSB2ZXJzaW9uZWQgb2JqZWN0IGJ5IHVzaW5nIHMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlTWFya2VyQ3JlYXRlZC4gRm9yXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGRlbGV0aW5nIHZlcnNpb25lZCBvYmplY3RzLCBzZWUgRGVsZXRpbmcgT2JqZWN0XG4gICAqIFZlcnNpb25zLiBZb3UgY2FuIGFsc28gdXNlIGEgd2lsZGNhcmQgczM6T2JqZWN0UmVtb3ZlZDoqIHRvIHJlcXVlc3RcbiAgICogbm90aWZpY2F0aW9uIGFueXRpbWUgYW4gb2JqZWN0IGlzIGRlbGV0ZWQuXG4gICAqXG4gICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSBhdXRvbWF0aWMgZGVsZXRlcyBmcm9tXG4gICAqIGxpZmVjeWNsZSBwb2xpY2llcyBvciBmcm9tIGZhaWxlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgT0JKRUNUX1JFTU9WRUQgPSBcInMzOk9iamVjdFJlbW92ZWQ6KlwiLFxuXG4gIC8qKlxuICAgKiBCeSB1c2luZyB0aGUgT2JqZWN0UmVtb3ZlZCBldmVudCB0eXBlcywgeW91IGNhbiBlbmFibGUgbm90aWZpY2F0aW9uIHdoZW5cbiAgICogYW4gb2JqZWN0IG9yIGEgYmF0Y2ggb2Ygb2JqZWN0cyBpcyByZW1vdmVkIGZyb20gYSBidWNrZXQuXG4gICAqXG4gICAqIFlvdSBjYW4gcmVxdWVzdCBub3RpZmljYXRpb24gd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZCBvciBhIHZlcnNpb25lZFxuICAgKiBvYmplY3QgaXMgcGVybWFuZW50bHkgZGVsZXRlZCBieSB1c2luZyB0aGUgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGUgZXZlbnRcbiAgICogdHlwZS4gT3IgeW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGEgZGVsZXRlIG1hcmtlciBpcyBjcmVhdGVkIGZvclxuICAgKiBhIHZlcnNpb25lZCBvYmplY3QgYnkgdXNpbmcgczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkLiBGb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgZGVsZXRpbmcgdmVyc2lvbmVkIG9iamVjdHMsIHNlZSBEZWxldGluZyBPYmplY3RcbiAgICogVmVyc2lvbnMuIFlvdSBjYW4gYWxzbyB1c2UgYSB3aWxkY2FyZCBzMzpPYmplY3RSZW1vdmVkOiogdG8gcmVxdWVzdFxuICAgKiBub3RpZmljYXRpb24gYW55dGltZSBhbiBvYmplY3QgaXMgZGVsZXRlZC5cbiAgICpcbiAgICogWW91IHdpbGwgbm90IHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIGF1dG9tYXRpYyBkZWxldGVzIGZyb21cbiAgICogbGlmZWN5Y2xlIHBvbGljaWVzIG9yIGZyb20gZmFpbGVkIG9wZXJhdGlvbnMuXG4gICAqL1xuICBPQkpFQ1RfUkVNT1ZFRF9ERUxFVEUgPSBcInMzOk9iamVjdFJlbW92ZWQ6RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBPYmplY3RSZW1vdmVkIGV2ZW50IHR5cGVzLCB5b3UgY2FuIGVuYWJsZSBub3RpZmljYXRpb24gd2hlblxuICAgKiBhbiBvYmplY3Qgb3IgYSBiYXRjaCBvZiBvYmplY3RzIGlzIHJlbW92ZWQgZnJvbSBhIGJ1Y2tldC5cbiAgICpcbiAgICogWW91IGNhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbiB3aGVuIGFuIG9iamVjdCBpcyBkZWxldGVkIG9yIGEgdmVyc2lvbmVkXG4gICAqIG9iamVjdCBpcyBwZXJtYW5lbnRseSBkZWxldGVkIGJ5IHVzaW5nIHRoZSBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZSBldmVudFxuICAgKiB0eXBlLiBPciB5b3UgY2FuIHJlcXVlc3Qgbm90aWZpY2F0aW9uIHdoZW4gYSBkZWxldGUgbWFya2VyIGlzIGNyZWF0ZWQgZm9yXG4gICAqIGEgdmVyc2lvbmVkIG9iamVjdCBieSB1c2luZyBzMzpPYmplY3RSZW1vdmVkOkRlbGV0ZU1hcmtlckNyZWF0ZWQuIEZvclxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBkZWxldGluZyB2ZXJzaW9uZWQgb2JqZWN0cywgc2VlIERlbGV0aW5nIE9iamVjdFxuICAgKiBWZXJzaW9ucy4gWW91IGNhbiBhbHNvIHVzZSBhIHdpbGRjYXJkIHMzOk9iamVjdFJlbW92ZWQ6KiB0byByZXF1ZXN0XG4gICAqIG5vdGlmaWNhdGlvbiBhbnl0aW1lIGFuIG9iamVjdCBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBZb3Ugd2lsbCBub3QgcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zIGZyb20gYXV0b21hdGljIGRlbGV0ZXMgZnJvbVxuICAgKiBsaWZlY3ljbGUgcG9saWNpZXMgb3IgZnJvbSBmYWlsZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIE9CSkVDVF9SRU1PVkVEX0RFTEVURV9NQVJLRVJfQ1JFQVRFRCA9IFwiczM6T2JqZWN0UmVtb3ZlZDpEZWxldGVNYXJrZXJDcmVhdGVkXCIsXG5cbiAgLyoqXG4gICAqIFVzaW5nIHJlc3RvcmUgb2JqZWN0IGV2ZW50IHR5cGVzIHlvdSBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvclxuICAgKiBpbml0aWF0aW9uIGFuZCBjb21wbGV0aW9uIHdoZW4gcmVzdG9yaW5nIG9iamVjdHMgZnJvbSB0aGUgUzMgR2xhY2llclxuICAgKiBzdG9yYWdlIGNsYXNzLlxuICAgKlxuICAgKiBZb3UgdXNlIHMzOk9iamVjdFJlc3RvcmU6UG9zdCB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZiBvYmplY3QgcmVzdG9yYXRpb25cbiAgICogaW5pdGlhdGlvbi5cbiAgICovXG4gIE9CSkVDVF9SRVNUT1JFX1BPU1QgPSBcInMzOk9iamVjdFJlc3RvcmU6UG9zdFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOkNvbXBsZXRlZCB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZlxuICAgKiByZXN0b3JhdGlvbiBjb21wbGV0aW9uLlxuICAgKi9cbiAgT0JKRUNUX1JFU1RPUkVfQ09NUExFVEVEID0gXCJzMzpPYmplY3RSZXN0b3JlOkNvbXBsZXRlZFwiLFxuXG4gIC8qKlxuICAgKiBVc2luZyByZXN0b3JlIG9iamVjdCBldmVudCB0eXBlcyB5b3UgY2FuIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3JcbiAgICogaW5pdGlhdGlvbiBhbmQgY29tcGxldGlvbiB3aGVuIHJlc3RvcmluZyBvYmplY3RzIGZyb20gdGhlIFMzIEdsYWNpZXJcbiAgICogc3RvcmFnZSBjbGFzcy5cbiAgICpcbiAgICogWW91IHVzZSBzMzpPYmplY3RSZXN0b3JlOkRlbGV0ZSB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbiBvZlxuICAgKiByZXN0b3JhdGlvbiBjb21wbGV0aW9uLlxuICAgKi9cbiAgT0JKRUNUX1JFU1RPUkVfREVMRVRFID0gXCJzMzpPYmplY3RSZXN0b3JlOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgdG8gcmVxdWVzdCBBbWF6b24gUzMgdG8gc2VuZCBhIG5vdGlmaWNhdGlvblxuICAgKiBtZXNzYWdlIHdoZW4gQW1hem9uIFMzIGRldGVjdHMgdGhhdCBhbiBvYmplY3Qgb2YgdGhlIFJSUyBzdG9yYWdlIGNsYXNzIGlzXG4gICAqIGxvc3QuXG4gICAqL1xuICBSRURVQ0VEX1JFRFVOREFOQ1lfTE9TVF9PQkpFQ1QgPSBcInMzOlJlZHVjZWRSZWR1bmRhbmN5TG9zdE9iamVjdFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCB0aGF0IHdhcyBlbGlnaWJsZSBmb3JcbiAgICogcmVwbGljYXRpb24gdXNpbmcgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBmYWlsZWQgdG8gcmVwbGljYXRlLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX0ZBSUxFRF9SRVBMSUNBVElPTiA9IFwiczM6UmVwbGljYXRpb246T3BlcmF0aW9uRmFpbGVkUmVwbGljYXRpb25cIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgdGhhdCB3YXMgZWxpZ2libGUgZm9yXG4gICAqIHJlcGxpY2F0aW9uIHVzaW5nIEFtYXpvbiBTMyBSZXBsaWNhdGlvbiBUaW1lIENvbnRyb2wgZXhjZWVkZWQgdGhlIDE1LW1pbnV0ZVxuICAgKiB0aHJlc2hvbGQgZm9yIHJlcGxpY2F0aW9uLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX01JU1NFRF9USFJFU0hPTEQgPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvbk1pc3NlZFRocmVzaG9sZFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCBmb3IgYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyB0aGUgQW1hem9uIFMzIFJlcGxpY2F0aW9uIFRpbWUgQ29udHJvbCBmZWF0dXJlIHJlcGxpY2F0ZWRcbiAgICogYWZ0ZXIgdGhlIDE1LW1pbnV0ZSB0aHJlc2hvbGQuXG4gICAqL1xuICBSRVBMSUNBVElPTl9PUEVSQVRJT05fUkVQTElDQVRFRF9BRlRFUl9USFJFU0hPTEQgPSBcInMzOlJlcGxpY2F0aW9uOk9wZXJhdGlvblJlcGxpY2F0ZWRBZnRlclRocmVzaG9sZFwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCBmb3IgYW4gb2JqZWN0IHRoYXQgd2FzIGVsaWdpYmxlIGZvclxuICAgKiByZXBsaWNhdGlvbiB1c2luZyBBbWF6b24gUzMgUmVwbGljYXRpb24gVGltZSBDb250cm9sIGJ1dCBpcyBubyBsb25nZXIgdHJhY2tlZFxuICAgKiBieSByZXBsaWNhdGlvbiBtZXRyaWNzLlxuICAgKi9cbiAgUkVQTElDQVRJT05fT1BFUkFUSU9OX05PVF9UUkFDS0VEID0gXCJzMzpSZXBsaWNhdGlvbjpPcGVyYXRpb25Ob3RUcmFja2VkXCIsXG5cbiAgLyoqXG4gICAqIEJ5IHVzaW5nIHRoZSBMaWZlY3ljbGVFeHBpcmF0aW9uIGV2ZW50IHR5cGVzLCB5b3UgY2FuIHJlY2VpdmUgYSBub3RpZmljYXRpb25cbiAgICogd2hlbiBBbWF6b24gUzMgZGVsZXRlcyBhbiBvYmplY3QgYmFzZWQgb24geW91ciBTMyBMaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIExJRkVDWUNMRV9FWFBJUkFUSU9OID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOipcIixcblxuICAvKipcbiAgICogVGhlIHMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlIGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYW4gb2JqZWN0XG4gICAqIGluIGFuIHVudmVyc2lvbmVkIGJ1Y2tldCBpcyBkZWxldGVkLlxuICAgKiBJdCBhbHNvIG5vdGlmaWVzIHlvdSB3aGVuIGFuIG9iamVjdCB2ZXJzaW9uIGlzIHBlcm1hbmVudGx5IGRlbGV0ZWQgYnkgYW5cbiAgICogUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfRVhQSVJBVElPTl9ERUxFVEUgPSBcInMzOkxpZmVjeWNsZUV4cGlyYXRpb246RGVsZXRlXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZU1hcmtlckNyZWF0ZWQgZXZlbnQgdHlwZSBub3RpZmllcyB5b3VcbiAgICogd2hlbiBTMyBMaWZlY3ljbGUgY3JlYXRlcyBhIGRlbGV0ZSBtYXJrZXIgd2hlbiBhIGN1cnJlbnQgdmVyc2lvbiBvZiBhblxuICAgKiBvYmplY3QgaW4gdmVyc2lvbmVkIGJ1Y2tldCBpcyBkZWxldGVkLlxuICAgKi9cbiAgTElGRUNZQ0xFX0VYUElSQVRJT05fREVMRVRFX01BUktFUl9DUkVBVEVEID0gXCJzMzpMaWZlY3ljbGVFeHBpcmF0aW9uOkRlbGV0ZU1hcmtlckNyZWF0ZWRcIixcblxuICAvKipcbiAgICogWW91IHJlY2VpdmUgdGhpcyBub3RpZmljYXRpb24gZXZlbnQgd2hlbiBhbiBvYmplY3QgaXMgdHJhbnNpdGlvbmVkIHRvXG4gICAqIGFub3RoZXIgQW1hem9uIFMzIHN0b3JhZ2UgY2xhc3MgYnkgYW4gUzMgTGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBMSUZFQ1lDTEVfVFJBTlNJVElPTiA9IFwiczM6TGlmZWN5Y2xlVHJhbnNpdGlvblwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIG9iamVjdCB3aXRoaW4gdGhlXG4gICAqIFMzIEludGVsbGlnZW50LVRpZXJpbmcgc3RvcmFnZSBjbGFzcyBtb3ZlZCB0byB0aGUgQXJjaGl2ZSBBY2Nlc3MgdGllciBvclxuICAgKiBEZWVwIEFyY2hpdmUgQWNjZXNzIHRpZXIuXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJzMzpJbnRlbGxpZ2VudFRpZXJpbmdcIixcblxuICAvKipcbiAgICogQnkgdXNpbmcgdGhlIE9iamVjdFRhZ2dpbmcgZXZlbnQgdHlwZXMsIHlvdSBjYW4gZW5hYmxlIG5vdGlmaWNhdGlvbiB3aGVuXG4gICAqIGFuIG9iamVjdCB0YWcgaXMgYWRkZWQgb3IgZGVsZXRlZCBmcm9tIGFuIG9iamVjdC5cbiAgICovXG4gIE9CSkVDVF9UQUdHSU5HID0gXCJzMzpPYmplY3RUYWdnaW5nOipcIixcblxuICAvKipcbiAgICogVGhlIHMzOk9iamVjdFRhZ2dpbmc6UHV0IGV2ZW50IHR5cGUgbm90aWZpZXMgeW91IHdoZW4gYSB0YWcgaXMgUFVUIG9uIGFuXG4gICAqIG9iamVjdCBvciBhbiBleGlzdGluZyB0YWcgaXMgdXBkYXRlZC5cblxuICAgKi9cbiAgT0JKRUNUX1RBR0dJTkdfUFVUID0gXCJzMzpPYmplY3RUYWdnaW5nOlB1dFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgczM6T2JqZWN0VGFnZ2luZzpEZWxldGUgZXZlbnQgdHlwZSBub3RpZmllcyB5b3Ugd2hlbiBhIHRhZyBpcyByZW1vdmVkXG4gICAqIGZyb20gYW4gb2JqZWN0LlxuICAgKi9cbiAgT0JKRUNUX1RBR0dJTkdfREVMRVRFID0gXCJzMzpPYmplY3RUYWdnaW5nOkRlbGV0ZVwiLFxuXG4gIC8qKlxuICAgKiBZb3UgcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbiBldmVudCB3aGVuIGFuIEFDTCBpcyBQVVQgb24gYW4gb2JqZWN0IG9yIHdoZW5cbiAgICogYW4gZXhpc3RpbmcgQUNMIGlzIGNoYW5nZWQuXG4gICAqIEFuIGV2ZW50IGlzIG5vdCBnZW5lcmF0ZWQgd2hlbiBhIHJlcXVlc3QgcmVzdWx0cyBpbiBubyBjaGFuZ2UgdG8gYW5cbiAgICogb2JqZWN04oCZcyBBQ0wuXG4gICAqL1xuICBPQkpFQ1RfQUNMX1BVVCA9IFwiczM6T2JqZWN0QWNsOlB1dFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbktleUZpbHRlciB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBvZiB0aGUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTMyBrZXlzIG11c3QgaGF2ZSB0aGUgc3BlY2lmaWVkIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogUzMga2V5cyBtdXN0IGhhdmUgdGhlIHNwZWNpZmllZCBzdWZmaXguXG4gICAqL1xuICByZWFkb25seSBzdWZmaXg/OiBzdHJpbmc7XG59XG4iXX0=