terraconstructs 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/.jsii +104486 -34582
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.d.ts +1 -1
  4. package/lib/aws/aws-construct.js +28 -2
  5. package/lib/aws/aws-stack.d.ts +2 -4
  6. package/lib/aws/aws-stack.js +21 -8
  7. package/lib/aws/aws-tags.d.ts +58 -0
  8. package/lib/aws/aws-tags.js +77 -0
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  13. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  14. package/lib/aws/cloudwatch/alarm.js +1 -1
  15. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  16. package/lib/aws/cloudwatch/dashboard.js +1 -1
  17. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  18. package/lib/aws/cloudwatch/graph.js +8 -8
  19. package/lib/aws/cloudwatch/layout.js +3 -3
  20. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  21. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  22. package/lib/aws/cloudwatch/log-group.js +1 -1
  23. package/lib/aws/cloudwatch/log-query.js +1 -1
  24. package/lib/aws/cloudwatch/log-stream.js +1 -1
  25. package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
  26. package/lib/aws/cloudwatch/metric-filter.js +4 -4
  27. package/lib/aws/cloudwatch/metric.js +2 -2
  28. package/lib/aws/cloudwatch/pattern.js +3 -3
  29. package/lib/aws/cloudwatch/policy.js +1 -1
  30. package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
  31. package/lib/aws/cloudwatch/private/metric-util.js +4 -5
  32. package/lib/aws/cloudwatch/private/object.js +2 -3
  33. package/lib/aws/cloudwatch/private/rendering.js +3 -3
  34. package/lib/aws/cloudwatch/private/statistic.js +6 -7
  35. package/lib/aws/cloudwatch/query-definition.js +2 -2
  36. package/lib/aws/cloudwatch/stats.js +1 -1
  37. package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
  38. package/lib/aws/cloudwatch/subscription-filter.js +4 -4
  39. package/lib/aws/cloudwatch/text.js +1 -1
  40. package/lib/aws/cloudwatch/variable.js +3 -3
  41. package/lib/aws/cloudwatch/widget.d.ts +1 -1
  42. package/lib/aws/cloudwatch/widget.js +4 -4
  43. package/lib/aws/compute/activity.js +3 -2
  44. package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
  45. package/lib/aws/compute/alb/application-listener-action.js +281 -0
  46. package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
  47. package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
  48. package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
  49. package/lib/aws/compute/alb/application-listener-rule.js +220 -0
  50. package/lib/aws/compute/alb/application-listener.d.ts +574 -0
  51. package/lib/aws/compute/alb/application-listener.js +538 -0
  52. package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
  53. package/lib/aws/compute/alb/application-load-balancer.js +780 -0
  54. package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
  55. package/lib/aws/compute/alb/application-target-group.js +427 -0
  56. package/lib/aws/compute/alb/conditions.d.ts +61 -0
  57. package/lib/aws/compute/alb/conditions.js +164 -0
  58. package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
  59. package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
  60. package/lib/aws/compute/alb/trust-store.d.ts +86 -0
  61. package/lib/aws/compute/alb/trust-store.js +79 -0
  62. package/lib/aws/compute/architecture.js +1 -1
  63. package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
  64. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
  65. package/lib/aws/compute/bastion-host.d.ts +172 -0
  66. package/lib/aws/compute/bastion-host.js +114 -0
  67. package/lib/aws/compute/chain.js +1 -1
  68. package/lib/aws/compute/cidr-splits.d.ts +49 -0
  69. package/lib/aws/compute/cidr-splits.js +59 -0
  70. package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
  71. package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
  72. package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
  73. package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
  74. package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
  75. package/lib/aws/compute/client-vpn-endpoint.js +259 -0
  76. package/lib/aws/compute/client-vpn-route.d.ts +67 -0
  77. package/lib/aws/compute/client-vpn-route.js +57 -0
  78. package/lib/aws/compute/condition.js +1 -1
  79. package/lib/aws/compute/connections.d.ts +137 -0
  80. package/lib/aws/compute/connections.js +208 -0
  81. package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
  82. package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
  83. package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
  84. package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
  85. package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
  86. package/lib/aws/compute/ec2-util-v2.js +286 -0
  87. package/lib/aws/compute/ec2-util.d.ts +52 -0
  88. package/lib/aws/compute/ec2-util.js +138 -0
  89. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
  90. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
  91. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
  92. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
  93. package/lib/aws/compute/event-invoke-config.js +1 -1
  94. package/lib/aws/compute/event-source-filter.js +2 -2
  95. package/lib/aws/compute/event-source-mapping.js +1 -1
  96. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  97. package/lib/aws/compute/event-sources/s3.js +1 -1
  98. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  99. package/lib/aws/compute/event-sources/sqs.js +1 -1
  100. package/lib/aws/compute/fields.js +4 -4
  101. package/lib/aws/compute/function-alias.js +1 -1
  102. package/lib/aws/compute/function-base.js +2 -2
  103. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  104. package/lib/aws/compute/function-destinations/function.js +1 -1
  105. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  106. package/lib/aws/compute/function-nodejs.js +1 -1
  107. package/lib/aws/compute/function-url.js +1 -1
  108. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  109. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  110. package/lib/aws/compute/function.d.ts +1 -1
  111. package/lib/aws/compute/function.js +5 -5
  112. package/lib/aws/compute/index-alpha.d.ts +5 -0
  113. package/lib/aws/compute/index-alpha.js +22 -0
  114. package/lib/aws/compute/index.d.ts +60 -0
  115. package/lib/aws/compute/index.js +70 -2
  116. package/lib/aws/compute/instance-types.d.ts +1354 -0
  117. package/lib/aws/compute/instance-types.js +1683 -0
  118. package/lib/aws/compute/instance.d.ts +436 -0
  119. package/lib/aws/compute/instance.js +262 -0
  120. package/lib/aws/compute/ip-addresses.d.ts +249 -0
  121. package/lib/aws/compute/ip-addresses.js +248 -0
  122. package/lib/aws/compute/ipam.d.ts +309 -0
  123. package/lib/aws/compute/ipam.js +306 -0
  124. package/lib/aws/compute/key-pair.d.ts +178 -0
  125. package/lib/aws/compute/key-pair.js +194 -0
  126. package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
  127. package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
  128. package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
  129. package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
  130. package/lib/aws/compute/launch-template.d.ts +540 -0
  131. package/lib/aws/compute/launch-template.js +468 -0
  132. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
  133. package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
  134. package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
  135. package/lib/aws/compute/lb-shared/base-listener.js +181 -0
  136. package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
  137. package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
  138. package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
  139. package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
  140. package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
  141. package/lib/aws/compute/lb-shared/enums.js +301 -0
  142. package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
  143. package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
  144. package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
  145. package/lib/aws/compute/lb-shared/imported.js +27 -0
  146. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
  147. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
  148. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
  149. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
  150. package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
  151. package/lib/aws/compute/lb-shared/listener-action.js +4 -0
  152. package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
  153. package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
  154. package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
  155. package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
  156. package/lib/aws/compute/lb-shared/util.d.ts +113 -0
  157. package/lib/aws/compute/lb-shared/util.js +264 -0
  158. package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
  159. package/lib/aws/compute/lb-targets/alb-target.js +100 -0
  160. package/lib/aws/compute/lb-targets/index.d.ts +4 -0
  161. package/lib/aws/compute/lb-targets/index.js +22 -0
  162. package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
  163. package/lib/aws/compute/lb-targets/instance-target.js +67 -0
  164. package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
  165. package/lib/aws/compute/lb-targets/ip-target.js +79 -0
  166. package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
  167. package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
  168. package/lib/aws/compute/load-balancer.d.ts +336 -0
  169. package/lib/aws/compute/load-balancer.js +287 -0
  170. package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
  171. package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
  172. package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
  173. package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
  174. package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
  175. package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
  176. package/lib/aws/compute/machine-image/common.d.ts +181 -0
  177. package/lib/aws/compute/machine-image/common.js +122 -0
  178. package/lib/aws/compute/machine-image/index.d.ts +5 -0
  179. package/lib/aws/compute/machine-image/index.js +22 -0
  180. package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
  181. package/lib/aws/compute/machine-image/machine-image.js +566 -0
  182. package/lib/aws/compute/machine-image/utils.d.ts +2 -0
  183. package/lib/aws/compute/machine-image/utils.js +17 -0
  184. package/lib/aws/compute/nat.d.ts +325 -0
  185. package/lib/aws/compute/nat.js +455 -0
  186. package/lib/aws/compute/network-acl-types.d.ts +152 -0
  187. package/lib/aws/compute/network-acl-types.js +156 -0
  188. package/lib/aws/compute/network-acl.d.ts +285 -0
  189. package/lib/aws/compute/network-acl.js +207 -0
  190. package/lib/aws/compute/network-util.d.ts +116 -0
  191. package/lib/aws/compute/network-util.js +241 -0
  192. package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
  193. package/lib/aws/compute/nlb/network-listener-action.js +146 -0
  194. package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
  195. package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
  196. package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
  197. package/lib/aws/compute/nlb/network-listener.js +217 -0
  198. package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
  199. package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
  200. package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
  201. package/lib/aws/compute/nlb/network-target-group.js +223 -0
  202. package/lib/aws/compute/peer.d.ts +64 -0
  203. package/lib/aws/compute/peer.js +235 -0
  204. package/lib/aws/compute/placement-group.d.ts +161 -0
  205. package/lib/aws/compute/placement-group.js +133 -0
  206. package/lib/aws/compute/port.d.ts +287 -0
  207. package/lib/aws/compute/port.js +390 -0
  208. package/lib/aws/compute/prefix-list.d.ts +131 -0
  209. package/lib/aws/compute/prefix-list.js +114 -0
  210. package/lib/aws/compute/private/context-stub.d.ts +7 -0
  211. package/lib/aws/compute/private/context-stub.js +43 -0
  212. package/lib/aws/compute/private/ebs-util.d.ts +14 -0
  213. package/lib/aws/compute/private/ebs-util.js +145 -0
  214. package/lib/aws/compute/private/intrinstics.js +2 -1
  215. package/lib/aws/compute/private/json-path.js +8 -8
  216. package/lib/aws/compute/private/util.js +2 -3
  217. package/lib/aws/compute/route.d.ts +547 -0
  218. package/lib/aws/compute/route.js +469 -0
  219. package/lib/aws/compute/security-group.d.ts +414 -0
  220. package/lib/aws/compute/security-group.js +538 -0
  221. package/lib/aws/compute/state-graph.js +1 -1
  222. package/lib/aws/compute/state-machine-fragment.js +1 -1
  223. package/lib/aws/compute/state-machine.d.ts +2 -2
  224. package/lib/aws/compute/state-machine.js +14 -12
  225. package/lib/aws/compute/states/choice.js +1 -1
  226. package/lib/aws/compute/states/custom-state.js +1 -1
  227. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  228. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  229. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  230. package/lib/aws/compute/states/distributed-map.js +1 -1
  231. package/lib/aws/compute/states/fail.js +1 -1
  232. package/lib/aws/compute/states/map-base.js +1 -1
  233. package/lib/aws/compute/states/map.js +1 -1
  234. package/lib/aws/compute/states/parallel.js +1 -1
  235. package/lib/aws/compute/states/pass.js +2 -2
  236. package/lib/aws/compute/states/state.js +5 -5
  237. package/lib/aws/compute/states/succeed.js +1 -1
  238. package/lib/aws/compute/states/task-base.js +2 -2
  239. package/lib/aws/compute/states/task.js +1 -1
  240. package/lib/aws/compute/states/wait.js +2 -2
  241. package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
  242. package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
  243. package/lib/aws/compute/subnet-v2.d.ts +213 -0
  244. package/lib/aws/compute/subnet-v2.js +405 -0
  245. package/lib/aws/compute/subnet.d.ts +37 -0
  246. package/lib/aws/compute/subnet.js +181 -0
  247. package/lib/aws/compute/task-credentials.js +1 -1
  248. package/lib/aws/compute/task-input.js +1 -1
  249. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  250. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  251. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  252. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  253. package/lib/aws/compute/tasks/private/task-utils.js +3 -4
  254. package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
  255. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  256. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  257. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  258. package/lib/aws/compute/types.js +2 -2
  259. package/lib/aws/compute/user-data.d.ts +270 -0
  260. package/lib/aws/compute/user-data.js +487 -0
  261. package/lib/aws/compute/util.d.ts +1 -1
  262. package/lib/aws/compute/util.js +4 -5
  263. package/lib/aws/compute/volume.d.ts +480 -0
  264. package/lib/aws/compute/volume.js +426 -0
  265. package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
  266. package/lib/aws/compute/vpc-endpoint-service.js +90 -0
  267. package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
  268. package/lib/aws/compute/vpc-endpoint.js +811 -0
  269. package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
  270. package/lib/aws/compute/vpc-flow-logs.js +693 -0
  271. package/lib/aws/compute/vpc-lookup.d.ts +73 -0
  272. package/lib/aws/compute/vpc-lookup.js +3 -0
  273. package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
  274. package/lib/aws/compute/vpc-v2-base.js +493 -0
  275. package/lib/aws/compute/vpc-v2.d.ts +385 -0
  276. package/lib/aws/compute/vpc-v2.js +408 -0
  277. package/lib/aws/compute/vpc.d.ts +1448 -0
  278. package/lib/aws/compute/vpc.js +1495 -0
  279. package/lib/aws/compute/vpn.d.ts +443 -0
  280. package/lib/aws/compute/vpn.js +397 -0
  281. package/lib/aws/compute/windows-versions.d.ts +418 -0
  282. package/lib/aws/compute/windows-versions.js +426 -0
  283. package/lib/aws/edge/certificate-base.d.ts +20 -0
  284. package/lib/aws/edge/certificate-base.js +28 -0
  285. package/lib/aws/edge/certificate.d.ts +23 -2
  286. package/lib/aws/edge/certificate.js +54 -4
  287. package/lib/aws/edge/distribution.js +3 -3
  288. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  289. package/lib/aws/edge/dns-record.js +16 -16
  290. package/lib/aws/edge/dns-zone.d.ts +20 -2
  291. package/lib/aws/edge/dns-zone.js +25 -10
  292. package/lib/aws/edge/function.js +2 -2
  293. package/lib/aws/edge/index.d.ts +1 -0
  294. package/lib/aws/edge/index.js +2 -1
  295. package/lib/aws/edge/key-value-store.js +4 -4
  296. package/lib/aws/edge/origin.js +8 -6
  297. package/lib/aws/edge/response-headers-policy.js +1 -1
  298. package/lib/aws/encryption/alias.js +1 -1
  299. package/lib/aws/encryption/key.js +1 -1
  300. package/lib/aws/encryption/via-service-principal.js +1 -1
  301. package/lib/aws/iam/grant.js +2 -2
  302. package/lib/aws/iam/index.d.ts +1 -0
  303. package/lib/aws/iam/index.js +2 -1
  304. package/lib/aws/iam/instance-profile.d.ts +155 -0
  305. package/lib/aws/iam/instance-profile.js +124 -0
  306. package/lib/aws/iam/managed-policy.js +1 -1
  307. package/lib/aws/iam/oidc-provider.js +1 -1
  308. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  309. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  310. package/lib/aws/iam/policy-document.js +1 -1
  311. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  312. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  313. package/lib/aws/iam/policy-statement.js +9 -9
  314. package/lib/aws/iam/policy.js +1 -1
  315. package/lib/aws/iam/principals.js +26 -26
  316. package/lib/aws/iam/private/assume-role-policy.js +2 -3
  317. package/lib/aws/iam/private/comparable-principal.js +2 -3
  318. package/lib/aws/iam/private/immutable-role.d.ts +2 -1
  319. package/lib/aws/iam/private/immutable-role.js +3 -3
  320. package/lib/aws/iam/private/imported-role.d.ts +1 -1
  321. package/lib/aws/iam/private/imported-role.js +3 -3
  322. package/lib/aws/iam/private/merge-statements.js +2 -3
  323. package/lib/aws/iam/private/util.js +4 -4
  324. package/lib/aws/iam/role.js +1 -1
  325. package/lib/aws/iam/saml-provider.d.ts +1 -1
  326. package/lib/aws/iam/saml-provider.js +6 -6
  327. package/lib/aws/iam/unknown-principal.js +1 -1
  328. package/lib/aws/iam/utils.js +2 -3
  329. package/lib/aws/index.d.ts +1 -0
  330. package/lib/aws/index.js +4 -1
  331. package/lib/aws/network/simple-ipv4-vpc.js +5 -5
  332. package/lib/aws/network/subnet-group.js +3 -3
  333. package/lib/aws/network/subnet.d.ts +1 -1
  334. package/lib/aws/network/subnet.js +7 -7
  335. package/lib/aws/notify/archive.js +3 -2
  336. package/lib/aws/notify/connection.js +5 -4
  337. package/lib/aws/notify/event-bus.js +5 -4
  338. package/lib/aws/notify/event-pattern.js +3 -3
  339. package/lib/aws/notify/index.js +3 -1
  340. package/lib/aws/notify/input.js +4 -3
  341. package/lib/aws/notify/kinesis-stream.js +3 -2
  342. package/lib/aws/notify/on-event-options.js +2 -1
  343. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  344. package/lib/aws/notify/queue-config.generated.js +1 -1
  345. package/lib/aws/notify/queue-policy.js +1 -1
  346. package/lib/aws/notify/queue.js +1 -1
  347. package/lib/aws/notify/resource-policy.js +1 -1
  348. package/lib/aws/notify/rule.js +3 -2
  349. package/lib/aws/notify/schedule.js +2 -2
  350. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  351. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  352. package/lib/aws/notify/target.js +2 -1
  353. package/lib/aws/notify/targets/event-bus.js +1 -1
  354. package/lib/aws/notify/targets/function.js +1 -1
  355. package/lib/aws/notify/targets/log-group.js +2 -2
  356. package/lib/aws/notify/targets/sqs.js +1 -1
  357. package/lib/aws/notify/targets/state-machine.js +1 -1
  358. package/lib/aws/notify/targets/util.d.ts +1 -1
  359. package/lib/aws/notify/targets/util.js +10 -11
  360. package/lib/aws/notify/util.js +4 -4
  361. package/lib/aws/provider-config.generated.d.ts +33 -33
  362. package/lib/aws/provider-config.generated.js +1 -1
  363. package/lib/aws/storage/bucket-notifications.js +1 -1
  364. package/lib/aws/storage/bucket-policy.js +1 -1
  365. package/lib/aws/storage/bucket-source.js +1 -1
  366. package/lib/aws/storage/bucket.d.ts +298 -65
  367. package/lib/aws/storage/bucket.js +548 -225
  368. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  369. package/lib/aws/storage/cors-config.generated.js +1 -1
  370. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  371. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  372. package/lib/aws/storage/index.d.ts +1 -0
  373. package/lib/aws/storage/index.js +2 -1
  374. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  375. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  376. package/lib/aws/storage/notification-targets/function.js +6 -6
  377. package/lib/aws/storage/notification-targets/queue.js +1 -1
  378. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  379. package/lib/aws/storage/origin-access-identity.js +5 -4
  380. package/lib/aws/storage/parameter-util.d.ts +12 -0
  381. package/lib/aws/storage/parameter-util.js +65 -0
  382. package/lib/aws/storage/parameter.d.ts +526 -0
  383. package/lib/aws/storage/parameter.js +606 -0
  384. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  386. package/lib/aws/storage/util.d.ts +25 -3
  387. package/lib/aws/storage/util.js +84 -17
  388. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  389. package/lib/aws/storage/website-config.generated.js +1 -1
  390. package/lib/aws/util.js +2 -3
  391. package/lib/construct-base.d.ts +10 -1
  392. package/lib/construct-base.js +9 -6
  393. package/lib/duration.js +1 -1
  394. package/lib/expiration.d.ts +48 -0
  395. package/lib/expiration.js +68 -0
  396. package/lib/helpers-internal/index.d.ts +1 -0
  397. package/lib/helpers-internal/index.js +7 -0
  398. package/lib/index.d.ts +2 -0
  399. package/lib/index.js +3 -1
  400. package/lib/private/md5.d.ts +4 -0
  401. package/lib/private/md5.js +14 -0
  402. package/lib/private/unique-resource-name.js +3 -4
  403. package/lib/size.js +2 -2
  404. package/lib/stack-base.d.ts +4 -23
  405. package/lib/stack-base.js +9 -30
  406. package/lib/terra-func.d.ts +103 -0
  407. package/lib/terra-func.js +170 -0
  408. package/lib/token.js +5 -5
  409. package/package.json +15 -8
  410. package/bun.lockb +0 -0
@@ -0,0 +1,693 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FlowLog = exports.LogFormat = exports.FlowLogMaxAggregationInterval = exports.FlowLogDestination = exports.FlowLogFileFormat = exports.FlowLogResourceType = exports.FlowLogDestinationType = exports.FlowLogTrafficType = 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-ec2/lib/vpc-flow-logs.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const cdktf_1 = require("cdktf");
9
+ const aws_construct_1 = require("../aws-construct");
10
+ const aws_stack_1 = require("../aws-stack");
11
+ // TODO: Use TagManager and tag-aspect instead
12
+ const aws_tags_1 = require("../aws-tags");
13
+ // import { Tags } from "../tag-aspect";
14
+ const logs = require("../cloudwatch");
15
+ const iam = require("../iam");
16
+ const storage = require("../storage");
17
+ /**
18
+ * Name tag constant
19
+ */
20
+ const NAME_TAG = "Name";
21
+ /**
22
+ * The type of VPC traffic to log
23
+ */
24
+ var FlowLogTrafficType;
25
+ (function (FlowLogTrafficType) {
26
+ /**
27
+ * Only log accepts
28
+ */
29
+ FlowLogTrafficType["ACCEPT"] = "ACCEPT";
30
+ /**
31
+ * Log all requests
32
+ */
33
+ FlowLogTrafficType["ALL"] = "ALL";
34
+ /**
35
+ * Only log rejects
36
+ */
37
+ FlowLogTrafficType["REJECT"] = "REJECT";
38
+ })(FlowLogTrafficType || (exports.FlowLogTrafficType = FlowLogTrafficType = {}));
39
+ /**
40
+ * The available destination types for Flow Logs
41
+ */
42
+ var FlowLogDestinationType;
43
+ (function (FlowLogDestinationType) {
44
+ /**
45
+ * Send flow logs to CloudWatch Logs Group
46
+ */
47
+ FlowLogDestinationType["CLOUD_WATCH_LOGS"] = "cloud-watch-logs";
48
+ /**
49
+ * Send flow logs to S3 Bucket
50
+ */
51
+ FlowLogDestinationType["S3"] = "s3";
52
+ /**
53
+ * Send flow logs to Kinesis Data Firehose
54
+ */
55
+ FlowLogDestinationType["KINESIS_DATA_FIREHOSE"] = "kinesis-data-firehose";
56
+ })(FlowLogDestinationType || (exports.FlowLogDestinationType = FlowLogDestinationType = {}));
57
+ /**
58
+ * The type of resource to create the flow log for
59
+ */
60
+ class FlowLogResourceType {
61
+ /**
62
+ * The subnet to attach the Flow Log to
63
+ */
64
+ static fromSubnet(subnet) {
65
+ return {
66
+ resourceType: "Subnet",
67
+ resourceId: subnet.subnetId,
68
+ };
69
+ }
70
+ /**
71
+ * The VPC to attach the Flow Log to
72
+ */
73
+ static fromVpc(vpc) {
74
+ return {
75
+ resourceType: "VPC",
76
+ resourceId: vpc.vpcId,
77
+ };
78
+ }
79
+ /**
80
+ * The Network Interface to attach the Flow Log to
81
+ */
82
+ static fromNetworkInterfaceId(id) {
83
+ return {
84
+ resourceType: "NetworkInterface",
85
+ resourceId: id,
86
+ };
87
+ }
88
+ /**
89
+ * The Transit Gateway to attach the Flow Log to
90
+ */
91
+ static fromTransitGatewayId(id) {
92
+ return {
93
+ resourceType: "TransitGateway",
94
+ resourceId: id,
95
+ };
96
+ }
97
+ /**
98
+ * The Transit Gateway Attachment to attach the Flow Log to
99
+ */
100
+ static fromTransitGatewayAttachmentId(id) {
101
+ return {
102
+ resourceType: "TransitGatewayAttachment",
103
+ resourceId: id,
104
+ };
105
+ }
106
+ }
107
+ exports.FlowLogResourceType = FlowLogResourceType;
108
+ _a = JSII_RTTI_SYMBOL_1;
109
+ FlowLogResourceType[_a] = { fqn: "terraconstructs.aws.compute.FlowLogResourceType", version: "0.0.12" };
110
+ /**
111
+ * The file format for flow logs written to an S3 bucket destination
112
+ */
113
+ var FlowLogFileFormat;
114
+ (function (FlowLogFileFormat) {
115
+ /**
116
+ * File will be written as plain text
117
+ *
118
+ * This is the default value
119
+ */
120
+ FlowLogFileFormat["PLAIN_TEXT"] = "plain-text";
121
+ /**
122
+ * File will be written in parquet format
123
+ */
124
+ FlowLogFileFormat["PARQUET"] = "parquet";
125
+ })(FlowLogFileFormat || (exports.FlowLogFileFormat = FlowLogFileFormat = {}));
126
+ /**
127
+ * The destination type for the flow log
128
+ */
129
+ class FlowLogDestination {
130
+ /**
131
+ * Use CloudWatch logs as the destination
132
+ */
133
+ static toCloudWatchLogs(logGroup, iamRole) {
134
+ return new CloudWatchLogsDestination({
135
+ logDestinationType: FlowLogDestinationType.CLOUD_WATCH_LOGS,
136
+ logGroup,
137
+ iamRole,
138
+ });
139
+ }
140
+ /**
141
+ * Use S3 as the destination
142
+ *
143
+ * @param bucket optional s3 bucket to publish logs to. If one is not provided
144
+ * a default bucket will be created
145
+ * @param keyPrefix optional prefix within the bucket to write logs to
146
+ * @param options additional s3 destination options
147
+ */
148
+ static toS3(bucket, keyPrefix, options) {
149
+ return new S3Destination({
150
+ logDestinationType: FlowLogDestinationType.S3,
151
+ s3Bucket: bucket,
152
+ keyPrefix,
153
+ destinationOptions: options,
154
+ });
155
+ }
156
+ /**
157
+ * Use Kinesis Data Firehose as the destination
158
+ *
159
+ * @param deliveryStreamArn the ARN of Kinesis Data Firehose delivery stream to publish logs to
160
+ */
161
+ static toKinesisDataFirehoseDestination(deliveryStreamArn) {
162
+ return new KinesisDataFirehoseDestination({
163
+ logDestinationType: FlowLogDestinationType.KINESIS_DATA_FIREHOSE,
164
+ deliveryStreamArn,
165
+ });
166
+ }
167
+ }
168
+ exports.FlowLogDestination = FlowLogDestination;
169
+ _b = JSII_RTTI_SYMBOL_1;
170
+ FlowLogDestination[_b] = { fqn: "terraconstructs.aws.compute.FlowLogDestination", version: "0.0.12" };
171
+ /**
172
+ *
173
+ */
174
+ class S3Destination extends FlowLogDestination {
175
+ constructor(props) {
176
+ super();
177
+ this.props = props;
178
+ }
179
+ bind(scope, _flowLog) {
180
+ let s3Bucket;
181
+ if (this.props.s3Bucket === undefined) {
182
+ s3Bucket = new storage.Bucket(scope, "Bucket", {
183
+ // TODO: Ensure flowlog Bucket is retained on delete?
184
+ // removalPolicy: RemovalPolicy.RETAIN,
185
+ });
186
+ }
187
+ else {
188
+ s3Bucket = this.props.s3Bucket;
189
+ }
190
+ // https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-s3.html#flow-logs-s3-permissions
191
+ const stack = aws_stack_1.AwsStack.ofAwsConstruct(scope);
192
+ let keyPrefix = this.props.keyPrefix ?? "";
193
+ if (keyPrefix && !keyPrefix.endsWith("/")) {
194
+ keyPrefix = keyPrefix + "/";
195
+ }
196
+ const prefix = this.props.destinationOptions?.hiveCompatiblePartitions
197
+ ? s3Bucket.arnForObjects(`${keyPrefix}AWSLogs/aws-account-id=${stack.account}/*`)
198
+ : s3Bucket.arnForObjects(`${keyPrefix}AWSLogs/${stack.account}/*`);
199
+ s3Bucket.addToResourcePolicy(new iam.PolicyStatement({
200
+ effect: iam.Effect.ALLOW,
201
+ principals: [new iam.ServicePrincipal("delivery.logs.amazonaws.com")],
202
+ resources: [prefix],
203
+ actions: ["s3:PutObject"],
204
+ condition: [
205
+ {
206
+ test: "StringEquals",
207
+ variable: "s3:x-amz-acl",
208
+ values: ["bucket-owner-full-control"],
209
+ },
210
+ {
211
+ test: "StringEquals",
212
+ variable: "aws:SourceAccount",
213
+ values: [stack.account],
214
+ },
215
+ {
216
+ test: "ArnLike",
217
+ variable: "aws:SourceArn",
218
+ values: [
219
+ stack.formatArn({
220
+ service: "logs",
221
+ resource: "*",
222
+ }),
223
+ ],
224
+ },
225
+ ],
226
+ }));
227
+ s3Bucket.addToResourcePolicy(new iam.PolicyStatement({
228
+ effect: iam.Effect.ALLOW,
229
+ principals: [new iam.ServicePrincipal("delivery.logs.amazonaws.com")],
230
+ resources: [s3Bucket.bucketArn],
231
+ actions: ["s3:GetBucketAcl", "s3:ListBucket"],
232
+ condition: [
233
+ {
234
+ test: "StringEquals",
235
+ variable: "aws:SourceAccount",
236
+ values: [stack.account],
237
+ },
238
+ {
239
+ test: "ArnLike",
240
+ variable: "aws:SourceArn",
241
+ values: [
242
+ stack.formatArn({
243
+ service: "logs",
244
+ resource: "*",
245
+ }),
246
+ ],
247
+ },
248
+ ],
249
+ }));
250
+ return {
251
+ logDestinationType: FlowLogDestinationType.S3,
252
+ s3Bucket,
253
+ keyPrefix: this.props.keyPrefix,
254
+ destinationOptions: this.props.destinationOptions?.fileFormat ||
255
+ this.props.destinationOptions?.perHourPartition ||
256
+ this.props.destinationOptions?.hiveCompatiblePartitions
257
+ ? {
258
+ fileFormat: this.props.destinationOptions.fileFormat ??
259
+ FlowLogFileFormat.PLAIN_TEXT,
260
+ perHourPartition: this.props.destinationOptions.perHourPartition ?? false,
261
+ hiveCompatiblePartitions: this.props.destinationOptions.hiveCompatiblePartitions ?? false,
262
+ }
263
+ : undefined,
264
+ };
265
+ }
266
+ }
267
+ /**
268
+ *
269
+ */
270
+ class CloudWatchLogsDestination extends FlowLogDestination {
271
+ constructor(props) {
272
+ super();
273
+ this.props = props;
274
+ }
275
+ bind(scope, _flowLog) {
276
+ let iamRole;
277
+ let logGroup;
278
+ if (this.props.iamRole === undefined) {
279
+ iamRole = new iam.Role(scope, "IAMRole", {
280
+ roleName: aws_stack_1.AwsStack.uniqueId(scope), //PhysicalName.GENERATE_IF_NEEDED,
281
+ assumedBy: new iam.ServicePrincipal("vpc-flow-logs.amazonaws.com"),
282
+ });
283
+ }
284
+ else {
285
+ iamRole = this.props.iamRole;
286
+ }
287
+ if (this.props.logGroup === undefined) {
288
+ logGroup = new logs.LogGroup(scope, "LogGroup");
289
+ }
290
+ else {
291
+ logGroup = this.props.logGroup;
292
+ }
293
+ iamRole.addToPrincipalPolicy(new iam.PolicyStatement({
294
+ actions: [
295
+ "logs:CreateLogStream",
296
+ "logs:PutLogEvents",
297
+ "logs:DescribeLogStreams",
298
+ ],
299
+ effect: iam.Effect.ALLOW,
300
+ resources: [logGroup.logGroupArn],
301
+ }));
302
+ iamRole.addToPrincipalPolicy(new iam.PolicyStatement({
303
+ actions: ["iam:PassRole"],
304
+ effect: iam.Effect.ALLOW,
305
+ resources: [iamRole.roleArn],
306
+ }));
307
+ return {
308
+ logDestinationType: FlowLogDestinationType.CLOUD_WATCH_LOGS,
309
+ logGroup,
310
+ iamRole,
311
+ };
312
+ }
313
+ }
314
+ /**
315
+ *
316
+ */
317
+ class KinesisDataFirehoseDestination extends FlowLogDestination {
318
+ constructor(props) {
319
+ super();
320
+ this.props = props;
321
+ }
322
+ bind(_scope, _flowLog) {
323
+ if (this.props.deliveryStreamArn === undefined) {
324
+ throw new Error("deliveryStreamArn is required");
325
+ }
326
+ const deliveryStreamArn = this.props.deliveryStreamArn;
327
+ return {
328
+ logDestinationType: FlowLogDestinationType.KINESIS_DATA_FIREHOSE,
329
+ deliveryStreamArn,
330
+ };
331
+ }
332
+ }
333
+ /**
334
+ * The maximum interval of time during which a flow of packets
335
+ * is captured and aggregated into a flow log record.
336
+ *
337
+ */
338
+ var FlowLogMaxAggregationInterval;
339
+ (function (FlowLogMaxAggregationInterval) {
340
+ /**
341
+ * 1 minute (60 seconds)
342
+ */
343
+ FlowLogMaxAggregationInterval[FlowLogMaxAggregationInterval["ONE_MINUTE"] = 60] = "ONE_MINUTE";
344
+ /**
345
+ * 10 minutes (600 seconds)
346
+ */
347
+ FlowLogMaxAggregationInterval[FlowLogMaxAggregationInterval["TEN_MINUTES"] = 600] = "TEN_MINUTES";
348
+ })(FlowLogMaxAggregationInterval || (exports.FlowLogMaxAggregationInterval = FlowLogMaxAggregationInterval = {}));
349
+ /**
350
+ * The following table describes all of the available fields for a flow log record.
351
+ */
352
+ class LogFormat {
353
+ /**
354
+ * A custom format string.
355
+ *
356
+ * Gives full control over the format string fragment.
357
+ */
358
+ static custom(formatString) {
359
+ return new LogFormat(formatString);
360
+ }
361
+ /**
362
+ * A custom field name.
363
+ *
364
+ * If there is no ready-made constant for a new field yet, you can use this.
365
+ * The field name will automatically be wrapped in `${ ... }`.
366
+ */
367
+ static field(field) {
368
+ return new LogFormat(`\${${field}}`);
369
+ }
370
+ constructor(value) {
371
+ this.value = value;
372
+ }
373
+ }
374
+ exports.LogFormat = LogFormat;
375
+ _c = JSII_RTTI_SYMBOL_1;
376
+ LogFormat[_c] = { fqn: "terraconstructs.aws.compute.LogFormat", version: "0.0.12" };
377
+ /**
378
+ * The VPC Flow Logs version.
379
+ */
380
+ LogFormat.VERSION = LogFormat.field("version");
381
+ /**
382
+ * The AWS account ID of the owner of the source network interface for which traffic is recorded.
383
+ */
384
+ LogFormat.ACCOUNT_ID = LogFormat.field("account-id");
385
+ /**
386
+ * The ID of the network interface for which the traffic is recorded.
387
+ */
388
+ LogFormat.INTERFACE_ID = LogFormat.field("interface-id");
389
+ /**
390
+ * The source address for incoming traffic, or the IPv4 or IPv6 address of the network interface
391
+ * for outgoing traffic on the network interface.
392
+ */
393
+ LogFormat.SRC_ADDR = LogFormat.field("srcaddr");
394
+ /**
395
+ * The destination address for outgoing traffic, or the IPv4 or IPv6 address of the network interface
396
+ * for incoming traffic on the network interface.
397
+ */
398
+ LogFormat.DST_ADDR = LogFormat.field("dstaddr");
399
+ /**
400
+ * The source port of the traffic.
401
+ */
402
+ LogFormat.SRC_PORT = LogFormat.field("srcport");
403
+ /**
404
+ * The destination port of the traffic.
405
+ */
406
+ LogFormat.DST_PORT = LogFormat.field("dstport");
407
+ /**
408
+ * The IANA protocol number of the traffic.
409
+ */
410
+ LogFormat.PROTOCOL = LogFormat.field("protocol");
411
+ /**
412
+ * The number of packets transferred during the flow.
413
+ */
414
+ LogFormat.PACKETS = LogFormat.field("packets");
415
+ /**
416
+ * The number of bytes transferred during the flow.
417
+ */
418
+ LogFormat.BYTES = LogFormat.field("bytes");
419
+ /**
420
+ * The time, in Unix seconds, when the first packet of the flow was received within
421
+ * the aggregation interval.
422
+ *
423
+ * This might be up to 60 seconds after the packet was transmitted or received on
424
+ * the network interface.
425
+ */
426
+ LogFormat.START_TIMESTAMP = LogFormat.field("start");
427
+ /**
428
+ * The time, in Unix seconds, when the last packet of the flow was received within
429
+ * the aggregation interval.
430
+ *
431
+ * This might be up to 60 seconds after the packet was transmitted or received on
432
+ * the network interface.
433
+ */
434
+ LogFormat.END_TIMESTAMP = LogFormat.field("end");
435
+ /**
436
+ * The action that is associated with the traffic.
437
+ */
438
+ LogFormat.ACTION = LogFormat.field("action");
439
+ /**
440
+ * The logging status of the flow log.
441
+ */
442
+ LogFormat.LOG_STATUS = LogFormat.field("log-status");
443
+ /**
444
+ * The ID of the VPC that contains the network interface for which the traffic is recorded.
445
+ */
446
+ LogFormat.VPC_ID = LogFormat.field("vpc-id");
447
+ /**
448
+ * The ID of the subnet that contains the network interface for which the traffic is recorded.
449
+ */
450
+ LogFormat.SUBNET_ID = LogFormat.field("subnet-id");
451
+ /**
452
+ * The ID of the instance that's associated with network interface for which the traffic is
453
+ * recorded, if the instance is owned by you.
454
+ *
455
+ * Returns a '-' symbol for a requester-managed network interface; for example, the
456
+ * network interface for a NAT gateway
457
+ */
458
+ LogFormat.INSTANCE_ID = LogFormat.field("instance-id");
459
+ /**
460
+ * The bitmask value for TCP flags.
461
+ *
462
+ * - FIN -- 1
463
+ * - SYN -- 2
464
+ * - RST -- 4
465
+ * - SYN-ACK -- 18
466
+ *
467
+ * If no supported flags are recorded, the TCP flag value is 0.
468
+ *
469
+ * TCP flags can be OR-ed during the aggregation interval. For short connections,
470
+ * the flags might be set on the same line in the flow log record, for example,
471
+ * 19 for SYN-ACK and FIN, and 3 for SYN and FIN.
472
+ */
473
+ LogFormat.TCP_FLAGS = LogFormat.field("tcp-flags");
474
+ /**
475
+ * The type of traffic.
476
+ *
477
+ * The possible values are IPv4, IPv6, or EFA.
478
+ */
479
+ LogFormat.TRAFFIC_TYPE = LogFormat.field("type");
480
+ /**
481
+ * The packet-level (original) source IP address of the traffic.
482
+ */
483
+ LogFormat.PKT_SRC_ADDR = LogFormat.field("pkt-srcaddr");
484
+ /**
485
+ * The packet-level (original) destination IP address for the traffic.
486
+ */
487
+ LogFormat.PKT_DST_ADDR = LogFormat.field("pkt-dstaddr");
488
+ /**
489
+ * The Region that contains the network interface for which traffic is recorded.
490
+ */
491
+ LogFormat.REGION = LogFormat.field("region");
492
+ /**
493
+ * The ID of the Availability Zone that contains the network interface for which traffic is recorded.
494
+ */
495
+ LogFormat.AZ_ID = LogFormat.field("az-id");
496
+ /**
497
+ * The type of sublocation that's returned in the sublocation-id field.
498
+ */
499
+ LogFormat.SUBLOCATION_TYPE = LogFormat.field("sublocation-type");
500
+ /**
501
+ * The ID of the sublocation that contains the network interface for which traffic is recorded.
502
+ */
503
+ LogFormat.SUBLOCATION_ID = LogFormat.field("sublocation-id");
504
+ /**
505
+ * The name of the subset of IP address ranges for the pkt-srcaddr field,
506
+ * if the source IP address is for an AWS service.
507
+ */
508
+ LogFormat.PKT_SRC_AWS_SERVICE = LogFormat.field("pkt-src-aws-service");
509
+ /**
510
+ * The name of the subset of IP address ranges for the pkt-dstaddr field,
511
+ * if the destination IP address is for an AWS service.
512
+ */
513
+ LogFormat.PKT_DST_AWS_SERVICE = LogFormat.field("pkt-dst-aws-service");
514
+ /**
515
+ * The direction of the flow with respect to the interface where traffic is captured.
516
+ */
517
+ LogFormat.FLOW_DIRECTION = LogFormat.field("flow-direction");
518
+ /**
519
+ * The path that egress traffic takes to the destination.
520
+ */
521
+ LogFormat.TRAFFIC_PATH = LogFormat.field("traffic-path");
522
+ /**
523
+ * AWS Resource Name (ARN) of the ECS cluster if the traffic is from a running ECS task.
524
+ */
525
+ LogFormat.ECS_CLUSTER_ARN = LogFormat.field("ecs-cluster-arn");
526
+ /**
527
+ * Name of the ECS cluster if the traffic is from a running ECS task.
528
+ */
529
+ LogFormat.ECS_CLUSTER_NAME = LogFormat.field("ecs-cluster-name");
530
+ /**
531
+ * ARN of the ECS container instance if the traffic is from a running ECS task on an EC2 instance.
532
+ */
533
+ LogFormat.ECS_CONTAINER_INSTANCE_ARN = LogFormat.field("ecs-container-instance-arn");
534
+ /**
535
+ * ID of the ECS container instance if the traffic is from a running ECS task on an EC2 instance.
536
+ */
537
+ LogFormat.ECS_CONTAINER_INSTANCE_ID = LogFormat.field("ecs-container-instance-id");
538
+ /**
539
+ * Docker runtime ID of the container if the traffic is from a running ECS task.
540
+ * If there is one container or more in the ECS task, this will be the docker runtime ID of the first container.
541
+ */
542
+ LogFormat.ECS_CONTAINER_ID = LogFormat.field("ecs-container-id");
543
+ /**
544
+ * Docker runtime ID of the container if the traffic is from a running ECS task.
545
+ * If there is more than one container in the ECS task, this will be the Docker runtime ID of the second container.
546
+ */
547
+ LogFormat.ECS_SECOND_CONTAINER_ID = LogFormat.field("ecs-second-container-id");
548
+ /**
549
+ * Name of the ECS service if the traffic is from a running ECS task and the ECS task is started by an ECS service.
550
+ */
551
+ LogFormat.ECS_SERVICE_NAME = LogFormat.field("ecs-service-name");
552
+ /**
553
+ * ARN of the ECS task definition if the traffic is from a running ECS task.
554
+ */
555
+ LogFormat.ECS_TASK_DEFINITION_ARN = LogFormat.field("ecs-task-definition-arn");
556
+ /**
557
+ * ARN of the ECS task if the traffic is from a running ECS task.
558
+ */
559
+ LogFormat.ECS_TASK_ARN = LogFormat.field("ecs-task-arn");
560
+ /**
561
+ * ID of the ECS task if the traffic is from a running ECS task.
562
+ */
563
+ LogFormat.ECS_TASK_ID = LogFormat.field("ecs-task-id");
564
+ /**
565
+ * The default format.
566
+ */
567
+ LogFormat.ALL_DEFAULT_FIELDS = new LogFormat("${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}");
568
+ /**
569
+ * The base class for a Flow Log
570
+ */
571
+ class FlowLogBase extends aws_construct_1.AwsConstructBase {
572
+ get flowLogOutputs() {
573
+ return {
574
+ flowLogId: this.flowLogId,
575
+ };
576
+ }
577
+ get outputs() {
578
+ return this.flowLogOutputs;
579
+ }
580
+ }
581
+ /**
582
+ * A VPC flow log.
583
+ * @resource AWS::EC2::FlowLog
584
+ */
585
+ class FlowLog extends FlowLogBase {
586
+ /**
587
+ * Import a Flow Log by it's Id
588
+ */
589
+ static fromFlowLogId(scope, id, flowLogId) {
590
+ class Import extends FlowLogBase {
591
+ constructor() {
592
+ super(...arguments);
593
+ this.flowLogId = flowLogId;
594
+ }
595
+ }
596
+ return new Import(scope, id);
597
+ }
598
+ constructor(scope, id, props) {
599
+ super(scope, id);
600
+ const destination = props.destination || FlowLogDestination.toCloudWatchLogs();
601
+ const destinationConfig = destination.bind(this, this);
602
+ this.logGroup = destinationConfig.logGroup;
603
+ this.bucket = destinationConfig.s3Bucket;
604
+ this.iamRole = destinationConfig.iamRole;
605
+ this.keyPrefix = destinationConfig.keyPrefix;
606
+ this.deliveryStreamArn = destinationConfig.deliveryStreamArn;
607
+ aws_tags_1.Tags.of(this).add(NAME_TAG, props.flowLogName || this.node.path);
608
+ let logDestination = undefined;
609
+ if (this.bucket) {
610
+ logDestination = this.keyPrefix
611
+ ? this.bucket.arnForObjects(this.keyPrefix)
612
+ : this.bucket.bucketArn;
613
+ }
614
+ if (this.deliveryStreamArn) {
615
+ logDestination = this.deliveryStreamArn;
616
+ }
617
+ let customLogFormat = undefined;
618
+ if (props.logFormat) {
619
+ customLogFormat = props.logFormat
620
+ .map((elm) => {
621
+ return elm.value;
622
+ })
623
+ .join(" ");
624
+ }
625
+ let trafficType = props.trafficType ?? FlowLogTrafficType.ALL;
626
+ if (props.resourceType.resourceType === "TransitGateway" ||
627
+ props.resourceType.resourceType === "TransitGatewayAttachment") {
628
+ if (props.trafficType) {
629
+ throw new Error("trafficType is not supported for Transit Gateway and Transit Gateway Attachment");
630
+ }
631
+ if (props.maxAggregationInterval &&
632
+ props.maxAggregationInterval !==
633
+ FlowLogMaxAggregationInterval.ONE_MINUTE) {
634
+ throw new Error("maxAggregationInterval must be set to ONE_MINUTE for Transit Gateway and Transit Gateway Attachment");
635
+ }
636
+ trafficType = undefined;
637
+ }
638
+ // convert AWSCC -> AWS resourceIdProps
639
+ // TODO: Adopt AWSCC
640
+ let resourceIdProps;
641
+ switch (props.resourceType.resourceType) {
642
+ case "NetworkInterface":
643
+ resourceIdProps = { eniId: props.resourceType.resourceId };
644
+ break;
645
+ case "Subnet":
646
+ resourceIdProps = { subnetId: props.resourceType.resourceId };
647
+ break;
648
+ case "TransitGateway":
649
+ resourceIdProps = { transitGatewayId: props.resourceType.resourceId };
650
+ break;
651
+ case "TransitGatewayAttachment":
652
+ resourceIdProps = {
653
+ transitGatewayAttachmentId: props.resourceType.resourceId,
654
+ };
655
+ break;
656
+ case "VPC":
657
+ resourceIdProps = { vpcId: props.resourceType.resourceId };
658
+ break;
659
+ default:
660
+ throw new Error("Invalid resource type: " + props.resourceType);
661
+ }
662
+ this.resource = new provider_aws_1.flowLog.FlowLog(this, "Resource", {
663
+ destinationOptions: destinationConfig.destinationOptions,
664
+ iamRoleArn: this.iamRole ? this.iamRole.roleArn : undefined,
665
+ logDestinationType: destinationConfig.logDestinationType,
666
+ logGroupName: this.logGroup ? this.logGroup.logGroupName : undefined,
667
+ maxAggregationInterval: props.maxAggregationInterval,
668
+ id: props.resourceType.resourceId,
669
+ trafficType,
670
+ logFormat: customLogFormat,
671
+ logDestination,
672
+ ...resourceIdProps,
673
+ });
674
+ // VPC service implicitly tries to create a bucket policy when adding a vpc flow log.
675
+ // To avoid the race condition, we add an explicit dependency here.
676
+ if (this.bucket?.policy?.node.defaultChild instanceof cdktf_1.TerraformResource) {
677
+ this.resource.node.addDependency(this.bucket?.policy.node.defaultChild);
678
+ }
679
+ // TODO: we must remove a flow log configuration first before deleting objects.
680
+ // TODO: S3 Bucket object removal custom resource?
681
+ // const deleteObjects = this.bucket?.node.tryFindChild(
682
+ // "AutoDeleteObjectsCustomResource",
683
+ // )?.node.defaultChild;
684
+ // if (deleteObjects instanceof TerraformResource) {
685
+ // resource.node.addDependency(deleteObjects);
686
+ // }
687
+ this.flowLogId = this.resource.id;
688
+ }
689
+ }
690
+ exports.FlowLog = FlowLog;
691
+ _d = JSII_RTTI_SYMBOL_1;
692
+ FlowLog[_d] = { fqn: "terraconstructs.aws.compute.FlowLog", version: "0.0.12" };
693
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLWZsb3ctbG9ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS92cGMtZmxvdy1sb2dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUdBQWlHO0FBRWpHLHNEQUE4QztBQUM5QyxpQ0FBMEM7QUFHMUMsb0RBQW1FO0FBQ25FLDRDQUF3QztBQUN4Qyw4Q0FBOEM7QUFDOUMsMENBQW1DO0FBQ25DLHdDQUF3QztBQUN4QyxzQ0FBc0M7QUFDdEMsOEJBQThCO0FBQzlCLHNDQUFzQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFXLE1BQU0sQ0FBQztBQTZCaEM7O0dBRUc7QUFDSCxJQUFZLGtCQWVYO0FBZkQsV0FBWSxrQkFBa0I7SUFDNUI7O09BRUc7SUFDSCx1Q0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILGlDQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHVDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFmVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQWU3QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxzQkFlWDtBQWZELFdBQVksc0JBQXNCO0lBQ2hDOztPQUVHO0lBQ0gsK0RBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxtQ0FBUyxDQUFBO0lBRVQ7O09BRUc7SUFDSCx5RUFBK0MsQ0FBQTtBQUNqRCxDQUFDLEVBZlcsc0JBQXNCLHNDQUF0QixzQkFBc0IsUUFlakM7QUFFRDs7R0FFRztBQUNILE1BQXNCLG1CQUFtQjtJQUN2Qzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBZTtRQUN0QyxPQUFPO1lBQ0wsWUFBWSxFQUFFLFFBQVE7WUFDdEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQVM7UUFDN0IsT0FBTztZQUNMLFlBQVksRUFBRSxLQUFLO1lBQ25C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QUNsRCx3REFBd0Q7UUFDeEQsdUNBQXVDO1FBQ3ZDLHdCQUF3QjtRQUN4QixvREFBb0Q7UUFDcEQsZ0RBQWdEO1FBQ2hELElBQUk7UUFFSixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7O0FBcktILDBCQXNLQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE3NS4xL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1lYzIvbGliL3ZwYy1mbG93LWxvZ3MudHNcblxuaW1wb3J0IHsgZmxvd0xvZyB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1SZXNvdXJjZSB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElTdWJuZXQsIElWcGMgfSBmcm9tIFwiLi92cGNcIjtcbmltcG9ydCB7IElBd3NDb25zdHJ1Y3QsIEF3c0NvbnN0cnVjdEJhc2UgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG4vLyBUT0RPOiBVc2UgVGFnTWFuYWdlciBhbmQgdGFnLWFzcGVjdCBpbnN0ZWFkXG5pbXBvcnQgeyBUYWdzIH0gZnJvbSBcIi4uL2F3cy10YWdzXCI7XG4vLyBpbXBvcnQgeyBUYWdzIH0gZnJvbSBcIi4uL3RhZy1hc3BlY3RcIjtcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcIi4uL2Nsb3Vkd2F0Y2hcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbi8qKlxuICogTmFtZSB0YWcgY29uc3RhbnRcbiAqL1xuY29uc3QgTkFNRV9UQUc6IHN0cmluZyA9IFwiTmFtZVwiO1xuXG4vKipcbiAqIE91dHB1dHMgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIG91dHB1dCB2aWEgdGhlIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0xvZ091dHB1dHMge1xuICAvKipcbiAgICogVGhlIElkIG9mIHRoZSBWUEMgRmxvdyBMb2dcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd0xvZ0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBGbG93TG9nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZsb3dMb2cgZXh0ZW5kcyBJQXdzQ29uc3RydWN0IHtcbiAgLyoqIFN0cm9uZ2x5IHR5cGVkIG91dHB1dHMgKi9cbiAgcmVhZG9ubHkgZmxvd0xvZ091dHB1dHM6IEZsb3dMb2dPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBUaGUgSWQgb2YgdGhlIFZQQyBGbG93IExvZ1xuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmbG93TG9nSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBWUEMgdHJhZmZpYyB0byBsb2dcbiAqL1xuZXhwb3J0IGVudW0gRmxvd0xvZ1RyYWZmaWNUeXBlIHtcbiAgLyoqXG4gICAqIE9ubHkgbG9nIGFjY2VwdHNcbiAgICovXG4gIEFDQ0VQVCA9IFwiQUNDRVBUXCIsXG5cbiAgLyoqXG4gICAqIExvZyBhbGwgcmVxdWVzdHNcbiAgICovXG4gIEFMTCA9IFwiQUxMXCIsXG5cbiAgLyoqXG4gICAqIE9ubHkgbG9nIHJlamVjdHNcbiAgICovXG4gIFJFSkVDVCA9IFwiUkVKRUNUXCIsXG59XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBkZXN0aW5hdGlvbiB0eXBlcyBmb3IgRmxvdyBMb2dzXG4gKi9cbmV4cG9ydCBlbnVtIEZsb3dMb2dEZXN0aW5hdGlvblR5cGUge1xuICAvKipcbiAgICogU2VuZCBmbG93IGxvZ3MgdG8gQ2xvdWRXYXRjaCBMb2dzIEdyb3VwXG4gICAqL1xuICBDTE9VRF9XQVRDSF9MT0dTID0gXCJjbG91ZC13YXRjaC1sb2dzXCIsXG5cbiAgLyoqXG4gICAqIFNlbmQgZmxvdyBsb2dzIHRvIFMzIEJ1Y2tldFxuICAgKi9cbiAgUzMgPSBcInMzXCIsXG5cbiAgLyoqXG4gICAqIFNlbmQgZmxvdyBsb2dzIHRvIEtpbmVzaXMgRGF0YSBGaXJlaG9zZVxuICAgKi9cbiAgS0lORVNJU19EQVRBX0ZJUkVIT1NFID0gXCJraW5lc2lzLWRhdGEtZmlyZWhvc2VcIixcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiByZXNvdXJjZSB0byBjcmVhdGUgdGhlIGZsb3cgbG9nIGZvclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmxvd0xvZ1Jlc291cmNlVHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgc3VibmV0IHRvIGF0dGFjaCB0aGUgRmxvdyBMb2cgdG9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN1Ym5ldChzdWJuZXQ6IElTdWJuZXQpOiBGbG93TG9nUmVzb3VyY2VUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIlN1Ym5ldFwiLFxuICAgICAgcmVzb3VyY2VJZDogc3VibmV0LnN1Ym5ldElkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFZQQyB0byBhdHRhY2ggdGhlIEZsb3cgTG9nIHRvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21WcGModnBjOiBJVnBjKTogRmxvd0xvZ1Jlc291cmNlVHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc291cmNlVHlwZTogXCJWUENcIixcbiAgICAgIHJlc291cmNlSWQ6IHZwYy52cGNJZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBOZXR3b3JrIEludGVyZmFjZSB0byBhdHRhY2ggdGhlIEZsb3cgTG9nIHRvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21OZXR3b3JrSW50ZXJmYWNlSWQoaWQ6IHN0cmluZyk6IEZsb3dMb2dSZXNvdXJjZVR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiTmV0d29ya0ludGVyZmFjZVwiLFxuICAgICAgcmVzb3VyY2VJZDogaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgVHJhbnNpdCBHYXRld2F5IHRvIGF0dGFjaCB0aGUgRmxvdyBMb2cgdG9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRyYW5zaXRHYXRld2F5SWQoaWQ6IHN0cmluZyk6IEZsb3dMb2dSZXNvdXJjZVR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiVHJhbnNpdEdhdGV3YXlcIixcbiAgICAgIHJlc291cmNlSWQ6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFRyYW5zaXQgR2F0ZXdheSBBdHRhY2htZW50IHRvIGF0dGFjaCB0aGUgRmxvdyBMb2cgdG9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRyYW5zaXRHYXRld2F5QXR0YWNobWVudElkKFxuICAgIGlkOiBzdHJpbmcsXG4gICk6IEZsb3dMb2dSZXNvdXJjZVR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiVHJhbnNpdEdhdGV3YXlBdHRhY2htZW50XCIsXG4gICAgICByZXNvdXJjZUlkOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJlc291cmNlIHRvIGF0dGFjaCBhIGZsb3cgbG9nIHRvLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlc291cmNlVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSWQgb2YgdGhlIHJlc291cmNlIHRoYXQgdGhlIGZsb3cgbG9nIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZXNvdXJjZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGUgZm9ybWF0IGZvciBmbG93IGxvZ3Mgd3JpdHRlbiB0byBhbiBTMyBidWNrZXQgZGVzdGluYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gRmxvd0xvZ0ZpbGVGb3JtYXQge1xuICAvKipcbiAgICogRmlsZSB3aWxsIGJlIHdyaXR0ZW4gYXMgcGxhaW4gdGV4dFxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqL1xuICBQTEFJTl9URVhUID0gXCJwbGFpbi10ZXh0XCIsXG5cbiAgLyoqXG4gICAqIEZpbGUgd2lsbCBiZSB3cml0dGVuIGluIHBhcnF1ZXQgZm9ybWF0XG4gICAqL1xuICBQQVJRVUVUID0gXCJwYXJxdWV0XCIsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igd3JpdGluZyBsb2dzIHRvIGEgUzMgZGVzdGluYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM0Rlc3RpbmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2UgSGl2ZS1jb21wYXRpYmxlIHByZWZpeGVzIGZvciBmbG93IGxvZ3NcbiAgICogc3RvcmVkIGluIEFtYXpvbiBTM1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaGl2ZUNvbXBhdGlibGVQYXJ0aXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBmb3IgdGhlIGZsb3cgbG9nXG4gICAqXG4gICAqIEBkZWZhdWx0IEZsb3dMb2dGaWxlRm9ybWF0LlBMQUlOX1RFWFRcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVGb3JtYXQ/OiBGbG93TG9nRmlsZUZvcm1hdDtcblxuICAvKipcbiAgICogUGFydGl0aW9uIHRoZSBmbG93IGxvZyBwZXIgaG91clxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcGVySG91clBhcnRpdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHR5cGUgZm9yIHRoZSBmbG93IGxvZ1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmxvd0xvZ0Rlc3RpbmF0aW9uIHtcbiAgLyoqXG4gICAqIFVzZSBDbG91ZFdhdGNoIGxvZ3MgYXMgdGhlIGRlc3RpbmF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRvQ2xvdWRXYXRjaExvZ3MoXG4gICAgbG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cCxcbiAgICBpYW1Sb2xlPzogaWFtLklSb2xlLFxuICApOiBGbG93TG9nRGVzdGluYXRpb24ge1xuICAgIHJldHVybiBuZXcgQ2xvdWRXYXRjaExvZ3NEZXN0aW5hdGlvbih7XG4gICAgICBsb2dEZXN0aW5hdGlvblR5cGU6IEZsb3dMb2dEZXN0aW5hdGlvblR5cGUuQ0xPVURfV0FUQ0hfTE9HUyxcbiAgICAgIGxvZ0dyb3VwLFxuICAgICAgaWFtUm9sZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgUzMgYXMgdGhlIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBidWNrZXQgb3B0aW9uYWwgczMgYnVja2V0IHRvIHB1Ymxpc2ggbG9ncyB0by4gSWYgb25lIGlzIG5vdCBwcm92aWRlZFxuICAgKiBhIGRlZmF1bHQgYnVja2V0IHdpbGwgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0ga2V5UHJlZml4IG9wdGlvbmFsIHByZWZpeCB3aXRoaW4gdGhlIGJ1Y2tldCB0byB3cml0ZSBsb2dzIHRvXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgczMgZGVzdGluYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0b1MzKFxuICAgIGJ1Y2tldD86IHN0b3JhZ2UuSUJ1Y2tldCxcbiAgICBrZXlQcmVmaXg/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFMzRGVzdGluYXRpb25PcHRpb25zLFxuICApOiBGbG93TG9nRGVzdGluYXRpb24ge1xuICAgIHJldHVybiBuZXcgUzNEZXN0aW5hdGlvbih7XG4gICAgICBsb2dEZXN0aW5hdGlvblR5cGU6IEZsb3dMb2dEZXN0aW5hdGlvblR5cGUuUzMsXG4gICAgICBzM0J1Y2tldDogYnVja2V0LFxuICAgICAga2V5UHJlZml4LFxuICAgICAgZGVzdGluYXRpb25PcHRpb25zOiBvcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBLaW5lc2lzIERhdGEgRmlyZWhvc2UgYXMgdGhlIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBkZWxpdmVyeVN0cmVhbUFybiB0aGUgQVJOIG9mIEtpbmVzaXMgRGF0YSBGaXJlaG9zZSBkZWxpdmVyeSBzdHJlYW0gdG8gcHVibGlzaCBsb2dzIHRvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRvS2luZXNpc0RhdGFGaXJlaG9zZURlc3RpbmF0aW9uKFxuICAgIGRlbGl2ZXJ5U3RyZWFtQXJuOiBzdHJpbmcsXG4gICk6IEZsb3dMb2dEZXN0aW5hdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBLaW5lc2lzRGF0YUZpcmVob3NlRGVzdGluYXRpb24oe1xuICAgICAgbG9nRGVzdGluYXRpb25UeXBlOiBGbG93TG9nRGVzdGluYXRpb25UeXBlLktJTkVTSVNfREFUQV9GSVJFSE9TRSxcbiAgICAgIGRlbGl2ZXJ5U3RyZWFtQXJuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIGZsb3cgbG9nIGRlc3RpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGY6IEZsb3dMb2cpOiBGbG93TG9nRGVzdGluYXRpb25Db25maWc7XG59XG5cbi8qKlxuICogRmxvdyBMb2cgRGVzdGluYXRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dMb2dEZXN0aW5hdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBkZXN0aW5hdGlvbiB0byBwdWJsaXNoIHRoZSBmbG93IGxvZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ0xPVURfV0FUQ0hfTE9HU1xuICAgKi9cbiAgcmVhZG9ubHkgbG9nRGVzdGluYXRpb25UeXBlOiBGbG93TG9nRGVzdGluYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIFJvbGUgdGhhdCBoYXMgYWNjZXNzIHRvIHB1Ymxpc2ggdG8gQ2xvdWRXYXRjaCBsb2dzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBJQU0gcm9sZSBpcyBjcmVhdGVkIGZvciB5b3VcbiAgICovXG4gIHJlYWRvbmx5IGlhbVJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIExvZ3MgTG9nIEdyb3VwIHRvIHB1Ymxpc2ggdGhlIGZsb3cgbG9ncyB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgbG9nIGdyb3VwIGlzIGNyZWF0ZWQgZm9yIHlvdVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcblxuICAvKipcbiAgICogUzMgYnVja2V0IHRvIHB1Ymxpc2ggdGhlIGZsb3cgbG9ncyB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgczNCdWNrZXQ/OiBzdG9yYWdlLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBrZXkgcHJlZml4IHRvIHB1Ymxpc2ggdGhlIGZsb3cgbG9ncyB0b1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkga2V5UHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIEtpbmVzaXMgRGF0YSBGaXJlaG9zZSBkZWxpdmVyeSBzdHJlYW0gdG8gcHVibGlzaCB0aGUgZmxvdyBsb2dzIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBkZWxpdmVyeVN0cmVhbUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3Igd3JpdGluZyBmbG93IGxvZ3MgdG8gYSBzdXBwb3J0ZWQgZGVzdGluYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uT3B0aW9ucz86IFMzRGVzdGluYXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqXG4gKi9cbmNsYXNzIFMzRGVzdGluYXRpb24gZXh0ZW5kcyBGbG93TG9nRGVzdGluYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBGbG93TG9nRGVzdGluYXRpb25Db25maWcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgX2Zsb3dMb2c6IEZsb3dMb2cpOiBGbG93TG9nRGVzdGluYXRpb25Db25maWcge1xuICAgIGxldCBzM0J1Y2tldDogc3RvcmFnZS5JQnVja2V0O1xuICAgIGlmICh0aGlzLnByb3BzLnMzQnVja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHMzQnVja2V0ID0gbmV3IHN0b3JhZ2UuQnVja2V0KHNjb3BlLCBcIkJ1Y2tldFwiLCB7XG4gICAgICAgIC8vIFRPRE86IEVuc3VyZSBmbG93bG9nIEJ1Y2tldCBpcyByZXRhaW5lZCBvbiBkZWxldGU/XG4gICAgICAgIC8vIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMzQnVja2V0ID0gdGhpcy5wcm9wcy5zM0J1Y2tldDtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvZmxvdy1sb2dzLXMzLmh0bWwjZmxvdy1sb2dzLXMzLXBlcm1pc3Npb25zXG5cbiAgICBjb25zdCBzdGFjayA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKTtcbiAgICBsZXQga2V5UHJlZml4ID0gdGhpcy5wcm9wcy5rZXlQcmVmaXggPz8gXCJcIjtcbiAgICBpZiAoa2V5UHJlZml4ICYmICFrZXlQcmVmaXguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICBrZXlQcmVmaXggPSBrZXlQcmVmaXggKyBcIi9cIjtcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbk9wdGlvbnM/LmhpdmVDb21wYXRpYmxlUGFydGl0aW9uc1xuICAgICAgPyBzM0J1Y2tldC5hcm5Gb3JPYmplY3RzKFxuICAgICAgICAgIGAke2tleVByZWZpeH1BV1NMb2dzL2F3cy1hY2NvdW50LWlkPSR7c3RhY2suYWNjb3VudH0vKmAsXG4gICAgICAgIClcbiAgICAgIDogczNCdWNrZXQuYXJuRm9yT2JqZWN0cyhgJHtrZXlQcmVmaXh9QVdTTG9ncy8ke3N0YWNrLmFjY291bnR9LypgKTtcblxuICAgIHMzQnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImRlbGl2ZXJ5LmxvZ3MuYW1hem9uYXdzLmNvbVwiKV0sXG4gICAgICAgIHJlc291cmNlczogW3ByZWZpeF0sXG4gICAgICAgIGFjdGlvbnM6IFtcInMzOlB1dE9iamVjdFwiXSxcbiAgICAgICAgY29uZGl0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcblxuICAgICAgICAgICAgdmFyaWFibGU6IFwiczM6eC1hbXotYWNsXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImJ1Y2tldC1vd25lci1mdWxsLWNvbnRyb2xcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlNvdXJjZUFjY291bnRcIixcbiAgICAgICAgICAgIHZhbHVlczogW3N0YWNrLmFjY291bnRdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVzdDogXCJBcm5MaWtlXCIsXG4gICAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U291cmNlQXJuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICAgICAgc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBcImxvZ3NcIixcbiAgICAgICAgICAgICAgICByZXNvdXJjZTogXCIqXCIsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHMzQnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImRlbGl2ZXJ5LmxvZ3MuYW1hem9uYXdzLmNvbVwiKV0sXG4gICAgICAgIHJlc291cmNlczogW3MzQnVja2V0LmJ1Y2tldEFybl0sXG4gICAgICAgIGFjdGlvbnM6IFtcInMzOkdldEJ1Y2tldEFjbFwiLCBcInMzOkxpc3RCdWNrZXRcIl0sXG4gICAgICAgIGNvbmRpdGlvbjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6U291cmNlQWNjb3VudFwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbc3RhY2suYWNjb3VudF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXN0OiBcIkFybkxpa2VcIixcbiAgICAgICAgICAgIHZhcmlhYmxlOiBcImF3czpTb3VyY2VBcm5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgICAgICAgICAgIHNlcnZpY2U6IFwibG9nc1wiLFxuICAgICAgICAgICAgICAgIHJlc291cmNlOiBcIipcIixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBsb2dEZXN0aW5hdGlvblR5cGU6IEZsb3dMb2dEZXN0aW5hdGlvblR5cGUuUzMsXG4gICAgICBzM0J1Y2tldCxcbiAgICAgIGtleVByZWZpeDogdGhpcy5wcm9wcy5rZXlQcmVmaXgsXG4gICAgICBkZXN0aW5hdGlvbk9wdGlvbnM6XG4gICAgICAgIHRoaXMucHJvcHMuZGVzdGluYXRpb25PcHRpb25zPy5maWxlRm9ybWF0IHx8XG4gICAgICAgIHRoaXMucHJvcHMuZGVzdGluYXRpb25PcHRpb25zPy5wZXJIb3VyUGFydGl0aW9uIHx8XG4gICAgICAgIHRoaXMucHJvcHMuZGVzdGluYXRpb25PcHRpb25zPy5oaXZlQ29tcGF0aWJsZVBhcnRpdGlvbnNcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZmlsZUZvcm1hdDpcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9uT3B0aW9ucy5maWxlRm9ybWF0ID8/XG4gICAgICAgICAgICAgICAgRmxvd0xvZ0ZpbGVGb3JtYXQuUExBSU5fVEVYVCxcbiAgICAgICAgICAgICAgcGVySG91clBhcnRpdGlvbjpcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9uT3B0aW9ucy5wZXJIb3VyUGFydGl0aW9uID8/IGZhbHNlLFxuICAgICAgICAgICAgICBoaXZlQ29tcGF0aWJsZVBhcnRpdGlvbnM6XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbk9wdGlvbnMuaGl2ZUNvbXBhdGlibGVQYXJ0aXRpb25zID8/IGZhbHNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKlxuICovXG5jbGFzcyBDbG91ZFdhdGNoTG9nc0Rlc3RpbmF0aW9uIGV4dGVuZHMgRmxvd0xvZ0Rlc3RpbmF0aW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogRmxvd0xvZ0Rlc3RpbmF0aW9uQ29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIF9mbG93TG9nOiBGbG93TG9nKTogRmxvd0xvZ0Rlc3RpbmF0aW9uQ29uZmlnIHtcbiAgICBsZXQgaWFtUm9sZTogaWFtLklSb2xlO1xuICAgIGxldCBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG4gICAgaWYgKHRoaXMucHJvcHMuaWFtUm9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpYW1Sb2xlID0gbmV3IGlhbS5Sb2xlKHNjb3BlLCBcIklBTVJvbGVcIiwge1xuICAgICAgICByb2xlTmFtZTogQXdzU3RhY2sudW5pcXVlSWQoc2NvcGUpLCAvL1BoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwidnBjLWZsb3ctbG9ncy5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlhbVJvbGUgPSB0aGlzLnByb3BzLmlhbVJvbGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubG9nR3JvdXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cChzY29wZSwgXCJMb2dHcm91cFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nR3JvdXAgPSB0aGlzLnByb3BzLmxvZ0dyb3VwO1xuICAgIH1cblxuICAgIGlhbVJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImxvZ3M6Q3JlYXRlTG9nU3RyZWFtXCIsXG4gICAgICAgICAgXCJsb2dzOlB1dExvZ0V2ZW50c1wiLFxuICAgICAgICAgIFwibG9nczpEZXNjcmliZUxvZ1N0cmVhbXNcIixcbiAgICAgICAgXSxcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFtsb2dHcm91cC5sb2dHcm91cEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWFtUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiaWFtOlBhc3NSb2xlXCJdLFxuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHJlc291cmNlczogW2lhbVJvbGUucm9sZUFybl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ0Rlc3RpbmF0aW9uVHlwZTogRmxvd0xvZ0Rlc3RpbmF0aW9uVHlwZS5DTE9VRF9XQVRDSF9MT0dTLFxuICAgICAgbG9nR3JvdXAsXG4gICAgICBpYW1Sb2xlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKlxuICovXG5jbGFzcyBLaW5lc2lzRGF0YUZpcmVob3NlRGVzdGluYXRpb24gZXh0ZW5kcyBGbG93TG9nRGVzdGluYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBGbG93TG9nRGVzdGluYXRpb25Db25maWcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QsIF9mbG93TG9nOiBGbG93TG9nKTogRmxvd0xvZ0Rlc3RpbmF0aW9uQ29uZmlnIHtcbiAgICBpZiAodGhpcy5wcm9wcy5kZWxpdmVyeVN0cmVhbUFybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWxpdmVyeVN0cmVhbUFybiBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgZGVsaXZlcnlTdHJlYW1Bcm4gPSB0aGlzLnByb3BzLmRlbGl2ZXJ5U3RyZWFtQXJuO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ0Rlc3RpbmF0aW9uVHlwZTogRmxvd0xvZ0Rlc3RpbmF0aW9uVHlwZS5LSU5FU0lTX0RBVEFfRklSRUhPU0UsXG4gICAgICBkZWxpdmVyeVN0cmVhbUFybixcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIG1heGltdW0gaW50ZXJ2YWwgb2YgdGltZSBkdXJpbmcgd2hpY2ggYSBmbG93IG9mIHBhY2tldHNcbiAqIGlzIGNhcHR1cmVkIGFuZCBhZ2dyZWdhdGVkIGludG8gYSBmbG93IGxvZyByZWNvcmQuXG4gKlxuICovXG5leHBvcnQgZW51bSBGbG93TG9nTWF4QWdncmVnYXRpb25JbnRlcnZhbCB7XG4gIC8qKlxuICAgKiAxIG1pbnV0ZSAoNjAgc2Vjb25kcylcbiAgICovXG4gIE9ORV9NSU5VVEUgPSA2MCxcblxuICAvKipcbiAgICogMTAgbWludXRlcyAoNjAwIHNlY29uZHMpXG4gICAqL1xuICBURU5fTUlOVVRFUyA9IDYwMCxcbn1cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBmaWVsZHMgZm9yIGEgZmxvdyBsb2cgcmVjb3JkLlxuICovXG5leHBvcnQgY2xhc3MgTG9nRm9ybWF0IHtcbiAgLyoqXG4gICAqIFRoZSBWUEMgRmxvdyBMb2dzIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZFUlNJT04gPSBMb2dGb3JtYXQuZmllbGQoXCJ2ZXJzaW9uXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnQgSUQgb2YgdGhlIG93bmVyIG9mIHRoZSBzb3VyY2UgbmV0d29yayBpbnRlcmZhY2UgZm9yIHdoaWNoIHRyYWZmaWMgaXMgcmVjb3JkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDQ09VTlRfSUQgPSBMb2dGb3JtYXQuZmllbGQoXCJhY2NvdW50LWlkXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZvciB3aGljaCB0aGUgdHJhZmZpYyBpcyByZWNvcmRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJGQUNFX0lEID0gTG9nRm9ybWF0LmZpZWxkKFwiaW50ZXJmYWNlLWlkXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGFkZHJlc3MgZm9yIGluY29taW5nIHRyYWZmaWMsIG9yIHRoZSBJUHY0IG9yIElQdjYgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2VcbiAgICogZm9yIG91dGdvaW5nIHRyYWZmaWMgb24gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUkNfQUREUiA9IExvZ0Zvcm1hdC5maWVsZChcInNyY2FkZHJcIik7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBvdXRnb2luZyB0cmFmZmljLCBvciB0aGUgSVB2NCBvciBJUHY2IGFkZHJlc3Mgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqIGZvciBpbmNvbWluZyB0cmFmZmljIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRFNUX0FERFIgPSBMb2dGb3JtYXQuZmllbGQoXCJkc3RhZGRyXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBvcnQgb2YgdGhlIHRyYWZmaWMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNSQ19QT1JUID0gTG9nRm9ybWF0LmZpZWxkKFwic3JjcG9ydFwiKTtcblxuICAvKipcbiAgICogVGhlIGRlc3RpbmF0aW9uIHBvcnQgb2YgdGhlIHRyYWZmaWMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERTVF9QT1JUID0gTG9nRm9ybWF0LmZpZWxkKFwiZHN0cG9ydFwiKTtcblxuICAvKipcbiAgICogVGhlIElBTkEgcHJvdG9jb2wgbnVtYmVyIG9mIHRoZSB0cmFmZmljLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9UT0NPTCA9IExvZ0Zvcm1hdC5maWVsZChcInByb3RvY29sXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNmZXJyZWQgZHVyaW5nIHRoZSBmbG93LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQQUNLRVRTID0gTG9nRm9ybWF0LmZpZWxkKFwicGFja2V0c1wiKTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBkdXJpbmcgdGhlIGZsb3cuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJZVEVTID0gTG9nRm9ybWF0LmZpZWxkKFwiYnl0ZXNcIik7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lLCBpbiBVbml4IHNlY29uZHMsIHdoZW4gdGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgZmxvdyB3YXMgcmVjZWl2ZWQgd2l0aGluXG4gICAqIHRoZSBhZ2dyZWdhdGlvbiBpbnRlcnZhbC5cbiAgICpcbiAgICogVGhpcyBtaWdodCBiZSB1cCB0byA2MCBzZWNvbmRzIGFmdGVyIHRoZSBwYWNrZXQgd2FzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIG9uXG4gICAqIHRoZSBuZXR3b3JrIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1RBUlRfVElNRVNUQU1QID0gTG9nRm9ybWF0LmZpZWxkKFwic3RhcnRcIik7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lLCBpbiBVbml4IHNlY29uZHMsIHdoZW4gdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBmbG93IHdhcyByZWNlaXZlZCB3aXRoaW5cbiAgICogdGhlIGFnZ3JlZ2F0aW9uIGludGVydmFsLlxuICAgKlxuICAgKiBUaGlzIG1pZ2h0IGJlIHVwIHRvIDYwIHNlY29uZHMgYWZ0ZXIgdGhlIHBhY2tldCB3YXMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgb25cbiAgICogdGhlIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTkRfVElNRVNUQU1QID0gTG9nRm9ybWF0LmZpZWxkKFwiZW5kXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFmZmljLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ1RJT04gPSBMb2dGb3JtYXQuZmllbGQoXCJhY3Rpb25cIik7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnaW5nIHN0YXR1cyBvZiB0aGUgZmxvdyBsb2cuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExPR19TVEFUVVMgPSBMb2dGb3JtYXQuZmllbGQoXCJsb2ctc3RhdHVzXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFZQQyB0aGF0IGNvbnRhaW5zIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIHRyYWZmaWMgaXMgcmVjb3JkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZQQ19JRCA9IExvZ0Zvcm1hdC5maWVsZChcInZwYy1pZFwiKTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBzdWJuZXQgdGhhdCBjb250YWlucyB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHdoaWNoIHRoZSB0cmFmZmljIGlzIHJlY29yZGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVUJORVRfSUQgPSBMb2dGb3JtYXQuZmllbGQoXCJzdWJuZXQtaWRcIik7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgaW5zdGFuY2UgdGhhdCdzIGFzc29jaWF0ZWQgd2l0aCBuZXR3b3JrIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIHRyYWZmaWMgaXNcbiAgICogcmVjb3JkZWQsIGlmIHRoZSBpbnN0YW5jZSBpcyBvd25lZCBieSB5b3UuXG4gICAqXG4gICAqIFJldHVybnMgYSAnLScgc3ltYm9sIGZvciBhIHJlcXVlc3Rlci1tYW5hZ2VkIG5ldHdvcmsgaW50ZXJmYWNlOyBmb3IgZXhhbXBsZSwgdGhlXG4gICAqIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBhIE5BVCBnYXRld2F5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOU1RBTkNFX0lEID0gTG9nRm9ybWF0LmZpZWxkKFwiaW5zdGFuY2UtaWRcIik7XG5cbiAgLyoqXG4gICAqIFRoZSBiaXRtYXNrIHZhbHVlIGZvciBUQ1AgZmxhZ3MuXG4gICAqXG4gICAqIC0gRklOIC0tIDFcbiAgICogLSBTWU4gLS0gMlxuICAgKiAtIFJTVCAtLSA0XG4gICAqIC0gU1lOLUFDSyAtLSAxOFxuICAgKlxuICAgKiBJZiBubyBzdXBwb3J0ZWQgZmxhZ3MgYXJlIHJlY29yZGVkLCB0aGUgVENQIGZsYWcgdmFsdWUgaXMgMC5cbiAgICpcbiAgICogVENQIGZsYWdzIGNhbiBiZSBPUi1lZCBkdXJpbmcgdGhlIGFnZ3JlZ2F0aW9uIGludGVydmFsLiBGb3Igc2hvcnQgY29ubmVjdGlvbnMsXG4gICAqIHRoZSBmbGFncyBtaWdodCBiZSBzZXQgb24gdGhlIHNhbWUgbGluZSBpbiB0aGUgZmxvdyBsb2cgcmVjb3JkLCBmb3IgZXhhbXBsZSxcbiAgICogMTkgZm9yIFNZTi1BQ0sgYW5kIEZJTiwgYW5kIDMgZm9yIFNZTiBhbmQgRklOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUQ1BfRkxBR1MgPSBMb2dGb3JtYXQuZmllbGQoXCJ0Y3AtZmxhZ3NcIik7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRyYWZmaWMuXG4gICAqXG4gICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIElQdjQsIElQdjYsIG9yIEVGQS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJBRkZJQ19UWVBFID0gTG9nRm9ybWF0LmZpZWxkKFwidHlwZVwiKTtcblxuICAvKipcbiAgICogVGhlIHBhY2tldC1sZXZlbCAob3JpZ2luYWwpIHNvdXJjZSBJUCBhZGRyZXNzIG9mIHRoZSB0cmFmZmljLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQS1RfU1JDX0FERFIgPSBMb2dGb3JtYXQuZmllbGQoXCJwa3Qtc3JjYWRkclwiKTtcblxuICAvKipcbiAgICogVGhlIHBhY2tldC1sZXZlbCAob3JpZ2luYWwpIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgZm9yIHRoZSB0cmFmZmljLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQS1RfRFNUX0FERFIgPSBMb2dGb3JtYXQuZmllbGQoXCJwa3QtZHN0YWRkclwiKTtcblxuICAvKipcbiAgICogVGhlIFJlZ2lvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmb3Igd2hpY2ggdHJhZmZpYyBpcyByZWNvcmRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVHSU9OID0gTG9nRm9ybWF0LmZpZWxkKFwicmVnaW9uXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEF2YWlsYWJpbGl0eSBab25lIHRoYXQgY29udGFpbnMgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZvciB3aGljaCB0cmFmZmljIGlzIHJlY29yZGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBWl9JRCA9IExvZ0Zvcm1hdC5maWVsZChcImF6LWlkXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzdWJsb2NhdGlvbiB0aGF0J3MgcmV0dXJuZWQgaW4gdGhlIHN1YmxvY2F0aW9uLWlkIGZpZWxkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVUJMT0NBVElPTl9UWVBFID0gTG9nRm9ybWF0LmZpZWxkKFwic3VibG9jYXRpb24tdHlwZVwiKTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBzdWJsb2NhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmb3Igd2hpY2ggdHJhZmZpYyBpcyByZWNvcmRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1VCTE9DQVRJT05fSUQgPSBMb2dGb3JtYXQuZmllbGQoXCJzdWJsb2NhdGlvbi1pZFwiKTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN1YnNldCBvZiBJUCBhZGRyZXNzIHJhbmdlcyBmb3IgdGhlIHBrdC1zcmNhZGRyIGZpZWxkLFxuICAgKiBpZiB0aGUgc291cmNlIElQIGFkZHJlc3MgaXMgZm9yIGFuIEFXUyBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQS1RfU1JDX0FXU19TRVJWSUNFID0gTG9nRm9ybWF0LmZpZWxkKFxuICAgIFwicGt0LXNyYy1hd3Mtc2VydmljZVwiLFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3Vic2V0IG9mIElQIGFkZHJlc3MgcmFuZ2VzIGZvciB0aGUgcGt0LWRzdGFkZHIgZmllbGQsXG4gICAqIGlmIHRoZSBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIGlzIGZvciBhbiBBV1Mgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEtUX0RTVF9BV1NfU0VSVklDRSA9IExvZ0Zvcm1hdC5maWVsZChcbiAgICBcInBrdC1kc3QtYXdzLXNlcnZpY2VcIixcbiAgKTtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdyB3aXRoIHJlc3BlY3QgdG8gdGhlIGludGVyZmFjZSB3aGVyZSB0cmFmZmljIGlzIGNhcHR1cmVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGTE9XX0RJUkVDVElPTiA9IExvZ0Zvcm1hdC5maWVsZChcImZsb3ctZGlyZWN0aW9uXCIpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0aGF0IGVncmVzcyB0cmFmZmljIHRha2VzIHRvIHRoZSBkZXN0aW5hdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJBRkZJQ19QQVRIID0gTG9nRm9ybWF0LmZpZWxkKFwidHJhZmZpYy1wYXRoXCIpO1xuXG4gIC8qKlxuICAgKiBBV1MgUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgRUNTIGNsdXN0ZXIgaWYgdGhlIHRyYWZmaWMgaXMgZnJvbSBhIHJ1bm5pbmcgRUNTIHRhc2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVDU19DTFVTVEVSX0FSTiA9IExvZ0Zvcm1hdC5maWVsZChcImVjcy1jbHVzdGVyLWFyblwiKTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgRUNTIGNsdXN0ZXIgaWYgdGhlIHRyYWZmaWMgaXMgZnJvbSBhIHJ1bm5pbmcgRUNTIHRhc2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVDU19DTFVTVEVSX05BTUUgPSBMb2dGb3JtYXQuZmllbGQoXCJlY3MtY2x1c3Rlci1uYW1lXCIpO1xuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIEVDUyBjb250YWluZXIgaW5zdGFuY2UgaWYgdGhlIHRyYWZmaWMgaXMgZnJvbSBhIHJ1bm5pbmcgRUNTIHRhc2sgb24gYW4gRUMyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFQ1NfQ09OVEFJTkVSX0lOU1RBTkNFX0FSTiA9IExvZ0Zvcm1hdC5maWVsZChcbiAgICBcImVjcy1jb250YWluZXItaW5zdGFuY2UtYXJuXCIsXG4gICk7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBFQ1MgY29udGFpbmVyIGluc3RhbmNlIGlmIHRoZSB0cmFmZmljIGlzIGZyb20gYSBydW5uaW5nIEVDUyB0YXNrIG9uIGFuIEVDMiBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRUNTX0NPTlRBSU5FUl9JTlNUQU5DRV9JRCA9IExvZ0Zvcm1hdC5maWVsZChcbiAgICBcImVjcy1jb250YWluZXItaW5zdGFuY2UtaWRcIixcbiAgKTtcblxuICAvKipcbiAgICogRG9ja2VyIHJ1bnRpbWUgSUQgb2YgdGhlIGNvbnRhaW5lciBpZiB0aGUgdHJhZmZpYyBpcyBmcm9tIGEgcnVubmluZyBFQ1MgdGFzay5cbiAgICogSWYgdGhlcmUgaXMgb25lIGNvbnRhaW5lciBvciBtb3JlIGluIHRoZSBFQ1MgdGFzaywgdGhpcyB3aWxsIGJlIHRoZSBkb2NrZXIgcnVudGltZSBJRCBvZiB0aGUgZmlyc3QgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFQ1NfQ09OVEFJTkVSX0lEID0gTG9nRm9ybWF0LmZpZWxkKFwiZWNzLWNvbnRhaW5lci1pZFwiKTtcblxuICAvKipcbiAgICogRG9ja2VyIHJ1bnRpbWUgSUQgb2YgdGhlIGNvbnRhaW5lciBpZiB0aGUgdHJhZmZpYyBpcyBmcm9tIGEgcnVubmluZyBFQ1MgdGFzay5cbiAgICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb250YWluZXIgaW4gdGhlIEVDUyB0YXNrLCB0aGlzIHdpbGwgYmUgdGhlIERvY2tlciBydW50aW1lIElEIG9mIHRoZSBzZWNvbmQgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFQ1NfU0VDT05EX0NPTlRBSU5FUl9JRCA9IExvZ0Zvcm1hdC5maWVsZChcbiAgICBcImVjcy1zZWNvbmQtY29udGFpbmVyLWlkXCIsXG4gICk7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIEVDUyBzZXJ2aWNlIGlmIHRoZSB0cmFmZmljIGlzIGZyb20gYSBydW5uaW5nIEVDUyB0YXNrIGFuZCB0aGUgRUNTIHRhc2sgaXMgc3RhcnRlZCBieSBhbiBFQ1Mgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRUNTX1NFUlZJQ0VfTkFNRSA9IExvZ0Zvcm1hdC5maWVsZChcImVjcy1zZXJ2aWNlLW5hbWVcIik7XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgRUNTIHRhc2sgZGVmaW5pdGlvbiBpZiB0aGUgdHJhZmZpYyBpcyBmcm9tIGEgcnVubmluZyBFQ1MgdGFzay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRUNTX1RBU0tfREVGSU5JVElPTl9BUk4gPSBMb2dGb3JtYXQuZmllbGQoXG4gICAgXCJlY3MtdGFzay1kZWZpbml0aW9uLWFyblwiLFxuICApO1xuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIEVDUyB0YXNrIGlmIHRoZSB0cmFmZmljIGlzIGZyb20gYSBydW5uaW5nIEVDUyB0YXNrLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFQ1NfVEFTS19BUk4gPSBMb2dGb3JtYXQuZmllbGQoXCJlY3MtdGFzay1hcm5cIik7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBFQ1MgdGFzayBpZiB0aGUgdHJhZmZpYyBpcyBmcm9tIGEgcnVubmluZyBFQ1MgdGFzay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRUNTX1RBU0tfSUQgPSBMb2dGb3JtYXQuZmllbGQoXCJlY3MtdGFzay1pZFwiKTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBTExfREVGQVVMVF9GSUVMRFMgPSBuZXcgTG9nRm9ybWF0KFxuICAgIFwiJHt2ZXJzaW9ufSAke2FjY291bnQtaWR9ICR7aW50ZXJmYWNlLWlkfSAke3NyY2FkZHJ9ICR7ZHN0YWRkcn0gJHtzcmNwb3J0fSAke2RzdHBvcnR9ICR7cHJvdG9jb2x9ICR7cGFja2V0c30gJHtieXRlc30gJHtzdGFydH0gJHtlbmR9ICR7YWN0aW9ufSAke2xvZy1zdGF0dXN9XCIsXG4gICk7XG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tIGZvcm1hdCBzdHJpbmcuXG4gICAqXG4gICAqIEdpdmVzIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBmb3JtYXQgc3RyaW5nIGZyYWdtZW50LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBMb2dGb3JtYXQge1xuICAgIHJldHVybiBuZXcgTG9nRm9ybWF0KGZvcm1hdFN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQSBjdXN0b20gZmllbGQgbmFtZS5cbiAgICpcbiAgICogSWYgdGhlcmUgaXMgbm8gcmVhZHktbWFkZSBjb25zdGFudCBmb3IgYSBuZXcgZmllbGQgeWV0LCB5b3UgY2FuIHVzZSB0aGlzLlxuICAgKiBUaGUgZmllbGQgbmFtZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgd3JhcHBlZCBpbiBgJHsgLi4uIH1gLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmaWVsZChmaWVsZDogc3RyaW5nKTogTG9nRm9ybWF0IHtcbiAgICByZXR1cm4gbmV3IExvZ0Zvcm1hdChgXFwkeyR7ZmllbGR9fWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gYWRkIGEgZmxvdyBsb2cgdG8gYSBWUENcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93TG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0cmFmZmljIHRvIGxvZy4gWW91IGNhbiBsb2cgdHJhZmZpYyB0aGF0IHRoZSByZXNvdXJjZSBhY2NlcHRzIG9yIHJlamVjdHMsIG9yIGFsbCB0cmFmZmljLlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZWl0aGVyIGBUcmFuc2l0R2F0ZXdheWAgb3IgYFRyYW5zaXRHYXRld2F5QXR0YWNobWVudGAsIHNldHRpbmcgdGhlIHRyYWZmaWMgdHlwZSBpcyBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdGd3L3dvcmtpbmctd2l0aC1mbG93LWxvZ3MuaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCBBTExcbiAgICovXG4gIHJlYWRvbmx5IHRyYWZmaWNUeXBlPzogRmxvd0xvZ1RyYWZmaWNUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGVzdGluYXRpb24gdG8gd2hpY2ggdGhlIGZsb3cgbG9nIGRhdGEgaXMgdG8gYmUgcHVibGlzaGVkLlxuICAgKiBGbG93IGxvZyBkYXRhIGNhbiBiZSBwdWJsaXNoZWQgdG8gQ2xvdWRXYXRjaCBMb2dzIG9yIEFtYXpvbiBTM1xuICAgKlxuICAgKiBAZGVmYXVsdCBGbG93TG9nRGVzdGluYXRpb25UeXBlLnRvQ2xvdWRXYXRjaExvZ3MoKVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb24/OiBGbG93TG9nRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgZmxvdyBsb2cgcmVjb3JkLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBzaG91bGQgYXBwZWFyLlxuICAgKlxuICAgKiBJZiBtdWx0aXBsZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhleSB3aWxsIGJlIHNlcGFyYXRlZCBieSBzcGFjZXMuIEZvciBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGl0ZXJhbCBsb2cgZm9ybWF0XG4gICAqIHN0cmluZywgcGFzcyBhIHNpbmdsZSBmaWVsZCBjb25zdHJ1Y3RlZCB3aXRoIGBMb2dGb3JtYXQuY3VzdG9tKClgLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL2Zsb3ctbG9ncy5odG1sI2Zsb3ctbG9nLXJlY29yZHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGxvZyBmb3JtYXQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0Zvcm1hdD86IExvZ0Zvcm1hdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBpbnRlcnZhbCBvZiB0aW1lIGR1cmluZyB3aGljaCBhIGZsb3cgb2YgcGFja2V0cyBpcyBjYXB0dXJlZFxuICAgKiBhbmQgYWdncmVnYXRlZCBpbnRvIGEgZmxvdyBsb2cgcmVjb3JkLlxuICAgKlxuICAgKiBXaGVuIGNyZWF0aW5nIGZsb3cgbG9ncyBmb3IgYSBUcmFuc2l0IEdhdGV3YXkgb3IgVHJhbnNpdCBHYXRld2F5IEF0dGFjaG1lbnQsXG4gICAqIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBPTkVfTUlOVVRFUy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWZsb3dsb2cuaHRtbCNjZm4tZWMyLWZsb3dsb2ctbWF4YWdncmVnYXRpb25pbnRlcnZhbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEZsb3dMb2dNYXhBZ2dyZWdhdGlvbkludGVydmFsLk9ORV9NSU5VVEVTIGlmIGNyZWF0aW5nIGZsb3cgbG9ncyBmb3IgVHJhbnNpdCBHYXRld2F5LCBvdGhlcndpc2UgRmxvd0xvZ01heEFnZ3JlZ2F0aW9uSW50ZXJ2YWwuVEVOX01JTlVURVMuXG4gICAqL1xuICByZWFkb25seSBtYXhBZ2dyZWdhdGlvbkludGVydmFsPzogRmxvd0xvZ01heEFnZ3JlZ2F0aW9uSW50ZXJ2YWw7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBvZiBhIFZQQyBGbG93IExvZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dMb2dQcm9wcyBleHRlbmRzIEZsb3dMb2dPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBGbG93TG9nXG4gICAqXG4gICAqIFNpbmNlIHRoZSBGbG93TG9nIHJlc291cmNlIGRvZXNuJ3Qgc3VwcG9ydCBwcm92aWRpbmcgYSBwaHlzaWNhbCBuYW1lLCB0aGUgdmFsdWUgcHJvdmlkZWQgaGVyZSB3aWxsIGJlIHJlY29yZGVkIGluIHRoZSBgTmFtZWAgdGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDREsgZ2VuZXJhdGVkIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGZsb3dMb2dOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiByZXNvdXJjZSBmb3Igd2hpY2ggdG8gY3JlYXRlIHRoZSBmbG93IGxvZ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlOiBGbG93TG9nUmVzb3VyY2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhIEZsb3cgTG9nXG4gKi9cbmFic3RyYWN0IGNsYXNzIEZsb3dMb2dCYXNlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElGbG93TG9nIHtcbiAgLyoqXG4gICAqIFRoZSBJZCBvZiB0aGUgVlBDIEZsb3cgTG9nXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBmbG93TG9nSWQ6IHN0cmluZztcbiAgcHVibGljIGdldCBmbG93TG9nT3V0cHV0cygpOiBGbG93TG9nT3V0cHV0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsb3dMb2dJZDogdGhpcy5mbG93TG9nSWQsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd0xvZ091dHB1dHM7XG4gIH1cbn1cblxuLyoqXG4gKiBBIFZQQyBmbG93IGxvZy5cbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6Rmxvd0xvZ1xuICovXG5leHBvcnQgY2xhc3MgRmxvd0xvZyBleHRlbmRzIEZsb3dMb2dCYXNlIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhIEZsb3cgTG9nIGJ5IGl0J3MgSWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZsb3dMb2dJZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZmxvd0xvZ0lkOiBzdHJpbmcsXG4gICk6IElGbG93TG9nIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBGbG93TG9nQmFzZSB7XG4gICAgICBwdWJsaWMgZmxvd0xvZ0lkID0gZmxvd0xvZ0lkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElkIG9mIHRoZSBWUEMgRmxvdyBMb2dcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZsb3dMb2dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRvIHB1Ymxpc2ggZmxvdyBsb2dzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0Pzogc3RvcmFnZS5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBTMyBidWNrZXQga2V5IHByZWZpeCB0byBwdWJsaXNoIHRoZSBmbG93IGxvZ3MgdW5kZXJcbiAgICovXG4gIHJlYWRvbmx5IGtleVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlhbSByb2xlIHVzZWQgdG8gcHVibGlzaCBsb2dzIHRvIENsb3VkV2F0Y2hcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpYW1Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRXYXRjaCBMb2dzIExvZ0dyb3VwIHRvIHB1Ymxpc2ggZmxvdyBsb2dzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgS2luZXNpcyBEYXRhIEZpcmVob3NlIGRlbGl2ZXJ5IHN0cmVhbSB0byBwdWJsaXNoIGZsb3cgbG9ncyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlbGl2ZXJ5U3RyZWFtQXJuPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IGZsb3dMb2cuRmxvd0xvZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRmxvd0xvZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID1cbiAgICAgIHByb3BzLmRlc3RpbmF0aW9uIHx8IEZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKCk7XG5cbiAgICBjb25zdCBkZXN0aW5hdGlvbkNvbmZpZyA9IGRlc3RpbmF0aW9uLmJpbmQodGhpcywgdGhpcyk7XG4gICAgdGhpcy5sb2dHcm91cCA9IGRlc3RpbmF0aW9uQ29uZmlnLmxvZ0dyb3VwO1xuICAgIHRoaXMuYnVja2V0ID0gZGVzdGluYXRpb25Db25maWcuczNCdWNrZXQ7XG4gICAgdGhpcy5pYW1Sb2xlID0gZGVzdGluYXRpb25Db25maWcuaWFtUm9sZTtcbiAgICB0aGlzLmtleVByZWZpeCA9IGRlc3RpbmF0aW9uQ29uZmlnLmtleVByZWZpeDtcbiAgICB0aGlzLmRlbGl2ZXJ5U3RyZWFtQXJuID0gZGVzdGluYXRpb25Db25maWcuZGVsaXZlcnlTdHJlYW1Bcm47XG5cbiAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMuZmxvd0xvZ05hbWUgfHwgdGhpcy5ub2RlLnBhdGgpO1xuXG4gICAgbGV0IGxvZ0Rlc3RpbmF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYnVja2V0KSB7XG4gICAgICBsb2dEZXN0aW5hdGlvbiA9IHRoaXMua2V5UHJlZml4XG4gICAgICAgID8gdGhpcy5idWNrZXQuYXJuRm9yT2JqZWN0cyh0aGlzLmtleVByZWZpeClcbiAgICAgICAgOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRlbGl2ZXJ5U3RyZWFtQXJuKSB7XG4gICAgICBsb2dEZXN0aW5hdGlvbiA9IHRoaXMuZGVsaXZlcnlTdHJlYW1Bcm47XG4gICAgfVxuICAgIGxldCBjdXN0b21Mb2dGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocHJvcHMubG9nRm9ybWF0KSB7XG4gICAgICBjdXN0b21Mb2dGb3JtYXQgPSBwcm9wcy5sb2dGb3JtYXRcbiAgICAgICAgLm1hcCgoZWxtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVsbS52YWx1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIGxldCB0cmFmZmljVHlwZTogRmxvd0xvZ1RyYWZmaWNUeXBlIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb3BzLnRyYWZmaWNUeXBlID8/IEZsb3dMb2dUcmFmZmljVHlwZS5BTEw7XG4gICAgaWYgKFxuICAgICAgcHJvcHMucmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSA9PT0gXCJUcmFuc2l0R2F0ZXdheVwiIHx8XG4gICAgICBwcm9wcy5yZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlID09PSBcIlRyYW5zaXRHYXRld2F5QXR0YWNobWVudFwiXG4gICAgKSB7XG4gICAgICBpZiAocHJvcHMudHJhZmZpY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwidHJhZmZpY1R5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgVHJhbnNpdCBHYXRld2F5IGFuZCBUcmFuc2l0IEdhdGV3YXkgQXR0YWNobWVudFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBwcm9wcy5tYXhBZ2dyZWdhdGlvbkludGVydmFsICYmXG4gICAgICAgIHByb3BzLm1heEFnZ3JlZ2F0aW9uSW50ZXJ2YWwgIT09XG4gICAgICAgICAgRmxvd0xvZ01heEFnZ3JlZ2F0aW9uSW50ZXJ2YWwuT05FX01JTlVURVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIm1heEFnZ3JlZ2F0aW9uSW50ZXJ2YWwgbXVzdCBiZSBzZXQgdG8gT05FX01JTlVURSBmb3IgVHJhbnNpdCBHYXRld2F5IGFuZCBUcmFuc2l0IEdhdGV3YXkgQXR0YWNobWVudFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJhZmZpY1R5cGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBBV1NDQyAtPiBBV1MgcmVzb3VyY2VJZFByb3BzXG4gICAgLy8gVE9ETzogQWRvcHQgQVdTQ0NcbiAgICBsZXQgcmVzb3VyY2VJZFByb3BzOiB7XG4gICAgICBlbmlJZD86IHN0cmluZztcbiAgICAgIHN1Ym5ldElkPzogc3RyaW5nO1xuICAgICAgdHJhbnNpdEdhdGV3YXlJZD86IHN0cmluZztcbiAgICAgIHRyYW5zaXRHYXRld2F5QXR0YWNobWVudElkPzogc3RyaW5nO1xuICAgICAgdnBjSWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBzd2l0Y2ggKHByb3BzLnJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUpIHtcbiAgICAgIGNhc2UgXCJOZXR3b3JrSW50ZXJmYWNlXCI6XG4gICAgICAgIHJlc291cmNlSWRQcm9wcyA9IHsgZW5pSWQ6IHByb3BzLnJlc291cmNlVHlwZS5yZXNvdXJjZUlkIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlN1Ym5ldFwiOlxuICAgICAgICByZXNvdXJjZUlkUHJvcHMgPSB7IHN1Ym5ldElkOiBwcm9wcy5yZXNvdXJjZVR5cGUucmVzb3VyY2VJZCB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJUcmFuc2l0R2F0ZXdheVwiOlxuICAgICAgICByZXNvdXJjZUlkUHJvcHMgPSB7IHRyYW5zaXRHYXRld2F5SWQ6IHByb3BzLnJlc291cmNlVHlwZS5yZXNvdXJjZUlkIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlRyYW5zaXRHYXRld2F5QXR0YWNobWVudFwiOlxuICAgICAgICByZXNvdXJjZUlkUHJvcHMgPSB7XG4gICAgICAgICAgdHJhbnNpdEdhdGV3YXlBdHRhY2htZW50SWQ6IHByb3BzLnJlc291cmNlVHlwZS5yZXNvdXJjZUlkLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJWUENcIjpcbiAgICAgICAgcmVzb3VyY2VJZFByb3BzID0geyB2cGNJZDogcHJvcHMucmVzb3VyY2VUeXBlLnJlc291cmNlSWQgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlc291cmNlIHR5cGU6IFwiICsgcHJvcHMucmVzb3VyY2VUeXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IGZsb3dMb2cuRmxvd0xvZyh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGRlc3RpbmF0aW9uT3B0aW9uczogZGVzdGluYXRpb25Db25maWcuZGVzdGluYXRpb25PcHRpb25zLFxuICAgICAgaWFtUm9sZUFybjogdGhpcy5pYW1Sb2xlID8gdGhpcy5pYW1Sb2xlLnJvbGVBcm4gOiB1bmRlZmluZWQsXG4gICAgICBsb2dEZXN0aW5hdGlvblR5cGU6IGRlc3RpbmF0aW9uQ29uZmlnLmxvZ0Rlc3RpbmF0aW9uVHlwZSxcbiAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5sb2dHcm91cCA/IHRoaXMubG9nR3JvdXAubG9nR3JvdXBOYW1lIDogdW5kZWZpbmVkLFxuICAgICAgbWF4QWdncmVnYXRpb25JbnRlcnZhbDogcHJvcHMubWF4QWdncmVnYXRpb25JbnRlcnZhbCxcbiAgICAgIGlkOiBwcm9wcy5yZXNvdXJjZVR5cGUucmVzb3VyY2VJZCxcbiAgICAgIHRyYWZmaWNUeXBlLFxuICAgICAgbG9nRm9ybWF0OiBjdXN0b21Mb2dGb3JtYXQsXG4gICAgICBsb2dEZXN0aW5hdGlvbixcbiAgICAgIC4uLnJlc291cmNlSWRQcm9wcyxcbiAgICB9KTtcblxuICAgIC8vIFZQQyBzZXJ2aWNlIGltcGxpY2l0bHkgdHJpZXMgdG8gY3JlYXRlIGEgYnVja2V0IHBvbGljeSB3aGVuIGFkZGluZyBhIHZwYyBmbG93IGxvZy5cbiAgICAvLyBUbyBhdm9pZCB0aGUgcmFjZSBjb25kaXRpb24sIHdlIGFkZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IGhlcmUuXG4gICAgaWYgKHRoaXMuYnVja2V0Py5wb2xpY3k/Lm5vZGUuZGVmYXVsdENoaWxkIGluc3RhbmNlb2YgVGVycmFmb3JtUmVzb3VyY2UpIHtcbiAgICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuYnVja2V0Py5wb2xpY3kubm9kZS5kZWZhdWx0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHdlIG11c3QgcmVtb3ZlIGEgZmxvdyBsb2cgY29uZmlndXJhdGlvbiBmaXJzdCBiZWZvcmUgZGVsZXRpbmcgb2JqZWN0cy5cbiAgICAvLyBUT0RPOiBTMyBCdWNrZXQgb2JqZWN0IHJlbW92YWwgY3VzdG9tIHJlc291cmNlP1xuICAgIC8vIGNvbnN0IGRlbGV0ZU9iamVjdHMgPSB0aGlzLmJ1Y2tldD8ubm9kZS50cnlGaW5kQ2hpbGQoXG4gICAgLy8gICBcIkF1dG9EZWxldGVPYmplY3RzQ3VzdG9tUmVzb3VyY2VcIixcbiAgICAvLyApPy5ub2RlLmRlZmF1bHRDaGlsZDtcbiAgICAvLyBpZiAoZGVsZXRlT2JqZWN0cyBpbnN0YW5jZW9mIFRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgLy8gICByZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3koZGVsZXRlT2JqZWN0cyk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5mbG93TG9nSWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICB9XG59XG4iXX0=