@one-paragon/angular-utilities 1.2.12 → 1.2.13

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 (407) hide show
  1. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -0
  2. package/action-state/action-state-ui/action-state-ui.module.d.ts +7 -0
  3. package/{src/action-state/index.ts → action-state/index.d.ts} +4 -8
  4. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -0
  5. package/action-state/ngrx.d.ts +31 -0
  6. package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +24 -0
  7. package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +20 -0
  8. package/esm2022/action-state/index.mjs +8 -0
  9. package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -0
  10. package/esm2022/action-state/ngrx.mjs +47 -0
  11. package/esm2022/http-request-state/HttpRequestStateFactory.mjs +51 -0
  12. package/esm2022/http-request-state/HttpRequestStateStore.mjs +121 -0
  13. package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +30 -0
  14. package/esm2022/http-request-state/directives/http-error-state-directive.mjs +23 -0
  15. package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +23 -0
  16. package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +23 -0
  17. package/esm2022/http-request-state/directives/http-success-state-directive.mjs +29 -0
  18. package/esm2022/http-request-state/directives/index.mjs +6 -0
  19. package/esm2022/http-request-state/directives/request-state-directive.mjs +61 -0
  20. package/esm2022/http-request-state/helpers.mjs +22 -0
  21. package/esm2022/http-request-state/http-request-state.mjs +39 -0
  22. package/esm2022/http-request-state/http-state-module.mjs +40 -0
  23. package/esm2022/http-request-state/index.mjs +7 -0
  24. package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +4 -0
  25. package/esm2022/http-request-state/rxjs/getRequestorState.mjs +3 -0
  26. package/esm2022/http-request-state/rxjs/index.mjs +5 -0
  27. package/esm2022/http-request-state/rxjs/tapError.mjs +12 -0
  28. package/esm2022/http-request-state/rxjs/tapSuccess.mjs +12 -0
  29. package/esm2022/http-request-state/types.mjs +16 -0
  30. package/esm2022/ngrx/actionable-selector.mjs +71 -0
  31. package/esm2022/ngrx/index.mjs +2 -0
  32. package/esm2022/one-paragon-angular-utilities.mjs +5 -0
  33. package/esm2022/public-api.mjs +20 -0
  34. package/esm2022/rxjs/defaultShareReplay.mjs +7 -0
  35. package/esm2022/rxjs/index.mjs +6 -0
  36. package/esm2022/rxjs/mapError.mjs +8 -0
  37. package/esm2022/rxjs/rxjs-operators.mjs +92 -0
  38. package/esm2022/rxjs/subjectifier.mjs +15 -0
  39. package/esm2022/rxjs/subscriber.directive.mjs +50 -0
  40. package/esm2022/table-builder/classes/DefaultSettings.mjs +6 -0
  41. package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +23 -0
  42. package/esm2022/table-builder/classes/TableBuilderConfig.mjs +18 -0
  43. package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +45 -0
  44. package/esm2022/table-builder/classes/TableState.mjs +49 -0
  45. package/esm2022/table-builder/classes/data-store.mjs +15 -0
  46. package/esm2022/table-builder/classes/display-col.mjs +2 -0
  47. package/esm2022/table-builder/classes/filter-info.mjs +61 -0
  48. package/esm2022/table-builder/classes/table-builder-general-settings.mjs +112 -0
  49. package/esm2022/table-builder/classes/table-builder.mjs +77 -0
  50. package/esm2022/table-builder/classes/table-store.mjs +383 -0
  51. package/esm2022/table-builder/components/array-column.component.mjs +53 -0
  52. package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +134 -0
  53. package/esm2022/table-builder/components/column-builder/column-helpers.mjs +45 -0
  54. package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +29 -0
  55. package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +24 -0
  56. package/esm2022/table-builder/components/filter/filter.component.mjs +64 -0
  57. package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +102 -0
  58. package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +47 -0
  59. package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +301 -0
  60. package/esm2022/table-builder/components/generic-table/paginator.component.mjs +100 -0
  61. package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +21 -0
  62. package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +103 -0
  63. package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +65 -0
  64. package/esm2022/table-builder/components/index.mjs +10 -0
  65. package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +47 -0
  66. package/esm2022/table-builder/components/link-column.component.mjs +74 -0
  67. package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +29 -0
  68. package/esm2022/table-builder/components/profiles-menu/profiles-menu.component.mjs +64 -0
  69. package/esm2022/table-builder/components/scroll-strategy.mjs +60 -0
  70. package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +46 -0
  71. package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +82 -0
  72. package/esm2022/table-builder/components/table-container/table-container-imports.mjs +26 -0
  73. package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +135 -0
  74. package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +83 -0
  75. package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +71 -0
  76. package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +36 -0
  77. package/esm2022/table-builder/components/table-container/table-container.mjs +327 -0
  78. package/esm2022/table-builder/components/table-container/tableProps.mjs +8 -0
  79. package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +151 -0
  80. package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +44 -0
  81. package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +36 -0
  82. package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +25 -0
  83. package/esm2022/table-builder/directives/custom-cell-directive.mjs +73 -0
  84. package/esm2022/table-builder/directives/index.mjs +6 -0
  85. package/esm2022/table-builder/directives/multi-sort.directive.mjs +50 -0
  86. package/esm2022/table-builder/directives/resize-column.directive.mjs +87 -0
  87. package/esm2022/table-builder/directives/table-wrapper.directive.mjs +18 -0
  88. package/esm2022/table-builder/directives/tb-filter.directive.mjs +396 -0
  89. package/esm2022/table-builder/enums/filterTypes.mjs +29 -0
  90. package/esm2022/table-builder/functions/boolean-filter-function.mjs +10 -0
  91. package/esm2022/table-builder/functions/date-filter-function.mjs +58 -0
  92. package/esm2022/table-builder/functions/download-data.mjs +12 -0
  93. package/esm2022/table-builder/functions/null-filter-function.mjs +8 -0
  94. package/esm2022/table-builder/functions/number-filter-function.mjs +32 -0
  95. package/esm2022/table-builder/functions/sort-data-function.mjs +17 -0
  96. package/esm2022/table-builder/functions/string-filter-function.mjs +41 -0
  97. package/esm2022/table-builder/interfaces/ColumnInfo.mjs +2 -0
  98. package/esm2022/table-builder/interfaces/dictionary.mjs +2 -0
  99. package/esm2022/table-builder/interfaces/report-def.mjs +50 -0
  100. package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +154 -0
  101. package/esm2022/table-builder/pipes/column-total.pipe.mjs +22 -0
  102. package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +18 -0
  103. package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +43 -0
  104. package/esm2022/table-builder/pipes/key-display.mjs +18 -0
  105. package/esm2022/table-builder/services/export-to-csv.service.mjs +75 -0
  106. package/esm2022/table-builder/services/link-creator.service.mjs +50 -0
  107. package/esm2022/table-builder/services/table-template-service.mjs +60 -0
  108. package/esm2022/table-builder/services/transform-creator.mjs +100 -0
  109. package/esm2022/table-builder/table-builder.module.mjs +124 -0
  110. package/esm2022/utilities/array-helpers.mjs +14 -0
  111. package/esm2022/utilities/directives/auto-focus.directive.mjs +25 -0
  112. package/esm2022/utilities/directives/clickEmitterDirective.mjs +22 -0
  113. package/esm2022/utilities/directives/clickSubject.mjs +29 -0
  114. package/esm2022/utilities/directives/conditional-classes.directive.mjs +36 -0
  115. package/esm2022/utilities/directives/dialog-service.mjs +21 -0
  116. package/esm2022/utilities/directives/dialog.mjs +145 -0
  117. package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +59 -0
  118. package/esm2022/utilities/directives/prevent-enter.directive.mjs +20 -0
  119. package/esm2022/utilities/directives/stop-propagation.directive.mjs +26 -0
  120. package/esm2022/utilities/directives/styler.mjs +41 -0
  121. package/esm2022/utilities/directives/trim-whitespace.directive.mjs +28 -0
  122. package/esm2022/utilities/index.mjs +16 -0
  123. package/esm2022/utilities/module.mjs +90 -0
  124. package/esm2022/utilities/pipes/function.pipe.mjs +22 -0
  125. package/esm2022/utilities/pipes/phone.pipe.mjs +20 -0
  126. package/esm2022/utilities/pipes/space-case.pipes.mjs +28 -0
  127. package/fesm2022/one-paragon-angular-utilities.mjs +5670 -0
  128. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -0
  129. package/http-request-state/HttpRequestStateFactory.d.ts +17 -0
  130. package/http-request-state/HttpRequestStateStore.d.ts +54 -0
  131. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +14 -0
  132. package/http-request-state/directives/http-error-state-directive.d.ts +9 -0
  133. package/http-request-state/directives/http-inProgress-state-directive.d.ts +9 -0
  134. package/http-request-state/directives/http-notStarted-state-directive.d.ts +9 -0
  135. package/http-request-state/directives/http-success-state-directive.d.ts +16 -0
  136. package/{src/http-request-state/directives/index.ts → http-request-state/directives/index.d.ts} +5 -5
  137. package/http-request-state/directives/request-state-directive.d.ts +34 -0
  138. package/http-request-state/helpers.d.ts +9 -0
  139. package/http-request-state/http-request-state.d.ts +12 -0
  140. package/http-request-state/http-state-module.d.ts +11 -0
  141. package/{src/http-request-state/index.ts → http-request-state/index.d.ts} +6 -6
  142. package/http-request-state/rxjs/getRequestorBody.d.ts +3 -0
  143. package/http-request-state/rxjs/getRequestorState.d.ts +3 -0
  144. package/{src/http-request-state/rxjs/index.ts → http-request-state/rxjs/index.d.ts} +4 -4
  145. package/http-request-state/rxjs/tapError.d.ts +3 -0
  146. package/http-request-state/rxjs/tapSuccess.d.ts +3 -0
  147. package/http-request-state/types.d.ts +41 -0
  148. package/index.d.ts +5 -0
  149. package/ngrx/actionable-selector.d.ts +17 -0
  150. package/ngrx/index.d.ts +1 -0
  151. package/package.json +30 -16
  152. package/{src/public-api.ts → public-api.d.ts} +16 -35
  153. package/rxjs/defaultShareReplay.d.ts +2 -0
  154. package/{src/rxjs/index.ts → rxjs/index.d.ts} +5 -5
  155. package/rxjs/mapError.d.ts +2 -0
  156. package/rxjs/rxjs-operators.d.ts +13 -0
  157. package/rxjs/subjectifier.d.ts +8 -0
  158. package/rxjs/subscriber.directive.d.ts +14 -0
  159. package/table-builder/classes/DefaultSettings.d.ts +9 -0
  160. package/table-builder/classes/MatTableObservableDataSource.d.ts +9 -0
  161. package/table-builder/classes/TableBuilderConfig.d.ts +21 -0
  162. package/table-builder/classes/TableBuilderDataSource.d.ts +12 -0
  163. package/table-builder/classes/TableState.d.ts +67 -0
  164. package/table-builder/classes/data-store.d.ts +8 -0
  165. package/{src/table-builder/classes/display-col.ts → table-builder/classes/display-col.d.ts} +5 -5
  166. package/table-builder/classes/filter-info.d.ts +35 -0
  167. package/table-builder/classes/table-builder-general-settings.d.ts +78 -0
  168. package/table-builder/classes/table-builder.d.ts +18 -0
  169. package/table-builder/classes/table-store.d.ts +138 -0
  170. package/table-builder/components/array-column.component.d.ts +15 -0
  171. package/table-builder/components/column-builder/column-builder.component.d.ts +47 -0
  172. package/table-builder/components/column-builder/column-helpers.d.ts +36 -0
  173. package/table-builder/components/date-filter/date-filter.component.d.ts +37 -0
  174. package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +37 -0
  175. package/table-builder/components/filter/filter.component.d.ts +46 -0
  176. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +24 -0
  177. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +17 -0
  178. package/table-builder/components/generic-table/generic-table.component.d.ts +83 -0
  179. package/table-builder/components/generic-table/paginator.component.d.ts +30 -0
  180. package/table-builder/components/group-by-list/group-by-list.component.d.ts +7 -0
  181. package/table-builder/components/header-menu/header-menu.component.d.ts +51 -0
  182. package/table-builder/components/in-filter/in-filter.component.d.ts +20 -0
  183. package/{src/table-builder/components/index.ts → table-builder/components/index.d.ts} +9 -9
  184. package/table-builder/components/initialization-component/initialization-component.d.ts +13 -0
  185. package/table-builder/components/link-column.component.d.ts +25 -0
  186. package/table-builder/components/number-filter/number-filter.component.d.ts +39 -0
  187. package/table-builder/components/profiles-menu/profiles-menu.component.d.ts +32 -0
  188. package/table-builder/components/scroll-strategy.d.ts +22 -0
  189. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -0
  190. package/table-builder/components/sort-menu/sort-menu.component.d.ts +24 -0
  191. package/{src/table-builder/components/table-container/table-container-imports.ts → table-builder/components/table-container/table-container-imports.d.ts} +14 -32
  192. package/table-builder/components/table-container/table-container.d.ts +79 -0
  193. package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +6 -0
  194. package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +17 -0
  195. package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +17 -0
  196. package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +8 -0
  197. package/table-builder/components/table-container/tableProps.d.ts +12 -0
  198. package/table-builder/components/table-container/virtual-scroll-container.d.ts +35 -0
  199. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +15 -0
  200. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +12 -0
  201. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -0
  202. package/table-builder/directives/custom-cell-directive.d.ts +33 -0
  203. package/{src/table-builder/directives/index.ts → table-builder/directives/index.d.ts} +5 -6
  204. package/table-builder/directives/multi-sort.directive.d.ts +10 -0
  205. package/table-builder/directives/resize-column.directive.d.ts +43 -0
  206. package/table-builder/directives/table-wrapper.directive.d.ts +8 -0
  207. package/table-builder/directives/tb-filter.directive.d.ts +115 -0
  208. package/table-builder/enums/filterTypes.d.ts +36 -0
  209. package/table-builder/functions/boolean-filter-function.d.ts +3 -0
  210. package/table-builder/functions/date-filter-function.d.ts +4 -0
  211. package/table-builder/functions/download-data.d.ts +1 -0
  212. package/table-builder/functions/null-filter-function.d.ts +2 -0
  213. package/table-builder/functions/number-filter-function.d.ts +4 -0
  214. package/table-builder/functions/sort-data-function.d.ts +6 -0
  215. package/table-builder/functions/string-filter-function.d.ts +5 -0
  216. package/{src/table-builder/interfaces/ColumnInfo.ts → table-builder/interfaces/ColumnInfo.d.ts} +6 -7
  217. package/{src/table-builder/interfaces/dictionary.ts → table-builder/interfaces/dictionary.d.ts} +3 -3
  218. package/table-builder/interfaces/report-def.d.ts +147 -0
  219. package/table-builder/ngrx/tableBuilderStateStore.d.ts +70 -0
  220. package/table-builder/pipes/column-total.pipe.d.ts +8 -0
  221. package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -0
  222. package/table-builder/pipes/format-filter-value.pipe.d.ts +12 -0
  223. package/table-builder/pipes/key-display.d.ts +10 -0
  224. package/table-builder/services/export-to-csv.service.d.ts +14 -0
  225. package/table-builder/services/link-creator.service.d.ts +16 -0
  226. package/table-builder/services/table-template-service.d.ts +14 -0
  227. package/table-builder/services/transform-creator.d.ts +16 -0
  228. package/table-builder/table-builder.module.d.ts +21 -0
  229. package/utilities/array-helpers.d.ts +1 -0
  230. package/utilities/directives/auto-focus.directive.d.ts +9 -0
  231. package/utilities/directives/clickEmitterDirective.d.ts +7 -0
  232. package/utilities/directives/clickSubject.d.ts +9 -0
  233. package/utilities/directives/conditional-classes.directive.d.ts +13 -0
  234. package/utilities/directives/dialog-service.d.ts +10 -0
  235. package/utilities/directives/dialog.d.ts +44 -0
  236. package/utilities/directives/mat-toggle-group-directive.d.ts +21 -0
  237. package/utilities/directives/prevent-enter.directive.d.ts +6 -0
  238. package/utilities/directives/stop-propagation.directive.d.ts +7 -0
  239. package/utilities/directives/styler.d.ts +15 -0
  240. package/utilities/directives/trim-whitespace.directive.d.ts +7 -0
  241. package/{src/utilities/index.ts → utilities/index.d.ts} +15 -22
  242. package/utilities/module.d.ts +19 -0
  243. package/utilities/pipes/function.pipe.d.ts +7 -0
  244. package/utilities/pipes/phone.pipe.d.ts +7 -0
  245. package/utilities/pipes/space-case.pipes.d.ts +17 -0
  246. package/karma.conf.js +0 -44
  247. package/ng-package.json +0 -7
  248. package/src/action-state/action-state-spinner/action-state-spinner.component.css +0 -16
  249. package/src/action-state/action-state-spinner/action-state-spinner.component.html +0 -6
  250. package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +0 -25
  251. package/src/action-state/action-state-spinner/action-state-spinner.component.ts +0 -26
  252. package/src/action-state/action-state-ui/action-state-ui.module.ts +0 -13
  253. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +0 -15
  254. package/src/action-state/ngrx.ts +0 -69
  255. package/src/http-request-state/HttpRequestStateFactory.ts +0 -66
  256. package/src/http-request-state/HttpRequestStateStore.ts +0 -173
  257. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +0 -29
  258. package/src/http-request-state/directives/http-error-state-directive.ts +0 -21
  259. package/src/http-request-state/directives/http-inProgress-state-directive.ts +0 -19
  260. package/src/http-request-state/directives/http-notStarted-state-directive.ts +0 -19
  261. package/src/http-request-state/directives/http-success-state-directive.ts +0 -29
  262. package/src/http-request-state/directives/request-state-directive.spec.ts +0 -72
  263. package/src/http-request-state/directives/request-state-directive.ts +0 -78
  264. package/src/http-request-state/helpers.ts +0 -30
  265. package/src/http-request-state/http-request-state.ts +0 -69
  266. package/src/http-request-state/http-state-module.ts +0 -23
  267. package/src/http-request-state/observable.spec.ts +0 -43
  268. package/src/http-request-state/rxjs/getRequestorBody.ts +0 -10
  269. package/src/http-request-state/rxjs/getRequestorState.ts +0 -8
  270. package/src/http-request-state/rxjs/tapError.ts +0 -16
  271. package/src/http-request-state/rxjs/tapSuccess.ts +0 -16
  272. package/src/http-request-state/strategies.spec.ts +0 -42
  273. package/src/http-request-state/types.ts +0 -55
  274. package/src/ngrx/actionable-selector.ts +0 -95
  275. package/src/ngrx/index.ts +0 -1
  276. package/src/rxjs/defaultShareReplay.ts +0 -8
  277. package/src/rxjs/mapError.ts +0 -8
  278. package/src/rxjs/rxjs-operators.ts +0 -132
  279. package/src/rxjs/subjectifier.ts +0 -17
  280. package/src/rxjs/subscriber.directive.ts +0 -57
  281. package/src/specs/clickSubject.spec.ts +0 -95
  282. package/src/specs/dialog.spec.ts +0 -101
  283. package/src/specs/toggleGroupDirective.spec.ts +0 -229
  284. package/src/table-builder/classes/DefaultSettings.ts +0 -11
  285. package/src/table-builder/classes/MatTableObservableDataSource.ts +0 -23
  286. package/src/table-builder/classes/TableBuilderConfig.ts +0 -35
  287. package/src/table-builder/classes/TableBuilderDataSource.ts +0 -80
  288. package/src/table-builder/classes/TableState.ts +0 -96
  289. package/src/table-builder/classes/data-store.ts +0 -10
  290. package/src/table-builder/classes/filter-info.ts +0 -108
  291. package/src/table-builder/classes/table-builder-general-settings.ts +0 -129
  292. package/src/table-builder/classes/table-builder.ts +0 -94
  293. package/src/table-builder/classes/table-store.ts +0 -471
  294. package/src/table-builder/components/array-column.component.ts +0 -36
  295. package/src/table-builder/components/column-builder/column-builder.component.html +0 -61
  296. package/src/table-builder/components/column-builder/column-builder.component.scss +0 -43
  297. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +0 -49
  298. package/src/table-builder/components/column-builder/column-builder.component.ts +0 -135
  299. package/src/table-builder/components/column-builder/column-helpers.ts +0 -53
  300. package/src/table-builder/components/date-filter/date-filter.component.html +0 -23
  301. package/src/table-builder/components/date-filter/date-filter.component.ts +0 -24
  302. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +0 -9
  303. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +0 -22
  304. package/src/table-builder/components/filter/filter.component.html +0 -91
  305. package/src/table-builder/components/filter/filter.component.scss +0 -64
  306. package/src/table-builder/components/filter/filter.component.spec.ts +0 -87
  307. package/src/table-builder/components/filter/filter.component.ts +0 -60
  308. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +0 -93
  309. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +0 -55
  310. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +0 -57
  311. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +0 -59
  312. package/src/table-builder/components/generic-table/generic-table.component.html +0 -78
  313. package/src/table-builder/components/generic-table/generic-table.component.scss +0 -42
  314. package/src/table-builder/components/generic-table/generic-table.component.ts +0 -299
  315. package/src/table-builder/components/generic-table/paginator.component.ts +0 -99
  316. package/src/table-builder/components/group-by-list/group-by-list.component.css +0 -8
  317. package/src/table-builder/components/group-by-list/group-by-list.component.html +0 -12
  318. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +0 -23
  319. package/src/table-builder/components/group-by-list/group-by-list.component.ts +0 -21
  320. package/src/table-builder/components/header-menu/header-menu.component.html +0 -104
  321. package/src/table-builder/components/header-menu/header-menu.component.scss +0 -96
  322. package/src/table-builder/components/header-menu/header-menu.component.ts +0 -99
  323. package/src/table-builder/components/in-filter/in-filter.component.css +0 -3
  324. package/src/table-builder/components/in-filter/in-filter.component.html +0 -20
  325. package/src/table-builder/components/in-filter/in-filter.component.ts +0 -66
  326. package/src/table-builder/components/initialization-component/initialization-component.html +0 -29
  327. package/src/table-builder/components/initialization-component/initialization-component.ts +0 -24
  328. package/src/table-builder/components/link-column.component.ts +0 -47
  329. package/src/table-builder/components/number-filter/number-filter.component.css +0 -10
  330. package/src/table-builder/components/number-filter/number-filter.component.html +0 -19
  331. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +0 -30
  332. package/src/table-builder/components/number-filter/number-filter.component.ts +0 -25
  333. package/src/table-builder/components/profiles-menu/profiles-menu.component.html +0 -74
  334. package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +0 -98
  335. package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +0 -23
  336. package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +0 -65
  337. package/src/table-builder/components/scroll-strategy.ts +0 -76
  338. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +0 -66
  339. package/src/table-builder/components/sort-menu/sort-menu.component.html +0 -111
  340. package/src/table-builder/components/sort-menu/sort-menu.component.scss +0 -119
  341. package/src/table-builder/components/sort-menu/sort-menu.component.ts +0 -98
  342. package/src/table-builder/components/table-container/table-container.css +0 -54
  343. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +0 -141
  344. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +0 -106
  345. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +0 -86
  346. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +0 -45
  347. package/src/table-builder/components/table-container/table-container.html +0 -95
  348. package/src/table-builder/components/table-container/table-container.spec.ts +0 -154
  349. package/src/table-builder/components/table-container/table-container.ts +0 -356
  350. package/src/table-builder/components/table-container/tableProps.ts +0 -20
  351. package/src/table-builder/components/table-container/virtual-scroll-container.ts +0 -145
  352. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +0 -31
  353. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +0 -46
  354. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +0 -42
  355. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +0 -10
  356. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +0 -86
  357. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +0 -34
  358. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +0 -23
  359. package/src/table-builder/directives/custom-cell-directive.ts +0 -58
  360. package/src/table-builder/directives/multi-sort.directive.spec.ts +0 -124
  361. package/src/table-builder/directives/multi-sort.directive.ts +0 -51
  362. package/src/table-builder/directives/resize-column.directive.ts +0 -108
  363. package/src/table-builder/directives/table-wrapper.directive.ts +0 -14
  364. package/src/table-builder/directives/tb-filter.directive.ts +0 -396
  365. package/src/table-builder/enums/filterTypes.ts +0 -40
  366. package/src/table-builder/functions/boolean-filter-function.ts +0 -12
  367. package/src/table-builder/functions/date-filter-function.ts +0 -68
  368. package/src/table-builder/functions/download-data.ts +0 -11
  369. package/src/table-builder/functions/null-filter-function.ts +0 -9
  370. package/src/table-builder/functions/number-filter-function.ts +0 -41
  371. package/src/table-builder/functions/sort-data-function.ts +0 -23
  372. package/src/table-builder/functions/string-filter-function.ts +0 -51
  373. package/src/table-builder/interfaces/column-template.ts +0 -9
  374. package/src/table-builder/interfaces/report-def.ts +0 -155
  375. package/src/table-builder/ngrx/tableBuilderStateStore.ts +0 -199
  376. package/src/table-builder/pipes/column-total.pipe.ts +0 -17
  377. package/src/table-builder/pipes/format-filter-type.pipe.ts +0 -12
  378. package/src/table-builder/pipes/format-filter-value.pipe.ts +0 -42
  379. package/src/table-builder/pipes/key-display.ts +0 -16
  380. package/src/table-builder/services/export-to-csv.service.ts +0 -97
  381. package/src/table-builder/services/link-creator.service.ts +0 -67
  382. package/src/table-builder/services/table-template-service.ts +0 -59
  383. package/src/table-builder/services/transform-creator.ts +0 -95
  384. package/src/table-builder/specs/table-custom-filters.spec.ts +0 -262
  385. package/src/table-builder/styles/collapser.styles.scss +0 -16
  386. package/src/table-builder/table-builder.module.ts +0 -73
  387. package/src/test.ts +0 -17
  388. package/src/utilities/array-helpers.ts +0 -13
  389. package/src/utilities/directives/auto-focus.directive.ts +0 -21
  390. package/src/utilities/directives/clickEmitterDirective.ts +0 -16
  391. package/src/utilities/directives/clickSubject.ts +0 -20
  392. package/src/utilities/directives/conditional-classes.directive.ts +0 -36
  393. package/src/utilities/directives/dialog-service.ts +0 -19
  394. package/src/utilities/directives/dialog.ts +0 -144
  395. package/src/utilities/directives/mat-toggle-group-directive.ts +0 -61
  396. package/src/utilities/directives/prevent-enter.directive.ts +0 -13
  397. package/src/utilities/directives/stop-propagation.directive.ts +0 -20
  398. package/src/utilities/directives/styler.ts +0 -40
  399. package/src/utilities/directives/trim-whitespace.directive.ts +0 -21
  400. package/src/utilities/module.ts +0 -55
  401. package/src/utilities/pipes/function.pipe.ts +0 -16
  402. package/src/utilities/pipes/phone.pipe.ts +0 -15
  403. package/src/utilities/pipes/space-case.pipes.spec.ts +0 -47
  404. package/src/utilities/pipes/space-case.pipes.ts +0 -23
  405. package/tsconfig.lib.json +0 -19
  406. package/tsconfig.lib.prod.json +0 -10
  407. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,47 @@
1
+ import { Component, ChangeDetectionStrategy, inject, computed } from '@angular/core';
2
+ import { TableStore } from '../../classes/table-store';
3
+ import { DragDropModule } from '@angular/cdk/drag-drop';
4
+ import { AsyncPipe } from '@angular/common';
5
+ import { MatTooltipModule } from '@angular/material/tooltip';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { MatMenuModule } from '@angular/material/menu';
9
+ import { SpaceCasePipe, StopPropagationDirective } from '../../../utilities';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/material/tooltip";
12
+ import * as i2 from "@angular/material/icon";
13
+ import * as i3 from "@angular/material/button";
14
+ import * as i4 from "@angular/material/menu";
15
+ import * as i5 from "@angular/cdk/drag-drop";
16
+ export class GenColDisplayerComponent {
17
+ tableState = inject(TableStore);
18
+ $columns = computed(() => this.tableState.$orderedCodeVisibleMetaDatas().map(md => ({
19
+ key: md.key,
20
+ displayName: md.displayName,
21
+ isVisible: !this.tableState.$hiddenKeys().includes(md.key)
22
+ })));
23
+ reset(displayCols) {
24
+ displayCols.forEach(c => c.isVisible = true);
25
+ this.emit(displayCols);
26
+ }
27
+ drop(event) {
28
+ this.tableState.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
29
+ }
30
+ unset(displayCols) {
31
+ displayCols.forEach(c => c.isVisible = false);
32
+ this.emit(displayCols);
33
+ }
34
+ emit(displayCols) {
35
+ this.tableState.setHiddenColumns(displayCols.map(c => ({ key: c.key, visible: c.isVisible })));
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenColDisplayerComponent, isStandalone: true, selector: "tb-col-displayer", ngImport: i0, template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: SpaceCasePipe, name: "spaceCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, decorators: [{
41
+ type: Component,
42
+ args: [{ selector: 'tb-col-displayer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
43
+ AsyncPipe, MatTooltipModule, MatIconModule, MatButtonModule, MatMenuModule, StopPropagationDirective,
44
+ DragDropModule, SpaceCasePipe
45
+ ], template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"] }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy9nZW4tY29sLWRpc3BsYXllci9nZW4tY29sLWRpc3BsYXllci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbi1jb2wtZGlzcGxheWVyL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFjLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFhN0UsTUFBTSxPQUFPLHdCQUF3QjtJQUMzQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEdBQUcsQ0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ1gsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1FBQzNCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7S0FDM0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVMLEtBQUssQ0FBQyxXQUF5QjtRQUM3QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBNEI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLFdBQXlCO1FBQzdCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksQ0FBQyxXQUF5QjtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO3VHQXRCVSx3QkFBd0I7MkZBQXhCLHdCQUF3Qiw0RUN0QnJDLDhnRUFzREMseXVCRHBDYyxnQkFBZ0IsNFRBQUUsYUFBYSxtTEFBRSxlQUFlLDJJQUFFLGFBQWEsOHZCQUFFLHdCQUF3Qiw4REFDcEcsY0FBYyx3L0JBQUUsYUFBYTs7MkZBR3BCLHdCQUF3QjtrQkFYcEMsU0FBUzsrQkFDRSxrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHdCQUF3Qjt3QkFDcEcsY0FBYyxFQUFFLGFBQWE7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29sIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kaXNwbGF5LWNvbCc7XHJcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHtDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBTcGFjZUNhc2VQaXBlLCBTdG9wUHJvcGFnYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi1jb2wtZGlzcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQXN5bmNQaXBlLCBNYXRUb29sdGlwTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdE1lbnVNb2R1bGUsIFN0b3BQcm9wYWdhdGlvbkRpcmVjdGl2ZSxcclxuICAgIERyYWdEcm9wTW9kdWxlLCBTcGFjZUNhc2VQaXBlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuQ29sRGlzcGxheWVyQ29tcG9uZW50IHtcclxuICBwcml2YXRlIHRhYmxlU3RhdGUgPSBpbmplY3QoVGFibGVTdG9yZSk7XHJcbiAgJGNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRhYmxlU3RhdGUuJG9yZGVyZWRDb2RlVmlzaWJsZU1ldGFEYXRhcygpLm1hcCggbWQgPT4gKHtcclxuICAgIGtleTogbWQua2V5LFxyXG4gICAgZGlzcGxheU5hbWU6IG1kLmRpc3BsYXlOYW1lLFxyXG4gICAgaXNWaXNpYmxlOiAhdGhpcy50YWJsZVN0YXRlLiRoaWRkZW5LZXlzKCkuaW5jbHVkZXMobWQua2V5KVxyXG4gIH0pKSk7XHJcblxyXG4gIHJlc2V0KGRpc3BsYXlDb2xzOiBEaXNwbGF5Q29sW10pIHtcclxuICAgIGRpc3BsYXlDb2xzLmZvckVhY2goYyA9PiBjLmlzVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnRhYmxlU3RhdGUuc2V0VXNlckRlZmluZWRPcmRlcih7IG5ld09yZGVyOiBldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgdW5zZXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgZGlzcGxheUNvbHMuZm9yRWFjaChjID0+IGMuaXNWaXNpYmxlID0gZmFsc2UpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcblxyXG4gIGVtaXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgdGhpcy50YWJsZVN0YXRlLnNldEhpZGRlbkNvbHVtbnMoZGlzcGxheUNvbHMubWFwKCBjID0+ICh7a2V5OiBjLmtleSwgdmlzaWJsZTogYy5pc1Zpc2libGV9KSkpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYoJGNvbHVtbnMoKTsgYXMgZGlzcGxheUNvbHMpe1xyXG4gIDxzcGFuIG1hdFRvb2x0aXA9XCJTaG93L2hpZGUgY29sdW1uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cclxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPnZpc2liaWxpdHlfb2ZmPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvc3Bhbj5cclxuICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJteS1tYXQtbWVudVwiPlxyXG5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkNsb3NlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbHRlci1idXR0b25cIiBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gc3RvcC1wcm9wYWdhdGlvbj5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIlNob3cgYWxsIGNvbHVtbnNcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXQoZGlzcGxheUNvbHMpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+ZG9uZV9hbGw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBtYXRUb29sdGlwPVwiSGlkZSBhbGwgY29sdW1uc1wiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ1bnNldChkaXNwbGF5Q29scylcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCIgc3RvcC1wcm9wYWdhdGlvbiBbY2RrRHJvcExpc3RMb2NrQXhpc109XCIneSdcIj5cclxuICAgICAgQGZvciAoY29sIG9mIGRpc3BsYXlDb2xzOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICAgICAgPGJ1dHRvbiBbY2xhc3MuaXNIaWRkZW5dPVwiIWNvbC5pc1Zpc2libGVcIiBzdG9wLXByb3BhZ2F0aW9uIG1hdC1tZW51LWl0ZW0gY2RrRHJhZyBbY2RrRHJhZ0RhdGFdPVwiY29sXCI+XHJcbiAgICAgICAgPGRpdiAoY2xpY2spPVwiY29sLmlzVmlzaWJsZSA9ICFjb2wuaXNWaXNpYmxlOyBlbWl0KGRpc3BsYXlDb2xzKVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICAgIEBpZihjb2wuaXNWaXNpYmxlKXtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkhpZGUgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfYm94PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlNob3cgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+aW5kZXRlcm1pbmF0ZV9jaGVja19ib3g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPlxyXG4gICAgICAgICAgICB7e2NvbC5kaXNwbGF5TmFtZSB8fCAoY29sLmtleSB8IHNwYWNlQ2FzZSkgfX1cclxuICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9tYXQtbWVudT5cclxufSJdfQ==
@@ -0,0 +1,301 @@
1
+ import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ViewContainerRef, Injector, EventEmitter, computed, inject, input, viewChild, effect, untracked, signal } from '@angular/core';
2
+ import { MatFooterRowDef, MatHeaderRowDef, MatTable, MatTableModule } from '@angular/material/table';
3
+ import { SelectionModel } from '@angular/cdk/collections';
4
+ import { TableStore } from '../../classes/table-store';
5
+ import { map } from 'rxjs/operators';
6
+ import { ColumnBuilderComponent } from '../column-builder/column-builder.component';
7
+ import { FieldType } from '../../interfaces/report-def';
8
+ import { previousAndCurrent } from '../../../rxjs/rxjs-operators';
9
+ import { CdkDropList, DragDropModule } from '@angular/cdk/drag-drop';
10
+ import { FunctionPipe } from '../../../utilities';
11
+ import { MatCheckboxModule } from '@angular/material/checkbox';
12
+ import { MatButtonModule } from '@angular/material/button';
13
+ import { MatIconModule } from '@angular/material/icon';
14
+ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
15
+ import { MatTooltipModule } from '@angular/material/tooltip';
16
+ import { TransformCreator } from '../../services/transform-creator';
17
+ import { initIndexSymbol } from '../table-container/table-container.helpers/sort-state.helpers';
18
+ import { toObservable } from '@angular/core/rxjs-interop';
19
+ import { DataStore } from '../../classes/data-store';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/material/table";
22
+ import * as i2 from "@angular/cdk/drag-drop";
23
+ import * as i3 from "@angular/material/checkbox";
24
+ import * as i4 from "@angular/material/button";
25
+ import * as i5 from "@angular/material/icon";
26
+ export class GenericTableComponent {
27
+ state = inject(TableStore);
28
+ dataStore = inject(DataStore);
29
+ viewContainer = inject(ViewContainerRef);
30
+ transformCreator = inject(TransformCreator);
31
+ $headerRow = viewChild(MatHeaderRowDef);
32
+ $footerRow = viewChild(MatFooterRowDef);
33
+ $table = viewChild(MatTable);
34
+ drop(event) {
35
+ this.state.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
36
+ }
37
+ _trackBy;
38
+ set trackBy(trackBy) {
39
+ if (trackBy) {
40
+ this._trackBy = trackBy;
41
+ this.trackByFunction = (index, item) => item[trackBy];
42
+ }
43
+ this.setUpSelections(trackBy);
44
+ }
45
+ get trackBy() { return this._trackBy; }
46
+ $displayData = input.required({ alias: 'displayData' });
47
+ $displayDataLength = computed(() => this.$displayData()?.length || 0);
48
+ $hasFooterMeta = computed(() => this.state.$metaDataArray().some(md => !!md.additional?.footer));
49
+ $data = input.required({ alias: 'data' });
50
+ data$ = toObservable(this.$data);
51
+ rows;
52
+ columnBuilders;
53
+ $columnInfos = input.required({ alias: 'columnInfos' });
54
+ $hasCustomFooter = computed(() => this.$columnInfos()?.some(ci => !!ci.customCell?.columnDef?.footerCell));
55
+ dropList;
56
+ $footerRowStyle = computed(() => {
57
+ const hasData = !!this.$displayDataLength();
58
+ const metaFooter = this.$hasFooterMeta();
59
+ const customFooter = this.$hasCustomFooter();
60
+ const hasSelectionColumn = this.state.props().selectionColumn;
61
+ return customFooter || (hasData && (metaFooter || hasSelectionColumn)) ? 'regular-footer' : hasData ? 'no-footer' : 'small-footer';
62
+ });
63
+ $showFooterRow = computed(() => this.$footerRowStyle() !== 'no-footer');
64
+ currentColumns;
65
+ _injector = inject(Injector);
66
+ injector = Injector.create({
67
+ providers: [
68
+ { provide: MatTable, useFactory: () => this.$table() },
69
+ { provide: CdkDropList, useFactory: () => this.dropList },
70
+ ],
71
+ parent: this._injector
72
+ });
73
+ rowDefArr = [];
74
+ $hasSelectColumn = computed(() => this.state.selectSignal(state => state.props.selectionColumn)());
75
+ $hasIndexColumn = computed(() => this.state.selectSignal(state => state.props.indexColumn)());
76
+ myColumns = signal({});
77
+ $showHeader = computed(() => !this.state.tableSettings().hideColumnHeader);
78
+ offset$ = this.dataStore.select(s => s.virtualScrollOffset);
79
+ dataView;
80
+ constructor() {
81
+ this.setUpSelections();
82
+ effect(() => {
83
+ const columnInfos = this.$columnInfos() || [];
84
+ untracked(() => {
85
+ Object.entries(this.myColumns()).forEach(([key, value]) => {
86
+ const columnInfo = columnInfos.find(ci => ci.metaData.key === key);
87
+ if (!columnInfo || columnInfo.customCell !== value.customCell) {
88
+ delete this.myColumns()[key];
89
+ this.$table()?.removeColumnDef(value.columnDef);
90
+ }
91
+ });
92
+ columnInfos.forEach(ci => this.addMetaData(ci));
93
+ });
94
+ });
95
+ effect(() => {
96
+ const headerRow = this.$headerRow();
97
+ const showHeader = this.$showHeader();
98
+ const table = this.$table();
99
+ untracked(() => {
100
+ if (headerRow && showHeader && table)
101
+ table.addHeaderRowDef(headerRow);
102
+ else if (headerRow && table)
103
+ table.removeHeaderRowDef(headerRow);
104
+ });
105
+ });
106
+ effect(() => {
107
+ const footerRow = this.$footerRow();
108
+ const showFooter = this.$showFooterRow();
109
+ const table = this.$table();
110
+ untracked(() => {
111
+ if (footerRow && showFooter && table)
112
+ table.addFooterRowDef(footerRow);
113
+ else if (footerRow && table)
114
+ table.removeFooterRowDef(footerRow);
115
+ });
116
+ });
117
+ }
118
+ defaultTrackBy = (index, item) => item[initIndexSymbol];
119
+ trackByFunction = this.defaultTrackBy;
120
+ ngOnChanges(changes) {
121
+ if (changes.rows && this.rows && this.myColumns().length) {
122
+ this.initializeRowDefs([...this.rows]);
123
+ }
124
+ }
125
+ $keys = computed(() => {
126
+ const displayed = this.state.$orderedVisibleColumns();
127
+ const built = this.myColumns();
128
+ const keys = displayed.filter(d => !!built[d]);
129
+ if (this.$hasSelectColumn()) {
130
+ keys.unshift('select');
131
+ }
132
+ if (this.$hasIndexColumn()) {
133
+ keys.unshift('index');
134
+ }
135
+ return keys;
136
+ });
137
+ keys$ = toObservable(this.$keys);
138
+ ngOnInit() {
139
+ this.initializeRowDefs([...this.rows]);
140
+ this.state.on(this.keys$, keys => {
141
+ this.rowDefArr?.forEach(row => row.columns = keys);
142
+ });
143
+ this.state.on(this.selectableData$, (data) => {
144
+ if (this.selection.selected.length) {
145
+ const trackByFunction = this.trackBy ? (s) => data.every(d => d[this.trackBy] !== s[this.trackBy]) : s => !data.includes(s);
146
+ const removed = this.selection.selected.filter(trackByFunction);
147
+ this.selection.deselect(...removed);
148
+ }
149
+ });
150
+ }
151
+ $usePaginator = computed(() => this.state.tableSettings().usePaginator);
152
+ $useVirtualScroll = computed(() => this.state.$viewType().includes('virtual'));
153
+ $offsetIndex = computed(() => {
154
+ const virtualStart = this.dataStore.selectSignal(d => d.virtualEnds.start)();
155
+ const pageSize = this.state.$pageSize();
156
+ const currentPage = this.state.$currentPage();
157
+ if (this.$useVirtualScroll()) {
158
+ return virtualStart;
159
+ }
160
+ if (this.$usePaginator()) {
161
+ return pageSize * currentPage;
162
+ }
163
+ return 0;
164
+ });
165
+ isGroupHeader(_, row) {
166
+ return row.isGroupHeader;
167
+ }
168
+ setExpanded(key, groupKey, isExpanded) {
169
+ this.state.updateExpandedGroups({ key, isExpanded, groupKey });
170
+ }
171
+ addMetaData(column) {
172
+ const columnBuilder = this.myColumns()[column.metaData.key];
173
+ if (columnBuilder) {
174
+ columnBuilder.metaData = column.metaData;
175
+ }
176
+ else {
177
+ const component = this.viewContainer.createComponent(ColumnBuilderComponent, {
178
+ index: 0,
179
+ injector: this.injector
180
+ });
181
+ component.instance.customCell = column.customCell;
182
+ component.instance.metaData = column.metaData;
183
+ component.instance.data$ = this.data$;
184
+ this.myColumns.update(mc => ({ ...mc, [column.metaData.key]: component.instance }));
185
+ }
186
+ }
187
+ initializeRowDefs = (defs) => {
188
+ const table = this.$table();
189
+ if (!table)
190
+ return;
191
+ this.rowDefArr.forEach(r => table.removeRowDef(r));
192
+ this.rowDefArr = defs;
193
+ defs.forEach(r => {
194
+ r.columns = this.$keys().concat(Object.values(this.myColumns()).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
195
+ table.addRowDef(r);
196
+ });
197
+ };
198
+ selection;
199
+ selection$ = new EventEmitter();
200
+ masterToggleChecked$ = this.selection$.pipe(map(() => this.selection.hasValue() && this.isAllSelected()));
201
+ masterToggleIndeterminate$ = this.selection$.pipe(map(() => this.selection.hasValue() && !this.isAllSelected()));
202
+ setUpSelections(trackBy) {
203
+ this.selection = trackBy ? new SelectionModel(true, [], true, (a, b) => a[trackBy] === b[trackBy]) : new SelectionModel(true, []);
204
+ this.state.on(this.selection.changed, c => this.selection$.emit(c));
205
+ }
206
+ $selectableData = computed(() => {
207
+ if (this.state.$viewType() === 'virtual paginator' || this.state.$viewType() === 'paginator') {
208
+ const previousPageRecords = this.state.$currentPage() * this.state.$pageSize();
209
+ return this.$data().slice(previousPageRecords, previousPageRecords + this.state.$pageSize());
210
+ }
211
+ else if (this.state.$viewType() === 'all' || this.state.$viewType() === 'virtual all') {
212
+ return this.$data();
213
+ }
214
+ return [];
215
+ });
216
+ selectableData$ = toObservable(this.$selectableData);
217
+ isAllSelected() {
218
+ const numSelected = this.selection.selected.length;
219
+ const numRows = this.$selectableData()?.length || 0;
220
+ return numSelected === numRows;
221
+ }
222
+ /** Selects all rows if they are not all selected; otherwise clear selection. */
223
+ masterToggle() {
224
+ if (this.isAllSelected()) {
225
+ this.selection.clear();
226
+ }
227
+ else {
228
+ this.selection.select(...this.$selectableData());
229
+ }
230
+ }
231
+ tableWidth = this.state.getUserDefinedTableSize$.pipe(previousAndCurrent(0), map(([previousUserDefinedWidth, currentUserDefinedWidth]) => {
232
+ if (currentUserDefinedWidth) {
233
+ return ({ width: `${currentUserDefinedWidth}px` });
234
+ }
235
+ if (wasReset()) {
236
+ return ({ width: 'initial' });
237
+ }
238
+ return ({});
239
+ function wasReset() {
240
+ return (previousUserDefinedWidth ?? 0) >= 0 && currentUserDefinedWidth == null;
241
+ }
242
+ }));
243
+ getTransform = (key, val) => {
244
+ if (val == undefined || val === 'null')
245
+ return '';
246
+ try {
247
+ return this.transformCreator.createTransformer(this.myColumns[key].metaData, true)({ [key]: val });
248
+ }
249
+ catch (error) {
250
+ return val;
251
+ }
252
+ };
253
+ $rowHeight = this.state.selectSignal(s => {
254
+ if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceRowHeight) {
255
+ const height = s.notPersistedTableSettings.useVirtualScroll.rowHeight;
256
+ return height + 'px';
257
+ }
258
+ if (typeof s.notPersistedTableSettings.rowHeight === 'number') {
259
+ return s.notPersistedTableSettings.rowHeight + 'px';
260
+ }
261
+ return s.notPersistedTableSettings.rowHeight;
262
+ });
263
+ $headerHeight = this.state.selectSignal(s => {
264
+ if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceHeaderHeight) {
265
+ const height = s.notPersistedTableSettings.useVirtualScroll.headerHeight;
266
+ return height + 'px';
267
+ }
268
+ if (typeof s.notPersistedTableSettings.headerHeight === 'number') {
269
+ return s.notPersistedTableSettings.headerHeight + 'px';
270
+ }
271
+ return s.notPersistedTableSettings.headerHeight;
272
+ });
273
+ $groupHeaderHeight = this.state.selectSignal(s => {
274
+ if (s.notPersistedTableSettings.groupHeaderHeight) {
275
+ return s.notPersistedTableSettings.groupHeaderHeight + 'px';
276
+ }
277
+ return this.$rowHeight();
278
+ });
279
+ $stickyFooter = computed(() => this.state.props().stickyFooter || this.state.$isVirtual());
280
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
281
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
282
+ }
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, decorators: [{
284
+ type: Component,
285
+ args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
286
+ MatTableModule, DragDropModule, MatCheckboxModule, MatButtonModule, MatIconModule, NgTemplateOutlet,
287
+ MatTooltipModule, AsyncPipe, FunctionPipe,
288
+ ], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"] }]
289
+ }], ctorParameters: () => [], propDecorators: { trackBy: [{
290
+ type: Input
291
+ }], rows: [{
292
+ type: Input
293
+ }], columnBuilders: [{
294
+ type: Input
295
+ }], dropList: [{
296
+ type: ViewChild,
297
+ args: [CdkDropList, { static: true }]
298
+ }], selection$: [{
299
+ type: Output
300
+ }] } });
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEgsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVsRSxPQUFPLEVBQWUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdC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aUJBQWlCLG9ZQUFFLGVBQWUsMklBQUUsYUFBYSxvTEFBRSxnQkFBZ0IsbUpBQ25HLGdCQUFnQiwwQkFBRSxTQUFTLHlDQUFFLFlBQVk7OzJGQUdoQyxxQkFBcUI7a0JBWGpDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0I7d0JBQ25HLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxZQUFZO3FCQUMxQzt3REFnQlksT0FBTztzQkFBbkIsS0FBSztnQkFhRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXNKOUIsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDb250YWluZXJSZWYsIEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCB2aWV3Q2hpbGQsIGVmZmVjdCwgdW50cmFja2VkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9vdGVyUm93RGVmLCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvd0RlZiwgTWF0VGFibGUsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1zdG9yZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1kZWYnO1xyXG5pbXBvcnQgeyBwcmV2aW91c0FuZEN1cnJlbnQgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgRnVuY3Rpb25QaXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1DcmVhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNmb3JtLWNyZWF0b3InO1xyXG5pbXBvcnQgeyBpbml0SW5kZXhTeW1ib2wgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgVmlydHVhbFNjcm9sbE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXItZ2VuZXJhbC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgRGF0YVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kYXRhLXN0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGItZ2VuZXJpYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFRhYmxlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsIEFzeW5jUGlwZSwgRnVuY3Rpb25QaXBlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByb3RlY3RlZCBzdGF0ZSA9IGluamVjdChUYWJsZVN0b3JlKTtcclxuICBwcml2YXRlIGRhdGFTdG9yZSA9IGluamVjdChEYXRhU3RvcmUpO1xyXG4gIHByaXZhdGUgdmlld0NvbnRhaW5lciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcclxuICBwcml2YXRlIHRyYW5zZm9ybUNyZWF0b3IgPSBpbmplY3QoVHJhbnNmb3JtQ3JlYXRvcik7XHJcblxyXG4gICRoZWFkZXJSb3cgPSB2aWV3Q2hpbGQoTWF0SGVhZGVyUm93RGVmKTtcclxuICAkZm9vdGVyUm93ID0gdmlld0NoaWxkKE1hdEZvb3RlclJvd0RlZik7XHJcbiAgJHRhYmxlID0gdmlld0NoaWxkKE1hdFRhYmxlKTtcclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFVzZXJEZWZpbmVkT3JkZXIoeyBuZXdPcmRlcjpldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgX3RyYWNrQnk/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2V0IHRyYWNrQnkodHJhY2tCeTogc3RyaW5nKXtcclxuICAgIGlmKHRyYWNrQnkpe1xyXG4gICAgICB0aGlzLl90cmFja0J5ID0gdHJhY2tCeTtcclxuICAgICAgdGhpcy50cmFja0J5RnVuY3Rpb24gPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1bdHJhY2tCeV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucyh0cmFja0J5KTtcclxuICB9XHJcbiAgZ2V0IHRyYWNrQnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnkgfVxyXG4gICRkaXNwbGF5RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGlzcGxheURhdGEnIH0pO1xyXG4gICRkaXNwbGF5RGF0YUxlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGRpc3BsYXlEYXRhKCk/Lmxlbmd0aCB8fCAwKTtcclxuICAkaGFzRm9vdGVyTWV0YSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuJG1ldGFEYXRhQXJyYXkoKS5zb21lKG1kID0+ICEhbWQuYWRkaXRpb25hbD8uZm9vdGVyKSlcclxuICAkZGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGF0YScgfSlcclxuICBkYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRkYXRhKTtcclxuICBASW5wdXQoKSByb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcclxuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcclxuICAkY29sdW1uSW5mb3MgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5JbmZvW10+KHsgYWxpYXM6ICdjb2x1bW5JbmZvcycgfSk7XHJcbiAgJGhhc0N1c3RvbUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGNvbHVtbkluZm9zKCk/LnNvbWUoY2kgPT4gISFjaS5jdXN0b21DZWxsPy5jb2x1bW5EZWY/LmZvb3RlckNlbGwpKVxyXG4gIEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIGRyb3BMaXN0ITogQ2RrRHJvcExpc3Q7XHJcbiAgJGZvb3RlclJvd1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgaGFzRGF0YSA9ICEhdGhpcy4kZGlzcGxheURhdGFMZW5ndGgoKTtcclxuICAgIGNvbnN0IG1ldGFGb290ZXIgPSB0aGlzLiRoYXNGb290ZXJNZXRhKCk7XHJcbiAgICBjb25zdCBjdXN0b21Gb290ZXIgPSB0aGlzLiRoYXNDdXN0b21Gb290ZXIoKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc3RhdGUucHJvcHMoKS5zZWxlY3Rpb25Db2x1bW47XHJcbiAgICByZXR1cm4gY3VzdG9tRm9vdGVyIHx8IChoYXNEYXRhICYmIChtZXRhRm9vdGVyIHx8IGhhc1NlbGVjdGlvbkNvbHVtbikpID8gJ3JlZ3VsYXItZm9vdGVyJyA6IGhhc0RhdGEgPyAnbm8tZm9vdGVyJyA6ICdzbWFsbC1mb290ZXInO1xyXG4gIH0pO1xyXG4gICRzaG93Rm9vdGVyUm93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kZm9vdGVyUm93U3R5bGUoKSAhPT0gJ25vLWZvb3RlcicpO1xyXG4gIGN1cnJlbnRDb2x1bW5zITogc3RyaW5nW107XHJcbiAgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAge3Byb3ZpZGU6IE1hdFRhYmxlLCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuJHRhYmxlKCkgfSxcclxuICAgICAge3Byb3ZpZGU6IENka0Ryb3BMaXN0LCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuZHJvcExpc3QgfSxcclxuICAgIF0sXHJcbiAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXHJcbiAgfSk7XHJcbiAgcm93RGVmQXJyIDpNYXRSb3dEZWY8YW55PltdID0gW107XHJcbiAgJGhhc1NlbGVjdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnByb3BzLnNlbGVjdGlvbkNvbHVtbikoKSk7XHJcbiAgJGhhc0luZGV4Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUucHJvcHMuaW5kZXhDb2x1bW4pKCkpO1xyXG4gIG15Q29sdW1ucyA9IHNpZ25hbDxEaWN0aW9uYXJ5PENvbHVtbkJ1aWxkZXJDb21wb25lbnQ+Pih7fSk7XHJcbiAgJHNob3dIZWFkZXIgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkuaGlkZUNvbHVtbkhlYWRlcilcclxuICBvZmZzZXQkID0gdGhpcy5kYXRhU3RvcmUuc2VsZWN0KCBzID0+IHMudmlydHVhbFNjcm9sbE9mZnNldCApO1xyXG4gIGRhdGFWaWV3ITogT2JzZXJ2YWJsZTxhbnlbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zZXRVcFNlbGVjdGlvbnMoKTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkluZm9zID0gdGhpcy4kY29sdW1uSW5mb3MoKSB8fCBbXTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm15Q29sdW1ucygpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZm8gPSBjb2x1bW5JbmZvcy5maW5kKGNpID0+IGNpLm1ldGFEYXRhLmtleSA9PT0ga2V5KTtcclxuICAgICAgICAgIGlmKCFjb2x1bW5JbmZvIHx8IGNvbHVtbkluZm8uY3VzdG9tQ2VsbCAhPT0gdmFsdWUuY3VzdG9tQ2VsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5teUNvbHVtbnMoKVtrZXldO1xyXG4gICAgICAgICAgICB0aGlzLiR0YWJsZSgpPy5yZW1vdmVDb2x1bW5EZWYodmFsdWUuY29sdW1uRGVmKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbHVtbkluZm9zLmZvckVhY2goY2kgPT4gdGhpcy5hZGRNZXRhRGF0YShjaSkpXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuJGhlYWRlclJvdygpO1xyXG4gICAgICBjb25zdCBzaG93SGVhZGVyID0gdGhpcy4kc2hvd0hlYWRlcigpO1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYoaGVhZGVyUm93ICYmIHNob3dIZWFkZXIgJiYgdGFibGUpIHRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3cpO1xyXG4gICAgICAgIGVsc2UgaWYoaGVhZGVyUm93ICYmIHRhYmxlKSB0YWJsZS5yZW1vdmVIZWFkZXJSb3dEZWYoaGVhZGVyUm93KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9vdGVyUm93ID0gdGhpcy4kZm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHNob3dGb290ZXIgPSB0aGlzLiRzaG93Rm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kdGFibGUoKTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBpZihmb290ZXJSb3cgJiYgc2hvd0Zvb3RlciAmJiB0YWJsZSkgdGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvdyk7XHJcbiAgICAgICAgZWxzZSBpZihmb290ZXJSb3cgJiYgdGFibGUpIHRhYmxlLnJlbW92ZUZvb3RlclJvd0RlZihmb290ZXJSb3cpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0VHJhY2tCeSA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbVtpbml0SW5kZXhTeW1ib2xdO1xyXG4gIHRyYWNrQnlGdW5jdGlvbiA9IHRoaXMuZGVmYXVsdFRyYWNrQnk7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucm93cyAmJiB0aGlzLnJvd3MgJiYgdGhpcy5teUNvbHVtbnMoKS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICRrZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5zdGF0ZS4kb3JkZXJlZFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBidWlsdCA9IHRoaXMubXlDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBrZXlzID0gZGlzcGxheWVkLmZpbHRlcihkID0+ICEhYnVpbHRbZF0pO1xyXG4gICAgaWYodGhpcy4kaGFzU2VsZWN0Q29sdW1uKCkpe1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kaGFzSW5kZXhDb2x1bW4oKSkge1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ2luZGV4Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9KVxyXG4gIGtleXMkID0gdG9PYnNlcnZhYmxlKHRoaXMuJGtleXMpO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLmtleXMkLCBrZXlzID0+IHtcclxuICAgICAgdGhpcy5yb3dEZWZBcnI/LmZvckVhY2gocm93ID0+IHJvdy5jb2x1bW5zID0ga2V5cylcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3RhYmxlRGF0YSQsIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCl7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeUZ1bmN0aW9uID0gdGhpcy50cmFja0J5ID8gKHMpID0+IGRhdGEuZXZlcnkoZCA9PiAgZFt0aGlzLnRyYWNrQnkhXSAhPT0gc1t0aGlzLnRyYWNrQnkhXSkgOiBzID0+ICFkYXRhLmluY2x1ZGVzKHMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIodHJhY2tCeUZ1bmN0aW9uKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yZW1vdmVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgJHVzZVBhZ2luYXRvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvcik7XHJcbiAgJHVzZVZpcnR1YWxTY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpLmluY2x1ZGVzKCd2aXJ0dWFsJykpO1xyXG4gICRvZmZzZXRJbmRleCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHZpcnR1YWxTdGFydCA9IHRoaXMuZGF0YVN0b3JlLnNlbGVjdFNpZ25hbChkID0+IGQudmlydHVhbEVuZHMuc3RhcnQpKCk7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuc3RhdGUuJHBhZ2VTaXplKCk7XHJcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuJGN1cnJlbnRQYWdlKCk7XHJcbiAgICBpZih0aGlzLiR1c2VWaXJ0dWFsU2Nyb2xsKCkpe1xyXG4gICAgICByZXR1cm4gdmlydHVhbFN0YXJ0O1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kdXNlUGFnaW5hdG9yKCkpe1xyXG4gICAgICByZXR1cm4gcGFnZVNpemUgKiBjdXJyZW50UGFnZTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH0pO1xyXG5cclxuXHJcbiAgaXNHcm91cEhlYWRlcihfOiBudW1iZXIsIHJvdzogeyBpc0dyb3VwSGVhZGVyOiBib29sZWFuIH0pIHtcclxuICAgIHJldHVybiByb3cuaXNHcm91cEhlYWRlcjtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkKGtleTogc3RyaW5nLCBncm91cEtleTogc3RyaW5nLCBpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUV4cGFuZGVkR3JvdXBzKHsga2V5ICwgaXNFeHBhbmRlZCwgZ3JvdXBLZXkgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNZXRhRGF0YShjb2x1bW46IENvbHVtbkluZm8pIHtcclxuICAgIGNvbnN0IGNvbHVtbkJ1aWxkZXIgPSB0aGlzLm15Q29sdW1ucygpW2NvbHVtbi5tZXRhRGF0YS5rZXldO1xyXG4gICAgaWYoY29sdW1uQnVpbGRlcikge1xyXG4gICAgICBjb2x1bW5CdWlsZGVyLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChDb2x1bW5CdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5jdXN0b21DZWxsID0gY29sdW1uLmN1c3RvbUNlbGw7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmRhdGEkID0gdGhpcy5kYXRhJDtcclxuICAgICAgdGhpcy5teUNvbHVtbnMudXBkYXRlKG1jID0+ICh7Li4ubWMsIFtjb2x1bW4ubWV0YURhdGEua2V5XTogY29tcG9uZW50Lmluc3RhbmNlfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVJvd0RlZnMgPSAoZGVmczpNYXRSb3dEZWY8YW55PltdKT0+e1xyXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLiR0YWJsZSgpO1xyXG4gICAgaWYoIXRhYmxlKSByZXR1cm47XHJcbiAgICB0aGlzLnJvd0RlZkFyci5mb3JFYWNoKHI9PiB0YWJsZS5yZW1vdmVSb3dEZWYocikpO1xyXG4gICAgdGhpcy5yb3dEZWZBcnIgPSBkZWZzO1xyXG4gICAgZGVmcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICByLmNvbHVtbnMgPSB0aGlzLiRrZXlzKCkuY29uY2F0KE9iamVjdC52YWx1ZXModGhpcy5teUNvbHVtbnMoKSkuZmlsdGVyKGMgPT4gYy5tZXRhRGF0YS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pLm1hcChjID0+IGMubWV0YURhdGEua2V5KSk7XHJcbiAgICAgIHRhYmxlLmFkZFJvd0RlZihyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24hIDogU2VsZWN0aW9uTW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPGFueT4+KCk7XHJcbiAgbWFzdGVyVG9nZ2xlQ2hlY2tlZCQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBtYXN0ZXJUb2dnbGVJbmRldGVybWluYXRlJCA9IHRoaXMuc2VsZWN0aW9uJC5waXBlKG1hcCgoKT0+dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBzZXRVcFNlbGVjdGlvbnModHJhY2tCeT86IHN0cmluZyl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRyYWNrQnkgPyBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSwgdHJ1ZSwgKGEsIGIpID0+IGFbdHJhY2tCeV0gPT09IGJbdHJhY2tCeV0pIDogbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLCBjID0+IHRoaXMuc2VsZWN0aW9uJC5lbWl0KGMpKTtcclxuICB9XHJcbiAgJHNlbGVjdGFibGVEYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kdmlld1R5cGUoKSA9PT0gJ3ZpcnR1YWwgcGFnaW5hdG9yJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAncGFnaW5hdG9yJyl7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZVJlY29yZHMgPSB0aGlzLnN0YXRlLiRjdXJyZW50UGFnZSgpICogdGhpcy5zdGF0ZS4kcGFnZVNpemUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKS5zbGljZShwcmV2aW91c1BhZ2VSZWNvcmRzLCBwcmV2aW91c1BhZ2VSZWNvcmRzICsgdGhpcy5zdGF0ZS4kcGFnZVNpemUoKSk7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAnYWxsJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAndmlydHVhbCBhbGwnKXtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9KTtcclxuICBzZWxlY3RhYmxlRGF0YSQgPSB0b09ic2VydmFibGUodGhpcy4kc2VsZWN0YWJsZURhdGEpO1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLiRzZWxlY3RhYmxlRGF0YSgpPy5sZW5ndGggfHwgMDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgaWYodGhpcy5pc0FsbFNlbGVjdGVkKCkpe1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy4kc2VsZWN0YWJsZURhdGEoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcclxuICAgIHByZXZpb3VzQW5kQ3VycmVudDxudW1iZXIgfCB1bmRlZmluZWQ+KDApLFxyXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcclxuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcclxuICAgICAgICByZXR1cm4gKHt3aWR0aDpgJHtjdXJyZW50VXNlckRlZmluZWRXaWR0aH1weGB9KTtcclxuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoe30pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gd2FzUmVzZXQoKXtcclxuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBnZXRUcmFuc2Zvcm0gPSAoa2V5OiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZih2YWwgPT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJ251bGwnKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1DcmVhdG9yLmNyZWF0ZVRyYW5zZm9ybWVyKHRoaXMubXlDb2x1bW5zW2tleV0ubWV0YURhdGEsIHRydWUpKHsgW2tleV06IHZhbH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICRyb3dIZWlnaHQgPSB0aGlzLnN0YXRlLnNlbGVjdFNpZ25hbChzID0+IHtcclxuICAgICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZVJvd0hlaWdodCl7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEucm93SGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiBoZWlnaHQgKyAncHgnIDtcclxuICAgICAgfVxyXG4gICAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodDtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgJGhlYWRlckhlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZUhlYWRlckhlaWdodCl7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IChzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucykhLmhlYWRlckhlaWdodDtcclxuICAgICAgcmV0dXJuIGhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICB9KTtcclxuXHJcbiAgJGdyb3VwSGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XHJcbiAgICBpZihzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuZ3JvdXBIZWFkZXJIZWlnaHQpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiRyb3dIZWlnaHQoKTtcclxuICB9KTtcclxuXHJcbiAgJHN0aWNreUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUucHJvcHMoKS5zdGlja3lGb290ZXIgfHwgdGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkpO1xyXG59XHJcbiIsIjxtYXQtdGFibGVcclxuICBjZGtEcm9wTGlzdFxyXG4gIGNka0Ryb3BMaXN0TG9ja0F4aXM9J3gnXHJcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxyXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcclxuICBjbGFzcz1cInRhYmxlLWRyYWctbGlzdFwiXHJcbiAgW2NsYXNzXT1cIigkZm9vdGVyUm93U3R5bGUoKSlcIlxyXG4gICN0YWJsZVxyXG4gIFtkYXRhU291cmNlXT1cInN0YXRlLnByb3BzKCkuZGF0YVNvdXJjZSFcIlxyXG4gIFt0cmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXHJcbiAgW3N0eWxlXT1cInRhYmxlV2lkdGggfCBhc3luYyBcIlxyXG4+XHJcblxyXG4gIDwhLS0gc2VsZWN0IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG5cclxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgfCBhc3luY1wiPlxyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiLz5cclxuICAgIDwvbWF0LWNlbGw+XHJcblxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCB9fVxyXG4gICAgPC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICA8IS0tIGluZGV4IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XHJcbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPiNcclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPlxyXG4gICAgICB7eyAxICsgaSArICRvZmZzZXRJbmRleCgpIH19XHJcbiAgICA8L21hdC1jZWxsPlxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cImluZGV4LWNvbHVtblwiPjwvbWF0LWZvb3Rlci1jZWxsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEdyb3VwaW5nIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgQGxldCBleHBhbmRlZCA9IChzdGF0ZS5nZXRJc0V4cGFuZGVkIHwgZnVuYyA6IHJvdy5rZXkgOiByb3cuZ3JvdXBOYW1lICk7XHJcbiAgICAgIDxkaXYgW3N0eWxlLnBhZGRpbmdMZWZ0XT1cInJvdy5wYWRkaW5nICsgJ3B4ICFpbXBvcnRhbnQnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldEV4cGFuZGVkKHJvdy5rZXksIHJvdy5ncm91cE5hbWUsICFleHBhbmRlZCgpKTtcIj5cclxuICAgICAgICAgIEBpZiAoIWV4cGFuZGVkKCkpIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNmb3JtIHwgZnVuYyA6IHJvdy5rZXkgOiAgcm93Lmdyb3VwSGVhZGVyRGlzcGxheSB9fSAoe3sgcm93Lmxlbmd0aCB9fSlcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWdyb3c6IDFcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdGUucHJvcHMoKS5ncm91cEhlYWRlclRlbXBsYXRlITsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxtYXQtcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogJGtleXMoKTsgbGV0IGkgPSBpbmRleFwiLz5cclxuICA8bWF0LXJvdyBbc3R5bGUuaGVpZ2h0XT1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJIZWlnaHQgPyBzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JyA6ICRncm91cEhlYWRlckhlaWdodCgpXCJcclxuICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodF09XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ID8gc3RhdGUucHJvcHMoKS5ncm91cEhlYWRlckhlaWdodCArICdweCcgOiAkZ3JvdXBIZWFkZXJIZWlnaHQoKVwiXHJcbiAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cEhlYWRlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIvPlxyXG48L21hdC10YWJsZT5cclxuXHJcbjxtYXQtaGVhZGVyLXJvdyBbc3R5bGUuaGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiIFtzdHlsZS5taW4taGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiXHJcbiAgKm1hdEhlYWRlclJvd0RlZj1cIiRrZXlzKCk7IHN0aWNreTogc3RhdGUucHJvcHMoKS5pc1N0aWNreVwiIFtzdHlsZS50b3AucHhdPVwiKChvZmZzZXQkIHwgYXN5bmMpISAqIC0xKVwiLz5cclxuPG1hdC1mb290ZXItcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAqbWF0Rm9vdGVyUm93RGVmPVwiJGtleXMoKTsgc3RpY2t5OiAkc3RpY2t5Rm9vdGVyKCkgXCJcclxuICBbc3R5bGUuYm90dG9tLnB4XT1cIiRzdGlja3lGb290ZXIoKSA/IChvZmZzZXQkIHwgYXN5bmMpIDogdW5kZWZpbmVkXCIvPiJdfQ==