@acorex/components 18.5.16 → 18.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (332) hide show
  1. package/action-sheet/lib/action-sheet.component.d.ts +26 -0
  2. package/alert/lib/alert.component.d.ts +50 -2
  3. package/audio-wave/lib/audio-wave.component.d.ts +53 -0
  4. package/avatar/lib/avatar.component.d.ts +20 -1
  5. package/badge/lib/badge.component.d.ts +8 -0
  6. package/bottom-navigation/lib/bottom-navigation.component.d.ts +16 -0
  7. package/breadcrumbs/lib/breadcrumbs-item.component.d.ts +11 -0
  8. package/breadcrumbs/lib/breadcrumbs.component.d.ts +11 -0
  9. package/button/lib/button-item-list.component.d.ts +34 -0
  10. package/button/lib/button-item.component.d.ts +47 -0
  11. package/button/lib/button.component.d.ts +36 -0
  12. package/button-group/lib/button-group.component.d.ts +56 -0
  13. package/calendar/lib/calendar-range.component.d.ts +48 -0
  14. package/calendar/lib/calendar.component.d.ts +114 -0
  15. package/check-box/lib/check-box.component.d.ts +36 -0
  16. package/chips/lib/chips.component.d.ts +13 -0
  17. package/circular-progress/lib/circular-progress.component.d.ts +51 -21
  18. package/collapse/lib/collapse-group.component.d.ts +38 -0
  19. package/collapse/lib/collapse.component.d.ts +55 -0
  20. package/color-box/lib/color-box.component.d.ts +28 -1
  21. package/color-palette/lib/color-palette-input.component.d.ts +35 -0
  22. package/color-palette/lib/color-palette-picker.component.d.ts +53 -0
  23. package/color-palette/lib/color-palette-preview.component.d.ts +17 -0
  24. package/color-palette/lib/color-palette-swatches.component.d.ts +30 -0
  25. package/color-palette/lib/color-palette.component.d.ts +8 -0
  26. package/comment/lib/comment-container/comment-container.component.d.ts +5 -0
  27. package/comment/lib/comment-item/comment-item.component.d.ts +16 -2
  28. package/comment/lib/comment-like/comment-like.component.d.ts +8 -0
  29. package/comment/lib/comment-reply/comment-reply.component.d.ts +4 -0
  30. package/comment/lib/comment-view/comment-view.component.d.ts +4 -0
  31. package/common/lib/components/base-component.class.d.ts +8 -0
  32. package/common/lib/components/button-base-component.class.d.ts +21 -0
  33. package/common/lib/components/interactive-component.class.d.ts +15 -0
  34. package/conversation/lib/conversation-container/conversation-container.component.d.ts +4 -0
  35. package/conversation/lib/conversation-input/conversation-input.component.d.ts +79 -2
  36. package/conversation/lib/conversation-message/conversation-message.component.d.ts +41 -0
  37. package/conversation/lib/conversation-messages/conversation-message-audio/conversation-message-audio.component.d.ts +62 -0
  38. package/conversation/lib/conversation-messages/conversation-message-file/conversation-message-file.component.d.ts +34 -0
  39. package/conversation/lib/conversation-messages/conversation-message-image/conversation-message-image.component.d.ts +21 -0
  40. package/conversation/lib/conversation-messages/conversation-message-image-popup/conversation-message-image-popup.component.d.ts +11 -0
  41. package/conversation/lib/conversation-messages/conversation-message-text/conversation-message-text.component.d.ts +29 -0
  42. package/conversation/lib/conversation-messages/conversation-message-video/conversation-message-video.component.d.ts +11 -0
  43. package/conversation/lib/conversation-messages/conversation-message-voice/conversation-message-voice.component.d.ts +72 -0
  44. package/conversation/lib/conversation-view/conversation-view.component.d.ts +22 -0
  45. package/data-pager/lib/data-pager-base.component.d.ts +9 -0
  46. package/data-pager/lib/data-pager-info.component.d.ts +14 -0
  47. package/data-pager/lib/data-pager-input-selector.component.d.ts +17 -0
  48. package/data-pager/lib/data-pager-next-buttons.components.d.ts +20 -0
  49. package/data-pager/lib/data-pager-numeric-selector.component.d.ts +14 -0
  50. package/data-pager/lib/data-pager-pagesize-dropdown.component.d.ts +28 -0
  51. package/data-pager/lib/data-pager-prev-buttons.component.d.ts +20 -0
  52. package/data-pager/lib/data-pager.component.d.ts +111 -0
  53. package/data-table/lib/columns/data-text-column.component.d.ts +58 -0
  54. package/data-table/lib/columns/row-command-column.component.d.ts +83 -0
  55. package/data-table/lib/columns/row-index-column.component.d.ts +51 -0
  56. package/data-table/lib/columns/row-select-column.component.d.ts +47 -0
  57. package/data-table/lib/data-table/data-table.component.d.ts +200 -0
  58. package/data-table/lib/infinite-scroll-data-table/infinite-scroll-data-table.component.d.ts +185 -0
  59. package/datetime-box/lib/datetime-box.component.d.ts +59 -1
  60. package/datetime-input/lib/datetime-input.component.d.ts +133 -0
  61. package/datetime-picker/lib/datetime-picker.component.d.ts +95 -0
  62. package/decorators/lib/components/clear-button.component.d.ts +25 -0
  63. package/decorators/lib/components/close-button.component.d.ts +22 -0
  64. package/decorators/lib/components/generic-content.component.d.ts +4 -0
  65. package/decorators/lib/components/icon.component.d.ts +12 -0
  66. package/dialog/lib/dialog.component.d.ts +20 -0
  67. package/drawer/lib/drawer-container.component.d.ts +7 -0
  68. package/drawer/lib/drawer.component.d.ts +104 -0
  69. package/dropdown/lib/dropdown-box.component.d.ts +66 -0
  70. package/dropdown/lib/dropdown-panel.component.d.ts +85 -0
  71. package/dropdown-button/lib/dropdown-button.component.d.ts +38 -0
  72. package/esm2022/action-sheet/lib/action-sheet.component.mjs +21 -1
  73. package/esm2022/alert/lib/alert.component.mjs +48 -3
  74. package/esm2022/audio-wave/lib/audio-wave.component.mjs +48 -1
  75. package/esm2022/avatar/lib/avatar.component.mjs +21 -2
  76. package/esm2022/badge/lib/badge.component.mjs +9 -1
  77. package/esm2022/bottom-navigation/lib/bottom-navigation.component.mjs +14 -1
  78. package/esm2022/breadcrumbs/lib/breadcrumbs-item.component.mjs +9 -1
  79. package/esm2022/breadcrumbs/lib/breadcrumbs.component.mjs +6 -1
  80. package/esm2022/button/lib/button-item-list.component.mjs +35 -1
  81. package/esm2022/button/lib/button-item.component.mjs +36 -1
  82. package/esm2022/button/lib/button.component.mjs +37 -1
  83. package/esm2022/button-group/lib/button-group.component.mjs +51 -1
  84. package/esm2022/calendar/lib/calendar-range.component.mjs +46 -1
  85. package/esm2022/calendar/lib/calendar.component.mjs +112 -1
  86. package/esm2022/check-box/lib/check-box.component.mjs +34 -1
  87. package/esm2022/chips/lib/chips.component.mjs +14 -1
  88. package/esm2022/circular-progress/lib/circular-progress.component.mjs +73 -74
  89. package/esm2022/collapse/lib/collapse-group.component.mjs +39 -1
  90. package/esm2022/collapse/lib/collapse.component.mjs +53 -1
  91. package/esm2022/color-box/lib/color-box.component.mjs +23 -2
  92. package/esm2022/color-palette/lib/color-palette-input.component.mjs +36 -1
  93. package/esm2022/color-palette/lib/color-palette-picker.component.mjs +54 -1
  94. package/esm2022/color-palette/lib/color-palette-preview.component.mjs +18 -1
  95. package/esm2022/color-palette/lib/color-palette-swatches.component.mjs +28 -1
  96. package/esm2022/color-palette/lib/color-palette.component.mjs +9 -1
  97. package/esm2022/comment/lib/comment-container/comment-container.component.mjs +6 -1
  98. package/esm2022/comment/lib/comment-item/comment-item.component.mjs +15 -1
  99. package/esm2022/comment/lib/comment-like/comment-like.component.mjs +9 -1
  100. package/esm2022/comment/lib/comment-reply/comment-reply.component.mjs +5 -1
  101. package/esm2022/comment/lib/comment-view/comment-view.component.mjs +5 -1
  102. package/esm2022/common/lib/components/base-component.class.mjs +9 -1
  103. package/esm2022/common/lib/components/button-base-component.class.mjs +22 -1
  104. package/esm2022/common/lib/components/interactive-component.class.mjs +16 -1
  105. package/esm2022/conversation/lib/conversation-container/conversation-container.component.mjs +5 -1
  106. package/esm2022/conversation/lib/conversation-input/conversation-input.component.mjs +75 -1
  107. package/esm2022/conversation/lib/conversation-message/conversation-message.component.mjs +39 -1
  108. package/esm2022/conversation/lib/conversation-messages/conversation-message-audio/conversation-message-audio.component.mjs +63 -1
  109. package/esm2022/conversation/lib/conversation-messages/conversation-message-file/conversation-message-file.component.mjs +35 -1
  110. package/esm2022/conversation/lib/conversation-messages/conversation-message-image/conversation-message-image.component.mjs +22 -1
  111. package/esm2022/conversation/lib/conversation-messages/conversation-message-image-popup/conversation-message-image-popup.component.mjs +9 -1
  112. package/esm2022/conversation/lib/conversation-messages/conversation-message-text/conversation-message-text.component.mjs +30 -1
  113. package/esm2022/conversation/lib/conversation-messages/conversation-message-video/conversation-message-video.component.mjs +12 -1
  114. package/esm2022/conversation/lib/conversation-messages/conversation-message-voice/conversation-message-voice.component.mjs +70 -1
  115. package/esm2022/conversation/lib/conversation-view/conversation-view.component.mjs +23 -1
  116. package/esm2022/data-pager/lib/data-pager-base.component.mjs +7 -1
  117. package/esm2022/data-pager/lib/data-pager-info.component.mjs +9 -1
  118. package/esm2022/data-pager/lib/data-pager-input-selector.component.mjs +18 -1
  119. package/esm2022/data-pager/lib/data-pager-next-buttons.components.mjs +18 -1
  120. package/esm2022/data-pager/lib/data-pager-numeric-selector.component.mjs +15 -1
  121. package/esm2022/data-pager/lib/data-pager-pagesize-dropdown.component.mjs +23 -1
  122. package/esm2022/data-pager/lib/data-pager-prev-buttons.component.mjs +18 -1
  123. package/esm2022/data-pager/lib/data-pager.component.mjs +109 -1
  124. package/esm2022/data-table/lib/columns/data-text-column.component.mjs +32 -1
  125. package/esm2022/data-table/lib/columns/row-command-column.component.mjs +63 -1
  126. package/esm2022/data-table/lib/columns/row-index-column.component.mjs +40 -1
  127. package/esm2022/data-table/lib/columns/row-select-column.component.mjs +39 -1
  128. package/esm2022/data-table/lib/data-table/data-table.component.mjs +183 -1
  129. package/esm2022/data-table/lib/infinite-scroll-data-table/infinite-scroll-data-table.component.mjs +159 -1
  130. package/esm2022/datetime-box/lib/datetime-box.component.mjs +51 -2
  131. package/esm2022/datetime-input/lib/datetime-input.component.mjs +122 -1
  132. package/esm2022/datetime-picker/lib/datetime-picker.component.mjs +90 -1
  133. package/esm2022/decorators/lib/components/clear-button.component.mjs +26 -1
  134. package/esm2022/decorators/lib/components/close-button.component.mjs +23 -1
  135. package/esm2022/decorators/lib/components/generic-content.component.mjs +5 -1
  136. package/esm2022/decorators/lib/components/icon.component.mjs +13 -1
  137. package/esm2022/dialog/lib/dialog.component.mjs +18 -1
  138. package/esm2022/drawer/lib/drawer-container.component.mjs +8 -1
  139. package/esm2022/drawer/lib/drawer.component.mjs +102 -1
  140. package/esm2022/dropdown/lib/dropdown-box.component.mjs +58 -1
  141. package/esm2022/dropdown/lib/dropdown-panel.component.mjs +77 -1
  142. package/esm2022/dropdown-button/lib/dropdown-button.component.mjs +36 -1
  143. package/esm2022/form/lib/form-field.component.mjs +40 -1
  144. package/esm2022/form/lib/form.component.mjs +59 -1
  145. package/esm2022/form/lib/validation-summary.component.mjs +41 -1
  146. package/esm2022/image/lib/image.component.mjs +47 -1
  147. package/esm2022/label/lib/label.component.mjs +32 -1
  148. package/esm2022/list/lib/list.component.mjs +84 -1
  149. package/esm2022/loading/lib/loading-spinner.component.mjs +17 -1
  150. package/esm2022/loading/lib/loading.component.mjs +27 -1
  151. package/esm2022/popup/lib/popup.component.mjs +2 -2
  152. package/esm2022/progress-bar/lib/progress-bar.component.mjs +1 -1
  153. package/esm2022/scheduler/lib/scheduler-month-view.component.mjs +20 -1
  154. package/esm2022/scheduler/lib/scheduler-week-view.component.mjs +5 -1
  155. package/esm2022/scheduler/lib/scheduler.component.mjs +10 -1
  156. package/esm2022/search-box/lib/search-box.component.mjs +19 -2
  157. package/esm2022/select-box/lib/select-box.component.mjs +50 -2
  158. package/esm2022/selection-list/lib/selection-list.component.mjs +51 -1
  159. package/esm2022/side-menu/lib/side-menu.component.mjs +5 -1
  160. package/esm2022/skeleton/lib/skeleton.component.mjs +11 -1
  161. package/esm2022/slider/lib/slider.component.mjs +52 -2
  162. package/esm2022/step-wizard/lib/step-wizard.component.mjs +23 -1
  163. package/esm2022/switch/lib/switch-content.component.mjs +5 -1
  164. package/esm2022/switch/lib/switch.component.mjs +11 -1
  165. package/esm2022/tabs/lib/tab-item.component.mjs +24 -1
  166. package/esm2022/tabs/lib/tabs.component.mjs +36 -1
  167. package/esm2022/tag/lib/tag.component.mjs +2 -1
  168. package/esm2022/text-area/lib/text-area.component.mjs +8 -1
  169. package/esm2022/text-box/lib/text-box.component.mjs +13 -1
  170. package/esm2022/toast/lib/toast.component.mjs +6 -1
  171. package/esm2022/tooltip/lib/tooltip.component.mjs +5 -1
  172. package/esm2022/uploader/index.mjs +5 -5
  173. package/esm2022/uploader/lib/{uploader-dialog-container.component.mjs → uploader-dialog-container/uploader-dialog-container.component.mjs} +17 -2
  174. package/esm2022/uploader/lib/uploader-drop-zone/uploader-drop-zone.component.mjs +27 -0
  175. package/esm2022/uploader/lib/uploader-list/uploader-list.component.mjs +26 -0
  176. package/esm2022/uploader/lib/uploader-zone.directive.mjs +23 -16
  177. package/esm2022/uploader/lib/uploader.models.mjs +19 -1
  178. package/esm2022/uploader/lib/uploader.module.mjs +18 -13
  179. package/esm2022/uploader/lib/uploader.service.mjs +14 -7
  180. package/esm2022/wysiwyg/lib/wysiwyg/wysiwyg-container/wysiwyg-container.component.mjs +66 -9
  181. package/esm2022/wysiwyg/lib/wysiwyg/wysiwyg-toolbar/wysiwyg-toolbar.component.mjs +105 -43
  182. package/esm2022/wysiwyg/lib/wysiwyg/wysiwyg-view/wysiwyg-view.component.mjs +9 -1
  183. package/esm2022/wysiwyg/lib/wysiwyg/wysiwyg.service.mjs +4 -1
  184. package/fesm2022/acorex-components-action-sheet.mjs +20 -0
  185. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  186. package/fesm2022/acorex-components-alert.mjs +47 -2
  187. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  188. package/fesm2022/acorex-components-audio-wave.mjs +47 -0
  189. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  190. package/fesm2022/acorex-components-avatar.mjs +20 -1
  191. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  192. package/fesm2022/acorex-components-badge.mjs +8 -0
  193. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  194. package/fesm2022/acorex-components-bottom-navigation.mjs +13 -0
  195. package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
  196. package/fesm2022/acorex-components-breadcrumbs.mjs +13 -0
  197. package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
  198. package/fesm2022/acorex-components-button-group.mjs +50 -0
  199. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  200. package/fesm2022/acorex-components-button.mjs +105 -0
  201. package/fesm2022/acorex-components-button.mjs.map +1 -1
  202. package/fesm2022/acorex-components-calendar.mjs +156 -0
  203. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  204. package/fesm2022/acorex-components-check-box.mjs +33 -0
  205. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  206. package/fesm2022/acorex-components-chips.mjs +13 -0
  207. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  208. package/fesm2022/acorex-components-circular-progress.mjs +72 -73
  209. package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
  210. package/fesm2022/acorex-components-collapse.mjs +90 -0
  211. package/fesm2022/acorex-components-collapse.mjs.map +1 -1
  212. package/fesm2022/acorex-components-color-box.mjs +22 -1
  213. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  214. package/fesm2022/acorex-components-color-palette.mjs +140 -0
  215. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  216. package/fesm2022/acorex-components-comment.mjs +35 -0
  217. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  218. package/fesm2022/acorex-components-common.mjs +44 -0
  219. package/fesm2022/acorex-components-common.mjs.map +1 -1
  220. package/fesm2022/acorex-components-conversation.mjs +372 -0
  221. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  222. package/fesm2022/acorex-components-data-pager.mjs +209 -0
  223. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  224. package/fesm2022/acorex-components-data-table.mjs +510 -0
  225. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  226. package/fesm2022/acorex-components-datetime-box.mjs +50 -1
  227. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  228. package/fesm2022/acorex-components-datetime-input.mjs +121 -0
  229. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  230. package/fesm2022/acorex-components-datetime-picker.mjs +89 -0
  231. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  232. package/fesm2022/acorex-components-decorators.mjs +63 -0
  233. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  234. package/fesm2022/acorex-components-dialog.mjs +17 -0
  235. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  236. package/fesm2022/acorex-components-drawer.mjs +108 -0
  237. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  238. package/fesm2022/acorex-components-dropdown-button.mjs +35 -0
  239. package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
  240. package/fesm2022/acorex-components-dropdown.mjs +133 -0
  241. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  242. package/fesm2022/acorex-components-form.mjs +137 -0
  243. package/fesm2022/acorex-components-form.mjs.map +1 -1
  244. package/fesm2022/acorex-components-image.mjs +46 -0
  245. package/fesm2022/acorex-components-image.mjs.map +1 -1
  246. package/fesm2022/acorex-components-label.mjs +31 -0
  247. package/fesm2022/acorex-components-label.mjs.map +1 -1
  248. package/fesm2022/acorex-components-list.mjs +83 -0
  249. package/fesm2022/acorex-components-list.mjs.map +1 -1
  250. package/fesm2022/acorex-components-loading.mjs +42 -0
  251. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  252. package/fesm2022/acorex-components-popup.mjs +1 -1
  253. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  254. package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
  255. package/fesm2022/acorex-components-scheduler.mjs +32 -0
  256. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  257. package/fesm2022/acorex-components-search-box.mjs +18 -1
  258. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  259. package/fesm2022/acorex-components-select-box.mjs +49 -1
  260. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  261. package/fesm2022/acorex-components-selection-list.mjs +50 -0
  262. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  263. package/fesm2022/acorex-components-side-menu.mjs +4 -0
  264. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  265. package/fesm2022/acorex-components-skeleton.mjs +10 -0
  266. package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
  267. package/fesm2022/acorex-components-slider.mjs +51 -1
  268. package/fesm2022/acorex-components-slider.mjs.map +1 -1
  269. package/fesm2022/acorex-components-step-wizard.mjs +22 -0
  270. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  271. package/fesm2022/acorex-components-switch.mjs +14 -0
  272. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  273. package/fesm2022/acorex-components-tabs.mjs +58 -0
  274. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  275. package/fesm2022/acorex-components-tag.mjs +1 -0
  276. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  277. package/fesm2022/acorex-components-text-area.mjs +7 -0
  278. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  279. package/fesm2022/acorex-components-text-box.mjs +12 -0
  280. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  281. package/fesm2022/acorex-components-toast.mjs +5 -0
  282. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  283. package/fesm2022/acorex-components-tooltip.mjs +4 -0
  284. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  285. package/fesm2022/acorex-components-uploader.mjs +100 -32
  286. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  287. package/fesm2022/acorex-components-wysiwyg.mjs +179 -50
  288. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  289. package/form/lib/form-field.component.d.ts +45 -0
  290. package/form/lib/form.component.d.ts +58 -0
  291. package/form/lib/validation-summary.component.d.ts +49 -0
  292. package/image/lib/image.component.d.ts +61 -0
  293. package/label/lib/label.component.d.ts +34 -0
  294. package/list/lib/list.component.d.ts +98 -0
  295. package/loading/lib/loading-spinner.component.d.ts +20 -0
  296. package/loading/lib/loading.component.d.ts +35 -0
  297. package/package.json +58 -58
  298. package/progress-bar/lib/progress-bar.component.d.ts +0 -1
  299. package/scheduler/lib/scheduler-month-view.component.d.ts +20 -0
  300. package/scheduler/lib/scheduler-week-view.component.d.ts +4 -0
  301. package/scheduler/lib/scheduler.component.d.ts +10 -0
  302. package/search-box/lib/search-box.component.d.ts +19 -1
  303. package/select-box/lib/select-box.component.d.ts +78 -1
  304. package/selection-list/lib/selection-list.component.d.ts +55 -0
  305. package/side-menu/lib/side-menu.component.d.ts +4 -0
  306. package/skeleton/lib/skeleton.component.d.ts +10 -0
  307. package/slider/lib/slider.component.d.ts +51 -1
  308. package/step-wizard/lib/step-wizard.component.d.ts +23 -0
  309. package/switch/lib/switch-content.component.d.ts +4 -0
  310. package/switch/lib/switch.component.d.ts +14 -0
  311. package/tabs/lib/tab-item.component.d.ts +32 -0
  312. package/tabs/lib/tabs.component.d.ts +42 -0
  313. package/tag/lib/tag.component.d.ts +4 -0
  314. package/text-area/lib/text-area.component.d.ts +13 -0
  315. package/text-box/lib/text-box.component.d.ts +27 -0
  316. package/toast/lib/toast.component.d.ts +6 -0
  317. package/tooltip/lib/tooltip.component.d.ts +13 -0
  318. package/uploader/index.d.ts +4 -4
  319. package/uploader/lib/{uploader-dialog-container.component.d.ts → uploader-dialog-container/uploader-dialog-container.component.d.ts} +15 -0
  320. package/uploader/lib/uploader-drop-zone/uploader-drop-zone.component.d.ts +12 -0
  321. package/uploader/lib/{uploader-list.component.d.ts → uploader-list/uploader-list.component.d.ts} +6 -1
  322. package/uploader/lib/uploader-zone.directive.d.ts +1 -0
  323. package/uploader/lib/uploader.models.d.ts +9 -0
  324. package/uploader/lib/uploader.module.d.ts +4 -4
  325. package/uploader/lib/uploader.service.d.ts +2 -1
  326. package/wysiwyg/lib/wysiwyg/wysiwyg-container/wysiwyg-container.component.d.ts +35 -6
  327. package/wysiwyg/lib/wysiwyg/wysiwyg-toolbar/wysiwyg-toolbar.component.d.ts +61 -21
  328. package/wysiwyg/lib/wysiwyg/wysiwyg-view/wysiwyg-view.component.d.ts +4 -0
  329. package/wysiwyg/lib/wysiwyg/wysiwyg.service.d.ts +3 -0
  330. package/esm2022/uploader/lib/uploader-drop-zone.component.mjs +0 -14
  331. package/esm2022/uploader/lib/uploader-list.component.mjs +0 -21
  332. package/uploader/lib/uploader-drop-zone.component.d.ts +0 -6
@@ -13,19 +13,51 @@ import * as i4 from "@acorex/components/skeleton";
13
13
  import * as i5 from "@acorex/components/button";
14
14
  import * as i6 from "@acorex/components/data-pager";
15
15
  import * as i7 from "@angular/cdk/drag-drop";
16
+ /**
17
+ * Component for displaying and managing a data table with advanced features.
18
+ *
19
+ * @category Components
20
+ */
16
21
  export class AXDataTableComponent extends AXBaseDataTable {
17
22
  constructor() {
18
23
  super(...arguments);
19
24
  this._unsubscriber = inject(AXUnsubscriber);
20
25
  this._zone = inject(NgZone);
26
+ /**
27
+ * @ignore
28
+ */
21
29
  this.displayedRows = signal([]);
30
+ /**
31
+ * @ignore
32
+ */
22
33
  this.page = signal(0);
34
+ /**
35
+ * @ignore
36
+ */
23
37
  this.pageSize = signal(0);
38
+ /**
39
+ * @ignore
40
+ */
24
41
  this.isLoading = signal(true);
42
+ /**
43
+ * @ignore
44
+ */
25
45
  this.columnsList = signal([]);
46
+ /**
47
+ * @ignore
48
+ */
26
49
  this.endFixedColumnsList = computed(() => this.columnsList().filter((c) => c.fixed === 'end'));
50
+ /**
51
+ * @ignore
52
+ */
27
53
  this.startFixedColumnsList = computed(() => this.columnsList().filter((c) => c.fixed === 'start'));
54
+ /**
55
+ * @ignore
56
+ */
28
57
  this.normalColumnsList = computed(() => this.columnsList().filter((c) => c.fixed !== 'end' && c.fixed !== 'start'));
58
+ /**
59
+ * @ignore
60
+ */
29
61
  this.resizeColumnProp = {
30
62
  startX: 0,
31
63
  startWidth: 0,
@@ -33,35 +65,129 @@ export class AXDataTableComponent extends AXBaseDataTable {
33
65
  newColumnWidth: 0,
34
66
  thElement: null,
35
67
  };
68
+ /**
69
+ * @ignore
70
+ */
36
71
  this.hasItems = false;
72
+ /**
73
+ * @ignore
74
+ */
37
75
  this.totalRows = 0;
76
+ /**
77
+ * @ignore
78
+ */
38
79
  this.currentPage = 0;
80
+ /**
81
+ * @ignore
82
+ */
39
83
  this.totalPages = 0;
84
+ /**
85
+ * @ignore
86
+ */
40
87
  this.startRowIndex = 0;
88
+ /**
89
+ * Defines if alternative row styling should be applied.
90
+ *
91
+ * @defaultValue `true`
92
+ */
41
93
  this.alternative = true;
94
+ /**
95
+ * Indicates if the table header should be displayed.
96
+ *
97
+ * @defaultValue `true`
98
+ */
42
99
  this.showHeader = true;
100
+ /**
101
+ * Indicates if the table header should be fixed.
102
+ *
103
+ * @defaultValue `true`
104
+ */
43
105
  this.fixedHeader = true;
106
+ /**
107
+ * Indicates if the table footer should be displayed.
108
+ *
109
+ * @defaultValue `false`
110
+ */
44
111
  this.showFooter = false;
112
+ /**
113
+ * Indicates if the table footer should be fixed.
114
+ *
115
+ * @defaultValue `true`
116
+ */
45
117
  this.fixedFooter = true;
118
+ /**
119
+ * Specifies the height of each item in the table.
120
+ *
121
+ * @defaultValue `40`
122
+ */
46
123
  this.itemHeight = 40;
124
+ /**
125
+ * Enables or disables row reordering.
126
+ *
127
+ * @defaultValue `false`
128
+ */
47
129
  this.allowReordering = false;
130
+ /**
131
+ * Enables or disables paging.
132
+ *
133
+ * @defaultValue `true`
134
+ */
48
135
  this.paging = true;
136
+ /**
137
+ * Specifies how data should be fetched.
138
+ *
139
+ * @defaultValue `'auto'`
140
+ */
49
141
  this.fetchDataMode = 'auto';
142
+ /**
143
+ * Configuration for loading state.
144
+ *
145
+ * @defaultValue `{ enabled: true, animation: true }`
146
+ */
50
147
  this.loading = {
51
148
  enabled: true,
52
149
  animation: true,
53
150
  };
151
+ /**
152
+ * Emits when the focused row changes.
153
+ *
154
+ * @event
155
+ */
54
156
  this.focusedRowChange = new EventEmitter();
157
+ /**
158
+ * Emits when a row is clicked.
159
+ *
160
+ * @event onRowClick
161
+ */
55
162
  this.onRowClick = new EventEmitter();
163
+ /**
164
+ * Emits when a row is double-clicked.
165
+ *
166
+ * @event onRowDbClick
167
+ */
56
168
  this.onRowDbClick = new EventEmitter();
169
+ /**
170
+ * Emits when the order of columns changes.
171
+ *
172
+ * @event onColumnsOrderChanged
173
+ */
57
174
  this.onColumnsOrderChanged = new EventEmitter();
175
+ /**
176
+ * @ignore
177
+ */
58
178
  this.clickSubject = new Subject();
179
+ /**
180
+ * @ignore
181
+ */
59
182
  this.onResizeColumnMove = (event) => {
60
183
  const diffX = event.pageX - this.resizeColumnProp.startX;
61
184
  const newWidth = this.rtl ? this.resizeColumnProp.startWidth - diffX : this.resizeColumnProp.startWidth + diffX;
62
185
  this.resizeColumnProp.thElement.style.width = `${Math.max(100, newWidth)}px`;
63
186
  this.resizeColumnProp.thElement.setAttribute('new-width', `${newWidth}`);
64
187
  };
188
+ /**
189
+ * @ignore
190
+ */
65
191
  this.onResizeColumnEnd = () => {
66
192
  document.removeEventListener('mousemove', this.onResizeColumnMove);
67
193
  document.removeEventListener('mouseup', this.onResizeColumnEnd);
@@ -70,13 +196,24 @@ export class AXDataTableComponent extends AXBaseDataTable {
70
196
  this.resetResizingProcess();
71
197
  };
72
198
  }
199
+ /**
200
+ * Gets the currently focused row.
201
+ */
73
202
  get focusedRow() {
74
203
  return this._focusedRow;
75
204
  }
205
+ /**
206
+ * Sets the currently focused row and emits the change event.
207
+ *
208
+ * @param v - The row to be focused.
209
+ */
76
210
  set focusedRow(v) {
77
211
  this._focusedRow = v;
78
212
  this.focusedRowChange.emit(v);
79
213
  }
214
+ /**
215
+ * @ignore
216
+ */
80
217
  ngOnInit() {
81
218
  super.ngOnInit();
82
219
  this.rtl = AXHtmlUtil.isRtl(this.getHostElement());
@@ -102,6 +239,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
102
239
  this.handleRowDoubleClick(clickArray[0].event, clickArray[0].item);
103
240
  });
104
241
  }
242
+ /**
243
+ * @ignore
244
+ */
105
245
  ngAfterViewInit() {
106
246
  this.calculateStickyColumnsPositions();
107
247
  this.columnsList.set(this.columns.toArray());
@@ -109,6 +249,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
109
249
  this.columnsList.set(cols.toArray());
110
250
  });
111
251
  }
252
+ /**
253
+ * @ignore
254
+ */
112
255
  drop(event) {
113
256
  const clonedColumns = [...this.columnsList()];
114
257
  moveItemInArray(clonedColumns, event.previousIndex, event.currentIndex);
@@ -119,10 +262,16 @@ export class AXDataTableComponent extends AXBaseDataTable {
119
262
  isUserInteraction: true,
120
263
  });
121
264
  }
265
+ /**
266
+ * @ignore
267
+ */
122
268
  handleRowClick(event, item) {
123
269
  this.handleRowSingleClick(event, item);
124
270
  this.clickSubject.next({ event, item });
125
271
  }
272
+ /**
273
+ * @ignore
274
+ */
126
275
  handleRowSingleClick(event, item) {
127
276
  if (this.focusedRow == item) {
128
277
  this.focusedRow = null;
@@ -137,6 +286,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
137
286
  isUserInteraction: true,
138
287
  });
139
288
  }
289
+ /**
290
+ * @ignore
291
+ */
140
292
  onPageChanged(event) {
141
293
  if (event.isUserInteraction) {
142
294
  const pageChanged = event.page - 1 != this.page();
@@ -155,6 +307,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
155
307
  }
156
308
  }
157
309
  }
310
+ /**
311
+ * @ignore
312
+ */
158
313
  handleRowDoubleClick(e, item) {
159
314
  this.focusedRow = item;
160
315
  //
@@ -164,6 +319,14 @@ export class AXDataTableComponent extends AXBaseDataTable {
164
319
  isUserInteraction: true,
165
320
  });
166
321
  }
322
+ /**
323
+ * Handles the click event on a column header.
324
+ * Toggles the sorting direction or removes the sort if already sorted.
325
+ *
326
+ * @param e - The mouse event triggered by the click.
327
+ * @param column - The column that was clicked.
328
+ * @ignore
329
+ */
167
330
  handleColumnClick(e, column) {
168
331
  if (column instanceof AXDataTableTextColumnComponent) {
169
332
  const sort = this.dataSource.query.sort.find((c) => c.field == column.dataField);
@@ -184,6 +347,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
184
347
  this.refresh();
185
348
  }
186
349
  }
350
+ /**
351
+ * @ignore
352
+ */
187
353
  getSort(column) {
188
354
  if (column instanceof AXDataTableTextColumnComponent) {
189
355
  const sort = this.dataSource.query.sort.find((c) => c.field == column.dataField);
@@ -191,15 +357,25 @@ export class AXDataTableComponent extends AXBaseDataTable {
191
357
  }
192
358
  return undefined;
193
359
  }
360
+ /**
361
+ * Refreshes the data in the data source and resets the data pager to the first page.
362
+ * @ignore
363
+ */
194
364
  refresh() {
195
365
  this.dataSource.refresh();
196
366
  if (this.dataPager) {
197
367
  this.dataPager.goFirstPage();
198
368
  }
199
369
  }
370
+ /**
371
+ * @ignore
372
+ */
200
373
  calculateRowIndex(index) {
201
374
  return this.dataSource.pageSize * this.page() + index;
202
375
  }
376
+ /**
377
+ * @ignore
378
+ */
203
379
  onResizeColumnStart(event, columnIndex) {
204
380
  event.preventDefault();
205
381
  event.stopPropagation();
@@ -212,6 +388,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
212
388
  document.addEventListener('mouseup', this.onResizeColumnEnd);
213
389
  });
214
390
  }
391
+ /**
392
+ * @ignore
393
+ */
215
394
  resetResizingProcess() {
216
395
  this.resizeColumnProp.thElement.removeAttribute('new-width');
217
396
  this.resizeColumnProp = {
@@ -222,6 +401,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
222
401
  thElement: null,
223
402
  };
224
403
  }
404
+ /**
405
+ * @ignore
406
+ */
225
407
  calculateStickyColumnsPositions() {
226
408
  let totalWidth = 0;
227
409
  let accumulatedWidthFromStart = 0;
@@ -319,4 +501,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
319
501
  type: ContentChildren,
320
502
  args: [AXDataTableColumnComponent]
321
503
  }] } });
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUVqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQTBFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7OztBQW1CdkYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGVBQWU7SUFqQnpEOztRQWtCVSxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2QyxVQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBTXJC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V0FBVztzQkFEVixLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBWUssVUFBVTtzQkFEcEIsS0FBSztnQkFVTixnQkFBZ0I7c0JBRGYsTUFBTTtnQkFJUCxVQUFVO3NCQURULE1BQU07Z0JBSVAsWUFBWTtzQkFEWCxNQUFNO2dCQUlQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFNRyxPQUFPO3NCQURoQixlQUFlO3VCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYRGF0YVBhZ2VyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2RhdGEtcGFnZXInO1xuaW1wb3J0IHsgQVhIdG1sVXRpbCwgQVhVbnN1YnNjcmliZXIgfSBmcm9tICdAYWNvcmV4L2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgYnVmZmVyLCBkZWJvdW5jZVRpbWUsIGZpbHRlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhCYXNlRGF0YVRhYmxlLCBBWENvbHVtbnNPcmRlckNoYW5nZWRFdmVudCwgQVhEYXRhVGFibGVSb3dDbGljaywgQVhEYXRhVGFibGVSb3dEYkNsaWNrIH0gZnJvbSAnLi4vYmFzZS1kYXRhLXRhYmxlLmNsYXNzJztcbmltcG9ydCB7IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBBWERhdGFUYWJsZVRleHRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2RhdGEtdGV4dC1jb2x1bW4uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDogeyBuZ1NraXBIeWRyYXRpb246ICd0cnVlJyB9LFxuICBpbnB1dHM6IFsnZGF0YVNvdXJjZSddLFxuICBvdXRwdXRzOiBbJ3NlbGVjdGVkUm93c0NoYW5nZSddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBWEJhc2VEYXRhVGFibGUsXG4gICAgICB1c2VFeGlzdGluZzogQVhEYXRhVGFibGVDb21wb25lbnQsXG4gICAgfSxcbiAgICBBWFVuc3Vic2NyaWJlcixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQVhEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBWEJhc2VEYXRhVGFibGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF91bnN1YnNjcmliZXIgPSBpbmplY3QoQVhVbnN1YnNjcmliZXIpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgQFZpZXdDaGlsZCgnZGF0YVBhZ2VyJykgZGF0YVBhZ2VyO1xuXG4gIHByb3RlY3RlZCBydGwhOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBkaXNwbGF5ZWRSb3dzOiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuICBwcm90ZWN0ZWQgcGFnZTogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcbiAgcHJvdGVjdGVkIHBhZ2VTaXplOiBXcml0YWJsZVNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDApO1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgY29sdW1uc0xpc3Q6IFdyaXRhYmxlU2lnbmFsPGFueVtdPiA9IHNpZ25hbChbXSk7XG5cbiAgcHJvdGVjdGVkIGVuZEZpeGVkQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkID09PSAnZW5kJykpO1xuICBwcm90ZWN0ZWQgc3RhcnRGaXhlZENvbHVtbnNMaXN0OiBTaWduYWw8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb2x1bW5zTGlzdCgpLmZpbHRlcigoYykgPT4gYy5maXhlZCA9PT0gJ3N0YXJ0JykpO1xuICBwcm90ZWN0ZWQgbm9ybWFsQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkICE9PSAnZW5kJyAmJiBjLmZpeGVkICE9PSAnc3RhcnQnKSk7XG5cbiAgcHJvdGVjdGVkIHJlc2l6ZUNvbHVtblByb3AgPSB7XG4gICAgc3RhcnRYOiAwLFxuICAgIHN0YXJ0V2lkdGg6IDAsXG4gICAgY29sdW1uSW5kZXg6IDAsXG4gICAgbmV3Q29sdW1uV2lkdGg6IDAsXG4gICAgdGhFbGVtZW50OiBudWxsLFxuICB9O1xuICBwcm90ZWN0ZWQgaGFzSXRlbXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHRvdGFsUm93cyA9IDA7XG4gIHByb3RlY3RlZCBjdXJyZW50UGFnZSA9IDA7XG4gIHByb3RlY3RlZCB0b3RhbFBhZ2VzID0gMDtcbiAgcHJvdGVjdGVkIHN0YXJ0Um93SW5kZXggPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHJvd1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQElucHV0KClcbiAgZW1wdHlUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBJbnB1dCgpXG4gIGFsdGVybmF0aXZlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzaG93SGVhZGVyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBmaXhlZEhlYWRlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd0Zvb3RlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGZpeGVkRm9vdGVyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBpdGVtSGVpZ2h0OiBudW1iZXIgfCAnYXV0bycgPSA0MDtcblxuICBASW5wdXQoKVxuICBhbGxvd1Jlb3JkZXJpbmcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwYWdpbmcgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGZldGNoRGF0YU1vZGU6ICdhdXRvJyB8ICdtYW51YWwnID0gJ2F1dG8nO1xuXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmc6IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGFuaW1hdGlvbjogYm9vbGVhbjtcbiAgICBsb2FkaW5nVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgfSA9IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgfTtcblxuICBwcml2YXRlIF9mb2N1c2VkUm93OiB1bmtub3duO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGZvY3VzZWRSb3coKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3c7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c2VkUm93KHY6IHVua25vd24pIHtcbiAgICB0aGlzLl9mb2N1c2VkUm93ID0gdjtcbiAgICB0aGlzLmZvY3VzZWRSb3dDaGFuZ2UuZW1pdCh2KTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBmb2N1c2VkUm93Q2hhbmdlOiBFdmVudEVtaXR0ZXI8dW5rbm93bj4gPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uUm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxBWERhdGFUYWJsZVJvd0NsaWNrPiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dDbGljaz4oKTtcblxuICBAT3V0cHV0KClcbiAgb25Sb3dEYkNsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dEYkNsaWNrPiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dEYkNsaWNrPigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNvbHVtbnNPcmRlckNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWENvbHVtbnNPcmRlckNoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50PigpO1xuXG4gIHByaXZhdGUgY2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBldmVudDogTW91c2VFdmVudDsgaXRlbTogYW55IH0+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudClcbiAgcHJvdGVjdGVkIGNvbHVtbnM6IFF1ZXJ5TGlzdDxBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD47XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnJ0bCA9IEFYSHRtbFV0aWwuaXNSdGwodGhpcy5nZXRIb3N0RWxlbWVudCgpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXNlQ2FjaGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5mZXRjaERhdGFNb2RlID09ICdhdXRvJykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNldFBhZ2UoMCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheWVkUm93cy5zZXQobmV3IEFycmF5KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSkpO1xuICAgIHRoaXMudG90YWxSb3dzID0gdGhpcy5kYXRhU291cmNlLml0ZW1zLmxlbmd0aDtcbiAgICB0aGlzLmRhdGFTb3VyY2Uub25Mb2FkaW5nQ2hhbmdlZC5waXBlKHRoaXMuX3Vuc3Vic2NyaWJlci50YWtlVW50aWxEZXN0cm95KS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChkYXRhKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkNoYW5nZWQucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXllZFJvd3Muc2V0KGRhdGEuaXRlbXMpO1xuICAgICAgdGhpcy50b3RhbFJvd3MgPSBkYXRhLnRvdGFsQ291bnQ7XG4gICAgICB0aGlzLmhhc0l0ZW1zID0gZGF0YS50b3RhbENvdW50ID4gMDtcbiAgICB9KTtcblxuICAgIHRoaXMucGFnZVNpemUuc2V0KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSk7XG5cbiAgICAvL1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgYnVmZmVyKHRoaXMuY2xpY2tTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDI1MCkpKSxcbiAgICAgICAgZmlsdGVyKChjbGlja0FycmF5KSA9PiBjbGlja0FycmF5Lmxlbmd0aCA9PT0gMiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjbGlja0FycmF5KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUm93RG91YmxlQ2xpY2soY2xpY2tBcnJheVswXS5ldmVudCwgY2xpY2tBcnJheVswXS5pdGVtKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2FsY3VsYXRlU3RpY2t5Q29sdW1uc1Bvc2l0aW9ucygpO1xuICAgIHRoaXMuY29sdW1uc0xpc3Quc2V0KHRoaXMuY29sdW1ucy50b0FycmF5KCkpO1xuICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnBpcGUodGhpcy5fdW5zdWJzY3JpYmVyLnRha2VVbnRpbERlc3Ryb3kpLnN1YnNjcmliZSgoY29scykgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zTGlzdC5zZXQoY29scy50b0FycmF5KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPGFueSwgYW55LCBhbnk+KSB7XG4gICAgY29uc3QgY2xvbmVkQ29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnNMaXN0KCldO1xuICAgIG1vdmVJdGVtSW5BcnJheShjbG9uZWRDb2x1bW5zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIHRoaXMuY29sdW1uc0xpc3Quc2V0KGNsb25lZENvbHVtbnMpO1xuXG4gICAgdGhpcy5vbkNvbHVtbnNPcmRlckNoYW5nZWQuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBkYXRhOiB7IGV2ZW50IH0sXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVSb3dDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuaGFuZGxlUm93U2luZ2xlQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0Lm5leHQoeyBldmVudCwgaXRlbSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUm93U2luZ2xlQ2xpY2soZXZlbnQ6IEV2ZW50LCBpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c2VkUm93ID09IGl0ZW0pIHtcbiAgICAgIHRoaXMuZm9jdXNlZFJvdyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNlZFJvdyA9IGl0ZW07XG4gICAgfVxuICAgIC8vXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgZGF0YTogaXRlbSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZWQoZXZlbnQ6IEFYRGF0YVBhZ2VyQ2hhbmdlZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmlzVXNlckludGVyYWN0aW9uKSB7XG4gICAgICBjb25zdCBwYWdlQ2hhbmdlZCA9IGV2ZW50LnBhZ2UgLSAxICE9IHRoaXMucGFnZSgpO1xuICAgICAgY29uc3QgcGFnZVNpemVDaGFuZ2VkID0gZXZlbnQudGFrZSAhPSB0aGlzLnBhZ2VTaXplKCk7XG5cbiAgICAgIGlmIChwYWdlQ2hhbmdlZCB8fCBwYWdlU2l6ZUNoYW5nZWQpIHtcbiAgICAgICAgaWYgKHBhZ2VDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5wYWdlLnNldChldmVudC5wYWdlIC0gMSk7XG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLnNldFBhZ2UodGhpcy5wYWdlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhZ2VTaXplQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMucGFnZVNpemUuc2V0KGV2ZW50LnRha2UpO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5zZXRQYWdlU2l6ZSh0aGlzLnBhZ2VTaXplKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXllZCByb3dzIGFuZCBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLmRpc3BsYXllZFJvd3Muc2V0KG5ldyBBcnJheSh0aGlzLnBhZ2VTaXplKCkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlUm93RG91YmxlQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuZm9jdXNlZFJvdyA9IGl0ZW07XG4gICAgLy9cbiAgICB0aGlzLm9uUm93RGJDbGljay5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNvbHVtbkNsaWNrKGU6IE1vdXNlRXZlbnQsIGNvbHVtbjogQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpIHtcbiAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgQVhEYXRhVGFibGVUZXh0Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQuZmluZCgoYykgPT4gYy5maWVsZCA9PSBjb2x1bW4uZGF0YUZpZWxkKTtcbiAgICAgIGlmICghc29ydCkge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydC5wdXNoKHtcbiAgICAgICAgICBmaWVsZDogY29sdW1uLmRhdGFGaWVsZCxcbiAgICAgICAgICBkaXI6ICdhc2MnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzb3J0LmRpciA9PSAnYXNjJykge1xuICAgICAgICAgIHNvcnQuZGlyID0gJ2Rlc2MnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0ID0gdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQuZmlsdGVyKChjKSA9PiBjICE9IHNvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydChjb2x1bW46IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgQVhEYXRhVGFibGVUZXh0Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQuZmluZCgoYykgPT4gYy5maWVsZCA9PSBjb2x1bW4uZGF0YUZpZWxkKTtcbiAgICAgIHJldHVybiBzb3J0ID8gKHNvcnQuZGlyID09ICdhc2MnID8gJ2F4LWljb24tYXJyb3ctbG9uZy1kb3duJyA6ICdheC1pY29uLWFycm93LWxvbmctdXAnKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5yZWZyZXNoKCk7XG4gICAgaWYgKHRoaXMuZGF0YVBhZ2VyKSB7XG4gICAgICB0aGlzLmRhdGFQYWdlci5nb0ZpcnN0UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVSb3dJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSAqIHRoaXMucGFnZSgpICsgaW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25SZXNpemVDb2x1bW5TdGFydChldmVudDogTW91c2VFdmVudCwgY29sdW1uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRYID0gZXZlbnQucGFnZVg7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnN0YXJ0V2lkdGggPSBwYXJzZUludCh0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50LnN0eWxlLndpZHRoKTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVDb2x1bW5Nb3ZlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplQ29sdW1uRW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemVDb2x1bW5Nb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMucmVzaXplQ29sdW1uUHJvcC5zdGFydFg7XG4gICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLnJ0bCA/IHRoaXMucmVzaXplQ29sdW1uUHJvcC5zdGFydFdpZHRoIC0gZGlmZlggOiB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCArIGRpZmZYO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtNYXRoLm1heCgxMDAsIG5ld1dpZHRoKX1weGA7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25ldy13aWR0aCcsIGAke25ld1dpZHRofWApO1xuICB9O1xuXG4gIHByaXZhdGUgb25SZXNpemVDb2x1bW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZUNvbHVtbk1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplQ29sdW1uRW5kKTtcblxuICAgIGNvbnN0IG5ld1dpZHRoID0gcGFyc2VJbnQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmV3LXdpZHRoJykudmFsdWUpO1xuICAgIHRoaXMuY29sdW1ucy5nZXQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLmNvbHVtbkluZGV4KS53aWR0aCA9IGAke01hdGgubWF4KDEwMCwgbmV3V2lkdGgpfXB4YDtcbiAgICB0aGlzLnJlc2V0UmVzaXppbmdQcm9jZXNzKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFJlc2l6aW5nUHJvY2VzcygpIHtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnbmV3LXdpZHRoJyk7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wID0ge1xuICAgICAgc3RhcnRYOiAwLFxuICAgICAgc3RhcnRXaWR0aDogMCxcbiAgICAgIGNvbHVtbkluZGV4OiAwLFxuICAgICAgbmV3Q29sdW1uV2lkdGg6IDAsXG4gICAgICB0aEVsZW1lbnQ6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU3RpY2t5Q29sdW1uc1Bvc2l0aW9ucygpIHtcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG4gICAgbGV0IGFjY3VtdWxhdGVkV2lkdGhGcm9tU3RhcnQgPSAwO1xuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoY29sdW1uLndpZHRoIGFzIHN0cmluZyk7XG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICB0b3RhbFdpZHRoICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBsYXN0U3RhcnRDb2x1bW46IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xuXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSBwYXJzZUludChjb2x1bW4ud2lkdGggYXMgc3RyaW5nKTtcblxuICAgICAgaWYgKGNvbHVtbi5maXhlZCA9PT0gJ3N0YXJ0JyAmJiAhaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGNvbHVtblsnc3RpY2t5U3RhcnQnXSA9IGFjY3VtdWxhdGVkV2lkdGhGcm9tU3RhcnQgKyAncHgnO1xuICAgICAgICBsYXN0U3RhcnRDb2x1bW4gPSBjb2x1bW47XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkV2lkdGhGcm9tU3RhcnQgKz0gd2lkdGg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGxhc3RTdGFydENvbHVtbikgbGFzdFN0YXJ0Q29sdW1uWydpc0xhc3RGaXhlZENvbHVtbiddID0gdHJ1ZTtcblxuICAgIGxldCBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCA9IDA7XG4gICAgbGV0IGZpcnN0RW5kQ29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcblxuICAgIGZvciAobGV0IGkgPSB0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5nZXQoaSk7XG5cbiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoY29sdW1uLndpZHRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGlmIChjb2x1bW4uZml4ZWQgPT09ICdlbmQnICYmICFpc05hTih3aWR0aCkpIHtcbiAgICAgICAgY29sdW1uWydzdGlja3lFbmQnXSA9IGFjY3VtdWxhdGVkV2lkdGhGcm9tRW5kICsgJ3B4JztcbiAgICAgICAgZmlyc3RFbmRDb2x1bW4gPSBjb2x1bW47XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkV2lkdGhGcm9tRW5kICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlyc3RFbmRDb2x1bW4pIGZpcnN0RW5kQ29sdW1uWydpc0ZpcnN0Rml4ZWRDb2x1bW4nXSA9IHRydWU7XG4gIH1cbn1cbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cImF4LWhlYWRlclwiPiA8L25nLWNvbnRlbnQ+XG5AaWYgKCFkaXNwbGF5ZWRSb3dzKCkubGVuZ3RoKSB7XG4gIDxkaXYgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWVtcHR5LWRhdGFcIj5cbiAgICBAaWYgKGVtcHR5VGVtcGxhdGUpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8c3Bhbj5ObyBSZWNvcmQgRm91bmQhPC9zcGFuPlxuICAgIH1cbiAgPC9kaXY+XG59XG48ZGl2IGNsYXNzPVwiYXgtZGF0YS10YWJsZS13cmFwcGVyXCI+XG4gIDx0YWJsZT5cbiAgICBAaWYgKHNob3dIZWFkZXIpIHtcbiAgICAgIDx0aGVhZCBbbmdDbGFzc109XCJ7ICdheC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXInOiBmaXhlZEhlYWRlciB9XCI+XG4gICAgICAgIDx0clxuICAgICAgICAgIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cIiFhbGxvd1Jlb3JkZXJpbmdcIlxuICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgY2RrU2Nyb2xsYWJsZVxuICAgICAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtaGVhZC1jZWxsIHN0aWNreS1zdGFydFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1pbnRlcmFjdGl2ZV09XCJjLmFsbG93U29ydGluZ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjLmFsbG93U29ydGluZyA/IGhhbmRsZUNvbHVtbkNsaWNrKCRldmVudCwgYykgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWhlYWRlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzTGFzdF09XCJjWydpc0xhc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LXN0YXJ0XT1cImNbJ3N0aWNreVN0YXJ0J11cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGZvciAoYyBvZiBub3JtYWxDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtaGVhZC1jZWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGMuYWxsb3dSZXNpemluZyAmJiAhYy5maXhlZCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1yZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblJlc2l6ZUNvbHVtblN0YXJ0KCRldmVudCwgdGhpcy5zdGFydEZpeGVkQ29sdW1uc0xpc3QoKS5sZW5ndGggKyAkaW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0aD48L3RoPlxuICAgICAgICAgIEBmb3IgKGMgb2YgZW5kRml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtaGVhZC1jZWxsIHN0aWNreS1lbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0ZpcnN0XT1cImNbJ2lzRmlyc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LWVuZF09XCJjWydzdGlja3lFbmQnXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckhlYWRlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiBjLCByb3dzOiBkaXNwbGF5ZWRSb3dzKCksIHJvd0luZGV4OiAkaW5kZXggfSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgQGlmIChnZXRTb3J0KGMpKSB7XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiB7eyBnZXRTb3J0KGMpIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgfVxuICAgIDx0Ym9keSBbbmdDbGFzc109XCJ7ICdheC1kYXRhLXRhYmxlLXJvdy1hbHRlcm5hdGl2ZSc6IGFsdGVybmF0aXZlIH1cIj5cbiAgICAgIEBmb3IgKHJvdyBvZiBkaXNwbGF5ZWRSb3dzKCk7IGxldCByb3dJbmRleCA9ICRpbmRleDsgdHJhY2sgcm93SW5kZXgpIHtcbiAgICAgICAgQGlmIChyb3dUZW1wbGF0ZSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogcm93LCByb3dJbmRleDogcm93SW5kZXggfSB9XCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8dHJcbiAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1mb2N1c2VkXT1cImZvY3VzZWRSb3cgJiYgcm93ID09PSBmb2N1c2VkUm93XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgW2NsYXNzLmF4LXN0YXRlLXNlbGVjdGVkXT1cInNlbGVjdGVkUm93cy5pbmNsdWRlcyhyb3cpXCJcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodD1cInt7IGl0ZW1IZWlnaHQgfX1weFwiXG4gICAgICAgICAgICBzdHlsZS5tYXgtaGVpZ2h0PVwie3sgaXRlbUhlaWdodCB9fXB4XCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVSb3dDbGljaygkZXZlbnQsIHJvdylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGMgb2Ygc3RhcnRGaXhlZENvbHVtbnNMaXN0KCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWJvZHktY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zdGlja3ktc3RhcnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzTGFzdF09XCJjWydpc0xhc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuLS1zdGlja3ktc3RhcnRdPVwiY1snc3RpY2t5U3RhcnQnXVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJjLmNhcHRpb25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImMuY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChyb3cgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IGNhbGN1bGF0ZVJvd0luZGV4KHJvd0luZGV4KSB9IH1cIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmIChjLmxvYWRpbmdFbmFibGVkICYmIGxvYWRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvYWRpbmcubG9hZGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmcubG9hZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxheC1za2VsZXRvbiBbYW5pbWF0ZWRdPVwibG9hZGluZy5hbmltYXRpb25cIj48L2F4LXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAoYyBvZiBub3JtYWxDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1ib2R5LWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWxhYmVsXT1cImMuY2FwdGlvblwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiYy5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKHJvdyAmJiAhaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogcm93LCByb3dJbmRleDogY2FsY3VsYXRlUm93SW5kZXgocm93SW5kZXgpIH0gfVwiXG4gICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKGMubG9hZGluZ0VuYWJsZWQgJiYgbG9hZGluZy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobG9hZGluZy5sb2FkaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZy5sb2FkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGF4LXNrZWxldG9uIFthbmltYXRlZF09XCJsb2FkaW5nLmFuaW1hdGlvblwiPjwvYXgtc2tlbGV0b24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIEBmb3IgKGMgb2YgZW5kRml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1ib2R5LWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5LWVuZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXNGaXJzdF09XCJjWydpc0ZpcnN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LWVuZF09XCJjWydzdGlja3lFbmQnXVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJjLmNhcHRpb25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImMuY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChyb3cgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IGNhbGN1bGF0ZVJvd0luZGV4KHJvd0luZGV4KSB9IH1cIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmIChjLmxvYWRpbmdFbmFibGVkICYmIGxvYWRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvYWRpbmcubG9hZGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmcubG9hZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxheC1za2VsZXRvbiBbYW5pbWF0ZWRdPVwibG9hZGluZy5hbmltYXRpb25cIj48L2F4LXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPHRyIGNsYXNzPVwiZW1wdHktcm93XCI+PC90cj5cbiAgICA8L3Rib2R5PlxuICAgIEBpZiAoc2hvd0Zvb3Rlcikge1xuICAgICAgPHRmb290IFtuZ0NsYXNzXT1cInsgJ2F4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlcic6IGZpeGVkRm9vdGVyIH1cIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIEBmb3IgKGMgb2Ygc3RhcnRGaXhlZENvbHVtbnNMaXN0KCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXgtZGF0YS10YWJsZS1zdGlja3ktZm9vdGVyLWNlbGwgc3RpY2t5LXN0YXJ0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzTGFzdF09XCJjWydpc0xhc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LXN0YXJ0XT1cImNbJ3N0aWNreVN0YXJ0J11cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJGb290ZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGZvciAoYyBvZiBub3JtYWxDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckZvb3RlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiBjLCByb3dzOiBkaXNwbGF5ZWRSb3dzKCksIHJvd0luZGV4OiAkaW5kZXggfSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgQGlmIChnZXRTb3J0KGMpKSB7XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiB7eyBnZXRTb3J0KGMpIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoYy5hbGxvd1Jlc2l6aW5nICYmICFjLmZpeGVkKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LXJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50LCB0aGlzLnN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpLmxlbmd0aCArICRpbmRleClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgQGZvciAoYyBvZiBlbmRGaXhlZENvbHVtbnNMaXN0KCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXgtZGF0YS10YWJsZS1zdGlja3ktZm9vdGVyLWNlbGwgc3RpY2t5LWVuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1pbnRlcmFjdGl2ZV09XCJjLmFsbG93U29ydGluZ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjLmFsbG93U29ydGluZyA/IGhhbmRsZUNvbHVtbkNsaWNrKCRldmVudCwgYykgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWhlYWRlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzRmlyc3RdPVwiY1snaXNGaXJzdEZpeGVkQ29sdW1uJ11cIlxuICAgICAgICAgICAgICBbc3R5bGUuLS1zdGlja3ktZW5kXT1cImNbJ3N0aWNreUVuZCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyRm9vdGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RyPlxuICAgICAgPC90Zm9vdD5cbiAgICB9XG4gIDwvdGFibGU+XG48L2Rpdj5cblxuQGlmIChwYWdpbmcpIHtcbiAgPGRpdiBjbGFzcz1cImF4LXRhYmxlLWZvb3RlclwiICNmb290ZXJDb250YWluZXI+XG4gICAgPGF4LWRhdGEtcGFnZXJcbiAgICAgICNkYXRhUGFnZXJcbiAgICAgIFtkaXNwbGF5TW9kZV09XCInY3VzdG9tJ1wiXG4gICAgICAob25DaGFuZ2VkKT1cIm9uUGFnZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICBbdG90YWxdPVwiZGF0YVNvdXJjZS50b3RhbENvdW50XCJcbiAgICAgIFtzaXplXT1cImRhdGFTb3VyY2UucGFnZVNpemVcIlxuICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmcoKVwiXG4gICAgPlxuICAgICAgPGF4LXByZWZpeCBjbGFzcz1cImF4LWRhdGEtdGFibGUtbnVtZXJpYy1wYWdpbmdcIj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItbnVtZXJpYy1zZWxlY3Rvcj4gPC9heC1kYXRhLXBhZ2VyLW51bWVyaWMtc2VsZWN0b3I+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLXBhZ2Utc2l6ZXM+IDwvYXgtZGF0YS1wYWdlci1wYWdlLXNpemVzPlxuICAgICAgPC9heC1wcmVmaXg+XG4gICAgICA8YXgtcHJlZml4IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1pbnB1dC1wYWdpbmdcIj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItcHJldi1idXR0b25zPiA8L2F4LWRhdGEtcGFnZXItcHJldi1idXR0b25zPlxuICAgICAgICA8YXgtZGF0YS1wYWdlci1pbnB1dC1zZWxlY3Rvcj4gPC9heC1kYXRhLXBhZ2VyLWlucHV0LXNlbGVjdG9yPlxuICAgICAgICA8YXgtZGF0YS1wYWdlci1uZXh0LWJ1dHRvbnM+IDwvYXgtZGF0YS1wYWdlci1uZXh0LWJ1dHRvbnM+XG4gICAgICA8L2F4LXByZWZpeD5cbiAgICAgIDxheC1zdWZmaXggY2xhc3M9XCJheC1kYXRhLXRhYmxlLWluZm9cIj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItaW5mbz4gPC9heC1kYXRhLXBhZ2VyLWluZm8+XG4gICAgICAgIDxheC1idXR0b24gbG9vaz1cImJsYW5rXCIgY2xhc3M9XCJheC1zbVwiIChvbkNsaWNrKT1cInJlZnJlc2goKVwiPlxuICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIGF4LWljb24tcmVmcmVzaFwiPjwvYXgtaWNvbj5cbiAgICAgICAgPC9heC1idXR0b24+XG4gICAgICA8L2F4LXN1ZmZpeD5cbiAgICA8L2F4LWRhdGEtcGFnZXI+XG4gIDwvZGl2PlxufVxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtZm9vdGVyXCI+IDwvbmctY29udGVudD5cbiJdfQ==
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUVqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQTBFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7OztBQUV2Rjs7OztHQUlHO0FBa0JILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxlQUFlO0lBakJ6RDs7UUFrQlUsa0JBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENB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QkFTUCxZQUFZO3NCQURYLE1BQU07Z0JBU1AscUJBQXFCO3NCQURwQixNQUFNO2dCQVlHLE9BQU87c0JBRGhCLGVBQWU7dUJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhEYXRhUGFnZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGF0YS1wYWdlcic7XG5pbXBvcnQgeyBBWEh0bWxVdGlsLCBBWFVuc3Vic2NyaWJlciB9IGZyb20gJ0BhY29yZXgvY29yZS91dGlscyc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgV3JpdGFibGVTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBidWZmZXIsIGRlYm91bmNlVGltZSwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWEJhc2VEYXRhVGFibGUsIEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50LCBBWERhdGFUYWJsZVJvd0NsaWNrLCBBWERhdGFUYWJsZVJvd0RiQ2xpY2sgfSBmcm9tICcuLi9iYXNlLWRhdGEtdGFibGUuY2xhc3MnO1xuaW1wb3J0IHsgQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2RhdGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IEFYRGF0YVRhYmxlVGV4dENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvZGF0YS10ZXh0LWNvbHVtbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBhbmQgbWFuYWdpbmcgYSBkYXRhIHRhYmxlIHdpdGggYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQGNhdGVnb3J5IENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDogeyBuZ1NraXBIeWRyYXRpb246ICd0cnVlJyB9LFxuICBpbnB1dHM6IFsnZGF0YVNvdXJjZSddLFxuICBvdXRwdXRzOiBbJ3NlbGVjdGVkUm93c0NoYW5nZSddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBWEJhc2VEYXRhVGFibGUsXG4gICAgICB1c2VFeGlzdGluZzogQVhEYXRhVGFibGVDb21wb25lbnQsXG4gICAgfSxcbiAgICBBWFVuc3Vic2NyaWJlcixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQVhEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBWEJhc2VEYXRhVGFibGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF91bnN1YnNjcmliZXIgPSBpbmplY3QoQVhVbnN1YnNjcmliZXIpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKCdkYXRhUGFnZXInKSBkYXRhUGFnZXI7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcnRsITogYm9vbGVhbjtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBkaXNwbGF5ZWRSb3dzOiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHBhZ2U6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMCk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFnZVNpemU6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMCk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbCh0cnVlKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBjb2x1bW5zTGlzdDogV3JpdGFibGVTaWduYWw8YW55W10+ID0gc2lnbmFsKFtdKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBlbmRGaXhlZENvbHVtbnNMaXN0OiBTaWduYWw8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb2x1bW5zTGlzdCgpLmZpbHRlcigoYykgPT4gYy5maXhlZCA9PT0gJ2VuZCcpKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydEZpeGVkQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkID09PSAnc3RhcnQnKSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkICE9PSAnZW5kJyAmJiBjLmZpeGVkICE9PSAnc3RhcnQnKSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzaXplQ29sdW1uUHJvcCA9IHtcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRXaWR0aDogMCxcbiAgICBjb2x1bW5JbmRleDogMCxcbiAgICBuZXdDb2x1bW5XaWR0aDogMCxcbiAgICB0aEVsZW1lbnQ6IG51bGwsXG4gIH07XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFzSXRlbXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCB0b3RhbFJvd3MgPSAwO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlID0gMDtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCB0b3RhbFBhZ2VzID0gMDtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFJvd0luZGV4ID0gMDtcblxuICAvKipcbiAgICogVGVtcGxhdGUgZm9yIGN1c3RvbSByb3cgY29udGVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvd1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRlbXBsYXRlIHRvIGRpc3BsYXkgd2hlbiB0aGUgdGFibGUgaXMgZW1wdHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbi8qKlxuICogRGVmaW5lcyBpZiBhbHRlcm5hdGl2ZSByb3cgc3R5bGluZyBzaG91bGQgYmUgYXBwbGllZC5cbiAqIFxuICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAqL1xuICBASW5wdXQoKVxuICBhbHRlcm5hdGl2ZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFibGUgaGVhZGVyIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93SGVhZGVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0YWJsZSBoZWFkZXIgc2hvdWxkIGJlIGZpeGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGB0cnVlYFxuICAgKi9cbiAgQElucHV0KClcbiAgZml4ZWRIZWFkZXIgPSB0cnVlO1xuXG4gICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0YWJsZSBmb290ZXIgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd0Zvb3RlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFibGUgZm9vdGVyIHNob3VsZCBiZSBmaXhlZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBmaXhlZEZvb3RlciA9IHRydWU7XG5cbiAgICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgZWFjaCBpdGVtIGluIHRoZSB0YWJsZS5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYDQwYFxuICAgKi9cbiAgQElucHV0KClcbiAgaXRlbUhlaWdodDogbnVtYmVyIHwgJ2F1dG8nID0gNDA7XG5cbiAgIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHJvdyByZW9yZGVyaW5nLlxuICAgKiBcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoKVxuICBhbGxvd1Jlb3JkZXJpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHBhZ2luZy5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBwYWdpbmcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgZGF0YSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYCdhdXRvJ2BcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZldGNoRGF0YU1vZGU6ICdhdXRvJyB8ICdtYW51YWwnID0gJ2F1dG8nO1xuXG4gICAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIGxvYWRpbmcgc3RhdGUuXG4gICAqIFxuICAgKiBAZGVmYXVsdFZhbHVlIGB7IGVuYWJsZWQ6IHRydWUsIGFuaW1hdGlvbjogdHJ1ZSB9YFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYW5pbWF0aW9uOiBib29sZWFuO1xuICAgIGxvYWRpbmdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICB9ID0ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICB9O1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNlZFJvdzogdW5rbm93bjtcblxuICAvKipcbiAqIEdldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHJvdy5cbiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGZvY3VzZWRSb3coKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3c7XG4gIH1cblxuICAvKipcbiAqIFNldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHJvdyBhbmQgZW1pdHMgdGhlIGNoYW5nZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gdiAtIFRoZSByb3cgdG8gYmUgZm9jdXNlZC5cbiAqL1xuICBwdWJsaWMgc2V0IGZvY3VzZWRSb3codjogdW5rbm93bikge1xuICAgIHRoaXMuX2ZvY3VzZWRSb3cgPSB2O1xuICAgIHRoaXMuZm9jdXNlZFJvd0NoYW5nZS5lbWl0KHYpO1xuICB9XG5cblxuICAvKipcbiAqIEVtaXRzIHdoZW4gdGhlIGZvY3VzZWQgcm93IGNoYW5nZXMuXG4gKiBcbiAqIEBldmVudCBcbiAqL1xuICBAT3V0cHV0KClcbiAgZm9jdXNlZFJvd0NoYW5nZTogRXZlbnRFbWl0dGVyPHVua25vd24+ID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIC8qKlxuICogRW1pdHMgd2hlbiBhIHJvdyBpcyBjbGlja2VkLlxuICogXG4gKiBAZXZlbnQgb25Sb3dDbGlja1xuICovXG4gIEBPdXRwdXQoKVxuICBvblJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dDbGljaz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93Q2xpY2s+KCk7XG5cbiAgLyoqXG4gKiBFbWl0cyB3aGVuIGEgcm93IGlzIGRvdWJsZS1jbGlja2VkLlxuICogXG4gKiBAZXZlbnQgb25Sb3dEYkNsaWNrXG4gKi9cbiAgQE91dHB1dCgpXG4gIG9uUm93RGJDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93RGJDbGljaz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93RGJDbGljaz4oKTtcblxuICAvKipcbiAqIEVtaXRzIHdoZW4gdGhlIG9yZGVyIG9mIGNvbHVtbnMgY2hhbmdlcy5cbiAqIFxuICogQGV2ZW50IG9uQ29sdW1uc09yZGVyQ2hhbmdlZFxuICovXG4gIEBPdXRwdXQoKVxuICBvbkNvbHVtbnNPcmRlckNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWENvbHVtbnNPcmRlckNoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IGV2ZW50OiBNb3VzZUV2ZW50OyBpdGVtOiBhbnkgfT4oKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpXG4gIHByb3RlY3RlZCBjb2x1bW5zOiBRdWVyeUxpc3Q8QVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnJ0bCA9IEFYSHRtbFV0aWwuaXNSdGwodGhpcy5nZXRIb3N0RWxlbWVudCgpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXNlQ2FjaGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5mZXRjaERhdGFNb2RlID09ICdhdXRvJykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNldFBhZ2UoMCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheWVkUm93cy5zZXQobmV3IEFycmF5KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSkpO1xuICAgIHRoaXMudG90YWxSb3dzID0gdGhpcy5kYXRhU291cmNlLml0ZW1zLmxlbmd0aDtcbiAgICB0aGlzLmRhdGFTb3VyY2Uub25Mb2FkaW5nQ2hhbmdlZC5waXBlKHRoaXMuX3Vuc3Vic2NyaWJlci50YWtlVW50aWxEZXN0cm95KS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChkYXRhKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkNoYW5nZWQucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXllZFJvd3Muc2V0KGRhdGEuaXRlbXMpO1xuICAgICAgdGhpcy50b3RhbFJvd3MgPSBkYXRhLnRvdGFsQ291bnQ7XG4gICAgICB0aGlzLmhhc0l0ZW1zID0gZGF0YS50b3RhbENvdW50ID4gMDtcbiAgICB9KTtcblxuICAgIHRoaXMucGFnZVNpemUuc2V0KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSk7XG5cbiAgICAvL1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgYnVmZmVyKHRoaXMuY2xpY2tTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDI1MCkpKSxcbiAgICAgICAgZmlsdGVyKChjbGlja0FycmF5KSA9PiBjbGlja0FycmF5Lmxlbmd0aCA9PT0gMiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjbGlja0FycmF5KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUm93RG91YmxlQ2xpY2soY2xpY2tBcnJheVswXS5ldmVudCwgY2xpY2tBcnJheVswXS5pdGVtKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxjdWxhdGVTdGlja3lDb2x1bW5zUG9zaXRpb25zKCk7XG4gICAgdGhpcy5jb2x1bW5zTGlzdC5zZXQodGhpcy5jb2x1bW5zLnRvQXJyYXkoKSk7XG4gICAgdGhpcy5jb2x1bW5zLmNoYW5nZXMucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChjb2xzKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbnNMaXN0LnNldChjb2xzLnRvQXJyYXkoKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxhbnksIGFueSwgYW55Pikge1xuICAgIGNvbnN0IGNsb25lZENvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zTGlzdCgpXTtcbiAgICBtb3ZlSXRlbUluQXJyYXkoY2xvbmVkQ29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmNvbHVtbnNMaXN0LnNldChjbG9uZWRDb2x1bW5zKTtcblxuICAgIHRoaXMub25Db2x1bW5zT3JkZXJDaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgZGF0YTogeyBldmVudCB9LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSb3dDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuaGFuZGxlUm93U2luZ2xlQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0Lm5leHQoeyBldmVudCwgaXRlbSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVSb3dTaW5nbGVDbGljayhldmVudDogRXZlbnQsIGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvY3VzZWRSb3cgPT0gaXRlbSkge1xuICAgICAgdGhpcy5mb2N1c2VkUm93ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c2VkUm93ID0gaXRlbTtcbiAgICB9XG4gICAgLy9cbiAgICB0aGlzLm9uUm93Q2xpY2suZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBkYXRhOiBpdGVtLFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBvblBhZ2VDaGFuZ2VkKGV2ZW50OiBBWERhdGFQYWdlckNoYW5nZWRFdmVudCkge1xuICAgIGlmIChldmVudC5pc1VzZXJJbnRlcmFjdGlvbikge1xuICAgICAgY29uc3QgcGFnZUNoYW5nZWQgPSBldmVudC5wYWdlIC0gMSAhPSB0aGlzLnBhZ2UoKTtcbiAgICAgIGNvbnN0IHBhZ2VTaXplQ2hhbmdlZCA9IGV2ZW50LnRha2UgIT0gdGhpcy5wYWdlU2l6ZSgpO1xuXG4gICAgICBpZiAocGFnZUNoYW5nZWQgfHwgcGFnZVNpemVDaGFuZ2VkKSB7XG4gICAgICAgIGlmIChwYWdlQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMucGFnZS5zZXQoZXZlbnQucGFnZSAtIDEpO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5zZXRQYWdlKHRoaXMucGFnZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdlU2l6ZUNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplLnNldChldmVudC50YWtlKTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5ZWQgcm93cyBhbmQgZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRSb3dzLnNldChuZXcgQXJyYXkodGhpcy5wYWdlU2l6ZSgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlUm93RG91YmxlQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuZm9jdXNlZFJvdyA9IGl0ZW07XG4gICAgLy9cbiAgICB0aGlzLm9uUm93RGJDbGljay5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgb24gYSBjb2x1bW4gaGVhZGVyLlxuICogVG9nZ2xlcyB0aGUgc29ydGluZyBkaXJlY3Rpb24gb3IgcmVtb3ZlcyB0aGUgc29ydCBpZiBhbHJlYWR5IHNvcnRlZC5cbiAqIFxuICogQHBhcmFtIGUgLSBUaGUgbW91c2UgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSBjbGljay5cbiAqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQuXG4gKiBAaWdub3JlXG4gKi9cbiAgaGFuZGxlQ29sdW1uQ2xpY2soZTogTW91c2VFdmVudCwgY29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCkge1xuICAgIGlmIChjb2x1bW4gaW5zdGFuY2VvZiBBWERhdGFUYWJsZVRleHRDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydC5maW5kKChjKSA9PiBjLmZpZWxkID09IGNvbHVtbi5kYXRhRmllbGQpO1xuICAgICAgaWYgKCFzb3J0KSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZGF0YUZpZWxkLFxuICAgICAgICAgIGRpcjogJ2FzYycsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNvcnQuZGlyID09ICdhc2MnKSB7XG4gICAgICAgICAgc29ydC5kaXIgPSAnZGVzYyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQgPSB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydC5maWx0ZXIoKGMpID0+IGMgIT0gc29ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNvcnQoY29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIEFYRGF0YVRhYmxlVGV4dENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LmZpbmQoKGMpID0+IGMuZmllbGQgPT0gY29sdW1uLmRhdGFGaWVsZCk7XG4gICAgICByZXR1cm4gc29ydCA/IChzb3J0LmRpciA9PSAnYXNjJyA/ICdheC1pY29uLWFycm93LWxvbmctZG93bicgOiAnYXgtaWNvbi1hcnJvdy1sb25nLXVwJykgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAqIFJlZnJlc2hlcyB0aGUgZGF0YSBpbiB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlc2V0cyB0aGUgZGF0YSBwYWdlciB0byB0aGUgZmlyc3QgcGFnZS5cbiAqIEBpZ25vcmVcbiAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UucmVmcmVzaCgpO1xuICAgIGlmICh0aGlzLmRhdGFQYWdlcikge1xuICAgICAgdGhpcy5kYXRhUGFnZXIuZ29GaXJzdFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVSb3dJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSAqIHRoaXMucGFnZSgpICsgaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC5zdGFydFggPSBldmVudC5wYWdlWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCA9IHBhcnNlSW50KHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc3R5bGUud2lkdGgpO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4O1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZUNvbHVtbk1vdmUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVDb2x1bW5FbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIG9uUmVzaXplQ29sdW1uTW92ZSA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRYO1xuICAgIGNvbnN0IG5ld1dpZHRoID0gdGhpcy5ydGwgPyB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCAtIGRpZmZYIDogdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnN0YXJ0V2lkdGggKyBkaWZmWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7TWF0aC5tYXgoMTAwLCBuZXdXaWR0aCl9cHhgO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc2V0QXR0cmlidXRlKCduZXctd2lkdGgnLCBgJHtuZXdXaWR0aH1gKTtcbiAgfTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgb25SZXNpemVDb2x1bW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZUNvbHVtbk1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplQ29sdW1uRW5kKTtcblxuICAgIGNvbnN0IG5ld1dpZHRoID0gcGFyc2VJbnQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmV3LXdpZHRoJykudmFsdWUpO1xuICAgIHRoaXMuY29sdW1ucy5nZXQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLmNvbHVtbkluZGV4KS53aWR0aCA9IGAke01hdGgubWF4KDEwMCwgbmV3V2lkdGgpfXB4YDtcbiAgICB0aGlzLnJlc2V0UmVzaXppbmdQcm9jZXNzKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHJlc2V0UmVzaXppbmdQcm9jZXNzKCkge1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduZXctd2lkdGgnKTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AgPSB7XG4gICAgICBzdGFydFg6IDAsXG4gICAgICBzdGFydFdpZHRoOiAwLFxuICAgICAgY29sdW1uSW5kZXg6IDAsXG4gICAgICBuZXdDb2x1bW5XaWR0aDogMCxcbiAgICAgIHRoRWxlbWVudDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVN0aWNreUNvbHVtbnNQb3NpdGlvbnMoKSB7XG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgIGxldCBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ID0gMDtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuICAgICAgaWYgKCFpc05hTih3aWR0aCkpIHtcbiAgICAgICAgdG90YWxXaWR0aCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgbGFzdFN0YXJ0Q29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcblxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoY29sdW1uLndpZHRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGlmIChjb2x1bW4uZml4ZWQgPT09ICdzdGFydCcgJiYgIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBjb2x1bW5bJ3N0aWNreVN0YXJ0J10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICsgJ3B4JztcbiAgICAgICAgbGFzdFN0YXJ0Q29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsYXN0U3RhcnRDb2x1bW4pIGxhc3RTdGFydENvbHVtblsnaXNMYXN0Rml4ZWRDb2x1bW4nXSA9IHRydWU7XG5cbiAgICBsZXQgYWNjdW11bGF0ZWRXaWR0aEZyb21FbmQgPSAwO1xuICAgIGxldCBmaXJzdEVuZENvbHVtbjogQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZ2V0KGkpO1xuXG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBpZiAoY29sdW1uLmZpeGVkID09PSAnZW5kJyAmJiAhaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGNvbHVtblsnc3RpY2t5RW5kJ10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArICdweCc7XG4gICAgICAgIGZpcnN0RW5kQ29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0RW5kQ29sdW1uKSBmaXJzdEVuZENvbHVtblsnaXNGaXJzdEZpeGVkQ29sdW1uJ10gPSB0cnVlO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJheC1oZWFkZXJcIj4gPC9uZy1jb250ZW50PlxuQGlmICghZGlzcGxheWVkUm93cygpLmxlbmd0aCkge1xuICA8ZGl2IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1lbXB0eS1kYXRhXCI+XG4gICAgQGlmIChlbXB0eVRlbXBsYXRlKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4+Tm8gUmVjb3JkIEZvdW5kITwvc3Bhbj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPGRpdiBjbGFzcz1cImF4LWRhdGEtdGFibGUtd3JhcHBlclwiPlxuICA8dGFibGU+XG4gICAgQGlmIChzaG93SGVhZGVyKSB7XG4gICAgICA8dGhlYWQgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyJzogZml4ZWRIZWFkZXIgfVwiPlxuICAgICAgICA8dHJcbiAgICAgICAgICBbY2RrRHJvcExpc3REaXNhYmxlZF09XCIhYWxsb3dSZW9yZGVyaW5nXCJcbiAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgIGNka1Njcm9sbGFibGVcbiAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAoYyBvZiBzdGFydEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktc3RhcnRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1pbnRlcmFjdGl2ZV09XCJjLmFsbG93U29ydGluZ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjLmFsbG93U29ydGluZyA/IGhhbmRsZUNvbHVtbkNsaWNrKCRldmVudCwgYykgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWhlYWRlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChjLmFsbG93UmVzaXppbmcgJiYgIWMuZml4ZWQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtcmVzaXplLWhhbmRsZVwiIChtb3VzZWRvd24pPVwib25SZXNpemVDb2x1bW5TdGFydCgkZXZlbnQsIHRoaXMuc3RhcnRGaXhlZENvbHVtbnNMaXN0KCkubGVuZ3RoICsgJGluZGV4KVwiPjwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktZW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXNGaXJzdF09XCJjWydpc0ZpcnN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgIH1cbiAgICA8dGJvZHkgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1yb3ctYWx0ZXJuYXRpdmUnOiBhbHRlcm5hdGl2ZSB9XCI+XG4gICAgICBAZm9yIChyb3cgb2YgZGlzcGxheWVkUm93cygpOyBsZXQgcm93SW5kZXggPSAkaW5kZXg7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgIEBpZiAocm93VGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4IH0gfVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBbY2xhc3MuYXgtc3RhdGUtZm9jdXNlZF09XCJmb2N1c2VkUm93ICYmIHJvdyA9PT0gZm9jdXNlZFJvd1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJzZWxlY3RlZFJvd3MuaW5jbHVkZXMocm93KVwiXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQ9XCJ7eyBpdGVtSGVpZ2h0IH19cHhcIlxuICAgICAgICAgICAgc3R5bGUubWF4LWhlaWdodD1cInt7IGl0ZW1IZWlnaHQgfX1weFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1ib2R5LWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5LXN0YXJ0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LXN0YXJ0XT1cImNbJ3N0aWNreVN0YXJ0J11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJjLmNhcHRpb25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImMuY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChyb3cgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IGNhbGN1bGF0ZVJvd0luZGV4KHJvd0luZGV4KSB9IH1cIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmIChjLmxvYWRpbmdFbmFibGVkICYmIGxvYWRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvYWRpbmcubG9hZGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmcubG9hZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxheC1za2VsZXRvbiBbYW5pbWF0ZWRdPVwibG9hZGluZy5hbmltYXRpb25cIj48L2F4LXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnN0aWNreS1lbmRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzRmlyc3RdPVwiY1snaXNGaXJzdEZpeGVkQ29sdW1uJ11cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIDx0ciBjbGFzcz1cImVtcHR5LXJvd1wiPjwvdHI+XG4gICAgPC90Ym9keT5cbiAgICBAaWYgKHNob3dGb290ZXIpIHtcbiAgICAgIDx0Zm9vdCBbbmdDbGFzc109XCJ7ICdheC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXInOiBmaXhlZEZvb3RlciB9XCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1zdGFydFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyRm9vdGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJGb290ZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGMuYWxsb3dSZXNpemluZyAmJiAhYy5maXhlZCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1yZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblJlc2l6ZUNvbHVtblN0YXJ0KCRldmVudCwgdGhpcy5zdGFydEZpeGVkQ29sdW1uc0xpc3QoKS5sZW5ndGggKyAkaW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIEBmb3IgKGMgb2YgZW5kRml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1lbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0ZpcnN0XT1cImNbJ2lzRmlyc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LWVuZF09XCJjWydzdGlja3lFbmQnXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckZvb3RlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiBjLCByb3dzOiBkaXNwbGF5ZWRSb3dzKCksIHJvd0luZGV4OiAkaW5kZXggfSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgQGlmIChnZXRTb3J0KGMpKSB7XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiB7eyBnZXRTb3J0KGMpIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGZvb3Q+XG4gICAgfVxuICA8L3RhYmxlPlxuPC9kaXY+XG5cbkBpZiAocGFnaW5nKSB7XG4gIDxkaXYgY2xhc3M9XCJheC10YWJsZS1mb290ZXJcIiAjZm9vdGVyQ29udGFpbmVyPlxuICAgIDxheC1kYXRhLXBhZ2VyXG4gICAgICAjZGF0YVBhZ2VyXG4gICAgICBbZGlzcGxheU1vZGVdPVwiJ2N1c3RvbSdcIlxuICAgICAgKG9uQ2hhbmdlZCk9XCJvblBhZ2VDaGFuZ2VkKCRldmVudClcIlxuICAgICAgW3RvdGFsXT1cImRhdGFTb3VyY2UudG90YWxDb3VudFwiXG4gICAgICBbc2l6ZV09XCJkYXRhU291cmNlLnBhZ2VTaXplXCJcbiAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nKClcIlxuICAgID5cbiAgICAgIDxheC1wcmVmaXggY2xhc3M9XCJheC1kYXRhLXRhYmxlLW51bWVyaWMtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLW51bWVyaWMtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1udW1lcmljLXNlbGVjdG9yPlxuICAgICAgICA8YXgtZGF0YS1wYWdlci1wYWdlLXNpemVzPiA8L2F4LWRhdGEtcGFnZXItcGFnZS1zaXplcz5cbiAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgPGF4LXByZWZpeCBjbGFzcz1cImF4LWRhdGEtdGFibGUtaW5wdXQtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz4gPC9heC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItaW5wdXQtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1pbnB1dC1zZWxlY3Rvcj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPiA8L2F4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPlxuICAgICAgPC9heC1wcmVmaXg+XG4gICAgICA8YXgtc3VmZml4IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1pbmZvXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLWluZm8+IDwvYXgtZGF0YS1wYWdlci1pbmZvPlxuICAgICAgICA8YXgtYnV0dG9uIGxvb2s9XCJibGFua1wiIGNsYXNzPVwiYXgtc21cIiAob25DbGljayk9XCJyZWZyZXNoKClcIj5cbiAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiBheC1pY29uLXJlZnJlc2hcIj48L2F4LWljb24+XG4gICAgICAgIDwvYXgtYnV0dG9uPlxuICAgICAgPC9heC1zdWZmaXg+XG4gICAgPC9heC1kYXRhLXBhZ2VyPlxuICA8L2Rpdj5cbn1cbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LWZvb3RlclwiPiA8L25nLWNvbnRlbnQ+XG4iXX0=