@sebgroup/green-angular 5.1.2 → 5.2.0

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 (434) hide show
  1. package/esm2022/src/v-angular/account-number/account-number.module.mjs +18 -0
  2. package/esm2022/src/v-angular/account-number/account-number.pipe.mjs +54 -0
  3. package/esm2022/src/v-angular/account-number/index.mjs +3 -0
  4. package/esm2022/src/v-angular/account-number/sebgroup-green-angular-src-v-angular-account-number.mjs +5 -0
  5. package/esm2022/src/v-angular/alert/alert.component.mjs +47 -0
  6. package/esm2022/src/v-angular/alert/alert.models.mjs +8 -0
  7. package/esm2022/src/v-angular/alert/alert.module.mjs +18 -0
  8. package/esm2022/src/v-angular/alert/index.mjs +4 -0
  9. package/esm2022/src/v-angular/alert/sebgroup-green-angular-src-v-angular-alert.mjs +5 -0
  10. package/esm2022/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +16 -6
  11. package/esm2022/src/v-angular/base-control-value-accessor/base-control-value-accessor.module.mjs +9 -9
  12. package/esm2022/src/v-angular/breadcrumbs/breadcrumbs.component.mjs +5 -5
  13. package/esm2022/src/v-angular/breadcrumbs/breadcrumbs.module.mjs +11 -11
  14. package/esm2022/src/v-angular/button/button.component.mjs +9 -9
  15. package/esm2022/src/v-angular/button/button.module.mjs +11 -11
  16. package/esm2022/src/v-angular/card/card.component.mjs +6 -6
  17. package/esm2022/src/v-angular/card/card.module.mjs +9 -9
  18. package/esm2022/src/v-angular/character-countdown/character-countdown.module.mjs +6 -6
  19. package/esm2022/src/v-angular/checkbox/checkbox.component.mjs +9 -7
  20. package/esm2022/src/v-angular/checkbox/checkbox.module.mjs +14 -12
  21. package/esm2022/src/v-angular/core/core.utils.mjs +35 -1
  22. package/esm2022/src/v-angular/datepicker/components/calendar/calendar.component.mjs +200 -0
  23. package/esm2022/src/v-angular/datepicker/components/calendar-control/calendar-control.component.mjs +115 -0
  24. package/esm2022/src/v-angular/datepicker/components/date-input/date-input.component.mjs +203 -0
  25. package/esm2022/src/v-angular/datepicker/components/datepicker/datepicker.component.mjs +135 -0
  26. package/esm2022/src/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.mjs +408 -0
  27. package/esm2022/src/v-angular/datepicker/datepicker.globals.mjs +20 -0
  28. package/esm2022/src/v-angular/datepicker/datepicker.models.mjs +56 -0
  29. package/esm2022/src/v-angular/datepicker/datepicker.module.mjs +63 -0
  30. package/esm2022/src/v-angular/datepicker/datepicker.utils.mjs +196 -0
  31. package/esm2022/src/v-angular/datepicker/directives/calendar-date.directive.mjs +47 -0
  32. package/esm2022/src/v-angular/datepicker/index.mjs +17 -0
  33. package/esm2022/src/v-angular/datepicker/models/dates.mjs +291 -0
  34. package/esm2022/src/v-angular/datepicker/pipes/date-thook.pipe.mjs +30 -0
  35. package/esm2022/src/v-angular/datepicker/pipes/is-disabled.pipe.mjs +37 -0
  36. package/esm2022/src/v-angular/datepicker/pipes/matches.pipe.mjs +17 -0
  37. package/esm2022/src/v-angular/datepicker/sebgroup-green-angular-src-v-angular-datepicker.mjs +5 -0
  38. package/esm2022/src/v-angular/drag-drop/drag-drop.component.mjs +497 -0
  39. package/esm2022/src/v-angular/drag-drop/drag-drop.models.mjs +2 -0
  40. package/esm2022/src/v-angular/drag-drop/drag-drop.module.mjs +49 -0
  41. package/esm2022/src/v-angular/drag-drop/drag-drop.pipes.mjs +70 -0
  42. package/esm2022/src/v-angular/drag-drop/drag-drop.utils.mjs +76 -0
  43. package/esm2022/src/v-angular/drag-drop/index.mjs +5 -0
  44. package/esm2022/src/v-angular/drag-drop/sebgroup-green-angular-src-v-angular-drag-drop.mjs +5 -0
  45. package/esm2022/src/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +24 -9
  46. package/esm2022/src/v-angular/dropdown/dropdown.component.mjs +16 -9
  47. package/esm2022/src/v-angular/dropdown/dropdown.module.mjs +31 -15
  48. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +8 -8
  49. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.mjs +5 -5
  50. package/esm2022/src/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.mjs +17 -10
  51. package/esm2022/src/v-angular/dropdown/typeahead/typeahead.directive.mjs +27 -20
  52. package/esm2022/src/v-angular/dropdown/typeahead/typeahead.module.mjs +21 -21
  53. package/esm2022/src/v-angular/external-link/external-link.directive.mjs +5 -5
  54. package/esm2022/src/v-angular/external-link/external-link.module.mjs +9 -9
  55. package/esm2022/src/v-angular/i18n/i18n.module.mjs +12 -12
  56. package/esm2022/src/v-angular/i18n/i18n.test.module.mjs +6 -6
  57. package/esm2022/src/v-angular/info-circle/info-circle.component.mjs +6 -6
  58. package/esm2022/src/v-angular/info-circle/info-circle.module.mjs +11 -11
  59. package/esm2022/src/v-angular/input/input.component.mjs +11 -15
  60. package/esm2022/src/v-angular/input/input.module.mjs +27 -22
  61. package/esm2022/src/v-angular/input-mask/input-mask.directive.mjs +6 -6
  62. package/esm2022/src/v-angular/input-mask/input-mask.module.mjs +10 -10
  63. package/esm2022/src/v-angular/modal/dialog/dialog.component.mjs +53 -31
  64. package/esm2022/src/v-angular/modal/fold-out/fold-out.component.mjs +116 -16
  65. package/esm2022/src/v-angular/modal/fold-out/fold-out.directive.mjs +5 -5
  66. package/esm2022/src/v-angular/modal/fold-out/keyboard-key.enum.mjs +9 -0
  67. package/esm2022/src/v-angular/modal/modal.module.mjs +38 -27
  68. package/esm2022/src/v-angular/modal/slide-out/slide-out.component.mjs +35 -12
  69. package/esm2022/src/v-angular/pagination/index.mjs +3 -0
  70. package/esm2022/src/v-angular/pagination/pagination.component.mjs +144 -0
  71. package/esm2022/src/v-angular/pagination/pagination.module.mjs +37 -0
  72. package/esm2022/src/v-angular/pagination/sebgroup-green-angular-src-v-angular-pagination.mjs +5 -0
  73. package/esm2022/src/v-angular/radio/radio.component.mjs +14 -12
  74. package/esm2022/src/v-angular/radio/radio.module.mjs +12 -11
  75. package/esm2022/src/v-angular/slug/slug.module.mjs +6 -6
  76. package/esm2022/src/v-angular/table/index.mjs +9 -0
  77. package/esm2022/src/v-angular/table/sebgroup-green-angular-src-v-angular-table.mjs +5 -0
  78. package/esm2022/src/v-angular/table/table.component.mjs +387 -0
  79. package/esm2022/src/v-angular/table/table.directive.mjs +110 -0
  80. package/esm2022/src/v-angular/table/table.models.mjs +2 -0
  81. package/esm2022/src/v-angular/table/table.module.mjs +40 -0
  82. package/esm2022/src/v-angular/table/table.tools.mjs +29 -0
  83. package/esm2022/src/v-angular/table/tr-thook.pipe.mjs +22 -0
  84. package/esm2022/src/v-angular/tabs/index.mjs +8 -0
  85. package/esm2022/src/v-angular/tabs/sebgroup-green-angular-src-v-angular-tabs.mjs +5 -0
  86. package/esm2022/src/v-angular/tabs/tab.directive.mjs +81 -0
  87. package/esm2022/src/v-angular/tabs/tabs.component.mjs +262 -0
  88. package/esm2022/src/v-angular/tabs/tabs.models.mjs +2 -0
  89. package/esm2022/src/v-angular/tabs/tabs.module.mjs +21 -0
  90. package/esm2022/src/v-angular/textarea/textarea.component.mjs +9 -7
  91. package/esm2022/src/v-angular/textarea/textarea.module.mjs +27 -13
  92. package/esm2022/src/v-angular/toast/index.mjs +8 -0
  93. package/esm2022/src/v-angular/toast/sebgroup-green-angular-src-v-angular-toast.mjs +5 -0
  94. package/esm2022/src/v-angular/toast/toast-message.service.mjs +63 -0
  95. package/esm2022/src/v-angular/toast/toast.component.mjs +70 -0
  96. package/esm2022/src/v-angular/toast/toast.models.mjs +8 -0
  97. package/esm2022/src/v-angular/toast/toast.module.mjs +21 -0
  98. package/esm2022/src/v-angular/tooltip/tooltip.directive.mjs +35 -15
  99. package/esm2022/src/v-angular/tooltip/tooltip.module.mjs +11 -11
  100. package/esm2022/src/v-angular/tooltip/tooltip.styles.mjs +60 -0
  101. package/esm2022/v-angular/alert/alert.component.mjs +47 -0
  102. package/esm2022/v-angular/alert/alert.models.mjs +8 -0
  103. package/esm2022/v-angular/alert/alert.module.mjs +18 -0
  104. package/esm2022/v-angular/alert/index.mjs +4 -0
  105. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.component.mjs +16 -6
  106. package/esm2022/v-angular/base-control-value-accessor/base-control-value-accessor.module.mjs +9 -9
  107. package/esm2022/v-angular/breadcrumbs/breadcrumbs.component.mjs +5 -5
  108. package/esm2022/v-angular/breadcrumbs/breadcrumbs.module.mjs +11 -11
  109. package/esm2022/v-angular/button/button.component.mjs +9 -9
  110. package/esm2022/v-angular/button/button.module.mjs +11 -11
  111. package/esm2022/v-angular/card/card.component.mjs +6 -6
  112. package/esm2022/v-angular/card/card.module.mjs +9 -9
  113. package/esm2022/v-angular/character-countdown/character-countdown.module.mjs +6 -6
  114. package/esm2022/v-angular/checkbox/checkbox.component.mjs +9 -7
  115. package/esm2022/v-angular/checkbox/checkbox.module.mjs +14 -12
  116. package/esm2022/v-angular/datepicker/components/calendar/calendar.component.mjs +200 -0
  117. package/esm2022/v-angular/datepicker/components/calendar-control/calendar-control.component.mjs +115 -0
  118. package/esm2022/v-angular/datepicker/components/date-input/date-input.component.mjs +203 -0
  119. package/esm2022/v-angular/datepicker/components/datepicker/datepicker.component.mjs +135 -0
  120. package/esm2022/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.mjs +408 -0
  121. package/esm2022/v-angular/datepicker/datepicker.globals.mjs +20 -0
  122. package/esm2022/v-angular/datepicker/datepicker.models.mjs +56 -0
  123. package/esm2022/v-angular/datepicker/datepicker.module.mjs +63 -0
  124. package/esm2022/v-angular/datepicker/datepicker.utils.mjs +196 -0
  125. package/esm2022/v-angular/datepicker/directives/calendar-date.directive.mjs +47 -0
  126. package/esm2022/v-angular/datepicker/index.mjs +17 -0
  127. package/esm2022/v-angular/datepicker/models/dates.mjs +291 -0
  128. package/esm2022/v-angular/datepicker/pipes/date-thook.pipe.mjs +30 -0
  129. package/esm2022/v-angular/datepicker/pipes/is-disabled.pipe.mjs +37 -0
  130. package/esm2022/v-angular/datepicker/pipes/matches.pipe.mjs +17 -0
  131. package/esm2022/v-angular/drag-drop/drag-drop.component.mjs +497 -0
  132. package/esm2022/v-angular/drag-drop/drag-drop.models.mjs +2 -0
  133. package/esm2022/v-angular/drag-drop/drag-drop.module.mjs +49 -0
  134. package/esm2022/v-angular/drag-drop/drag-drop.pipes.mjs +70 -0
  135. package/esm2022/v-angular/drag-drop/drag-drop.utils.mjs +76 -0
  136. package/esm2022/v-angular/drag-drop/index.mjs +5 -0
  137. package/esm2022/v-angular/dropdown/dropdown-list/dropdown-list.component.mjs +24 -9
  138. package/esm2022/v-angular/dropdown/dropdown.component.mjs +16 -9
  139. package/esm2022/v-angular/dropdown/dropdown.module.mjs +31 -15
  140. package/esm2022/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.mjs +8 -8
  141. package/esm2022/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.mjs +5 -5
  142. package/esm2022/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.mjs +17 -10
  143. package/esm2022/v-angular/dropdown/typeahead/typeahead.directive.mjs +27 -20
  144. package/esm2022/v-angular/dropdown/typeahead/typeahead.module.mjs +21 -21
  145. package/esm2022/v-angular/external-link/external-link.directive.mjs +37 -0
  146. package/esm2022/v-angular/external-link/external-link.module.mjs +18 -0
  147. package/esm2022/v-angular/external-link/index.mjs +3 -0
  148. package/esm2022/v-angular/i18n/i18n.module.mjs +12 -12
  149. package/esm2022/v-angular/i18n/i18n.test.module.mjs +6 -6
  150. package/esm2022/v-angular/index.mjs +10 -1
  151. package/esm2022/v-angular/info-circle/info-circle.component.mjs +6 -6
  152. package/esm2022/v-angular/info-circle/info-circle.module.mjs +11 -11
  153. package/esm2022/v-angular/input/input.component.mjs +11 -15
  154. package/esm2022/v-angular/input/input.module.mjs +27 -22
  155. package/esm2022/v-angular/input-mask/input-mask.directive.mjs +6 -6
  156. package/esm2022/v-angular/input-mask/input-mask.module.mjs +10 -10
  157. package/esm2022/v-angular/modal/dialog/dialog.component.mjs +53 -31
  158. package/esm2022/v-angular/modal/fold-out/fold-out.component.mjs +116 -16
  159. package/esm2022/v-angular/modal/fold-out/fold-out.directive.mjs +5 -5
  160. package/esm2022/v-angular/modal/fold-out/keyboard-key.enum.mjs +9 -0
  161. package/esm2022/v-angular/modal/modal.module.mjs +38 -27
  162. package/esm2022/v-angular/modal/slide-out/slide-out.component.mjs +35 -12
  163. package/esm2022/v-angular/pagination/index.mjs +3 -0
  164. package/esm2022/v-angular/pagination/pagination.component.mjs +144 -0
  165. package/esm2022/v-angular/pagination/pagination.module.mjs +37 -0
  166. package/esm2022/v-angular/radio/radio.component.mjs +14 -12
  167. package/esm2022/v-angular/radio/radio.module.mjs +12 -11
  168. package/esm2022/v-angular/slug/index.mjs +3 -0
  169. package/esm2022/v-angular/slug/slug.module.mjs +18 -0
  170. package/esm2022/v-angular/slug/slug.pipe.mjs +27 -0
  171. package/esm2022/v-angular/table/index.mjs +9 -0
  172. package/esm2022/v-angular/table/table.component.mjs +387 -0
  173. package/esm2022/v-angular/table/table.directive.mjs +110 -0
  174. package/esm2022/v-angular/table/table.models.mjs +2 -0
  175. package/esm2022/v-angular/table/table.module.mjs +40 -0
  176. package/esm2022/v-angular/table/table.tools.mjs +29 -0
  177. package/esm2022/v-angular/table/tr-thook.pipe.mjs +22 -0
  178. package/esm2022/v-angular/tabs/index.mjs +8 -0
  179. package/esm2022/v-angular/tabs/tab.directive.mjs +81 -0
  180. package/esm2022/v-angular/tabs/tabs.component.mjs +262 -0
  181. package/esm2022/v-angular/tabs/tabs.models.mjs +2 -0
  182. package/esm2022/v-angular/tabs/tabs.module.mjs +21 -0
  183. package/esm2022/v-angular/textarea/textarea.component.mjs +9 -7
  184. package/esm2022/v-angular/textarea/textarea.module.mjs +27 -13
  185. package/esm2022/v-angular/toast/index.mjs +8 -0
  186. package/esm2022/v-angular/toast/toast-message.service.mjs +63 -0
  187. package/esm2022/v-angular/toast/toast.component.mjs +70 -0
  188. package/esm2022/v-angular/toast/toast.models.mjs +8 -0
  189. package/esm2022/v-angular/toast/toast.module.mjs +21 -0
  190. package/esm2022/v-angular/tooltip/tooltip.directive.mjs +35 -15
  191. package/esm2022/v-angular/tooltip/tooltip.module.mjs +11 -11
  192. package/esm2022/v-angular/tooltip/tooltip.styles.mjs +60 -0
  193. package/esm2022/v-angular/v-angular.module.mjs +104 -68
  194. package/fesm2022/sebgroup-green-angular-src-v-angular-account-number.mjs +76 -0
  195. package/fesm2022/sebgroup-green-angular-src-v-angular-account-number.mjs.map +1 -0
  196. package/fesm2022/sebgroup-green-angular-src-v-angular-alert.mjs +76 -0
  197. package/fesm2022/sebgroup-green-angular-src-v-angular-alert.mjs.map +1 -0
  198. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs +23 -13
  199. package/fesm2022/sebgroup-green-angular-src-v-angular-base-control-value-accessor.mjs.map +1 -1
  200. package/fesm2022/sebgroup-green-angular-src-v-angular-breadcrumbs.mjs +14 -14
  201. package/fesm2022/sebgroup-green-angular-src-v-angular-breadcrumbs.mjs.map +1 -1
  202. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs +18 -18
  203. package/fesm2022/sebgroup-green-angular-src-v-angular-button.mjs.map +1 -1
  204. package/fesm2022/sebgroup-green-angular-src-v-angular-card.mjs +13 -13
  205. package/fesm2022/sebgroup-green-angular-src-v-angular-card.mjs.map +1 -1
  206. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs +6 -6
  207. package/fesm2022/sebgroup-green-angular-src-v-angular-character-countdown.mjs.map +1 -1
  208. package/fesm2022/sebgroup-green-angular-src-v-angular-checkbox.mjs +21 -17
  209. package/fesm2022/sebgroup-green-angular-src-v-angular-checkbox.mjs.map +1 -1
  210. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs +34 -0
  211. package/fesm2022/sebgroup-green-angular-src-v-angular-core.mjs.map +1 -1
  212. package/fesm2022/sebgroup-green-angular-src-v-angular-datepicker.mjs +1759 -0
  213. package/fesm2022/sebgroup-green-angular-src-v-angular-datepicker.mjs.map +1 -0
  214. package/fesm2022/sebgroup-green-angular-src-v-angular-drag-drop.mjs +687 -0
  215. package/fesm2022/sebgroup-green-angular-src-v-angular-drag-drop.mjs.map +1 -0
  216. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs +126 -74
  217. package/fesm2022/sebgroup-green-angular-src-v-angular-dropdown.mjs.map +1 -1
  218. package/fesm2022/sebgroup-green-angular-src-v-angular-external-link.mjs +12 -12
  219. package/fesm2022/sebgroup-green-angular-src-v-angular-external-link.mjs.map +1 -1
  220. package/fesm2022/sebgroup-green-angular-src-v-angular-i18n.mjs +17 -17
  221. package/fesm2022/sebgroup-green-angular-src-v-angular-i18n.mjs.map +1 -1
  222. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs +15 -15
  223. package/fesm2022/sebgroup-green-angular-src-v-angular-info-circle.mjs.map +1 -1
  224. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs +14 -14
  225. package/fesm2022/sebgroup-green-angular-src-v-angular-input-mask.mjs.map +1 -1
  226. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs +36 -35
  227. package/fesm2022/sebgroup-green-angular-src-v-angular-input.mjs.map +1 -1
  228. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs +246 -81
  229. package/fesm2022/sebgroup-green-angular-src-v-angular-modal.mjs.map +1 -1
  230. package/fesm2022/sebgroup-green-angular-src-v-angular-pagination.mjs +185 -0
  231. package/fesm2022/sebgroup-green-angular-src-v-angular-pagination.mjs.map +1 -0
  232. package/fesm2022/sebgroup-green-angular-src-v-angular-radio.mjs +24 -21
  233. package/fesm2022/sebgroup-green-angular-src-v-angular-radio.mjs.map +1 -1
  234. package/fesm2022/sebgroup-green-angular-src-v-angular-slug.mjs +6 -6
  235. package/fesm2022/sebgroup-green-angular-src-v-angular-slug.mjs.map +1 -1
  236. package/fesm2022/sebgroup-green-angular-src-v-angular-table.mjs +585 -0
  237. package/fesm2022/sebgroup-green-angular-src-v-angular-table.mjs.map +1 -0
  238. package/fesm2022/sebgroup-green-angular-src-v-angular-tabs.mjs +367 -0
  239. package/fesm2022/sebgroup-green-angular-src-v-angular-tabs.mjs.map +1 -0
  240. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs +33 -18
  241. package/fesm2022/sebgroup-green-angular-src-v-angular-textarea.mjs.map +1 -1
  242. package/fesm2022/sebgroup-green-angular-src-v-angular-toast.mjs +166 -0
  243. package/fesm2022/sebgroup-green-angular-src-v-angular-toast.mjs.map +1 -0
  244. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs +103 -24
  245. package/fesm2022/sebgroup-green-angular-src-v-angular-tooltip.mjs.map +1 -1
  246. package/fesm2022/sebgroup-green-angular-v-angular.mjs +6295 -2165
  247. package/fesm2022/sebgroup-green-angular-v-angular.mjs.map +1 -1
  248. package/package.json +51 -3
  249. package/src/v-angular/account-number/README.md +70 -0
  250. package/src/v-angular/account-number/account-number.module.d.ts +8 -0
  251. package/src/v-angular/account-number/account-number.pipe.d.ts +32 -0
  252. package/src/v-angular/account-number/index.d.ts +2 -0
  253. package/src/v-angular/alert/alert.component.d.ts +19 -0
  254. package/src/v-angular/alert/alert.models.d.ts +13 -0
  255. package/src/v-angular/alert/alert.module.d.ts +8 -0
  256. package/src/v-angular/alert/index.d.ts +3 -0
  257. package/src/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +10 -4
  258. package/src/v-angular/base-control-value-accessor/base-control-value-accessor.module.d.ts +4 -4
  259. package/src/v-angular/breadcrumbs/breadcrumbs.component.d.ts +4 -4
  260. package/src/v-angular/breadcrumbs/breadcrumbs.module.d.ts +4 -4
  261. package/src/v-angular/button/button.component.d.ts +5 -5
  262. package/src/v-angular/button/button.module.d.ts +4 -4
  263. package/src/v-angular/card/card.component.d.ts +3 -3
  264. package/src/v-angular/card/card.module.d.ts +4 -4
  265. package/src/v-angular/character-countdown/character-countdown.module.d.ts +4 -4
  266. package/src/v-angular/checkbox/checkbox.component.d.ts +6 -5
  267. package/src/v-angular/checkbox/checkbox.module.d.ts +5 -4
  268. package/src/v-angular/core/core.utils.d.ts +1 -0
  269. package/src/v-angular/datepicker/components/calendar/calendar.component.d.ts +36 -0
  270. package/src/v-angular/datepicker/components/calendar-control/calendar-control.component.d.ts +30 -0
  271. package/src/v-angular/datepicker/components/date-input/date-input.component.d.ts +102 -0
  272. package/src/v-angular/datepicker/components/datepicker/datepicker.component.d.ts +62 -0
  273. package/src/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.d.ts +165 -0
  274. package/src/v-angular/datepicker/datepicker.globals.d.ts +13 -0
  275. package/src/v-angular/datepicker/datepicker.models.d.ts +50 -0
  276. package/src/v-angular/datepicker/datepicker.module.d.ts +19 -0
  277. package/src/v-angular/datepicker/datepicker.utils.d.ts +39 -0
  278. package/src/v-angular/datepicker/directives/calendar-date.directive.d.ts +21 -0
  279. package/src/v-angular/datepicker/index.d.ts +13 -0
  280. package/src/v-angular/datepicker/models/dates.d.ts +15 -0
  281. package/src/v-angular/datepicker/pipes/date-thook.pipe.d.ts +8 -0
  282. package/src/v-angular/datepicker/pipes/is-disabled.pipe.d.ts +8 -0
  283. package/src/v-angular/datepicker/pipes/matches.pipe.d.ts +7 -0
  284. package/src/v-angular/drag-drop/drag-drop.component.d.ts +131 -0
  285. package/src/v-angular/drag-drop/drag-drop.models.d.ts +49 -0
  286. package/src/v-angular/drag-drop/drag-drop.module.d.ts +13 -0
  287. package/src/v-angular/drag-drop/drag-drop.pipes.d.ts +40 -0
  288. package/src/v-angular/drag-drop/drag-drop.utils.d.ts +33 -0
  289. package/src/v-angular/drag-drop/index.d.ts +4 -0
  290. package/src/v-angular/dropdown/dropdown-list/dropdown-list.component.d.ts +11 -4
  291. package/src/v-angular/dropdown/dropdown.component.d.ts +10 -6
  292. package/src/v-angular/dropdown/dropdown.module.d.ts +8 -7
  293. package/src/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.d.ts +6 -6
  294. package/src/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.d.ts +3 -3
  295. package/src/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.d.ts +8 -6
  296. package/src/v-angular/dropdown/typeahead/typeahead.directive.d.ts +14 -12
  297. package/src/v-angular/dropdown/typeahead/typeahead.module.d.ts +4 -4
  298. package/src/v-angular/external-link/external-link.directive.d.ts +3 -3
  299. package/src/v-angular/external-link/external-link.module.d.ts +4 -4
  300. package/src/v-angular/i18n/i18n.module.d.ts +7 -7
  301. package/src/v-angular/i18n/i18n.test.module.d.ts +4 -4
  302. package/src/v-angular/info-circle/info-circle.component.d.ts +4 -4
  303. package/src/v-angular/info-circle/info-circle.module.d.ts +4 -4
  304. package/src/v-angular/input/input.component.d.ts +5 -10
  305. package/src/v-angular/input/input.module.d.ts +5 -4
  306. package/src/v-angular/input-mask/input-mask.directive.d.ts +3 -3
  307. package/src/v-angular/input-mask/input-mask.module.d.ts +5 -5
  308. package/src/v-angular/modal/dialog/dialog.component.d.ts +16 -7
  309. package/src/v-angular/modal/fold-out/fold-out.component.d.ts +34 -11
  310. package/src/v-angular/modal/fold-out/fold-out.directive.d.ts +3 -3
  311. package/src/v-angular/modal/fold-out/keyboard-key.enum.d.ts +7 -0
  312. package/src/v-angular/modal/modal.module.d.ts +4 -4
  313. package/src/v-angular/modal/slide-out/slide-out.component.d.ts +13 -6
  314. package/src/v-angular/pagination/index.d.ts +2 -0
  315. package/src/v-angular/pagination/pagination.component.d.ts +64 -0
  316. package/src/v-angular/pagination/pagination.module.d.ts +12 -0
  317. package/src/v-angular/radio/radio.component.d.ts +14 -13
  318. package/src/v-angular/radio/radio.module.d.ts +5 -4
  319. package/src/v-angular/slug/slug.module.d.ts +4 -4
  320. package/src/v-angular/table/index.d.ts +5 -0
  321. package/src/v-angular/table/table.component.d.ts +229 -0
  322. package/src/v-angular/table/table.directive.d.ts +36 -0
  323. package/src/v-angular/table/table.models.d.ts +62 -0
  324. package/src/v-angular/table/table.module.d.ts +12 -0
  325. package/src/v-angular/table/table.tools.d.ts +5 -0
  326. package/src/v-angular/table/tr-thook.pipe.d.ts +7 -0
  327. package/src/v-angular/tabs/index.d.ts +4 -0
  328. package/src/v-angular/tabs/tab.directive.d.ts +37 -0
  329. package/src/v-angular/tabs/tabs.component.d.ts +65 -0
  330. package/src/v-angular/tabs/tabs.models.d.ts +25 -0
  331. package/src/v-angular/tabs/tabs.module.d.ts +11 -0
  332. package/src/v-angular/textarea/textarea.component.d.ts +6 -5
  333. package/src/v-angular/textarea/textarea.module.d.ts +6 -4
  334. package/src/v-angular/toast/index.d.ts +4 -0
  335. package/src/v-angular/toast/toast-message.service.d.ts +17 -0
  336. package/src/v-angular/toast/toast.component.d.ts +22 -0
  337. package/src/v-angular/toast/toast.models.d.ts +15 -0
  338. package/src/v-angular/toast/toast.module.d.ts +10 -0
  339. package/src/v-angular/tooltip/tooltip.directive.d.ts +5 -3
  340. package/src/v-angular/tooltip/tooltip.module.d.ts +4 -4
  341. package/src/v-angular/tooltip/tooltip.styles.d.ts +11 -0
  342. package/v-angular/alert/alert.component.d.ts +19 -0
  343. package/v-angular/alert/alert.models.d.ts +13 -0
  344. package/v-angular/alert/alert.module.d.ts +8 -0
  345. package/v-angular/alert/index.d.ts +3 -0
  346. package/v-angular/base-control-value-accessor/base-control-value-accessor.component.d.ts +10 -4
  347. package/v-angular/base-control-value-accessor/base-control-value-accessor.module.d.ts +4 -4
  348. package/v-angular/breadcrumbs/breadcrumbs.component.d.ts +4 -4
  349. package/v-angular/breadcrumbs/breadcrumbs.module.d.ts +4 -4
  350. package/v-angular/button/button.component.d.ts +5 -5
  351. package/v-angular/button/button.module.d.ts +4 -4
  352. package/v-angular/card/card.component.d.ts +3 -3
  353. package/v-angular/card/card.module.d.ts +4 -4
  354. package/v-angular/character-countdown/character-countdown.module.d.ts +4 -4
  355. package/v-angular/checkbox/checkbox.component.d.ts +6 -5
  356. package/v-angular/checkbox/checkbox.module.d.ts +5 -4
  357. package/v-angular/datepicker/components/calendar/calendar.component.d.ts +36 -0
  358. package/v-angular/datepicker/components/calendar-control/calendar-control.component.d.ts +30 -0
  359. package/v-angular/datepicker/components/date-input/date-input.component.d.ts +102 -0
  360. package/v-angular/datepicker/components/datepicker/datepicker.component.d.ts +62 -0
  361. package/v-angular/datepicker/date-control-value-accessor/date-control-value-accessor.component.d.ts +165 -0
  362. package/v-angular/datepicker/datepicker.globals.d.ts +13 -0
  363. package/v-angular/datepicker/datepicker.models.d.ts +50 -0
  364. package/v-angular/datepicker/datepicker.module.d.ts +19 -0
  365. package/v-angular/datepicker/datepicker.utils.d.ts +39 -0
  366. package/v-angular/datepicker/directives/calendar-date.directive.d.ts +21 -0
  367. package/v-angular/datepicker/index.d.ts +13 -0
  368. package/v-angular/datepicker/models/dates.d.ts +15 -0
  369. package/v-angular/datepicker/pipes/date-thook.pipe.d.ts +8 -0
  370. package/v-angular/datepicker/pipes/is-disabled.pipe.d.ts +8 -0
  371. package/v-angular/datepicker/pipes/matches.pipe.d.ts +7 -0
  372. package/v-angular/drag-drop/drag-drop.component.d.ts +131 -0
  373. package/v-angular/drag-drop/drag-drop.models.d.ts +49 -0
  374. package/v-angular/drag-drop/drag-drop.module.d.ts +13 -0
  375. package/v-angular/drag-drop/drag-drop.pipes.d.ts +40 -0
  376. package/v-angular/drag-drop/drag-drop.utils.d.ts +33 -0
  377. package/v-angular/drag-drop/index.d.ts +4 -0
  378. package/v-angular/dropdown/dropdown-list/dropdown-list.component.d.ts +11 -4
  379. package/v-angular/dropdown/dropdown.component.d.ts +10 -6
  380. package/v-angular/dropdown/dropdown.module.d.ts +8 -7
  381. package/v-angular/dropdown/typeahead/typeahead-dropdown-list/typeahead-dropdown-list.component.d.ts +6 -6
  382. package/v-angular/dropdown/typeahead/typeahead-highlight/typeahead-highlight.component.d.ts +3 -3
  383. package/v-angular/dropdown/typeahead/typeahead-input/typeahead-input.component.d.ts +8 -6
  384. package/v-angular/dropdown/typeahead/typeahead.directive.d.ts +14 -12
  385. package/v-angular/dropdown/typeahead/typeahead.module.d.ts +4 -4
  386. package/v-angular/external-link/external-link.directive.d.ts +17 -0
  387. package/v-angular/external-link/external-link.module.d.ts +8 -0
  388. package/v-angular/external-link/index.d.ts +2 -0
  389. package/v-angular/i18n/i18n.module.d.ts +7 -7
  390. package/v-angular/i18n/i18n.test.module.d.ts +4 -4
  391. package/v-angular/index.d.ts +9 -0
  392. package/v-angular/info-circle/info-circle.component.d.ts +4 -4
  393. package/v-angular/info-circle/info-circle.module.d.ts +4 -4
  394. package/v-angular/input/input.component.d.ts +5 -10
  395. package/v-angular/input/input.module.d.ts +5 -4
  396. package/v-angular/input-mask/input-mask.directive.d.ts +3 -3
  397. package/v-angular/input-mask/input-mask.module.d.ts +5 -5
  398. package/v-angular/modal/dialog/dialog.component.d.ts +16 -7
  399. package/v-angular/modal/fold-out/fold-out.component.d.ts +34 -11
  400. package/v-angular/modal/fold-out/fold-out.directive.d.ts +3 -3
  401. package/v-angular/modal/fold-out/keyboard-key.enum.d.ts +7 -0
  402. package/v-angular/modal/modal.module.d.ts +4 -4
  403. package/v-angular/modal/slide-out/slide-out.component.d.ts +13 -6
  404. package/v-angular/pagination/index.d.ts +2 -0
  405. package/v-angular/pagination/pagination.component.d.ts +64 -0
  406. package/v-angular/pagination/pagination.module.d.ts +12 -0
  407. package/v-angular/radio/radio.component.d.ts +14 -13
  408. package/v-angular/radio/radio.module.d.ts +5 -4
  409. package/v-angular/slug/index.d.ts +2 -0
  410. package/v-angular/slug/slug.module.d.ts +8 -0
  411. package/v-angular/slug/slug.pipe.d.ts +12 -0
  412. package/v-angular/table/index.d.ts +5 -0
  413. package/v-angular/table/table.component.d.ts +229 -0
  414. package/v-angular/table/table.directive.d.ts +36 -0
  415. package/v-angular/table/table.models.d.ts +62 -0
  416. package/v-angular/table/table.module.d.ts +12 -0
  417. package/v-angular/table/table.tools.d.ts +5 -0
  418. package/v-angular/table/tr-thook.pipe.d.ts +7 -0
  419. package/v-angular/tabs/index.d.ts +4 -0
  420. package/v-angular/tabs/tab.directive.d.ts +37 -0
  421. package/v-angular/tabs/tabs.component.d.ts +65 -0
  422. package/v-angular/tabs/tabs.models.d.ts +25 -0
  423. package/v-angular/tabs/tabs.module.d.ts +11 -0
  424. package/v-angular/textarea/textarea.component.d.ts +6 -5
  425. package/v-angular/textarea/textarea.module.d.ts +6 -4
  426. package/v-angular/toast/index.d.ts +4 -0
  427. package/v-angular/toast/toast-message.service.d.ts +17 -0
  428. package/v-angular/toast/toast.component.d.ts +22 -0
  429. package/v-angular/toast/toast.models.d.ts +15 -0
  430. package/v-angular/toast/toast.module.d.ts +10 -0
  431. package/v-angular/tooltip/tooltip.directive.d.ts +5 -3
  432. package/v-angular/tooltip/tooltip.module.d.ts +4 -4
  433. package/v-angular/tooltip/tooltip.styles.d.ts +11 -0
  434. package/v-angular/v-angular.module.d.ts +27 -18
@@ -0,0 +1,387 @@
1
+ import { Component, ContentChild, ContentChildren, EventEmitter, Input, Output, QueryList, } from '@angular/core';
2
+ import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
3
+ import { debounceTime, map } from 'rxjs/operators';
4
+ import { TableAppendableRowsTemplateDirective, TableFooterTemplateDirective, TableTemplateDirective, } from './table.directive';
5
+ import { orderByAscending, orderByDescending, pick } from './table.tools';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "@jsverse/transloco";
10
+ import * as i4 from "./table.directive";
11
+ import * as i5 from "./tr-thook.pipe";
12
+ let staticInitId = 0;
13
+ function objectFromEntries(entryMap) {
14
+ const fromEntries = {};
15
+ for (const [key, value] of entryMap) {
16
+ fromEntries[key] = value;
17
+ }
18
+ return fromEntries;
19
+ }
20
+ /**
21
+ * A table component with built-in sorting and selecting functionality.
22
+ * By default, table cells (i.e. `<td>` elements) and table headers (i.e. `<th>` elements) are populated with text only values.
23
+ *
24
+ * To customize the contents of either the `<td>` or `<th>` elements (like adding color, icons, form fields, extra padding etc.), provide
25
+ * the customized content within a `<ng-template>`-tag, and place the ng-template in the html between the start and ending tag of
26
+ * the `<nggv-table>`. Add a `tableColumn`-attribute to the `<ng-template>`-element, and set the value to the specific column property.
27
+ * Set `tableColumnTarget` to either `th`, `td` or `both` (default) depending on target element type.
28
+ * The entire row from the `@Input() tableData` is available from the context `$implicit` variable.
29
+ *
30
+ * @example
31
+ * <!-- for table cells i.e. td-elements -->
32
+ * <ng-template tableColumn="status" tableColumnTarget="td" let-myDataVar="$implicit" let-status="$implicit.status">
33
+ * <!-- my custom status element -->
34
+ * </ng-template>
35
+ *
36
+ * @example
37
+ * <!-- for table headers i.e. th-elements -->
38
+ * <ng-template tableColumn="status" tableColumnTarget="th" let-myDataVar="$implicit" let-status="$implicit.status">
39
+ * <!-- my custom status element -->
40
+ * </ng-template>
41
+ *
42
+ * It is possible to add custom rows that are appended below data row. Use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of
43
+ * the `<nggv-table>`. Add a `tableAppendableRows`-attribute to the `<ng-template>`-element. Any `tr` elements that exist within `<ng-template tableAppendableRows>` and `</ng-template>` tags will be put below data row's `tr` element in the table.
44
+ *
45
+ * @example
46
+ * <!-- custom appended rows -->
47
+ * <ng-template tableAppendableRows let-myDataVar="$implicit" let-status="$implicit.status">
48
+ * <tr>
49
+ * <!-- first row's columns -->
50
+ * </tr>
51
+ * <!-- more rows if needed -->
52
+ * </ng-template>
53
+ *
54
+ * If custom styling is needed for data row that has appended rows, you can use data attribute `data-hasrowspan` to distinguish it from data row without appended rows.
55
+ * You can pass your own custom method with conditional logic to define what value will be passed to data-hasrowspan.
56
+ * In addition, hasRowSpan function accepts item from `@Input() tableData` as argument which is of the same type as value passed to context `$implicit` variable.
57
+ * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.
58
+ *
59
+ * @example
60
+ * <!-- inside component
61
+ * class CustomComponent {
62
+ * customHasRowSpanFunction = (item: CustomDataType) => item.appendedRowsData.length > 0 ? true : false;
63
+ * }
64
+ * -->
65
+ * <!-- inside stylesheets
66
+ * [data-hasrowspan="true"] {
67
+ * color: blue;
68
+ * }
69
+ * .appended-row {
70
+ * color: blue;
71
+ * }
72
+ * -->
73
+ * <nggv-table [hasRowSpan]="customHasRowSpanFunction">
74
+ * <!-- custom appended rows -->
75
+ * <ng-template tableAppendableRows let-appendedRowsData="$implicit.appendedRowsData">
76
+ * <tr *ngFor="let appendedRowItem of appendedRowsData" class="appended-row">
77
+ * <td>{{ appendedRowItem }}</td>
78
+ * <!-- other row's columns -->
79
+ * </tr>
80
+ * </ng-template>
81
+ * </nggv-table>
82
+ *
83
+ * In addition, it is possible to add footer for the table. Similarly to adding custom columns, use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of
84
+ * the `<nggv-table>`. Add a `tableFooter`-attribute to the `<ng-template>`-element. Any elements that exist within `<ng-template tableFooter>` and `</ng-template>` tags will be put to tfoot element inside the table.
85
+ *
86
+ * @example
87
+ * <!-- for table footer i.e. tfoot-element -->
88
+ * <ng-template tableFooter>
89
+ * <tr>
90
+ * <!-- first row's columns -->
91
+ * </tr>
92
+ * <!-- more rows if needed -->
93
+ * </ng-template>
94
+ *
95
+ */
96
+ export class TableComponent {
97
+ constructor() {
98
+ /** Emits the table row that was clicked. Works on all columns if not preventDefaultEmit is set for that column. */
99
+ this.ngvRowClick = new EventEmitter();
100
+ /**
101
+ * Emits currently selected and deselected items in the table as key-value pairs.
102
+ * Uses each item`s itemId as key, and a boolean value to describe selected status.
103
+ */
104
+ this.ngvRowSelect = new EventEmitter();
105
+ /**
106
+ * Emits event to signal that the table should be reordered.
107
+ */
108
+ this.ngvOrderBy = new EventEmitter();
109
+ /**
110
+ * Property name used to uniquely describe each item (i.e. row) in the data table.
111
+ * Defaults to \'id\'.
112
+ * Is required if selectable is true.
113
+ */
114
+ this.rowId = 'id';
115
+ /**
116
+ * Function's return value is used for data attribute \'data-hasrowspan\'.
117
+ * If custom hasRowSpan function is not passed to the table,
118
+ * then this function returns undefined value by default which results in \'data-hasrowspan\' attribute being omitted in html
119
+ * (angular omits attributes that contain null or undefined value).
120
+ * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.
121
+ */
122
+ this.hasRowSpan = (_) => undefined;
123
+ /**
124
+ * Used to enable/disable the left-side checkbox column.
125
+ * Defaults to true.
126
+ */
127
+ this.selectable = true;
128
+ /**
129
+ * Allow nggv-table to attempt sorting the data in the table. Not recommended if only a subset is loaded or if the dataset is very large.
130
+ * Disabled by default.
131
+ */
132
+ this.allowLocalSort = false;
133
+ /** Special property used for selecting DOM elements during automated UI testing. */
134
+ this.thook = 'table-select-all';
135
+ /**
136
+ * @internal
137
+ * Internal data structure used to keep track of added content templates used in td elements.
138
+ */
139
+ this.customRowTemplates = new Map();
140
+ /**
141
+ * @internal
142
+ * Internal data structure used to keep track of added content templates used in th elements.
143
+ */
144
+ this.customHeaderTemplates = new Map();
145
+ /**
146
+ * @internal
147
+ * FormGroup containing all row id\'s as controls, and whether these are selected or not as values.
148
+ */
149
+ this.rowSelectors = new UntypedFormGroup({});
150
+ /**
151
+ * @internal
152
+ * Master selector for selecting or deselecting all row selectors.
153
+ */
154
+ this.groupSelector = new UntypedFormControl(false);
155
+ this.selected = [];
156
+ this.subs = [];
157
+ }
158
+ ngOnChanges(changes) {
159
+ // table data was updated and the rows should be selectable
160
+ if ((changes.tableData?.currentValue && this.selectable) ||
161
+ (changes.selectable?.currentValue === true && this.tableData)) {
162
+ const wasChanged = this.registerSelectableRows(changes.tableData.currentValue);
163
+ if (wasChanged && !this.subs.length) {
164
+ // first time this is run
165
+ const groupSelectorSub = this.groupValueSubscription;
166
+ const rowSelectorSub = this.rowValueSubscription;
167
+ this.subs.push(groupSelectorSub, rowSelectorSub);
168
+ }
169
+ else if (wasChanged) {
170
+ this.rowSelectors.updateValueAndValidity();
171
+ }
172
+ }
173
+ // sort any incoming data
174
+ if (this.allowLocalSort &&
175
+ (changes.tableData?.currentValue || changes.tableColumns?.currentValue)) {
176
+ const orderedByColumn = this.tableColumns?.find((el) => el.order !== undefined);
177
+ if (orderedByColumn)
178
+ this.sortItemsBy(orderedByColumn);
179
+ }
180
+ }
181
+ ngOnInit() {
182
+ this.initId = staticInitId++;
183
+ }
184
+ ngAfterContentInit() {
185
+ // if any custom templates were defined in the template
186
+ if (this.customTemplates.length) {
187
+ // for each template found
188
+ this.customTemplates.map((tableTemplate) => {
189
+ // if target is either 'td' or 'both'
190
+ if (['td', 'both'].includes(tableTemplate.tableColumnTarget)) {
191
+ // add to custom row templates
192
+ this.customRowTemplates.set(tableTemplate.tableColumn, tableTemplate.templateRef);
193
+ }
194
+ // if target is either 'th' or 'both'
195
+ if (['th', 'both'].includes(tableTemplate.tableColumnTarget)) {
196
+ // add to custom header templates
197
+ this.customHeaderTemplates.set(tableTemplate.tableColumn, tableTemplate.templateRef);
198
+ }
199
+ });
200
+ }
201
+ // if appended rows' template is defined in the template
202
+ if (this.appendedRowsTemplate) {
203
+ // set templateRef of appended rows' template to variable
204
+ this.appendedRowsTemplateRef = this.appendedRowsTemplate.templateRef;
205
+ }
206
+ // if custom footer template is defined in the template
207
+ if (this.customFooterTemplate) {
208
+ // set templateRef of table footer to variable
209
+ this.customFooterTemplateRef = this.customFooterTemplate.templateRef;
210
+ }
211
+ }
212
+ ngOnDestroy() {
213
+ this.subs.forEach((sub) => sub.unsubscribe());
214
+ }
215
+ /**
216
+ * @internal
217
+ * Returns a subscription to the master selector control that either selects or deselects all row controls.
218
+ */
219
+ get groupValueSubscription() {
220
+ return this.groupSelector.valueChanges.subscribe({
221
+ next: (value) => {
222
+ const selectMap = new Map(Object.entries(this.rowSelectorsValue));
223
+ selectMap.forEach((_, key) => selectMap.set(key, value));
224
+ const patchValue = objectFromEntries(selectMap);
225
+ this.rowSelectors.patchValue(patchValue);
226
+ },
227
+ });
228
+ }
229
+ /**
230
+ * @internal
231
+ * Returns a subscription to all individual row selectors and update the master selector if all are selected.
232
+ */
233
+ get rowValueSubscription() {
234
+ return this.rowSelectors.valueChanges
235
+ .pipe(debounceTime(0), // to limit the number of events and to wait for all sub controls to update
236
+ map((val) => {
237
+ // get a filtered array of keys for all rows that are selected
238
+ const selected = Object.keys(val).filter((key) => {
239
+ return val[key] === true && this.rowSelectors.get(key)?.enabled;
240
+ });
241
+ // returns an object containing only the filtered keys
242
+ return pick(selected, val);
243
+ }))
244
+ .subscribe({
245
+ next: (value) => {
246
+ // the number of selected keys compared to the total number of keys available
247
+ const numberOfSelected = Object.keys(value).length;
248
+ const allSelected = numberOfSelected > 0
249
+ ? numberOfSelected === Object.keys(this.rowSelectorsValue).length
250
+ : false;
251
+ // update the master selector control
252
+ this.groupSelector.setValue(allSelected, { emitEvent: false });
253
+ // update the array of currently selected id's
254
+ this.selected = Object.keys(value);
255
+ // and emit the updated value
256
+ this.ngvRowSelect.emit(this.selected);
257
+ },
258
+ });
259
+ }
260
+ /**
261
+ * @internal
262
+ * Registers or disables row controls for new or removed rows.
263
+ */
264
+ registerSelectableRows(tableData) {
265
+ if (!tableData)
266
+ return false;
267
+ // Array containing only the id's for each row
268
+ const dataRowIds = tableData.map((data) => data[this.rowId]);
269
+ // Array containing the id's that have registered controls
270
+ const currentIds = Object.keys(this.rowSelectorsValue);
271
+ // Array containing all ids that lacks a corresponding control (i.e. new rows)
272
+ const newIds = dataRowIds.filter((id) => currentIds.indexOf(id) === -1);
273
+ // Array containing all ids that has a control but is no longer in the data set (i.e. removed rows)
274
+ const removedIds = currentIds.filter((id) => dataRowIds.indexOf(id) === -1);
275
+ // Register new controls for added rows
276
+ if (newIds.length) {
277
+ newIds.forEach((id) => {
278
+ const ctrl = this.rowSelectors.registerControl(id, new UntypedFormControl(false));
279
+ if (ctrl.disabled)
280
+ ctrl.enable();
281
+ });
282
+ }
283
+ // Set already registered controls to disabled for removed rows
284
+ if (removedIds.length)
285
+ removedIds.forEach((id) => this.rowSelectors.get(id)?.disable());
286
+ return newIds.length > 0 || removedIds.length > 0;
287
+ }
288
+ /**
289
+ * @internal
290
+ * Returns all enabled values unless all rows are disabled.
291
+ */
292
+ get rowSelectorsValue() {
293
+ return this.rowSelectors.enabled ? this.rowSelectors.value : {};
294
+ }
295
+ toggleSortOrderWithSpace(event, column) {
296
+ if (column.sortable) {
297
+ event.preventDefault();
298
+ this.toggleSortOrder(column);
299
+ }
300
+ }
301
+ /**
302
+ * @internal
303
+ * Switches sorting order between ascending and descending order for a column.
304
+ * @param column the column to sort rows after.
305
+ */
306
+ toggleSortOrder(column) {
307
+ // check if the table is already sorted by another column than the one provided
308
+ const currentlyOrderedBy = this.tableColumns?.find((el) => el !== column && el.order !== undefined);
309
+ if (currentlyOrderedBy)
310
+ delete currentlyOrderedBy.order;
311
+ column.order = column.order === 'desc' ? 'asc' : 'desc';
312
+ this.sortItemsBy(column);
313
+ }
314
+ /** If sortable, reorders the table data using the specified column as ordering attribute. */
315
+ sortItemsBy(column) {
316
+ if (!column.sortable)
317
+ return;
318
+ // emit re-order event
319
+ this.ngvOrderBy.emit({ property: column.property, order: column.order });
320
+ // if local sort is allowed, reorder data
321
+ if (!this.allowLocalSort || !this.tableData)
322
+ return;
323
+ return this.tableData.sort(column.order === 'desc'
324
+ ? orderByDescending(column.property)
325
+ : orderByAscending(column.property));
326
+ }
327
+ /**
328
+ * @internal
329
+ * Emits row data for what row was clicked if defaultEmit is allowed.
330
+ */
331
+ propagateItemClick(item, preventDefaultEmit) {
332
+ if (!preventDefaultEmit)
333
+ this.ngvRowClick.emit(item);
334
+ }
335
+ getAriaLabel(column) {
336
+ const sortOrder = column.order === 'asc'
337
+ ? this.ariaLabelsOrderBy?.desc
338
+ : this.ariaLabelsOrderBy?.asc;
339
+ if (!sortOrder)
340
+ return; // no aria labels defined
341
+ return column.ariaLabelSortable?.replace('{{sortOrder}}', sortOrder);
342
+ }
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
344
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableComponent, selector: "nggv-table", inputs: { tableColumns: "tableColumns", tableData: "tableData", rowId: "rowId", hasRowSpan: "hasRowSpan", selectable: "selectable", allowLocalSort: "allowLocalSort", thook: "thook", trThookFn: "trThookFn", ariaLabelCheckboxTh: "ariaLabelCheckboxTh", ariaLabelCheckboxTr: "ariaLabelCheckboxTr", ariaLabelsOrderBy: "ariaLabelsOrderBy" }, outputs: { ngvRowClick: "ngvRowClick", ngvRowSelect: "ngvRowSelect", ngvOrderBy: "ngvOrderBy" }, queries: [{ propertyName: "appendedRowsTemplate", first: true, predicate: TableAppendableRowsTemplateDirective, descendants: true }, { propertyName: "customFooterTemplate", first: true, predicate: TableFooterTemplateDirective, descendants: true }, { propertyName: "customTemplates", predicate: TableTemplateDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #sortableThTemplate let-column>\n <button class=\"sg-table-sort\" *transloco=\"let t\">\n <ng-template #thButtonTemplate>\n {{ t(column.label ?? '') }}\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else thButtonTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n </button>\n</ng-template>\n\n<ng-template #notSortableThTemplate let-column>\n <ng-template #defaultThTemplate>\n <ng-container *transloco=\"let t\">\n {{ t(column.label ?? '') }}\n </ng-container>\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else defaultThTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n</ng-template>\n\n<table class=\"gds-table\" *transloco=\"let t\">\n <!-- Table header -->\n <thead>\n <tr>\n <!-- Checkbox column for header -->\n <th *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n type=\"checkbox\"\n [formControl]=\"groupSelector\"\n [attr.aria-label]=\"ariaLabelCheckboxTh\"\n [attr.id]=\"'cb_header__' + initId\"\n [attr.data-thook]=\"thook\"\n />\n <label [attr.for]=\"'cb_header__' + initId\"></label>\n </div>\n </th>\n\n <!-- Other columns -->\n <th\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [sortable]=\"column.sortable\"\n [sortOrder]=\"column.order\"\n [thook]=\"'column-header-' + !!column.property\"\n (click)=\"toggleSortOrder(column)\"\n (keydown.space)=\"toggleSortOrderWithSpace($event, column)\"\n [attr.aria-label]=\"getAriaLabel(column)\"\n [attr.aria-sort]=\"column.order + 'ending'\"\n >\n <ng-container *ngIf=\"column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n sortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n notSortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n </th>\n </tr>\n </thead>\n\n <!-- Table body -->\n <tbody [formGroup]=\"rowSelectors\">\n <ng-container *ngFor=\"let item of tableData; let i = index\">\n <tr\n [attr.data-thook]=\"item | trThook: i : trThookFn\"\n [attr.data-hasrowspan]=\"hasRowSpan(item)\"\n >\n <!-- Checkbox column for row -->\n <td *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n *ngIf=\"rowSelectors.get(item[rowId])\"\n type=\"checkbox\"\n [formControlName]=\"item[rowId]\"\n [attr.aria-label]=\"ariaLabelCheckboxTr\"\n [attr.id]=\"'cb_row__' + initId + '_' + i\"\n [attr.data-thook]=\"'row-select-' + i\"\n />\n <label [attr.for]=\"'cb_row__' + initId + '_' + i\"></label>\n </div>\n </td>\n\n <!-- Other columns -->\n <td\n *ngFor=\"let column of tableColumns\"\n (click)=\"propagateItemClick(item, column.preventDefaultClickEvent)\"\n [columnType]=\"column.valueType\"\n [value]=\"item[column.property]\"\n >\n <ng-container\n *ngIf=\"\n customRowTemplates.get(column.property) as tdTemplate;\n else defaultTdTemplate\n \"\n >\n <!-- Cannot infer tdTemplate as TemplateRef therefore null -->\n <ng-template\n *ngTemplateOutlet=\"\n tdTemplate || null;\n context: { $implicit: item }\n \"\n >\n </ng-template>\n </ng-container>\n\n <ng-template #defaultTdTemplate>\n {{ item[column.property] }}\n </ng-template>\n </td>\n </tr>\n\n <!-- custom appended rows -->\n <ng-container *ngIf=\"appendedRowsTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container\n *ngTemplateOutlet=\"trTemplate || null; context: { $implicit: item }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n\n <!-- Table footer -->\n <tfoot *ngIf=\"customFooterTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container *ngTemplateOutlet=\"trTemplate || null\"> </ng-container>\n </tfoot>\n</table>\n", styles: ["::ng-deep .gds-table{--gds-ref-pallet-base600: hsl(0, 0%, 53%);--sg-table-header-background: #1a1a1a;--sg-table-header-color: #fff;--sg-table-cell-padding-x: .5rem;--sg-table-cell-padding-y: .6875rem;--sg-table-border-width: 1px;--sg-table-border-color: var(--gds-ref-pallet-base600);--sg-table-sort-icon-color: var(--gds-ref-pallet-base600);--gds-ref-pallet-base500: hsl(0, 0%, 68%);--sg-table-sort-icon-color-active: #fff;border-collapse:collapse;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color);width:100%;border-bottom:none}::ng-deep .gds-table thead tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);background:#333;color:var(--sg-table-header-color);padding:.3rem var(--sg-table-cell-padding-x);text-align:left;font-weight:500}::ng-deep .gds-table thead tr th.icon-invert.sg-sortable .sg-table-sort:after{margin-left:0;margin-right:.3rem;order:-1}::ng-deep .gds-table thead tr th .sg-table-sort{color:inherit;width:100%;text-align:left;display:flex;align-items:center;border-radius:.125rem;--gds-sys-color-focus-outline: $_header-color}::ng-deep .gds-table thead tr th .sg-table-sort:focus:not(:focus-visible){box-shadow:none;outline:0}::ng-deep .gds-table thead tr th .sg-table-sort:focus,::ng-deep .gds-table thead tr th .sg-table-sort:focus-visible{outline-color:var(--gds-sys-color-focus-outline);outline-style:solid;outline-width:.125rem;outline-offset:.125rem}::ng-deep .gds-table thead tr th[aria-sort] .sg-table-sort:after,::ng-deep .gds-table thead tr th.sg-sortable .sg-table-sort:after{content:\"\";background:var(--gds-ref-pallet-base500);-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:right;mask-position:right;width:12px;height:12px;margin-left:.3rem}::ng-deep .gds-table thead tr th[aria-sort=ascending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active);transform:rotate(180deg)}::ng-deep .gds-table thead tr th[aria-sort=descending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active)}::ng-deep .gds-table tbody tr td,::ng-deep .gds-table tbody tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x);vertical-align:top}::ng-deep .gds-table tbody tr.collapsible~.sub-row{display:none}::ng-deep .gds-table tbody tr.collapsible.expanded~.sub-row.show{display:table-row}::ng-deep .gds-table tbody tr td.collapse-control,::ng-deep .gds-table tbody tr td.select-control{width:15px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn{min-height:unset;padding:0;background:transparent}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder{cursor:pointer;width:12px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg{width:12px;fill:#868686}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg[name=angle-right]{width:9px}@media (max-width: 36em){::ng-deep .gds-table.table-mobile{width:100%;table-layout:fixed;border-bottom:none}::ng-deep .gds-table.table-mobile thead{position:sticky;top:0;display:block;background:#333}}@media (max-width: 36em) and (hover: none) and (pointer: coarse){::ng-deep .gds-table.table-mobile thead{display:table-header-group}}@media (max-width: 36em){::ng-deep .gds-table.table-mobile thead tr{display:flex;overflow:auto}::ng-deep .gds-table.table-mobile thead tr::-webkit-scrollbar{display:none}::ng-deep .gds-table.table-mobile thead tr th{flex:auto;text-align:left!important;white-space:nowrap}::ng-deep .gds-table.table-mobile tbody tr{display:flex;flex-direction:column;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color)}::ng-deep .gds-table.table-mobile tbody tr td{display:flex;justify-content:space-between;align-items:center;border-top:none!important}::ng-deep .gds-table.table-mobile tbody tr td:before{content:attr(data-label);font-weight:700}}::ng-deep .gds-table tr:hover td{background-color:#f8f8f8}::ng-deep .gds-table .gds-table__numeric-col{text-align:right}::ng-deep .gds-table thead tr th.gds-table__numeric-col .sg-table-sort{justify-content:end}::ng-deep .gds-table th.gds-table__numeric-col+:not(.gds-table__numeric-col),::ng-deep .gds-table td.gds-table__numeric-col+:not(.gds-table__numeric-col){padding-left:1rem}::ng-deep .gds-table th button{background-color:#0000;border:0;font-family:inherit;font-size:inherit;font-weight:inherit;padding:0;cursor:pointer}::ng-deep .gds-table td{cursor:pointer}::ng-deep .gds-table tfoot{border-top:1px solid;border-bottom:none;font-weight:500}::ng-deep .gds-table tfoot ::ng-deep td{padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x)}::ng-deep .gds-table th.column__check{height:vanilla-px-to-rem(32px);width:vanilla-px-to-rem(40px)}::ng-deep .gds-table th.column__check div{min-height:100%}::ng-deep .gds-table th.column__check input:checked+label:after{top:.6rem;display:inline}::ng-deep .gds-table th.column__check label{display:inline;padding:0}::ng-deep .gds-table th.column__check label:before{top:.55rem}::ng-deep .gds-table td.column__check{width:vanilla-px-to-rem(40px)}::ng-deep .gds-table td.column__check div{min-height:unset}::ng-deep .gds-table td.column__check label{padding:0}::ng-deep .gds-table td.column__check label:before{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "directive", type: i4.TableDirective, selector: "[columnType]", inputs: ["columnType", "sortable", "sortOrder", "value", "thook"] }, { kind: "pipe", type: i5.TrThookPipe, name: "trThook" }] }); }
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, decorators: [{
347
+ type: Component,
348
+ args: [{ selector: 'nggv-table', template: "<ng-template #sortableThTemplate let-column>\n <button class=\"sg-table-sort\" *transloco=\"let t\">\n <ng-template #thButtonTemplate>\n {{ t(column.label ?? '') }}\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else thButtonTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n </button>\n</ng-template>\n\n<ng-template #notSortableThTemplate let-column>\n <ng-template #defaultThTemplate>\n <ng-container *transloco=\"let t\">\n {{ t(column.label ?? '') }}\n </ng-container>\n </ng-template>\n <ng-container\n *ngIf=\"\n customHeaderTemplates.get(column.property) as thTemplate;\n else defaultThTemplate\n \"\n >\n <ng-template\n *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n >\n </ng-template>\n </ng-container>\n</ng-template>\n\n<table class=\"gds-table\" *transloco=\"let t\">\n <!-- Table header -->\n <thead>\n <tr>\n <!-- Checkbox column for header -->\n <th *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n type=\"checkbox\"\n [formControl]=\"groupSelector\"\n [attr.aria-label]=\"ariaLabelCheckboxTh\"\n [attr.id]=\"'cb_header__' + initId\"\n [attr.data-thook]=\"thook\"\n />\n <label [attr.for]=\"'cb_header__' + initId\"></label>\n </div>\n </th>\n\n <!-- Other columns -->\n <th\n *ngFor=\"let column of tableColumns\"\n [columnType]=\"column.valueType\"\n [sortable]=\"column.sortable\"\n [sortOrder]=\"column.order\"\n [thook]=\"'column-header-' + !!column.property\"\n (click)=\"toggleSortOrder(column)\"\n (keydown.space)=\"toggleSortOrderWithSpace($event, column)\"\n [attr.aria-label]=\"getAriaLabel(column)\"\n [attr.aria-sort]=\"column.order + 'ending'\"\n >\n <ng-container *ngIf=\"column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n sortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <ng-container\n *ngTemplateOutlet=\"\n notSortableThTemplate;\n context: { $implicit: column, column: column }\n \"\n >\n </ng-container>\n </ng-container>\n </th>\n </tr>\n </thead>\n\n <!-- Table body -->\n <tbody [formGroup]=\"rowSelectors\">\n <ng-container *ngFor=\"let item of tableData; let i = index\">\n <tr\n [attr.data-thook]=\"item | trThook: i : trThookFn\"\n [attr.data-hasrowspan]=\"hasRowSpan(item)\"\n >\n <!-- Checkbox column for row -->\n <td *ngIf=\"selectable\" class=\"column__check\">\n <div class=\"gds-field-checkbox-wrap\">\n <input\n *ngIf=\"rowSelectors.get(item[rowId])\"\n type=\"checkbox\"\n [formControlName]=\"item[rowId]\"\n [attr.aria-label]=\"ariaLabelCheckboxTr\"\n [attr.id]=\"'cb_row__' + initId + '_' + i\"\n [attr.data-thook]=\"'row-select-' + i\"\n />\n <label [attr.for]=\"'cb_row__' + initId + '_' + i\"></label>\n </div>\n </td>\n\n <!-- Other columns -->\n <td\n *ngFor=\"let column of tableColumns\"\n (click)=\"propagateItemClick(item, column.preventDefaultClickEvent)\"\n [columnType]=\"column.valueType\"\n [value]=\"item[column.property]\"\n >\n <ng-container\n *ngIf=\"\n customRowTemplates.get(column.property) as tdTemplate;\n else defaultTdTemplate\n \"\n >\n <!-- Cannot infer tdTemplate as TemplateRef therefore null -->\n <ng-template\n *ngTemplateOutlet=\"\n tdTemplate || null;\n context: { $implicit: item }\n \"\n >\n </ng-template>\n </ng-container>\n\n <ng-template #defaultTdTemplate>\n {{ item[column.property] }}\n </ng-template>\n </td>\n </tr>\n\n <!-- custom appended rows -->\n <ng-container *ngIf=\"appendedRowsTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container\n *ngTemplateOutlet=\"trTemplate || null; context: { $implicit: item }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </tbody>\n\n <!-- Table footer -->\n <tfoot *ngIf=\"customFooterTemplateRef as trTemplate\">\n <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n <ng-container *ngTemplateOutlet=\"trTemplate || null\"> </ng-container>\n </tfoot>\n</table>\n", styles: ["::ng-deep .gds-table{--gds-ref-pallet-base600: hsl(0, 0%, 53%);--sg-table-header-background: #1a1a1a;--sg-table-header-color: #fff;--sg-table-cell-padding-x: .5rem;--sg-table-cell-padding-y: .6875rem;--sg-table-border-width: 1px;--sg-table-border-color: var(--gds-ref-pallet-base600);--sg-table-sort-icon-color: var(--gds-ref-pallet-base600);--gds-ref-pallet-base500: hsl(0, 0%, 68%);--sg-table-sort-icon-color-active: #fff;border-collapse:collapse;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color);width:100%;border-bottom:none}::ng-deep .gds-table thead tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);background:#333;color:var(--sg-table-header-color);padding:.3rem var(--sg-table-cell-padding-x);text-align:left;font-weight:500}::ng-deep .gds-table thead tr th.icon-invert.sg-sortable .sg-table-sort:after{margin-left:0;margin-right:.3rem;order:-1}::ng-deep .gds-table thead tr th .sg-table-sort{color:inherit;width:100%;text-align:left;display:flex;align-items:center;border-radius:.125rem;--gds-sys-color-focus-outline: $_header-color}::ng-deep .gds-table thead tr th .sg-table-sort:focus:not(:focus-visible){box-shadow:none;outline:0}::ng-deep .gds-table thead tr th .sg-table-sort:focus,::ng-deep .gds-table thead tr th .sg-table-sort:focus-visible{outline-color:var(--gds-sys-color-focus-outline);outline-style:solid;outline-width:.125rem;outline-offset:.125rem}::ng-deep .gds-table thead tr th[aria-sort] .sg-table-sort:after,::ng-deep .gds-table thead tr th.sg-sortable .sg-table-sort:after{content:\"\";background:var(--gds-ref-pallet-base500);-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%3E%3Cpath%20d='M11.107%205.86147L10.6429%205.39741C10.5328%205.28726%2010.3546%205.28726%2010.2445%205.39741L6.60933%209.03257V1.03101C6.60933%200.876318%206.48276%200.749756%206.32808%200.749756H5.67183C5.51714%200.749756%205.39058%200.876318%205.39058%201.03101V9.03257L1.75542%205.39741C1.64526%205.28726%201.46714%205.28726%201.35698%205.39741L0.89292%205.86147C0.782764%205.97163%200.782764%206.14976%200.89292%206.25991L5.80073%2011.1677C5.91089%2011.2779%206.08901%2011.2779%206.19917%2011.1677L11.107%206.25991C11.2171%206.14976%2011.2171%205.97163%2011.107%205.86147Z'%20fill='%23ADADAD'/%3E%3C/svg%3E\");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:right;mask-position:right;width:12px;height:12px;margin-left:.3rem}::ng-deep .gds-table thead tr th[aria-sort=ascending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active);transform:rotate(180deg)}::ng-deep .gds-table thead tr th[aria-sort=descending] .sg-table-sort:after{background:var(--sg-table-sort-icon-color-active)}::ng-deep .gds-table tbody tr td,::ng-deep .gds-table tbody tr th{border-top:var(--sg-table-border-width) solid var(--sg-table-border-color);padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x);vertical-align:top}::ng-deep .gds-table tbody tr.collapsible~.sub-row{display:none}::ng-deep .gds-table tbody tr.collapsible.expanded~.sub-row.show{display:table-row}::ng-deep .gds-table tbody tr td.collapse-control,::ng-deep .gds-table tbody tr td.select-control{width:15px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn{min-height:unset;padding:0;background:transparent}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder{cursor:pointer;width:12px}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg{width:12px;fill:#868686}::ng-deep .gds-table tbody tr td.collapse-control>.collapse-btn>.icon-holder svg[name=angle-right]{width:9px}@media (max-width: 36em){::ng-deep .gds-table.table-mobile{width:100%;table-layout:fixed;border-bottom:none}::ng-deep .gds-table.table-mobile thead{position:sticky;top:0;display:block;background:#333}}@media (max-width: 36em) and (hover: none) and (pointer: coarse){::ng-deep .gds-table.table-mobile thead{display:table-header-group}}@media (max-width: 36em){::ng-deep .gds-table.table-mobile thead tr{display:flex;overflow:auto}::ng-deep .gds-table.table-mobile thead tr::-webkit-scrollbar{display:none}::ng-deep .gds-table.table-mobile thead tr th{flex:auto;text-align:left!important;white-space:nowrap}::ng-deep .gds-table.table-mobile tbody tr{display:flex;flex-direction:column;border-bottom:var(--sg-table-border-width) solid var(--sg-table-border-color)}::ng-deep .gds-table.table-mobile tbody tr td{display:flex;justify-content:space-between;align-items:center;border-top:none!important}::ng-deep .gds-table.table-mobile tbody tr td:before{content:attr(data-label);font-weight:700}}::ng-deep .gds-table tr:hover td{background-color:#f8f8f8}::ng-deep .gds-table .gds-table__numeric-col{text-align:right}::ng-deep .gds-table thead tr th.gds-table__numeric-col .sg-table-sort{justify-content:end}::ng-deep .gds-table th.gds-table__numeric-col+:not(.gds-table__numeric-col),::ng-deep .gds-table td.gds-table__numeric-col+:not(.gds-table__numeric-col){padding-left:1rem}::ng-deep .gds-table th button{background-color:#0000;border:0;font-family:inherit;font-size:inherit;font-weight:inherit;padding:0;cursor:pointer}::ng-deep .gds-table td{cursor:pointer}::ng-deep .gds-table tfoot{border-top:1px solid;border-bottom:none;font-weight:500}::ng-deep .gds-table tfoot ::ng-deep td{padding:var(--sg-table-cell-padding-y) var(--sg-table-cell-padding-x)}::ng-deep .gds-table th.column__check{height:vanilla-px-to-rem(32px);width:vanilla-px-to-rem(40px)}::ng-deep .gds-table th.column__check div{min-height:100%}::ng-deep .gds-table th.column__check input:checked+label:after{top:.6rem;display:inline}::ng-deep .gds-table th.column__check label{display:inline;padding:0}::ng-deep .gds-table th.column__check label:before{top:.55rem}::ng-deep .gds-table td.column__check{width:vanilla-px-to-rem(40px)}::ng-deep .gds-table td.column__check div{min-height:unset}::ng-deep .gds-table td.column__check label{padding:0}::ng-deep .gds-table td.column__check label:before{margin:0}\n"] }]
349
+ }], propDecorators: { customTemplates: [{
350
+ type: ContentChildren,
351
+ args: [TableTemplateDirective, { descendants: true }]
352
+ }], appendedRowsTemplate: [{
353
+ type: ContentChild,
354
+ args: [TableAppendableRowsTemplateDirective]
355
+ }], customFooterTemplate: [{
356
+ type: ContentChild,
357
+ args: [TableFooterTemplateDirective]
358
+ }], ngvRowClick: [{
359
+ type: Output
360
+ }], ngvRowSelect: [{
361
+ type: Output
362
+ }], ngvOrderBy: [{
363
+ type: Output
364
+ }], tableColumns: [{
365
+ type: Input
366
+ }], tableData: [{
367
+ type: Input
368
+ }], rowId: [{
369
+ type: Input
370
+ }], hasRowSpan: [{
371
+ type: Input
372
+ }], selectable: [{
373
+ type: Input
374
+ }], allowLocalSort: [{
375
+ type: Input
376
+ }], thook: [{
377
+ type: Input
378
+ }], trThookFn: [{
379
+ type: Input
380
+ }], ariaLabelCheckboxTh: [{
381
+ type: Input
382
+ }], ariaLabelCheckboxTr: [{
383
+ type: Input
384
+ }], ariaLabelsOrderBy: [{
385
+ type: Input
386
+ }] } });
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy92LWFuZ3VsYXIvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy92LWFuZ3VsYXIvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRWxELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsNEJBQTRCLEVBQzVCLHNCQUFzQixHQUN2QixNQUFNLG1CQUFtQixDQUFBO0FBTzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUE7Ozs7Ozs7QUFFekUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO0FBRXBCLFNBQVMsaUJBQWlCLENBQUMsUUFBdUI7SUFDaEQsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQTtJQUM5QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDcEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUMxQixDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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R0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBUYWJsZUFwcGVuZGFibGVSb3dzVGVtcGxhdGVEaXJlY3RpdmUsXG4gIFRhYmxlRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIFRhYmxlVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vdGFibGUuZGlyZWN0aXZlJ1xuaW1wb3J0IHtcbiAgYXJpYUxhYmVsc09yZGVyQnksXG4gIE9yZGVyQnksXG4gIFRhYmxlQ29sdW1uLFxuICBUYWJsZVJvdyxcbn0gZnJvbSAnLi90YWJsZS5tb2RlbHMnXG5pbXBvcnQgeyBvcmRlckJ5QXNjZW5kaW5nLCBvcmRlckJ5RGVzY2VuZGluZywgcGljayB9IGZyb20gJy4vdGFibGUudG9vbHMnXG5cbmxldCBzdGF0aWNJbml0SWQgPSAwXG5cbmZ1bmN0aW9uIG9iamVjdEZyb21FbnRyaWVzKGVudHJ5TWFwOiBNYXA8YW55LCBhbnk+KTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIGNvbnN0IGZyb21FbnRyaWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cnlNYXApIHtcbiAgICBmcm9tRW50cmllc1trZXldID0gdmFsdWVcbiAgfVxuICByZXR1cm4gZnJvbUVudHJpZXNcbn1cblxuLyoqXG4gKiBBIHRhYmxlIGNvbXBvbmVudCB3aXRoIGJ1aWx0LWluIHNvcnRpbmcgYW5kIHNlbGVjdGluZyBmdW5jdGlvbmFsaXR5LlxuICogQnkgZGVmYXVsdCwgdGFibGUgY2VsbHMgKGkuZS4gYDx0ZD5gIGVsZW1lbnRzKSBhbmQgdGFibGUgaGVhZGVycyAoaS5lLiBgPHRoPmAgZWxlbWVudHMpIGFyZSBwb3B1bGF0ZWQgd2l0aCB0ZXh0IG9ubHkgdmFsdWVzLlxuICpcbiAqIFRvIGN1c3RvbWl6ZSB0aGUgY29udGVudHMgb2YgZWl0aGVyIHRoZSBgPHRkPmAgb3IgYDx0aD5gIGVsZW1lbnRzIChsaWtlIGFkZGluZyBjb2xvciwgaWNvbnMsIGZvcm0gZmllbGRzLCBleHRyYSBwYWRkaW5nIGV0Yy4pLCBwcm92aWRlXG4gKiB0aGUgY3VzdG9taXplZCBjb250ZW50IHdpdGhpbiBhIGA8bmctdGVtcGxhdGU+YC10YWcsIGFuZCBwbGFjZSB0aGUgbmctdGVtcGxhdGUgaW4gdGhlIGh0bWwgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZGluZyB0YWcgb2ZcbiAqIHRoZSBgPG5nZ3YtdGFibGU+YC4gQWRkIGEgYHRhYmxlQ29sdW1uYC1hdHRyaWJ1dGUgdG8gdGhlIGA8bmctdGVtcGxhdGU+YC1lbGVtZW50LCBhbmQgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWMgY29sdW1uIHByb3BlcnR5LlxuICogU2V0IGB0YWJsZUNvbHVtblRhcmdldGAgdG8gZWl0aGVyIGB0aGAsIGB0ZGAgb3IgYGJvdGhgIChkZWZhdWx0KSBkZXBlbmRpbmcgb24gdGFyZ2V0IGVsZW1lbnQgdHlwZS5cbiAqIFRoZSBlbnRpcmUgcm93IGZyb20gdGhlIGBASW5wdXQoKSB0YWJsZURhdGFgIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBjb250ZXh0IGAkaW1wbGljaXRgIHZhcmlhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8IS0tIGZvciB0YWJsZSBjZWxscyBpLmUuIHRkLWVsZW1lbnRzIC0tPlxuICogPG5nLXRlbXBsYXRlIHRhYmxlQ29sdW1uPVwic3RhdHVzXCIgdGFibGVDb2x1bW5UYXJnZXQ9XCJ0ZFwiIGxldC1teURhdGFWYXI9XCIkaW1wbGljaXRcIiBsZXQtc3RhdHVzPVwiJGltcGxpY2l0LnN0YXR1c1wiPlxuICogIDwhLS0gbXkgY3VzdG9tIHN0YXR1cyBlbGVtZW50IC0tPlxuICogPC9uZy10ZW1wbGF0ZT5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBmb3IgdGFibGUgaGVhZGVycyBpLmUuIHRoLWVsZW1lbnRzIC0tPlxuICogPG5nLXRlbXBsYXRlIHRhYmxlQ29sdW1uPVwic3RhdHVzXCIgdGFibGVDb2x1bW5UYXJnZXQ9XCJ0aFwiIGxldC1teURhdGFWYXI9XCIkaW1wbGljaXRcIiBsZXQtc3RhdHVzPVwiJGltcGxpY2l0LnN0YXR1c1wiPlxuICogIDwhLS0gbXkgY3VzdG9tIHN0YXR1cyBlbGVtZW50IC0tPlxuICogPC9uZy10ZW1wbGF0ZT5cbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBhZGQgY3VzdG9tIHJvd3MgdGhhdCBhcmUgYXBwZW5kZWQgYmVsb3cgZGF0YSByb3cuIFVzZSBgPG5nLXRlbXBsYXRlPmAtdGFnIGFuZCBwbGFjZSB0aGUgbmctdGVtcGxhdGUgaW4gdGhlIGh0bWwgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZGluZyB0YWcgb2ZcbiAqIHRoZSBgPG5nZ3YtdGFibGU+YC4gQWRkIGEgYHRhYmxlQXBwZW5kYWJsZVJvd3NgLWF0dHJpYnV0ZSB0byB0aGUgYDxuZy10ZW1wbGF0ZT5gLWVsZW1lbnQuIEFueSBgdHJgIGVsZW1lbnRzIHRoYXQgZXhpc3Qgd2l0aGluIGA8bmctdGVtcGxhdGUgdGFibGVBcHBlbmRhYmxlUm93cz5gIGFuZCBgPC9uZy10ZW1wbGF0ZT5gIHRhZ3Mgd2lsbCBiZSBwdXQgYmVsb3cgZGF0YSByb3cncyBgdHJgIGVsZW1lbnQgaW4gdGhlIHRhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8IS0tIGN1c3RvbSBhcHBlbmRlZCByb3dzIC0tPlxuICogPG5nLXRlbXBsYXRlIHRhYmxlQXBwZW5kYWJsZVJvd3MgbGV0LW15RGF0YVZhcj1cIiRpbXBsaWNpdFwiIGxldC1zdGF0dXM9XCIkaW1wbGljaXQuc3RhdHVzXCI+XG4gKiAgPHRyPlxuICogICA8IS0tIGZpcnN0IHJvdydzIGNvbHVtbnMgLS0+XG4gKiAgPC90cj5cbiAqICA8IS0tIG1vcmUgcm93cyBpZiBuZWVkZWQgLS0+XG4gKiA8L25nLXRlbXBsYXRlPlxuICpcbiAqIElmIGN1c3RvbSBzdHlsaW5nIGlzIG5lZWRlZCBmb3IgZGF0YSByb3cgdGhhdCBoYXMgYXBwZW5kZWQgcm93cywgeW91IGNhbiB1c2UgZGF0YSBhdHRyaWJ1dGUgYGRhdGEtaGFzcm93c3BhbmAgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBkYXRhIHJvdyB3aXRob3V0IGFwcGVuZGVkIHJvd3MuXG4gKiBZb3UgY2FuIHBhc3MgeW91ciBvd24gY3VzdG9tIG1ldGhvZCB3aXRoIGNvbmRpdGlvbmFsIGxvZ2ljIHRvIGRlZmluZSB3aGF0IHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRvIGRhdGEtaGFzcm93c3Bhbi5cbiAqIEluIGFkZGl0aW9uLCBoYXNSb3dTcGFuIGZ1bmN0aW9uIGFjY2VwdHMgaXRlbSBmcm9tIGBASW5wdXQoKSB0YWJsZURhdGFgIGFzIGFyZ3VtZW50IHdoaWNoIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdmFsdWUgcGFzc2VkIHRvIGNvbnRleHQgYCRpbXBsaWNpdGAgdmFyaWFibGUuXG4gKiBJTVBPUlRBTlQ6IHVzZSBhcnJvdyBmdW5jdGlvbiBzdHlsZSBmb3IgZGVmaW5pbmcgZnVuY3Rpb24gaW5zaWRlIGNvbXBvbmVudCwgaS5lLiBgaGFzUm93U3BhbiA9ICh2YWx1ZSkgPT4gb3V0cHV0O2AuIElmIHJlZ3VsYXIgZnVuY3Rpb24gd2lsbCBiZSBkZWZpbmVkLCBpLmUuIGBoYXNSb3dTcGFuKHZhbHVlKSB7IHJldHVybiBvdXRwdXQ7IH1gLCBiaW5kaW5nIHdpbGwgbm90IHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIDwhLS0gaW5zaWRlIGNvbXBvbmVudFxuICogY2xhc3MgQ3VzdG9tQ29tcG9uZW50IHtcbiAqICBjdXN0b21IYXNSb3dTcGFuRnVuY3Rpb24gPSAoaXRlbTogQ3VzdG9tRGF0YVR5cGUpID0+IGl0ZW0uYXBwZW5kZWRSb3dzRGF0YS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xuICogfVxuICogLS0+XG4gKiA8IS0tIGluc2lkZSBzdHlsZXNoZWV0c1xuICogW2RhdGEtaGFzcm93c3Bhbj1cInRydWVcIl0ge1xuICogIGNvbG9yOiBibHVlO1xuICogfVxuICogLmFwcGVuZGVkLXJvdyB7XG4gKiAgY29sb3I6IGJsdWU7XG4gKiB9XG4gKiAtLT5cbiAqIDxuZ2d2LXRhYmxlIFtoYXNSb3dTcGFuXT1cImN1c3RvbUhhc1Jvd1NwYW5GdW5jdGlvblwiPlxuICogIDwhLS0gY3VzdG9tIGFwcGVuZGVkIHJvd3MgLS0+XG4gKiAgPG5nLXRlbXBsYXRlIHRhYmxlQXBwZW5kYWJsZVJvd3MgbGV0LWFwcGVuZGVkUm93c0RhdGE9XCIkaW1wbGljaXQuYXBwZW5kZWRSb3dzRGF0YVwiPlxuICogICA8dHIgKm5nRm9yPVwibGV0IGFwcGVuZGVkUm93SXRlbSBvZiBhcHBlbmRlZFJvd3NEYXRhXCIgY2xhc3M9XCJhcHBlbmRlZC1yb3dcIj5cbiAqICAgIDx0ZD57eyBhcHBlbmRlZFJvd0l0ZW0gfX08L3RkPlxuICogICAgPCEtLSBvdGhlciByb3cncyBjb2x1bW5zIC0tPlxuICogICA8L3RyPlxuICogIDwvbmctdGVtcGxhdGU+XG4gKiA8L25nZ3YtdGFibGU+XG4gKlxuICogSW4gYWRkaXRpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBmb290ZXIgZm9yIHRoZSB0YWJsZS4gU2ltaWxhcmx5IHRvIGFkZGluZyBjdXN0b20gY29sdW1ucywgdXNlIGA8bmctdGVtcGxhdGU+YC10YWcgYW5kIHBsYWNlIHRoZSBuZy10ZW1wbGF0ZSBpbiB0aGUgaHRtbCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kaW5nIHRhZyBvZlxuICogdGhlIGA8bmdndi10YWJsZT5gLiBBZGQgYSBgdGFibGVGb290ZXJgLWF0dHJpYnV0ZSB0byB0aGUgYDxuZy10ZW1wbGF0ZT5gLWVsZW1lbnQuIEFueSBlbGVtZW50cyB0aGF0IGV4aXN0IHdpdGhpbiBgPG5nLXRlbXBsYXRlIHRhYmxlRm9vdGVyPmAgYW5kIGA8L25nLXRlbXBsYXRlPmAgdGFncyB3aWxsIGJlIHB1dCB0byB0Zm9vdCBlbGVtZW50IGluc2lkZSB0aGUgdGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDwhLS0gZm9yIHRhYmxlIGZvb3RlciBpLmUuIHRmb290LWVsZW1lbnQgLS0+XG4gKiA8bmctdGVtcGxhdGUgdGFibGVGb290ZXI+XG4gKiAgPHRyPlxuICogICA8IS0tIGZpcnN0IHJvdydzIGNvbHVtbnMgLS0+XG4gKiAgPC90cj5cbiAqICA8IS0tIG1vcmUgcm93cyBpZiBuZWVkZWQgLS0+XG4gKiA8L25nLXRlbXBsYXRlPlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmdndi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBUYWJsZVJvdz5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ3VzdG9tIHRlbXBsYXRlcyBkZWZpbmVkIGluIHRoZSBodG1sLlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZVRlbXBsYXRlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGN1c3RvbVRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUYWJsZVRlbXBsYXRlRGlyZWN0aXZlPGtleW9mIFQ+PlxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ3VzdG9tIGFwcGVuZGVkIHJvd3MgdGVtcGxhdGUgZGVmaW5lZCBpbiB0aGUgaHRtbC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGQoVGFibGVBcHBlbmRhYmxlUm93c1RlbXBsYXRlRGlyZWN0aXZlKVxuICBhcHBlbmRlZFJvd3NUZW1wbGF0ZSE6IFRhYmxlQXBwZW5kYWJsZVJvd3NUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ3VzdG9tIGZvb3RlciB0ZW1wbGF0ZSBkZWZpbmVkIGluIHRoZSBodG1sLlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChUYWJsZUZvb3RlclRlbXBsYXRlRGlyZWN0aXZlKVxuICBjdXN0b21Gb290ZXJUZW1wbGF0ZSE6IFRhYmxlRm9vdGVyVGVtcGxhdGVEaXJlY3RpdmVcblxuICAvKiogRW1pdHMgdGhlIHRhYmxlIHJvdyB0aGF0IHdhcyBjbGlja2VkLiBXb3JrcyBvbiBhbGwgY29sdW1ucyBpZiBub3QgcHJldmVudERlZmF1bHRFbWl0IGlzIHNldCBmb3IgdGhhdCBjb2x1bW4uICovXG4gIEBPdXRwdXQoKSBuZ3ZSb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VCB8IGFueT4oKVxuXG4gIC8qKlxuICAgKiBFbWl0cyBjdXJyZW50bHkgc2VsZWN0ZWQgYW5kIGRlc2VsZWN0ZWQgaXRlbXMgaW4gdGhlIHRhYmxlIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICogVXNlcyBlYWNoIGl0ZW1gcyBpdGVtSWQgYXMga2V5LCBhbmQgYSBib29sZWFuIHZhbHVlIHRvIGRlc2NyaWJlIHNlbGVjdGVkIHN0YXR1cy5cbiAgICovXG4gIEBPdXRwdXQoKSBuZ3ZSb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpXG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHRvIHNpZ25hbCB0aGF0IHRoZSB0YWJsZSBzaG91bGQgYmUgcmVvcmRlcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG5ndk9yZGVyQnkgPSBuZXcgRXZlbnRFbWl0dGVyPE9yZGVyQnk8VD4+KClcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgaXRlbXMgZGVzY3JpYmluZyBob3cgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgYmUgcmVuZGVyZWQsXG4gICAqIHRvZ2V0aGVyIHdpdGggaW5zdHJ1Y3Rpb25zIGZvciBob3cgZWFjaCByb3cgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGF0IGNvbHVtbi5cbiAgICovXG4gIEBJbnB1dCgpIHRhYmxlQ29sdW1ucyE6IFRhYmxlQ29sdW1uPFQ+W11cblxuICAvKiogRGF0YSBhcnJheSB0byBkaXNwbGF5IGRhdGEgaW4gdGhlIHRhYmxlLiBFYWNoIGl0ZW0gPFQ+IGluIHRoZSBhcnJheSByZXByZXNlbnRzIGEgcm93IGluIHRoZSB0YWJsZS4gKi9cbiAgQElucHV0KCkgdGFibGVEYXRhITogVFtdXG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IG5hbWUgdXNlZCB0byB1bmlxdWVseSBkZXNjcmliZSBlYWNoIGl0ZW0gKGkuZS4gcm93KSBpbiB0aGUgZGF0YSB0YWJsZS5cbiAgICogRGVmYXVsdHMgdG8gXFwnaWRcXCcuXG4gICAqIElzIHJlcXVpcmVkIGlmIHNlbGVjdGFibGUgaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIHJvd0lkID0gJ2lkJ1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpcyB1c2VkIGZvciBkYXRhIGF0dHJpYnV0ZSBcXCdkYXRhLWhhc3Jvd3NwYW5cXCcuXG4gICAqIElmIGN1c3RvbSBoYXNSb3dTcGFuIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQgdG8gdGhlIHRhYmxlLFxuICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQgdmFsdWUgYnkgZGVmYXVsdCB3aGljaCByZXN1bHRzIGluIFxcJ2RhdGEtaGFzcm93c3BhblxcJyBhdHRyaWJ1dGUgYmVpbmcgb21pdHRlZCBpbiBodG1sXG4gICAqIChhbmd1bGFyIG9taXRzIGF0dHJpYnV0ZXMgdGhhdCBjb250YWluIG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlKS5cbiAgICogSU1QT1JUQU5UOiB1c2UgYXJyb3cgZnVuY3Rpb24gc3R5bGUgZm9yIGRlZmluaW5nIGZ1bmN0aW9uIGluc2lkZSBjb21wb25lbnQsIGkuZS4gYGhhc1Jvd1NwYW4gPSAodmFsdWUpID0+IG91dHB1dDtgLiBJZiByZWd1bGFyIGZ1bmN0aW9uIHdpbGwgYmUgZGVmaW5lZCwgaS5lLiBgaGFzUm93U3Bhbih2YWx1ZSkgeyByZXR1cm4gb3V0cHV0OyB9YCwgYmluZGluZyB3aWxsIG5vdCB3b3JrLlxuICAgKi9cbiAgQElucHV0KCkgaGFzUm93U3BhbjogKGl0ZW06IFQpID0+IGFueSA9IChfKSA9PiB1bmRlZmluZWRcblxuICAvKipcbiAgICogVXNlZCB0byBlbmFibGUvZGlzYWJsZSB0aGUgbGVmdC1zaWRlIGNoZWNrYm94IGNvbHVtbi5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGFibGUgPSB0cnVlXG5cbiAgLyoqXG4gICAqIEFsbG93IG5nZ3YtdGFibGUgdG8gYXR0ZW1wdCBzb3J0aW5nIHRoZSBkYXRhIGluIHRoZSB0YWJsZS4gTm90IHJlY29tbWVuZGVkIGlmIG9ubHkgYSBzdWJzZXQgaXMgbG9hZGVkIG9yIGlmIHRoZSBkYXRhc2V0IGlzIHZlcnkgbGFyZ2UuXG4gICAqIERpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0xvY2FsU29ydCA9IGZhbHNlXG5cbiAgLyoqIFNwZWNpYWwgcHJvcGVydHkgdXNlZCBmb3Igc2VsZWN0aW5nIERPTSBlbGVtZW50cyBkdXJpbmcgYXV0b21hdGVkIFVJIHRlc3RpbmcuICovXG4gIEBJbnB1dCgpIHRob29rID0gJ3RhYmxlLXNlbGVjdC1hbGwnXG5cbiAgLyoqIEZ1bmN0aW9uIHRvIG92ZXJ3cml0ZSBnZW5lcmF0ZWQgdGhvb2sgZm9yIGVhY2ggcm93LiAqL1xuICBASW5wdXQoKSB0clRob29rRm4/OiAoaXRlbTogVCkgPT4gc3RyaW5nXG5cbiAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSBjaGVja2JveCBpbiB0aGUgdGFibGUgaGVhZGVyICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbENoZWNrYm94VGg/OiBzdHJpbmdcblxuICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlIGNoZWNrYm94IGluIHRoZSB0YWJsZSBoZWFkZXIgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQ2hlY2tib3hUcj86IHN0cmluZ1xuXG4gIC8qKiBBcmlhIGxhYmVscyBmb3Igc29ydGluZyBpbiB0aGUgdGFibGUgaGVhZGVyICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbHNPcmRlckJ5PzogYXJpYUxhYmVsc09yZGVyQnlcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEludGVybmFsIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhZGRlZCBjb250ZW50IHRlbXBsYXRlcyB1c2VkIGluIHRkIGVsZW1lbnRzLlxuICAgKi9cbiAgY3VzdG9tUm93VGVtcGxhdGVzID0gbmV3IE1hcDxrZXlvZiBULCBUZW1wbGF0ZVJlZjxhbnk+PigpXG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWRkZWQgY29udGVudCB0ZW1wbGF0ZXMgdXNlZCBpbiB0aCBlbGVtZW50cy5cbiAgICovXG4gIGN1c3RvbUhlYWRlclRlbXBsYXRlcyA9IG5ldyBNYXA8a2V5b2YgVCwgVGVtcGxhdGVSZWY8YW55Pj4oKVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGN1c3RvbSBhcHBlbmRlZCByb3dzIGkuZS4gdHIgZWxlbWVudHMgKHJvd3MpLlxuICAgKi9cbiAgYXBwZW5kZWRSb3dzVGVtcGxhdGVSZWYhOiBUZW1wbGF0ZVJlZjxhbnk+XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGZvb3QgZWxlbWVudCBjaGlsZHJlbiBpLmUuIHRyIGVsZW1lbnRzIChyb3dzKS5cbiAgICovXG4gIGN1c3RvbUZvb3RlclRlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8YW55PlxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5jcmVtZW50YWwgaWQuXG4gICAqL1xuICBpbml0SWQhOiBudW1iZXJcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZvcm1Hcm91cCBjb250YWluaW5nIGFsbCByb3cgaWRcXCdzIGFzIGNvbnRyb2xzLCBhbmQgd2hldGhlciB0aGVzZSBhcmUgc2VsZWN0ZWQgb3Igbm90IGFzIHZhbHVlcy5cbiAgICovXG4gIHJvd1NlbGVjdG9yczogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogTWFzdGVyIHNlbGVjdG9yIGZvciBzZWxlY3Rpbmcgb3IgZGVzZWxlY3RpbmcgYWxsIHJvdyBzZWxlY3RvcnMuXG4gICAqL1xuICBncm91cFNlbGVjdG9yOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZhbHNlKVxuXG4gIHByaXZhdGUgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gW11cbiAgcHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIHRhYmxlIGRhdGEgd2FzIHVwZGF0ZWQgYW5kIHRoZSByb3dzIHNob3VsZCBiZSBzZWxlY3RhYmxlXG4gICAgaWYgKFxuICAgICAgKGNoYW5nZXMudGFibGVEYXRhPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5zZWxlY3RhYmxlKSB8fFxuICAgICAgKGNoYW5nZXMuc2VsZWN0YWJsZT8uY3VycmVudFZhbHVlID09PSB0cnVlICYmIHRoaXMudGFibGVEYXRhKVxuICAgICkge1xuICAgICAgY29uc3Qgd2FzQ2hhbmdlZCA9IHRoaXMucmVnaXN0ZXJTZWxlY3RhYmxlUm93cyhcbiAgICAgICAgY2hhbmdlcy50YWJsZURhdGEuY3VycmVudFZhbHVlLFxuICAgICAgKVxuICAgICAgaWYgKHdhc0NoYW5nZWQgJiYgIXRoaXMuc3Vicy5sZW5ndGgpIHtcbiAgICAgICAgLy8gZmlyc3QgdGltZSB0aGlzIGlzIHJ1blxuICAgICAgICBjb25zdCBncm91cFNlbGVjdG9yU3ViID0gdGhpcy5ncm91cFZhbHVlU3Vic2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHJvd1NlbGVjdG9yU3ViID0gdGhpcy5yb3dWYWx1ZVN1YnNjcmlwdGlvblxuICAgICAgICB0aGlzLnN1YnMucHVzaChncm91cFNlbGVjdG9yU3ViLCByb3dTZWxlY3RvclN1YilcbiAgICAgIH0gZWxzZSBpZiAod2FzQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLnJvd1NlbGVjdG9ycy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzb3J0IGFueSBpbmNvbWluZyBkYXRhXG4gICAgaWYgKFxuICAgICAgdGhpcy5hbGxvd0xvY2FsU29ydCAmJlxuICAgICAgKGNoYW5nZXMudGFibGVEYXRhPy5jdXJyZW50VmFsdWUgfHwgY2hhbmdlcy50YWJsZUNvbHVtbnM/LmN1cnJlbnRWYWx1ZSlcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yZGVyZWRCeUNvbHVtbjogVGFibGVDb2x1bW48VD4gfCB1bmRlZmluZWQgPVxuICAgICAgICB0aGlzLnRhYmxlQ29sdW1ucz8uZmluZCgoZWwpID0+IGVsLm9yZGVyICE9PSB1bmRlZmluZWQpXG4gICAgICBpZiAob3JkZXJlZEJ5Q29sdW1uKSB0aGlzLnNvcnRJdGVtc0J5KG9yZGVyZWRCeUNvbHVtbilcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRJZCA9IHN0YXRpY0luaXRJZCsrXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgLy8gaWYgYW55IGN1c3RvbSB0ZW1wbGF0ZXMgd2VyZSBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgIGlmICh0aGlzLmN1c3RvbVRlbXBsYXRlcy5sZW5ndGgpIHtcbiAgICAgIC8vIGZvciBlYWNoIHRlbXBsYXRlIGZvdW5kXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5tYXAoKHRhYmxlVGVtcGxhdGUpID0+IHtcbiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIGVpdGhlciAndGQnIG9yICdib3RoJ1xuICAgICAgICBpZiAoXG4gICAgICAgICAgWyd0ZCcsICdib3RoJ10uaW5jbHVkZXModGFibGVUZW1wbGF0ZS50YWJsZUNvbHVtblRhcmdldCBhcyBzdHJpbmcpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGFkZCB0byBjdXN0b20gcm93IHRlbXBsYXRlc1xuICAgICAgICAgIHRoaXMuY3VzdG9tUm93VGVtcGxhdGVzLnNldChcbiAgICAgICAgICAgIHRhYmxlVGVtcGxhdGUudGFibGVDb2x1bW4sXG4gICAgICAgICAgICB0YWJsZVRlbXBsYXRlLnRlbXBsYXRlUmVmLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0YXJnZXQgaXMgZWl0aGVyICd0aCcgb3IgJ2JvdGgnXG4gICAgICAgIGlmIChcbiAgICAgICAgICBbJ3RoJywgJ2JvdGgnXS5pbmNsdWRlcyh0YWJsZVRlbXBsYXRlLnRhYmxlQ29sdW1uVGFyZ2V0IGFzIHN0cmluZylcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYWRkIHRvIGN1c3RvbSBoZWFkZXIgdGVtcGxhdGVzXG4gICAgICAgICAgdGhpcy5jdXN0b21IZWFkZXJUZW1wbGF0ZXMuc2V0KFxuICAgICAgICAgICAgdGFibGVUZW1wbGF0ZS50YWJsZUNvbHVtbixcbiAgICAgICAgICAgIHRhYmxlVGVtcGxhdGUudGVtcGxhdGVSZWYsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGlmIGFwcGVuZGVkIHJvd3MnIHRlbXBsYXRlIGlzIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgaWYgKHRoaXMuYXBwZW5kZWRSb3dzVGVtcGxhdGUpIHtcbiAgICAgIC8vIHNldCB0ZW1wbGF0ZVJlZiBvZiBhcHBlbmRlZCByb3dzJyB0ZW1wbGF0ZSB0byB2YXJpYWJsZVxuICAgICAgdGhpcy5hcHBlbmRlZFJvd3NUZW1wbGF0ZVJlZiA9IHRoaXMuYXBwZW5kZWRSb3dzVGVtcGxhdGUudGVtcGxhdGVSZWZcbiAgICB9XG5cbiAgICAvLyBpZiBjdXN0b20gZm9vdGVyIHRlbXBsYXRlIGlzIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgaWYgKHRoaXMuY3VzdG9tRm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgIC8vIHNldCB0ZW1wbGF0ZVJlZiBvZiB0YWJsZSBmb290ZXIgdG8gdmFyaWFibGVcbiAgICAgIHRoaXMuY3VzdG9tRm9vdGVyVGVtcGxhdGVSZWYgPSB0aGlzLmN1c3RvbUZvb3RlclRlbXBsYXRlLnRlbXBsYXRlUmVmXG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFJldHVybnMgYSBzdWJzY3JpcHRpb24gdG8gdGhlIG1hc3RlciBzZWxlY3RvciBjb250cm9sIHRoYXQgZWl0aGVyIHNlbGVjdHMgb3IgZGVzZWxlY3RzIGFsbCByb3cgY29udHJvbHMuXG4gICAqL1xuICBnZXQgZ3JvdXBWYWx1ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiB0aGlzLmdyb3VwU2VsZWN0b3IudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0TWFwID0gbmV3IE1hcChPYmplY3QuZW50cmllcyh0aGlzLnJvd1NlbGVjdG9yc1ZhbHVlKSlcbiAgICAgICAgc2VsZWN0TWFwLmZvckVhY2goKF8sIGtleSkgPT4gc2VsZWN0TWFwLnNldChrZXksIHZhbHVlKSlcbiAgICAgICAgY29uc3QgcGF0Y2hWYWx1ZSA9IG9iamVjdEZyb21FbnRyaWVzKHNlbGVjdE1hcClcbiAgICAgICAgdGhpcy5yb3dTZWxlY3RvcnMucGF0Y2hWYWx1ZShwYXRjaFZhbHVlKVxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBSZXR1cm5zIGEgc3Vic2NyaXB0aW9uIHRvIGFsbCBpbmRpdmlkdWFsIHJvdyBzZWxlY3RvcnMgYW5kIHVwZGF0ZSB0aGUgbWFzdGVyIHNlbGVjdG9yIGlmIGFsbCBhcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBnZXQgcm93VmFsdWVTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RvcnMudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLCAvLyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGV2ZW50cyBhbmQgdG8gd2FpdCBmb3IgYWxsIHN1YiBjb250cm9scyB0byB1cGRhdGVcbiAgICAgICAgbWFwKCh2YWw6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgLy8gZ2V0IGEgZmlsdGVyZWQgYXJyYXkgb2Yga2V5cyBmb3IgYWxsIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWRcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IE9iamVjdC5rZXlzKHZhbCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWxba2V5XSA9PT0gdHJ1ZSAmJiB0aGlzLnJvd1NlbGVjdG9ycy5nZXQoa2V5KT8uZW5hYmxlZFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBmaWx0ZXJlZCBrZXlzXG4gICAgICAgICAgcmV0dXJuIHBpY2soc2VsZWN0ZWQsIHZhbClcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHZhbHVlOiBvYmplY3QpID0+IHtcbiAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGtleXMgY29tcGFyZWQgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBrZXlzIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IG51bWJlck9mU2VsZWN0ZWQgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoXG4gICAgICAgICAgY29uc3QgYWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgbnVtYmVyT2ZTZWxlY3RlZCA+IDBcbiAgICAgICAgICAgICAgPyBudW1iZXJPZlNlbGVjdGVkID09PSBPYmplY3Qua2V5cyh0aGlzLnJvd1NlbGVjdG9yc1ZhbHVlKS5sZW5ndGhcbiAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFzdGVyIHNlbGVjdG9yIGNvbnRyb2xcbiAgICAgICAgICB0aGlzLmdyb3VwU2VsZWN0b3Iuc2V0VmFsdWUoYWxsU2VsZWN0ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgb2YgY3VycmVudGx5IHNlbGVjdGVkIGlkJ3NcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAgICAgLy8gYW5kIGVtaXQgdGhlIHVwZGF0ZWQgdmFsdWVcbiAgICAgICAgICB0aGlzLm5ndlJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWQpXG4gICAgICAgIH0sXG4gICAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBSZWdpc3RlcnMgb3IgZGlzYWJsZXMgcm93IGNvbnRyb2xzIGZvciBuZXcgb3IgcmVtb3ZlZCByb3dzLlxuICAgKi9cbiAgcmVnaXN0ZXJTZWxlY3RhYmxlUm93cyh0YWJsZURhdGE6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0YWJsZURhdGEpIHJldHVybiBmYWxzZVxuICAgIC8vIEFycmF5IGNvbnRhaW5pbmcgb25seSB0aGUgaWQncyBmb3IgZWFjaCByb3dcbiAgICBjb25zdCBkYXRhUm93SWRzOiBzdHJpbmdbXSA9IHRhYmxlRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4gZGF0YVt0aGlzLnJvd0lkXSlcblxuICAgIC8vIEFycmF5IGNvbnRhaW5pbmcgdGhlIGlkJ3MgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgY29udHJvbHNcbiAgICBjb25zdCBjdXJyZW50SWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMucm93U2VsZWN0b3JzVmFsdWUpXG5cbiAgICAvLyBBcnJheSBjb250YWluaW5nIGFsbCBpZHMgdGhhdCBsYWNrcyBhIGNvcnJlc3BvbmRpbmcgY29udHJvbCAoaS5lLiBuZXcgcm93cylcbiAgICBjb25zdCBuZXdJZHM6IHN0cmluZ1tdID0gZGF0YVJvd0lkcy5maWx0ZXIoXG4gICAgICAoaWQpID0+IGN1cnJlbnRJZHMuaW5kZXhPZihpZCkgPT09IC0xLFxuICAgIClcblxuICAgIC8vIEFycmF5IGNvbnRhaW5pbmcgYWxsIGlkcyB0aGF0IGhhcyBhIGNvbnRyb2wgYnV0IGlzIG5vIGxvbmdlciBpbiB0aGUgZGF0YSBzZXQgKGkuZS4gcmVtb3ZlZCByb3dzKVxuICAgIGNvbnN0IHJlbW92ZWRJZHM6IHN0cmluZ1tdID0gY3VycmVudElkcy5maWx0ZXIoXG4gICAgICAoaWQpID0+IGRhdGFSb3dJZHMuaW5kZXhPZihpZCkgPT09IC0xLFxuICAgIClcblxuICAgIC8vIFJlZ2lzdGVyIG5ldyBjb250cm9scyBmb3IgYWRkZWQgcm93c1xuICAgIGlmIChuZXdJZHMubGVuZ3RoKSB7XG4gICAgICBuZXdJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgY3RybCA9IHRoaXMucm93U2VsZWN0b3JzLnJlZ2lzdGVyQ29udHJvbChcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZhbHNlKSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoY3RybC5kaXNhYmxlZCkgY3RybC5lbmFibGUoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgYWxyZWFkeSByZWdpc3RlcmVkIGNvbnRyb2xzIHRvIGRpc2FibGVkIGZvciByZW1vdmVkIHJvd3NcbiAgICBpZiAocmVtb3ZlZElkcy5sZW5ndGgpXG4gICAgICByZW1vdmVkSWRzLmZvckVhY2goKGlkKSA9PiB0aGlzLnJvd1NlbGVjdG9ycy5nZXQoaWQpPy5kaXNhYmxlKCkpXG5cbiAgICByZXR1cm4gbmV3SWRzLmxlbmd0aCA+IDAgfHwgcmVtb3ZlZElkcy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFJldHVybnMgYWxsIGVuYWJsZWQgdmFsdWVzIHVubGVzcyBhbGwgcm93cyBhcmUgZGlzYWJsZWQuXG4gICAqL1xuICBnZXQgcm93U2VsZWN0b3JzVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RvcnMuZW5hYmxlZCA/IHRoaXMucm93U2VsZWN0b3JzLnZhbHVlIDoge31cbiAgfVxuXG4gIHRvZ2dsZVNvcnRPcmRlcldpdGhTcGFjZShldmVudDogYW55LCBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+KSB7XG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgdGhpcy50b2dnbGVTb3J0T3JkZXIoY29sdW1uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogU3dpdGNoZXMgc29ydGluZyBvcmRlciBiZXR3ZWVuIGFzY2VuZGluZyBhbmQgZGVzY2VuZGluZyBvcmRlciBmb3IgYSBjb2x1bW4uXG4gICAqIEBwYXJhbSBjb2x1bW4gdGhlIGNvbHVtbiB0byBzb3J0IHJvd3MgYWZ0ZXIuXG4gICAqL1xuICB0b2dnbGVTb3J0T3JkZXIoY29sdW1uOiBUYWJsZUNvbHVtbjxUPikge1xuICAgIC8vIGNoZWNrIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHNvcnRlZCBieSBhbm90aGVyIGNvbHVtbiB0aGFuIHRoZSBvbmUgcHJvdmlkZWRcbiAgICBjb25zdCBjdXJyZW50bHlPcmRlcmVkQnkgPSB0aGlzLnRhYmxlQ29sdW1ucz8uZmluZChcbiAgICAgIChlbCkgPT4gZWwgIT09IGNvbHVtbiAmJiBlbC5vcmRlciAhPT0gdW5kZWZpbmVkLFxuICAgIClcbiAgICBpZiAoY3VycmVudGx5T3JkZXJlZEJ5KSBkZWxldGUgY3VycmVudGx5T3JkZXJlZEJ5Lm9yZGVyXG4gICAgY29sdW1uLm9yZGVyID0gY29sdW1uLm9yZGVyID09PSAnZGVzYycgPyAnYXNjJyA6ICdkZXNjJ1xuICAgIHRoaXMuc29ydEl0ZW1zQnkoY29sdW1uKVxuICB9XG5cbiAgLyoqIElmIHNvcnRhYmxlLCByZW9yZGVycyB0aGUgdGFibGUgZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhcyBvcmRlcmluZyBhdHRyaWJ1dGUuICovXG4gIHNvcnRJdGVtc0J5KGNvbHVtbjogVGFibGVDb2x1bW48VD4pOiBUYWJsZVJvd1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbHVtbi5zb3J0YWJsZSkgcmV0dXJuXG4gICAgLy8gZW1pdCByZS1vcmRlciBldmVudFxuICAgIHRoaXMubmd2T3JkZXJCeS5lbWl0KHsgcHJvcGVydHk6IGNvbHVtbi5wcm9wZXJ0eSwgb3JkZXI6IGNvbHVtbi5vcmRlciB9KVxuICAgIC8vIGlmIGxvY2FsIHNvcnQgaXMgYWxsb3dlZCwgcmVvcmRlciBkYXRhXG4gICAgaWYgKCF0aGlzLmFsbG93TG9jYWxTb3J0IHx8ICF0aGlzLnRhYmxlRGF0YSkgcmV0dXJuXG4gICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLnNvcnQoXG4gICAgICBjb2x1bW4ub3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICA/IG9yZGVyQnlEZXNjZW5kaW5nKGNvbHVtbi5wcm9wZXJ0eSlcbiAgICAgICAgOiBvcmRlckJ5QXNjZW5kaW5nKGNvbHVtbi5wcm9wZXJ0eSksXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBFbWl0cyByb3cgZGF0YSBmb3Igd2hhdCByb3cgd2FzIGNsaWNrZWQgaWYgZGVmYXVsdEVtaXQgaXMgYWxsb3dlZC5cbiAgICovXG4gIHByb3BhZ2F0ZUl0ZW1DbGljayhpdGVtOiBhbnksIHByZXZlbnREZWZhdWx0RW1pdD86IGJvb2xlYW4pIHtcbiAgICBpZiAoIXByZXZlbnREZWZhdWx0RW1pdCkgdGhpcy5uZ3ZSb3dDbGljay5lbWl0KGl0ZW0pXG4gIH1cblxuICBnZXRBcmlhTGFiZWwoY29sdW1uOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc29ydE9yZGVyID1cbiAgICAgIGNvbHVtbi5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyB0aGlzLmFyaWFMYWJlbHNPcmRlckJ5Py5kZXNjXG4gICAgICAgIDogdGhpcy5hcmlhTGFiZWxzT3JkZXJCeT8uYXNjXG4gICAgaWYgKCFzb3J0T3JkZXIpIHJldHVybiAvLyBubyBhcmlhIGxhYmVscyBkZWZpbmVkXG4gICAgcmV0dXJuIGNvbHVtbi5hcmlhTGFiZWxTb3J0YWJsZT8ucmVwbGFjZSgne3tzb3J0T3JkZXJ9fScsIHNvcnRPcmRlcilcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNzb3J0YWJsZVRoVGVtcGxhdGUgbGV0LWNvbHVtbj5cbiAgPGJ1dHRvbiBjbGFzcz1cInNnLXRhYmxlLXNvcnRcIiAqdHJhbnNsb2NvPVwibGV0IHRcIj5cbiAgICA8bmctdGVtcGxhdGUgI3RoQnV0dG9uVGVtcGxhdGU+XG4gICAgICB7eyB0KGNvbHVtbi5sYWJlbCA/PyAnJykgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGN1c3RvbUhlYWRlclRlbXBsYXRlcy5nZXQoY29sdW1uLnByb3BlcnR5KSBhcyB0aFRlbXBsYXRlO1xuICAgICAgICBlbHNlIHRoQnV0dG9uVGVtcGxhdGVcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGhUZW1wbGF0ZSB8fCBudWxsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uIH1cIlxuICAgICAgPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vdFNvcnRhYmxlVGhUZW1wbGF0ZSBsZXQtY29sdW1uPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUaFRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKnRyYW5zbG9jbz1cImxldCB0XCI+XG4gICAgICB7eyB0KGNvbHVtbi5sYWJlbCA/PyAnJykgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBjdXN0b21IZWFkZXJUZW1wbGF0ZXMuZ2V0KGNvbHVtbi5wcm9wZXJ0eSkgYXMgdGhUZW1wbGF0ZTtcbiAgICAgIGVsc2UgZGVmYXVsdFRoVGVtcGxhdGVcbiAgICBcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRoVGVtcGxhdGUgfHwgbnVsbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGNvbHVtbiB9XCJcbiAgICA+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48dGFibGUgY2xhc3M9XCJnZHMtdGFibGVcIiAqdHJhbnNsb2NvPVwibGV0IHRcIj5cbiAgPCEtLSBUYWJsZSBoZWFkZXIgLS0+XG4gIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICA8IS0tIENoZWNrYm94IGNvbHVtbiBmb3IgaGVhZGVyIC0tPlxuICAgICAgPHRoICpuZ0lmPVwic2VsZWN0YWJsZVwiIGNsYXNzPVwiY29sdW1uX19jaGVja1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2RzLWZpZWxkLWNoZWNrYm94LXdyYXBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ3JvdXBTZWxlY3RvclwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbENoZWNrYm94VGhcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2NiX2hlYWRlcl9fJyArIGluaXRJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRob29rXT1cInRob29rXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxsYWJlbCBbYXR0ci5mb3JdPVwiJ2NiX2hlYWRlcl9fJyArIGluaXRJZFwiPjwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90aD5cblxuICAgICAgPCEtLSBPdGhlciBjb2x1bW5zIC0tPlxuICAgICAgPHRoXG4gICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGVDb2x1bW5zXCJcbiAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sdW1uLnZhbHVlVHlwZVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCJjb2x1bW4uc29ydGFibGVcIlxuICAgICAgICBbc29ydE9yZGVyXT1cImNvbHVtbi5vcmRlclwiXG4gICAgICAgIFt0aG9va109XCInY29sdW1uLWhlYWRlci0nICsgISFjb2x1bW4ucHJvcGVydHlcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlU29ydE9yZGVyKGNvbHVtbilcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGVTb3J0T3JkZXJXaXRoU3BhY2UoJGV2ZW50LCBjb2x1bW4pXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBcmlhTGFiZWwoY29sdW1uKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJjb2x1bW4ub3JkZXIgKyAnZW5kaW5nJ1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBzb3J0YWJsZVRoVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4sIGNvbHVtbjogY29sdW1uIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4uc29ydGFibGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBub3RTb3J0YWJsZVRoVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4sIGNvbHVtbjogY29sdW1uIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cblxuICA8IS0tIFRhYmxlIGJvZHkgLS0+XG4gIDx0Ym9keSBbZm9ybUdyb3VwXT1cInJvd1NlbGVjdG9yc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdGFibGVEYXRhOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8dHJcbiAgICAgICAgW2F0dHIuZGF0YS10aG9va109XCJpdGVtIHwgdHJUaG9vazogaSA6IHRyVGhvb2tGblwiXG4gICAgICAgIFthdHRyLmRhdGEtaGFzcm93c3Bhbl09XCJoYXNSb3dTcGFuKGl0ZW0pXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDaGVja2JveCBjb2x1bW4gZm9yIHJvdyAtLT5cbiAgICAgICAgPHRkICpuZ0lmPVwic2VsZWN0YWJsZVwiIGNsYXNzPVwiY29sdW1uX19jaGVja1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZHMtZmllbGQtY2hlY2tib3gtd3JhcFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICpuZ0lmPVwicm93U2VsZWN0b3JzLmdldChpdGVtW3Jvd0lkXSlcIlxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW1bcm93SWRdXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxDaGVja2JveFRyXCJcbiAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2NiX3Jvd19fJyArIGluaXRJZCArICdfJyArIGlcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRob29rXT1cIidyb3ctc2VsZWN0LScgKyBpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cIidjYl9yb3dfXycgKyBpbml0SWQgKyAnXycgKyBpXCI+PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cblxuICAgICAgICA8IS0tIE90aGVyIGNvbHVtbnMgLS0+XG4gICAgICAgIDx0ZFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGVDb2x1bW5zXCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvcGFnYXRlSXRlbUNsaWNrKGl0ZW0sIGNvbHVtbi5wcmV2ZW50RGVmYXVsdENsaWNrRXZlbnQpXCJcbiAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2x1bW4udmFsdWVUeXBlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2x1bW4ucHJvcGVydHldXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGN1c3RvbVJvd1RlbXBsYXRlcy5nZXQoY29sdW1uLnByb3BlcnR5KSBhcyB0ZFRlbXBsYXRlO1xuICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRUZFRlbXBsYXRlXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gQ2Fubm90IGluZmVyIHRkVGVtcGxhdGUgYXMgVGVtcGxhdGVSZWYgdGhlcmVmb3JlIG51bGwgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICB0ZFRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRkVGVtcGxhdGU+XG4gICAgICAgICAgICB7eyBpdGVtW2NvbHVtbi5wcm9wZXJ0eV0gfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cblxuICAgICAgPCEtLSBjdXN0b20gYXBwZW5kZWQgcm93cyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcHBlbmRlZFJvd3NUZW1wbGF0ZVJlZiBhcyB0clRlbXBsYXRlXCI+XG4gICAgICAgIDwhLS0gQ2Fubm90IGluZmVyIHRyVGVtcGxhdGUgYXMgVGVtcGxhdGVSZWYgdGhlcmVmb3JlIG51bGwgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRyVGVtcGxhdGUgfHwgbnVsbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90Ym9keT5cblxuICA8IS0tIFRhYmxlIGZvb3RlciAtLT5cbiAgPHRmb290ICpuZ0lmPVwiY3VzdG9tRm9vdGVyVGVtcGxhdGVSZWYgYXMgdHJUZW1wbGF0ZVwiPlxuICAgIDwhLS0gQ2Fubm90IGluZmVyIHRyVGVtcGxhdGUgYXMgVGVtcGxhdGVSZWYgdGhlcmVmb3JlIG51bGwgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRyVGVtcGxhdGUgfHwgbnVsbFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgPC90Zm9vdD5cbjwvdGFibGU+XG4iXX0=