slick-components 4.4.13 → 4.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/css/slick-components.css +598 -365
  2. package/css/slick-components.min.css +1 -1
  3. package/esm2020/public-api.mjs +43 -0
  4. package/esm2020/slick-accordion/slick-accordion-item-header.component.mjs +14 -0
  5. package/esm2020/slick-accordion/slick-accordion-item.component.mjs +86 -0
  6. package/esm2020/slick-accordion/slick-accordion.component.mjs +75 -0
  7. package/esm2020/slick-accordion/slick-accordion.module.mjs +23 -0
  8. package/esm2020/slick-auto-complete/slick-auto-complete-list-item-template.directive.mjs +22 -0
  9. package/esm2020/slick-auto-complete/slick-auto-complete.component.mjs +375 -0
  10. package/esm2020/slick-auto-complete/slick-auto-complete.module.mjs +24 -0
  11. package/esm2020/slick-button-spinner/slick-button-spinner.component.mjs +175 -0
  12. package/esm2020/slick-button-spinner/slick-button-spinner.module.mjs +19 -0
  13. package/esm2020/slick-calendar/slick-calendar.component.mjs +246 -0
  14. package/esm2020/slick-calendar/slick-calendar.module.mjs +19 -0
  15. package/esm2020/slick-card/slick-card-header.component.mjs +14 -0
  16. package/esm2020/slick-card/slick-card.component.mjs +42 -0
  17. package/esm2020/slick-card/slick-card.module.mjs +20 -0
  18. package/esm2020/slick-components.mjs +5 -0
  19. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.component.mjs +65 -0
  20. package/esm2020/slick-confirm-dialog/slick-confirm-dialog.module.mjs +20 -0
  21. package/esm2020/slick-container/slick-container-body.component.mjs +24 -0
  22. package/esm2020/slick-container/slick-container-footer.component.mjs +20 -0
  23. package/esm2020/slick-container/slick-container-header.component.mjs +20 -0
  24. package/esm2020/slick-container/slick-container.component.mjs +21 -0
  25. package/esm2020/slick-container/slick-container.module.mjs +25 -0
  26. package/esm2020/slick-context-menu/slick-context-menu-item.component.mjs +14 -0
  27. package/esm2020/slick-context-menu/slick-context-menu.component.mjs +48 -0
  28. package/esm2020/slick-context-menu/slick-context-menu.module.mjs +20 -0
  29. package/{esm2015/slick-currency-mask/slick-currency-mask-options.model.js → esm2020/slick-currency-mask/slick-currency-mask-options.model.mjs} +0 -0
  30. package/esm2020/slick-currency-mask/slick-currency-mask.directive.mjs +233 -0
  31. package/esm2020/slick-currency-mask/slick-currency-mask.module.mjs +19 -0
  32. package/esm2020/slick-date-picker/slick-date-picker.component.mjs +278 -0
  33. package/esm2020/slick-date-picker/slick-date-picker.module.mjs +21 -0
  34. package/esm2020/slick-dialog/slick-dialog-footer.component.mjs +24 -0
  35. package/esm2020/slick-dialog/slick-dialog.component.mjs +294 -0
  36. package/esm2020/slick-dialog/slick-dialog.module.mjs +23 -0
  37. package/esm2020/slick-dialog/slick-dialog.service.mjs +68 -0
  38. package/esm2020/slick-drag-drop/slick-drag-drop.directive.mjs +13 -0
  39. package/esm2020/slick-drag-drop/slick-drag-drop.module.mjs +21 -0
  40. package/esm2020/slick-drag-drop/slick-draggable.directive.mjs +13 -0
  41. package/{esm2015/slick-drop-down/slick-drop-down-button.model.js → esm2020/slick-drop-down/slick-drop-down-button.model.mjs} +0 -0
  42. package/esm2020/slick-drop-down/slick-drop-down.component.mjs +479 -0
  43. package/esm2020/slick-drop-down/slick-drop-down.module.mjs +24 -0
  44. package/esm2020/slick-drop-down/slick-drop-down.service.mjs +55 -0
  45. package/esm2020/slick-drop-list/slick-drop-list-grab.directive.mjs +18 -0
  46. package/esm2020/slick-drop-list/slick-drop-list-item.directive.mjs +18 -0
  47. package/esm2020/slick-drop-list/slick-drop-list.directive.mjs +215 -0
  48. package/esm2020/slick-drop-list/slick-drop-list.module.mjs +23 -0
  49. package/esm2020/slick-email-viewer/slick-email-viewer-dialog.component.mjs +81 -0
  50. package/esm2020/slick-email-viewer/slick-email-viewer.component.mjs +42 -0
  51. package/esm2020/slick-email-viewer/slick-email-viewer.module.mjs +26 -0
  52. package/{esm2015/slick-emailer/slick-emailer-address.model.js → esm2020/slick-emailer/slick-emailer-address.model.mjs} +0 -0
  53. package/esm2020/slick-emailer/slick-emailer-dialog.component.mjs +153 -0
  54. package/esm2020/slick-emailer/slick-emailer.component.mjs +235 -0
  55. package/{esm2015/slick-emailer/slick-emailer.model.js → esm2020/slick-emailer/slick-emailer.model.mjs} +0 -0
  56. package/esm2020/slick-emailer/slick-emailer.module.mjs +29 -0
  57. package/esm2020/slick-file-drop/slick-file-drop.component.mjs +156 -0
  58. package/esm2020/slick-file-drop/slick-file-drop.module.mjs +20 -0
  59. package/esm2020/slick-file-list/slick-file-list-item.component.mjs +173 -0
  60. package/esm2020/slick-file-list/slick-file-list.component.mjs +130 -0
  61. package/esm2020/slick-file-list/slick-file-list.module.mjs +23 -0
  62. package/{esm2015/slick-file-model/slick-file.model.js → esm2020/slick-file-model/slick-file.model.mjs} +0 -0
  63. package/esm2020/slick-google-address-search/slick-google-address-search.directive.mjs +75 -0
  64. package/esm2020/slick-google-address-search/slick-google-address-search.module.mjs +19 -0
  65. package/esm2020/slick-google-map/slick-google-map-dialog.component.mjs +50 -0
  66. package/esm2020/slick-google-map/slick-google-map.component.mjs +48 -0
  67. package/esm2020/slick-google-map/slick-google-map.module.mjs +22 -0
  68. package/esm2020/slick-grid/slick-grid-column-template.directive.mjs +19 -0
  69. package/{esm2015/slick-grid/slick-grid-column.model.js → esm2020/slick-grid/slick-grid-column.model.mjs} +0 -0
  70. package/{esm2015/slick-grid/slick-grid-favorite.model.js → esm2020/slick-grid/slick-grid-favorite.model.mjs} +0 -0
  71. package/{esm2015/slick-grid/slick-grid-request.model.js → esm2020/slick-grid/slick-grid-request.model.mjs} +0 -0
  72. package/{esm2015/slick-grid/slick-grid-response.model.js → esm2020/slick-grid/slick-grid-response.model.mjs} +0 -0
  73. package/esm2020/slick-grid/slick-grid-sanitize.pipe.mjs +20 -0
  74. package/esm2020/slick-grid/slick-grid.component.mjs +793 -0
  75. package/esm2020/slick-grid/slick-grid.module.mjs +43 -0
  76. package/{esm2015/slick-grid/slick-grid.options.js → esm2020/slick-grid/slick-grid.options.mjs} +0 -0
  77. package/esm2020/slick-grid/slick-grid.service.mjs +66 -0
  78. package/esm2020/slick-multi-select/slick-multi-select.component.mjs +362 -0
  79. package/esm2020/slick-multi-select/slick-multi-select.module.mjs +20 -0
  80. package/esm2020/slick-multi-select/slick-multi-select.service.mjs +77 -0
  81. package/esm2020/slick-ordered-list/slick-ordered-list.component.mjs +200 -0
  82. package/esm2020/slick-ordered-list/slick-ordered-list.module.mjs +20 -0
  83. package/esm2020/slick-paging/slick-paging.component.mjs +185 -0
  84. package/esm2020/slick-paging/slick-paging.module.mjs +19 -0
  85. package/esm2020/slick-photo-gallery/slick-photo-gallery.component.mjs +98 -0
  86. package/{esm2015/slick-photo-gallery/slick-photo-gallery.model.js → esm2020/slick-photo-gallery/slick-photo-gallery.model.mjs} +0 -0
  87. package/esm2020/slick-photo-gallery/slick-photo-gallery.module.mjs +21 -0
  88. package/esm2020/slick-pick-list/slick-pick-list.component.mjs +84 -0
  89. package/esm2020/slick-pick-list/slick-pick-list.module.mjs +20 -0
  90. package/esm2020/slick-popover/slick-popover.component.mjs +204 -0
  91. package/esm2020/slick-popover/slick-popover.module.mjs +19 -0
  92. package/esm2020/slick-profile-picture/slick-profile-picture.component.mjs +267 -0
  93. package/esm2020/slick-profile-picture/slick-profile-picture.module.mjs +20 -0
  94. package/esm2020/slick-progress-bar/slick-progress-bar.module.mjs +18 -0
  95. package/esm2020/slick-progress-bar/slick-progress-bar.service.mjs +53 -0
  96. package/esm2020/slick-screen-blocker/slick-screen-blocker.module.mjs +18 -0
  97. package/esm2020/slick-screen-blocker/slick-screen-blocker.service.mjs +83 -0
  98. package/{esm2015/slick-slider/slick-slider-tick.model.js → esm2020/slick-slider/slick-slider-tick.model.mjs} +0 -0
  99. package/esm2020/slick-slider/slick-slider.component.mjs +90 -0
  100. package/esm2020/slick-slider/slick-slider.module.mjs +20 -0
  101. package/esm2020/slick-split-screen/slick-screen-split-left-content.component.mjs +15 -0
  102. package/esm2020/slick-split-screen/slick-screen-split-right-content.component.mjs +15 -0
  103. package/esm2020/slick-split-screen/slick-split-screen.component.mjs +159 -0
  104. package/esm2020/slick-split-screen/slick-split-screen.module.mjs +21 -0
  105. package/esm2020/slick-tabs/slick-tab-header.component.mjs +28 -0
  106. package/esm2020/slick-tabs/slick-tab.component.mjs +63 -0
  107. package/{esm2015/slick-tabs/slick-tab.model.js → esm2020/slick-tabs/slick-tab.model.mjs} +0 -0
  108. package/esm2020/slick-tabs/slick-tabs.component.mjs +107 -0
  109. package/esm2020/slick-tabs/slick-tabs.module.mjs +23 -0
  110. package/esm2020/slick-toast/slick-toast.module.mjs +18 -0
  111. package/esm2020/slick-toast/slick-toast.service.mjs +88 -0
  112. package/{esm2015/slick-tree-view/slick-tree-node.model.js → esm2020/slick-tree-view/slick-tree-node.model.mjs} +0 -0
  113. package/esm2020/slick-tree-view/slick-tree-view.component.mjs +293 -0
  114. package/esm2020/slick-tree-view/slick-tree-view.module.mjs +22 -0
  115. package/esm2020/slick-type-ahead/slick-type-ahead.directive.mjs +164 -0
  116. package/esm2020/slick-type-ahead/slick-type-ahead.module.mjs +18 -0
  117. package/esm2020/slick-validation-indicator/slick-validation-indicator.directive.mjs +63 -0
  118. package/esm2020/slick-validation-indicator/slick-validation-indicator.module.mjs +19 -0
  119. package/esm2020/utils/slick-function-lock.service.mjs +55 -0
  120. package/esm2020/utils/slick-init.service.mjs +49 -0
  121. package/esm2020/utils/slick-log.service.mjs +23 -0
  122. package/esm2020/utils/slick-sleep.service.mjs +14 -0
  123. package/esm2020/utils/slick-utils.service.mjs +247 -0
  124. package/fesm2015/{slick-components.js → slick-components.mjs} +2779 -2070
  125. package/fesm2015/slick-components.mjs.map +1 -0
  126. package/fesm2020/slick-components.mjs +8467 -0
  127. package/fesm2020/slick-components.mjs.map +1 -0
  128. package/package.json +20 -8
  129. package/public-api.d.ts +8 -8
  130. package/slick-accordion/slick-accordion-item-header.component.d.ts +3 -0
  131. package/slick-accordion/slick-accordion-item.component.d.ts +3 -0
  132. package/slick-accordion/slick-accordion.component.d.ts +3 -0
  133. package/slick-accordion/slick-accordion.module.d.ts +8 -0
  134. package/slick-auto-complete/slick-auto-complete-list-item-template.directive.d.ts +3 -0
  135. package/slick-auto-complete/slick-auto-complete.component.d.ts +3 -0
  136. package/slick-auto-complete/slick-auto-complete.module.d.ts +8 -0
  137. package/slick-button-spinner/slick-button-spinner.component.d.ts +3 -0
  138. package/slick-button-spinner/slick-button-spinner.module.d.ts +6 -0
  139. package/slick-calendar/slick-calendar.component.d.ts +3 -0
  140. package/slick-calendar/slick-calendar.module.d.ts +6 -0
  141. package/slick-card/slick-card-header.component.d.ts +3 -0
  142. package/slick-card/slick-card.component.d.ts +3 -0
  143. package/slick-card/slick-card.module.d.ts +10 -0
  144. package/slick-components.d.ts +1 -22
  145. package/slick-confirm-dialog/slick-confirm-dialog.component.d.ts +3 -0
  146. package/slick-confirm-dialog/slick-confirm-dialog.module.d.ts +7 -0
  147. package/slick-container/slick-container-body.component.d.ts +3 -0
  148. package/slick-container/slick-container-footer.component.d.ts +3 -0
  149. package/slick-container/slick-container-header.component.d.ts +3 -0
  150. package/slick-container/slick-container.component.d.ts +3 -0
  151. package/slick-container/slick-container.module.d.ts +9 -0
  152. package/slick-context-menu/slick-context-menu-item.component.d.ts +3 -0
  153. package/slick-context-menu/slick-context-menu.component.d.ts +3 -0
  154. package/slick-context-menu/slick-context-menu.module.d.ts +7 -0
  155. package/slick-currency-mask/slick-currency-mask.directive.d.ts +3 -0
  156. package/slick-currency-mask/slick-currency-mask.module.d.ts +5 -0
  157. package/slick-date-picker/slick-date-picker.component.d.ts +3 -0
  158. package/slick-date-picker/slick-date-picker.module.d.ts +8 -0
  159. package/slick-dialog/slick-dialog-footer.component.d.ts +3 -0
  160. package/slick-dialog/slick-dialog.component.d.ts +3 -0
  161. package/slick-dialog/slick-dialog.module.d.ts +10 -1
  162. package/slick-dialog/slick-dialog.service.d.ts +3 -0
  163. package/slick-drag-drop/slick-drag-drop.directive.d.ts +3 -0
  164. package/slick-drag-drop/slick-drag-drop.module.d.ts +11 -0
  165. package/slick-drag-drop/slick-draggable.directive.d.ts +3 -0
  166. package/slick-drop-down/slick-drop-down.component.d.ts +3 -0
  167. package/slick-drop-down/slick-drop-down.module.d.ts +9 -0
  168. package/slick-drop-down/slick-drop-down.service.d.ts +3 -0
  169. package/slick-drop-list/slick-drop-list-grab.directive.d.ts +3 -0
  170. package/slick-drop-list/slick-drop-list-item.directive.d.ts +3 -0
  171. package/slick-drop-list/slick-drop-list.directive.d.ts +13 -7
  172. package/slick-drop-list/slick-drop-list.module.d.ts +14 -0
  173. package/slick-email-viewer/slick-email-viewer-dialog.component.d.ts +3 -0
  174. package/slick-email-viewer/slick-email-viewer.component.d.ts +3 -0
  175. package/slick-email-viewer/slick-email-viewer.module.d.ts +10 -0
  176. package/slick-emailer/slick-emailer-dialog.component.d.ts +3 -0
  177. package/slick-emailer/slick-emailer.component.d.ts +3 -0
  178. package/slick-emailer/slick-emailer.module.d.ts +13 -0
  179. package/slick-file-drop/slick-file-drop.component.d.ts +3 -0
  180. package/slick-file-drop/slick-file-drop.module.d.ts +7 -0
  181. package/slick-file-list/slick-file-list-item.component.d.ts +3 -0
  182. package/slick-file-list/slick-file-list.component.d.ts +3 -0
  183. package/slick-file-list/slick-file-list.module.d.ts +10 -0
  184. package/slick-google-address-search/slick-google-address-search.directive.d.ts +3 -0
  185. package/slick-google-address-search/slick-google-address-search.module.d.ts +6 -0
  186. package/slick-google-map/slick-google-map-dialog.component.d.ts +3 -0
  187. package/slick-google-map/slick-google-map.component.d.ts +3 -0
  188. package/slick-google-map/slick-google-map.module.d.ts +8 -0
  189. package/slick-grid/slick-grid-column-template.directive.d.ts +3 -0
  190. package/slick-grid/slick-grid-sanitize.pipe.d.ts +3 -0
  191. package/slick-grid/slick-grid.component.d.ts +3 -0
  192. package/slick-grid/slick-grid.module.d.ts +16 -0
  193. package/slick-grid/slick-grid.service.d.ts +3 -0
  194. package/slick-multi-select/slick-multi-select.component.d.ts +3 -0
  195. package/slick-multi-select/slick-multi-select.module.d.ts +7 -0
  196. package/slick-multi-select/slick-multi-select.service.d.ts +3 -0
  197. package/slick-ordered-list/slick-ordered-list.component.d.ts +3 -0
  198. package/slick-ordered-list/slick-ordered-list.module.d.ts +7 -0
  199. package/slick-paging/slick-paging.component.d.ts +3 -0
  200. package/slick-paging/slick-paging.module.d.ts +6 -0
  201. package/slick-photo-gallery/slick-photo-gallery.component.d.ts +3 -0
  202. package/slick-photo-gallery/slick-photo-gallery.module.d.ts +6 -0
  203. package/slick-pick-list/slick-pick-list.component.d.ts +3 -0
  204. package/slick-pick-list/slick-pick-list.module.d.ts +7 -0
  205. package/slick-popover/slick-popover.component.d.ts +3 -0
  206. package/slick-popover/slick-popover.module.d.ts +6 -0
  207. package/slick-profile-picture/slick-profile-picture.component.d.ts +3 -0
  208. package/slick-profile-picture/slick-profile-picture.module.d.ts +7 -0
  209. package/slick-progress-bar/slick-progress-bar.module.d.ts +5 -0
  210. package/slick-progress-bar/slick-progress-bar.service.d.ts +3 -0
  211. package/slick-screen-blocker/slick-screen-blocker.module.d.ts +5 -0
  212. package/slick-screen-blocker/slick-screen-blocker.service.d.ts +3 -0
  213. package/slick-slider/slick-slider.component.d.ts +3 -0
  214. package/slick-slider/slick-slider.module.d.ts +6 -0
  215. package/slick-split-screen/slick-screen-split-left-content.component.d.ts +3 -0
  216. package/slick-split-screen/slick-screen-split-right-content.component.d.ts +3 -0
  217. package/slick-split-screen/slick-split-screen.component.d.ts +3 -0
  218. package/slick-split-screen/slick-split-screen.module.d.ts +8 -0
  219. package/slick-tabs/slick-tab-header.component.d.ts +3 -0
  220. package/slick-tabs/slick-tab.component.d.ts +3 -0
  221. package/slick-tabs/slick-tabs.component.d.ts +3 -0
  222. package/slick-tabs/slick-tabs.module.d.ts +10 -0
  223. package/slick-toast/slick-toast.module.d.ts +5 -0
  224. package/slick-toast/slick-toast.service.d.ts +3 -0
  225. package/slick-tree-view/slick-tree-view.component.d.ts +3 -0
  226. package/slick-tree-view/slick-tree-view.module.d.ts +8 -0
  227. package/slick-type-ahead/slick-type-ahead.directive.d.ts +3 -0
  228. package/slick-type-ahead/slick-type-ahead.module.d.ts +5 -0
  229. package/slick-validation-indicator/slick-validation-indicator.directive.d.ts +3 -0
  230. package/slick-validation-indicator/slick-validation-indicator.module.d.ts +6 -0
  231. package/utils/slick-function-lock.service.d.ts +3 -0
  232. package/utils/slick-init.service.d.ts +3 -0
  233. package/utils/slick-log.service.d.ts +3 -0
  234. package/utils/slick-sleep.service.d.ts +3 -0
  235. package/utils/slick-utils.service.d.ts +5 -0
  236. package/bundles/slick-components.umd.js +0 -9777
  237. package/bundles/slick-components.umd.js.map +0 -1
  238. package/esm2015/public-api.js +0 -43
  239. package/esm2015/slick-accordion/slick-accordion-item-header.component.js +0 -10
  240. package/esm2015/slick-accordion/slick-accordion-item.component.js +0 -80
  241. package/esm2015/slick-accordion/slick-accordion.component.js +0 -77
  242. package/esm2015/slick-accordion/slick-accordion.module.js +0 -18
  243. package/esm2015/slick-auto-complete/slick-auto-complete-list-item-template.directive.js +0 -21
  244. package/esm2015/slick-auto-complete/slick-auto-complete.component.js +0 -352
  245. package/esm2015/slick-auto-complete/slick-auto-complete.module.js +0 -19
  246. package/esm2015/slick-button-spinner/slick-button-spinner.component.js +0 -186
  247. package/esm2015/slick-button-spinner/slick-button-spinner.module.js +0 -14
  248. package/esm2015/slick-calendar/slick-calendar.component.js +0 -233
  249. package/esm2015/slick-calendar/slick-calendar.module.js +0 -14
  250. package/esm2015/slick-card/slick-card-header.component.js +0 -10
  251. package/esm2015/slick-card/slick-card.component.js +0 -37
  252. package/esm2015/slick-card/slick-card.module.js +0 -14
  253. package/esm2015/slick-components.js +0 -27
  254. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.component.js +0 -62
  255. package/esm2015/slick-confirm-dialog/slick-confirm-dialog.module.js +0 -15
  256. package/esm2015/slick-container/slick-container-body.component.js +0 -18
  257. package/esm2015/slick-container/slick-container-footer.component.js +0 -16
  258. package/esm2015/slick-container/slick-container-header.component.js +0 -16
  259. package/esm2015/slick-container/slick-container.component.js +0 -19
  260. package/esm2015/slick-container/slick-container.module.js +0 -20
  261. package/esm2015/slick-context-menu/slick-context-menu-item.component.js +0 -10
  262. package/esm2015/slick-context-menu/slick-context-menu.component.js +0 -43
  263. package/esm2015/slick-context-menu/slick-context-menu.module.js +0 -15
  264. package/esm2015/slick-currency-mask/slick-currency-mask.directive.js +0 -234
  265. package/esm2015/slick-currency-mask/slick-currency-mask.module.js +0 -14
  266. package/esm2015/slick-date-picker/slick-date-picker.component.js +0 -267
  267. package/esm2015/slick-date-picker/slick-date-picker.module.js +0 -16
  268. package/esm2015/slick-dialog/slick-dialog-footer.component.js +0 -18
  269. package/esm2015/slick-dialog/slick-dialog.component.js +0 -282
  270. package/esm2015/slick-dialog/slick-dialog.module.js +0 -18
  271. package/esm2015/slick-dialog/slick-dialog.service.js +0 -67
  272. package/esm2015/slick-drag-drop/slick-drag-drop.directive.js +0 -9
  273. package/esm2015/slick-drag-drop/slick-drag-drop.module.js +0 -14
  274. package/esm2015/slick-drag-drop/slick-draggable.directive.js +0 -9
  275. package/esm2015/slick-drop-down/slick-drop-down.component.js +0 -465
  276. package/esm2015/slick-drop-down/slick-drop-down.module.js +0 -19
  277. package/esm2015/slick-drop-down/slick-drop-down.service.js +0 -59
  278. package/esm2015/slick-drop-list/slick-drop-list-grab.directive.js +0 -18
  279. package/esm2015/slick-drop-list/slick-drop-list-item.directive.js +0 -18
  280. package/esm2015/slick-drop-list/slick-drop-list.directive.js +0 -162
  281. package/esm2015/slick-drop-list/slick-drop-list.module.js +0 -15
  282. package/esm2015/slick-email-viewer/slick-email-viewer-dialog.component.js +0 -61
  283. package/esm2015/slick-email-viewer/slick-email-viewer.component.js +0 -39
  284. package/esm2015/slick-email-viewer/slick-email-viewer.module.js +0 -21
  285. package/esm2015/slick-emailer/slick-emailer-dialog.component.js +0 -122
  286. package/esm2015/slick-emailer/slick-emailer.component.js +0 -226
  287. package/esm2015/slick-emailer/slick-emailer.module.js +0 -24
  288. package/esm2015/slick-file-drop/slick-file-drop.component.js +0 -144
  289. package/esm2015/slick-file-drop/slick-file-drop.module.js +0 -15
  290. package/esm2015/slick-file-list/slick-file-list-item.component.js +0 -156
  291. package/esm2015/slick-file-list/slick-file-list.component.js +0 -114
  292. package/esm2015/slick-file-list/slick-file-list.module.js +0 -18
  293. package/esm2015/slick-google-address-search/slick-google-address-search.directive.js +0 -75
  294. package/esm2015/slick-google-address-search/slick-google-address-search.module.js +0 -14
  295. package/esm2015/slick-google-map/slick-google-map-dialog.component.js +0 -45
  296. package/esm2015/slick-google-map/slick-google-map.component.js +0 -45
  297. package/esm2015/slick-google-map/slick-google-map.module.js +0 -17
  298. package/esm2015/slick-grid/slick-grid-column-template.directive.js +0 -19
  299. package/esm2015/slick-grid/slick-grid-sanitize.pipe.js +0 -20
  300. package/esm2015/slick-grid/slick-grid.component.js +0 -792
  301. package/esm2015/slick-grid/slick-grid.module.js +0 -38
  302. package/esm2015/slick-grid/slick-grid.service.js +0 -72
  303. package/esm2015/slick-multi-select/slick-multi-select.component.js +0 -356
  304. package/esm2015/slick-multi-select/slick-multi-select.module.js +0 -15
  305. package/esm2015/slick-multi-select/slick-multi-select.service.js +0 -74
  306. package/esm2015/slick-ordered-list/slick-ordered-list.component.js +0 -198
  307. package/esm2015/slick-ordered-list/slick-ordered-list.module.js +0 -15
  308. package/esm2015/slick-paging/slick-paging.component.js +0 -180
  309. package/esm2015/slick-paging/slick-paging.module.js +0 -14
  310. package/esm2015/slick-photo-gallery/slick-photo-gallery.component.js +0 -101
  311. package/esm2015/slick-photo-gallery/slick-photo-gallery.module.js +0 -16
  312. package/esm2015/slick-pick-list/slick-pick-list.component.js +0 -78
  313. package/esm2015/slick-pick-list/slick-pick-list.module.js +0 -15
  314. package/esm2015/slick-popover/slick-popover.component.js +0 -199
  315. package/esm2015/slick-popover/slick-popover.module.js +0 -14
  316. package/esm2015/slick-profile-picture/slick-profile-picture.component.js +0 -242
  317. package/esm2015/slick-profile-picture/slick-profile-picture.module.js +0 -15
  318. package/esm2015/slick-progress-bar/slick-progress-bar.module.js +0 -13
  319. package/esm2015/slick-progress-bar/slick-progress-bar.service.js +0 -50
  320. package/esm2015/slick-screen-blocker/slick-screen-blocker.module.js +0 -13
  321. package/esm2015/slick-screen-blocker/slick-screen-blocker.service.js +0 -80
  322. package/esm2015/slick-slider/slick-slider.component.js +0 -88
  323. package/esm2015/slick-slider/slick-slider.module.js +0 -15
  324. package/esm2015/slick-split-screen/slick-screen-split-left-content.component.js +0 -13
  325. package/esm2015/slick-split-screen/slick-screen-split-right-content.component.js +0 -13
  326. package/esm2015/slick-split-screen/slick-split-screen.component.js +0 -148
  327. package/esm2015/slick-split-screen/slick-split-screen.module.js +0 -16
  328. package/esm2015/slick-tabs/slick-tab-header.component.js +0 -25
  329. package/esm2015/slick-tabs/slick-tab.component.js +0 -67
  330. package/esm2015/slick-tabs/slick-tabs.component.js +0 -104
  331. package/esm2015/slick-tabs/slick-tabs.module.js +0 -17
  332. package/esm2015/slick-toast/slick-toast.module.js +0 -13
  333. package/esm2015/slick-toast/slick-toast.service.js +0 -91
  334. package/esm2015/slick-tree-view/slick-tree-view.component.js +0 -287
  335. package/esm2015/slick-tree-view/slick-tree-view.module.js +0 -17
  336. package/esm2015/slick-type-ahead/slick-type-ahead.directive.js +0 -155
  337. package/esm2015/slick-type-ahead/slick-type-ahead.module.js +0 -13
  338. package/esm2015/slick-validation-indicator/slick-validation-indicator.directive.js +0 -61
  339. package/esm2015/slick-validation-indicator/slick-validation-indicator.module.js +0 -14
  340. package/esm2015/utils/slick-function-lock.service.js +0 -54
  341. package/esm2015/utils/slick-init.service.js +0 -48
  342. package/esm2015/utils/slick-log.service.js +0 -27
  343. package/esm2015/utils/slick-sleep.service.js +0 -14
  344. package/esm2015/utils/slick-utils.service.js +0 -229
  345. package/fesm2015/slick-components.js.map +0 -1
  346. package/slick-components.metadata.json +0 -1
@@ -0,0 +1,793 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ContentChildren, HostBinding } from "@angular/core";
2
+ import { SlickGridService } from "./slick-grid.service";
3
+ import { SlickGridColumnFilterTypes, SlickGridColumnSortDirection } from "./slick-grid-column.model";
4
+ import { SlickGridRequestModel } from "./slick-grid-request.model";
5
+ import { SlickSleepService } from "../utils/slick-sleep.service";
6
+ import { SlickUtilsService } from "../utils/slick-utils.service";
7
+ import { SlickGridColumnTemplateDirective } from "./slick-grid-column-template.directive";
8
+ import { SlickConfirmDialogResults } from '../slick-confirm-dialog/slick-confirm-dialog.module';
9
+ import { SlickGridFavoriteModel } from './slick-grid-favorite.model';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./slick-grid.service";
12
+ import * as i2 from "../utils/slick-function-lock.service";
13
+ import * as i3 from "../slick-drop-down/slick-drop-down.component";
14
+ import * as i4 from "../slick-popover/slick-popover.component";
15
+ import * as i5 from "../slick-paging/slick-paging.component";
16
+ import * as i6 from "../slick-dialog/slick-dialog.component";
17
+ import * as i7 from "../slick-dialog/slick-dialog-footer.component";
18
+ import * as i8 from "../slick-confirm-dialog/slick-confirm-dialog.component";
19
+ import * as i9 from "@angular/common";
20
+ import * as i10 from "@angular/forms";
21
+ import * as i11 from "../slick-drop-list/slick-drop-list.directive";
22
+ import * as i12 from "../slick-drop-list/slick-drop-list-item.directive";
23
+ import * as i13 from "../slick-drop-list/slick-drop-list-grab.directive";
24
+ import * as i14 from "./slick-grid-sanitize.pipe";
25
+ class DropDownModel {
26
+ constructor(text) {
27
+ this.id = text;
28
+ this.text = text;
29
+ }
30
+ }
31
+ export class SlickGridComponent {
32
+ constructor(gridService, functionLockService, changeDetector) {
33
+ this.gridService = gridService;
34
+ this.functionLockService = functionLockService;
35
+ this.changeDetector = changeDetector;
36
+ this.flexColumn = 'slick-flex-column';
37
+ this.bordered = true;
38
+ this.striped = true;
39
+ this.hover = true;
40
+ this.showingAllRecords = false;
41
+ this.onRowSelected = new EventEmitter();
42
+ this.onRowDoubleClick = new EventEmitter();
43
+ this.onRowContextMenu = new EventEmitter();
44
+ this.onFavoritesModified = new EventEmitter();
45
+ this.fnOnMouseUp = (e) => this.onMouseUp(e);
46
+ this.selectedIndex = null;
47
+ this.gridOpacity = 0;
48
+ this.loaded = false;
49
+ this.isDoubleClick = false;
50
+ this.currentPage = 1;
51
+ this.showTestRow = false;
52
+ this.showSearchRow = false;
53
+ this.isResizing = false;
54
+ this.visibleData = [];
55
+ this.recordsPerPageValue = "Auto";
56
+ this.resizeTimeout = null;
57
+ this.uuid = SlickUtilsService.newGuid();
58
+ this.requestModel = new SlickGridRequestModel();
59
+ }
60
+ async onResize(event, targetElement) {
61
+ // This is here because firefox shows/hides the menu if you press alt. Don't redraw the grid if we're
62
+ // just showing the menu
63
+ if (Math.abs(this.slickGridHeight - this.slickGridRef.nativeElement.offsetHeight) < 50)
64
+ return;
65
+ if (this.slickGridHeight !== this.slickGridRef.nativeElement.offsetHeight) {
66
+ clearTimeout(this.resizeTimeout);
67
+ this.resizeTimeout = setTimeout(async () => {
68
+ this.currentPage = 1;
69
+ this.requestModel.page = 1;
70
+ await this.resizeGrid();
71
+ this.requestModel.recordsPerPage = this.recordsPerPage;
72
+ this.reload(this.requestModel);
73
+ }, 500);
74
+ }
75
+ }
76
+ async ngOnInit() {
77
+ this.setGridOptions(this.gridOptions);
78
+ }
79
+ async ngAfterViewInit() {
80
+ // Copy the templates to a variable that the html can access. It can't access a QueryList
81
+ this.templateRefs = {};
82
+ this.slickGridColumnTemplates.forEach(t => {
83
+ this.templateRefs[t.columnKey] = t.template;
84
+ });
85
+ if (this.tableRef)
86
+ this.tableRef.nativeElement.focus();
87
+ }
88
+ async tableKeydown(e) {
89
+ // Key up
90
+ if (e.which === 38 && !(this.selectedIndex === 0 && this.currentPage === 1)) {
91
+ clearTimeout(this.keypressTimeout);
92
+ this.selectedIndex--;
93
+ if (this.selectedIndex < 0) {
94
+ if (this.currentPage > 1) {
95
+ this.currentPage--;
96
+ this.selectedIndex = 0;
97
+ await this.onPageChange(this.currentPage, false);
98
+ this.selectedIndex = this.recordsPerPage - 1;
99
+ }
100
+ }
101
+ this.keypressTimeout = setTimeout(() => {
102
+ const rowData = this.visibleData[this.selectedIndex];
103
+ this.onRowClicked(rowData, this.selectedIndex);
104
+ }, 500);
105
+ }
106
+ // Key down
107
+ if (e.which === 40) {
108
+ if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex >= this.totalRecords)
109
+ return;
110
+ clearTimeout(this.keypressTimeout);
111
+ this.selectedIndex++;
112
+ if (this.selectedIndex >= this.recordsPerPage) {
113
+ if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex < this.totalRecords) {
114
+ this.currentPage++;
115
+ this.selectedIndex = 0;
116
+ await this.onPageChange(this.currentPage, false);
117
+ }
118
+ }
119
+ this.keypressTimeout = setTimeout(() => {
120
+ const rowData = this.visibleData[this.selectedIndex];
121
+ this.onRowClicked(rowData, this.selectedIndex);
122
+ }, 500);
123
+ }
124
+ }
125
+ async ngOnChanges(changes) {
126
+ if (changes.bordered) {
127
+ if (this.gridOptions.bordered === null)
128
+ this.bordered = (this.bordered.toString().toLowerCase() !== 'false') ? true : false;
129
+ }
130
+ if (changes.striped) {
131
+ // The grid options override the tag options
132
+ if (this.gridOptions.striped === null)
133
+ this.striped = (this.striped.toString().toLowerCase() !== 'false') ? true : false;
134
+ }
135
+ if (changes.hover) {
136
+ // The grid options override the tag options
137
+ if (this.gridOptions.hover === null)
138
+ this.hover = (this.hover.toString().toLowerCase() !== 'false') ? true : false;
139
+ }
140
+ if (changes.gridOptions) {
141
+ if (this.gridOptions.bordered !== null)
142
+ this.bordered = this.gridOptions.bordered;
143
+ if (this.gridOptions.striped !== null)
144
+ this.striped = this.gridOptions.striped;
145
+ if (this.gridOptions.hover !== null)
146
+ this.hover = this.gridOptions.hover;
147
+ this.setGridOptions(this.gridOptions);
148
+ }
149
+ if (changes.data) {
150
+ // If we don't do this lock, the first change will have null data and crash. The second request will have the actual data
151
+ await this.functionLockService.lock("GRID_" + this.uuid + "_DATA_CHANGES");
152
+ // Only resize the grid on the first change, otherwise we get a flicker
153
+ if (changes.data.firstChange === true)
154
+ await this.resizeGrid();
155
+ // We need to wait for the resize in the OnInit to finish before we continue
156
+ this.loaded = true;
157
+ this.currentPage = 1;
158
+ this.requestModel.page = 1;
159
+ this.requestModel.recordsPerPage = this.recordsPerPage;
160
+ await this.reload(this.requestModel);
161
+ if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
162
+ this.selectRow(0);
163
+ this.functionLockService.release("GRID_" + this.uuid + "_DATA_CHANGES");
164
+ }
165
+ }
166
+ ngOnDestroy() {
167
+ document.removeEventListener('mouseup', this.fnOnMouseUp);
168
+ }
169
+ async onRecordsPerPageSelected(recordsPerPage) {
170
+ if (!recordsPerPage)
171
+ return;
172
+ this.recordsPerPageValue = recordsPerPage;
173
+ localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE", recordsPerPage);
174
+ this.visibleData = [];
175
+ this.gridOpacity = 0;
176
+ await SlickSleepService.sleep();
177
+ await this.resizeGrid(true);
178
+ this.requestModel.recordsPerPage = this.recordsPerPage;
179
+ this.currentPage = 1;
180
+ await this.onPageChange(this.currentPage, true);
181
+ }
182
+ onColResizeMousedown(e, columnIdx) {
183
+ this.isResizing = true;
184
+ this.resizeInitialPos = e.pageX;
185
+ this.resizeColIdx = columnIdx;
186
+ let col = this.tableHeaderRowRef.nativeElement.querySelectorAll("td").item(columnIdx);
187
+ this.resizeInitialWidth = col.offsetWidth - 9;
188
+ this.visibleColumns[columnIdx].flexible = false;
189
+ document.addEventListener('mouseup', this.fnOnMouseUp);
190
+ }
191
+ onColResizeDoubleclick(e, columnIdx) {
192
+ this.visibleColumns[columnIdx].flexible = true;
193
+ this.visibleColumns[columnIdx].width = null;
194
+ this.saveColumnsToLocalStorage();
195
+ }
196
+ onColResizeMousemove(e) {
197
+ if (!this.isResizing)
198
+ return;
199
+ let newCursorPos = e.pageX;
200
+ let diff = newCursorPos - this.resizeInitialPos;
201
+ this.visibleColumns[this.resizeColIdx].width = (this.resizeInitialWidth + diff) + "px";
202
+ if ((this.resizeInitialWidth + diff) < 10)
203
+ this.visibleColumns[this.resizeColIdx].width = "10px";
204
+ this.visibleColumns[this.resizeColIdx].flexible = false;
205
+ }
206
+ onMouseUp(e) {
207
+ this.isResizing = false;
208
+ document.removeEventListener('mouseup', this.fnOnMouseUp);
209
+ this.saveColumnsToLocalStorage();
210
+ }
211
+ getVisibleRecords() {
212
+ return this.visibleData;
213
+ }
214
+ addNewRecord(newRecord, selectNewRecord = false) {
215
+ this.visibleData.unshift(newRecord);
216
+ if (selectNewRecord === true) {
217
+ this.selectedIndex = 0;
218
+ this.selectRow(0);
219
+ }
220
+ else {
221
+ if (this.selectedIndex)
222
+ this.selectedIndex++;
223
+ }
224
+ }
225
+ updateRecord(rowNum, record) {
226
+ this.visibleData[rowNum] = record;
227
+ }
228
+ onRowClicked(rowData, idx) {
229
+ this.selectedIndex = idx;
230
+ clearTimeout(this.doubleClickWaitTimeout);
231
+ this.doubleClickWaitTimeout = setTimeout(() => {
232
+ this.onRowSelected.emit(rowData);
233
+ }, 250);
234
+ }
235
+ onRowDoubleClicked(rowData, idx) {
236
+ this.selectedIndex = idx;
237
+ clearTimeout(this.doubleClickWaitTimeout);
238
+ this.onRowDoubleClick.emit(rowData);
239
+ }
240
+ onRowContextMenuClicked(e, rowData, idx) {
241
+ if (this.onRowContextMenu) {
242
+ let rowContextMenuModel = {
243
+ mouseEvent: e,
244
+ data: rowData,
245
+ rowIdx: idx
246
+ };
247
+ this.onRowContextMenu.emit(rowContextMenuModel);
248
+ }
249
+ }
250
+ async onPageChange(pageNumber, selectRow = true) {
251
+ this.currentPage = pageNumber;
252
+ this.requestModel.page = pageNumber;
253
+ await this.reload(this.requestModel);
254
+ this.selectedIndex = (this.gridOptions.autoSelectFirstRow === true) ? 0 : null;
255
+ if (selectRow === true && this.gridOptions.autoSelectFirstRow === true) {
256
+ const rowData = this.visibleData[this.selectedIndex];
257
+ this.onRowClicked(rowData, this.selectedIndex);
258
+ }
259
+ this.tableRef.nativeElement.focus();
260
+ }
261
+ async reloadGrid(additionalParams) {
262
+ try {
263
+ await this.resizeGrid();
264
+ await this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRID");
265
+ this.requestModel.url = this.gridOptions.getUrl;
266
+ this.requestModel.httpHeaders = this.gridOptions.httpHeaders;
267
+ this.requestModel.additionalParams = additionalParams;
268
+ this.requestModel.page = this.currentPage;
269
+ this.requestModel.recordsPerPage = this.recordsPerPage;
270
+ let responseModel = await this.reload(this.requestModel);
271
+ this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRID");
272
+ return Promise.resolve(responseModel);
273
+ }
274
+ catch (error) {
275
+ console.error(error);
276
+ return Promise.reject(error);
277
+ }
278
+ }
279
+ async reloadGridWithRequestModel(requestModel) {
280
+ try {
281
+ await this.resizeGrid();
282
+ await this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
283
+ this.requestModel = requestModel;
284
+ this.currentPage = 1;
285
+ this.requestModel.page = 1;
286
+ let responseModel = await this.reload(this.requestModel);
287
+ this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
288
+ return Promise.resolve(responseModel);
289
+ }
290
+ catch (error) {
291
+ console.error(error);
292
+ return Promise.reject(error);
293
+ }
294
+ }
295
+ async reload(requestModel) {
296
+ try {
297
+ await this.functionLockService.lock("GRID_" + this.uuid + "_RELOAD");
298
+ requestModel = this.getRequestModel(this.requestModel);
299
+ let responseModel = null;
300
+ if (requestModel.url)
301
+ responseModel = await this.gridService.getDataFromServer(requestModel);
302
+ else
303
+ responseModel = await this.gridService.getDataFromDataObj(requestModel, this.data);
304
+ this.loaded = true;
305
+ this.totalRecords = responseModel.totalRecords;
306
+ this.visibleData = responseModel.data;
307
+ this.functionLockService.release("GRID_" + this.uuid + "_RELOAD");
308
+ Promise.resolve(responseModel);
309
+ }
310
+ catch (error) {
311
+ console.error(error);
312
+ return Promise.reject(error);
313
+ }
314
+ }
315
+ unselectRow() {
316
+ this.selectedIndex = null;
317
+ }
318
+ selectRow(rowNumber) {
319
+ let rowData = this.visibleData[rowNumber];
320
+ this.onRowClicked(rowData, rowNumber);
321
+ }
322
+ getColumnHTML(rowData, dataFieldName) {
323
+ const columnHTML = SlickUtilsService.getDeepObject(rowData, dataFieldName);
324
+ if (columnHTML === null || columnHTML === undefined)
325
+ return '';
326
+ return columnHTML.toString();
327
+ }
328
+ async sortBy(sortColumn) {
329
+ this.gridOptions.columns.forEach(c => {
330
+ if (sortColumn && c.columnKey !== sortColumn.columnKey) {
331
+ c.sortDirection = SlickGridColumnSortDirection.none;
332
+ }
333
+ });
334
+ if (sortColumn) {
335
+ if (sortColumn.sortDirection === SlickGridColumnSortDirection.none) {
336
+ this.visibleColumns.forEach(c => c.sortDirection = SlickGridColumnSortDirection.none);
337
+ sortColumn.sortDirection = SlickGridColumnSortDirection.asc;
338
+ }
339
+ else if (sortColumn.sortDirection === SlickGridColumnSortDirection.asc)
340
+ sortColumn.sortDirection = SlickGridColumnSortDirection.desc;
341
+ else {
342
+ sortColumn.sortDirection = SlickGridColumnSortDirection.none;
343
+ }
344
+ }
345
+ this.saveColumnsToLocalStorage();
346
+ this.currentPage = 1;
347
+ this.requestModel.page = 1;
348
+ await this.reload(this.requestModel);
349
+ if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
350
+ this.selectRow(0);
351
+ }
352
+ async onSearchSelect(ddValue, column) {
353
+ if (!this.requestModel.columnSearchValues)
354
+ this.requestModel.columnSearchValues = [];
355
+ let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
356
+ if (columnSearchValueIdx >= 0)
357
+ this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
358
+ column.isFiltering = false;
359
+ if (ddValue) {
360
+ this.requestModel.columnSearchValues.push({
361
+ columnName: column.dataFieldName,
362
+ searchValueId: ddValue.id,
363
+ searchValueText: ddValue.text
364
+ });
365
+ column.isFiltering = true;
366
+ }
367
+ else {
368
+ column.isLocked = false;
369
+ }
370
+ this.currentPage = 1;
371
+ this.requestModel.page = 1;
372
+ await this.reload(this.requestModel);
373
+ if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
374
+ this.selectRow(0);
375
+ }
376
+ async onSearch(column) {
377
+ await SlickSleepService.sleep();
378
+ if (!this.requestModel.columnSearchValues)
379
+ this.requestModel.columnSearchValues = [];
380
+ if (column.filterText === column.lastSearchText)
381
+ return;
382
+ column.lastSearchText = column.filterText;
383
+ column.isFiltering = !!column.filterText;
384
+ if (!column.isFiltering)
385
+ column.isLocked = false;
386
+ clearTimeout(this.searchTimeout);
387
+ this.searchTimeout = setTimeout(async () => {
388
+ this.saveColumnsToLocalStorage();
389
+ let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
390
+ if (columnSearchValueIdx >= 0)
391
+ this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
392
+ if (column.filterText) {
393
+ this.requestModel.columnSearchValues.push({
394
+ columnName: column.dataFieldName,
395
+ searchValueText: column.filterText
396
+ });
397
+ }
398
+ this.currentPage = 1;
399
+ this.requestModel.page = 1;
400
+ await this.reload(this.requestModel);
401
+ if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
402
+ this.selectRow(0);
403
+ }, 250);
404
+ }
405
+ toggleLock(column) {
406
+ column.isLocked = !column.isLocked;
407
+ this.saveColumnsToLocalStorage();
408
+ }
409
+ async resetFilter(column) {
410
+ column.isFiltering = false;
411
+ column.isLocked = false;
412
+ column.filterText = null;
413
+ column.lastSearchText = null;
414
+ column.filterDropdownValue = null;
415
+ this.requestModel.columnSearchValues = this.requestModel.columnSearchValues.filter(x => x.columnName !== column.dataFieldName);
416
+ this.saveColumnsToLocalStorage();
417
+ this.currentPage = 1;
418
+ this.requestModel.page = 1;
419
+ await this.reload(this.requestModel);
420
+ if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
421
+ this.selectRow(0);
422
+ }
423
+ openColumnSelectDialog() {
424
+ this.columnSelectDialogColumns = [...this.gridOptions.columns];
425
+ this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
426
+ this.columnSelectDialogRef.showDialog();
427
+ }
428
+ onColumnDrop(e) {
429
+ console.log(e);
430
+ }
431
+ async onColumnReorder(e) {
432
+ const oldOrder = e[0];
433
+ const newOrder = e[1];
434
+ if (oldOrder === newOrder)
435
+ return;
436
+ const selectedCol = this.columnSelectDialogColumns.splice(oldOrder, 1)[0];
437
+ selectedCol.displayOrder = newOrder;
438
+ let currentOrder = 0;
439
+ // Everything up to the new order reordered from 0
440
+ for (let i = 0; i < this.columnSelectDialogColumns.length; i++) {
441
+ // If we're at newOrder, leave a spot
442
+ if (i === newOrder)
443
+ currentOrder++;
444
+ this.columnSelectDialogColumns[i].displayOrder = currentOrder++;
445
+ }
446
+ this.columnSelectDialogColumns = [...this.columnSelectDialogColumns, selectedCol];
447
+ this.columnSelectDialogColumns = this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
448
+ }
449
+ async addNewFavorite() {
450
+ this.newFavoriteText = '';
451
+ const confirmResult = await this.addNewFavoriteDialogRef.confirm();
452
+ if (confirmResult === SlickConfirmDialogResults.Ok && this.newFavoriteText) {
453
+ // Save the previous selection to localstorage
454
+ this.saveDialogColumnsToLocalStorage();
455
+ this.favorites.push(new DropDownModel(this.newFavoriteText));
456
+ this.selectedFavorite = this.newFavoriteText;
457
+ localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
458
+ const favoritesJson = JSON.stringify(this.favorites.map(x => x.text));
459
+ localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES", favoritesJson);
460
+ // Save the new one to localstorage
461
+ this.saveDialogColumnsToLocalStorage();
462
+ }
463
+ }
464
+ loadFavorite(favorite) {
465
+ this.saveDialogColumnsToLocalStorage();
466
+ this.selectedFavorite = favorite.text;
467
+ let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
468
+ if (gridColumnsJson) {
469
+ this.columnSelectDialogColumns = JSON.parse(gridColumnsJson);
470
+ this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
471
+ }
472
+ }
473
+ async setFavorite(favorite) {
474
+ this.selectedFavorite = favorite;
475
+ localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
476
+ let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
477
+ this.gridOptions.columns = JSON.parse(gridColumnsJson);
478
+ this.gridOptions.columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
479
+ this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
480
+ this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
481
+ this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
482
+ this.currentPage = 1;
483
+ this.requestModel.page = 1;
484
+ this.requestModel.recordsPerPage = this.recordsPerPage;
485
+ await this.reload(this.requestModel);
486
+ }
487
+ onSaveColumns() {
488
+ this.saveDialogColumnsToLocalStorage();
489
+ this.gridOptions.columns = [...this.columnSelectDialogColumns];
490
+ // Make sure if they've hidden a column that we aren't trying to sort or filter by this column
491
+ this.gridOptions.columns.forEach(x => {
492
+ if (x.visible === false) {
493
+ x.filterDropdownValue = null;
494
+ x.filterText = null;
495
+ x.isFiltering = false;
496
+ x.isLocked = false;
497
+ x.lastSearchText = null;
498
+ x.sortDirection = null;
499
+ }
500
+ });
501
+ this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
502
+ this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
503
+ this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
504
+ this.columnSelectDialogRef.hideDialog();
505
+ this.resizeGrid();
506
+ if (this.onFavoritesModified) {
507
+ const gridFavorites = this.favorites.map(favorite => {
508
+ const gridFavorite = new SlickGridFavoriteModel();
509
+ gridFavorite.favoriteName = favorite.text;
510
+ const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
511
+ const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
512
+ gridFavorite.columns = JSON.parse(dialogColumnsJSON);
513
+ return gridFavorite;
514
+ });
515
+ this.onFavoritesModified.emit(gridFavorites);
516
+ }
517
+ }
518
+ onCancelColumns() {
519
+ this.columnSelectDialogRef.hideDialog();
520
+ }
521
+ saveDialogColumnsToLocalStorage() {
522
+ let dialogColumnsJSON = JSON.stringify(this.columnSelectDialogColumns);
523
+ if (this.gridOptions.gridKey) {
524
+ const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
525
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, dialogColumnsJSON);
526
+ }
527
+ }
528
+ saveColumnsToLocalStorage() {
529
+ let gridColumnsJSON = JSON.stringify(this.gridOptions.columns);
530
+ if (this.gridOptions.gridKey) {
531
+ const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
532
+ let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
533
+ if (gridColumnsJson) {
534
+ let columns = JSON.parse(gridColumnsJson);
535
+ let displayOrder = 0;
536
+ columns.forEach(c => {
537
+ let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
538
+ if (column) {
539
+ c.displayOrder = displayOrder;
540
+ c.titleOrientation = column.titleOrientation;
541
+ c.titleHeight = column.titleHeight;
542
+ c.width = column.width;
543
+ c.filterDropdownValue = column.filterDropdownValue;
544
+ c.filterText = column.filterText;
545
+ c.isLocked = column.isLocked;
546
+ c.isFiltering = column.isFiltering;
547
+ c.sortDirection = column.sortDirection;
548
+ }
549
+ displayOrder++;
550
+ });
551
+ columns = columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
552
+ gridColumnsJSON = JSON.stringify(columns);
553
+ }
554
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
555
+ }
556
+ if (this.onFavoritesModified) {
557
+ const gridFavorites = this.favorites.map(favorite => {
558
+ const gridFavorite = new SlickGridFavoriteModel();
559
+ gridFavorite.favoriteName = favorite.text;
560
+ const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
561
+ const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
562
+ gridFavorite.columns = JSON.parse(dialogColumnsJSON);
563
+ return gridFavorite;
564
+ });
565
+ this.onFavoritesModified.emit(gridFavorites);
566
+ }
567
+ }
568
+ async resizeGrid(forceRefresh = false) {
569
+ return new Promise(async (resolve) => {
570
+ if (!forceRefresh && this.slickGridRef.nativeElement.offsetHeight === this.slickGridHeight) {
571
+ resolve();
572
+ return;
573
+ }
574
+ if (this.recordsPerPageValue === 'Auto') {
575
+ await this.functionLockService.lock("GRID_" + this.uuid + "_RESIZEGRID");
576
+ this.slickGridHeight = this.tableContainerRef.nativeElement.offsetHeight;
577
+ const testRow = this.tableRef.nativeElement.insertRow(0);
578
+ const testCell = testRow.insertCell(0);
579
+ testCell.style.visibility = "hidden";
580
+ testCell.innerHTML = "&NBSP";
581
+ const rowHeight = testCell.offsetHeight;
582
+ this.tableRef.nativeElement.deleteRow(0);
583
+ let headerHeight = this.tableHeaderRowRef.nativeElement.offsetHeight + 2;
584
+ if (this.tableHeaderSearchRowRef)
585
+ headerHeight += this.tableHeaderSearchRowRef.nativeElement.offsetHeight + 2;
586
+ const clientHeight = this.tableContainerRef.nativeElement.offsetHeight - headerHeight;
587
+ this.recordsPerPage = parseInt(((clientHeight / rowHeight) - 1).toFixed(0));
588
+ let actualRowHeight = parseInt((clientHeight / this.recordsPerPage).toFixed(0)) - 1;
589
+ if (actualRowHeight < rowHeight)
590
+ actualRowHeight = rowHeight;
591
+ const allRows = this.slickGridRef.nativeElement.querySelectorAll(".table tbody tr");
592
+ allRows.forEach(row => {
593
+ row.style.height = (actualRowHeight) + "px";
594
+ });
595
+ this.functionLockService.release("GRID_" + this.uuid + "_RESIZEGRID");
596
+ this.gridOpacity = 1;
597
+ this.showTestRow = false;
598
+ resolve();
599
+ }
600
+ else {
601
+ await SlickSleepService.sleep();
602
+ this.recordsPerPage = parseInt(this.recordsPerPageValue);
603
+ this.gridOpacity = 1;
604
+ resolve();
605
+ }
606
+ });
607
+ }
608
+ addColumn(column, idx = null) {
609
+ if (idx === null)
610
+ this.gridOptions.columns.push(column);
611
+ else
612
+ this.gridOptions.columns.splice(idx, 0, column);
613
+ this.setGridOptions(this.gridOptions);
614
+ }
615
+ getRequestModel(requestModel = null) {
616
+ if (!requestModel)
617
+ requestModel = this.requestModel;
618
+ requestModel.columnSearchValues = [];
619
+ this.gridOptions.columns.forEach(c => {
620
+ if (c.visible) {
621
+ if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
622
+ c.filterText = c.filterText;
623
+ requestModel.columnSearchValues.push({
624
+ columnName: c.dataFieldName,
625
+ searchValueId: null,
626
+ searchValueText: c.filterText
627
+ });
628
+ }
629
+ else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
630
+ c.filterDropdownValue = c.filterDropdownValue;
631
+ requestModel.columnSearchValues.push({
632
+ columnName: c.dataFieldName,
633
+ searchValueId: c.filterDropdownValue,
634
+ searchValueText: null
635
+ });
636
+ }
637
+ }
638
+ });
639
+ requestModel.sortColumn = null;
640
+ const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
641
+ if (sortColumn) {
642
+ requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
643
+ requestModel.sortDirection = sortColumn.sortDirection;
644
+ }
645
+ if (requestModel.recordsPerPage <= 0)
646
+ requestModel.recordsPerPage = 20;
647
+ return this.requestModel;
648
+ }
649
+ setGridOptions(gridOptions) {
650
+ this.gridOptions = gridOptions;
651
+ if (this.gridOptions.gridKey) {
652
+ if (this.gridOptions.favorites) {
653
+ const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
654
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
655
+ this.gridOptions.favorites.forEach(favorite => {
656
+ // Make sure we haven't added a new column that needs to be saved
657
+ this.gridOptions.columns.forEach(c => {
658
+ const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
659
+ if (columnExists < 0)
660
+ favorite.columns.push(c);
661
+ });
662
+ let gridColumnsJSON = JSON.stringify(favorite.columns);
663
+ if (this.gridOptions.gridKey) {
664
+ const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
665
+ localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
666
+ }
667
+ });
668
+ if (favoriteNames.indexOf(this.selectedFavorite) < 0)
669
+ this.selectedFavorite = "Default";
670
+ }
671
+ this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
672
+ // Check to make sure we don't have any duplicate column names
673
+ this.gridOptions.columns.forEach(c1 => {
674
+ const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
675
+ if (dataFieldCount > 1)
676
+ console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
677
+ });
678
+ const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
679
+ let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
680
+ if (gridColumnsJson) {
681
+ let columns = JSON.parse(gridColumnsJson);
682
+ let displayOrder = 0;
683
+ columns.forEach(c => {
684
+ let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
685
+ if (column) {
686
+ column.visible = c.visible;
687
+ column.displayOrder = displayOrder;
688
+ column.titleOrientation = c.titleOrientation;
689
+ column.titleHeight = c.titleHeight;
690
+ column.width = c.width;
691
+ column.flexible = c.flexible;
692
+ column.sortDirection = c.sortDirection;
693
+ column.isLocked = c.isLocked;
694
+ //column.filterType = c.filterType;
695
+ if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
696
+ column.isFiltering = true;
697
+ if (column.filterType === SlickGridColumnFilterTypes.text)
698
+ column.filterText = c.filterText;
699
+ else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
700
+ column.filterDropdownValue = c.filterDropdownValue;
701
+ if (!column.filterText && !column.filterDropdownValue) {
702
+ column.isFiltering = false;
703
+ column.isLocked = false;
704
+ column.filterText = null;
705
+ column.filterDropdownValue = null;
706
+ }
707
+ }
708
+ }
709
+ displayOrder++;
710
+ });
711
+ }
712
+ if (this.gridOptions.defaultRecordsPerPage && !localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE"))
713
+ this.recordsPerPageValue = this.gridOptions.defaultRecordsPerPage.toString();
714
+ else
715
+ this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
716
+ const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
717
+ this.favorites = JSON.parse(favoritesJson).map(favorite => {
718
+ return new DropDownModel(favorite);
719
+ });
720
+ }
721
+ this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
722
+ this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
723
+ this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
724
+ let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
725
+ if (this.visibleColumns.length > 0 && sortColumn) {
726
+ this.requestModel.sortColumn = sortColumn.dataFieldName;
727
+ this.requestModel.sortDirection = sortColumn.sortDirection;
728
+ }
729
+ }
730
+ }
731
+ /** @nocollapse */ SlickGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickGridComponent, deps: [{ token: i1.SlickGridService }, { token: i2.SlickFunctionLockService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
732
+ /** @nocollapse */ SlickGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: SlickGridComponent, selector: "slick-grid", inputs: { gridOptions: "gridOptions", bordered: "bordered", striped: "striped", hover: "hover", showingAllRecords: "showingAllRecords", data: "data" }, outputs: { onRowSelected: "onRowSelected", onRowDoubleClick: "onRowDoubleClick", onRowContextMenu: "onRowContextMenu", onFavoritesModified: "onFavoritesModified" }, host: { listeners: { "window:resize": "onResize($event,$event.target)" }, properties: { "class": "this.flexColumn" } }, providers: [SlickGridService], queries: [{ propertyName: "slickGridColumnTemplates", predicate: SlickGridColumnTemplateDirective }], viewQueries: [{ propertyName: "slickGridRef", first: true, predicate: ["slickGrid"], descendants: true, static: true }, { propertyName: "tableContainerRef", first: true, predicate: ["tableContainer"], descendants: true }, { propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true }, { propertyName: "tableHeaderRowRef", first: true, predicate: ["tableHeaderRow"], descendants: true }, { propertyName: "tableHeaderSearchRowRef", first: true, predicate: ["tableHeaderSearchRow"], descendants: true }, { propertyName: "testRowRef", first: true, predicate: ["testRow"], descendants: true }, { propertyName: "tableBodyRowsRef", first: true, predicate: ["tableBodyRows"], descendants: true }, { propertyName: "columnSelectDialogRef", first: true, predicate: ["columnSelectDialogRef"], descendants: true }, { propertyName: "addNewFavoriteDialogRef", first: true, predicate: ["addNewFavoriteDialogRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [style.height]=\"column.titleHeight\">\r\n\t\t\t\t\t\t\t<div [ngClass]=\"{ 'slick-grid_title-vertical' : column.titleOrientation === 1 }\">\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i>&nbsp;</span>\r\n\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\" title=\"{{column.title}}\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\" title=\"{{column.title}}\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\">\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\" class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}}&nbsp;&nbsp;<i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i>&nbsp;Save</button>&nbsp;\r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>", components: [{ type: i3.SlickDropDownComponent, selector: "slick-drop-down", inputs: ["placeholder", "items", "idFieldName", "textFieldName", "compact", "disabled", "allowEmpty", "getUrl", "width", "listWidth", "height", "showLoadingMessage", "showDebug", "tabindex", "validationIndicator", "validationIndicatorType", "attachTo", "searchType", "appendButtons", "prependButtons", "isMobile", "cssClass"], outputs: ["onExpand", "onSelect", "onChange"] }, { type: i4.SlickPopoverComponent, selector: "slick-popover", inputs: ["element", "position", "hoverDelay", "outDelay", "alignment", "topOffsetPx", "leftOffsetPx", "whiteBackground", "showByClick", "showArrow"] }, { type: i5.SlickPagingComponent, selector: "slick-paging", inputs: ["pageNumber", "totalRecords", "recordsPerPage"], outputs: ["pageNumberChange", "onPageChange"] }, { type: i6.SlickDialogComponent, selector: "slick-dialog", inputs: ["draggable", "resizable", "minimizable", "header", "showHeader", "noPadding", "top", "width", "height", "maxHeight", "cssClass", "key", "showOverlay", "disableScrollbar"], outputs: ["onClose"] }, { type: i7.SlickDialogFooterComponent, selector: "slick-dialog-footer" }, { type: i8.SlickConfirmDialogComponent, selector: "slick-confirm-dialog", inputs: ["width", "okButtonText", "cancelButtonText", "showOkButton", "showCancelButton"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i11.SlickDropListDirective, selector: "[slick-drop-list]", outputs: ["onSlickDropListReorder", "onSlickDropListEnter", "onSlickDropListLeave"] }, { type: i12.SlickDropListItemDirective, selector: "[slick-drop-list-item]" }, { type: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i13.SlickDropListGrabDirective, selector: "[slick-drop-list-grab]" }], pipes: { "slickGridSanitizeHtml": i14.SlickGridSanitizeHtmlPipe } });
733
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickGridComponent, decorators: [{
734
+ type: Component,
735
+ args: [{ selector: 'slick-grid', providers: [SlickGridService], template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [style.height]=\"column.titleHeight\">\r\n\t\t\t\t\t\t\t<div [ngClass]=\"{ 'slick-grid_title-vertical' : column.titleOrientation === 1 }\">\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i>&nbsp;</span>\r\n\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\" title=\"{{column.title}}\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\" title=\"{{column.title}}\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\">\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\" class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}}&nbsp;&nbsp;<i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i>&nbsp;Save</button>&nbsp;\r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>" }]
736
+ }], ctorParameters: function () { return [{ type: i1.SlickGridService }, { type: i2.SlickFunctionLockService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { flexColumn: [{
737
+ type: HostBinding,
738
+ args: ['class']
739
+ }], gridOptions: [{
740
+ type: Input
741
+ }], bordered: [{
742
+ type: Input
743
+ }], striped: [{
744
+ type: Input
745
+ }], hover: [{
746
+ type: Input
747
+ }], showingAllRecords: [{
748
+ type: Input
749
+ }], data: [{
750
+ type: Input
751
+ }], onRowSelected: [{
752
+ type: Output
753
+ }], onRowDoubleClick: [{
754
+ type: Output
755
+ }], onRowContextMenu: [{
756
+ type: Output
757
+ }], onFavoritesModified: [{
758
+ type: Output
759
+ }], slickGridRef: [{
760
+ type: ViewChild,
761
+ args: ["slickGrid", { static: true }]
762
+ }], tableContainerRef: [{
763
+ type: ViewChild,
764
+ args: ["tableContainer"]
765
+ }], tableRef: [{
766
+ type: ViewChild,
767
+ args: ["tableRef"]
768
+ }], tableHeaderRowRef: [{
769
+ type: ViewChild,
770
+ args: ["tableHeaderRow"]
771
+ }], tableHeaderSearchRowRef: [{
772
+ type: ViewChild,
773
+ args: ["tableHeaderSearchRow"]
774
+ }], testRowRef: [{
775
+ type: ViewChild,
776
+ args: ["testRow"]
777
+ }], tableBodyRowsRef: [{
778
+ type: ViewChild,
779
+ args: ["tableBodyRows"]
780
+ }], columnSelectDialogRef: [{
781
+ type: ViewChild,
782
+ args: ["columnSelectDialogRef"]
783
+ }], addNewFavoriteDialogRef: [{
784
+ type: ViewChild,
785
+ args: ["addNewFavoriteDialogRef"]
786
+ }], slickGridColumnTemplates: [{
787
+ type: ContentChildren,
788
+ args: [SlickGridColumnTemplateDirective]
789
+ }], onResize: [{
790
+ type: HostListener,
791
+ args: ['window:resize', ['$event', '$event.target']]
792
+ }] } });
793
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvc2xpY2stZ3JpZC9zbGljay1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBMEUsZUFBZSxFQUFhLFdBQVcsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcE8sT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVILE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSw0QkFBNEIsQ0FBQztBQUdqRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQStCLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0gsT0FBTyxFQUEyQixzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRTlGLE1BQU0sYUFBYTtJQUNsQixZQUFZLElBQVk7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0NBSUQ7QUFPRCxNQUFNLE9BQU8sa0JBQWtCO0lBOEU5QixZQUFv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QUEvQixTQUFTO3VCQUFDLFNBQVM7Z0JBQ1EsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1UscUJBQXFCO3NCQUF4RCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFDSSx1QkFBdUI7c0JBQTVELFNBQVM7dUJBQUMseUJBQXlCO2dCQUVlLHdCQUF3QjtzQkFBMUUsZUFBZTt1QkFBQyxnQ0FBZ0M7Z0JBbUMzQyxRQUFRO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEhvc3RCaW5kaW5nLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi9zbGljay1ncmlkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVNsaWNrR3JpZENvbHVtbk1vZGVsLCBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcywgU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbiB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRPcHRpb25zIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCwgSVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXNwb25zZU1vZGVsIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC1yZXNwb25zZS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbGljay1kaWFsb2cvc2xpY2stZGlhbG9nLm1vZHVsZVwiO1xyXG5pbXBvcnQgeyBTbGlja1NsZWVwU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1zbGVlcC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrVXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLXV0aWxzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tGdW5jdGlvbkxvY2tTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLWZ1bmN0aW9uLWxvY2suc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLXRlbXBsYXRlLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBTbGlja0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIFNsaWNrQ29uZmlybURpYWxvZ1Jlc3VsdHMgfSBmcm9tICcuLi9zbGljay1jb25maXJtLWRpYWxvZy9zbGljay1jb25maXJtLWRpYWxvZy5tb2R1bGUnO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCwgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCB9IGZyb20gJy4vc2xpY2stZ3JpZC1mYXZvcml0ZS5tb2RlbCc7XHJcblxyXG5jbGFzcyBEcm9wRG93bk1vZGVsIHtcclxuXHRjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuaWQgPSB0ZXh0O1xyXG5cdFx0dGhpcy50ZXh0ID0gdGV4dDtcclxuXHR9XHJcblxyXG5cdGlkOiBzdHJpbmc7XHJcblx0dGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3NsaWNrLWdyaWQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnc2xpY2stZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcblx0cHJvdmlkZXJzOiBbU2xpY2tHcmlkU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWNrR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MnKSBmbGV4Q29sdW1uID0gJ3NsaWNrLWZsZXgtY29sdW1uJztcclxuXHQvL0BIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzcyA9ICdkLWZsZXggZmxleC1jb2x1bW4gZmxleC1maWxsJztcclxuXHJcblx0QElucHV0KCkgZ3JpZE9wdGlvbnM6IElTbGlja0dyaWRPcHRpb25zO1xyXG5cdEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBzdHJpcGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBob3ZlcjogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgc2hvd2luZ0FsbFJlY29yZHMgPSBmYWxzZTtcclxuXHRASW5wdXQoKSBkYXRhOiBhbnlbXTtcclxuXHRAT3V0cHV0KCkgb25Sb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25Sb3dEb3VibGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25Sb3dDb250ZXh0TWVudTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25GYXZvcml0ZXNNb2RpZmllZDogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcblx0QFZpZXdDaGlsZChcInNsaWNrR3JpZFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlja0dyaWRSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlQ29udGFpbmVyXCIpIHRhYmxlQ29udGFpbmVyUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZVJlZlwiKSB0YWJsZVJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVIZWFkZXJSb3dcIikgdGFibGVIZWFkZXJSb3dSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyU2VhcmNoUm93XCIpIHRhYmxlSGVhZGVyU2VhcmNoUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdC8vIFRoaXMgaXMgdG8gdGVzdCBob3cgaGlnaCBhIHN0YW5kYXJkIHJvdyBpc1xyXG5cdEBWaWV3Q2hpbGQoXCJ0ZXN0Um93XCIpIHRlc3RSb3dSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlQm9keVJvd3NcIikgdGFibGVCb2R5Um93c1JlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwiY29sdW1uU2VsZWN0RGlhbG9nUmVmXCIpIGNvbHVtblNlbGVjdERpYWxvZ1JlZjogU2xpY2tEaWFsb2dDb21wb25lbnQ7XHJcblx0QFZpZXdDaGlsZChcImFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmXCIpIGFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmOiBTbGlja0NvbmZpcm1EaWFsb2dDb21wb25lbnQ7XHJcblxyXG5cdEBDb250ZW50Q2hpbGRyZW4oU2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUpIHNsaWNrR3JpZENvbHVtblRlbXBsYXRlczogUXVlcnlMaXN0PFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlPjtcclxuXHR0ZW1wbGF0ZVJlZnM6IGFueTtcclxuXHJcblx0cHJpdmF0ZSBmbk9uTW91c2VVcCA9IChlKSA9PiB0aGlzLm9uTW91c2VVcChlKTtcclxuXHJcblx0dXVpZDogc3RyaW5nO1xyXG5cdHNlbGVjdGVkSW5kZXg6IG51bWJlciA9IG51bGw7XHJcblx0Z3JpZE9wYWNpdHkgPSAwO1xyXG5cdHZpc2libGVDb2x1bW5zOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXTtcclxuXHRmYXZvcml0ZXM6IERyb3BEb3duTW9kZWxbXTtcclxuXHRzZWxlY3RlZEZhdm9yaXRlOiBzdHJpbmc7XHJcblx0bmV3RmF2b3JpdGVUZXh0OiBzdHJpbmc7XHJcblx0Y29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0bG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblx0aXNEb3VibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGRvdWJsZUNsaWNrV2FpdFRpbWVvdXQ6IE5vZGVKUy5UaW1lcjtcclxuXHRjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuXHRzZWFyY2hUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0a2V5cHJlc3NUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0c2hvd1Rlc3RSb3cgPSBmYWxzZTtcclxuXHRzaG93U2VhcmNoUm93ID0gZmFsc2U7XHJcblx0aXNSZXNpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHZpc2libGVEYXRhOiBhbnlbXSA9IFtdO1xyXG5cdHJlY29yZHNQZXJQYWdlOiBudW1iZXI7XHJcblx0dG90YWxSZWNvcmRzOiBudW1iZXI7XHJcblx0cmVjb3Jkc1BlclBhZ2VWYWx1ZTogc3RyaW5nID0gXCJBdXRvXCI7XHJcblxyXG5cdHByaXZhdGUgc2xpY2tHcmlkSGVpZ2h0OiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVUaW1lb3V0OiBOb2RlSlMuVGltZXIgPSBudWxsO1xyXG5cdHByaXZhdGUgcmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWw7XHJcblx0cHJpdmF0ZSByZXNpemVJbml0aWFsUG9zOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVJbml0aWFsV2lkdGg6IG51bWJlcjtcclxuXHRwcml2YXRlIHJlc2l6ZUNvbElkeDogbnVtYmVyO1xyXG5cclxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnLCAnJGV2ZW50LnRhcmdldCddKVxyXG5cdGFzeW5jIG9uUmVzaXplKGV2ZW50OiBVSUV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG5cdFx0Ly8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgZmlyZWZveCBzaG93cy9oaWRlcyB0aGUgbWVudSBpZiB5b3UgcHJlc3MgYWx0LiBEb24ndCByZWRyYXcgdGhlIGdyaWQgaWYgd2UncmVcclxuXHRcdC8vIGp1c3Qgc2hvd2luZyB0aGUgbWVudVxyXG5cdFx0aWYgKE1hdGguYWJzKHRoaXMuc2xpY2tHcmlkSGVpZ2h0IC0gdGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpIDwgNTApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRpZiAodGhpcy5zbGlja0dyaWRIZWlnaHQgIT09IHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRcdFx0dGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBncmlkU2VydmljZTogU2xpY2tHcmlkU2VydmljZSxcclxuXHRcdHByaXZhdGUgZnVuY3Rpb25Mb2NrU2VydmljZTogU2xpY2tGdW5jdGlvbkxvY2tTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuXHRcdHRoaXMudXVpZCA9IFNsaWNrVXRpbHNTZXJ2aWNlLm5ld0d1aWQoKTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsID0gbmV3IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0Ly8gQ29weSB0aGUgdGVtcGxhdGVzIHRvIGEgdmFyaWFibGUgdGhhdCB0aGUgaHRtbCBjYW4gYWNjZXNzLiAgSXQgY2FuJ3QgYWNjZXNzIGEgUXVlcnlMaXN0XHJcblx0XHR0aGlzLnRlbXBsYXRlUmVmcyA9IHt9O1xyXG5cdFx0dGhpcy5zbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXMuZm9yRWFjaCh0ID0+IHtcclxuXHRcdFx0dGhpcy50ZW1wbGF0ZVJlZnNbdC5jb2x1bW5LZXldID0gdC50ZW1wbGF0ZTtcclxuXHRcdH0pO1xyXG5cdFx0aWYgKHRoaXMudGFibGVSZWYpXHJcblx0XHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyB0YWJsZUtleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG5cdFx0Ly8gS2V5IHVwXHJcblx0XHRpZiAoZS53aGljaCA9PT0gMzggJiYgISh0aGlzLnNlbGVjdGVkSW5kZXggPT09IDAgJiYgdGhpcy5jdXJyZW50UGFnZSA9PT0gMSkpIHtcclxuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMua2V5cHJlc3NUaW1lb3V0KTtcclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleC0tO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4IDwgMCkge1xyXG5cdFx0XHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlID4gMSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZS0tO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMucmVjb3Jkc1BlclBhZ2UgLSAxO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5rZXlwcmVzc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHRcdH0sIDUwMCk7XHJcblx0XHR9XHJcblx0XHQvLyBLZXkgZG93blxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDQwKSB7XHJcblx0XHRcdGlmICgoKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucmVjb3Jkc1BlclBhZ2UpICsgdGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMudG90YWxSZWNvcmRzKVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMucmVjb3Jkc1BlclBhZ2UpIHtcclxuXHRcdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudG90YWxSZWNvcmRzKSB7XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlKys7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vblBhZ2VDaGFuZ2UodGhpcy5jdXJyZW50UGFnZSwgZmFsc2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5rZXlwcmVzc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHRcdH0sIDUwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcblx0XHRpZiAoY2hhbmdlcy5ib3JkZXJlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gKHRoaXMuYm9yZGVyZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5zdHJpcGVkKSB7XHJcblx0XHRcdC8vIFRoZSBncmlkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlIHRhZyBvcHRpb25zXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gKHRoaXMuc3RyaXBlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09ICdmYWxzZScpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmhvdmVyKSB7XHJcblx0XHRcdC8vIFRoZSBncmlkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlIHRhZyBvcHRpb25zXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmhvdmVyID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuaG92ZXIgPSAodGhpcy5ob3Zlci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09ICdmYWxzZScpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmdyaWRPcHRpb25zKSB7XHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmJvcmRlcmVkICE9PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuYm9yZGVyZWQgPSB0aGlzLmdyaWRPcHRpb25zLmJvcmRlcmVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuc3RyaXBlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLnN0cmlwZWQgPSB0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQ7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gdGhpcy5ncmlkT3B0aW9ucy5ob3ZlcjtcclxuXHJcblx0XHRcdHRoaXMuc2V0R3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZGF0YSkge1xyXG5cdFx0XHQvLyBJZiB3ZSBkb24ndCBkbyB0aGlzIGxvY2ssIHRoZSBmaXJzdCBjaGFuZ2Ugd2lsbCBoYXZlIG51bGwgZGF0YSBhbmQgY3Jhc2guICBUaGUgc2Vjb25kIHJlcXVlc3Qgd2lsbCBoYXZlIHRoZSBhY3R1YWwgZGF0YVxyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHRcdC8vIE9ubHkgcmVzaXplIHRoZSBncmlkIG9uIHRoZSBmaXJzdCBjaGFuZ2UsIG90aGVyd2lzZSB3ZSBnZXQgYSBmbGlja2VyXHJcblx0XHRcdGlmIChjaGFuZ2VzLmRhdGEuZmlyc3RDaGFuZ2UgPT09IHRydWUpXHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJlc2l6ZSBpbiB0aGUgT25Jbml0IHRvIGZpbmlzaCBiZWZvcmUgd2UgY29udGludWVcclxuXHRcdFx0dGhpcy5sb2FkZWQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX0RBVEFfQ0hBTkdFU1wiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25SZWNvcmRzUGVyUGFnZVNlbGVjdGVkKHJlY29yZHNQZXJQYWdlOiBzdHJpbmcpIHtcclxuXHRcdGlmICghcmVjb3Jkc1BlclBhZ2UpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPSByZWNvcmRzUGVyUGFnZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIiwgcmVjb3Jkc1BlclBhZ2UpO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZURhdGEgPSBbXTtcclxuXHRcdHRoaXMuZ3JpZE9wYWNpdHkgPSAwO1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCh0cnVlKTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZWRvd24oZTogTW91c2VFdmVudCwgY29sdW1uSWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IHRydWU7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxQb3MgPSBlLnBhZ2VYO1xyXG5cdFx0dGhpcy5yZXNpemVDb2xJZHggPSBjb2x1bW5JZHg7XHJcblx0XHRsZXQgY29sID0gKDxIVE1MVGFibGVSb3dFbGVtZW50PnRoaXMudGFibGVIZWFkZXJSb3dSZWYubmF0aXZlRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRkXCIpLml0ZW0oY29sdW1uSWR4KTtcclxuXHRcdHRoaXMucmVzaXplSW5pdGlhbFdpZHRoID0gY29sLm9mZnNldFdpZHRoIC0gOTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5mbk9uTW91c2VVcCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbFJlc2l6ZURvdWJsZWNsaWNrKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLndpZHRoID0gbnVsbDtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZW1vdmUoZTogTW91c2VFdmVudCkge1xyXG5cdFx0aWYgKCF0aGlzLmlzUmVzaXppbmcpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRsZXQgbmV3Q3Vyc29yUG9zID0gZS5wYWdlWDtcclxuXHRcdGxldCBkaWZmID0gbmV3Q3Vyc29yUG9zIC0gdGhpcy5yZXNpemVJbml0aWFsUG9zO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSAodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSArIFwicHhcIjtcclxuXHRcdGlmICgodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSA8IDEwKVxyXG5cdFx0XHR0aGlzLnZpc2libGVDb2x1bW5zW3RoaXMucmVzaXplQ29sSWR4XS53aWR0aCA9IFwiMTBweFwiO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25Nb3VzZVVwKGUpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0fVxyXG5cclxuXHRnZXRWaXNpYmxlUmVjb3JkcygpIHtcclxuXHRcdHJldHVybiB0aGlzLnZpc2libGVEYXRhO1xyXG5cdH1cclxuXHJcblx0YWRkTmV3UmVjb3JkKG5ld1JlY29yZDogYW55LCBzZWxlY3ROZXdSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YS51bnNoaWZ0KG5ld1JlY29yZCk7XHJcblxyXG5cdFx0aWYgKHNlbGVjdE5ld1JlY29yZCA9PT0gdHJ1ZSkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4KVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlUmVjb3JkKHJvd051bTogbnVtYmVyLCByZWNvcmQ6IGFueSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YVtyb3dOdW1dID0gcmVjb3JkO1xyXG5cdH1cclxuXHJcblx0b25Sb3dDbGlja2VkKHJvd0RhdGE6IGFueSwgaWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHJvd0RhdGEpO1xyXG5cdFx0fSwgMjUwKTtcclxuXHR9XHJcblxyXG5cdG9uUm93RG91YmxlQ2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gaWR4O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCk7XHJcblx0XHR0aGlzLm9uUm93RG91YmxlQ2xpY2suZW1pdChyb3dEYXRhKTtcclxuXHR9XHJcblxyXG5cdG9uUm93Q29udGV4dE1lbnVDbGlja2VkKGU6IE1vdXNlRXZlbnQsIHJvd0RhdGEsIGlkeCkge1xyXG5cdFx0aWYgKHRoaXMub25Sb3dDb250ZXh0TWVudSkge1xyXG5cdFx0XHRsZXQgcm93Q29udGV4dE1lbnVNb2RlbCA9IHtcclxuXHRcdFx0XHRtb3VzZUV2ZW50OiBlLFxyXG5cdFx0XHRcdGRhdGE6IHJvd0RhdGEsXHJcblx0XHRcdFx0cm93SWR4OiBpZHhcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5vblJvd0NvbnRleHRNZW51LmVtaXQocm93Q29udGV4dE1lbnVNb2RlbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblBhZ2VDaGFuZ2UocGFnZU51bWJlciwgc2VsZWN0Um93OiBib29sZWFuID0gdHJ1ZSkge1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gcGFnZU51bWJlcjtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9ICh0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkgPyAwIDogbnVsbDtcclxuXHJcblx0XHRpZiAoc2VsZWN0Um93ID09PSB0cnVlICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKSB7XHJcblx0XHRcdGNvbnN0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3RoaXMuc2VsZWN0ZWRJbmRleF07XHJcblx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHR9XHJcblxyXG5cdFx0KDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuZm9jdXMoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlbG9hZEdyaWQoYWRkaXRpb25hbFBhcmFtczogYW55KTogUHJvbWlzZTxTbGlja0dyaWRSZXNwb25zZU1vZGVsPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwudXJsID0gdGhpcy5ncmlkT3B0aW9ucy5nZXRVcmw7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmh0dHBIZWFkZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5odHRwSGVhZGVycztcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuYWRkaXRpb25hbFBhcmFtcyA9IGFkZGl0aW9uYWxQYXJhbXM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblxyXG5cdFx0XHRsZXQgcmVzcG9uc2VNb2RlbDogU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFwiKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkV2l0aFJlcXVlc3RNb2RlbChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURXSVRIUkVRVUVTVE1PREVMXCIpO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IHJlcXVlc3RNb2RlbDtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHRsZXQgcmVzcG9uc2VNb2RlbDogU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFdJVEhSRVFVRVNUTU9ERUxcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIHJlbG9hZChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FEXCIpO1xyXG5cclxuXHRcdFx0cmVxdWVzdE1vZGVsID0gdGhpcy5nZXRSZXF1ZXN0TW9kZWwodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBudWxsO1xyXG5cdFx0XHRpZiAocmVxdWVzdE1vZGVsLnVybClcclxuXHRcdFx0XHRyZXNwb25zZU1vZGVsID0gYXdhaXQgdGhpcy5ncmlkU2VydmljZS5nZXREYXRhRnJvbVNlcnZlcihyZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhT2JqKHJlcXVlc3RNb2RlbCwgdGhpcy5kYXRhKTtcclxuXHJcblx0XHRcdHRoaXMubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy50b3RhbFJlY29yZHMgPSByZXNwb25zZU1vZGVsLnRvdGFsUmVjb3JkcztcclxuXHRcdFx0dGhpcy52aXNpYmxlRGF0YSA9IHJlc3BvbnNlTW9kZWwuZGF0YTtcclxuXHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BRFwiKTtcclxuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTW9kZWwpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dW5zZWxlY3RSb3coKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBudWxsO1xyXG5cdH1cclxuXHJcblx0c2VsZWN0Um93KHJvd051bWJlcjogbnVtYmVyKSB7XHJcblx0XHRsZXQgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbcm93TnVtYmVyXTtcclxuXHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHJvd051bWJlcik7XHJcblx0fVxyXG5cclxuXHRnZXRDb2x1bW5IVE1MKHJvd0RhdGEsIGRhdGFGaWVsZE5hbWUpIHtcclxuXHRcdGNvbnN0IGNvbHVtbkhUTUwgPSBTbGlja1V0aWxzU2VydmljZS5nZXREZWVwT2JqZWN0KHJvd0RhdGEsIGRhdGFGaWVsZE5hbWUpO1xyXG5cclxuXHRcdGlmIChjb2x1bW5IVE1MID09PSBudWxsIHx8IGNvbHVtbkhUTUwgPT09IHVuZGVmaW5lZClcclxuXHRcdFx0cmV0dXJuICcnO1xyXG5cclxuXHRcdHJldHVybiBjb2x1bW5IVE1MLnRvU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzb3J0Qnkoc29ydENvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4gJiYgYy5jb2x1bW5LZXkgIT09IHNvcnRDb2x1bW4uY29sdW1uS2V5KSB7XHJcblxyXG5cdFx0XHRcdGMuc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24ubm9uZTtcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHJcblx0XHRpZiAoc29ydENvbHVtbikge1xyXG5cdFx0XHRpZiAoc29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmUpIHtcclxuXHRcdFx0XHR0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goYyA9PiBjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmUpO1xyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5hc2MpXHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5kZXNjO1xyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uU2VhcmNoU2VsZWN0KGRkVmFsdWUsIGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRpZiAoIXRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcylcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGNvbHVtblNlYXJjaFZhbHVlSWR4ID0gdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLmZpbmRJbmRleCh4ID0+IHguY29sdW1uTmFtZSA9PT0gY29sdW1uLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0aWYgKGNvbHVtblNlYXJjaFZhbHVlSWR4ID49IDApXHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5zcGxpY2UoY29sdW1uU2VhcmNoVmFsdWVJZHgsIDEpO1xyXG5cclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cclxuXHRcdGlmIChkZFZhbHVlKSB7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5wdXNoKDxJU2xpY2tHcmlkUmVxdWVzdFNlYXJjaE1vZGVsPntcclxuXHRcdFx0XHRjb2x1bW5OYW1lOiBjb2x1bW4uZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRzZWFyY2hWYWx1ZUlkOiBkZFZhbHVlLmlkLFxyXG5cdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogZGRWYWx1ZS50ZXh0XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uU2VhcmNoKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdGlmICghdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQgPT09IGNvbHVtbi5sYXN0U2VhcmNoVGV4dClcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IGNvbHVtbi5maWx0ZXJUZXh0O1xyXG5cdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gISFjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGlmICghY29sdW1uLmlzRmlsdGVyaW5nKVxyXG5cdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcclxuXHRcdHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0aWYgKGNvbHVtblNlYXJjaFZhbHVlSWR4ID49IDApXHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnNwbGljZShjb2x1bW5TZWFyY2hWYWx1ZUlkeCwgMSk7XHJcblxyXG5cdFx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQpIHtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjb2x1bW4uZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogY29sdW1uLmZpbHRlclRleHRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHRcdH0sIDI1MCk7XHJcblx0fVxyXG5cclxuXHR0b2dnbGVMb2NrKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRjb2x1bW4uaXNMb2NrZWQgPSAhY29sdW1uLmlzTG9ja2VkO1xyXG5cclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVzZXRGaWx0ZXIoY29sdW1uOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWwpIHtcclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29sdW1uLmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0Y29sdW1uLmxhc3RTZWFyY2hUZXh0ID0gbnVsbDtcclxuXHRcdGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbHVtbk5hbWUgIT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdG9wZW5Db2x1bW5TZWxlY3REaWFsb2coKSB7XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zXTtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5zaG93RGlhbG9nKCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbHVtbkRyb3AoZTogYW55KSB7XHJcblx0XHRjb25zb2xlLmxvZyhlKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uQ29sdW1uUmVvcmRlcihlOiBudW1iZXJbXSkge1xyXG5cdFx0Y29uc3Qgb2xkT3JkZXIgPSBlWzBdO1xyXG5cdFx0Y29uc3QgbmV3T3JkZXIgPSBlWzFdO1xyXG5cclxuXHRcdGlmIChvbGRPcmRlciA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb25zdCBzZWxlY3RlZENvbCA9IHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zcGxpY2Uob2xkT3JkZXIsIDEpWzBdO1xyXG5cdFx0c2VsZWN0ZWRDb2wuZGlzcGxheU9yZGVyID0gbmV3T3JkZXI7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRPcmRlciA9IDA7XHJcblx0XHQvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBuZXcgb3JkZXIgcmVvcmRlcmVkIGZyb20gMFxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Ly8gSWYgd2UncmUgYXQgbmV3T3JkZXIsIGxlYXZlIGEgc3BvdFxyXG5cdFx0XHRpZiAoaSA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdFx0Y3VycmVudE9yZGVyKys7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc1tpXS5kaXNwbGF5T3JkZXIgPSBjdXJyZW50T3JkZXIrKztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLCBzZWxlY3RlZENvbF07XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBhZGROZXdGYXZvcml0ZSgpIHtcclxuXHRcdHRoaXMubmV3RmF2b3JpdGVUZXh0ID0gJyc7XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkTmV3RmF2b3JpdGVEaWFsb2dSZWYuY29uZmlybSgpO1xyXG5cclxuXHRcdGlmIChjb25maXJtUmVzdWx0ID09PSBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzLk9rICYmIHRoaXMubmV3RmF2b3JpdGVUZXh0KSB7XHJcblx0XHRcdC8vIFNhdmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcy5wdXNoKG5ldyBEcm9wRG93bk1vZGVsKHRoaXMubmV3RmF2b3JpdGVUZXh0KSk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSB0aGlzLm5ld0Zhdm9yaXRlVGV4dDtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmZhdm9yaXRlcy5tYXAoeCA9PiB4LnRleHQpKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIsIGZhdm9yaXRlc0pzb24pO1xyXG5cclxuXHRcdFx0Ly8gU2F2ZSB0aGUgbmV3IG9uZSB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRsb2FkRmF2b3JpdGUoZmF2b3JpdGU6IERyb3BEb3duTW9kZWwpIHtcclxuXHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHNldEZhdm9yaXRlKGZhdm9yaXRlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlO1xyXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlID09PSB0cnVlKTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHR9XHJcblxyXG5cdG9uU2F2ZUNvbHVtbnMoKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zXTtcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgaWYgdGhleSd2ZSBoaWRkZW4gYSBjb2x1bW4gdGhhdCB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoaXMgY29sdW1uXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcclxuXHRcdFx0aWYgKHgudmlzaWJsZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHR4LmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdHguZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdHguaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR4Lmxhc3RTZWFyY2hUZXh0ID0gbnVsbDtcclxuXHRcdFx0XHR4LnNvcnREaXJlY3Rpb24gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHRcdHRoaXMucmVzaXplR3JpZCgpO1xyXG5cclxuXHRcdGlmICh0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQpIHtcclxuXHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlczogSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWxbXSA9IHRoaXMuZmF2b3JpdGVzLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlID0gbmV3IFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwoKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID0gZmF2b3JpdGUudGV4dDtcclxuXHRcdFx0XHRjb25zdCBzdWZmaXggPSBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRjb25zdCBkaWFsb2dDb2x1bW5zSlNPTiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmNvbHVtbnMgPSBKU09OLnBhcnNlKGRpYWxvZ0NvbHVtbnNKU09OKTtcclxuXHRcdFx0XHRyZXR1cm4gZ3JpZEZhdm9yaXRlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMub25GYXZvcml0ZXNNb2RpZmllZC5lbWl0KGdyaWRGYXZvcml0ZXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b25DYW5jZWxDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuaGlkZURpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0c2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBkaWFsb2dDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCkge1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Yy50aXRsZU9yaWVudGF0aW9uID0gY29sdW1uLnRpdGxlT3JpZW50YXRpb247XHJcblx0XHRcdFx0XHRcdGMudGl0bGVIZWlnaHQgPSBjb2x1bW4udGl0bGVIZWlnaHQ7XHJcblx0XHRcdFx0XHRcdGMud2lkdGggPSBjb2x1bW4ud2lkdGg7XHJcblx0XHRcdFx0XHRcdGMuZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlO1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdFx0Yy5pc0xvY2tlZCA9IGNvbHVtbi5pc0xvY2tlZDtcclxuXHRcdFx0XHRcdFx0Yy5pc0ZpbHRlcmluZyA9IGNvbHVtbi5pc0ZpbHRlcmluZztcclxuXHRcdFx0XHRcdFx0Yy5zb3J0RGlyZWN0aW9uID0gY29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlzcGxheU9yZGVyKys7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y29sdW1ucyA9IGNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHRcdFx0Z3JpZENvbHVtbnNKU09OID0gSlNPTi5zdHJpbmdpZnkoY29sdW1ucyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCwgZ3JpZENvbHVtbnNKU09OKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkKSB7XHJcblx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZXM6IElTbGlja0dyaWRGYXZvcml0ZU1vZGVsW10gPSB0aGlzLmZhdm9yaXRlcy5tYXAoZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZSA9IG5ldyBTbGlja0dyaWRGYXZvcml0ZU1vZGVsKCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0Y29uc3QgZGlhbG9nQ29sdW1uc0pTT04gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5jb2x1bW5zID0gSlNPTi5wYXJzZShkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0cmV0dXJuIGdyaWRGYXZvcml0ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQuZW1pdChncmlkRmF2b3JpdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGFzeW5jIHJlc2l6ZUdyaWQoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG5cdFx0XHRpZiAoIWZvcmNlUmVmcmVzaCAmJiB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA9PT0gdGhpcy5zbGlja0dyaWRIZWlnaHQpIHtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID09PSAnQXV0bycpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRVNJWkVHUklEXCIpO1xyXG5cclxuXHRcdFx0XHR0aGlzLnNsaWNrR3JpZEhlaWdodCA9IHRoaXMudGFibGVDb250YWluZXJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRlc3RSb3cgPSAoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5pbnNlcnRSb3coMCk7XHJcblx0XHRcdFx0Y29uc3QgdGVzdENlbGwgPSB0ZXN0Um93Lmluc2VydENlbGwoMCk7XHJcblx0XHRcdFx0dGVzdENlbGwuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblx0XHRcdFx0dGVzdENlbGwuaW5uZXJIVE1MID0gXCImTkJTUFwiO1xyXG5cdFx0XHRcdGNvbnN0IHJvd0hlaWdodCA9IHRlc3RDZWxsLm9mZnNldEhlaWdodDtcclxuXHRcdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5kZWxldGVSb3coMCk7XHJcblxyXG5cdFx0XHRcdGxldCBoZWFkZXJIZWlnaHQgPSB0aGlzLnRhYmxlSGVhZGVyUm93UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMjtcclxuXHRcdFx0XHRpZiAodGhpcy50YWJsZUhlYWRlclNlYXJjaFJvd1JlZilcclxuXHRcdFx0XHRcdGhlYWRlckhlaWdodCArPSB0aGlzLnRhYmxlSGVhZGVyU2VhcmNoUm93UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMjtcclxuXHRcdFx0XHRjb25zdCBjbGllbnRIZWlnaHQgPSB0aGlzLnRhYmxlQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVhZGVySGVpZ2h0O1xyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2UgPSBwYXJzZUludCgoKGNsaWVudEhlaWdodCAvIHJvd0hlaWdodCkgLSAxKS50b0ZpeGVkKDApKTtcclxuXHRcdFx0XHRsZXQgYWN0dWFsUm93SGVpZ2h0ID0gcGFyc2VJbnQoKGNsaWVudEhlaWdodCAvIHRoaXMucmVjb3Jkc1BlclBhZ2UpLnRvRml4ZWQoMCkpIC0gMTtcclxuXHRcdFx0XHRpZiAoYWN0dWFsUm93SGVpZ2h0IDwgcm93SGVpZ2h0KVxyXG5cdFx0XHRcdFx0YWN0dWFsUm93SGVpZ2h0ID0gcm93SGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRjb25zdCBhbGxSb3dzID0gPEhUTUxFbGVtZW50W10+dGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYmxlIHRib2R5IHRyXCIpO1xyXG5cdFx0XHRcdGFsbFJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG5cdFx0XHRcdFx0cm93LnN0eWxlLmhlaWdodCA9IChhY3R1YWxSb3dIZWlnaHQpICsgXCJweFwiO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRVNJWkVHUklEXCIpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMTtcclxuXHRcdFx0XHR0aGlzLnNob3dUZXN0Um93ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlID0gcGFyc2VJbnQodGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlKTtcclxuXHRcdFx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YWRkQ29sdW1uKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsLCBpZHg6IG51bWJlciA9IG51bGwpIHtcclxuXHJcblx0XHRpZiAoaWR4ID09PSBudWxsKVxyXG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuc3BsaWNlKGlkeCwgMCwgY29sdW1uKTtcclxuXHJcblx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdH1cclxuXHJcblx0Z2V0UmVxdWVzdE1vZGVsKHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsID0gbnVsbCk6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCB7XHJcblx0XHRpZiAoIXJlcXVlc3RNb2RlbClcclxuXHRcdFx0cmVxdWVzdE1vZGVsID0gdGhpcy5yZXF1ZXN0TW9kZWw7XHJcblxyXG5cdFx0cmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRpZiAoYy52aXNpYmxlKSB7XHJcblx0XHRcdFx0aWYgKGMuZmlsdGVyVHlwZSA9PT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMudGV4dCAmJiBjLmZpbHRlclRleHQpIHtcclxuXHRcdFx0XHRcdGMuZmlsdGVyVGV4dCA9IGMuZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdGNvbHVtbk5hbWU6IGMuZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVJZDogbnVsbCxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVUZXh0OiBjLmZpbHRlclRleHRcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duICYmIGMuZmlsdGVyRHJvcGRvd25WYWx1ZSkge1xyXG5cdFx0XHRcdFx0Yy5maWx0ZXJEcm9wZG93blZhbHVlID0gYy5maWx0ZXJEcm9wZG93blZhbHVlO1xyXG5cdFx0XHRcdFx0cmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5wdXNoKDxJU2xpY2tHcmlkUmVxdWVzdFNlYXJjaE1vZGVsPntcclxuXHRcdFx0XHRcdFx0Y29sdW1uTmFtZTogYy5kYXRhRmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZUlkOiBjLmZpbHRlckRyb3Bkb3duVmFsdWUsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogbnVsbFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IG51bGw7XHJcblx0XHRjb25zdCBzb3J0Q29sdW1uID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbmQoeCA9PiB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjIHx8IHguc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5kZXNjKTtcclxuXHRcdGlmIChzb3J0Q29sdW1uKSB7XHJcblx0XHRcdHJlcXVlc3RNb2RlbC5zb3J0Q29sdW1uID0gKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMCkgPyBudWxsIDogc29ydENvbHVtbi5kYXRhRmllbGROYW1lO1xyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAocmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlIDw9IDApXHJcblx0XHRcdHJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IDIwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RNb2RlbDtcclxuXHR9XHJcblxyXG5cdHNldEdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBJU2xpY2tHcmlkT3B0aW9ucykge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucyA9IGdyaWRPcHRpb25zO1xyXG5cclxuXHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkpIHtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmZhdm9yaXRlcykge1xyXG5cdFx0XHRcdGNvbnN0IGZhdm9yaXRlTmFtZXMgPSB0aGlzLmdyaWRPcHRpb25zLmZhdm9yaXRlcy5tYXAoZiA9PiBmLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0ZBVk9SSVRFU2AsIEpTT04uc3RyaW5naWZ5KGZhdm9yaXRlTmFtZXMpKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMuZm9yRWFjaChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgaGF2ZW4ndCBhZGRlZCBhIG5ldyBjb2x1bW4gdGhhdCBuZWVkcyB0byBiZSBzYXZlZFxyXG5cdFx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4aXN0cyA9IGZhdm9yaXRlLmNvbHVtbnMuZmluZEluZGV4KHggPT4geC5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uRXhpc3RzIDwgMClcclxuXHRcdFx0XHRcdFx0XHRmYXZvcml0ZS5jb2x1bW5zLnB1c2goYyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeShmYXZvcml0ZS5jb2x1bW5zKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBmYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGlmIChmYXZvcml0ZU5hbWVzLmluZGV4T2YodGhpcy5zZWxlY3RlZEZhdm9yaXRlKSA8IDApXHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBcIkRlZmF1bHRcIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIikgfHwgJ0RlZmF1bHQnO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55IGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXNcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYzEgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGFGaWVsZENvdW50ID0gKHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmRhdGFGaWVsZE5hbWUgPT09IGMxLmRhdGFGaWVsZE5hbWUpIHx8IFtdKS5sZW5ndGg7XHJcblx0XHRcdFx0aWYgKGRhdGFGaWVsZENvdW50ID4gMSlcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEdyaWQgJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9IGNvbHVtbiAke2MxLmRhdGFGaWVsZE5hbWV9IGlzIGRlZmluZWQgJHtkYXRhRmllbGRDb3VudH0gdGltZXNgKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdFx0bGV0IGNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cclxuXHRcdFx0XHRsZXQgZGlzcGxheU9yZGVyID0gMDtcclxuXHRcdFx0XHRjb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdFx0XHRsZXQgY29sdW1uID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbmQoZ3JpZENvbHVtbiA9PiBncmlkQ29sdW1uLmRhdGFGaWVsZE5hbWUgPT09IGMuZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdFx0XHRpZiAoY29sdW1uKSB7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi52aXNpYmxlID0gYy52aXNpYmxlO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uZGlzcGxheU9yZGVyID0gZGlzcGxheU9yZGVyO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4udGl0bGVPcmllbnRhdGlvbiA9IGMudGl0bGVPcmllbnRhdGlvbjtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnRpdGxlSGVpZ2h0ID0gYy50aXRsZUhlaWdodDtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLndpZHRoID0gYy53aWR0aDtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLmZsZXhpYmxlID0gYy5mbGV4aWJsZTtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnNvcnREaXJlY3Rpb24gPSBjLnNvcnREaXJlY3Rpb247XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGMuaXNMb2NrZWQ7XHJcblx0XHRcdFx0XHRcdC8vY29sdW1uLmZpbHRlclR5cGUgPSBjLmZpbHRlclR5cGU7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW4uaXNMb2NrZWQgJiYgY29sdW1uLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQpXHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyVGV4dCA9IGMuZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIChjb2x1bW4uZmlsdGVyVHlwZSA9PT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMuZHJvcGRvd24pXHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGMuZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCFjb2x1bW4uZmlsdGVyVGV4dCAmJiAhY29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlzcGxheU9yZGVyKys7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRSZWNvcmRzUGVyUGFnZSAmJiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfUkVDT1JEU19QRVJfUEFHRVwiKSlcclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPSB0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRSZWNvcmRzUGVyUGFnZS50b1N0cmluZygpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfUkVDT1JEU19QRVJfUEFHRVwiKSB8fCBcIkF1dG9cIjtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9GQVZPUklURVNcIikgfHwgYFtcIkRlZmF1bHRcIl1gO1xyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcyA9ICg8c3RyaW5nW10+SlNPTi5wYXJzZShmYXZvcml0ZXNKc29uKSkubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gbmV3IERyb3BEb3duTW9kZWwoZmF2b3JpdGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLnNob3dTZWFyY2hSb3cgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuZmlsdGVyVHlwZSAhPT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMubm9uZSkubGVuZ3RoID4gMDtcclxuXHRcdGxldCBzb3J0Q29sdW1uID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKGMgPT4gYy5zb3J0YWJsZSA9PT0gdHJ1ZSAmJiBjLnNvcnREaXJlY3Rpb24gPiAwKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc29ydENvbHVtbikge1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5zb3J0Q29sdW1uID0gc29ydENvbHVtbi5kYXRhRmllbGROYW1lO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5zb3J0RGlyZWN0aW9uID0gc29ydENvbHVtbi5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0fVxyXG5cdH1cclxufSIsIjxkaXYgaWQ9XCJzbGljay1ncmlkX3t7dXVpZH19XCIgY2xhc3M9XCJzbGljay1ncmlkIGQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWZpbGxcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyByaWdodDogMDsgYm90dG9tOiAwO1wiICNzbGlja0dyaWQ+XHJcblx0PGRpdiAjdGFibGVDb250YWluZXIgY2xhc3M9XCJkLWZsZXggZmxleC1maWxsXCIgc3R5bGU9XCJvdmVyZmxvdzogYXV0b1wiPlxyXG5cclxuXHRcdDxkaXY+XHJcblx0XHRcdDx0YWJsZSAjdGFibGVSZWYgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbVwiIFtjbGFzcy50YWJsZS1ib3JkZXJlZF09XCJib3JkZXJlZFwiIFtjbGFzcy50YWJsZS1ib3JkZXJsZXNzXT1cIiFib3JkZXJlZFwiIFtjbGFzcy50YWJsZS1zdHJpcGVkXT1cInN0cmlwZWRcIiBbY2xhc3MudGFibGUtaG92ZXJdPVwiaG92ZXJcIiBbc3R5bGUub3BhY2l0eV09XCJncmlkT3BhY2l0eVwiIHN0eWxlPVwibWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiIChrZXlkb3duKT1cInRhYmxlS2V5ZG93bigkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCI+XHJcblx0XHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdFx0PHRyICN0YWJsZUhlYWRlclJvdyAobW91c2Vtb3ZlKT1cIm9uQ29sUmVzaXplTW91c2Vtb3ZlKCRldmVudClcIiBbbmdDbGFzc109XCJ7ICdyZXNpemluZyc6IGlzUmVzaXppbmcgPT09IHRydWUgfVwiPlxyXG5cdFx0XHRcdFx0XHQ8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB2aXNpYmxlQ29sdW1uczsgbGV0IGlkeCA9IGluZGV4XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiIFtzdHlsZS5tYXhXaWR0aF09XCJjb2x1bW4ud2lkdGhcIiBbc3R5bGUuaGVpZ2h0XT1cImNvbHVtbi50aXRsZUhlaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgW25nQ2xhc3NdPVwieyAnc2xpY2stZ3JpZF90aXRsZS12ZXJ0aWNhbCcgOiBjb2x1bW4udGl0bGVPcmllbnRhdGlvbiA9PT0gMSB9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiaWR4ID4gMCAmJiBpZHggPCB2aXNpYmxlQ29sdW1ucy5sZW5ndGhcIiBjbGFzcz1cInJlc2l6ZV9jb2x1bW5fbGVmdFwiIFtjbGFzcy50YWJsZS1ib3JkZXJlZF09XCJib3JkZXJlZFwiIChtb3VzZWRvd24pPVwib25Db2xSZXNpemVNb3VzZWRvd24oJGV2ZW50LCBpZHggLSAxKVwiIChkYmxjbGljayk9XCJvbkNvbFJlc2l6ZURvdWJsZWNsaWNrKCRldmVudCwgaWR4IC0gMSlcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic29ydEljb25cIiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSAmJiBjb2x1bW4uc29ydERpcmVjdGlvbiA+IDBcIj48aSBjbGFzcz1cImZhclwiIFtuZ0NsYXNzXT1cInsnZmEtY2FyZXQtdXAnOiBjb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMSwgJ2ZhLWNhcmV0LWRvd24nOiBjb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMn1cIj48L2k+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlID09PSB0cnVlXCIgKGNsaWNrKT1cInNvcnRCeShjb2x1bW4pXCIgZHJhZ2dhYmxlPVwiZmFsc2VcIiB0aXRsZT1cInt7Y29sdW1uLnRpdGxlfX1cIj57e2NvbHVtbi50aXRsZX19PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSA9PT0gZmFsc2VcIiB0aXRsZT1cInt7Y29sdW1uLnRpdGxlfX1cIj57e2NvbHVtbi50aXRsZX19PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVzaXplX2NvbHVtbl9yaWdodFwiIChtb3VzZWRvd24pPVwib25Db2xSZXNpemVNb3VzZWRvd24oJGV2ZW50LCBpZHgpXCIgKGRibGNsaWNrKT1cIm9uQ29sUmVzaXplRG91YmxlY2xpY2soJGV2ZW50LCBpZHgpXCI+PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PHRyICN0YWJsZUhlYWRlclNlYXJjaFJvdyAqbmdJZj1cInNob3dTZWFyY2hSb3cgPT09IHRydWVcIj5cclxuXHRcdFx0XHRcdFx0PHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2xpY2stZ3JpZF9zZWFyY2gtY29sdW1uXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8aSAqbmdJZj1cImNvbHVtbi5pc0ZpbHRlcmluZ1wiIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSBiZy13aGl0ZSB0ZXh0LWRhbmdlciBtci0xXCIgKGNsaWNrKT1cInJlc2V0RmlsdGVyKGNvbHVtbilcIj48L2k+XHJcblx0XHRcdFx0XHRcdFx0XHQ8aSAqbmdJZj1cImNvbHVtbi5pc0ZpbHRlcmluZyAmJiBjb2x1bW4uaXNMb2NrZWRcIiBjbGFzcz1cImZhciBmYS1sb2NrIG1yLTFcIiAoY2xpY2spPVwidG9nZ2xlTG9jayhjb2x1bW4pXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGkgKm5nSWY9XCJjb2x1bW4uaXNGaWx0ZXJpbmcgJiYgIWNvbHVtbi5pc0xvY2tlZFwiIGNsYXNzPVwiZmFyIGZhLWxvY2stb3BlbiBtci0xXCIgKGNsaWNrKT1cInRvZ2dsZUxvY2soY29sdW1uKVwiPjwvaT5cclxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJjb2x1bW4uZmlsdGVyVHlwZSA9PT0gMVwiIGNsYXNzPVwic2xpY2stZ3JpZF90ZXh0LXNlYXJjaFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgYXV0b2NvbXBsZXRlPVwibm9wZVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJUZXh0XCIgbmFtZT1cInNlYXJjaFRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChrZXlkb3duKT1cIm9uU2VhcmNoKGNvbHVtbilcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cImNvbHVtbi5maWx0ZXJUeXBlID09PSAyXCIgY2xhc3M9XCJpbnB1dC1ncm91cCBzbGljay1ncmlkX2Ryb3AtZG93bi1zZWFyY2hcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNsaWNrLWRyb3AtZG93biBbaXRlbXNdPVwiY29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWVzXCIgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZVwiIGxpc3RXaWR0aD1cImF1dG9cIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChvblNlbGVjdCk9XCJvblNlYXJjaFNlbGVjdCgkZXZlbnQsIGNvbHVtbilcIj48L3NsaWNrLWRyb3AtZG93bj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHQ8L3RoZWFkPlxyXG5cclxuXHRcdFx0XHQ8dGJvZHk+XHJcblx0XHRcdFx0XHQ8dHIgKm5nSWY9XCJsb2FkZWQgJiYgdmlzaWJsZURhdGEubGVuZ3RoID09PSAwXCI+PHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5zLmxlbmd0aFwiPk5vIERhdGE8L3RkPjwvdHI+XHJcblx0XHRcdFx0XHQ8dHIgKm5nRm9yPVwibGV0IHJvd0RhdGEgb2YgdmlzaWJsZURhdGE7IGxldCBpZHggPSBpbmRleFwiICN0YWJsZUJvZHlSb3dzIChjbGljayk9XCJvblJvd0NsaWNrZWQocm93RGF0YSwgaWR4KVwiIChkYmxjbGljayk9XCJvblJvd0RvdWJsZUNsaWNrZWQocm93RGF0YSwgaWR4KVwiIChjb250ZXh0bWVudSk9XCJvblJvd0NvbnRleHRNZW51Q2xpY2tlZCgkZXZlbnQsIHJvd0RhdGEsIGlkeClcIiBbY2xhc3MudGFibGUtc3VjY2Vzc109XCJzZWxlY3RlZEluZGV4ID09PSBpZHhcIj5cclxuXHRcdFx0XHRcdFx0PHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5jb2x1bW5LZXlcIiBjbGFzcz1cInNsaWNrLWdyaWRfY29sdW1uLWNvbnRlbnRcIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoXCIgW3N0eWxlLm1heFdpZHRoXT1cImNvbHVtbi53aWR0aFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29sdW1uSFRNTChyb3dEYXRhLCBjb2x1bW4uZGF0YUZpZWxkTmFtZSkgfCBzbGlja0dyaWRTYW5pdGl6ZUh0bWxcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiY29sdW1uLmNvbHVtbktleVwiIGNsYXNzPVwic2xpY2stZ3JpZF9jb2x1bW4tY29udGVudFwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIiBbc3R5bGUubWF4V2lkdGhdPVwiY29sdW1uLndpZHRoXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWZzW2NvbHVtbi5jb2x1bW5LZXldLCBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93RGF0YSB9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0PC90YWJsZT5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cclxuXHJcblx0PGRpdiBjbGFzcz1cInNsaWNrLWdyaWQtZm9vdGVyIG10LTIgZC1mbGV4XCI+XHJcblx0XHQ8ZGl2PlxyXG5cdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3BlbkNvbHVtblNlbGVjdERpYWxvZygpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiPjxpIGNsYXNzPVwiZmFyIGZhLWNvbHVtbnNcIj48L2k+PC9idXR0b24+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgKm5nSWY9XCJmYXZvcml0ZXM/Lmxlbmd0aCA+IDFcIj5cclxuXHRcdFx0PGJ1dHRvbiAjZmF2b3JpdGVTZWxlY3RSZWYgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWwtMVwiPjxpIGNsYXNzPVwiZmFyIGZhLXN0YXJcIj48L2k+IHt7dGhpcy5zZWxlY3RlZEZhdm9yaXRlfX08L2J1dHRvbj5cclxuXHRcdFx0PHNsaWNrLXBvcG92ZXIgW2VsZW1lbnRdPVwiZmF2b3JpdGVTZWxlY3RSZWZcIiBwb3NpdGlvbj1cInRvcFwiIHNob3dBcnJvdz1cImZhbHNlXCIgW3RvcE9mZnNldFB4XT1cIjBcIiBbbGVmdE9mZnNldFB4XT1cIjBcIiBbc2hvd0J5Q2xpY2tdPVwidHJ1ZVwiPlxyXG5cdFx0XHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmxlc3MgdGFibGUtc20gdGFibGUtaG92ZXJcIiBzdHlsZT1cIm1pbi13aWR0aDogMjUwcHg7IGN1cnNvcjogZGVmYXVsdFwiPlxyXG5cdFx0XHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdFx0XHQ8dHIgKm5nRm9yPVwibGV0IGZhdm9yaXRlIG9mIGZhdm9yaXRlc1wiIChjbGljayk9XCJzZXRGYXZvcml0ZShmYXZvcml0ZS50ZXh0KVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZD48aSAqbmdJZj1cImZhdm9yaXRlLnRleHQgPT09IHNlbGVjdGVkRmF2b3JpdGVcIiBjbGFzcz1cImZhciBmYS1zdGFyIG1yLTFcIj48L2k+e3tmYXZvcml0ZS50ZXh0fX08L3RkPlxyXG5cdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHQ8L3RhYmxlPlxyXG5cdFx0XHQ8L3NsaWNrLXBvcG92ZXI+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgKm5nSWY9XCJzaG93aW5nQWxsUmVjb3JkcyA9PSBmYWxzZVwiPlxyXG5cdFx0XHQ8c2xpY2stcGFnaW5nIFsocGFnZU51bWJlcildPVwiY3VycmVudFBhZ2VcIiBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiIFtyZWNvcmRzUGVyUGFnZV09XCJyZWNvcmRzUGVyUGFnZVwiIChvblBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj48L3NsaWNrLXBhZ2luZz5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiAqbmdJZj1cInNob3dpbmdBbGxSZWNvcmRzID09IGZhbHNlXCIgY2xhc3M9XCJtbC0xXCI+XHJcblx0XHRcdDxidXR0b24gI3JlY29yZHNQZXJQYWdlUmVmIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCI+e3tyZWNvcmRzUGVyUGFnZVZhbHVlfX0mbmJzcDsmbmJzcDs8aSBzdHlsZT1cImZvbnQtc2l6ZTogMTJweFwiIGNsYXNzPVwiZmFyIGZhLWNoZXZyb24tZG93blwiPjwvaT48L2J1dHRvbj5cclxuXHJcblx0XHRcdDxzbGljay1wb3BvdmVyIFtlbGVtZW50XT1cInJlY29yZHNQZXJQYWdlUmVmXCIgcG9zaXRpb249XCJ0b3BcIiBzaG93QXJyb3c9XCJmYWxzZVwiIFt0b3BPZmZzZXRQeF09XCIwXCIgW2xlZnRPZmZzZXRQeF09XCIwXCIgW3Nob3dCeUNsaWNrXT1cInRydWVcIj5cclxuXHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJsZXNzIHRhYmxlLXNtIHRhYmxlLWhvdmVyXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxyXG5cdFx0XHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdFx0XHQ8dHIgKGNsaWNrKT1cIm9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZCgnQXV0bycpXCI+PHRkPkF1dG88L3RkPjwvdHI+XHJcblx0XHRcdFx0XHRcdDx0ciAoY2xpY2spPVwib25SZWNvcmRzUGVyUGFnZVNlbGVjdGVkKCcyNScpXCI+PHRkPjI1PC90ZD48L3RyPlxyXG5cdFx0XHRcdFx0XHQ8dHIgKGNsaWNrKT1cIm9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZCgnNTAnKVwiPjx0ZD41MDwvdGQ+PC90cj5cclxuXHRcdFx0XHRcdFx0PHRyIChjbGljayk9XCJvblJlY29yZHNQZXJQYWdlU2VsZWN0ZWQoJzEwMCcpXCI+PHRkPjEwMDwvdGQ+PC90cj5cclxuXHRcdFx0XHRcdDwvdGJvZHk+XHJcblx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0PC9zbGljay1wb3BvdmVyPlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHNsaWNrLWRpYWxvZyAjY29sdW1uU2VsZWN0RGlhbG9nUmVmIGhlYWRlcj1cIlNlbGVjdCBDb2x1bW5zXCI+XHJcblx0PGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDQ3NXB4O1wiIGNsYXNzPVwibXgtNVwiPlxyXG5cdFx0PGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1maWxsXCI+XHJcblx0XHRcdFx0PHNsaWNrLWRyb3AtZG93biBbaXRlbXNdPVwiZmF2b3JpdGVzXCJcclxuXHRcdFx0XHRcdFx0XHRcdCBbbmdNb2RlbF09XCJzZWxlY3RlZEZhdm9yaXRlXCJcclxuXHRcdFx0XHRcdFx0XHRcdCAob25TZWxlY3QpPVwibG9hZEZhdm9yaXRlKCRldmVudClcIj48L3NsaWNrLWRyb3AtZG93bj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRcdDxkaXY+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1sLTFcIiAoY2xpY2spPVwiYWRkTmV3RmF2b3JpdGUoKVwiPjxpIGNsYXNzPVwiZmFyIGZhLXBsdXNcIj48L2k+PC9idXR0b24+PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbXQtMVwiIHNsaWNrLWRyb3AtbGlzdCAob25TbGlja0Ryb3BMaXN0UmVvcmRlcik9XCJvbkNvbHVtblJlb3JkZXIoJGV2ZW50KVwiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc1wiIGNsYXNzPVwiZC1mbGV4XCIgc2xpY2stZHJvcC1saXN0LWl0ZW0+XHJcblx0XHRcdFx0PGRpdiBzdHlsZT1cIndpZHRoOiAyMHB4XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDJweDtcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi52aXNpYmxlXCIgLz48L2Rpdj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHktMCBmbGV4LWZpbGxcIiBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IGN1cnNvcjogbnMtcmVzaXplXCIgc2xpY2stZHJvcC1saXN0LWdyYWI+e3tjb2x1bW4udGl0bGV9fTwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cdDxzbGljay1kaWFsb2ctZm9vdGVyPlxyXG5cdFx0PGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJjb2wtMTIgdGV4dC1jZW50ZXIgbWItMiBtdC0xXCI+XHJcblx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNhdmVDb2x1bW5zKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIj48aSBjbGFzcz1cImZhciBmYS1zYXZlXCI+PC9pPiZuYnNwO1NhdmU8L2J1dHRvbj4mbmJzcDtcclxuXHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKGNsaWNrKT1cIm9uQ2FuY2VsQ29sdW1ucygpXCI+Q2FuY2VsPC9idXR0b24+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L3NsaWNrLWRpYWxvZy1mb290ZXI+XHJcbjwvc2xpY2stZGlhbG9nPlxyXG5cclxuXHJcbjxzbGljay1jb25maXJtLWRpYWxvZyAjYWRkTmV3RmF2b3JpdGVEaWFsb2dSZWYgd2lkdGg9XCIzMDBcIj5cclxuXHQ8bGFiZWw+RW50ZXIgbmV3IGZhdm9yaXRlIG5hbWU8L2xhYmVsPlxyXG5cdDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG14LTNcIiBzdHlsZT1cIndpZHRoOiAyNTBweFwiIFsobmdNb2RlbCldPVwibmV3RmF2b3JpdGVUZXh0XCIgLz5cclxuPC9zbGljay1jb25maXJtLWRpYWxvZz4iXX0=