@microsoft/terraform-cdk-constructs 1.0.0 → 1.3.0

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 (577) hide show
  1. package/.jsii +89270 -15866
  2. package/API.md +103201 -10557
  3. package/README.md +72 -36
  4. package/docs/monitoring-guide.md +206 -0
  5. package/docs/testing.md +84 -1
  6. package/lib/azure-actiongroup/index.d.ts +1 -0
  7. package/lib/azure-actiongroup/index.js +18 -0
  8. package/lib/azure-actiongroup/lib/action-group-schemas.d.ts +24 -0
  9. package/lib/azure-actiongroup/lib/action-group-schemas.js +201 -0
  10. package/lib/azure-actiongroup/lib/action-group.d.ts +302 -0
  11. package/lib/azure-actiongroup/lib/action-group.js +175 -0
  12. package/lib/azure-actiongroup/lib/index.d.ts +2 -0
  13. package/lib/azure-actiongroup/lib/index.js +19 -0
  14. package/lib/azure-actiongroup/test/action-group.integ.d.ts +9 -0
  15. package/lib/azure-actiongroup/test/action-group.integ.js +79 -0
  16. package/lib/azure-actiongroup/test/action-group.spec.d.ts +8 -0
  17. package/lib/azure-actiongroup/test/action-group.spec.js +602 -0
  18. package/lib/azure-activitylogalert/index.d.ts +1 -0
  19. package/lib/azure-activitylogalert/index.js +18 -0
  20. package/lib/azure-activitylogalert/lib/activity-log-alert-schemas.d.ts +24 -0
  21. package/lib/azure-activitylogalert/lib/activity-log-alert-schemas.js +182 -0
  22. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +226 -0
  23. package/lib/azure-activitylogalert/lib/activity-log-alert.js +186 -0
  24. package/lib/azure-activitylogalert/lib/index.d.ts +2 -0
  25. package/lib/azure-activitylogalert/lib/index.js +19 -0
  26. package/lib/azure-activitylogalert/test/activity-log-alert.integ.d.ts +9 -0
  27. package/lib/azure-activitylogalert/test/activity-log-alert.integ.js +98 -0
  28. package/lib/azure-activitylogalert/test/activity-log-alert.spec.d.ts +9 -0
  29. package/lib/azure-activitylogalert/test/activity-log-alert.spec.js +1101 -0
  30. package/lib/azure-aks/index.d.ts +1 -0
  31. package/lib/azure-aks/index.js +18 -0
  32. package/lib/azure-aks/lib/aks-cluster-schemas.d.ts +505 -0
  33. package/lib/azure-aks/lib/aks-cluster-schemas.js +572 -0
  34. package/lib/azure-aks/lib/aks-cluster.d.ts +386 -0
  35. package/lib/azure-aks/lib/aks-cluster.js +466 -0
  36. package/lib/azure-aks/lib/index.d.ts +2 -0
  37. package/lib/azure-aks/lib/index.js +19 -0
  38. package/lib/azure-aks/test/aks-cluster.integ.d.ts +9 -0
  39. package/lib/azure-aks/test/aks-cluster.integ.js +260 -0
  40. package/lib/azure-aks/test/aks-cluster.spec.d.ts +8 -0
  41. package/lib/azure-aks/test/aks-cluster.spec.js +1396 -0
  42. package/lib/azure-diagnosticsettings/index.d.ts +1 -0
  43. package/lib/azure-diagnosticsettings/index.js +18 -0
  44. package/lib/azure-diagnosticsettings/lib/diagnostic-settings-schemas.d.ts +50 -0
  45. package/lib/azure-diagnosticsettings/lib/diagnostic-settings-schemas.js +207 -0
  46. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +183 -0
  47. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +174 -0
  48. package/lib/azure-diagnosticsettings/lib/index.d.ts +2 -0
  49. package/lib/azure-diagnosticsettings/lib/index.js +19 -0
  50. package/lib/azure-diagnosticsettings/test/diagnostic-settings.spec.d.ts +8 -0
  51. package/lib/azure-diagnosticsettings/test/diagnostic-settings.spec.js +432 -0
  52. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  53. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  54. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  55. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  56. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  57. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  58. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  59. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  60. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  61. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  62. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  63. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  64. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  65. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  66. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  67. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  68. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  69. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  70. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  71. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  72. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  73. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  74. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  75. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  76. package/lib/azure-dnsresolver/index.d.ts +1 -0
  77. package/lib/azure-dnsresolver/index.js +18 -0
  78. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  79. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  80. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  81. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  82. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  83. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  84. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  85. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  86. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  87. package/lib/azure-dnsresolver/lib/index.js +23 -0
  88. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  89. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  90. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  91. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  92. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  93. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  94. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  95. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  96. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  97. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  98. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  99. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  100. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  101. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  102. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  103. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  104. package/lib/azure-dnszone/index.d.ts +1 -0
  105. package/lib/azure-dnszone/index.js +18 -0
  106. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  107. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  108. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  109. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  110. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  111. package/lib/azure-dnszone/lib/index.js +19 -0
  112. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  113. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  114. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  115. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  116. package/lib/azure-metricalert/index.d.ts +1 -0
  117. package/lib/azure-metricalert/index.js +18 -0
  118. package/lib/azure-metricalert/lib/index.d.ts +2 -0
  119. package/lib/azure-metricalert/lib/index.js +19 -0
  120. package/lib/azure-metricalert/lib/metric-alert-schemas.d.ts +24 -0
  121. package/lib/azure-metricalert/lib/metric-alert-schemas.js +242 -0
  122. package/lib/azure-metricalert/lib/metric-alert.d.ts +334 -0
  123. package/lib/azure-metricalert/lib/metric-alert.js +226 -0
  124. package/lib/azure-metricalert/test/metric-alert.integ.d.ts +9 -0
  125. package/lib/azure-metricalert/test/metric-alert.integ.js +123 -0
  126. package/lib/azure-metricalert/test/metric-alert.spec.d.ts +9 -0
  127. package/lib/azure-metricalert/test/metric-alert.spec.js +1266 -0
  128. package/lib/azure-networkinterface/index.d.ts +1 -0
  129. package/lib/azure-networkinterface/index.js +18 -0
  130. package/lib/azure-networkinterface/lib/index.d.ts +2 -0
  131. package/lib/azure-networkinterface/lib/index.js +19 -0
  132. package/lib/azure-networkinterface/lib/network-interface-schemas.d.ts +32 -0
  133. package/lib/azure-networkinterface/lib/network-interface-schemas.js +222 -0
  134. package/lib/azure-networkinterface/lib/network-interface.d.ts +260 -0
  135. package/lib/azure-networkinterface/lib/network-interface.js +213 -0
  136. package/lib/azure-networkinterface/test/network-interface.integ.d.ts +9 -0
  137. package/lib/azure-networkinterface/test/network-interface.integ.js +116 -0
  138. package/lib/azure-networkinterface/test/network-interface.spec.d.ts +8 -0
  139. package/lib/azure-networkinterface/test/network-interface.spec.js +655 -0
  140. package/lib/azure-networksecuritygroup/index.d.ts +1 -0
  141. package/lib/azure-networksecuritygroup/index.js +18 -0
  142. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -0
  143. package/lib/azure-networksecuritygroup/lib/index.js +19 -0
  144. package/lib/azure-networksecuritygroup/lib/network-security-group-schemas.d.ts +32 -0
  145. package/lib/azure-networksecuritygroup/lib/network-security-group-schemas.js +198 -0
  146. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +259 -0
  147. package/lib/azure-networksecuritygroup/lib/network-security-group.js +226 -0
  148. package/lib/azure-networksecuritygroup/test/network-security-group.integ.d.ts +9 -0
  149. package/lib/azure-networksecuritygroup/test/network-security-group.integ.js +151 -0
  150. package/lib/azure-networksecuritygroup/test/network-security-group.spec.d.ts +8 -0
  151. package/lib/azure-networksecuritygroup/test/network-security-group.spec.js +652 -0
  152. package/lib/azure-policyassignment/index.d.ts +1 -0
  153. package/lib/azure-policyassignment/index.js +18 -0
  154. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  155. package/lib/azure-policyassignment/lib/index.js +19 -0
  156. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  157. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  158. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
  159. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
  160. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  161. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  162. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  163. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  164. package/lib/azure-policydefinition/index.d.ts +1 -0
  165. package/lib/azure-policydefinition/index.js +18 -0
  166. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  167. package/lib/azure-policydefinition/lib/index.js +19 -0
  168. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  169. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  170. package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
  171. package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
  172. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  173. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  174. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  175. package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
  176. package/lib/azure-privatednszone/index.d.ts +1 -0
  177. package/lib/azure-privatednszone/index.js +18 -0
  178. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  179. package/lib/azure-privatednszone/lib/index.js +19 -0
  180. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  181. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  182. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  183. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  184. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  185. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  186. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  187. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  188. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  189. package/lib/azure-privatednszonelink/index.js +18 -0
  190. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  191. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  192. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  193. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  194. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  195. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  196. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  197. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  198. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  199. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  200. package/lib/azure-publicipaddress/index.d.ts +1 -0
  201. package/lib/azure-publicipaddress/index.js +18 -0
  202. package/lib/azure-publicipaddress/lib/index.d.ts +2 -0
  203. package/lib/azure-publicipaddress/lib/index.js +19 -0
  204. package/lib/azure-publicipaddress/lib/public-ip-address-schemas.d.ts +32 -0
  205. package/lib/azure-publicipaddress/lib/public-ip-address-schemas.js +227 -0
  206. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +247 -0
  207. package/lib/azure-publicipaddress/lib/public-ip-address.js +245 -0
  208. package/lib/azure-publicipaddress/test/public-ip-address.integ.d.ts +9 -0
  209. package/lib/azure-publicipaddress/test/public-ip-address.integ.js +75 -0
  210. package/lib/azure-publicipaddress/test/public-ip-address.spec.d.ts +15 -0
  211. package/lib/azure-publicipaddress/test/public-ip-address.spec.js +498 -0
  212. package/lib/azure-resourcegroup/index.d.ts +0 -37
  213. package/lib/azure-resourcegroup/index.js +1 -39
  214. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  215. package/lib/azure-resourcegroup/lib/index.js +2 -43
  216. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  217. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  218. package/lib/azure-resourcegroup/test/resource-group.integ.js +23 -11
  219. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  220. package/lib/azure-roleassignment/index.d.ts +1 -0
  221. package/lib/azure-roleassignment/index.js +18 -0
  222. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  223. package/lib/azure-roleassignment/lib/index.js +19 -0
  224. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  225. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  226. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  227. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  228. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  229. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  230. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  231. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  232. package/lib/azure-roledefinition/index.d.ts +1 -0
  233. package/lib/azure-roledefinition/index.js +18 -0
  234. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  235. package/lib/azure-roledefinition/lib/index.js +19 -0
  236. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  237. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  238. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  239. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  240. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  241. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  242. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  243. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  244. package/lib/azure-storageaccount/index.d.ts +0 -19
  245. package/lib/azure-storageaccount/index.js +1 -20
  246. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  247. package/lib/azure-storageaccount/lib/index.js +2 -8
  248. package/lib/azure-storageaccount/lib/storage-account-schemas.d.ts +98 -0
  249. package/lib/azure-storageaccount/lib/storage-account-schemas.js +1 -1
  250. package/lib/azure-storageaccount/lib/storage-account.d.ts +40 -8
  251. package/lib/azure-storageaccount/lib/storage-account.js +145 -23
  252. package/lib/azure-storageaccount/test/storage-account.integ.js +91 -12
  253. package/lib/azure-subnet/index.d.ts +1 -0
  254. package/lib/azure-subnet/index.js +18 -0
  255. package/lib/azure-subnet/lib/index.d.ts +2 -0
  256. package/lib/azure-subnet/lib/index.js +19 -0
  257. package/lib/azure-subnet/lib/subnet-schemas.d.ts +32 -0
  258. package/lib/azure-subnet/lib/subnet-schemas.js +237 -0
  259. package/lib/azure-subnet/lib/subnet.d.ts +274 -0
  260. package/lib/azure-subnet/lib/subnet.js +235 -0
  261. package/lib/azure-subnet/test/subnet.integ.d.ts +11 -0
  262. package/lib/azure-subnet/test/subnet.integ.js +92 -0
  263. package/lib/azure-subnet/test/subnet.spec.d.ts +8 -0
  264. package/lib/azure-subnet/test/subnet.spec.js +395 -0
  265. package/lib/azure-virtualmachine/index.d.ts +1 -0
  266. package/lib/azure-virtualmachine/index.js +18 -0
  267. package/lib/azure-virtualmachine/lib/index.d.ts +2 -0
  268. package/lib/azure-virtualmachine/lib/index.js +19 -0
  269. package/lib/azure-virtualmachine/lib/virtual-machine-schemas.d.ts +327 -0
  270. package/lib/azure-virtualmachine/lib/virtual-machine-schemas.js +544 -0
  271. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +368 -0
  272. package/lib/azure-virtualmachine/lib/virtual-machine.js +441 -0
  273. package/lib/azure-virtualmachine/test/virtual-machine.integ.d.ts +9 -0
  274. package/lib/azure-virtualmachine/test/virtual-machine.integ.js +220 -0
  275. package/lib/azure-virtualmachine/test/virtual-machine.spec.d.ts +9 -0
  276. package/lib/azure-virtualmachine/test/virtual-machine.spec.js +1032 -0
  277. package/lib/azure-virtualnetwork/index.d.ts +1 -0
  278. package/lib/azure-virtualnetwork/index.js +18 -0
  279. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -0
  280. package/lib/azure-virtualnetwork/lib/index.js +19 -0
  281. package/lib/azure-virtualnetwork/lib/virtual-network-schemas.d.ts +32 -0
  282. package/lib/azure-virtualnetwork/lib/virtual-network-schemas.js +236 -0
  283. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +204 -0
  284. package/lib/azure-virtualnetwork/lib/virtual-network.js +224 -0
  285. package/lib/azure-virtualnetwork/test/virtual-network.integ.d.ts +9 -0
  286. package/lib/azure-virtualnetwork/test/virtual-network.integ.js +91 -0
  287. package/lib/azure-virtualnetwork/test/virtual-network.spec.d.ts +8 -0
  288. package/lib/azure-virtualnetwork/test/virtual-network.spec.js +398 -0
  289. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  290. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  291. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  292. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  293. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  294. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  295. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  296. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  297. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  298. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  299. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  300. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  301. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  302. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  303. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  304. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  305. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  306. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  307. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  308. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  309. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  310. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  311. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  312. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  313. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  314. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  315. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  316. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  317. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  318. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  319. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  320. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  321. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  322. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  323. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  324. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  325. package/lib/azure-vmss/index.d.ts +1 -0
  326. package/lib/azure-vmss/index.js +18 -0
  327. package/lib/azure-vmss/lib/index.d.ts +2 -0
  328. package/lib/azure-vmss/lib/index.js +19 -0
  329. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +250 -0
  330. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +479 -0
  331. package/lib/azure-vmss/lib/vmss-schemas.d.ts +472 -0
  332. package/lib/azure-vmss/lib/vmss-schemas.js +444 -0
  333. package/lib/azure-vmss/test/virtual-machine-scale-set.integ.d.ts +15 -0
  334. package/lib/azure-vmss/test/virtual-machine-scale-set.integ.js +261 -0
  335. package/lib/azure-vmss/test/virtual-machine-scale-set.spec.d.ts +8 -0
  336. package/lib/azure-vmss/test/virtual-machine-scale-set.spec.js +997 -0
  337. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  338. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  339. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +268 -48
  340. package/lib/core-azure/lib/azapi/azapi-resource.js +411 -136
  341. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  342. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.d.ts +33 -21
  343. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +69 -27
  344. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.d.ts +134 -120
  345. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +209 -59
  346. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-action/index.d.ts +141 -128
  347. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-action/index.js +183 -36
  348. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-id/index.d.ts +55 -43
  349. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-id/index.js +94 -26
  350. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-list/index.d.ts +129 -116
  351. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-list/index.js +155 -32
  352. package/lib/core-azure/lib/azapi/providers-azapi/data-plane-resource/index.d.ts +187 -174
  353. package/lib/core-azure/lib/azapi/providers-azapi/data-plane-resource/index.js +267 -48
  354. package/lib/core-azure/lib/azapi/providers-azapi/index.d.ts +10 -10
  355. package/lib/core-azure/lib/azapi/providers-azapi/index.js +1 -1
  356. package/lib/core-azure/lib/azapi/providers-azapi/lazy-index.d.ts +0 -0
  357. package/lib/core-azure/lib/azapi/providers-azapi/lazy-index.js +13 -0
  358. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.d.ts +174 -162
  359. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +278 -16
  360. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.d.ts +239 -225
  361. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +360 -76
  362. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.d.ts +163 -150
  363. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +221 -46
  364. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.d.ts +162 -149
  365. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +249 -50
  366. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  367. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  368. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  369. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  370. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +13 -6
  371. package/lib/core-azure/lib/index.d.ts +2 -2
  372. package/lib/core-azure/lib/index.js +5 -5
  373. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  374. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  375. package/lib/index.d.ts +56 -0
  376. package/lib/index.js +59 -2
  377. package/lib/testing/index.d.ts +92 -2
  378. package/lib/testing/index.js +258 -18
  379. package/lib/testing/lib/cleanup.d.ts +230 -0
  380. package/lib/testing/lib/cleanup.js +338 -0
  381. package/lib/testing/lib/metadata.d.ts +151 -0
  382. package/lib/testing/lib/metadata.js +183 -0
  383. package/lib/testing/lib/naming.d.ts +96 -0
  384. package/lib/testing/lib/naming.js +336 -0
  385. package/node_modules/uuid/LICENSE.md +9 -0
  386. package/node_modules/uuid/README.md +510 -0
  387. package/node_modules/uuid/dist/cjs/index.d.ts +15 -0
  388. package/node_modules/uuid/dist/cjs/index.js +31 -0
  389. package/node_modules/uuid/dist/cjs/max.d.ts +2 -0
  390. package/node_modules/uuid/dist/cjs/max.js +3 -0
  391. package/node_modules/uuid/dist/cjs/md5.d.ts +4 -0
  392. package/node_modules/uuid/dist/cjs/md5.js +13 -0
  393. package/node_modules/uuid/dist/cjs/native.d.ts +6 -0
  394. package/node_modules/uuid/dist/cjs/native.js +4 -0
  395. package/node_modules/uuid/dist/cjs/nil.d.ts +2 -0
  396. package/node_modules/uuid/dist/cjs/nil.js +3 -0
  397. package/node_modules/uuid/dist/cjs/package.json +1 -0
  398. package/node_modules/uuid/dist/cjs/parse.d.ts +2 -0
  399. package/node_modules/uuid/dist/cjs/parse.js +11 -0
  400. package/node_modules/uuid/dist/cjs/regex.d.ts +2 -0
  401. package/node_modules/uuid/dist/cjs/regex.js +3 -0
  402. package/node_modules/uuid/dist/cjs/rng.d.ts +1 -0
  403. package/node_modules/uuid/dist/cjs/rng.js +13 -0
  404. package/node_modules/uuid/dist/cjs/sha1.d.ts +4 -0
  405. package/node_modules/uuid/dist/cjs/sha1.js +13 -0
  406. package/node_modules/uuid/dist/cjs/stringify.d.ts +3 -0
  407. package/node_modules/uuid/dist/cjs/stringify.js +39 -0
  408. package/node_modules/uuid/dist/cjs/types.d.ts +21 -0
  409. package/node_modules/uuid/dist/cjs/types.js +2 -0
  410. package/node_modules/uuid/dist/cjs/uuid-bin.d.ts +1 -0
  411. package/node_modules/uuid/dist/cjs/uuid-bin.js +72 -0
  412. package/node_modules/uuid/dist/cjs/v1.d.ts +11 -0
  413. package/node_modules/uuid/dist/cjs/v1.js +87 -0
  414. package/node_modules/uuid/dist/cjs/v1ToV6.d.ts +2 -0
  415. package/node_modules/uuid/dist/cjs/v1ToV6.js +13 -0
  416. package/node_modules/uuid/dist/cjs/v3.d.ts +9 -0
  417. package/node_modules/uuid/dist/cjs/v3.js +14 -0
  418. package/node_modules/uuid/dist/cjs/v35.d.ts +7 -0
  419. package/node_modules/uuid/dist/cjs/v35.js +41 -0
  420. package/node_modules/uuid/dist/cjs/v4.d.ts +4 -0
  421. package/node_modules/uuid/dist/cjs/v4.js +29 -0
  422. package/node_modules/uuid/dist/cjs/v5.d.ts +9 -0
  423. package/node_modules/uuid/dist/cjs/v5.js +14 -0
  424. package/node_modules/uuid/dist/cjs/v6.d.ts +4 -0
  425. package/node_modules/uuid/dist/cjs/v6.js +19 -0
  426. package/node_modules/uuid/dist/cjs/v6ToV1.d.ts +2 -0
  427. package/node_modules/uuid/dist/cjs/v6ToV1.js +13 -0
  428. package/node_modules/uuid/dist/cjs/v7.d.ts +9 -0
  429. package/node_modules/uuid/dist/cjs/v7.js +69 -0
  430. package/node_modules/uuid/dist/cjs/validate.d.ts +2 -0
  431. package/node_modules/uuid/dist/cjs/validate.js +7 -0
  432. package/node_modules/uuid/dist/cjs/version.d.ts +2 -0
  433. package/node_modules/uuid/dist/cjs/version.js +10 -0
  434. package/node_modules/uuid/dist/cjs-browser/index.d.ts +15 -0
  435. package/node_modules/uuid/dist/cjs-browser/index.js +31 -0
  436. package/node_modules/uuid/dist/cjs-browser/max.d.ts +2 -0
  437. package/node_modules/uuid/dist/cjs-browser/max.js +3 -0
  438. package/node_modules/uuid/dist/cjs-browser/md5.d.ts +2 -0
  439. package/node_modules/uuid/dist/cjs-browser/md5.js +137 -0
  440. package/node_modules/uuid/dist/cjs-browser/native.d.ts +4 -0
  441. package/node_modules/uuid/dist/cjs-browser/native.js +4 -0
  442. package/node_modules/uuid/dist/cjs-browser/nil.d.ts +2 -0
  443. package/node_modules/uuid/dist/cjs-browser/nil.js +3 -0
  444. package/node_modules/uuid/dist/cjs-browser/package.json +1 -0
  445. package/node_modules/uuid/dist/cjs-browser/parse.d.ts +2 -0
  446. package/node_modules/uuid/dist/cjs-browser/parse.js +11 -0
  447. package/node_modules/uuid/dist/cjs-browser/regex.d.ts +2 -0
  448. package/node_modules/uuid/dist/cjs-browser/regex.js +3 -0
  449. package/node_modules/uuid/dist/cjs-browser/rng.d.ts +1 -0
  450. package/node_modules/uuid/dist/cjs-browser/rng.js +14 -0
  451. package/node_modules/uuid/dist/cjs-browser/sha1.d.ts +2 -0
  452. package/node_modules/uuid/dist/cjs-browser/sha1.js +72 -0
  453. package/node_modules/uuid/dist/cjs-browser/stringify.d.ts +3 -0
  454. package/node_modules/uuid/dist/cjs-browser/stringify.js +39 -0
  455. package/node_modules/uuid/dist/cjs-browser/types.d.ts +21 -0
  456. package/node_modules/uuid/dist/cjs-browser/types.js +2 -0
  457. package/node_modules/uuid/dist/cjs-browser/uuid-bin.d.ts +1 -0
  458. package/node_modules/uuid/dist/cjs-browser/uuid-bin.js +72 -0
  459. package/node_modules/uuid/dist/cjs-browser/v1.d.ts +11 -0
  460. package/node_modules/uuid/dist/cjs-browser/v1.js +87 -0
  461. package/node_modules/uuid/dist/cjs-browser/v1ToV6.d.ts +2 -0
  462. package/node_modules/uuid/dist/cjs-browser/v1ToV6.js +13 -0
  463. package/node_modules/uuid/dist/cjs-browser/v3.d.ts +9 -0
  464. package/node_modules/uuid/dist/cjs-browser/v3.js +14 -0
  465. package/node_modules/uuid/dist/cjs-browser/v35.d.ts +7 -0
  466. package/node_modules/uuid/dist/cjs-browser/v35.js +41 -0
  467. package/node_modules/uuid/dist/cjs-browser/v4.d.ts +4 -0
  468. package/node_modules/uuid/dist/cjs-browser/v4.js +29 -0
  469. package/node_modules/uuid/dist/cjs-browser/v5.d.ts +9 -0
  470. package/node_modules/uuid/dist/cjs-browser/v5.js +14 -0
  471. package/node_modules/uuid/dist/cjs-browser/v6.d.ts +4 -0
  472. package/node_modules/uuid/dist/cjs-browser/v6.js +19 -0
  473. package/node_modules/uuid/dist/cjs-browser/v6ToV1.d.ts +2 -0
  474. package/node_modules/uuid/dist/cjs-browser/v6ToV1.js +13 -0
  475. package/node_modules/uuid/dist/cjs-browser/v7.d.ts +9 -0
  476. package/node_modules/uuid/dist/cjs-browser/v7.js +69 -0
  477. package/node_modules/uuid/dist/cjs-browser/validate.d.ts +2 -0
  478. package/node_modules/uuid/dist/cjs-browser/validate.js +7 -0
  479. package/node_modules/uuid/dist/cjs-browser/version.d.ts +2 -0
  480. package/node_modules/uuid/dist/cjs-browser/version.js +10 -0
  481. package/node_modules/uuid/dist/esm/bin/uuid +2 -0
  482. package/node_modules/uuid/dist/esm/index.d.ts +15 -0
  483. package/node_modules/uuid/dist/esm/index.js +14 -0
  484. package/node_modules/uuid/dist/esm/max.d.ts +2 -0
  485. package/node_modules/uuid/dist/esm/max.js +1 -0
  486. package/node_modules/uuid/dist/esm/md5.d.ts +4 -0
  487. package/node_modules/uuid/dist/esm/md5.js +11 -0
  488. package/node_modules/uuid/dist/esm/native.d.ts +6 -0
  489. package/node_modules/uuid/dist/esm/native.js +2 -0
  490. package/node_modules/uuid/dist/esm/nil.d.ts +2 -0
  491. package/node_modules/uuid/dist/esm/nil.js +1 -0
  492. package/node_modules/uuid/dist/esm/parse.d.ts +2 -0
  493. package/node_modules/uuid/dist/esm/parse.js +9 -0
  494. package/node_modules/uuid/dist/esm/regex.d.ts +2 -0
  495. package/node_modules/uuid/dist/esm/regex.js +1 -0
  496. package/node_modules/uuid/dist/esm/rng.d.ts +1 -0
  497. package/node_modules/uuid/dist/esm/rng.js +10 -0
  498. package/node_modules/uuid/dist/esm/sha1.d.ts +4 -0
  499. package/node_modules/uuid/dist/esm/sha1.js +11 -0
  500. package/node_modules/uuid/dist/esm/stringify.d.ts +3 -0
  501. package/node_modules/uuid/dist/esm/stringify.js +35 -0
  502. package/node_modules/uuid/dist/esm/types.d.ts +21 -0
  503. package/node_modules/uuid/dist/esm/types.js +1 -0
  504. package/node_modules/uuid/dist/esm/uuid-bin.d.ts +1 -0
  505. package/node_modules/uuid/dist/esm/uuid-bin.js +70 -0
  506. package/node_modules/uuid/dist/esm/v1.d.ts +11 -0
  507. package/node_modules/uuid/dist/esm/v1.js +83 -0
  508. package/node_modules/uuid/dist/esm/v1ToV6.d.ts +2 -0
  509. package/node_modules/uuid/dist/esm/v1ToV6.js +10 -0
  510. package/node_modules/uuid/dist/esm/v3.d.ts +9 -0
  511. package/node_modules/uuid/dist/esm/v3.js +9 -0
  512. package/node_modules/uuid/dist/esm/v35.d.ts +7 -0
  513. package/node_modules/uuid/dist/esm/v35.js +36 -0
  514. package/node_modules/uuid/dist/esm/v4.d.ts +4 -0
  515. package/node_modules/uuid/dist/esm/v4.js +27 -0
  516. package/node_modules/uuid/dist/esm/v5.d.ts +9 -0
  517. package/node_modules/uuid/dist/esm/v5.js +9 -0
  518. package/node_modules/uuid/dist/esm/v6.d.ts +4 -0
  519. package/node_modules/uuid/dist/esm/v6.js +17 -0
  520. package/node_modules/uuid/dist/esm/v6ToV1.d.ts +2 -0
  521. package/node_modules/uuid/dist/esm/v6ToV1.js +10 -0
  522. package/node_modules/uuid/dist/esm/v7.d.ts +9 -0
  523. package/node_modules/uuid/dist/esm/v7.js +65 -0
  524. package/node_modules/uuid/dist/esm/validate.d.ts +2 -0
  525. package/node_modules/uuid/dist/esm/validate.js +5 -0
  526. package/node_modules/uuid/dist/esm/version.d.ts +2 -0
  527. package/node_modules/uuid/dist/esm/version.js +8 -0
  528. package/node_modules/uuid/dist/esm-browser/index.d.ts +15 -0
  529. package/node_modules/uuid/dist/esm-browser/index.js +14 -0
  530. package/node_modules/uuid/dist/esm-browser/max.d.ts +2 -0
  531. package/node_modules/uuid/dist/esm-browser/max.js +1 -0
  532. package/node_modules/uuid/dist/esm-browser/md5.d.ts +2 -0
  533. package/node_modules/uuid/dist/esm-browser/md5.js +135 -0
  534. package/node_modules/uuid/dist/esm-browser/native.d.ts +4 -0
  535. package/node_modules/uuid/dist/esm-browser/native.js +2 -0
  536. package/node_modules/uuid/dist/esm-browser/nil.d.ts +2 -0
  537. package/node_modules/uuid/dist/esm-browser/nil.js +1 -0
  538. package/node_modules/uuid/dist/esm-browser/parse.d.ts +2 -0
  539. package/node_modules/uuid/dist/esm-browser/parse.js +9 -0
  540. package/node_modules/uuid/dist/esm-browser/regex.d.ts +2 -0
  541. package/node_modules/uuid/dist/esm-browser/regex.js +1 -0
  542. package/node_modules/uuid/dist/esm-browser/rng.d.ts +1 -0
  543. package/node_modules/uuid/dist/esm-browser/rng.js +11 -0
  544. package/node_modules/uuid/dist/esm-browser/sha1.d.ts +2 -0
  545. package/node_modules/uuid/dist/esm-browser/sha1.js +70 -0
  546. package/node_modules/uuid/dist/esm-browser/stringify.d.ts +3 -0
  547. package/node_modules/uuid/dist/esm-browser/stringify.js +35 -0
  548. package/node_modules/uuid/dist/esm-browser/types.d.ts +21 -0
  549. package/node_modules/uuid/dist/esm-browser/types.js +1 -0
  550. package/node_modules/uuid/dist/esm-browser/uuid-bin.d.ts +1 -0
  551. package/node_modules/uuid/dist/esm-browser/uuid-bin.js +70 -0
  552. package/node_modules/uuid/dist/esm-browser/v1.d.ts +11 -0
  553. package/node_modules/uuid/dist/esm-browser/v1.js +83 -0
  554. package/node_modules/uuid/dist/esm-browser/v1ToV6.d.ts +2 -0
  555. package/node_modules/uuid/dist/esm-browser/v1ToV6.js +10 -0
  556. package/node_modules/uuid/dist/esm-browser/v3.d.ts +9 -0
  557. package/node_modules/uuid/dist/esm-browser/v3.js +9 -0
  558. package/node_modules/uuid/dist/esm-browser/v35.d.ts +7 -0
  559. package/node_modules/uuid/dist/esm-browser/v35.js +36 -0
  560. package/node_modules/uuid/dist/esm-browser/v4.d.ts +4 -0
  561. package/node_modules/uuid/dist/esm-browser/v4.js +27 -0
  562. package/node_modules/uuid/dist/esm-browser/v5.d.ts +9 -0
  563. package/node_modules/uuid/dist/esm-browser/v5.js +9 -0
  564. package/node_modules/uuid/dist/esm-browser/v6.d.ts +4 -0
  565. package/node_modules/uuid/dist/esm-browser/v6.js +17 -0
  566. package/node_modules/uuid/dist/esm-browser/v6ToV1.d.ts +2 -0
  567. package/node_modules/uuid/dist/esm-browser/v6ToV1.js +10 -0
  568. package/node_modules/uuid/dist/esm-browser/v7.d.ts +9 -0
  569. package/node_modules/uuid/dist/esm-browser/v7.js +65 -0
  570. package/node_modules/uuid/dist/esm-browser/validate.d.ts +2 -0
  571. package/node_modules/uuid/dist/esm-browser/validate.js +5 -0
  572. package/node_modules/uuid/dist/esm-browser/version.d.ts +2 -0
  573. package/node_modules/uuid/dist/esm-browser/version.js +8 -0
  574. package/node_modules/uuid/package.json +132 -0
  575. package/package.json +17 -12
  576. package/scripts/cleanup-test-resources.ts +387 -0
  577. package/scripts/generate-index.js +25 -8
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Cleanup and verification utilities for integration tests
3
+ *
4
+ * Provides functions for verifying resource deletion via Azure Resource Graph
5
+ * and finding/cleaning orphaned resources with comprehensive safety mechanisms.
6
+ */
7
+ /**
8
+ * Metadata for an individual resource created during testing
9
+ */
10
+ export interface ResourceMetadata {
11
+ /**
12
+ * Azure resource ID
13
+ */
14
+ readonly resourceId: string;
15
+ /**
16
+ * Azure resource type (e.g., 'Microsoft.Resources/resourceGroups')
17
+ */
18
+ readonly resourceType: string;
19
+ /**
20
+ * Resource name
21
+ */
22
+ readonly name: string;
23
+ /**
24
+ * Resource location (Azure region)
25
+ */
26
+ readonly location?: string;
27
+ /**
28
+ * Resource tags
29
+ */
30
+ readonly tags: Record<string, string>;
31
+ /**
32
+ * Test run ID that created this resource
33
+ */
34
+ readonly testRunId: string;
35
+ /**
36
+ * Timestamp when resource was created
37
+ */
38
+ readonly createdAt: Date;
39
+ /**
40
+ * Whether this resource was successfully destroyed
41
+ */
42
+ readonly destroyed?: boolean;
43
+ /**
44
+ * Timestamp when resource was destroyed
45
+ */
46
+ readonly destroyedAt?: Date;
47
+ }
48
+ /**
49
+ * Result of resource cleanup verification
50
+ */
51
+ export interface VerificationResult {
52
+ /**
53
+ * Whether verification succeeded (all resources deleted)
54
+ */
55
+ readonly success: boolean;
56
+ /**
57
+ * Human-readable message describing the result
58
+ */
59
+ readonly message: string;
60
+ /**
61
+ * List of orphaned resource IDs (if any)
62
+ */
63
+ readonly orphanedResources: string[];
64
+ /**
65
+ * Number of resources expected to be deleted
66
+ */
67
+ readonly expectedCount?: number;
68
+ /**
69
+ * Number of resources actually found
70
+ */
71
+ readonly foundCount?: number;
72
+ }
73
+ /**
74
+ * Options for cleanup operations
75
+ */
76
+ export interface CleanupOptions {
77
+ /**
78
+ * Whether to perform dry-run (no actual deletion)
79
+ */
80
+ readonly dryRun: boolean;
81
+ /**
82
+ * Minimum age in hours before resource can be cleaned up
83
+ * Set to 0 to force cleanup of all resources regardless of age (bypasses safety checks)
84
+ */
85
+ readonly minAgeHours: number;
86
+ /**
87
+ * Azure subscription ID to target (optional)
88
+ */
89
+ readonly subscription?: string;
90
+ /**
91
+ * Specific resource groups to target (optional)
92
+ */
93
+ readonly resourceGroups?: string[];
94
+ /**
95
+ * Maximum number of resources to clean up in one operation
96
+ */
97
+ readonly maxResources?: number;
98
+ }
99
+ /**
100
+ * Orphaned resource information
101
+ */
102
+ export interface OrphanedResource {
103
+ /**
104
+ * Azure resource ID
105
+ */
106
+ readonly resourceId: string;
107
+ /**
108
+ * Azure resource type
109
+ */
110
+ readonly resourceType: string;
111
+ /**
112
+ * Resource name
113
+ */
114
+ readonly name: string;
115
+ /**
116
+ * Resource location
117
+ */
118
+ readonly location: string;
119
+ /**
120
+ * Resource group name
121
+ */
122
+ readonly resourceGroup: string;
123
+ /**
124
+ * Test run ID from tags
125
+ */
126
+ readonly testRunId: string;
127
+ /**
128
+ * Creation timestamp from tags
129
+ */
130
+ readonly createdAt: Date;
131
+ /**
132
+ * Cleanup after timestamp from tags
133
+ */
134
+ readonly cleanupAfter: Date;
135
+ /**
136
+ * Test name from tags
137
+ */
138
+ readonly testName: string;
139
+ /**
140
+ * Age in hours since creation
141
+ */
142
+ readonly ageHours: number;
143
+ }
144
+ /**
145
+ * Result of cleanup operation
146
+ */
147
+ export interface CleanupResult {
148
+ /**
149
+ * Number of resources successfully deleted
150
+ */
151
+ readonly deleted: number;
152
+ /**
153
+ * Number of resources that failed to delete
154
+ */
155
+ readonly failed: number;
156
+ /**
157
+ * Number of resources skipped (e.g., too young)
158
+ */
159
+ readonly skipped: number;
160
+ /**
161
+ * Detailed error messages for failures
162
+ */
163
+ readonly errors?: string[];
164
+ }
165
+ /**
166
+ * Main cleanup service class
167
+ */
168
+ export declare class ResourceCleanupService {
169
+ /**
170
+ * Checks if Azure CLI is available
171
+ */
172
+ checkAzureCliAvailable(): boolean;
173
+ /**
174
+ * Executes an Azure CLI command with error handling
175
+ */
176
+ private executeAzureCommand;
177
+ /**
178
+ * Queries Azure Resource Graph for resources by tags
179
+ *
180
+ * Returns empty array on errors for graceful degradation.
181
+ */
182
+ queryAzureResourcesByTags(tags: Record<string, string>, subscription?: string): any[];
183
+ }
184
+ /**
185
+ * Verifies that all resources with a specific test run ID are deleted
186
+ *
187
+ * Performs Azure Resource Graph query to check for remaining resources.
188
+ * Implements retry logic to handle Azure's eventual consistency.
189
+ *
190
+ * @param runId - Test run UUID to verify
191
+ * @param expectedResources - List of resources that should be deleted
192
+ * @param subscription - Optional subscription ID to query
193
+ * @returns Verification result with details
194
+ */
195
+ export declare function verifyResourcesDeleted(runId: string, expectedResources: ResourceMetadata[], subscription?: string): VerificationResult;
196
+ /**
197
+ * Finds orphaned test resources that are past their TTL
198
+ *
199
+ * Queries Azure for resources with test tags that are older than
200
+ * their cleanup-after timestamp.
201
+ *
202
+ * @param options - Cleanup options
203
+ * @returns List of orphaned resources
204
+ */
205
+ export declare function findOrphanedResources(options: CleanupOptions): Promise<OrphanedResource[]>;
206
+ /**
207
+ * Cleans up orphaned test resources
208
+ *
209
+ * Deletes resource groups containing orphaned test resources.
210
+ * Implements safety checks and dry-run mode.
211
+ *
212
+ * @param resources - List of orphaned resources to clean up
213
+ * @param options - Cleanup options
214
+ * @returns Cleanup result with statistics
215
+ */
216
+ export declare function cleanupOrphanedResources(resources: OrphanedResource[], options: CleanupOptions): Promise<CleanupResult>;
217
+ /**
218
+ * Verifies resource cleanup with retry logic for eventual consistency
219
+ *
220
+ * Wrapper around verifyResourcesDeleted that implements retry logic
221
+ * to handle Azure's eventual consistency delays.
222
+ *
223
+ * @param runId - Test run UUID to verify
224
+ * @param expectedResources - List of resources that should be deleted
225
+ * @param subscription - Optional subscription ID to query
226
+ * @param maxRetries - Maximum number of retry attempts
227
+ * @param retryWaitMs - Wait time between retries in milliseconds
228
+ * @returns Final verification result
229
+ */
230
+ export declare function verifyResourcesDeletedWithRetry(runId: string, expectedResources: ResourceMetadata[], subscription?: string, maxRetries?: number, retryWaitMs?: number): Promise<VerificationResult>;
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ResourceCleanupService = void 0;
5
+ exports.verifyResourcesDeleted = verifyResourcesDeleted;
6
+ exports.findOrphanedResources = findOrphanedResources;
7
+ exports.cleanupOrphanedResources = cleanupOrphanedResources;
8
+ exports.verifyResourcesDeletedWithRetry = verifyResourcesDeletedWithRetry;
9
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
10
+ /**
11
+ * Cleanup and verification utilities for integration tests
12
+ *
13
+ * Provides functions for verifying resource deletion via Azure Resource Graph
14
+ * and finding/cleaning orphaned resources with comprehensive safety mechanisms.
15
+ */
16
+ const child_process_1 = require("child_process");
17
+ /**
18
+ * Minimum age threshold (hours) before cleanup is allowed
19
+ */
20
+ const MINIMUM_AGE_HOURS = 2;
21
+ /**
22
+ * Maximum retry attempts for eventual consistency
23
+ */
24
+ const MAX_RETRIES = 5;
25
+ /**
26
+ * Wait time between retries (milliseconds)
27
+ */
28
+ const RETRY_WAIT_MS = 30000; // 30 seconds
29
+ /**
30
+ * Main cleanup service class
31
+ */
32
+ class ResourceCleanupService {
33
+ /**
34
+ * Checks if Azure CLI is available
35
+ */
36
+ checkAzureCliAvailable() {
37
+ try {
38
+ (0, child_process_1.execSync)("az --version", { stdio: "pipe" });
39
+ return true;
40
+ }
41
+ catch (error) {
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * Executes an Azure CLI command with error handling
47
+ */
48
+ executeAzureCommand(command) {
49
+ try {
50
+ return (0, child_process_1.execSync)(command, {
51
+ encoding: "utf-8",
52
+ stdio: "pipe",
53
+ });
54
+ }
55
+ catch (error) {
56
+ throw new Error(`Azure CLI command failed: ${error.message}\n` +
57
+ `Command: ${command}\n` +
58
+ `Stderr: ${error.stderr?.toString() || "N/A"}`);
59
+ }
60
+ }
61
+ /**
62
+ * Queries Azure Resource Graph for resources by tags
63
+ *
64
+ * Returns empty array on errors for graceful degradation.
65
+ */
66
+ queryAzureResourcesByTags(tags, subscription) {
67
+ // Build tag filter conditions
68
+ const tagConditions = Object.entries(tags)
69
+ .map(([key, value]) => `tags['${key}'] == '${value}'`)
70
+ .join(" and ");
71
+ const query = `
72
+ Resources
73
+ | where ${tagConditions}
74
+ | project id, type, name, location, resourceGroup, tags
75
+ `;
76
+ const subscriptionArg = subscription
77
+ ? `--subscriptions "${subscription}"`
78
+ : "";
79
+ const command = `az graph query -q "${query.replace(/\n/g, " ")}" ${subscriptionArg} --output json`;
80
+ try {
81
+ const result = this.executeAzureCommand(command);
82
+ const parsed = JSON.parse(result);
83
+ return parsed.data || [];
84
+ }
85
+ catch (error) {
86
+ console.error("Failed to query Azure Resource Graph:", error.message);
87
+ return [];
88
+ }
89
+ }
90
+ }
91
+ exports.ResourceCleanupService = ResourceCleanupService;
92
+ _a = JSII_RTTI_SYMBOL_1;
93
+ ResourceCleanupService[_a] = { fqn: "@microsoft/terraform-cdk-constructs.ResourceCleanupService", version: "1.3.0" };
94
+ /**
95
+ * Verifies that all resources with a specific test run ID are deleted
96
+ *
97
+ * Performs Azure Resource Graph query to check for remaining resources.
98
+ * Implements retry logic to handle Azure's eventual consistency.
99
+ *
100
+ * @param runId - Test run UUID to verify
101
+ * @param expectedResources - List of resources that should be deleted
102
+ * @param subscription - Optional subscription ID to query
103
+ * @returns Verification result with details
104
+ */
105
+ function verifyResourcesDeleted(runId, expectedResources, subscription) {
106
+ const service = new ResourceCleanupService();
107
+ // Check if Azure CLI is available before attempting verification
108
+ if (!service.checkAzureCliAvailable()) {
109
+ return {
110
+ success: false,
111
+ message: "Verification failed: Azure CLI is not available",
112
+ orphanedResources: [],
113
+ expectedCount: expectedResources.length,
114
+ foundCount: -1,
115
+ };
116
+ }
117
+ try {
118
+ const orphanedResources = service.queryAzureResourcesByTags({ "test-run-id": runId }, subscription);
119
+ if (orphanedResources.length > 0) {
120
+ const resourceIds = orphanedResources.map((r) => r.id);
121
+ return {
122
+ success: false,
123
+ message: `Found ${orphanedResources.length} orphaned resources after destroy`,
124
+ orphanedResources: resourceIds,
125
+ expectedCount: expectedResources.length,
126
+ foundCount: orphanedResources.length,
127
+ };
128
+ }
129
+ return {
130
+ success: true,
131
+ message: "All resources successfully deleted",
132
+ orphanedResources: [],
133
+ expectedCount: expectedResources.length,
134
+ foundCount: 0,
135
+ };
136
+ }
137
+ catch (error) {
138
+ return {
139
+ success: false,
140
+ message: `Verification failed: ${error.message}`,
141
+ orphanedResources: [],
142
+ expectedCount: expectedResources.length,
143
+ foundCount: -1,
144
+ };
145
+ }
146
+ }
147
+ /**
148
+ * Finds orphaned test resources that are past their TTL
149
+ *
150
+ * Queries Azure for resources with test tags that are older than
151
+ * their cleanup-after timestamp.
152
+ *
153
+ * @param options - Cleanup options
154
+ * @returns List of orphaned resources
155
+ */
156
+ async function findOrphanedResources(options) {
157
+ const now = new Date();
158
+ console.log(`[Cleanup] Searching for orphaned test resources...`);
159
+ console.log(`[Cleanup] Minimum age: ${options.minAgeHours} hours`);
160
+ // Query for test resources
161
+ // NOTE: Tag names use hyphens instead of colons because Azure DNS zones
162
+ // and some other resource types don't support colons in tag names.
163
+ const query = `
164
+ Resources
165
+ | where tags['test-managed-by'] == 'terraform-cdk-constructs-tests'
166
+ | where tags['test-auto-cleanup'] == 'true'
167
+ | project id, type, name, location, resourceGroup,
168
+ testRunId = tags['test-run-id'],
169
+ createdAt = tags['test-created-at'],
170
+ cleanupAfter = tags['test-cleanup-after'],
171
+ testName = tags['test-name']
172
+ | order by tostring(createdAt) asc
173
+ `;
174
+ try {
175
+ const subscriptionArg = options.subscription
176
+ ? `--subscriptions "${options.subscription}"`
177
+ : "";
178
+ const command = `az graph query -q "${query.replace(/\n/g, " ")}" ${subscriptionArg} --output json`;
179
+ const result = (0, child_process_1.execSync)(command, {
180
+ encoding: "utf-8",
181
+ stdio: "pipe",
182
+ });
183
+ const parsed = JSON.parse(result);
184
+ const resources = parsed.data || [];
185
+ console.log(`[Cleanup] Found ${resources.length} test resources`);
186
+ // Filter by age and cleanup eligibility
187
+ const orphaned = [];
188
+ for (const resource of resources) {
189
+ const createdAt = new Date(resource.createdAt);
190
+ const cleanupAfter = new Date(resource.cleanupAfter);
191
+ const ageHours = (now.getTime() - createdAt.getTime()) / (60 * 60 * 1000);
192
+ // Apply safety checks
193
+ // When minAgeHours is 0 (force mode), skip the minimum age validation
194
+ if (options.minAgeHours > 0 && ageHours < MINIMUM_AGE_HOURS) {
195
+ console.log(`[Cleanup] Skipping ${resource.name}: too young (${ageHours.toFixed(1)}h < ${MINIMUM_AGE_HOURS}h)`);
196
+ continue;
197
+ }
198
+ // Check TTL (cleanup-after timestamp)
199
+ // When minAgeHours is 0 (force mode), skip the TTL check as well
200
+ if (options.minAgeHours > 0 && now < cleanupAfter) {
201
+ console.log(`[Cleanup] Skipping ${resource.name}: not yet eligible for cleanup`);
202
+ continue;
203
+ }
204
+ if (ageHours < options.minAgeHours) {
205
+ console.log(`[Cleanup] Skipping ${resource.name}: younger than min age (${ageHours.toFixed(1)}h < ${options.minAgeHours}h)`);
206
+ continue;
207
+ }
208
+ orphaned.push({
209
+ resourceId: resource.id,
210
+ resourceType: resource.type,
211
+ name: resource.name,
212
+ location: resource.location,
213
+ resourceGroup: resource.resourceGroup,
214
+ testRunId: resource.testRunId,
215
+ createdAt,
216
+ cleanupAfter,
217
+ testName: resource.testName,
218
+ ageHours,
219
+ });
220
+ }
221
+ console.log(`[Cleanup] Found ${orphaned.length} orphaned resources eligible for cleanup`);
222
+ // Limit resources if specified
223
+ if (options.maxResources && orphaned.length > options.maxResources) {
224
+ console.log(`[Cleanup] Limiting to ${options.maxResources} resources`);
225
+ return orphaned.slice(0, options.maxResources);
226
+ }
227
+ return orphaned;
228
+ }
229
+ catch (error) {
230
+ console.error("[Cleanup] Failed to find orphaned resources:", error.message);
231
+ throw error;
232
+ }
233
+ }
234
+ /**
235
+ * Cleans up orphaned test resources
236
+ *
237
+ * Deletes resource groups containing orphaned test resources.
238
+ * Implements safety checks and dry-run mode.
239
+ *
240
+ * @param resources - List of orphaned resources to clean up
241
+ * @param options - Cleanup options
242
+ * @returns Cleanup result with statistics
243
+ */
244
+ async function cleanupOrphanedResources(resources, options) {
245
+ if (resources.length === 0) {
246
+ console.log("[Cleanup] No resources to clean up");
247
+ return { deleted: 0, failed: 0, skipped: 0 };
248
+ }
249
+ if (options.dryRun) {
250
+ console.log("[Cleanup] DRY RUN - Would delete the following resources:");
251
+ resources.forEach((r) => {
252
+ console.log(` - ${r.name} (${r.resourceType}) in ${r.resourceGroup} - Age: ${r.ageHours.toFixed(1)}h`);
253
+ });
254
+ return { deleted: 0, failed: 0, skipped: resources.length };
255
+ }
256
+ // Group resources by resource group for efficient deletion
257
+ const byResourceGroup = new Map();
258
+ for (const resource of resources) {
259
+ const group = byResourceGroup.get(resource.resourceGroup) || [];
260
+ group.push(resource);
261
+ byResourceGroup.set(resource.resourceGroup, group);
262
+ }
263
+ console.log(`[Cleanup] Deleting ${byResourceGroup.size} resource groups containing ${resources.length} resources`);
264
+ let deleted = 0;
265
+ let failed = 0;
266
+ const errors = [];
267
+ for (const [rgName, rgResources] of byResourceGroup) {
268
+ try {
269
+ console.log(`[Cleanup] Deleting resource group: ${rgName} (${rgResources.length} resources)`);
270
+ // Validate that all resources in the group are test resources
271
+ // When minAgeHours is 0 (force mode), allow deletion of resources below minimum age
272
+ const allTestResources = rgResources.every((r) => r.testRunId &&
273
+ (options.minAgeHours === 0 || r.ageHours >= MINIMUM_AGE_HOURS));
274
+ if (!allTestResources) {
275
+ console.warn(`[Cleanup] Skipping ${rgName}: not all resources are valid test resources`);
276
+ failed += rgResources.length;
277
+ errors.push(`Resource group ${rgName} contains non-test resources`);
278
+ continue;
279
+ }
280
+ // Delete resource group (async, no-wait)
281
+ (0, child_process_1.execSync)(`az group delete --name "${rgName}" --yes --no-wait`, {
282
+ encoding: "utf-8",
283
+ stdio: "pipe",
284
+ });
285
+ deleted += rgResources.length;
286
+ console.log(`[Cleanup] ✓ Initiated deletion of ${rgName}`);
287
+ }
288
+ catch (error) {
289
+ console.error(`[Cleanup] ✗ Failed to delete ${rgName}:`, error.message);
290
+ failed += rgResources.length;
291
+ errors.push(`Failed to delete ${rgName}: ${error.message}`);
292
+ }
293
+ }
294
+ const result = {
295
+ deleted,
296
+ failed,
297
+ skipped: 0,
298
+ errors: errors.length > 0 ? errors : undefined,
299
+ };
300
+ console.log("[Cleanup] Summary:");
301
+ console.log(` - Deleted: ${result.deleted} resources`);
302
+ console.log(` - Failed: ${result.failed} resources`);
303
+ if (result.errors) {
304
+ console.log(` - Errors: ${result.errors.length}`);
305
+ }
306
+ return result;
307
+ }
308
+ /**
309
+ * Verifies resource cleanup with retry logic for eventual consistency
310
+ *
311
+ * Wrapper around verifyResourcesDeleted that implements retry logic
312
+ * to handle Azure's eventual consistency delays.
313
+ *
314
+ * @param runId - Test run UUID to verify
315
+ * @param expectedResources - List of resources that should be deleted
316
+ * @param subscription - Optional subscription ID to query
317
+ * @param maxRetries - Maximum number of retry attempts
318
+ * @param retryWaitMs - Wait time between retries in milliseconds
319
+ * @returns Final verification result
320
+ */
321
+ async function verifyResourcesDeletedWithRetry(runId, expectedResources, subscription, maxRetries = MAX_RETRIES, retryWaitMs = RETRY_WAIT_MS) {
322
+ let lastResult;
323
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
324
+ console.log(`[Verification] Attempt ${attempt}/${maxRetries}`);
325
+ lastResult = verifyResourcesDeleted(runId, expectedResources, subscription);
326
+ if (lastResult.success) {
327
+ console.log("[Verification] ✓ All resources confirmed deleted");
328
+ return lastResult;
329
+ }
330
+ if (attempt < maxRetries) {
331
+ console.log(`[Verification] Found ${lastResult.foundCount} resources, retrying in ${retryWaitMs / 1000}s...`);
332
+ await new Promise((resolve) => setTimeout(resolve, retryWaitMs));
333
+ }
334
+ }
335
+ console.error(`[Verification] ✗ Failed after ${maxRetries} attempts: ${lastResult.message}`);
336
+ return lastResult;
337
+ }
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW51cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2xpYi9jbGVhbnVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUF5U0Esd0RBbURDO0FBV0Qsc0RBeUdDO0FBWUQsNERBd0ZDO0FBZUQsMEVBK0JDOztBQWxtQkQ7Ozs7O0dBS0c7QUFFSCxpREFBeUM7QUFpTXpDOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUI7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7O0dBRUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxhQUFhO0FBRTFDOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7O09BRUc7SUFDSSxzQkFBc0I7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsSUFBQSx3QkFBUSxFQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxPQUFlO1FBQ3pDLElBQUksQ0FBQztZQUNILE9BQU8sSUFBQSx3QkFBUSxFQUFDLE9BQU8sRUFBRTtnQkFDdkIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLEtBQUssRUFBRSxNQUFNO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw2QkFBNkIsS0FBSyxDQUFDLE9BQU8sSUFBSTtnQkFDNUMsWUFBWSxPQUFPLElBQUk7Z0JBQ3ZCLFdBQVcsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FDakQsQ0FBQztRQUNK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VUFBVSxHQUFHLHNCQUFzQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU1RSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7WUFDaEUsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsd0JBQXdCLFVBQVUsQ0FBQyxVQUFVLDJCQUEyQixXQUFXLEdBQUcsSUFBSSxNQUFNLENBQ2pHLENBQUM7WUFDRixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUNYLGlDQUFpQyxVQUFVLGNBQWMsVUFBVyxDQUFDLE9BQU8sRUFBRSxDQUMvRSxDQUFDO0lBQ0YsT0FBTyxVQUFXLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xlYW51cCBhbmQgdmVyaWZpY2F0aW9uIHV0aWxpdGllcyBmb3IgaW50ZWdyYXRpb24gdGVzdHNcbiAqXG4gKiBQcm92aWRlcyBmdW5jdGlvbnMgZm9yIHZlcmlmeWluZyByZXNvdXJjZSBkZWxldGlvbiB2aWEgQXp1cmUgUmVzb3VyY2UgR3JhcGhcbiAqIGFuZCBmaW5kaW5nL2NsZWFuaW5nIG9ycGhhbmVkIHJlc291cmNlcyB3aXRoIGNvbXByZWhlbnNpdmUgc2FmZXR5IG1lY2hhbmlzbXMuXG4gKi9cblxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuXG4vKipcbiAqIE1ldGFkYXRhIGZvciBhbiBpbmRpdmlkdWFsIHJlc291cmNlIGNyZWF0ZWQgZHVyaW5nIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEF6dXJlIHJlc291cmNlIElEXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sICdNaWNyb3NvZnQuUmVzb3VyY2VzL3Jlc291cmNlR3JvdXBzJylcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIGxvY2F0aW9uIChBenVyZSByZWdpb24pXG4gICAqL1xuICByZWFkb25seSBsb2NhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogVGVzdCBydW4gSUQgdGhhdCBjcmVhdGVkIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RSdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiByZXNvdXJjZSB3YXMgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWxseSBkZXN0cm95ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3Ryb3llZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHJlc291cmNlIHdhcyBkZXN0cm95ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3Ryb3llZEF0PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgcmVzb3VyY2UgY2xlYW51cCB2ZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25SZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIChhbGwgcmVzb3VyY2VzIGRlbGV0ZWQpXG4gICAqL1xuICByZWFkb25seSBzdWNjZXNzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdFxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG9ycGhhbmVkIHJlc291cmNlIElEcyAoaWYgYW55KVxuICAgKi9cbiAgcmVhZG9ubHkgb3JwaGFuZWRSZXNvdXJjZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzb3VyY2VzIGV4cGVjdGVkIHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXNvdXJjZXMgYWN0dWFsbHkgZm91bmRcbiAgICovXG4gIHJlYWRvbmx5IGZvdW5kQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY2xlYW51cCBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xlYW51cE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwZXJmb3JtIGRyeS1ydW4gKG5vIGFjdHVhbCBkZWxldGlvbilcbiAgICovXG4gIHJlYWRvbmx5IGRyeVJ1bjogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW11bSBhZ2UgaW4gaG91cnMgYmVmb3JlIHJlc291cmNlIGNhbiBiZSBjbGVhbmVkIHVwXG4gICAqIFNldCB0byAwIHRvIGZvcmNlIGNsZWFudXAgb2YgYWxsIHJlc291cmNlcyByZWdhcmRsZXNzIG9mIGFnZSAoYnlwYXNzZXMgc2FmZXR5IGNoZWNrcylcbiAgICovXG4gIHJlYWRvbmx5IG1pbkFnZUhvdXJzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF6dXJlIHN1YnNjcmlwdGlvbiBJRCB0byB0YXJnZXQgKG9wdGlvbmFsKVxuICAgKi9cbiAgcmVhZG9ubHkgc3Vic2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpYyByZXNvdXJjZSBncm91cHMgdG8gdGFyZ2V0IChvcHRpb25hbClcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlR3JvdXBzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHJlc291cmNlcyB0byBjbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gICAqL1xuICByZWFkb25seSBtYXhSZXNvdXJjZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3JwaGFuZWQgcmVzb3VyY2UgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcnBoYW5lZFJlc291cmNlIHtcbiAgLyoqXG4gICAqIEF6dXJlIHJlc291cmNlIElEXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF6dXJlIHJlc291cmNlIHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIGxvY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBncm91cCBuYW1lXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUdyb3VwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRlc3QgcnVuIElEIGZyb20gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGVzdFJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0aW9uIHRpbWVzdGFtcCBmcm9tIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICAvKipcbiAgICogQ2xlYW51cCBhZnRlciB0aW1lc3RhbXAgZnJvbSB0YWdzXG4gICAqL1xuICByZWFkb25seSBjbGVhbnVwQWZ0ZXI6IERhdGU7XG5cbiAgLyoqXG4gICAqIFRlc3QgbmFtZSBmcm9tIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRlc3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFnZSBpbiBob3VycyBzaW5jZSBjcmVhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWdlSG91cnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY2xlYW51cCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGVhbnVwUmVzdWx0IHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXNvdXJjZXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlbGV0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGZhaWxlZCB0byBkZWxldGVcbiAgICovXG4gIHJlYWRvbmx5IGZhaWxlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzb3VyY2VzIHNraXBwZWQgKGUuZy4sIHRvbyB5b3VuZylcbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgZm9yIGZhaWx1cmVzXG4gICAqL1xuICByZWFkb25seSBlcnJvcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNaW5pbXVtIGFnZSB0aHJlc2hvbGQgKGhvdXJzKSBiZWZvcmUgY2xlYW51cCBpcyBhbGxvd2VkXG4gKi9cbmNvbnN0IE1JTklNVU1fQUdFX0hPVVJTID0gMjtcblxuLyoqXG4gKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIGZvciBldmVudHVhbCBjb25zaXN0ZW5jeVxuICovXG5jb25zdCBNQVhfUkVUUklFUyA9IDU7XG5cbi8qKlxuICogV2FpdCB0aW1lIGJldHdlZW4gcmV0cmllcyAobWlsbGlzZWNvbmRzKVxuICovXG5jb25zdCBSRVRSWV9XQUlUX01TID0gMzAwMDA7IC8vIDMwIHNlY29uZHNcblxuLyoqXG4gKiBNYWluIGNsZWFudXAgc2VydmljZSBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VDbGVhbnVwU2VydmljZSB7XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgQXp1cmUgQ0xJIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHVibGljIGNoZWNrQXp1cmVDbGlBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKFwiYXogLS12ZXJzaW9uXCIsIHsgc3RkaW86IFwicGlwZVwiIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gQXp1cmUgQ0xJIGNvbW1hbmQgd2l0aCBlcnJvciBoYW5kbGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRlQXp1cmVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBleGVjU3luYyhjb21tYW5kLCB7XG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEF6dXJlIENMSSBjb21tYW5kIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfVxcbmAgK1xuICAgICAgICAgIGBDb21tYW5kOiAke2NvbW1hbmR9XFxuYCArXG4gICAgICAgICAgYFN0ZGVycjogJHtlcnJvci5zdGRlcnI/LnRvU3RyaW5nKCkgfHwgXCJOL0FcIn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUXVlcmllcyBBenVyZSBSZXNvdXJjZSBHcmFwaCBmb3IgcmVzb3VyY2VzIGJ5IHRhZ3NcbiAgICpcbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBvbiBlcnJvcnMgZm9yIGdyYWNlZnVsIGRlZ3JhZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHF1ZXJ5QXp1cmVSZXNvdXJjZXNCeVRhZ3MoXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBzdWJzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IGFueVtdIHtcbiAgICAvLyBCdWlsZCB0YWcgZmlsdGVyIGNvbmRpdGlvbnNcbiAgICBjb25zdCB0YWdDb25kaXRpb25zID0gT2JqZWN0LmVudHJpZXModGFncylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYHRhZ3NbJyR7a2V5fSddID09ICcke3ZhbHVlfSdgKVxuICAgICAgLmpvaW4oXCIgYW5kIFwiKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgUmVzb3VyY2VzXG4gICAgICB8IHdoZXJlICR7dGFnQ29uZGl0aW9uc31cbiAgICAgIHwgcHJvamVjdCBpZCwgdHlwZSwgbmFtZSwgbG9jYXRpb24sIHJlc291cmNlR3JvdXAsIHRhZ3NcbiAgICBgO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQXJnID0gc3Vic2NyaXB0aW9uXG4gICAgICA/IGAtLXN1YnNjcmlwdGlvbnMgXCIke3N1YnNjcmlwdGlvbn1cImBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBgYXogZ3JhcGggcXVlcnkgLXEgXCIke3F1ZXJ5LnJlcGxhY2UoL1xcbi9nLCBcIiBcIil9XCIgJHtzdWJzY3JpcHRpb25Bcmd9IC0tb3V0cHV0IGpzb25gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXhlY3V0ZUF6dXJlQ29tbWFuZChjb21tYW5kKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgIHJldHVybiBwYXJzZWQuZGF0YSB8fCBbXTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHF1ZXJ5IEF6dXJlIFJlc291cmNlIEdyYXBoOlwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IGFsbCByZXNvdXJjZXMgd2l0aCBhIHNwZWNpZmljIHRlc3QgcnVuIElEIGFyZSBkZWxldGVkXG4gKlxuICogUGVyZm9ybXMgQXp1cmUgUmVzb3VyY2UgR3JhcGggcXVlcnkgdG8gY2hlY2sgZm9yIHJlbWFpbmluZyByZXNvdXJjZXMuXG4gKiBJbXBsZW1lbnRzIHJldHJ5IGxvZ2ljIHRvIGhhbmRsZSBBenVyZSdzIGV2ZW50dWFsIGNvbnNpc3RlbmN5LlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRlc3QgcnVuIFVVSUQgdG8gdmVyaWZ5XG4gKiBAcGFyYW0gZXhwZWN0ZWRSZXNvdXJjZXMgLSBMaXN0IG9mIHJlc291cmNlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkXG4gKiBAcGFyYW0gc3Vic2NyaXB0aW9uIC0gT3B0aW9uYWwgc3Vic2NyaXB0aW9uIElEIHRvIHF1ZXJ5XG4gKiBAcmV0dXJucyBWZXJpZmljYXRpb24gcmVzdWx0IHdpdGggZGV0YWlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5UmVzb3VyY2VzRGVsZXRlZChcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZXhwZWN0ZWRSZXNvdXJjZXM6IFJlc291cmNlTWV0YWRhdGFbXSxcbiAgc3Vic2NyaXB0aW9uPzogc3RyaW5nLFxuKTogVmVyaWZpY2F0aW9uUmVzdWx0IHtcbiAgY29uc3Qgc2VydmljZSA9IG5ldyBSZXNvdXJjZUNsZWFudXBTZXJ2aWNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgQXp1cmUgQ0xJIGlzIGF2YWlsYWJsZSBiZWZvcmUgYXR0ZW1wdGluZyB2ZXJpZmljYXRpb25cbiAgaWYgKCFzZXJ2aWNlLmNoZWNrQXp1cmVDbGlBdmFpbGFibGUoKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2U6IFwiVmVyaWZpY2F0aW9uIGZhaWxlZDogQXp1cmUgQ0xJIGlzIG5vdCBhdmFpbGFibGVcIixcbiAgICAgIG9ycGhhbmVkUmVzb3VyY2VzOiBbXSxcbiAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkUmVzb3VyY2VzLmxlbmd0aCxcbiAgICAgIGZvdW5kQ291bnQ6IC0xLFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG9ycGhhbmVkUmVzb3VyY2VzID0gc2VydmljZS5xdWVyeUF6dXJlUmVzb3VyY2VzQnlUYWdzKFxuICAgICAgeyBcInRlc3QtcnVuLWlkXCI6IHJ1bklkIH0sXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgKTtcblxuICAgIGlmIChvcnBoYW5lZFJlc291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXNvdXJjZUlkcyA9IG9ycGhhbmVkUmVzb3VyY2VzLm1hcCgocjogYW55KSA9PiByLmlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRm91bmQgJHtvcnBoYW5lZFJlc291cmNlcy5sZW5ndGh9IG9ycGhhbmVkIHJlc291cmNlcyBhZnRlciBkZXN0cm95YCxcbiAgICAgICAgb3JwaGFuZWRSZXNvdXJjZXM6IHJlc291cmNlSWRzLFxuICAgICAgICBleHBlY3RlZENvdW50OiBleHBlY3RlZFJlc291cmNlcy5sZW5ndGgsXG4gICAgICAgIGZvdW5kQ291bnQ6IG9ycGhhbmVkUmVzb3VyY2VzLmxlbmd0aCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBcIkFsbCByZXNvdXJjZXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIixcbiAgICAgIG9ycGhhbmVkUmVzb3VyY2VzOiBbXSxcbiAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkUmVzb3VyY2VzLmxlbmd0aCxcbiAgICAgIGZvdW5kQ291bnQ6IDAsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIG1lc3NhZ2U6IGBWZXJpZmljYXRpb24gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgIG9ycGhhbmVkUmVzb3VyY2VzOiBbXSxcbiAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkUmVzb3VyY2VzLmxlbmd0aCxcbiAgICAgIGZvdW5kQ291bnQ6IC0xLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kcyBvcnBoYW5lZCB0ZXN0IHJlc291cmNlcyB0aGF0IGFyZSBwYXN0IHRoZWlyIFRUTFxuICpcbiAqIFF1ZXJpZXMgQXp1cmUgZm9yIHJlc291cmNlcyB3aXRoIHRlc3QgdGFncyB0aGF0IGFyZSBvbGRlciB0aGFuXG4gKiB0aGVpciBjbGVhbnVwLWFmdGVyIHRpbWVzdGFtcC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENsZWFudXAgb3B0aW9uc1xuICogQHJldHVybnMgTGlzdCBvZiBvcnBoYW5lZCByZXNvdXJjZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPcnBoYW5lZFJlc291cmNlcyhcbiAgb3B0aW9uczogQ2xlYW51cE9wdGlvbnMsXG4pOiBQcm9taXNlPE9ycGhhbmVkUmVzb3VyY2VbXT4ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gIGNvbnNvbGUubG9nKGBbQ2xlYW51cF0gU2VhcmNoaW5nIGZvciBvcnBoYW5lZCB0ZXN0IHJlc291cmNlcy4uLmApO1xuICBjb25zb2xlLmxvZyhgW0NsZWFudXBdIE1pbmltdW0gYWdlOiAke29wdGlvbnMubWluQWdlSG91cnN9IGhvdXJzYCk7XG5cbiAgLy8gUXVlcnkgZm9yIHRlc3QgcmVzb3VyY2VzXG4gIC8vIE5PVEU6IFRhZyBuYW1lcyB1c2UgaHlwaGVucyBpbnN0ZWFkIG9mIGNvbG9ucyBiZWNhdXNlIEF6dXJlIEROUyB6b25lc1xuICAvLyBhbmQgc29tZSBvdGhlciByZXNvdXJjZSB0eXBlcyBkb24ndCBzdXBwb3J0IGNvbG9ucyBpbiB0YWcgbmFtZXMuXG4gIGNvbnN0IHF1ZXJ5ID0gYFxuICAgIFJlc291cmNlc1xuICAgIHwgd2hlcmUgdGFnc1sndGVzdC1tYW5hZ2VkLWJ5J10gPT0gJ3RlcnJhZm9ybS1jZGstY29uc3RydWN0cy10ZXN0cydcbiAgICB8IHdoZXJlIHRhZ3NbJ3Rlc3QtYXV0by1jbGVhbnVwJ10gPT0gJ3RydWUnXG4gICAgfCBwcm9qZWN0IGlkLCB0eXBlLCBuYW1lLCBsb2NhdGlvbiwgcmVzb3VyY2VHcm91cCxcbiAgICAgICAgICAgICAgdGVzdFJ1bklkID0gdGFnc1sndGVzdC1ydW4taWQnXSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0ID0gdGFnc1sndGVzdC1jcmVhdGVkLWF0J10sXG4gICAgICAgICAgICAgIGNsZWFudXBBZnRlciA9IHRhZ3NbJ3Rlc3QtY2xlYW51cC1hZnRlciddLFxuICAgICAgICAgICAgICB0ZXN0TmFtZSA9IHRhZ3NbJ3Rlc3QtbmFtZSddXG4gICAgfCBvcmRlciBieSB0b3N0cmluZyhjcmVhdGVkQXQpIGFzY1xuICBgO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQXJnID0gb3B0aW9ucy5zdWJzY3JpcHRpb25cbiAgICAgID8gYC0tc3Vic2NyaXB0aW9ucyBcIiR7b3B0aW9ucy5zdWJzY3JpcHRpb259XCJgXG4gICAgICA6IFwiXCI7XG5cbiAgICBjb25zdCBjb21tYW5kID0gYGF6IGdyYXBoIHF1ZXJ5IC1xIFwiJHtxdWVyeS5yZXBsYWNlKC9cXG4vZywgXCIgXCIpfVwiICR7c3Vic2NyaXB0aW9uQXJnfSAtLW91dHB1dCBqc29uYDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gcGFyc2VkLmRhdGEgfHwgW107XG5cbiAgICBjb25zb2xlLmxvZyhgW0NsZWFudXBdIEZvdW5kICR7cmVzb3VyY2VzLmxlbmd0aH0gdGVzdCByZXNvdXJjZXNgKTtcblxuICAgIC8vIEZpbHRlciBieSBhZ2UgYW5kIGNsZWFudXAgZWxpZ2liaWxpdHlcbiAgICBjb25zdCBvcnBoYW5lZDogT3JwaGFuZWRSZXNvdXJjZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUocmVzb3VyY2UuY3JlYXRlZEF0KTtcbiAgICAgIGNvbnN0IGNsZWFudXBBZnRlciA9IG5ldyBEYXRlKHJlc291cmNlLmNsZWFudXBBZnRlcik7XG4gICAgICBjb25zdCBhZ2VIb3VycyA9IChub3cuZ2V0VGltZSgpIC0gY3JlYXRlZEF0LmdldFRpbWUoKSkgLyAoNjAgKiA2MCAqIDEwMDApO1xuXG4gICAgICAvLyBBcHBseSBzYWZldHkgY2hlY2tzXG4gICAgICAvLyBXaGVuIG1pbkFnZUhvdXJzIGlzIDAgKGZvcmNlIG1vZGUpLCBza2lwIHRoZSBtaW5pbXVtIGFnZSB2YWxpZGF0aW9uXG4gICAgICBpZiAob3B0aW9ucy5taW5BZ2VIb3VycyA+IDAgJiYgYWdlSG91cnMgPCBNSU5JTVVNX0FHRV9IT1VSUykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW0NsZWFudXBdIFNraXBwaW5nICR7cmVzb3VyY2UubmFtZX06IHRvbyB5b3VuZyAoJHthZ2VIb3Vycy50b0ZpeGVkKDEpfWggPCAke01JTklNVU1fQUdFX0hPVVJTfWgpYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIFRUTCAoY2xlYW51cC1hZnRlciB0aW1lc3RhbXApXG4gICAgICAvLyBXaGVuIG1pbkFnZUhvdXJzIGlzIDAgKGZvcmNlIG1vZGUpLCBza2lwIHRoZSBUVEwgY2hlY2sgYXMgd2VsbFxuICAgICAgaWYgKG9wdGlvbnMubWluQWdlSG91cnMgPiAwICYmIG5vdyA8IGNsZWFudXBBZnRlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW0NsZWFudXBdIFNraXBwaW5nICR7cmVzb3VyY2UubmFtZX06IG5vdCB5ZXQgZWxpZ2libGUgZm9yIGNsZWFudXBgLFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFnZUhvdXJzIDwgb3B0aW9ucy5taW5BZ2VIb3Vycykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW0NsZWFudXBdIFNraXBwaW5nICR7cmVzb3VyY2UubmFtZX06IHlvdW5nZXIgdGhhbiBtaW4gYWdlICgke2FnZUhvdXJzLnRvRml4ZWQoMSl9aCA8ICR7b3B0aW9ucy5taW5BZ2VIb3Vyc31oKWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBvcnBoYW5lZC5wdXNoKHtcbiAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2UuaWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgbmFtZTogcmVzb3VyY2UubmFtZSxcbiAgICAgICAgbG9jYXRpb246IHJlc291cmNlLmxvY2F0aW9uLFxuICAgICAgICByZXNvdXJjZUdyb3VwOiByZXNvdXJjZS5yZXNvdXJjZUdyb3VwLFxuICAgICAgICB0ZXN0UnVuSWQ6IHJlc291cmNlLnRlc3RSdW5JZCxcbiAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICBjbGVhbnVwQWZ0ZXIsXG4gICAgICAgIHRlc3ROYW1lOiByZXNvdXJjZS50ZXN0TmFtZSxcbiAgICAgICAgYWdlSG91cnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbQ2xlYW51cF0gRm91bmQgJHtvcnBoYW5lZC5sZW5ndGh9IG9ycGhhbmVkIHJlc291cmNlcyBlbGlnaWJsZSBmb3IgY2xlYW51cGAsXG4gICAgKTtcblxuICAgIC8vIExpbWl0IHJlc291cmNlcyBpZiBzcGVjaWZpZWRcbiAgICBpZiAob3B0aW9ucy5tYXhSZXNvdXJjZXMgJiYgb3JwaGFuZWQubGVuZ3RoID4gb3B0aW9ucy5tYXhSZXNvdXJjZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbQ2xlYW51cF0gTGltaXRpbmcgdG8gJHtvcHRpb25zLm1heFJlc291cmNlc30gcmVzb3VyY2VzYCk7XG4gICAgICByZXR1cm4gb3JwaGFuZWQuc2xpY2UoMCwgb3B0aW9ucy5tYXhSZXNvdXJjZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBvcnBoYW5lZDtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIltDbGVhbnVwXSBGYWlsZWQgdG8gZmluZCBvcnBoYW5lZCByZXNvdXJjZXM6XCIsXG4gICAgICBlcnJvci5tZXNzYWdlLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbnMgdXAgb3JwaGFuZWQgdGVzdCByZXNvdXJjZXNcbiAqXG4gKiBEZWxldGVzIHJlc291cmNlIGdyb3VwcyBjb250YWluaW5nIG9ycGhhbmVkIHRlc3QgcmVzb3VyY2VzLlxuICogSW1wbGVtZW50cyBzYWZldHkgY2hlY2tzIGFuZCBkcnktcnVuIG1vZGUuXG4gKlxuICogQHBhcmFtIHJlc291cmNlcyAtIExpc3Qgb2Ygb3JwaGFuZWQgcmVzb3VyY2VzIHRvIGNsZWFuIHVwXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENsZWFudXAgb3B0aW9uc1xuICogQHJldHVybnMgQ2xlYW51cCByZXN1bHQgd2l0aCBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRSZXNvdXJjZXMoXG4gIHJlc291cmNlczogT3JwaGFuZWRSZXNvdXJjZVtdLFxuICBvcHRpb25zOiBDbGVhbnVwT3B0aW9ucyxcbik6IFByb21pc2U8Q2xlYW51cFJlc3VsdD4ge1xuICBpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKFwiW0NsZWFudXBdIE5vIHJlc291cmNlcyB0byBjbGVhbiB1cFwiKTtcbiAgICByZXR1cm4geyBkZWxldGVkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIGNvbnNvbGUubG9nKFwiW0NsZWFudXBdIERSWSBSVU4gLSBXb3VsZCBkZWxldGUgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6XCIpO1xuICAgIHJlc291cmNlcy5mb3JFYWNoKChyKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYCAgLSAke3IubmFtZX0gKCR7ci5yZXNvdXJjZVR5cGV9KSBpbiAke3IucmVzb3VyY2VHcm91cH0gLSBBZ2U6ICR7ci5hZ2VIb3Vycy50b0ZpeGVkKDEpfWhgLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBkZWxldGVkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IHJlc291cmNlcy5sZW5ndGggfTtcbiAgfVxuXG4gIC8vIEdyb3VwIHJlc291cmNlcyBieSByZXNvdXJjZSBncm91cCBmb3IgZWZmaWNpZW50IGRlbGV0aW9uXG4gIGNvbnN0IGJ5UmVzb3VyY2VHcm91cCA9IG5ldyBNYXA8c3RyaW5nLCBPcnBoYW5lZFJlc291cmNlW10+KCk7XG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBieVJlc291cmNlR3JvdXAuZ2V0KHJlc291cmNlLnJlc291cmNlR3JvdXApIHx8IFtdO1xuICAgIGdyb3VwLnB1c2gocmVzb3VyY2UpO1xuICAgIGJ5UmVzb3VyY2VHcm91cC5zZXQocmVzb3VyY2UucmVzb3VyY2VHcm91cCwgZ3JvdXApO1xuICB9XG5cbiAgY29uc29sZS5sb2coXG4gICAgYFtDbGVhbnVwXSBEZWxldGluZyAke2J5UmVzb3VyY2VHcm91cC5zaXplfSByZXNvdXJjZSBncm91cHMgY29udGFpbmluZyAke3Jlc291cmNlcy5sZW5ndGh9IHJlc291cmNlc2AsXG4gICk7XG5cbiAgbGV0IGRlbGV0ZWQgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW3JnTmFtZSwgcmdSZXNvdXJjZXNdIG9mIGJ5UmVzb3VyY2VHcm91cCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtDbGVhbnVwXSBEZWxldGluZyByZXNvdXJjZSBncm91cDogJHtyZ05hbWV9ICgke3JnUmVzb3VyY2VzLmxlbmd0aH0gcmVzb3VyY2VzKWAsXG4gICAgICApO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IGFsbCByZXNvdXJjZXMgaW4gdGhlIGdyb3VwIGFyZSB0ZXN0IHJlc291cmNlc1xuICAgICAgLy8gV2hlbiBtaW5BZ2VIb3VycyBpcyAwIChmb3JjZSBtb2RlKSwgYWxsb3cgZGVsZXRpb24gb2YgcmVzb3VyY2VzIGJlbG93IG1pbmltdW0gYWdlXG4gICAgICBjb25zdCBhbGxUZXN0UmVzb3VyY2VzID0gcmdSZXNvdXJjZXMuZXZlcnkoXG4gICAgICAgIChyKSA9PlxuICAgICAgICAgIHIudGVzdFJ1bklkICYmXG4gICAgICAgICAgKG9wdGlvbnMubWluQWdlSG91cnMgPT09IDAgfHwgci5hZ2VIb3VycyA+PSBNSU5JTVVNX0FHRV9IT1VSUyksXG4gICAgICApO1xuXG4gICAgICBpZiAoIWFsbFRlc3RSZXNvdXJjZXMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbQ2xlYW51cF0gU2tpcHBpbmcgJHtyZ05hbWV9OiBub3QgYWxsIHJlc291cmNlcyBhcmUgdmFsaWQgdGVzdCByZXNvdXJjZXNgLFxuICAgICAgICApO1xuICAgICAgICBmYWlsZWQgKz0gcmdSZXNvdXJjZXMubGVuZ3RoO1xuICAgICAgICBlcnJvcnMucHVzaChgUmVzb3VyY2UgZ3JvdXAgJHtyZ05hbWV9IGNvbnRhaW5zIG5vbi10ZXN0IHJlc291cmNlc2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHJlc291cmNlIGdyb3VwIChhc3luYywgbm8td2FpdClcbiAgICAgIGV4ZWNTeW5jKGBheiBncm91cCBkZWxldGUgLS1uYW1lIFwiJHtyZ05hbWV9XCIgLS15ZXMgLS1uby13YWl0YCwge1xuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICB9KTtcblxuICAgICAgZGVsZXRlZCArPSByZ1Jlc291cmNlcy5sZW5ndGg7XG4gICAgICBjb25zb2xlLmxvZyhgW0NsZWFudXBdIOKckyBJbml0aWF0ZWQgZGVsZXRpb24gb2YgJHtyZ05hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW0NsZWFudXBdIOKclyBGYWlsZWQgdG8gZGVsZXRlICR7cmdOYW1lfTpgLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIGZhaWxlZCArPSByZ1Jlc291cmNlcy5sZW5ndGg7XG4gICAgICBlcnJvcnMucHVzaChgRmFpbGVkIHRvIGRlbGV0ZSAke3JnTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IENsZWFudXBSZXN1bHQgPSB7XG4gICAgZGVsZXRlZCxcbiAgICBmYWlsZWQsXG4gICAgc2tpcHBlZDogMCxcbiAgICBlcnJvcnM6IGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnNvbGUubG9nKFwiW0NsZWFudXBdIFN1bW1hcnk6XCIpO1xuICBjb25zb2xlLmxvZyhgICAtIERlbGV0ZWQ6ICR7cmVzdWx0LmRlbGV0ZWR9IHJlc291cmNlc2ApO1xuICBjb25zb2xlLmxvZyhgICAtIEZhaWxlZDogJHtyZXN1bHQuZmFpbGVkfSByZXNvdXJjZXNgKTtcbiAgaWYgKHJlc3VsdC5lcnJvcnMpIHtcbiAgICBjb25zb2xlLmxvZyhgICAtIEVycm9yczogJHtyZXN1bHQuZXJyb3JzLmxlbmd0aH1gKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgcmVzb3VyY2UgY2xlYW51cCB3aXRoIHJldHJ5IGxvZ2ljIGZvciBldmVudHVhbCBjb25zaXN0ZW5jeVxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIHZlcmlmeVJlc291cmNlc0RlbGV0ZWQgdGhhdCBpbXBsZW1lbnRzIHJldHJ5IGxvZ2ljXG4gKiB0byBoYW5kbGUgQXp1cmUncyBldmVudHVhbCBjb25zaXN0ZW5jeSBkZWxheXMuXG4gKlxuICogQHBhcmFtIHJ1bklkIC0gVGVzdCBydW4gVVVJRCB0byB2ZXJpZnlcbiAqIEBwYXJhbSBleHBlY3RlZFJlc291cmNlcyAtIExpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAqIEBwYXJhbSBzdWJzY3JpcHRpb24gLSBPcHRpb25hbCBzdWJzY3JpcHRpb24gSUQgdG8gcXVlcnlcbiAqIEBwYXJhbSBtYXhSZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHNcbiAqIEBwYXJhbSByZXRyeVdhaXRNcyAtIFdhaXQgdGltZSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBGaW5hbCB2ZXJpZmljYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZXNvdXJjZXNEZWxldGVkV2l0aFJldHJ5KFxuICBydW5JZDogc3RyaW5nLFxuICBleHBlY3RlZFJlc291cmNlczogUmVzb3VyY2VNZXRhZGF0YVtdLFxuICBzdWJzY3JpcHRpb24/OiBzdHJpbmcsXG4gIG1heFJldHJpZXM6IG51bWJlciA9IE1BWF9SRVRSSUVTLFxuICByZXRyeVdhaXRNczogbnVtYmVyID0gUkVUUllfV0FJVF9NUyxcbik6IFByb21pc2U8VmVyaWZpY2F0aW9uUmVzdWx0PiB7XG4gIGxldCBsYXN0UmVzdWx0OiBWZXJpZmljYXRpb25SZXN1bHQ7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc29sZS5sb2coYFtWZXJpZmljYXRpb25dIEF0dGVtcHQgJHthdHRlbXB0fS8ke21heFJldHJpZXN9YCk7XG5cbiAgICBsYXN0UmVzdWx0ID0gdmVyaWZ5UmVzb3VyY2VzRGVsZXRlZChydW5JZCwgZXhwZWN0ZWRSZXNvdXJjZXMsIHN1YnNjcmlwdGlvbik7XG5cbiAgICBpZiAobGFzdFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltWZXJpZmljYXRpb25dIOKckyBBbGwgcmVzb3VyY2VzIGNvbmZpcm1lZCBkZWxldGVkXCIpO1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtWZXJpZmljYXRpb25dIEZvdW5kICR7bGFzdFJlc3VsdC5mb3VuZENvdW50fSByZXNvdXJjZXMsIHJldHJ5aW5nIGluICR7cmV0cnlXYWl0TXMgLyAxMDAwfXMuLi5gLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJldHJ5V2FpdE1zKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5lcnJvcihcbiAgICBgW1ZlcmlmaWNhdGlvbl0g4pyXIEZhaWxlZCBhZnRlciAke21heFJldHJpZXN9IGF0dGVtcHRzOiAke2xhc3RSZXN1bHQhLm1lc3NhZ2V9YCxcbiAgKTtcbiAgcmV0dXJuIGxhc3RSZXN1bHQhO1xufVxuIl19