@energycap/components 0.40.2-rxjs-7-upgrade.20241219-1425 → 0.41.1-ECAP-27592-angular-17.20241219-1718

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 (258) hide show
  1. package/{esm2020 → esm2022}/energycap-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
  3. package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
  4. package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
  5. package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
  6. package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
  8. package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
  9. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
  10. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
  11. package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
  12. package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
  14. package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
  15. package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
  16. package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
  17. package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
  18. package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
  19. package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
  20. package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
  21. package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  22. package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
  23. package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
  24. package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
  25. package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
  26. package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
  27. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
  28. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
  30. package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
  31. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  32. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
  33. package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
  34. package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
  35. package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
  36. package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
  37. package/esm2022/lib/core/custom-validators.mjs +29 -0
  38. package/esm2022/lib/core/date-time-helper.mjs +220 -0
  39. package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
  40. package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
  41. package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
  42. package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
  43. package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
  44. package/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
  45. package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
  46. package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
  47. package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
  48. package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
  49. package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
  50. package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
  51. package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
  53. package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
  54. package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
  55. package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
  56. package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
  57. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
  58. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  59. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
  60. package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
  61. package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
  62. package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
  63. package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
  64. package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
  65. package/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
  66. package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
  67. package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
  68. package/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
  69. package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
  70. package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
  71. package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
  72. package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
  73. package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
  74. package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
  75. package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
  76. package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
  77. package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
  78. package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
  79. package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
  80. package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
  81. package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
  82. package/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
  83. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
  84. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
  85. package/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
  86. package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
  87. package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
  88. package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
  89. package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
  90. package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
  91. package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
  92. package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
  93. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
  94. package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
  95. package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
  96. package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
  97. package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
  98. package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
  99. package/esm2022/lib/shared/display.mjs +6 -0
  100. package/esm2022/lib/shared/form-group.helper.mjs +67 -0
  101. package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
  102. package/esm2022/lib/shared/lodash-helper.mjs +52 -0
  103. package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
  104. package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
  105. package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
  106. package/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
  107. package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
  108. package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
  109. package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
  110. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
  111. package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
  112. package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
  113. package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
  114. package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
  115. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
  116. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
  117. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
  118. package/{esm2020 → esm2022}/public-api.mjs +114 -114
  119. package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
  120. package/fesm2022/energycap-components.mjs.map +1 -0
  121. package/index.d.ts +5 -5
  122. package/lib/components.module.d.ts +91 -91
  123. package/lib/controls/banner/banner.component.d.ts +50 -50
  124. package/lib/controls/button/button.component.d.ts +78 -78
  125. package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
  126. package/lib/controls/button/copy-button.directive.d.ts +14 -14
  127. package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
  128. package/lib/controls/calendar/calendar-item.component.d.ts +17 -17
  129. package/lib/controls/calendar/calendar.component.d.ts +54 -54
  130. package/lib/controls/calendar/calendar.types.d.ts +7 -7
  131. package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
  132. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
  133. package/lib/controls/combobox/combobox.component.d.ts +418 -418
  134. package/lib/controls/date-input/date-input.component.d.ts +80 -80
  135. package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
  136. package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
  137. package/lib/controls/form-control/form-control.component.d.ts +30 -30
  138. package/lib/controls/form-control-base.d.ts +110 -110
  139. package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
  140. package/lib/controls/form-group/form-group.component.d.ts +105 -105
  141. package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
  142. package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
  143. package/lib/controls/link-button/link-button.component.d.ts +5 -5
  144. package/lib/controls/menu/menu.component.d.ts +255 -255
  145. package/lib/controls/navigation/link-item.d.ts +32 -32
  146. package/lib/controls/navigation/nav-group.d.ts +18 -18
  147. package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
  148. package/lib/controls/navigation/nav-item.d.ts +31 -31
  149. package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
  150. package/lib/controls/popover/popover.component.d.ts +51 -51
  151. package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
  152. package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
  153. package/lib/controls/select/select.component.d.ts +44 -44
  154. package/lib/controls/tabs/tabs.component.d.ts +30 -30
  155. package/lib/controls/textbox/textbox.component.d.ts +107 -107
  156. package/lib/core/cache.service.d.ts +33 -33
  157. package/lib/core/custom-validators.d.ts +20 -20
  158. package/lib/core/date-time-helper.d.ts +101 -101
  159. package/lib/core/error.service.d.ts +20 -20
  160. package/lib/core/router-helper.service.d.ts +48 -48
  161. package/lib/core/scroll.service.d.ts +36 -36
  162. package/lib/core/telemetry-tracker.service.d.ts +13 -13
  163. package/lib/core/telemetry.service.d.ts +31 -31
  164. package/lib/core/validation-message.service.d.ts +26 -26
  165. package/lib/core/validation-patterns.d.ts +22 -22
  166. package/lib/core/window.service.d.ts +116 -116
  167. package/lib/display/app-bar/app-bar.component.d.ts +20 -20
  168. package/lib/display/avatar/avatar.component.d.ts +35 -35
  169. package/lib/display/avatar/avatar.service.d.ts +24 -24
  170. package/lib/display/confirm/confirm.component.d.ts +123 -123
  171. package/lib/display/dialog/dialog-content.d.ts +19 -19
  172. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
  173. package/lib/display/dialog/dialog-types.d.ts +130 -130
  174. package/lib/display/dialog/dialog.component.d.ts +120 -120
  175. package/lib/display/dialog/dialog.service.d.ts +48 -48
  176. package/lib/display/help/help-types.d.ts +33 -33
  177. package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
  178. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
  179. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
  180. package/lib/display/item-display/item-display.component.d.ts +43 -43
  181. package/lib/display/json-display/json-display.component.d.ts +16 -16
  182. package/lib/display/resizable/resizable-base.d.ts +67 -67
  183. package/lib/display/resizable/resizable.component.d.ts +31 -31
  184. package/lib/display/spinner/spinner.component.d.ts +5 -5
  185. package/lib/display/splash/splash.component.d.ts +16 -16
  186. package/lib/display/splash/splash.service.d.ts +22 -22
  187. package/lib/display/table/resizable-column.component.d.ts +10 -10
  188. package/lib/display/table/resizable-table.directive.d.ts +93 -93
  189. package/lib/display/table/searchable-table.component.d.ts +206 -206
  190. package/lib/display/table/table-detail-row.component.d.ts +8 -8
  191. package/lib/display/table/table-locked-column.component.d.ts +20 -20
  192. package/lib/display/table/table-master-header-row.component.d.ts +9 -9
  193. package/lib/display/table/table-master-row.component.d.ts +113 -113
  194. package/lib/display/table/table-pagination.component.d.ts +91 -91
  195. package/lib/display/table/table-selectable-row.component.d.ts +102 -102
  196. package/lib/display/table/table.component.d.ts +121 -121
  197. package/lib/display/tags/tag.d.ts +18 -18
  198. package/lib/display/tags/tags.component.d.ts +48 -48
  199. package/lib/display/toast/toast/toast.component.d.ts +23 -23
  200. package/lib/display/toast/toast-types.d.ts +24 -24
  201. package/lib/display/toast/toast.service.d.ts +20 -20
  202. package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
  203. package/lib/display/tooltip/tooltip.component.d.ts +70 -70
  204. package/lib/display/tooltip/tooltip.service.d.ts +16 -16
  205. package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
  206. package/lib/display/tour/tour-types.d.ts +70 -70
  207. package/lib/display/tour/tour.component.d.ts +147 -147
  208. package/lib/display/tour/tour.service.d.ts +38 -38
  209. package/lib/display/tree/tree.component.d.ts +75 -75
  210. package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
  211. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
  212. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
  213. package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
  214. package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
  215. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
  216. package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
  217. package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
  218. package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
  219. package/lib/shared/display.d.ts +42 -42
  220. package/lib/shared/form-group.helper.d.ts +31 -31
  221. package/lib/shared/json-helper.d.ts +7 -7
  222. package/lib/shared/lodash-helper.d.ts +18 -18
  223. package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
  224. package/lib/shared/page/page-statuses.d.ts +13 -13
  225. package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
  226. package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
  227. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
  228. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
  229. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
  230. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
  231. package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
  232. package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
  233. package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
  234. package/lib/shared/user-preference.service.d.ts +13 -13
  235. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
  236. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
  237. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
  238. package/package.json +12 -18
  239. package/public-api.d.ts +111 -111
  240. package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
  241. package/schematics/rxjs-7-upgrade/index.js +67 -67
  242. package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
  243. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  244. package/schematics/utilities/typescript.d.ts +7 -7
  245. package/schematics/utilities/typescript.js +41 -41
  246. package/schematics/utilities/workspace.d.ts +8 -8
  247. package/schematics/utilities/workspace.js +71 -71
  248. package/esm2020/lib/core/custom-validators.mjs +0 -29
  249. package/esm2020/lib/core/date-time-helper.mjs +0 -220
  250. package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
  251. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
  252. package/esm2020/lib/shared/display.mjs +0 -6
  253. package/esm2020/lib/shared/form-group.helper.mjs +0 -67
  254. package/esm2020/lib/shared/lodash-helper.mjs +0 -51
  255. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  256. package/fesm2015/energycap-components.mjs +0 -12211
  257. package/fesm2015/energycap-components.mjs.map +0 -1
  258. package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,342 +1,342 @@
1
- import { Component, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
2
- import { EMPTY, merge, Subject } from 'rxjs';
3
- import { catchError, debounceTime, map, pluck, skipUntil, switchMap, takeUntil, tap } from 'rxjs/operators';
4
- import { Overlay } from '../view-overlay/view-overlay.component';
5
- import { ResizableColumnComponent } from './resizable-column.component';
6
- import { TablePaginationComponent } from './table-pagination.component';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../core/error.service";
9
- import * as i2 from "@ngx-translate/core";
10
- import * as i3 from "../../shared/display/pipes/row-count.pipe";
11
- import * as i4 from "@angular/common";
12
- import * as i5 from "../../controls/textbox/textbox.component";
13
- import * as i6 from "../view-overlay/view-overlay.component";
14
- import * as i7 from "./table.component";
15
- import * as i8 from "./table-pagination.component";
16
- export class SearchableTableComponent {
17
- /** Reference to the searchModel */
18
- get searchModel() {
19
- return this.formModel.controls.searchModel;
20
- }
21
- constructor(errorService, translateService, rowCountPipe) {
22
- this.errorService = errorService;
23
- this.translateService = translateService;
24
- this.rowCountPipe = rowCountPipe;
25
- this.id = '';
26
- this.resizable = false;
27
- this.sortable = false;
28
- this.autofocus = false;
29
- /**Set to a space-separated set of strings that should be added to the ec-table class attribute
30
- * this allows finer control over styling.
31
- */
32
- this.tableClasses = '';
33
- /** Emits when table sort has changed */
34
- this.sortChange = new EventEmitter();
35
- /** Emits when the table page has changed */
36
- this.pageChangeEmitter = new EventEmitter();
37
- /** Placeholder text for the searchbox */
38
- this.searchboxPlaceholder = '';
39
- /**
40
- * Displayed in overlay when no data is returned (without searching).
41
- *
42
- * Defaults to "SearchableTable_Default_NoData_SC"
43
- */
44
- this.noDataMessage = 'SearchableTable_Default_NoData_SC';
45
- /**
46
- * Displayed in overlay when no data is returned (after searching).
47
- * Ensure translation has an interpolation placeholder for "searchText".
48
- *
49
- * Defaults to "SearchableTable_Default_NoMatches_SC"
50
- *
51
- * @example
52
- * // 7 requires single curly braces
53
- * No items found matching <strong>{{searchText}}</strong>
54
- */
55
- this.noSearchResultsMessage = 'SearchableTable_Default_NoMatches_SC';
56
- /** Allow the host component to supply an overlay to control the pending state of the table */
57
- this.status = new Overlay('hasData');
58
- /**
59
- * Sets the underlying table's layout to fixed.
60
- */
61
- this.tableLayoutFixed = false;
62
- /** Emits items returned by the getItems function, along with total count */
63
- this.itemsChange = new EventEmitter();
64
- /** Maximum number of items to show in the table (default: 100) */
65
- this.maxItemCount = 100;
66
- /** Set to true to hide search box (does not hide the other searchable table controls */
67
- this.hideSearchControl = false;
68
- /** Set to true to hide the entire header */
69
- this.hideHeader = false;
70
- /** Type of object in the table. Displayed in footer (default: 'results')*/
71
- this.objectType = 'results';
72
- /** Set to true to hide the table footer */
73
- this.hideFooter = false;
74
- /**
75
- * Set to true to enable paging. If paging is enabled, pageSize must be provided.
76
- * getItems will be passed both a search and a PagingInfo object when called. It must include totalItemsBeforePaging in the TableSearchResults output.
77
- * Here is a simple implementation:
78
- * @example
79
- * getItems(search?: string, pageChangeInfo?: PagingInfo): Observable<TableSearchResults> {
80
- let results: SimpleItem[] = [...this.paginatedTableItems];
81
- //apply search
82
- if(search) {
83
- results = this.paginatedTableItems.filter(i => i.a.toLowerCase().includes(search.toLowerCase()));
84
- }
85
- //get count before applying paging
86
- let countBeforePaging = results.length;
87
- //apply paging
88
- if(pageChangeInfo) {
89
- results = results.slice(pageChangeInfo!.skip, pageChangeInfo!.skip + pageChangeInfo!.pageSize);
90
- }
91
- return of({ items: results, totalItems: results.length, totalItemsBeforePaging: countBeforePaging });
92
- }
93
- */
94
- this.pageable = false;
95
- /**
96
- * Maximum number of page tabs to show
97
- */
98
- this.maxTabs = 10;
99
- /**
100
- * Makes the searchbox readonly if true.
101
- */
102
- this.searchboxReadonly = false;
103
- /** Optional text to add to the results count in the table footer. This text will be added after the count and objectType. */
104
- this.additionalCountText = '';
105
- /** Enables table row selection and row highlighting styles when true */
106
- this.selectable = false;
107
- /** When true, removes the card styles from the table wrapper */
108
- this.removeCard = false;
109
- /** Classes to add to the overlay/card element */
110
- this.overlayClasses = '';
111
- /** When true the overlay and table will not have flex-shrink-max but instead flex-grow */
112
- this.fillParentHeight = false;
113
- /** Passed to the pagination control component. Used to disable the pagination controls */
114
- this.disablePaginationControls = false;
115
- /**
116
- * Text displayed in the footer.
117
- * Sometimes `noDataMessage`, sometimes `noSearchResultsMessage`
118
- */
119
- this.tableCaption = this.translateService.instant(this.noDataMessage || 'SearchableTable_Default_NoData_SC');
120
- /** count of results displayed in the table */
121
- this.resultsCount = '';
122
- /** Items returned by the getItems function, along with total count */
123
- this.searchResults = { items: [], totalItems: 0 };
124
- /**
125
- * If passed an input for refresh, triggers reloading items.
126
- * Otherwise, completes immediately (will never trigger reload).
127
- */
128
- this.refreshTrigger = EMPTY;
129
- this.destroyed = new Subject();
130
- this.pageChanged = new Subject();
131
- /** Triggers the initial load of the table */
132
- this.initTable = new Subject();
133
- }
134
- ngOnChanges(changes) {
135
- if (changes.pageSize && !changes.pageSize.firstChange && this.pageable) {
136
- // If the pageSize changes, reset to the first page and refresh.
137
- this.pageInfo = TablePaginationComponent.getPagingInfo(1, this.pageSize);
138
- this.onPageChange(this.pageInfo);
139
- }
140
- }
141
- ngOnInit() {
142
- this.status.setStatus('pending', 'Loading');
143
- this.setUpRefreshTrigger();
144
- // Watch for searchbox/other control changes or refresh requests
145
- const searchOrRefresh = merge(this.formModel.valueChanges.pipe(skipUntil(this.ready), debounceTime(300)), this.refreshTrigger, this.initTable).pipe(tap(() => {
146
- //a change to any form control or a refresh should reset the pageInfo to the first page if the table is pageable.
147
- //(if we didnt reset the pageInfo, we'd have to call getItems with the previous pageInfo, which may not be valid for the new results)
148
- if (this.pageable) {
149
- this.pageInfo = TablePaginationComponent.getPagingInfo(1, this.pageSize);
150
- }
151
- }));
152
- const updateResults = merge(searchOrRefresh, this.pageChanged.pipe(
153
- // Prevent a call to getItems when the pageSize is set during page init and before ready is completed
154
- skipUntil(this.ready)));
155
- // Call getItems and watch for errors
156
- const getData = updateResults.pipe(
157
- // Pluck the searchModel value out of the formModel
158
- pluck('searchModel'),
159
- // Ensure search string is defined
160
- // Trim and lowercase it to aid case-insensitive searching
161
- map((searchString) => {
162
- let search = searchString || '';
163
- return search.trim().toLowerCase();
164
- }),
165
- // Show status overlay
166
- tap(() => this.status.setStatus('pending', 'Loading')),
167
- // Call passed function
168
- switchMap((searchString) =>
169
- //if the table is pageable, pageInfo will be defined.
170
- this.getItems(searchString, this.pageInfo)),
171
- // If passed function fails, show error status
172
- catchError((err, caught) => {
173
- this.status.setStatus('error', this.errorService.parseApiError(err));
174
- // return the caught observable so the subscription doesn't complete
175
- return caught;
176
- }), takeUntil(this.destroyed));
177
- // Handle returned data and notify parent
178
- getData.subscribe((results) => {
179
- // Limiting number of results to show if not pageable (if pageable the max number of items in the table
180
- // can be modified by increasing/decreasing the pageSize.)
181
- if (!this.pageable) {
182
- results.items = results.items.slice(0, this.maxItemCount);
183
- }
184
- // Need to know this (along with if there's a value in the formModel) to determine what to show in the footer
185
- this.searchResults = results;
186
- this.tableCaption = this.getCaption(results);
187
- this.resultsCount = this.pageable ? this.rowCountPipe.transform(results, this.objectType, undefined, this.pageInfo) :
188
- this.rowCountPipe.transform(results, this.objectType, this.maxItemCount);
189
- // Disable searchbox when in no-data state
190
- if (!results.items.length && !this.searchModel.value) {
191
- this.searchModel.disable({ emitEvent: false });
192
- }
193
- else if (this.searchModel.disabled) {
194
- // re-enable if it was disabled, but now has items
195
- this.searchModel.enable({ emitEvent: false });
196
- }
197
- this.status.setStatus('hasData');
198
- // Send the results to the parent component
199
- this.itemsChange.emit(results);
200
- });
201
- // When 'ready' is completed by the host, initialize the table with the current form model values
202
- this.ready.subscribe({
203
- complete: () => {
204
- this.initTable.next(this.formModel.value);
205
- this.initTable.complete();
206
- }
207
- });
208
- }
209
- ngOnDestroy() {
210
- this.destroyed.next();
211
- this.destroyed.unsubscribe();
212
- }
213
- /** Pass along sort to parent component */
214
- onSortChange(sort) {
215
- this.sortChange.emit(sort);
216
- }
217
- /**
218
- * When a page changes, store the new pagingInfo and emit the current value of the form to trigger getData.
219
- */
220
- onPageChange(pagingInfo) {
221
- this.status.setStatus('pending', 'Loading');
222
- this.pageInfo = pagingInfo;
223
- this.pageChangeEmitter.emit(pagingInfo);
224
- this.pageChanged.next(this.formModel.value);
225
- }
226
- /**
227
- * Wire up a handler to the `refresh` observable so that when
228
- * the host page context changes it can force the table to update as well.
229
- *
230
- * If the `refresh` observable passes options and the `clearSearch` property
231
- * is set to true, reset the searchModel and pass an empty string.
232
- *
233
- * If `refresh` observable does not pass options or the `clearSearch` property
234
- * is set to false, pass along the current searchModel Value.
235
- */
236
- setUpRefreshTrigger() {
237
- if (this.refresh) {
238
- this.refreshTrigger = this.refresh.pipe(map(opts => {
239
- if (opts && opts.clearSearch) {
240
- this.searchModel.reset('', { emitEvent: false });
241
- return { ...this.formModel, searchModel: '' };
242
- }
243
- return this.formModel.value;
244
- }), takeUntil(this.destroyed));
245
- }
246
- }
247
- /** Get text to display in the footer. */
248
- getCaption(results) {
249
- if (results.items.length) {
250
- return '';
251
- }
252
- if (this.searchModel.value) {
253
- return this.translateService.instant(this.noSearchResultsMessage || 'SearchableTable_Default_NoMatches_SC', { searchText: this.searchModel.value });
254
- }
255
- return this.translateService.instant(this.noDataMessage || 'SearchableTable_Default_NoData_SC');
256
- }
257
- }
258
- SearchableTableComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SearchableTableComponent, deps: [{ token: i1.ErrorService }, { token: i2.TranslateService }, { token: i3.RowCountPipe }], target: i0.ɵɵFactoryTarget.Component });
259
- SearchableTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SearchableTableComponent, selector: "ec-searchable-table", inputs: { id: "id", resizable: "resizable", sortable: "sortable", sort: "sort", autofocus: "autofocus", tableClasses: "tableClasses", searchboxPlaceholder: "searchboxPlaceholder", formModel: "formModel", noDataMessage: "noDataMessage", noSearchResultsMessage: "noSearchResultsMessage", ready: "ready", getItems: "getItems", refresh: "refresh", status: "status", tableLayoutFixed: "tableLayoutFixed", searchboxTabIndex: "searchboxTabIndex", maxItemCount: "maxItemCount", hideSearchControl: "hideSearchControl", hideHeader: "hideHeader", objectType: "objectType", hideFooter: "hideFooter", pageable: "pageable", pageSize: "pageSize", maxTabs: "maxTabs", searchboxReadonly: "searchboxReadonly", selectionContext: "selectionContext", selectionToolbarTemplate: "selectionToolbarTemplate", additionalCountText: "additionalCountText", selectable: "selectable", customContentTemplate: "customContentTemplate", removeCard: "removeCard", overlayClasses: "overlayClasses", fillParentHeight: "fillParentHeight", disablePaginationControls: "disablePaginationControls" }, outputs: { sortChange: "sortChange", pageChangeEmitter: "pageChange", itemsChange: "itemsChange" }, queries: [{ propertyName: "resizableColumns", predicate: ResizableColumnComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<header *ngIf=\"!hideHeader\"\r\n class=\"d-flex flex-shrink align-items-center mb-3\">\r\n <ec-textbox id=\"{{id}}_searchbox\"\r\n *ngIf=\"!hideSearchControl\"\r\n class=\"mb-0 flex-grow mr-2\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"searchModel\"\r\n [tabindex]=\"searchboxTabIndex\"\r\n [placeholder]=\"searchboxPlaceholder\"\r\n [readonly]=\"searchboxReadonly\"></ec-textbox>\r\n <div class=\"flex-grow\">\r\n <ng-content select=\".searchable-table-controls\"></ng-content>\r\n </div>\r\n</header>\r\n<section id=\"{{id}}_card\"\r\n class=\"d-flex flex-column {{overlayClasses}}\"\r\n [ngClass]=\"{'is-translucent': status.status !== 'error', 'has-mask': status.status !== 'hasData', 'card m-0 bg-content': !customContentTemplate && !removeCard}\"\r\n ecOverlay\r\n [status]=\"status.status\"\r\n [message]=\"status.message\"\r\n [displayAsMask]=\"true\">\r\n <ng-content select=\".card-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\">\r\n </ng-container>\r\n\r\n <!-- the default template is an ec-table with proxied-over searchable table inputs. \r\n If that doesn't work for you then you can specify a customContentTemplate to use instead\r\n and still retain all the event handling, header, footer pagination, etc support -->\r\n <ng-template #defaultContentTemplate>\r\n <ec-table id=\"{{id}}_table\"\r\n class=\"{{tableClasses}}\"\r\n [class.is-fixed]=\"tableLayoutFixed\"\r\n [sortable]=\"sortable\"\r\n [sort]=\"sort\"\r\n (sortChange)=\"onSortChange($event)\"\r\n [resizable]=\"resizable\"\r\n [scrollable]=\"true\"\r\n [selectable]=\"selectable\"\r\n [selectionContext]=\"selectionContext\"\r\n [selectionToolbarTemplate]=\"selectionToolbarTemplate\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </ec-table>\r\n </ng-template>\r\n\r\n <!-- pagination footer visible if table is page-able and there are more than one page of results -->\r\n <footer *ngIf=\"!hideFooter && pageable && searchResults.totalItemsBeforePaging! > pageSize!\"\r\n class=\"pagination-footer\"\r\n [class.border-top]=\"!customContentTemplate\">\r\n <ec-table-pagination id=\"{{id}}_pager\"\r\n class=\"font-color-primary\"\r\n [totalItems]=\"searchResults.totalItemsBeforePaging\"\r\n [pageSize]=\"pageSize\"\r\n [maxTabs]=\"maxTabs\"\r\n [pageNumber]=\"pageInfo?.pageNumber\"\r\n [disablePaginationControls]=\"disablePaginationControls\"\r\n (pageChanged)=\"onPageChange($event)\">\r\n </ec-table-pagination>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto font-color-hint text-truncate\" \r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n\r\n <!-- default footer: visible if hideFooter is false and table is not page-able or there are only one page of results (always shows if there is a caption to indicate no results) -->\r\n <footer *ngIf=\"(!hideFooter && (!pageable || searchResults.totalItemsBeforePaging! <= pageSize!)) || tableCaption\"\r\n class=\"caption-footer\"\r\n [ngClass]=\"{'has-results': searchResults?.items?.length, 'border-top': searchResults?.items?.length && !customContentTemplate}\">\r\n <ng-content *ngIf=\"!tableCaption\"\r\n select=\".searchable-table-footer\"></ng-content>\r\n <div id=\"tableCaption\"\r\n *ngIf=\"tableCaption\"\r\n [innerHTML]=\"tableCaption\"></div>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto text-truncate\"\r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n</section>", styles: [":host{--ec-searchable-table-flex-properties: 0 1 auto;--ec-searchable-table-flex-overlay-section: var(--ec-searchable-table-flex-properties, 0 1 auto);--ec-searchable-table-flex-ec-table: var(--ec-searchable-table-flex-properties, 0 1 auto);display:flex;flex-direction:column;flex:1 1;min-height:0}:host ::ng-deep .card-header+ec-table.is-selectable th{height:2.5rem;padding-bottom:.9375rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle{padding-top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle:before{top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable .selectable-table-toolbar{height:2.5rem;padding-bottom:.5rem}section{flex:var(--ec-searchable-table-flex-overlay-section);min-height:0}ec-table{flex:var(--ec-searchable-table-flex-ec-table);min-height:0}footer{display:flex;align-items:center;flex:none;font-size:var(--ec-font-size-label);line-height:1rem}footer.has-results{color:var(--ec-color-hint-dark);text-align:right}.pagination-footer{padding:0 .5rem 0 0}.caption-footer{padding:.5rem;height:var(--ec-searchable-table-height-caption-footer)}.card.has-mask{min-height:15rem}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i6.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i7.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i8.TablePaginationComponent, selector: "ec-table-pagination", inputs: ["id", "totalItems", "pageSize", "pageNumber", "maxTabs", "disablePaginationControls"], outputs: ["pageChanged"] }] });
260
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SearchableTableComponent, decorators: [{
261
- type: Component,
262
- args: [{ selector: 'ec-searchable-table', template: "<header *ngIf=\"!hideHeader\"\r\n class=\"d-flex flex-shrink align-items-center mb-3\">\r\n <ec-textbox id=\"{{id}}_searchbox\"\r\n *ngIf=\"!hideSearchControl\"\r\n class=\"mb-0 flex-grow mr-2\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"searchModel\"\r\n [tabindex]=\"searchboxTabIndex\"\r\n [placeholder]=\"searchboxPlaceholder\"\r\n [readonly]=\"searchboxReadonly\"></ec-textbox>\r\n <div class=\"flex-grow\">\r\n <ng-content select=\".searchable-table-controls\"></ng-content>\r\n </div>\r\n</header>\r\n<section id=\"{{id}}_card\"\r\n class=\"d-flex flex-column {{overlayClasses}}\"\r\n [ngClass]=\"{'is-translucent': status.status !== 'error', 'has-mask': status.status !== 'hasData', 'card m-0 bg-content': !customContentTemplate && !removeCard}\"\r\n ecOverlay\r\n [status]=\"status.status\"\r\n [message]=\"status.message\"\r\n [displayAsMask]=\"true\">\r\n <ng-content select=\".card-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\">\r\n </ng-container>\r\n\r\n <!-- the default template is an ec-table with proxied-over searchable table inputs. \r\n If that doesn't work for you then you can specify a customContentTemplate to use instead\r\n and still retain all the event handling, header, footer pagination, etc support -->\r\n <ng-template #defaultContentTemplate>\r\n <ec-table id=\"{{id}}_table\"\r\n class=\"{{tableClasses}}\"\r\n [class.is-fixed]=\"tableLayoutFixed\"\r\n [sortable]=\"sortable\"\r\n [sort]=\"sort\"\r\n (sortChange)=\"onSortChange($event)\"\r\n [resizable]=\"resizable\"\r\n [scrollable]=\"true\"\r\n [selectable]=\"selectable\"\r\n [selectionContext]=\"selectionContext\"\r\n [selectionToolbarTemplate]=\"selectionToolbarTemplate\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </ec-table>\r\n </ng-template>\r\n\r\n <!-- pagination footer visible if table is page-able and there are more than one page of results -->\r\n <footer *ngIf=\"!hideFooter && pageable && searchResults.totalItemsBeforePaging! > pageSize!\"\r\n class=\"pagination-footer\"\r\n [class.border-top]=\"!customContentTemplate\">\r\n <ec-table-pagination id=\"{{id}}_pager\"\r\n class=\"font-color-primary\"\r\n [totalItems]=\"searchResults.totalItemsBeforePaging\"\r\n [pageSize]=\"pageSize\"\r\n [maxTabs]=\"maxTabs\"\r\n [pageNumber]=\"pageInfo?.pageNumber\"\r\n [disablePaginationControls]=\"disablePaginationControls\"\r\n (pageChanged)=\"onPageChange($event)\">\r\n </ec-table-pagination>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto font-color-hint text-truncate\" \r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n\r\n <!-- default footer: visible if hideFooter is false and table is not page-able or there are only one page of results (always shows if there is a caption to indicate no results) -->\r\n <footer *ngIf=\"(!hideFooter && (!pageable || searchResults.totalItemsBeforePaging! <= pageSize!)) || tableCaption\"\r\n class=\"caption-footer\"\r\n [ngClass]=\"{'has-results': searchResults?.items?.length, 'border-top': searchResults?.items?.length && !customContentTemplate}\">\r\n <ng-content *ngIf=\"!tableCaption\"\r\n select=\".searchable-table-footer\"></ng-content>\r\n <div id=\"tableCaption\"\r\n *ngIf=\"tableCaption\"\r\n [innerHTML]=\"tableCaption\"></div>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto text-truncate\"\r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n</section>", styles: [":host{--ec-searchable-table-flex-properties: 0 1 auto;--ec-searchable-table-flex-overlay-section: var(--ec-searchable-table-flex-properties, 0 1 auto);--ec-searchable-table-flex-ec-table: var(--ec-searchable-table-flex-properties, 0 1 auto);display:flex;flex-direction:column;flex:1 1;min-height:0}:host ::ng-deep .card-header+ec-table.is-selectable th{height:2.5rem;padding-bottom:.9375rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle{padding-top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle:before{top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable .selectable-table-toolbar{height:2.5rem;padding-bottom:.5rem}section{flex:var(--ec-searchable-table-flex-overlay-section);min-height:0}ec-table{flex:var(--ec-searchable-table-flex-ec-table);min-height:0}footer{display:flex;align-items:center;flex:none;font-size:var(--ec-font-size-label);line-height:1rem}footer.has-results{color:var(--ec-color-hint-dark);text-align:right}.pagination-footer{padding:0 .5rem 0 0}.caption-footer{padding:.5rem;height:var(--ec-searchable-table-height-caption-footer)}.card.has-mask{min-height:15rem}\n"] }]
263
- }], ctorParameters: function () { return [{ type: i1.ErrorService }, { type: i2.TranslateService }, { type: i3.RowCountPipe }]; }, propDecorators: { id: [{
264
- type: Input
265
- }], resizable: [{
266
- type: Input
267
- }], sortable: [{
268
- type: Input
269
- }], sort: [{
270
- type: Input
271
- }], autofocus: [{
272
- type: Input
273
- }], tableClasses: [{
274
- type: Input
275
- }], sortChange: [{
276
- type: Output
277
- }], pageChangeEmitter: [{
278
- type: Output,
279
- args: ['pageChange']
280
- }], searchboxPlaceholder: [{
281
- type: Input
282
- }], formModel: [{
283
- type: Input
284
- }], noDataMessage: [{
285
- type: Input
286
- }], noSearchResultsMessage: [{
287
- type: Input
288
- }], ready: [{
289
- type: Input
290
- }], getItems: [{
291
- type: Input
292
- }], refresh: [{
293
- type: Input
294
- }], status: [{
295
- type: Input
296
- }], tableLayoutFixed: [{
297
- type: Input
298
- }], itemsChange: [{
299
- type: Output
300
- }], searchboxTabIndex: [{
301
- type: Input
302
- }], maxItemCount: [{
303
- type: Input
304
- }], hideSearchControl: [{
305
- type: Input
306
- }], hideHeader: [{
307
- type: Input
308
- }], objectType: [{
309
- type: Input
310
- }], hideFooter: [{
311
- type: Input
312
- }], pageable: [{
313
- type: Input
314
- }], pageSize: [{
315
- type: Input
316
- }], maxTabs: [{
317
- type: Input
318
- }], searchboxReadonly: [{
319
- type: Input
320
- }], selectionContext: [{
321
- type: Input
322
- }], selectionToolbarTemplate: [{
323
- type: Input
324
- }], resizableColumns: [{
325
- type: ContentChildren,
326
- args: [ResizableColumnComponent, { descendants: true }]
327
- }], additionalCountText: [{
328
- type: Input
329
- }], selectable: [{
330
- type: Input
331
- }], customContentTemplate: [{
332
- type: Input
333
- }], removeCard: [{
334
- type: Input
335
- }], overlayClasses: [{
336
- type: Input
337
- }], fillParentHeight: [{
338
- type: Input
339
- }], disablePaginationControls: [{
340
- type: Input
341
- }] } });
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoYWJsZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90YWJsZS9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3NlYXJjaGFibGUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUF5QyxNQUFNLGVBQWUsQ0FBQztBQUc3SixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFjLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7QUFjcEYsTUFBTSxPQUFPLHdCQUF3QjtJQTRLbkMsbUNBQW1DO0lBQ25DLElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQWlDLENBQUM7SUFDbkUsQ0FBQztJQTBCRCxZQUNVLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxZQUEwQjtRQUYxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENB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QUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFzQkcsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFMEQsZ0JBQWdCO3NCQUEvRSxlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztnQkFHckQsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0cseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRU1QVFksIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgbWFwLCBwbHVjaywgc2tpcFVudGlsLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3dDb3VudFBpcGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlzcGxheS9waXBlcy9yb3ctY291bnQucGlwZSc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vcmVzaXphYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdpbmdJbmZvLCBUYWJsZVBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3RhYmxlLXBhZ2luYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dCB9IGZyb20gJy4vdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVTb3J0IH0gZnJvbSAnLi90YWJsZS5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHR5cGUgVGFibGVTZWFyY2hSZXN1bHRzID0geyBpdGVtczogdW5rbm93bltdLCB0b3RhbEl0ZW1zOiBudW1iZXIsIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmc/OiBudW1iZXIgfTtcclxuZXhwb3J0IHR5cGUgU2VhcmNoYWJsZVRhYmxlUmVmcmVzaE9wdGlvbnMgPSB7IGNsZWFyU2VhcmNoPzogYm9vbGVhbiB9O1xyXG5cclxudHlwZSBTZWFyY2hhYmxlVGFibGVGb3JtTW9kZWwgPSB7IHNlYXJjaE1vZGVsPzogc3RyaW5nIH07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLXNlYXJjaGFibGUtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlYXJjaGFibGVUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBpZCA9ICcnO1xyXG4gIEBJbnB1dCgpIHJlc2l6YWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNvcnRhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc29ydD86IFRhYmxlU29ydCB8IFRhYmxlU29ydFtdO1xyXG4gIEBJbnB1dCgpIGF1dG9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipTZXQgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgc2V0IG9mIHN0cmluZ3MgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVjLXRhYmxlIGNsYXNzIGF0dHJpYnV0ZVxyXG4gICAqIHRoaXMgYWxsb3dzIGZpbmVyIGNvbnRyb2wgb3ZlciBzdHlsaW5nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2xhc3Nlczogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRhYmxlIHNvcnQgaGFzIGNoYW5nZWQgKi9cclxuICBAT3V0cHV0KCkgc29ydENoYW5nZTogRXZlbnRFbWl0dGVyPFRhYmxlU29ydCB8IFRhYmxlU29ydFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTb3J0IHwgVGFibGVTb3J0W10+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB0YWJsZSBwYWdlIGhhcyBjaGFuZ2VkICovXHJcbiAgQE91dHB1dCgncGFnZUNoYW5nZScpIHBhZ2VDaGFuZ2VFbWl0dGVyOiBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2luZ0luZm8+KCk7XHJcblxyXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgc2VhcmNoYm94ICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94UGxhY2Vob2xkZXIgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybUdyb3VwIGZvciB0aGUgc2VhcmNoYm94XHJcbiAgICpcclxuICAgKiBUaGUgcmVmZXJlbmNlZCBGb3JtR3JvdXAgKiptdXN0KiogY29udGFpbiBhIEZvcm1Db250cm9sIGNhbGxlZCAnc2VhcmNoTW9kZWwnLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JtTW9kZWwhOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5ZWQgaW4gb3ZlcmxheSB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgKHdpdGhvdXQgc2VhcmNoaW5nKS5cclxuICAgKlxyXG4gICAqIERlZmF1bHRzIHRvIFwiU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDXCJcclxuICAgKi9cclxuICBASW5wdXQoKSBub0RhdGFNZXNzYWdlOiBzdHJpbmcgPSAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheWVkIGluIG92ZXJsYXkgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIChhZnRlciBzZWFyY2hpbmcpLlxyXG4gICAqIEVuc3VyZSB0cmFuc2xhdGlvbiBoYXMgYW4gaW50ZXJwb2xhdGlvbiBwbGFjZWhvbGRlciBmb3IgXCJzZWFyY2hUZXh0XCIuXHJcbiAgICpcclxuICAgKiBEZWZhdWx0cyB0byBcIlNlYXJjaGFibGVUYWJsZV9EZWZhdWx0X05vTWF0Y2hlc19TQ1wiXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIC8vIDcgcmVxdWlyZXMgc2luZ2xlIGN1cmx5IGJyYWNlc1xyXG4gICAqIE5vIGl0ZW1zIGZvdW5kIG1hdGNoaW5nIDxzdHJvbmc+e3tzZWFyY2hUZXh0fX08L3N0cm9uZz5cclxuICAgKi9cclxuICBASW5wdXQoKSBub1NlYXJjaFJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgPSAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9NYXRjaGVzX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGhvc3RpbmcgcGFnZSBpcyByZWFkeSBmb3IgdGhlIHRhYmxlIHRvIGxvYWQgZGF0YS5cclxuICAgKlxyXG4gICAqIE5leHQgYW5kIENvbXBsZXRlIHRoaXMgb2JzZXJ2YWJsZSBhZnRlciBob3N0aW5nIHBhZ2UgaGFzIG1hZGUgYW55IHByZWxpbWluYXJ5XHJcbiAgICogQVBJIChvciBvdGhlciBhc3luY2hyb25vdXMpIGNhbGxzIHRvIGxvYWQgcHJlcmVxdWlzaXRlIGRhdGEgdXBvbiB3aGljaCB0aGUgY29kZVxyXG4gICAqIGluIHRoZSBgZ2V0SXRlbXNgIGZ1bmN0aW9uIGRlcGVuZHMuICBVc2UgYSBgUmVwbGF5U3ViamVjdGAgdG8gZW5zdXJlIGV2ZXJ5IGNvbXBvbmVudFxyXG4gICAqIHRoYXQgdXNlcyB0aGlzIG9ic2VydmFibGUgZ2V0cyB0aGUgTmV4dCBhbmQgQ29tcGxldGUgbm90aWZpY2F0aW9ucy5cclxuICAgKi9cclxuICBASW5wdXQoKSByZWFkeSE6IE9ic2VydmFibGU8dm9pZD47XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB0byBnZXQgaXRlbXMgdG8gZGlzcGxheSBpbiB0aGUgdGFibGUuXHJcbiAgICogSWYgcGFnZWFibGUgaXMgdHJ1ZSwgdGhlIFRhYmxlU2VhcmNoUmVzdWx0cyBuZWVkIHRvIGluY2x1ZGUgdG90YWxJdGVtc0JlZm9yZVBhZ2luZywgd2hpY2ggaXMgdGhlXHJcbiAgICogY291bnQgb2YgaXRlbXMgYmVmb3JlIHlvdSd2ZSBhcHBsaWVkIGFueSBwYWdpbmF0aW9uIChpLmUuIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW1lIGJhY2sgZnJvbSB0aGUgc2VhcmNoKS5cclxuICAgKlxyXG4gICAqIE1ha2Ugc3VyZSB0byBiaW5kIHRoZSBzY29wZSBpbiB0aGUgdGVtcGxhdGVcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIFtnZXRJdGVtc109XCJ5b3VyRnVuY3Rpb24uYmluZCh0aGlzKVwiXHJcbiAgICovXHJcbiAgQElucHV0KCkgZ2V0SXRlbXMhOiAoc2VhcmNoPzogc3RyaW5nLCBwYWdlQ2hhbmdlSW5mbz86IFBhZ2luZ0luZm8pID0+IE9ic2VydmFibGU8VGFibGVTZWFyY2hSZXN1bHRzPjtcclxuXHJcbiAgLyoqIE9ic2VydmFibGUgdGhhdCB3aWxsIGZvcmNlIHRoZSBnZXRJdGVtcyBmdW5jdGlvbiB0byBnZXQgY2FsbGVkIGFnYWluICovXHJcbiAgQElucHV0KCkgcmVmcmVzaD86IE9ic2VydmFibGU8U2VhcmNoYWJsZVRhYmxlUmVmcmVzaE9wdGlvbnMgfCB2b2lkPjtcclxuXHJcbiAgLyoqIEFsbG93IHRoZSBob3N0IGNvbXBvbmVudCB0byBzdXBwbHkgYW4gb3ZlcmxheSB0byBjb250cm9sIHRoZSBwZW5kaW5nIHN0YXRlIG9mIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHN0YXR1czogT3ZlcmxheSA9IG5ldyBPdmVybGF5KCdoYXNEYXRhJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHVuZGVybHlpbmcgdGFibGUncyBsYXlvdXQgdG8gZml4ZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGFibGVMYXlvdXRGaXhlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogRW1pdHMgaXRlbXMgcmV0dXJuZWQgYnkgdGhlIGdldEl0ZW1zIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIHRvdGFsIGNvdW50ICovXHJcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGFibGVTZWFyY2hSZXN1bHRzPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTZWFyY2hSZXN1bHRzPigpO1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGFiIGluZGV4IGZvciB0aGUgc2VhcmNoYm94ICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94VGFiSW5kZXg/OiBudW1iZXI7XHJcblxyXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBzaG93IGluIHRoZSB0YWJsZSAoZGVmYXVsdDogMTAwKSAqL1xyXG4gIEBJbnB1dCgpIG1heEl0ZW1Db3VudDogbnVtYmVyID0gMTAwO1xyXG5cclxuICAvKiogU2V0IHRvIHRydWUgdG8gaGlkZSBzZWFyY2ggYm94IChkb2VzIG5vdCBoaWRlIHRoZSBvdGhlciBzZWFyY2hhYmxlIHRhYmxlIGNvbnRyb2xzICovXHJcbiAgQElucHV0KCkgaGlkZVNlYXJjaENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGVudGlyZSBoZWFkZXIgKi9cclxuICBASW5wdXQoKSBoaWRlSGVhZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUeXBlIG9mIG9iamVjdCBpbiB0aGUgdGFibGUuIERpc3BsYXllZCBpbiBmb290ZXIgKGRlZmF1bHQ6ICdyZXN1bHRzJykqL1xyXG4gIEBJbnB1dCgpIG9iamVjdFR5cGU6IHN0cmluZyA9ICdyZXN1bHRzJztcclxuXHJcbiAgLyoqIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIHRhYmxlIGZvb3RlciAqL1xyXG4gIEBJbnB1dCgpIGhpZGVGb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHBhZ2luZy4gSWYgcGFnaW5nIGlzIGVuYWJsZWQsIHBhZ2VTaXplIG11c3QgYmUgcHJvdmlkZWQuXHJcbiAgICogZ2V0SXRlbXMgd2lsbCBiZSBwYXNzZWQgYm90aCBhIHNlYXJjaCBhbmQgYSBQYWdpbmdJbmZvIG9iamVjdCB3aGVuIGNhbGxlZC4gSXQgbXVzdCBpbmNsdWRlIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmcgaW4gdGhlIFRhYmxlU2VhcmNoUmVzdWx0cyBvdXRwdXQuXHJcbiAgICogSGVyZSBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbjogXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBnZXRJdGVtcyhzZWFyY2g/OiBzdHJpbmcsIHBhZ2VDaGFuZ2VJbmZvPzogUGFnaW5nSW5mbyk6IE9ic2VydmFibGU8VGFibGVTZWFyY2hSZXN1bHRzPiB7XHJcbiAgICAgIGxldCByZXN1bHRzOiBTaW1wbGVJdGVtW10gPSBbLi4udGhpcy5wYWdpbmF0ZWRUYWJsZUl0ZW1zXTtcclxuICAgICAgLy9hcHBseSBzZWFyY2hcclxuICAgICAgaWYoc2VhcmNoKSB7XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucGFnaW5hdGVkVGFibGVJdGVtcy5maWx0ZXIoaSA9PiBpLmEudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vZ2V0IGNvdW50IGJlZm9yZSBhcHBseWluZyBwYWdpbmdcclxuICAgICAgbGV0IGNvdW50QmVmb3JlUGFnaW5nID0gcmVzdWx0cy5sZW5ndGg7XHJcbiAgICAgIC8vYXBwbHkgcGFnaW5nXHJcbiAgICAgIGlmKHBhZ2VDaGFuZ2VJbmZvKSB7XHJcbiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UocGFnZUNoYW5nZUluZm8hLnNraXAsIHBhZ2VDaGFuZ2VJbmZvIS5za2lwICsgcGFnZUNoYW5nZUluZm8hLnBhZ2VTaXplKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2YoeyBpdGVtczogcmVzdWx0cywgdG90YWxJdGVtczogcmVzdWx0cy5sZW5ndGgsIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmc6IGNvdW50QmVmb3JlUGFnaW5nIH0pO1xyXG4gICAgfVxyXG4gICovXHJcbiAgQElucHV0KCkgcGFnZWFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWF4IHNpemUgb2YgYSBwYWdlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplPzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICogTWF4aW11bSBudW1iZXIgb2YgcGFnZSB0YWJzIHRvIHNob3dcclxuICovXHJcbiAgQElucHV0KCkgbWF4VGFicz86IG51bWJlciA9IDEwO1xyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyB0aGUgc2VhcmNoYm94IHJlYWRvbmx5IGlmIHRydWUuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94UmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgaW5uZXIgVGFibGVDb21wb25lbnQgdG8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Db250ZXh0PzogVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dDtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgaW5uZXIgVGFibGVDb21wb25lbnQgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2hlbiAxIG9yIG1vcmUgcm93cyBhcmUgc2VsZWN0ZWQuIFJlcXVpcmVzIGBbc2VsZWN0aW9uQ29udGV4dF1gIHRvIGJlIGRlZmluZWQuICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uVG9vbGJhclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBcclxuICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgcmVzaXphYmxlQ29sdW1ucyE6IFF1ZXJ5TGlzdDxSZXNpemFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGV4dCB0byBhZGQgdG8gdGhlIHJlc3VsdHMgY291bnQgaW4gdGhlIHRhYmxlIGZvb3Rlci4gVGhpcyB0ZXh0IHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhlIGNvdW50IGFuZCBvYmplY3RUeXBlLiAqL1xyXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb3VudFRleHQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogRW5hYmxlcyB0YWJsZSByb3cgc2VsZWN0aW9uIGFuZCByb3cgaGlnaGxpZ2h0aW5nIHN0eWxlcyB3aGVuIHRydWUgKi9cclxuICBASW5wdXQoKSBzZWxlY3RhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKkRlZmF1bHRzIHRvIHVuZGVmaW5lZC4gU3BlY2lmeSB5b3VyIG93biB0ZW1wbGF0ZSBpZiBhbiBlYy10YWJsZSB3cmFwcGVkIGFyb3VuZCB5b3VyIHRyYW5zY2x1ZGVkIGNvbnRlbnQgd29uJ3QgbWVldCB5b3VyIG5lZWRzXHJcbiAgICovXHJcbiAgQElucHV0KCkgY3VzdG9tQ29udGVudFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFdoZW4gdHJ1ZSwgcmVtb3ZlcyB0aGUgY2FyZCBzdHlsZXMgZnJvbSB0aGUgdGFibGUgd3JhcHBlciAqL1xyXG4gIEBJbnB1dCgpIHJlbW92ZUNhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIENsYXNzZXMgdG8gYWRkIHRvIHRoZSBvdmVybGF5L2NhcmQgZWxlbWVudCAqL1xyXG4gIEBJbnB1dCgpIG92ZXJsYXlDbGFzc2VzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFdoZW4gdHJ1ZSB0aGUgb3ZlcmxheSBhbmQgdGFibGUgd2lsbCBub3QgaGF2ZSBmbGV4LXNocmluay1tYXggYnV0IGluc3RlYWQgZmxleC1ncm93ICovXHJcbiAgQElucHV0KCkgZmlsbFBhcmVudEhlaWdodD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgcGFnaW5hdGlvbiBjb250cm9sIGNvbXBvbmVudC4gVXNlZCB0byBkaXNhYmxlIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVBhZ2luYXRpb25Db250cm9scz86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBQYWdpbmdJbmZvIGZvciB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlSW5mbz86IFBhZ2luZ0luZm87XHJcblxyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHNlYXJjaE1vZGVsICovXHJcbiAgcHVibGljIGdldCBzZWFyY2hNb2RlbCgpOiBVbnR5cGVkRm9ybUNvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybU1vZGVsLmNvbnRyb2xzLnNlYXJjaE1vZGVsIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHQgZGlzcGxheWVkIGluIHRoZSBmb290ZXIuXHJcbiAgICogU29tZXRpbWVzIGBub0RhdGFNZXNzYWdlYCwgc29tZXRpbWVzIGBub1NlYXJjaFJlc3VsdHNNZXNzYWdlYFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0YWJsZUNhcHRpb246IHN0cmluZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubm9EYXRhTWVzc2FnZSB8fCAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJyk7XHJcblxyXG4gIC8qKiBjb3VudCBvZiByZXN1bHRzIGRpc3BsYXllZCBpbiB0aGUgdGFibGUgKi9cclxuICBwdWJsaWMgcmVzdWx0c0NvdW50OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIEl0ZW1zIHJldHVybmVkIGJ5IHRoZSBnZXRJdGVtcyBmdW5jdGlvbiwgYWxvbmcgd2l0aCB0b3RhbCBjb3VudCAqL1xyXG4gIHB1YmxpYyBzZWFyY2hSZXN1bHRzOiBUYWJsZVNlYXJjaFJlc3VsdHMgPSB7IGl0ZW1zOiBbXSwgdG90YWxJdGVtczogMCB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBwYXNzZWQgYW4gaW5wdXQgZm9yIHJlZnJlc2gsIHRyaWdnZXJzIHJlbG9hZGluZyBpdGVtcy5cclxuICAgKiBPdGhlcndpc2UsIGNvbXBsZXRlcyBpbW1lZGlhdGVseSAod2lsbCBuZXZlciB0cmlnZ2VyIHJlbG9hZCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoVHJpZ2dlcjogT2JzZXJ2YWJsZTxTZWFyY2hhYmxlVGFibGVGb3JtTW9kZWwgfCB1bmRlZmluZWQ+ID0gRU1QVFk7XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwcml2YXRlIHBhZ2VDaGFuZ2VkOiBTdWJqZWN0PFNlYXJjaGFibGVUYWJsZUZvcm1Nb2RlbD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKiogVHJpZ2dlcnMgdGhlIGluaXRpYWwgbG9hZCBvZiB0aGUgdGFibGUgKi9cclxuICBwcml2YXRlIGluaXRUYWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3dDb3VudFBpcGU6IFJvd0NvdW50UGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnBhZ2VTaXplICYmICFjaGFuZ2VzLnBhZ2VTaXplLmZpcnN0Q2hhbmdlICYmIHRoaXMucGFnZWFibGUpIHtcclxuICAgICAgLy8gSWYgdGhlIHBhZ2VTaXplIGNoYW5nZXMsIHJlc2V0IHRvIHRoZSBmaXJzdCBwYWdlIGFuZCByZWZyZXNoLlxyXG4gICAgICB0aGlzLnBhZ2VJbmZvID0gVGFibGVQYWdpbmF0aW9uQ29tcG9uZW50LmdldFBhZ2luZ0luZm8oMSwgdGhpcy5wYWdlU2l6ZSEpO1xyXG4gICAgICB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLnBhZ2VJbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgJ0xvYWRpbmcnKTtcclxuICAgIHRoaXMuc2V0VXBSZWZyZXNoVHJpZ2dlcigpO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciBzZWFyY2hib3gvb3RoZXIgY29udHJvbCBjaGFuZ2VzIG9yIHJlZnJlc2ggcmVxdWVzdHNcclxuICAgIGNvbnN0IHNlYXJjaE9yUmVmcmVzaCA9IG1lcmdlKFxyXG4gICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICBza2lwVW50aWwodGhpcy5yZWFkeSksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMClcclxuICAgICAgKSxcclxuICAgICAgdGhpcy5yZWZyZXNoVHJpZ2dlcixcclxuICAgICAgdGhpcy5pbml0VGFibGVcclxuICAgICkucGlwZSh0YXAoKCk9PiB7XHJcbiAgICAgIC8vYSBjaGFuZ2UgdG8gYW55IGZvcm0gY29udHJvbCBvciBhIHJlZnJlc2ggc2hvdWxkIHJlc2V0IHRoZSBwYWdlSW5mbyB0byB0aGUgZmlyc3QgcGFnZSBpZiB0aGUgdGFibGUgaXMgcGFnZWFibGUuXHJcbiAgICAgIC8vKGlmIHdlIGRpZG50IHJlc2V0IHRoZSBwYWdlSW5mbywgd2UnZCBoYXZlIHRvIGNhbGwgZ2V0SXRlbXMgd2l0aCB0aGUgcHJldmlvdXMgcGFnZUluZm8sIHdoaWNoIG1heSBub3QgYmUgdmFsaWQgZm9yIHRoZSBuZXcgcmVzdWx0cylcclxuICAgICAgaWYodGhpcy5wYWdlYWJsZSkge1xyXG4gICAgICAgIHRoaXMucGFnZUluZm8gPSBUYWJsZVBhZ2luYXRpb25Db21wb25lbnQuZ2V0UGFnaW5nSW5mbygxLCB0aGlzLnBhZ2VTaXplISk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVSZXN1bHRzID0gbWVyZ2UoXHJcbiAgICAgIHNlYXJjaE9yUmVmcmVzaCxcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5waXBlKFxyXG4gICAgICAgIC8vIFByZXZlbnQgYSBjYWxsIHRvIGdldEl0ZW1zIHdoZW4gdGhlIHBhZ2VTaXplIGlzIHNldCBkdXJpbmcgcGFnZSBpbml0IGFuZCBiZWZvcmUgcmVhZHkgaXMgY29tcGxldGVkXHJcbiAgICAgICAgc2tpcFVudGlsKHRoaXMucmVhZHkpXHJcbiAgICAgIClcclxuICAgIClcclxuXHJcbiAgICAvLyBDYWxsIGdldEl0ZW1zIGFuZCB3YXRjaCBmb3IgZXJyb3JzXHJcbiAgICBjb25zdCBnZXREYXRhID0gdXBkYXRlUmVzdWx0cy5waXBlKFxyXG4gICAgICAvLyBQbHVjayB0aGUgc2VhcmNoTW9kZWwgdmFsdWUgb3V0IG9mIHRoZSBmb3JtTW9kZWxcclxuICAgICAgcGx1Y2soJ3NlYXJjaE1vZGVsJyksXHJcblxyXG4gICAgICAvLyBFbnN1cmUgc2VhcmNoIHN0cmluZyBpcyBkZWZpbmVkXHJcbiAgICAgIC8vIFRyaW0gYW5kIGxvd2VyY2FzZSBpdCB0byBhaWQgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2hpbmdcclxuICAgICAgbWFwKChzZWFyY2hTdHJpbmc/OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgc2VhcmNoID0gc2VhcmNoU3RyaW5nIHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBzZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0pLFxyXG5cclxuICAgICAgLy8gU2hvdyBzdGF0dXMgb3ZlcmxheVxyXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgJ0xvYWRpbmcnKSksXHJcblxyXG4gICAgICAvLyBDYWxsIHBhc3NlZCBmdW5jdGlvblxyXG4gICAgICBzd2l0Y2hNYXAoKHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBcclxuICAgICAgICAvL2lmIHRoZSB0YWJsZSBpcyBwYWdlYWJsZSwgcGFnZUluZm8gd2lsbCBiZSBkZWZpbmVkLlxyXG4gICAgICAgIHRoaXMuZ2V0SXRlbXMoc2VhcmNoU3RyaW5nLCB0aGlzLnBhZ2VJbmZvKVxyXG4gICAgICApLFxyXG5cclxuICAgICAgLy8gSWYgcGFzc2VkIGZ1bmN0aW9uIGZhaWxzLCBzaG93IGVycm9yIHN0YXR1c1xyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygnZXJyb3InLCB0aGlzLmVycm9yU2VydmljZS5wYXJzZUFwaUVycm9yKGVycikpO1xyXG4gICAgICAgIC8vIHJldHVybiB0aGUgY2F1Z2h0IG9ic2VydmFibGUgc28gdGhlIHN1YnNjcmlwdGlvbiBkb2Vzbid0IGNvbXBsZXRlXHJcbiAgICAgICAgcmV0dXJuIGNhdWdodDtcclxuICAgICAgfSksXHJcblxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBIYW5kbGUgcmV0dXJuZWQgZGF0YSBhbmQgbm90aWZ5IHBhcmVudFxyXG4gICAgZ2V0RGF0YS5zdWJzY3JpYmUoKHJlc3VsdHM6IFRhYmxlU2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAvLyBMaW1pdGluZyBudW1iZXIgb2YgcmVzdWx0cyB0byBzaG93IGlmIG5vdCBwYWdlYWJsZSAoaWYgcGFnZWFibGUgdGhlIG1heCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlXHJcbiAgICAgIC8vIGNhbiBiZSBtb2RpZmllZCBieSBpbmNyZWFzaW5nL2RlY3JlYXNpbmcgdGhlIHBhZ2VTaXplLilcclxuICAgICAgaWYoIXRoaXMucGFnZWFibGUpIHtcclxuICAgICAgICByZXN1bHRzLml0ZW1zID0gcmVzdWx0cy5pdGVtcy5zbGljZSgwLCB0aGlzLm1heEl0ZW1Db3VudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5lZWQgdG8ga25vdyB0aGlzIChhbG9uZyB3aXRoIGlmIHRoZXJlJ3MgYSB2YWx1ZSBpbiB0aGUgZm9ybU1vZGVsKSB0byBkZXRlcm1pbmUgd2hhdCB0byBzaG93IGluIHRoZSBmb290ZXJcclxuICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gcmVzdWx0cztcclxuICAgIFxyXG4gICAgICB0aGlzLnRhYmxlQ2FwdGlvbiA9IHRoaXMuZ2V0Q2FwdGlvbihyZXN1bHRzKTtcclxuICAgICAgdGhpcy5yZXN1bHRzQ291bnQgPSB0aGlzLnBhZ2VhYmxlID8gdGhpcy5yb3dDb3VudFBpcGUudHJhbnNmb3JtKHJlc3VsdHMsIHRoaXMub2JqZWN0VHlwZSwgdW5kZWZpbmVkLCB0aGlzLnBhZ2VJbmZvKTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dDb3VudFBpcGUudHJhbnNmb3JtKHJlc3VsdHMsIHRoaXMub2JqZWN0VHlwZSwgdGhpcy5tYXhJdGVtQ291bnQpO1xyXG5cclxuICAgICAgLy8gRGlzYWJsZSBzZWFyY2hib3ggd2hlbiBpbiBuby1kYXRhIHN0YXRlXHJcbiAgICAgIGlmICghcmVzdWx0cy5pdGVtcy5sZW5ndGggJiYgIXRoaXMuc2VhcmNoTW9kZWwudmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1vZGVsLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoTW9kZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICAvLyByZS1lbmFibGUgaWYgaXQgd2FzIGRpc2FibGVkLCBidXQgbm93IGhhcyBpdGVtc1xyXG4gICAgICAgIHRoaXMuc2VhcmNoTW9kZWwuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdoYXNEYXRhJyk7XHJcbiAgICAgIC8vIFNlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIHBhcmVudCBjb21wb25lbnRcclxuICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KHJlc3VsdHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gV2hlbiAncmVhZHknIGlzIGNvbXBsZXRlZCBieSB0aGUgaG9zdCwgaW5pdGlhbGl6ZSB0aGUgdGFibGUgd2l0aCB0aGUgY3VycmVudCBmb3JtIG1vZGVsIHZhbHVlc1xyXG4gICAgdGhpcy5yZWFkeS5zdWJzY3JpYmUoe1xyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdFRhYmxlLm5leHQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuaW5pdFRhYmxlLmNvbXBsZXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBhc3MgYWxvbmcgc29ydCB0byBwYXJlbnQgY29tcG9uZW50ICovXHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFRhYmxlU29ydCB8IFRhYmxlU29ydFtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYSBwYWdlIGNoYW5nZXMsIHN0b3JlIHRoZSBuZXcgcGFnaW5nSW5mbyBhbmQgZW1pdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZm9ybSB0byB0cmlnZ2VyIGdldERhdGEuXHJcbiAgICovXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2luZ0luZm86IFBhZ2luZ0luZm8pIHtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsICdMb2FkaW5nJyk7XHJcbiAgICB0aGlzLnBhZ2VJbmZvID0gcGFnaW5nSW5mbztcclxuICAgIHRoaXMucGFnZUNoYW5nZUVtaXR0ZXIuZW1pdChwYWdpbmdJbmZvKTtcclxuICAgIHRoaXMucGFnZUNoYW5nZWQubmV4dCh0aGlzLmZvcm1Nb2RlbC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogV2lyZSB1cCBhIGhhbmRsZXIgdG8gdGhlIGByZWZyZXNoYCBvYnNlcnZhYmxlIHNvIHRoYXQgd2hlblxyXG4gICAqIHRoZSBob3N0IHBhZ2UgY29udGV4dCBjaGFuZ2VzIGl0IGNhbiBmb3JjZSB0aGUgdGFibGUgdG8gdXBkYXRlIGFzIHdlbGwuXHJcbiAgICpcclxuICAgKiBJZiB0aGUgYHJlZnJlc2hgIG9ic2VydmFibGUgcGFzc2VzIG9wdGlvbnMgYW5kIHRoZSBgY2xlYXJTZWFyY2hgIHByb3BlcnR5XHJcbiAgICogaXMgc2V0IHRvIHRydWUsIHJlc2V0IHRoZSBzZWFyY2hNb2RlbCBhbmQgcGFzcyBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgICpcclxuICAgKiBJZiBgcmVmcmVzaGAgb2JzZXJ2YWJsZSBkb2VzIG5vdCBwYXNzIG9wdGlvbnMgb3IgdGhlIGBjbGVhclNlYXJjaGAgcHJvcGVydHlcclxuICAgKiBpcyBzZXQgdG8gZmFsc2UsIHBhc3MgYWxvbmcgdGhlIGN1cnJlbnQgc2VhcmNoTW9kZWwgVmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcFJlZnJlc2hUcmlnZ2VyKCkge1xyXG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUcmlnZ2VyID0gdGhpcy5yZWZyZXNoLnBpcGUoXHJcbiAgICAgICAgbWFwKG9wdHMgPT4ge1xyXG4gICAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5jbGVhclNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaE1vZGVsLnJlc2V0KCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRoaXMuZm9ybU1vZGVsLCBzZWFyY2hNb2RlbDogJycgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1Nb2RlbC52YWx1ZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAqL1xyXG4gIHByaXZhdGUgZ2V0Q2FwdGlvbihyZXN1bHRzOiBUYWJsZVNlYXJjaFJlc3VsdHMpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJlc3VsdHMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hNb2RlbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5ub1NlYXJjaFJlc3VsdHNNZXNzYWdlIHx8ICdTZWFyY2hhYmxlVGFibGVfRGVmYXVsdF9Ob01hdGNoZXNfU0MnLCB7IHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoTW9kZWwudmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubm9EYXRhTWVzc2FnZSB8fCAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJyk7XHJcbiAgfVxyXG5cclxufSIsIjxoZWFkZXIgKm5nSWY9XCIhaGlkZUhlYWRlclwiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1zaHJpbmsgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICA8ZWMtdGV4dGJveCBpZD1cInt7aWR9fV9zZWFyY2hib3hcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWhpZGVTZWFyY2hDb250cm9sXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1iLTAgZmxleC1ncm93IG1yLTJcIlxyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInNlYXJjaE1vZGVsXCJcclxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwic2VhcmNoYm94VGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hib3hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlYXJjaGJveFJlYWRvbmx5XCI+PC9lYy10ZXh0Ym94PlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3dcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5zZWFyY2hhYmxlLXRhYmxlLWNvbnRyb2xzXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L2hlYWRlcj5cclxuPHNlY3Rpb24gaWQ9XCJ7e2lkfX1fY2FyZFwiXHJcbiAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHt7b3ZlcmxheUNsYXNzZXN9fVwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtdHJhbnNsdWNlbnQnOiBzdGF0dXMuc3RhdHVzICE9PSAnZXJyb3InLCAnaGFzLW1hc2snOiBzdGF0dXMuc3RhdHVzICE9PSAnaGFzRGF0YScsICdjYXJkIG0tMCBiZy1jb250ZW50JzogIWN1c3RvbUNvbnRlbnRUZW1wbGF0ZSAmJiAhcmVtb3ZlQ2FyZH1cIlxyXG4gICAgICAgICBlY092ZXJsYXlcclxuICAgICAgICAgW3N0YXR1c109XCJzdGF0dXMuc3RhdHVzXCJcclxuICAgICAgICAgW21lc3NhZ2VdPVwic3RhdHVzLm1lc3NhZ2VcIlxyXG4gICAgICAgICBbZGlzcGxheUFzTWFza109XCJ0cnVlXCI+XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmNhcmQtaGVhZGVyXCI+PC9uZy1jb250ZW50PlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Db250ZW50VGVtcGxhdGUgfHwgZGVmYXVsdENvbnRlbnRUZW1wbGF0ZVwiPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGlzIGFuIGVjLXRhYmxlIHdpdGggcHJveGllZC1vdmVyIHNlYXJjaGFibGUgdGFibGUgaW5wdXRzLiBcclxuICAgIElmIHRoYXQgZG9lc24ndCB3b3JrIGZvciB5b3UgdGhlbiB5b3UgY2FuIHNwZWNpZnkgYSBjdXN0b21Db250ZW50VGVtcGxhdGUgdG8gdXNlIGluc3RlYWRcclxuICAgIGFuZCBzdGlsbCByZXRhaW4gYWxsIHRoZSBldmVudCBoYW5kbGluZywgaGVhZGVyLCBmb290ZXIgcGFnaW5hdGlvbiwgZXRjIHN1cHBvcnQgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29udGVudFRlbXBsYXRlPlxyXG4gICAgPGVjLXRhYmxlIGlkPVwie3tpZH19X3RhYmxlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInt7dGFibGVDbGFzc2VzfX1cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1maXhlZF09XCJ0YWJsZUxheW91dEZpeGVkXCJcclxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGVcIlxyXG4gICAgICAgICAgICAgIFtzb3J0XT1cInNvcnRcIlxyXG4gICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cIm9uU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGlvbkNvbnRleHRdPVwic2VsZWN0aW9uQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZV09XCJzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInJlc2l6YWJsZUNvbHVtbnNcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9lYy10YWJsZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIHBhZ2luYXRpb24gZm9vdGVyIHZpc2libGUgaWYgdGFibGUgaXMgcGFnZS1hYmxlIGFuZCB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIHJlc3VsdHMgLS0+XHJcbiAgPGZvb3RlciAqbmdJZj1cIiFoaWRlRm9vdGVyICYmIHBhZ2VhYmxlICYmIHNlYXJjaFJlc3VsdHMudG90YWxJdGVtc0JlZm9yZVBhZ2luZyEgPiBwYWdlU2l6ZSFcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwYWdpbmF0aW9uLWZvb3RlclwiXHJcbiAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRvcF09XCIhY3VzdG9tQ29udGVudFRlbXBsYXRlXCI+XHJcbiAgICA8ZWMtdGFibGUtcGFnaW5hdGlvbiBpZD1cInt7aWR9fV9wYWdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtY29sb3ItcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJzZWFyY2hSZXN1bHRzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhUYWJzXT1cIm1heFRhYnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VOdW1iZXJdPVwicGFnZUluZm8/LnBhZ2VOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVQYWdpbmF0aW9uQ29udHJvbHNdPVwiZGlzYWJsZVBhZ2luYXRpb25Db250cm9sc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj5cclxuICAgIDwvZWMtdGFibGUtcGFnaW5hdGlvbj5cclxuICAgIDxkaXYgaWQ9XCJyZXN1bHRzQ291bnRcIlxyXG4gICAgICAgICAqbmdJZj1cInNlYXJjaFJlc3VsdHM/Lml0ZW1zPy5sZW5ndGhcIlxyXG4gICAgICAgICBjbGFzcz1cIm1sLWF1dG8gZm9udC1jb2xvci1oaW50IHRleHQtdHJ1bmNhdGVcIiBcclxuICAgICAgICAgdGl0bGU9XCJ7e3Jlc3VsdHNDb3VudH19IHt7YWRkaXRpb25hbENvdW50VGV4dH19XCI+e3tyZXN1bHRzQ291bnR9fSB7e2FkZGl0aW9uYWxDb3VudFRleHR9fTwvZGl2PlxyXG4gIDwvZm9vdGVyPlxyXG5cclxuICA8IS0tIGRlZmF1bHQgZm9vdGVyOiB2aXNpYmxlIGlmIGhpZGVGb290ZXIgaXMgZmFsc2UgYW5kIHRhYmxlIGlzIG5vdCBwYWdlLWFibGUgb3IgdGhlcmUgYXJlIG9ubHkgb25lIHBhZ2Ugb2YgcmVzdWx0cyAoYWx3YXlzIHNob3dzIGlmIHRoZXJlIGlzIGEgY2FwdGlvbiB0byBpbmRpY2F0ZSBubyByZXN1bHRzKSAtLT5cclxuICA8Zm9vdGVyICpuZ0lmPVwiKCFoaWRlRm9vdGVyICYmICghcGFnZWFibGUgfHwgc2VhcmNoUmVzdWx0cy50b3RhbEl0ZW1zQmVmb3JlUGFnaW5nISA8PSBwYWdlU2l6ZSEpKSB8fCB0YWJsZUNhcHRpb25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJjYXB0aW9uLWZvb3RlclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2hhcy1yZXN1bHRzJzogc2VhcmNoUmVzdWx0cz8uaXRlbXM/Lmxlbmd0aCwgJ2JvcmRlci10b3AnOiBzZWFyY2hSZXN1bHRzPy5pdGVtcz8ubGVuZ3RoICYmICFjdXN0b21Db250ZW50VGVtcGxhdGV9XCI+XHJcbiAgICA8bmctY29udGVudCAqbmdJZj1cIiF0YWJsZUNhcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgc2VsZWN0PVwiLnNlYXJjaGFibGUtdGFibGUtZm9vdGVyXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPGRpdiBpZD1cInRhYmxlQ2FwdGlvblwiXHJcbiAgICAgICAgICpuZ0lmPVwidGFibGVDYXB0aW9uXCJcclxuICAgICAgICAgW2lubmVySFRNTF09XCJ0YWJsZUNhcHRpb25cIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJyZXN1bHRzQ291bnRcIlxyXG4gICAgICAgICAqbmdJZj1cInNlYXJjaFJlc3VsdHM/Lml0ZW1zPy5sZW5ndGhcIlxyXG4gICAgICAgICBjbGFzcz1cIm1sLWF1dG8gdGV4dC10cnVuY2F0ZVwiXHJcbiAgICAgICAgIHRpdGxlPVwie3tyZXN1bHRzQ291bnR9fSB7e2FkZGl0aW9uYWxDb3VudFRleHR9fVwiPnt7cmVzdWx0c0NvdW50fX0ge3thZGRpdGlvbmFsQ291bnRUZXh0fX08L2Rpdj5cclxuICA8L2Zvb3Rlcj5cclxuPC9zZWN0aW9uPiJdfQ==
1
+ import { Component, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
2
+ import { EMPTY, merge, Subject } from 'rxjs';
3
+ import { catchError, debounceTime, map, pluck, skipUntil, switchMap, takeUntil, tap } from 'rxjs/operators';
4
+ import { Overlay } from '../view-overlay/view-overlay.component';
5
+ import { ResizableColumnComponent } from './resizable-column.component';
6
+ import { TablePaginationComponent } from './table-pagination.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../core/error.service";
9
+ import * as i2 from "@ngx-translate/core";
10
+ import * as i3 from "../../shared/display/pipes/row-count.pipe";
11
+ import * as i4 from "@angular/common";
12
+ import * as i5 from "../../controls/textbox/textbox.component";
13
+ import * as i6 from "../view-overlay/view-overlay.component";
14
+ import * as i7 from "./table.component";
15
+ import * as i8 from "./table-pagination.component";
16
+ export class SearchableTableComponent {
17
+ /** Reference to the searchModel */
18
+ get searchModel() {
19
+ return this.formModel.controls.searchModel;
20
+ }
21
+ constructor(errorService, translateService, rowCountPipe) {
22
+ this.errorService = errorService;
23
+ this.translateService = translateService;
24
+ this.rowCountPipe = rowCountPipe;
25
+ this.id = '';
26
+ this.resizable = false;
27
+ this.sortable = false;
28
+ this.autofocus = false;
29
+ /**Set to a space-separated set of strings that should be added to the ec-table class attribute
30
+ * this allows finer control over styling.
31
+ */
32
+ this.tableClasses = '';
33
+ /** Emits when table sort has changed */
34
+ this.sortChange = new EventEmitter();
35
+ /** Emits when the table page has changed */
36
+ this.pageChangeEmitter = new EventEmitter();
37
+ /** Placeholder text for the searchbox */
38
+ this.searchboxPlaceholder = '';
39
+ /**
40
+ * Displayed in overlay when no data is returned (without searching).
41
+ *
42
+ * Defaults to "SearchableTable_Default_NoData_SC"
43
+ */
44
+ this.noDataMessage = 'SearchableTable_Default_NoData_SC';
45
+ /**
46
+ * Displayed in overlay when no data is returned (after searching).
47
+ * Ensure translation has an interpolation placeholder for "searchText".
48
+ *
49
+ * Defaults to "SearchableTable_Default_NoMatches_SC"
50
+ *
51
+ * @example
52
+ * // 7 requires single curly braces
53
+ * No items found matching <strong>{{searchText}}</strong>
54
+ */
55
+ this.noSearchResultsMessage = 'SearchableTable_Default_NoMatches_SC';
56
+ /** Allow the host component to supply an overlay to control the pending state of the table */
57
+ this.status = new Overlay('hasData');
58
+ /**
59
+ * Sets the underlying table's layout to fixed.
60
+ */
61
+ this.tableLayoutFixed = false;
62
+ /** Emits items returned by the getItems function, along with total count */
63
+ this.itemsChange = new EventEmitter();
64
+ /** Maximum number of items to show in the table (default: 100) */
65
+ this.maxItemCount = 100;
66
+ /** Set to true to hide search box (does not hide the other searchable table controls */
67
+ this.hideSearchControl = false;
68
+ /** Set to true to hide the entire header */
69
+ this.hideHeader = false;
70
+ /** Type of object in the table. Displayed in footer (default: 'results')*/
71
+ this.objectType = 'results';
72
+ /** Set to true to hide the table footer */
73
+ this.hideFooter = false;
74
+ /**
75
+ * Set to true to enable paging. If paging is enabled, pageSize must be provided.
76
+ * getItems will be passed both a search and a PagingInfo object when called. It must include totalItemsBeforePaging in the TableSearchResults output.
77
+ * Here is a simple implementation:
78
+ * @example
79
+ * getItems(search?: string, pageChangeInfo?: PagingInfo): Observable<TableSearchResults> {
80
+ let results: SimpleItem[] = [...this.paginatedTableItems];
81
+ //apply search
82
+ if(search) {
83
+ results = this.paginatedTableItems.filter(i => i.a.toLowerCase().includes(search.toLowerCase()));
84
+ }
85
+ //get count before applying paging
86
+ let countBeforePaging = results.length;
87
+ //apply paging
88
+ if(pageChangeInfo) {
89
+ results = results.slice(pageChangeInfo!.skip, pageChangeInfo!.skip + pageChangeInfo!.pageSize);
90
+ }
91
+ return of({ items: results, totalItems: results.length, totalItemsBeforePaging: countBeforePaging });
92
+ }
93
+ */
94
+ this.pageable = false;
95
+ /**
96
+ * Maximum number of page tabs to show
97
+ */
98
+ this.maxTabs = 10;
99
+ /**
100
+ * Makes the searchbox readonly if true.
101
+ */
102
+ this.searchboxReadonly = false;
103
+ /** Optional text to add to the results count in the table footer. This text will be added after the count and objectType. */
104
+ this.additionalCountText = '';
105
+ /** Enables table row selection and row highlighting styles when true */
106
+ this.selectable = false;
107
+ /** When true, removes the card styles from the table wrapper */
108
+ this.removeCard = false;
109
+ /** Classes to add to the overlay/card element */
110
+ this.overlayClasses = '';
111
+ /** When true the overlay and table will not have flex-shrink-max but instead flex-grow */
112
+ this.fillParentHeight = false;
113
+ /** Passed to the pagination control component. Used to disable the pagination controls */
114
+ this.disablePaginationControls = false;
115
+ /**
116
+ * Text displayed in the footer.
117
+ * Sometimes `noDataMessage`, sometimes `noSearchResultsMessage`
118
+ */
119
+ this.tableCaption = this.translateService.instant(this.noDataMessage || 'SearchableTable_Default_NoData_SC');
120
+ /** count of results displayed in the table */
121
+ this.resultsCount = '';
122
+ /** Items returned by the getItems function, along with total count */
123
+ this.searchResults = { items: [], totalItems: 0 };
124
+ /**
125
+ * If passed an input for refresh, triggers reloading items.
126
+ * Otherwise, completes immediately (will never trigger reload).
127
+ */
128
+ this.refreshTrigger = EMPTY;
129
+ this.destroyed = new Subject();
130
+ this.pageChanged = new Subject();
131
+ /** Triggers the initial load of the table */
132
+ this.initTable = new Subject();
133
+ }
134
+ ngOnChanges(changes) {
135
+ if (changes.pageSize && !changes.pageSize.firstChange && this.pageable) {
136
+ // If the pageSize changes, reset to the first page and refresh.
137
+ this.pageInfo = TablePaginationComponent.getPagingInfo(1, this.pageSize);
138
+ this.onPageChange(this.pageInfo);
139
+ }
140
+ }
141
+ ngOnInit() {
142
+ this.status.setStatus('pending', 'Loading');
143
+ this.setUpRefreshTrigger();
144
+ // Watch for searchbox/other control changes or refresh requests
145
+ const searchOrRefresh = merge(this.formModel.valueChanges.pipe(skipUntil(this.ready), debounceTime(300)), this.refreshTrigger, this.initTable).pipe(tap(() => {
146
+ //a change to any form control or a refresh should reset the pageInfo to the first page if the table is pageable.
147
+ //(if we didnt reset the pageInfo, we'd have to call getItems with the previous pageInfo, which may not be valid for the new results)
148
+ if (this.pageable) {
149
+ this.pageInfo = TablePaginationComponent.getPagingInfo(1, this.pageSize);
150
+ }
151
+ }));
152
+ const updateResults = merge(searchOrRefresh, this.pageChanged.pipe(
153
+ // Prevent a call to getItems when the pageSize is set during page init and before ready is completed
154
+ skipUntil(this.ready)));
155
+ // Call getItems and watch for errors
156
+ const getData = updateResults.pipe(
157
+ // Pluck the searchModel value out of the formModel
158
+ pluck('searchModel'),
159
+ // Ensure search string is defined
160
+ // Trim and lowercase it to aid case-insensitive searching
161
+ map((searchString) => {
162
+ let search = searchString || '';
163
+ return search.trim().toLowerCase();
164
+ }),
165
+ // Show status overlay
166
+ tap(() => this.status.setStatus('pending', 'Loading')),
167
+ // Call passed function
168
+ switchMap((searchString) =>
169
+ //if the table is pageable, pageInfo will be defined.
170
+ this.getItems(searchString, this.pageInfo)),
171
+ // If passed function fails, show error status
172
+ catchError((err, caught) => {
173
+ this.status.setStatus('error', this.errorService.parseApiError(err));
174
+ // return the caught observable so the subscription doesn't complete
175
+ return caught;
176
+ }), takeUntil(this.destroyed));
177
+ // Handle returned data and notify parent
178
+ getData.subscribe((results) => {
179
+ // Limiting number of results to show if not pageable (if pageable the max number of items in the table
180
+ // can be modified by increasing/decreasing the pageSize.)
181
+ if (!this.pageable) {
182
+ results.items = results.items.slice(0, this.maxItemCount);
183
+ }
184
+ // Need to know this (along with if there's a value in the formModel) to determine what to show in the footer
185
+ this.searchResults = results;
186
+ this.tableCaption = this.getCaption(results);
187
+ this.resultsCount = this.pageable ? this.rowCountPipe.transform(results, this.objectType, undefined, this.pageInfo) :
188
+ this.rowCountPipe.transform(results, this.objectType, this.maxItemCount);
189
+ // Disable searchbox when in no-data state
190
+ if (!results.items.length && !this.searchModel.value) {
191
+ this.searchModel.disable({ emitEvent: false });
192
+ }
193
+ else if (this.searchModel.disabled) {
194
+ // re-enable if it was disabled, but now has items
195
+ this.searchModel.enable({ emitEvent: false });
196
+ }
197
+ this.status.setStatus('hasData');
198
+ // Send the results to the parent component
199
+ this.itemsChange.emit(results);
200
+ });
201
+ // When 'ready' is completed by the host, initialize the table with the current form model values
202
+ this.ready.subscribe({
203
+ complete: () => {
204
+ this.initTable.next(this.formModel.value);
205
+ this.initTable.complete();
206
+ }
207
+ });
208
+ }
209
+ ngOnDestroy() {
210
+ this.destroyed.next();
211
+ this.destroyed.unsubscribe();
212
+ }
213
+ /** Pass along sort to parent component */
214
+ onSortChange(sort) {
215
+ this.sortChange.emit(sort);
216
+ }
217
+ /**
218
+ * When a page changes, store the new pagingInfo and emit the current value of the form to trigger getData.
219
+ */
220
+ onPageChange(pagingInfo) {
221
+ this.status.setStatus('pending', 'Loading');
222
+ this.pageInfo = pagingInfo;
223
+ this.pageChangeEmitter.emit(pagingInfo);
224
+ this.pageChanged.next(this.formModel.value);
225
+ }
226
+ /**
227
+ * Wire up a handler to the `refresh` observable so that when
228
+ * the host page context changes it can force the table to update as well.
229
+ *
230
+ * If the `refresh` observable passes options and the `clearSearch` property
231
+ * is set to true, reset the searchModel and pass an empty string.
232
+ *
233
+ * If `refresh` observable does not pass options or the `clearSearch` property
234
+ * is set to false, pass along the current searchModel Value.
235
+ */
236
+ setUpRefreshTrigger() {
237
+ if (this.refresh) {
238
+ this.refreshTrigger = this.refresh.pipe(map(opts => {
239
+ if (opts && opts.clearSearch) {
240
+ this.searchModel.reset('', { emitEvent: false });
241
+ return { ...this.formModel, searchModel: '' };
242
+ }
243
+ return this.formModel.value;
244
+ }), takeUntil(this.destroyed));
245
+ }
246
+ }
247
+ /** Get text to display in the footer. */
248
+ getCaption(results) {
249
+ if (results.items.length) {
250
+ return '';
251
+ }
252
+ if (this.searchModel.value) {
253
+ return this.translateService.instant(this.noSearchResultsMessage || 'SearchableTable_Default_NoMatches_SC', { searchText: this.searchModel.value });
254
+ }
255
+ return this.translateService.instant(this.noDataMessage || 'SearchableTable_Default_NoData_SC');
256
+ }
257
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchableTableComponent, deps: [{ token: i1.ErrorService }, { token: i2.TranslateService }, { token: i3.RowCountPipe }], target: i0.ɵɵFactoryTarget.Component }); }
258
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SearchableTableComponent, selector: "ec-searchable-table", inputs: { id: "id", resizable: "resizable", sortable: "sortable", sort: "sort", autofocus: "autofocus", tableClasses: "tableClasses", searchboxPlaceholder: "searchboxPlaceholder", formModel: "formModel", noDataMessage: "noDataMessage", noSearchResultsMessage: "noSearchResultsMessage", ready: "ready", getItems: "getItems", refresh: "refresh", status: "status", tableLayoutFixed: "tableLayoutFixed", searchboxTabIndex: "searchboxTabIndex", maxItemCount: "maxItemCount", hideSearchControl: "hideSearchControl", hideHeader: "hideHeader", objectType: "objectType", hideFooter: "hideFooter", pageable: "pageable", pageSize: "pageSize", maxTabs: "maxTabs", searchboxReadonly: "searchboxReadonly", selectionContext: "selectionContext", selectionToolbarTemplate: "selectionToolbarTemplate", additionalCountText: "additionalCountText", selectable: "selectable", customContentTemplate: "customContentTemplate", removeCard: "removeCard", overlayClasses: "overlayClasses", fillParentHeight: "fillParentHeight", disablePaginationControls: "disablePaginationControls" }, outputs: { sortChange: "sortChange", pageChangeEmitter: "pageChange", itemsChange: "itemsChange" }, queries: [{ propertyName: "resizableColumns", predicate: ResizableColumnComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<header *ngIf=\"!hideHeader\"\r\n class=\"d-flex flex-shrink align-items-center mb-3\">\r\n <ec-textbox id=\"{{id}}_searchbox\"\r\n *ngIf=\"!hideSearchControl\"\r\n class=\"mb-0 flex-grow mr-2\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"searchModel\"\r\n [tabindex]=\"searchboxTabIndex\"\r\n [placeholder]=\"searchboxPlaceholder\"\r\n [readonly]=\"searchboxReadonly\"></ec-textbox>\r\n <div class=\"flex-grow\">\r\n <ng-content select=\".searchable-table-controls\"></ng-content>\r\n </div>\r\n</header>\r\n<section id=\"{{id}}_card\"\r\n class=\"d-flex flex-column {{overlayClasses}}\"\r\n [ngClass]=\"{'is-translucent': status.status !== 'error', 'has-mask': status.status !== 'hasData', 'card m-0 bg-content': !customContentTemplate && !removeCard}\"\r\n ecOverlay\r\n [status]=\"status.status\"\r\n [message]=\"status.message\"\r\n [displayAsMask]=\"true\">\r\n <ng-content select=\".card-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\">\r\n </ng-container>\r\n\r\n <!-- the default template is an ec-table with proxied-over searchable table inputs. \r\n If that doesn't work for you then you can specify a customContentTemplate to use instead\r\n and still retain all the event handling, header, footer pagination, etc support -->\r\n <ng-template #defaultContentTemplate>\r\n <ec-table id=\"{{id}}_table\"\r\n class=\"{{tableClasses}}\"\r\n [class.is-fixed]=\"tableLayoutFixed\"\r\n [sortable]=\"sortable\"\r\n [sort]=\"sort\"\r\n (sortChange)=\"onSortChange($event)\"\r\n [resizable]=\"resizable\"\r\n [scrollable]=\"true\"\r\n [selectable]=\"selectable\"\r\n [selectionContext]=\"selectionContext\"\r\n [selectionToolbarTemplate]=\"selectionToolbarTemplate\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </ec-table>\r\n </ng-template>\r\n\r\n <!-- pagination footer visible if table is page-able and there are more than one page of results -->\r\n <footer *ngIf=\"!hideFooter && pageable && searchResults.totalItemsBeforePaging! > pageSize!\"\r\n class=\"pagination-footer\"\r\n [class.border-top]=\"!customContentTemplate\">\r\n <ec-table-pagination id=\"{{id}}_pager\"\r\n class=\"font-color-primary\"\r\n [totalItems]=\"searchResults.totalItemsBeforePaging\"\r\n [pageSize]=\"pageSize\"\r\n [maxTabs]=\"maxTabs\"\r\n [pageNumber]=\"pageInfo?.pageNumber\"\r\n [disablePaginationControls]=\"disablePaginationControls\"\r\n (pageChanged)=\"onPageChange($event)\">\r\n </ec-table-pagination>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto font-color-hint text-truncate\" \r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n\r\n <!-- default footer: visible if hideFooter is false and table is not page-able or there are only one page of results (always shows if there is a caption to indicate no results) -->\r\n <footer *ngIf=\"(!hideFooter && (!pageable || searchResults.totalItemsBeforePaging! <= pageSize!)) || tableCaption\"\r\n class=\"caption-footer\"\r\n [ngClass]=\"{'has-results': searchResults?.items?.length, 'border-top': searchResults?.items?.length && !customContentTemplate}\">\r\n <ng-content *ngIf=\"!tableCaption\"\r\n select=\".searchable-table-footer\"></ng-content>\r\n <div id=\"tableCaption\"\r\n *ngIf=\"tableCaption\"\r\n [innerHTML]=\"tableCaption\"></div>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto text-truncate\"\r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n</section>", styles: [":host{--ec-searchable-table-flex-properties: 0 1 auto;--ec-searchable-table-flex-overlay-section: var(--ec-searchable-table-flex-properties, 0 1 auto);--ec-searchable-table-flex-ec-table: var(--ec-searchable-table-flex-properties, 0 1 auto);display:flex;flex-direction:column;flex:1 1;min-height:0}:host ::ng-deep .card-header+ec-table.is-selectable th{height:2.5rem;padding-bottom:.9375rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle{padding-top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle:before{top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable .selectable-table-toolbar{height:2.5rem;padding-bottom:.5rem}section{flex:var(--ec-searchable-table-flex-overlay-section);min-height:0}ec-table{flex:var(--ec-searchable-table-flex-ec-table);min-height:0}footer{display:flex;align-items:center;flex:none;font-size:var(--ec-font-size-label);line-height:1rem}footer.has-results{color:var(--ec-color-hint-dark);text-align:right}.pagination-footer{padding:0 .5rem 0 0}.caption-footer{padding:.5rem;height:var(--ec-searchable-table-height-caption-footer)}.card.has-mask{min-height:15rem}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i6.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i7.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i8.TablePaginationComponent, selector: "ec-table-pagination", inputs: ["id", "totalItems", "pageSize", "pageNumber", "maxTabs", "disablePaginationControls"], outputs: ["pageChanged"] }] }); }
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchableTableComponent, decorators: [{
261
+ type: Component,
262
+ args: [{ selector: 'ec-searchable-table', template: "<header *ngIf=\"!hideHeader\"\r\n class=\"d-flex flex-shrink align-items-center mb-3\">\r\n <ec-textbox id=\"{{id}}_searchbox\"\r\n *ngIf=\"!hideSearchControl\"\r\n class=\"mb-0 flex-grow mr-2\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"searchModel\"\r\n [tabindex]=\"searchboxTabIndex\"\r\n [placeholder]=\"searchboxPlaceholder\"\r\n [readonly]=\"searchboxReadonly\"></ec-textbox>\r\n <div class=\"flex-grow\">\r\n <ng-content select=\".searchable-table-controls\"></ng-content>\r\n </div>\r\n</header>\r\n<section id=\"{{id}}_card\"\r\n class=\"d-flex flex-column {{overlayClasses}}\"\r\n [ngClass]=\"{'is-translucent': status.status !== 'error', 'has-mask': status.status !== 'hasData', 'card m-0 bg-content': !customContentTemplate && !removeCard}\"\r\n ecOverlay\r\n [status]=\"status.status\"\r\n [message]=\"status.message\"\r\n [displayAsMask]=\"true\">\r\n <ng-content select=\".card-header\"></ng-content>\r\n <ng-container *ngTemplateOutlet=\"customContentTemplate || defaultContentTemplate\">\r\n </ng-container>\r\n\r\n <!-- the default template is an ec-table with proxied-over searchable table inputs. \r\n If that doesn't work for you then you can specify a customContentTemplate to use instead\r\n and still retain all the event handling, header, footer pagination, etc support -->\r\n <ng-template #defaultContentTemplate>\r\n <ec-table id=\"{{id}}_table\"\r\n class=\"{{tableClasses}}\"\r\n [class.is-fixed]=\"tableLayoutFixed\"\r\n [sortable]=\"sortable\"\r\n [sort]=\"sort\"\r\n (sortChange)=\"onSortChange($event)\"\r\n [resizable]=\"resizable\"\r\n [scrollable]=\"true\"\r\n [selectable]=\"selectable\"\r\n [selectionContext]=\"selectionContext\"\r\n [selectionToolbarTemplate]=\"selectionToolbarTemplate\"\r\n [resizableColumns]=\"resizableColumns\">\r\n <ng-content></ng-content>\r\n </ec-table>\r\n </ng-template>\r\n\r\n <!-- pagination footer visible if table is page-able and there are more than one page of results -->\r\n <footer *ngIf=\"!hideFooter && pageable && searchResults.totalItemsBeforePaging! > pageSize!\"\r\n class=\"pagination-footer\"\r\n [class.border-top]=\"!customContentTemplate\">\r\n <ec-table-pagination id=\"{{id}}_pager\"\r\n class=\"font-color-primary\"\r\n [totalItems]=\"searchResults.totalItemsBeforePaging\"\r\n [pageSize]=\"pageSize\"\r\n [maxTabs]=\"maxTabs\"\r\n [pageNumber]=\"pageInfo?.pageNumber\"\r\n [disablePaginationControls]=\"disablePaginationControls\"\r\n (pageChanged)=\"onPageChange($event)\">\r\n </ec-table-pagination>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto font-color-hint text-truncate\" \r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n\r\n <!-- default footer: visible if hideFooter is false and table is not page-able or there are only one page of results (always shows if there is a caption to indicate no results) -->\r\n <footer *ngIf=\"(!hideFooter && (!pageable || searchResults.totalItemsBeforePaging! <= pageSize!)) || tableCaption\"\r\n class=\"caption-footer\"\r\n [ngClass]=\"{'has-results': searchResults?.items?.length, 'border-top': searchResults?.items?.length && !customContentTemplate}\">\r\n <ng-content *ngIf=\"!tableCaption\"\r\n select=\".searchable-table-footer\"></ng-content>\r\n <div id=\"tableCaption\"\r\n *ngIf=\"tableCaption\"\r\n [innerHTML]=\"tableCaption\"></div>\r\n <div id=\"resultsCount\"\r\n *ngIf=\"searchResults?.items?.length\"\r\n class=\"ml-auto text-truncate\"\r\n title=\"{{resultsCount}} {{additionalCountText}}\">{{resultsCount}} {{additionalCountText}}</div>\r\n </footer>\r\n</section>", styles: [":host{--ec-searchable-table-flex-properties: 0 1 auto;--ec-searchable-table-flex-overlay-section: var(--ec-searchable-table-flex-properties, 0 1 auto);--ec-searchable-table-flex-ec-table: var(--ec-searchable-table-flex-properties, 0 1 auto);display:flex;flex-direction:column;flex:1 1;min-height:0}:host ::ng-deep .card-header+ec-table.is-selectable th{height:2.5rem;padding-bottom:.9375rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle{padding-top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable th.is-resizable .handle:before{top:.5rem}:host ::ng-deep .card-header+ec-table.is-selectable .selectable-table-toolbar{height:2.5rem;padding-bottom:.5rem}section{flex:var(--ec-searchable-table-flex-overlay-section);min-height:0}ec-table{flex:var(--ec-searchable-table-flex-ec-table);min-height:0}footer{display:flex;align-items:center;flex:none;font-size:var(--ec-font-size-label);line-height:1rem}footer.has-results{color:var(--ec-color-hint-dark);text-align:right}.pagination-footer{padding:0 .5rem 0 0}.caption-footer{padding:.5rem;height:var(--ec-searchable-table-height-caption-footer)}.card.has-mask{min-height:15rem}\n"] }]
263
+ }], ctorParameters: function () { return [{ type: i1.ErrorService }, { type: i2.TranslateService }, { type: i3.RowCountPipe }]; }, propDecorators: { id: [{
264
+ type: Input
265
+ }], resizable: [{
266
+ type: Input
267
+ }], sortable: [{
268
+ type: Input
269
+ }], sort: [{
270
+ type: Input
271
+ }], autofocus: [{
272
+ type: Input
273
+ }], tableClasses: [{
274
+ type: Input
275
+ }], sortChange: [{
276
+ type: Output
277
+ }], pageChangeEmitter: [{
278
+ type: Output,
279
+ args: ['pageChange']
280
+ }], searchboxPlaceholder: [{
281
+ type: Input
282
+ }], formModel: [{
283
+ type: Input
284
+ }], noDataMessage: [{
285
+ type: Input
286
+ }], noSearchResultsMessage: [{
287
+ type: Input
288
+ }], ready: [{
289
+ type: Input
290
+ }], getItems: [{
291
+ type: Input
292
+ }], refresh: [{
293
+ type: Input
294
+ }], status: [{
295
+ type: Input
296
+ }], tableLayoutFixed: [{
297
+ type: Input
298
+ }], itemsChange: [{
299
+ type: Output
300
+ }], searchboxTabIndex: [{
301
+ type: Input
302
+ }], maxItemCount: [{
303
+ type: Input
304
+ }], hideSearchControl: [{
305
+ type: Input
306
+ }], hideHeader: [{
307
+ type: Input
308
+ }], objectType: [{
309
+ type: Input
310
+ }], hideFooter: [{
311
+ type: Input
312
+ }], pageable: [{
313
+ type: Input
314
+ }], pageSize: [{
315
+ type: Input
316
+ }], maxTabs: [{
317
+ type: Input
318
+ }], searchboxReadonly: [{
319
+ type: Input
320
+ }], selectionContext: [{
321
+ type: Input
322
+ }], selectionToolbarTemplate: [{
323
+ type: Input
324
+ }], resizableColumns: [{
325
+ type: ContentChildren,
326
+ args: [ResizableColumnComponent, { descendants: true }]
327
+ }], additionalCountText: [{
328
+ type: Input
329
+ }], selectable: [{
330
+ type: Input
331
+ }], customContentTemplate: [{
332
+ type: Input
333
+ }], removeCard: [{
334
+ type: Input
335
+ }], overlayClasses: [{
336
+ type: Input
337
+ }], fillParentHeight: [{
338
+ type: Input
339
+ }], disablePaginationControls: [{
340
+ type: Input
341
+ }] } });
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoYWJsZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90YWJsZS9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3NlYXJjaGFibGUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUF5QyxNQUFNLGVBQWUsQ0FBQztBQUc3SixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFjLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7QUFjcEYsTUFBTSxPQUFPLHdCQUF3QjtJQTRLbkMsbUNBQW1DO0lBQ25DLElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQWlDLENBQUM7SUFDbkUsQ0FBQztJQTBCRCxZQUNVLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxZQUEwQjtRQUYxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENB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QUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFzQkcsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFMEQsZ0JBQWdCO3NCQUEvRSxlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztnQkFHckQsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0cseUJBQXlCO3NCQUFqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRU1QVFksIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgbWFwLCBwbHVjaywgc2tpcFVudGlsLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3dDb3VudFBpcGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlzcGxheS9waXBlcy9yb3ctY291bnQucGlwZSc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vcmVzaXphYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdpbmdJbmZvLCBUYWJsZVBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3RhYmxlLXBhZ2luYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dCB9IGZyb20gJy4vdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVTb3J0IH0gZnJvbSAnLi90YWJsZS5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHR5cGUgVGFibGVTZWFyY2hSZXN1bHRzID0geyBpdGVtczogdW5rbm93bltdLCB0b3RhbEl0ZW1zOiBudW1iZXIsIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmc/OiBudW1iZXIgfTtcclxuZXhwb3J0IHR5cGUgU2VhcmNoYWJsZVRhYmxlUmVmcmVzaE9wdGlvbnMgPSB7IGNsZWFyU2VhcmNoPzogYm9vbGVhbiB9O1xyXG5cclxudHlwZSBTZWFyY2hhYmxlVGFibGVGb3JtTW9kZWwgPSB7IHNlYXJjaE1vZGVsPzogc3RyaW5nIH07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLXNlYXJjaGFibGUtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlYXJjaGFibGVUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBpZCA9ICcnO1xyXG4gIEBJbnB1dCgpIHJlc2l6YWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNvcnRhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc29ydD86IFRhYmxlU29ydCB8IFRhYmxlU29ydFtdO1xyXG4gIEBJbnB1dCgpIGF1dG9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipTZXQgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgc2V0IG9mIHN0cmluZ3MgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVjLXRhYmxlIGNsYXNzIGF0dHJpYnV0ZVxyXG4gICAqIHRoaXMgYWxsb3dzIGZpbmVyIGNvbnRyb2wgb3ZlciBzdHlsaW5nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYmxlQ2xhc3Nlczogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRhYmxlIHNvcnQgaGFzIGNoYW5nZWQgKi9cclxuICBAT3V0cHV0KCkgc29ydENoYW5nZTogRXZlbnRFbWl0dGVyPFRhYmxlU29ydCB8IFRhYmxlU29ydFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTb3J0IHwgVGFibGVTb3J0W10+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB0YWJsZSBwYWdlIGhhcyBjaGFuZ2VkICovXHJcbiAgQE91dHB1dCgncGFnZUNoYW5nZScpIHBhZ2VDaGFuZ2VFbWl0dGVyOiBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2luZ0luZm8+KCk7XHJcblxyXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgc2VhcmNoYm94ICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94UGxhY2Vob2xkZXIgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybUdyb3VwIGZvciB0aGUgc2VhcmNoYm94XHJcbiAgICpcclxuICAgKiBUaGUgcmVmZXJlbmNlZCBGb3JtR3JvdXAgKiptdXN0KiogY29udGFpbiBhIEZvcm1Db250cm9sIGNhbGxlZCAnc2VhcmNoTW9kZWwnLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JtTW9kZWwhOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5ZWQgaW4gb3ZlcmxheSB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgKHdpdGhvdXQgc2VhcmNoaW5nKS5cclxuICAgKlxyXG4gICAqIERlZmF1bHRzIHRvIFwiU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDXCJcclxuICAgKi9cclxuICBASW5wdXQoKSBub0RhdGFNZXNzYWdlOiBzdHJpbmcgPSAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheWVkIGluIG92ZXJsYXkgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIChhZnRlciBzZWFyY2hpbmcpLlxyXG4gICAqIEVuc3VyZSB0cmFuc2xhdGlvbiBoYXMgYW4gaW50ZXJwb2xhdGlvbiBwbGFjZWhvbGRlciBmb3IgXCJzZWFyY2hUZXh0XCIuXHJcbiAgICpcclxuICAgKiBEZWZhdWx0cyB0byBcIlNlYXJjaGFibGVUYWJsZV9EZWZhdWx0X05vTWF0Y2hlc19TQ1wiXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIC8vIDcgcmVxdWlyZXMgc2luZ2xlIGN1cmx5IGJyYWNlc1xyXG4gICAqIE5vIGl0ZW1zIGZvdW5kIG1hdGNoaW5nIDxzdHJvbmc+e3tzZWFyY2hUZXh0fX08L3N0cm9uZz5cclxuICAgKi9cclxuICBASW5wdXQoKSBub1NlYXJjaFJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgPSAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9NYXRjaGVzX1NDJztcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGhvc3RpbmcgcGFnZSBpcyByZWFkeSBmb3IgdGhlIHRhYmxlIHRvIGxvYWQgZGF0YS5cclxuICAgKlxyXG4gICAqIE5leHQgYW5kIENvbXBsZXRlIHRoaXMgb2JzZXJ2YWJsZSBhZnRlciBob3N0aW5nIHBhZ2UgaGFzIG1hZGUgYW55IHByZWxpbWluYXJ5XHJcbiAgICogQVBJIChvciBvdGhlciBhc3luY2hyb25vdXMpIGNhbGxzIHRvIGxvYWQgcHJlcmVxdWlzaXRlIGRhdGEgdXBvbiB3aGljaCB0aGUgY29kZVxyXG4gICAqIGluIHRoZSBgZ2V0SXRlbXNgIGZ1bmN0aW9uIGRlcGVuZHMuICBVc2UgYSBgUmVwbGF5U3ViamVjdGAgdG8gZW5zdXJlIGV2ZXJ5IGNvbXBvbmVudFxyXG4gICAqIHRoYXQgdXNlcyB0aGlzIG9ic2VydmFibGUgZ2V0cyB0aGUgTmV4dCBhbmQgQ29tcGxldGUgbm90aWZpY2F0aW9ucy5cclxuICAgKi9cclxuICBASW5wdXQoKSByZWFkeSE6IE9ic2VydmFibGU8dm9pZD47XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB0byBnZXQgaXRlbXMgdG8gZGlzcGxheSBpbiB0aGUgdGFibGUuXHJcbiAgICogSWYgcGFnZWFibGUgaXMgdHJ1ZSwgdGhlIFRhYmxlU2VhcmNoUmVzdWx0cyBuZWVkIHRvIGluY2x1ZGUgdG90YWxJdGVtc0JlZm9yZVBhZ2luZywgd2hpY2ggaXMgdGhlXHJcbiAgICogY291bnQgb2YgaXRlbXMgYmVmb3JlIHlvdSd2ZSBhcHBsaWVkIGFueSBwYWdpbmF0aW9uIChpLmUuIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW1lIGJhY2sgZnJvbSB0aGUgc2VhcmNoKS5cclxuICAgKlxyXG4gICAqIE1ha2Ugc3VyZSB0byBiaW5kIHRoZSBzY29wZSBpbiB0aGUgdGVtcGxhdGVcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIFtnZXRJdGVtc109XCJ5b3VyRnVuY3Rpb24uYmluZCh0aGlzKVwiXHJcbiAgICovXHJcbiAgQElucHV0KCkgZ2V0SXRlbXMhOiAoc2VhcmNoPzogc3RyaW5nLCBwYWdlQ2hhbmdlSW5mbz86IFBhZ2luZ0luZm8pID0+IE9ic2VydmFibGU8VGFibGVTZWFyY2hSZXN1bHRzPjtcclxuXHJcbiAgLyoqIE9ic2VydmFibGUgdGhhdCB3aWxsIGZvcmNlIHRoZSBnZXRJdGVtcyBmdW5jdGlvbiB0byBnZXQgY2FsbGVkIGFnYWluICovXHJcbiAgQElucHV0KCkgcmVmcmVzaD86IE9ic2VydmFibGU8U2VhcmNoYWJsZVRhYmxlUmVmcmVzaE9wdGlvbnMgfCB2b2lkPjtcclxuXHJcbiAgLyoqIEFsbG93IHRoZSBob3N0IGNvbXBvbmVudCB0byBzdXBwbHkgYW4gb3ZlcmxheSB0byBjb250cm9sIHRoZSBwZW5kaW5nIHN0YXRlIG9mIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHN0YXR1czogT3ZlcmxheSA9IG5ldyBPdmVybGF5KCdoYXNEYXRhJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHVuZGVybHlpbmcgdGFibGUncyBsYXlvdXQgdG8gZml4ZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGFibGVMYXlvdXRGaXhlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogRW1pdHMgaXRlbXMgcmV0dXJuZWQgYnkgdGhlIGdldEl0ZW1zIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIHRvdGFsIGNvdW50ICovXHJcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGFibGVTZWFyY2hSZXN1bHRzPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTZWFyY2hSZXN1bHRzPigpO1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGFiIGluZGV4IGZvciB0aGUgc2VhcmNoYm94ICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94VGFiSW5kZXg/OiBudW1iZXI7XHJcblxyXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBzaG93IGluIHRoZSB0YWJsZSAoZGVmYXVsdDogMTAwKSAqL1xyXG4gIEBJbnB1dCgpIG1heEl0ZW1Db3VudDogbnVtYmVyID0gMTAwO1xyXG5cclxuICAvKiogU2V0IHRvIHRydWUgdG8gaGlkZSBzZWFyY2ggYm94IChkb2VzIG5vdCBoaWRlIHRoZSBvdGhlciBzZWFyY2hhYmxlIHRhYmxlIGNvbnRyb2xzICovXHJcbiAgQElucHV0KCkgaGlkZVNlYXJjaENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGVudGlyZSBoZWFkZXIgKi9cclxuICBASW5wdXQoKSBoaWRlSGVhZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUeXBlIG9mIG9iamVjdCBpbiB0aGUgdGFibGUuIERpc3BsYXllZCBpbiBmb290ZXIgKGRlZmF1bHQ6ICdyZXN1bHRzJykqL1xyXG4gIEBJbnB1dCgpIG9iamVjdFR5cGU6IHN0cmluZyA9ICdyZXN1bHRzJztcclxuXHJcbiAgLyoqIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIHRhYmxlIGZvb3RlciAqL1xyXG4gIEBJbnB1dCgpIGhpZGVGb290ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHBhZ2luZy4gSWYgcGFnaW5nIGlzIGVuYWJsZWQsIHBhZ2VTaXplIG11c3QgYmUgcHJvdmlkZWQuXHJcbiAgICogZ2V0SXRlbXMgd2lsbCBiZSBwYXNzZWQgYm90aCBhIHNlYXJjaCBhbmQgYSBQYWdpbmdJbmZvIG9iamVjdCB3aGVuIGNhbGxlZC4gSXQgbXVzdCBpbmNsdWRlIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmcgaW4gdGhlIFRhYmxlU2VhcmNoUmVzdWx0cyBvdXRwdXQuXHJcbiAgICogSGVyZSBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbjogXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBnZXRJdGVtcyhzZWFyY2g/OiBzdHJpbmcsIHBhZ2VDaGFuZ2VJbmZvPzogUGFnaW5nSW5mbyk6IE9ic2VydmFibGU8VGFibGVTZWFyY2hSZXN1bHRzPiB7XHJcbiAgICAgIGxldCByZXN1bHRzOiBTaW1wbGVJdGVtW10gPSBbLi4udGhpcy5wYWdpbmF0ZWRUYWJsZUl0ZW1zXTtcclxuICAgICAgLy9hcHBseSBzZWFyY2hcclxuICAgICAgaWYoc2VhcmNoKSB7XHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucGFnaW5hdGVkVGFibGVJdGVtcy5maWx0ZXIoaSA9PiBpLmEudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vZ2V0IGNvdW50IGJlZm9yZSBhcHBseWluZyBwYWdpbmdcclxuICAgICAgbGV0IGNvdW50QmVmb3JlUGFnaW5nID0gcmVzdWx0cy5sZW5ndGg7XHJcbiAgICAgIC8vYXBwbHkgcGFnaW5nXHJcbiAgICAgIGlmKHBhZ2VDaGFuZ2VJbmZvKSB7XHJcbiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UocGFnZUNoYW5nZUluZm8hLnNraXAsIHBhZ2VDaGFuZ2VJbmZvIS5za2lwICsgcGFnZUNoYW5nZUluZm8hLnBhZ2VTaXplKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2YoeyBpdGVtczogcmVzdWx0cywgdG90YWxJdGVtczogcmVzdWx0cy5sZW5ndGgsIHRvdGFsSXRlbXNCZWZvcmVQYWdpbmc6IGNvdW50QmVmb3JlUGFnaW5nIH0pO1xyXG4gICAgfVxyXG4gICovXHJcbiAgQElucHV0KCkgcGFnZWFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWF4IHNpemUgb2YgYSBwYWdlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplPzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICogTWF4aW11bSBudW1iZXIgb2YgcGFnZSB0YWJzIHRvIHNob3dcclxuICovXHJcbiAgQElucHV0KCkgbWF4VGFicz86IG51bWJlciA9IDEwO1xyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyB0aGUgc2VhcmNoYm94IHJlYWRvbmx5IGlmIHRydWUuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2VhcmNoYm94UmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgaW5uZXIgVGFibGVDb21wb25lbnQgdG8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Db250ZXh0PzogVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dDtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgaW5uZXIgVGFibGVDb21wb25lbnQgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2hlbiAxIG9yIG1vcmUgcm93cyBhcmUgc2VsZWN0ZWQuIFJlcXVpcmVzIGBbc2VsZWN0aW9uQ29udGV4dF1gIHRvIGJlIGRlZmluZWQuICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uVG9vbGJhclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBcclxuICBAQ29udGVudENoaWxkcmVuKFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgcmVzaXphYmxlQ29sdW1ucyE6IFF1ZXJ5TGlzdDxSZXNpemFibGVDb2x1bW5Db21wb25lbnQ+O1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGV4dCB0byBhZGQgdG8gdGhlIHJlc3VsdHMgY291bnQgaW4gdGhlIHRhYmxlIGZvb3Rlci4gVGhpcyB0ZXh0IHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhlIGNvdW50IGFuZCBvYmplY3RUeXBlLiAqL1xyXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb3VudFRleHQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogRW5hYmxlcyB0YWJsZSByb3cgc2VsZWN0aW9uIGFuZCByb3cgaGlnaGxpZ2h0aW5nIHN0eWxlcyB3aGVuIHRydWUgKi9cclxuICBASW5wdXQoKSBzZWxlY3RhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKkRlZmF1bHRzIHRvIHVuZGVmaW5lZC4gU3BlY2lmeSB5b3VyIG93biB0ZW1wbGF0ZSBpZiBhbiBlYy10YWJsZSB3cmFwcGVkIGFyb3VuZCB5b3VyIHRyYW5zY2x1ZGVkIGNvbnRlbnQgd29uJ3QgbWVldCB5b3VyIG5lZWRzXHJcbiAgICovXHJcbiAgQElucHV0KCkgY3VzdG9tQ29udGVudFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFdoZW4gdHJ1ZSwgcmVtb3ZlcyB0aGUgY2FyZCBzdHlsZXMgZnJvbSB0aGUgdGFibGUgd3JhcHBlciAqL1xyXG4gIEBJbnB1dCgpIHJlbW92ZUNhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIENsYXNzZXMgdG8gYWRkIHRvIHRoZSBvdmVybGF5L2NhcmQgZWxlbWVudCAqL1xyXG4gIEBJbnB1dCgpIG92ZXJsYXlDbGFzc2VzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFdoZW4gdHJ1ZSB0aGUgb3ZlcmxheSBhbmQgdGFibGUgd2lsbCBub3QgaGF2ZSBmbGV4LXNocmluay1tYXggYnV0IGluc3RlYWQgZmxleC1ncm93ICovXHJcbiAgQElucHV0KCkgZmlsbFBhcmVudEhlaWdodD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCB0byB0aGUgcGFnaW5hdGlvbiBjb250cm9sIGNvbXBvbmVudC4gVXNlZCB0byBkaXNhYmxlIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVBhZ2luYXRpb25Db250cm9scz86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBQYWdpbmdJbmZvIGZvciB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlSW5mbz86IFBhZ2luZ0luZm87XHJcblxyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHNlYXJjaE1vZGVsICovXHJcbiAgcHVibGljIGdldCBzZWFyY2hNb2RlbCgpOiBVbnR5cGVkRm9ybUNvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybU1vZGVsLmNvbnRyb2xzLnNlYXJjaE1vZGVsIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRleHQgZGlzcGxheWVkIGluIHRoZSBmb290ZXIuXHJcbiAgICogU29tZXRpbWVzIGBub0RhdGFNZXNzYWdlYCwgc29tZXRpbWVzIGBub1NlYXJjaFJlc3VsdHNNZXNzYWdlYFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0YWJsZUNhcHRpb246IHN0cmluZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubm9EYXRhTWVzc2FnZSB8fCAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJyk7XHJcblxyXG4gIC8qKiBjb3VudCBvZiByZXN1bHRzIGRpc3BsYXllZCBpbiB0aGUgdGFibGUgKi9cclxuICBwdWJsaWMgcmVzdWx0c0NvdW50OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIEl0ZW1zIHJldHVybmVkIGJ5IHRoZSBnZXRJdGVtcyBmdW5jdGlvbiwgYWxvbmcgd2l0aCB0b3RhbCBjb3VudCAqL1xyXG4gIHB1YmxpYyBzZWFyY2hSZXN1bHRzOiBUYWJsZVNlYXJjaFJlc3VsdHMgPSB7IGl0ZW1zOiBbXSwgdG90YWxJdGVtczogMCB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBwYXNzZWQgYW4gaW5wdXQgZm9yIHJlZnJlc2gsIHRyaWdnZXJzIHJlbG9hZGluZyBpdGVtcy5cclxuICAgKiBPdGhlcndpc2UsIGNvbXBsZXRlcyBpbW1lZGlhdGVseSAod2lsbCBuZXZlciB0cmlnZ2VyIHJlbG9hZCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoVHJpZ2dlcjogT2JzZXJ2YWJsZTxTZWFyY2hhYmxlVGFibGVGb3JtTW9kZWwgfCB1bmRlZmluZWQ+ID0gRU1QVFk7XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwcml2YXRlIHBhZ2VDaGFuZ2VkOiBTdWJqZWN0PFNlYXJjaGFibGVUYWJsZUZvcm1Nb2RlbD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKiogVHJpZ2dlcnMgdGhlIGluaXRpYWwgbG9hZCBvZiB0aGUgdGFibGUgKi9cclxuICBwcml2YXRlIGluaXRUYWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3dDb3VudFBpcGU6IFJvd0NvdW50UGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnBhZ2VTaXplICYmICFjaGFuZ2VzLnBhZ2VTaXplLmZpcnN0Q2hhbmdlICYmIHRoaXMucGFnZWFibGUpIHtcclxuICAgICAgLy8gSWYgdGhlIHBhZ2VTaXplIGNoYW5nZXMsIHJlc2V0IHRvIHRoZSBmaXJzdCBwYWdlIGFuZCByZWZyZXNoLlxyXG4gICAgICB0aGlzLnBhZ2VJbmZvID0gVGFibGVQYWdpbmF0aW9uQ29tcG9uZW50LmdldFBhZ2luZ0luZm8oMSwgdGhpcy5wYWdlU2l6ZSEpO1xyXG4gICAgICB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLnBhZ2VJbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgJ0xvYWRpbmcnKTtcclxuICAgIHRoaXMuc2V0VXBSZWZyZXNoVHJpZ2dlcigpO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciBzZWFyY2hib3gvb3RoZXIgY29udHJvbCBjaGFuZ2VzIG9yIHJlZnJlc2ggcmVxdWVzdHNcclxuICAgIGNvbnN0IHNlYXJjaE9yUmVmcmVzaCA9IG1lcmdlKFxyXG4gICAgICB0aGlzLmZvcm1Nb2RlbC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICBza2lwVW50aWwodGhpcy5yZWFkeSksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMClcclxuICAgICAgKSxcclxuICAgICAgdGhpcy5yZWZyZXNoVHJpZ2dlcixcclxuICAgICAgdGhpcy5pbml0VGFibGVcclxuICAgICkucGlwZSh0YXAoKCk9PiB7XHJcbiAgICAgIC8vYSBjaGFuZ2UgdG8gYW55IGZvcm0gY29udHJvbCBvciBhIHJlZnJlc2ggc2hvdWxkIHJlc2V0IHRoZSBwYWdlSW5mbyB0byB0aGUgZmlyc3QgcGFnZSBpZiB0aGUgdGFibGUgaXMgcGFnZWFibGUuXHJcbiAgICAgIC8vKGlmIHdlIGRpZG50IHJlc2V0IHRoZSBwYWdlSW5mbywgd2UnZCBoYXZlIHRvIGNhbGwgZ2V0SXRlbXMgd2l0aCB0aGUgcHJldmlvdXMgcGFnZUluZm8sIHdoaWNoIG1heSBub3QgYmUgdmFsaWQgZm9yIHRoZSBuZXcgcmVzdWx0cylcclxuICAgICAgaWYodGhpcy5wYWdlYWJsZSkge1xyXG4gICAgICAgIHRoaXMucGFnZUluZm8gPSBUYWJsZVBhZ2luYXRpb25Db21wb25lbnQuZ2V0UGFnaW5nSW5mbygxLCB0aGlzLnBhZ2VTaXplISk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVSZXN1bHRzID0gbWVyZ2UoXHJcbiAgICAgIHNlYXJjaE9yUmVmcmVzaCxcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5waXBlKFxyXG4gICAgICAgIC8vIFByZXZlbnQgYSBjYWxsIHRvIGdldEl0ZW1zIHdoZW4gdGhlIHBhZ2VTaXplIGlzIHNldCBkdXJpbmcgcGFnZSBpbml0IGFuZCBiZWZvcmUgcmVhZHkgaXMgY29tcGxldGVkXHJcbiAgICAgICAgc2tpcFVudGlsKHRoaXMucmVhZHkpXHJcbiAgICAgIClcclxuICAgIClcclxuXHJcbiAgICAvLyBDYWxsIGdldEl0ZW1zIGFuZCB3YXRjaCBmb3IgZXJyb3JzXHJcbiAgICBjb25zdCBnZXREYXRhID0gdXBkYXRlUmVzdWx0cy5waXBlKFxyXG4gICAgICAvLyBQbHVjayB0aGUgc2VhcmNoTW9kZWwgdmFsdWUgb3V0IG9mIHRoZSBmb3JtTW9kZWxcclxuICAgICAgcGx1Y2soJ3NlYXJjaE1vZGVsJyksXHJcblxyXG4gICAgICAvLyBFbnN1cmUgc2VhcmNoIHN0cmluZyBpcyBkZWZpbmVkXHJcbiAgICAgIC8vIFRyaW0gYW5kIGxvd2VyY2FzZSBpdCB0byBhaWQgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2hpbmdcclxuICAgICAgbWFwKChzZWFyY2hTdHJpbmc/OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgc2VhcmNoID0gc2VhcmNoU3RyaW5nIHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBzZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0pLFxyXG5cclxuICAgICAgLy8gU2hvdyBzdGF0dXMgb3ZlcmxheVxyXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgJ0xvYWRpbmcnKSksXHJcblxyXG4gICAgICAvLyBDYWxsIHBhc3NlZCBmdW5jdGlvblxyXG4gICAgICBzd2l0Y2hNYXAoKHNlYXJjaFN0cmluZzogc3RyaW5nKSA9PiBcclxuICAgICAgICAvL2lmIHRoZSB0YWJsZSBpcyBwYWdlYWJsZSwgcGFnZUluZm8gd2lsbCBiZSBkZWZpbmVkLlxyXG4gICAgICAgIHRoaXMuZ2V0SXRlbXMoc2VhcmNoU3RyaW5nLCB0aGlzLnBhZ2VJbmZvKVxyXG4gICAgICApLFxyXG5cclxuICAgICAgLy8gSWYgcGFzc2VkIGZ1bmN0aW9uIGZhaWxzLCBzaG93IGVycm9yIHN0YXR1c1xyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygnZXJyb3InLCB0aGlzLmVycm9yU2VydmljZS5wYXJzZUFwaUVycm9yKGVycikpO1xyXG4gICAgICAgIC8vIHJldHVybiB0aGUgY2F1Z2h0IG9ic2VydmFibGUgc28gdGhlIHN1YnNjcmlwdGlvbiBkb2Vzbid0IGNvbXBsZXRlXHJcbiAgICAgICAgcmV0dXJuIGNhdWdodDtcclxuICAgICAgfSksXHJcblxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBIYW5kbGUgcmV0dXJuZWQgZGF0YSBhbmQgbm90aWZ5IHBhcmVudFxyXG4gICAgZ2V0RGF0YS5zdWJzY3JpYmUoKHJlc3VsdHM6IFRhYmxlU2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAvLyBMaW1pdGluZyBudW1iZXIgb2YgcmVzdWx0cyB0byBzaG93IGlmIG5vdCBwYWdlYWJsZSAoaWYgcGFnZWFibGUgdGhlIG1heCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlXHJcbiAgICAgIC8vIGNhbiBiZSBtb2RpZmllZCBieSBpbmNyZWFzaW5nL2RlY3JlYXNpbmcgdGhlIHBhZ2VTaXplLilcclxuICAgICAgaWYoIXRoaXMucGFnZWFibGUpIHtcclxuICAgICAgICByZXN1bHRzLml0ZW1zID0gcmVzdWx0cy5pdGVtcy5zbGljZSgwLCB0aGlzLm1heEl0ZW1Db3VudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5lZWQgdG8ga25vdyB0aGlzIChhbG9uZyB3aXRoIGlmIHRoZXJlJ3MgYSB2YWx1ZSBpbiB0aGUgZm9ybU1vZGVsKSB0byBkZXRlcm1pbmUgd2hhdCB0byBzaG93IGluIHRoZSBmb290ZXJcclxuICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gcmVzdWx0cztcclxuICAgIFxyXG4gICAgICB0aGlzLnRhYmxlQ2FwdGlvbiA9IHRoaXMuZ2V0Q2FwdGlvbihyZXN1bHRzKTtcclxuICAgICAgdGhpcy5yZXN1bHRzQ291bnQgPSB0aGlzLnBhZ2VhYmxlID8gdGhpcy5yb3dDb3VudFBpcGUudHJhbnNmb3JtKHJlc3VsdHMsIHRoaXMub2JqZWN0VHlwZSwgdW5kZWZpbmVkLCB0aGlzLnBhZ2VJbmZvKTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dDb3VudFBpcGUudHJhbnNmb3JtKHJlc3VsdHMsIHRoaXMub2JqZWN0VHlwZSwgdGhpcy5tYXhJdGVtQ291bnQpO1xyXG5cclxuICAgICAgLy8gRGlzYWJsZSBzZWFyY2hib3ggd2hlbiBpbiBuby1kYXRhIHN0YXRlXHJcbiAgICAgIGlmICghcmVzdWx0cy5pdGVtcy5sZW5ndGggJiYgIXRoaXMuc2VhcmNoTW9kZWwudmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1vZGVsLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoTW9kZWwuZGlzYWJsZWQpIHtcclxuICAgICAgICAvLyByZS1lbmFibGUgaWYgaXQgd2FzIGRpc2FibGVkLCBidXQgbm93IGhhcyBpdGVtc1xyXG4gICAgICAgIHRoaXMuc2VhcmNoTW9kZWwuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdoYXNEYXRhJyk7XHJcbiAgICAgIC8vIFNlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIHBhcmVudCBjb21wb25lbnRcclxuICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KHJlc3VsdHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gV2hlbiAncmVhZHknIGlzIGNvbXBsZXRlZCBieSB0aGUgaG9zdCwgaW5pdGlhbGl6ZSB0aGUgdGFibGUgd2l0aCB0aGUgY3VycmVudCBmb3JtIG1vZGVsIHZhbHVlc1xyXG4gICAgdGhpcy5yZWFkeS5zdWJzY3JpYmUoe1xyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdFRhYmxlLm5leHQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuaW5pdFRhYmxlLmNvbXBsZXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBhc3MgYWxvbmcgc29ydCB0byBwYXJlbnQgY29tcG9uZW50ICovXHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFRhYmxlU29ydCB8IFRhYmxlU29ydFtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYSBwYWdlIGNoYW5nZXMsIHN0b3JlIHRoZSBuZXcgcGFnaW5nSW5mbyBhbmQgZW1pdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZm9ybSB0byB0cmlnZ2VyIGdldERhdGEuXHJcbiAgICovXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2luZ0luZm86IFBhZ2luZ0luZm8pIHtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsICdMb2FkaW5nJyk7XHJcbiAgICB0aGlzLnBhZ2VJbmZvID0gcGFnaW5nSW5mbztcclxuICAgIHRoaXMucGFnZUNoYW5nZUVtaXR0ZXIuZW1pdChwYWdpbmdJbmZvKTtcclxuICAgIHRoaXMucGFnZUNoYW5nZWQubmV4dCh0aGlzLmZvcm1Nb2RlbC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogV2lyZSB1cCBhIGhhbmRsZXIgdG8gdGhlIGByZWZyZXNoYCBvYnNlcnZhYmxlIHNvIHRoYXQgd2hlblxyXG4gICAqIHRoZSBob3N0IHBhZ2UgY29udGV4dCBjaGFuZ2VzIGl0IGNhbiBmb3JjZSB0aGUgdGFibGUgdG8gdXBkYXRlIGFzIHdlbGwuXHJcbiAgICpcclxuICAgKiBJZiB0aGUgYHJlZnJlc2hgIG9ic2VydmFibGUgcGFzc2VzIG9wdGlvbnMgYW5kIHRoZSBgY2xlYXJTZWFyY2hgIHByb3BlcnR5XHJcbiAgICogaXMgc2V0IHRvIHRydWUsIHJlc2V0IHRoZSBzZWFyY2hNb2RlbCBhbmQgcGFzcyBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgICpcclxuICAgKiBJZiBgcmVmcmVzaGAgb2JzZXJ2YWJsZSBkb2VzIG5vdCBwYXNzIG9wdGlvbnMgb3IgdGhlIGBjbGVhclNlYXJjaGAgcHJvcGVydHlcclxuICAgKiBpcyBzZXQgdG8gZmFsc2UsIHBhc3MgYWxvbmcgdGhlIGN1cnJlbnQgc2VhcmNoTW9kZWwgVmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRVcFJlZnJlc2hUcmlnZ2VyKCkge1xyXG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUcmlnZ2VyID0gdGhpcy5yZWZyZXNoLnBpcGUoXHJcbiAgICAgICAgbWFwKG9wdHMgPT4ge1xyXG4gICAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5jbGVhclNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaE1vZGVsLnJlc2V0KCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRoaXMuZm9ybU1vZGVsLCBzZWFyY2hNb2RlbDogJycgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1Nb2RlbC52YWx1ZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAqL1xyXG4gIHByaXZhdGUgZ2V0Q2FwdGlvbihyZXN1bHRzOiBUYWJsZVNlYXJjaFJlc3VsdHMpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJlc3VsdHMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hNb2RlbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5ub1NlYXJjaFJlc3VsdHNNZXNzYWdlIHx8ICdTZWFyY2hhYmxlVGFibGVfRGVmYXVsdF9Ob01hdGNoZXNfU0MnLCB7IHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoTW9kZWwudmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubm9EYXRhTWVzc2FnZSB8fCAnU2VhcmNoYWJsZVRhYmxlX0RlZmF1bHRfTm9EYXRhX1NDJyk7XHJcbiAgfVxyXG5cclxufSIsIjxoZWFkZXIgKm5nSWY9XCIhaGlkZUhlYWRlclwiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1zaHJpbmsgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICA8ZWMtdGV4dGJveCBpZD1cInt7aWR9fV9zZWFyY2hib3hcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWhpZGVTZWFyY2hDb250cm9sXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1iLTAgZmxleC1ncm93IG1yLTJcIlxyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInNlYXJjaE1vZGVsXCJcclxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwic2VhcmNoYm94VGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hib3hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlYXJjaGJveFJlYWRvbmx5XCI+PC9lYy10ZXh0Ym94PlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3dcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5zZWFyY2hhYmxlLXRhYmxlLWNvbnRyb2xzXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L2hlYWRlcj5cclxuPHNlY3Rpb24gaWQ9XCJ7e2lkfX1fY2FyZFwiXHJcbiAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHt7b3ZlcmxheUNsYXNzZXN9fVwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtdHJhbnNsdWNlbnQnOiBzdGF0dXMuc3RhdHVzICE9PSAnZXJyb3InLCAnaGFzLW1hc2snOiBzdGF0dXMuc3RhdHVzICE9PSAnaGFzRGF0YScsICdjYXJkIG0tMCBiZy1jb250ZW50JzogIWN1c3RvbUNvbnRlbnRUZW1wbGF0ZSAmJiAhcmVtb3ZlQ2FyZH1cIlxyXG4gICAgICAgICBlY092ZXJsYXlcclxuICAgICAgICAgW3N0YXR1c109XCJzdGF0dXMuc3RhdHVzXCJcclxuICAgICAgICAgW21lc3NhZ2VdPVwic3RhdHVzLm1lc3NhZ2VcIlxyXG4gICAgICAgICBbZGlzcGxheUFzTWFza109XCJ0cnVlXCI+XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmNhcmQtaGVhZGVyXCI+PC9uZy1jb250ZW50PlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Db250ZW50VGVtcGxhdGUgfHwgZGVmYXVsdENvbnRlbnRUZW1wbGF0ZVwiPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGlzIGFuIGVjLXRhYmxlIHdpdGggcHJveGllZC1vdmVyIHNlYXJjaGFibGUgdGFibGUgaW5wdXRzLiBcclxuICAgIElmIHRoYXQgZG9lc24ndCB3b3JrIGZvciB5b3UgdGhlbiB5b3UgY2FuIHNwZWNpZnkgYSBjdXN0b21Db250ZW50VGVtcGxhdGUgdG8gdXNlIGluc3RlYWRcclxuICAgIGFuZCBzdGlsbCByZXRhaW4gYWxsIHRoZSBldmVudCBoYW5kbGluZywgaGVhZGVyLCBmb290ZXIgcGFnaW5hdGlvbiwgZXRjIHN1cHBvcnQgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29udGVudFRlbXBsYXRlPlxyXG4gICAgPGVjLXRhYmxlIGlkPVwie3tpZH19X3RhYmxlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInt7dGFibGVDbGFzc2VzfX1cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1maXhlZF09XCJ0YWJsZUxheW91dEZpeGVkXCJcclxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGVcIlxyXG4gICAgICAgICAgICAgIFtzb3J0XT1cInNvcnRcIlxyXG4gICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cIm9uU29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGlvbkNvbnRleHRdPVwic2VsZWN0aW9uQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgW3NlbGVjdGlvblRvb2xiYXJUZW1wbGF0ZV09XCJzZWxlY3Rpb25Ub29sYmFyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInJlc2l6YWJsZUNvbHVtbnNcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9lYy10YWJsZT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIHBhZ2luYXRpb24gZm9vdGVyIHZpc2libGUgaWYgdGFibGUgaXMgcGFnZS1hYmxlIGFuZCB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIHJlc3VsdHMgLS0+XHJcbiAgPGZvb3RlciAqbmdJZj1cIiFoaWRlRm9vdGVyICYmIHBhZ2VhYmxlICYmIHNlYXJjaFJlc3VsdHMudG90YWxJdGVtc0JlZm9yZVBhZ2luZyEgPiBwYWdlU2l6ZSFcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwYWdpbmF0aW9uLWZvb3RlclwiXHJcbiAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRvcF09XCIhY3VzdG9tQ29udGVudFRlbXBsYXRlXCI+XHJcbiAgICA8ZWMtdGFibGUtcGFnaW5hdGlvbiBpZD1cInt7aWR9fV9wYWdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtY29sb3ItcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJzZWFyY2hSZXN1bHRzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhUYWJzXT1cIm1heFRhYnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VOdW1iZXJdPVwicGFnZUluZm8/LnBhZ2VOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVQYWdpbmF0aW9uQ29udHJvbHNdPVwiZGlzYWJsZVBhZ2luYXRpb25Db250cm9sc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj5cclxuICAgIDwvZWMtdGFibGUtcGFnaW5hdGlvbj5cclxuICAgIDxkaXYgaWQ9XCJyZXN1bHRzQ291bnRcIlxyXG4gICAgICAgICAqbmdJZj1cInNlYXJjaFJlc3VsdHM/Lml0ZW1zPy5sZW5ndGhcIlxyXG4gICAgICAgICBjbGFzcz1cIm1sLWF1dG8gZm9udC1jb2xvci1oaW50IHRleHQtdHJ1bmNhdGVcIiBcclxuICAgICAgICAgdGl0bGU9XCJ7e3Jlc3VsdHNDb3VudH19IHt7YWRkaXRpb25hbENvdW50VGV4dH19XCI+e3tyZXN1bHRzQ291bnR9fSB7e2FkZGl0aW9uYWxDb3VudFRleHR9fTwvZGl2PlxyXG4gIDwvZm9vdGVyPlxyXG5cclxuICA8IS0tIGRlZmF1bHQgZm9vdGVyOiB2aXNpYmxlIGlmIGhpZGVGb290ZXIgaXMgZmFsc2UgYW5kIHRhYmxlIGlzIG5vdCBwYWdlLWFibGUgb3IgdGhlcmUgYXJlIG9ubHkgb25lIHBhZ2Ugb2YgcmVzdWx0cyAoYWx3YXlzIHNob3dzIGlmIHRoZXJlIGlzIGEgY2FwdGlvbiB0byBpbmRpY2F0ZSBubyByZXN1bHRzKSAtLT5cclxuICA8Zm9vdGVyICpuZ0lmPVwiKCFoaWRlRm9vdGVyICYmICghcGFnZWFibGUgfHwgc2VhcmNoUmVzdWx0cy50b3RhbEl0ZW1zQmVmb3JlUGFnaW5nISA8PSBwYWdlU2l6ZSEpKSB8fCB0YWJsZUNhcHRpb25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJjYXB0aW9uLWZvb3RlclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2hhcy1yZXN1bHRzJzogc2VhcmNoUmVzdWx0cz8uaXRlbXM/Lmxlbmd0aCwgJ2JvcmRlci10b3AnOiBzZWFyY2hSZXN1bHRzPy5pdGVtcz8ubGVuZ3RoICYmICFjdXN0b21Db250ZW50VGVtcGxhdGV9XCI+XHJcbiAgICA8bmctY29udGVudCAqbmdJZj1cIiF0YWJsZUNhcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgc2VsZWN0PVwiLnNlYXJjaGFibGUtdGFibGUtZm9vdGVyXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPGRpdiBpZD1cInRhYmxlQ2FwdGlvblwiXHJcbiAgICAgICAgICpuZ0lmPVwidGFibGVDYXB0aW9uXCJcclxuICAgICAgICAgW2lubmVySFRNTF09XCJ0YWJsZUNhcHRpb25cIj48L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJyZXN1bHRzQ291bnRcIlxyXG4gICAgICAgICAqbmdJZj1cInNlYXJjaFJlc3VsdHM/Lml0ZW1zPy5sZW5ndGhcIlxyXG4gICAgICAgICBjbGFzcz1cIm1sLWF1dG8gdGV4dC10cnVuY2F0ZVwiXHJcbiAgICAgICAgIHRpdGxlPVwie3tyZXN1bHRzQ291bnR9fSB7e2FkZGl0aW9uYWxDb3VudFRleHR9fVwiPnt7cmVzdWx0c0NvdW50fX0ge3thZGRpdGlvbmFsQ291bnRUZXh0fX08L2Rpdj5cclxuICA8L2Zvb3Rlcj5cclxuPC9zZWN0aW9uPiJdfQ==