cax-design-system 2.8.2 → 2.8.3

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 (1726) hide show
  1. package/accordion/accordion.d.ts +224 -0
  2. package/accordion/accordion.interface.d.ts +49 -0
  3. package/accordion/accordion.module.d.ts +13 -0
  4. package/accordion/index.d.ts +3 -286
  5. package/accordion/public_api.d.ts +3 -0
  6. package/animate/animate.d.ts +40 -0
  7. package/animate/index.d.ts +3 -41
  8. package/animate/public_api.d.ts +1 -0
  9. package/animateonscroll/animateonscroll.d.ts +75 -0
  10. package/animateonscroll/index.d.ts +3 -75
  11. package/animateonscroll/public_api.d.ts +1 -0
  12. package/api/blockableui.d.ts +10 -0
  13. package/api/caxconfig.d.ts +24 -0
  14. package/api/confirmaeventtype.d.ts +8 -0
  15. package/api/confirmation.d.ts +96 -0
  16. package/api/confirmationservice.d.ts +30 -0
  17. package/api/contextmenuservice.d.ts +11 -0
  18. package/api/filtermatchmode.d.ts +22 -0
  19. package/api/filtermetadata.d.ts +18 -0
  20. package/api/filteroperator.d.ts +4 -0
  21. package/api/filterservice.d.ts +10 -0
  22. package/api/index.d.ts +3 -1856
  23. package/api/lazyloadevent.d.ts +47 -0
  24. package/api/lazyloadmeta.d.ts +19 -0
  25. package/api/megamenuitem.d.ts +130 -0
  26. package/api/menuitem.d.ts +176 -0
  27. package/api/message.d.ts +30 -0
  28. package/api/messageservice.d.ts +32 -0
  29. package/api/overlayoptions.d.ts +188 -0
  30. package/api/overlayservice.d.ts +9 -0
  31. package/api/primeicons.d.ts +313 -0
  32. package/api/public_api.d.ts +34 -0
  33. package/api/scrolleroptions.d.ts +116 -0
  34. package/api/selectitem.d.ts +12 -0
  35. package/api/selectitemgroup.d.ts +10 -0
  36. package/api/shared.d.ts +24 -0
  37. package/api/sortevent.d.ts +12 -0
  38. package/api/sortmeta.d.ts +8 -0
  39. package/api/tablestate.d.ts +60 -0
  40. package/api/themegeneratorservice.d.ts +12 -0
  41. package/api/tooltipoptions.d.ts +69 -0
  42. package/api/translation.d.ts +135 -0
  43. package/api/translationkeys.d.ts +50 -0
  44. package/api/treedragdropservice.d.ts +12 -0
  45. package/api/treenode.d.ts +91 -0
  46. package/api/treenodedragevent.d.ts +27 -0
  47. package/api/treetablenode.d.ts +36 -0
  48. package/autocomplete/autocomplete.d.ts +616 -0
  49. package/autocomplete/autocomplete.interface.d.ts +164 -0
  50. package/autocomplete/autocomplete.module.d.ts +20 -0
  51. package/autocomplete/index.d.ts +3 -799
  52. package/autocomplete/public_api.d.ts +3 -0
  53. package/autofocus/autofocus.d.ts +28 -0
  54. package/autofocus/index.d.ts +3 -29
  55. package/autofocus/public_api.d.ts +1 -0
  56. package/avatar/avatar.d.ts +73 -0
  57. package/avatar/avatar.module.d.ts +7 -0
  58. package/avatar/index.d.ts +3 -80
  59. package/avatar/public_api.d.ts +2 -0
  60. package/avatargroup/avatargroup.d.ts +21 -0
  61. package/avatargroup/avatargroup.module.d.ts +9 -0
  62. package/avatargroup/index.d.ts +3 -30
  63. package/avatargroup/public_api.d.ts +2 -0
  64. package/badge/badge.d.ts +21 -0
  65. package/badge/badge.directive.d.ts +35 -0
  66. package/badge/badge.module.d.ts +10 -0
  67. package/badge/index.d.ts +5 -67
  68. package/badge/public_api.d.ts +3 -0
  69. package/baseicon/baseicon.d.ts +15 -0
  70. package/baseicon/index.d.ts +5 -18
  71. package/baseicon/public_api.d.ts +1 -0
  72. package/blockui/blockui.d.ts +64 -0
  73. package/blockui/blockui.interface.d.ts +11 -0
  74. package/blockui/index.d.ts +3 -77
  75. package/blockui/public_api.d.ts +2 -0
  76. package/breadcrumb/breadcrumb.d.ts +55 -0
  77. package/breadcrumb/breadcrumb.interface.d.ts +38 -0
  78. package/breadcrumb/breadcrumb.module.d.ts +13 -0
  79. package/breadcrumb/index.d.ts +3 -105
  80. package/breadcrumb/public_api.d.ts +3 -0
  81. package/button/button.d.ts +85 -0
  82. package/button/button.directive.d.ts +49 -0
  83. package/button/button.interface.d.ts +30 -0
  84. package/button/button.module.d.ts +9 -0
  85. package/button/index.d.ts +3 -170
  86. package/button/public_api.d.ts +4 -0
  87. package/buttongroup/buttongroup.d.ts +11 -0
  88. package/buttongroup/index.d.ts +5 -14
  89. package/buttongroup/public_api.d.ts +1 -0
  90. package/calendar/calendar.d.ts +722 -0
  91. package/calendar/calendar.interface.d.ts +204 -0
  92. package/calendar/calendar.module.d.ts +9 -0
  93. package/calendar/index.d.ts +3 -935
  94. package/calendar/public_api.d.ts +3 -0
  95. package/card/card.d.ts +53 -0
  96. package/card/card.interface.d.ts +27 -0
  97. package/card/card.module.d.ts +11 -0
  98. package/card/index.d.ts +3 -92
  99. package/card/public_api.d.ts +3 -0
  100. package/carousel/carousel.d.ts +227 -0
  101. package/carousel/carousel.interface.d.ts +63 -0
  102. package/carousel/index.d.ts +3 -290
  103. package/carousel/public_api.d.ts +2 -0
  104. package/cascadeselect/cascadeselect.d.ts +435 -0
  105. package/cascadeselect/cascadeselect.interface.d.ts +115 -0
  106. package/cascadeselect/cascadeselect.module.d.ts +15 -0
  107. package/cascadeselect/index.d.ts +3 -564
  108. package/cascadeselect/public_api.d.ts +3 -0
  109. package/chart/chart.d.ts +87 -0
  110. package/chart/index.d.ts +3 -88
  111. package/chart/public_api.d.ts +1 -0
  112. package/checkbox/checkbox.d.ts +168 -0
  113. package/checkbox/checkbox.interface.d.ts +26 -0
  114. package/checkbox/checkbox.module.d.ts +10 -0
  115. package/checkbox/index.d.ts +3 -204
  116. package/checkbox/public_api.d.ts +3 -0
  117. package/chip/chip.d.ts +38 -0
  118. package/chip/chip.interface.d.ts +15 -0
  119. package/chip/chip.module.d.ts +10 -0
  120. package/chip/index.d.ts +3 -63
  121. package/chip/public_api.d.ts +3 -0
  122. package/chips/chips.d.ts +233 -0
  123. package/chips/chips.interface.d.ts +58 -0
  124. package/chips/chips.module.d.ts +14 -0
  125. package/chips/index.d.ts +3 -305
  126. package/chips/public_api.d.ts +3 -0
  127. package/colorpicker/colorpicker.d.ts +240 -0
  128. package/colorpicker/colorpicker.interface.d.ts +15 -0
  129. package/colorpicker/colorpicker.module.d.ts +9 -0
  130. package/colorpicker/index.d.ts +3 -265
  131. package/colorpicker/public_api.d.ts +3 -0
  132. package/commentbox/commentbox.d.ts +120 -0
  133. package/commentbox/commentbox.module.d.ts +17 -0
  134. package/commentbox/index.d.ts +5 -138
  135. package/commentbox/public_api.d.ts +2 -0
  136. package/confirmdialog/confirmdialog.d.ts +281 -0
  137. package/confirmdialog/confirmdialog.interface.d.ts +39 -0
  138. package/confirmdialog/confirmdialog.module.d.ts +15 -0
  139. package/confirmdialog/index.d.ts +3 -336
  140. package/confirmdialog/public_api.d.ts +3 -0
  141. package/confirmpopup/confirmpopup.d.ts +119 -0
  142. package/confirmpopup/confirmpopup.interface.d.ts +27 -0
  143. package/confirmpopup/index.d.ts +3 -148
  144. package/confirmpopup/public_api.d.ts +2 -0
  145. package/contextmenu/contextmenu.d.ts +260 -0
  146. package/contextmenu/index.d.ts +3 -261
  147. package/contextmenu/public_api.d.ts +1 -0
  148. package/dataview/dataview.d.ts +274 -0
  149. package/dataview/dataview.interface.d.ts +183 -0
  150. package/dataview/index.d.ts +3 -457
  151. package/dataview/public_api.d.ts +2 -0
  152. package/defer/defer.d.ts +39 -0
  153. package/defer/index.d.ts +3 -40
  154. package/defer/public_api.d.ts +1 -0
  155. package/dialog/dialog.d.ts +364 -0
  156. package/dialog/dialog.interface.d.ts +31 -0
  157. package/dialog/dialog.module.d.ts +15 -0
  158. package/dialog/index.d.ts +3 -411
  159. package/dialog/public_api.d.ts +3 -0
  160. package/divider/divider.d.ts +49 -0
  161. package/divider/divider.module.d.ts +7 -0
  162. package/divider/index.d.ts +3 -56
  163. package/divider/public_api.d.ts +2 -0
  164. package/dock/dock.d.ts +115 -0
  165. package/dock/dock.interface.d.ts +19 -0
  166. package/dock/index.d.ts +3 -136
  167. package/dock/public_api.d.ts +2 -0
  168. package/dom/connectedoverlayscrollhandler.d.ts +9 -0
  169. package/dom/domhandler.d.ts +95 -0
  170. package/dom/index.d.ts +3 -105
  171. package/dom/public_api.d.ts +2 -0
  172. package/dragdrop/dragdrop.d.ts +112 -0
  173. package/dragdrop/dragdrop.module.d.ts +8 -0
  174. package/dragdrop/index.d.ts +3 -120
  175. package/dragdrop/public_api.d.ts +2 -0
  176. package/dropdown/dropdown-item.d.ts +30 -0
  177. package/dropdown/dropdown.d.ts +628 -0
  178. package/dropdown/dropdown.interface.d.ts +154 -0
  179. package/dropdown/dropdown.module.d.ts +11 -0
  180. package/dropdown/index.d.ts +3 -818
  181. package/dropdown/public_api.d.ts +4 -0
  182. package/dynamicdialog/dialogservice.d.ts +35 -0
  183. package/dynamicdialog/dynamicdialog-config.d.ts +221 -0
  184. package/dynamicdialog/dynamicdialog-injector.d.ts +7 -0
  185. package/dynamicdialog/dynamicdialog-ref.d.ts +101 -0
  186. package/dynamicdialog/dynamicdialog.d.ts +124 -0
  187. package/dynamicdialog/dynamicdialogcontent.d.ts +8 -0
  188. package/dynamicdialog/index.d.ts +3 -490
  189. package/dynamicdialog/public_api.d.ts +6 -0
  190. package/editor/editor.d.ts +104 -0
  191. package/editor/editor.interface.d.ts +64 -0
  192. package/editor/editor.module.d.ts +9 -0
  193. package/editor/index.d.ts +3 -177
  194. package/editor/public_api.d.ts +3 -0
  195. package/esm2022/accordion/accordion.interface.mjs +2 -0
  196. package/esm2022/accordion/accordion.mjs +598 -0
  197. package/esm2022/accordion/accordion.module.mjs +23 -0
  198. package/esm2022/accordion/cax-design-system-accordion.mjs +5 -0
  199. package/esm2022/accordion/public_api.mjs +4 -0
  200. package/esm2022/animate/animate.mjs +101 -0
  201. package/esm2022/animate/cax-design-system-animate.mjs +5 -0
  202. package/esm2022/animate/public_api.mjs +2 -0
  203. package/esm2022/animateonscroll/animateonscroll.mjs +185 -0
  204. package/esm2022/animateonscroll/cax-design-system-animateonscroll.mjs +5 -0
  205. package/esm2022/animateonscroll/public_api.mjs +2 -0
  206. package/esm2022/api/blockableui.mjs +2 -0
  207. package/esm2022/api/cax-design-system-api.mjs +5 -0
  208. package/esm2022/api/caxconfig.mjs +163 -0
  209. package/esm2022/api/confirmaeventtype.mjs +10 -0
  210. package/esm2022/api/confirmation.mjs +2 -0
  211. package/esm2022/api/confirmationservice.mjs +43 -0
  212. package/esm2022/api/contextmenuservice.mjs +22 -0
  213. package/esm2022/api/filtermatchmode.mjs +23 -0
  214. package/esm2022/api/filtermetadata.mjs +2 -0
  215. package/esm2022/api/filteroperator.mjs +5 -0
  216. package/esm2022/api/filterservice.mjs +225 -0
  217. package/esm2022/api/lazyloadevent.mjs +2 -0
  218. package/esm2022/api/lazyloadmeta.mjs +2 -0
  219. package/esm2022/api/megamenuitem.mjs +2 -0
  220. package/esm2022/api/menuitem.mjs +2 -0
  221. package/esm2022/api/message.mjs +2 -0
  222. package/esm2022/api/messageservice.mjs +47 -0
  223. package/esm2022/api/overlayoptions.mjs +2 -0
  224. package/esm2022/api/overlayservice.mjs +19 -0
  225. package/esm2022/api/primeicons.mjs +314 -0
  226. package/esm2022/api/public_api.mjs +35 -0
  227. package/esm2022/api/scrolleroptions.mjs +2 -0
  228. package/esm2022/api/selectitem.mjs +2 -0
  229. package/esm2022/api/selectitemgroup.mjs +2 -0
  230. package/esm2022/api/shared.mjs +65 -0
  231. package/esm2022/api/sortevent.mjs +2 -0
  232. package/esm2022/api/sortmeta.mjs +2 -0
  233. package/esm2022/api/tablestate.mjs +2 -0
  234. package/esm2022/api/themegeneratorservice.mjs +109 -0
  235. package/esm2022/api/tooltipoptions.mjs +2 -0
  236. package/esm2022/api/translation.mjs +2 -0
  237. package/esm2022/api/translationkeys.mjs +51 -0
  238. package/esm2022/api/treedragdropservice.mjs +21 -0
  239. package/esm2022/api/treenode.mjs +2 -0
  240. package/esm2022/api/treenodedragevent.mjs +2 -0
  241. package/esm2022/api/treetablenode.mjs +2 -0
  242. package/esm2022/autocomplete/autocomplete.interface.mjs +2 -0
  243. package/esm2022/autocomplete/autocomplete.mjs +1462 -0
  244. package/esm2022/autocomplete/autocomplete.module.mjs +30 -0
  245. package/esm2022/autocomplete/cax-design-system-autocomplete.mjs +5 -0
  246. package/esm2022/autocomplete/public_api.mjs +4 -0
  247. package/esm2022/autofocus/autofocus.mjs +78 -0
  248. package/esm2022/autofocus/cax-design-system-autofocus.mjs +5 -0
  249. package/esm2022/autofocus/public_api.mjs +2 -0
  250. package/esm2022/avatar/avatar.mjs +104 -0
  251. package/esm2022/avatar/avatar.module.mjs +16 -0
  252. package/esm2022/avatar/cax-design-system-avatar.mjs +5 -0
  253. package/esm2022/avatar/public_api.mjs +3 -0
  254. package/esm2022/avatargroup/avatargroup.mjs +32 -0
  255. package/esm2022/avatargroup/avatargroup.module.mjs +19 -0
  256. package/esm2022/avatargroup/cax-design-system-avatargroup.mjs +5 -0
  257. package/esm2022/avatargroup/public_api.mjs +3 -0
  258. package/esm2022/badge/badge.directive.mjs +193 -0
  259. package/esm2022/badge/badge.mjs +50 -0
  260. package/esm2022/badge/badge.module.mjs +20 -0
  261. package/esm2022/badge/cax-design-system-badge.mjs +5 -0
  262. package/esm2022/badge/public_api.mjs +4 -0
  263. package/esm2022/baseicon/baseicon.mjs +45 -0
  264. package/esm2022/baseicon/cax-design-system-baseicon.mjs +5 -0
  265. package/esm2022/baseicon/public_api.mjs +2 -0
  266. package/esm2022/blockui/blockui.interface.mjs +2 -0
  267. package/esm2022/blockui/blockui.mjs +206 -0
  268. package/esm2022/blockui/cax-design-system-blockui.mjs +5 -0
  269. package/esm2022/blockui/public_api.mjs +3 -0
  270. package/esm2022/breadcrumb/breadcrumb.interface.mjs +2 -0
  271. package/esm2022/breadcrumb/breadcrumb.mjs +120 -0
  272. package/esm2022/breadcrumb/breadcrumb.module.mjs +23 -0
  273. package/esm2022/breadcrumb/cax-design-system-breadcrumb.mjs +5 -0
  274. package/esm2022/breadcrumb/public_api.mjs +4 -0
  275. package/esm2022/button/button.directive.mjs +259 -0
  276. package/esm2022/button/button.interface.mjs +2 -0
  277. package/esm2022/button/button.mjs +190 -0
  278. package/esm2022/button/button.module.mjs +18 -0
  279. package/esm2022/button/cax-design-system-button.mjs +5 -0
  280. package/esm2022/button/public_api.mjs +5 -0
  281. package/esm2022/buttongroup/buttongroup.mjs +38 -0
  282. package/esm2022/buttongroup/cax-design-system-buttongroup.mjs +5 -0
  283. package/esm2022/buttongroup/public_api.mjs +2 -0
  284. package/esm2022/calendar/calendar.interface.mjs +2 -0
  285. package/esm2022/calendar/calendar.mjs +3242 -0
  286. package/esm2022/calendar/calendar.module.mjs +18 -0
  287. package/esm2022/calendar/cax-design-system-calendar.mjs +5 -0
  288. package/esm2022/calendar/public_api.mjs +4 -0
  289. package/esm2022/card/card.interface.mjs +2 -0
  290. package/esm2022/card/card.mjs +117 -0
  291. package/esm2022/card/card.module.mjs +21 -0
  292. package/esm2022/card/cax-design-system-card.mjs +5 -0
  293. package/esm2022/card/public_api.mjs +4 -0
  294. package/esm2022/carousel/carousel.interface.mjs +2 -0
  295. package/esm2022/carousel/carousel.mjs +968 -0
  296. package/esm2022/carousel/cax-design-system-carousel.mjs +5 -0
  297. package/esm2022/carousel/public_api.mjs +3 -0
  298. package/esm2022/cascadeselect/cascadeselect.interface.mjs +2 -0
  299. package/esm2022/cascadeselect/cascadeselect.mjs +1135 -0
  300. package/esm2022/cascadeselect/cascadeselect.module.mjs +25 -0
  301. package/esm2022/cascadeselect/cax-design-system-cascadeselect.mjs +5 -0
  302. package/esm2022/cascadeselect/public_api.mjs +4 -0
  303. package/esm2022/cax-design-system.mjs +5 -0
  304. package/esm2022/chart/cax-design-system-chart.mjs +5 -0
  305. package/esm2022/chart/chart.mjs +236 -0
  306. package/esm2022/chart/public_api.mjs +2 -0
  307. package/esm2022/checkbox/cax-design-system-checkbox.mjs +5 -0
  308. package/esm2022/checkbox/checkbox.interface.mjs +2 -0
  309. package/esm2022/checkbox/checkbox.mjs +318 -0
  310. package/esm2022/checkbox/checkbox.module.mjs +20 -0
  311. package/esm2022/checkbox/public_api.mjs +4 -0
  312. package/esm2022/chip/cax-design-system-chip.mjs +5 -0
  313. package/esm2022/chip/chip.interface.mjs +2 -0
  314. package/esm2022/chip/chip.mjs +90 -0
  315. package/esm2022/chip/chip.module.mjs +20 -0
  316. package/esm2022/chip/public_api.mjs +4 -0
  317. package/esm2022/chips/cax-design-system-chips.mjs +5 -0
  318. package/esm2022/chips/chips.interface.mjs +2 -0
  319. package/esm2022/chips/chips.mjs +610 -0
  320. package/esm2022/chips/chips.module.mjs +23 -0
  321. package/esm2022/chips/public_api.mjs +4 -0
  322. package/esm2022/colorpicker/cax-design-system-colorpicker.mjs +5 -0
  323. package/esm2022/colorpicker/colorpicker.interface.mjs +2 -0
  324. package/esm2022/colorpicker/colorpicker.mjs +715 -0
  325. package/esm2022/colorpicker/colorpicker.module.mjs +19 -0
  326. package/esm2022/colorpicker/public_api.mjs +4 -0
  327. package/esm2022/commentbox/cax-design-system-commentbox.mjs +5 -0
  328. package/esm2022/commentbox/commentbox.mjs +575 -0
  329. package/esm2022/commentbox/commentbox.module.mjs +27 -0
  330. package/esm2022/commentbox/public_api.mjs +3 -0
  331. package/esm2022/confirmdialog/cax-design-system-confirmdialog.mjs +5 -0
  332. package/esm2022/confirmdialog/confirmdialog.interface.mjs +2 -0
  333. package/esm2022/confirmdialog/confirmdialog.mjs +720 -0
  334. package/esm2022/confirmdialog/confirmdialog.module.mjs +25 -0
  335. package/esm2022/confirmdialog/public_api.mjs +4 -0
  336. package/esm2022/confirmpopup/cax-design-system-confirmpopup.mjs +5 -0
  337. package/esm2022/confirmpopup/confirmpopup.interface.mjs +2 -0
  338. package/esm2022/confirmpopup/confirmpopup.mjs +499 -0
  339. package/esm2022/confirmpopup/public_api.mjs +3 -0
  340. package/esm2022/contextmenu/cax-design-system-contextmenu.mjs +5 -0
  341. package/esm2022/contextmenu/contextmenu.mjs +1304 -0
  342. package/esm2022/contextmenu/public_api.mjs +2 -0
  343. package/esm2022/dataview/cax-design-system-dataview.mjs +5 -0
  344. package/esm2022/dataview/dataview.interface.mjs +2 -0
  345. package/esm2022/dataview/dataview.mjs +723 -0
  346. package/esm2022/dataview/public_api.mjs +3 -0
  347. package/esm2022/defer/cax-design-system-defer.mjs +5 -0
  348. package/esm2022/defer/defer.mjs +111 -0
  349. package/esm2022/defer/public_api.mjs +2 -0
  350. package/esm2022/dialog/cax-design-system-dialog.mjs +5 -0
  351. package/esm2022/dialog/dialog.interface.mjs +2 -0
  352. package/esm2022/dialog/dialog.mjs +959 -0
  353. package/esm2022/dialog/dialog.module.mjs +25 -0
  354. package/esm2022/dialog/public_api.mjs +4 -0
  355. package/esm2022/divider/cax-design-system-divider.mjs +5 -0
  356. package/esm2022/divider/divider.mjs +69 -0
  357. package/esm2022/divider/divider.module.mjs +16 -0
  358. package/esm2022/divider/public_api.mjs +3 -0
  359. package/esm2022/dock/cax-design-system-dock.mjs +5 -0
  360. package/esm2022/dock/dock.interface.mjs +2 -0
  361. package/esm2022/dock/dock.mjs +431 -0
  362. package/esm2022/dock/public_api.mjs +3 -0
  363. package/esm2022/dom/cax-design-system-dom.mjs +5 -0
  364. package/esm2022/dom/connectedoverlayscrollhandler.mjs +30 -0
  365. package/esm2022/dom/domhandler.mjs +722 -0
  366. package/esm2022/dom/public_api.mjs +3 -0
  367. package/esm2022/dragdrop/cax-design-system-dragdrop.mjs +5 -0
  368. package/esm2022/dragdrop/dragdrop.mjs +309 -0
  369. package/esm2022/dragdrop/dragdrop.module.mjs +18 -0
  370. package/esm2022/dragdrop/public_api.mjs +3 -0
  371. package/esm2022/dropdown/cax-design-system-dropdown.mjs +5 -0
  372. package/esm2022/dropdown/dropdown-item.mjs +72 -0
  373. package/esm2022/dropdown/dropdown.interface.mjs +2 -0
  374. package/esm2022/dropdown/dropdown.mjs +1599 -0
  375. package/esm2022/dropdown/dropdown.module.mjs +20 -0
  376. package/esm2022/dropdown/public_api.mjs +5 -0
  377. package/esm2022/dynamicdialog/cax-design-system-dynamicdialog.mjs +5 -0
  378. package/esm2022/dynamicdialog/dialogservice.mjs +102 -0
  379. package/esm2022/dynamicdialog/dynamicdialog-config.mjs +187 -0
  380. package/esm2022/dynamicdialog/dynamicdialog-injector.mjs +15 -0
  381. package/esm2022/dynamicdialog/dynamicdialog-ref.mjs +119 -0
  382. package/esm2022/dynamicdialog/dynamicdialog.mjs +696 -0
  383. package/esm2022/dynamicdialog/dynamicdialogcontent.mjs +20 -0
  384. package/esm2022/dynamicdialog/public_api.mjs +7 -0
  385. package/esm2022/editor/cax-design-system-editor.mjs +5 -0
  386. package/esm2022/editor/editor.interface.mjs +2 -0
  387. package/esm2022/editor/editor.mjs +281 -0
  388. package/esm2022/editor/editor.module.mjs +19 -0
  389. package/esm2022/editor/public_api.mjs +4 -0
  390. package/esm2022/fieldset/cax-design-system-fieldset.mjs +5 -0
  391. package/esm2022/fieldset/fieldset.interface.mjs +2 -0
  392. package/esm2022/fieldset/fieldset.mjs +297 -0
  393. package/esm2022/fieldset/public_api.mjs +3 -0
  394. package/esm2022/fileupload/cax-design-system-fileupload.mjs +5 -0
  395. package/esm2022/fileupload/fileupload.interface.mjs +2 -0
  396. package/esm2022/fileupload/fileupload.mjs +1188 -0
  397. package/esm2022/fileupload/public_api.mjs +3 -0
  398. package/esm2022/floatlabel/cax-design-system-floatlabel.mjs +5 -0
  399. package/esm2022/floatlabel/floatlabel.mjs +28 -0
  400. package/esm2022/floatlabel/floatlabel.module.mjs +20 -0
  401. package/esm2022/floatlabel/public_api.mjs +3 -0
  402. package/esm2022/focustrap/cax-design-system-focustrap.mjs +5 -0
  403. package/esm2022/focustrap/focustrap.mjs +103 -0
  404. package/esm2022/focustrap/public_api.mjs +2 -0
  405. package/esm2022/galleria/cax-design-system-galleria.mjs +5 -0
  406. package/esm2022/galleria/galleria.interface.mjs +2 -0
  407. package/esm2022/galleria/galleria.mjs +1668 -0
  408. package/esm2022/galleria/public_api.mjs +3 -0
  409. package/esm2022/iconfield/cax-design-system-iconfield.mjs +5 -0
  410. package/esm2022/iconfield/iconfield.mjs +44 -0
  411. package/esm2022/iconfield/public_api.mjs +2 -0
  412. package/esm2022/icons/angledoubledown/angledoubledown.mjs +35 -0
  413. package/esm2022/icons/angledoubledown/cax-design-system-icons-angledoubledown.mjs +5 -0
  414. package/esm2022/icons/angledoubledown/public_api.mjs +2 -0
  415. package/esm2022/icons/angledoubleleft/angledoubleleft.mjs +35 -0
  416. package/esm2022/icons/angledoubleleft/cax-design-system-icons-angledoubleleft.mjs +5 -0
  417. package/esm2022/icons/angledoubleleft/public_api.mjs +2 -0
  418. package/esm2022/icons/angledoubleright/angledoubleright.mjs +35 -0
  419. package/esm2022/icons/angledoubleright/cax-design-system-icons-angledoubleright.mjs +5 -0
  420. package/esm2022/icons/angledoubleright/public_api.mjs +2 -0
  421. package/esm2022/icons/angledoubleup/angledoubleup.mjs +35 -0
  422. package/esm2022/icons/angledoubleup/cax-design-system-icons-angledoubleup.mjs +5 -0
  423. package/esm2022/icons/angledoubleup/public_api.mjs +2 -0
  424. package/esm2022/icons/angledown/angledown.mjs +31 -0
  425. package/esm2022/icons/angledown/cax-design-system-icons-angledown.mjs +5 -0
  426. package/esm2022/icons/angledown/public_api.mjs +2 -0
  427. package/esm2022/icons/angleleft/angleleft.mjs +31 -0
  428. package/esm2022/icons/angleleft/cax-design-system-icons-angleleft.mjs +5 -0
  429. package/esm2022/icons/angleleft/public_api.mjs +2 -0
  430. package/esm2022/icons/angleright/angleright.mjs +31 -0
  431. package/esm2022/icons/angleright/cax-design-system-icons-angleright.mjs +5 -0
  432. package/esm2022/icons/angleright/public_api.mjs +2 -0
  433. package/esm2022/icons/angleup/angleup.mjs +31 -0
  434. package/esm2022/icons/angleup/cax-design-system-icons-angleup.mjs +5 -0
  435. package/esm2022/icons/angleup/public_api.mjs +2 -0
  436. package/esm2022/icons/arrowdown/arrowdown.mjs +54 -0
  437. package/esm2022/icons/arrowdown/cax-design-system-icons-arrowdown.mjs +5 -0
  438. package/esm2022/icons/arrowdown/public_api.mjs +2 -0
  439. package/esm2022/icons/arrowdownleft/arrowdownleft.mjs +31 -0
  440. package/esm2022/icons/arrowdownleft/cax-design-system-icons-arrowdownleft.mjs +5 -0
  441. package/esm2022/icons/arrowdownleft/public_api.mjs +2 -0
  442. package/esm2022/icons/arrowdownright/arrowdownright.mjs +31 -0
  443. package/esm2022/icons/arrowdownright/cax-design-system-icons-arrowdownright.mjs +5 -0
  444. package/esm2022/icons/arrowdownright/public_api.mjs +2 -0
  445. package/esm2022/icons/arrowleft/arrowleft.mjs +54 -0
  446. package/esm2022/icons/arrowleft/cax-design-system-icons-arrowleft.mjs +5 -0
  447. package/esm2022/icons/arrowleft/public_api.mjs +2 -0
  448. package/esm2022/icons/arrowright/arrowright.mjs +35 -0
  449. package/esm2022/icons/arrowright/cax-design-system-icons-arrowright.mjs +5 -0
  450. package/esm2022/icons/arrowright/public_api.mjs +2 -0
  451. package/esm2022/icons/arrowup/arrowup.mjs +54 -0
  452. package/esm2022/icons/arrowup/cax-design-system-icons-arrowup.mjs +5 -0
  453. package/esm2022/icons/arrowup/public_api.mjs +2 -0
  454. package/esm2022/icons/ban/ban.mjs +50 -0
  455. package/esm2022/icons/ban/cax-design-system-icons-ban.mjs +5 -0
  456. package/esm2022/icons/ban/public_api.mjs +2 -0
  457. package/esm2022/icons/bars/bars.mjs +35 -0
  458. package/esm2022/icons/bars/cax-design-system-icons-bars.mjs +5 -0
  459. package/esm2022/icons/bars/public_api.mjs +2 -0
  460. package/esm2022/icons/blank/blank.mjs +25 -0
  461. package/esm2022/icons/blank/cax-design-system-icons-blank.mjs +5 -0
  462. package/esm2022/icons/blank/public_api.mjs +2 -0
  463. package/esm2022/icons/calendar/calendar.mjs +31 -0
  464. package/esm2022/icons/calendar/cax-design-system-icons-calendar.mjs +5 -0
  465. package/esm2022/icons/calendar/public_api.mjs +2 -0
  466. package/esm2022/icons/caretleft/caretleft.mjs +31 -0
  467. package/esm2022/icons/caretleft/cax-design-system-icons-caretleft.mjs +5 -0
  468. package/esm2022/icons/caretleft/public_api.mjs +2 -0
  469. package/esm2022/icons/caretright/caretright.mjs +31 -0
  470. package/esm2022/icons/caretright/cax-design-system-icons-caretright.mjs +5 -0
  471. package/esm2022/icons/caretright/public_api.mjs +2 -0
  472. package/esm2022/icons/check/cax-design-system-icons-check.mjs +5 -0
  473. package/esm2022/icons/check/check.mjs +31 -0
  474. package/esm2022/icons/check/public_api.mjs +2 -0
  475. package/esm2022/icons/chevrondown/cax-design-system-icons-chevrondown.mjs +5 -0
  476. package/esm2022/icons/chevrondown/chevrondown.mjs +31 -0
  477. package/esm2022/icons/chevrondown/public_api.mjs +2 -0
  478. package/esm2022/icons/chevronleft/cax-design-system-icons-chevronleft.mjs +5 -0
  479. package/esm2022/icons/chevronleft/chevronleft.mjs +31 -0
  480. package/esm2022/icons/chevronleft/public_api.mjs +2 -0
  481. package/esm2022/icons/chevronright/cax-design-system-icons-chevronright.mjs +5 -0
  482. package/esm2022/icons/chevronright/chevronright.mjs +31 -0
  483. package/esm2022/icons/chevronright/public_api.mjs +2 -0
  484. package/esm2022/icons/chevronup/cax-design-system-icons-chevronup.mjs +5 -0
  485. package/esm2022/icons/chevronup/chevronup.mjs +31 -0
  486. package/esm2022/icons/chevronup/public_api.mjs +2 -0
  487. package/esm2022/icons/exclamationtriangle/cax-design-system-icons-exclamationtriangle.mjs +5 -0
  488. package/esm2022/icons/exclamationtriangle/exclamationtriangle.mjs +66 -0
  489. package/esm2022/icons/exclamationtriangle/public_api.mjs +2 -0
  490. package/esm2022/icons/eye/cax-design-system-icons-eye.mjs +5 -0
  491. package/esm2022/icons/eye/eye.mjs +35 -0
  492. package/esm2022/icons/eye/public_api.mjs +2 -0
  493. package/esm2022/icons/eyeslash/cax-design-system-icons-eyeslash.mjs +5 -0
  494. package/esm2022/icons/eyeslash/eyeslash.mjs +54 -0
  495. package/esm2022/icons/eyeslash/public_api.mjs +2 -0
  496. package/esm2022/icons/filter/cax-design-system-icons-filter.mjs +5 -0
  497. package/esm2022/icons/filter/filter.mjs +50 -0
  498. package/esm2022/icons/filter/public_api.mjs +2 -0
  499. package/esm2022/icons/filterslash/cax-design-system-icons-filterslash.mjs +5 -0
  500. package/esm2022/icons/filterslash/filterslash.mjs +54 -0
  501. package/esm2022/icons/filterslash/public_api.mjs +2 -0
  502. package/esm2022/icons/home/cax-design-system-icons-home.mjs +5 -0
  503. package/esm2022/icons/home/home.mjs +54 -0
  504. package/esm2022/icons/home/public_api.mjs +2 -0
  505. package/esm2022/icons/infocircle/cax-design-system-icons-infocircle.mjs +5 -0
  506. package/esm2022/icons/infocircle/infocircle.mjs +54 -0
  507. package/esm2022/icons/infocircle/public_api.mjs +2 -0
  508. package/esm2022/icons/minus/cax-design-system-icons-minus.mjs +5 -0
  509. package/esm2022/icons/minus/minus.mjs +32 -0
  510. package/esm2022/icons/minus/public_api.mjs +2 -0
  511. package/esm2022/icons/pencil/cax-design-system-icons-pencil.mjs +5 -0
  512. package/esm2022/icons/pencil/pencil.mjs +50 -0
  513. package/esm2022/icons/pencil/public_api.mjs +2 -0
  514. package/esm2022/icons/plus/cax-design-system-icons-plus.mjs +5 -0
  515. package/esm2022/icons/plus/plus.mjs +50 -0
  516. package/esm2022/icons/plus/public_api.mjs +2 -0
  517. package/esm2022/icons/refresh/cax-design-system-icons-refresh.mjs +5 -0
  518. package/esm2022/icons/refresh/public_api.mjs +2 -0
  519. package/esm2022/icons/refresh/refresh.mjs +54 -0
  520. package/esm2022/icons/search/cax-design-system-icons-search.mjs +5 -0
  521. package/esm2022/icons/search/public_api.mjs +2 -0
  522. package/esm2022/icons/search/search.mjs +54 -0
  523. package/esm2022/icons/searchminus/cax-design-system-icons-searchminus.mjs +5 -0
  524. package/esm2022/icons/searchminus/public_api.mjs +2 -0
  525. package/esm2022/icons/searchminus/searchminus.mjs +54 -0
  526. package/esm2022/icons/searchplus/cax-design-system-icons-searchplus.mjs +5 -0
  527. package/esm2022/icons/searchplus/public_api.mjs +2 -0
  528. package/esm2022/icons/searchplus/searchplus.mjs +54 -0
  529. package/esm2022/icons/sortalt/cax-design-system-icons-sortalt.mjs +5 -0
  530. package/esm2022/icons/sortalt/public_api.mjs +2 -0
  531. package/esm2022/icons/sortalt/sortalt.mjs +62 -0
  532. package/esm2022/icons/sortamountdown/cax-design-system-icons-sortamountdown.mjs +5 -0
  533. package/esm2022/icons/sortamountdown/public_api.mjs +2 -0
  534. package/esm2022/icons/sortamountdown/sortamountdown.mjs +50 -0
  535. package/esm2022/icons/sortamountupalt/cax-design-system-icons-sortamountupalt.mjs +5 -0
  536. package/esm2022/icons/sortamountupalt/public_api.mjs +2 -0
  537. package/esm2022/icons/sortamountupalt/sortamountupalt.mjs +50 -0
  538. package/esm2022/icons/spinner/cax-design-system-icons-spinner.mjs +5 -0
  539. package/esm2022/icons/spinner/public_api.mjs +2 -0
  540. package/esm2022/icons/spinner/spinner.mjs +50 -0
  541. package/esm2022/icons/star/cax-design-system-icons-star.mjs +5 -0
  542. package/esm2022/icons/star/public_api.mjs +2 -0
  543. package/esm2022/icons/star/star.mjs +50 -0
  544. package/esm2022/icons/starfill/cax-design-system-icons-starfill.mjs +5 -0
  545. package/esm2022/icons/starfill/public_api.mjs +2 -0
  546. package/esm2022/icons/starfill/starfill.mjs +50 -0
  547. package/esm2022/icons/thlarge/cax-design-system-icons-thlarge.mjs +5 -0
  548. package/esm2022/icons/thlarge/public_api.mjs +2 -0
  549. package/esm2022/icons/thlarge/thlarge.mjs +54 -0
  550. package/esm2022/icons/times/cax-design-system-icons-times.mjs +5 -0
  551. package/esm2022/icons/times/public_api.mjs +2 -0
  552. package/esm2022/icons/times/times.mjs +31 -0
  553. package/esm2022/icons/timescircle/cax-design-system-icons-timescircle.mjs +5 -0
  554. package/esm2022/icons/timescircle/public_api.mjs +2 -0
  555. package/esm2022/icons/timescircle/timescircle.mjs +54 -0
  556. package/esm2022/icons/trash/cax-design-system-icons-trash.mjs +5 -0
  557. package/esm2022/icons/trash/public_api.mjs +2 -0
  558. package/esm2022/icons/trash/trash.mjs +54 -0
  559. package/esm2022/icons/undo/cax-design-system-icons-undo.mjs +5 -0
  560. package/esm2022/icons/undo/public_api.mjs +2 -0
  561. package/esm2022/icons/undo/undo.mjs +54 -0
  562. package/esm2022/icons/upload/cax-design-system-icons-upload.mjs +5 -0
  563. package/esm2022/icons/upload/public_api.mjs +2 -0
  564. package/esm2022/icons/upload/upload.mjs +54 -0
  565. package/esm2022/icons/windowmaximize/cax-design-system-icons-windowmaximize.mjs +5 -0
  566. package/esm2022/icons/windowmaximize/public_api.mjs +2 -0
  567. package/esm2022/icons/windowmaximize/windowmaximize.mjs +54 -0
  568. package/esm2022/icons/windowminimize/cax-design-system-icons-windowminimize.mjs +5 -0
  569. package/esm2022/icons/windowminimize/public_api.mjs +2 -0
  570. package/esm2022/icons/windowminimize/windowminimize.mjs +54 -0
  571. package/esm2022/image/cax-design-system-image.mjs +5 -0
  572. package/esm2022/image/image.interface.mjs +2 -0
  573. package/esm2022/image/image.mjs +418 -0
  574. package/esm2022/image/image.module.mjs +17 -0
  575. package/esm2022/image/public_api.mjs +4 -0
  576. package/esm2022/inplace/cax-design-system-inplace.mjs +5 -0
  577. package/esm2022/inplace/inplace.interface.mjs +2 -0
  578. package/esm2022/inplace/inplace.mjs +243 -0
  579. package/esm2022/inplace/public_api.mjs +3 -0
  580. package/esm2022/inputgroup/cax-design-system-inputgroup.mjs +5 -0
  581. package/esm2022/inputgroup/inputgroup.mjs +55 -0
  582. package/esm2022/inputgroup/inputgroup.module.mjs +25 -0
  583. package/esm2022/inputgroup/public_api.mjs +3 -0
  584. package/esm2022/inputgroupaddon/cax-design-system-inputgroupaddon.mjs +5 -0
  585. package/esm2022/inputgroupaddon/inputgroupaddon.mjs +32 -0
  586. package/esm2022/inputgroupaddon/inputgroupaddon.module.mjs +24 -0
  587. package/esm2022/inputgroupaddon/public_api.mjs +3 -0
  588. package/esm2022/inputicon/cax-design-system-inputicon.mjs +5 -0
  589. package/esm2022/inputicon/inputicon.mjs +38 -0
  590. package/esm2022/inputicon/public_api.mjs +2 -0
  591. package/esm2022/inputmask/cax-design-system-inputmask.mjs +5 -0
  592. package/esm2022/inputmask/inputmask.interface.mjs +2 -0
  593. package/esm2022/inputmask/inputmask.mjs +848 -0
  594. package/esm2022/inputmask/inputmask.module.mjs +22 -0
  595. package/esm2022/inputmask/public_api.mjs +4 -0
  596. package/esm2022/inputnumber/cax-design-system-inputnumber.mjs +5 -0
  597. package/esm2022/inputnumber/inputnumber.interface.mjs +2 -0
  598. package/esm2022/inputnumber/inputnumber.mjs +1296 -0
  599. package/esm2022/inputnumber/inputnumber.module.mjs +17 -0
  600. package/esm2022/inputnumber/public_api.mjs +4 -0
  601. package/esm2022/inputotp/cax-design-system-inputotp.mjs +5 -0
  602. package/esm2022/inputotp/inputotp.interface.mjs +2 -0
  603. package/esm2022/inputotp/inputotp.mjs +381 -0
  604. package/esm2022/inputotp/public_api.mjs +3 -0
  605. package/esm2022/inputswitch/cax-design-system-inputswitch.mjs +5 -0
  606. package/esm2022/inputswitch/inputswitch.interface.mjs +2 -0
  607. package/esm2022/inputswitch/inputswitch.mjs +244 -0
  608. package/esm2022/inputswitch/public_api.mjs +3 -0
  609. package/esm2022/inputtext/cax-design-system-inputtext.mjs +5 -0
  610. package/esm2022/inputtext/inputtext.component.mjs +132 -0
  611. package/esm2022/inputtext/inputtext.directive.mjs +76 -0
  612. package/esm2022/inputtext/inputtext.module.mjs +20 -0
  613. package/esm2022/inputtext/public_api.mjs +4 -0
  614. package/esm2022/inputtextarea/cax-design-system-inputtextarea.mjs +5 -0
  615. package/esm2022/inputtextarea/inputtextarea.component.mjs +155 -0
  616. package/esm2022/inputtextarea/inputtextarea.directive.mjs +121 -0
  617. package/esm2022/inputtextarea/inputtextarea.module.mjs +20 -0
  618. package/esm2022/inputtextarea/public_api.mjs +4 -0
  619. package/esm2022/keyfilter/cax-design-system-keyfilter.mjs +5 -0
  620. package/esm2022/keyfilter/keyfilter.interface.mjs +2 -0
  621. package/esm2022/keyfilter/keyfilter.mjs +265 -0
  622. package/esm2022/keyfilter/public_api.mjs +3 -0
  623. package/esm2022/knob/cax-design-system-knob.mjs +5 -0
  624. package/esm2022/knob/knob.mjs +464 -0
  625. package/esm2022/knob/public_api.mjs +2 -0
  626. package/esm2022/listbox/cax-design-system-listbox.mjs +5 -0
  627. package/esm2022/listbox/listbox.interface.mjs +2 -0
  628. package/esm2022/listbox/listbox.mjs +1555 -0
  629. package/esm2022/listbox/public_api.mjs +3 -0
  630. package/esm2022/logo/cax-design-system-logo.mjs +5 -0
  631. package/esm2022/logo/logo.mjs +45 -0
  632. package/esm2022/logo/logo.module.mjs +16 -0
  633. package/esm2022/logo/public_api.mjs +3 -0
  634. package/esm2022/megamenu/cax-design-system-megamenu.mjs +5 -0
  635. package/esm2022/megamenu/megamenu.interface.mjs +2 -0
  636. package/esm2022/megamenu/megamenu.mjs +1190 -0
  637. package/esm2022/megamenu/public_api.mjs +3 -0
  638. package/esm2022/menu/cax-design-system-menu.mjs +5 -0
  639. package/esm2022/menu/menu.mjs +626 -0
  640. package/esm2022/menu/menu.module.mjs +22 -0
  641. package/esm2022/menu/public_api.mjs +3 -0
  642. package/esm2022/menubar/cax-design-system-menubar.mjs +5 -0
  643. package/esm2022/menubar/menubar.interface.mjs +2 -0
  644. package/esm2022/menubar/menubar.mjs +1249 -0
  645. package/esm2022/menubar/public_api.mjs +3 -0
  646. package/esm2022/message/cax-design-system-message.mjs +5 -0
  647. package/esm2022/message/message.mjs +112 -0
  648. package/esm2022/message/public_api.mjs +2 -0
  649. package/esm2022/messages/cax-design-system-messages.mjs +5 -0
  650. package/esm2022/messages/messages.interface.mjs +2 -0
  651. package/esm2022/messages/messages.mjs +283 -0
  652. package/esm2022/messages/messages.module.mjs +17 -0
  653. package/esm2022/messages/public_api.mjs +4 -0
  654. package/esm2022/metergroup/cax-design-system-metergroup.mjs +5 -0
  655. package/esm2022/metergroup/metergroup.interface.mjs +2 -0
  656. package/esm2022/metergroup/metergroup.mjs +280 -0
  657. package/esm2022/metergroup/public_api.mjs +3 -0
  658. package/esm2022/multiselect/cax-design-system-multiselect.mjs +5 -0
  659. package/esm2022/multiselect/multiselect.interface.mjs +2 -0
  660. package/esm2022/multiselect/multiselect.mjs +1875 -0
  661. package/esm2022/multiselect/multiselect.module.mjs +30 -0
  662. package/esm2022/multiselect/public_api.mjs +4 -0
  663. package/esm2022/navigation/cax-design-system-navigation.mjs +5 -0
  664. package/esm2022/navigation/navigation.interface.mjs +2 -0
  665. package/esm2022/navigation/navigation.mjs +399 -0
  666. package/esm2022/navigation/navigation.module.mjs +16 -0
  667. package/esm2022/navigation/public_api.mjs +3 -0
  668. package/esm2022/orderlist/cax-design-system-orderlist.mjs +5 -0
  669. package/esm2022/orderlist/orderlist.interface.mjs +2 -0
  670. package/esm2022/orderlist/orderlist.mjs +993 -0
  671. package/esm2022/orderlist/public_api.mjs +3 -0
  672. package/esm2022/organizationchart/cax-design-system-organizationchart.mjs +5 -0
  673. package/esm2022/organizationchart/organizationchart.interface.mjs +2 -0
  674. package/esm2022/organizationchart/organizationchart.mjs +416 -0
  675. package/esm2022/organizationchart/public_api.mjs +3 -0
  676. package/esm2022/overlay/cax-design-system-overlay.mjs +5 -0
  677. package/esm2022/overlay/overlay.mjs +579 -0
  678. package/esm2022/overlay/overlay.module.mjs +17 -0
  679. package/esm2022/overlay/public_api.mjs +3 -0
  680. package/esm2022/overlaypanel/cax-design-system-overlaypanel.mjs +5 -0
  681. package/esm2022/overlaypanel/overlaypanel.mjs +470 -0
  682. package/esm2022/overlaypanel/overlaypanel.module.mjs +17 -0
  683. package/esm2022/overlaypanel/public_api.mjs +3 -0
  684. package/esm2022/paginator/cax-design-system-paginator.mjs +5 -0
  685. package/esm2022/paginator/paginator.interface.mjs +2 -0
  686. package/esm2022/paginator/paginator.mjs +437 -0
  687. package/esm2022/paginator/paginator.module.mjs +27 -0
  688. package/esm2022/paginator/public_api.mjs +4 -0
  689. package/esm2022/panel/cax-design-system-panel.mjs +5 -0
  690. package/esm2022/panel/panel.interface.mjs +2 -0
  691. package/esm2022/panel/panel.mjs +393 -0
  692. package/esm2022/panel/public_api.mjs +3 -0
  693. package/esm2022/panelmenu/cax-design-system-panelmenu.mjs +5 -0
  694. package/esm2022/panelmenu/panelmenu.interface.mjs +2 -0
  695. package/esm2022/panelmenu/panelmenu.mjs +1276 -0
  696. package/esm2022/panelmenu/public_api.mjs +3 -0
  697. package/esm2022/password/cax-design-system-password.mjs +5 -0
  698. package/esm2022/password/password.mjs +1017 -0
  699. package/esm2022/password/public_api.mjs +2 -0
  700. package/esm2022/picklist/cax-design-system-picklist.mjs +5 -0
  701. package/esm2022/picklist/picklist.interface.mjs +2 -0
  702. package/esm2022/picklist/picklist.mjs +1909 -0
  703. package/esm2022/picklist/public_api.mjs +3 -0
  704. package/esm2022/progressbar/cax-design-system-progressbar.mjs +5 -0
  705. package/esm2022/progressbar/progressbar.mjs +86 -0
  706. package/esm2022/progressbar/progressbar.module.mjs +18 -0
  707. package/esm2022/progressbar/public_api.mjs +3 -0
  708. package/esm2022/progressspinner/cax-design-system-progressspinner.mjs +5 -0
  709. package/esm2022/progressspinner/progressspinner.mjs +112 -0
  710. package/esm2022/progressspinner/progressspinner.module.mjs +18 -0
  711. package/esm2022/progressspinner/public_api.mjs +3 -0
  712. package/esm2022/public_api.mjs +2 -0
  713. package/esm2022/radiobutton/cax-design-system-radiobutton.mjs +5 -0
  714. package/esm2022/radiobutton/public_api.mjs +4 -0
  715. package/esm2022/radiobutton/radiobutton.interface.mjs +2 -0
  716. package/esm2022/radiobutton/radiobutton.mjs +284 -0
  717. package/esm2022/radiobutton/radiobutton.module.mjs +16 -0
  718. package/esm2022/rating/cax-design-system-rating.mjs +5 -0
  719. package/esm2022/rating/public_api.mjs +3 -0
  720. package/esm2022/rating/rating.interface.mjs +2 -0
  721. package/esm2022/rating/rating.mjs +388 -0
  722. package/esm2022/ripple/cax-design-system-ripple.mjs +5 -0
  723. package/esm2022/ripple/public_api.mjs +3 -0
  724. package/esm2022/ripple/ripple.mjs +129 -0
  725. package/esm2022/ripple/ripple.module.mjs +16 -0
  726. package/esm2022/scroller/cax-design-system-scroller.mjs +5 -0
  727. package/esm2022/scroller/public_api.mjs +4 -0
  728. package/esm2022/scroller/scroller.interface.mjs +2 -0
  729. package/esm2022/scroller/scroller.mjs +981 -0
  730. package/esm2022/scroller/scroller.module.mjs +17 -0
  731. package/esm2022/scrollpanel/cax-design-system-scrollpanel.mjs +5 -0
  732. package/esm2022/scrollpanel/public_api.mjs +3 -0
  733. package/esm2022/scrollpanel/scrollpanel.interface.mjs +2 -0
  734. package/esm2022/scrollpanel/scrollpanel.mjs +501 -0
  735. package/esm2022/scrolltop/cax-design-system-scrolltop.mjs +5 -0
  736. package/esm2022/scrolltop/public_api.mjs +3 -0
  737. package/esm2022/scrolltop/scrolltop.interface.mjs +2 -0
  738. package/esm2022/scrolltop/scrolltop.mjs +282 -0
  739. package/esm2022/selectbutton/cax-design-system-selectbutton.mjs +5 -0
  740. package/esm2022/selectbutton/public_api.mjs +4 -0
  741. package/esm2022/selectbutton/selectbutton.interface.mjs +2 -0
  742. package/esm2022/selectbutton/selectbutton.mjs +303 -0
  743. package/esm2022/selectbutton/selectbutton.module.mjs +21 -0
  744. package/esm2022/sidebar/cax-design-system-sidebar.mjs +5 -0
  745. package/esm2022/sidebar/public_api.mjs +4 -0
  746. package/esm2022/sidebar/sidebar.interface.mjs +2 -0
  747. package/esm2022/sidebar/sidebar.mjs +488 -0
  748. package/esm2022/sidebar/sidebar.module.mjs +21 -0
  749. package/esm2022/skeleton/cax-design-system-skeleton.mjs +5 -0
  750. package/esm2022/skeleton/public_api.mjs +3 -0
  751. package/esm2022/skeleton/skeleton.mjs +87 -0
  752. package/esm2022/skeleton/skeleton.module.mjs +18 -0
  753. package/esm2022/slidemenu/cax-design-system-slidemenu.mjs +5 -0
  754. package/esm2022/slidemenu/public_api.mjs +3 -0
  755. package/esm2022/slidemenu/slidemenu.interface.mjs +2 -0
  756. package/esm2022/slidemenu/slidemenu.mjs +1501 -0
  757. package/esm2022/slider/cax-design-system-slider.mjs +5 -0
  758. package/esm2022/slider/public_api.mjs +3 -0
  759. package/esm2022/slider/slider.interface.mjs +2 -0
  760. package/esm2022/slider/slider.mjs +796 -0
  761. package/esm2022/speeddial/cax-design-system-speeddial.mjs +5 -0
  762. package/esm2022/speeddial/public_api.mjs +4 -0
  763. package/esm2022/speeddial/speeddial.interface.mjs +2 -0
  764. package/esm2022/speeddial/speeddial.mjs +611 -0
  765. package/esm2022/speeddial/speeddial.module.mjs +24 -0
  766. package/esm2022/spinner/cax-design-system-spinner.mjs +5 -0
  767. package/esm2022/spinner/public_api.mjs +2 -0
  768. package/esm2022/spinner/spinner.mjs +447 -0
  769. package/esm2022/splitbutton/cax-design-system-splitbutton.mjs +5 -0
  770. package/esm2022/splitbutton/public_api.mjs +4 -0
  771. package/esm2022/splitbutton/splitbutton.interface.mjs +2 -0
  772. package/esm2022/splitbutton/splitbutton.mjs +369 -0
  773. package/esm2022/splitbutton/splitbutton.module.mjs +23 -0
  774. package/esm2022/splitter/cax-design-system-splitter.mjs +5 -0
  775. package/esm2022/splitter/public_api.mjs +4 -0
  776. package/esm2022/splitter/splitter.interface.mjs +2 -0
  777. package/esm2022/splitter/splitter.mjs +490 -0
  778. package/esm2022/splitter/splitter.module.mjs +19 -0
  779. package/esm2022/stepper/cax-design-system-stepper.mjs +5 -0
  780. package/esm2022/stepper/public_api.mjs +3 -0
  781. package/esm2022/stepper/stepper.interface.mjs +2 -0
  782. package/esm2022/stepper/stepper.mjs +677 -0
  783. package/esm2022/steps/cax-design-system-steps.mjs +5 -0
  784. package/esm2022/steps/public_api.mjs +3 -0
  785. package/esm2022/steps/steps.mjs +207 -0
  786. package/esm2022/steps/steps.module.mjs +20 -0
  787. package/esm2022/styleclass/cax-design-system-styleclass.mjs +5 -0
  788. package/esm2022/styleclass/public_api.mjs +2 -0
  789. package/esm2022/styleclass/styleclass.mjs +316 -0
  790. package/esm2022/table/cax-design-system-table.mjs +5 -0
  791. package/esm2022/table/columnfilter.interface.mjs +2 -0
  792. package/esm2022/table/components/cell-editor/cell-editor.mjs +52 -0
  793. package/esm2022/table/components/column-filter/column-filter.mjs +865 -0
  794. package/esm2022/table/components/column-filter-form-element/column-filter-form-element.mjs +107 -0
  795. package/esm2022/table/components/sort-icon/sort-icon.mjs +78 -0
  796. package/esm2022/table/components/table-body/table-body.mjs +152 -0
  797. package/esm2022/table/components/table-checkbox/table-checkbox.mjs +83 -0
  798. package/esm2022/table/components/table-header-checkbox/table-header-checkbox.mjs +92 -0
  799. package/esm2022/table/components/table-radio-button/table-radio-button.mjs +79 -0
  800. package/esm2022/table/directives/cancel-editable-row.directive.mjs +32 -0
  801. package/esm2022/table/directives/cell-highlight.directive.mjs +42 -0
  802. package/esm2022/table/directives/content-menu-row.directive.mjs +70 -0
  803. package/esm2022/table/directives/dynamic-column-width.directive.mjs +34 -0
  804. package/esm2022/table/directives/editable-column.directive.mjs +344 -0
  805. package/esm2022/table/directives/editable-row.directive.mjs +32 -0
  806. package/esm2022/table/directives/frozen-column.directive.mjs +77 -0
  807. package/esm2022/table/directives/init-editable-row.directive.mjs +32 -0
  808. package/esm2022/table/directives/reorderable-column.directive.mjs +115 -0
  809. package/esm2022/table/directives/reorderable-row-handle.directive.mjs +25 -0
  810. package/esm2022/table/directives/reorderable-row.directive.mjs +122 -0
  811. package/esm2022/table/directives/resizable-column.directive.mjs +123 -0
  812. package/esm2022/table/directives/row-group-header.directive.mjs +26 -0
  813. package/esm2022/table/directives/row-toggler.directive.mjs +42 -0
  814. package/esm2022/table/directives/save-editable-row.directive.mjs +32 -0
  815. package/esm2022/table/directives/selectable-row-double-click.directive.mjs +71 -0
  816. package/esm2022/table/directives/selectable-row.directive.mjs +243 -0
  817. package/esm2022/table/directives/sortable-column.directive.mjs +90 -0
  818. package/esm2022/table/public_api.mjs +31 -0
  819. package/esm2022/table/table.interface.mjs +2 -0
  820. package/esm2022/table/table.mjs +2799 -0
  821. package/esm2022/table/table.module.mjs +157 -0
  822. package/esm2022/table/table.service.mjs +42 -0
  823. package/esm2022/tableconfiguration/cax-design-system-tableconfiguration.mjs +5 -0
  824. package/esm2022/tableconfiguration/public_api.mjs +3 -0
  825. package/esm2022/tableconfiguration/tableconfiguration.mjs +68 -0
  826. package/esm2022/tableconfiguration/tableconfiguration.module.mjs +16 -0
  827. package/esm2022/tabmenu/cax-design-system-tabmenu.mjs +5 -0
  828. package/esm2022/tabmenu/public_api.mjs +3 -0
  829. package/esm2022/tabmenu/tabmenu.interface.mjs +2 -0
  830. package/esm2022/tabmenu/tabmenu.mjs +576 -0
  831. package/esm2022/tabview/cax-design-system-tabview.mjs +5 -0
  832. package/esm2022/tabview/public_api.mjs +4 -0
  833. package/esm2022/tabview/tabview.interface.mjs +2 -0
  834. package/esm2022/tabview/tabview.mjs +913 -0
  835. package/esm2022/tabview/tabview.module.mjs +25 -0
  836. package/esm2022/tag/cax-design-system-tag.mjs +5 -0
  837. package/esm2022/tag/public_api.mjs +4 -0
  838. package/esm2022/tag/tag.interface.mjs +2 -0
  839. package/esm2022/tag/tag.mjs +95 -0
  840. package/esm2022/tag/tag.module.mjs +19 -0
  841. package/esm2022/terminal/cax-design-system-terminal.mjs +5 -0
  842. package/esm2022/terminal/public_api.mjs +3 -0
  843. package/esm2022/terminal/terminal.mjs +143 -0
  844. package/esm2022/terminal/terminalservice.mjs +25 -0
  845. package/esm2022/tieredmenu/cax-design-system-tieredmenu.mjs +5 -0
  846. package/esm2022/tieredmenu/public_api.mjs +4 -0
  847. package/esm2022/tieredmenu/tieredmenu.interface.mjs +2 -0
  848. package/esm2022/tieredmenu/tieredmenu.mjs +1289 -0
  849. package/esm2022/tieredmenu/tiredmenu.module.mjs +23 -0
  850. package/esm2022/timeline/cax-design-system-timeline.mjs +5 -0
  851. package/esm2022/timeline/public_api.mjs +4 -0
  852. package/esm2022/timeline/timeline.interface.mjs +2 -0
  853. package/esm2022/timeline/timeline.mjs +83 -0
  854. package/esm2022/timeline/timeline.module.mjs +19 -0
  855. package/esm2022/toast/cax-design-system-toast.mjs +5 -0
  856. package/esm2022/toast/public_api.mjs +4 -0
  857. package/esm2022/toast/toast.interface.mjs +2 -0
  858. package/esm2022/toast/toast.mjs +324 -0
  859. package/esm2022/toast/toast.module.mjs +18 -0
  860. package/esm2022/toast/toastitem.mjs +170 -0
  861. package/esm2022/togglebutton/cax-design-system-togglebutton.mjs +5 -0
  862. package/esm2022/togglebutton/public_api.mjs +3 -0
  863. package/esm2022/togglebutton/togglebutton.interface.mjs +2 -0
  864. package/esm2022/togglebutton/togglebutton.mjs +274 -0
  865. package/esm2022/toggleswitch/cax-design-system-toggleswitch.mjs +5 -0
  866. package/esm2022/toggleswitch/public_api.mjs +3 -0
  867. package/esm2022/toggleswitch/toggleswitch.mjs +37 -0
  868. package/esm2022/toggleswitch/toggleswitch.module.mjs +19 -0
  869. package/esm2022/toolbar/cax-design-system-toolbar.mjs +5 -0
  870. package/esm2022/toolbar/public_api.mjs +3 -0
  871. package/esm2022/toolbar/toolbar.interface.mjs +2 -0
  872. package/esm2022/toolbar/toolbar.mjs +111 -0
  873. package/esm2022/tooltip/cax-design-system-tooltip.mjs +5 -0
  874. package/esm2022/tooltip/public_api.mjs +3 -0
  875. package/esm2022/tooltip/tooltip.mjs +889 -0
  876. package/esm2022/tooltip/tooltip.module.mjs +20 -0
  877. package/esm2022/tree/cax-design-system-tree.mjs +5 -0
  878. package/esm2022/tree/public_api.mjs +4 -0
  879. package/esm2022/tree/tree.interface.mjs +2 -0
  880. package/esm2022/tree/tree.mjs +1544 -0
  881. package/esm2022/tree/tree.module.mjs +31 -0
  882. package/esm2022/treeselect/cax-design-system-treeselect.mjs +5 -0
  883. package/esm2022/treeselect/public_api.mjs +4 -0
  884. package/esm2022/treeselect/treeselect.interface.mjs +2 -0
  885. package/esm2022/treeselect/treeselect.mjs +865 -0
  886. package/esm2022/treeselect/treeselect.module.mjs +26 -0
  887. package/esm2022/treetable/cax-design-system-treetable.mjs +5 -0
  888. package/esm2022/treetable/public_api.mjs +3 -0
  889. package/esm2022/treetable/treetable.interface.mjs +2 -0
  890. package/esm2022/treetable/treetable.mjs +4111 -0
  891. package/esm2022/tristatecheckbox/cax-design-system-tristatecheckbox.mjs +5 -0
  892. package/esm2022/tristatecheckbox/public_api.mjs +4 -0
  893. package/esm2022/tristatecheckbox/tristatecheckbox.interface.mjs +2 -0
  894. package/esm2022/tristatecheckbox/tristatecheckbox.mjs +215 -0
  895. package/esm2022/tristatecheckbox/tristatecheckbox.module.mjs +17 -0
  896. package/esm2022/ts-helpers/cax-design-system-ts-helpers.mjs +5 -0
  897. package/esm2022/ts-helpers/public_api.mjs +2 -0
  898. package/esm2022/ts-helpers/ts-helpers.mjs +2 -0
  899. package/esm2022/upload/cax-design-system-upload.mjs +5 -0
  900. package/esm2022/upload/public_api.mjs +3 -0
  901. package/esm2022/upload/upload.component.mjs +372 -0
  902. package/esm2022/upload/upload.component.module.mjs +21 -0
  903. package/esm2022/utils/cax-design-system-utils.mjs +5 -0
  904. package/esm2022/utils/objectutils.mjs +258 -0
  905. package/esm2022/utils/public_api.mjs +5 -0
  906. package/esm2022/utils/uniquecomponentid.mjs +6 -0
  907. package/esm2022/utils/zindexutils.mjs +35 -0
  908. package/esm2022/virtualscroller/cax-design-system-virtualscroller.mjs +5 -0
  909. package/esm2022/virtualscroller/public_api.mjs +3 -0
  910. package/esm2022/virtualscroller/virtualscroller.interface.mjs +2 -0
  911. package/esm2022/virtualscroller/virtualscroller.mjs +215 -0
  912. package/fesm2022/cax-design-system-accordion.mjs +2 -2
  913. package/fesm2022/cax-design-system-accordion.mjs.map +1 -1
  914. package/fesm2022/cax-design-system-animate.mjs +1 -1
  915. package/fesm2022/cax-design-system-animate.mjs.map +1 -1
  916. package/fesm2022/cax-design-system-animateonscroll.mjs +1 -1
  917. package/fesm2022/cax-design-system-animateonscroll.mjs.map +1 -1
  918. package/fesm2022/cax-design-system-api.mjs +1 -1
  919. package/fesm2022/cax-design-system-api.mjs.map +1 -1
  920. package/fesm2022/cax-design-system-autocomplete.mjs +1 -1
  921. package/fesm2022/cax-design-system-autocomplete.mjs.map +1 -1
  922. package/fesm2022/cax-design-system-autofocus.mjs +1 -1
  923. package/fesm2022/cax-design-system-autofocus.mjs.map +1 -1
  924. package/fesm2022/cax-design-system-avatar.mjs +1 -1
  925. package/fesm2022/cax-design-system-avatar.mjs.map +1 -1
  926. package/fesm2022/cax-design-system-avatargroup.mjs +1 -1
  927. package/fesm2022/cax-design-system-avatargroup.mjs.map +1 -1
  928. package/fesm2022/cax-design-system-badge.mjs +1 -1
  929. package/fesm2022/cax-design-system-badge.mjs.map +1 -1
  930. package/fesm2022/cax-design-system-baseicon.mjs +1 -1
  931. package/fesm2022/cax-design-system-baseicon.mjs.map +1 -1
  932. package/fesm2022/cax-design-system-blockui.mjs +1 -1
  933. package/fesm2022/cax-design-system-blockui.mjs.map +1 -1
  934. package/fesm2022/cax-design-system-breadcrumb.mjs +1 -1
  935. package/fesm2022/cax-design-system-breadcrumb.mjs.map +1 -1
  936. package/fesm2022/cax-design-system-button.mjs +1 -1
  937. package/fesm2022/cax-design-system-button.mjs.map +1 -1
  938. package/fesm2022/cax-design-system-buttongroup.mjs +1 -1
  939. package/fesm2022/cax-design-system-buttongroup.mjs.map +1 -1
  940. package/fesm2022/cax-design-system-calendar.mjs +3 -3
  941. package/fesm2022/cax-design-system-calendar.mjs.map +1 -1
  942. package/fesm2022/cax-design-system-card.mjs +1 -1
  943. package/fesm2022/cax-design-system-card.mjs.map +1 -1
  944. package/fesm2022/cax-design-system-carousel.mjs +1 -1
  945. package/fesm2022/cax-design-system-carousel.mjs.map +1 -1
  946. package/fesm2022/cax-design-system-cascadeselect.mjs +1 -1
  947. package/fesm2022/cax-design-system-cascadeselect.mjs.map +1 -1
  948. package/fesm2022/cax-design-system-chart.mjs +1 -1
  949. package/fesm2022/cax-design-system-chart.mjs.map +1 -1
  950. package/fesm2022/cax-design-system-checkbox.mjs +1 -1
  951. package/fesm2022/cax-design-system-checkbox.mjs.map +1 -1
  952. package/fesm2022/cax-design-system-chip.mjs +1 -1
  953. package/fesm2022/cax-design-system-chip.mjs.map +1 -1
  954. package/fesm2022/cax-design-system-chips.mjs +2 -2
  955. package/fesm2022/cax-design-system-chips.mjs.map +1 -1
  956. package/fesm2022/cax-design-system-colorpicker.mjs +1 -1
  957. package/fesm2022/cax-design-system-colorpicker.mjs.map +1 -1
  958. package/fesm2022/cax-design-system-commentbox.mjs +3 -3
  959. package/fesm2022/cax-design-system-commentbox.mjs.map +1 -1
  960. package/fesm2022/cax-design-system-confirmdialog.mjs +1 -1
  961. package/fesm2022/cax-design-system-confirmdialog.mjs.map +1 -1
  962. package/fesm2022/cax-design-system-confirmpopup.mjs +2 -2
  963. package/fesm2022/cax-design-system-confirmpopup.mjs.map +1 -1
  964. package/fesm2022/cax-design-system-contextmenu.mjs +1 -1
  965. package/fesm2022/cax-design-system-contextmenu.mjs.map +1 -1
  966. package/fesm2022/cax-design-system-dataview.mjs +1 -1
  967. package/fesm2022/cax-design-system-dataview.mjs.map +1 -1
  968. package/fesm2022/cax-design-system-defer.mjs +1 -1
  969. package/fesm2022/cax-design-system-defer.mjs.map +1 -1
  970. package/fesm2022/cax-design-system-dialog.mjs +1 -1
  971. package/fesm2022/cax-design-system-dialog.mjs.map +1 -1
  972. package/fesm2022/cax-design-system-divider.mjs +1 -1
  973. package/fesm2022/cax-design-system-divider.mjs.map +1 -1
  974. package/fesm2022/cax-design-system-dock.mjs +1 -1
  975. package/fesm2022/cax-design-system-dock.mjs.map +1 -1
  976. package/fesm2022/cax-design-system-dom.mjs.map +1 -1
  977. package/fesm2022/cax-design-system-dragdrop.mjs +1 -1
  978. package/fesm2022/cax-design-system-dragdrop.mjs.map +1 -1
  979. package/fesm2022/cax-design-system-dropdown.mjs +2 -2
  980. package/fesm2022/cax-design-system-dropdown.mjs.map +1 -1
  981. package/fesm2022/cax-design-system-dynamicdialog.mjs +1 -1
  982. package/fesm2022/cax-design-system-dynamicdialog.mjs.map +1 -1
  983. package/fesm2022/cax-design-system-editor.mjs +1 -1
  984. package/fesm2022/cax-design-system-editor.mjs.map +1 -1
  985. package/fesm2022/cax-design-system-fieldset.mjs +2 -2
  986. package/fesm2022/cax-design-system-fieldset.mjs.map +1 -1
  987. package/fesm2022/cax-design-system-fileupload.mjs +1 -1
  988. package/fesm2022/cax-design-system-fileupload.mjs.map +1 -1
  989. package/fesm2022/cax-design-system-floatlabel.mjs +1 -1
  990. package/fesm2022/cax-design-system-floatlabel.mjs.map +1 -1
  991. package/fesm2022/cax-design-system-focustrap.mjs +1 -1
  992. package/fesm2022/cax-design-system-focustrap.mjs.map +1 -1
  993. package/fesm2022/cax-design-system-galleria.mjs +1 -1
  994. package/fesm2022/cax-design-system-galleria.mjs.map +1 -1
  995. package/fesm2022/cax-design-system-iconfield.mjs +1 -1
  996. package/fesm2022/cax-design-system-iconfield.mjs.map +1 -1
  997. package/fesm2022/cax-design-system-icons-angledoubledown.mjs.map +1 -1
  998. package/fesm2022/cax-design-system-icons-angledoubleleft.mjs.map +1 -1
  999. package/fesm2022/cax-design-system-icons-angledoubleright.mjs.map +1 -1
  1000. package/fesm2022/cax-design-system-icons-angledoubleup.mjs.map +1 -1
  1001. package/fesm2022/cax-design-system-icons-angledown.mjs.map +1 -1
  1002. package/fesm2022/cax-design-system-icons-angleleft.mjs.map +1 -1
  1003. package/fesm2022/cax-design-system-icons-angleright.mjs.map +1 -1
  1004. package/fesm2022/cax-design-system-icons-angleup.mjs.map +1 -1
  1005. package/fesm2022/cax-design-system-icons-arrowdown.mjs.map +1 -1
  1006. package/fesm2022/cax-design-system-icons-arrowdownleft.mjs.map +1 -1
  1007. package/fesm2022/cax-design-system-icons-arrowdownright.mjs.map +1 -1
  1008. package/fesm2022/cax-design-system-icons-arrowleft.mjs.map +1 -1
  1009. package/fesm2022/cax-design-system-icons-arrowright.mjs.map +1 -1
  1010. package/fesm2022/cax-design-system-icons-arrowup.mjs.map +1 -1
  1011. package/fesm2022/cax-design-system-icons-ban.mjs.map +1 -1
  1012. package/fesm2022/cax-design-system-icons-bars.mjs.map +1 -1
  1013. package/fesm2022/cax-design-system-icons-blank.mjs.map +1 -1
  1014. package/fesm2022/cax-design-system-icons-calendar.mjs.map +1 -1
  1015. package/fesm2022/cax-design-system-icons-caretleft.mjs.map +1 -1
  1016. package/fesm2022/cax-design-system-icons-caretright.mjs.map +1 -1
  1017. package/fesm2022/cax-design-system-icons-check.mjs.map +1 -1
  1018. package/fesm2022/cax-design-system-icons-chevrondown.mjs.map +1 -1
  1019. package/fesm2022/cax-design-system-icons-chevronleft.mjs.map +1 -1
  1020. package/fesm2022/cax-design-system-icons-chevronright.mjs.map +1 -1
  1021. package/fesm2022/cax-design-system-icons-chevronup.mjs.map +1 -1
  1022. package/fesm2022/cax-design-system-icons-exclamationtriangle.mjs.map +1 -1
  1023. package/fesm2022/cax-design-system-icons-eye.mjs.map +1 -1
  1024. package/fesm2022/cax-design-system-icons-eyeslash.mjs.map +1 -1
  1025. package/fesm2022/cax-design-system-icons-filter.mjs.map +1 -1
  1026. package/fesm2022/cax-design-system-icons-filterslash.mjs.map +1 -1
  1027. package/fesm2022/cax-design-system-icons-home.mjs.map +1 -1
  1028. package/fesm2022/cax-design-system-icons-infocircle.mjs.map +1 -1
  1029. package/fesm2022/cax-design-system-icons-minus.mjs.map +1 -1
  1030. package/fesm2022/cax-design-system-icons-pencil.mjs.map +1 -1
  1031. package/fesm2022/cax-design-system-icons-plus.mjs.map +1 -1
  1032. package/fesm2022/cax-design-system-icons-refresh.mjs.map +1 -1
  1033. package/fesm2022/cax-design-system-icons-search.mjs.map +1 -1
  1034. package/fesm2022/cax-design-system-icons-searchminus.mjs.map +1 -1
  1035. package/fesm2022/cax-design-system-icons-searchplus.mjs.map +1 -1
  1036. package/fesm2022/cax-design-system-icons-sortalt.mjs.map +1 -1
  1037. package/fesm2022/cax-design-system-icons-sortamountdown.mjs.map +1 -1
  1038. package/fesm2022/cax-design-system-icons-sortamountupalt.mjs.map +1 -1
  1039. package/fesm2022/cax-design-system-icons-spinner.mjs.map +1 -1
  1040. package/fesm2022/cax-design-system-icons-star.mjs.map +1 -1
  1041. package/fesm2022/cax-design-system-icons-starfill.mjs.map +1 -1
  1042. package/fesm2022/cax-design-system-icons-thlarge.mjs.map +1 -1
  1043. package/fesm2022/cax-design-system-icons-times.mjs.map +1 -1
  1044. package/fesm2022/cax-design-system-icons-timescircle.mjs.map +1 -1
  1045. package/fesm2022/cax-design-system-icons-trash.mjs.map +1 -1
  1046. package/fesm2022/cax-design-system-icons-undo.mjs.map +1 -1
  1047. package/fesm2022/cax-design-system-icons-upload.mjs.map +1 -1
  1048. package/fesm2022/cax-design-system-icons-windowmaximize.mjs.map +1 -1
  1049. package/fesm2022/cax-design-system-icons-windowminimize.mjs.map +1 -1
  1050. package/fesm2022/cax-design-system-image.mjs +2 -2
  1051. package/fesm2022/cax-design-system-image.mjs.map +1 -1
  1052. package/fesm2022/cax-design-system-inplace.mjs +1 -1
  1053. package/fesm2022/cax-design-system-inplace.mjs.map +1 -1
  1054. package/fesm2022/cax-design-system-inputgroup.mjs +1 -1
  1055. package/fesm2022/cax-design-system-inputgroup.mjs.map +1 -1
  1056. package/fesm2022/cax-design-system-inputgroupaddon.mjs +1 -1
  1057. package/fesm2022/cax-design-system-inputgroupaddon.mjs.map +1 -1
  1058. package/fesm2022/cax-design-system-inputicon.mjs +1 -1
  1059. package/fesm2022/cax-design-system-inputicon.mjs.map +1 -1
  1060. package/fesm2022/cax-design-system-inputmask.mjs +1 -1
  1061. package/fesm2022/cax-design-system-inputmask.mjs.map +1 -1
  1062. package/fesm2022/cax-design-system-inputnumber.mjs +1 -1
  1063. package/fesm2022/cax-design-system-inputnumber.mjs.map +1 -1
  1064. package/fesm2022/cax-design-system-inputotp.mjs +1 -1
  1065. package/fesm2022/cax-design-system-inputotp.mjs.map +1 -1
  1066. package/fesm2022/cax-design-system-inputswitch.mjs +1 -1
  1067. package/fesm2022/cax-design-system-inputswitch.mjs.map +1 -1
  1068. package/fesm2022/cax-design-system-inputtext.mjs +1 -1
  1069. package/fesm2022/cax-design-system-inputtext.mjs.map +1 -1
  1070. package/fesm2022/cax-design-system-inputtextarea.mjs +1 -1
  1071. package/fesm2022/cax-design-system-inputtextarea.mjs.map +1 -1
  1072. package/fesm2022/cax-design-system-keyfilter.mjs +1 -1
  1073. package/fesm2022/cax-design-system-keyfilter.mjs.map +1 -1
  1074. package/fesm2022/cax-design-system-knob.mjs +1 -1
  1075. package/fesm2022/cax-design-system-knob.mjs.map +1 -1
  1076. package/fesm2022/cax-design-system-listbox.mjs +1 -1
  1077. package/fesm2022/cax-design-system-listbox.mjs.map +1 -1
  1078. package/fesm2022/cax-design-system-logo.mjs +1 -1
  1079. package/fesm2022/cax-design-system-logo.mjs.map +1 -1
  1080. package/fesm2022/cax-design-system-megamenu.mjs +1 -1
  1081. package/fesm2022/cax-design-system-megamenu.mjs.map +1 -1
  1082. package/fesm2022/cax-design-system-menu.mjs +1 -1
  1083. package/fesm2022/cax-design-system-menu.mjs.map +1 -1
  1084. package/fesm2022/cax-design-system-menubar.mjs +1 -1
  1085. package/fesm2022/cax-design-system-menubar.mjs.map +1 -1
  1086. package/fesm2022/cax-design-system-message.mjs +1 -1
  1087. package/fesm2022/cax-design-system-message.mjs.map +1 -1
  1088. package/fesm2022/cax-design-system-messages.mjs +2 -2
  1089. package/fesm2022/cax-design-system-messages.mjs.map +1 -1
  1090. package/fesm2022/cax-design-system-metergroup.mjs +1 -1
  1091. package/fesm2022/cax-design-system-metergroup.mjs.map +1 -1
  1092. package/fesm2022/cax-design-system-multiselect.mjs +1 -1
  1093. package/fesm2022/cax-design-system-multiselect.mjs.map +1 -1
  1094. package/fesm2022/cax-design-system-navigation.mjs +1 -1
  1095. package/fesm2022/cax-design-system-navigation.mjs.map +1 -1
  1096. package/fesm2022/cax-design-system-orderlist.mjs +1 -1
  1097. package/fesm2022/cax-design-system-orderlist.mjs.map +1 -1
  1098. package/fesm2022/cax-design-system-organizationchart.mjs +2 -2
  1099. package/fesm2022/cax-design-system-organizationchart.mjs.map +1 -1
  1100. package/fesm2022/cax-design-system-overlay.mjs +2 -2
  1101. package/fesm2022/cax-design-system-overlay.mjs.map +1 -1
  1102. package/fesm2022/cax-design-system-overlaypanel.mjs +3 -3
  1103. package/fesm2022/cax-design-system-overlaypanel.mjs.map +1 -1
  1104. package/fesm2022/cax-design-system-paginator.mjs +1 -1
  1105. package/fesm2022/cax-design-system-paginator.mjs.map +1 -1
  1106. package/fesm2022/cax-design-system-panel.mjs +2 -2
  1107. package/fesm2022/cax-design-system-panel.mjs.map +1 -1
  1108. package/fesm2022/cax-design-system-panelmenu.mjs +2 -2
  1109. package/fesm2022/cax-design-system-panelmenu.mjs.map +1 -1
  1110. package/fesm2022/cax-design-system-password.mjs +1 -1
  1111. package/fesm2022/cax-design-system-password.mjs.map +1 -1
  1112. package/fesm2022/cax-design-system-picklist.mjs +1 -1
  1113. package/fesm2022/cax-design-system-picklist.mjs.map +1 -1
  1114. package/fesm2022/cax-design-system-progressbar.mjs +1 -1
  1115. package/fesm2022/cax-design-system-progressbar.mjs.map +1 -1
  1116. package/fesm2022/cax-design-system-progressspinner.mjs +1 -1
  1117. package/fesm2022/cax-design-system-progressspinner.mjs.map +1 -1
  1118. package/fesm2022/cax-design-system-radiobutton.mjs +1 -1
  1119. package/fesm2022/cax-design-system-radiobutton.mjs.map +1 -1
  1120. package/fesm2022/cax-design-system-rating.mjs +1 -1
  1121. package/fesm2022/cax-design-system-rating.mjs.map +1 -1
  1122. package/fesm2022/cax-design-system-ripple.mjs +1 -1
  1123. package/fesm2022/cax-design-system-ripple.mjs.map +1 -1
  1124. package/fesm2022/cax-design-system-scroller.mjs +2 -2
  1125. package/fesm2022/cax-design-system-scroller.mjs.map +1 -1
  1126. package/fesm2022/cax-design-system-scrollpanel.mjs +1 -1
  1127. package/fesm2022/cax-design-system-scrollpanel.mjs.map +1 -1
  1128. package/fesm2022/cax-design-system-scrolltop.mjs +2 -2
  1129. package/fesm2022/cax-design-system-scrolltop.mjs.map +1 -1
  1130. package/fesm2022/cax-design-system-selectbutton.mjs +1 -1
  1131. package/fesm2022/cax-design-system-selectbutton.mjs.map +1 -1
  1132. package/fesm2022/cax-design-system-sidebar.mjs +4 -4
  1133. package/fesm2022/cax-design-system-sidebar.mjs.map +1 -1
  1134. package/fesm2022/cax-design-system-skeleton.mjs +1 -1
  1135. package/fesm2022/cax-design-system-skeleton.mjs.map +1 -1
  1136. package/fesm2022/cax-design-system-slidemenu.mjs +1 -1
  1137. package/fesm2022/cax-design-system-slidemenu.mjs.map +1 -1
  1138. package/fesm2022/cax-design-system-slider.mjs +1 -1
  1139. package/fesm2022/cax-design-system-slider.mjs.map +1 -1
  1140. package/fesm2022/cax-design-system-speeddial.mjs +1 -1
  1141. package/fesm2022/cax-design-system-speeddial.mjs.map +1 -1
  1142. package/fesm2022/cax-design-system-spinner.mjs +1 -1
  1143. package/fesm2022/cax-design-system-spinner.mjs.map +1 -1
  1144. package/fesm2022/cax-design-system-splitbutton.mjs +1 -1
  1145. package/fesm2022/cax-design-system-splitbutton.mjs.map +1 -1
  1146. package/fesm2022/cax-design-system-splitter.mjs +1 -1
  1147. package/fesm2022/cax-design-system-splitter.mjs.map +1 -1
  1148. package/fesm2022/cax-design-system-stepper.mjs +2 -2
  1149. package/fesm2022/cax-design-system-stepper.mjs.map +1 -1
  1150. package/fesm2022/cax-design-system-steps.mjs +1 -1
  1151. package/fesm2022/cax-design-system-steps.mjs.map +1 -1
  1152. package/fesm2022/cax-design-system-styleclass.mjs +1 -1
  1153. package/fesm2022/cax-design-system-styleclass.mjs.map +1 -1
  1154. package/fesm2022/cax-design-system-table.mjs +1 -1
  1155. package/fesm2022/cax-design-system-table.mjs.map +1 -1
  1156. package/fesm2022/cax-design-system-tableconfiguration.mjs +1 -1
  1157. package/fesm2022/cax-design-system-tableconfiguration.mjs.map +1 -1
  1158. package/fesm2022/cax-design-system-tabmenu.mjs +1 -1
  1159. package/fesm2022/cax-design-system-tabmenu.mjs.map +1 -1
  1160. package/fesm2022/cax-design-system-tabview.mjs +1 -1
  1161. package/fesm2022/cax-design-system-tabview.mjs.map +1 -1
  1162. package/fesm2022/cax-design-system-tag.mjs +1 -1
  1163. package/fesm2022/cax-design-system-tag.mjs.map +1 -1
  1164. package/fesm2022/cax-design-system-terminal.mjs +1 -1
  1165. package/fesm2022/cax-design-system-terminal.mjs.map +1 -1
  1166. package/fesm2022/cax-design-system-tieredmenu.mjs +1 -1
  1167. package/fesm2022/cax-design-system-tieredmenu.mjs.map +1 -1
  1168. package/fesm2022/cax-design-system-timeline.mjs +1 -1
  1169. package/fesm2022/cax-design-system-timeline.mjs.map +1 -1
  1170. package/fesm2022/cax-design-system-toast.mjs +2 -2
  1171. package/fesm2022/cax-design-system-toast.mjs.map +1 -1
  1172. package/fesm2022/cax-design-system-togglebutton.mjs +1 -1
  1173. package/fesm2022/cax-design-system-togglebutton.mjs.map +1 -1
  1174. package/fesm2022/cax-design-system-toggleswitch.mjs +3 -3
  1175. package/fesm2022/cax-design-system-toggleswitch.mjs.map +1 -1
  1176. package/fesm2022/cax-design-system-toolbar.mjs +1 -1
  1177. package/fesm2022/cax-design-system-toolbar.mjs.map +1 -1
  1178. package/fesm2022/cax-design-system-tooltip.mjs +1 -1
  1179. package/fesm2022/cax-design-system-tooltip.mjs.map +1 -1
  1180. package/fesm2022/cax-design-system-tree.mjs +1 -1
  1181. package/fesm2022/cax-design-system-tree.mjs.map +1 -1
  1182. package/fesm2022/cax-design-system-treeselect.mjs +1 -1
  1183. package/fesm2022/cax-design-system-treeselect.mjs.map +1 -1
  1184. package/fesm2022/cax-design-system-treetable.mjs +1 -1
  1185. package/fesm2022/cax-design-system-treetable.mjs.map +1 -1
  1186. package/fesm2022/cax-design-system-tristatecheckbox.mjs +2 -2
  1187. package/fesm2022/cax-design-system-tristatecheckbox.mjs.map +1 -1
  1188. package/fesm2022/cax-design-system-upload.mjs +12 -7
  1189. package/fesm2022/cax-design-system-upload.mjs.map +1 -1
  1190. package/fesm2022/cax-design-system-utils.mjs.map +1 -1
  1191. package/fesm2022/cax-design-system-virtualscroller.mjs +1 -1
  1192. package/fesm2022/cax-design-system-virtualscroller.mjs.map +1 -1
  1193. package/fieldset/fieldset.d.ts +93 -0
  1194. package/fieldset/fieldset.interface.d.ts +46 -0
  1195. package/fieldset/index.d.ts +3 -140
  1196. package/fieldset/public_api.d.ts +2 -0
  1197. package/fileupload/fileupload.d.ts +380 -0
  1198. package/fileupload/fileupload.interface.d.ts +226 -0
  1199. package/fileupload/index.d.ts +3 -606
  1200. package/fileupload/public_api.d.ts +2 -0
  1201. package/floatlabel/floatlabel.d.ts +9 -0
  1202. package/floatlabel/floatlabel.module.d.ts +10 -0
  1203. package/floatlabel/index.d.ts +3 -19
  1204. package/floatlabel/public_api.d.ts +2 -0
  1205. package/focustrap/focustrap.d.ts +34 -0
  1206. package/focustrap/index.d.ts +3 -35
  1207. package/focustrap/public_api.d.ts +1 -0
  1208. package/galleria/galleria.d.ts +404 -0
  1209. package/galleria/galleria.interface.d.ts +97 -0
  1210. package/galleria/index.d.ts +3 -502
  1211. package/galleria/public_api.d.ts +2 -0
  1212. package/iconfield/iconfield.d.ts +25 -0
  1213. package/iconfield/index.d.ts +3 -26
  1214. package/iconfield/public_api.d.ts +1 -0
  1215. package/icons/angledoubledown/angledoubledown.d.ts +6 -0
  1216. package/icons/angledoubledown/index.d.ts +5 -9
  1217. package/icons/angledoubledown/public_api.d.ts +1 -0
  1218. package/icons/angledoubleleft/angledoubleleft.d.ts +6 -0
  1219. package/icons/angledoubleleft/index.d.ts +5 -9
  1220. package/icons/angledoubleleft/public_api.d.ts +1 -0
  1221. package/icons/angledoubleright/angledoubleright.d.ts +6 -0
  1222. package/icons/angledoubleright/index.d.ts +5 -9
  1223. package/icons/angledoubleright/public_api.d.ts +1 -0
  1224. package/icons/angledoubleup/angledoubleup.d.ts +6 -0
  1225. package/icons/angledoubleup/index.d.ts +5 -9
  1226. package/icons/angledoubleup/public_api.d.ts +1 -0
  1227. package/icons/angledown/angledown.d.ts +6 -0
  1228. package/icons/angledown/index.d.ts +5 -9
  1229. package/icons/angledown/public_api.d.ts +1 -0
  1230. package/icons/angleleft/angleleft.d.ts +6 -0
  1231. package/icons/angleleft/index.d.ts +5 -9
  1232. package/icons/angleleft/public_api.d.ts +1 -0
  1233. package/icons/angleright/angleright.d.ts +6 -0
  1234. package/icons/angleright/index.d.ts +5 -9
  1235. package/icons/angleright/public_api.d.ts +1 -0
  1236. package/icons/angleup/angleup.d.ts +6 -0
  1237. package/icons/angleup/index.d.ts +5 -9
  1238. package/icons/angleup/public_api.d.ts +1 -0
  1239. package/icons/arrowdown/arrowdown.d.ts +9 -0
  1240. package/icons/arrowdown/index.d.ts +5 -12
  1241. package/icons/arrowdown/public_api.d.ts +1 -0
  1242. package/icons/arrowdownleft/arrowdownleft.d.ts +6 -0
  1243. package/icons/arrowdownleft/index.d.ts +5 -9
  1244. package/icons/arrowdownleft/public_api.d.ts +1 -0
  1245. package/icons/arrowdownright/arrowdownright.d.ts +6 -0
  1246. package/icons/arrowdownright/index.d.ts +5 -9
  1247. package/icons/arrowdownright/public_api.d.ts +1 -0
  1248. package/icons/arrowleft/arrowleft.d.ts +8 -0
  1249. package/icons/arrowleft/index.d.ts +5 -11
  1250. package/icons/arrowleft/public_api.d.ts +1 -0
  1251. package/icons/arrowright/arrowright.d.ts +6 -0
  1252. package/icons/arrowright/index.d.ts +5 -9
  1253. package/icons/arrowright/public_api.d.ts +1 -0
  1254. package/icons/arrowup/arrowup.d.ts +8 -0
  1255. package/icons/arrowup/index.d.ts +5 -11
  1256. package/icons/arrowup/public_api.d.ts +1 -0
  1257. package/icons/ban/ban.d.ts +8 -0
  1258. package/icons/ban/index.d.ts +5 -11
  1259. package/icons/ban/public_api.d.ts +1 -0
  1260. package/icons/bars/bars.d.ts +6 -0
  1261. package/icons/bars/index.d.ts +5 -9
  1262. package/icons/bars/public_api.d.ts +1 -0
  1263. package/icons/blank/blank.d.ts +6 -0
  1264. package/icons/blank/index.d.ts +5 -9
  1265. package/icons/blank/public_api.d.ts +1 -0
  1266. package/icons/calendar/calendar.d.ts +6 -0
  1267. package/icons/calendar/index.d.ts +5 -9
  1268. package/icons/calendar/public_api.d.ts +1 -0
  1269. package/icons/caretleft/caretleft.d.ts +6 -0
  1270. package/icons/caretleft/index.d.ts +5 -9
  1271. package/icons/caretleft/public_api.d.ts +1 -0
  1272. package/icons/caretright/caretright.d.ts +6 -0
  1273. package/icons/caretright/index.d.ts +5 -9
  1274. package/icons/caretright/public_api.d.ts +1 -0
  1275. package/icons/check/check.d.ts +6 -0
  1276. package/icons/check/index.d.ts +5 -9
  1277. package/icons/check/public_api.d.ts +1 -0
  1278. package/icons/chevrondown/chevrondown.d.ts +6 -0
  1279. package/icons/chevrondown/index.d.ts +5 -9
  1280. package/icons/chevrondown/public_api.d.ts +1 -0
  1281. package/icons/chevronleft/chevronleft.d.ts +6 -0
  1282. package/icons/chevronleft/index.d.ts +5 -9
  1283. package/icons/chevronleft/public_api.d.ts +1 -0
  1284. package/icons/chevronright/chevronright.d.ts +6 -0
  1285. package/icons/chevronright/index.d.ts +5 -9
  1286. package/icons/chevronright/public_api.d.ts +1 -0
  1287. package/icons/chevronup/chevronup.d.ts +6 -0
  1288. package/icons/chevronup/index.d.ts +5 -9
  1289. package/icons/chevronup/public_api.d.ts +1 -0
  1290. package/icons/exclamationtriangle/exclamationtriangle.d.ts +9 -0
  1291. package/icons/exclamationtriangle/index.d.ts +5 -12
  1292. package/icons/exclamationtriangle/public_api.d.ts +1 -0
  1293. package/icons/eye/eye.d.ts +6 -0
  1294. package/icons/eye/index.d.ts +5 -9
  1295. package/icons/eye/public_api.d.ts +1 -0
  1296. package/icons/eyeslash/eyeslash.d.ts +8 -0
  1297. package/icons/eyeslash/index.d.ts +5 -11
  1298. package/icons/eyeslash/public_api.d.ts +1 -0
  1299. package/icons/filter/filter.d.ts +8 -0
  1300. package/icons/filter/index.d.ts +5 -11
  1301. package/icons/filter/public_api.d.ts +1 -0
  1302. package/icons/filterslash/filterslash.d.ts +8 -0
  1303. package/icons/filterslash/index.d.ts +5 -11
  1304. package/icons/filterslash/public_api.d.ts +1 -0
  1305. package/icons/home/home.d.ts +8 -0
  1306. package/icons/home/index.d.ts +5 -11
  1307. package/icons/home/public_api.d.ts +1 -0
  1308. package/icons/infocircle/index.d.ts +5 -11
  1309. package/icons/infocircle/infocircle.d.ts +8 -0
  1310. package/icons/infocircle/public_api.d.ts +1 -0
  1311. package/icons/minus/index.d.ts +5 -9
  1312. package/icons/minus/minus.d.ts +6 -0
  1313. package/icons/minus/public_api.d.ts +1 -0
  1314. package/icons/pencil/index.d.ts +5 -11
  1315. package/icons/pencil/pencil.d.ts +8 -0
  1316. package/icons/pencil/public_api.d.ts +1 -0
  1317. package/icons/plus/index.d.ts +5 -11
  1318. package/icons/plus/plus.d.ts +8 -0
  1319. package/icons/plus/public_api.d.ts +1 -0
  1320. package/icons/refresh/index.d.ts +5 -11
  1321. package/icons/refresh/public_api.d.ts +1 -0
  1322. package/icons/refresh/refresh.d.ts +8 -0
  1323. package/icons/search/index.d.ts +5 -11
  1324. package/icons/search/public_api.d.ts +1 -0
  1325. package/icons/search/search.d.ts +8 -0
  1326. package/icons/searchminus/index.d.ts +5 -11
  1327. package/icons/searchminus/public_api.d.ts +1 -0
  1328. package/icons/searchminus/searchminus.d.ts +8 -0
  1329. package/icons/searchplus/index.d.ts +5 -11
  1330. package/icons/searchplus/public_api.d.ts +1 -0
  1331. package/icons/searchplus/searchplus.d.ts +8 -0
  1332. package/icons/sortalt/index.d.ts +5 -11
  1333. package/icons/sortalt/public_api.d.ts +1 -0
  1334. package/icons/sortalt/sortalt.d.ts +8 -0
  1335. package/icons/sortamountdown/index.d.ts +5 -11
  1336. package/icons/sortamountdown/public_api.d.ts +1 -0
  1337. package/icons/sortamountdown/sortamountdown.d.ts +8 -0
  1338. package/icons/sortamountupalt/index.d.ts +5 -11
  1339. package/icons/sortamountupalt/public_api.d.ts +1 -0
  1340. package/icons/sortamountupalt/sortamountupalt.d.ts +8 -0
  1341. package/icons/spinner/index.d.ts +5 -11
  1342. package/icons/spinner/public_api.d.ts +1 -0
  1343. package/icons/spinner/spinner.d.ts +8 -0
  1344. package/icons/star/index.d.ts +5 -11
  1345. package/icons/star/public_api.d.ts +1 -0
  1346. package/icons/star/star.d.ts +8 -0
  1347. package/icons/starfill/index.d.ts +5 -11
  1348. package/icons/starfill/public_api.d.ts +1 -0
  1349. package/icons/starfill/starfill.d.ts +8 -0
  1350. package/icons/thlarge/index.d.ts +5 -11
  1351. package/icons/thlarge/public_api.d.ts +1 -0
  1352. package/icons/thlarge/thlarge.d.ts +8 -0
  1353. package/icons/times/index.d.ts +5 -9
  1354. package/icons/times/public_api.d.ts +1 -0
  1355. package/icons/times/times.d.ts +6 -0
  1356. package/icons/timescircle/index.d.ts +5 -11
  1357. package/icons/timescircle/public_api.d.ts +1 -0
  1358. package/icons/timescircle/timescircle.d.ts +8 -0
  1359. package/icons/trash/index.d.ts +5 -11
  1360. package/icons/trash/public_api.d.ts +1 -0
  1361. package/icons/trash/trash.d.ts +8 -0
  1362. package/icons/undo/index.d.ts +5 -11
  1363. package/icons/undo/public_api.d.ts +1 -0
  1364. package/icons/undo/undo.d.ts +8 -0
  1365. package/icons/upload/index.d.ts +5 -11
  1366. package/icons/upload/public_api.d.ts +1 -0
  1367. package/icons/upload/upload.d.ts +8 -0
  1368. package/icons/windowmaximize/index.d.ts +5 -11
  1369. package/icons/windowmaximize/public_api.d.ts +1 -0
  1370. package/icons/windowmaximize/windowmaximize.d.ts +8 -0
  1371. package/icons/windowminimize/index.d.ts +5 -11
  1372. package/icons/windowminimize/public_api.d.ts +1 -0
  1373. package/icons/windowminimize/windowminimize.d.ts +8 -0
  1374. package/image/image.d.ts +188 -0
  1375. package/image/image.interface.d.ts +31 -0
  1376. package/image/image.module.d.ts +8 -0
  1377. package/image/index.d.ts +3 -228
  1378. package/image/public_api.d.ts +3 -0
  1379. package/index.d.ts +5 -2
  1380. package/inplace/index.d.ts +3 -130
  1381. package/inplace/inplace.d.ts +109 -0
  1382. package/inplace/inplace.interface.d.ts +19 -0
  1383. package/inplace/public_api.d.ts +2 -0
  1384. package/inputgroup/index.d.ts +3 -48
  1385. package/inputgroup/inputgroup.d.ts +33 -0
  1386. package/inputgroup/inputgroup.module.d.ts +15 -0
  1387. package/inputgroup/public_api.d.ts +2 -0
  1388. package/inputgroupaddon/index.d.ts +3 -35
  1389. package/inputgroupaddon/inputgroupaddon.d.ts +21 -0
  1390. package/inputgroupaddon/inputgroupaddon.module.d.ts +14 -0
  1391. package/inputgroupaddon/public_api.d.ts +2 -0
  1392. package/inputicon/index.d.ts +3 -22
  1393. package/inputicon/inputicon.d.ts +21 -0
  1394. package/inputicon/public_api.d.ts +1 -0
  1395. package/inputmask/index.d.ts +3 -304
  1396. package/inputmask/inputmask.d.ts +273 -0
  1397. package/inputmask/inputmask.interface.d.ts +19 -0
  1398. package/inputmask/inputmask.module.d.ts +12 -0
  1399. package/inputmask/public_api.d.ts +3 -0
  1400. package/inputnumber/index.d.ts +3 -443
  1401. package/inputnumber/inputnumber.d.ts +397 -0
  1402. package/inputnumber/inputnumber.interface.d.ts +38 -0
  1403. package/inputnumber/inputnumber.module.d.ts +8 -0
  1404. package/inputnumber/public_api.d.ts +3 -0
  1405. package/inputotp/index.d.ts +3 -189
  1406. package/inputotp/inputotp.d.ts +123 -0
  1407. package/inputotp/inputotp.interface.d.ts +65 -0
  1408. package/inputotp/public_api.d.ts +2 -0
  1409. package/inputswitch/index.d.ts +3 -123
  1410. package/inputswitch/inputswitch.d.ts +106 -0
  1411. package/inputswitch/inputswitch.interface.d.ts +15 -0
  1412. package/inputswitch/public_api.d.ts +2 -0
  1413. package/inputtext/index.d.ts +5 -76
  1414. package/inputtext/inputtext.component.d.ts +43 -0
  1415. package/inputtext/inputtext.directive.d.ts +25 -0
  1416. package/inputtext/inputtext.module.d.ts +10 -0
  1417. package/inputtext/public_api.d.ts +3 -0
  1418. package/inputtextarea/index.d.ts +3 -112
  1419. package/inputtextarea/inputtextarea.component.d.ts +57 -0
  1420. package/inputtextarea/inputtextarea.directive.d.ts +47 -0
  1421. package/inputtextarea/inputtextarea.module.d.ts +10 -0
  1422. package/inputtextarea/public_api.d.ts +3 -0
  1423. package/keyfilter/index.d.ts +3 -65
  1424. package/keyfilter/keyfilter.d.ts +58 -0
  1425. package/keyfilter/keyfilter.interface.d.ts +5 -0
  1426. package/keyfilter/public_api.d.ts +2 -0
  1427. package/knob/index.d.ts +3 -179
  1428. package/knob/knob.d.ts +178 -0
  1429. package/knob/public_api.d.ts +1 -0
  1430. package/listbox/index.d.ts +3 -620
  1431. package/listbox/listbox.d.ts +463 -0
  1432. package/listbox/listbox.interface.d.ts +156 -0
  1433. package/listbox/public_api.d.ts +2 -0
  1434. package/logo/index.d.ts +5 -20
  1435. package/logo/logo.d.ts +11 -0
  1436. package/logo/logo.module.d.ts +7 -0
  1437. package/logo/public_api.d.ts +2 -0
  1438. package/megamenu/index.d.ts +3 -230
  1439. package/megamenu/megamenu.d.ts +198 -0
  1440. package/megamenu/megamenu.interface.d.ts +31 -0
  1441. package/megamenu/public_api.d.ts +2 -0
  1442. package/menu/index.d.ts +3 -222
  1443. package/menu/menu.d.ts +210 -0
  1444. package/menu/menu.module.d.ts +12 -0
  1445. package/menu/public_api.d.ts +2 -0
  1446. package/menubar/index.d.ts +3 -290
  1447. package/menubar/menubar.d.ts +248 -0
  1448. package/menubar/menubar.interface.d.ts +40 -0
  1449. package/menubar/public_api.d.ts +2 -0
  1450. package/message/index.d.ts +3 -53
  1451. package/message/message.d.ts +52 -0
  1452. package/message/public_api.d.ts +1 -0
  1453. package/messages/index.d.ts +3 -140
  1454. package/messages/messages.d.ts +115 -0
  1455. package/messages/messages.interface.d.ts +18 -0
  1456. package/messages/messages.module.d.ts +8 -0
  1457. package/messages/public_api.d.ts +3 -0
  1458. package/metergroup/index.d.ts +3 -224
  1459. package/metergroup/metergroup.d.ts +101 -0
  1460. package/metergroup/metergroup.interface.d.ts +122 -0
  1461. package/metergroup/public_api.d.ts +2 -0
  1462. package/multiselect/index.d.ts +3 -974
  1463. package/multiselect/multiselect.d.ts +710 -0
  1464. package/multiselect/multiselect.interface.d.ts +247 -0
  1465. package/multiselect/multiselect.module.d.ts +20 -0
  1466. package/multiselect/public_api.d.ts +3 -0
  1467. package/navigation/index.d.ts +5 -105
  1468. package/navigation/navigation.d.ts +70 -0
  1469. package/navigation/navigation.interface.d.ts +26 -0
  1470. package/navigation/navigation.module.d.ts +7 -0
  1471. package/navigation/public_api.d.ts +2 -0
  1472. package/orderlist/index.d.ts +3 -381
  1473. package/orderlist/orderlist.d.ts +270 -0
  1474. package/orderlist/orderlist.interface.d.ts +110 -0
  1475. package/orderlist/public_api.d.ts +2 -0
  1476. package/organizationchart/index.d.ts +3 -192
  1477. package/organizationchart/organizationchart.d.ts +132 -0
  1478. package/organizationchart/organizationchart.interface.d.ts +59 -0
  1479. package/organizationchart/public_api.d.ts +2 -0
  1480. package/overlay/index.d.ts +3 -246
  1481. package/overlay/overlay.d.ts +238 -0
  1482. package/overlay/overlay.module.d.ts +8 -0
  1483. package/overlay/public_api.d.ts +2 -0
  1484. package/overlaypanel/index.d.ts +3 -170
  1485. package/overlaypanel/overlaypanel.d.ts +162 -0
  1486. package/overlaypanel/overlaypanel.module.d.ts +8 -0
  1487. package/overlaypanel/public_api.d.ts +2 -0
  1488. package/package.json +699 -359
  1489. package/paginator/index.d.ts +3 -249
  1490. package/paginator/paginator.d.ts +195 -0
  1491. package/paginator/paginator.interface.d.ts +37 -0
  1492. package/paginator/paginator.module.d.ts +17 -0
  1493. package/paginator/public_api.d.ts +3 -0
  1494. package/panel/index.d.ts +3 -185
  1495. package/panel/panel.d.ts +126 -0
  1496. package/panel/panel.interface.d.ts +58 -0
  1497. package/panel/public_api.d.ts +2 -0
  1498. package/panelmenu/index.d.ts +3 -249
  1499. package/panelmenu/panelmenu.d.ts +225 -0
  1500. package/panelmenu/panelmenu.interface.d.ts +23 -0
  1501. package/panelmenu/public_api.d.ts +2 -0
  1502. package/password/index.d.ts +3 -342
  1503. package/password/password.d.ts +342 -0
  1504. package/password/public_api.d.ts +1 -0
  1505. package/picklist/index.d.ts +3 -696
  1506. package/picklist/picklist.d.ts +453 -0
  1507. package/picklist/picklist.interface.d.ts +242 -0
  1508. package/picklist/public_api.d.ts +2 -0
  1509. package/progressbar/index.d.ts +3 -61
  1510. package/progressbar/progressbar.d.ts +54 -0
  1511. package/progressbar/progressbar.module.d.ts +8 -0
  1512. package/progressbar/public_api.d.ts +2 -0
  1513. package/progressspinner/index.d.ts +3 -58
  1514. package/progressspinner/progressspinner.d.ts +50 -0
  1515. package/progressspinner/progressspinner.module.d.ts +8 -0
  1516. package/progressspinner/public_api.d.ts +2 -0
  1517. package/public_api.d.ts +2 -0
  1518. package/radiobutton/index.d.ts +3 -173
  1519. package/radiobutton/public_api.d.ts +3 -0
  1520. package/radiobutton/radiobutton.d.ts +150 -0
  1521. package/radiobutton/radiobutton.interface.d.ts +15 -0
  1522. package/radiobutton/radiobutton.module.d.ts +7 -0
  1523. package/rating/index.d.ts +3 -181
  1524. package/rating/public_api.d.ts +2 -0
  1525. package/rating/rating.d.ts +146 -0
  1526. package/rating/rating.interface.d.ts +34 -0
  1527. package/resources/components/colorpicker/images/color.png +0 -0
  1528. package/resources/components/colorpicker/images/hue.png +0 -0
  1529. package/resources/components/password/images/password-meter.png +0 -0
  1530. package/resources/components/toggleswitch/toggleswitch.scss +1 -1
  1531. package/resources/components/tree/images/line.gif +0 -0
  1532. package/resources/images/color.png +0 -0
  1533. package/resources/images/hue.png +0 -0
  1534. package/resources/images/line.gif +0 -0
  1535. package/resources/images/password-meter.png +0 -0
  1536. package/ripple/index.d.ts +3 -37
  1537. package/ripple/public_api.d.ts +2 -0
  1538. package/ripple/ripple.d.ts +30 -0
  1539. package/ripple/ripple.module.d.ts +7 -0
  1540. package/scroller/index.d.ts +3 -528
  1541. package/scroller/public_api.d.ts +3 -0
  1542. package/scroller/scroller.d.ts +343 -0
  1543. package/scroller/scroller.interface.d.ts +177 -0
  1544. package/scroller/scroller.module.d.ts +8 -0
  1545. package/scrollpanel/index.d.ts +3 -116
  1546. package/scrollpanel/public_api.d.ts +2 -0
  1547. package/scrollpanel/scrollpanel.d.ts +103 -0
  1548. package/scrollpanel/scrollpanel.interface.d.ts +11 -0
  1549. package/scrolltop/index.d.ts +3 -117
  1550. package/scrolltop/public_api.d.ts +2 -0
  1551. package/scrolltop/scrolltop.d.ts +97 -0
  1552. package/scrolltop/scrolltop.interface.d.ts +18 -0
  1553. package/selectbutton/index.d.ts +3 -184
  1554. package/selectbutton/public_api.d.ts +3 -0
  1555. package/selectbutton/selectbutton.d.ts +128 -0
  1556. package/selectbutton/selectbutton.interface.d.ts +45 -0
  1557. package/selectbutton/selectbutton.module.d.ts +11 -0
  1558. package/sidebar/index.d.ts +3 -213
  1559. package/sidebar/public_api.d.ts +3 -0
  1560. package/sidebar/sidebar.d.ts +173 -0
  1561. package/sidebar/sidebar.interface.d.ts +27 -0
  1562. package/sidebar/sidebar.module.d.ts +12 -0
  1563. package/skeleton/index.d.ts +3 -69
  1564. package/skeleton/public_api.d.ts +2 -0
  1565. package/skeleton/skeleton.d.ts +61 -0
  1566. package/skeleton/skeleton.module.d.ts +8 -0
  1567. package/slidemenu/index.d.ts +3 -339
  1568. package/slidemenu/public_api.d.ts +2 -0
  1569. package/slidemenu/slidemenu.d.ts +322 -0
  1570. package/slidemenu/slidemenu.interface.d.ts +15 -0
  1571. package/slider/index.d.ts +3 -214
  1572. package/slider/public_api.d.ts +2 -0
  1573. package/slider/slider.d.ts +174 -0
  1574. package/slider/slider.interface.d.ts +38 -0
  1575. package/speeddial/index.d.ts +3 -319
  1576. package/speeddial/public_api.d.ts +3 -0
  1577. package/speeddial/speeddial.d.ts +277 -0
  1578. package/speeddial/speeddial.interface.d.ts +28 -0
  1579. package/speeddial/speeddial.module.d.ts +14 -0
  1580. package/spinner/index.d.ts +5 -93
  1581. package/spinner/public_api.d.ts +1 -0
  1582. package/spinner/spinner.d.ts +90 -0
  1583. package/splitbutton/index.d.ts +3 -264
  1584. package/splitbutton/public_api.d.ts +3 -0
  1585. package/splitbutton/splitbutton.d.ts +222 -0
  1586. package/splitbutton/splitbutton.interface.d.ts +30 -0
  1587. package/splitbutton/splitbutton.module.d.ts +13 -0
  1588. package/splitter/index.d.ts +3 -201
  1589. package/splitter/public_api.d.ts +3 -0
  1590. package/splitter/splitter.d.ts +158 -0
  1591. package/splitter/splitter.interface.d.ts +34 -0
  1592. package/splitter/splitter.module.d.ts +9 -0
  1593. package/stepper/index.d.ts +3 -145
  1594. package/stepper/public_api.d.ts +2 -0
  1595. package/stepper/stepper.d.ts +117 -0
  1596. package/stepper/stepper.interface.d.ts +26 -0
  1597. package/steps/index.d.ts +3 -87
  1598. package/steps/public_api.d.ts +2 -0
  1599. package/steps/steps.d.ts +77 -0
  1600. package/steps/steps.module.d.ts +10 -0
  1601. package/styleclass/index.d.ts +3 -109
  1602. package/styleclass/public_api.d.ts +1 -0
  1603. package/styleclass/styleclass.d.ts +108 -0
  1604. package/table/columnfilter.interface.d.ts +247 -0
  1605. package/table/components/cell-editor/cell-editor.d.ts +20 -0
  1606. package/table/components/column-filter/column-filter.d.ts +291 -0
  1607. package/table/components/column-filter-form-element/column-filter-form-element.d.ts +37 -0
  1608. package/table/components/sort-icon/sort-icon.d.ts +22 -0
  1609. package/table/components/table-body/table-body.d.ts +36 -0
  1610. package/table/components/table-checkbox/table-checkbox.d.ts +32 -0
  1611. package/table/components/table-header-checkbox/table-header-checkbox.d.ts +29 -0
  1612. package/table/components/table-radio-button/table-radio-button.d.ts +29 -0
  1613. package/table/directives/cancel-editable-row.directive.d.ts +11 -0
  1614. package/table/directives/cell-highlight.directive.d.ts +14 -0
  1615. package/table/directives/content-menu-row.directive.d.ts +22 -0
  1616. package/table/directives/dynamic-column-width.directive.d.ts +12 -0
  1617. package/table/directives/editable-column.directive.d.ts +40 -0
  1618. package/table/directives/editable-row.directive.d.ts +12 -0
  1619. package/table/directives/frozen-column.directive.d.ts +16 -0
  1620. package/table/directives/init-editable-row.directive.d.ts +11 -0
  1621. package/table/directives/reorderable-column.directive.d.ts +32 -0
  1622. package/table/directives/reorderable-row-handle.directive.d.ts +9 -0
  1623. package/table/directives/reorderable-row.directive.d.ts +34 -0
  1624. package/table/directives/resizable-column.directive.d.ts +35 -0
  1625. package/table/directives/row-group-header.directive.d.ts +9 -0
  1626. package/table/directives/row-toggler.directive.d.ts +13 -0
  1627. package/table/directives/save-editable-row.directive.d.ts +11 -0
  1628. package/table/directives/selectable-row-double-click.directive.d.ts +22 -0
  1629. package/table/directives/selectable-row.directive.d.ts +37 -0
  1630. package/table/directives/sortable-column.directive.d.ts +24 -0
  1631. package/table/index.d.ts +3 -2556
  1632. package/table/public_api.d.ts +30 -0
  1633. package/table/table.d.ts +871 -0
  1634. package/table/table.interface.d.ts +623 -0
  1635. package/table/table.module.d.ts +34 -0
  1636. package/table/table.service.d.ts +24 -0
  1637. package/tableconfiguration/index.d.ts +5 -25
  1638. package/tableconfiguration/public_api.d.ts +2 -0
  1639. package/tableconfiguration/tableconfiguration.d.ts +16 -0
  1640. package/tableconfiguration/tableconfiguration.module.d.ts +7 -0
  1641. package/tabmenu/index.d.ts +3 -160
  1642. package/tabmenu/public_api.d.ts +2 -0
  1643. package/tabmenu/tabmenu.d.ts +126 -0
  1644. package/tabmenu/tabmenu.interface.d.ts +32 -0
  1645. package/tabview/index.d.ts +3 -357
  1646. package/tabview/public_api.d.ts +3 -0
  1647. package/tabview/tabview.d.ts +293 -0
  1648. package/tabview/tabview.interface.d.ts +49 -0
  1649. package/tabview/tabview.module.d.ts +15 -0
  1650. package/tag/index.d.ts +3 -82
  1651. package/tag/public_api.d.ts +3 -0
  1652. package/tag/tag.d.ts +61 -0
  1653. package/tag/tag.interface.d.ts +11 -0
  1654. package/tag/tag.module.d.ts +9 -0
  1655. package/terminal/index.d.ts +3 -68
  1656. package/terminal/public_api.d.ts +2 -0
  1657. package/terminal/terminal.d.ts +56 -0
  1658. package/terminal/terminalservice.d.ts +11 -0
  1659. package/tieredmenu/index.d.ts +3 -307
  1660. package/tieredmenu/public_api.d.ts +3 -0
  1661. package/tieredmenu/tieredmenu.d.ts +266 -0
  1662. package/tieredmenu/tieredmenu.interface.d.ts +27 -0
  1663. package/tieredmenu/tiredmenu.module.d.ts +13 -0
  1664. package/timeline/index.d.ts +3 -100
  1665. package/timeline/public_api.d.ts +3 -0
  1666. package/timeline/timeline.d.ts +47 -0
  1667. package/timeline/timeline.interface.d.ts +43 -0
  1668. package/timeline/timeline.module.d.ts +9 -0
  1669. package/toast/index.d.ts +3 -202
  1670. package/toast/public_api.d.ts +3 -0
  1671. package/toast/toast.d.ts +142 -0
  1672. package/toast/toast.interface.d.ts +52 -0
  1673. package/toast/toast.module.d.ts +9 -0
  1674. package/toast/toastitem.d.ts +37 -0
  1675. package/togglebutton/index.d.ts +3 -150
  1676. package/togglebutton/public_api.d.ts +2 -0
  1677. package/togglebutton/togglebutton.d.ts +115 -0
  1678. package/togglebutton/togglebutton.interface.d.ts +34 -0
  1679. package/toggleswitch/index.d.ts +5 -25
  1680. package/toggleswitch/public_api.d.ts +2 -0
  1681. package/toggleswitch/toggleswitch.d.ts +14 -0
  1682. package/toggleswitch/toggleswitch.module.d.ts +9 -0
  1683. package/toolbar/index.d.ts +3 -64
  1684. package/toolbar/public_api.d.ts +2 -0
  1685. package/toolbar/toolbar.d.ts +43 -0
  1686. package/toolbar/toolbar.interface.d.ts +19 -0
  1687. package/tooltip/index.d.ts +3 -218
  1688. package/tooltip/public_api.d.ts +2 -0
  1689. package/tooltip/tooltip.d.ts +208 -0
  1690. package/tooltip/tooltip.module.d.ts +10 -0
  1691. package/tree/index.d.ts +3 -673
  1692. package/tree/public_api.d.ts +3 -0
  1693. package/tree/tree.d.ts +461 -0
  1694. package/tree/tree.interface.d.ts +193 -0
  1695. package/tree/tree.module.d.ts +21 -0
  1696. package/treeselect/index.d.ts +3 -517
  1697. package/treeselect/public_api.d.ts +3 -0
  1698. package/treeselect/treeselect.d.ts +394 -0
  1699. package/treeselect/treeselect.interface.d.ts +108 -0
  1700. package/treeselect/treeselect.module.d.ts +16 -0
  1701. package/treetable/index.d.ts +3 -1461
  1702. package/treetable/public_api.d.ts +2 -0
  1703. package/treetable/treetable.d.ts +988 -0
  1704. package/treetable/treetable.interface.d.ts +472 -0
  1705. package/tristatecheckbox/index.d.ts +3 -155
  1706. package/tristatecheckbox/public_api.d.ts +3 -0
  1707. package/tristatecheckbox/tristatecheckbox.d.ts +117 -0
  1708. package/tristatecheckbox/tristatecheckbox.interface.d.ts +30 -0
  1709. package/tristatecheckbox/tristatecheckbox.module.d.ts +8 -0
  1710. package/ts-helpers/index.d.ts +5 -6
  1711. package/ts-helpers/public_api.d.ts +1 -0
  1712. package/ts-helpers/ts-helpers.d.ts +4 -0
  1713. package/upload/index.d.ts +5 -81
  1714. package/upload/public_api.d.ts +2 -0
  1715. package/upload/upload.component.d.ts +67 -0
  1716. package/upload/upload.component.module.d.ts +11 -0
  1717. package/utils/index.d.ts +5 -35
  1718. package/utils/objectutils.d.ts +24 -0
  1719. package/utils/public_api.d.ts +4 -0
  1720. package/utils/uniquecomponentid.d.ts +2 -0
  1721. package/utils/zindexutils.d.ts +7 -0
  1722. package/virtualscroller/index.d.ts +3 -161
  1723. package/virtualscroller/public_api.d.ts +2 -0
  1724. package/virtualscroller/virtualscroller.d.ts +89 -0
  1725. package/virtualscroller/virtualscroller.interface.d.ts +72 -0
  1726. package/cax-design-system-2.8.2.tgz +0 -0
@@ -0,0 +1,3242 @@
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { CommonModule, DOCUMENT } from '@angular/common';
3
+ import { booleanAttribute, ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, forwardRef, Inject, Input, numberAttribute, Output, ViewChild, ViewEncapsulation } from '@angular/core';
4
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import { CaxTemplate, SharedModule, TranslationKeys } from 'cax-design-system/api';
6
+ import { ButtonModule } from 'cax-design-system/button';
7
+ import { ConnectedOverlayScrollHandler, DomHandler } from 'cax-design-system/dom';
8
+ import { RippleModule } from 'cax-design-system/ripple';
9
+ import { ObjectUtils, UniqueComponentId, ZIndexUtils } from 'cax-design-system/utils';
10
+ import { ChevronLeftIcon } from 'cax-design-system/icons/chevronleft';
11
+ import { ChevronRightIcon } from 'cax-design-system/icons/chevronright';
12
+ import { ChevronUpIcon } from 'cax-design-system/icons/chevronup';
13
+ import { ChevronDownIcon } from 'cax-design-system/icons/chevrondown';
14
+ import { TimesIcon } from 'cax-design-system/icons/times';
15
+ import { CalendarIcon } from 'cax-design-system/icons/calendar';
16
+ import { ArrowDownIcon } from 'cax-design-system/icons/arrowdown';
17
+ import { AutoFocusModule } from 'cax-design-system/autofocus';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "cax-design-system/api";
20
+ import * as i2 from "@angular/common";
21
+ import * as i3 from "cax-design-system/button";
22
+ import * as i4 from "cax-design-system/ripple";
23
+ import * as i5 from "cax-design-system/autofocus";
24
+ export const CALENDAR_VALUE_ACCESSOR = {
25
+ provide: NG_VALUE_ACCESSOR,
26
+ useExisting: forwardRef(() => Calendar),
27
+ multi: true
28
+ };
29
+ /**
30
+ * Calendar also known as DatePicker, is a form component to work with dates.
31
+ * @group Components
32
+ */
33
+ export class Calendar {
34
+ document;
35
+ el;
36
+ renderer;
37
+ cd;
38
+ zone;
39
+ config;
40
+ overlayService;
41
+ iconDisplay = 'button';
42
+ /**
43
+ * Inline style of the component.
44
+ * @group Props
45
+ */
46
+ style;
47
+ /**
48
+ * Style class of the component.
49
+ * @group Props
50
+ */
51
+ styleClass;
52
+ /**
53
+ * Inline style of the input field.
54
+ * @group Props
55
+ */
56
+ inputStyle;
57
+ /**
58
+ * Identifier of the focus input to match a label defined for the component.
59
+ * @group Props
60
+ */
61
+ inputId;
62
+ /**
63
+ * Name of the input element.
64
+ * @group Props
65
+ */
66
+ name;
67
+ /**
68
+ * Style class of the input field.
69
+ * @group Props
70
+ */
71
+ inputStyleClass;
72
+ /**
73
+ * Placeholder text for the input.
74
+ * @group Props
75
+ */
76
+ placeholder;
77
+ /**
78
+ * Establishes relationships between the component and label(s) where its value should be one or more element IDs.
79
+ * @group Props
80
+ */
81
+ ariaLabelledBy;
82
+ /**
83
+ * Defines a string that labels the input for accessibility.
84
+ * @group Props
85
+ */
86
+ ariaLabel;
87
+ /**
88
+ * Defines a string that labels the icon button for accessibility.
89
+ * @group Props
90
+ */
91
+ iconAriaLabel;
92
+ /**
93
+ * When specified, disables the component.
94
+ * @group Props
95
+ */
96
+ disabled;
97
+ /**
98
+ * Format of the date which can also be defined at locale settings.
99
+ * @group Props
100
+ */
101
+ dateFormat;
102
+ /**
103
+ * Separator for multiple selection mode.
104
+ * @group Props
105
+ */
106
+ multipleSeparator = ',';
107
+ /**
108
+ * Separator for joining start and end dates on range selection mode.
109
+ * @group Props
110
+ */
111
+ rangeSeparator = '-';
112
+ /**
113
+ * When enabled, displays the calendar as inline. Default is false for popup mode.
114
+ * @group Props
115
+ */
116
+ inline = false;
117
+ /**
118
+ * Whether to display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use the selectOtherMonths option.
119
+ * @group Props
120
+ */
121
+ showOtherMonths = true;
122
+ /**
123
+ * Whether days in other months shown before or after the current month are selectable. This only applies if the showOtherMonths option is set to true.
124
+ * @group Props
125
+ */
126
+ selectOtherMonths;
127
+ /**
128
+ * When enabled, displays a button with icon next to input.
129
+ * @group Props
130
+ */
131
+ showIcon;
132
+ /**
133
+ * Icon of the calendar button.
134
+ * @group Props
135
+ */
136
+ icon;
137
+ /**
138
+ * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having#mydiv as variable name).
139
+ * @group Props
140
+ */
141
+ appendTo;
142
+ /**
143
+ * When specified, prevents entering the date manually with keyboard.
144
+ * @group Props
145
+ */
146
+ readonlyInput;
147
+ /**
148
+ * The cutoff year for determining the century for a date.
149
+ * @group Props
150
+ */
151
+ shortYearCutoff = '+10';
152
+ /**
153
+ * Whether the month should be rendered as a dropdown instead of text.
154
+ * @group Props
155
+ * @deprecated Navigator is always on.
156
+ */
157
+ monthNavigator;
158
+ /**
159
+ * Whether the year should be rendered as a dropdown instead of text.
160
+ * @group Props
161
+ * @deprecated Navigator is always on.
162
+ */
163
+ yearNavigator;
164
+ /**
165
+ * Specifies 12 or 24 hour format.
166
+ * @group Props
167
+ */
168
+ hourFormat = '24';
169
+ /**
170
+ * Whether to display timepicker only.
171
+ * @group Props
172
+ */
173
+ timeOnly;
174
+ /**
175
+ * Years to change per step in yearpicker.
176
+ * @group Props
177
+ */
178
+ stepYearPicker = 9;
179
+ /**
180
+ * Hours to change per step.
181
+ * @group Props
182
+ */
183
+ stepHour = 1;
184
+ /**
185
+ * Minutes to change per step.
186
+ * @group Props
187
+ */
188
+ stepMinute = 1;
189
+ /**
190
+ * Seconds to change per step.
191
+ * @group Props
192
+ */
193
+ stepSecond = 1;
194
+ /**
195
+ * Whether to show the seconds in time picker.
196
+ * @group Props
197
+ */
198
+ showSeconds = false;
199
+ /**
200
+ * When present, it specifies that an input field must be filled out before submitting the form.
201
+ * @group Props
202
+ */
203
+ required;
204
+ /**
205
+ * When disabled, datepicker will not be visible with input focus.
206
+ * @group Props
207
+ */
208
+ showOnFocus = true;
209
+ /**
210
+ * When enabled, calendar will show week numbers.
211
+ * @group Props
212
+ */
213
+ showWeek = false;
214
+ /**
215
+ * When enabled, calendar will start week numbers from first day of the year.
216
+ * @group Props
217
+ */
218
+ startWeekFromFirstDayOfYear = false;
219
+ /**
220
+ * When enabled, a clear icon is displayed to clear the value.
221
+ * @group Props
222
+ */
223
+ showClear = false;
224
+ /**
225
+ * Type of the value to write back to ngModel, default is date and alternative is string.
226
+ * @group Props
227
+ */
228
+ dataType = 'date';
229
+ /**
230
+ * Defines the quantity of the selection, valid values are "single", "multiple" and "range".
231
+ * @group Props
232
+ */
233
+ selectionMode = 'single';
234
+ /**
235
+ * Maximum number of selectable dates in multiple mode.
236
+ * @group Props
237
+ */
238
+ maxDateCount;
239
+ /**
240
+ * Whether to display today and clear buttons at the footer
241
+ * @group Props
242
+ */
243
+ showButtonBar;
244
+ /**
245
+ * Style class of the today button.
246
+ * @group Props
247
+ */
248
+ todayButtonStyleClass = 'cax-button-text';
249
+ /**
250
+ * Style class of the clear button.
251
+ * @group Props
252
+ */
253
+ clearButtonStyleClass = 'cax-button-text';
254
+ /**
255
+ * When present, it specifies that the component should automatically get focus on load.
256
+ * @group Props
257
+ */
258
+ autofocus;
259
+ /**
260
+ * Whether to automatically manage layering.
261
+ * @group Props
262
+ */
263
+ autoZIndex = true;
264
+ /**
265
+ * Base zIndex value to use in layering.
266
+ * @group Props
267
+ */
268
+ baseZIndex = 0;
269
+ /**
270
+ * Style class of the datetimepicker container element.
271
+ * @group Props
272
+ */
273
+ panelStyleClass;
274
+ /**
275
+ * Inline style of the datetimepicker container element.
276
+ * @group Props
277
+ */
278
+ panelStyle;
279
+ /**
280
+ * Keep invalid value when input blur.
281
+ * @group Props
282
+ */
283
+ keepInvalid = false;
284
+ /**
285
+ * Whether to hide the overlay on date selection.
286
+ * @group Props
287
+ */
288
+ hideOnDateTimeSelect = true;
289
+ /**
290
+ * When enabled, calendar overlay is displayed as optimized for touch devices.
291
+ * @group Props
292
+ */
293
+ touchUI;
294
+ /**
295
+ * Separator of time selector.
296
+ * @group Props
297
+ */
298
+ labelText;
299
+ timeSeparator = ':';
300
+ leftIcon = true;
301
+ //@Input() rightIcon: boolean= false;
302
+ /**
303
+ * When enabled, can only focus on elements inside the calendar.
304
+ * @group Props
305
+ */
306
+ focusTrap = true;
307
+ /**
308
+ * Transition options of the show animation.
309
+ * @group Props
310
+ */
311
+ showTransitionOptions = '.12s cubic-bezier(0, 0, 0.2, 1)';
312
+ /**
313
+ * Transition options of the hide animation.
314
+ * @group Props
315
+ */
316
+ hideTransitionOptions = '.1s linear';
317
+ /**
318
+ * Index of the element in tabbing order.
319
+ * @group Props
320
+ */
321
+ tabindex;
322
+ /**
323
+ * Specifies the input variant of the component.
324
+ * @group Props
325
+ */
326
+ variant = 'outlined';
327
+ /**
328
+ * The minimum selectable date.
329
+ * @group Props
330
+ */
331
+ get minDate() {
332
+ return this._minDate;
333
+ }
334
+ set minDate(date) {
335
+ this._minDate = date;
336
+ if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) {
337
+ this.createMonths(this.currentMonth, this.currentYear);
338
+ }
339
+ }
340
+ /**
341
+ * The maximum selectable date.
342
+ * @group Props
343
+ */
344
+ get maxDate() {
345
+ return this._maxDate;
346
+ }
347
+ set maxDate(date) {
348
+ this._maxDate = date;
349
+ if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) {
350
+ this.createMonths(this.currentMonth, this.currentYear);
351
+ }
352
+ }
353
+ /**
354
+ * Array with dates that should be disabled (not selectable).
355
+ * @group Props
356
+ */
357
+ get disabledDates() {
358
+ return this._disabledDates;
359
+ }
360
+ set disabledDates(disabledDates) {
361
+ this._disabledDates = disabledDates;
362
+ if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) {
363
+ this.createMonths(this.currentMonth, this.currentYear);
364
+ }
365
+ }
366
+ /**
367
+ * Array with weekday numbers that should be disabled (not selectable).
368
+ * @group Props
369
+ */
370
+ get disabledDays() {
371
+ return this._disabledDays;
372
+ }
373
+ set disabledDays(disabledDays) {
374
+ this._disabledDays = disabledDays;
375
+ if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) {
376
+ this.createMonths(this.currentMonth, this.currentYear);
377
+ }
378
+ }
379
+ /**
380
+ * The range of years displayed in the year drop-down in (nnnn:nnnn) format such as (2000:2020).
381
+ * @group Props
382
+ * @deprecated Years are based on decades by default.
383
+ */
384
+ get yearRange() {
385
+ return this._yearRange;
386
+ }
387
+ set yearRange(yearRange) {
388
+ this._yearRange = yearRange;
389
+ if (yearRange) {
390
+ const years = yearRange.split(':');
391
+ const yearStart = parseInt(years[0]);
392
+ const yearEnd = parseInt(years[1]);
393
+ this.populateYearOptions(yearStart, yearEnd);
394
+ }
395
+ }
396
+ /**
397
+ * Whether to display timepicker.
398
+ * @group Props
399
+ */
400
+ get showTime() {
401
+ return this._showTime;
402
+ }
403
+ set showTime(showTime) {
404
+ this._showTime = showTime;
405
+ if (this.currentHour === undefined) {
406
+ this.initTime(this.value || new Date());
407
+ }
408
+ this.updateInputfield();
409
+ }
410
+ /**
411
+ * An array of options for responsive design.
412
+ * @group Props
413
+ */
414
+ get responsiveOptions() {
415
+ return this._responsiveOptions;
416
+ }
417
+ set responsiveOptions(responsiveOptions) {
418
+ this._responsiveOptions = responsiveOptions;
419
+ this.destroyResponsiveStyleElement();
420
+ this.createResponsiveStyle();
421
+ }
422
+ /**
423
+ * Number of months to display.
424
+ * @group Props
425
+ */
426
+ get numberOfMonths() {
427
+ return this._numberOfMonths;
428
+ }
429
+ set numberOfMonths(numberOfMonths) {
430
+ this._numberOfMonths = numberOfMonths;
431
+ this.destroyResponsiveStyleElement();
432
+ this.createResponsiveStyle();
433
+ }
434
+ /**
435
+ * Defines the first of the week for various date calculations.
436
+ * @group Props
437
+ */
438
+ get firstDayOfWeek() {
439
+ return this._firstDayOfWeek;
440
+ }
441
+ set firstDayOfWeek(firstDayOfWeek) {
442
+ this._firstDayOfWeek = firstDayOfWeek;
443
+ this.createWeekDays();
444
+ }
445
+ /**
446
+ * Option to set calendar locale.
447
+ * @group Props
448
+ * @deprecated Locale property has no effect, use new i18n API instead.
449
+ */
450
+ set locale(newLocale) {
451
+ console.warn('Locale property has no effect, use new i18n API instead.');
452
+ }
453
+ /**
454
+ * Type of view to display, valid values are "date" for datepicker and "month" for month picker.
455
+ * @group Props
456
+ */
457
+ get view() {
458
+ return this._view;
459
+ }
460
+ set view(view) {
461
+ this._view = view;
462
+ this.currentView = this._view;
463
+ }
464
+ /**
465
+ * Set the date to highlight on first opening if the field is blank.
466
+ * @group Props
467
+ */
468
+ get defaultDate() {
469
+ return this._defaultDate;
470
+ }
471
+ set defaultDate(defaultDate) {
472
+ this._defaultDate = defaultDate;
473
+ if (this.initialized) {
474
+ const date = defaultDate || new Date();
475
+ this.currentMonth = date.getMonth();
476
+ this.currentYear = date.getFullYear();
477
+ this.initTime(date);
478
+ this.createMonths(this.currentMonth, this.currentYear);
479
+ }
480
+ }
481
+ get inputClass() {
482
+ return {
483
+ 'cax-inputtext cax-component': true,
484
+ 'cax-variant-filled': this.variant === 'filled' || this.config.inputStyle() === 'filled'
485
+ };
486
+ }
487
+ /**
488
+ * Callback to invoke on focus of input field.
489
+ * @param {Event} event - browser event.
490
+ * @group Emits
491
+ */
492
+ onFocus = new EventEmitter();
493
+ /**
494
+ * Callback to invoke on blur of input field.
495
+ * @param {Event} event - browser event.
496
+ * @group Emits
497
+ */
498
+ onBlur = new EventEmitter();
499
+ /**
500
+ * Callback to invoke when date panel closed.
501
+ * @param {Event} event - Mouse event
502
+ * @group Emits
503
+ */
504
+ onClose = new EventEmitter();
505
+ /**
506
+ * Callback to invoke on date select.
507
+ * @param {Date} date - date value.
508
+ * @group Emits
509
+ */
510
+ onSelect = new EventEmitter();
511
+ /**
512
+ * Callback to invoke when input field cleared.
513
+ * @group Emits
514
+ */
515
+ onClear = new EventEmitter();
516
+ /**
517
+ * Callback to invoke when input field is being typed.
518
+ * @param {Event} event - browser event
519
+ * @group Emits
520
+ */
521
+ onInput = new EventEmitter();
522
+ /**
523
+ * Callback to invoke when today button is clicked.
524
+ * @param {Date} date - today as a date instance.
525
+ * @group Emits
526
+ */
527
+ onTodayClick = new EventEmitter();
528
+ /**
529
+ * Callback to invoke when clear button is clicked.
530
+ * @param {Event} event - browser event.
531
+ * @group Emits
532
+ */
533
+ onClearClick = new EventEmitter();
534
+ /**
535
+ * Callback to invoke when a month is changed using the navigators.
536
+ * @param {CalendarMonthChangeEvent} event - custom month change event.
537
+ * @group Emits
538
+ */
539
+ onMonthChange = new EventEmitter();
540
+ /**
541
+ * Callback to invoke when a year is changed using the navigators.
542
+ * @param {CalendarYearChangeEvent} event - custom year change event.
543
+ * @group Emits
544
+ */
545
+ onYearChange = new EventEmitter();
546
+ /**
547
+ * Callback to invoke when clicked outside of the date panel.
548
+ * @group Emits
549
+ */
550
+ onClickOutside = new EventEmitter();
551
+ /**
552
+ * Callback to invoke when datepicker panel is shown.
553
+ * @group Emits
554
+ */
555
+ onInlineSaved = new EventEmitter();
556
+ onInlineCancelled = new EventEmitter();
557
+ onShow = new EventEmitter();
558
+ templates;
559
+ containerViewChild;
560
+ inputfieldViewChild;
561
+ set content(content) {
562
+ this.contentViewChild = content;
563
+ if (this.contentViewChild) {
564
+ if (this.isMonthNavigate) {
565
+ Promise.resolve(null).then(() => this.updateFocus());
566
+ this.isMonthNavigate = false;
567
+ }
568
+ else {
569
+ if (!this.focus && !this.inline) {
570
+ this.initFocusableCell();
571
+ }
572
+ }
573
+ }
574
+ }
575
+ contentViewChild;
576
+ value;
577
+ dates;
578
+ months;
579
+ weekDays;
580
+ currentMonth;
581
+ currentYear;
582
+ currentHour;
583
+ currentMinute;
584
+ currentSecond;
585
+ pm;
586
+ mask;
587
+ maskClickListener;
588
+ overlay;
589
+ responsiveStyleElement;
590
+ overlayVisible;
591
+ onModelChange = () => { };
592
+ onModelTouched = () => { };
593
+ calendarElement;
594
+ timePickerTimer;
595
+ documentClickListener;
596
+ animationEndListener;
597
+ ticksTo1970;
598
+ yearOptions;
599
+ focus;
600
+ isKeydown;
601
+ filled;
602
+ inputFieldValue = null;
603
+ _minDate;
604
+ _maxDate;
605
+ _showTime;
606
+ _yearRange;
607
+ preventDocumentListener;
608
+ dateTemplate;
609
+ headerTemplate;
610
+ footerTemplate;
611
+ disabledDateTemplate;
612
+ decadeTemplate;
613
+ previousIconTemplate;
614
+ nextIconTemplate;
615
+ triggerIconTemplate;
616
+ clearIconTemplate;
617
+ decrementIconTemplate;
618
+ incrementIconTemplate;
619
+ inputIconTemplate;
620
+ _disabledDates;
621
+ _disabledDays;
622
+ selectElement;
623
+ todayElement;
624
+ focusElement;
625
+ scrollHandler;
626
+ documentResizeListener;
627
+ navigationState = null;
628
+ isMonthNavigate;
629
+ initialized;
630
+ translationSubscription;
631
+ _locale;
632
+ _responsiveOptions;
633
+ currentView;
634
+ attributeSelector;
635
+ panelId;
636
+ _numberOfMonths = 1;
637
+ _firstDayOfWeek;
638
+ _view = 'date';
639
+ preventFocus;
640
+ _defaultDate;
641
+ _focusKey = null;
642
+ originalValue = null;
643
+ formattedInlineDate = '';
644
+ window;
645
+ get locale() {
646
+ return this._locale;
647
+ }
648
+ get iconButtonAriaLabel() {
649
+ return this.iconAriaLabel ? this.iconAriaLabel : this.getTranslation('chooseDate');
650
+ }
651
+ get prevIconAriaLabel() {
652
+ return this.currentView === 'year' ? this.getTranslation('prevDecade') : this.currentView === 'month' ? this.getTranslation('prevYear') : this.getTranslation('prevMonth');
653
+ }
654
+ get nextIconAriaLabel() {
655
+ return this.currentView === 'year' ? this.getTranslation('nextDecade') : this.currentView === 'month' ? this.getTranslation('nextYear') : this.getTranslation('nextMonth');
656
+ }
657
+ constructor(document, el, renderer, cd, zone, config, overlayService) {
658
+ this.document = document;
659
+ this.el = el;
660
+ this.renderer = renderer;
661
+ this.cd = cd;
662
+ this.zone = zone;
663
+ this.config = config;
664
+ this.overlayService = overlayService;
665
+ this.window = this.document.defaultView;
666
+ }
667
+ ngOnInit() {
668
+ this.attributeSelector = UniqueComponentId();
669
+ this.panelId = this.attributeSelector + '_panel';
670
+ const date = this.defaultDate || new Date();
671
+ this.createResponsiveStyle();
672
+ this.currentMonth = date.getMonth();
673
+ this.currentYear = date.getFullYear();
674
+ this.yearOptions = [];
675
+ this.currentView = this.view;
676
+ if (this.view === 'date') {
677
+ this.createWeekDays();
678
+ this.initTime(date);
679
+ this.createMonths(this.currentMonth, this.currentYear);
680
+ this.ticksTo1970 = ((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000;
681
+ }
682
+ this.translationSubscription = this.config.translationObserver.subscribe(() => {
683
+ this.createWeekDays();
684
+ this.cd.markForCheck();
685
+ });
686
+ this.initialized = true;
687
+ this.updateFormattedInlineDate();
688
+ }
689
+ ngAfterContentInit() {
690
+ this.templates.forEach((item) => {
691
+ switch (item.getType()) {
692
+ case 'date':
693
+ this.dateTemplate = item.template;
694
+ break;
695
+ case 'decade':
696
+ this.decadeTemplate = item.template;
697
+ break;
698
+ case 'disabledDate':
699
+ this.disabledDateTemplate = item.template;
700
+ break;
701
+ case 'header':
702
+ this.headerTemplate = item.template;
703
+ break;
704
+ case 'inputicon':
705
+ this.inputIconTemplate = item.template;
706
+ break;
707
+ case 'previousicon':
708
+ this.previousIconTemplate = item.template;
709
+ break;
710
+ case 'nexticon':
711
+ this.nextIconTemplate = item.template;
712
+ break;
713
+ case 'triggericon':
714
+ this.triggerIconTemplate = item.template;
715
+ break;
716
+ case 'clearicon':
717
+ this.clearIconTemplate = item.template;
718
+ break;
719
+ case 'decrementicon':
720
+ this.decrementIconTemplate = item.template;
721
+ break;
722
+ case 'incrementicon':
723
+ this.incrementIconTemplate = item.template;
724
+ break;
725
+ case 'footer':
726
+ this.footerTemplate = item.template;
727
+ break;
728
+ default:
729
+ this.dateTemplate = item.template;
730
+ break;
731
+ }
732
+ });
733
+ }
734
+ ngAfterViewInit() {
735
+ if (this.inline) {
736
+ this.contentViewChild && this.contentViewChild.nativeElement.setAttribute(this.attributeSelector, '');
737
+ if (!this.disabled && !this.inline) {
738
+ this.initFocusableCell();
739
+ if (this.numberOfMonths === 1) {
740
+ if (this.contentViewChild && this.contentViewChild.nativeElement) {
741
+ this.contentViewChild.nativeElement.style.width = DomHandler.getOuterWidth(this.containerViewChild?.nativeElement) + 'px';
742
+ }
743
+ }
744
+ }
745
+ }
746
+ }
747
+ updateFormattedInlineDate() {
748
+ if (this.value) {
749
+ const day = this.value.getDate().toString().padStart(2, '0');
750
+ const month = (this.value.getMonth() + 1).toString().padStart(2, '0');
751
+ const year = this.value.getFullYear();
752
+ this.formattedInlineDate = `${month}/${day}/${year}`;
753
+ }
754
+ else {
755
+ this.formattedInlineDate = '';
756
+ }
757
+ }
758
+ getTranslation(option) {
759
+ return this.config.getTranslation(option);
760
+ }
761
+ populateYearOptions(start, end) {
762
+ this.yearOptions = [];
763
+ for (let i = start; i <= end; i++) {
764
+ this.yearOptions.push(i);
765
+ }
766
+ }
767
+ createWeekDays() {
768
+ this.weekDays = [];
769
+ let dayIndex = this.getFirstDateOfWeek();
770
+ let dayLabels = this.getTranslation(TranslationKeys.DAY_NAMES_MIN);
771
+ for (let i = 0; i < 7; i++) {
772
+ this.weekDays.push(dayLabels[dayIndex]);
773
+ dayIndex = dayIndex == 6 ? 0 : ++dayIndex;
774
+ }
775
+ }
776
+ monthPickerValues() {
777
+ let monthPickerValues = [];
778
+ for (let i = 0; i <= 11; i++) {
779
+ monthPickerValues.push(this.config.getTranslation('monthNamesShort')[i]);
780
+ }
781
+ return monthPickerValues;
782
+ }
783
+ yearPickerValues() {
784
+ let yearPickerValues = [];
785
+ let halfRange = Math.floor(this.stepYearPicker / 2);
786
+ let startYear = this.currentYear - halfRange;
787
+ for (let i = 0; i < this.stepYearPicker; i++) {
788
+ yearPickerValues.push(startYear + i);
789
+ }
790
+ return yearPickerValues;
791
+ }
792
+ createMonths(month, year) {
793
+ this.months = this.months = [];
794
+ for (let i = 0; i < this.numberOfMonths; i++) {
795
+ let m = month + i;
796
+ let y = year;
797
+ if (m > 11) {
798
+ m = (m % 11) - 1;
799
+ y = year + 1;
800
+ }
801
+ this.months.push(this.createMonth(m, y));
802
+ }
803
+ }
804
+ getWeekNumber(date) {
805
+ let checkDate = new Date(date.getTime());
806
+ if (this.startWeekFromFirstDayOfYear) {
807
+ let firstDayOfWeek = +this.getFirstDateOfWeek();
808
+ checkDate.setDate(checkDate.getDate() + 6 + firstDayOfWeek - checkDate.getDay());
809
+ }
810
+ else {
811
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
812
+ }
813
+ let time = checkDate.getTime();
814
+ checkDate.setMonth(0);
815
+ checkDate.setDate(1);
816
+ return Math.floor(Math.round((time - checkDate.getTime()) / 86400000) / 7) + 1;
817
+ }
818
+ createMonth(month, year) {
819
+ let dates = [];
820
+ let firstDay = this.getFirstDayOfMonthIndex(month, year);
821
+ let daysLength = this.getDaysCountInMonth(month, year);
822
+ let prevMonthDaysLength = this.getDaysCountInPrevMonth(month, year);
823
+ let dayNo = 1;
824
+ let today = new Date();
825
+ let weekNumbers = [];
826
+ let monthRows = Math.ceil((daysLength + firstDay) / 7);
827
+ for (let i = 0; i < monthRows; i++) {
828
+ let week = [];
829
+ if (i == 0) {
830
+ for (let j = prevMonthDaysLength - firstDay + 1; j <= prevMonthDaysLength; j++) {
831
+ let prev = this.getPreviousMonthAndYear(month, year);
832
+ week.push({ day: j, month: prev.month, year: prev.year, otherMonth: true, today: this.isToday(today, j, prev.month, prev.year), selectable: this.isSelectable(j, prev.month, prev.year, true) });
833
+ }
834
+ let remainingDaysLength = 7 - week.length;
835
+ for (let j = 0; j < remainingDaysLength; j++) {
836
+ week.push({ day: dayNo, month: month, year: year, today: this.isToday(today, dayNo, month, year), selectable: this.isSelectable(dayNo, month, year, false) });
837
+ dayNo++;
838
+ }
839
+ }
840
+ else {
841
+ for (let j = 0; j < 7; j++) {
842
+ if (dayNo > daysLength) {
843
+ let next = this.getNextMonthAndYear(month, year);
844
+ week.push({
845
+ day: dayNo - daysLength,
846
+ month: next.month,
847
+ year: next.year,
848
+ otherMonth: true,
849
+ today: this.isToday(today, dayNo - daysLength, next.month, next.year),
850
+ selectable: this.isSelectable(dayNo - daysLength, next.month, next.year, true)
851
+ });
852
+ }
853
+ else {
854
+ week.push({ day: dayNo, month: month, year: year, today: this.isToday(today, dayNo, month, year), selectable: this.isSelectable(dayNo, month, year, false) });
855
+ }
856
+ dayNo++;
857
+ }
858
+ }
859
+ if (this.showWeek) {
860
+ weekNumbers.push(this.getWeekNumber(new Date(week[0].year, week[0].month, week[0].day)));
861
+ }
862
+ dates.push(week);
863
+ }
864
+ return {
865
+ month: month,
866
+ year: year,
867
+ dates: dates,
868
+ weekNumbers: weekNumbers
869
+ };
870
+ }
871
+ initTime(date) {
872
+ this.pm = date.getHours() > 11;
873
+ if (this.showTime) {
874
+ this.currentMinute = date.getMinutes();
875
+ this.currentSecond = date.getSeconds();
876
+ this.setCurrentHourPM(date.getHours());
877
+ }
878
+ else if (this.timeOnly) {
879
+ this.currentMinute = 0;
880
+ this.currentHour = 0;
881
+ this.currentSecond = 0;
882
+ }
883
+ }
884
+ navBackward(event) {
885
+ if (this.disabled) {
886
+ event.preventDefault();
887
+ return;
888
+ }
889
+ this.isMonthNavigate = true;
890
+ if (this.currentView === 'month') {
891
+ this.decrementYear();
892
+ setTimeout(() => {
893
+ this.updateFocus();
894
+ }, 1);
895
+ }
896
+ else if (this.currentView === 'year') {
897
+ this.decrementYearPickerStep();
898
+ setTimeout(() => {
899
+ this.updateFocus();
900
+ }, 1);
901
+ }
902
+ else {
903
+ if (this.currentMonth === 0) {
904
+ this.currentMonth = 11;
905
+ this.decrementYear();
906
+ }
907
+ else {
908
+ this.currentMonth--;
909
+ }
910
+ this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
911
+ this.createMonths(this.currentMonth, this.currentYear);
912
+ }
913
+ }
914
+ navForward(event) {
915
+ if (this.disabled) {
916
+ event.preventDefault();
917
+ return;
918
+ }
919
+ this.isMonthNavigate = true;
920
+ if (this.currentView === 'month') {
921
+ this.incrementYear();
922
+ setTimeout(() => {
923
+ this.updateFocus();
924
+ }, 1);
925
+ }
926
+ else if (this.currentView === 'year') {
927
+ this.incrementYearPickerStep();
928
+ setTimeout(() => {
929
+ this.updateFocus();
930
+ }, 1);
931
+ }
932
+ else {
933
+ if (this.currentMonth === 11) {
934
+ this.currentMonth = 0;
935
+ this.incrementYear();
936
+ }
937
+ else {
938
+ this.currentMonth++;
939
+ }
940
+ this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
941
+ this.createMonths(this.currentMonth, this.currentYear);
942
+ }
943
+ }
944
+ decrementYear() {
945
+ this.currentYear--;
946
+ let _yearOptions = this.yearOptions;
947
+ if (this.yearNavigator && this.currentYear < _yearOptions[0]) {
948
+ let difference = _yearOptions[_yearOptions.length - 1] - _yearOptions[0];
949
+ this.populateYearOptions(_yearOptions[0] - difference, _yearOptions[_yearOptions.length - 1] - difference);
950
+ }
951
+ }
952
+ decrementYearPickerStep() {
953
+ this.currentYear = this.currentYear - this.stepYearPicker;
954
+ }
955
+ incrementYearPickerStep() {
956
+ this.currentYear = this.currentYear + this.stepYearPicker;
957
+ }
958
+ incrementYear() {
959
+ this.currentYear++;
960
+ let _yearOptions = this.yearOptions;
961
+ if (this.yearNavigator && this.currentYear > _yearOptions[_yearOptions.length - 1]) {
962
+ let difference = _yearOptions[_yearOptions.length - 1] - _yearOptions[0];
963
+ this.populateYearOptions(_yearOptions[0] + difference, _yearOptions[_yearOptions.length - 1] + difference);
964
+ }
965
+ }
966
+ switchToMonthView(event) {
967
+ this.setCurrentView('month');
968
+ event.preventDefault();
969
+ }
970
+ switchToYearView(event) {
971
+ this.setCurrentView('year');
972
+ event.preventDefault();
973
+ }
974
+ onDateSelect(event, dateMeta) {
975
+ if (this.disabled || !dateMeta.selectable) {
976
+ event.preventDefault();
977
+ return;
978
+ }
979
+ if (this.isMultipleSelection() && this.isSelected(dateMeta)) {
980
+ this.value = this.value.filter((date, i) => {
981
+ return !this.isDateEquals(date, dateMeta);
982
+ });
983
+ if (this.value.length === 0) {
984
+ this.value = null;
985
+ }
986
+ this.updateModel(this.value);
987
+ }
988
+ else {
989
+ if (this.shouldSelectDate(dateMeta)) {
990
+ this.selectDate(dateMeta);
991
+ }
992
+ }
993
+ if (this.hideOnDateTimeSelect && (this.isSingleSelection() || (this.isRangeSelection() && this.value[1]))) {
994
+ setTimeout(() => {
995
+ event.preventDefault();
996
+ this.hideOverlay();
997
+ if (this.mask) {
998
+ this.disableModality();
999
+ }
1000
+ this.cd.markForCheck();
1001
+ }, 150);
1002
+ }
1003
+ this.updateInputfield();
1004
+ event.preventDefault();
1005
+ this.updateFormattedInlineDate();
1006
+ }
1007
+ shouldSelectDate(dateMeta) {
1008
+ if (this.isMultipleSelection())
1009
+ return this.maxDateCount != null ? this.maxDateCount > (this.value ? this.value.length : 0) : true;
1010
+ else
1011
+ return true;
1012
+ }
1013
+ onMonthSelect(event, index) {
1014
+ if (this.view === 'month') {
1015
+ this.onDateSelect(event, { year: this.currentYear, month: index, day: 1, selectable: true });
1016
+ }
1017
+ else {
1018
+ this.currentMonth = index;
1019
+ this.createMonths(this.currentMonth, this.currentYear);
1020
+ this.setCurrentView('date');
1021
+ this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
1022
+ }
1023
+ }
1024
+ onYearSelect(event, year) {
1025
+ if (this.view === 'year') {
1026
+ this.onDateSelect(event, { year: year, month: 0, day: 1, selectable: true });
1027
+ }
1028
+ else {
1029
+ this.currentYear = year;
1030
+ this.setCurrentView('month');
1031
+ this.onYearChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
1032
+ }
1033
+ }
1034
+ updateInputfield() {
1035
+ let formattedValue = '';
1036
+ if (this.value) {
1037
+ if (this.isSingleSelection()) {
1038
+ formattedValue = this.formatDateTime(this.value);
1039
+ }
1040
+ else if (this.isMultipleSelection()) {
1041
+ for (let i = 0; i < this.value.length; i++) {
1042
+ let dateAsString = this.formatDateTime(this.value[i]);
1043
+ formattedValue += dateAsString;
1044
+ if (i !== this.value.length - 1) {
1045
+ formattedValue += this.multipleSeparator + ' ';
1046
+ }
1047
+ }
1048
+ }
1049
+ else if (this.isRangeSelection()) {
1050
+ if (this.value && this.value.length) {
1051
+ let startDate = this.value[0];
1052
+ let endDate = this.value[1];
1053
+ formattedValue = this.formatDateTime(startDate);
1054
+ if (endDate) {
1055
+ formattedValue += ' ' + this.rangeSeparator + ' ' + this.formatDateTime(endDate);
1056
+ }
1057
+ }
1058
+ }
1059
+ }
1060
+ this.inputFieldValue = formattedValue;
1061
+ this.updateFilledState();
1062
+ if (this.inputfieldViewChild && this.inputfieldViewChild.nativeElement) {
1063
+ this.inputfieldViewChild.nativeElement.value = this.inputFieldValue;
1064
+ }
1065
+ }
1066
+ formatDateTime(date) {
1067
+ let formattedValue = this.keepInvalid ? date : null;
1068
+ const isDateValid = this.isValidDateForTimeConstraints(date);
1069
+ if (this.isValidDate(date)) {
1070
+ if (this.timeOnly) {
1071
+ formattedValue = this.formatTime(date);
1072
+ }
1073
+ else {
1074
+ formattedValue = this.formatDate(date, this.getDateFormat());
1075
+ if (this.showTime) {
1076
+ formattedValue += ' ' + this.formatTime(date);
1077
+ }
1078
+ }
1079
+ }
1080
+ else if (this.dataType === 'string') {
1081
+ formattedValue = date;
1082
+ }
1083
+ formattedValue = isDateValid ? formattedValue : '';
1084
+ return formattedValue;
1085
+ }
1086
+ formatDateMetaToDate(dateMeta) {
1087
+ return new Date(dateMeta.year, dateMeta.month, dateMeta.day);
1088
+ }
1089
+ formatDateKey(date) {
1090
+ return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;
1091
+ }
1092
+ setCurrentHourPM(hours) {
1093
+ if (this.hourFormat == '12') {
1094
+ this.pm = hours > 11;
1095
+ if (hours >= 12) {
1096
+ this.currentHour = hours == 12 ? 12 : hours - 12;
1097
+ }
1098
+ else {
1099
+ this.currentHour = hours == 0 ? 12 : hours;
1100
+ }
1101
+ }
1102
+ else {
1103
+ this.currentHour = hours;
1104
+ }
1105
+ }
1106
+ setCurrentView(currentView) {
1107
+ this.currentView = currentView;
1108
+ this.cd.detectChanges();
1109
+ this.alignOverlay();
1110
+ }
1111
+ selectDate(dateMeta) {
1112
+ let date = this.formatDateMetaToDate(dateMeta);
1113
+ if (this.showTime) {
1114
+ if (this.hourFormat == '12') {
1115
+ if (this.currentHour === 12)
1116
+ date.setHours(this.pm ? 12 : 0);
1117
+ else
1118
+ date.setHours(this.pm ? this.currentHour + 12 : this.currentHour);
1119
+ }
1120
+ else {
1121
+ date.setHours(this.currentHour);
1122
+ }
1123
+ date.setMinutes(this.currentMinute);
1124
+ date.setSeconds(this.currentSecond);
1125
+ }
1126
+ if (this.minDate && this.minDate > date) {
1127
+ date = this.minDate;
1128
+ this.setCurrentHourPM(date.getHours());
1129
+ this.currentMinute = date.getMinutes();
1130
+ this.currentSecond = date.getSeconds();
1131
+ }
1132
+ if (this.maxDate && this.maxDate < date) {
1133
+ date = this.maxDate;
1134
+ this.setCurrentHourPM(date.getHours());
1135
+ this.currentMinute = date.getMinutes();
1136
+ this.currentSecond = date.getSeconds();
1137
+ }
1138
+ if (this.isSingleSelection()) {
1139
+ this.updateModel(date);
1140
+ }
1141
+ else if (this.isMultipleSelection()) {
1142
+ this.updateModel(this.value ? [...this.value, date] : [date]);
1143
+ }
1144
+ else if (this.isRangeSelection()) {
1145
+ if (this.value && this.value.length) {
1146
+ let startDate = this.value[0];
1147
+ let endDate = this.value[1];
1148
+ if (!endDate && date.getTime() >= startDate.getTime()) {
1149
+ endDate = date;
1150
+ }
1151
+ else {
1152
+ startDate = date;
1153
+ endDate = null;
1154
+ }
1155
+ this.updateModel([startDate, endDate]);
1156
+ }
1157
+ else {
1158
+ this.updateModel([date, null]);
1159
+ }
1160
+ }
1161
+ this.onSelect.emit(date);
1162
+ }
1163
+ updateModel(value) {
1164
+ this.value = value;
1165
+ if (this.dataType == 'date') {
1166
+ this.onModelChange(this.value);
1167
+ }
1168
+ else if (this.dataType == 'string') {
1169
+ if (this.isSingleSelection()) {
1170
+ this.onModelChange(this.formatDateTime(this.value));
1171
+ }
1172
+ else {
1173
+ let stringArrValue = null;
1174
+ if (Array.isArray(this.value)) {
1175
+ stringArrValue = this.value.map((date) => this.formatDateTime(date));
1176
+ }
1177
+ this.onModelChange(stringArrValue);
1178
+ }
1179
+ }
1180
+ }
1181
+ getFirstDayOfMonthIndex(month, year) {
1182
+ let day = new Date();
1183
+ day.setDate(1);
1184
+ day.setMonth(month);
1185
+ day.setFullYear(year);
1186
+ let dayIndex = day.getDay() + this.getSundayIndex();
1187
+ return dayIndex >= 7 ? dayIndex - 7 : dayIndex;
1188
+ }
1189
+ getDaysCountInMonth(month, year) {
1190
+ return 32 - this.daylightSavingAdjust(new Date(year, month, 32)).getDate();
1191
+ }
1192
+ getDaysCountInPrevMonth(month, year) {
1193
+ let prev = this.getPreviousMonthAndYear(month, year);
1194
+ return this.getDaysCountInMonth(prev.month, prev.year);
1195
+ }
1196
+ getPreviousMonthAndYear(month, year) {
1197
+ let m, y;
1198
+ if (month === 0) {
1199
+ m = 11;
1200
+ y = year - 1;
1201
+ }
1202
+ else {
1203
+ m = month - 1;
1204
+ y = year;
1205
+ }
1206
+ return { month: m, year: y };
1207
+ }
1208
+ getNextMonthAndYear(month, year) {
1209
+ let m, y;
1210
+ if (month === 11) {
1211
+ m = 0;
1212
+ y = year + 1;
1213
+ }
1214
+ else {
1215
+ m = month + 1;
1216
+ y = year;
1217
+ }
1218
+ return { month: m, year: y };
1219
+ }
1220
+ getSundayIndex() {
1221
+ let firstDayOfWeek = this.getFirstDateOfWeek();
1222
+ return firstDayOfWeek > 0 ? 7 - firstDayOfWeek : 0;
1223
+ }
1224
+ isSelected(dateMeta) {
1225
+ if (this.value) {
1226
+ if (this.isSingleSelection()) {
1227
+ return this.isDateEquals(this.value, dateMeta);
1228
+ }
1229
+ else if (this.isMultipleSelection()) {
1230
+ let selected = false;
1231
+ for (let date of this.value) {
1232
+ selected = this.isDateEquals(date, dateMeta);
1233
+ if (selected) {
1234
+ break;
1235
+ }
1236
+ }
1237
+ return selected;
1238
+ }
1239
+ else if (this.isRangeSelection()) {
1240
+ if (this.value[1])
1241
+ return this.isDateEquals(this.value[0], dateMeta) || this.isDateEquals(this.value[1], dateMeta) || this.isDateBetween(this.value[0], this.value[1], dateMeta);
1242
+ else
1243
+ return this.isDateEquals(this.value[0], dateMeta);
1244
+ }
1245
+ }
1246
+ else {
1247
+ return false;
1248
+ }
1249
+ }
1250
+ isComparable() {
1251
+ return this.value != null && typeof this.value !== 'string';
1252
+ }
1253
+ isMonthSelected(month) {
1254
+ if (!this.isComparable())
1255
+ return false;
1256
+ if (this.isMultipleSelection())
1257
+ return false;
1258
+ let value = this.isRangeSelection() ? this.value[0] : this.value;
1259
+ return value ? value.getMonth() === month : false;
1260
+ }
1261
+ isMonthDisabled(month, year) {
1262
+ const yearToCheck = year ?? this.currentYear;
1263
+ for (let day = 1; day < this.getDaysCountInMonth(month, yearToCheck) + 1; day++) {
1264
+ if (this.isSelectable(day, month, yearToCheck, false)) {
1265
+ return false;
1266
+ }
1267
+ }
1268
+ return true;
1269
+ }
1270
+ isYearDisabled(year) {
1271
+ return Array(12)
1272
+ .fill(0)
1273
+ .every((v, month) => this.isMonthDisabled(month, year));
1274
+ }
1275
+ isYearSelected(year) {
1276
+ if (!this.isComparable())
1277
+ return false;
1278
+ if (this.isMultipleSelection())
1279
+ return false;
1280
+ let value = this.isRangeSelection() ? this.value[0] : this.value;
1281
+ return value ? value.getFullYear() === year : false;
1282
+ }
1283
+ isDateEquals(value, dateMeta) {
1284
+ if (value && ObjectUtils.isDate(value))
1285
+ return value.getDate() === dateMeta.day && value.getMonth() === dateMeta.month && value.getFullYear() === dateMeta.year;
1286
+ else
1287
+ return false;
1288
+ }
1289
+ isDateBetween(start, end, dateMeta) {
1290
+ let between = false;
1291
+ if (ObjectUtils.isDate(start) && ObjectUtils.isDate(end)) {
1292
+ let date = this.formatDateMetaToDate(dateMeta);
1293
+ return start.getTime() <= date.getTime() && end.getTime() >= date.getTime();
1294
+ }
1295
+ return between;
1296
+ }
1297
+ isSingleSelection() {
1298
+ return this.selectionMode === 'single';
1299
+ }
1300
+ isRangeSelection() {
1301
+ return this.selectionMode === 'range';
1302
+ }
1303
+ isMultipleSelection() {
1304
+ return this.selectionMode === 'multiple';
1305
+ }
1306
+ isToday(today, day, month, year) {
1307
+ return today.getDate() === day && today.getMonth() === month && today.getFullYear() === year;
1308
+ }
1309
+ isSelectable(day, month, year, otherMonth) {
1310
+ let validMin = true;
1311
+ let validMax = true;
1312
+ let validDate = true;
1313
+ let validDay = true;
1314
+ if (otherMonth && !this.selectOtherMonths) {
1315
+ return false;
1316
+ }
1317
+ if (this.minDate) {
1318
+ if (this.minDate.getFullYear() > year) {
1319
+ validMin = false;
1320
+ }
1321
+ else if (this.minDate.getFullYear() === year && this.currentView != 'year') {
1322
+ if (this.minDate.getMonth() > month) {
1323
+ validMin = false;
1324
+ }
1325
+ else if (this.minDate.getMonth() === month) {
1326
+ if (this.minDate.getDate() > day) {
1327
+ validMin = false;
1328
+ }
1329
+ }
1330
+ }
1331
+ }
1332
+ if (this.maxDate) {
1333
+ if (this.maxDate.getFullYear() < year) {
1334
+ validMax = false;
1335
+ }
1336
+ else if (this.maxDate.getFullYear() === year) {
1337
+ if (this.maxDate.getMonth() < month) {
1338
+ validMax = false;
1339
+ }
1340
+ else if (this.maxDate.getMonth() === month) {
1341
+ if (this.maxDate.getDate() < day) {
1342
+ validMax = false;
1343
+ }
1344
+ }
1345
+ }
1346
+ }
1347
+ if (this.disabledDates) {
1348
+ validDate = !this.isDateDisabled(day, month, year);
1349
+ }
1350
+ if (this.disabledDays) {
1351
+ validDay = !this.isDayDisabled(day, month, year);
1352
+ }
1353
+ return validMin && validMax && validDate && validDay;
1354
+ }
1355
+ isDateDisabled(day, month, year) {
1356
+ if (this.disabledDates) {
1357
+ for (let disabledDate of this.disabledDates) {
1358
+ if (disabledDate.getFullYear() === year && disabledDate.getMonth() === month && disabledDate.getDate() === day) {
1359
+ return true;
1360
+ }
1361
+ }
1362
+ }
1363
+ return false;
1364
+ }
1365
+ isDayDisabled(day, month, year) {
1366
+ if (this.disabledDays) {
1367
+ let weekday = new Date(year, month, day);
1368
+ let weekdayNumber = weekday.getDay();
1369
+ return this.disabledDays.indexOf(weekdayNumber) !== -1;
1370
+ }
1371
+ return false;
1372
+ }
1373
+ onInputFocus(event) {
1374
+ this.focus = true;
1375
+ if (this.showOnFocus) {
1376
+ this.showOverlay();
1377
+ }
1378
+ this.onFocus.emit(event);
1379
+ }
1380
+ onInputClick() {
1381
+ if (this.showOnFocus && !this.overlayVisible) {
1382
+ this.showOverlay();
1383
+ }
1384
+ }
1385
+ onInputBlur(event) {
1386
+ this.focus = false;
1387
+ this.onBlur.emit(event);
1388
+ if (!this.keepInvalid) {
1389
+ this.updateInputfield();
1390
+ }
1391
+ this.onModelTouched();
1392
+ }
1393
+ onButtonClick(event, inputfield = this.inputfieldViewChild?.nativeElement) {
1394
+ if (!this.overlayVisible) {
1395
+ inputfield.focus();
1396
+ this.showOverlay();
1397
+ }
1398
+ else {
1399
+ this.hideOverlay();
1400
+ }
1401
+ }
1402
+ clear() {
1403
+ this.inputFieldValue = null;
1404
+ this.value = null;
1405
+ this.onModelChange(this.value);
1406
+ this.onClear.emit();
1407
+ }
1408
+ onOverlayClick(event) {
1409
+ this.overlayService.add({
1410
+ originalEvent: event,
1411
+ target: this.el.nativeElement
1412
+ });
1413
+ }
1414
+ getMonthName(index) {
1415
+ return this.config.getTranslation('monthNames')[index];
1416
+ }
1417
+ getYear(month) {
1418
+ return this.currentView === 'month' ? this.currentYear : month.year;
1419
+ }
1420
+ switchViewButtonDisabled() {
1421
+ return this.numberOfMonths > 1 || this.disabled;
1422
+ }
1423
+ onPrevButtonClick(event) {
1424
+ this.navigationState = { backward: true, button: true };
1425
+ this.navBackward(event);
1426
+ }
1427
+ onNextButtonClick(event) {
1428
+ this.navigationState = { backward: false, button: true };
1429
+ this.navForward(event);
1430
+ }
1431
+ onContainerButtonKeydown(event) {
1432
+ switch (event.which) {
1433
+ //tab
1434
+ case 9:
1435
+ if (!this.inline) {
1436
+ this.trapFocus(event);
1437
+ }
1438
+ if (this.inline) {
1439
+ const headerElements = DomHandler.findSingle(this.containerViewChild?.nativeElement, '.cax-datepicker-header');
1440
+ const element = event.target;
1441
+ if (this.timeOnly) {
1442
+ return;
1443
+ }
1444
+ else {
1445
+ if (element == headerElements.children[headerElements?.children?.length - 1]) {
1446
+ this.initFocusableCell();
1447
+ }
1448
+ }
1449
+ }
1450
+ break;
1451
+ //escape
1452
+ case 27:
1453
+ this.inputfieldViewChild?.nativeElement.focus();
1454
+ this.overlayVisible = false;
1455
+ event.preventDefault();
1456
+ break;
1457
+ default:
1458
+ //Noop
1459
+ break;
1460
+ }
1461
+ }
1462
+ onInputKeydown(event) {
1463
+ this.isKeydown = true;
1464
+ if (event.keyCode === 40 && this.contentViewChild) {
1465
+ this.trapFocus(event);
1466
+ }
1467
+ else if (event.keyCode === 27) {
1468
+ if (this.overlayVisible) {
1469
+ this.inputfieldViewChild?.nativeElement.focus();
1470
+ this.overlayVisible = false;
1471
+ event.preventDefault();
1472
+ }
1473
+ }
1474
+ else if (event.keyCode === 13) {
1475
+ if (this.overlayVisible) {
1476
+ this.overlayVisible = false;
1477
+ event.preventDefault();
1478
+ }
1479
+ }
1480
+ else if (event.keyCode === 9 && this.contentViewChild) {
1481
+ DomHandler.getFocusableElements(this.contentViewChild.nativeElement).forEach((el) => (el.tabIndex = '-1'));
1482
+ if (this.overlayVisible) {
1483
+ this.overlayVisible = false;
1484
+ }
1485
+ }
1486
+ }
1487
+ onDateCellKeydown(event, dateMeta, groupIndex) {
1488
+ const cellContent = event.currentTarget;
1489
+ const cell = cellContent.parentElement;
1490
+ const currentDate = this.formatDateMetaToDate(dateMeta);
1491
+ switch (event.which) {
1492
+ //down arrow
1493
+ case 40: {
1494
+ cellContent.tabIndex = '-1';
1495
+ let cellIndex = DomHandler.index(cell);
1496
+ let nextRow = cell.parentElement.nextElementSibling;
1497
+ if (nextRow) {
1498
+ let focusCell = nextRow.children[cellIndex].children[0];
1499
+ if (DomHandler.hasClass(focusCell, 'cax-disabled')) {
1500
+ this.navigationState = { backward: false };
1501
+ this.navForward(event);
1502
+ }
1503
+ else {
1504
+ nextRow.children[cellIndex].children[0].tabIndex = '0';
1505
+ nextRow.children[cellIndex].children[0].focus();
1506
+ }
1507
+ }
1508
+ else {
1509
+ this.navigationState = { backward: false };
1510
+ this.navForward(event);
1511
+ }
1512
+ event.preventDefault();
1513
+ break;
1514
+ }
1515
+ //up arrow
1516
+ case 38: {
1517
+ cellContent.tabIndex = '-1';
1518
+ let cellIndex = DomHandler.index(cell);
1519
+ let prevRow = cell.parentElement.previousElementSibling;
1520
+ if (prevRow) {
1521
+ let focusCell = prevRow.children[cellIndex].children[0];
1522
+ if (DomHandler.hasClass(focusCell, 'cax-disabled')) {
1523
+ this.navigationState = { backward: true };
1524
+ this.navBackward(event);
1525
+ }
1526
+ else {
1527
+ focusCell.tabIndex = '0';
1528
+ focusCell.focus();
1529
+ }
1530
+ }
1531
+ else {
1532
+ this.navigationState = { backward: true };
1533
+ this.navBackward(event);
1534
+ }
1535
+ event.preventDefault();
1536
+ break;
1537
+ }
1538
+ //left arrow
1539
+ case 37: {
1540
+ cellContent.tabIndex = '-1';
1541
+ let prevCell = cell.previousElementSibling;
1542
+ if (prevCell) {
1543
+ let focusCell = prevCell.children[0];
1544
+ if (DomHandler.hasClass(focusCell, 'cax-disabled') || DomHandler.hasClass(focusCell.parentElement, 'cax-datepicker-weeknumber')) {
1545
+ this.navigateToMonth(true, groupIndex);
1546
+ }
1547
+ else {
1548
+ focusCell.tabIndex = '0';
1549
+ focusCell.focus();
1550
+ }
1551
+ }
1552
+ else {
1553
+ this.navigateToMonth(true, groupIndex);
1554
+ }
1555
+ event.preventDefault();
1556
+ break;
1557
+ }
1558
+ //right arrow
1559
+ case 39: {
1560
+ cellContent.tabIndex = '-1';
1561
+ let nextCell = cell.nextElementSibling;
1562
+ if (nextCell) {
1563
+ let focusCell = nextCell.children[0];
1564
+ if (DomHandler.hasClass(focusCell, 'cax-disabled')) {
1565
+ this.navigateToMonth(false, groupIndex);
1566
+ }
1567
+ else {
1568
+ focusCell.tabIndex = '0';
1569
+ focusCell.focus();
1570
+ }
1571
+ }
1572
+ else {
1573
+ this.navigateToMonth(false, groupIndex);
1574
+ }
1575
+ event.preventDefault();
1576
+ break;
1577
+ }
1578
+ //enter
1579
+ //space
1580
+ case 13:
1581
+ case 32: {
1582
+ this.onDateSelect(event, dateMeta);
1583
+ event.preventDefault();
1584
+ break;
1585
+ }
1586
+ //escape
1587
+ case 27: {
1588
+ this.inputfieldViewChild?.nativeElement.focus();
1589
+ this.overlayVisible = false;
1590
+ event.preventDefault();
1591
+ break;
1592
+ }
1593
+ //tab
1594
+ case 9: {
1595
+ if (!this.inline) {
1596
+ this.trapFocus(event);
1597
+ }
1598
+ break;
1599
+ }
1600
+ // page up
1601
+ case 33: {
1602
+ cellContent.tabIndex = '-1';
1603
+ const dateToFocus = new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, currentDate.getDate());
1604
+ const focusKey = this.formatDateKey(dateToFocus);
1605
+ this.navigateToMonth(true, groupIndex, `span[data-date='${focusKey}']:not(.cax-disabled):not(.cax-ink)`);
1606
+ event.preventDefault();
1607
+ break;
1608
+ }
1609
+ // page down
1610
+ case 34: {
1611
+ cellContent.tabIndex = '-1';
1612
+ const dateToFocus = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDate());
1613
+ const focusKey = this.formatDateKey(dateToFocus);
1614
+ this.navigateToMonth(false, groupIndex, `span[data-date='${focusKey}']:not(.cax-disabled):not(.cax-ink)`);
1615
+ event.preventDefault();
1616
+ break;
1617
+ }
1618
+ //home
1619
+ case 36:
1620
+ cellContent.tabIndex = '-1';
1621
+ const firstDayDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
1622
+ const firstDayDateKey = this.formatDateKey(firstDayDate);
1623
+ const firstDayCell = DomHandler.findSingle(cellContent.offsetParent, `span[data-date='${firstDayDateKey}']:not(.cax-disabled):not(.cax-ink)`);
1624
+ if (firstDayCell) {
1625
+ firstDayCell.tabIndex = '0';
1626
+ firstDayCell.focus();
1627
+ }
1628
+ event.preventDefault();
1629
+ break;
1630
+ //end
1631
+ case 35:
1632
+ cellContent.tabIndex = '-1';
1633
+ const lastDayDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0);
1634
+ const lastDayDateKey = this.formatDateKey(lastDayDate);
1635
+ const lastDayCell = DomHandler.findSingle(cellContent.offsetParent, `span[data-date='${lastDayDateKey}']:not(.cax-disabled):not(.cax-ink)`);
1636
+ if (lastDayDate) {
1637
+ lastDayCell.tabIndex = '0';
1638
+ lastDayCell.focus();
1639
+ }
1640
+ event.preventDefault();
1641
+ break;
1642
+ default:
1643
+ //no op
1644
+ break;
1645
+ }
1646
+ }
1647
+ onMonthCellKeydown(event, index) {
1648
+ const cell = event.currentTarget;
1649
+ switch (event.which) {
1650
+ //arrows
1651
+ case 38:
1652
+ case 40: {
1653
+ cell.tabIndex = '-1';
1654
+ var cells = cell.parentElement.children;
1655
+ var cellIndex = DomHandler.index(cell);
1656
+ let nextCell = cells[event.which === 40 ? cellIndex + 3 : cellIndex - 3];
1657
+ if (nextCell) {
1658
+ nextCell.tabIndex = '0';
1659
+ nextCell.focus();
1660
+ }
1661
+ event.preventDefault();
1662
+ break;
1663
+ }
1664
+ //left arrow
1665
+ case 37: {
1666
+ cell.tabIndex = '-1';
1667
+ let prevCell = cell.previousElementSibling;
1668
+ if (prevCell) {
1669
+ prevCell.tabIndex = '0';
1670
+ prevCell.focus();
1671
+ }
1672
+ else {
1673
+ this.navigationState = { backward: true };
1674
+ this.navBackward(event);
1675
+ }
1676
+ event.preventDefault();
1677
+ break;
1678
+ }
1679
+ //right arrow
1680
+ case 39: {
1681
+ cell.tabIndex = '-1';
1682
+ let nextCell = cell.nextElementSibling;
1683
+ if (nextCell) {
1684
+ nextCell.tabIndex = '0';
1685
+ nextCell.focus();
1686
+ }
1687
+ else {
1688
+ this.navigationState = { backward: false };
1689
+ this.navForward(event);
1690
+ }
1691
+ event.preventDefault();
1692
+ break;
1693
+ }
1694
+ //enter
1695
+ //space
1696
+ case 13:
1697
+ case 32: {
1698
+ this.onMonthSelect(event, index);
1699
+ event.preventDefault();
1700
+ break;
1701
+ }
1702
+ //escape
1703
+ case 27: {
1704
+ this.inputfieldViewChild?.nativeElement.focus();
1705
+ this.overlayVisible = false;
1706
+ event.preventDefault();
1707
+ break;
1708
+ }
1709
+ //tab
1710
+ case 9: {
1711
+ if (!this.inline) {
1712
+ this.trapFocus(event);
1713
+ }
1714
+ break;
1715
+ }
1716
+ default:
1717
+ //no op
1718
+ break;
1719
+ }
1720
+ }
1721
+ onYearCellKeydown(event, index) {
1722
+ const cell = event.currentTarget;
1723
+ switch (event.which) {
1724
+ //arrows
1725
+ case 38:
1726
+ case 40: {
1727
+ cell.tabIndex = '-1';
1728
+ var cells = cell.parentElement.children;
1729
+ var cellIndex = DomHandler.index(cell);
1730
+ let nextCell = cells[event.which === 40 ? cellIndex + 2 : cellIndex - 2];
1731
+ if (nextCell) {
1732
+ nextCell.tabIndex = '0';
1733
+ nextCell.focus();
1734
+ }
1735
+ event.preventDefault();
1736
+ break;
1737
+ }
1738
+ //left arrow
1739
+ case 37: {
1740
+ cell.tabIndex = '-1';
1741
+ let prevCell = cell.previousElementSibling;
1742
+ if (prevCell) {
1743
+ prevCell.tabIndex = '0';
1744
+ prevCell.focus();
1745
+ }
1746
+ else {
1747
+ this.navigationState = { backward: true };
1748
+ this.navBackward(event);
1749
+ }
1750
+ event.preventDefault();
1751
+ break;
1752
+ }
1753
+ //right arrow
1754
+ case 39: {
1755
+ cell.tabIndex = '-1';
1756
+ let nextCell = cell.nextElementSibling;
1757
+ if (nextCell) {
1758
+ nextCell.tabIndex = '0';
1759
+ nextCell.focus();
1760
+ }
1761
+ else {
1762
+ this.navigationState = { backward: false };
1763
+ this.navForward(event);
1764
+ }
1765
+ event.preventDefault();
1766
+ break;
1767
+ }
1768
+ //enter
1769
+ //space
1770
+ case 13:
1771
+ case 32: {
1772
+ this.onYearSelect(event, index);
1773
+ event.preventDefault();
1774
+ break;
1775
+ }
1776
+ //escape
1777
+ case 27: {
1778
+ this.inputfieldViewChild?.nativeElement.focus();
1779
+ this.overlayVisible = false;
1780
+ event.preventDefault();
1781
+ break;
1782
+ }
1783
+ //tab
1784
+ case 9: {
1785
+ this.trapFocus(event);
1786
+ break;
1787
+ }
1788
+ default:
1789
+ //no op
1790
+ break;
1791
+ }
1792
+ }
1793
+ navigateToMonth(prev, groupIndex, focusKey) {
1794
+ if (prev) {
1795
+ if (this.numberOfMonths === 1 || groupIndex === 0) {
1796
+ this.navigationState = { backward: true };
1797
+ this._focusKey = focusKey;
1798
+ this.navBackward(event);
1799
+ }
1800
+ else {
1801
+ let prevMonthContainer = this.contentViewChild.nativeElement.children[groupIndex - 1];
1802
+ if (focusKey) {
1803
+ const firstDayCell = DomHandler.findSingle(prevMonthContainer, focusKey);
1804
+ firstDayCell.tabIndex = '0';
1805
+ firstDayCell.focus();
1806
+ }
1807
+ else {
1808
+ let cells = DomHandler.find(prevMonthContainer, '.cax-datepicker-calendar td span:not(.cax-disabled):not(.cax-ink)');
1809
+ let focusCell = cells[cells.length - 1];
1810
+ focusCell.tabIndex = '0';
1811
+ focusCell.focus();
1812
+ }
1813
+ }
1814
+ }
1815
+ else {
1816
+ if (this.numberOfMonths === 1 || groupIndex === this.numberOfMonths - 1) {
1817
+ this.navigationState = { backward: false };
1818
+ this._focusKey = focusKey;
1819
+ this.navForward(event);
1820
+ }
1821
+ else {
1822
+ let nextMonthContainer = this.contentViewChild.nativeElement.children[groupIndex + 1];
1823
+ if (focusKey) {
1824
+ const firstDayCell = DomHandler.findSingle(nextMonthContainer, focusKey);
1825
+ firstDayCell.tabIndex = '0';
1826
+ firstDayCell.focus();
1827
+ }
1828
+ else {
1829
+ let focusCell = DomHandler.findSingle(nextMonthContainer, '.cax-datepicker-calendar td span:not(.cax-disabled):not(.cax-ink)');
1830
+ focusCell.tabIndex = '0';
1831
+ focusCell.focus();
1832
+ }
1833
+ }
1834
+ }
1835
+ }
1836
+ updateFocus() {
1837
+ let cell;
1838
+ if (this.navigationState) {
1839
+ if (this.navigationState.button) {
1840
+ this.initFocusableCell();
1841
+ if (this.navigationState.backward)
1842
+ DomHandler.findSingle(this.contentViewChild.nativeElement, '.cax-datepicker-prev').focus();
1843
+ else
1844
+ DomHandler.findSingle(this.contentViewChild.nativeElement, '.cax-datepicker-next').focus();
1845
+ }
1846
+ else {
1847
+ if (this.navigationState.backward) {
1848
+ let cells;
1849
+ if (this.currentView === 'month') {
1850
+ cells = DomHandler.find(this.contentViewChild.nativeElement, '.cax-monthpicker .cax-monthpicker-month:not(.cax-disabled)');
1851
+ }
1852
+ else if (this.currentView === 'year') {
1853
+ cells = DomHandler.find(this.contentViewChild.nativeElement, '.cax-yearpicker .cax-yearpicker-year:not(.cax-disabled)');
1854
+ }
1855
+ else {
1856
+ cells = DomHandler.find(this.contentViewChild.nativeElement, this._focusKey || '.cax-datepicker-calendar td span:not(.cax-disabled):not(.cax-ink)');
1857
+ }
1858
+ if (cells && cells.length > 0) {
1859
+ cell = cells[cells.length - 1];
1860
+ }
1861
+ }
1862
+ else {
1863
+ if (this.currentView === 'month') {
1864
+ cell = DomHandler.findSingle(this.contentViewChild.nativeElement, '.cax-monthpicker .cax-monthpicker-month:not(.cax-disabled)');
1865
+ }
1866
+ else if (this.currentView === 'year') {
1867
+ cell = DomHandler.findSingle(this.contentViewChild.nativeElement, '.cax-yearpicker .cax-yearpicker-year:not(.cax-disabled)');
1868
+ }
1869
+ else {
1870
+ cell = DomHandler.findSingle(this.contentViewChild.nativeElement, this._focusKey || '.cax-datepicker-calendar td span:not(.cax-disabled):not(.cax-ink)');
1871
+ }
1872
+ }
1873
+ if (cell) {
1874
+ cell.tabIndex = '0';
1875
+ cell.focus();
1876
+ }
1877
+ }
1878
+ this.navigationState = null;
1879
+ this._focusKey = null;
1880
+ }
1881
+ else {
1882
+ this.initFocusableCell();
1883
+ }
1884
+ this.alignOverlay();
1885
+ }
1886
+ initFocusableCell() {
1887
+ const contentEl = this.contentViewChild?.nativeElement;
1888
+ let cell;
1889
+ if (this.currentView === 'month') {
1890
+ let cells = DomHandler.find(contentEl, '.cax-monthpicker .cax-monthpicker-month:not(.cax-disabled)');
1891
+ let selectedCell = DomHandler.findSingle(contentEl, '.cax-monthpicker .cax-monthpicker-month.cax-highlight');
1892
+ cells.forEach((cell) => (cell.tabIndex = -1));
1893
+ cell = selectedCell || cells[0];
1894
+ if (cells.length === 0) {
1895
+ let disabledCells = DomHandler.find(contentEl, '.cax-monthpicker .cax-monthpicker-month.cax-disabled[tabindex = "0"]');
1896
+ disabledCells.forEach((cell) => (cell.tabIndex = -1));
1897
+ }
1898
+ }
1899
+ else if (this.currentView === 'year') {
1900
+ let cells = DomHandler.find(contentEl, '.cax-yearpicker .cax-yearpicker-year:not(.cax-disabled)');
1901
+ let selectedCell = DomHandler.findSingle(contentEl, '.cax-yearpicker .cax-yearpicker-year.cax-highlight');
1902
+ cells.forEach((cell) => (cell.tabIndex = -1));
1903
+ cell = selectedCell || cells[0];
1904
+ if (cells.length === 0) {
1905
+ let disabledCells = DomHandler.find(contentEl, '.cax-yearpicker .cax-yearpicker-year.cax-disabled[tabindex = "0"]');
1906
+ disabledCells.forEach((cell) => (cell.tabIndex = -1));
1907
+ }
1908
+ }
1909
+ else {
1910
+ cell = DomHandler.findSingle(contentEl, 'span.cax-highlight');
1911
+ if (!cell) {
1912
+ let todayCell = DomHandler.findSingle(contentEl, 'td.cax-datepicker-today span:not(.cax-disabled):not(.cax-ink)');
1913
+ if (todayCell)
1914
+ cell = todayCell;
1915
+ else
1916
+ cell = DomHandler.findSingle(contentEl, '.cax-datepicker-calendar td span:not(.cax-disabled):not(.cax-ink)');
1917
+ }
1918
+ }
1919
+ if (cell) {
1920
+ cell.tabIndex = '0';
1921
+ if (!this.preventFocus && (!this.navigationState || !this.navigationState.button)) {
1922
+ setTimeout(() => {
1923
+ if (!this.disabled) {
1924
+ cell.focus();
1925
+ }
1926
+ }, 1);
1927
+ }
1928
+ this.preventFocus = false;
1929
+ }
1930
+ }
1931
+ trapFocus(event) {
1932
+ let focusableElements = DomHandler.getFocusableElements(this.contentViewChild.nativeElement);
1933
+ if (focusableElements && focusableElements.length > 0) {
1934
+ if (!focusableElements[0].ownerDocument.activeElement) {
1935
+ focusableElements[0].focus();
1936
+ }
1937
+ else {
1938
+ let focusedIndex = focusableElements.indexOf(focusableElements[0].ownerDocument.activeElement);
1939
+ if (event.shiftKey) {
1940
+ if (focusedIndex == -1 || focusedIndex === 0) {
1941
+ if (this.focusTrap) {
1942
+ focusableElements[focusableElements.length - 1].focus();
1943
+ }
1944
+ else {
1945
+ if (focusedIndex === -1)
1946
+ return this.hideOverlay();
1947
+ else if (focusedIndex === 0)
1948
+ return;
1949
+ }
1950
+ }
1951
+ else {
1952
+ focusableElements[focusedIndex - 1].focus();
1953
+ }
1954
+ }
1955
+ else {
1956
+ if (focusedIndex == -1) {
1957
+ if (this.timeOnly) {
1958
+ focusableElements[0].focus();
1959
+ }
1960
+ else {
1961
+ let spanIndex = 0;
1962
+ for (let i = 0; i < focusableElements.length; i++) {
1963
+ if (focusableElements[i].tagName === 'SPAN')
1964
+ spanIndex = i;
1965
+ }
1966
+ focusableElements[spanIndex].focus();
1967
+ }
1968
+ }
1969
+ else if (focusedIndex === focusableElements.length - 1) {
1970
+ if (!this.focusTrap && focusedIndex != -1)
1971
+ return this.hideOverlay();
1972
+ focusableElements[0].focus();
1973
+ }
1974
+ else {
1975
+ focusableElements[focusedIndex + 1].focus();
1976
+ }
1977
+ }
1978
+ }
1979
+ }
1980
+ event.preventDefault();
1981
+ }
1982
+ onMonthDropdownChange(m) {
1983
+ this.currentMonth = parseInt(m);
1984
+ this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
1985
+ this.createMonths(this.currentMonth, this.currentYear);
1986
+ }
1987
+ onYearDropdownChange(y) {
1988
+ this.currentYear = parseInt(y);
1989
+ this.onYearChange.emit({ month: this.currentMonth + 1, year: this.currentYear });
1990
+ this.createMonths(this.currentMonth, this.currentYear);
1991
+ }
1992
+ convertTo24Hour(hours, pm) {
1993
+ //@ts-ignore
1994
+ if (this.hourFormat == '12') {
1995
+ if (hours === 12) {
1996
+ return pm ? 12 : 0;
1997
+ }
1998
+ else {
1999
+ return pm ? hours + 12 : hours;
2000
+ }
2001
+ }
2002
+ return hours;
2003
+ }
2004
+ constrainTime(hour, minute, second, pm) {
2005
+ let returnTimeTriple = [hour, minute, second];
2006
+ let minHoursExceeds12;
2007
+ let value = this.value;
2008
+ const convertedHour = this.convertTo24Hour(hour, pm);
2009
+ const isRange = this.isRangeSelection(), isMultiple = this.isMultipleSelection(), isMultiValue = isRange || isMultiple;
2010
+ if (isMultiValue) {
2011
+ if (!this.value) {
2012
+ this.value = [new Date(), new Date()];
2013
+ }
2014
+ if (isRange) {
2015
+ value = this.value[1] || this.value[0];
2016
+ }
2017
+ if (isMultiple) {
2018
+ value = this.value[this.value.length - 1];
2019
+ }
2020
+ }
2021
+ const valueDateString = value ? value.toDateString() : null;
2022
+ let isMinDate = this.minDate && valueDateString && this.minDate.toDateString() === valueDateString;
2023
+ let isMaxDate = this.maxDate && valueDateString && this.maxDate.toDateString() === valueDateString;
2024
+ if (isMinDate) {
2025
+ minHoursExceeds12 = this.minDate.getHours() >= 12;
2026
+ }
2027
+ switch (true // intentional fall through
2028
+ ) {
2029
+ case isMinDate && minHoursExceeds12 && this.minDate.getHours() === 12 && this.minDate.getHours() > convertedHour:
2030
+ returnTimeTriple[0] = 11;
2031
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() > minute:
2032
+ returnTimeTriple[1] = this.minDate.getMinutes();
2033
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() === minute && this.minDate.getSeconds() > second:
2034
+ returnTimeTriple[2] = this.minDate.getSeconds();
2035
+ break;
2036
+ case isMinDate && !minHoursExceeds12 && this.minDate.getHours() - 1 === convertedHour && this.minDate.getHours() > convertedHour:
2037
+ returnTimeTriple[0] = 11;
2038
+ this.pm = true;
2039
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() > minute:
2040
+ returnTimeTriple[1] = this.minDate.getMinutes();
2041
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() === minute && this.minDate.getSeconds() > second:
2042
+ returnTimeTriple[2] = this.minDate.getSeconds();
2043
+ break;
2044
+ case isMinDate && minHoursExceeds12 && this.minDate.getHours() > convertedHour && convertedHour !== 12:
2045
+ this.setCurrentHourPM(this.minDate.getHours());
2046
+ returnTimeTriple[0] = this.currentHour;
2047
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() > minute:
2048
+ returnTimeTriple[1] = this.minDate.getMinutes();
2049
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() === minute && this.minDate.getSeconds() > second:
2050
+ returnTimeTriple[2] = this.minDate.getSeconds();
2051
+ break;
2052
+ case isMinDate && this.minDate.getHours() > convertedHour:
2053
+ returnTimeTriple[0] = this.minDate.getHours();
2054
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() > minute:
2055
+ returnTimeTriple[1] = this.minDate.getMinutes();
2056
+ case isMinDate && this.minDate.getHours() === convertedHour && this.minDate.getMinutes() === minute && this.minDate.getSeconds() > second:
2057
+ returnTimeTriple[2] = this.minDate.getSeconds();
2058
+ break;
2059
+ case isMaxDate && this.maxDate.getHours() < convertedHour:
2060
+ returnTimeTriple[0] = this.maxDate.getHours();
2061
+ case isMaxDate && this.maxDate.getHours() === convertedHour && this.maxDate.getMinutes() < minute:
2062
+ returnTimeTriple[1] = this.maxDate.getMinutes();
2063
+ case isMaxDate && this.maxDate.getHours() === convertedHour && this.maxDate.getMinutes() === minute && this.maxDate.getSeconds() < second:
2064
+ returnTimeTriple[2] = this.maxDate.getSeconds();
2065
+ break;
2066
+ }
2067
+ return returnTimeTriple;
2068
+ }
2069
+ incrementHour(event) {
2070
+ const prevHour = this.currentHour ?? 0;
2071
+ let newHour = (this.currentHour ?? 0) + this.stepHour;
2072
+ let newPM = this.pm;
2073
+ if (this.hourFormat == '24')
2074
+ newHour = newHour >= 24 ? newHour - 24 : newHour;
2075
+ else if (this.hourFormat == '12') {
2076
+ // Before the AM/PM break, now after
2077
+ if (prevHour < 12 && newHour > 11) {
2078
+ newPM = !this.pm;
2079
+ }
2080
+ newHour = newHour >= 13 ? newHour - 12 : newHour;
2081
+ }
2082
+ this.toggleAMPMIfNotMinDate(newPM);
2083
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(newHour, this.currentMinute, this.currentSecond, newPM);
2084
+ event.preventDefault();
2085
+ }
2086
+ toggleAMPMIfNotMinDate(newPM) {
2087
+ let value = this.value;
2088
+ if ((this.selectionMode == 'range' || this.selectionMode == 'multiple') && Array.isArray(value) && value.length > 0) {
2089
+ value = value[value.length - 1];
2090
+ }
2091
+ const valueDateString = value ? value.toDateString() : null;
2092
+ let isMinDate = this.minDate && valueDateString && this.minDate.toDateString() === valueDateString;
2093
+ if (isMinDate && this.minDate.getHours() >= 12) {
2094
+ this.pm = true;
2095
+ }
2096
+ else {
2097
+ this.pm = newPM;
2098
+ }
2099
+ }
2100
+ onTimePickerElementMouseDown(event, type, direction) {
2101
+ if (!this.disabled) {
2102
+ this.repeat(event, null, type, direction);
2103
+ event.preventDefault();
2104
+ }
2105
+ }
2106
+ onTimePickerElementMouseUp(event) {
2107
+ if (!this.disabled) {
2108
+ this.clearTimePickerTimer();
2109
+ this.updateTime();
2110
+ }
2111
+ }
2112
+ onTimePickerElementMouseLeave() {
2113
+ if (!this.disabled && this.timePickerTimer) {
2114
+ this.clearTimePickerTimer();
2115
+ this.updateTime();
2116
+ }
2117
+ }
2118
+ repeat(event, interval, type, direction) {
2119
+ let i = interval || 500;
2120
+ this.clearTimePickerTimer();
2121
+ this.timePickerTimer = setTimeout(() => {
2122
+ this.repeat(event, 100, type, direction);
2123
+ this.cd.markForCheck();
2124
+ }, i);
2125
+ switch (type) {
2126
+ case 0:
2127
+ if (direction === 1)
2128
+ this.incrementHour(event);
2129
+ else
2130
+ this.decrementHour(event);
2131
+ break;
2132
+ case 1:
2133
+ if (direction === 1)
2134
+ this.incrementMinute(event);
2135
+ else
2136
+ this.decrementMinute(event);
2137
+ break;
2138
+ case 2:
2139
+ if (direction === 1)
2140
+ this.incrementSecond(event);
2141
+ else
2142
+ this.decrementSecond(event);
2143
+ break;
2144
+ }
2145
+ this.updateInputfield();
2146
+ }
2147
+ clearTimePickerTimer() {
2148
+ if (this.timePickerTimer) {
2149
+ clearTimeout(this.timePickerTimer);
2150
+ this.timePickerTimer = null;
2151
+ }
2152
+ }
2153
+ decrementHour(event) {
2154
+ let newHour = (this.currentHour ?? 0) - this.stepHour;
2155
+ let newPM = this.pm;
2156
+ if (this.hourFormat == '24')
2157
+ newHour = newHour < 0 ? 24 + newHour : newHour;
2158
+ else if (this.hourFormat == '12') {
2159
+ // If we were at noon/midnight, then switch
2160
+ if (this.currentHour === 12) {
2161
+ newPM = !this.pm;
2162
+ }
2163
+ newHour = newHour <= 0 ? 12 + newHour : newHour;
2164
+ }
2165
+ this.toggleAMPMIfNotMinDate(newPM);
2166
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(newHour, this.currentMinute, this.currentSecond, newPM);
2167
+ event.preventDefault();
2168
+ }
2169
+ incrementMinute(event) {
2170
+ let newMinute = (this.currentMinute ?? 0) + this.stepMinute;
2171
+ newMinute = newMinute > 59 ? newMinute - 60 : newMinute;
2172
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour, newMinute, this.currentSecond, this.pm);
2173
+ event.preventDefault();
2174
+ }
2175
+ decrementMinute(event) {
2176
+ let newMinute = (this.currentMinute ?? 0) - this.stepMinute;
2177
+ newMinute = newMinute < 0 ? 60 + newMinute : newMinute;
2178
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour, newMinute, this.currentSecond, this.pm);
2179
+ event.preventDefault();
2180
+ }
2181
+ incrementSecond(event) {
2182
+ let newSecond = this.currentSecond + this.stepSecond;
2183
+ newSecond = newSecond > 59 ? newSecond - 60 : newSecond;
2184
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour, this.currentMinute, newSecond, this.pm);
2185
+ event.preventDefault();
2186
+ }
2187
+ decrementSecond(event) {
2188
+ let newSecond = this.currentSecond - this.stepSecond;
2189
+ newSecond = newSecond < 0 ? 60 + newSecond : newSecond;
2190
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour, this.currentMinute, newSecond, this.pm);
2191
+ event.preventDefault();
2192
+ }
2193
+ updateTime() {
2194
+ let value = this.value;
2195
+ if (this.isRangeSelection()) {
2196
+ value = this.value[1] || this.value[0];
2197
+ }
2198
+ if (this.isMultipleSelection()) {
2199
+ value = this.value[this.value.length - 1];
2200
+ }
2201
+ value = value ? new Date(value.getTime()) : new Date();
2202
+ if (this.hourFormat == '12') {
2203
+ if (this.currentHour === 12)
2204
+ value.setHours(this.pm ? 12 : 0);
2205
+ else
2206
+ value.setHours(this.pm ? this.currentHour + 12 : this.currentHour);
2207
+ }
2208
+ else {
2209
+ value.setHours(this.currentHour);
2210
+ }
2211
+ value.setMinutes(this.currentMinute);
2212
+ value.setSeconds(this.currentSecond);
2213
+ if (this.isRangeSelection()) {
2214
+ if (this.value[1])
2215
+ value = [this.value[0], value];
2216
+ else
2217
+ value = [value, null];
2218
+ }
2219
+ if (this.isMultipleSelection()) {
2220
+ value = [...this.value.slice(0, -1), value];
2221
+ }
2222
+ this.updateModel(value);
2223
+ this.onSelect.emit(value);
2224
+ this.updateInputfield();
2225
+ }
2226
+ toggleAMPM(event) {
2227
+ const newPM = !this.pm;
2228
+ this.pm = newPM;
2229
+ [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour, this.currentMinute, this.currentSecond, newPM);
2230
+ this.updateTime();
2231
+ event.preventDefault();
2232
+ }
2233
+ onUserInput(event) {
2234
+ // IE 11 Workaround for input placeholder : https://github.com/primefaces/cax-design-system/issues/2026
2235
+ if (!this.isKeydown) {
2236
+ return;
2237
+ }
2238
+ this.isKeydown = false;
2239
+ let val = event.target.value;
2240
+ try {
2241
+ let value = this.parseValueFromString(val);
2242
+ if (this.isValidSelection(value)) {
2243
+ this.updateModel(value);
2244
+ this.updateUI();
2245
+ }
2246
+ else if (this.keepInvalid) {
2247
+ this.updateModel(value);
2248
+ }
2249
+ }
2250
+ catch (err) {
2251
+ //invalid date
2252
+ let value = this.keepInvalid ? val : null;
2253
+ this.updateModel(value);
2254
+ }
2255
+ this.filled = (val != null && val.length);
2256
+ this.onInput.emit(event);
2257
+ }
2258
+ isValidSelection(value) {
2259
+ if (this.isSingleSelection()) {
2260
+ return this.isSelectable(value.getDate(), value.getMonth(), value.getFullYear(), false);
2261
+ }
2262
+ let isValid = value.every((v) => this.isSelectable(v.getDate(), v.getMonth(), v.getFullYear(), false));
2263
+ if (isValid && this.isRangeSelection()) {
2264
+ isValid = value.length === 1 || (value.length > 1 && value[1] >= value[0]);
2265
+ }
2266
+ return isValid;
2267
+ }
2268
+ parseValueFromString(text) {
2269
+ if (!text || text.trim().length === 0) {
2270
+ return null;
2271
+ }
2272
+ let value;
2273
+ if (this.isSingleSelection()) {
2274
+ value = this.parseDateTime(text);
2275
+ }
2276
+ else if (this.isMultipleSelection()) {
2277
+ let tokens = text.split(this.multipleSeparator);
2278
+ value = [];
2279
+ for (let token of tokens) {
2280
+ value.push(this.parseDateTime(token.trim()));
2281
+ }
2282
+ }
2283
+ else if (this.isRangeSelection()) {
2284
+ let tokens = text.split(' ' + this.rangeSeparator + ' ');
2285
+ value = [];
2286
+ for (let i = 0; i < tokens.length; i++) {
2287
+ value[i] = this.parseDateTime(tokens[i].trim());
2288
+ }
2289
+ }
2290
+ return value;
2291
+ }
2292
+ parseDateTime(text) {
2293
+ let date;
2294
+ let parts = text.split(' ');
2295
+ if (this.timeOnly) {
2296
+ date = new Date();
2297
+ this.populateTime(date, parts[0], parts[1]);
2298
+ }
2299
+ else {
2300
+ const dateFormat = this.getDateFormat();
2301
+ if (this.showTime) {
2302
+ let ampm = this.hourFormat == '12' ? parts.pop() : null;
2303
+ let timeString = parts.pop();
2304
+ date = this.parseDate(parts.join(' '), dateFormat);
2305
+ this.populateTime(date, timeString, ampm);
2306
+ }
2307
+ else {
2308
+ date = this.parseDate(text, dateFormat);
2309
+ }
2310
+ }
2311
+ return date;
2312
+ }
2313
+ populateTime(value, timeString, ampm) {
2314
+ if (this.hourFormat == '12' && !ampm) {
2315
+ throw 'Invalid Time';
2316
+ }
2317
+ this.pm = ampm === 'PM' || ampm === 'pm';
2318
+ let time = this.parseTime(timeString);
2319
+ value.setHours(time.hour);
2320
+ value.setMinutes(time.minute);
2321
+ value.setSeconds(time.second);
2322
+ }
2323
+ isValidDate(date) {
2324
+ return ObjectUtils.isDate(date) && ObjectUtils.isNotEmpty(date);
2325
+ }
2326
+ updateUI() {
2327
+ let propValue = this.value;
2328
+ if (Array.isArray(propValue)) {
2329
+ propValue = propValue[1] || propValue[0];
2330
+ }
2331
+ let val = this.defaultDate && this.isValidDate(this.defaultDate) && !this.value ? this.defaultDate : propValue && this.isValidDate(propValue) ? propValue : new Date();
2332
+ this.currentMonth = val.getMonth();
2333
+ this.currentYear = val.getFullYear();
2334
+ this.createMonths(this.currentMonth, this.currentYear);
2335
+ if (this.showTime || this.timeOnly) {
2336
+ this.setCurrentHourPM(val.getHours());
2337
+ this.currentMinute = val.getMinutes();
2338
+ this.currentSecond = val.getSeconds();
2339
+ }
2340
+ }
2341
+ showOverlay() {
2342
+ if (!this.overlayVisible) {
2343
+ this.updateUI();
2344
+ if (!this.touchUI) {
2345
+ this.preventFocus = true;
2346
+ }
2347
+ this.overlayVisible = true;
2348
+ }
2349
+ }
2350
+ hideOverlay() {
2351
+ this.inputfieldViewChild?.nativeElement.focus();
2352
+ this.overlayVisible = false;
2353
+ this.clearTimePickerTimer();
2354
+ if (this.touchUI) {
2355
+ this.disableModality();
2356
+ }
2357
+ this.cd.markForCheck();
2358
+ }
2359
+ toggle() {
2360
+ if (!this.inline) {
2361
+ if (!this.overlayVisible) {
2362
+ this.showOverlay();
2363
+ this.inputfieldViewChild?.nativeElement.focus();
2364
+ }
2365
+ else {
2366
+ this.hideOverlay();
2367
+ }
2368
+ }
2369
+ }
2370
+ onOverlayAnimationStart(event) {
2371
+ switch (event.toState) {
2372
+ case 'visible':
2373
+ case 'visibleTouchUI':
2374
+ if (!this.inline) {
2375
+ this.overlay = event.element;
2376
+ this.overlay?.setAttribute(this.attributeSelector, '');
2377
+ this.appendOverlay();
2378
+ this.updateFocus();
2379
+ if (this.autoZIndex) {
2380
+ if (this.touchUI)
2381
+ ZIndexUtils.set('modal', this.overlay, this.baseZIndex || this.config.zIndex.modal);
2382
+ else
2383
+ ZIndexUtils.set('overlay', this.overlay, this.baseZIndex || this.config.zIndex.overlay);
2384
+ }
2385
+ this.alignOverlay();
2386
+ this.onShow.emit(event);
2387
+ }
2388
+ break;
2389
+ case 'void':
2390
+ this.onOverlayHide();
2391
+ this.onClose.emit(event);
2392
+ break;
2393
+ }
2394
+ }
2395
+ onOverlayAnimationDone(event) {
2396
+ switch (event.toState) {
2397
+ case 'visible':
2398
+ case 'visibleTouchUI':
2399
+ if (!this.inline) {
2400
+ this.bindDocumentClickListener();
2401
+ this.bindDocumentResizeListener();
2402
+ this.bindScrollListener();
2403
+ }
2404
+ break;
2405
+ case 'void':
2406
+ if (this.autoZIndex) {
2407
+ ZIndexUtils.clear(event.element);
2408
+ }
2409
+ break;
2410
+ }
2411
+ }
2412
+ appendOverlay() {
2413
+ if (this.appendTo) {
2414
+ if (this.appendTo === 'body')
2415
+ this.document.body.appendChild(this.overlay);
2416
+ else
2417
+ DomHandler.appendChild(this.overlay, this.appendTo);
2418
+ }
2419
+ }
2420
+ restoreOverlayAppend() {
2421
+ if (this.overlay && this.appendTo) {
2422
+ this.el.nativeElement.appendChild(this.overlay);
2423
+ }
2424
+ }
2425
+ alignOverlay() {
2426
+ if (this.touchUI) {
2427
+ this.enableModality(this.overlay);
2428
+ }
2429
+ else if (this.overlay) {
2430
+ if (this.appendTo) {
2431
+ if (this.view === 'date') {
2432
+ if (!this.overlay.style.width) {
2433
+ this.overlay.style.width = DomHandler.getOuterWidth(this.overlay) + 'px';
2434
+ }
2435
+ if (!this.overlay.style.minWidth) {
2436
+ this.overlay.style.minWidth = DomHandler.getOuterWidth(this.inputfieldViewChild?.nativeElement) + 'px';
2437
+ }
2438
+ }
2439
+ else {
2440
+ if (!this.overlay.style.width) {
2441
+ this.overlay.style.width = DomHandler.getOuterWidth(this.inputfieldViewChild?.nativeElement) + 'px';
2442
+ }
2443
+ }
2444
+ DomHandler.absolutePosition(this.overlay, this.inputfieldViewChild?.nativeElement);
2445
+ }
2446
+ else {
2447
+ DomHandler.relativePosition(this.overlay, this.inputfieldViewChild?.nativeElement);
2448
+ }
2449
+ }
2450
+ }
2451
+ enableModality(element) {
2452
+ if (!this.mask && this.touchUI) {
2453
+ this.mask = this.renderer.createElement('div');
2454
+ this.renderer.setStyle(this.mask, 'zIndex', String(parseInt(element.style.zIndex) - 1));
2455
+ let maskStyleClass = 'cax-component-overlay cax-datepicker-mask cax-datepicker-mask-scrollblocker cax-component-overlay cax-component-overlay-enter';
2456
+ DomHandler.addMultipleClasses(this.mask, maskStyleClass);
2457
+ this.maskClickListener = this.renderer.listen(this.mask, 'click', (event) => {
2458
+ this.disableModality();
2459
+ this.overlayVisible = false;
2460
+ });
2461
+ this.renderer.appendChild(this.document.body, this.mask);
2462
+ DomHandler.blockBodyScroll();
2463
+ }
2464
+ }
2465
+ disableModality() {
2466
+ if (this.mask) {
2467
+ DomHandler.addClass(this.mask, 'cax-component-overlay-leave');
2468
+ if (!this.animationEndListener) {
2469
+ this.animationEndListener = this.renderer.listen(this.mask, 'animationend', this.destroyMask.bind(this));
2470
+ }
2471
+ }
2472
+ }
2473
+ destroyMask() {
2474
+ if (!this.mask) {
2475
+ return;
2476
+ }
2477
+ this.renderer.removeChild(this.document.body, this.mask);
2478
+ let bodyChildren = this.document.body.children;
2479
+ let hasBlockerMasks;
2480
+ for (let i = 0; i < bodyChildren.length; i++) {
2481
+ let bodyChild = bodyChildren[i];
2482
+ if (DomHandler.hasClass(bodyChild, 'cax-datepicker-mask-scrollblocker')) {
2483
+ hasBlockerMasks = true;
2484
+ break;
2485
+ }
2486
+ }
2487
+ if (!hasBlockerMasks) {
2488
+ DomHandler.unblockBodyScroll();
2489
+ }
2490
+ this.unbindAnimationEndListener();
2491
+ this.unbindMaskClickListener();
2492
+ this.mask = null;
2493
+ }
2494
+ unbindMaskClickListener() {
2495
+ if (this.maskClickListener) {
2496
+ this.maskClickListener();
2497
+ this.maskClickListener = null;
2498
+ }
2499
+ }
2500
+ unbindAnimationEndListener() {
2501
+ if (this.animationEndListener && this.mask) {
2502
+ this.animationEndListener();
2503
+ this.animationEndListener = null;
2504
+ }
2505
+ }
2506
+ writeValue(value) {
2507
+ this.value = value;
2508
+ if (this.value && typeof this.value === 'string') {
2509
+ try {
2510
+ this.value = this.parseValueFromString(this.value);
2511
+ }
2512
+ catch {
2513
+ if (this.keepInvalid) {
2514
+ this.value = value;
2515
+ }
2516
+ }
2517
+ }
2518
+ this.updateInputfield();
2519
+ this.updateUI();
2520
+ this.cd.markForCheck();
2521
+ }
2522
+ registerOnChange(fn) {
2523
+ this.onModelChange = fn;
2524
+ }
2525
+ registerOnTouched(fn) {
2526
+ this.onModelTouched = fn;
2527
+ }
2528
+ setDisabledState(val) {
2529
+ this.disabled = val;
2530
+ this.cd.markForCheck();
2531
+ }
2532
+ getDateFormat() {
2533
+ return this.dateFormat || this.getTranslation('dateFormat');
2534
+ }
2535
+ getFirstDateOfWeek() {
2536
+ return this._firstDayOfWeek || this.getTranslation(TranslationKeys.FIRST_DAY_OF_WEEK);
2537
+ }
2538
+ // Ported from jquery-ui datepicker formatDate
2539
+ formatDate(date, format) {
2540
+ if (!date) {
2541
+ return '';
2542
+ }
2543
+ let iFormat;
2544
+ const lookAhead = (match) => {
2545
+ const matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match;
2546
+ if (matches) {
2547
+ iFormat++;
2548
+ }
2549
+ return matches;
2550
+ }, formatNumber = (match, value, len) => {
2551
+ let num = '' + value;
2552
+ if (lookAhead(match)) {
2553
+ while (num.length < len) {
2554
+ num = '0' + num;
2555
+ }
2556
+ }
2557
+ return num;
2558
+ }, formatName = (match, value, shortNames, longNames) => {
2559
+ return lookAhead(match) ? longNames[value] : shortNames[value];
2560
+ };
2561
+ let output = '';
2562
+ let literal = false;
2563
+ if (date) {
2564
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
2565
+ if (literal) {
2566
+ if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
2567
+ literal = false;
2568
+ }
2569
+ else {
2570
+ output += format.charAt(iFormat);
2571
+ }
2572
+ }
2573
+ else {
2574
+ switch (format.charAt(iFormat)) {
2575
+ case 'd':
2576
+ output += formatNumber('d', date.getDate(), 2);
2577
+ break;
2578
+ case 'D':
2579
+ output += formatName('D', date.getDay(), this.getTranslation(TranslationKeys.DAY_NAMES_SHORT), this.getTranslation(TranslationKeys.DAY_NAMES));
2580
+ break;
2581
+ case 'o':
2582
+ output += formatNumber('o', Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
2583
+ break;
2584
+ case 'm':
2585
+ output += formatNumber('m', date.getMonth() + 1, 2);
2586
+ break;
2587
+ case 'M':
2588
+ output += formatName('M', date.getMonth(), this.getTranslation(TranslationKeys.MONTH_NAMES_SHORT), this.getTranslation(TranslationKeys.MONTH_NAMES));
2589
+ break;
2590
+ case 'y':
2591
+ output += lookAhead('y') ? date.getFullYear() : (date.getFullYear() % 100 < 10 ? '0' : '') + (date.getFullYear() % 100);
2592
+ break;
2593
+ case '@':
2594
+ output += date.getTime();
2595
+ break;
2596
+ case '!':
2597
+ output += date.getTime() * 10000 + this.ticksTo1970;
2598
+ break;
2599
+ case "'":
2600
+ if (lookAhead("'")) {
2601
+ output += "'";
2602
+ }
2603
+ else {
2604
+ literal = true;
2605
+ }
2606
+ break;
2607
+ default:
2608
+ output += format.charAt(iFormat);
2609
+ }
2610
+ }
2611
+ }
2612
+ }
2613
+ return output;
2614
+ }
2615
+ formatTime(date) {
2616
+ if (!date) {
2617
+ return '';
2618
+ }
2619
+ let output = '';
2620
+ let hours = date.getHours();
2621
+ let minutes = date.getMinutes();
2622
+ let seconds = date.getSeconds();
2623
+ if (this.hourFormat == '12' && hours > 11 && hours != 12) {
2624
+ hours -= 12;
2625
+ }
2626
+ if (this.hourFormat == '12') {
2627
+ output += hours === 0 ? 12 : hours < 10 ? '0' + hours : hours;
2628
+ }
2629
+ else {
2630
+ output += hours < 10 ? '0' + hours : hours;
2631
+ }
2632
+ output += ':';
2633
+ output += minutes < 10 ? '0' + minutes : minutes;
2634
+ if (this.showSeconds) {
2635
+ output += ':';
2636
+ output += seconds < 10 ? '0' + seconds : seconds;
2637
+ }
2638
+ if (this.hourFormat == '12') {
2639
+ output += date.getHours() > 11 ? ' PM' : ' AM';
2640
+ }
2641
+ return output;
2642
+ }
2643
+ parseTime(value) {
2644
+ let tokens = value.split(':');
2645
+ let validTokenLength = this.showSeconds ? 3 : 2;
2646
+ if (tokens.length !== validTokenLength) {
2647
+ throw 'Invalid time';
2648
+ }
2649
+ let h = parseInt(tokens[0]);
2650
+ let m = parseInt(tokens[1]);
2651
+ let s = this.showSeconds ? parseInt(tokens[2]) : null;
2652
+ if (isNaN(h) || isNaN(m) || h > 23 || m > 59 || (this.hourFormat == '12' && h > 12) || (this.showSeconds && (isNaN(s) || s > 59))) {
2653
+ throw 'Invalid time';
2654
+ }
2655
+ else {
2656
+ if (this.hourFormat == '12') {
2657
+ if (h !== 12 && this.pm) {
2658
+ h += 12;
2659
+ }
2660
+ else if (!this.pm && h === 12) {
2661
+ h -= 12;
2662
+ }
2663
+ }
2664
+ return { hour: h, minute: m, second: s };
2665
+ }
2666
+ }
2667
+ // Ported from jquery-ui datepicker parseDate
2668
+ parseDate(value, format) {
2669
+ if (format == null || value == null) {
2670
+ throw 'Invalid arguments';
2671
+ }
2672
+ value = typeof value === 'object' ? value.toString() : value + '';
2673
+ if (value === '') {
2674
+ return null;
2675
+ }
2676
+ let iFormat, dim, extra, iValue = 0, shortYearCutoff = typeof this.shortYearCutoff !== 'string' ? this.shortYearCutoff : (new Date().getFullYear() % 100) + parseInt(this.shortYearCutoff, 10), year = -1, month = -1, day = -1, doy = -1, literal = false, date, lookAhead = (match) => {
2677
+ let matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match;
2678
+ if (matches) {
2679
+ iFormat++;
2680
+ }
2681
+ return matches;
2682
+ }, getNumber = (match) => {
2683
+ let isDoubled = lookAhead(match), size = match === '@' ? 14 : match === '!' ? 20 : match === 'y' && isDoubled ? 4 : match === 'o' ? 3 : 2, minSize = match === 'y' ? size : 1, digits = new RegExp('^\\d{' + minSize + ',' + size + '}'), num = value.substring(iValue).match(digits);
2684
+ if (!num) {
2685
+ throw 'Missing number at position ' + iValue;
2686
+ }
2687
+ iValue += num[0].length;
2688
+ return parseInt(num[0], 10);
2689
+ }, getName = (match, shortNames, longNames) => {
2690
+ let index = -1;
2691
+ let arr = lookAhead(match) ? longNames : shortNames;
2692
+ let names = [];
2693
+ for (let i = 0; i < arr.length; i++) {
2694
+ names.push([i, arr[i]]);
2695
+ }
2696
+ names.sort((a, b) => {
2697
+ return -(a[1].length - b[1].length);
2698
+ });
2699
+ for (let i = 0; i < names.length; i++) {
2700
+ let name = names[i][1];
2701
+ if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
2702
+ index = names[i][0];
2703
+ iValue += name.length;
2704
+ break;
2705
+ }
2706
+ }
2707
+ if (index !== -1) {
2708
+ return index + 1;
2709
+ }
2710
+ else {
2711
+ throw 'Unknown name at position ' + iValue;
2712
+ }
2713
+ }, checkLiteral = () => {
2714
+ if (value.charAt(iValue) !== format.charAt(iFormat)) {
2715
+ throw 'Unexpected literal at position ' + iValue;
2716
+ }
2717
+ iValue++;
2718
+ };
2719
+ if (this.view === 'month') {
2720
+ day = 1;
2721
+ }
2722
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
2723
+ if (literal) {
2724
+ if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
2725
+ literal = false;
2726
+ }
2727
+ else {
2728
+ checkLiteral();
2729
+ }
2730
+ }
2731
+ else {
2732
+ switch (format.charAt(iFormat)) {
2733
+ case 'd':
2734
+ day = getNumber('d');
2735
+ break;
2736
+ case 'D':
2737
+ getName('D', this.getTranslation(TranslationKeys.DAY_NAMES_SHORT), this.getTranslation(TranslationKeys.DAY_NAMES));
2738
+ break;
2739
+ case 'o':
2740
+ doy = getNumber('o');
2741
+ break;
2742
+ case 'm':
2743
+ month = getNumber('m');
2744
+ break;
2745
+ case 'M':
2746
+ month = getName('M', this.getTranslation(TranslationKeys.MONTH_NAMES_SHORT), this.getTranslation(TranslationKeys.MONTH_NAMES));
2747
+ break;
2748
+ case 'y':
2749
+ year = getNumber('y');
2750
+ break;
2751
+ case '@':
2752
+ date = new Date(getNumber('@'));
2753
+ year = date.getFullYear();
2754
+ month = date.getMonth() + 1;
2755
+ day = date.getDate();
2756
+ break;
2757
+ case '!':
2758
+ date = new Date((getNumber('!') - this.ticksTo1970) / 10000);
2759
+ year = date.getFullYear();
2760
+ month = date.getMonth() + 1;
2761
+ day = date.getDate();
2762
+ break;
2763
+ case "'":
2764
+ if (lookAhead("'")) {
2765
+ checkLiteral();
2766
+ }
2767
+ else {
2768
+ literal = true;
2769
+ }
2770
+ break;
2771
+ default:
2772
+ checkLiteral();
2773
+ }
2774
+ }
2775
+ }
2776
+ if (iValue < value.length) {
2777
+ extra = value.substr(iValue);
2778
+ if (!/^\s+/.test(extra)) {
2779
+ throw 'Extra/unparsed characters found in date: ' + extra;
2780
+ }
2781
+ }
2782
+ if (year === -1) {
2783
+ year = new Date().getFullYear();
2784
+ }
2785
+ else if (year < 100) {
2786
+ year += new Date().getFullYear() - (new Date().getFullYear() % 100) + (year <= shortYearCutoff ? 0 : -100);
2787
+ }
2788
+ if (doy > -1) {
2789
+ month = 1;
2790
+ day = doy;
2791
+ do {
2792
+ dim = this.getDaysCountInMonth(year, month - 1);
2793
+ if (day <= dim) {
2794
+ break;
2795
+ }
2796
+ month++;
2797
+ day -= dim;
2798
+ } while (true);
2799
+ }
2800
+ if (this.view === 'year') {
2801
+ month = month === -1 ? 1 : month;
2802
+ day = day === -1 ? 1 : day;
2803
+ }
2804
+ date = this.daylightSavingAdjust(new Date(year, month - 1, day));
2805
+ if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
2806
+ throw 'Invalid date'; // E.g. 31/02/00
2807
+ }
2808
+ return date;
2809
+ }
2810
+ daylightSavingAdjust(date) {
2811
+ if (!date) {
2812
+ return null;
2813
+ }
2814
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
2815
+ return date;
2816
+ }
2817
+ updateFilledState() {
2818
+ this.filled = (this.inputFieldValue && this.inputFieldValue != '');
2819
+ }
2820
+ isValidDateForTimeConstraints(selectedDate) {
2821
+ if (this.keepInvalid) {
2822
+ return true; // If we are keeping invalid dates, we don't need to check for time constraints
2823
+ }
2824
+ return (!this.minDate || selectedDate >= this.minDate) && (!this.maxDate || selectedDate <= this.maxDate);
2825
+ }
2826
+ onTodayButtonClick(event) {
2827
+ const date = new Date();
2828
+ const dateMeta = { day: date.getDate(), month: date.getMonth(), year: date.getFullYear(), otherMonth: date.getMonth() !== this.currentMonth || date.getFullYear() !== this.currentYear, today: true, selectable: true };
2829
+ this.createMonths(date.getMonth(), date.getFullYear());
2830
+ this.onDateSelect(event, dateMeta);
2831
+ this.onTodayClick.emit(date);
2832
+ }
2833
+ onClearButtonClick(event) {
2834
+ this.updateModel(null);
2835
+ this.updateInputfield();
2836
+ this.hideOverlay();
2837
+ this.onClearClick.emit(event);
2838
+ }
2839
+ onBackButtonClick(event) {
2840
+ if (this.currentView == 'year')
2841
+ this.setCurrentView('month');
2842
+ else if (this.currentView == 'month')
2843
+ this.setCurrentView('date');
2844
+ }
2845
+ createResponsiveStyle() {
2846
+ if (this.numberOfMonths > 1 && this.responsiveOptions) {
2847
+ if (!this.responsiveStyleElement) {
2848
+ this.responsiveStyleElement = this.renderer.createElement('style');
2849
+ this.responsiveStyleElement.type = 'text/css';
2850
+ DomHandler.setAttribute(this.responsiveStyleElement, 'nonce', this.config?.csp()?.nonce);
2851
+ this.renderer.appendChild(this.document.body, this.responsiveStyleElement);
2852
+ }
2853
+ let innerHTML = '';
2854
+ if (this.responsiveOptions) {
2855
+ let responsiveOptions = [...this.responsiveOptions].filter((o) => !!(o.breakpoint && o.numMonths)).sort((o1, o2) => -1 * o1.breakpoint.localeCompare(o2.breakpoint, undefined, { numeric: true }));
2856
+ for (let i = 0; i < responsiveOptions.length; i++) {
2857
+ let { breakpoint, numMonths } = responsiveOptions[i];
2858
+ let styles = `
2859
+ .cax-datepicker[${this.attributeSelector}] .cax-datepicker-group:nth-child(${numMonths}) .cax-datepicker-next {
2860
+ display: inline-flex !important;
2861
+ }
2862
+ `;
2863
+ for (let j = numMonths; j < this.numberOfMonths; j++) {
2864
+ styles += `
2865
+ .cax-datepicker[${this.attributeSelector}] .cax-datepicker-group:nth-child(${j + 1}) {
2866
+ display: none !important;
2867
+ }
2868
+ `;
2869
+ }
2870
+ innerHTML += `
2871
+ @media screen and (max-width: ${breakpoint}) {
2872
+ ${styles}
2873
+ }
2874
+ `;
2875
+ }
2876
+ }
2877
+ this.responsiveStyleElement.innerHTML = innerHTML;
2878
+ }
2879
+ }
2880
+ destroyResponsiveStyleElement() {
2881
+ if (this.responsiveStyleElement) {
2882
+ this.responsiveStyleElement.remove();
2883
+ this.responsiveStyleElement = null;
2884
+ }
2885
+ }
2886
+ bindDocumentClickListener() {
2887
+ if (!this.documentClickListener) {
2888
+ this.zone.runOutsideAngular(() => {
2889
+ const documentTarget = this.el ? this.el.nativeElement.ownerDocument : this.document;
2890
+ this.documentClickListener = this.renderer.listen(documentTarget, 'mousedown', (event) => {
2891
+ if (this.isOutsideClicked(event) && this.overlayVisible) {
2892
+ this.zone.run(() => {
2893
+ this.hideOverlay();
2894
+ this.onClickOutside.emit(event);
2895
+ this.cd.markForCheck();
2896
+ });
2897
+ }
2898
+ });
2899
+ });
2900
+ }
2901
+ }
2902
+ unbindDocumentClickListener() {
2903
+ if (this.documentClickListener) {
2904
+ this.documentClickListener();
2905
+ this.documentClickListener = null;
2906
+ }
2907
+ }
2908
+ bindDocumentResizeListener() {
2909
+ if (!this.documentResizeListener && !this.touchUI) {
2910
+ this.documentResizeListener = this.renderer.listen(this.window, 'resize', this.onWindowResize.bind(this));
2911
+ }
2912
+ }
2913
+ unbindDocumentResizeListener() {
2914
+ if (this.documentResizeListener) {
2915
+ this.documentResizeListener();
2916
+ this.documentResizeListener = null;
2917
+ }
2918
+ }
2919
+ bindScrollListener() {
2920
+ if (!this.scrollHandler) {
2921
+ this.scrollHandler = new ConnectedOverlayScrollHandler(this.containerViewChild?.nativeElement, () => {
2922
+ if (this.overlayVisible) {
2923
+ this.hideOverlay();
2924
+ }
2925
+ });
2926
+ }
2927
+ this.scrollHandler.bindScrollListener();
2928
+ }
2929
+ unbindScrollListener() {
2930
+ if (this.scrollHandler) {
2931
+ this.scrollHandler.unbindScrollListener();
2932
+ }
2933
+ }
2934
+ isOutsideClicked(event) {
2935
+ return !(this.el.nativeElement.isSameNode(event.target) || this.isNavIconClicked(event) || this.el.nativeElement.contains(event.target) || (this.overlay && this.overlay.contains(event.target)));
2936
+ }
2937
+ isNavIconClicked(event) {
2938
+ return (DomHandler.hasClass(event.target, 'cax-datepicker-prev') ||
2939
+ DomHandler.hasClass(event.target, 'cax-datepicker-prev-icon') ||
2940
+ DomHandler.hasClass(event.target, 'cax-datepicker-next') ||
2941
+ DomHandler.hasClass(event.target, 'cax-datepicker-next-icon'));
2942
+ }
2943
+ onWindowResize() {
2944
+ if (this.overlayVisible && !DomHandler.isTouchDevice()) {
2945
+ this.hideOverlay();
2946
+ }
2947
+ }
2948
+ onOverlayHide() {
2949
+ this.currentView = this.view;
2950
+ if (this.mask) {
2951
+ this.destroyMask();
2952
+ }
2953
+ this.unbindDocumentClickListener();
2954
+ this.unbindDocumentResizeListener();
2955
+ this.unbindScrollListener();
2956
+ this.overlay = null;
2957
+ }
2958
+ ngOnDestroy() {
2959
+ if (this.scrollHandler) {
2960
+ this.scrollHandler.destroy();
2961
+ this.scrollHandler = null;
2962
+ }
2963
+ if (this.translationSubscription) {
2964
+ this.translationSubscription.unsubscribe();
2965
+ }
2966
+ if (this.overlay && this.autoZIndex) {
2967
+ ZIndexUtils.clear(this.overlay);
2968
+ }
2969
+ this.destroyResponsiveStyleElement();
2970
+ this.clearTimePickerTimer();
2971
+ this.restoreOverlayAppend();
2972
+ this.onOverlayHide();
2973
+ }
2974
+ onInlineSave(event) {
2975
+ this.onInlineSaved.emit(this.value);
2976
+ }
2977
+ onInlineCancel() {
2978
+ // Revert to original value if needed
2979
+ if (this.originalValue) {
2980
+ this.value = new Date(this.originalValue);
2981
+ this.updateFormattedInlineDate();
2982
+ }
2983
+ this.onInlineCancelled.emit();
2984
+ }
2985
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Calendar, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.caxConfig }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Component });
2986
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.9", type: Calendar, isStandalone: true, selector: "cax-calendar", inputs: { iconDisplay: "iconDisplay", style: "style", styleClass: "styleClass", inputStyle: "inputStyle", inputId: "inputId", name: "name", inputStyleClass: "inputStyleClass", placeholder: "placeholder", ariaLabelledBy: "ariaLabelledBy", ariaLabel: "ariaLabel", iconAriaLabel: "iconAriaLabel", disabled: ["disabled", "disabled", booleanAttribute], dateFormat: "dateFormat", multipleSeparator: "multipleSeparator", rangeSeparator: "rangeSeparator", inline: ["inline", "inline", booleanAttribute], showOtherMonths: ["showOtherMonths", "showOtherMonths", booleanAttribute], selectOtherMonths: ["selectOtherMonths", "selectOtherMonths", booleanAttribute], showIcon: ["showIcon", "showIcon", booleanAttribute], icon: "icon", appendTo: "appendTo", readonlyInput: ["readonlyInput", "readonlyInput", booleanAttribute], shortYearCutoff: "shortYearCutoff", monthNavigator: ["monthNavigator", "monthNavigator", booleanAttribute], yearNavigator: ["yearNavigator", "yearNavigator", booleanAttribute], hourFormat: "hourFormat", timeOnly: ["timeOnly", "timeOnly", booleanAttribute], stepYearPicker: ["stepYearPicker", "stepYearPicker", numberAttribute], stepHour: ["stepHour", "stepHour", numberAttribute], stepMinute: ["stepMinute", "stepMinute", numberAttribute], stepSecond: ["stepSecond", "stepSecond", numberAttribute], showSeconds: ["showSeconds", "showSeconds", booleanAttribute], required: ["required", "required", booleanAttribute], showOnFocus: ["showOnFocus", "showOnFocus", booleanAttribute], showWeek: ["showWeek", "showWeek", booleanAttribute], startWeekFromFirstDayOfYear: "startWeekFromFirstDayOfYear", showClear: ["showClear", "showClear", booleanAttribute], dataType: "dataType", selectionMode: "selectionMode", maxDateCount: ["maxDateCount", "maxDateCount", numberAttribute], showButtonBar: ["showButtonBar", "showButtonBar", booleanAttribute], todayButtonStyleClass: "todayButtonStyleClass", clearButtonStyleClass: "clearButtonStyleClass", autofocus: ["autofocus", "autofocus", booleanAttribute], autoZIndex: ["autoZIndex", "autoZIndex", booleanAttribute], baseZIndex: ["baseZIndex", "baseZIndex", numberAttribute], panelStyleClass: "panelStyleClass", panelStyle: "panelStyle", keepInvalid: ["keepInvalid", "keepInvalid", booleanAttribute], hideOnDateTimeSelect: ["hideOnDateTimeSelect", "hideOnDateTimeSelect", booleanAttribute], touchUI: ["touchUI", "touchUI", booleanAttribute], labelText: "labelText", timeSeparator: "timeSeparator", leftIcon: "leftIcon", focusTrap: ["focusTrap", "focusTrap", booleanAttribute], showTransitionOptions: "showTransitionOptions", hideTransitionOptions: "hideTransitionOptions", tabindex: ["tabindex", "tabindex", numberAttribute], variant: "variant", minDate: "minDate", maxDate: "maxDate", disabledDates: "disabledDates", disabledDays: "disabledDays", yearRange: "yearRange", showTime: "showTime", responsiveOptions: "responsiveOptions", numberOfMonths: "numberOfMonths", firstDayOfWeek: "firstDayOfWeek", locale: "locale", view: "view", defaultDate: "defaultDate" }, outputs: { onFocus: "onFocus", onBlur: "onBlur", onClose: "onClose", onSelect: "onSelect", onClear: "onClear", onInput: "onInput", onTodayClick: "onTodayClick", onClearClick: "onClearClick", onMonthChange: "onMonthChange", onYearChange: "onYearChange", onClickOutside: "onClickOutside", onInlineSaved: "onInlineSaved", onInlineCancelled: "onInlineCancelled", onShow: "onShow" }, host: { properties: { "class.cax-inputwrapper-filled": "filled", "class.cax-inputwrapper-focus": "focus", "class.cax-calendar-clearable": "showClear && !disabled" }, classAttribute: "cax-element cax-inputwrapper" }, providers: [CALENDAR_VALUE_ACCESSOR], queries: [{ propertyName: "templates", predicate: CaxTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }, { propertyName: "inputfieldViewChild", first: true, predicate: ["inputfield"], descendants: true }, { propertyName: "content", first: true, predicate: ["contentWrapper"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"{'cax-calendar-main-label': labelText}\">\r\n <label *ngIf=\"labelText\" [ngClass]=\"labelTextClass\">{{ labelText }}</label>\r\n</div>\r\n<span\r\n #container\r\n [ngClass]=\"{\r\n 'cax-calendar': true,\r\n 'cax-input-icon-left': showIcon && iconDisplay === 'input' && leftIcon,\r\n 'cax-input-icon-right': showIcon && iconDisplay === 'input',\r\n 'cax-calendar-w-btn': showIcon && iconDisplay === 'button',\r\n 'cax-calendar-timeonly': timeOnly,\r\n 'cax-calendar-disabled': disabled,\r\n 'cax-focus': focus || overlayVisible\r\n }\"\r\n [ngStyle]=\"style\"\r\n [class]=\"styleClass\"\r\n>\r\n <ng-template [ngIf]=\"!inline\">\r\n <input\r\n #inputfield\r\n type=\"text\"\r\n role=\"combobox\"\r\n [attr.id]=\"inputId\"\r\n [attr.name]=\"name\"\r\n [attr.required]=\"required\"\r\n [attr.aria-required]=\"required\"\r\n aria-autocomplete=\"none\"\r\n aria-haspopup=\"dialog\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? panelId : null\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [value]=\"inputFieldValue\"\r\n (focus)=\"onInputFocus($event)\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n (click)=\"onInputClick()\"\r\n (blur)=\"onInputBlur($event)\"\r\n [readonly]=\"readonlyInput\"\r\n (input)=\"onUserInput($event)\"\r\n [ngStyle]=\"inputStyle\"\r\n [class]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder || ''\"\r\n [disabled]=\"disabled\"\r\n [attr.tabindex]=\"tabindex\"\r\n [attr.inputmode]=\"touchUI ? 'off' : null\"\r\n [ngClass]=\"inputClass\"\r\n autocomplete=\"off\"\r\n caxAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n <ng-container *ngIf=\"showClear && !disabled && value != null\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-calendar-clear-icon'\" (click)=\"clear()\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-calendar-clear-icon\" (click)=\"clear()\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"iconButtonAriaLabel\"\r\n aria-haspopup=\"dialog\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? panelId : null\"\r\n caxButton\r\n caxRipple\r\n *ngIf=\"showIcon && iconDisplay === 'button'\"\r\n (click)=\"onButtonClick($event, inputfield)\"\r\n class=\"cax-datepicker-trigger cax-button-icon-only\"\r\n [disabled]=\"disabled\"\r\n tabindex=\"0\"\r\n >\r\n <span *ngIf=\"icon\" [ngClass]=\"icon\"></span>\r\n <ng-container *ngIf=\"!icon\">\r\n <i class=\"cax cax-calendar-icon\" *ngIf=\"!triggerIconTemplate\" ></i>\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </ng-container>\r\n </button>\r\n <ng-container *ngIf=\"iconDisplay === 'input' && showIcon\">\r\n <i class=\"cax cax-calendar-icon\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"!inputIconTemplate\"\r\n [ngClass]=\"{\r\n 'cax-datepicker-icon': showOnFocus\r\n }\"\r\n ></i>\r\n <ng-container *ngTemplateOutlet=\"inputIconTemplate; context: { clickCallBack: onButtonClick.bind(this) }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-container *ngIf=\"iconDisplay === 'input' && showIcon\">\r\n <i class=\"cax cax-alt-arrow-down cax-downarrow\"></i>\r\n </ng-container>\r\n \r\n <div\r\n #contentWrapper\r\n [attr.id]=\"panelId\"\r\n [class]=\"panelStyleClass\"\r\n [ngStyle]=\"panelStyle\"\r\n [ngClass]=\"{\r\n 'cax-datepicker cax-component': true,\r\n 'cax-datepicker-inline': inline,\r\n 'cax-disabled': disabled,\r\n 'cax-datepicker-timeonly': timeOnly,\r\n 'cax-datepicker-multiple-month': this.numberOfMonths > 1,\r\n 'cax-datepicker-monthpicker': view === 'month',\r\n 'cax-datepicker-touch-ui': touchUI\r\n }\"\r\n [@overlayAnimation]=\"\r\n touchUI\r\n ? { value: 'visibleTouchUI', params: { showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions } }\r\n : { value: 'visible', params: { showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions } }\r\n \"\r\n [attr.aria-label]=\"getTranslation('chooseDate')\"\r\n [attr.role]=\"inline ? null : 'dialog'\"\r\n [attr.aria-modal]=\"inline ? null : 'true'\"\r\n [@.disabled]=\"inline === true\"\r\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\r\n (@overlayAnimation.done)=\"onOverlayAnimationDone($event)\"\r\n (click)=\"onOverlayClick($event)\"\r\n *ngIf=\"inline || overlayVisible\"\r\n >\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <ng-container *ngIf=\"!timeOnly\">\r\n <div class=\"cax-datepicker-group-container\">\r\n <div class=\"cax-datepicker-group\" *ngFor=\"let month of months; let i = index\">\r\n <div class=\"cax-datepicker-header\">\r\n <button (keydown)=\"onContainerButtonKeydown($event)\" class=\"cax-datepicker-prev cax-link\" (click)=\"onPrevButtonClick($event)\" *ngIf=\"i === 0\" type=\"button\" [attr.aria-label]=\"prevIconAriaLabel\" caxRipple>\r\n <ChevronLeftIcon [styleClass]=\"'cax-datepicker-prev-icon'\" *ngIf=\"!previousIconTemplate\" />\r\n <span *ngIf=\"previousIconTemplate\" class=\"cax-datepicker-prev-icon\">\r\n <ng-template *ngTemplateOutlet=\"previousIconTemplate\"></ng-template>\r\n </span>\r\n </button>\r\n <div class=\"cax-datepicker-title\">\r\n <button\r\n type=\"button\"\r\n (click)=\"switchToMonthView($event)\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n *ngIf=\"currentView === 'date'\"\r\n class=\"cax-datepicker-month cax-link\"\r\n [disabled]=\"switchViewButtonDisabled()\"\r\n [attr.aria-label]=\"this.getTranslation('chooseMonth')\"\r\n >\r\n {{ getMonthName(month.month) }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"switchToYearView($event)\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n *ngIf=\"currentView !== 'year'\"\r\n class=\"cax-datepicker-year cax-link\"\r\n [disabled]=\"switchViewButtonDisabled()\"\r\n [attr.aria-label]=\"getTranslation('chooseYear')\"\r\n >\r\n {{ getYear(month) }}\r\n </button>\r\n <span class=\"cax-datepicker-decade\" *ngIf=\"currentView === 'year'\">\r\n Year\r\n <!-- <ng-container *ngIf=\"!decadeTemplate\">{{ yearPickerValues()[0] }} - {{ yearPickerValues()[yearPickerValues().length - 1] }}</ng-container>\r\n <ng-container *ngTemplateOutlet=\"decadeTemplate; context: { $implicit: yearPickerValues }\"></ng-container> -->\r\n </span>\r\n </div>\r\n <button\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n class=\"cax-datepicker-next cax-link\"\r\n (click)=\"onNextButtonClick($event)\"\r\n [style.display]=\"numberOfMonths === 1 ? 'inline-flex' : i === numberOfMonths - 1 ? 'inline-flex' : 'none'\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextIconAriaLabel\"\r\n caxRipple\r\n >\r\n <ChevronRightIcon [styleClass]=\"'cax-datepicker-next-icon'\" *ngIf=\"!nextIconTemplate\" />\r\n <span *ngIf=\"nextIconTemplate\" class=\"cax-datepicker-next-icon\">\r\n <ng-template *ngTemplateOutlet=\"nextIconTemplate\"></ng-template>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cax-datepicker-calendar-container\" *ngIf=\"currentView === 'date'\">\r\n <table class=\"cax-datepicker-calendar\" role=\"grid\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"showWeek\" class=\"cax-datepicker-weekheader cax-disabled\">\r\n <span>{{ getTranslation('weekHeader') }}</span>\r\n </th>\r\n <th scope=\"col\" *ngFor=\"let weekDay of weekDays; let begin = first; let end = last\">\r\n <span>{{ weekDay }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of month.dates; let j = index\">\r\n <td *ngIf=\"showWeek\" class=\"cax-datepicker-weeknumber\">\r\n <span class=\"cax-disabled\"> {{ month.weekNumbers[j] }} </span>\r\n </td>\r\n <td *ngFor=\"let date of week\" [attr.aria-label]=\"date.day\" [ngClass]=\"{ 'cax-datepicker-other-month': date.otherMonth, 'cax-datepicker-today': date.today }\">\r\n <ng-container *ngIf=\"date.otherMonth ? showOtherMonths : true\">\r\n <span\r\n [ngClass]=\"{ 'cax-highlight cax-datepicker-current-day': isSelected(date) && date.selectable, 'cax-disabled': !date.selectable }\"\r\n (click)=\"onDateSelect($event, date)\"\r\n draggable=\"false\"\r\n [attr.data-date]=\"formatDateKey(formatDateMetaToDate(date))\"\r\n (keydown)=\"onDateCellKeydown($event, date, i)\"\r\n caxRipple\r\n >\r\n <ng-container *ngIf=\"!dateTemplate && (date.selectable || !disabledDateTemplate)\">{{ date.day }}</ng-container>\r\n <ng-container *ngIf=\"date.selectable || !disabledDateTemplate\">\r\n <ng-container *ngTemplateOutlet=\"dateTemplate; context: { $implicit: date }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!date.selectable\">\r\n <ng-container *ngTemplateOutlet=\"disabledDateTemplate; context: { $implicit: date }\"></ng-container>\r\n </ng-container>\r\n </span>\r\n <div *ngIf=\"isSelected(date)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ date.day }}</div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cax-monthpicker\" *ngIf=\"currentView === 'month'\">\r\n <span\r\n *ngFor=\"let m of monthPickerValues(); let i = index\"\r\n (click)=\"onMonthSelect($event, i)\"\r\n (keydown)=\"onMonthCellKeydown($event, i)\"\r\n class=\"cax-monthpicker-month\"\r\n [ngClass]=\"{ 'cax-highlight': isMonthSelected(i), 'cax-disabled': isMonthDisabled(i) }\"\r\n caxRipple\r\n >\r\n {{ m }}\r\n <div *ngIf=\"isMonthSelected(i)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ m }}</div>\r\n </span>\r\n </div>\r\n <div class=\"cax-yearpicker\" *ngIf=\"currentView === 'year'\">\r\n <span\r\n *ngFor=\"let y of yearPickerValues()\"\r\n (click)=\"onYearSelect($event, y)\"\r\n (keydown)=\"onYearCellKeydown($event, y)\"\r\n class=\"cax-yearpicker-year\"\r\n [ngClass]=\"{ 'cax-highlight': isYearSelected(y), 'cax-disabled': isYearDisabled(y) }\"\r\n caxRipple\r\n >\r\n {{ y }}\r\n <div *ngIf=\"isYearSelected(y)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ y }}</div>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <div class=\"cax-timepicker\" *ngIf=\"(showTime || timeOnly) && currentView === 'date'\">\r\n <div class=\"cax-hour-picker\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementHour($event)\"\r\n (keydown.space)=\"incrementHour($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 0, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextHour')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentHour < 10\">0</ng-container>{{ currentHour }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementHour($event)\"\r\n (keydown.space)=\"decrementHour($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 0, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevHour')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-separator\">\r\n <span>{{ timeSeparator }}</span>\r\n </div>\r\n <div class=\"cax-minute-picker\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementMinute($event)\"\r\n (keydown.space)=\"incrementMinute($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 1, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextMinute')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentMinute < 10\">0</ng-container>{{ currentMinute }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementMinute($event)\"\r\n (keydown.space)=\"decrementMinute($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 1, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevMinute')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-separator\" *ngIf=\"showSeconds\">\r\n <span>{{ timeSeparator }}</span>\r\n </div>\r\n <div class=\"cax-second-picker\" *ngIf=\"showSeconds\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementSecond($event)\"\r\n (keydown.space)=\"incrementSecond($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 2, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextSecond')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentSecond < 10\">0</ng-container>{{ currentSecond }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementSecond($event)\"\r\n (keydown.space)=\"decrementSecond($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 2, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevSecond')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-ampm-picker\" *ngIf=\"hourFormat == '12'\">\r\n <button class=\"cax-link\" type=\"button\" (keydown)=\"onContainerButtonKeydown($event)\" (click)=\"toggleAMPM($event)\" (keydown.enter)=\"toggleAMPM($event)\" [attr.aria-label]=\"getTranslation('am')\" caxRipple>\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span>{{ pm ? 'PM' : 'AM' }}</span>\r\n <button class=\"cax-link\" type=\"button\" (keydown)=\"onContainerButtonKeydown($event)\" (click)=\"toggleAMPM($event)\" (keydown.enter)=\"toggleAMPM($event)\" [attr.aria-label]=\"getTranslation('pm')\" caxRipple>\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"cax-datepicker-buttonbar\" *ngIf=\"showButtonBar\">\r\n <cax-button\r\n *ngIf=\"currentView !== 'year' && currentView !== 'month'\"\r\n type=\"button\"\r\n [link]=\"true\"\r\n [label]=\"getTranslation('clear')\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (onClick)=\"onClearButtonClick($event)\"\r\n caxRipple\r\n ></cax-button>\r\n <cax-button *ngIf=\"currentView === 'year' || currentView === 'month'\" type=\"button\" [link]=\"true\" [label]=\"'Back'\" (keydown)=\"onContainerButtonKeydown($event)\" (onClick)=\"onBackButtonClick($event)\" caxRipple></cax-button>\r\n </div>\r\n <!-- For the inline -->\r\n <div class=\"cax-datepicker-inline-actions\" *ngIf=\"inline\">\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [severity]=\"'secondary'\"\r\n [size]=\"'small'\"\r\n (click)=\"onInlineCancel()\">\r\n </cax-button>\r\n <div class=\"left-side\">\r\n <div class=\"cax-datepicker-inline-input\">\r\n <i class=\"cax cax-calendar-minimalistic\"></i>\r\n <input\r\n type=\"text\"\r\n [attr.id]=\"inputId\"\r\n [value]=\"formattedInlineDate\"\r\n readonly\r\n class=\"cax-datepicker-inline-display\"\r\n />\r\n </div>\r\n <div class=\"cax-datepicker-inline-buttons\">\r\n <cax-button\r\n [label]=\"'Save'\"\r\n [severity]=\"'Primary'\"\r\n [size]=\"'small'\"\r\n (click)=\"onInlineSave()\">\r\n </cax-button>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n</span>\r\n", styles: ["@layer cax{.cax-calendar{position:relative;display:inline-flex;width:100%;height:40px}.cax-calendar-main-label{font-weight:500;font-size:14px;line-height:20px;margin-bottom:8px}.cax-calendar .cax-inputtext{flex:1 1 auto;width:1%;text-overflow:ellipsis;padding-left:1.8rem!important;padding-right:1.8rem!important}.cax-calendar-w-btn .cax-inputtext{border-top-right-radius:0;border-bottom-right-radius:0}.cax-calendar-w-btn .cax-datepicker-trigger{border-top-left-radius:0;border-bottom-left-radius:0}.cax-fluid .cax-calendar{display:flex}.cax-fluid .cax-calendar .cax-inputtext{width:1%}.cax-calendar .cax-datepicker{min-width:100%}.cax-datepicker{width:auto;position:absolute;top:0;left:0}.cax-datepicker-inline{display:inline-block;position:static;overflow-x:auto}.cax-datepicker-header{display:flex;align-items:center;justify-content:space-between}.cax-datepicker-header .cax-datepicker-title{margin:0 auto}.cax-datepicker-prev,.cax-datepicker-next{cursor:pointer;display:inline-flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.cax-datepicker-multiple-month .cax-datepicker-group-container .cax-datepicker-group{flex:1 1 auto}.cax-datepicker-multiple-month .cax-datepicker-group-container{display:flex}.cax-datepicker table{width:100%;border-collapse:collapse}.cax-datepicker td>span{display:flex;justify-content:center;align-items:center;cursor:pointer;margin:0 auto;overflow:hidden;position:relative}.cax-monthpicker-month{width:33.3%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-datepicker-buttonbar{display:flex;justify-content:space-between;align-items:center}.cax-timepicker{display:flex;justify-content:center;align-items:center}.cax-timepicker button{display:flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-timepicker>div{display:flex;align-items:center;flex-direction:column}.cax-datepicker-touch-ui,.cax-calendar .cax-datepicker-touch-ui{position:fixed;top:50%;left:50%;min-width:80vw;transform:translate(-50%,-50%)}.cax-yearpicker-year{width:50%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-calendar-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-datepicker-icon{pointer-events:none}.cax-calendar-clearable{position:relative}.cax-datepicker-icon{pointer-events:none;left:1.67px;margin-top:1px!important}.cax-input-icon-left{order:-1}.cax-datepicker-inline-actions{display:flex;justify-content:space-between;margin-top:13px;padding:10px}.cax-datepicker-inline-actions .cax-datepicker-inline-input{margin-bottom:10px;position:relative;display:inline-block}.cax-datepicker-inline-actions .cax-datepicker-inline-input input{width:130px;height:32px;padding-left:2rem;border-radius:8px;font-size:14px;font-weight:500}.cax-datepicker-inline-actions .cax-datepicker-inline-input .cax-calendar-minimalistic{position:absolute;left:.6rem;top:50%;transform:translateY(-50%);font-size:1rem;pointer-events:none}.left-side{display:flex;justify-content:space-between;gap:15px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[caxButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "link"] }, { kind: "component", type: i3.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SharedModule }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i4.Ripple, selector: "[caxRipple]" }, { kind: "component", type: ChevronLeftIcon, selector: "ChevronLeftIcon" }, { kind: "component", type: ChevronRightIcon, selector: "ChevronRightIcon" }, { kind: "component", type: ChevronUpIcon, selector: "ChevronUpIcon" }, { kind: "component", type: ChevronDownIcon, selector: "ChevronDownIcon" }, { kind: "component", type: TimesIcon, selector: "TimesIcon" }, { kind: "ngmodule", type: AutoFocusModule }, { kind: "directive", type: i5.AutoFocus, selector: "[caxAutoFocus]", inputs: ["autofocus"] }], animations: [
2987
+ trigger('overlayAnimation', [
2988
+ state('visibleTouchUI', style({
2989
+ transform: 'translate(-50%,-50%)',
2990
+ opacity: 1
2991
+ })),
2992
+ transition('void => visible', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('{{showTransitionParams}}', style({ opacity: 1, transform: '*' }))]),
2993
+ transition('visible => void', [animate('{{hideTransitionParams}}', style({ opacity: 0 }))]),
2994
+ transition('void => visibleTouchUI', [style({ opacity: 0, transform: 'translate3d(-50%, -40%, 0) scale(0.9)' }), animate('{{showTransitionParams}}')]),
2995
+ transition('visibleTouchUI => void', [
2996
+ animate('{{hideTransitionParams}}', style({
2997
+ opacity: 0,
2998
+ transform: 'translate3d(-50%, -40%, 0) scale(0.9)'
2999
+ }))
3000
+ ])
3001
+ ])
3002
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3003
+ }
3004
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: Calendar, decorators: [{
3005
+ type: Component,
3006
+ args: [{ selector: 'cax-calendar', animations: [
3007
+ trigger('overlayAnimation', [
3008
+ state('visibleTouchUI', style({
3009
+ transform: 'translate(-50%,-50%)',
3010
+ opacity: 1
3011
+ })),
3012
+ transition('void => visible', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('{{showTransitionParams}}', style({ opacity: 1, transform: '*' }))]),
3013
+ transition('visible => void', [animate('{{hideTransitionParams}}', style({ opacity: 0 }))]),
3014
+ transition('void => visibleTouchUI', [style({ opacity: 0, transform: 'translate3d(-50%, -40%, 0) scale(0.9)' }), animate('{{showTransitionParams}}')]),
3015
+ transition('visibleTouchUI => void', [
3016
+ animate('{{hideTransitionParams}}', style({
3017
+ opacity: 0,
3018
+ transform: 'translate3d(-50%, -40%, 0) scale(0.9)'
3019
+ }))
3020
+ ])
3021
+ ])
3022
+ ], host: {
3023
+ class: 'cax-element cax-inputwrapper',
3024
+ '[class.cax-inputwrapper-filled]': 'filled',
3025
+ '[class.cax-inputwrapper-focus]': 'focus',
3026
+ '[class.cax-calendar-clearable]': 'showClear && !disabled'
3027
+ }, providers: [CALENDAR_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, ButtonModule, SharedModule, RippleModule, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronDownIcon, TimesIcon, CalendarIcon, AutoFocusModule, ArrowDownIcon], template: "<div [ngClass]=\"{'cax-calendar-main-label': labelText}\">\r\n <label *ngIf=\"labelText\" [ngClass]=\"labelTextClass\">{{ labelText }}</label>\r\n</div>\r\n<span\r\n #container\r\n [ngClass]=\"{\r\n 'cax-calendar': true,\r\n 'cax-input-icon-left': showIcon && iconDisplay === 'input' && leftIcon,\r\n 'cax-input-icon-right': showIcon && iconDisplay === 'input',\r\n 'cax-calendar-w-btn': showIcon && iconDisplay === 'button',\r\n 'cax-calendar-timeonly': timeOnly,\r\n 'cax-calendar-disabled': disabled,\r\n 'cax-focus': focus || overlayVisible\r\n }\"\r\n [ngStyle]=\"style\"\r\n [class]=\"styleClass\"\r\n>\r\n <ng-template [ngIf]=\"!inline\">\r\n <input\r\n #inputfield\r\n type=\"text\"\r\n role=\"combobox\"\r\n [attr.id]=\"inputId\"\r\n [attr.name]=\"name\"\r\n [attr.required]=\"required\"\r\n [attr.aria-required]=\"required\"\r\n aria-autocomplete=\"none\"\r\n aria-haspopup=\"dialog\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? panelId : null\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [value]=\"inputFieldValue\"\r\n (focus)=\"onInputFocus($event)\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n (click)=\"onInputClick()\"\r\n (blur)=\"onInputBlur($event)\"\r\n [readonly]=\"readonlyInput\"\r\n (input)=\"onUserInput($event)\"\r\n [ngStyle]=\"inputStyle\"\r\n [class]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder || ''\"\r\n [disabled]=\"disabled\"\r\n [attr.tabindex]=\"tabindex\"\r\n [attr.inputmode]=\"touchUI ? 'off' : null\"\r\n [ngClass]=\"inputClass\"\r\n autocomplete=\"off\"\r\n caxAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n <ng-container *ngIf=\"showClear && !disabled && value != null\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-calendar-clear-icon'\" (click)=\"clear()\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-calendar-clear-icon\" (click)=\"clear()\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n [attr.aria-label]=\"iconButtonAriaLabel\"\r\n aria-haspopup=\"dialog\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? panelId : null\"\r\n caxButton\r\n caxRipple\r\n *ngIf=\"showIcon && iconDisplay === 'button'\"\r\n (click)=\"onButtonClick($event, inputfield)\"\r\n class=\"cax-datepicker-trigger cax-button-icon-only\"\r\n [disabled]=\"disabled\"\r\n tabindex=\"0\"\r\n >\r\n <span *ngIf=\"icon\" [ngClass]=\"icon\"></span>\r\n <ng-container *ngIf=\"!icon\">\r\n <i class=\"cax cax-calendar-icon\" *ngIf=\"!triggerIconTemplate\" ></i>\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </ng-container>\r\n </button>\r\n <ng-container *ngIf=\"iconDisplay === 'input' && showIcon\">\r\n <i class=\"cax cax-calendar-icon\"\r\n (click)=\"onButtonClick($event)\"\r\n *ngIf=\"!inputIconTemplate\"\r\n [ngClass]=\"{\r\n 'cax-datepicker-icon': showOnFocus\r\n }\"\r\n ></i>\r\n <ng-container *ngTemplateOutlet=\"inputIconTemplate; context: { clickCallBack: onButtonClick.bind(this) }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-container *ngIf=\"iconDisplay === 'input' && showIcon\">\r\n <i class=\"cax cax-alt-arrow-down cax-downarrow\"></i>\r\n </ng-container>\r\n \r\n <div\r\n #contentWrapper\r\n [attr.id]=\"panelId\"\r\n [class]=\"panelStyleClass\"\r\n [ngStyle]=\"panelStyle\"\r\n [ngClass]=\"{\r\n 'cax-datepicker cax-component': true,\r\n 'cax-datepicker-inline': inline,\r\n 'cax-disabled': disabled,\r\n 'cax-datepicker-timeonly': timeOnly,\r\n 'cax-datepicker-multiple-month': this.numberOfMonths > 1,\r\n 'cax-datepicker-monthpicker': view === 'month',\r\n 'cax-datepicker-touch-ui': touchUI\r\n }\"\r\n [@overlayAnimation]=\"\r\n touchUI\r\n ? { value: 'visibleTouchUI', params: { showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions } }\r\n : { value: 'visible', params: { showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions } }\r\n \"\r\n [attr.aria-label]=\"getTranslation('chooseDate')\"\r\n [attr.role]=\"inline ? null : 'dialog'\"\r\n [attr.aria-modal]=\"inline ? null : 'true'\"\r\n [@.disabled]=\"inline === true\"\r\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\r\n (@overlayAnimation.done)=\"onOverlayAnimationDone($event)\"\r\n (click)=\"onOverlayClick($event)\"\r\n *ngIf=\"inline || overlayVisible\"\r\n >\r\n <ng-content select=\"cax-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n <ng-container *ngIf=\"!timeOnly\">\r\n <div class=\"cax-datepicker-group-container\">\r\n <div class=\"cax-datepicker-group\" *ngFor=\"let month of months; let i = index\">\r\n <div class=\"cax-datepicker-header\">\r\n <button (keydown)=\"onContainerButtonKeydown($event)\" class=\"cax-datepicker-prev cax-link\" (click)=\"onPrevButtonClick($event)\" *ngIf=\"i === 0\" type=\"button\" [attr.aria-label]=\"prevIconAriaLabel\" caxRipple>\r\n <ChevronLeftIcon [styleClass]=\"'cax-datepicker-prev-icon'\" *ngIf=\"!previousIconTemplate\" />\r\n <span *ngIf=\"previousIconTemplate\" class=\"cax-datepicker-prev-icon\">\r\n <ng-template *ngTemplateOutlet=\"previousIconTemplate\"></ng-template>\r\n </span>\r\n </button>\r\n <div class=\"cax-datepicker-title\">\r\n <button\r\n type=\"button\"\r\n (click)=\"switchToMonthView($event)\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n *ngIf=\"currentView === 'date'\"\r\n class=\"cax-datepicker-month cax-link\"\r\n [disabled]=\"switchViewButtonDisabled()\"\r\n [attr.aria-label]=\"this.getTranslation('chooseMonth')\"\r\n >\r\n {{ getMonthName(month.month) }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"switchToYearView($event)\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n *ngIf=\"currentView !== 'year'\"\r\n class=\"cax-datepicker-year cax-link\"\r\n [disabled]=\"switchViewButtonDisabled()\"\r\n [attr.aria-label]=\"getTranslation('chooseYear')\"\r\n >\r\n {{ getYear(month) }}\r\n </button>\r\n <span class=\"cax-datepicker-decade\" *ngIf=\"currentView === 'year'\">\r\n Year\r\n <!-- <ng-container *ngIf=\"!decadeTemplate\">{{ yearPickerValues()[0] }} - {{ yearPickerValues()[yearPickerValues().length - 1] }}</ng-container>\r\n <ng-container *ngTemplateOutlet=\"decadeTemplate; context: { $implicit: yearPickerValues }\"></ng-container> -->\r\n </span>\r\n </div>\r\n <button\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n class=\"cax-datepicker-next cax-link\"\r\n (click)=\"onNextButtonClick($event)\"\r\n [style.display]=\"numberOfMonths === 1 ? 'inline-flex' : i === numberOfMonths - 1 ? 'inline-flex' : 'none'\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextIconAriaLabel\"\r\n caxRipple\r\n >\r\n <ChevronRightIcon [styleClass]=\"'cax-datepicker-next-icon'\" *ngIf=\"!nextIconTemplate\" />\r\n <span *ngIf=\"nextIconTemplate\" class=\"cax-datepicker-next-icon\">\r\n <ng-template *ngTemplateOutlet=\"nextIconTemplate\"></ng-template>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cax-datepicker-calendar-container\" *ngIf=\"currentView === 'date'\">\r\n <table class=\"cax-datepicker-calendar\" role=\"grid\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"showWeek\" class=\"cax-datepicker-weekheader cax-disabled\">\r\n <span>{{ getTranslation('weekHeader') }}</span>\r\n </th>\r\n <th scope=\"col\" *ngFor=\"let weekDay of weekDays; let begin = first; let end = last\">\r\n <span>{{ weekDay }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of month.dates; let j = index\">\r\n <td *ngIf=\"showWeek\" class=\"cax-datepicker-weeknumber\">\r\n <span class=\"cax-disabled\"> {{ month.weekNumbers[j] }} </span>\r\n </td>\r\n <td *ngFor=\"let date of week\" [attr.aria-label]=\"date.day\" [ngClass]=\"{ 'cax-datepicker-other-month': date.otherMonth, 'cax-datepicker-today': date.today }\">\r\n <ng-container *ngIf=\"date.otherMonth ? showOtherMonths : true\">\r\n <span\r\n [ngClass]=\"{ 'cax-highlight cax-datepicker-current-day': isSelected(date) && date.selectable, 'cax-disabled': !date.selectable }\"\r\n (click)=\"onDateSelect($event, date)\"\r\n draggable=\"false\"\r\n [attr.data-date]=\"formatDateKey(formatDateMetaToDate(date))\"\r\n (keydown)=\"onDateCellKeydown($event, date, i)\"\r\n caxRipple\r\n >\r\n <ng-container *ngIf=\"!dateTemplate && (date.selectable || !disabledDateTemplate)\">{{ date.day }}</ng-container>\r\n <ng-container *ngIf=\"date.selectable || !disabledDateTemplate\">\r\n <ng-container *ngTemplateOutlet=\"dateTemplate; context: { $implicit: date }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!date.selectable\">\r\n <ng-container *ngTemplateOutlet=\"disabledDateTemplate; context: { $implicit: date }\"></ng-container>\r\n </ng-container>\r\n </span>\r\n <div *ngIf=\"isSelected(date)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ date.day }}</div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cax-monthpicker\" *ngIf=\"currentView === 'month'\">\r\n <span\r\n *ngFor=\"let m of monthPickerValues(); let i = index\"\r\n (click)=\"onMonthSelect($event, i)\"\r\n (keydown)=\"onMonthCellKeydown($event, i)\"\r\n class=\"cax-monthpicker-month\"\r\n [ngClass]=\"{ 'cax-highlight': isMonthSelected(i), 'cax-disabled': isMonthDisabled(i) }\"\r\n caxRipple\r\n >\r\n {{ m }}\r\n <div *ngIf=\"isMonthSelected(i)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ m }}</div>\r\n </span>\r\n </div>\r\n <div class=\"cax-yearpicker\" *ngIf=\"currentView === 'year'\">\r\n <span\r\n *ngFor=\"let y of yearPickerValues()\"\r\n (click)=\"onYearSelect($event, y)\"\r\n (keydown)=\"onYearCellKeydown($event, y)\"\r\n class=\"cax-yearpicker-year\"\r\n [ngClass]=\"{ 'cax-highlight': isYearSelected(y), 'cax-disabled': isYearDisabled(y) }\"\r\n caxRipple\r\n >\r\n {{ y }}\r\n <div *ngIf=\"isYearSelected(y)\" class=\"cax-hidden-accessible\" aria-live=\"polite\">{{ y }}</div>\r\n </span>\r\n </div>\r\n </ng-container>\r\n <div class=\"cax-timepicker\" *ngIf=\"(showTime || timeOnly) && currentView === 'date'\">\r\n <div class=\"cax-hour-picker\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementHour($event)\"\r\n (keydown.space)=\"incrementHour($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 0, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextHour')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentHour < 10\">0</ng-container>{{ currentHour }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementHour($event)\"\r\n (keydown.space)=\"decrementHour($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 0, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevHour')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-separator\">\r\n <span>{{ timeSeparator }}</span>\r\n </div>\r\n <div class=\"cax-minute-picker\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementMinute($event)\"\r\n (keydown.space)=\"incrementMinute($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 1, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextMinute')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentMinute < 10\">0</ng-container>{{ currentMinute }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementMinute($event)\"\r\n (keydown.space)=\"decrementMinute($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 1, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevMinute')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-separator\" *ngIf=\"showSeconds\">\r\n <span>{{ timeSeparator }}</span>\r\n </div>\r\n <div class=\"cax-second-picker\" *ngIf=\"showSeconds\">\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"incrementSecond($event)\"\r\n (keydown.space)=\"incrementSecond($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 2, 1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('nextSecond')\"\r\n caxRipple\r\n >\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span><ng-container *ngIf=\"currentSecond < 10\">0</ng-container>{{ currentSecond }}</span>\r\n <button\r\n class=\"cax-link\"\r\n type=\"button\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (keydown.enter)=\"decrementSecond($event)\"\r\n (keydown.space)=\"decrementSecond($event)\"\r\n (mousedown)=\"onTimePickerElementMouseDown($event, 2, -1)\"\r\n (mouseup)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.enter)=\"onTimePickerElementMouseUp($event)\"\r\n (keyup.space)=\"onTimePickerElementMouseUp($event)\"\r\n (mouseleave)=\"onTimePickerElementMouseLeave()\"\r\n [attr.aria-label]=\"getTranslation('prevSecond')\"\r\n caxRipple\r\n >\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n <div class=\"cax-ampm-picker\" *ngIf=\"hourFormat == '12'\">\r\n <button class=\"cax-link\" type=\"button\" (keydown)=\"onContainerButtonKeydown($event)\" (click)=\"toggleAMPM($event)\" (keydown.enter)=\"toggleAMPM($event)\" [attr.aria-label]=\"getTranslation('am')\" caxRipple>\r\n <ChevronUpIcon *ngIf=\"!incrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"incrementIconTemplate\"></ng-template>\r\n </button>\r\n <span>{{ pm ? 'PM' : 'AM' }}</span>\r\n <button class=\"cax-link\" type=\"button\" (keydown)=\"onContainerButtonKeydown($event)\" (click)=\"toggleAMPM($event)\" (keydown.enter)=\"toggleAMPM($event)\" [attr.aria-label]=\"getTranslation('pm')\" caxRipple>\r\n <ChevronDownIcon *ngIf=\"!decrementIconTemplate\" />\r\n <ng-template *ngTemplateOutlet=\"decrementIconTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"cax-datepicker-buttonbar\" *ngIf=\"showButtonBar\">\r\n <cax-button\r\n *ngIf=\"currentView !== 'year' && currentView !== 'month'\"\r\n type=\"button\"\r\n [link]=\"true\"\r\n [label]=\"getTranslation('clear')\"\r\n (keydown)=\"onContainerButtonKeydown($event)\"\r\n (onClick)=\"onClearButtonClick($event)\"\r\n caxRipple\r\n ></cax-button>\r\n <cax-button *ngIf=\"currentView === 'year' || currentView === 'month'\" type=\"button\" [link]=\"true\" [label]=\"'Back'\" (keydown)=\"onContainerButtonKeydown($event)\" (onClick)=\"onBackButtonClick($event)\" caxRipple></cax-button>\r\n </div>\r\n <!-- For the inline -->\r\n <div class=\"cax-datepicker-inline-actions\" *ngIf=\"inline\">\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [severity]=\"'secondary'\"\r\n [size]=\"'small'\"\r\n (click)=\"onInlineCancel()\">\r\n </cax-button>\r\n <div class=\"left-side\">\r\n <div class=\"cax-datepicker-inline-input\">\r\n <i class=\"cax cax-calendar-minimalistic\"></i>\r\n <input\r\n type=\"text\"\r\n [attr.id]=\"inputId\"\r\n [value]=\"formattedInlineDate\"\r\n readonly\r\n class=\"cax-datepicker-inline-display\"\r\n />\r\n </div>\r\n <div class=\"cax-datepicker-inline-buttons\">\r\n <cax-button\r\n [label]=\"'Save'\"\r\n [severity]=\"'Primary'\"\r\n [size]=\"'small'\"\r\n (click)=\"onInlineSave()\">\r\n </cax-button>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-content select=\"cax-footer\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </div>\r\n</span>\r\n", styles: ["@layer cax{.cax-calendar{position:relative;display:inline-flex;width:100%;height:40px}.cax-calendar-main-label{font-weight:500;font-size:14px;line-height:20px;margin-bottom:8px}.cax-calendar .cax-inputtext{flex:1 1 auto;width:1%;text-overflow:ellipsis;padding-left:1.8rem!important;padding-right:1.8rem!important}.cax-calendar-w-btn .cax-inputtext{border-top-right-radius:0;border-bottom-right-radius:0}.cax-calendar-w-btn .cax-datepicker-trigger{border-top-left-radius:0;border-bottom-left-radius:0}.cax-fluid .cax-calendar{display:flex}.cax-fluid .cax-calendar .cax-inputtext{width:1%}.cax-calendar .cax-datepicker{min-width:100%}.cax-datepicker{width:auto;position:absolute;top:0;left:0}.cax-datepicker-inline{display:inline-block;position:static;overflow-x:auto}.cax-datepicker-header{display:flex;align-items:center;justify-content:space-between}.cax-datepicker-header .cax-datepicker-title{margin:0 auto}.cax-datepicker-prev,.cax-datepicker-next{cursor:pointer;display:inline-flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.cax-datepicker-multiple-month .cax-datepicker-group-container .cax-datepicker-group{flex:1 1 auto}.cax-datepicker-multiple-month .cax-datepicker-group-container{display:flex}.cax-datepicker table{width:100%;border-collapse:collapse}.cax-datepicker td>span{display:flex;justify-content:center;align-items:center;cursor:pointer;margin:0 auto;overflow:hidden;position:relative}.cax-monthpicker-month{width:33.3%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-datepicker-buttonbar{display:flex;justify-content:space-between;align-items:center}.cax-timepicker{display:flex;justify-content:center;align-items:center}.cax-timepicker button{display:flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-timepicker>div{display:flex;align-items:center;flex-direction:column}.cax-datepicker-touch-ui,.cax-calendar .cax-datepicker-touch-ui{position:fixed;top:50%;left:50%;min-width:80vw;transform:translate(-50%,-50%)}.cax-yearpicker-year{width:50%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.cax-calendar-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-datepicker-icon{pointer-events:none}.cax-calendar-clearable{position:relative}.cax-datepicker-icon{pointer-events:none;left:1.67px;margin-top:1px!important}.cax-input-icon-left{order:-1}.cax-datepicker-inline-actions{display:flex;justify-content:space-between;margin-top:13px;padding:10px}.cax-datepicker-inline-actions .cax-datepicker-inline-input{margin-bottom:10px;position:relative;display:inline-block}.cax-datepicker-inline-actions .cax-datepicker-inline-input input{width:130px;height:32px;padding-left:2rem;border-radius:8px;font-size:14px;font-weight:500}.cax-datepicker-inline-actions .cax-datepicker-inline-input .cax-calendar-minimalistic{position:absolute;left:.6rem;top:50%;transform:translateY(-50%);font-size:1rem;pointer-events:none}.left-side{display:flex;justify-content:space-between;gap:15px}}\n"] }]
3028
+ }], ctorParameters: () => [{ type: Document, decorators: [{
3029
+ type: Inject,
3030
+ args: [DOCUMENT]
3031
+ }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.caxConfig }, { type: i1.OverlayService }], propDecorators: { iconDisplay: [{
3032
+ type: Input
3033
+ }], style: [{
3034
+ type: Input
3035
+ }], styleClass: [{
3036
+ type: Input
3037
+ }], inputStyle: [{
3038
+ type: Input
3039
+ }], inputId: [{
3040
+ type: Input
3041
+ }], name: [{
3042
+ type: Input
3043
+ }], inputStyleClass: [{
3044
+ type: Input
3045
+ }], placeholder: [{
3046
+ type: Input
3047
+ }], ariaLabelledBy: [{
3048
+ type: Input
3049
+ }], ariaLabel: [{
3050
+ type: Input
3051
+ }], iconAriaLabel: [{
3052
+ type: Input
3053
+ }], disabled: [{
3054
+ type: Input,
3055
+ args: [{ transform: booleanAttribute }]
3056
+ }], dateFormat: [{
3057
+ type: Input
3058
+ }], multipleSeparator: [{
3059
+ type: Input
3060
+ }], rangeSeparator: [{
3061
+ type: Input
3062
+ }], inline: [{
3063
+ type: Input,
3064
+ args: [{ transform: booleanAttribute }]
3065
+ }], showOtherMonths: [{
3066
+ type: Input,
3067
+ args: [{ transform: booleanAttribute }]
3068
+ }], selectOtherMonths: [{
3069
+ type: Input,
3070
+ args: [{ transform: booleanAttribute }]
3071
+ }], showIcon: [{
3072
+ type: Input,
3073
+ args: [{ transform: booleanAttribute }]
3074
+ }], icon: [{
3075
+ type: Input
3076
+ }], appendTo: [{
3077
+ type: Input
3078
+ }], readonlyInput: [{
3079
+ type: Input,
3080
+ args: [{ transform: booleanAttribute }]
3081
+ }], shortYearCutoff: [{
3082
+ type: Input
3083
+ }], monthNavigator: [{
3084
+ type: Input,
3085
+ args: [{ transform: booleanAttribute }]
3086
+ }], yearNavigator: [{
3087
+ type: Input,
3088
+ args: [{ transform: booleanAttribute }]
3089
+ }], hourFormat: [{
3090
+ type: Input
3091
+ }], timeOnly: [{
3092
+ type: Input,
3093
+ args: [{ transform: booleanAttribute }]
3094
+ }], stepYearPicker: [{
3095
+ type: Input,
3096
+ args: [{ transform: numberAttribute }]
3097
+ }], stepHour: [{
3098
+ type: Input,
3099
+ args: [{ transform: numberAttribute }]
3100
+ }], stepMinute: [{
3101
+ type: Input,
3102
+ args: [{ transform: numberAttribute }]
3103
+ }], stepSecond: [{
3104
+ type: Input,
3105
+ args: [{ transform: numberAttribute }]
3106
+ }], showSeconds: [{
3107
+ type: Input,
3108
+ args: [{ transform: booleanAttribute }]
3109
+ }], required: [{
3110
+ type: Input,
3111
+ args: [{ transform: booleanAttribute }]
3112
+ }], showOnFocus: [{
3113
+ type: Input,
3114
+ args: [{ transform: booleanAttribute }]
3115
+ }], showWeek: [{
3116
+ type: Input,
3117
+ args: [{ transform: booleanAttribute }]
3118
+ }], startWeekFromFirstDayOfYear: [{
3119
+ type: Input
3120
+ }], showClear: [{
3121
+ type: Input,
3122
+ args: [{ transform: booleanAttribute }]
3123
+ }], dataType: [{
3124
+ type: Input
3125
+ }], selectionMode: [{
3126
+ type: Input
3127
+ }], maxDateCount: [{
3128
+ type: Input,
3129
+ args: [{ transform: numberAttribute }]
3130
+ }], showButtonBar: [{
3131
+ type: Input,
3132
+ args: [{ transform: booleanAttribute }]
3133
+ }], todayButtonStyleClass: [{
3134
+ type: Input
3135
+ }], clearButtonStyleClass: [{
3136
+ type: Input
3137
+ }], autofocus: [{
3138
+ type: Input,
3139
+ args: [{ transform: booleanAttribute }]
3140
+ }], autoZIndex: [{
3141
+ type: Input,
3142
+ args: [{ transform: booleanAttribute }]
3143
+ }], baseZIndex: [{
3144
+ type: Input,
3145
+ args: [{ transform: numberAttribute }]
3146
+ }], panelStyleClass: [{
3147
+ type: Input
3148
+ }], panelStyle: [{
3149
+ type: Input
3150
+ }], keepInvalid: [{
3151
+ type: Input,
3152
+ args: [{ transform: booleanAttribute }]
3153
+ }], hideOnDateTimeSelect: [{
3154
+ type: Input,
3155
+ args: [{ transform: booleanAttribute }]
3156
+ }], touchUI: [{
3157
+ type: Input,
3158
+ args: [{ transform: booleanAttribute }]
3159
+ }], labelText: [{
3160
+ type: Input
3161
+ }], timeSeparator: [{
3162
+ type: Input
3163
+ }], leftIcon: [{
3164
+ type: Input
3165
+ }], focusTrap: [{
3166
+ type: Input,
3167
+ args: [{ transform: booleanAttribute }]
3168
+ }], showTransitionOptions: [{
3169
+ type: Input
3170
+ }], hideTransitionOptions: [{
3171
+ type: Input
3172
+ }], tabindex: [{
3173
+ type: Input,
3174
+ args: [{ transform: numberAttribute }]
3175
+ }], variant: [{
3176
+ type: Input
3177
+ }], minDate: [{
3178
+ type: Input
3179
+ }], maxDate: [{
3180
+ type: Input
3181
+ }], disabledDates: [{
3182
+ type: Input
3183
+ }], disabledDays: [{
3184
+ type: Input
3185
+ }], yearRange: [{
3186
+ type: Input
3187
+ }], showTime: [{
3188
+ type: Input
3189
+ }], responsiveOptions: [{
3190
+ type: Input
3191
+ }], numberOfMonths: [{
3192
+ type: Input
3193
+ }], firstDayOfWeek: [{
3194
+ type: Input
3195
+ }], locale: [{
3196
+ type: Input
3197
+ }], view: [{
3198
+ type: Input
3199
+ }], defaultDate: [{
3200
+ type: Input
3201
+ }], onFocus: [{
3202
+ type: Output
3203
+ }], onBlur: [{
3204
+ type: Output
3205
+ }], onClose: [{
3206
+ type: Output
3207
+ }], onSelect: [{
3208
+ type: Output
3209
+ }], onClear: [{
3210
+ type: Output
3211
+ }], onInput: [{
3212
+ type: Output
3213
+ }], onTodayClick: [{
3214
+ type: Output
3215
+ }], onClearClick: [{
3216
+ type: Output
3217
+ }], onMonthChange: [{
3218
+ type: Output
3219
+ }], onYearChange: [{
3220
+ type: Output
3221
+ }], onClickOutside: [{
3222
+ type: Output
3223
+ }], onInlineSaved: [{
3224
+ type: Output
3225
+ }], onInlineCancelled: [{
3226
+ type: Output
3227
+ }], onShow: [{
3228
+ type: Output
3229
+ }], templates: [{
3230
+ type: ContentChildren,
3231
+ args: [CaxTemplate]
3232
+ }], containerViewChild: [{
3233
+ type: ViewChild,
3234
+ args: ['container', { static: false }]
3235
+ }], inputfieldViewChild: [{
3236
+ type: ViewChild,
3237
+ args: ['inputfield', { static: false }]
3238
+ }], content: [{
3239
+ type: ViewChild,
3240
+ args: ['contentWrapper', { static: false }]
3241
+ }] } });
3242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIudHMiLCIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFrQixLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLGVBQWUsRUFHZixNQUFNLEVBSU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUE2QixXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8s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Y0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFVO1FBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVELFNBQVMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkQsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBVTtRQUN0QixJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDMUQsU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4RCxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFVO1FBQ3RCLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMxRCxTQUFTLEdB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RUcsbUJBQW1CO3NCQUE5RCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRVUsT0FBTztzQkFBMUQsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBudW1iZXJBdHRyaWJ1dGUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSwgY2F4Q29uZmlnLCBDYXhUZW1wbGF0ZSwgU2hhcmVkTW9kdWxlLCBUcmFuc2xhdGlvbktleXMgfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9hcGknO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vYnV0dG9uJztcbmltcG9ydCB7IENvbm5lY3RlZE92ZXJsYXlTY3JvbGxIYW5kbGVyLCBEb21IYW5kbGVyIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vZG9tJztcbmltcG9ydCB7IFJpcHBsZU1vZHVsZSB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL3JpcHBsZSc7XG5pbXBvcnQgeyBPYmplY3RVdGlscywgVW5pcXVlQ29tcG9uZW50SWQsIFpJbmRleFV0aWxzIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vdXRpbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uTGVmdEljb24gfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9pY29ucy9jaGV2cm9ubGVmdCc7XG5pbXBvcnQgeyBDaGV2cm9uUmlnaHRJY29uIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vaWNvbnMvY2hldnJvbnJpZ2h0JztcbmltcG9ydCB7IENoZXZyb25VcEljb24gfSBmcm9tICdjYXgtZGVzaWduLXN5c3RlbS9pY29ucy9jaGV2cm9udXAnO1xuaW1wb3J0IHsgQ2hldnJvbkRvd25JY29uIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vaWNvbnMvY2hldnJvbmRvd24nO1xuaW1wb3J0IHsgVGltZXNJY29uIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vaWNvbnMvdGltZXMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJJY29uIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vaWNvbnMvY2FsZW5kYXInO1xuaW1wb3J0IHsgQXJyb3dEb3duSWNvbiB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2ljb25zL2Fycm93ZG93bic7XG5pbXBvcnQgeyBOdWxsYWJsZSwgVm9pZExpc3RlbmVyIH0gZnJvbSAnY2F4LWRlc2lnbi1zeXN0ZW0vdHMtaGVscGVycyc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoQ2hhbmdlRXZlbnQsIENhbGVuZGFyUmVzcG9uc2l2ZU9wdGlvbnMsIENhbGVuZGFyVHlwZVZpZXcsIENhbGVuZGFyWWVhckNoYW5nZUV2ZW50LCBMb2NhbGVTZXR0aW5ncywgTW9udGgsIE5hdmlnYXRpb25TdGF0ZSB9IGZyb20gJy4vY2FsZW5kYXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9Gb2N1c01vZHVsZSB9IGZyb20gJ2NheC1kZXNpZ24tc3lzdGVtL2F1dG9mb2N1cyc7XG5cbmV4cG9ydCBjb25zdCBDQUxFTkRBUl9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhbGVuZGFyKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcbi8qKlxuICogQ2FsZW5kYXIgYWxzbyBrbm93biBhcyBEYXRlUGlja2VyLCBpcyBhIGZvcm0gY29tcG9uZW50IHRvIHdvcmsgd2l0aCBkYXRlcy5cbiAqIEBncm91cCBDb21wb25lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY2F4LWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuaHRtbCcsXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdvdmVybGF5QW5pbWF0aW9uJywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ3Zpc2libGVUb3VjaFVJJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyxcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiB2aXNpYmxlJywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknIH0pLCBhbmltYXRlKCd7e3Nob3dUcmFuc2l0aW9uUGFyYW1zfX0nLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJyonIH0pKV0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiB2b2lkJywgW2FuaW1hdGUoJ3t7aGlkZVRyYW5zaXRpb25QYXJhbXN9fScsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gdmlzaWJsZVRvdWNoVUknLCBbc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNDAlLCAwKSBzY2FsZSgwLjkpJyB9KSwgYW5pbWF0ZSgne3tzaG93VHJhbnNpdGlvblBhcmFtc319JyldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGVUb3VjaFVJID0+IHZvaWQnLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAgJ3t7aGlkZVRyYW5zaXRpb25QYXJhbXN9fScsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNDAlLCAwKSBzY2FsZSgwLjkpJ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pXG4gICAgICAgIF0pXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnY2F4LWVsZW1lbnQgY2F4LWlucHV0d3JhcHBlcicsXG4gICAgICAgICdbY2xhc3MuY2F4LWlucHV0d3JhcHBlci1maWxsZWRdJzogJ2ZpbGxlZCcsXG4gICAgICAgICdbY2xhc3MuY2F4LWlucHV0d3JhcHBlci1mb2N1c10nOiAnZm9jdXMnLFxuICAgICAgICAnW2NsYXNzLmNheC1jYWxlbmRhci1jbGVhcmFibGVdJzogJ3Nob3dDbGVhciAmJiAhZGlzYWJsZWQnXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtDQUxFTkRBUl9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBCdXR0b25Nb2R1bGUsIFNoYXJlZE1vZHVsZSwgUmlwcGxlTW9kdWxlLCBDaGV2cm9uTGVmdEljb24sIENoZXZyb25SaWdodEljb24sIENoZXZyb25VcEljb24sIENoZXZyb25Eb3duSWNvbiwgVGltZXNJY29uLCBDYWxlbmRhckljb24sIEF1dG9Gb2N1c01vZHVsZSwgQXJyb3dEb3duSWNvbl1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIGljb25EaXNwbGF5OiAnaW5wdXQnIHwgJ2J1dHRvbicgPSAnYnV0dG9uJztcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgc3R5bGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBzdHlsZTogeyBba2xhc3M6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBTdHlsZSBjbGFzcyBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHN0eWxlQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgc3R5bGUgb2YgdGhlIGlucHV0IGZpZWxkLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGlucHV0U3R5bGU6IHsgW2tsYXNzOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgZm9jdXMgaW5wdXQgdG8gbWF0Y2ggYSBsYWJlbCBkZWZpbmVkIGZvciB0aGUgY29tcG9uZW50LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGlucHV0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBTdHlsZSBjbGFzcyBvZiB0aGUgaW5wdXQgZmllbGQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgaW5wdXRTdHlsZUNsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogRXN0YWJsaXNoZXMgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBjb21wb25lbnQgYW5kIGxhYmVsKHMpIHdoZXJlIGl0cyB2YWx1ZSBzaG91bGQgYmUgb25lIG9yIG1vcmUgZWxlbWVudCBJRHMuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgYXJpYUxhYmVsbGVkQnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgc3RyaW5nIHRoYXQgbGFiZWxzIHRoZSBpbnB1dCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBhcmlhTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBzdHJpbmcgdGhhdCBsYWJlbHMgdGhlIGljb24gYnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGljb25BcmlhTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHNwZWNpZmllZCwgZGlzYWJsZXMgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogRm9ybWF0IG9mIHRoZSBkYXRlIHdoaWNoIGNhbiBhbHNvIGJlIGRlZmluZWQgYXQgbG9jYWxlIHNldHRpbmdzLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGRhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBTZXBhcmF0b3IgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIG11bHRpcGxlU2VwYXJhdG9yOiBzdHJpbmcgPSAnLCc7XG4gICAgLyoqXG4gICAgICogU2VwYXJhdG9yIGZvciBqb2luaW5nIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgb24gcmFuZ2Ugc2VsZWN0aW9uIG1vZGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgcmFuZ2VTZXBhcmF0b3I6IHN0cmluZyA9ICctJztcbiAgICAvKipcbiAgICAgKiBXaGVuIGVuYWJsZWQsIGRpc3BsYXlzIHRoZSBjYWxlbmRhciBhcyBpbmxpbmUuIERlZmF1bHQgaXMgZmFsc2UgZm9yIHBvcHVwIG1vZGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlubGluZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZGlzcGxheSBkYXRlcyBpbiBvdGhlciBtb250aHMgKG5vbi1zZWxlY3RhYmxlKSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBjdXJyZW50IG1vbnRoLiBUbyBtYWtlIHRoZXNlIGRheXMgc2VsZWN0YWJsZSB1c2UgdGhlIHNlbGVjdE90aGVyTW9udGhzIG9wdGlvbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd090aGVyTW9udGhzOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGRheXMgaW4gb3RoZXIgbW9udGhzIHNob3duIGJlZm9yZSBvciBhZnRlciB0aGUgY3VycmVudCBtb250aCBhcmUgc2VsZWN0YWJsZS4gVGhpcyBvbmx5IGFwcGxpZXMgaWYgdGhlIHNob3dPdGhlck1vbnRocyBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNlbGVjdE90aGVyTW9udGhzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFdoZW4gZW5hYmxlZCwgZGlzcGxheXMgYSBidXR0b24gd2l0aCBpY29uIG5leHQgdG8gaW5wdXQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dJY29uOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIEljb24gb2YgdGhlIGNhbGVuZGFyIGJ1dHRvbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogVGFyZ2V0IGVsZW1lbnQgdG8gYXR0YWNoIHRoZSBvdmVybGF5LCB2YWxpZCB2YWx1ZXMgYXJlIFwiYm9keVwiIG9yIGEgbG9jYWwgbmctdGVtcGxhdGUgdmFyaWFibGUgb2YgYW5vdGhlciBlbGVtZW50IChub3RlOiB1c2UgYmluZGluZyB3aXRoIGJyYWNrZXRzIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMsIGUuZy4gW2FwcGVuZFRvXT1cIm15ZGl2XCIgZm9yIGEgZGl2IGVsZW1lbnQgaGF2aW5nI215ZGl2IGFzIHZhcmlhYmxlIG5hbWUpLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFwcGVuZFRvOiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYgfCBUZW1wbGF0ZVJlZjxhbnk+IHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IGFueTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHNwZWNpZmllZCwgcHJldmVudHMgZW50ZXJpbmcgdGhlIGRhdGUgbWFudWFsbHkgd2l0aCBrZXlib2FyZC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHlJbnB1dDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3V0b2ZmIHllYXIgZm9yIGRldGVybWluaW5nIHRoZSBjZW50dXJ5IGZvciBhIGRhdGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc2hvcnRZZWFyQ3V0b2ZmOiBhbnkgPSAnKzEwJztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBtb250aCBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBkcm9wZG93biBpbnN0ZWFkIG9mIHRleHQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICogQGRlcHJlY2F0ZWQgTmF2aWdhdG9yIGlzIGFsd2F5cyBvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9udGhOYXZpZ2F0b3I6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgeWVhciBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBkcm9wZG93biBpbnN0ZWFkIG9mIHRleHQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICogQGRlcHJlY2F0ZWQgIE5hdmlnYXRvciBpcyBhbHdheXMgb24uXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHllYXJOYXZpZ2F0b3I6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIDEyIG9yIDI0IGhvdXIgZm9ybWF0LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGhvdXJGb3JtYXQ6IHN0cmluZyA9ICcyNCc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBkaXNwbGF5IHRpbWVwaWNrZXIgb25seS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdGltZU9ubHk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogWWVhcnMgdG8gY2hhbmdlIHBlciBzdGVwIGluIHllYXJwaWNrZXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc3RlcFllYXJQaWNrZXI6IG51bWJlciA9IDk7XG4gICAgLyoqXG4gICAgICogSG91cnMgdG8gY2hhbmdlIHBlciBzdGVwLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHN0ZXBIb3VyOiBudW1iZXIgPSAxO1xuICAgIC8qKlxuICAgICAqIE1pbnV0ZXMgdG8gY2hhbmdlIHBlciBzdGVwLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHN0ZXBNaW51dGU6IG51bWJlciA9IDE7XG4gICAgLyoqXG4gICAgICogU2Vjb25kcyB0byBjaGFuZ2UgcGVyIHN0ZXAuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc3RlcFNlY29uZDogbnVtYmVyID0gMTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHNlY29uZHMgaW4gdGltZSBwaWNrZXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dTZWNvbmRzOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hlbiBwcmVzZW50LCBpdCBzcGVjaWZpZXMgdGhhdCBhbiBpbnB1dCBmaWVsZCBtdXN0IGJlIGZpbGxlZCBvdXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIGZvcm0uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFdoZW4gZGlzYWJsZWQsIGRhdGVwaWNrZXIgd2lsbCBub3QgYmUgdmlzaWJsZSB3aXRoIGlucHV0IGZvY3VzLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93T25Gb2N1czogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBjYWxlbmRhciB3aWxsIHNob3cgd2VlayBudW1iZXJzLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93V2VlazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFdoZW4gZW5hYmxlZCwgY2FsZW5kYXIgd2lsbCBzdGFydCB3ZWVrIG51bWJlcnMgZnJvbSBmaXJzdCBkYXkgb2YgdGhlIHllYXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc3RhcnRXZWVrRnJvbUZpcnN0RGF5T2ZZZWFyOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBhIGNsZWFyIGljb24gaXMgZGlzcGxheWVkIHRvIGNsZWFyIHRoZSB2YWx1ZS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgdmFsdWUgdG8gd3JpdGUgYmFjayB0byBuZ01vZGVsLCBkZWZhdWx0IGlzIGRhdGUgYW5kIGFsdGVybmF0aXZlIGlzIHN0cmluZy5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkYXRhVHlwZTogc3RyaW5nID0gJ2RhdGUnO1xuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHF1YW50aXR5IG9mIHRoZSBzZWxlY3Rpb24sIHZhbGlkIHZhbHVlcyBhcmUgXCJzaW5nbGVcIiwgXCJtdWx0aXBsZVwiIGFuZCBcInJhbmdlXCIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScgfCAnbXVsdGlwbGUnIHwgJ3JhbmdlJyB8IHVuZGVmaW5lZCA9ICdzaW5nbGUnO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgZGF0ZXMgaW4gbXVsdGlwbGUgbW9kZS5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBtYXhEYXRlQ291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgdG9kYXkgYW5kIGNsZWFyIGJ1dHRvbnMgYXQgdGhlIGZvb3RlclxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QnV0dG9uQmFyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFN0eWxlIGNsYXNzIG9mIHRoZSB0b2RheSBidXR0b24uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgdG9kYXlCdXR0b25TdHlsZUNsYXNzOiBzdHJpbmcgPSAnY2F4LWJ1dHRvbi10ZXh0JztcbiAgICAvKipcbiAgICAgKiBTdHlsZSBjbGFzcyBvZiB0aGUgY2xlYXIgYnV0dG9uLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGNsZWFyQnV0dG9uU3R5bGVDbGFzczogc3RyaW5nID0gJ2NheC1idXR0b24tdGV4dCc7XG4gICAgLyoqXG4gICAgICogV2hlbiBwcmVzZW50LCBpdCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tcG9uZW50IHNob3VsZCBhdXRvbWF0aWNhbGx5IGdldCBmb2N1cyBvbiBsb2FkLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvZm9jdXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IG1hbmFnZSBsYXllcmluZy5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b1pJbmRleDogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQmFzZSB6SW5kZXggdmFsdWUgdG8gdXNlIGluIGxheWVyaW5nLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGJhc2VaSW5kZXg6IG51bWJlciA9IDA7XG4gICAgLyoqXG4gICAgICogU3R5bGUgY2xhc3Mgb2YgdGhlIGRhdGV0aW1lcGlja2VyIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhbmVsU3R5bGVDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIElubGluZSBzdHlsZSBvZiB0aGUgZGF0ZXRpbWVwaWNrZXIgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgcGFuZWxTdHlsZTogYW55O1xuICAgIC8qKlxuICAgICAqIEtlZXAgaW52YWxpZCB2YWx1ZSB3aGVuIGlucHV0IGJsdXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGtlZXBJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIHRoZSBvdmVybGF5IG9uIGRhdGUgc2VsZWN0aW9uLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBoaWRlT25EYXRlVGltZVNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBjYWxlbmRhciBvdmVybGF5IGlzIGRpc3BsYXllZCBhcyBvcHRpbWl6ZWQgZm9yIHRvdWNoIGRldmljZXMuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHRvdWNoVUk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogU2VwYXJhdG9yIG9mIHRpbWUgc2VsZWN0b3IuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgbGFiZWxUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgdGltZVNlcGFyYXRvcjogc3RyaW5nID0gJzonO1xuICAgIEBJbnB1dCgpIGxlZnRJY29uOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvL0BJbnB1dCgpIHJpZ2h0SWNvbjogYm9vbGVhbj0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBjYW4gb25seSBmb2N1cyBvbiBlbGVtZW50cyBpbnNpZGUgdGhlIGNhbGVuZGFyLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmb2N1c1RyYXA6IGJvb2xlYW4gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFRyYW5zaXRpb24gb3B0aW9ucyBvZiB0aGUgc2hvdyBhbmltYXRpb24uXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgc2hvd1RyYW5zaXRpb25PcHRpb25zOiBzdHJpbmcgPSAnLjEycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSc7XG4gICAgLyoqXG4gICAgICogVHJhbnNpdGlvbiBvcHRpb25zIG9mIHRoZSBoaWRlIGFuaW1hdGlvbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoaWRlVHJhbnNpdGlvbk9wdGlvbnM6IHN0cmluZyA9ICcuMXMgbGluZWFyJztcbiAgICAvKipcbiAgICAgKiBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0YWJiaW5nIG9yZGVyLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBpbnB1dCB2YXJpYW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgdmFyaWFudDogJ2ZpbGxlZCcgfCAnb3V0bGluZWQnID0gJ291dGxpbmVkJztcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IG1pbkRhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG4gICAgc2V0IG1pbkRhdGUoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWluRGF0ZSA9IGRhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoICE9IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRNb250aCAhPSBudWxsICYmIHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBzZWxlY3RhYmxlIGRhdGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IG1heERhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgICB9XG4gICAgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IGRhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoICE9IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRNb250aCAhPSBudWxsICYmIHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcnJheSB3aXRoIGRhdGVzIHRoYXQgc2hvdWxkIGJlIGRpc2FibGVkIChub3Qgc2VsZWN0YWJsZSkuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IGRpc2FibGVkRGF0ZXMoKTogRGF0ZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRGF0ZXM7XG4gICAgfVxuICAgIHNldCBkaXNhYmxlZERhdGVzKGRpc2FibGVkRGF0ZXM6IERhdGVbXSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZERhdGVzID0gZGlzYWJsZWREYXRlcztcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoICE9IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRNb250aCAhPSBudWxsICYmIHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcnJheSB3aXRoIHdlZWtkYXkgbnVtYmVycyB0aGF0IHNob3VsZCBiZSBkaXNhYmxlZCAobm90IHNlbGVjdGFibGUpLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBkaXNhYmxlZERheXMoKTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXlzO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWREYXlzKGRpc2FibGVkRGF5czogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWREYXlzID0gZGlzYWJsZWREYXlzO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCAhPSB1bmRlZmluZWQgJiYgdGhpcy5jdXJyZW50TW9udGggIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRZZWFyKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vbnRocyh0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50WWVhcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJhbmdlIG9mIHllYXJzIGRpc3BsYXllZCBpbiB0aGUgeWVhciBkcm9wLWRvd24gaW4gKG5ubm46bm5ubikgZm9ybWF0IHN1Y2ggYXMgKDIwMDA6MjAyMCkuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICogQGRlcHJlY2F0ZWQgWWVhcnMgYXJlIGJhc2VkIG9uIGRlY2FkZXMgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgeWVhclJhbmdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl95ZWFyUmFuZ2U7XG4gICAgfVxuICAgIHNldCB5ZWFyUmFuZ2UoeWVhclJhbmdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5feWVhclJhbmdlID0geWVhclJhbmdlO1xuXG4gICAgICAgIGlmICh5ZWFyUmFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzID0geWVhclJhbmdlLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICBjb25zdCB5ZWFyU3RhcnQgPSBwYXJzZUludCh5ZWFyc1swXSk7XG4gICAgICAgICAgICBjb25zdCB5ZWFyRW5kID0gcGFyc2VJbnQoeWVhcnNbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlWWVhck9wdGlvbnMoeWVhclN0YXJ0LCB5ZWFyRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgdGltZXBpY2tlci5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgc2hvd1RpbWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93VGltZTtcbiAgICB9XG4gICAgc2V0IHNob3dUaW1lKHNob3dUaW1lOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dUaW1lID0gc2hvd1RpbWU7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEhvdXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbml0VGltZSh0aGlzLnZhbHVlIHx8IG5ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRmaWVsZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvcHRpb25zIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgcmVzcG9uc2l2ZU9wdGlvbnMoKTogQ2FsZW5kYXJSZXNwb25zaXZlT3B0aW9uc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNpdmVPcHRpb25zO1xuICAgIH1cbiAgICBzZXQgcmVzcG9uc2l2ZU9wdGlvbnMocmVzcG9uc2l2ZU9wdGlvbnM6IENhbGVuZGFyUmVzcG9uc2l2ZU9wdGlvbnNbXSkge1xuICAgICAgICB0aGlzLl9yZXNwb25zaXZlT3B0aW9ucyA9IHJlc3BvbnNpdmVPcHRpb25zO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveVJlc3BvbnNpdmVTdHlsZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXNwb25zaXZlU3R5bGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIG1vbnRocyB0byBkaXNwbGF5LlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBudW1iZXJPZk1vbnRocygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZNb250aHM7XG4gICAgfVxuICAgIHNldCBudW1iZXJPZk1vbnRocyhudW1iZXJPZk1vbnRoczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX251bWJlck9mTW9udGhzID0gbnVtYmVyT2ZNb250aHM7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95UmVzcG9uc2l2ZVN0eWxlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJlc3BvbnNpdmVTdHlsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBmaXJzdCBvZiB0aGUgd2VlayBmb3IgdmFyaW91cyBkYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgZmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrO1xuICAgIH1cbiAgICBzZXQgZmlyc3REYXlPZldlZWsoZmlyc3REYXlPZldlZWs6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9maXJzdERheU9mV2VlayA9IGZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlV2Vla0RheXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3B0aW9uIHRvIHNldCBjYWxlbmRhciBsb2NhbGUuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICogQGRlcHJlY2F0ZWQgTG9jYWxlIHByb3BlcnR5IGhhcyBubyBlZmZlY3QsIHVzZSBuZXcgaTE4biBBUEkgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZXQgbG9jYWxlKG5ld0xvY2FsZTogTG9jYWxlU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdMb2NhbGUgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCwgdXNlIG5ldyBpMThuIEFQSSBpbnN0ZWFkLicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHZpZXcgdG8gZGlzcGxheSwgdmFsaWQgdmFsdWVzIGFyZSBcImRhdGVcIiBmb3IgZGF0ZXBpY2tlciBhbmQgXCJtb250aFwiIGZvciBtb250aCBwaWNrZXIuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHZpZXcoKTogQ2FsZW5kYXJUeXBlVmlldyB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3O1xuICAgIH1cbiAgICBzZXQgdmlldyh2aWV3OiBDYWxlbmRhclR5cGVWaWV3KSB7XG4gICAgICAgIHRoaXMuX3ZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5fdmlldztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkYXRlIHRvIGhpZ2hsaWdodCBvbiBmaXJzdCBvcGVuaW5nIGlmIHRoZSBmaWVsZCBpcyBibGFuay5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgZGVmYXVsdERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RGF0ZTtcbiAgICB9XG4gICAgc2V0IGRlZmF1bHREYXRlKGRlZmF1bHREYXRlOiBEYXRlKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHREYXRlID0gZGVmYXVsdERhdGU7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkZWZhdWx0RGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdGhpcy5pbml0VGltZShkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaW5wdXRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjYXgtaW5wdXR0ZXh0IGNheC1jb21wb25lbnQnOiB0cnVlLFxuICAgICAgICAgICAgJ2NheC12YXJpYW50LWZpbGxlZCc6IHRoaXMudmFyaWFudCA9PT0gJ2ZpbGxlZCcgfHwgdGhpcy5jb25maWcuaW5wdXRTdHlsZSgpID09PSAnZmlsbGVkJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBmb2N1cyBvZiBpbnB1dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXM6IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBibHVyIG9mIGlucHV0IGZpZWxkLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gYnJvd3NlciBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CbHVyOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBkYXRlIHBhbmVsIGNsb3NlZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIE1vdXNlIGV2ZW50XG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxBbmltYXRpb25FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFuaW1hdGlvbkV2ZW50PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBkYXRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBkYXRlIHZhbHVlLlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGlucHV0IGZpZWxkIGNsZWFyZWQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2xlYXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gaW5wdXQgZmllbGQgaXMgYmVpbmcgdHlwZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBicm93c2VyIGV2ZW50XG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSW5wdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdG9kYXkgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gdG9kYXkgYXMgYSBkYXRlIGluc3RhbmNlLlxuICAgICAqIEBncm91cCBFbWl0c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvZGF5Q2xpY2s6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2xlYXJDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG1vbnRoIGlzIGNoYW5nZWQgdXNpbmcgdGhlIG5hdmlnYXRvcnMuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhck1vbnRoQ2hhbmdlRXZlbnR9IGV2ZW50IC0gY3VzdG9tIG1vbnRoIGNoYW5nZSBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Nb250aENoYW5nZTogRXZlbnRFbWl0dGVyPENhbGVuZGFyTW9udGhDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyTW9udGhDaGFuZ2VFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIHllYXIgaXMgY2hhbmdlZCB1c2luZyB0aGUgbmF2aWdhdG9ycy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyWWVhckNoYW5nZUV2ZW50fSBldmVudCAtIGN1c3RvbSB5ZWFyIGNoYW5nZSBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25ZZWFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJZZWFyQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclllYXJDaGFuZ2VFdmVudD4oKTtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBjbGlja2VkIG91dHNpZGUgb2YgdGhlIGRhdGUgcGFuZWwuXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2xpY2tPdXRzaWRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGRhdGVwaWNrZXIgcGFuZWwgaXMgc2hvd24uXG4gICAgICogQGdyb3VwIEVtaXRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSW5saW5lU2F2ZWQ6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgICBAT3V0cHV0KCkgb25JbmxpbmVDYW5jZWxsZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBPdXRwdXQoKSBvblNob3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKENheFRlbXBsYXRlKSB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8Q2F4VGVtcGxhdGU+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRhaW5lclZpZXdDaGlsZDogTnVsbGFibGU8RWxlbWVudFJlZj47XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dGZpZWxkJywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0ZmllbGRWaWV3Q2hpbGQ6IE51bGxhYmxlPEVsZW1lbnRSZWY+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGVudFdyYXBwZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IGNvbnRlbnQoY29udGVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmNvbnRlbnRWaWV3Q2hpbGQgPSBjb250ZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaWV3Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTW9udGhOYXZpZ2F0ZSkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgpID0+IHRoaXMudXBkYXRlRm9jdXMoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc01vbnRoTmF2aWdhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvY3VzICYmICF0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRGb2N1c2FibGVDZWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGVudFZpZXdDaGlsZCE6IEVsZW1lbnRSZWY7XG5cbiAgICB2YWx1ZTogYW55O1xuXG4gICAgZGF0ZXM6IE51bGxhYmxlPERhdGVbXT47XG5cbiAgICBtb250aHMhOiBNb250aFtdO1xuXG4gICAgd2Vla0RheXM6IE51bGxhYmxlPHN0cmluZ1tdPjtcblxuICAgIGN1cnJlbnRNb250aCE6IG51bWJlcjtcblxuICAgIGN1cnJlbnRZZWFyITogbnVtYmVyO1xuXG4gICAgY3VycmVudEhvdXI6IE51bGxhYmxlPG51bWJlcj47XG5cbiAgICBjdXJyZW50TWludXRlOiBOdWxsYWJsZTxudW1iZXI+O1xuXG4gICAgY3VycmVudFNlY29uZDogTnVsbGFibGU8bnVtYmVyPjtcblxuICAgIHBtOiBOdWxsYWJsZTxib29sZWFuPjtcblxuICAgIG1hc2s6IE51bGxhYmxlPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIG1hc2tDbGlja0xpc3RlbmVyOiBWb2lkTGlzdGVuZXI7XG5cbiAgICBvdmVybGF5OiBOdWxsYWJsZTxIVE1MRGl2RWxlbWVudD47XG5cbiAgICByZXNwb25zaXZlU3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuICAgIG92ZXJsYXlWaXNpYmxlOiBOdWxsYWJsZTxib29sZWFuPjtcblxuICAgIG9uTW9kZWxDaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4ge307XG5cbiAgICBvbk1vZGVsVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIGNhbGVuZGFyRWxlbWVudDogTnVsbGFibGU8SFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmPjtcblxuICAgIHRpbWVQaWNrZXJUaW1lcjogYW55O1xuXG4gICAgZG9jdW1lbnRDbGlja0xpc3RlbmVyOiBWb2lkTGlzdGVuZXI7XG5cbiAgICBhbmltYXRpb25FbmRMaXN0ZW5lcjogVm9pZExpc3RlbmVyO1xuXG4gICAgdGlja3NUbzE5NzA6IE51bGxhYmxlPG51bWJlcj47XG5cbiAgICB5ZWFyT3B0aW9uczogTnVsbGFibGU8bnVtYmVyW10+O1xuXG4gICAgZm9jdXM6IE51bGxhYmxlPGJvb2xlYW4+O1xuXG4gICAgaXNLZXlkb3duOiBOdWxsYWJsZTxib29sZWFuPjtcblxuICAgIGZpbGxlZDogTnVsbGFibGU8Ym9vbGVhbj47XG5cbiAgICBpbnB1dEZpZWxkVmFsdWU6IE51bGxhYmxlPHN0cmluZz4gPSBudWxsO1xuXG4gICAgX21pbkRhdGU/OiBEYXRlIHwgbnVsbDtcblxuICAgIF9tYXhEYXRlPzogRGF0ZSB8IG51bGw7XG5cbiAgICBfc2hvd1RpbWUhOiBib29sZWFuO1xuXG4gICAgX3llYXJSYW5nZSE6IHN0cmluZztcblxuICAgIHByZXZlbnREb2N1bWVudExpc3RlbmVyOiBOdWxsYWJsZTxib29sZWFuPjtcblxuICAgIGRhdGVUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBoZWFkZXJUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBmb290ZXJUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBkaXNhYmxlZERhdGVUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBkZWNhZGVUZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBwcmV2aW91c0ljb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBuZXh0SWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIHRyaWdnZXJJY29uVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgY2xlYXJJY29uVGVtcGxhdGU6IE51bGxhYmxlPFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgZGVjcmVtZW50SWNvblRlbXBsYXRlOiBOdWxsYWJsZTxUZW1wbGF0ZVJlZjxhbnk+PjtcblxuICAgIGluY3JlbWVudEljb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBpbnB1dEljb25UZW1wbGF0ZTogTnVsbGFibGU8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICBfZGlzYWJsZWREYXRlcyE6IEFycmF5PERhdGU+O1xuXG4gICAgX2Rpc2FibGVkRGF5cyE6IEFycmF5PG51bWJlcj47XG5cbiAgICBzZWxlY3RFbGVtZW50OiBOdWxsYWJsZTtcblxuICAgIHRvZGF5RWxlbWVudDogTnVsbGFibGU7XG5cbiAgICBmb2N1c0VsZW1lbnQ6IE51bGxhYmxlO1xuXG4gICAgc2Nyb2xsSGFuZGxlcjogTnVsbGFibGU8Q29ubmVjdGVkT3ZlcmxheVNjcm9sbEhhbmRsZXI+O1xuXG4gICAgZG9jdW1lbnRSZXNpemVMaXN0ZW5lcjogVm9pZExpc3RlbmVyO1xuXG4gICAgbmF2aWdhdGlvblN0YXRlOiBOdWxsYWJsZTxOYXZpZ2F0aW9uU3RhdGU+ID0gbnVsbDtcblxuICAgIGlzTW9udGhOYXZpZ2F0ZTogTnVsbGFibGU8Ym9vbGVhbj47XG5cbiAgICBpbml0aWFsaXplZDogTnVsbGFibGU8Ym9vbGVhbj47XG5cbiAgICB0cmFuc2xhdGlvblN1YnNjcmlwdGlvbjogTnVsbGFibGU8U3Vic2NyaXB0aW9uPjtcblxuICAgIF9sb2NhbGUhOiBMb2NhbGVTZXR0aW5ncztcblxuICAgIF9yZXNwb25zaXZlT3B0aW9ucyE6IENhbGVuZGFyUmVzcG9uc2l2ZU9wdGlvbnNbXTtcblxuICAgIGN1cnJlbnRWaWV3OiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgYXR0cmlidXRlU2VsZWN0b3I6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICBwYW5lbElkOiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgX251bWJlck9mTW9udGhzOiBudW1iZXIgPSAxO1xuXG4gICAgX2ZpcnN0RGF5T2ZXZWVrITogbnVtYmVyO1xuXG4gICAgX3ZpZXc6IENhbGVuZGFyVHlwZVZpZXcgPSAnZGF0ZSc7XG5cbiAgICBwcmV2ZW50Rm9jdXM6IE51bGxhYmxlPGJvb2xlYW4+O1xuXG4gICAgX2RlZmF1bHREYXRlITogRGF0ZTtcblxuICAgIF9mb2N1c0tleTogTnVsbGFibGU8c3RyaW5nPiA9IG51bGw7XG5cbiAgICBvcmlnaW5hbFZhbHVlOiBEYXRlID0gbnVsbDtcblxuICAgIGZvcm1hdHRlZElubGluZURhdGU6IHN0cmluZyA9ICcnO1xuXG4gICAgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvdztcblxuICAgIGdldCBsb2NhbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgZ2V0IGljb25CdXR0b25BcmlhTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb25BcmlhTGFiZWwgPyB0aGlzLmljb25BcmlhTGFiZWwgOiB0aGlzLmdldFRyYW5zbGF0aW9uKCdjaG9vc2VEYXRlJyk7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZJY29uQXJpYUxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInID8gdGhpcy5nZXRUcmFuc2xhdGlvbigncHJldkRlY2FkZScpIDogdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ3ByZXZZZWFyJykgOiB0aGlzLmdldFRyYW5zbGF0aW9uKCdwcmV2TW9udGgnKTtcbiAgICB9XG5cbiAgICBnZXQgbmV4dEljb25BcmlhTGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicgPyB0aGlzLmdldFRyYW5zbGF0aW9uKCduZXh0RGVjYWRlJykgOiB0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnID8gdGhpcy5nZXRUcmFuc2xhdGlvbignbmV4dFllYXInKSA6IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ25leHRNb250aCcpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgY29uZmlnOiBjYXhDb25maWcsXG4gICAgICAgIHB1YmxpYyBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy53aW5kb3cgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3IGFzIFdpbmRvdztcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVTZWxlY3RvciA9IFVuaXF1ZUNvbXBvbmVudElkKCk7XG4gICAgICAgIHRoaXMucGFuZWxJZCA9IHRoaXMuYXR0cmlidXRlU2VsZWN0b3IgKyAnX3BhbmVsJztcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGVmYXVsdERhdGUgfHwgbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXNwb25zaXZlU3R5bGUoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHRoaXMueWVhck9wdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMudmlldztcblxuICAgICAgICBpZiAodGhpcy52aWV3ID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlV2Vla0RheXMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFRpbWUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vbnRocyh0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50WWVhcik7XG4gICAgICAgICAgICB0aGlzLnRpY2tzVG8xOTcwID0gKCgxOTcwIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKDE5NzAgLyA0KSAtIE1hdGguZmxvb3IoMTk3MCAvIDEwMCkgKyBNYXRoLmZsb29yKDE5NzAgLyA0MDApKSAqIDI0ICogNjAgKiA2MCAqIDEwMDAwMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnLnRyYW5zbGF0aW9uT2JzZXJ2ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlV2Vla0RheXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRm9ybWF0dGVkSW5saW5lRGF0ZSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldFR5cGUoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnZGVjYWRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNhZGVUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5wdXRpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEljb25UZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAncHJldmlvdXNpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0ljb25UZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnbmV4dGljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWdnZXJpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VySWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjbGVhcmljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySWNvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdkZWNyZW1lbnRpY29uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJY29uVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2luY3JlbWVudGljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudEljb25UZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdDaGlsZCAmJiB0aGlzLmNvbnRlbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5hdHRyaWJ1dGVTZWxlY3RvciwgJycpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9jdXNhYmxlQ2VsbCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaWV3Q2hpbGQgJiYgdGhpcy5jb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gRG9tSGFuZGxlci5nZXRPdXRlcldpZHRoKHRoaXMuY29udGFpbmVyVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50KSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVGb3JtYXR0ZWRJbmxpbmVEYXRlKCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy52YWx1ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgY29uc3QgbW9udGggPSAodGhpcy52YWx1ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHRoaXMudmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkSW5saW5lRGF0ZSA9IGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdHRlZElubGluZURhdGUgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFRyYW5zbGF0aW9uKG9wdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRUcmFuc2xhdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIHBvcHVsYXRlWWVhck9wdGlvbnMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy55ZWFyT3B0aW9ucyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy55ZWFyT3B0aW9ucy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlV2Vla0RheXMoKSB7XG4gICAgICAgIHRoaXMud2Vla0RheXMgPSBbXTtcbiAgICAgICAgbGV0IGRheUluZGV4ID0gdGhpcy5nZXRGaXJzdERhdGVPZldlZWsoKTtcbiAgICAgICAgbGV0IGRheUxhYmVscyA9IHRoaXMuZ2V0VHJhbnNsYXRpb24oVHJhbnNsYXRpb25LZXlzLkRBWV9OQU1FU19NSU4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53ZWVrRGF5cy5wdXNoKGRheUxhYmVsc1tkYXlJbmRleF0pO1xuICAgICAgICAgICAgZGF5SW5kZXggPSBkYXlJbmRleCA9PSA2ID8gMCA6ICsrZGF5SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb250aFBpY2tlclZhbHVlcygpIHtcbiAgICAgICAgbGV0IG1vbnRoUGlja2VyVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDExOyBpKyspIHtcbiAgICAgICAgICAgIG1vbnRoUGlja2VyVmFsdWVzLnB1c2godGhpcy5jb25maWcuZ2V0VHJhbnNsYXRpb24oJ21vbnRoTmFtZXNTaG9ydCcpW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb250aFBpY2tlclZhbHVlcztcbiAgICB9XG5cbiAgICB5ZWFyUGlja2VyVmFsdWVzKCkge1xuICAgICAgICBsZXQgeWVhclBpY2tlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaGFsZlJhbmdlID0gTWF0aC5mbG9vcih0aGlzLnN0ZXBZZWFyUGlja2VyIC8gMik7XG4gICAgICAgIGxldCBzdGFydFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyIC0gaGFsZlJhbmdlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RlcFllYXJQaWNrZXI7IGkrKykge1xuICAgICAgICAgICAgeWVhclBpY2tlclZhbHVlcy5wdXNoKHN0YXJ0WWVhciArIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHllYXJQaWNrZXJWYWx1ZXM7XG4gICAgfVxuXG4gICAgY3JlYXRlTW9udGhzKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcikge1xuICAgICAgICB0aGlzLm1vbnRocyA9IHRoaXMubW9udGhzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZk1vbnRoczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbSA9IG1vbnRoICsgaTtcbiAgICAgICAgICAgIGxldCB5ID0geWVhcjtcbiAgICAgICAgICAgIGlmIChtID4gMTEpIHtcbiAgICAgICAgICAgICAgICBtID0gKG0gJSAxMSkgLSAxO1xuICAgICAgICAgICAgICAgIHkgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tb250aHMucHVzaCh0aGlzLmNyZWF0ZU1vbnRoKG0sIHkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFdlZWtOdW1iZXIoZGF0ZTogRGF0ZSkge1xuICAgICAgICBsZXQgY2hlY2tEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAodGhpcy5zdGFydFdlZWtGcm9tRmlyc3REYXlPZlllYXIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gK3RoaXMuZ2V0Rmlyc3REYXRlT2ZXZWVrKCk7XG4gICAgICAgICAgICBjaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNiArIGZpcnN0RGF5T2ZXZWVrIC0gY2hlY2tEYXRlLmdldERheSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrRGF0ZS5zZXREYXRlKGNoZWNrRGF0ZS5nZXREYXRlKCkgKyA0IC0gKGNoZWNrRGF0ZS5nZXREYXkoKSB8fCA3KSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBjaGVja0RhdGUuZ2V0VGltZSgpO1xuICAgICAgICBjaGVja0RhdGUuc2V0TW9udGgoMCk7XG4gICAgICAgIGNoZWNrRGF0ZS5zZXREYXRlKDEpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJvdW5kKCh0aW1lIC0gY2hlY2tEYXRlLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgLyA3KSArIDE7XG4gICAgfVxuXG4gICAgY3JlYXRlTW9udGgobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyKTogTW9udGgge1xuICAgICAgICBsZXQgZGF0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGZpcnN0RGF5ID0gdGhpcy5nZXRGaXJzdERheU9mTW9udGhJbmRleChtb250aCwgeWVhcik7XG4gICAgICAgIGxldCBkYXlzTGVuZ3RoID0gdGhpcy5nZXREYXlzQ291bnRJbk1vbnRoKG1vbnRoLCB5ZWFyKTtcbiAgICAgICAgbGV0IHByZXZNb250aERheXNMZW5ndGggPSB0aGlzLmdldERheXNDb3VudEluUHJldk1vbnRoKG1vbnRoLCB5ZWFyKTtcbiAgICAgICAgbGV0IGRheU5vID0gMTtcbiAgICAgICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHdlZWtOdW1iZXJzID0gW107XG4gICAgICAgIGxldCBtb250aFJvd3MgPSBNYXRoLmNlaWwoKGRheXNMZW5ndGggKyBmaXJzdERheSkgLyA3KTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbnRoUm93czsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgd2VlayA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHByZXZNb250aERheXNMZW5ndGggLSBmaXJzdERheSArIDE7IGogPD0gcHJldk1vbnRoRGF5c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5nZXRQcmV2aW91c01vbnRoQW5kWWVhcihtb250aCwgeWVhcik7XG4gICAgICAgICAgICAgICAgICAgIHdlZWsucHVzaCh7IGRheTogaiwgbW9udGg6IHByZXYubW9udGgsIHllYXI6IHByZXYueWVhciwgb3RoZXJNb250aDogdHJ1ZSwgdG9kYXk6IHRoaXMuaXNUb2RheSh0b2RheSwgaiwgcHJldi5tb250aCwgcHJldi55ZWFyKSwgc2VsZWN0YWJsZTogdGhpcy5pc1NlbGVjdGFibGUoaiwgcHJldi5tb250aCwgcHJldi55ZWFyLCB0cnVlKSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nRGF5c0xlbmd0aCA9IDcgLSB3ZWVrLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlbWFpbmluZ0RheXNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrLnB1c2goeyBkYXk6IGRheU5vLCBtb250aDogbW9udGgsIHllYXI6IHllYXIsIHRvZGF5OiB0aGlzLmlzVG9kYXkodG9kYXksIGRheU5vLCBtb250aCwgeWVhciksIHNlbGVjdGFibGU6IHRoaXMuaXNTZWxlY3RhYmxlKGRheU5vLCBtb250aCwgeWVhciwgZmFsc2UpIH0pO1xuICAgICAgICAgICAgICAgICAgICBkYXlObysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheU5vID4gZGF5c0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmdldE5leHRNb250aEFuZFllYXIobW9udGgsIHllYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2Vlay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXk6IGRheU5vIC0gZGF5c0xlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aDogbmV4dC5tb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyOiBuZXh0LnllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJNb250aDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheTogdGhpcy5pc1RvZGF5KHRvZGF5LCBkYXlObyAtIGRheXNMZW5ndGgsIG5leHQubW9udGgsIG5leHQueWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdGhpcy5pc1NlbGVjdGFibGUoZGF5Tm8gLSBkYXlzTGVuZ3RoLCBuZXh0Lm1vbnRoLCBuZXh0LnllYXIsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWsucHVzaCh7IGRheTogZGF5Tm8sIG1vbnRoOiBtb250aCwgeWVhcjogeWVhciwgdG9kYXk6IHRoaXMuaXNUb2RheSh0b2RheSwgZGF5Tm8sIG1vbnRoLCB5ZWFyKSwgc2VsZWN0YWJsZTogdGhpcy5pc1NlbGVjdGFibGUoZGF5Tm8sIG1vbnRoLCB5ZWFyLCBmYWxzZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkYXlObysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1dlZWspIHtcbiAgICAgICAgICAgICAgICB3ZWVrTnVtYmVycy5wdXNoKHRoaXMuZ2V0V2Vla051bWJlcihuZXcgRGF0ZSh3ZWVrWzBdLnllYXIsIHdlZWtbMF0ubW9udGgsIHdlZWtbMF0uZGF5KSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlcy5wdXNoKHdlZWspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgICAgICBkYXRlczogPGFueT5kYXRlcyxcbiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB3ZWVrTnVtYmVyc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGluaXRUaW1lKGRhdGU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5wbSA9IGRhdGUuZ2V0SG91cnMoKSA+IDExO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNaW51dGUgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlY29uZCA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50SG91clBNKGRhdGUuZ2V0SG91cnMoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWludXRlID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvdXIgPSAwO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2Vjb25kID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hdkJhY2t3YXJkKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTW9udGhOYXZpZ2F0ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50WWVhcigpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb2N1cygpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudFllYXJQaWNrZXJTdGVwKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTE7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRZZWFyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub25Nb250aENoYW5nZS5lbWl0KHsgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoICsgMSwgeWVhcjogdGhpcy5jdXJyZW50WWVhciB9KTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hdkZvcndhcmQoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNNb250aE5hdmlnYXRlID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRZZWFyKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50WWVhclBpY2tlclN0ZXAoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9jdXMoKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudFllYXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vbk1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogdGhpcy5jdXJyZW50TW9udGggKyAxLCB5ZWFyOiB0aGlzLmN1cnJlbnRZZWFyIH0pO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVNb250aHModGhpcy5jdXJyZW50TW9udGgsIHRoaXMuY3VycmVudFllYXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVjcmVtZW50WWVhcigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgICAgICBsZXQgX3llYXJPcHRpb25zID0gPG51bWJlcltdPnRoaXMueWVhck9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHRoaXMueWVhck5hdmlnYXRvciAmJiB0aGlzLmN1cnJlbnRZZWFyIDwgX3llYXJPcHRpb25zWzBdKSB7XG4gICAgICAgICAgICBsZXQgZGlmZmVyZW5jZSA9IF95ZWFyT3B0aW9uc1tfeWVhck9wdGlvbnMubGVuZ3RoIC0gMV0gLSBfeWVhck9wdGlvbnNbMF07XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlWWVhck9wdGlvbnMoX3llYXJPcHRpb25zWzBdIC0gZGlmZmVyZW5jZSwgX3llYXJPcHRpb25zW195ZWFyT3B0aW9ucy5sZW5ndGggLSAxXSAtIGRpZmZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVjcmVtZW50WWVhclBpY2tlclN0ZXAoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyIC0gdGhpcy5zdGVwWWVhclBpY2tlcjtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnRZZWFyUGlja2VyU3RlcCgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHRoaXMuY3VycmVudFllYXIgKyB0aGlzLnN0ZXBZZWFyUGlja2VyO1xuICAgIH1cblxuICAgIGluY3JlbWVudFllYXIoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgICAgbGV0IF95ZWFyT3B0aW9ucyA9IDxudW1iZXJbXT50aGlzLnllYXJPcHRpb25zO1xuXG4gICAgICAgIGlmICh0aGlzLnllYXJOYXZpZ2F0b3IgJiYgdGhpcy5jdXJyZW50WWVhciA+IF95ZWFyT3B0aW9uc1tfeWVhck9wdGlvbnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGxldCBkaWZmZXJlbmNlID0gX3llYXJPcHRpb25zW195ZWFyT3B0aW9ucy5sZW5ndGggLSAxXSAtIF95ZWFyT3B0aW9uc1swXTtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVZZWFyT3B0aW9ucyhfeWVhck9wdGlvbnNbMF0gKyBkaWZmZXJlbmNlLCBfeWVhck9wdGlvbnNbX3llYXJPcHRpb25zLmxlbmd0aCAtIDFdICsgZGlmZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUb01vbnRoVmlldyhldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZXRDdXJyZW50VmlldygnbW9udGgnKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBzd2l0Y2hUb1llYXJWaWV3KGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRWaWV3KCd5ZWFyJyk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgb25EYXRlU2VsZWN0KGV2ZW50OiBFdmVudCwgZGF0ZU1ldGE6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhZGF0ZU1ldGEuc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSAmJiB0aGlzLmlzU2VsZWN0ZWQoZGF0ZU1ldGEpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKGRhdGU6IERhdGUsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0RhdGVFcXVhbHMoZGF0ZSwgZGF0ZU1ldGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZWwodGhpcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTZWxlY3REYXRlKGRhdGVNZXRhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShkYXRlTWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oaWRlT25EYXRlVGltZVNlbGVjdCAmJiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbigpIHx8ICh0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSAmJiB0aGlzLnZhbHVlWzFdKSkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNb2RhbGl0eSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9LCAxNTApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dGZpZWxkKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybWF0dGVkSW5saW5lRGF0ZSgpO1xuICAgIH1cblxuICAgIHNob3VsZFNlbGVjdERhdGUoZGF0ZU1ldGE6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHJldHVybiB0aGlzLm1heERhdGVDb3VudCAhPSBudWxsID8gdGhpcy5tYXhEYXRlQ291bnQgPiAodGhpcy52YWx1ZSA/IHRoaXMudmFsdWUubGVuZ3RoIDogMCkgOiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG9uTW9udGhTZWxlY3QoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMub25EYXRlU2VsZWN0KGV2ZW50LCB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBpbmRleCwgZGF5OiAxLCBzZWxlY3RhYmxlOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudFZpZXcoJ2RhdGUnKTtcbiAgICAgICAgICAgIHRoaXMub25Nb250aENoYW5nZS5lbWl0KHsgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoICsgMSwgeWVhcjogdGhpcy5jdXJyZW50WWVhciB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uWWVhclNlbGVjdChldmVudDogRXZlbnQsIHllYXI6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy52aWV3ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMub25EYXRlU2VsZWN0KGV2ZW50LCB7IHllYXI6IHllYXIsIG1vbnRoOiAwLCBkYXk6IDEsIHNlbGVjdGFibGU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudFZpZXcoJ21vbnRoJyk7XG4gICAgICAgICAgICB0aGlzLm9uWWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoICsgMSwgeWVhcjogdGhpcy5jdXJyZW50WWVhciB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUlucHV0ZmllbGQoKSB7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9ICcnO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdERhdGVUaW1lKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZUFzU3RyaW5nID0gdGhpcy5mb3JtYXREYXRlVGltZSh0aGlzLnZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgKz0gZGF0ZUFzU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy52YWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZSArPSB0aGlzLm11bHRpcGxlU2VwYXJhdG9yICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydERhdGUgPSB0aGlzLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kRGF0ZSA9IHRoaXMudmFsdWVbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdERhdGVUaW1lKHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZSArPSAnICcgKyB0aGlzLnJhbmdlU2VwYXJhdG9yICsgJyAnICsgdGhpcy5mb3JtYXREYXRlVGltZShlbmREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXRGaWVsZFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsbGVkU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRmaWVsZFZpZXdDaGlsZCAmJiB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dGZpZWxkVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmlucHV0RmllbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1hdERhdGVUaW1lKGRhdGU6IGFueSkge1xuICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmtlZXBJbnZhbGlkID8gZGF0ZSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGlzRGF0ZVZhbGlkID0gdGhpcy5pc1ZhbGlkRGF0ZUZvclRpbWVDb25zdHJhaW50cyhkYXRlKTtcblxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZShkYXRlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0VGltZShkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgdGhpcy5nZXREYXRlRm9ybWF0KCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlICs9ICcgJyArIHRoaXMuZm9ybWF0VGltZShkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlID0gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IGlzRGF0ZVZhbGlkID8gZm9ybWF0dGVkVmFsdWUgOiAnJztcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFZhbHVlO1xuICAgIH1cblxuICAgIGZvcm1hdERhdGVNZXRhVG9EYXRlKGRhdGVNZXRhOiBhbnkpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVNZXRhLnllYXIsIGRhdGVNZXRhLm1vbnRoLCBkYXRlTWV0YS5kYXkpO1xuICAgIH1cblxuICAgIGZvcm1hdERhdGVLZXkoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7ZGF0ZS5nZXRNb250aCgpfS0ke2RhdGUuZ2V0RGF0ZSgpfWA7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudEhvdXJQTShob3VyczogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzEyJykge1xuICAgICAgICAgICAgdGhpcy5wbSA9IGhvdXJzID4gMTE7XG4gICAgICAgICAgICBpZiAoaG91cnMgPj0gMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3VyID0gaG91cnMgPT0gMTIgPyAxMiA6IGhvdXJzIC0gMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEhvdXIgPSBob3VycyA9PSAwID8gMTIgOiBob3VycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvdXIgPSBob3VycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEN1cnJlbnRWaWV3KGN1cnJlbnRWaWV3OiBDYWxlbmRhclR5cGVWaWV3KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBjdXJyZW50VmlldztcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuYWxpZ25PdmVybGF5KCk7XG4gICAgfVxuXG4gICAgc2VsZWN0RGF0ZShkYXRlTWV0YTogYW55KSB7XG4gICAgICAgIGxldCBkYXRlID0gdGhpcy5mb3JtYXREYXRlTWV0YVRvRGF0ZShkYXRlTWV0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzEyJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRIb3VyID09PSAxMikgZGF0ZS5zZXRIb3Vycyh0aGlzLnBtID8gMTIgOiAwKTtcbiAgICAgICAgICAgICAgICBlbHNlIGRhdGUuc2V0SG91cnModGhpcy5wbSA/IDxudW1iZXI+dGhpcy5jdXJyZW50SG91ciArIDEyIDogPG51bWJlcj50aGlzLmN1cnJlbnRIb3VyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRIb3Vycyg8bnVtYmVyPnRoaXMuY3VycmVudEhvdXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoPG51bWJlcj50aGlzLmN1cnJlbnRNaW51dGUpO1xuICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKDxudW1iZXI+dGhpcy5jdXJyZW50U2Vjb25kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5taW5EYXRlID4gZGF0ZSkge1xuICAgICAgICAgICAgZGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEhvdXJQTShkYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWNvbmQgPSBkYXRlLmdldFNlY29uZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgdGhpcy5tYXhEYXRlIDwgZGF0ZSkge1xuICAgICAgICAgICAgZGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEhvdXJQTShkYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWNvbmQgPSBkYXRlLmdldFNlY29uZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZWwoZGF0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZWwodGhpcy52YWx1ZSA/IFsuLi50aGlzLnZhbHVlLCBkYXRlXSA6IFtkYXRlXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1JhbmdlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZSA9IHRoaXMudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgbGV0IGVuZERhdGUgPSB0aGlzLnZhbHVlWzFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbmREYXRlICYmIGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbChbc3RhcnREYXRlLCBlbmREYXRlXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZWwoW2RhdGUsIG51bGxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdChkYXRlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVNb2RlbCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFUeXBlID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuZm9ybWF0RGF0ZVRpbWUodGhpcy52YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyaW5nQXJyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ0FyclZhbHVlID0gdGhpcy52YWx1ZS5tYXAoKGRhdGU6IERhdGUpID0+IHRoaXMuZm9ybWF0RGF0ZVRpbWUoZGF0ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2Uoc3RyaW5nQXJyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Rmlyc3REYXlPZk1vbnRoSW5kZXgobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyKSB7XG4gICAgICAgIGxldCBkYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkYXkuc2V0RGF0ZSgxKTtcbiAgICAgICAgZGF5LnNldE1vbnRoKG1vbnRoKTtcbiAgICAgICAgZGF5LnNldEZ1bGxZZWFyKHllYXIpO1xuXG4gICAgICAgIGxldCBkYXlJbmRleCA9IGRheS5nZXREYXkoKSArIHRoaXMuZ2V0U3VuZGF5SW5kZXgoKTtcbiAgICAgICAgcmV0dXJuIGRheUluZGV4ID49IDcgPyBkYXlJbmRleCAtIDcgOiBkYXlJbmRleDtcbiAgICB9XG5cbiAgICBnZXREYXlzQ291bnRJbk1vbnRoKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gMzIgLSB0aGlzLmRheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCAzMikpLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBnZXREYXlzQ291bnRJblByZXZNb250aChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldFByZXZpb3VzTW9udGhBbmRZZWFyKG1vbnRoLCB5ZWFyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF5c0NvdW50SW5Nb250aChwcmV2Lm1vbnRoLCBwcmV2LnllYXIpO1xuICAgIH1cblxuICAgIGdldFByZXZpb3VzTW9udGhBbmRZZWFyKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcikge1xuICAgICAgICBsZXQgbSwgeTtcblxuICAgICAgICBpZiAobW9udGggPT09IDApIHtcbiAgICAgICAgICAgIG0gPSAxMTtcbiAgICAgICAgICAgIHkgPSB5ZWFyIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG0gPSBtb250aCAtIDE7XG4gICAgICAgICAgICB5ID0geWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG1vbnRoOiBtLCB5ZWFyOiB5IH07XG4gICAgfVxuXG4gICAgZ2V0TmV4dE1vbnRoQW5kWWVhcihtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IG0sIHk7XG5cbiAgICAgICAgaWYgKG1vbnRoID09PSAxMSkge1xuICAgICAgICAgICAgbSA9IDA7XG4gICAgICAgICAgICB5ID0geWVhciArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtID0gbW9udGggKyAxO1xuICAgICAgICAgICAgeSA9IHllYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBtb250aDogbSwgeWVhcjogeSB9O1xuICAgIH1cblxuICAgIGdldFN1bmRheUluZGV4KCkge1xuICAgICAgICBsZXQgZmlyc3REYXlPZldlZWsgPSB0aGlzLmdldEZpcnN0RGF0ZU9mV2VlaygpO1xuXG4gICAgICAgIHJldHVybiBmaXJzdERheU9mV2VlayA+IDAgPyA3IC0gZmlyc3REYXlPZldlZWsgOiAwO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQoZGF0ZU1ldGE6IGFueSk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGVTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRGF0ZUVxdWFscyh0aGlzLnZhbHVlLCBkYXRlTWV0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGF0ZSBvZiB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdGhpcy5pc0RhdGVFcXVhbHMoZGF0ZSwgZGF0ZU1ldGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlWzFdKSByZXR1cm4gdGhpcy5pc0RhdGVFcXVhbHModGhpcy52YWx1ZVswXSwgZGF0ZU1ldGEpIHx8IHRoaXMuaXNEYXRlRXF1YWxzKHRoaXMudmFsdWVbMV0sIGRhdGVNZXRhKSB8fCB0aGlzLmlzRGF0ZUJldHdlZW4odGhpcy52YWx1ZVswXSwgdGhpcy52YWx1ZVsxXSwgZGF0ZU1ldGEpO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRoaXMuaXNEYXRlRXF1YWxzKHRoaXMudmFsdWVbMF0sIGRhdGVNZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzQ29tcGFyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgaXNNb250aFNlbGVjdGVkKG1vbnRoOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29tcGFyYWJsZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSA/IHRoaXMudmFsdWVbMF0gOiB0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZS5nZXRNb250aCgpID09PSBtb250aCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlzTW9udGhEaXNhYmxlZChtb250aDogbnVtYmVyLCB5ZWFyPzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHllYXJUb0NoZWNrID0geWVhciA/PyB0aGlzLmN1cnJlbnRZZWFyO1xuXG4gICAgICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8IHRoaXMuZ2V0RGF5c0NvdW50SW5Nb250aChtb250aCwgeWVhclRvQ2hlY2spICsgMTsgZGF5KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZShkYXksIG1vbnRoLCB5ZWFyVG9DaGVjaywgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzWWVhckRpc2FibGVkKHllYXI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gQXJyYXkoMTIpXG4gICAgICAgICAgICAuZmlsbCgwKVxuICAgICAgICAgICAgLmV2ZXJ5KCh2LCBtb250aCkgPT4gdGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGgsIHllYXIpKTtcbiAgICB9XG5cbiAgICBpc1llYXJTZWxlY3RlZCh5ZWFyOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29tcGFyYWJsZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuaXNSYW5nZVNlbGVjdGlvbigpID8gdGhpcy52YWx1ZVswXSA6IHRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0RhdGVFcXVhbHModmFsdWU6IGFueSwgZGF0ZU1ldGE6IGFueSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgT2JqZWN0VXRpbHMuaXNEYXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlLmdldERhdGUoKSA9PT0gZGF0ZU1ldGEuZGF5ICYmIHZhbHVlLmdldE1vbnRoKCkgPT09IGRhdGVNZXRhLm1vbnRoICYmIHZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IGRhdGVNZXRhLnllYXI7XG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzRGF0ZUJldHdlZW4oc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSwgZGF0ZU1ldGE6IGFueSkge1xuICAgICAgICBsZXQgYmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNEYXRlKHN0YXJ0KSAmJiBPYmplY3RVdGlscy5pc0RhdGUoZW5kKSkge1xuICAgICAgICAgICAgbGV0IGRhdGU6IERhdGUgPSB0aGlzLmZvcm1hdERhdGVNZXRhVG9EYXRlKGRhdGVNZXRhKTtcbiAgICAgICAgICAgIHJldHVybiBzdGFydC5nZXRUaW1lKCkgPD0gZGF0ZS5nZXRUaW1lKCkgJiYgZW5kLmdldFRpbWUoKSA+PSBkYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXR3ZWVuO1xuICAgIH1cblxuICAgIGlzU2luZ2xlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJztcbiAgICB9XG5cbiAgICBpc1JhbmdlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAncmFuZ2UnO1xuICAgIH1cblxuICAgIGlzTXVsdGlwbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZSc7XG4gICAgfVxuXG4gICAgaXNUb2RheSh0b2RheTogRGF0ZSwgZGF5OiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdG9kYXkuZ2V0RGF0ZSgpID09PSBkYXkgJiYgdG9kYXkuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBpc1NlbGVjdGFibGUoZGF5OiBhbnksIG1vbnRoOiBhbnksIHllYXI6IGFueSwgb3RoZXJNb250aDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCB2YWxpZE1pbiA9IHRydWU7XG4gICAgICAgIGxldCB2YWxpZE1heCA9IHRydWU7XG4gICAgICAgIGxldCB2YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICBsZXQgdmFsaWREYXkgPSB0cnVlO1xuXG4gICAgICAgIGlmIChvdGhlck1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCkgPiB5ZWFyKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRNaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiYgdGhpcy5jdXJyZW50VmlldyAhPSAneWVhcicpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5EYXRlLmdldE1vbnRoKCkgPiBtb250aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZE1pbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5taW5EYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbkRhdGUuZ2V0RGF0ZSgpID4gZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZE1pbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpIDwgeWVhcikge1xuICAgICAgICAgICAgICAgIHZhbGlkTWF4ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4RGF0ZS5nZXRNb250aCgpIDwgbW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRNYXggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4RGF0ZS5nZXRNb250aCgpID09PSBtb250aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXhEYXRlLmdldERhdGUoKSA8IGRheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRNYXggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMpIHtcbiAgICAgICAgICAgIHZhbGlkRGF0ZSA9ICF0aGlzLmlzRGF0ZURpc2FibGVkKGRheSwgbW9udGgsIHllYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzKSB7XG4gICAgICAgICAgICB2YWxpZERheSA9ICF0aGlzLmlzRGF5RGlzYWJsZWQoZGF5LCBtb250aCwgeWVhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRNaW4gJiYgdmFsaWRNYXggJiYgdmFsaWREYXRlICYmIHZhbGlkRGF5O1xuICAgIH1cblxuICAgIGlzRGF0ZURpc2FibGVkKGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgZGlzYWJsZWREYXRlIG9mIHRoaXMuZGlzYWJsZWREYXRlcykge1xuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZERhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJiBkaXNhYmxlZERhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgZGlzYWJsZWREYXRlLmdldERhdGUoKSA9PT0gZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0RheURpc2FibGVkKGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzKSB7XG4gICAgICAgICAgICBsZXQgd2Vla2RheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgICAgICAgbGV0IHdlZWtkYXlOdW1iZXIgPSB3ZWVrZGF5LmdldERheSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXlzLmluZGV4T2Yod2Vla2RheU51bWJlcikgIT09IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5zaG93T3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Gb2N1cy5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbklucHV0Q2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzICYmICF0aGlzLm92ZXJsYXlWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0Qmx1cihldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQmx1ci5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKCF0aGlzLmtlZXBJbnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0ZmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgb25CdXR0b25DbGljayhldmVudDogRXZlbnQsIGlucHV0ZmllbGQ6IGFueSA9IHRoaXMuaW5wdXRmaWVsZFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVZpc2libGUpIHtcbiAgICAgICAgICAgIGlucHV0ZmllbGQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd092ZXJsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmlucHV0RmllbGRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25DbGVhci5lbWl0KCk7XG4gICAgfVxuXG4gICAgb25PdmVybGF5Q2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0TW9udGhOYW1lKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldFRyYW5zbGF0aW9uKCdtb250aE5hbWVzJylbaW5kZXhdO1xuICAgIH1cblxuICAgIGdldFllYXIobW9udGg6IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/IHRoaXMuY3VycmVudFllYXIgOiBtb250aC55ZWFyO1xuICAgIH1cblxuICAgIHN3aXRjaFZpZXdCdXR0b25EaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyT2ZNb250aHMgPiAxIHx8IHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgb25QcmV2QnV0dG9uQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogdHJ1ZSwgYnV0dG9uOiB0cnVlIH07XG4gICAgICAgIHRoaXMubmF2QmFja3dhcmQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uTmV4dEJ1dHRvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TdGF0ZSA9IHsgYmFja3dhcmQ6IGZhbHNlLCBidXR0b246IHRydWUgfTtcbiAgICAgICAgdGhpcy5uYXZGb3J3YXJkKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkNvbnRhaW5lckJ1dHRvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICAgICAgLy90YWJcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhcEZvY3VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckVsZW1lbnRzID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKHRoaXMuY29udGFpbmVyVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50LCAnLmNheC1kYXRlcGlja2VyLWhlYWRlcicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gaGVhZGVyRWxlbWVudHMuY2hpbGRyZW5baGVhZGVyRWxlbWVudHM/LmNoaWxkcmVuPy5sZW5ndGggLSAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEZvY3VzYWJsZUNlbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy9lc2NhcGVcbiAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dGZpZWxkVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy9Ob29wXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0S2V5ZG93bihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaXNLZXlkb3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDQwICYmIHRoaXMuY29udGVudFZpZXdDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy50cmFwRm9jdXMoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRmaWVsZFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IDkgJiYgdGhpcy5jb250ZW50Vmlld0NoaWxkKSB7XG4gICAgICAgICAgICBEb21IYW5kbGVyLmdldEZvY3VzYWJsZUVsZW1lbnRzKHRoaXMuY29udGVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50KS5mb3JFYWNoKChlbCkgPT4gKGVsLnRhYkluZGV4ID0gJy0xJykpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVDZWxsS2V5ZG93bihldmVudDogYW55LCBkYXRlTWV0YTogYW55LCBncm91cEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbENvbnRlbnQgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICBjb25zdCBjZWxsID0gY2VsbENvbnRlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmZvcm1hdERhdGVNZXRhVG9EYXRlKGRhdGVNZXRhKTtcbiAgICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICAgICAgLy9kb3duIGFycm93XG4gICAgICAgICAgICBjYXNlIDQwOiB7XG4gICAgICAgICAgICAgICAgY2VsbENvbnRlbnQudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIGxldCBjZWxsSW5kZXggPSBEb21IYW5kbGVyLmluZGV4KGNlbGwpO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0Um93ID0gY2VsbC5wYXJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAobmV4dFJvdykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9jdXNDZWxsID0gbmV4dFJvdy5jaGlsZHJlbltjZWxsSW5kZXhdLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRG9tSGFuZGxlci5oYXNDbGFzcyhmb2N1c0NlbGwsICdjYXgtZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhdGUgPSB7IGJhY2t3YXJkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZGb3J3YXJkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSb3cuY2hpbGRyZW5bY2VsbEluZGV4XS5jaGlsZHJlblswXS50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSb3cuY2hpbGRyZW5bY2VsbEluZGV4XS5jaGlsZHJlblswXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhdGUgPSB7IGJhY2t3YXJkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdkZvcndhcmQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3VwIGFycm93XG4gICAgICAgICAgICBjYXNlIDM4OiB7XG4gICAgICAgICAgICAgICAgY2VsbENvbnRlbnQudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIGxldCBjZWxsSW5kZXggPSBEb21IYW5kbGVyLmluZGV4KGNlbGwpO1xuICAgICAgICAgICAgICAgIGxldCBwcmV2Um93ID0gY2VsbC5wYXJlbnRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzQ2VsbCA9IHByZXZSb3cuY2hpbGRyZW5bY2VsbEluZGV4XS5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERvbUhhbmRsZXIuaGFzQ2xhc3MoZm9jdXNDZWxsLCAnY2F4LWRpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZCYWNrd2FyZChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0NlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0NlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdkJhY2t3YXJkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9sZWZ0IGFycm93XG4gICAgICAgICAgICBjYXNlIDM3OiB7XG4gICAgICAgICAgICAgICAgY2VsbENvbnRlbnQudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIGxldCBwcmV2Q2VsbCA9IGNlbGwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAocHJldkNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzQ2VsbCA9IHByZXZDZWxsLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRG9tSGFuZGxlci5oYXNDbGFzcyhmb2N1c0NlbGwsICdjYXgtZGlzYWJsZWQnKSB8fCBEb21IYW5kbGVyLmhhc0NsYXNzKGZvY3VzQ2VsbC5wYXJlbnRFbGVtZW50LCAnY2F4LWRhdGVwaWNrZXItd2Vla251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9Nb250aCh0cnVlLCBncm91cEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzQ2VsbC50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzQ2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTW9udGgodHJ1ZSwgZ3JvdXBJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vcmlnaHQgYXJyb3dcbiAgICAgICAgICAgIGNhc2UgMzk6IHtcbiAgICAgICAgICAgICAgICBjZWxsQ29udGVudC50YWJJbmRleCA9ICctMSc7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRDZWxsID0gY2VsbC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c0NlbGwgPSBuZXh0Q2VsbC5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERvbUhhbmRsZXIuaGFzQ2xhc3MoZm9jdXNDZWxsLCAnY2F4LWRpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01vbnRoKGZhbHNlLCBncm91cEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzQ2VsbC50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzQ2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTW9udGgoZmFsc2UsIGdyb3VwSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2VudGVyXG4gICAgICAgICAgICAvL3NwYWNlXG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAzMjoge1xuICAgICAgICAgICAgICAgIHRoaXMub25EYXRlU2VsZWN0KGV2ZW50LCBkYXRlTWV0YSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9lc2NhcGVcbiAgICAgICAgICAgIGNhc2UgMjc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy90YWJcbiAgICAgICAgICAgIGNhc2UgOToge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFwRm9jdXMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcGFnZSB1cFxuICAgICAgICAgICAgY2FzZSAzMzoge1xuICAgICAgICAgICAgICAgIGNlbGxDb250ZW50LnRhYkluZGV4ID0gJy0xJztcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlVG9Gb2N1cyA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgLSAxLCBjdXJyZW50RGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzS2V5ID0gdGhpcy5mb3JtYXREYXRlS2V5KGRhdGVUb0ZvY3VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9Nb250aCh0cnVlLCBncm91cEluZGV4LCBgc3BhbltkYXRhLWRhdGU9JyR7Zm9jdXNLZXl9J106bm90KC5jYXgtZGlzYWJsZWQpOm5vdCguY2F4LWluaylgKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwYWdlIGRvd25cbiAgICAgICAgICAgIGNhc2UgMzQ6IHtcbiAgICAgICAgICAgICAgICBjZWxsQ29udGVudC50YWJJbmRleCA9ICctMSc7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRvRm9jdXMgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSwgY3VycmVudERhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmb2N1c0tleSA9IHRoaXMuZm9ybWF0RGF0ZUtleShkYXRlVG9Gb2N1cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTW9udGgoZmFsc2UsIGdyb3VwSW5kZXgsIGBzcGFuW2RhdGEtZGF0ZT0nJHtmb2N1c0tleX0nXTpub3QoLmNheC1kaXNhYmxlZCk6bm90KC5jYXgtaW5rKWApO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vaG9tZVxuICAgICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgICAgICBjZWxsQ29udGVudC50YWJJbmRleCA9ICctMSc7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlEYXRlID0gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgY3VycmVudERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlEYXRlS2V5ID0gdGhpcy5mb3JtYXREYXRlS2V5KGZpcnN0RGF5RGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlDZWxsID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKGNlbGxDb250ZW50Lm9mZnNldFBhcmVudCwgYHNwYW5bZGF0YS1kYXRlPScke2ZpcnN0RGF5RGF0ZUtleX0nXTpub3QoLmNheC1kaXNhYmxlZCk6bm90KC5jYXgtaW5rKWApO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdERheUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3REYXlDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdERheUNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy9lbmRcbiAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgY2VsbENvbnRlbnQudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3REYXlEYXRlID0gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3REYXlEYXRlS2V5ID0gdGhpcy5mb3JtYXREYXRlS2V5KGxhc3REYXlEYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RGF5Q2VsbCA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShjZWxsQ29udGVudC5vZmZzZXRQYXJlbnQsIGBzcGFuW2RhdGEtZGF0ZT0nJHtsYXN0RGF5RGF0ZUtleX0nXTpub3QoLmNheC1kaXNhYmxlZCk6bm90KC5jYXgtaW5rKWApO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0RGF5RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0RGF5Q2VsbC50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgbGFzdERheUNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvL25vIG9wXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vbnRoQ2VsbEtleWRvd24oZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICAgICAgLy9hcnJvd3NcbiAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICBjYXNlIDQwOiB7XG4gICAgICAgICAgICAgICAgY2VsbC50YWJJbmRleCA9ICctMSc7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGxzID0gY2VsbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSBEb21IYW5kbGVyLmluZGV4KGNlbGwpO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0Q2VsbCA9IGNlbGxzW2V2ZW50LndoaWNoID09PSA0MCA/IGNlbGxJbmRleCArIDMgOiBjZWxsSW5kZXggLSAzXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dENlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDZWxsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGVmdCBhcnJvd1xuICAgICAgICAgICAgY2FzZSAzNzoge1xuICAgICAgICAgICAgICAgIGNlbGwudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIGxldCBwcmV2Q2VsbCA9IGNlbGwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAocHJldkNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldkNlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIHByZXZDZWxsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhdGUgPSB7IGJhY2t3YXJkOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2QmFja3dhcmQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vcmlnaHQgYXJyb3dcbiAgICAgICAgICAgIGNhc2UgMzk6IHtcbiAgICAgICAgICAgICAgICBjZWxsLnRhYkluZGV4ID0gJy0xJztcbiAgICAgICAgICAgICAgICBsZXQgbmV4dENlbGwgPSBjZWxsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAobmV4dENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dENlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDZWxsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhdGUgPSB7IGJhY2t3YXJkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdkZvcndhcmQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZW50ZXJcbiAgICAgICAgICAgIC8vc3BhY2VcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIDMyOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1vbnRoU2VsZWN0KGV2ZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9lc2NhcGVcbiAgICAgICAgICAgIGNhc2UgMjc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy90YWJcbiAgICAgICAgICAgIGNhc2UgOToge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFwRm9jdXMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvL25vIG9wXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblllYXJDZWxsS2V5ZG93bihldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICAgIC8vYXJyb3dzXG4gICAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgY2FzZSA0MDoge1xuICAgICAgICAgICAgICAgIGNlbGwudGFiSW5kZXggPSAnLTEnO1xuICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IGNlbGwucGFyZW50RWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB2YXIgY2VsbEluZGV4ID0gRG9tSGFuZGxlci5pbmRleChjZWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dENlbGwgPSBjZWxsc1tldmVudC53aGljaCA9PT0gNDAgPyBjZWxsSW5kZXggKyAyIDogY2VsbEluZGV4IC0gMl07XG4gICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBuZXh0Q2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgIGNhc2UgMzc6IHtcbiAgICAgICAgICAgICAgICBjZWxsLnRhYkluZGV4ID0gJy0xJztcbiAgICAgICAgICAgICAgICBsZXQgcHJldkNlbGwgPSBjZWxsLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBwcmV2Q2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdkJhY2t3YXJkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3JpZ2h0IGFycm93XG4gICAgICAgICAgICBjYXNlIDM5OiB7XG4gICAgICAgICAgICAgICAgY2VsbC50YWJJbmRleCA9ICctMSc7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRDZWxsID0gY2VsbC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBuZXh0Q2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZGb3J3YXJkKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2VudGVyXG4gICAgICAgICAgICAvL3NwYWNlXG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAzMjoge1xuICAgICAgICAgICAgICAgIHRoaXMub25ZZWFyU2VsZWN0KGV2ZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9lc2NhcGVcbiAgICAgICAgICAgIGNhc2UgMjc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy90YWJcbiAgICAgICAgICAgIGNhc2UgOToge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhcEZvY3VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvL25vIG9wXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuYXZpZ2F0ZVRvTW9udGgocHJldjogYm9vbGVhbiwgZ3JvdXBJbmRleDogbnVtYmVyLCBmb2N1c0tleT86IHN0cmluZykge1xuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyT2ZNb250aHMgPT09IDEgfHwgZ3JvdXBJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXRlID0geyBiYWNrd2FyZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzS2V5ID0gZm9jdXNLZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZCYWNrd2FyZChldmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2TW9udGhDb250YWluZXIgPSB0aGlzLmNvbnRlbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5jaGlsZHJlbltncm91cEluZGV4IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGZvY3VzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0RGF5Q2VsbCA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShwcmV2TW9udGhDb250YWluZXIsIGZvY3VzS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3REYXlDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdERheUNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbHMgPSBEb21IYW5kbGVyLmZpbmQocHJldk1vbnRoQ29udGFpbmVyLCAnLmNheC1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIHNwYW46bm90KC5jYXgtZGlzYWJsZWQpOm5vdCguY2F4LWluayknKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzQ2VsbCA9IGNlbGxzW2NlbGxzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBmb2N1c0NlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIGZvY3VzQ2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzID09PSAxIHx8IGdyb3VwSW5kZXggPT09IHRoaXMubnVtYmVyT2ZNb250aHMgLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhdGUgPSB7IGJhY2t3YXJkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzS2V5ID0gZm9jdXNLZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZGb3J3YXJkKGV2ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRNb250aENvbnRhaW5lciA9IHRoaXMuY29udGVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2dyb3VwSW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXNLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlDZWxsID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKG5leHRNb250aENvbnRhaW5lciwgZm9jdXNLZXkpO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdERheUNlbGwudGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5Q2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c0NlbGwgPSBEb21IYW5kbGVyLmZpbmRTaW5nbGUobmV4dE1vbnRoQ29udGFpbmVyLCAnLmNheC1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIHNwYW46bm90KC5jYXgtZGlzYWJsZWQpOm5vdCguY2F4LWluayknKTtcbiAgICAgICAgICAgICAgICAgICAgZm9jdXNDZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBmb2N1c0NlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVGb2N1cygpIHtcbiAgICAgICAgbGV0IGNlbGw7XG5cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblN0YXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU3RhdGUuYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9jdXNhYmxlQ2VsbCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblN0YXRlLmJhY2t3YXJkKSBEb21IYW5kbGVyLmZpbmRTaW5nbGUodGhpcy5jb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQsICcuY2F4LWRhdGVwaWNrZXItcHJldicpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBEb21IYW5kbGVyLmZpbmRTaW5nbGUodGhpcy5jb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQsICcuY2F4LWRhdGVwaWNrZXItbmV4dCcpLmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TdGF0ZS5iYWNrd2FyZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbHM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gRG9tSGFuZGxlci5maW5kKHRoaXMuY29udGVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LCAnLmNheC1tb250aHBpY2tlciAuY2F4LW1vbnRocGlja2VyLW1vbnRoOm5vdCguY2F4LWRpc2FibGVkKScpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBEb21IYW5kbGVyLmZpbmQodGhpcy5jb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQsICcuY2F4LXllYXJwaWNrZXIgLmNheC15ZWFycGlja2VyLXllYXI6bm90KC5jYXgtZGlzYWJsZWQpJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IERvbUhhbmRsZXIuZmluZCh0aGlzLmNvbnRlbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCwgdGhpcy5fZm9jdXNLZXkgfHwgJy5jYXgtZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBzcGFuOm5vdCguY2F4LWRpc2FibGVkKTpub3QoLmNheC1pbmspJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbHMgJiYgY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCA9IGNlbGxzW2NlbGxzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwgPSBEb21IYW5kbGVyLmZpbmRTaW5nbGUodGhpcy5jb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQsICcuY2F4LW1vbnRocGlja2VyIC5jYXgtbW9udGhwaWNrZXItbW9udGg6bm90KC5jYXgtZGlzYWJsZWQpJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKHRoaXMuY29udGVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LCAnLmNheC15ZWFycGlja2VyIC5jYXgteWVhcnBpY2tlci15ZWFyOm5vdCguY2F4LWRpc2FibGVkKScpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCA9IERvbUhhbmRsZXIuZmluZFNpbmdsZSh0aGlzLmNvbnRlbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCwgdGhpcy5fZm9jdXNLZXkgfHwgJy5jYXgtZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBzcGFuOm5vdCguY2F4LWRpc2FibGVkKTpub3QoLmNheC1pbmspJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLnRhYkluZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c0tleSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRGb2N1c2FibGVDZWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGlnbk92ZXJsYXkoKTtcbiAgICB9XG5cbiAgICBpbml0Rm9jdXNhYmxlQ2VsbCgpIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gdGhpcy5jb250ZW50Vmlld0NoaWxkPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY2VsbCE6IGFueTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgbGV0IGNlbGxzID0gRG9tSGFuZGxlci5maW5kKGNvbnRlbnRFbCwgJy5jYXgtbW9udGhwaWNrZXIgLmNheC1tb250aHBpY2tlci1tb250aDpub3QoLmNheC1kaXNhYmxlZCknKTtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZENlbGwgPSBEb21IYW5kbGVyLmZpbmRTaW5nbGUoY29udGVudEVsLCAnLmNheC1tb250aHBpY2tlciAuY2F4LW1vbnRocGlja2VyLW1vbnRoLmNheC1oaWdobGlnaHQnKTtcbiAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwpID0+IChjZWxsLnRhYkluZGV4ID0gLTEpKTtcbiAgICAgICAgICAgIGNlbGwgPSBzZWxlY3RlZENlbGwgfHwgY2VsbHNbMF07XG5cbiAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWRDZWxscyA9IERvbUhhbmRsZXIuZmluZChjb250ZW50RWwsICcuY2F4LW1vbnRocGlja2VyIC5jYXgtbW9udGhwaWNrZXItbW9udGguY2F4LWRpc2FibGVkW3RhYmluZGV4ID0gXCIwXCJdJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWRDZWxscy5mb3JFYWNoKChjZWxsKSA9PiAoY2VsbC50YWJJbmRleCA9IC0xKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBsZXQgY2VsbHMgPSBEb21IYW5kbGVyLmZpbmQoY29udGVudEVsLCAnLmNheC15ZWFycGlja2VyIC5jYXgteWVhcnBpY2tlci15ZWFyOm5vdCguY2F4LWRpc2FibGVkKScpO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkQ2VsbCA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShjb250ZW50RWwsICcuY2F4LXllYXJwaWNrZXIgLmNheC15ZWFycGlja2VyLXllYXIuY2F4LWhpZ2hsaWdodCcpO1xuICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4gKGNlbGwudGFiSW5kZXggPSAtMSkpO1xuICAgICAgICAgICAgY2VsbCA9IHNlbGVjdGVkQ2VsbCB8fCBjZWxsc1swXTtcblxuICAgICAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZENlbGxzID0gRG9tSGFuZGxlci5maW5kKGNvbnRlbnRFbCwgJy5jYXgteWVhcnBpY2tlciAuY2F4LXllYXJwaWNrZXIteWVhci5jYXgtZGlzYWJsZWRbdGFiaW5kZXggPSBcIjBcIl0nKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZENlbGxzLmZvckVhY2goKGNlbGwpID0+IChjZWxsLnRhYkluZGV4ID0gLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNlbGwgPSBEb21IYW5kbGVyLmZpbmRTaW5nbGUoY29udGVudEVsLCAnc3Bhbi5jYXgtaGlnaGxpZ2h0Jyk7XG4gICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9kYXlDZWxsID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKGNvbnRlbnRFbCwgJ3RkLmNheC1kYXRlcGlja2VyLXRvZGF5IHNwYW46bm90KC5jYXgtZGlzYWJsZWQpOm5vdCguY2F4LWluayknKTtcbiAgICAgICAgICAgICAgICBpZiAodG9kYXlDZWxsKSBjZWxsID0gdG9kYXlDZWxsO1xuICAgICAgICAgICAgICAgIGVsc2UgY2VsbCA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShjb250ZW50RWwsICcuY2F4LWRhdGVwaWNrZXItY2FsZW5kYXIgdGQgc3Bhbjpub3QoLmNheC1kaXNhYmxlZCk6bm90KC5jYXgtaW5rKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgIGNlbGwudGFiSW5kZXggPSAnMCc7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wcmV2ZW50Rm9jdXMgJiYgKCF0aGlzLm5hdmlnYXRpb25TdGF0ZSB8fCAhdGhpcy5uYXZpZ2F0aW9uU3RhdGUuYnV0dG9uKSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnByZXZlbnRGb2N1cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhcEZvY3VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IGZvY3VzYWJsZUVsZW1lbnRzID0gRG9tSGFuZGxlci5nZXRGb2N1c2FibGVFbGVtZW50cyh0aGlzLmNvbnRlbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzICYmIGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICghZm9jdXNhYmxlRWxlbWVudHNbMF0ub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZvY3VzZWRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2YoZm9jdXNhYmxlRWxlbWVudHNbMF0ub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNlZEluZGV4ID09IC0xIHx8IGZvY3VzZWRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzZWRJbmRleCA9PT0gLTEpIHJldHVybiB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNlZEluZGV4ID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1tmb2N1c2VkSW5kZXggLSAxXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzZWRJbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1swXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhbkluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzW2ldLnRhZ05hbWUgPT09ICdTUEFOJykgc3BhbkluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1tzcGFuSW5kZXhdLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNlZEluZGV4ID09PSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9jdXNUcmFwICYmIGZvY3VzZWRJbmRleCAhPSAtMSkgcmV0dXJuIHRoaXMuaGlkZU92ZXJsYXkoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzZWRJbmRleCArIDFdLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uTW9udGhEcm9wZG93bkNoYW5nZShtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBwYXJzZUludChtKTtcbiAgICAgICAgdGhpcy5vbk1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogdGhpcy5jdXJyZW50TW9udGggKyAxLCB5ZWFyOiB0aGlzLmN1cnJlbnRZZWFyIH0pO1xuICAgICAgICB0aGlzLmNyZWF0ZU1vbnRocyh0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50WWVhcik7XG4gICAgfVxuXG4gICAgb25ZZWFyRHJvcGRvd25DaGFuZ2UoeTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBwYXJzZUludCh5KTtcbiAgICAgICAgdGhpcy5vblllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCArIDEsIHllYXI6IHRoaXMuY3VycmVudFllYXIgfSk7XG4gICAgICAgIHRoaXMuY3JlYXRlTW9udGhzKHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnRZZWFyKTtcbiAgICB9XG5cbiAgICBjb252ZXJ0VG8yNEhvdXIoaG91cnM6IG51bWJlciwgcG06IGJvb2xlYW4pIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzEyJykge1xuICAgICAgICAgICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwbSA/IDEyIDogMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBtID8gaG91cnMgKyAxMiA6IGhvdXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3VycztcbiAgICB9XG5cbiAgICBjb25zdHJhaW5UaW1lKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIsIHNlY29uZDogbnVtYmVyLCBwbTogYm9vbGVhbikge1xuICAgICAgICBsZXQgcmV0dXJuVGltZVRyaXBsZTogbnVtYmVyW10gPSBbaG91ciwgbWludXRlLCBzZWNvbmRdO1xuICAgICAgICBsZXQgbWluSG91cnNFeGNlZWRzMTI6IGJvb2xlYW47XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZEhvdXIgPSB0aGlzLmNvbnZlcnRUbzI0SG91cihob3VyLCBwbSk7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2UgPSB0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgIGlzTXVsdGlwbGUgPSB0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgIGlzTXVsdGlWYWx1ZSA9IGlzUmFuZ2UgfHwgaXNNdWx0aXBsZTtcblxuICAgICAgICBpZiAoaXNNdWx0aVZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW25ldyBEYXRlKCksIG5ldyBEYXRlKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWVbMV0gfHwgdGhpcy52YWx1ZVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlW3RoaXMudmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVEYXRlU3RyaW5nID0gdmFsdWUgPyB2YWx1ZS50b0RhdGVTdHJpbmcoKSA6IG51bGw7XG4gICAgICAgIGxldCBpc01pbkRhdGUgPSB0aGlzLm1pbkRhdGUgJiYgdmFsdWVEYXRlU3RyaW5nICYmIHRoaXMubWluRGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdmFsdWVEYXRlU3RyaW5nO1xuICAgICAgICBsZXQgaXNNYXhEYXRlID0gdGhpcy5tYXhEYXRlICYmIHZhbHVlRGF0ZVN0cmluZyAmJiB0aGlzLm1heERhdGUudG9EYXRlU3RyaW5nKCkgPT09IHZhbHVlRGF0ZVN0cmluZztcblxuICAgICAgICBpZiAoaXNNaW5EYXRlKSB7XG4gICAgICAgICAgICBtaW5Ib3Vyc0V4Y2VlZHMxMiA9IHRoaXMubWluRGF0ZS5nZXRIb3VycygpID49IDEyO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAgIHRydWUgLy8gaW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoXG4gICAgICAgICkge1xuICAgICAgICAgICAgY2FzZSBpc01pbkRhdGUgJiYgbWluSG91cnNFeGNlZWRzMTIgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgPT09IDEyICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID4gY29udmVydGVkSG91cjpcbiAgICAgICAgICAgICAgICByZXR1cm5UaW1lVHJpcGxlWzBdID0gMTE7XG4gICAgICAgICAgICBjYXNlIGlzTWluRGF0ZSAmJiB0aGlzLm1pbkRhdGUuZ2V0SG91cnMoKSA9PT0gY29udmVydGVkSG91ciAmJiB0aGlzLm1pbkRhdGUuZ2V0TWludXRlcygpID4gbWludXRlOlxuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMV0gPSB0aGlzLm1pbkRhdGUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgY2FzZSBpc01pbkRhdGUgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgPT09IGNvbnZlcnRlZEhvdXIgJiYgdGhpcy5taW5EYXRlLmdldE1pbnV0ZXMoKSA9PT0gbWludXRlICYmIHRoaXMubWluRGF0ZS5nZXRTZWNvbmRzKCkgPiBzZWNvbmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuVGltZVRyaXBsZVsyXSA9IHRoaXMubWluRGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGlzTWluRGF0ZSAmJiAhbWluSG91cnNFeGNlZWRzMTIgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgLSAxID09PSBjb252ZXJ0ZWRIb3VyICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID4gY29udmVydGVkSG91cjpcbiAgICAgICAgICAgICAgICByZXR1cm5UaW1lVHJpcGxlWzBdID0gMTE7XG4gICAgICAgICAgICAgICAgdGhpcy5wbSA9IHRydWU7XG4gICAgICAgICAgICBjYXNlIGlzTWluRGF0ZSAmJiB0aGlzLm1pbkRhdGUuZ2V0SG91cnMoKSA9PT0gY29udmVydGVkSG91ciAmJiB0aGlzLm1pbkRhdGUuZ2V0TWludXRlcygpID4gbWludXRlOlxuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMV0gPSB0aGlzLm1pbkRhdGUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgY2FzZSBpc01pbkRhdGUgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgPT09IGNvbnZlcnRlZEhvdXIgJiYgdGhpcy5taW5EYXRlLmdldE1pbnV0ZXMoKSA9PT0gbWludXRlICYmIHRoaXMubWluRGF0ZS5nZXRTZWNvbmRzKCkgPiBzZWNvbmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuVGltZVRyaXBsZVsyXSA9IHRoaXMubWluRGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgaXNNaW5EYXRlICYmIG1pbkhvdXJzRXhjZWVkczEyICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID4gY29udmVydGVkSG91ciAmJiBjb252ZXJ0ZWRIb3VyICE9PSAxMjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRIb3VyUE0odGhpcy5taW5EYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMF0gPSB0aGlzLmN1cnJlbnRIb3VyO1xuICAgICAgICAgICAgY2FzZSBpc01pbkRhdGUgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgPT09IGNvbnZlcnRlZEhvdXIgJiYgdGhpcy5taW5EYXRlLmdldE1pbnV0ZXMoKSA+IG1pbnV0ZTpcbiAgICAgICAgICAgICAgICByZXR1cm5UaW1lVHJpcGxlWzFdID0gdGhpcy5taW5EYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIGNhc2UgaXNNaW5EYXRlICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID09PSBjb252ZXJ0ZWRIb3VyICYmIHRoaXMubWluRGF0ZS5nZXRNaW51dGVzKCkgPT09IG1pbnV0ZSAmJiB0aGlzLm1pbkRhdGUuZ2V0U2Vjb25kcygpID4gc2Vjb25kOlxuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMl0gPSB0aGlzLm1pbkRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpc01pbkRhdGUgJiYgdGhpcy5taW5EYXRlLmdldEhvdXJzKCkgPiBjb252ZXJ0ZWRIb3VyOlxuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMF0gPSB0aGlzLm1pbkRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgIGNhc2UgaXNNaW5EYXRlICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID09PSBjb252ZXJ0ZWRIb3VyICYmIHRoaXMubWluRGF0ZS5nZXRNaW51dGVzKCkgPiBtaW51dGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuVGltZVRyaXBsZVsxXSA9IHRoaXMubWluRGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICBjYXNlIGlzTWluRGF0ZSAmJiB0aGlzLm1pbkRhdGUuZ2V0SG91cnMoKSA9PT0gY29udmVydGVkSG91ciAmJiB0aGlzLm1pbkRhdGUuZ2V0TWludXRlcygpID09PSBtaW51dGUgJiYgdGhpcy5taW5EYXRlLmdldFNlY29uZHMoKSA+IHNlY29uZDpcbiAgICAgICAgICAgICAgICByZXR1cm5UaW1lVHJpcGxlWzJdID0gdGhpcy5taW5EYXRlLmdldFNlY29uZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaXNNYXhEYXRlICYmIHRoaXMubWF4RGF0ZS5nZXRIb3VycygpIDwgY29udmVydGVkSG91cjpcbiAgICAgICAgICAgICAgICByZXR1cm5UaW1lVHJpcGxlWzBdID0gdGhpcy5tYXhEYXRlLmdldEhvdXJzKCk7XG4gICAgICAgICAgICBjYXNlIGlzTWF4RGF0ZSAmJiB0aGlzLm1heERhdGUuZ2V0SG91cnMoKSA9PT0gY29udmVydGVkSG91ciAmJiB0aGlzLm1heERhdGUuZ2V0TWludXRlcygpIDwgbWludXRlOlxuICAgICAgICAgICAgICAgIHJldHVyblRpbWVUcmlwbGVbMV0gPSB0aGlzLm1heERhdGUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgY2FzZSBpc01heERhdGUgJiYgdGhpcy5tYXhEYXRlLmdldEhvdXJzKCkgPT09IGNvbnZlcnRlZEhvdXIgJiYgdGhpcy5tYXhEYXRlLmdldE1pbnV0ZXMoKSA9PT0gbWludXRlICYmIHRoaXMubWF4RGF0ZS5nZXRTZWNvbmRzKCkgPCBzZWNvbmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuVGltZVRyaXBsZVsyXSA9IHRoaXMubWF4RGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0dXJuVGltZVRyaXBsZTtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnRIb3VyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJldkhvdXIgPSB0aGlzLmN1cnJlbnRIb3VyID8/IDA7XG4gICAgICAgIGxldCBuZXdIb3VyID0gKHRoaXMuY3VycmVudEhvdXIgPz8gMCkgKyB0aGlzLnN0ZXBIb3VyO1xuICAgICAgICBsZXQgbmV3UE0gPSB0aGlzLnBtO1xuICAgICAgICBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcyNCcpIG5ld0hvdXIgPSBuZXdIb3VyID49IDI0ID8gbmV3SG91ciAtIDI0IDogbmV3SG91cjtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicpIHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSB0aGUgQU0vUE0gYnJlYWssIG5vdyBhZnRlclxuICAgICAgICAgICAgaWYgKHByZXZIb3VyIDwgMTIgJiYgbmV3SG91ciA+IDExKSB7XG4gICAgICAgICAgICAgICAgbmV3UE0gPSAhdGhpcy5wbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0hvdXIgPSBuZXdIb3VyID49IDEzID8gbmV3SG91ciAtIDEyIDogbmV3SG91cjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvZ2dsZUFNUE1JZk5vdE1pbkRhdGUobmV3UE0pO1xuICAgICAgICBbdGhpcy5jdXJyZW50SG91ciwgdGhpcy5jdXJyZW50TWludXRlLCB0aGlzLmN1cnJlbnRTZWNvbmRdID0gdGhpcy5jb25zdHJhaW5UaW1lKG5ld0hvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSEsIHRoaXMuY3VycmVudFNlY29uZCEsIG5ld1BNISk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQU1QTUlmTm90TWluRGF0ZShuZXdQTTogYm9vbGVhbikge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgICAgIGlmICgodGhpcy5zZWxlY3Rpb25Nb2RlID09ICdyYW5nZScgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlID09ICdtdWx0aXBsZScpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVEYXRlU3RyaW5nID0gdmFsdWUgPyB2YWx1ZS50b0RhdGVTdHJpbmcoKSA6IG51bGw7XG4gICAgICAgIGxldCBpc01pbkRhdGUgPSB0aGlzLm1pbkRhdGUgJiYgdmFsdWVEYXRlU3RyaW5nICYmIHRoaXMubWluRGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdmFsdWVEYXRlU3RyaW5nO1xuICAgICAgICBpZiAoaXNNaW5EYXRlICYmIHRoaXMubWluRGF0ZS5nZXRIb3VycygpID49IDEyKSB7XG4gICAgICAgICAgICB0aGlzLnBtID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG0gPSBuZXdQTTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVGltZVBpY2tlckVsZW1lbnRNb3VzZURvd24oZXZlbnQ6IEV2ZW50LCB0eXBlOiBudW1iZXIsIGRpcmVjdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXBlYXQoZXZlbnQsIG51bGwsIHR5cGUsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVQaWNrZXJUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblRpbWVQaWNrZXJFbGVtZW50TW91c2VMZWF2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMudGltZVBpY2tlclRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZVBpY2tlclRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlcGVhdChldmVudDogRXZlbnQgfCBudWxsLCBpbnRlcnZhbDogbnVtYmVyIHwgbnVsbCwgdHlwZTogbnVtYmVyIHwgbnVsbCwgZGlyZWN0aW9uOiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIGxldCBpID0gaW50ZXJ2YWwgfHwgNTAwO1xuXG4gICAgICAgIHRoaXMuY2xlYXJUaW1lUGlja2VyVGltZXIoKTtcbiAgICAgICAgdGhpcy50aW1lUGlja2VyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVwZWF0KGV2ZW50LCAxMDAsIHR5cGUsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9LCBpKTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAxKSB0aGlzLmluY3JlbWVudEhvdXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZWNyZW1lbnRIb3VyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDEpIHRoaXMuaW5jcmVtZW50TWludXRlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVjcmVtZW50TWludXRlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDEpIHRoaXMuaW5jcmVtZW50U2Vjb25kKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVjcmVtZW50U2Vjb25kKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRmaWVsZCgpO1xuICAgIH1cblxuICAgIGNsZWFyVGltZVBpY2tlclRpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVQaWNrZXJUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXJUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWNyZW1lbnRIb3VyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld0hvdXIgPSAodGhpcy5jdXJyZW50SG91ciA/PyAwKSAtIHRoaXMuc3RlcEhvdXI7XG4gICAgICAgIGxldCBuZXdQTSA9IHRoaXMucG07XG4gICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzI0JykgbmV3SG91ciA9IG5ld0hvdXIgPCAwID8gMjQgKyBuZXdIb3VyIDogbmV3SG91cjtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgYXQgbm9vbi9taWRuaWdodCwgdGhlbiBzd2l0Y2hcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRIb3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIG5ld1BNID0gIXRoaXMucG07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdIb3VyID0gbmV3SG91ciA8PSAwID8gMTIgKyBuZXdIb3VyIDogbmV3SG91cjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvZ2dsZUFNUE1JZk5vdE1pbkRhdGUobmV3UE0pO1xuICAgICAgICBbdGhpcy5jdXJyZW50SG91ciwgdGhpcy5jdXJyZW50TWludXRlLCB0aGlzLmN1cnJlbnRTZWNvbmRdID0gdGhpcy5jb25zdHJhaW5UaW1lKG5ld0hvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSEsIHRoaXMuY3VycmVudFNlY29uZCEsIG5ld1BNISk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaW5jcmVtZW50TWludXRlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld01pbnV0ZSA9ICh0aGlzLmN1cnJlbnRNaW51dGUgPz8gMCkgKyB0aGlzLnN0ZXBNaW51dGU7XG4gICAgICAgIG5ld01pbnV0ZSA9IG5ld01pbnV0ZSA+IDU5ID8gbmV3TWludXRlIC0gNjAgOiBuZXdNaW51dGU7XG4gICAgICAgIFt0aGlzLmN1cnJlbnRIb3VyLCB0aGlzLmN1cnJlbnRNaW51dGUsIHRoaXMuY3VycmVudFNlY29uZF0gPSB0aGlzLmNvbnN0cmFpblRpbWUodGhpcy5jdXJyZW50SG91ciwgbmV3TWludXRlLCB0aGlzLmN1cnJlbnRTZWNvbmQhLCB0aGlzLnBtISk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50TWludXRlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld01pbnV0ZSA9ICh0aGlzLmN1cnJlbnRNaW51dGUgPz8gMCkgLSB0aGlzLnN0ZXBNaW51dGU7XG4gICAgICAgIG5ld01pbnV0ZSA9IG5ld01pbnV0ZSA8IDAgPyA2MCArIG5ld01pbnV0ZSA6IG5ld01pbnV0ZTtcbiAgICAgICAgW3RoaXMuY3VycmVudEhvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSwgdGhpcy5jdXJyZW50U2Vjb25kXSA9IHRoaXMuY29uc3RyYWluVGltZSh0aGlzLmN1cnJlbnRIb3VyLCBuZXdNaW51dGUsIHRoaXMuY3VycmVudFNlY29uZCwgdGhpcy5wbSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaW5jcmVtZW50U2Vjb25kKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IG5ld1NlY29uZCA9IDxhbnk+dGhpcy5jdXJyZW50U2Vjb25kICsgdGhpcy5zdGVwU2Vjb25kO1xuICAgICAgICBuZXdTZWNvbmQgPSBuZXdTZWNvbmQgPiA1OSA/IG5ld1NlY29uZCAtIDYwIDogbmV3U2Vjb25kO1xuICAgICAgICBbdGhpcy5jdXJyZW50SG91ciwgdGhpcy5jdXJyZW50TWludXRlLCB0aGlzLmN1cnJlbnRTZWNvbmRdID0gdGhpcy5jb25zdHJhaW5UaW1lKHRoaXMuY3VycmVudEhvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSwgbmV3U2Vjb25kLCB0aGlzLnBtKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnRTZWNvbmQoZXZlbnQ6IGFueSkge1xuICAgICAgICBsZXQgbmV3U2Vjb25kID0gPGFueT50aGlzLmN1cnJlbnRTZWNvbmQgLSB0aGlzLnN0ZXBTZWNvbmQ7XG4gICAgICAgIG5ld1NlY29uZCA9IG5ld1NlY29uZCA8IDAgPyA2MCArIG5ld1NlY29uZCA6IG5ld1NlY29uZDtcbiAgICAgICAgW3RoaXMuY3VycmVudEhvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSwgdGhpcy5jdXJyZW50U2Vjb25kXSA9IHRoaXMuY29uc3RyYWluVGltZSh0aGlzLmN1cnJlbnRIb3VyLCB0aGlzLmN1cnJlbnRNaW51dGUsIG5ld1NlY29uZCwgdGhpcy5wbSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdXBkYXRlVGltZSgpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNSYW5nZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWVbMV0gfHwgdGhpcy52YWx1ZVswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpIDogbmV3IERhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRIb3VyID09PSAxMikgdmFsdWUuc2V0SG91cnModGhpcy5wbSA/IDEyIDogMCk7XG4gICAgICAgICAgICBlbHNlIHZhbHVlLnNldEhvdXJzKHRoaXMucG0gPyA8bnVtYmVyPnRoaXMuY3VycmVudEhvdXIgKyAxMiA6IHRoaXMuY3VycmVudEhvdXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUuc2V0SG91cnModGhpcy5jdXJyZW50SG91cik7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZS5zZXRNaW51dGVzKHRoaXMuY3VycmVudE1pbnV0ZSk7XG4gICAgICAgIHZhbHVlLnNldFNlY29uZHModGhpcy5jdXJyZW50U2Vjb25kKTtcbiAgICAgICAgaWYgKHRoaXMuaXNSYW5nZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZVsxXSkgdmFsdWUgPSBbdGhpcy52YWx1ZVswXSwgdmFsdWVdO1xuICAgICAgICAgICAgZWxzZSB2YWx1ZSA9IFt2YWx1ZSwgbnVsbF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gWy4uLnRoaXMudmFsdWUuc2xpY2UoMCwgLTEpLCB2YWx1ZV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dGZpZWxkKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQU1QTShldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IG5ld1BNID0gIXRoaXMucG07XG4gICAgICAgIHRoaXMucG0gPSBuZXdQTTtcbiAgICAgICAgW3RoaXMuY3VycmVudEhvdXIsIHRoaXMuY3VycmVudE1pbnV0ZSwgdGhpcy5jdXJyZW50U2Vjb25kXSA9IHRoaXMuY29uc3RyYWluVGltZSh0aGlzLmN1cnJlbnRIb3VyLCB0aGlzLmN1cnJlbnRNaW51dGUsIHRoaXMuY3VycmVudFNlY29uZCwgbmV3UE0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBvblVzZXJJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCB8IGFueSkge1xuICAgICAgICAvLyBJRSAxMSBXb3JrYXJvdW5kIGZvciBpbnB1dCBwbGFjZWhvbGRlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL2NheC1kZXNpZ24tc3lzdGVtL2lzc3Vlcy8yMDI2XG4gICAgICAgIGlmICghdGhpcy5pc0tleWRvd24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzS2V5ZG93biA9IGZhbHNlO1xuXG4gICAgICAgIGxldCB2YWwgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS52YWx1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucGFyc2VWYWx1ZUZyb21TdHJpbmcodmFsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRTZWxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVSSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmtlZXBJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy9pbnZhbGlkIGRhdGVcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMua2VlcEludmFsaWQgPyB2YWwgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGxlZCA9ICh2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKSBhcyBhbnk7XG4gICAgICAgIHRoaXMub25JbnB1dC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkU2VsZWN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGVTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RhYmxlKHZhbHVlLmdldERhdGUoKSwgdmFsdWUuZ2V0TW9udGgoKSwgdmFsdWUuZ2V0RnVsbFllYXIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpc1ZhbGlkID0gdmFsdWUuZXZlcnkoKHY6IGFueSkgPT4gdGhpcy5pc1NlbGVjdGFibGUodi5nZXREYXRlKCksIHYuZ2V0TW9udGgoKSwgdi5nZXRGdWxsWWVhcigpLCBmYWxzZSkpO1xuICAgICAgICBpZiAoaXNWYWxpZCAmJiB0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHZhbHVlLmxlbmd0aCA9PT0gMSB8fCAodmFsdWUubGVuZ3RoID4gMSAmJiB2YWx1ZVsxXSA+PSB2YWx1ZVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgcGFyc2VWYWx1ZUZyb21TdHJpbmcodGV4dDogc3RyaW5nKTogRGF0ZSB8IERhdGVbXSB8IG51bGwge1xuICAgICAgICBpZiAoIXRleHQgfHwgdGV4dC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZTogYW55O1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZURhdGVUaW1lKHRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKSB7XG4gICAgICAgICAgICBsZXQgdG9rZW5zID0gdGV4dC5zcGxpdCh0aGlzLm11bHRpcGxlU2VwYXJhdG9yKTtcbiAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5wdXNoKHRoaXMucGFyc2VEYXRlVGltZSh0b2tlbi50cmltKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUmFuZ2VTZWxlY3Rpb24oKSkge1xuICAgICAgICAgICAgbGV0IHRva2VucyA9IHRleHQuc3BsaXQoJyAnICsgdGhpcy5yYW5nZVNlcGFyYXRvciArICcgJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtpXSA9IHRoaXMucGFyc2VEYXRlVGltZSh0b2tlbnNbaV0udHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwYXJzZURhdGVUaW1lKHRleHQ6IGFueSk6IERhdGUge1xuICAgICAgICBsZXQgZGF0ZTogRGF0ZTtcbiAgICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IHRleHQuc3BsaXQoJyAnKTtcblxuICAgICAgICBpZiAodGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlVGltZShkYXRlLCBwYXJ0c1swXSwgcGFydHNbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRoaXMuZ2V0RGF0ZUZvcm1hdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgYW1wbSA9IHRoaXMuaG91ckZvcm1hdCA9PSAnMTInID8gcGFydHMucG9wKCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyaW5nID0gcGFydHMucG9wKCk7XG5cbiAgICAgICAgICAgICAgICBkYXRlID0gdGhpcy5wYXJzZURhdGUocGFydHMuam9pbignICcpLCBkYXRlRm9ybWF0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlVGltZShkYXRlLCB0aW1lU3RyaW5nLCBhbXBtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZSA9IHRoaXMucGFyc2VEYXRlKHRleHQsIGRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVUaW1lKHZhbHVlOiBhbnksIHRpbWVTdHJpbmc6IGFueSwgYW1wbTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzEyJyAmJiAhYW1wbSkge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgVGltZSc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBtID0gYW1wbSA9PT0gJ1BNJyB8fCBhbXBtID09PSAncG0nO1xuICAgICAgICBsZXQgdGltZSA9IHRoaXMucGFyc2VUaW1lKHRpbWVTdHJpbmcpO1xuICAgICAgICB2YWx1ZS5zZXRIb3Vycyh0aW1lLmhvdXIpO1xuICAgICAgICB2YWx1ZS5zZXRNaW51dGVzKHRpbWUubWludXRlKTtcbiAgICAgICAgdmFsdWUuc2V0U2Vjb25kcyh0aW1lLnNlY29uZCk7XG4gICAgfVxuXG4gICAgaXNWYWxpZERhdGUoZGF0ZTogYW55KSB7XG4gICAgICAgIHJldHVybiBPYmplY3RVdGlscy5pc0RhdGUoZGF0ZSkgJiYgT2JqZWN0VXRpbHMuaXNOb3RFbXB0eShkYXRlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVVSSgpIHtcbiAgICAgICAgbGV0IHByb3BWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICAgIHByb3BWYWx1ZSA9IHByb3BWYWx1ZVsxXSB8fCBwcm9wVmFsdWVbMF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsID0gdGhpcy5kZWZhdWx0RGF0ZSAmJiB0aGlzLmlzVmFsaWREYXRlKHRoaXMuZGVmYXVsdERhdGUpICYmICF0aGlzLnZhbHVlID8gdGhpcy5kZWZhdWx0RGF0ZSA6IHByb3BWYWx1ZSAmJiB0aGlzLmlzVmFsaWREYXRlKHByb3BWYWx1ZSkgPyBwcm9wVmFsdWUgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gdmFsLmdldE1vbnRoKCk7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIgPSB2YWwuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVNb250aHModGhpcy5jdXJyZW50TW9udGgsIHRoaXMuY3VycmVudFllYXIpO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lIHx8IHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEhvdXJQTSh2YWwuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNaW51dGUgPSB2YWwuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2Vjb25kID0gdmFsLmdldFNlY29uZHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dPdmVybGF5KCkge1xuICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVUkoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRvdWNoVUkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZlbnRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZU92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRmaWVsZFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lUGlja2VyVGltZXIoKTtcblxuICAgICAgICBpZiAodGhpcy50b3VjaFVJKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVNb2RhbGl0eSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICB0b2dnbGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd092ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PdmVybGF5QW5pbWF0aW9uU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudG9TdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAndmlzaWJsZSc6XG4gICAgICAgICAgICBjYXNlICd2aXNpYmxlVG91Y2hVSSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkgPSBldmVudC5lbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXk/LnNldEF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZVNlbGVjdG9yIGFzIHN0cmluZywgJycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZE92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvWkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b3VjaFVJKSBaSW5kZXhVdGlscy5zZXQoJ21vZGFsJywgdGhpcy5vdmVybGF5LCB0aGlzLmJhc2VaSW5kZXggfHwgdGhpcy5jb25maWcuekluZGV4Lm1vZGFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgWkluZGV4VXRpbHMuc2V0KCdvdmVybGF5JywgdGhpcy5vdmVybGF5LCB0aGlzLmJhc2VaSW5kZXggfHwgdGhpcy5jb25maWcuekluZGV4Lm92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnbk92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNob3cuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICd2b2lkJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUhpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2UuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk92ZXJsYXlBbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnRvU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgY2FzZSAndmlzaWJsZVRvdWNoVUknOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZERvY3VtZW50UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3ZvaWQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9aSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgWkluZGV4VXRpbHMuY2xlYXIoZXZlbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwZW5kT3ZlcmxheSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kVG8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFwcGVuZFRvID09PSAnYm9keScpIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCg8SFRNTEVsZW1lbnQ+dGhpcy5vdmVybGF5KTtcbiAgICAgICAgICAgIGVsc2UgRG9tSGFuZGxlci5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXksIHRoaXMuYXBwZW5kVG8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdG9yZU92ZXJsYXlBcHBlbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgdGhpcy5hcHBlbmRUbykge1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhbGlnbk92ZXJsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdWNoVUkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTW9kYWxpdHkodGhpcy5vdmVybGF5KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFwcGVuZFRvKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5LnN0eWxlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkuc3R5bGUud2lkdGggPSBEb21IYW5kbGVyLmdldE91dGVyV2lkdGgodGhpcy5vdmVybGF5KSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm92ZXJsYXkuc3R5bGUubWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5zdHlsZS5taW5XaWR0aCA9IERvbUhhbmRsZXIuZ2V0T3V0ZXJXaWR0aCh0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5LnN0eWxlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkuc3R5bGUud2lkdGggPSBEb21IYW5kbGVyLmdldE91dGVyV2lkdGgodGhpcy5pbnB1dGZpZWxkVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50KSArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLmFic29sdXRlUG9zaXRpb24odGhpcy5vdmVybGF5LCB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLnJlbGF0aXZlUG9zaXRpb24odGhpcy5vdmVybGF5LCB0aGlzLmlucHV0ZmllbGRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5hYmxlTW9kYWxpdHkoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5tYXNrICYmIHRoaXMudG91Y2hVSSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5tYXNrLCAnekluZGV4JywgU3RyaW5nKHBhcnNlSW50KGVsZW1lbnQuc3R5bGUuekluZGV4KSAtIDEpKTtcbiAgICAgICAgICAgIGxldCBtYXNrU3R5bGVDbGFzcyA9ICdjYXgtY29tcG9uZW50LW92ZXJsYXkgY2F4LWRhdGVwaWNrZXItbWFzayBjYXgtZGF0ZXBpY2tlci1tYXNrLXNjcm9sbGJsb2NrZXIgY2F4LWNvbXBvbmVudC1vdmVybGF5IGNheC1jb21wb25lbnQtb3ZlcmxheS1lbnRlcic7XG4gICAgICAgICAgICBEb21IYW5kbGVyLmFkZE11bHRpcGxlQ2xhc3Nlcyh0aGlzLm1hc2ssIG1hc2tTdHlsZUNsYXNzKTtcblxuICAgICAgICAgICAgdGhpcy5tYXNrQ2xpY2tMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMubWFzaywgJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNb2RhbGl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMubWFzayk7XG4gICAgICAgICAgICBEb21IYW5kbGVyLmJsb2NrQm9keVNjcm9sbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZU1vZGFsaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5tYXNrKSB7XG4gICAgICAgICAgICBEb21IYW5kbGVyLmFkZENsYXNzKHRoaXMubWFzaywgJ2NheC1jb21wb25lbnQtb3ZlcmxheS1sZWF2ZScpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGlvbkVuZExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25FbmRMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMubWFzaywgJ2FuaW1hdGlvbmVuZCcsIHRoaXMuZGVzdHJveU1hc2suYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95TWFzaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hc2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5tYXNrKTtcbiAgICAgICAgbGV0IGJvZHlDaGlsZHJlbiA9IHRoaXMuZG9jdW1lbnQuYm9keS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhhc0Jsb2NrZXJNYXNrcyE6IGJvb2xlYW47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYm9keUNoaWxkID0gYm9keUNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKERvbUhhbmRsZXIuaGFzQ2xhc3MoYm9keUNoaWxkLCAnY2F4LWRhdGVwaWNrZXItbWFzay1zY3JvbGxibG9ja2VyJykpIHtcbiAgICAgICAgICAgICAgICBoYXNCbG9ja2VyTWFza3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNCbG9ja2VyTWFza3MpIHtcbiAgICAgICAgICAgIERvbUhhbmRsZXIudW5ibG9ja0JvZHlTY3JvbGwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5iaW5kQW5pbWF0aW9uRW5kTGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy51bmJpbmRNYXNrQ2xpY2tMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLm1hc2sgPSBudWxsO1xuICAgIH1cblxuICAgIHVuYmluZE1hc2tDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5tYXNrQ2xpY2tMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5tYXNrQ2xpY2tMaXN0ZW5lcigpO1xuICAgICAgICAgICAgdGhpcy5tYXNrQ2xpY2tMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmJpbmRBbmltYXRpb25FbmRMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uRW5kTGlzdGVuZXIgJiYgdGhpcy5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkVuZExpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkVuZExpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wYXJzZVZhbHVlRnJvbVN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmtlZXBJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0ZmllbGQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVVSSgpO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHZhbDtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBnZXREYXRlRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRm9ybWF0IHx8IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ2RhdGVGb3JtYXQnKTtcbiAgICB9XG5cbiAgICBnZXRGaXJzdERhdGVPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXJzdERheU9mV2VlayB8fCB0aGlzLmdldFRyYW5zbGF0aW9uKFRyYW5zbGF0aW9uS2V5cy5GSVJTVF9EQVlfT0ZfV0VFSyk7XG4gICAgfVxuXG4gICAgLy8gUG9ydGVkIGZyb20ganF1ZXJ5LXVpIGRhdGVwaWNrZXIgZm9ybWF0RGF0ZVxuICAgIGZvcm1hdERhdGUoZGF0ZTogYW55LCBmb3JtYXQ6IGFueSkge1xuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpRm9ybWF0ITogYW55O1xuICAgICAgICBjb25zdCBsb29rQWhlYWQgPSAobWF0Y2g6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBpRm9ybWF0ICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT09IG1hdGNoO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlGb3JtYXQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0TnVtYmVyID0gKG1hdGNoOiBzdHJpbmcsIHZhbHVlOiBhbnksIGxlbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9ICcnICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGxvb2tBaGVhZChtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bS5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9ICcwJyArIG51bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcm1hdE5hbWUgPSAobWF0Y2g6IHN0cmluZywgdmFsdWU6IGFueSwgc2hvcnROYW1lczogYW55LCBsb25nTmFtZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb29rQWhlYWQobWF0Y2gpID8gbG9uZ05hbWVzW3ZhbHVlXSA6IHNob3J0TmFtZXNbdmFsdWVdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgICBsZXQgbGl0ZXJhbCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICBmb3IgKGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT09IFwiJ1wiICYmICFsb29rQWhlYWQoXCInXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGZvcm1hdE51bWJlcignZCcsIGRhdGUuZ2V0RGF0ZSgpLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBmb3JtYXROYW1lKCdEJywgZGF0ZS5nZXREYXkoKSwgdGhpcy5nZXRUcmFuc2xhdGlvbihUcmFuc2xhdGlvbktleXMuREFZX05BTUVTX1NIT1JUKSwgdGhpcy5nZXRUcmFuc2xhdGlvbihUcmFuc2xhdGlvbktleXMuREFZX05BTUVTKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gZm9ybWF0TnVtYmVyKCdvJywgTWF0aC5yb3VuZCgobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDApLmdldFRpbWUoKSkgLyA4NjQwMDAwMCksIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGZvcm1hdE51bWJlcignbScsIGRhdGUuZ2V0TW9udGgoKSArIDEsIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGZvcm1hdE5hbWUoJ00nLCBkYXRlLmdldE1vbnRoKCksIHRoaXMuZ2V0VHJhbnNsYXRpb24oVHJhbnNsYXRpb25LZXlzLk1PTlRIX05BTUVTX1NIT1JUKSwgdGhpcy5nZXRUcmFuc2xhdGlvbihUcmFuc2xhdGlvbktleXMuTU9OVEhfTkFNRVMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBsb29rQWhlYWQoJ3knKSA/IGRhdGUuZ2V0RnVsbFllYXIoKSA6IChkYXRlLmdldEZ1bGxZZWFyKCkgJSAxMDAgPCAxMCA/ICcwJyA6ICcnKSArIChkYXRlLmdldEZ1bGxZZWFyKCkgJSAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGRhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGRhdGUuZ2V0VGltZSgpICogMTAwMDAgKyA8bnVtYmVyPnRoaXMudGlja3NUbzE5NzA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWQoXCInXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBcIidcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgZm9ybWF0VGltZShkYXRlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgbGV0IHNlY29uZHMgPSBkYXRlLmdldFNlY29uZHMoKTtcblxuICAgICAgICBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicgJiYgaG91cnMgPiAxMSAmJiBob3VycyAhPSAxMikge1xuICAgICAgICAgICAgaG91cnMgLT0gMTI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicpIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBob3VycyA9PT0gMCA/IDEyIDogaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9ICc6JztcbiAgICAgICAgb3V0cHV0ICs9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gJzonO1xuICAgICAgICAgICAgb3V0cHV0ICs9IHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaG91ckZvcm1hdCA9PSAnMTInKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gZGF0ZS5nZXRIb3VycygpID4gMTEgPyAnIFBNJyA6ICcgQU0nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwYXJzZVRpbWUodmFsdWU6IGFueSkge1xuICAgICAgICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IHZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgICAgIGxldCB2YWxpZFRva2VuTGVuZ3RoID0gdGhpcy5zaG93U2Vjb25kcyA/IDMgOiAyO1xuXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoICE9PSB2YWxpZFRva2VuTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyAnSW52YWxpZCB0aW1lJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoID0gcGFyc2VJbnQodG9rZW5zWzBdKTtcbiAgICAgICAgbGV0IG0gPSBwYXJzZUludCh0b2tlbnNbMV0pO1xuICAgICAgICBsZXQgcyA9IHRoaXMuc2hvd1NlY29uZHMgPyBwYXJzZUludCh0b2tlbnNbMl0pIDogbnVsbDtcblxuICAgICAgICBpZiAoaXNOYU4oaCkgfHwgaXNOYU4obSkgfHwgaCA+IDIzIHx8IG0gPiA1OSB8fCAodGhpcy5ob3VyRm9ybWF0ID09ICcxMicgJiYgaCA+IDEyKSB8fCAodGhpcy5zaG93U2Vjb25kcyAmJiAoaXNOYU4oPGFueT5zKSB8fCA8YW55PnMgPiA1OSkpKSB7XG4gICAgICAgICAgICB0aHJvdyAnSW52YWxpZCB0aW1lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhvdXJGb3JtYXQgPT0gJzEyJykge1xuICAgICAgICAgICAgICAgIGlmIChoICE9PSAxMiAmJiB0aGlzLnBtKSB7XG4gICAgICAgICAgICAgICAgICAgIGggKz0gMTI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wbSAmJiBoID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBoIC09IDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgaG91cjogaCwgbWludXRlOiBtLCBzZWNvbmQ6IHMgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcnRlZCBmcm9tIGpxdWVyeS11aSBkYXRlcGlja2VyIHBhcnNlRGF0ZVxuICAgIHBhcnNlRGF0ZSh2YWx1ZTogYW55LCBmb3JtYXQ6IGFueSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgYXJndW1lbnRzJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZSArICcnO1xuICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpRm9ybWF0ITogYW55LFxuICAgICAgICAgICAgZGltLFxuICAgICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgICBpVmFsdWUgPSAwLFxuICAgICAgICAgICAgc2hvcnRZZWFyQ3V0b2ZmID0gdHlwZW9mIHRoaXMuc2hvcnRZZWFyQ3V0b2ZmICE9PSAnc3RyaW5nJyA/IHRoaXMuc2hvcnRZZWFyQ3V0b2ZmIDogKG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCkgKyBwYXJzZUludCh0aGlzLnNob3J0WWVhckN1dG9mZiwgMTApLFxuICAgICAgICAgICAgeWVhciA9IC0xLFxuICAgICAgICAgICAgbW9udGggPSAtMSxcbiAgICAgICAgICAgIGRheSA9IC0xLFxuICAgICAgICAgICAgZG95ID0gLTEsXG4gICAgICAgICAgICBsaXRlcmFsID0gZmFsc2UsXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgbG9va0FoZWFkID0gKG1hdGNoOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxlbmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PT0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaUZvcm1hdCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXROdW1iZXIgPSAobWF0Y2g6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc0RvdWJsZWQgPSBsb29rQWhlYWQobWF0Y2gpLFxuICAgICAgICAgICAgICAgICAgICBzaXplID0gbWF0Y2ggPT09ICdAJyA/IDE0IDogbWF0Y2ggPT09ICchJyA/IDIwIDogbWF0Y2ggPT09ICd5JyAmJiBpc0RvdWJsZWQgPyA0IDogbWF0Y2ggPT09ICdvJyA/IDMgOiAyLFxuICAgICAgICAgICAgICAgICAgICBtaW5TaXplID0gbWF0Y2ggPT09ICd5JyA/IHNpemUgOiAxLFxuICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSBuZXcgUmVnRXhwKCdeXFxcXGR7JyArIG1pblNpemUgKyAnLCcgKyBzaXplICsgJ30nKSxcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gdmFsdWUuc3Vic3RyaW5nKGlWYWx1ZSkubWF0Y2goZGlnaXRzKTtcbiAgICAgICAgICAgICAgICBpZiAoIW51bSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyAnTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gJyArIGlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaVZhbHVlICs9IG51bVswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG51bVswXSwgMTApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE5hbWUgPSAobWF0Y2g6IGFueSwgc2hvcnROYW1lczogYW55LCBsb25nTmFtZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgIGxldCBhcnIgPSBsb29rQWhlYWQobWF0Y2gpID8gbG9uZ05hbWVzIDogc2hvcnROYW1lcztcbiAgICAgICAgICAgICAgICBsZXQgbmFtZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goW2ksIGFycltpXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuYW1lcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtKGFbMV0ubGVuZ3RoIC0gYlsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG5hbWVzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKGlWYWx1ZSwgbmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBuYW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlWYWx1ZSArPSBuYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93ICdVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gJyArIGlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hlY2tMaXRlcmFsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaVZhbHVlKSAhPT0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyAnVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICcgKyBpVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlWYWx1ZSsrO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICBkYXkgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpRm9ybWF0ID0gMDsgaUZvcm1hdCA8IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKykge1xuICAgICAgICAgICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSA9PT0gXCInXCIgJiYgIWxvb2tBaGVhZChcIidcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrTGl0ZXJhbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gZ2V0TnVtYmVyKCdkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCdEJywgdGhpcy5nZXRUcmFuc2xhdGlvbihUcmFuc2xhdGlvbktleXMuREFZX05BTUVTX1NIT1JUKSwgdGhpcy5nZXRUcmFuc2xhdGlvbihUcmFuc2xhdGlvbktleXMuREFZX05BTUVTKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3kgPSBnZXROdW1iZXIoJ28nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gZ2V0TnVtYmVyKCdtJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IGdldE5hbWUoJ00nLCB0aGlzLmdldFRyYW5zbGF0aW9uKFRyYW5zbGF0aW9uS2V5cy5NT05USF9OQU1FU19TSE9SVCksIHRoaXMuZ2V0VHJhbnNsYXRpb24oVHJhbnNsYXRpb25LZXlzLk1PTlRIX05BTUVTKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZ2V0TnVtYmVyKCd5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoZ2V0TnVtYmVyKCdAJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKChnZXROdW1iZXIoJyEnKSAtIDxudW1iZXI+dGhpcy50aWNrc1RvMTk3MCkgLyAxMDAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWQoXCInXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMaXRlcmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xpdGVyYWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaVZhbHVlIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBleHRyYSA9IHZhbHVlLnN1YnN0cihpVmFsdWUpO1xuICAgICAgICAgICAgaWYgKCEvXlxccysvLnRlc3QoZXh0cmEpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ0V4dHJhL3VucGFyc2VkIGNoYXJhY3RlcnMgZm91bmQgaW4gZGF0ZTogJyArIGV4dHJhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHllYXIgPT09IC0xKSB7XG4gICAgICAgICAgICB5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPCAxMDApIHtcbiAgICAgICAgICAgIHllYXIgKz0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gKG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCkgKyAoeWVhciA8PSBzaG9ydFllYXJDdXRvZmYgPyAwIDogLTEwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG95ID4gLTEpIHtcbiAgICAgICAgICAgIG1vbnRoID0gMTtcbiAgICAgICAgICAgIGRheSA9IGRveTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBkaW0gPSB0aGlzLmdldERheXNDb3VudEluTW9udGgoeWVhciwgbW9udGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF5IDw9IGRpbSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbW9udGgrKztcbiAgICAgICAgICAgICAgICBkYXkgLT0gZGltO1xuICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIG1vbnRoID0gbW9udGggPT09IC0xID8gMSA6IG1vbnRoO1xuICAgICAgICAgICAgZGF5ID0gZGF5ID09PSAtMSA/IDEgOiBkYXk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRlID0gdGhpcy5kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSkpO1xuXG4gICAgICAgIGlmIChkYXRlLmdldEZ1bGxZZWFyKCkgIT09IHllYXIgfHwgZGF0ZS5nZXRNb250aCgpICsgMSAhPT0gbW9udGggfHwgZGF0ZS5nZXREYXRlKCkgIT09IGRheSkge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgZGF0ZSc7IC8vIEUuZy4gMzEvMDIvMDBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGRheWxpZ2h0U2F2aW5nQWRqdXN0KGRhdGU6IGFueSkge1xuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgPiAxMiA/IGRhdGUuZ2V0SG91cnMoKSArIDIgOiAwKTtcblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVGaWxsZWRTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5maWxsZWQgPSAodGhpcy5pbnB1dEZpZWxkVmFsdWUgJiYgdGhpcy5pbnB1dEZpZWxkVmFsdWUgIT0gJycpIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgaXNWYWxpZERhdGVGb3JUaW1lQ29uc3RyYWludHMoc2VsZWN0ZWREYXRlOiBEYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmtlZXBJbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSWYgd2UgYXJlIGtlZXBpbmcgaW52YWxpZCBkYXRlcywgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGltZSBjb25zdHJhaW50c1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoIXRoaXMubWluRGF0ZSB8fCBzZWxlY3RlZERhdGUgPj0gdGhpcy5taW5EYXRlKSAmJiAoIXRoaXMubWF4RGF0ZSB8fCBzZWxlY3RlZERhdGUgPD0gdGhpcy5tYXhEYXRlKTtcbiAgICB9XG5cbiAgICBvblRvZGF5QnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF0ZU1ldGEgPSB7IGRheTogZGF0ZS5nZXREYXRlKCksIG1vbnRoOiBkYXRlLmdldE1vbnRoKCksIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSwgb3RoZXJNb250aDogZGF0ZS5nZXRNb250aCgpICE9PSB0aGlzLmN1cnJlbnRNb250aCB8fCBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IHRoaXMuY3VycmVudFllYXIsIHRvZGF5OiB0cnVlLCBzZWxlY3RhYmxlOiB0cnVlIH07XG5cbiAgICAgICAgdGhpcy5jcmVhdGVNb250aHMoZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm9uRGF0ZVNlbGVjdChldmVudCwgZGF0ZU1ldGEpO1xuICAgICAgICB0aGlzLm9uVG9kYXlDbGljay5lbWl0KGRhdGUpO1xuICAgIH1cblxuICAgIG9uQ2xlYXJCdXR0b25DbGljayhldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlTW9kZWwobnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRmaWVsZCgpO1xuICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgICAgIHRoaXMub25DbGVhckNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uQmFja0J1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT0gJ3llYXInKSB0aGlzLnNldEN1cnJlbnRWaWV3KCdtb250aCcpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09ICdtb250aCcpIHRoaXMuc2V0Q3VycmVudFZpZXcoJ2RhdGUnKTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZXNwb25zaXZlU3R5bGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzID4gMSAmJiB0aGlzLnJlc3BvbnNpdmVPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAoPEhUTUxTdHlsZUVsZW1lbnQ+dGhpcy5yZXNwb25zaXZlU3R5bGVFbGVtZW50KS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgICAgICBEb21IYW5kbGVyLnNldEF0dHJpYnV0ZSh0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQsICdub25jZScsIHRoaXMuY29uZmlnPy5jc3AoKT8ubm9uY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zaXZlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zaXZlT3B0aW9ucyA9IFsuLi50aGlzLnJlc3BvbnNpdmVPcHRpb25zXS5maWx0ZXIoKG8pID0+ICEhKG8uYnJlYWtwb2ludCAmJiBvLm51bU1vbnRocykpLnNvcnQoKG8xOiBhbnksIG8yOiBhbnkpID0+IC0xICogbzEuYnJlYWtwb2ludC5sb2NhbGVDb21wYXJlKG8yLmJyZWFrcG9pbnQsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2l2ZU9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgYnJlYWtwb2ludCwgbnVtTW9udGhzIH0gPSByZXNwb25zaXZlT3B0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXgtZGF0ZXBpY2tlclske3RoaXMuYXR0cmlidXRlU2VsZWN0b3J9XSAuY2F4LWRhdGVwaWNrZXItZ3JvdXA6bnRoLWNoaWxkKCR7bnVtTW9udGhzfSkgLmNheC1kYXRlcGlja2VyLW5leHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gPG51bWJlcj5udW1Nb250aHM7IGogPCB0aGlzLm51bWJlck9mTW9udGhzOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcyArPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNheC1kYXRlcGlja2VyWyR7dGhpcy5hdHRyaWJ1dGVTZWxlY3Rvcn1dIC5jYXgtZGF0ZXBpY2tlci1ncm91cDpudGgtY2hpbGQoJHtqICsgMX0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUwgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJHticmVha3BvaW50fSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7c3R5bGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKDxIVE1MU3R5bGVFbGVtZW50PnRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudCkuaW5uZXJIVE1MID0gaW5uZXJIVE1MO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveVJlc3BvbnNpdmVTdHlsZUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNpdmVTdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZVN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50VGFyZ2V0OiBhbnkgPSB0aGlzLmVsID8gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm93bmVyRG9jdW1lbnQgOiB0aGlzLmRvY3VtZW50O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbihkb2N1bWVudFRhcmdldCwgJ21vdXNlZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc091dHNpZGVDbGlja2VkKGV2ZW50KSAmJiB0aGlzLm92ZXJsYXlWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNsaWNrT3V0c2lkZS5lbWl0KGV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmJpbmREb2N1bWVudENsaWNrTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciAmJiAhdGhpcy50b3VjaFVJKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLndpbmRvdywgJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFJlc2l6ZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kU2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBuZXcgQ29ubmVjdGVkT3ZlcmxheVNjcm9sbEhhbmRsZXIodGhpcy5jb250YWluZXJWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIuYmluZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgdW5iaW5kU2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlci51bmJpbmRTY3JvbGxMaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNPdXRzaWRlQ2xpY2tlZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5lbC5uYXRpdmVFbGVtZW50LmlzU2FtZU5vZGUoZXZlbnQudGFyZ2V0KSB8fCB0aGlzLmlzTmF2SWNvbkNsaWNrZWQoZXZlbnQpIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpIHx8ICh0aGlzLm92ZXJsYXkgJiYgdGhpcy5vdmVybGF5LmNvbnRhaW5zKDxOb2RlPmV2ZW50LnRhcmdldCkpKTtcbiAgICB9XG5cbiAgICBpc05hdkljb25DbGlja2VkKGV2ZW50OiBFdmVudCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgRG9tSGFuZGxlci5oYXNDbGFzcyhldmVudC50YXJnZXQsICdjYXgtZGF0ZXBpY2tlci1wcmV2JykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LCAnY2F4LWRhdGVwaWNrZXItcHJldi1pY29uJykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LCAnY2F4LWRhdGVwaWNrZXItbmV4dCcpIHx8XG4gICAgICAgICAgICBEb21IYW5kbGVyLmhhc0NsYXNzKGV2ZW50LnRhcmdldCwgJ2NheC1kYXRlcGlja2VyLW5leHQtaWNvbicpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25XaW5kb3dSZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlICYmICFEb21IYW5kbGVyLmlzVG91Y2hEZXZpY2UoKSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PdmVybGF5SGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMudmlldztcblxuICAgICAgICBpZiAodGhpcy5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNYXNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVuYmluZERvY3VtZW50Q2xpY2tMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnVuYmluZERvY3VtZW50UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy51bmJpbmRTY3JvbGxMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBudWxsO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vdmVybGF5ICYmIHRoaXMuYXV0b1pJbmRleCkge1xuICAgICAgICAgICAgWkluZGV4VXRpbHMuY2xlYXIodGhpcy5vdmVybGF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzdHJveVJlc3BvbnNpdmVTdHlsZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVQaWNrZXJUaW1lcigpO1xuICAgICAgICB0aGlzLnJlc3RvcmVPdmVybGF5QXBwZW5kKCk7XG4gICAgICAgIHRoaXMub25PdmVybGF5SGlkZSgpO1xuICAgIH1cblxuICAgIG9uSW5saW5lU2F2ZShldmVudD86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25JbmxpbmVTYXZlZC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIG9uSW5saW5lQ2FuY2VsKCkge1xuICAgICAgICAvLyBSZXZlcnQgdG8gb3JpZ2luYWwgdmFsdWUgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLm9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLm9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRJbmxpbmVEYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbklubGluZUNhbmNlbGxlZC5lbWl0KCk7XG4gICAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJ7J2NheC1jYWxlbmRhci1tYWluLWxhYmVsJzogbGFiZWxUZXh0fVwiPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwibGFiZWxUZXh0XCIgW25nQ2xhc3NdPVwibGFiZWxUZXh0Q2xhc3NcIj57eyBsYWJlbFRleHQgfX08L2xhYmVsPlxyXG48L2Rpdj5cclxuPHNwYW5cclxuICAgICNjb250YWluZXJcclxuICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdjYXgtY2FsZW5kYXInOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgJ2NheC1pbnB1dC1pY29uLWxlZnQnOiBzaG93SWNvbiAmJiBpY29uRGlzcGxheSA9PT0gJ2lucHV0JyAmJiBsZWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICdjYXgtaW5wdXQtaWNvbi1yaWdodCc6IHNob3dJY29uICYmIGljb25EaXNwbGF5ID09PSAnaW5wdXQnLFxyXG4gICAgICAgICAgICAgICAgJ2NheC1jYWxlbmRhci13LWJ0bic6IHNob3dJY29uICYmIGljb25EaXNwbGF5ID09PSAnYnV0dG9uJyxcclxuICAgICAgICAgICAgICAgICdjYXgtY2FsZW5kYXItdGltZW9ubHknOiB0aW1lT25seSxcclxuICAgICAgICAgICAgICAgICdjYXgtY2FsZW5kYXItZGlzYWJsZWQnOiBkaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgICdjYXgtZm9jdXMnOiBmb2N1cyB8fCBvdmVybGF5VmlzaWJsZVxyXG4gICAgICAgICAgICB9XCJcclxuICAgIFtuZ1N0eWxlXT1cInN0eWxlXCJcclxuICAgIFtjbGFzc109XCJzdHlsZUNsYXNzXCJcclxuPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFpbmxpbmVcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgI2lucHV0ZmllbGRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJpbnB1dElkXCJcclxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lXCJcclxuICAgICAgICAgICAgW2F0dHIucmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCJcclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3ZlcmxheVZpc2libGUgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm92ZXJsYXlWaXNpYmxlID8gcGFuZWxJZCA6IG51bGxcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpbnB1dEZpZWxkVmFsdWVcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25JbnB1dEJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seUlucHV0XCJcclxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVXNlcklucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJpbnB1dFN0eWxlXCJcclxuICAgICAgICAgICAgW2NsYXNzXT1cImlucHV0U3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCJcclxuICAgICAgICAgICAgW2F0dHIuaW5wdXRtb2RlXT1cInRvdWNoVUkgPyAnb2ZmJyA6IG51bGxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzXCJcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgY2F4QXV0b0ZvY3VzXHJcbiAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2xlYXIgJiYgIWRpc2FibGVkICYmIHZhbHVlICE9IG51bGxcIj5cclxuICAgICAgICAgICAgPFRpbWVzSWNvbiAqbmdJZj1cIiFjbGVhckljb25UZW1wbGF0ZVwiIFtzdHlsZUNsYXNzXT1cIidjYXgtY2FsZW5kYXItY2xlYXItaWNvbidcIiAoY2xpY2spPVwiY2xlYXIoKVwiIC8+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2xlYXJJY29uVGVtcGxhdGVcIiBjbGFzcz1cImNheC1jYWxlbmRhci1jbGVhci1pY29uXCIgKGNsaWNrKT1cImNsZWFyKClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNsZWFySWNvblRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaWNvbkJ1dHRvbkFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm92ZXJsYXlWaXNpYmxlID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJvdmVybGF5VmlzaWJsZSA/IHBhbmVsSWQgOiBudWxsXCJcclxuICAgICAgICAgICAgY2F4QnV0dG9uXHJcbiAgICAgICAgICAgIGNheFJpcHBsZVxyXG4gICAgICAgICAgICAqbmdJZj1cInNob3dJY29uICYmIGljb25EaXNwbGF5ID09PSAnYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKCRldmVudCwgaW5wdXRmaWVsZClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImNheC1kYXRlcGlja2VyLXRyaWdnZXIgY2F4LWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpY29uXCIgW25nQ2xhc3NdPVwiaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtY2FsZW5kYXItaWNvblwiICpuZ0lmPVwiIXRyaWdnZXJJY29uVGVtcGxhdGVcIiA+PC9pPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJpZ2dlckljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpY29uRGlzcGxheSA9PT0gJ2lucHV0JyAmJiBzaG93SWNvblwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtY2FsZW5kYXItaWNvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlucHV0SWNvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXgtZGF0ZXBpY2tlci1pY29uJzogc2hvd09uRm9jdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEljb25UZW1wbGF0ZTsgY29udGV4dDogeyBjbGlja0NhbGxCYWNrOiBvbkJ1dHRvbkNsaWNrLmJpbmQodGhpcykgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaWNvbkRpc3BsYXkgPT09ICdpbnB1dCcgJiYgc2hvd0ljb25cIj5cclxuICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtYWx0LWFycm93LWRvd24gY2F4LWRvd25hcnJvd1wiPjwvaT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgPGRpdlxyXG4gICAgICAgICNjb250ZW50V3JhcHBlclxyXG4gICAgICAgIFthdHRyLmlkXT1cInBhbmVsSWRcIlxyXG4gICAgICAgIFtjbGFzc109XCJwYW5lbFN0eWxlQ2xhc3NcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInBhbmVsU3R5bGVcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnY2F4LWRhdGVwaWNrZXIgY2F4LWNvbXBvbmVudCc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NheC1kYXRlcGlja2VyLWlubGluZSc6IGlubGluZSxcclxuICAgICAgICAgICAgICAgICAgICAnY2F4LWRpc2FibGVkJzogZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NheC1kYXRlcGlja2VyLXRpbWVvbmx5JzogdGltZU9ubHksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NheC1kYXRlcGlja2VyLW11bHRpcGxlLW1vbnRoJzogdGhpcy5udW1iZXJPZk1vbnRocyA+IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NheC1kYXRlcGlja2VyLW1vbnRocGlja2VyJzogdmlldyA9PT0gJ21vbnRoJyxcclxuICAgICAgICAgICAgICAgICAgICAnY2F4LWRhdGVwaWNrZXItdG91Y2gtdWknOiB0b3VjaFVJXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICBbQG92ZXJsYXlBbmltYXRpb25dPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hVSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgdmFsdWU6ICd2aXNpYmxlVG91Y2hVSScsIHBhcmFtczogeyBzaG93VHJhbnNpdGlvblBhcmFtczogc2hvd1RyYW5zaXRpb25PcHRpb25zLCBoaWRlVHJhbnNpdGlvblBhcmFtczogaGlkZVRyYW5zaXRpb25PcHRpb25zIH0gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6ICd2aXNpYmxlJywgcGFyYW1zOiB7IHNob3dUcmFuc2l0aW9uUGFyYW1zOiBzaG93VHJhbnNpdGlvbk9wdGlvbnMsIGhpZGVUcmFuc2l0aW9uUGFyYW1zOiBoaWRlVHJhbnNpdGlvbk9wdGlvbnMgfSB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ2Nob29zZURhdGUnKVwiXHJcbiAgICAgICAgW2F0dHIucm9sZV09XCJpbmxpbmUgPyBudWxsIDogJ2RpYWxvZydcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbW9kYWxdPVwiaW5saW5lID8gbnVsbCA6ICd0cnVlJ1wiXHJcbiAgICAgICAgW0AuZGlzYWJsZWRdPVwiaW5saW5lID09PSB0cnVlXCJcclxuICAgICAgICAoQG92ZXJsYXlBbmltYXRpb24uc3RhcnQpPVwib25PdmVybGF5QW5pbWF0aW9uU3RhcnQoJGV2ZW50KVwiXHJcbiAgICAgICAgKEBvdmVybGF5QW5pbWF0aW9uLmRvbmUpPVwib25PdmVybGF5QW5pbWF0aW9uRG9uZSgkZXZlbnQpXCJcclxuICAgICAgICAoY2xpY2spPVwib25PdmVybGF5Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgKm5nSWY9XCJpbmxpbmUgfHwgb3ZlcmxheVZpc2libGVcIlxyXG4gICAgPlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNheC1oZWFkZXJcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0aW1lT25seVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItZ3JvdXAtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItZ3JvdXBcIiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1kYXRlcGlja2VyLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCIgY2xhc3M9XCJjYXgtZGF0ZXBpY2tlci1wcmV2IGNheC1saW5rXCIgKGNsaWNrKT1cIm9uUHJldkJ1dHRvbkNsaWNrKCRldmVudClcIiAqbmdJZj1cImkgPT09IDBcIiB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2SWNvbkFyaWFMYWJlbFwiIGNheFJpcHBsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uTGVmdEljb24gW3N0eWxlQ2xhc3NdPVwiJ2NheC1kYXRlcGlja2VyLXByZXYtaWNvbidcIiAqbmdJZj1cIiFwcmV2aW91c0ljb25UZW1wbGF0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByZXZpb3VzSWNvblRlbXBsYXRlXCIgY2xhc3M9XCJjYXgtZGF0ZXBpY2tlci1wcmV2LWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcmV2aW91c0ljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9Nb250aFZpZXcoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Db250YWluZXJCdXR0b25LZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgtZGF0ZXBpY2tlci1tb250aCBjYXgtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInN3aXRjaFZpZXdCdXR0b25EaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRoaXMuZ2V0VHJhbnNsYXRpb24oJ2Nob29zZU1vbnRoJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE1vbnRoTmFtZShtb250aC5tb250aCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hUb1llYXJWaWV3KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRWaWV3ICE9PSAneWVhcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F4LWRhdGVwaWNrZXIteWVhciBjYXgtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInN3aXRjaFZpZXdCdXR0b25EaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldFRyYW5zbGF0aW9uKCdjaG9vc2VZZWFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFllYXIobW9udGgpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItZGVjYWRlXCIgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ3llYXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkZWNhZGVUZW1wbGF0ZVwiPnt7IHllYXJQaWNrZXJWYWx1ZXMoKVswXSB9fSAtIHt7IHllYXJQaWNrZXJWYWx1ZXMoKVt5ZWFyUGlja2VyVmFsdWVzKCkubGVuZ3RoIC0gMV0gfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVjYWRlVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB5ZWFyUGlja2VyVmFsdWVzIH1cIj48L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkNvbnRhaW5lckJ1dHRvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1kYXRlcGlja2VyLW5leHQgY2F4LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dEJ1dHRvbkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwibnVtYmVyT2ZNb250aHMgPT09IDEgPyAnaW5saW5lLWZsZXgnIDogaSA9PT0gbnVtYmVyT2ZNb250aHMgLSAxID8gJ2lubGluZS1mbGV4JyA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibmV4dEljb25BcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uUmlnaHRJY29uIFtzdHlsZUNsYXNzXT1cIidjYXgtZGF0ZXBpY2tlci1uZXh0LWljb24nXCIgKm5nSWY9XCIhbmV4dEljb25UZW1wbGF0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5leHRJY29uVGVtcGxhdGVcIiBjbGFzcz1cImNheC1kYXRlcGlja2VyLW5leHQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIm5leHRJY29uVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyXCIgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImNheC1kYXRlcGlja2VyLWNhbGVuZGFyXCIgcm9sZT1cImdyaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInNob3dXZWVrXCIgY2xhc3M9XCJjYXgtZGF0ZXBpY2tlci13ZWVraGVhZGVyIGNheC1kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0VHJhbnNsYXRpb24oJ3dlZWtIZWFkZXInKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXM7IGxldCBiZWdpbiA9IGZpcnN0OyBsZXQgZW5kID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgd2Vla0RheSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHdlZWsgb2YgbW9udGguZGF0ZXM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd1dlZWtcIiBjbGFzcz1cImNheC1kYXRlcGlja2VyLXdlZWtudW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F4LWRpc2FibGVkXCI+IHt7IG1vbnRoLndlZWtOdW1iZXJzW2pdIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBkYXRlIG9mIHdlZWtcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImRhdGUuZGF5XCIgW25nQ2xhc3NdPVwieyAnY2F4LWRhdGVwaWNrZXItb3RoZXItbW9udGgnOiBkYXRlLm90aGVyTW9udGgsICdjYXgtZGF0ZXBpY2tlci10b2RheSc6IGRhdGUudG9kYXkgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGUub3RoZXJNb250aCA/IHNob3dPdGhlck1vbnRocyA6IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjYXgtaGlnaGxpZ2h0IGNheC1kYXRlcGlja2VyLWN1cnJlbnQtZGF5JzogaXNTZWxlY3RlZChkYXRlKSAmJiBkYXRlLnNlbGVjdGFibGUsICdjYXgtZGlzYWJsZWQnOiAhZGF0ZS5zZWxlY3RhYmxlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EYXRlU2VsZWN0KCRldmVudCwgZGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJmb3JtYXREYXRlS2V5KGZvcm1hdERhdGVNZXRhVG9EYXRlKGRhdGUpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uRGF0ZUNlbGxLZXlkb3duKCRldmVudCwgZGF0ZSwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXhSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGF0ZVRlbXBsYXRlICYmIChkYXRlLnNlbGVjdGFibGUgfHwgIWRpc2FibGVkRGF0ZVRlbXBsYXRlKVwiPnt7IGRhdGUuZGF5IH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRlLnNlbGVjdGFibGUgfHwgIWRpc2FibGVkRGF0ZVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRhdGUuc2VsZWN0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRpc2FibGVkRGF0ZVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNTZWxlY3RlZChkYXRlKVwiIGNsYXNzPVwiY2F4LWhpZGRlbi1hY2Nlc3NpYmxlXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgZGF0ZS5kYXkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LW1vbnRocGlja2VyXCIgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ21vbnRoJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbSBvZiBtb250aFBpY2tlclZhbHVlcygpOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb250aFNlbGVjdCgkZXZlbnQsIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1vbnRoQ2VsbEtleWRvd24oJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgtbW9udGhwaWNrZXItbW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NheC1oaWdobGlnaHQnOiBpc01vbnRoU2VsZWN0ZWQoaSksICdjYXgtZGlzYWJsZWQnOiBpc01vbnRoRGlzYWJsZWQoaSkgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgbSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc01vbnRoU2VsZWN0ZWQoaSlcIiBjbGFzcz1cImNheC1oaWRkZW4tYWNjZXNzaWJsZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7IG0gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgteWVhcnBpY2tlclwiICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICd5ZWFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgeSBvZiB5ZWFyUGlja2VyVmFsdWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblllYXJTZWxlY3QoJGV2ZW50LCB5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25ZZWFyQ2VsbEtleWRvd24oJGV2ZW50LCB5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgteWVhcnBpY2tlci15ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjYXgtaGlnaGxpZ2h0JzogaXNZZWFyU2VsZWN0ZWQoeSksICdjYXgtZGlzYWJsZWQnOiBpc1llYXJEaXNhYmxlZCh5KSB9XCJcclxuICAgICAgICAgICAgICAgICAgICBjYXhSaXBwbGVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyB5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzWWVhclNlbGVjdGVkKHkpXCIgY2xhc3M9XCJjYXgtaGlkZGVuLWFjY2Vzc2libGVcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyB5IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtdGltZXBpY2tlclwiICpuZ0lmPVwiKHNob3dUaW1lIHx8IHRpbWVPbmx5KSAmJiBjdXJyZW50VmlldyA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtaG91ci1waWNrZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkNvbnRhaW5lckJ1dHRvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaW5jcmVtZW50SG91cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJpbmNyZW1lbnRIb3VyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlRG93bigkZXZlbnQsIDAsIDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2V1cCk9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwLnNwYWNlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZUxlYXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ25leHRIb3VyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNheFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uVXBJY29uICpuZ0lmPVwiIWluY3JlbWVudEljb25UZW1wbGF0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5jcmVtZW50SWNvblRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRIb3VyIDwgMTBcIj4wPC9uZy1jb250YWluZXI+e3sgY3VycmVudEhvdXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Db250YWluZXJCdXR0b25LZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRlY3JlbWVudEhvdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiZGVjcmVtZW50SG91cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZURvd24oJGV2ZW50LCAwLCAtMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuc3BhY2UpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlTGVhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRUcmFuc2xhdGlvbigncHJldkhvdXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duSWNvbiAqbmdJZj1cIiFkZWNyZW1lbnRJY29uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImRlY3JlbWVudEljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtc2VwYXJhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aW1lU2VwYXJhdG9yIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1taW51dGUtcGlja2VyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Db250YWluZXJCdXR0b25LZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImluY3JlbWVudE1pbnV0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJpbmNyZW1lbnRNaW51dGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VEb3duKCRldmVudCwgMSwgMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuc3BhY2UpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlTGVhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRUcmFuc2xhdGlvbignbmV4dE1pbnV0ZScpXCJcclxuICAgICAgICAgICAgICAgICAgICBjYXhSaXBwbGVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvblVwSWNvbiAqbmdJZj1cIiFpbmNyZW1lbnRJY29uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImluY3JlbWVudEljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50TWludXRlIDwgMTBcIj4wPC9uZy1jb250YWluZXI+e3sgY3VycmVudE1pbnV0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkNvbnRhaW5lckJ1dHRvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZGVjcmVtZW50TWludXRlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImRlY3JlbWVudE1pbnV0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZURvd24oJGV2ZW50LCAxLCAtMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuc3BhY2UpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlTGVhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRUcmFuc2xhdGlvbigncHJldk1pbnV0ZScpXCJcclxuICAgICAgICAgICAgICAgICAgICBjYXhSaXBwbGVcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvbkRvd25JY29uICpuZ0lmPVwiIWRlY3JlbWVudEljb25UZW1wbGF0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVjcmVtZW50SWNvblRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1zZXBhcmF0b3JcIiAqbmdJZj1cInNob3dTZWNvbmRzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aW1lU2VwYXJhdG9yIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1zZWNvbmQtcGlja2VyXCIgKm5nSWY9XCJzaG93U2Vjb25kc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F4LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpbmNyZW1lbnRTZWNvbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiaW5jcmVtZW50U2Vjb25kKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlRG93bigkZXZlbnQsIDIsIDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2V1cCk9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwLnNwYWNlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZUxlYXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ25leHRTZWNvbmQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZXZyb25VcEljb24gKm5nSWY9XCIhaW5jcmVtZW50SWNvblRlbXBsYXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmNyZW1lbnRJY29uVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFNlY29uZCA8IDEwXCI+MDwvbmctY29udGFpbmVyPnt7IGN1cnJlbnRTZWNvbmQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXgtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Db250YWluZXJCdXR0b25LZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRlY3JlbWVudFNlY29uZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJkZWNyZW1lbnRTZWNvbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VEb3duKCRldmVudCwgMiwgLTEpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2V1cCk9XCJvblRpbWVQaWNrZXJFbGVtZW50TW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25UaW1lUGlja2VyRWxlbWVudE1vdXNlVXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwLnNwYWNlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGltZVBpY2tlckVsZW1lbnRNb3VzZUxlYXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ3ByZXZTZWNvbmQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duSWNvbiAqbmdJZj1cIiFkZWNyZW1lbnRJY29uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImRlY3JlbWVudEljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtYW1wbS1waWNrZXJcIiAqbmdJZj1cImhvdXJGb3JtYXQgPT0gJzEyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNheC1saW5rXCIgdHlwZT1cImJ1dHRvblwiIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCIgKGNsaWNrKT1cInRvZ2dsZUFNUE0oJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZUFNUE0oJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ2FtJylcIiBjYXhSaXBwbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZXZyb25VcEljb24gKm5nSWY9XCIhaW5jcmVtZW50SWNvblRlbXBsYXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmNyZW1lbnRJY29uVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBwbSA/ICdQTScgOiAnQU0nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNheC1saW5rXCIgdHlwZT1cImJ1dHRvblwiIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCIgKGNsaWNrKT1cInRvZ2dsZUFNUE0oJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZUFNUE0oJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ3BtJylcIiBjYXhSaXBwbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duSWNvbiAqbmdJZj1cIiFkZWNyZW1lbnRJY29uVGVtcGxhdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImRlY3JlbWVudEljb25UZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNheC1kYXRlcGlja2VyLWJ1dHRvbmJhclwiICpuZ0lmPVwic2hvd0J1dHRvbkJhclwiPlxyXG4gICAgICAgICAgICA8Y2F4LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50VmlldyAhPT0gJ3llYXInICYmIGN1cnJlbnRWaWV3ICE9PSAnbW9udGgnXCJcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2xpbmtdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0VHJhbnNsYXRpb24oJ2NsZWFyJylcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25Db250YWluZXJCdXR0b25LZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGVhckJ1dHRvbkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgY2F4UmlwcGxlXHJcbiAgICAgICAgICAgID48L2NheC1idXR0b24+XHJcbiAgICAgICAgICAgIDxjYXgtYnV0dG9uICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICd5ZWFyJyB8fCBjdXJyZW50VmlldyA9PT0gJ21vbnRoJ1wiIHR5cGU9XCJidXR0b25cIiBbbGlua109XCJ0cnVlXCIgW2xhYmVsXT1cIidCYWNrJ1wiIChrZXlkb3duKT1cIm9uQ29udGFpbmVyQnV0dG9uS2V5ZG93bigkZXZlbnQpXCIgKG9uQ2xpY2spPVwib25CYWNrQnV0dG9uQ2xpY2soJGV2ZW50KVwiIGNheFJpcHBsZT48L2NheC1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwhLS0gRm9yIHRoZSBpbmxpbmUgIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtZGF0ZXBpY2tlci1pbmxpbmUtYWN0aW9uc1wiICpuZ0lmPVwiaW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjYXgtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ2FuY2VsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZXZlcml0eV09XCInc2Vjb25kYXJ5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JbmxpbmVDYW5jZWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NheC1idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1kYXRlcGlja2VyLWlubGluZS1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjYXggY2F4LWNhbGVuZGFyLW1pbmltYWxpc3RpY1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJpbnB1dElkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0dGVkSW5saW5lRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNheC1kYXRlcGlja2VyLWlubGluZS1kaXNwbGF5XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGVwaWNrZXItaW5saW5lLWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxjYXgtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInU2F2ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwiJ1ByaW1hcnknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbklubGluZVNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9jYXgtYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNheC1mb290ZXJcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9zcGFuPlxyXG4iXX0=