terraconstructs 0.0.11 → 0.0.13

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 (411) hide show
  1. package/.jsii +105205 -35113
  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.d.ts +26 -1
  339. package/lib/aws/notify/event-pattern.js +49 -5
  340. package/lib/aws/notify/index.js +3 -1
  341. package/lib/aws/notify/input.js +4 -3
  342. package/lib/aws/notify/kinesis-stream.js +3 -2
  343. package/lib/aws/notify/on-event-options.js +2 -1
  344. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  345. package/lib/aws/notify/queue-config.generated.js +1 -1
  346. package/lib/aws/notify/queue-policy.js +1 -1
  347. package/lib/aws/notify/queue.js +1 -1
  348. package/lib/aws/notify/resource-policy.js +1 -1
  349. package/lib/aws/notify/rule.js +3 -2
  350. package/lib/aws/notify/schedule.js +2 -2
  351. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  352. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  353. package/lib/aws/notify/target.js +2 -1
  354. package/lib/aws/notify/targets/event-bus.js +1 -1
  355. package/lib/aws/notify/targets/function.js +1 -1
  356. package/lib/aws/notify/targets/log-group.js +2 -2
  357. package/lib/aws/notify/targets/sqs.js +1 -1
  358. package/lib/aws/notify/targets/state-machine.js +1 -1
  359. package/lib/aws/notify/targets/util.d.ts +1 -1
  360. package/lib/aws/notify/targets/util.js +10 -11
  361. package/lib/aws/notify/util.js +4 -4
  362. package/lib/aws/provider-config.generated.d.ts +33 -33
  363. package/lib/aws/provider-config.generated.js +1 -1
  364. package/lib/aws/storage/bucket-notifications.js +1 -1
  365. package/lib/aws/storage/bucket-policy.js +1 -1
  366. package/lib/aws/storage/bucket-source.js +1 -1
  367. package/lib/aws/storage/bucket.d.ts +298 -65
  368. package/lib/aws/storage/bucket.js +548 -225
  369. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  370. package/lib/aws/storage/cors-config.generated.js +1 -1
  371. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  372. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  373. package/lib/aws/storage/index.d.ts +1 -0
  374. package/lib/aws/storage/index.js +2 -1
  375. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  376. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  377. package/lib/aws/storage/notification-targets/function.js +6 -6
  378. package/lib/aws/storage/notification-targets/queue.js +1 -1
  379. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  380. package/lib/aws/storage/origin-access-identity.js +5 -4
  381. package/lib/aws/storage/parameter-util.d.ts +12 -0
  382. package/lib/aws/storage/parameter-util.js +65 -0
  383. package/lib/aws/storage/parameter.d.ts +526 -0
  384. package/lib/aws/storage/parameter.js +606 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  386. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  387. package/lib/aws/storage/util.d.ts +25 -3
  388. package/lib/aws/storage/util.js +84 -17
  389. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  390. package/lib/aws/storage/website-config.generated.js +1 -1
  391. package/lib/aws/util.js +2 -3
  392. package/lib/construct-base.d.ts +10 -1
  393. package/lib/construct-base.js +9 -6
  394. package/lib/duration.js +1 -1
  395. package/lib/expiration.d.ts +48 -0
  396. package/lib/expiration.js +68 -0
  397. package/lib/helpers-internal/index.d.ts +1 -0
  398. package/lib/helpers-internal/index.js +7 -0
  399. package/lib/index.d.ts +2 -0
  400. package/lib/index.js +3 -1
  401. package/lib/private/md5.d.ts +4 -0
  402. package/lib/private/md5.js +14 -0
  403. package/lib/private/unique-resource-name.js +3 -4
  404. package/lib/size.js +2 -2
  405. package/lib/stack-base.d.ts +4 -23
  406. package/lib/stack-base.js +9 -30
  407. package/lib/terra-func.d.ts +103 -0
  408. package/lib/terra-func.js +170 -0
  409. package/lib/token.js +5 -5
  410. package/package.json +15 -8
  411. package/bun.lockb +0 -0
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BaseLoadBalancer = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-elasticloadbalancingv2/lib/shared/base-load-balancer.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const cdktf_1 = require("cdktf");
9
+ const enums_1 = require("./enums");
10
+ // import { RegionInfo } from "../../../region-info";
11
+ const util_1 = require("./util");
12
+ const ec2 = require("../");
13
+ const access_logs_accounts_1 = require("./access-logs-accounts");
14
+ const grid_lookup_types_1 = require("./grid-lookup-types");
15
+ const arn_1 = require("../../arn");
16
+ const aws_construct_1 = require("../../aws-construct");
17
+ const aws_stack_1 = require("../../aws-stack");
18
+ const iam = require("../../iam");
19
+ const iam_1 = require("../../iam");
20
+ /**
21
+ * Base class for both Application and Network Load Balancers
22
+ */
23
+ class BaseLoadBalancer extends aws_construct_1.AwsConstructBase {
24
+ // /**
25
+ // * Queries the load balancer context provider for load balancer info.
26
+ // * @internal
27
+ // */
28
+ // protected static _queryContextProvider(
29
+ // scope: Construct,
30
+ // options: LoadBalancerQueryContextProviderOptions,
31
+ // ) {
32
+ // if (
33
+ // Token.isUnresolved(options.userOptions.loadBalancerArn) ||
34
+ // Object.values(options.userOptions.loadBalancerTags ?? {}).some(
35
+ // Token.isUnresolved,
36
+ // )
37
+ // ) {
38
+ // throw new Error(
39
+ // "All arguments to look up a load balancer must be concrete (no Tokens)",
40
+ // );
41
+ // }
42
+ // let cxschemaTags: cxschema.Tag[] | undefined;
43
+ // if (options.userOptions.loadBalancerTags) {
44
+ // cxschemaTags = mapTagMapToCxschema(options.userOptions.loadBalancerTags);
45
+ // }
46
+ // const props: cxapi.LoadBalancerContextResponse = ContextProvider.getValue(
47
+ // scope,
48
+ // {
49
+ // provider: cxschema.ContextProvider.LOAD_BALANCER_PROVIDER,
50
+ // props: {
51
+ // loadBalancerArn: options.userOptions.loadBalancerArn,
52
+ // loadBalancerTags: cxschemaTags,
53
+ // loadBalancerType: options.loadBalancerType,
54
+ // } as cxschema.LoadBalancerContextQuery,
55
+ // dummyValue: {
56
+ // ipAddressType: cxapi.LoadBalancerIpAddressType.DUAL_STACK,
57
+ // // eslint-disable-next-line @cdklabs/no-literal-partition
58
+ // loadBalancerArn: `arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/${options.loadBalancerType}/my-load-balancer/50dc6c495c0c9188`,
59
+ // loadBalancerCanonicalHostedZoneId: "Z3DZXE0EXAMPLE",
60
+ // loadBalancerDnsName:
61
+ // "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com",
62
+ // securityGroupIds: ["sg-1234"],
63
+ // vpcId: "vpc-12345",
64
+ // } as cxapi.LoadBalancerContextResponse,
65
+ // },
66
+ // ).value;
67
+ // return props;
68
+ // }
69
+ get loadBalancerV2Outputs() {
70
+ return {
71
+ loadBalancerCanonicalHostedZoneId: this.loadBalancerCanonicalHostedZoneId,
72
+ loadBalancerDnsName: this.loadBalancerDnsName,
73
+ };
74
+ }
75
+ get outputs() {
76
+ return this.loadBalancerV2Outputs;
77
+ }
78
+ constructor(scope, id, baseProps, additionalProps) {
79
+ super(scope, id, baseProps);
80
+ /**
81
+ * Attributes set on this load balancer
82
+ */
83
+ this.attributes = {};
84
+ this.physicalName =
85
+ baseProps.loadBalancerName ||
86
+ this.stack.uniqueResourceName(this, {
87
+ prefix: this.gridUUID,
88
+ });
89
+ const internetFacing = (0, util_1.ifUndefined)(baseProps.internetFacing, false);
90
+ const vpcSubnets = (0, util_1.ifUndefined)(baseProps.vpcSubnets, internetFacing ? { subnetType: ec2.SubnetType.PUBLIC } : {});
91
+ const { subnetIds, internetConnectivityEstablished } = baseProps.vpc.selectSubnets(vpcSubnets);
92
+ this.vpc = baseProps.vpc;
93
+ if (additionalProps.ipAddressType ===
94
+ enums_1.IpAddressType.DUAL_STACK_WITHOUT_PUBLIC_IPV4 &&
95
+ additionalProps.loadBalancerType !== grid_lookup_types_1.LoadBalancerType.APPLICATION) {
96
+ throw new Error(`'ipAddressType' DUAL_STACK_WITHOUT_PUBLIC_IPV4 can only be used with Application Load Balancer, got ${additionalProps.loadBalancerType}`);
97
+ }
98
+ const resource = new provider_aws_1.lb.Lb(this, "Resource", {
99
+ name: this.physicalName,
100
+ subnets: subnetIds,
101
+ internal: !internetFacing, // AWS CDK "Scheme"
102
+ // Reverse CFN LoadBalancerAttributes to Terraform Resource properties
103
+ // https://github.com/hashicorp/terraform-provider-aws/blob/v5.88.0/internal/service/elbv2/load_balancer.go#L718
104
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-loadbalancerattribute.html
105
+ clientKeepAlive: this.lazyNumberAttr(util_1.LoadBalancerAttribute.clientKeepAliveSeconds),
106
+ // customerOwnedIpv4Pool [Application Load Balancers on Outposts]
107
+ desyncMitigationMode: this.lazyStringAttr(util_1.LoadBalancerAttribute.routingHTTPDesyncMitigationMode),
108
+ dnsRecordClientRoutingPolicy: this.lazyStringAttr(util_1.LoadBalancerAttribute.dNSRecordClientRoutingPolicy),
109
+ dropInvalidHeaderFields: this.lazyBoolAttr(util_1.LoadBalancerAttribute.routingHTTPDropInvalidHeaderFieldsEnabled),
110
+ enableCrossZoneLoadBalancing: this.lazyBoolAttr(util_1.LoadBalancerAttribute.loadBalancingCrossZoneEnabled),
111
+ enableDeletionProtection: this.lazyBoolAttr(util_1.LoadBalancerAttribute.deletionProtectionEnabled),
112
+ enableHttp2: this.lazyBoolAttr(util_1.LoadBalancerAttribute.routingHTTP2Enabled),
113
+ enableTlsVersionAndCipherSuiteHeaders: this.lazyBoolAttr(util_1.LoadBalancerAttribute.routingHTTPXAmznTLSVersionAndCipherSuiteEnabled),
114
+ enableWafFailOpen: this.lazyBoolAttr(util_1.LoadBalancerAttribute.wAFFailOpenEnabled),
115
+ enableXffClientPort: this.lazyBoolAttr(util_1.LoadBalancerAttribute.routingHTTPXFFClientPortEnabled),
116
+ enableZonalShift: this.lazyBoolAttr(util_1.LoadBalancerAttribute.zonalShiftConfigEnabled),
117
+ // enforceSecurityGroupInboundRulesOnPrivateLinkTraffic,
118
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-enforcesecuritygroupinboundrulesonprivatelinktraffic
119
+ idleTimeout: this.lazyNumberAttr(util_1.LoadBalancerAttribute.idleTimeoutTimeoutSeconds),
120
+ // ipAddressType
121
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-ipaddresstype
122
+ preserveHostHeader: this.lazyBoolAttr(util_1.LoadBalancerAttribute.routingHTTPPreserveHostHeaderEnabled),
123
+ xffHeaderProcessingMode: this.lazyStringAttr(util_1.LoadBalancerAttribute.routingHTTPXFFHeaderProcessingMode),
124
+ // // this results in empty `access_logs: {}` which is not valid (bucket is required)
125
+ // accessLogs: {
126
+ // enabled: this.lazyBoolAttr(Attribute.accessLogsS3Enabled),
127
+ // bucket: this.lazyStringAttr(Attribute.accessLogsS3Bucket),
128
+ // prefix: this.lazyStringAttr(Attribute.accessLogsS3Prefix),
129
+ // },
130
+ // // this results in empty `connection_logs: {}` which is not valid (bucket is required)
131
+ // connectionLogs: {
132
+ // enabled: this.lazyBoolAttr(Attribute.connectionLogsS3Enabled),
133
+ // bucket: this.lazyStringAttr(Attribute.connectionLogsS3Bucket),
134
+ // prefix: this.lazyStringAttr(Attribute.connectionLogsS3Prefix),
135
+ // },
136
+ //subnetMappings
137
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmappings
138
+ ...additionalProps,
139
+ });
140
+ if (internetFacing) {
141
+ resource.node.addDependency(internetConnectivityEstablished);
142
+ }
143
+ this.setAttribute(util_1.LoadBalancerAttribute.deletionProtectionEnabled, baseProps.deletionProtection ? "true" : "false");
144
+ if (baseProps.crossZoneEnabled !== undefined) {
145
+ this.setAttribute(util_1.LoadBalancerAttribute.loadBalancingCrossZoneEnabled, baseProps.crossZoneEnabled === true ? "true" : "false");
146
+ }
147
+ if (baseProps.denyAllIgwTraffic !== undefined) {
148
+ if (additionalProps.ipAddressType === enums_1.IpAddressType.DUAL_STACK) {
149
+ this.setAttribute(util_1.LoadBalancerAttribute.iPv6DenyAllIGWTraffic, baseProps.denyAllIgwTraffic.toString());
150
+ }
151
+ else {
152
+ throw new Error(`'denyAllIgwTraffic' may only be set on load balancers with ${enums_1.IpAddressType.DUAL_STACK} addressing.`);
153
+ }
154
+ }
155
+ this.loadBalancerCanonicalHostedZoneId = resource.zoneId;
156
+ this.loadBalancerDnsName = resource.dnsName;
157
+ this.loadBalancerFullName = this.stack.splitArn(resource.arn, arn_1.ArnFormat.SLASH_RESOURCE_NAME).resource;
158
+ this.loadBalancerName = resource.name;
159
+ this.loadBalancerArn = resource.arn;
160
+ this.loadBalancerSecurityGroups = resource.securityGroups;
161
+ this.node.addValidation({ validate: this.validateLoadBalancer.bind(this) });
162
+ }
163
+ /**
164
+ * Enable access logging for this load balancer.
165
+ *
166
+ * A region must be specified on the stack containing the load balancer; you cannot enable logging on
167
+ * environment-agnostic stacks. See https://docs.aws.amazon.com/cdk/latest/guide/environments.html
168
+ */
169
+ logAccessLogs(bucket, prefix) {
170
+ // prefix = prefix; // optional in TF... || "";
171
+ this.setAttribute("access_logs.s3.enabled", "true");
172
+ this.setAttribute("access_logs.s3.bucket", bucket.bucketName.toString());
173
+ this.setAttribute("access_logs.s3.prefix", prefix);
174
+ const logsDeliveryServicePrincipal = new iam_1.ServicePrincipal("delivery.logs.amazonaws.com");
175
+ bucket.addToResourcePolicy(new iam_1.PolicyStatement({
176
+ actions: ["s3:PutObject"],
177
+ principals: [this.resourcePolicyPrincipal()],
178
+ resources: [
179
+ bucket.arnForObjects(`${prefix ? prefix + "/" : ""}AWSLogs/${aws_stack_1.AwsStack.ofAwsConstruct(this).account}/*`),
180
+ ],
181
+ }));
182
+ bucket.addToResourcePolicy(new iam_1.PolicyStatement({
183
+ actions: ["s3:PutObject"],
184
+ principals: [logsDeliveryServicePrincipal],
185
+ resources: [
186
+ bucket.arnForObjects(`${prefix ? prefix + "/" : ""}AWSLogs/${this.env.account}/*`),
187
+ ],
188
+ condition: [
189
+ {
190
+ test: "StringEquals",
191
+ variable: "s3:x-amz-acl",
192
+ values: ["bucket-owner-full-control"],
193
+ },
194
+ ],
195
+ }));
196
+ bucket.addToResourcePolicy(new iam_1.PolicyStatement({
197
+ actions: ["s3:GetBucketAcl"],
198
+ principals: [logsDeliveryServicePrincipal],
199
+ resources: [bucket.bucketArn],
200
+ }));
201
+ // make sure the bucket's policy is created before the ALB (see https://github.com/aws/aws-cdk/issues/1633)
202
+ // at the L1 level to avoid creating a circular dependency (see https://github.com/aws/aws-cdk/issues/27528
203
+ // and https://github.com/aws/aws-cdk/issues/27928)
204
+ const lb = this.node.defaultChild;
205
+ const bucketPolicy = bucket.policy?.node.defaultChild;
206
+ if (lb &&
207
+ bucketPolicy &&
208
+ cdktf_1.TerraformResource.isTerraformResource(lb) &&
209
+ cdktf_1.TerraformResource.isTerraformResource(bucketPolicy)) {
210
+ lb.node.addDependency(bucketPolicy);
211
+ }
212
+ // TODO: Should putAccessLogs be handled as part of prepareStack (in toTerraform() instead)?
213
+ // only if lb.accessLogs.internalValue !== undefined? (or based on this.attributes?)
214
+ lb.putAccessLogs({
215
+ enabled: this.lazyBoolAttr(util_1.LoadBalancerAttribute.accessLogsS3Enabled),
216
+ bucket: this.lazyStringAttr(util_1.LoadBalancerAttribute.accessLogsS3Bucket),
217
+ prefix: this.lazyStringAttr(util_1.LoadBalancerAttribute.accessLogsS3Prefix),
218
+ });
219
+ }
220
+ /**
221
+ * Set a non-standard attribute on the load balancer
222
+ *
223
+ * Use the dedicated logAccessLogs() method intead of setAttribute if you want to setup access logging.
224
+ *
225
+ * @see https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#load-balancer-attributes
226
+ */
227
+ setAttribute(key, value) {
228
+ this.attributes[key] = value;
229
+ }
230
+ /**
231
+ * Remove an attribute from the load balancer
232
+ */
233
+ removeAttribute(key) {
234
+ this.setAttribute(key, undefined);
235
+ }
236
+ lazyStringAttr(key) {
237
+ return cdktf_1.Lazy.stringValue({
238
+ produce: () => (0, util_1.lookupStringAttribute)(this.attributes, key),
239
+ });
240
+ }
241
+ lazyBoolAttr(key) {
242
+ return cdktf_1.Lazy.anyValue({
243
+ produce: () => (0, util_1.lookupBoolAttribute)(this.attributes, key),
244
+ });
245
+ }
246
+ lazyNumberAttr(key) {
247
+ return cdktf_1.Lazy.numberValue({
248
+ produce: () => (0, util_1.lookupNumberAttribute)(this.attributes, key),
249
+ });
250
+ }
251
+ resourcePolicyPrincipal() {
252
+ const region = this.stack.region;
253
+ if (cdktf_1.Token.isUnresolved(region)) {
254
+ throw new Error("Region is required to enable ELBv2 access logging");
255
+ }
256
+ // const account = RegionInfo.get(region).elbv2Account;
257
+ const account = (0, access_logs_accounts_1.getElbv2Account)(region);
258
+ if (!account) {
259
+ // New Regions use a service principal
260
+ // https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html#attach-bucket-policy
261
+ return new iam.ServicePrincipal("logdelivery.elasticloadbalancing.amazonaws.com");
262
+ }
263
+ return new iam.AccountPrincipal(account);
264
+ }
265
+ validateLoadBalancer() {
266
+ const ret = new Array();
267
+ // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-name
268
+ const loadBalancerName = this.physicalName;
269
+ if (!cdktf_1.Token.isUnresolved(loadBalancerName) &&
270
+ loadBalancerName !== undefined) {
271
+ if (loadBalancerName.length > 32) {
272
+ ret.push(`Load balancer name: "${loadBalancerName}" can have a maximum of 32 characters.`);
273
+ }
274
+ if (loadBalancerName.startsWith("internal-")) {
275
+ ret.push(`Load balancer name: "${loadBalancerName}" must not begin with "internal-".`);
276
+ }
277
+ if (loadBalancerName.startsWith("-") || loadBalancerName.endsWith("-")) {
278
+ ret.push(`Load balancer name: "${loadBalancerName}" must not begin or end with a hyphen.`);
279
+ }
280
+ if (!/^[0-9a-z-]+$/i.test(loadBalancerName)) {
281
+ ret.push(`Load balancer name: "${loadBalancerName}" must contain only alphanumeric characters or hyphens.`);
282
+ }
283
+ }
284
+ return ret;
285
+ }
286
+ }
287
+ exports.BaseLoadBalancer = BaseLoadBalancer;
288
+ _a = JSII_RTTI_SYMBOL_1;
289
+ BaseLoadBalancer[_a] = { fqn: "terraconstructs.aws.compute.BaseLoadBalancer", version: "0.0.13" };
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1sb2FkLWJhbGFuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL2xiLXNoYXJlZC9iYXNlLWxvYWQtYmFsYW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnSUFBZ0k7QUFFaEksc0RBQTJEO0FBQzNELGlDQUtlO0FBRWYsbUNBQXdDO0FBQ3hDLHFEQUFxRDtBQUNyRCxpQ0FTZ0I7QUFDaEIsMkJBQTJCO0FBQzNCLGlFQUF5RDtBQUN6RCwyREFBdUQ7QUFDdkQsbUNBQXNDO0FBQ3RDLHVEQUk2QjtBQUM3QiwrQ0FBMkM7QUFDM0MsaUNBQWlDO0FBQ2pDLG1DQUE4RDtBQXVJOUQ7O0dBRUc7QUFDSCxNQUFzQixnQkFBaUIsU0FBUSxnQ0FBZ0I7SUFDN0QsTUFBTTtJQUNOLHdFQUF3RTtJQUN4RSxlQUFlO0lBQ2YsTUFBTTtJQUNOLDBDQUEwQztJQUMxQyxzQkFBc0I7SUFDdEIsc0RBQXNEO0lBQ3RELE1BQU07SUFDTixTQUFTO0lBQ1QsaUVBQWlFO0lBQ2pFLHNFQUFzRTtJQUN0RSw0QkFBNEI7SUFDNUIsUUFBUTtJQUNSLFFBQVE7SUFDUix1QkFBdUI7SUFDdkIsaUZBQWlGO0lBQ2pGLFNBQVM7SUFDVCxNQUFNO0lBRU4sa0RBQWtEO0lBQ2xELGdEQUFnRDtJQUNoRCxnRkFBZ0Y7SUFDaEYsTUFBTTtJQUVOLCtFQUErRTtJQUMvRSxhQUFhO0lBQ2IsUUFBUTtJQUNSLG1FQUFtRTtJQUNuRSxpQkFBaUI7SUFDakIsZ0VBQWdFO0lBQ2hFLDBDQUEwQztJQUMxQyxzREFBc0Q7SUFDdEQsZ0RBQWdEO0lBQ2hELHNCQUFzQjtJQUN0QixxRUFBcUU7SUFDckUsb0VBQW9FO0lBQ3BFLDZKQUE2SjtJQUM3SiwrREFBK0Q7SUFDL0QsK0JBQStCO0lBQy9CLHVFQUF1RTtJQUN2RSx5Q0FBeUM7SUFDekMsOEJBQThCO0lBQzlCLGdEQUFnRDtJQUNoRCxTQUFTO0lBQ1QsYUFB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R0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUVoQyxvS0FBb0s7UUFDcEssTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNDLElBQ0UsQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO1lBQ3JDLGdCQUFnQixLQUFLLFNBQVMsRUFDOUIsQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxHQUFHLENBQUMsSUFBSSxDQUNOLHdCQUF3QixnQkFBZ0Isd0NBQXdDLENBQ2pGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsR0FBRyxDQUFDLElBQUksQ0FDTix3QkFBd0IsZ0JBQWdCLG9DQUFvQyxDQUM3RSxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxHQUFHLENBQUMsSUFBSSxDQUNOLHdCQUF3QixnQkFBZ0Isd0NBQXdDLENBQ2pGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxHQUFHLENBQUMsSUFBSSxDQUNOLHdCQUF3QixnQkFBZ0IseURBQXlELENBQ2xHLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFsYUgsNENBbWFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjIvbGliL3NoYXJlZC9iYXNlLWxvYWQtYmFsYW5jZXIudHNcblxuaW1wb3J0IHsgbGIgYXMgdGZMb2FkQmFsYW5jZXIgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHtcbiAgVGVycmFmb3JtUmVzb3VyY2UsXG4gIC8vIENvbnRleHRQcm92aWRlcixcbiAgTGF6eSxcbiAgVG9rZW4sXG59IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElwQWRkcmVzc1R5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuLy8gaW1wb3J0IHsgUmVnaW9uSW5mbyB9IGZyb20gXCIuLi8uLi8uLi9yZWdpb24taW5mb1wiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlcyxcbiAgaWZVbmRlZmluZWQsXG4gIExvYWRCYWxhbmNlckF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGUsXG4gIGxvb2t1cEJvb2xBdHRyaWJ1dGUsXG4gIGxvb2t1cE51bWJlckF0dHJpYnV0ZSxcbiAgbG9va3VwU3RyaW5nQXR0cmlidXRlLFxuICAvLyBtYXBUYWdNYXBUb0N4c2NoZW1hLFxuICAvLyByZW5kZXJBdHRyaWJ1dGVzLFxufSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcIi4uL1wiO1xuaW1wb3J0IHsgZ2V0RWxidjJBY2NvdW50IH0gZnJvbSBcIi4vYWNjZXNzLWxvZ3MtYWNjb3VudHNcIjtcbmltcG9ydCB7IExvYWRCYWxhbmNlclR5cGUgfSBmcm9tIFwiLi9ncmlkLWxvb2t1cC10eXBlc1wiO1xuaW1wb3J0IHsgQXJuRm9ybWF0IH0gZnJvbSBcIi4uLy4uL2FyblwiO1xuaW1wb3J0IHtcbiAgSUF3c0NvbnN0cnVjdCxcbiAgQXdzQ29uc3RydWN0QmFzZSxcbiAgQXdzQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuLi8uLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi8uLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vLi4vaWFtXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiLi4vLi4vaWFtXCI7XG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuXG4vKipcbiAqIFNoYXJlZCBwcm9wZXJ0aWVzIG9mIGJvdGggQXBwbGljYXRpb24gYW5kIE5ldHdvcmsgTG9hZCBCYWxhbmNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlTG9hZEJhbGFuY2VyUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBsb2FkIGJhbGFuY2VyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgbG9hZCBiYWxhbmNlciBpblxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBlYzIuSVZwYztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbG9hZCBiYWxhbmNlciBoYXMgYW4gaW50ZXJuZXQtcm91dGFibGUgYWRkcmVzc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuZXRGYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGljaCBzdWJuZXRzIHBsYWNlIHRoZSBsb2FkIGJhbGFuY2VyIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIFZwYyBkZWZhdWx0IHN0cmF0ZWd5LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjU3VibmV0cz86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGRlbGV0aW9uIHByb3RlY3Rpb24gaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGNyb3NzLXpvbmUgbG9hZCBiYWxhbmNpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZSBmb3IgTmV0d29yayBMb2FkIEJhbGFuY2VycyBhbmQgdHJ1ZSBmb3IgQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcnMuXG4gICAqIFRoaXMgY2FuIG5vdCBiZSBgZmFsc2VgIGZvciBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2Vycy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci1sb2FkYmFsYW5jZXJhdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgY3Jvc3Nab25lRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsb2FkIGJhbGFuY2VyIGJsb2NrcyB0cmFmZmljIHRocm91Z2ggdGhlIEludGVybmV0IEdhdGV3YXkgKElHVykuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2UgZm9yIGludGVybmV0LWZhY2luZyBsb2FkIGJhbGFuY2VycyBhbmQgdHJ1ZSBmb3IgaW50ZXJuYWwgbG9hZCBiYWxhbmNlcnNcbiAgICovXG4gIHJlYWRvbmx5IGRlbnlBbGxJZ3dUcmFmZmljPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlclYyT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBUaGUgY2Fub25pY2FsIGhvc3RlZCB6b25lIElEIG9mIHRoaXMgbG9hZCBiYWxhbmNlclxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgWjJQNzBKN0VYQU1QTEVgXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlckNhbm9uaWNhbEhvc3RlZFpvbmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEROUyBuYW1lIG9mIHRoaXMgbG9hZCBiYWxhbmNlclxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgbXktbG9hZC1iYWxhbmNlci00MjQ4MzU3MDYudXMtd2VzdC0yLmVsYi5hbWF6b25hd3MuY29tYFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJEbnNOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYWRCYWxhbmNlclYyIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCB7XG4gIC8qKiBTdHJvbmdseSB0eXBlZCBvdXRwdXRzICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlclYyT3V0cHV0czogTG9hZEJhbGFuY2VyVjJPdXRwdXRzO1xuICAvKipcbiAgICogVGhlIGNhbm9uaWNhbCBob3N0ZWQgem9uZSBJRCBvZiB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYFoyUDcwSjdFWEFNUExFYFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJDYW5vbmljYWxIb3N0ZWRab25lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEROUyBuYW1lIG9mIHRoaXMgbG9hZCBiYWxhbmNlclxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgbXktbG9hZC1iYWxhbmNlci00MjQ4MzU3MDYudXMtd2VzdC0yLmVsYi5hbWF6b25hd3MuY29tYFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJEbnNOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9va2luZyB1cCBsb2FkIGJhbGFuY2Vyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VMb2FkQmFsYW5jZXJMb29rdXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbmQgYnkgbG9hZCBiYWxhbmNlcidzIEFSTlxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IHNlYXJjaCBieSBsb2FkIGJhbGFuY2VyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXRjaCBsb2FkIGJhbGFuY2VyIHRhZ3MuXG4gICAqIEBkZWZhdWx0IC0gZG9lcyBub3QgbWF0Y2ggbG9hZCBiYWxhbmNlcnMgYnkgdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcXVlcnkgY29udGV4dCBwcm92aWRlclxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEJhbGFuY2VyUXVlcnlDb250ZXh0UHJvdmlkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZXIncyBsb29rdXAgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlck9wdGlvbnM6IEJhc2VMb2FkQmFsYW5jZXJMb29rdXBPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUeXBlIG9mIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlclR5cGU6IExvYWRCYWxhbmNlclR5cGU7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYm90aCBBcHBsaWNhdGlvbiBhbmQgTmV0d29yayBMb2FkIEJhbGFuY2Vyc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUxvYWRCYWxhbmNlciBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2Uge1xuICAvLyAvKipcbiAgLy8gICogUXVlcmllcyB0aGUgbG9hZCBiYWxhbmNlciBjb250ZXh0IHByb3ZpZGVyIGZvciBsb2FkIGJhbGFuY2VyIGluZm8uXG4gIC8vICAqIEBpbnRlcm5hbFxuICAvLyAgKi9cbiAgLy8gcHJvdGVjdGVkIHN0YXRpYyBfcXVlcnlDb250ZXh0UHJvdmlkZXIoXG4gIC8vICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgLy8gICBvcHRpb25zOiBMb2FkQmFsYW5jZXJRdWVyeUNvbnRleHRQcm92aWRlck9wdGlvbnMsXG4gIC8vICkge1xuICAvLyAgIGlmIChcbiAgLy8gICAgIFRva2VuLmlzVW5yZXNvbHZlZChvcHRpb25zLnVzZXJPcHRpb25zLmxvYWRCYWxhbmNlckFybikgfHxcbiAgLy8gICAgIE9iamVjdC52YWx1ZXMob3B0aW9ucy51c2VyT3B0aW9ucy5sb2FkQmFsYW5jZXJUYWdzID8/IHt9KS5zb21lKFxuICAvLyAgICAgICBUb2tlbi5pc1VucmVzb2x2ZWQsXG4gIC8vICAgICApXG4gIC8vICAgKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gIC8vICAgICAgIFwiQWxsIGFyZ3VtZW50cyB0byBsb29rIHVwIGEgbG9hZCBiYWxhbmNlciBtdXN0IGJlIGNvbmNyZXRlIChubyBUb2tlbnMpXCIsXG4gIC8vICAgICApO1xuICAvLyAgIH1cblxuICAvLyAgIGxldCBjeHNjaGVtYVRhZ3M6IGN4c2NoZW1hLlRhZ1tdIHwgdW5kZWZpbmVkO1xuICAvLyAgIGlmIChvcHRpb25zLnVzZXJPcHRpb25zLmxvYWRCYWxhbmNlclRhZ3MpIHtcbiAgLy8gICAgIGN4c2NoZW1hVGFncyA9IG1hcFRhZ01hcFRvQ3hzY2hlbWEob3B0aW9ucy51c2VyT3B0aW9ucy5sb2FkQmFsYW5jZXJUYWdzKTtcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCBwcm9wczogY3hhcGkuTG9hZEJhbGFuY2VyQ29udGV4dFJlc3BvbnNlID0gQ29udGV4dFByb3ZpZGVyLmdldFZhbHVlKFxuICAvLyAgICAgc2NvcGUsXG4gIC8vICAgICB7XG4gIC8vICAgICAgIHByb3ZpZGVyOiBjeHNjaGVtYS5Db250ZXh0UHJvdmlkZXIuTE9BRF9CQUxBTkNFUl9QUk9WSURFUixcbiAgLy8gICAgICAgcHJvcHM6IHtcbiAgLy8gICAgICAgICBsb2FkQmFsYW5jZXJBcm46IG9wdGlvbnMudXNlck9wdGlvbnMubG9hZEJhbGFuY2VyQXJuLFxuICAvLyAgICAgICAgIGxvYWRCYWxhbmNlclRhZ3M6IGN4c2NoZW1hVGFncyxcbiAgLy8gICAgICAgICBsb2FkQmFsYW5jZXJUeXBlOiBvcHRpb25zLmxvYWRCYWxhbmNlclR5cGUsXG4gIC8vICAgICAgIH0gYXMgY3hzY2hlbWEuTG9hZEJhbGFuY2VyQ29udGV4dFF1ZXJ5LFxuICAvLyAgICAgICBkdW1teVZhbHVlOiB7XG4gIC8vICAgICAgICAgaXBBZGRyZXNzVHlwZTogY3hhcGkuTG9hZEJhbGFuY2VySXBBZGRyZXNzVHlwZS5EVUFMX1NUQUNLLFxuICAvLyAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvblxuICAvLyAgICAgICAgIGxvYWRCYWxhbmNlckFybjogYGFybjphd3M6ZWxhc3RpY2xvYWRiYWxhbmNpbmc6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpsb2FkYmFsYW5jZXIvJHtvcHRpb25zLmxvYWRCYWxhbmNlclR5cGV9L215LWxvYWQtYmFsYW5jZXIvNTBkYzZjNDk1YzBjOTE4OGAsXG4gIC8vICAgICAgICAgbG9hZEJhbGFuY2VyQ2Fub25pY2FsSG9zdGVkWm9uZUlkOiBcIlozRFpYRTBFWEFNUExFXCIsXG4gIC8vICAgICAgICAgbG9hZEJhbGFuY2VyRG5zTmFtZTpcbiAgLy8gICAgICAgICAgIFwibXktbG9hZC1iYWxhbmNlci0xMjM0NTY3ODkwLnVzLXdlc3QtMi5lbGIuYW1hem9uYXdzLmNvbVwiLFxuICAvLyAgICAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFtcInNnLTEyMzRcIl0sXG4gIC8vICAgICAgICAgdnBjSWQ6IFwidnBjLTEyMzQ1XCIsXG4gIC8vICAgICAgIH0gYXMgY3hhcGkuTG9hZEJhbGFuY2VyQ29udGV4dFJlc3BvbnNlLFxuICAvLyAgICAgfSxcbiAgLy8gICApLnZhbHVlO1xuXG4gIC8vICAgcmV0dXJuIHByb3BzO1xuICAvLyB9XG5cbiAgcHVibGljIGdldCBsb2FkQmFsYW5jZXJWMk91dHB1dHMoKTogTG9hZEJhbGFuY2VyVjJPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZEJhbGFuY2VyQ2Fub25pY2FsSG9zdGVkWm9uZUlkOiB0aGlzLmxvYWRCYWxhbmNlckNhbm9uaWNhbEhvc3RlZFpvbmVJZCxcbiAgICAgIGxvYWRCYWxhbmNlckRuc05hbWU6IHRoaXMubG9hZEJhbGFuY2VyRG5zTmFtZSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkQmFsYW5jZXJWMk91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNhbm9uaWNhbCBob3N0ZWQgem9uZSBJRCBvZiB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYFoyUDcwSjdFWEFNUExFYFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQ2Fub25pY2FsSG9zdGVkWm9uZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBETlMgbmFtZSBvZiB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYG15LWxvYWQtYmFsYW5jZXItNDI0ODM1NzA2LnVzLXdlc3QtMi5lbGIuYW1hem9uYXdzLmNvbWBcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRCYWxhbmNlckRuc05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYGFwcC9teS1sb2FkLWJhbGFuY2VyLzUwZGM2YzQ5NWMwYzkxODhgXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2FkQmFsYW5jZXJGdWxsTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIGxvYWQgYmFsYW5jZXJcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYG15LWxvYWQtYmFsYW5jZXJgXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2FkQmFsYW5jZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhpcyBsb2FkIGJhbGFuY2VyXG4gICAqXG4gICAqIEV4YW1wbGUgdmFsdWU6IGBhcm46YXdzOmVsYXN0aWNsb2FkYmFsYW5jaW5nOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6bG9hZGJhbGFuY2VyL2FwcC9teS1pbnRlcm5hbC1sb2FkLWJhbGFuY2VyLzUwZGM2YzQ5NWMwYzkxODhgXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2FkQmFsYW5jZXJBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXBzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIFZQQyB0aGlzIGxvYWQgYmFsYW5jZXIgaGFzIGJlZW4gY3JlYXRlZCBpbi5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgZGVmaW5lZCAobm90IGBudWxsYCBvciBgdW5kZWZpbmVkYCkgZm9yIHN1Yi1jbGFzc2VzIG9mIGBCYXNlTG9hZEJhbGFuY2VyYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogQXR0cmlidXRlcyBzZXQgb24gdGhpcyBsb2FkIGJhbGFuY2VyXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMgPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwaHlzaWNhbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYmFzZVByb3BzOiBCYXNlTG9hZEJhbGFuY2VyUHJvcHMsXG4gICAgYWRkaXRpb25hbFByb3BzOiB0ZkxvYWRCYWxhbmNlci5MYkNvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBiYXNlUHJvcHMpO1xuICAgIHRoaXMucGh5c2ljYWxOYW1lID1cbiAgICAgIGJhc2VQcm9wcy5sb2FkQmFsYW5jZXJOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgaW50ZXJuZXRGYWNpbmcgPSBpZlVuZGVmaW5lZChiYXNlUHJvcHMuaW50ZXJuZXRGYWNpbmcsIGZhbHNlKTtcblxuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBpZlVuZGVmaW5lZChcbiAgICAgIGJhc2VQcm9wcy52cGNTdWJuZXRzLFxuICAgICAgaW50ZXJuZXRGYWNpbmcgPyB7IHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyB9IDoge30sXG4gICAgKTtcbiAgICBjb25zdCB7IHN1Ym5ldElkcywgaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCB9ID1cbiAgICAgIGJhc2VQcm9wcy52cGMuc2VsZWN0U3VibmV0cyh2cGNTdWJuZXRzKTtcblxuICAgIHRoaXMudnBjID0gYmFzZVByb3BzLnZwYztcblxuICAgIGlmIChcbiAgICAgIGFkZGl0aW9uYWxQcm9wcy5pcEFkZHJlc3NUeXBlID09PVxuICAgICAgICBJcEFkZHJlc3NUeXBlLkRVQUxfU1RBQ0tfV0lUSE9VVF9QVUJMSUNfSVBWNCAmJlxuICAgICAgYWRkaXRpb25hbFByb3BzLmxvYWRCYWxhbmNlclR5cGUgIT09IExvYWRCYWxhbmNlclR5cGUuQVBQTElDQVRJT05cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCdpcEFkZHJlc3NUeXBlJyBEVUFMX1NUQUNLX1dJVEhPVVRfUFVCTElDX0lQVjQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIsIGdvdCAke2FkZGl0aW9uYWxQcm9wcy5sb2FkQmFsYW5jZXJUeXBlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IHRmTG9hZEJhbGFuY2VyLkxiKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICBzdWJuZXRzOiBzdWJuZXRJZHMsXG4gICAgICBpbnRlcm5hbDogIWludGVybmV0RmFjaW5nLCAvLyBBV1MgQ0RLIFwiU2NoZW1lXCJcbiAgICAgIC8vIFJldmVyc2UgQ0ZOIExvYWRCYWxhbmNlckF0dHJpYnV0ZXMgdG8gVGVycmFmb3JtIFJlc291cmNlIHByb3BlcnRpZXNcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9ibG9iL3Y1Ljg4LjAvaW50ZXJuYWwvc2VydmljZS9lbGJ2Mi9sb2FkX2JhbGFuY2VyLmdvI0w3MThcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjItbG9hZGJhbGFuY2VyLWxvYWRiYWxhbmNlcmF0dHJpYnV0ZS5odG1sXG4gICAgICBjbGllbnRLZWVwQWxpdmU6IHRoaXMubGF6eU51bWJlckF0dHIoQXR0cmlidXRlLmNsaWVudEtlZXBBbGl2ZVNlY29uZHMpLFxuICAgICAgLy8gY3VzdG9tZXJPd25lZElwdjRQb29sIFtBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VycyBvbiBPdXRwb3N0c11cbiAgICAgIGRlc3luY01pdGlnYXRpb25Nb2RlOiB0aGlzLmxhenlTdHJpbmdBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUucm91dGluZ0hUVFBEZXN5bmNNaXRpZ2F0aW9uTW9kZSxcbiAgICAgICksXG4gICAgICBkbnNSZWNvcmRDbGllbnRSb3V0aW5nUG9saWN5OiB0aGlzLmxhenlTdHJpbmdBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUuZE5TUmVjb3JkQ2xpZW50Um91dGluZ1BvbGljeSxcbiAgICAgICksXG4gICAgICBkcm9wSW52YWxpZEhlYWRlckZpZWxkczogdGhpcy5sYXp5Qm9vbEF0dHIoXG4gICAgICAgIEF0dHJpYnV0ZS5yb3V0aW5nSFRUUERyb3BJbnZhbGlkSGVhZGVyRmllbGRzRW5hYmxlZCxcbiAgICAgICksXG4gICAgICBlbmFibGVDcm9zc1pvbmVMb2FkQmFsYW5jaW5nOiB0aGlzLmxhenlCb29sQXR0cihcbiAgICAgICAgQXR0cmlidXRlLmxvYWRCYWxhbmNpbmdDcm9zc1pvbmVFbmFibGVkLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZURlbGV0aW9uUHJvdGVjdGlvbjogdGhpcy5sYXp5Qm9vbEF0dHIoXG4gICAgICAgIEF0dHJpYnV0ZS5kZWxldGlvblByb3RlY3Rpb25FbmFibGVkLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZUh0dHAyOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUucm91dGluZ0hUVFAyRW5hYmxlZCksXG4gICAgICBlbmFibGVUbHNWZXJzaW9uQW5kQ2lwaGVyU3VpdGVIZWFkZXJzOiB0aGlzLmxhenlCb29sQXR0cihcbiAgICAgICAgQXR0cmlidXRlLnJvdXRpbmdIVFRQWEFtem5UTFNWZXJzaW9uQW5kQ2lwaGVyU3VpdGVFbmFibGVkLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZVdhZkZhaWxPcGVuOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUud0FGRmFpbE9wZW5FbmFibGVkKSxcbiAgICAgIGVuYWJsZVhmZkNsaWVudFBvcnQ6IHRoaXMubGF6eUJvb2xBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUucm91dGluZ0hUVFBYRkZDbGllbnRQb3J0RW5hYmxlZCxcbiAgICAgICksXG4gICAgICBlbmFibGVab25hbFNoaWZ0OiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUuem9uYWxTaGlmdENvbmZpZ0VuYWJsZWQpLFxuICAgICAgLy8gZW5mb3JjZVNlY3VyaXR5R3JvdXBJbmJvdW5kUnVsZXNPblByaXZhdGVMaW5rVHJhZmZpYyxcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci5odG1sI2Nmbi1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci1lbmZvcmNlc2VjdXJpdHlncm91cGluYm91bmRydWxlc29ucHJpdmF0ZWxpbmt0cmFmZmljXG4gICAgICBpZGxlVGltZW91dDogdGhpcy5sYXp5TnVtYmVyQXR0cihBdHRyaWJ1dGUuaWRsZVRpbWVvdXRUaW1lb3V0U2Vjb25kcyksXG4gICAgICAvLyBpcEFkZHJlc3NUeXBlXG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi1sb2FkYmFsYW5jZXIuaHRtbCNjZm4tZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi1sb2FkYmFsYW5jZXItaXBhZGRyZXNzdHlwZVxuICAgICAgcHJlc2VydmVIb3N0SGVhZGVyOiB0aGlzLmxhenlCb29sQXR0cihcbiAgICAgICAgQXR0cmlidXRlLnJvdXRpbmdIVFRQUHJlc2VydmVIb3N0SGVhZGVyRW5hYmxlZCxcbiAgICAgICksXG4gICAgICB4ZmZIZWFkZXJQcm9jZXNzaW5nTW9kZTogdGhpcy5sYXp5U3RyaW5nQXR0cihcbiAgICAgICAgQXR0cmlidXRlLnJvdXRpbmdIVFRQWEZGSGVhZGVyUHJvY2Vzc2luZ01vZGUsXG4gICAgICApLFxuICAgICAgLy8gLy8gdGhpcyByZXN1bHRzIGluIGVtcHR5IGBhY2Nlc3NfbG9nczoge31gIHdoaWNoIGlzIG5vdCB2YWxpZCAoYnVja2V0IGlzIHJlcXVpcmVkKVxuICAgICAgLy8gYWNjZXNzTG9nczoge1xuICAgICAgLy8gICBlbmFibGVkOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUuYWNjZXNzTG9nc1MzRW5hYmxlZCksXG4gICAgICAvLyAgIGJ1Y2tldDogdGhpcy5sYXp5U3RyaW5nQXR0cihBdHRyaWJ1dGUuYWNjZXNzTG9nc1MzQnVja2V0KSxcbiAgICAgIC8vICAgcHJlZml4OiB0aGlzLmxhenlTdHJpbmdBdHRyKEF0dHJpYnV0ZS5hY2Nlc3NMb2dzUzNQcmVmaXgpLFxuICAgICAgLy8gfSxcbiAgICAgIC8vIC8vIHRoaXMgcmVzdWx0cyBpbiBlbXB0eSBgY29ubmVjdGlvbl9sb2dzOiB7fWAgd2hpY2ggaXMgbm90IHZhbGlkIChidWNrZXQgaXMgcmVxdWlyZWQpXG4gICAgICAvLyBjb25uZWN0aW9uTG9nczoge1xuICAgICAgLy8gICBlbmFibGVkOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUuY29ubmVjdGlvbkxvZ3NTM0VuYWJsZWQpLFxuICAgICAgLy8gICBidWNrZXQ6IHRoaXMubGF6eVN0cmluZ0F0dHIoQXR0cmlidXRlLmNvbm5lY3Rpb25Mb2dzUzNCdWNrZXQpLFxuICAgICAgLy8gICBwcmVmaXg6IHRoaXMubGF6eVN0cmluZ0F0dHIoQXR0cmlidXRlLmNvbm5lY3Rpb25Mb2dzUzNQcmVmaXgpLFxuICAgICAgLy8gfSxcbiAgICAgIC8vc3VibmV0TWFwcGluZ3NcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci5odG1sI2Nmbi1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci1zdWJuZXRtYXBwaW5nc1xuICAgICAgLi4uYWRkaXRpb25hbFByb3BzLFxuICAgIH0pO1xuICAgIGlmIChpbnRlcm5ldEZhY2luZykge1xuICAgICAgcmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgQXR0cmlidXRlLmRlbGV0aW9uUHJvdGVjdGlvbkVuYWJsZWQsXG4gICAgICBiYXNlUHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgKTtcblxuICAgIGlmIChiYXNlUHJvcHMuY3Jvc3Nab25lRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShcbiAgICAgICAgQXR0cmlidXRlLmxvYWRCYWxhbmNpbmdDcm9zc1pvbmVFbmFibGVkLFxuICAgICAgICBiYXNlUHJvcHMuY3Jvc3Nab25lRW5hYmxlZCA9PT0gdHJ1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYmFzZVByb3BzLmRlbnlBbGxJZ3dUcmFmZmljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChhZGRpdGlvbmFsUHJvcHMuaXBBZGRyZXNzVHlwZSA9PT0gSXBBZGRyZXNzVHlwZS5EVUFMX1NUQUNLKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIEF0dHJpYnV0ZS5pUHY2RGVueUFsbElHV1RyYWZmaWMsXG4gICAgICAgICAgYmFzZVByb3BzLmRlbnlBbGxJZ3dUcmFmZmljLnRvU3RyaW5nKCksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCdkZW55QWxsSWd3VHJhZmZpYycgbWF5IG9ubHkgYmUgc2V0IG9uIGxvYWQgYmFsYW5jZXJzIHdpdGggJHtJcEFkZHJlc3NUeXBlLkRVQUxfU1RBQ0t9IGFkZHJlc3NpbmcuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvYWRCYWxhbmNlckNhbm9uaWNhbEhvc3RlZFpvbmVJZCA9IHJlc291cmNlLnpvbmVJZDtcbiAgICB0aGlzLmxvYWRCYWxhbmNlckRuc05hbWUgPSByZXNvdXJjZS5kbnNOYW1lO1xuICAgIHRoaXMubG9hZEJhbGFuY2VyRnVsbE5hbWUgPSB0aGlzLnN0YWNrLnNwbGl0QXJuKFxuICAgICAgcmVzb3VyY2UuYXJuLFxuICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgKS5yZXNvdXJjZTtcbiAgICB0aGlzLmxvYWRCYWxhbmNlck5hbWUgPSByZXNvdXJjZS5uYW1lO1xuICAgIHRoaXMubG9hZEJhbGFuY2VyQXJuID0gcmVzb3VyY2UuYXJuO1xuICAgIHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cHMgPSByZXNvdXJjZS5zZWN1cml0eUdyb3VwcztcblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHsgdmFsaWRhdGU6IHRoaXMudmFsaWRhdGVMb2FkQmFsYW5jZXIuYmluZCh0aGlzKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYWNjZXNzIGxvZ2dpbmcgZm9yIHRoaXMgbG9hZCBiYWxhbmNlci5cbiAgICpcbiAgICogQSByZWdpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIHN0YWNrIGNvbnRhaW5pbmcgdGhlIGxvYWQgYmFsYW5jZXI7IHlvdSBjYW5ub3QgZW5hYmxlIGxvZ2dpbmcgb25cbiAgICogZW52aXJvbm1lbnQtYWdub3N0aWMgc3RhY2tzLiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9sYXRlc3QvZ3VpZGUvZW52aXJvbm1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyBsb2dBY2Nlc3NMb2dzKGJ1Y2tldDogczMuSUJ1Y2tldCwgcHJlZml4Pzogc3RyaW5nKSB7XG4gICAgLy8gcHJlZml4ID0gcHJlZml4OyAvLyBvcHRpb25hbCBpbiBURi4uLiB8fCBcIlwiO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwiYWNjZXNzX2xvZ3MuczMuZW5hYmxlZFwiLCBcInRydWVcIik7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJhY2Nlc3NfbG9ncy5zMy5idWNrZXRcIiwgYnVja2V0LmJ1Y2tldE5hbWUudG9TdHJpbmcoKSk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJhY2Nlc3NfbG9ncy5zMy5wcmVmaXhcIiwgcHJlZml4KTtcblxuICAgIGNvbnN0IGxvZ3NEZWxpdmVyeVNlcnZpY2VQcmluY2lwYWwgPSBuZXcgU2VydmljZVByaW5jaXBhbChcbiAgICAgIFwiZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tXCIsXG4gICAgKTtcbiAgICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpQdXRPYmplY3RcIl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFt0aGlzLnJlc291cmNlUG9saWN5UHJpbmNpcGFsKCldLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBidWNrZXQuYXJuRm9yT2JqZWN0cyhcbiAgICAgICAgICAgIGAke3ByZWZpeCA/IHByZWZpeCArIFwiL1wiIDogXCJcIn1BV1NMb2dzLyR7QXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcykuYWNjb3VudH0vKmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiczM6UHV0T2JqZWN0XCJdLFxuICAgICAgICBwcmluY2lwYWxzOiBbbG9nc0RlbGl2ZXJ5U2VydmljZVByaW5jaXBhbF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGJ1Y2tldC5hcm5Gb3JPYmplY3RzKFxuICAgICAgICAgICAgYCR7cHJlZml4ID8gcHJlZml4ICsgXCIvXCIgOiBcIlwifUFXU0xvZ3MvJHt0aGlzLmVudi5hY2NvdW50fS8qYCxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICBjb25kaXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgICAgdmFyaWFibGU6IFwiczM6eC1hbXotYWNsXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImJ1Y2tldC1vd25lci1mdWxsLWNvbnRyb2xcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiczM6R2V0QnVja2V0QWNsXCJdLFxuICAgICAgICBwcmluY2lwYWxzOiBbbG9nc0RlbGl2ZXJ5U2VydmljZVByaW5jaXBhbF0sXG4gICAgICAgIHJlc291cmNlczogW2J1Y2tldC5idWNrZXRBcm5dLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgYnVja2V0J3MgcG9saWN5IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBBTEIgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE2MzMpXG4gICAgLy8gYXQgdGhlIEwxIGxldmVsIHRvIGF2b2lkIGNyZWF0aW5nIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMjc1MjhcbiAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8yNzkyOClcbiAgICBjb25zdCBsYiA9IHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgYXMgdGZMb2FkQmFsYW5jZXIuTGI7XG4gICAgY29uc3QgYnVja2V0UG9saWN5ID0gYnVja2V0LnBvbGljeT8ubm9kZS5kZWZhdWx0Q2hpbGQ7XG4gICAgaWYgKFxuICAgICAgbGIgJiZcbiAgICAgIGJ1Y2tldFBvbGljeSAmJlxuICAgICAgVGVycmFmb3JtUmVzb3VyY2UuaXNUZXJyYWZvcm1SZXNvdXJjZShsYikgJiZcbiAgICAgIFRlcnJhZm9ybVJlc291cmNlLmlzVGVycmFmb3JtUmVzb3VyY2UoYnVja2V0UG9saWN5KVxuICAgICkge1xuICAgICAgbGIubm9kZS5hZGREZXBlbmRlbmN5KGJ1Y2tldFBvbGljeSk7XG4gICAgfVxuICAgIC8vIFRPRE86IFNob3VsZCBwdXRBY2Nlc3NMb2dzIGJlIGhhbmRsZWQgYXMgcGFydCBvZiBwcmVwYXJlU3RhY2sgKGluIHRvVGVycmFmb3JtKCkgaW5zdGVhZCk/XG4gICAgLy8gb25seSBpZiBsYi5hY2Nlc3NMb2dzLmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZD8gKG9yIGJhc2VkIG9uIHRoaXMuYXR0cmlidXRlcz8pXG4gICAgbGIucHV0QWNjZXNzTG9ncyh7XG4gICAgICBlbmFibGVkOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUuYWNjZXNzTG9nc1MzRW5hYmxlZCksXG4gICAgICBidWNrZXQ6IHRoaXMubGF6eVN0cmluZ0F0dHIoQXR0cmlidXRlLmFjY2Vzc0xvZ3NTM0J1Y2tldCksXG4gICAgICBwcmVmaXg6IHRoaXMubGF6eVN0cmluZ0F0dHIoQXR0cmlidXRlLmFjY2Vzc0xvZ3NTM1ByZWZpeCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbm9uLXN0YW5kYXJkIGF0dHJpYnV0ZSBvbiB0aGUgbG9hZCBiYWxhbmNlclxuICAgKlxuICAgKiBVc2UgdGhlIGRlZGljYXRlZCBsb2dBY2Nlc3NMb2dzKCkgbWV0aG9kIGludGVhZCBvZiBzZXRBdHRyaWJ1dGUgaWYgeW91IHdhbnQgdG8gc2V0dXAgYWNjZXNzIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi1sb2FkLWJhbGFuY2Vycy5odG1sI2xvYWQtYmFsYW5jZXItYXR0cmlidXRlc1xuICAgKi9cbiAgcHVibGljIHNldEF0dHJpYnV0ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBsb2FkIGJhbGFuY2VyXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQXR0cmlidXRlKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoa2V5LCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxhenlTdHJpbmdBdHRyKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgcHJvZHVjZTogKCkgPT4gbG9va3VwU3RyaW5nQXR0cmlidXRlKHRoaXMuYXR0cmlidXRlcywga2V5KSxcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgbGF6eUJvb2xBdHRyKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIExhenkuYW55VmFsdWUoe1xuICAgICAgcHJvZHVjZTogKCkgPT4gbG9va3VwQm9vbEF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZXMsIGtleSksXG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGxhenlOdW1iZXJBdHRyKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIExhenkubnVtYmVyVmFsdWUoe1xuICAgICAgcHJvZHVjZTogKCkgPT4gbG9va3VwTnVtYmVyQXR0cmlidXRlKHRoaXMuYXR0cmlidXRlcywga2V5KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVBvbGljeVByaW5jaXBhbCgpOiBpYW0uSVByaW5jaXBhbCB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdGFjay5yZWdpb247XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWdpb24gaXMgcmVxdWlyZWQgdG8gZW5hYmxlIEVMQnYyIGFjY2VzcyBsb2dnaW5nXCIpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGFjY291bnQgPSBSZWdpb25JbmZvLmdldChyZWdpb24pLmVsYnYyQWNjb3VudDtcbiAgICBjb25zdCBhY2NvdW50ID0gZ2V0RWxidjJBY2NvdW50KHJlZ2lvbik7XG4gICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAvLyBOZXcgUmVnaW9ucyB1c2UgYSBzZXJ2aWNlIHByaW5jaXBhbFxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9jbGFzc2ljL2VuYWJsZS1hY2Nlc3MtbG9ncy5odG1sI2F0dGFjaC1idWNrZXQtcG9saWN5XG4gICAgICByZXR1cm4gbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFxuICAgICAgICBcImxvZ2RlbGl2ZXJ5LmVsYXN0aWNsb2FkYmFsYW5jaW5nLmFtYXpvbmF3cy5jb21cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbChhY2NvdW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUxvYWRCYWxhbmNlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci5odG1sI2Nmbi1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLWxvYWRiYWxhbmNlci1uYW1lXG4gICAgY29uc3QgbG9hZEJhbGFuY2VyTmFtZSA9IHRoaXMucGh5c2ljYWxOYW1lO1xuICAgIGlmIChcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQobG9hZEJhbGFuY2VyTmFtZSkgJiZcbiAgICAgIGxvYWRCYWxhbmNlck5hbWUgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgaWYgKGxvYWRCYWxhbmNlck5hbWUubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgcmV0LnB1c2goXG4gICAgICAgICAgYExvYWQgYmFsYW5jZXIgbmFtZTogXCIke2xvYWRCYWxhbmNlck5hbWV9XCIgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDMyIGNoYXJhY3RlcnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChsb2FkQmFsYW5jZXJOYW1lLnN0YXJ0c1dpdGgoXCJpbnRlcm5hbC1cIikpIHtcbiAgICAgICAgcmV0LnB1c2goXG4gICAgICAgICAgYExvYWQgYmFsYW5jZXIgbmFtZTogXCIke2xvYWRCYWxhbmNlck5hbWV9XCIgbXVzdCBub3QgYmVnaW4gd2l0aCBcImludGVybmFsLVwiLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobG9hZEJhbGFuY2VyTmFtZS5zdGFydHNXaXRoKFwiLVwiKSB8fCBsb2FkQmFsYW5jZXJOYW1lLmVuZHNXaXRoKFwiLVwiKSkge1xuICAgICAgICByZXQucHVzaChcbiAgICAgICAgICBgTG9hZCBiYWxhbmNlciBuYW1lOiBcIiR7bG9hZEJhbGFuY2VyTmFtZX1cIiBtdXN0IG5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGh5cGhlbi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlswLTlhLXotXSskL2kudGVzdChsb2FkQmFsYW5jZXJOYW1lKSkge1xuICAgICAgICByZXQucHVzaChcbiAgICAgICAgICBgTG9hZCBiYWxhbmNlciBuYW1lOiBcIiR7bG9hZEJhbGFuY2VyTmFtZX1cIiBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBoeXBoZW5zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIl19