@energycap/components 0.31.0 → 0.31.1-ECAP-12439-angular-14.20220901-1019

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 (284) hide show
  1. package/energycap-components.d.ts +1 -3
  2. package/energycap-components.min.css +2 -2
  3. package/esm2020/energycap-components.mjs +5 -0
  4. package/esm2020/lib/components.module.mjs +383 -0
  5. package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
  6. package/esm2020/lib/controls/button/button.component.mjs +106 -0
  7. package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
  8. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
  9. package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
  10. package/esm2020/lib/controls/combobox/combobox.component.mjs +840 -0
  11. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
  12. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
  13. package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
  14. package/esm2020/lib/controls/form-control-base.mjs +143 -0
  15. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  16. package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
  17. package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
  18. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
  19. package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
  20. package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
  21. package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
  22. package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
  23. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  24. package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
  25. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
  26. package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
  27. package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
  28. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
  29. package/esm2020/lib/controls/select/select.component.mjs +87 -0
  30. package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
  31. package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
  32. package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
  33. package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
  34. package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
  35. package/esm2020/lib/core/error.service.mjs +57 -0
  36. package/esm2020/lib/core/scroll.service.mjs +89 -0
  37. package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
  38. package/esm2020/lib/core/telemetry.service.mjs +38 -0
  39. package/esm2020/lib/core/validation-message.service.mjs +181 -0
  40. package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
  41. package/esm2020/lib/core/window.service.mjs +182 -0
  42. package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
  43. package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
  44. package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
  45. package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
  46. package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
  47. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  48. package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
  49. package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
  50. package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
  51. package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
  52. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
  53. package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
  54. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
  55. package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
  56. package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
  57. package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
  58. package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
  59. package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
  60. package/esm2020/lib/display/splash/splash.component.mjs +42 -0
  61. package/esm2020/lib/display/splash/splash.service.mjs +35 -0
  62. package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
  63. package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
  64. package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
  65. package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
  66. package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
  67. package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
  68. package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
  69. package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
  70. package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
  71. package/esm2020/lib/display/table/table.component.mjs +244 -0
  72. package/esm2020/lib/display/tags/tag.mjs +15 -0
  73. package/esm2020/lib/display/tags/tags.component.mjs +77 -0
  74. package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
  75. package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
  76. package/esm2020/lib/display/toast/toast.service.mjs +35 -0
  77. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
  78. package/esm2020/lib/display/tree/tree.component.mjs +125 -0
  79. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  80. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  81. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  82. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
  83. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  84. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  85. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
  86. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  87. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  88. package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
  89. package/esm2020/lib/shared/form-group.helper.mjs +67 -0
  90. package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
  91. package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
  92. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
  93. package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
  94. package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
  95. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +115 -0
  96. package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
  97. package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
  98. package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
  99. package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
  100. package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
  101. package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
  102. package/esm2020/lib/shared/user-preference.service.mjs +17 -0
  103. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  104. package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
  105. package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
  106. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  107. package/fesm2015/energycap-components.mjs +10002 -0
  108. package/fesm2015/energycap-components.mjs.map +1 -0
  109. package/fesm2020/energycap-components.mjs +9912 -0
  110. package/fesm2020/energycap-components.mjs.map +1 -0
  111. package/lib/components.module.d.ts +71 -0
  112. package/lib/controls/banner/banner.component.d.ts +3 -0
  113. package/lib/controls/button/button.component.d.ts +3 -0
  114. package/lib/controls/button/copy-button.directive.d.ts +3 -0
  115. package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
  116. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
  117. package/lib/controls/combobox/combobox.component.d.ts +3 -0
  118. package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
  119. package/lib/controls/file-upload/file-upload.component.d.ts +3 -0
  120. package/lib/controls/form-control/form-control.component.d.ts +3 -0
  121. package/lib/controls/form-control-base.d.ts +3 -0
  122. package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
  123. package/lib/controls/form-group/form-group.component.d.ts +3 -0
  124. package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
  125. package/lib/controls/item-picker/item-picker.component.d.ts +3 -0
  126. package/lib/controls/link-button/link-button.component.d.ts +3 -0
  127. package/lib/controls/menu/menu.component.d.ts +3 -0
  128. package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
  129. package/lib/controls/numericbox/numericbox.component.d.ts +3 -0
  130. package/lib/controls/popover/popover.component.d.ts +3 -0
  131. package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
  132. package/lib/controls/select/select.component.d.ts +3 -0
  133. package/lib/controls/tabs/tabs.component.d.ts +3 -0
  134. package/lib/controls/textbox/textbox.component.d.ts +3 -0
  135. package/lib/core/cache.service.d.ts +3 -0
  136. package/lib/core/error.service.d.ts +3 -0
  137. package/lib/core/scroll.service.d.ts +3 -0
  138. package/lib/core/telemetry-tracker.service.d.ts +3 -0
  139. package/lib/core/telemetry.service.d.ts +3 -0
  140. package/lib/core/validation-message.service.d.ts +3 -0
  141. package/lib/core/window.service.d.ts +3 -0
  142. package/lib/display/app-bar/app-bar.component.d.ts +3 -0
  143. package/lib/display/avatar/avatar.component.d.ts +3 -0
  144. package/lib/display/avatar/avatar.service.d.ts +3 -0
  145. package/lib/display/confirm/confirm.component.d.ts +3 -0
  146. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
  147. package/lib/display/dialog/dialog.component.d.ts +3 -0
  148. package/lib/display/dialog/dialog.service.d.ts +3 -0
  149. package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
  150. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
  151. package/lib/display/item-display/item-display.component.d.ts +3 -0
  152. package/lib/display/json-display/json-display.component.d.ts +3 -0
  153. package/lib/display/resizable/resizable-base.d.ts +3 -0
  154. package/lib/display/resizable/resizable.component.d.ts +3 -0
  155. package/lib/display/spinner/spinner.component.d.ts +3 -0
  156. package/lib/display/splash/splash.component.d.ts +3 -0
  157. package/lib/display/splash/splash.service.d.ts +3 -0
  158. package/lib/display/table/resizable-column.component.d.ts +3 -0
  159. package/lib/display/table/resizable-table.directive.d.ts +3 -0
  160. package/lib/display/table/searchable-table.component.d.ts +3 -0
  161. package/lib/display/table/table-detail-row.component.d.ts +3 -0
  162. package/lib/display/table/table-locked-column.component.d.ts +3 -0
  163. package/lib/display/table/table-master-header-row.component.d.ts +3 -0
  164. package/lib/display/table/table-master-row.component.d.ts +3 -0
  165. package/lib/display/table/table-pagination.component.d.ts +3 -0
  166. package/lib/display/table/table-selectable-row.component.d.ts +3 -0
  167. package/lib/display/table/table.component.d.ts +3 -0
  168. package/lib/display/tags/tags.component.d.ts +3 -0
  169. package/lib/display/toast/toast/toast.component.d.ts +3 -0
  170. package/lib/display/toast/toast.service.d.ts +3 -0
  171. package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
  172. package/lib/display/tree/tree.component.d.ts +3 -0
  173. package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
  174. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
  175. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
  176. package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
  177. package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
  178. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
  179. package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
  180. package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
  181. package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
  182. package/lib/shared/form-group.helper.d.ts +3 -0
  183. package/lib/shared/page/page-base/page-base.component.d.ts +3 -0
  184. package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
  185. package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
  186. package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
  187. package/lib/shared/user-preference.service.d.ts +3 -0
  188. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
  189. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
  190. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
  191. package/package.json +25 -13
  192. package/src/styles/_functions.scss +6 -4
  193. package/src/styles/_global-variables.scss +1 -0
  194. package/src/styles/mixins/_control-base.scss +2 -2
  195. package/src/styles/mixins/_form-control-base.scss +3 -1
  196. package/src/styles/mixins/_spinner-base.scss +3 -1
  197. package/bundles/energycap-components.umd.js +0 -10552
  198. package/bundles/energycap-components.umd.js.map +0 -1
  199. package/bundles/energycap-components.umd.min.js +0 -17
  200. package/bundles/energycap-components.umd.min.js.map +0 -1
  201. package/energycap-components.metadata.json +0 -1
  202. package/esm2015/energycap-components.js +0 -8
  203. package/esm2015/lib/components.module.js +0 -235
  204. package/esm2015/lib/controls/banner/banner.component.js +0 -94
  205. package/esm2015/lib/controls/button/button.component.js +0 -89
  206. package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
  207. package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
  208. package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
  209. package/esm2015/lib/controls/combobox/combobox.component.js +0 -818
  210. package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
  211. package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
  212. package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
  213. package/esm2015/lib/controls/form-control-base.js +0 -140
  214. package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
  215. package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
  216. package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
  217. package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
  218. package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
  219. package/esm2015/lib/controls/menu/menu.component.js +0 -424
  220. package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
  221. package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
  222. package/esm2015/lib/controls/popover/popover.component.js +0 -85
  223. package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
  224. package/esm2015/lib/controls/select/select.component.js +0 -89
  225. package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
  226. package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
  227. package/esm2015/lib/core/error.service.js +0 -56
  228. package/esm2015/lib/core/scroll.service.js +0 -88
  229. package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
  230. package/esm2015/lib/core/telemetry.service.js +0 -40
  231. package/esm2015/lib/core/validation-message.service.js +0 -185
  232. package/esm2015/lib/core/window.service.js +0 -191
  233. package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
  234. package/esm2015/lib/display/avatar/avatar.component.js +0 -73
  235. package/esm2015/lib/display/confirm/confirm.component.js +0 -127
  236. package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
  237. package/esm2015/lib/display/dialog/dialog.component.js +0 -229
  238. package/esm2015/lib/display/dialog/dialog.service.js +0 -69
  239. package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
  240. package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
  241. package/esm2015/lib/display/item-display/item-display.component.js +0 -57
  242. package/esm2015/lib/display/json-display/json-display.component.js +0 -44
  243. package/esm2015/lib/display/resizable/resizable-base.js +0 -119
  244. package/esm2015/lib/display/resizable/resizable.component.js +0 -57
  245. package/esm2015/lib/display/spinner/spinner.component.js +0 -12
  246. package/esm2015/lib/display/splash/splash.component.js +0 -45
  247. package/esm2015/lib/display/splash/splash.service.js +0 -34
  248. package/esm2015/lib/display/table/resizable-column.component.js +0 -23
  249. package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
  250. package/esm2015/lib/display/table/searchable-table.component.js +0 -303
  251. package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
  252. package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
  253. package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
  254. package/esm2015/lib/display/table/table-master-row.component.js +0 -141
  255. package/esm2015/lib/display/table/table-pagination.component.js +0 -146
  256. package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
  257. package/esm2015/lib/display/table/table.component.js +0 -210
  258. package/esm2015/lib/display/tags/tag.js +0 -15
  259. package/esm2015/lib/display/tags/tags.component.js +0 -73
  260. package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
  261. package/esm2015/lib/display/toast/toast.service.js +0 -34
  262. package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
  263. package/esm2015/lib/display/tree/tree.component.js +0 -100
  264. package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
  265. package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
  266. package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
  267. package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
  268. package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
  269. package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
  270. package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
  271. package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
  272. package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
  273. package/esm2015/lib/shared/form-group.helper.js +0 -65
  274. package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
  275. package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
  276. package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -89
  277. package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
  278. package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
  279. package/esm2015/lib/shared/user-preference.service.js +0 -15
  280. package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
  281. package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
  282. package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
  283. package/fesm2015/energycap-components.js +0 -9549
  284. package/fesm2015/energycap-components.js.map +0 -1
@@ -0,0 +1,235 @@
1
+ import { Component, HostBinding, HostListener, Input } from '@angular/core';
2
+ import { FormArray, FormControl } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
4
+ import { debounceTime, takeUntil } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./table-locked-column.component";
7
+ import * as i2 from "../../controls/checkbox/checkbox.component";
8
+ import * as i3 from "@angular/common";
9
+ export class TableSelectableRowContext {
10
+ constructor() {
11
+ /**specify the form control to use for the selectAll checkbox or provide your own.
12
+ * This can be useful if you want to subscribe to changes to change button states as the selection changes
13
+ * or if you want to add it to an already-existing form group
14
+ */
15
+ this.selectAllCheckbox = new FormControl(false);
16
+ /**specify the FormArray to use for the dependent checkboxes of the selectAll checkbox
17
+ * The dependent checkboxes will add and remove themselves automatically and the selectAll
18
+ * box will react accordingly. Do not provide your own controls
19
+ * This can be useful if you want to subscribe to changes to change button states as the selection changes
20
+ * or if you want to add it to an already-existing form group
21
+ */
22
+ this.rowCheckboxes = new FormArray([]);
23
+ /**The index of the last row the user clicked. This allows multiple directives on a screen to coordinate
24
+ * for reacting to shift+click actions that should automatically select multiple rows between the clicked rows
25
+ * defaults to -1 to indicate that no user click has been captured
26
+ */
27
+ this.lastClickedIndex = -1;
28
+ /**A subject that is triggered when a row-based directive is added or removed. It allows
29
+ * the master checkbox in the header to know that it needs to reset tracking information
30
+ * without replacing the actual FormArray that the hosting component may be subscribed to for changes
31
+ */
32
+ this.rowAddedOrRemoved = new Subject();
33
+ /**
34
+ * Set to true to disable Shift-Click/Ctrl-Click functionality
35
+ */
36
+ this.disableAdvancedRowClickBehavior = false;
37
+ /**
38
+ * Set to list of indices of controls that should not toggle when master/header checkbox toggles
39
+ */
40
+ this.nonDependentCheckboxes = [];
41
+ }
42
+ }
43
+ export class TableSelectableRowComponent {
44
+ constructor() {
45
+ /**The ID root to use for the checkbox and table cell */
46
+ this.id = '';
47
+ this._selectionEnabled = true;
48
+ /*Required for all rows. The row index this component represents, to allow it to know how to handle shift+clicks.
49
+ Defaults to -1 which will cause the directive to behave as a header row*/
50
+ this.rowIndex = -1;
51
+ /**The options used to lock the checkbox column to the left of the table, must be modified by host
52
+ * if the checkbox is not the first column in the table
53
+ */
54
+ this.lockedColOptions = { border: false, left: 0 };
55
+ /** Automatically set to true based on checkbox state, used to highlight the row to match our table selected row styles */
56
+ this.isSelected = false;
57
+ /** Automatically set to true if no rowIndex is provided or the row index is less than zero */
58
+ this.isHeader = false;
59
+ /**
60
+ * Set to true if you want the checkbox to be disabled.
61
+ *
62
+ * When you use this property, make sure you set `disableAdvancedRowClickBehavior: true`
63
+ * in the `TableSelectableRowContext`, or undesired side-effects will occur.
64
+ */
65
+ this.isCheckboxDisabled = false;
66
+ /* A reference that we can change when a control is replaced to force the master checkbox reference to update
67
+ without also replacing the form array that the host component may be watching for selected row changes */
68
+ this.dependentCheckboxesReference = { controls: [] };
69
+ this.checkboxAttributeID = '';
70
+ /**Sends an event when the component is destroyed so that it can unsubscribe from any observables */
71
+ this.destroyed = new Subject();
72
+ }
73
+ /** Disables the selection functionality when false */
74
+ set isSelectionEnabled(value) { this._selectionEnabled = value !== false; }
75
+ get isSelectionEnabled() { return this._selectionEnabled; }
76
+ /**Validate and populate the context as the table is dynamically built. Because the context is shared between the
77
+ * header and each of the rows, changes to it can be used to determine what is happening and hook up the correct
78
+ * subscriptions for selectAll. The user can provide an existing formArray for the rows and form control for the header,
79
+ * or it can just be the default empty ones created by the context class.
80
+ */
81
+ ngOnInit() {
82
+ this.isHeader = this.rowIndex < 0;
83
+ if (!this.context) {
84
+ console.error('ecTableSelectableRow requires a defined SelectableTableRowContext to be shared with all instances in one table.');
85
+ }
86
+ else {
87
+ let rowCheckbox = this.context?.rowCheckboxes?.at(this.rowIndex);
88
+ if (!this.isHeader && !rowCheckbox) {
89
+ rowCheckbox = new FormControl(this.isSelected);
90
+ this.context?.rowCheckboxes.push(rowCheckbox);
91
+ }
92
+ this.formControl = this.isHeader ? this.context.selectAllCheckbox : rowCheckbox;
93
+ this.watchForChanges();
94
+ }
95
+ }
96
+ /**Watch for changes to the row index that can occur if the table is reordered in-place instead of
97
+ * recreated from scratch. Re-capture the correct form control to keep everything in sync
98
+ */
99
+ ngOnChanges(changes) {
100
+ if (changes.rowIndex && !this.isHeader) {
101
+ this.formControl = this.context.rowCheckboxes.at(this.rowIndex);
102
+ this.checkboxAttributeID = `${this.id}_row${this.rowIndex}_ecCheckbox`;
103
+ }
104
+ if (changes.isSelectionEnabled && !this.isSelectionEnabled && this.formControl?.value === true) {
105
+ this.formControl.setValue(false);
106
+ }
107
+ if (changes.isSelected && this.formControl) {
108
+ this.formControl.setValue(this.isSelected);
109
+ }
110
+ }
111
+ /** Tell the header checkbox to refresh the selectAll subscription because a row was removed*/
112
+ ngOnDestroy() {
113
+ if (!this.isHeader && this.formControl) {
114
+ this.context.rowAddedOrRemoved.next();
115
+ //find the location in the array that matches the checkbox. If many rows are being removed it may not match rowIndex yet
116
+ let matchIndex = this.context.rowCheckboxes.controls.findIndex(c => c == this.formControl);
117
+ if (matchIndex >= 0) {
118
+ this.context.rowCheckboxes.removeAt(matchIndex);
119
+ }
120
+ }
121
+ }
122
+ /**Handle when a user clicks on a table row (or something inside it which bubbles up) to increase the hit area for row selection
123
+ * Only work on the table body (not the header) because the header may have other click handlers for sort etc that we don't care about.
124
+ * Handle shift and control select as well as checkbox click like windows explorer or the original bill lists do.
125
+ */
126
+ rowClicked(event) {
127
+ if (!this.isHeader && this.isSelectionEnabled && !this.isCheckboxDisabled) {
128
+ let targetEl = event?.target;
129
+ //clicking on a row always toggles that row. Sometimes the shift-select will toggle it back
130
+ this.formControl.setValue(!this.formControl.value);
131
+ if (!this.context.disableAdvancedRowClickBehavior) {
132
+ this.handleShiftSelect(event);
133
+ }
134
+ }
135
+ }
136
+ watchForChanges() {
137
+ //watch for rows being replaced so that the master checkbox and shift-select support can be reset to match
138
+ //this keeps the master in sync as the table changes pages etc and stops unexpected rows from being selected after redraw
139
+ if (this.isHeader) {
140
+ this.context.rowAddedOrRemoved.pipe(debounceTime(10), takeUntil(this.destroyed)).subscribe(() => {
141
+ this.context.lastClickedIndex = -1;
142
+ // exclude nonDependentCheckboxes (some may not be allowed to be deselected)
143
+ let dependentCheckboxes = [];
144
+ this.context.rowCheckboxes.controls.forEach((control, index) => {
145
+ if (!this.context.nonDependentCheckboxes.includes(index)) {
146
+ dependentCheckboxes.push(control);
147
+ }
148
+ });
149
+ this.dependentCheckboxesReference = { controls: dependentCheckboxes };
150
+ });
151
+ }
152
+ else {
153
+ this.context.rowAddedOrRemoved.next();
154
+ //watch for the checkbox state to change on a child row and set the row isSelected class / highlight to match
155
+ //this way the rows match even if external code updates the form model
156
+ this.formControl?.valueChanges.pipe(takeUntil(this.destroyed)).subscribe((value) => {
157
+ this.isSelected = value;
158
+ });
159
+ }
160
+ }
161
+ /**
162
+ * If they are holding the shift key, try to select all the checkboxes between their last selection
163
+ * and most recent selection. The logic is setup to behave the way windows explorer behaves
164
+ * We don't allow drag-to-select like the kendo tables, but it means users can highlight text and copy+paste to excel etc
165
+ * so I think this is actually preferable
166
+ */
167
+ handleShiftSelect(event) {
168
+ let lastIndex = this.context.lastClickedIndex;
169
+ let curIndex = this.rowIndex;
170
+ if (event.shiftKey && lastIndex >= 0) {
171
+ this.clearAllRows();
172
+ if (curIndex > lastIndex) {
173
+ for (var index = lastIndex; index <= curIndex; index++) {
174
+ this.context.rowCheckboxes.at(index).setValue(true);
175
+ }
176
+ }
177
+ else if (curIndex < lastIndex) {
178
+ for (var index = lastIndex; index >= curIndex; index--) {
179
+ this.context.rowCheckboxes.at(index).setValue(true);
180
+ }
181
+ }
182
+ else if (curIndex === lastIndex) {
183
+ this.formControl.setValue(true);
184
+ }
185
+ document.getSelection()?.removeAllRanges();
186
+ }
187
+ else {
188
+ //record the current row index for future row clicks to know where they last interacted
189
+ //but only if they don't have shift down for this click. If shift is down then the next shift+click
190
+ //should be considered an extension (or contraction) of the original multi-row selection
191
+ this.context.lastClickedIndex = this.rowIndex;
192
+ }
193
+ }
194
+ clearAllRows() {
195
+ this.context.rowCheckboxes.controls.forEach(control => control.setValue(false));
196
+ }
197
+ }
198
+ TableSelectableRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TableSelectableRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
199
+ TableSelectableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: { id: "id", isSelectionEnabled: ["ecTableSelectableRow", "isSelectionEnabled"], context: ["selectionContext", "context"], rowIndex: "rowIndex", lockedColOptions: "lockedColOptions", isSelected: "isSelected", isCheckboxDisabled: "isCheckboxDisabled" }, host: { listeners: { "click": "rowClicked($event)" }, properties: { "attr.id": "this.id", "class.is-enabled": "this.isSelectionEnabled", "class.is-selected": "this.isSelected", "class.is-header": "this.isHeader" } }, usesOnChanges: true, ngImport: i0, template: "<!-- any elements of the existing table row that must go before the row selection checkbox can be marked with a class of before-checkbox -->\r\n<ng-content select=\".before-checkbox\"></ng-content>\r\n<ng-container *ngIf=\"isSelectionEnabled\">\r\n <th *ngIf=\"isHeader\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <ec-checkbox id=\"{{id}}_selectAll\"\r\n class=\"m-0\"\r\n *ngIf=\"context?.selectAllCheckbox\"\r\n [formModel]=\"context?.selectAllCheckbox\"\r\n [dependentCheckboxesGroup]=\"dependentCheckboxesReference\"\r\n [ignoreDisabledDependents]=\"false\">\r\n </ec-checkbox>\r\n </th>\r\n <td *ngIf=\"!isHeader && formControl\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <!-- Use [readonly] and not [disabled] for isCheckboxDisabled to prevent user interaction\r\n and allow the value to be visible to other components (for example, when they subscribe\r\n to valueChanges on the FormArray that contains all the checkbox FormControls). -->\r\n <ec-checkbox id=\"{{id}}_row{{rowIndex}}_checkbox\"\r\n [readonly]=\"isCheckboxDisabled\"\r\n [attr.id]=\"checkboxAttributeID\"\r\n class=\"m-0 row-checkbox\"\r\n [formModel]=\"formControl\">\r\n </ec-checkbox>\r\n </td>\r\n</ng-container>\r\n<!-- The rest of the table row -->\r\n<ng-content></ng-content>", styles: [":host.is-enabled:not(.is-header){cursor:pointer}:host .checkbox{padding-left:1px;padding-right:1px;width:1.125rem}:host .checkbox:first-child{padding-left:.5rem;width:1.5625rem}:host.border-bottom-0 .checkbox{border-bottom:0}td.checkbox ec-checkbox ::ng-deep *{pointer-events:none}th.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-th, middle)}td.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-td, top)}\n"], components: [{ type: i1.TableLockedColumnComponent, selector: "[ecTableLockedColumn]", inputs: ["ecTableLockedColumn"] }, { type: i2.CheckboxComponent, selector: "ec-checkbox", inputs: ["name", "dependentCheckboxesGroup", "ignoreDisabledDependents"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TableSelectableRowComponent, decorators: [{
201
+ type: Component,
202
+ args: [{ selector: '[ecTableSelectableRow]', template: "<!-- any elements of the existing table row that must go before the row selection checkbox can be marked with a class of before-checkbox -->\r\n<ng-content select=\".before-checkbox\"></ng-content>\r\n<ng-container *ngIf=\"isSelectionEnabled\">\r\n <th *ngIf=\"isHeader\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <ec-checkbox id=\"{{id}}_selectAll\"\r\n class=\"m-0\"\r\n *ngIf=\"context?.selectAllCheckbox\"\r\n [formModel]=\"context?.selectAllCheckbox\"\r\n [dependentCheckboxesGroup]=\"dependentCheckboxesReference\"\r\n [ignoreDisabledDependents]=\"false\">\r\n </ec-checkbox>\r\n </th>\r\n <td *ngIf=\"!isHeader && formControl\"\r\n class=\"checkbox\"\r\n [ecTableLockedColumn]=\"lockedColOptions\">\r\n <!-- Use [readonly] and not [disabled] for isCheckboxDisabled to prevent user interaction\r\n and allow the value to be visible to other components (for example, when they subscribe\r\n to valueChanges on the FormArray that contains all the checkbox FormControls). -->\r\n <ec-checkbox id=\"{{id}}_row{{rowIndex}}_checkbox\"\r\n [readonly]=\"isCheckboxDisabled\"\r\n [attr.id]=\"checkboxAttributeID\"\r\n class=\"m-0 row-checkbox\"\r\n [formModel]=\"formControl\">\r\n </ec-checkbox>\r\n </td>\r\n</ng-container>\r\n<!-- The rest of the table row -->\r\n<ng-content></ng-content>", styles: [":host.is-enabled:not(.is-header){cursor:pointer}:host .checkbox{padding-left:1px;padding-right:1px;width:1.125rem}:host .checkbox:first-child{padding-left:.5rem;width:1.5625rem}:host.border-bottom-0 .checkbox{border-bottom:0}td.checkbox ec-checkbox ::ng-deep *{pointer-events:none}th.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-th, middle)}td.checkbox{vertical-align:var(--ec-table-selectable-row-vertical-align-checkbox-td, top)}\n"] }]
203
+ }], propDecorators: { id: [{
204
+ type: HostBinding,
205
+ args: ['attr.id']
206
+ }, {
207
+ type: Input
208
+ }], isSelectionEnabled: [{
209
+ type: HostBinding,
210
+ args: ['class.is-enabled']
211
+ }, {
212
+ type: Input,
213
+ args: ['ecTableSelectableRow']
214
+ }], context: [{
215
+ type: Input,
216
+ args: ['selectionContext']
217
+ }], rowIndex: [{
218
+ type: Input
219
+ }], lockedColOptions: [{
220
+ type: Input
221
+ }], isSelected: [{
222
+ type: HostBinding,
223
+ args: ['class.is-selected']
224
+ }, {
225
+ type: Input
226
+ }], isHeader: [{
227
+ type: HostBinding,
228
+ args: ['class.is-header']
229
+ }], isCheckboxDisabled: [{
230
+ type: Input
231
+ }], rowClicked: [{
232
+ type: HostListener,
233
+ args: ['click', ['$event']]
234
+ }] } });
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFtQixTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUV6RCxNQUFNLE9BQU8seUJBQXlCO0lBQXRDO1FBQ0U7OztXQUdHO1FBQ0ksc0JBQWlCLEdBQW9CLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5FOzs7OztXQUtHO1FBQ0ksa0JBQWEsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwRDs7O1dBR0c7UUFDSSxxQkFBZ0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUVyQzs7O1dBR0c7UUFDSSxzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUV4RDs7V0FFRztRQUNJLG9DQUErQixHQUFZLEtBQUssQ0FBQztRQUV4RDs7V0FFRztRQUNJLDJCQUFzQixHQUFhLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0NBQUE7QUFPRCxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTUUsd0RB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QUFDLFNBQVM7O3NCQUNyQixLQUFLO2dCQU1LLGtCQUFrQjtzQkFGNUIsV0FBVzt1QkFBQyxrQkFBa0I7O3NCQUM5QixLQUFLO3VCQUFDLHNCQUFzQjtnQkFRdEIsT0FBTztzQkFEYixLQUFLO3VCQUFDLGtCQUFrQjtnQkFNbEIsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFNQyxVQUFVO3NCQUZoQixXQUFXO3VCQUFDLG1CQUFtQjs7c0JBQy9CLEtBQUs7Z0JBS0MsUUFBUTtzQkFEZCxXQUFXO3VCQUFDLGlCQUFpQjtnQkFVdkIsa0JBQWtCO3NCQUR4QixLQUFLO2dCQXlFQyxVQUFVO3NCQURoQixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQge1xyXG4gIC8qKnNwZWNpZnkgdGhlIGZvcm0gY29udHJvbCB0byB1c2UgZm9yIHRoZSBzZWxlY3RBbGwgY2hlY2tib3ggb3IgcHJvdmlkZSB5b3VyIG93bi5cclxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5nZXMgdG8gY2hhbmdlIGJ1dHRvbiBzdGF0ZXMgYXMgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICogb3IgaWYgeW91IHdhbnQgdG8gYWRkIGl0IHRvIGFuIGFscmVhZHktZXhpc3RpbmcgZm9ybSBncm91cFxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RBbGxDaGVja2JveDogQWJzdHJhY3RDb250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlKTtcclxuXHJcbiAgLyoqc3BlY2lmeSB0aGUgRm9ybUFycmF5IHRvIHVzZSBmb3IgdGhlIGRlcGVuZGVudCBjaGVja2JveGVzIG9mIHRoZSBzZWxlY3RBbGwgY2hlY2tib3hcclxuICAgKiBUaGUgZGVwZW5kZW50IGNoZWNrYm94ZXMgd2lsbCBhZGQgYW5kIHJlbW92ZSB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHkgYW5kIHRoZSBzZWxlY3RBbGxcclxuICAgKiBib3ggd2lsbCByZWFjdCBhY2NvcmRpbmdseS4gRG8gbm90IHByb3ZpZGUgeW91ciBvd24gY29udHJvbHNcclxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5nZXMgdG8gY2hhbmdlIGJ1dHRvbiBzdGF0ZXMgYXMgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICogb3IgaWYgeW91IHdhbnQgdG8gYWRkIGl0IHRvIGFuIGFscmVhZHktZXhpc3RpbmcgZm9ybSBncm91cFxyXG4gICAqL1xyXG4gIHB1YmxpYyByb3dDaGVja2JveGVzOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcclxuXHJcbiAgLyoqVGhlIGluZGV4IG9mIHRoZSBsYXN0IHJvdyB0aGUgdXNlciBjbGlja2VkLiBUaGlzIGFsbG93cyBtdWx0aXBsZSBkaXJlY3RpdmVzIG9uIGEgc2NyZWVuIHRvIGNvb3JkaW5hdGVcclxuICAgKiBmb3IgcmVhY3RpbmcgdG8gc2hpZnQrY2xpY2sgYWN0aW9ucyB0aGF0IHNob3VsZCBhdXRvbWF0aWNhbGx5IHNlbGVjdCBtdWx0aXBsZSByb3dzIGJldHdlZW4gdGhlIGNsaWNrZWQgcm93c1xyXG4gICAqIGRlZmF1bHRzIHRvIC0xIHRvIGluZGljYXRlIHRoYXQgbm8gdXNlciBjbGljayBoYXMgYmVlbiBjYXB0dXJlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBsYXN0Q2xpY2tlZEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLyoqQSBzdWJqZWN0IHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gYSByb3ctYmFzZWQgZGlyZWN0aXZlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIEl0IGFsbG93c1xyXG4gICAqIHRoZSBtYXN0ZXIgY2hlY2tib3ggaW4gdGhlIGhlYWRlciB0byBrbm93IHRoYXQgaXQgbmVlZHMgdG8gcmVzZXQgdHJhY2tpbmcgaW5mb3JtYXRpb25cclxuICAgKiB3aXRob3V0IHJlcGxhY2luZyB0aGUgYWN0dWFsIEZvcm1BcnJheSB0aGF0IHRoZSBob3N0aW5nIGNvbXBvbmVudCBtYXkgYmUgc3Vic2NyaWJlZCB0byBmb3IgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyByb3dBZGRlZE9yUmVtb3ZlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgU2hpZnQtQ2xpY2svQ3RybC1DbGljayBmdW5jdGlvbmFsaXR5XHJcbiAgICovXHJcbiAgcHVibGljIGRpc2FibGVBZHZhbmNlZFJvd0NsaWNrQmVoYXZpb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIGxpc3Qgb2YgaW5kaWNlcyBvZiBjb250cm9scyB0aGF0IHNob3VsZCBub3QgdG9nZ2xlIHdoZW4gbWFzdGVyL2hlYWRlciBjaGVja2JveCB0b2dnbGVzXHJcbiAgICovXHJcbiAgcHVibGljIG5vbkRlcGVuZGVudENoZWNrYm94ZXM6IG51bWJlcltdID0gW107XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW2VjVGFibGVTZWxlY3RhYmxlUm93XScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLXNlbGVjdGFibGUtcm93LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1zZWxlY3RhYmxlLXJvdy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZVNlbGVjdGFibGVSb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvKipUaGUgSUQgcm9vdCB0byB1c2UgZm9yIHRoZSBjaGVja2JveCBhbmQgdGFibGUgY2VsbCAqL1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogRGlzYWJsZXMgdGhlIHNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5IHdoZW4gZmFsc2UgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLWVuYWJsZWQnKVxyXG4gIEBJbnB1dCgnZWNUYWJsZVNlbGVjdGFibGVSb3cnKVxyXG4gIHB1YmxpYyBzZXQgaXNTZWxlY3Rpb25FbmFibGVkKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkgeyB0aGlzLl9zZWxlY3Rpb25FbmFibGVkID0gdmFsdWUgIT09IGZhbHNlOyB9XHJcbiAgcHVibGljIGdldCBpc1NlbGVjdGlvbkVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3Rpb25FbmFibGVkOyB9XHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlNoYXJlZCBjb250ZXh0IGJldHdlZW4gbWFzdGVyIGFuZCBjaGlsZHJlbi4gQ2hpbGQgZGlyZWN0aXZlIGFkZHMgaXRzIG93biBGb3JtQ29udHJvbCB0byB0aGlzXHJcbiAgYW5kIHJlbW92ZXMgaXQgb25EZXN0cm95LiBUaGUgc2FtZSBjb250ZXh0IG9iamVjdCBtdXN0IGJlIHVzZWQgZm9yIGFsbCBkaXJlY3RpdmVzIGluIGEgc2luZ2xlIHRhYmxlKi9cclxuICBASW5wdXQoJ3NlbGVjdGlvbkNvbnRleHQnKVxyXG4gIHB1YmxpYyBjb250ZXh0ITogVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dDtcclxuXHJcbiAgLypSZXF1aXJlZCBmb3IgYWxsIHJvd3MuIFRoZSByb3cgaW5kZXggdGhpcyBjb21wb25lbnQgcmVwcmVzZW50cywgdG8gYWxsb3cgaXQgdG8ga25vdyBob3cgdG8gaGFuZGxlIHNoaWZ0K2NsaWNrcy5cclxuICAgIERlZmF1bHRzIHRvIC0xIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGRpcmVjdGl2ZSB0byBiZWhhdmUgYXMgYSBoZWFkZXIgcm93Ki9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByb3dJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8qKlRoZSBvcHRpb25zIHVzZWQgdG8gbG9jayB0aGUgY2hlY2tib3ggY29sdW1uIHRvIHRoZSBsZWZ0IG9mIHRoZSB0YWJsZSwgbXVzdCBiZSBtb2RpZmllZCBieSBob3N0XHJcbiAgICogaWYgdGhlIGNoZWNrYm94IGlzIG5vdCB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSB0YWJsZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxvY2tlZENvbE9wdGlvbnM6IHsgYm9yZGVyOiBib29sZWFuLCBsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlciB9ID0geyBib3JkZXI6IGZhbHNlLCBsZWZ0OiAwIH07XHJcblxyXG4gIC8qKiBBdXRvbWF0aWNhbGx5IHNldCB0byB0cnVlIGJhc2VkIG9uIGNoZWNrYm94IHN0YXRlLCB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgcm93IHRvIG1hdGNoIG91ciB0YWJsZSBzZWxlY3RlZCByb3cgc3R5bGVzICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1zZWxlY3RlZCcpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogQXV0b21hdGljYWxseSBzZXQgdG8gdHJ1ZSBpZiBubyByb3dJbmRleCBpcyBwcm92aWRlZCBvciB0aGUgcm93IGluZGV4IGlzIGxlc3MgdGhhbiB6ZXJvICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1oZWFkZXInKVxyXG4gIHB1YmxpYyBpc0hlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgY2hlY2tib3ggdG8gYmUgZGlzYWJsZWQuXHJcbiAgICpcclxuICAgKiBXaGVuIHlvdSB1c2UgdGhpcyBwcm9wZXJ0eSwgbWFrZSBzdXJlIHlvdSBzZXQgYGRpc2FibGVBZHZhbmNlZFJvd0NsaWNrQmVoYXZpb3I6IHRydWVgXHJcbiAgICogaW4gdGhlIGBUYWJsZVNlbGVjdGFibGVSb3dDb250ZXh0YCwgb3IgdW5kZXNpcmVkIHNpZGUtZWZmZWN0cyB3aWxsIG9jY3VyLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlzQ2hlY2tib3hEaXNhYmxlZD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyogQSByZWZlcmVuY2UgdGhhdCB3ZSBjYW4gY2hhbmdlIHdoZW4gYSBjb250cm9sIGlzIHJlcGxhY2VkIHRvIGZvcmNlIHRoZSBtYXN0ZXIgY2hlY2tib3ggcmVmZXJlbmNlIHRvIHVwZGF0ZVxyXG4gICAgIHdpdGhvdXQgYWxzbyByZXBsYWNpbmcgdGhlIGZvcm0gYXJyYXkgdGhhdCB0aGUgaG9zdCBjb21wb25lbnQgbWF5IGJlIHdhdGNoaW5nIGZvciBzZWxlY3RlZCByb3cgY2hhbmdlcyAqL1xyXG4gIHB1YmxpYyBkZXBlbmRlbnRDaGVja2JveGVzUmVmZXJlbmNlOiB7IGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSB9ID0geyBjb250cm9sczogW10gfTtcclxuXHJcbiAgLypDYXB0dXJlIHRoZSBmb3JtIGNvbnRyb2wgdGhpcyBjb21wb25lbnQgY3JlYXRlcyB0byBhbGxvdyBjbGVhbnVwIGxhdGVyIG9uIGFuZCBleHBvc2UgaXQgdG8gdGhlIHJvdyovXHJcbiAgcHVibGljIGZvcm1Db250cm9sITogQWJzdHJhY3RDb250cm9sO1xyXG5cclxuICBwdWJsaWMgY2hlY2tib3hBdHRyaWJ1dGVJRDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlNlbmRzIGFuIGV2ZW50IHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgc28gdGhhdCBpdCBjYW4gdW5zdWJzY3JpYmUgZnJvbSBhbnkgb2JzZXJ2YWJsZXMgKi9cclxuICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIC8qKlZhbGlkYXRlIGFuZCBwb3B1bGF0ZSB0aGUgY29udGV4dCBhcyB0aGUgdGFibGUgaXMgZHluYW1pY2FsbHkgYnVpbHQuIEJlY2F1c2UgdGhlIGNvbnRleHQgaXMgc2hhcmVkIGJldHdlZW4gdGhlXHJcbiAgICogaGVhZGVyIGFuZCBlYWNoIG9mIHRoZSByb3dzLCBjaGFuZ2VzIHRvIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IGlzIGhhcHBlbmluZyBhbmQgaG9vayB1cCB0aGUgY29ycmVjdFxyXG4gICAqIHN1YnNjcmlwdGlvbnMgZm9yIHNlbGVjdEFsbC4gVGhlIHVzZXIgY2FuIHByb3ZpZGUgYW4gZXhpc3RpbmcgZm9ybUFycmF5IGZvciB0aGUgcm93cyBhbmQgZm9ybSBjb250cm9sIGZvciB0aGUgaGVhZGVyLFxyXG4gICAqIG9yIGl0IGNhbiBqdXN0IGJlIHRoZSBkZWZhdWx0IGVtcHR5IG9uZXMgY3JlYXRlZCBieSB0aGUgY29udGV4dCBjbGFzcy5cclxuICAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaXNIZWFkZXIgPSB0aGlzLnJvd0luZGV4IDwgMDtcclxuICAgIGlmICghdGhpcy5jb250ZXh0KSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2VjVGFibGVTZWxlY3RhYmxlUm93IHJlcXVpcmVzIGEgZGVmaW5lZCBTZWxlY3RhYmxlVGFibGVSb3dDb250ZXh0IHRvIGJlIHNoYXJlZCB3aXRoIGFsbCBpbnN0YW5jZXMgaW4gb25lIHRhYmxlLicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHJvd0NoZWNrYm94ID0gdGhpcy5jb250ZXh0Py5yb3dDaGVja2JveGVzPy5hdCh0aGlzLnJvd0luZGV4KTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0hlYWRlciAmJiAhcm93Q2hlY2tib3gpIHtcclxuICAgICAgICByb3dDaGVja2JveCA9IG5ldyBGb3JtQ29udHJvbCh0aGlzLmlzU2VsZWN0ZWQpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dD8ucm93Q2hlY2tib3hlcy5wdXNoKHJvd0NoZWNrYm94KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuaXNIZWFkZXIgPyB0aGlzLmNvbnRleHQuc2VsZWN0QWxsQ2hlY2tib3ggOiByb3dDaGVja2JveDtcclxuICAgICAgdGhpcy53YXRjaEZvckNoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKldhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSByb3cgaW5kZXggdGhhdCBjYW4gb2NjdXIgaWYgdGhlIHRhYmxlIGlzIHJlb3JkZXJlZCBpbi1wbGFjZSBpbnN0ZWFkIG9mXHJcbiAgICogcmVjcmVhdGVkIGZyb20gc2NyYXRjaC4gUmUtY2FwdHVyZSB0aGUgY29ycmVjdCBmb3JtIGNvbnRyb2wgdG8ga2VlcCBldmVyeXRoaW5nIGluIHN5bmNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucm93SW5kZXggJiYgIXRoaXMuaXNIZWFkZXIpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuY29udGV4dC5yb3dDaGVja2JveGVzLmF0KHRoaXMucm93SW5kZXgpO1xyXG4gICAgICB0aGlzLmNoZWNrYm94QXR0cmlidXRlSUQgPSBgJHt0aGlzLmlkfV9yb3cke3RoaXMucm93SW5kZXh9X2VjQ2hlY2tib3hgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmlzU2VsZWN0aW9uRW5hYmxlZCAmJiAhdGhpcy5pc1NlbGVjdGlvbkVuYWJsZWQgJiYgdGhpcy5mb3JtQ29udHJvbD8udmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaXNTZWxlY3RlZCAmJiB0aGlzLmZvcm1Db250cm9sKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5pc1NlbGVjdGVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUZWxsIHRoZSBoZWFkZXIgY2hlY2tib3ggdG8gcmVmcmVzaCB0aGUgc2VsZWN0QWxsIHN1YnNjcmlwdGlvbiBiZWNhdXNlIGEgcm93IHdhcyByZW1vdmVkKi9cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNIZWFkZXIgJiYgdGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmNvbnRleHQucm93QWRkZWRPclJlbW92ZWQubmV4dCgpO1xyXG5cclxuICAgICAgLy9maW5kIHRoZSBsb2NhdGlvbiBpbiB0aGUgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBjaGVja2JveC4gSWYgbWFueSByb3dzIGFyZSBiZWluZyByZW1vdmVkIGl0IG1heSBub3QgbWF0Y2ggcm93SW5kZXggeWV0XHJcbiAgICAgIGxldCBtYXRjaEluZGV4ID0gdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuY29udHJvbHMuZmluZEluZGV4KGMgPT4gYyA9PSB0aGlzLmZvcm1Db250cm9sKTtcclxuICAgICAgaWYgKG1hdGNoSW5kZXggPj0gMCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5yb3dDaGVja2JveGVzLnJlbW92ZUF0KG1hdGNoSW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipIYW5kbGUgd2hlbiBhIHVzZXIgY2xpY2tzIG9uIGEgdGFibGUgcm93IChvciBzb21ldGhpbmcgaW5zaWRlIGl0IHdoaWNoIGJ1YmJsZXMgdXApIHRvIGluY3JlYXNlIHRoZSBoaXQgYXJlYSBmb3Igcm93IHNlbGVjdGlvblxyXG4gICAqIE9ubHkgd29yayBvbiB0aGUgdGFibGUgYm9keSAobm90IHRoZSBoZWFkZXIpIGJlY2F1c2UgdGhlIGhlYWRlciBtYXkgaGF2ZSBvdGhlciBjbGljayBoYW5kbGVycyBmb3Igc29ydCBldGMgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LlxyXG4gICAqIEhhbmRsZSBzaGlmdCBhbmQgY29udHJvbCBzZWxlY3QgYXMgd2VsbCBhcyBjaGVja2JveCBjbGljayBsaWtlIHdpbmRvd3MgZXhwbG9yZXIgb3IgdGhlIG9yaWdpbmFsIGJpbGwgbGlzdHMgZG8uXHJcbiAgKi9cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIHJvd0NsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc0hlYWRlciAmJiB0aGlzLmlzU2VsZWN0aW9uRW5hYmxlZCAmJiAhdGhpcy5pc0NoZWNrYm94RGlzYWJsZWQpIHtcclxuICAgICAgbGV0IHRhcmdldEVsID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIC8vY2xpY2tpbmcgb24gYSByb3cgYWx3YXlzIHRvZ2dsZXMgdGhhdCByb3cuIFNvbWV0aW1lcyB0aGUgc2hpZnQtc2VsZWN0IHdpbGwgdG9nZ2xlIGl0IGJhY2tcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSghdGhpcy5mb3JtQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuY29udGV4dC5kaXNhYmxlQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTaGlmdFNlbGVjdChldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2F0Y2hGb3JDaGFuZ2VzKCkge1xyXG4gICAgLy93YXRjaCBmb3Igcm93cyBiZWluZyByZXBsYWNlZCBzbyB0aGF0IHRoZSBtYXN0ZXIgY2hlY2tib3ggYW5kIHNoaWZ0LXNlbGVjdCBzdXBwb3J0IGNhbiBiZSByZXNldCB0byBtYXRjaFxyXG4gICAgLy90aGlzIGtlZXBzIHRoZSBtYXN0ZXIgaW4gc3luYyBhcyB0aGUgdGFibGUgY2hhbmdlcyBwYWdlcyBldGMgYW5kIHN0b3BzIHVuZXhwZWN0ZWQgcm93cyBmcm9tIGJlaW5nIHNlbGVjdGVkIGFmdGVyIHJlZHJhd1xyXG4gICAgaWYgKHRoaXMuaXNIZWFkZXIpIHtcclxuICAgICAgdGhpcy5jb250ZXh0LnJvd0FkZGVkT3JSZW1vdmVkLnBpcGUoZGVib3VuY2VUaW1lKDEwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHQubGFzdENsaWNrZWRJbmRleCA9IC0xO1xyXG5cclxuICAgICAgICAvLyBleGNsdWRlIG5vbkRlcGVuZGVudENoZWNrYm94ZXMgKHNvbWUgbWF5IG5vdCBiZSBhbGxvd2VkIHRvIGJlIGRlc2VsZWN0ZWQpXHJcbiAgICAgICAgbGV0IGRlcGVuZGVudENoZWNrYm94ZXM6IEFic3RyYWN0Q29udHJvbFtdID0gW107XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0Lm5vbkRlcGVuZGVudENoZWNrYm94ZXMuaW5jbHVkZXMoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgIGRlcGVuZGVudENoZWNrYm94ZXMucHVzaChjb250cm9sKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbnRDaGVja2JveGVzUmVmZXJlbmNlID0geyBjb250cm9sczogZGVwZW5kZW50Q2hlY2tib3hlcyB9O1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yb3dBZGRlZE9yUmVtb3ZlZC5uZXh0KCk7XHJcblxyXG4gICAgICAvL3dhdGNoIGZvciB0aGUgY2hlY2tib3ggc3RhdGUgdG8gY2hhbmdlIG9uIGEgY2hpbGQgcm93IGFuZCBzZXQgdGhlIHJvdyBpc1NlbGVjdGVkIGNsYXNzIC8gaGlnaGxpZ2h0IHRvIG1hdGNoXHJcbiAgICAgIC8vdGhpcyB3YXkgdGhlIHJvd3MgbWF0Y2ggZXZlbiBpZiBleHRlcm5hbCBjb2RlIHVwZGF0ZXMgdGhlIGZvcm0gbW9kZWxcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbD8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZCA9IHZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICogSWYgdGhleSBhcmUgaG9sZGluZyB0aGUgc2hpZnQga2V5LCB0cnkgdG8gc2VsZWN0IGFsbCB0aGUgY2hlY2tib3hlcyBiZXR3ZWVuIHRoZWlyIGxhc3Qgc2VsZWN0aW9uXHJcbiAgICAqIGFuZCBtb3N0IHJlY2VudCBzZWxlY3Rpb24uIFRoZSBsb2dpYyBpcyBzZXR1cCB0byBiZWhhdmUgdGhlIHdheSB3aW5kb3dzIGV4cGxvcmVyIGJlaGF2ZXNcclxuICAgICogV2UgZG9uJ3QgYWxsb3cgZHJhZy10by1zZWxlY3QgbGlrZSB0aGUga2VuZG8gdGFibGVzLCBidXQgaXQgbWVhbnMgdXNlcnMgY2FuIGhpZ2hsaWdodCB0ZXh0IGFuZCBjb3B5K3Bhc3RlIHRvIGV4Y2VsIGV0Y1xyXG4gICAgKiBzbyBJIHRoaW5rIHRoaXMgaXMgYWN0dWFsbHkgcHJlZmVyYWJsZVxyXG4gICAgKi9cclxuICBwcml2YXRlIGhhbmRsZVNoaWZ0U2VsZWN0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBsZXQgbGFzdEluZGV4ID0gdGhpcy5jb250ZXh0Lmxhc3RDbGlja2VkSW5kZXg7XHJcbiAgICBsZXQgY3VySW5kZXggPSB0aGlzLnJvd0luZGV4O1xyXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGxhc3RJbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxSb3dzKCk7XHJcbiAgICAgIGlmIChjdXJJbmRleCA+IGxhc3RJbmRleCkge1xyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gbGFzdEluZGV4OyBpbmRleCA8PSBjdXJJbmRleDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuYXQoaW5kZXgpLnNldFZhbHVlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjdXJJbmRleCA8IGxhc3RJbmRleCkge1xyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gbGFzdEluZGV4OyBpbmRleCA+PSBjdXJJbmRleDsgaW5kZXgtLSkge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuYXQoaW5kZXgpLnNldFZhbHVlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjdXJJbmRleCA9PT0gbGFzdEluZGV4KSB7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9yZWNvcmQgdGhlIGN1cnJlbnQgcm93IGluZGV4IGZvciBmdXR1cmUgcm93IGNsaWNrcyB0byBrbm93IHdoZXJlIHRoZXkgbGFzdCBpbnRlcmFjdGVkXHJcbiAgICAgIC8vYnV0IG9ubHkgaWYgdGhleSBkb24ndCBoYXZlIHNoaWZ0IGRvd24gZm9yIHRoaXMgY2xpY2suIElmIHNoaWZ0IGlzIGRvd24gdGhlbiB0aGUgbmV4dCBzaGlmdCtjbGlja1xyXG4gICAgICAvL3Nob3VsZCBiZSBjb25zaWRlcmVkIGFuIGV4dGVuc2lvbiAob3IgY29udHJhY3Rpb24pIG9mIHRoZSBvcmlnaW5hbCBtdWx0aS1yb3cgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuY29udGV4dC5sYXN0Q2xpY2tlZEluZGV4ID0gdGhpcy5yb3dJbmRleDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBbGxSb3dzKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LnJvd0NoZWNrYm94ZXMuY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IGNvbnRyb2wuc2V0VmFsdWUoZmFsc2UpKTtcclxuICB9XHJcbn1cclxuIiwiPCEtLSBhbnkgZWxlbWVudHMgb2YgdGhlIGV4aXN0aW5nIHRhYmxlIHJvdyB0aGF0IG11c3QgZ28gYmVmb3JlIHRoZSByb3cgc2VsZWN0aW9uIGNoZWNrYm94IGNhbiBiZSBtYXJrZWQgd2l0aCBhIGNsYXNzIG9mIGJlZm9yZS1jaGVja2JveCAtLT5cclxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmJlZm9yZS1jaGVja2JveFwiPjwvbmctY29udGVudD5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2VsZWN0aW9uRW5hYmxlZFwiPlxyXG4gIDx0aCAqbmdJZj1cImlzSGVhZGVyXCJcclxuICAgICAgY2xhc3M9XCJjaGVja2JveFwiXHJcbiAgICAgIFtlY1RhYmxlTG9ja2VkQ29sdW1uXT1cImxvY2tlZENvbE9wdGlvbnNcIj5cclxuICAgIDxlYy1jaGVja2JveCBpZD1cInt7aWR9fV9zZWxlY3RBbGxcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwibS0wXCJcclxuICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRleHQ/LnNlbGVjdEFsbENoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cImNvbnRleHQ/LnNlbGVjdEFsbENoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICBbZGVwZW5kZW50Q2hlY2tib3hlc0dyb3VwXT1cImRlcGVuZGVudENoZWNrYm94ZXNSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgICAgICAgIFtpZ25vcmVEaXNhYmxlZERlcGVuZGVudHNdPVwiZmFsc2VcIj5cclxuICAgIDwvZWMtY2hlY2tib3g+XHJcbiAgPC90aD5cclxuICA8dGQgKm5nSWY9XCIhaXNIZWFkZXIgJiYgZm9ybUNvbnRyb2xcIlxyXG4gICAgICBjbGFzcz1cImNoZWNrYm94XCJcclxuICAgICAgW2VjVGFibGVMb2NrZWRDb2x1bW5dPVwibG9ja2VkQ29sT3B0aW9uc1wiPlxyXG4gICAgPCEtLSBVc2UgW3JlYWRvbmx5XSBhbmQgbm90IFtkaXNhYmxlZF0gZm9yIGlzQ2hlY2tib3hEaXNhYmxlZCB0byBwcmV2ZW50IHVzZXIgaW50ZXJhY3Rpb25cclxuICAgICAgICAgYW5kIGFsbG93IHRoZSB2YWx1ZSB0byBiZSB2aXNpYmxlIHRvIG90aGVyIGNvbXBvbmVudHMgKGZvciBleGFtcGxlLCB3aGVuIHRoZXkgc3Vic2NyaWJlXHJcbiAgICAgICAgIHRvIHZhbHVlQ2hhbmdlcyBvbiB0aGUgRm9ybUFycmF5IHRoYXQgY29udGFpbnMgYWxsIHRoZSBjaGVja2JveCBGb3JtQ29udHJvbHMpLiAtLT5cclxuICAgIDxlYy1jaGVja2JveCBpZD1cInt7aWR9fV9yb3d7e3Jvd0luZGV4fX1fY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc0NoZWNrYm94RGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNoZWNrYm94QXR0cmlidXRlSURcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwibS0wIHJvdy1jaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJmb3JtQ29udHJvbFwiPlxyXG4gICAgPC9lYy1jaGVja2JveD5cclxuICA8L3RkPlxyXG48L25nLWNvbnRhaW5lcj5cclxuPCEtLSBUaGUgcmVzdCBvZiB0aGUgdGFibGUgcm93IC0tPlxyXG48bmctY29udGVudD48L25nLWNvbnRlbnQ+Il19
@@ -0,0 +1,244 @@
1
+ import { Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { isEqual } from 'lodash';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import { ResizableColumnComponent } from './resizable-column.component';
6
+ import { TableMasterRowComponent } from './table-master-row.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "./resizable-table.directive";
10
+ export class TableComponent {
11
+ constructor(renderer, el) {
12
+ this.renderer = renderer;
13
+ this.el = el;
14
+ this.id = '';
15
+ /**
16
+ * Enables table scrolling with a sticky header and footer. Use
17
+ * <thead> and <tfoot> elements for styles to be applied correctly.
18
+ */
19
+ this.scrollable = false;
20
+ /**
21
+ * Enables resizable table columns. Apply the 'is-resizable' class
22
+ * to the <th> of a table column than can be resized.
23
+ */
24
+ this.resizable = false;
25
+ /**
26
+ * Turns on condensed table styling. By default a condensed table
27
+ * has no row borders. To show borders, apply the 'has-borders' class
28
+ * to the <ec-table> element
29
+ */
30
+ this.condensed = false;
31
+ /**
32
+ * Enables sorting by clicking on table columns. To make a column sortable
33
+ * apply the `data-sortable` attribute to the columns `<th>` element with
34
+ * the value of the field used to sort the column. When a column is clicked
35
+ * the fields and current sort direction is emitted from the `sortChange`
36
+ * output
37
+ *
38
+ * @example
39
+ * ```html
40
+ * <ec-table [sortable]="true" [sort]="currentSort" (sortChange)="onSort($event)">
41
+ * <thead>
42
+ * <th data-sortable="name">Name</th>
43
+ * <th data-sortable="qty">Qty.</th>
44
+ * <th data-sortable="price">Price</th>
45
+ * </thead>
46
+ * ...
47
+ * </ec-table>
48
+ * ```
49
+ */
50
+ this.sortable = false;
51
+ /** Set to true if selectionContext is defined */
52
+ this.selectable = false;
53
+ /** Hides/shows the selection toolbar template when 1 or more rows is selected */
54
+ this.hasSelection = false;
55
+ /**
56
+ * Enables form table styling to allow form controls inside table cells.
57
+ */
58
+ this.isForm = false;
59
+ /**
60
+ * Emits the new sort value whenever a sortable column is clicked
61
+ */
62
+ this.sortChange = new EventEmitter();
63
+ /**
64
+ * True if a TableMasterRowComponent exists in the table content
65
+ */
66
+ this.hasMasterDetailRows = false;
67
+ /**
68
+ * Unlisten function returned by `renderer.listen()` that are called
69
+ * OnDestroy to clean up all listeners
70
+ */
71
+ this.unlisteners = [];
72
+ /** A map of sortable `<th>` elements */
73
+ this.sortableCols = {};
74
+ this.destroyed = new Subject();
75
+ }
76
+ ngOnChanges(changes) {
77
+ if (this.sortable && changes.sort && changes.sort.currentValue && !changes.sort.firstChange) {
78
+ const newValue = changes.sort.currentValue;
79
+ if (!this.currentSort || !isEqual(newValue, this.currentSort)) {
80
+ this.onSort(newValue.field, newValue.direction);
81
+ }
82
+ }
83
+ }
84
+ ngAfterContentInit() {
85
+ this.hasMasterDetailRows = !!this.masterRows.length;
86
+ this.masterRows.changes.pipe(takeUntil(this.destroyed)).subscribe(() => {
87
+ this.hasMasterDetailRows = !!this.masterRows.length;
88
+ });
89
+ this.resizableColumns = this.searchableTableResizableColumns || this._resizableColumns;
90
+ }
91
+ ngAfterViewInit() {
92
+ if (this.sortable) {
93
+ this.initSortable();
94
+ }
95
+ if (this.selectable) {
96
+ this.initSelectable();
97
+ }
98
+ }
99
+ ngOnDestroy() {
100
+ if (this.unlisteners.length) {
101
+ this.unlisteners.forEach(unlisten => unlisten());
102
+ }
103
+ this.destroyed.next();
104
+ this.destroyed.unsubscribe();
105
+ }
106
+ /**
107
+ * Get all elements inside the host element that match a selector
108
+ * @param selector - Any valid selector for [querySelectorAll](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll)
109
+ */
110
+ queryElements(selector) {
111
+ const table = this.el.nativeElement;
112
+ return Array.from(table.querySelectorAll(selector));
113
+ }
114
+ /**
115
+ * Store a `<th>` for each sortable column and attach a click
116
+ * event listener.
117
+ */
118
+ initSortable() {
119
+ this.queryElements('th').forEach(th => {
120
+ if (th.hasAttribute('data-sortfield')) {
121
+ const field = th.getAttribute('data-sortfield');
122
+ if (field) {
123
+ this.sortableCols[field] = th;
124
+ const unlisten = this.renderer.listen(th, 'click', (event) => {
125
+ // Do not sort if the event target was the resizable handle
126
+ if (th.classList.contains('is-resizable') && event.target && event.target.classList.contains('handle')) {
127
+ return;
128
+ }
129
+ this.onSort(field);
130
+ });
131
+ // Store unlisten function to remove listener when component is destroyed
132
+ this.unlisteners.push(unlisten);
133
+ }
134
+ else {
135
+ console.error(`data-sortfield attribute was not assigned a value.`, th);
136
+ }
137
+ }
138
+ });
139
+ // Set the initial sort
140
+ if (this.sort) {
141
+ this.onSort(this.sort.field, this.sort.direction);
142
+ }
143
+ }
144
+ /**
145
+ * Find the sorted column and apply the desc or asc class in order
146
+ * to show the correct sort icon. If another field was sorted, reset it.
147
+ * Emit the current field and direction of the sorted column
148
+ * @param field
149
+ */
150
+ onSort(field, direction) {
151
+ const th = this.sortableCols[field];
152
+ if (!th) {
153
+ return;
154
+ }
155
+ if (this.currentSort && this.currentSort.field !== field) {
156
+ this.renderer.removeClass(this.sortableCols[this.currentSort.field], `is-sorted-${this.currentSort.direction}`);
157
+ }
158
+ if (th.classList.contains('is-sorted-desc')) {
159
+ this.renderer.removeClass(th, 'is-sorted-desc');
160
+ if (!direction) {
161
+ direction = 'asc';
162
+ }
163
+ }
164
+ else {
165
+ if (th.classList.contains('is-sorted-asc')) {
166
+ this.renderer.removeClass(th, 'is-sorted-asc');
167
+ }
168
+ if (!direction) {
169
+ direction = 'desc';
170
+ }
171
+ }
172
+ this.renderer.addClass(th, `is-sorted-${direction}`);
173
+ const sortEvent = { field: field, direction: direction };
174
+ this.currentSort = sortEvent;
175
+ this.sortChange.emit(sortEvent);
176
+ }
177
+ initSelectable() {
178
+ this.selectionContext.rowCheckboxes.valueChanges.pipe(takeUntil(this.destroyed)).subscribe((value) => {
179
+ this.hasSelection = value.some(v => v);
180
+ });
181
+ }
182
+ }
183
+ TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TableComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
184
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: TableComponent, selector: "ec-table", inputs: { id: "id", scrollable: "scrollable", resizable: "resizable", condensed: "condensed", sortable: "sortable", selectionContext: "selectionContext", selectionToolbarTemplate: "selectionToolbarTemplate", selectable: "selectable", isForm: "isForm", sort: "sort", searchableTableResizableColumns: ["resizableColumns", "searchableTableResizableColumns"] }, outputs: { sortChange: "sortChange" }, host: { properties: { "attr.id": "this.id", "class.is-scrollable": "this.scrollable", "class.is-resizable": "this.resizable", "class.is-condensed": "this.condensed", "class.is-sortable": "this.sortable", "class.is-selectable": "this.selectable", "class.is-form-table": "this.isForm", "class.is-master-detail": "this.hasMasterDetailRows" } }, queries: [{ propertyName: "masterRows", predicate: TableMasterRowComponent, descendants: true }, { propertyName: "_resizableColumns", predicate: ResizableColumnComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"selectable-table-toolbar\"\r\n *ngIf=\"hasSelection && selectionToolbarTemplate\">\r\n <ng-container *ngTemplateOutlet=\"selectionToolbarTemplate\"></ng-container>\r\n</div>\r\n<div id=\"{{id}}-scroll-container\" \r\n class=\"table-scroll-container\">\r\n <table class=\"main-table\"\r\n id=\"{{id}}\"\r\n [ecResizableTable]=\"resizable\"\r\n [containerEl]=\"el\"\r\n [sortableTable]=\"sortable\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </table>\r\n</div>", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}ec-table{display:flex;position:relative;min-height:0}ec-table .table-scroll-container{flex:1 1;min-height:0;overflow-y:auto}ec-table .main-table{border-collapse:separate;border-spacing:0;width:100%;font-size:var(--ec-font-size-label)}ec-table .main-table th{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid var(--ec-border-color-dark);color:var(--ec-color-secondary-dark);font-weight:400;vertical-align:middle}ec-table .main-table th:first-child{padding-left:1rem}ec-table .main-table th:last-child{padding-right:1rem}ec-table .main-table td{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-top:1px solid var(--ec-border-color);vertical-align:top}ec-table .main-table td:first-child{padding-left:1rem}ec-table .main-table td:last-child{padding-right:1rem}ec-table .main-table tbody>tr:first-child td{border-top:0}ec-table .main-table tbody>tr.is-error td{background-color:var(--ec-background-color-danger)}ec-table .main-table tbody>tr.is-success td{background-color:var(--ec-background-color-success)}ec-table .main-table tfoot td{font-weight:700}ec-table .main-table tbody>tr.is-selected>td,ec-table .main-table tbody>tr.is-selected{background-color:var(--ec-background-color-selected)}ec-table .main-table tr.is-heading td{color:var(--ec-color-secondary-dark);font-size:var(--ec-font-size-label);font-weight:var(--ec-font-weight-bold);line-height:1.333333333;text-transform:uppercase;padding-bottom:0;vertical-align:bottom;border-top:0}ec-table .main-table tr.is-heading+tr td{border-top:0}ec-table .main-table th.actions-col,ec-table .main-table td.actions-col{padding:0}ec-table .main-table th.actions-1,ec-table .main-table td.actions-1{width:2.0625rem}ec-table .main-table th.actions-2,ec-table .main-table td.actions-2{width:4.0625rem}ec-table .main-table th.actions-3,ec-table .main-table td.actions-3{width:6.0625rem}ec-table .main-table th.actions-4,ec-table .main-table td.actions-4{width:8.0625rem}ec-table .main-table th.actions-5,ec-table .main-table td.actions-5{width:10.0625rem}ec-table.is-condensed th,ec-table.is-condensed td{padding-top:.25rem;padding-bottom:.25rem;height:1.5rem}ec-table.is-condensed:not(.has-borders)>table td{border-bottom-width:0;border-top-width:0}ec-table .selectable-table-toolbar{align-items:center;background-color:var(--ec-background-color);border-bottom:1px solid var(--ec-border-color-dark);display:flex;padding:0 .5rem;position:absolute;left:calc(var(--selection-toolbar-left, 0rem) + 1.5625rem);top:0;height:3rem;right:0;z-index:4}ec-table.is-scrollable>.table-scroll-container>table{position:relative}ec-table.is-scrollable>.table-scroll-container>table>thead th{background-color:var(--ec-background-color);position:sticky!important;top:0;z-index:1}ec-table.is-scrollable>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color);position:sticky!important;bottom:0;z-index:1}ec-table.is-scrollable.bg-body>.table-scroll-container>table>thead th{background-color:var(--ec-background-color-body)}ec-table.is-scrollable.bg-body>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color-body)}ec-table.is-sortable th[data-sortfield]{-webkit-user-select:none;user-select:none}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper{display:flex;cursor:pointer}ec-table.is-sortable th[data-sortfield].is-resizable .content{flex:0 1 auto}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper:after{flex:none;content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after,ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-asc .content-wrapper:after{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield].is-resizable.text-right .content-wrapper{flex-direction:row-reverse}ec-table.is-sortable th[data-sortfield]:not(.is-resizable){cursor:pointer}ec-table.is-sortable th[data-sortfield]:not(.is-resizable):after{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-asc:after{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:after{content:\"\";display:none!important}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:before{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-asc:before{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before{transform:scaleY(-1)}ec-table.is-resizable .main-table{table-layout:fixed;width:100%}ec-table.is-resizable th.is-resizable{position:relative;overflow:visible;z-index:1}ec-table.is-resizable th.is-resizable.is-active{-webkit-user-select:none;user-select:none}ec-table.is-resizable th.is-resizable.is-active .handle:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle{position:absolute;right:-7px;width:13px;height:100%;top:0;padding:0 5px;z-index:var(--ec-z-index-splitter);right:0;padding:.5rem 0 .5rem 10px}ec-table.is-resizable th.is-resizable .handle:after{content:\"\";display:block;transition:background-color .3s ease;height:100%;position:relative}ec-table.is-resizable th.is-resizable .handle:hover{cursor:col-resize}ec-table.is-resizable th.is-resizable .handle:hover:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle:before{content:\"\";display:block;width:1px;background-color:var(--ec-border-color-legacy);position:absolute;top:.5rem;bottom:.5rem;right:0}ec-table.is-resizable th.is-resizable .content{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-resizable th.is-resizable:last-child .handle:before{display:none}ec-table.is-resizable td,ec-table.is-resizable th{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-selectable .main-table thead th{height:3rem}ec-table.is-selectable .main-table tbody>tr:hover>td{background-color:var(--ec-background-color-hover);border-color:transparent;cursor:pointer}ec-table.is-selectable .main-table tbody>tr:hover.is-selected{background-color:var(--ec-background-color-selected)}ec-table.is-selectable .main-table tbody>tr:hover+tr>td{border-color:var(--ec-background-color-hover)}ec-table.is-selectable th.is-resizable .handle{padding-top:1rem;padding-bottom:1rem}ec-table.is-selectable th.is-resizable .handle:before{top:1rem;bottom:1rem}ec-table.is-master-detail>table{table-layout:fixed}ec-table.is-form-table td{padding-bottom:.25rem;padding-top:.25rem;height:2.5rem;line-height:2rem;border-top:0;font-size:var(--ec-font-size-body)}ec-table.is-form-table tr:first-child td{padding-top:.5rem;height:2.75rem}ec-table.is-form-table tr:last-child td{padding-bottom:.5rem;height:2.75rem}ec-table.is-fixed .main-table{table-layout:fixed}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.ResizableTableDirective, selector: "[ecResizableTable]", inputs: ["ecResizableTable", "containerEl", "sortableTable", "resizableColumns"] }], encapsulation: i0.ViewEncapsulation.None });
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: TableComponent, decorators: [{
186
+ type: Component,
187
+ args: [{ selector: 'ec-table', encapsulation: ViewEncapsulation.None, template: "<div class=\"selectable-table-toolbar\"\r\n *ngIf=\"hasSelection && selectionToolbarTemplate\">\r\n <ng-container *ngTemplateOutlet=\"selectionToolbarTemplate\"></ng-container>\r\n</div>\r\n<div id=\"{{id}}-scroll-container\" \r\n class=\"table-scroll-container\">\r\n <table class=\"main-table\"\r\n id=\"{{id}}\"\r\n [ecResizableTable]=\"resizable\"\r\n [containerEl]=\"el\"\r\n [sortableTable]=\"sortable\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </table>\r\n</div>", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}ec-table{display:flex;position:relative;min-height:0}ec-table .table-scroll-container{flex:1 1;min-height:0;overflow-y:auto}ec-table .main-table{border-collapse:separate;border-spacing:0;width:100%;font-size:var(--ec-font-size-label)}ec-table .main-table th{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid var(--ec-border-color-dark);color:var(--ec-color-secondary-dark);font-weight:400;vertical-align:middle}ec-table .main-table th:first-child{padding-left:1rem}ec-table .main-table th:last-child{padding-right:1rem}ec-table .main-table td{height:2rem;line-height:1rem;padding:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-top:1px solid var(--ec-border-color);vertical-align:top}ec-table .main-table td:first-child{padding-left:1rem}ec-table .main-table td:last-child{padding-right:1rem}ec-table .main-table tbody>tr:first-child td{border-top:0}ec-table .main-table tbody>tr.is-error td{background-color:var(--ec-background-color-danger)}ec-table .main-table tbody>tr.is-success td{background-color:var(--ec-background-color-success)}ec-table .main-table tfoot td{font-weight:700}ec-table .main-table tbody>tr.is-selected>td,ec-table .main-table tbody>tr.is-selected{background-color:var(--ec-background-color-selected)}ec-table .main-table tr.is-heading td{color:var(--ec-color-secondary-dark);font-size:var(--ec-font-size-label);font-weight:var(--ec-font-weight-bold);line-height:1.333333333;text-transform:uppercase;padding-bottom:0;vertical-align:bottom;border-top:0}ec-table .main-table tr.is-heading+tr td{border-top:0}ec-table .main-table th.actions-col,ec-table .main-table td.actions-col{padding:0}ec-table .main-table th.actions-1,ec-table .main-table td.actions-1{width:2.0625rem}ec-table .main-table th.actions-2,ec-table .main-table td.actions-2{width:4.0625rem}ec-table .main-table th.actions-3,ec-table .main-table td.actions-3{width:6.0625rem}ec-table .main-table th.actions-4,ec-table .main-table td.actions-4{width:8.0625rem}ec-table .main-table th.actions-5,ec-table .main-table td.actions-5{width:10.0625rem}ec-table.is-condensed th,ec-table.is-condensed td{padding-top:.25rem;padding-bottom:.25rem;height:1.5rem}ec-table.is-condensed:not(.has-borders)>table td{border-bottom-width:0;border-top-width:0}ec-table .selectable-table-toolbar{align-items:center;background-color:var(--ec-background-color);border-bottom:1px solid var(--ec-border-color-dark);display:flex;padding:0 .5rem;position:absolute;left:calc(var(--selection-toolbar-left, 0rem) + 1.5625rem);top:0;height:3rem;right:0;z-index:4}ec-table.is-scrollable>.table-scroll-container>table{position:relative}ec-table.is-scrollable>.table-scroll-container>table>thead th{background-color:var(--ec-background-color);position:sticky!important;top:0;z-index:1}ec-table.is-scrollable>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color);position:sticky!important;bottom:0;z-index:1}ec-table.is-scrollable.bg-body>.table-scroll-container>table>thead th{background-color:var(--ec-background-color-body)}ec-table.is-scrollable.bg-body>.table-scroll-container>table>tfoot td{background-color:var(--ec-background-color-body)}ec-table.is-sortable th[data-sortfield]{-webkit-user-select:none;user-select:none}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper{display:flex;cursor:pointer}ec-table.is-sortable th[data-sortfield].is-resizable .content{flex:0 1 auto}ec-table.is-sortable th[data-sortfield].is-resizable .content-wrapper:after{flex:none;content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after,ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-asc .content-wrapper:after{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield].is-resizable.is-sorted-desc .content-wrapper:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield].is-resizable.text-right .content-wrapper{flex-direction:row-reverse}ec-table.is-sortable th[data-sortfield]:not(.is-resizable){cursor:pointer}ec-table.is-sortable th[data-sortfield]:not(.is-resizable):after{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-asc:after{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).is-sorted-desc:after{transform:scaleY(-1)}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:after{content:\"\";display:none!important}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right:before{content:\"\";background-repeat:no-repeat;background-position:center;width:.875rem;height:.875rem;margin:0 .25rem;vertical-align:top;display:none}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before,ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-asc:before{background-image:url('data:image/svg+xml;charset=utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path fill=\"rgba(26, 26, 35, 0.66)\" d=\"M14 8.828V27a2 2 0 1 0 4 0V8.828l4.586 4.586a2 2 0 0 0 2.828-2.828l-8-8a2 2 0 0 0-2.828 0l-8 8a2 2 0 0 0 2.828 2.828L14 8.828z\"/></svg>');display:inline-block}ec-table.is-sortable th[data-sortfield]:not(.is-resizable).text-right.is-sorted-desc:before{transform:scaleY(-1)}ec-table.is-resizable .main-table{table-layout:fixed;width:100%}ec-table.is-resizable th.is-resizable{position:relative;overflow:visible;z-index:1}ec-table.is-resizable th.is-resizable.is-active{-webkit-user-select:none;user-select:none}ec-table.is-resizable th.is-resizable.is-active .handle:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle{position:absolute;right:-7px;width:13px;height:100%;top:0;padding:0 5px;z-index:var(--ec-z-index-splitter);right:0;padding:.5rem 0 .5rem 10px}ec-table.is-resizable th.is-resizable .handle:after{content:\"\";display:block;transition:background-color .3s ease;height:100%;position:relative}ec-table.is-resizable th.is-resizable .handle:hover{cursor:col-resize}ec-table.is-resizable th.is-resizable .handle:hover:after{background-color:var(--ec-color-interactive)}ec-table.is-resizable th.is-resizable .handle:before{content:\"\";display:block;width:1px;background-color:var(--ec-border-color-legacy);position:absolute;top:.5rem;bottom:.5rem;right:0}ec-table.is-resizable th.is-resizable .content{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-resizable th.is-resizable:last-child .handle:before{display:none}ec-table.is-resizable td,ec-table.is-resizable th{overflow:hidden;text-overflow:clip;white-space:nowrap}ec-table.is-selectable .main-table thead th{height:3rem}ec-table.is-selectable .main-table tbody>tr:hover>td{background-color:var(--ec-background-color-hover);border-color:transparent;cursor:pointer}ec-table.is-selectable .main-table tbody>tr:hover.is-selected{background-color:var(--ec-background-color-selected)}ec-table.is-selectable .main-table tbody>tr:hover+tr>td{border-color:var(--ec-background-color-hover)}ec-table.is-selectable th.is-resizable .handle{padding-top:1rem;padding-bottom:1rem}ec-table.is-selectable th.is-resizable .handle:before{top:1rem;bottom:1rem}ec-table.is-master-detail>table{table-layout:fixed}ec-table.is-form-table td{padding-bottom:.25rem;padding-top:.25rem;height:2.5rem;line-height:2rem;border-top:0;font-size:var(--ec-font-size-body)}ec-table.is-form-table tr:first-child td{padding-top:.5rem;height:2.75rem}ec-table.is-form-table tr:last-child td{padding-bottom:.5rem;height:2.75rem}ec-table.is-fixed .main-table{table-layout:fixed}\n"] }]
188
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { id: [{
189
+ type: HostBinding,
190
+ args: ['attr.id']
191
+ }, {
192
+ type: Input
193
+ }], scrollable: [{
194
+ type: HostBinding,
195
+ args: ['class.is-scrollable']
196
+ }, {
197
+ type: Input
198
+ }], resizable: [{
199
+ type: HostBinding,
200
+ args: ['class.is-resizable']
201
+ }, {
202
+ type: Input
203
+ }], condensed: [{
204
+ type: HostBinding,
205
+ args: ['class.is-condensed']
206
+ }, {
207
+ type: Input
208
+ }], sortable: [{
209
+ type: HostBinding,
210
+ args: ['class.is-sortable']
211
+ }, {
212
+ type: Input
213
+ }], selectionContext: [{
214
+ type: Input
215
+ }], selectionToolbarTemplate: [{
216
+ type: Input
217
+ }], selectable: [{
218
+ type: HostBinding,
219
+ args: ['class.is-selectable']
220
+ }, {
221
+ type: Input
222
+ }], isForm: [{
223
+ type: HostBinding,
224
+ args: ['class.is-form-table']
225
+ }, {
226
+ type: Input
227
+ }], sort: [{
228
+ type: Input
229
+ }], sortChange: [{
230
+ type: Output
231
+ }], hasMasterDetailRows: [{
232
+ type: HostBinding,
233
+ args: ['class.is-master-detail']
234
+ }], masterRows: [{
235
+ type: ContentChildren,
236
+ args: [TableMasterRowComponent, { descendants: true }]
237
+ }], _resizableColumns: [{
238
+ type: ContentChildren,
239
+ args: [ResizableColumnComponent, { descendants: true }]
240
+ }], searchableTableResizableColumns: [{
241
+ type: Input,
242
+ args: ['resizableColumns']
243
+ }] } });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsZUFBZSxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQW9ELGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdPLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFldkUsTUFBTSxPQUFPLGNBQWM7SUE0R3pCLFlBQW9CLFFBQW1CLEVBQVMsRUFBYztRQUExQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQTFHckQsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVqQjs7O1dBR0c7UUFFTSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTVCOzs7V0FHRztRQUVNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7Ozs7V0FJRztRQUVNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQWtCRztRQUVNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFhMUIsaURBQWlEO1FBRXhDLGVBQVUs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b3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBRdWVyeUxpc3QsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVzaXphYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemFibGUtY29sdW1uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlTWFzdGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1tYXN0ZXItcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQgfSBmcm9tICcuL3RhYmxlLXNlbGVjdGFibGUtcm93LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgdHlwZSBUYWJsZVNvcnREaXJlY3Rpb24gPSAnZGVzYycgfCAnYXNjJztcclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVNvcnQge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgZGlyZWN0aW9uOiBUYWJsZVNvcnREaXJlY3Rpb247XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0e1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgaWQgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyB0YWJsZSBzY3JvbGxpbmcgd2l0aCBhIHN0aWNreSBoZWFkZXIgYW5kIGZvb3Rlci4gVXNlXHJcbiAgICogPHRoZWFkPiBhbmQgPHRmb290PiBlbGVtZW50cyBmb3Igc3R5bGVzIHRvIGJlIGFwcGxpZWQgY29ycmVjdGx5LiBcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXNjcm9sbGFibGUnKVxyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGUgPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBFbmFibGVzIHJlc2l6YWJsZSB0YWJsZSBjb2x1bW5zLiBBcHBseSB0aGUgJ2lzLXJlc2l6YWJsZScgY2xhc3NcclxuICAgKiB0byB0aGUgPHRoPiBvZiBhIHRhYmxlIGNvbHVtbiB0aGFuIGNhbiBiZSByZXNpemVkLlxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtcmVzaXphYmxlJylcclxuICBASW5wdXQoKSByZXNpemFibGUgPSBmYWxzZTtcclxuICBcclxuICAvKiogXHJcbiAgICogVHVybnMgb24gY29uZGVuc2VkIHRhYmxlIHN0eWxpbmcuIEJ5IGRlZmF1bHQgYSBjb25kZW5zZWQgdGFibGVcclxuICAgKiBoYXMgbm8gcm93IGJvcmRlcnMuIFRvIHNob3cgYm9yZGVycywgYXBwbHkgdGhlICdoYXMtYm9yZGVycycgY2xhc3NcclxuICAgKiB0byB0aGUgPGVjLXRhYmxlPiBlbGVtZW50XHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1jb25kZW5zZWQnKVxyXG4gIEBJbnB1dCgpIGNvbmRlbnNlZCA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKiBcclxuICAgKiBFbmFibGVzIHNvcnRpbmcgYnkgY2xpY2tpbmcgb24gdGFibGUgY29sdW1ucy4gVG8gbWFrZSBhIGNvbHVtbiBzb3J0YWJsZVxyXG4gICAqIGFwcGx5IHRoZSBgZGF0YS1zb3J0YWJsZWAgYXR0cmlidXRlIHRvIHRoZSBjb2x1bW5zIGA8dGg+YCBlbGVtZW50IHdpdGggXHJcbiAgICogdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB1c2VkIHRvIHNvcnQgdGhlIGNvbHVtbi4gV2hlbiBhIGNvbHVtbiBpcyBjbGlja2VkXHJcbiAgICogdGhlIGZpZWxkcyBhbmQgY3VycmVudCBzb3J0IGRpcmVjdGlvbiBpcyBlbWl0dGVkIGZyb20gdGhlIGBzb3J0Q2hhbmdlYFxyXG4gICAqIG91dHB1dFxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgaHRtbFxyXG4gICAqIDxlYy10YWJsZSBbc29ydGFibGVdPVwidHJ1ZVwiIFtzb3J0XT1cImN1cnJlbnRTb3J0XCIgKHNvcnRDaGFuZ2UpPVwib25Tb3J0KCRldmVudClcIj5cclxuICAgKiAgPHRoZWFkPlxyXG4gICAqICAgIDx0aCBkYXRhLXNvcnRhYmxlPVwibmFtZVwiPk5hbWU8L3RoPlxyXG4gICAqICAgIDx0aCBkYXRhLXNvcnRhYmxlPVwicXR5XCI+UXR5LjwvdGg+XHJcbiAgICogICAgPHRoIGRhdGEtc29ydGFibGU9XCJwcmljZVwiPlByaWNlPC90aD5cclxuICAgKiAgPC90aGVhZD5cclxuICAgKiAgLi4uXHJcbiAgICogPC9lYy10YWJsZT5cclxuICAgKiBgYGBcclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXNvcnRhYmxlJylcclxuICBASW5wdXQoKSBzb3J0YWJsZSA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFNoYXJlZCBjb250ZXh0IG9mIFRhYmxlU2VsZWN0YWJsZVJvd0NvbXBvbmVudHMgaW4gdGhlIHRhYmxlLiBXaWxsIHR1cm4gb24gaGlnaGxpZ2h0aW5nIG9uIHJvdyBob3Zlci5cclxuICAgKiBBZGQgdGhlIGBUYWJsZVNlbGVjdGFibGVSb3dDb21wb25lbnRgIHRvIHRoZSB0YWJsZSBjb250ZW50IHRvIGFkZCBjaGVja2JveGVzIHRvIGVhY2ggcm93IGFuZCBhc3NpZ24gYSBcclxuICAgKiBUZW1wbGF0ZVJlZiB0byB0aGUgYFtzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVdYCBpbnB1dCB0aGF0IGluY2x1ZGVzIGFjdGlvbnMgdG8gdGFrZSBvbiBzZWxlY3RlZCBpdGVtcyBcclxuICAgKiB0aGF0IHdpbGwgYXBwZWFyIG92ZXIgdGhlIHRhYmxlIGhlYWRlciB3aGVuIDEgb3IgbW9yZSByb3dzIGFyZSBzZWxlY3RlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Db250ZXh0PzogVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dDtcclxuXHJcbiAgLyoqIEluY2x1ZGUgYWN0aW9ucyB0byBkaXNwbGF5IGluIGEgYmFyIG92ZXIgdGhlIHRhYmxlIGhlYWRlciB3aGVuIDEgb3IgbW9yZSByb3dzIGFyZSBzZWxlY3RlZC4gUmVxdWlyZXMgYFtzZWxlY3Rpb25Db250ZXh0XWAgdG8gYmUgZGVmaW5lZCAqL1xyXG4gIEBJbnB1dCgpIHNlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgXHJcbiAgLyoqIFNldCB0byB0cnVlIGlmIHNlbGVjdGlvbkNvbnRleHQgaXMgZGVmaW5lZCAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtc2VsZWN0YWJsZScpXHJcbiAgQElucHV0KCkgc2VsZWN0YWJsZSA9IGZhbHNlO1xyXG5cclxuICAvKiogSGlkZXMvc2hvd3MgdGhlIHNlbGVjdGlvbiB0b29sYmFyIHRlbXBsYXRlIHdoZW4gMSBvciBtb3JlIHJvd3MgaXMgc2VsZWN0ZWQgKi9cclxuICBoYXNTZWxlY3Rpb24gPSBmYWxzZVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGVzIGZvcm0gdGFibGUgc3R5bGluZyB0byBhbGxvdyBmb3JtIGNvbnRyb2xzIGluc2lkZSB0YWJsZSBjZWxscy5cclxuICAgKi9cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLWZvcm0tdGFibGUnKVxyXG4gIEBJbnB1dCgpIGlzRm9ybSA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFRoZSBjdXJyZW50IHNvcnQgZmllbGQgYW5kIGRpcmVjdGlvbiAoJ2Rlc2MnIG9yICdhc2MnKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNvcnQ/OiBUYWJsZVNvcnQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSBuZXcgc29ydCB2YWx1ZSB3aGVuZXZlciBhIHNvcnRhYmxlIGNvbHVtbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUYWJsZVNvcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBUcnVlIGlmIGEgVGFibGVNYXN0ZXJSb3dDb21wb25lbnQgZXhpc3RzIGluIHRoZSB0YWJsZSBjb250ZW50XHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1tYXN0ZXItZGV0YWlsJykgaGFzTWFzdGVyRGV0YWlsUm93cyA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlTWFzdGVyUm93Q29tcG9uZW50LCB7ZGVzY2VuZGFudHM6IHRydWV9KSBtYXN0ZXJSb3dzITogUXVlcnlMaXN0PFRhYmxlTWFzdGVyUm93Q29tcG9uZW50PjtcclxuXHJcbiAgcHVibGljIHJlc2l6YWJsZUNvbHVtbnMhOiBRdWVyeUxpc3Q8UmVzaXphYmxlQ29sdW1uQ29tcG9uZW50PjtcclxuICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX3Jlc2l6YWJsZUNvbHVtbnMhOiBRdWVyeUxpc3Q8UmVzaXphYmxlQ29sdW1uQ29tcG9uZW50PjtcclxuXHJcbiAgQElucHV0KCdyZXNpemFibGVDb2x1bW5zJykgc2VhcmNoYWJsZVRhYmxlUmVzaXphYmxlQ29sdW1ucz86IFF1ZXJ5TGlzdDxSZXNpemFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG5cclxuICAvKipcclxuICAgKiBVbmxpc3RlbiBmdW5jdGlvbiByZXR1cm5lZCBieSBgcmVuZGVyZXIubGlzdGVuKClgIHRoYXQgYXJlIGNhbGxlZFxyXG4gICAqIE9uRGVzdHJveSB0byBjbGVhbiB1cCBhbGwgbGlzdGVuZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bmxpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuICBcclxuICAvKiogVGhlIGN1cnJlbnQgc29ydCB2YWx1ZSAqL1xyXG4gIHByaXZhdGUgY3VycmVudFNvcnQ/OiBUYWJsZVNvcnQ7XHJcbiAgXHJcbiAgLyoqIEEgbWFwIG9mIHNvcnRhYmxlIGA8dGg+YCBlbGVtZW50cyAqL1xyXG4gIHByaXZhdGUgc29ydGFibGVDb2xzOiB7W2ZpZWxkOiBzdHJpbmddOiBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHVibGljIGVsOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0YWJsZSAmJiBjaGFuZ2VzLnNvcnQgJiYgY2hhbmdlcy5zb3J0LmN1cnJlbnRWYWx1ZSAmJiAhY2hhbmdlcy5zb3J0LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIGNvbnN0IG5ld1ZhbHVlOiBUYWJsZVNvcnQgPSBjaGFuZ2VzLnNvcnQuY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAoIXRoaXMuY3VycmVudFNvcnQgfHwgIWlzRXF1YWwobmV3VmFsdWUsIHRoaXMuY3VycmVudFNvcnQpKXtcclxuICAgICAgICB0aGlzLm9uU29ydChuZXdWYWx1ZS5maWVsZCwgbmV3VmFsdWUuZGlyZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYXNNYXN0ZXJEZXRhaWxSb3dzID0gISF0aGlzLm1hc3RlclJvd3MubGVuZ3RoO1xyXG4gICAgXHJcbiAgICB0aGlzLm1hc3RlclJvd3MuY2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaGFzTWFzdGVyRGV0YWlsUm93cyA9ICEhdGhpcy5tYXN0ZXJSb3dzLmxlbmd0aDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVzaXphYmxlQ29sdW1ucyA9IHRoaXMuc2VhcmNoYWJsZVRhYmxlUmVzaXphYmxlQ29sdW1ucyB8fCB0aGlzLl9yZXNpemFibGVDb2x1bW5zO1xyXG4gIH1cclxuICBcclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0YWJsZSkge1xyXG4gICAgICB0aGlzLmluaXRTb3J0YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgdGhpcy5pbml0U2VsZWN0YWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVubGlzdGVuZXJzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVubGlzdGVuZXJzLmZvckVhY2godW5saXN0ZW4gPT4gdW5saXN0ZW4oKSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGVsZW1lbnRzIGluc2lkZSB0aGUgaG9zdCBlbGVtZW50IHRoYXQgbWF0Y2ggYSBzZWxlY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBbnkgdmFsaWQgc2VsZWN0b3IgZm9yIFtxdWVyeVNlbGVjdG9yQWxsXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbClcclxuICAgKi9cclxuICBwcml2YXRlIHF1ZXJ5RWxlbWVudHM8VD4oc2VsZWN0b3I6IHN0cmluZyk6IFRbXSB7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGEgYDx0aD5gIGZvciBlYWNoIHNvcnRhYmxlIGNvbHVtbiBhbmQgYXR0YWNoIGEgY2xpY2tcclxuICAgKiBldmVudCBsaXN0ZW5lci4gXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0U29ydGFibGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnF1ZXJ5RWxlbWVudHM8SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ+KCd0aCcpLmZvckVhY2godGggPT4ge1xyXG4gICAgICBpZiAodGguaGFzQXR0cmlidXRlKCdkYXRhLXNvcnRmaWVsZCcpKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc29ydGZpZWxkJyk7XHJcbiAgICAgICAgaWYgKGZpZWxkKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnRhYmxlQ29sc1tmaWVsZF0gPSB0aDtcclxuICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGgsICdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gRG8gbm90IHNvcnQgaWYgdGhlIGV2ZW50IHRhcmdldCB3YXMgdGhlIHJlc2l6YWJsZSBoYW5kbGVcclxuICAgICAgICAgICAgaWYgKHRoLmNsYXNzTGlzdC5jb250YWlucygnaXMtcmVzaXphYmxlJykgJiYgZXZlbnQudGFyZ2V0ICYmICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5jbGFzc0xpc3QuY29udGFpbnMoJ2hhbmRsZScpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU29ydChmaWVsZCk7XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIC8vIFN0b3JlIHVubGlzdGVuIGZ1bmN0aW9uIHRvIHJlbW92ZSBsaXN0ZW5lciB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgICAgIHRoaXMudW5saXN0ZW5lcnMucHVzaCh1bmxpc3Rlbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGRhdGEtc29ydGZpZWxkIGF0dHJpYnV0ZSB3YXMgbm90IGFzc2lnbmVkIGEgdmFsdWUuYCwgdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBpbml0aWFsIHNvcnRcclxuICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5vblNvcnQodGhpcy5zb3J0LmZpZWxkLCB0aGlzLnNvcnQuZGlyZWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmQgdGhlIHNvcnRlZCBjb2x1bW4gYW5kIGFwcGx5IHRoZSBkZXNjIG9yIGFzYyBjbGFzcyBpbiBvcmRlclxyXG4gICAqIHRvIHNob3cgdGhlIGNvcnJlY3Qgc29ydCBpY29uLiBJZiBhbm90aGVyIGZpZWxkIHdhcyBzb3J0ZWQsIHJlc2V0IGl0LlxyXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgZmllbGQgYW5kIGRpcmVjdGlvbiBvZiB0aGUgc29ydGVkIGNvbHVtblxyXG4gICAqIEBwYXJhbSBmaWVsZCBcclxuICAgKi9cclxuICBwcml2YXRlIG9uU29ydChmaWVsZDogc3RyaW5nLCBkaXJlY3Rpb24/OiBUYWJsZVNvcnREaXJlY3Rpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IHRoID0gdGhpcy5zb3J0YWJsZUNvbHNbZmllbGRdO1xyXG4gICAgaWYgKCF0aCkgeyByZXR1cm47IH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMuY3VycmVudFNvcnQgJiYgdGhpcy5jdXJyZW50U29ydC5maWVsZCAhPT0gZmllbGQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnNvcnRhYmxlQ29sc1t0aGlzLmN1cnJlbnRTb3J0LmZpZWxkXSwgYGlzLXNvcnRlZC0ke3RoaXMuY3VycmVudFNvcnQuZGlyZWN0aW9ufWApO1xyXG4gICAgfSBcclxuICAgIFxyXG4gICAgaWYgKHRoLmNsYXNzTGlzdC5jb250YWlucygnaXMtc29ydGVkLWRlc2MnKSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoLCAnaXMtc29ydGVkLWRlc2MnKTtcclxuXHJcbiAgICAgIGlmICghZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgZGlyZWN0aW9uID0gJ2FzYyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGguY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1zb3J0ZWQtYXNjJykpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoLCAnaXMtc29ydGVkLWFzYycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRpcmVjdGlvbikge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9ICdkZXNjJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGgsIGBpcy1zb3J0ZWQtJHtkaXJlY3Rpb259YCk7XHJcblxyXG4gICAgY29uc3Qgc29ydEV2ZW50ID0ge2ZpZWxkOiBmaWVsZCwgZGlyZWN0aW9uOiBkaXJlY3Rpb259O1xyXG4gICAgdGhpcy5jdXJyZW50U29ydCA9IHNvcnRFdmVudDtcclxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHNvcnRFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTZWxlY3RhYmxlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0IS5yb3dDaGVja2JveGVzLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW5bXSkgPT4ge1xyXG4gICAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IHZhbHVlLnNvbWUodiA9PiB2KTtcclxuICAgIH0pO1xyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJzZWxlY3RhYmxlLXRhYmxlLXRvb2xiYXJcIlxyXG4gICAgICpuZ0lmPVwiaGFzU2VsZWN0aW9uICYmIHNlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjxkaXYgaWQ9XCJ7e2lkfX0tc2Nyb2xsLWNvbnRhaW5lclwiIFxyXG4gICAgIGNsYXNzPVwidGFibGUtc2Nyb2xsLWNvbnRhaW5lclwiPlxyXG4gIDx0YWJsZSBjbGFzcz1cIm1haW4tdGFibGVcIlxyXG4gICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgIFtlY1Jlc2l6YWJsZVRhYmxlXT1cInJlc2l6YWJsZVwiXHJcbiAgICAgICAgIFtjb250YWluZXJFbF09XCJlbFwiXHJcbiAgICAgICAgIFtzb3J0YWJsZVRhYmxlXT1cInNvcnRhYmxlXCJcclxuICAgICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwicmVzaXphYmxlQ29sdW1uc1wiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PiJdfQ==