@guiexpert/table 0.0.1 → 1.0.1

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 (350) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE +35 -0
  3. package/README.md +102 -0
  4. package/jest.config.ts +18 -0
  5. package/ng-package.json +7 -0
  6. package/package.json +9 -20
  7. package/project.json +47 -0
  8. package/src/index.ts +156 -0
  9. package/src/lib/table/action/action-id.type.ts +24 -0
  10. package/{lib/table/action/on-action-triggered.if.d.ts → src/lib/table/action/on-action-triggered.if.ts} +4 -1
  11. package/src/lib/table/action/osx-shortcut-actionId-mapping.ts +29 -0
  12. package/src/lib/table/action/shortcut-actionid-mapping.type.ts +3 -0
  13. package/src/lib/table/action/shortcut.service.ts +134 -0
  14. package/src/lib/table/action/windows-shortcut-actionId-mapping.ts +27 -0
  15. package/src/lib/table/checkbox/checkbox-model.if.ts +16 -0
  16. package/src/lib/table/checkbox/checkbox-model.ts +62 -0
  17. package/src/lib/table/checkbox/tree-checkbox-model.ts +123 -0
  18. package/src/lib/table/color/color-rgb.if.ts +7 -0
  19. package/src/lib/table/color/color-rgb.ts +10 -0
  20. package/src/lib/table/color/ge-css-color-util.ts +43 -0
  21. package/src/lib/table/color/three-color-gradient-arg.if.ts +10 -0
  22. package/src/lib/table/color/three-color-gradient-arg.ts +14 -0
  23. package/src/lib/table/color/two-color-gradient-arg.if.ts +8 -0
  24. package/src/lib/table/color/two-color-gradient-arg.ts +12 -0
  25. package/src/lib/table/css-vars.ts +243 -0
  26. package/src/lib/table/data/common/aligns.ts +19 -0
  27. package/src/lib/table/data/common/area-map-factory.ts +14 -0
  28. package/src/lib/table/data/common/area-map.ts +11 -0
  29. package/src/lib/table/data/common/area-map.type.ts +5 -0
  30. package/{lib/table/data/common/args-adjust-columns-to-row-parent-params.d.ts → src/lib/table/data/common/args-adjust-columns-to-row-parent-params.ts} +11 -10
  31. package/src/lib/table/data/common/args-render-cell-div.ts +18 -0
  32. package/src/lib/table/data/common/boolean-function.ts +4 -0
  33. package/src/lib/table/data/common/cell-range.ts +57 -0
  34. package/src/lib/table/data/common/checkbox-column-def.ts +25 -0
  35. package/src/lib/table/data/common/checked-type.ts +1 -0
  36. package/src/lib/table/data/common/event/ge-cell-indices.ts +9 -0
  37. package/src/lib/table/data/common/event/ge-key-event.ts +10 -0
  38. package/src/lib/table/data/common/event/ge-model-change-event.ts +13 -0
  39. package/src/lib/table/data/common/event/ge-mouse-event.ts +38 -0
  40. package/src/lib/table/data/common/event/input/table-cell-update-event.if.ts +10 -0
  41. package/src/lib/table/data/common/event/input/table-cell-update-event.ts +14 -0
  42. package/src/lib/table/data/common/filter-function.ts +1 -0
  43. package/src/lib/table/data/common/get-t.ts +1 -0
  44. package/src/lib/table/data/common/index-and-px.ts +9 -0
  45. package/src/lib/table/data/common/size.if.ts +4 -0
  46. package/src/lib/table/data/common/size.ts +9 -0
  47. package/src/lib/table/data/common/sizes.ts +35 -0
  48. package/src/lib/table/data/common/sort-item.ts +11 -0
  49. package/src/lib/table/data/common/sort-state.type.ts +1 -0
  50. package/src/lib/table/data/common/tree-arrow.type.ts +1 -0
  51. package/src/lib/table/data/common/tree-row-if.ts +11 -0
  52. package/src/lib/table/data/common/tree-row.ts +16 -0
  53. package/src/lib/table/data/common/value-label.if.ts +6 -0
  54. package/src/lib/table/data/common/value-label.ts +13 -0
  55. package/src/lib/table/data/div-scope.type.ts +5 -0
  56. package/src/lib/table/data/event/mouse-target-data.ts +45 -0
  57. package/src/lib/table/data/geo-data.ts +13 -0
  58. package/src/lib/table/data/options/auto-restore-options.if.ts +21 -0
  59. package/src/lib/table/data/options/auto-restore-options.ts +50 -0
  60. package/src/lib/table/data/options/default-row-heights.if.ts +5 -0
  61. package/src/lib/table/data/options/default-row-heights.ts +10 -0
  62. package/src/lib/table/data/options/icon.if.ts +7 -0
  63. package/src/lib/table/data/options/icon.ts +10 -0
  64. package/{lib/table/data/options/sorted-options.if.d.ts → src/lib/table/data/options/sorted-options.if.ts} +6 -3
  65. package/src/lib/table/data/options/sorted-options.ts +15 -0
  66. package/src/lib/table/data/options/table-options.if.ts +54 -0
  67. package/src/lib/table/data/options/table-options.ts +66 -0
  68. package/src/lib/table/data/options/tree-options.if.ts +10 -0
  69. package/src/lib/table/data/options/tree-options.ts +32 -0
  70. package/src/lib/table/data/side-ident.type.ts +1 -0
  71. package/src/lib/table/data/table-model-and-options.if.ts +8 -0
  72. package/src/lib/table/data/table-model-and-options.ts +13 -0
  73. package/src/lib/table/data/tablemodel/area-ident.type.ts +18 -0
  74. package/src/lib/table/data/tablemodel/areamodel/abstract-area-model.ts +183 -0
  75. package/src/lib/table/data/tablemodel/areamodel/area-model-array-of-arrays.ts +59 -0
  76. package/src/lib/table/data/tablemodel/areamodel/area-model-cell-groups.ts +210 -0
  77. package/src/lib/table/data/tablemodel/areamodel/area-model-hidden.ts +120 -0
  78. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.ts +23 -0
  79. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array.ts +105 -0
  80. package/src/lib/table/data/tablemodel/areamodel/area-model-tree.ts +215 -0
  81. package/src/lib/table/data/tablemodel/areamodel/area-model.if.ts +186 -0
  82. package/src/lib/table/data/tablemodel/areamodel/area-model.ts +110 -0
  83. package/src/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.ts +61 -0
  84. package/src/lib/table/data/tablemodel/areamodel/has-default-row-height-if.ts +3 -0
  85. package/src/lib/table/data/tablemodel/cellgroup/cell-group-ext.ts +167 -0
  86. package/src/lib/table/data/tablemodel/cellgroup/cell-group.if.ts +12 -0
  87. package/src/lib/table/data/tablemodel/cellgroup/cell-group.ts +18 -0
  88. package/src/lib/table/data/tablemodel/cellgroup/cellgroup-factory.ts +148 -0
  89. package/src/lib/table/data/tablemodel/column/column-def.if.ts +28 -0
  90. package/src/lib/table/data/tablemodel/column/column-def.ts +104 -0
  91. package/src/lib/table/data/tablemodel/padding.ts +9 -0
  92. package/src/lib/table/data/tablemodel/table-model.if.ts +90 -0
  93. package/src/lib/table/data/tablemodel/table-model.ts +352 -0
  94. package/src/lib/table/ele-scope.ts +283 -0
  95. package/src/lib/table/event-adapter.ts +28 -0
  96. package/src/lib/table/event-listener.if.ts +19 -0
  97. package/src/lib/table/factory/table-factory.ts +378 -0
  98. package/src/lib/table/factory/tree-factory.ts +51 -0
  99. package/src/lib/table/focus/focus-model.if.ts +14 -0
  100. package/src/lib/table/focus/focus-model.ts +48 -0
  101. package/src/lib/table/focus/focus.type.ts +4 -0
  102. package/src/lib/table/input-handler.ts +34 -0
  103. package/src/lib/table/mouse-handler.ts +237 -0
  104. package/src/lib/table/render-scope.ts +936 -0
  105. package/src/lib/table/renderer/cell-group-ext-cell-renderer.ts +27 -0
  106. package/{lib/table/renderer/cell-render.if.d.ts → src/lib/table/renderer/cell-render.if.ts} +10 -1
  107. package/src/lib/table/renderer/checkbox-boolean-property-cell-renderer.ts +58 -0
  108. package/src/lib/table/renderer/checkbox-cell-renderer.ts +39 -0
  109. package/src/lib/table/renderer/date-to-int-date-cell-renderer.ts +34 -0
  110. package/src/lib/table/renderer/date-to-iso-cell-renderer.ts +25 -0
  111. package/src/lib/table/renderer/date-to-locale-date-cell-renderer.ts +24 -0
  112. package/src/lib/table/renderer/date-to-tec-cell-renderer.ts +28 -0
  113. package/src/lib/table/renderer/edit/edit-cell-renderer.type.ts +3 -0
  114. package/src/lib/table/renderer/edit/edit-input-pipe-for-number.ts +6 -0
  115. package/src/lib/table/renderer/edit/edit-input-pipe.if.ts +7 -0
  116. package/src/lib/table/renderer/edit/input-cell-renderer.ts +41 -0
  117. package/src/lib/table/renderer/edit/select-cell-renderer.ts +60 -0
  118. package/src/lib/table/renderer/male-female-to-icon-cell-renderer.ts +26 -0
  119. package/src/lib/table/renderer/number-cell-renderer.ts +38 -0
  120. package/src/lib/table/renderer/renderer-cleanup-fn.type.ts +1 -0
  121. package/src/lib/table/renderer/renderer.ts +11 -0
  122. package/src/lib/table/renderer/true-false-cell-renderer.ts +28 -0
  123. package/src/lib/table/selection/selection-model.if.ts +20 -0
  124. package/src/lib/table/selection/selection-model.ts +109 -0
  125. package/src/lib/table/selection/selection-service.ts +120 -0
  126. package/src/lib/table/selection/selection.type.ts +5 -0
  127. package/src/lib/table/service/abstract-store-state.service.ts +105 -0
  128. package/src/lib/table/service/convenience-dom.service.ts +548 -0
  129. package/src/lib/table/service/data/collapsed-expanded.data.ts +11 -0
  130. package/src/lib/table/service/data/html-style.type.ts +1 -0
  131. package/src/lib/table/service/dom-service.if.ts +16 -0
  132. package/src/lib/table/service/ge-filter.service.ts +123 -0
  133. package/src/lib/table/service/simple-dom-service.ts +46 -0
  134. package/src/lib/table/service/sorter.service.ts +30 -0
  135. package/src/lib/table/service/store-state-collapsed-expand.service.ts +76 -0
  136. package/src/lib/table/service/store-state-scroll-pos.service.ts +40 -0
  137. package/src/lib/table/service/store-state-sorting.service.ts +41 -0
  138. package/src/lib/table/service/tree-row.service.ts +31 -0
  139. package/src/lib/table/table-api.ts +61 -0
  140. package/src/lib/table/table-scope.ts +433 -0
  141. package/src/test-setup.ts +1 -0
  142. package/tsconfig.json +22 -0
  143. package/tsconfig.lib.json +19 -0
  144. package/tsconfig.lib.prod.json +7 -0
  145. package/tsconfig.spec.json +20 -0
  146. package/esm2020/guiexpert-table.mjs +0 -5
  147. package/esm2020/index.mjs +0 -102
  148. package/esm2020/lib/table/action/action-id.type.mjs +0 -20
  149. package/esm2020/lib/table/action/on-action-triggered.if.mjs +0 -2
  150. package/esm2020/lib/table/action/osx-shortcut-actionId-mapping.mjs +0 -17
  151. package/esm2020/lib/table/action/shortcut-actionid-mapping.type.mjs +0 -2
  152. package/esm2020/lib/table/action/shortcut.service.mjs +0 -105
  153. package/esm2020/lib/table/action/windows-shortcut-actionId-mapping.mjs +0 -15
  154. package/esm2020/lib/table/checkbox/checkbox-model.if.mjs +0 -2
  155. package/esm2020/lib/table/checkbox/checkbox-model.mjs +0 -52
  156. package/esm2020/lib/table/checkbox/tree-checkbox-model.mjs +0 -106
  157. package/esm2020/lib/table/data/common/aligns.mjs +0 -19
  158. package/esm2020/lib/table/data/common/area-map-factory.mjs +0 -7
  159. package/esm2020/lib/table/data/common/area-map.mjs +0 -8
  160. package/esm2020/lib/table/data/common/area-map.type.mjs +0 -2
  161. package/esm2020/lib/table/data/common/args-adjust-columns-to-row-parent-params.mjs +0 -2
  162. package/esm2020/lib/table/data/common/args-render-cell-div.mjs +0 -2
  163. package/esm2020/lib/table/data/common/boolean-function.mjs +0 -3
  164. package/esm2020/lib/table/data/common/cell-range.mjs +0 -27
  165. package/esm2020/lib/table/data/common/checkbox-column.mjs +0 -15
  166. package/esm2020/lib/table/data/common/checked-type.mjs +0 -2
  167. package/esm2020/lib/table/data/common/event/ge-cell-indices.mjs +0 -7
  168. package/esm2020/lib/table/data/common/event/ge-key-event.mjs +0 -7
  169. package/esm2020/lib/table/data/common/event/ge-model-change-event.mjs +0 -10
  170. package/esm2020/lib/table/data/common/event/ge-mouse-event.mjs +0 -19
  171. package/esm2020/lib/table/data/common/filter-function.mjs +0 -2
  172. package/esm2020/lib/table/data/common/get-t.mjs +0 -2
  173. package/esm2020/lib/table/data/common/index-and-px.mjs +0 -7
  174. package/esm2020/lib/table/data/common/size.if.mjs +0 -2
  175. package/esm2020/lib/table/data/common/size.mjs +0 -7
  176. package/esm2020/lib/table/data/common/sizes.mjs +0 -33
  177. package/esm2020/lib/table/data/common/sort-item.mjs +0 -7
  178. package/esm2020/lib/table/data/common/sort-state.type.mjs +0 -2
  179. package/esm2020/lib/table/data/common/tree-arrow.type.mjs +0 -2
  180. package/esm2020/lib/table/data/common/tree-row-if.mjs +0 -2
  181. package/esm2020/lib/table/data/common/tree-row.mjs +0 -12
  182. package/esm2020/lib/table/data/common/value-label.if.mjs +0 -2
  183. package/esm2020/lib/table/data/common/value-label.mjs +0 -7
  184. package/esm2020/lib/table/data/div-scope.type.mjs +0 -2
  185. package/esm2020/lib/table/data/geo-data.mjs +0 -10
  186. package/esm2020/lib/table/data/options/auto-restore-options.if.mjs +0 -2
  187. package/esm2020/lib/table/data/options/auto-restore-options.mjs +0 -42
  188. package/esm2020/lib/table/data/options/default-row-heights.if.mjs +0 -2
  189. package/esm2020/lib/table/data/options/default-row-heights.mjs +0 -8
  190. package/esm2020/lib/table/data/options/icon.if.mjs +0 -2
  191. package/esm2020/lib/table/data/options/icon.mjs +0 -8
  192. package/esm2020/lib/table/data/options/sorted-options.if.mjs +0 -2
  193. package/esm2020/lib/table/data/options/sorted-options.mjs +0 -9
  194. package/esm2020/lib/table/data/options/table-options.if.mjs +0 -2
  195. package/esm2020/lib/table/data/options/table-options.mjs +0 -38
  196. package/esm2020/lib/table/data/options/tree-options.if.mjs +0 -2
  197. package/esm2020/lib/table/data/options/tree-options.mjs +0 -10
  198. package/esm2020/lib/table/data/side-ident.type.mjs +0 -2
  199. package/esm2020/lib/table/data/tablemodel/area-ident.type.mjs +0 -10
  200. package/esm2020/lib/table/data/tablemodel/areamodel/abstract-area-model.mjs +0 -108
  201. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-array-array.mjs +0 -34
  202. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-hidden.mjs +0 -76
  203. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.mjs +0 -11
  204. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array.mjs +0 -79
  205. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-tree.mjs +0 -166
  206. package/esm2020/lib/table/data/tablemodel/areamodel/area-model.if.mjs +0 -2
  207. package/esm2020/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.mjs +0 -48
  208. package/esm2020/lib/table/data/tablemodel/column/column-def.if.mjs +0 -2
  209. package/esm2020/lib/table/data/tablemodel/column/column-def.mjs +0 -32
  210. package/esm2020/lib/table/data/tablemodel/padding.mjs +0 -9
  211. package/esm2020/lib/table/data/tablemodel/table-model.if.mjs +0 -2
  212. package/esm2020/lib/table/data/tablemodel/table-model.mjs +0 -262
  213. package/esm2020/lib/table/ele-scope.mjs +0 -173
  214. package/esm2020/lib/table/event-listener.if.mjs +0 -2
  215. package/esm2020/lib/table/focus/focus-model.if.mjs +0 -2
  216. package/esm2020/lib/table/focus/focus-model.mjs +0 -22
  217. package/esm2020/lib/table/focus/focus.type.mjs +0 -2
  218. package/esm2020/lib/table/input-handler.mjs +0 -24
  219. package/esm2020/lib/table/mouse-handler.mjs +0 -197
  220. package/esm2020/lib/table/render-scope.mjs +0 -575
  221. package/esm2020/lib/table/renderer/cell-render.if.mjs +0 -2
  222. package/esm2020/lib/table/renderer/checkbox-cell-renderer.mjs +0 -22
  223. package/esm2020/lib/table/renderer/date-to-int-date-cell-renderer.mjs +0 -21
  224. package/esm2020/lib/table/renderer/date-to-iso-cell-renderer.mjs +0 -9
  225. package/esm2020/lib/table/renderer/date-to-locale-date-cell-renderer.mjs +0 -9
  226. package/esm2020/lib/table/renderer/edit/edit-cell-renderer.type.mjs +0 -2
  227. package/esm2020/lib/table/renderer/edit/input-cell-renderer.mjs +0 -23
  228. package/esm2020/lib/table/renderer/edit/select-cell-renderer.mjs +0 -35
  229. package/esm2020/lib/table/renderer/male-female-to-icon-cell-renderer.mjs +0 -12
  230. package/esm2020/lib/table/renderer/number-cell-renderer.mjs +0 -19
  231. package/esm2020/lib/table/renderer/renderer-cleanup-fn.type.mjs +0 -2
  232. package/esm2020/lib/table/renderer/renderer.mjs +0 -7
  233. package/esm2020/lib/table/selection/selection-model.if.mjs +0 -2
  234. package/esm2020/lib/table/selection/selection-model.mjs +0 -97
  235. package/esm2020/lib/table/selection/selection-service.mjs +0 -97
  236. package/esm2020/lib/table/selection/selection.type.mjs +0 -2
  237. package/esm2020/lib/table/service/abstract-store-state.service.mjs +0 -49
  238. package/esm2020/lib/table/service/convenience-dom.service.mjs +0 -386
  239. package/esm2020/lib/table/service/data/collapsed-expanded.data.mjs +0 -9
  240. package/esm2020/lib/table/service/data/html-style.type.mjs +0 -2
  241. package/esm2020/lib/table/service/dom-service.if.mjs +0 -2
  242. package/esm2020/lib/table/service/ge-filter.service.mjs +0 -98
  243. package/esm2020/lib/table/service/sorter.service.mjs +0 -27
  244. package/esm2020/lib/table/service/store-state-collapsed-expand.service.mjs +0 -57
  245. package/esm2020/lib/table/service/store-state-scroll-pos.service.mjs +0 -29
  246. package/esm2020/lib/table/service/store-state-sorting.service.mjs +0 -29
  247. package/esm2020/lib/table/service/tree-row.service.mjs +0 -23
  248. package/esm2020/lib/table/table-api.mjs +0 -38
  249. package/esm2020/lib/table/table-model-factory.mjs +0 -125
  250. package/esm2020/lib/table/table-scope.mjs +0 -307
  251. package/index.d.ts +0 -103
  252. package/lib/table/action/action-id.type.d.ts +0 -2
  253. package/lib/table/action/osx-shortcut-actionId-mapping.d.ts +0 -6
  254. package/lib/table/action/shortcut-actionid-mapping.type.d.ts +0 -4
  255. package/lib/table/action/shortcut.service.d.ts +0 -17
  256. package/lib/table/action/windows-shortcut-actionId-mapping.d.ts +0 -6
  257. package/lib/table/checkbox/checkbox-model.d.ts +0 -12
  258. package/lib/table/checkbox/checkbox-model.if.d.ts +0 -9
  259. package/lib/table/checkbox/tree-checkbox-model.d.ts +0 -17
  260. package/lib/table/data/common/aligns.d.ts +0 -24
  261. package/lib/table/data/common/area-map-factory.d.ts +0 -5
  262. package/lib/table/data/common/area-map.d.ts +0 -7
  263. package/lib/table/data/common/area-map.type.d.ts +0 -5
  264. package/lib/table/data/common/args-render-cell-div.d.ts +0 -13
  265. package/lib/table/data/common/boolean-function.d.ts +0 -3
  266. package/lib/table/data/common/cell-range.d.ts +0 -17
  267. package/lib/table/data/common/checkbox-column.d.ts +0 -13
  268. package/lib/table/data/common/checked-type.d.ts +0 -1
  269. package/lib/table/data/common/event/ge-cell-indices.d.ts +0 -5
  270. package/lib/table/data/common/event/ge-key-event.d.ts +0 -5
  271. package/lib/table/data/common/event/ge-model-change-event.d.ts +0 -6
  272. package/lib/table/data/common/event/ge-mouse-event.d.ts +0 -17
  273. package/lib/table/data/common/filter-function.d.ts +0 -1
  274. package/lib/table/data/common/get-t.d.ts +0 -1
  275. package/lib/table/data/common/index-and-px.d.ts +0 -5
  276. package/lib/table/data/common/size.d.ts +0 -6
  277. package/lib/table/data/common/size.if.d.ts +0 -4
  278. package/lib/table/data/common/sizes.d.ts +0 -32
  279. package/lib/table/data/common/sort-item.d.ts +0 -6
  280. package/lib/table/data/common/sort-state.type.d.ts +0 -1
  281. package/lib/table/data/common/tree-arrow.type.d.ts +0 -1
  282. package/lib/table/data/common/tree-row-if.d.ts +0 -10
  283. package/lib/table/data/common/tree-row.d.ts +0 -11
  284. package/lib/table/data/common/value-label.d.ts +0 -6
  285. package/lib/table/data/common/value-label.if.d.ts +0 -4
  286. package/lib/table/data/div-scope.type.d.ts +0 -7
  287. package/lib/table/data/geo-data.d.ts +0 -8
  288. package/lib/table/data/options/auto-restore-options.d.ts +0 -11
  289. package/lib/table/data/options/auto-restore-options.if.d.ts +0 -13
  290. package/lib/table/data/options/default-row-heights.d.ts +0 -7
  291. package/lib/table/data/options/default-row-heights.if.d.ts +0 -5
  292. package/lib/table/data/options/icon.d.ts +0 -7
  293. package/lib/table/data/options/icon.if.d.ts +0 -5
  294. package/lib/table/data/options/sorted-options.d.ts +0 -8
  295. package/lib/table/data/options/table-options.d.ts +0 -36
  296. package/lib/table/data/options/table-options.if.d.ts +0 -37
  297. package/lib/table/data/options/tree-options.d.ts +0 -9
  298. package/lib/table/data/options/tree-options.if.d.ts +0 -7
  299. package/lib/table/data/side-ident.type.d.ts +0 -1
  300. package/lib/table/data/tablemodel/area-ident.type.d.ts +0 -2
  301. package/lib/table/data/tablemodel/areamodel/abstract-area-model.d.ts +0 -43
  302. package/lib/table/data/tablemodel/areamodel/area-model-array-array.d.ts +0 -18
  303. package/lib/table/data/tablemodel/areamodel/area-model-hidden.d.ts +0 -32
  304. package/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.d.ts +0 -10
  305. package/lib/table/data/tablemodel/areamodel/area-model-object-array.d.ts +0 -27
  306. package/lib/table/data/tablemodel/areamodel/area-model-tree.d.ts +0 -39
  307. package/lib/table/data/tablemodel/areamodel/area-model.if.d.ts +0 -33
  308. package/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.d.ts +0 -12
  309. package/lib/table/data/tablemodel/column/column-def.d.ts +0 -46
  310. package/lib/table/data/tablemodel/column/column-def.if.d.ts +0 -22
  311. package/lib/table/data/tablemodel/padding.d.ts +0 -7
  312. package/lib/table/data/tablemodel/table-model.d.ts +0 -60
  313. package/lib/table/data/tablemodel/table-model.if.d.ts +0 -34
  314. package/lib/table/ele-scope.d.ts +0 -37
  315. package/lib/table/event-listener.if.d.ts +0 -11
  316. package/lib/table/focus/focus-model.d.ts +0 -12
  317. package/lib/table/focus/focus-model.if.d.ts +0 -6
  318. package/lib/table/focus/focus.type.d.ts +0 -1
  319. package/lib/table/input-handler.d.ts +0 -6
  320. package/lib/table/mouse-handler.d.ts +0 -27
  321. package/lib/table/render-scope.d.ts +0 -77
  322. package/lib/table/renderer/checkbox-cell-renderer.d.ts +0 -8
  323. package/lib/table/renderer/date-to-int-date-cell-renderer.d.ts +0 -9
  324. package/lib/table/renderer/date-to-iso-cell-renderer.d.ts +0 -8
  325. package/lib/table/renderer/date-to-locale-date-cell-renderer.d.ts +0 -8
  326. package/lib/table/renderer/edit/edit-cell-renderer.type.d.ts +0 -2
  327. package/lib/table/renderer/edit/input-cell-renderer.d.ts +0 -8
  328. package/lib/table/renderer/edit/select-cell-renderer.d.ts +0 -12
  329. package/lib/table/renderer/male-female-to-icon-cell-renderer.d.ts +0 -8
  330. package/lib/table/renderer/number-cell-renderer.d.ts +0 -11
  331. package/lib/table/renderer/renderer-cleanup-fn.type.d.ts +0 -1
  332. package/lib/table/renderer/renderer.d.ts +0 -5
  333. package/lib/table/selection/selection-model.d.ts +0 -21
  334. package/lib/table/selection/selection-model.if.d.ts +0 -11
  335. package/lib/table/selection/selection-service.d.ts +0 -17
  336. package/lib/table/selection/selection.type.d.ts +0 -2
  337. package/lib/table/service/abstract-store-state.service.d.ts +0 -10
  338. package/lib/table/service/convenience-dom.service.d.ts +0 -44
  339. package/lib/table/service/data/collapsed-expanded.data.d.ts +0 -7
  340. package/lib/table/service/data/html-style.type.d.ts +0 -3
  341. package/lib/table/service/dom-service.if.d.ts +0 -9
  342. package/lib/table/service/ge-filter.service.d.ts +0 -5
  343. package/lib/table/service/sorter.service.d.ts +0 -3
  344. package/lib/table/service/store-state-collapsed-expand.service.d.ts +0 -15
  345. package/lib/table/service/store-state-scroll-pos.service.d.ts +0 -10
  346. package/lib/table/service/store-state-sorting.service.d.ts +0 -11
  347. package/lib/table/service/tree-row.service.d.ts +0 -5
  348. package/lib/table/table-api.d.ts +0 -16
  349. package/lib/table/table-model-factory.d.ts +0 -61
  350. package/lib/table/table-scope.d.ts +0 -55
@@ -1,575 +0,0 @@
1
- import { EleScope } from "./ele-scope";
2
- import { TreeRow } from "./data/common/tree-row";
3
- import { AreaModelTree } from "./data/tablemodel/areamodel/area-model-tree";
4
- import { GeoData } from "./data/geo-data";
5
- import { ColAndRowspanModel } from "./data/tablemodel/areamodel/col-and-rowspan-model";
6
- export class RenderScope extends EleScope {
7
- constructor(hostElement, tableModel, dom, tableOptions) {
8
- super(hostElement, tableModel, dom, tableOptions);
9
- this.scrollLeft = 0;
10
- this.scrollViewportLeft = 0;
11
- this.scrollFactorY = 0;
12
- this.scrollFactorX = 0;
13
- this.cleanupFunctions = {
14
- header: [],
15
- body: [],
16
- footer: [],
17
- };
18
- this.tree = false;
19
- this.rangeEles = [];
20
- this.firstVisibleRowIndex = -1;
21
- this.draggingTargetColumnIndex = -1;
22
- if (this.tableOptions?.getSelectionModel) {
23
- this.getSelectionModel = this.tableOptions.getSelectionModel;
24
- }
25
- if (this.tableOptions?.getFocusModel) {
26
- this.getFocusModel = this.tableOptions.getFocusModel;
27
- }
28
- if (tableModel.getAreaModel('body') instanceof AreaModelTree) {
29
- this.tree = true;
30
- }
31
- this.colAndRowspanModel = new ColAndRowspanModel(tableModel, tableModel.getBodyModel());
32
- this.colAndRowspanModel.init();
33
- }
34
- resetEditorRenderer() {
35
- this.editorRenderer = undefined;
36
- this.editorRendererRow = -1;
37
- this.editorRendererColumn = -1;
38
- }
39
- clearSelection() {
40
- if (this.getSelectionModel) {
41
- const sm = this.getSelectionModel();
42
- sm?.clear();
43
- }
44
- }
45
- initRenderEditor(rowIdx, colIdx) {
46
- let rnFn = this.tableModel.getColumnDef(colIdx)?.getEditRenderer;
47
- if (!rnFn) {
48
- rnFn = this.tableOptions.getEditRenderer;
49
- }
50
- if (rnFn) {
51
- this.editorRenderer = rnFn(rowIdx, colIdx);
52
- if (this.editorRenderer) {
53
- this.editorRendererRow = rowIdx;
54
- this.editorRendererColumn = colIdx;
55
- this.repaint();
56
- // request focus:
57
- const input = document.querySelector("input.ge-table-cell-editor-input");
58
- if (input) {
59
- input.focus();
60
- }
61
- }
62
- else {
63
- this.editorRendererRow = -1;
64
- this.editorRendererColumn = -1;
65
- }
66
- }
67
- }
68
- repaint() {
69
- this.adjustAfterScrolling();
70
- }
71
- adjustAfterScrolling() {
72
- this.hideHoverRow();
73
- this.hideHoverColumn();
74
- this.scrollTop = this.scrollViewport.scrollTop;
75
- this.scrollLeft = this.scrollViewport.scrollLeft;
76
- this.debounce(this.checkForScrollPosSaving.bind(this));
77
- this.scrollFactorY = this.scrollTop / (this.scrollViewport.scrollHeight - this.scrollViewport.clientHeight);
78
- this.scrollFactorX = this.scrollLeft / (this.scrollViewport.scrollWidth - this.scrollViewport.clientWidth);
79
- if (isNaN(this.scrollFactorY)) {
80
- this.scrollFactorY = 0;
81
- }
82
- if (isNaN(this.scrollFactorX)) {
83
- this.scrollFactorX = 0;
84
- }
85
- this.adjustBody();
86
- this.adjustArea('footer');
87
- this.adjustArea('header');
88
- }
89
- checkForScrollPosSaving() {
90
- if (this.storeScrollPosStateService
91
- && this.tableOptions?.autoRestoreOptions?.autoRestoreScrollPosition) {
92
- this.storeScrollPosStateService.updateScrollOffset([this.scrollLeft, this.scrollTop]);
93
- }
94
- }
95
- getAreaAndSideIdentByAttr(srcElement) {
96
- if (srcElement) {
97
- const dataArea = srcElement.getAttribute('data-area');
98
- const dataSide = srcElement.getAttribute('data-side');
99
- if (dataSide && dataArea) {
100
- return [dataArea, dataSide];
101
- }
102
- if (srcElement.parentElement) {
103
- return this.getAreaAndSideIdentByAttr(srcElement.parentElement);
104
- }
105
- }
106
- return [undefined, undefined];
107
- }
108
- getArea(rowIdent, sideIdent) {
109
- if (rowIdent === 'header') {
110
- if (sideIdent === 'west')
111
- return this.areaHeaderWest;
112
- if (sideIdent === 'center')
113
- return this.areaHeaderCenter;
114
- if (sideIdent === 'east')
115
- return this.areaHeaderEast;
116
- }
117
- else if (rowIdent === 'body') {
118
- if (sideIdent === 'west')
119
- return this.areaBodyWest;
120
- if (sideIdent === 'center')
121
- return this.areaBodyCenter;
122
- if (sideIdent === 'east')
123
- return this.areaBodyEast;
124
- }
125
- else if (rowIdent === 'footer') {
126
- if (sideIdent === 'west')
127
- return this.areaFooterWest;
128
- if (sideIdent === 'center')
129
- return this.areaFooterCenter;
130
- if (sideIdent === 'east')
131
- return this.areaFooterEast;
132
- }
133
- throw Error(`Wrong area identifier: row:${rowIdent}, col:${sideIdent}`);
134
- }
135
- adjustBody() {
136
- const virtualRowDivTopF1 = this.areaBodyCenterGeo.height - this.tableModel.getContentHeightInPixel();
137
- const virtualRowDivTop = this.scrollFactorY * virtualRowDivTopF1;
138
- this.dom.setStyle(this.contentDiv, 'top', `${this.scrollTop}px`);
139
- this.dom.setStyle(this.contentDiv, 'left', `${this.scrollViewport.scrollLeft}px`);
140
- this.adjustArea('body', virtualRowDivTop);
141
- }
142
- getNumberByAttr(srcElement, key) {
143
- if (srcElement) {
144
- const attr = srcElement.closest('[data-ge-action]')?.getAttribute(key);
145
- if (attr)
146
- return Number(attr);
147
- }
148
- return -1;
149
- }
150
- adjustArea(areaIdent, yStart = 0) {
151
- const westArea = this.getArea(areaIdent, 'west');
152
- const centerArea = this.getArea(areaIdent, 'center');
153
- const eastArea = this.getArea(areaIdent, 'east');
154
- const divHeight = centerArea.child.clientHeight;
155
- westArea.child.innerText = '';
156
- centerArea.child.innerText = '';
157
- eastArea.child.innerText = '';
158
- const left = 0;
159
- const width = this.areaBodyCenterGeo.width;
160
- const padding = this.tableModel.getPadding();
161
- const areaModel = this.tableModel.getAreaModel(areaIdent);
162
- const rowCount = areaModel.getRowCount();
163
- const bodyArea = areaIdent === 'body';
164
- while (this.cleanupFunctions[areaIdent].length) {
165
- const fn = this.cleanupFunctions[areaIdent].shift();
166
- if (fn) {
167
- fn();
168
- }
169
- }
170
- let y = yStart;
171
- let firstVisibleRow = true;
172
- let lastVisibleRowIndex = -1;
173
- for (let index = 0; index < rowCount; index++) {
174
- const top = y;
175
- const height = this.tableModel.getRowHeight(areaIdent, index);
176
- if (top + height > 0) {
177
- // Visible!
178
- this.firstVisibleRowIndex = index;
179
- // center -------------------------------------------
180
- let geo = { left, width, height, top, index };
181
- let rowDiv = this.dom.addRowDiv(centerArea, geo, index, areaIdent);
182
- const columnCount = this.tableModel.getColumnCount();
183
- const centerStartCol = this.tableModel.getFixedLeftColumnCount();
184
- const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
185
- this.adjustColumnsToRowParent({
186
- areaIdent,
187
- sideIdent: 'center',
188
- areaModel,
189
- geo,
190
- parent: rowDiv,
191
- rowIndex: index,
192
- columnIndexStart: centerStartCol,
193
- columnIndexEnd: columnCount - fixedRightColumnCount - 1,
194
- verticalFixed: false,
195
- firstVisibleRow
196
- });
197
- // west -------------------------------------------
198
- if (padding.left > 0) {
199
- geo = { left, width: this.areaBodyWestGeo.width, height, top, index };
200
- rowDiv = this.dom.addRowDiv(westArea, geo, index, areaIdent);
201
- this.adjustColumnsToRowParent({
202
- areaIdent,
203
- sideIdent: 'west',
204
- areaModel,
205
- geo,
206
- parent: rowDiv,
207
- rowIndex: index,
208
- columnIndexStart: 0,
209
- columnIndexEnd: centerStartCol - 1,
210
- verticalFixed: true,
211
- firstVisibleRow
212
- });
213
- }
214
- // east -------------------------------------------
215
- if (padding.right > 0) {
216
- geo = { left, width: this.areaBodyEastGeo.width, height, top, index };
217
- rowDiv = this.dom.addRowDiv(eastArea, geo, index, areaIdent);
218
- this.adjustColumnsToRowParent({
219
- areaIdent,
220
- sideIdent: 'east',
221
- areaModel,
222
- geo,
223
- parent: rowDiv,
224
- rowIndex: index,
225
- columnIndexStart: columnCount - fixedRightColumnCount,
226
- columnIndexEnd: columnCount - 1,
227
- verticalFixed: true,
228
- firstVisibleRow
229
- });
230
- }
231
- firstVisibleRow = false;
232
- // collapse / expand all:
233
- if (areaIdent === 'header' && this.tree && index === rowCount - 1) {
234
- const div = this.dom.applyStyle(this.dom.setAttribute(this.dom.addDiv(rowDiv, new GeoData(16, 20, 20, 8)), 'data-ge-action', 'toggleExpandCollapseAll'), { 'cursor': 'pointer' });
235
- const treeOptionsArrow = this.tableOptions.treeOptions.arrowExpandCollapseAll;
236
- if (treeOptionsArrow) {
237
- const textElement = this.dom.domService.createText(treeOptionsArrow.content);
238
- this.dom.domService.appendChild(div, textElement);
239
- if (treeOptionsArrow.style) {
240
- this.dom.applyStyleString(div, treeOptionsArrow.style);
241
- }
242
- }
243
- }
244
- }
245
- y = y + height;
246
- lastVisibleRowIndex = index;
247
- if (y > divHeight) {
248
- break;
249
- }
250
- } // for
251
- // for the body area we draw the big col and rowspan cells at the end.
252
- // This fixes the 'half cutted big cell' problem:
253
- if (bodyArea) {
254
- // draw col/rowspan cells again:
255
- const ranges = this.colAndRowspanModel?.getRanges() ?? [];
256
- if (ranges.length) {
257
- const virtualRowDivLeftF1 = (this.areaBodyCenterGeo.width) - this.tableModel.getContentWidthInPixel();
258
- const xStart = this.scrollFactorX * virtualRowDivLeftF1;
259
- for (const range of ranges) {
260
- this.drawBigCell(range, xStart, yStart, areaModel, centerArea.child);
261
- }
262
- }
263
- }
264
- // if ( this.draggingTargetColumnIndex>-1){
265
- // // we will render a flying dragging column:
266
- // const domService = this.dom.domService;
267
- // //for (let index = this.firstVisibleRowIndex; index <= lastVisibleRowIndex; index++) {
268
- // const div = this.dom.domService.createElement<HTMLDivElement>('div');
269
- // const w = this.tableModel.getColumnWidth(this.draggingTargetColumnIndex);
270
- // const h = this.contentDiv.clientHeight;
271
- // let left = this.mouseEvent?.originalEvent?.x ?? 0;
272
- //
273
- // domService.addClass(div, 'ge-table-dragged-col-div');
274
- // domService.addClass(div, `ge-table-col-div-${this.draggingTargetColumnIndex}`);
275
- // domService.setAttribute(div, 'data-col-index', `${this.draggingTargetColumnIndex}`);
276
- // domService.setStyle(div, 'display', 'clip');
277
- // domService.setStyle(div, 'opacity', '0.5');
278
- // domService.setStyle(div, 'position', 'absolute');
279
- // domService.setStyle(div, 'left', `${left}px`);
280
- // domService.setStyle(div, 'top', `${0}px`);
281
- // domService.setStyle(div, 'width', `${w}px`);
282
- // domService.setStyle(div, 'height', `${h}px`);
283
- // domService.appendChild(this.contentDiv, div);
284
- // //}
285
- // }
286
- }
287
- /**
288
- * Draws big cells (rowspan and or colspan) in body/center
289
- * @param range
290
- * @param yStart
291
- * @protected
292
- */
293
- drawBigCell(range, xStart, yStart, areaModel, parentDiv) {
294
- const y1 = yStart + this.getRowHeights(0, range.r1 - 1, areaModel).reduce((a, b) => a + b, 0);
295
- const x1 = xStart + this.getColumnWidths(0, range.c1 - 1).reduce((a, b) => a + b, 0);
296
- const h = this.getRowHeights(range.r1, range.r2, areaModel).reduce((a, b) => a + b, 0);
297
- const w = this.getColumnWidths(range.c1, range.c2).reduce((a, b) => a + b, 0);
298
- let cellSelected = false;
299
- const selectionModel = this.getSelectionModel ? this.getSelectionModel() : undefined;
300
- if (selectionModel) {
301
- const count = selectionModel.getSelectionCount(range.r1, range.c1);
302
- cellSelected = count > 0;
303
- }
304
- this.renderCell(areaModel, 'body', range.r1, range.c1, x1, y1, w, h, parentDiv, cellSelected);
305
- }
306
- findRowOfImportantRowspanCell(areaModel, rowIndex, colIndex) {
307
- const maxRowspan = areaModel.getMaxRowspan();
308
- for (let r = rowIndex - 1; r > -1; r--) {
309
- const rowspan = areaModel.getRowspanAt(r, colIndex);
310
- if (rowspan > 1 && r + rowspan + 1 >= rowIndex) {
311
- return r;
312
- }
313
- if (rowIndex - r > maxRowspan) {
314
- return -1;
315
- }
316
- }
317
- return -1;
318
- }
319
- adjustColumnsToRowParent({ areaIdent, sideIdent, areaModel, geo, parent, rowIndex, columnIndexStart, columnIndexEnd, verticalFixed = false, firstVisibleRow = false }) {
320
- this.scrollViewportLeft = this.scrollViewport.scrollLeft;
321
- let virtualRowDivLeft = 0;
322
- if (!verticalFixed) {
323
- const virtualRowDivLeftF1 = (this.areaBodyCenterGeo.width) - this.tableModel.getContentWidthInPixel();
324
- virtualRowDivLeft = this.scrollFactorX * virtualRowDivLeftF1;
325
- }
326
- const top = 0;
327
- // const trackColumns = this.visibleColumns.length === 0 && areaIdent === 'body' && sideIdent === 'center';
328
- const renderSelection = (areaIdent === 'body');
329
- let x = virtualRowDivLeft;
330
- for (let index = columnIndexStart; index <= columnIndexEnd; index++) {
331
- const left = x;
332
- const w = this.tableModel.getColumnWidth(index);
333
- if (left + w > 0) {
334
- // Visible! Render cell div:
335
- // calc height:
336
- let height = geo.height;
337
- let rowspan = areaModel.getRowspanAt(rowIndex, index);
338
- let colspan = areaModel.getColspanAt(rowIndex, index);
339
- if (rowspan > 1) {
340
- height = this.getRowHeights(rowIndex, rowIndex + rowspan - 1, areaModel).reduce((a, b) => a + b, 0);
341
- }
342
- let width = w;
343
- if (colspan > 1) {
344
- width = this.getColumnWidths(index, index + colspan - 1).reduce((a, b) => a + b, 0);
345
- }
346
- let skip = false;
347
- if (areaIdent === 'body') {
348
- if (this.colAndRowspanModel?.isInRange(rowIndex, index)) {
349
- skip = true; // for the body area we don't want to to render the small single cells
350
- }
351
- }
352
- if (this.draggingTargetColumnIndex === index && areaIdent !== 'header') {
353
- const target = this.renderDragTargetDiv(parent, left, top, width, height);
354
- this.dom.addColumnBorderDivs(parent, { left, top, width, height });
355
- }
356
- else {
357
- let cellSelected = this.renderSelectedBackgroundDiv(skip, renderSelection, areaModel, rowIndex, index, parent, left, top, width, height);
358
- if (!skip) {
359
- this.renderCell(areaModel, areaIdent, rowIndex, index, left, top, width, height, parent, cellSelected);
360
- }
361
- if (areaIdent === 'header' && this.tableOptions.columnsResizable) {
362
- this.renderHeaderCellResizeHandle(rowIndex, index, left, top, width, height, parent);
363
- }
364
- }
365
- }
366
- x = x + w;
367
- if (x > this.areaBodyCenterGeo.width) {
368
- break;
369
- }
370
- }
371
- }
372
- getTreeArrowColumnIndex() {
373
- if (this.tableOptions.showCheckboxWihoutExtraColumn) {
374
- return 0;
375
- }
376
- if (this.tableModel.isRowCheckboxVisible()) {
377
- return 1;
378
- }
379
- return 0;
380
- }
381
- addAndRenderCellDiv({ areaModel, areaIdent, rowIndex, index, left, width, height, top, parent }) {
382
- const editor = this.editorRenderer && this.editorRendererRow === rowIndex && this.editorRendererColumn === index;
383
- const cellRenderer = (editor) ? this.editorRenderer : areaModel.getCellRenderer(rowIndex, index);
384
- const geo = { left, width, height, top, index };
385
- const rowObject = areaModel.getRowByIndex(rowIndex);
386
- let treeArrow = 'none';
387
- const arrowIndexOk = index === this.getTreeArrowColumnIndex();
388
- if (arrowIndexOk && rowObject instanceof TreeRow) {
389
- const tr = rowObject;
390
- if (tr.children?.length) {
391
- if (tr.expanded) {
392
- treeArrow = 'expanded';
393
- }
394
- else {
395
- treeArrow = 'collapsed';
396
- }
397
- }
398
- else {
399
- treeArrow = 'hidden';
400
- }
401
- }
402
- let sortState = undefined;
403
- if (areaIdent === 'header') {
404
- const columnDef = this.tableModel.getColumnDef(index);
405
- if (!columnDef?.sortIconVisible || columnDef?.sortIconVisible()) {
406
- sortState = columnDef?.sortState;
407
- }
408
- }
409
- const val = areaModel.getValueAt(rowIndex, index);
410
- const text = cellRenderer ? '' : `${val}`;
411
- const checkedType = areaModel.isRowChecked(rowIndex);
412
- const cell = this.dom.addColumnDiv(parent, geo, rowIndex, index, areaIdent, text, treeArrow, this.tableOptions, checkedType, sortState);
413
- const tooltip = areaModel.getTooltipAt(rowIndex, index);
414
- if (tooltip) {
415
- this.dom.setAttribute(cell, 'title', tooltip);
416
- }
417
- const columnDef = this.tableModel.getColumnDef(index);
418
- if (columnDef && columnDef.classes[areaIdent]) {
419
- this.dom.addClasses(columnDef.classes[areaIdent], cell);
420
- }
421
- let fn = undefined;
422
- if (cellRenderer) {
423
- fn = cellRenderer.render(cell, rowIndex, index, areaIdent, areaModel, val, this.dom.domService);
424
- }
425
- const classes = areaModel.getCustomClassesAt(rowIndex, index);
426
- if (classes.length) {
427
- this.dom.addClasses(classes, cell);
428
- }
429
- this.dom.addColumnBorderDivs(parent, geo);
430
- if (this.getFocusModel && areaIdent === 'body') {
431
- const fm = this.getFocusModel();
432
- if (fm?.hasFocus(rowIndex, index)) {
433
- this.dom.addFocusBorderDivs(parent, geo, {});
434
- }
435
- }
436
- if (areaIdent === 'header') {
437
- this.dom.setAttribute(cell, 'data-ge-action', 'drag-column');
438
- }
439
- return [cell, fn];
440
- }
441
- getColumnWidths(startIndex, endIndex) {
442
- const ret = [];
443
- for (let i = startIndex; i <= endIndex; i++) {
444
- ret.push(this.tableModel.getColumnWidth(i));
445
- }
446
- return ret;
447
- }
448
- getRowHeights(startIndex, endIndex, areaModel) {
449
- const ret = [];
450
- for (let i = startIndex; i <= endIndex; i++) {
451
- ret.push(areaModel.getRowHeight(i));
452
- }
453
- return ret;
454
- }
455
- adjustHoverRows(mouseMoveEvent) {
456
- if (this.tableOptions.hoverRowVisible && mouseMoveEvent.rowIndex > -1) {
457
- const width = this.hostElement.clientWidth;
458
- const rowHeight = this.tableModel.getAreaModel('body').getRowHeight(mouseMoveEvent.rowIndex);
459
- const top = mouseMoveEvent.rowTop + this.areaHeaderCenter.parent.clientHeight;
460
- this.dom.applyStyle(this.hoverRow, {
461
- 'left': '0',
462
- 'top': top + 'px',
463
- 'width': width + 'px',
464
- 'height': rowHeight + 'px',
465
- 'display': 'block'
466
- });
467
- }
468
- else {
469
- this.hideHoverRow();
470
- }
471
- }
472
- hideHoverRow() {
473
- this.dom.applyStyle(this.hoverRow, {
474
- 'display': 'none'
475
- });
476
- }
477
- adjustHoverColumns(mouseMoveEvent) {
478
- if (this.tableOptions.hoverColumnVisible && mouseMoveEvent.rowIndex > -1) {
479
- const height = this.hostElement.clientHeight;
480
- const width = this.tableModel.getColumnWidth(mouseMoveEvent.columnIndex);
481
- const left = mouseMoveEvent.columnLeft + this.tableModel.getPadding().left;
482
- this.dom.applyStyle(this.hoverColumn, {
483
- 'left': (left) + 'px',
484
- 'top': '0px',
485
- 'width': width + 'px',
486
- 'height': height + 'px',
487
- 'display': 'block'
488
- });
489
- }
490
- else {
491
- this.hideHoverColumn();
492
- }
493
- }
494
- hideHoverColumn() {
495
- this.dom.applyStyle(this.hoverColumn, {
496
- 'display': 'none'
497
- });
498
- }
499
- debounce(fn, delay = 1000) {
500
- if (this.debounceTimeout) {
501
- clearTimeout(this.debounceTimeout);
502
- }
503
- this.debounceTimeout = setTimeout(fn.bind(this), delay);
504
- }
505
- renderDragTargetDiv(parent, left, top, width, height) {
506
- const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass('ge-table-drop-zone', parent));
507
- this.dom.setStyle(div, 'left', `${left}px`);
508
- this.dom.setStyle(div, 'top', `${top}px`);
509
- this.dom.setStyle(div, 'width', `${width}px`);
510
- this.dom.setStyle(div, 'height', `${height}px`);
511
- return div;
512
- }
513
- renderSelectedBackgroundDiv(skip, renderSelection, areaModel, rowIndex, index, parent, left, top, width, height) {
514
- let cellSelected = false;
515
- if (!skip && renderSelection && areaModel.isSelectable(rowIndex, index)) {
516
- if (this.getSelectionModel) {
517
- const selectionModel = this.getSelectionModel();
518
- if (selectionModel) {
519
- const count = selectionModel.getSelectionCount(rowIndex, index);
520
- cellSelected = count > 0;
521
- for (let i = 0; i < count; i++) {
522
- const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass('ge-table-selected-range', parent));
523
- this.dom.setStyle(div, 'left', `${left}px`);
524
- this.dom.setStyle(div, 'top', `${top}px`);
525
- this.dom.setStyle(div, 'width', `${width}px`);
526
- this.dom.setStyle(div, 'height', `${height}px`);
527
- }
528
- }
529
- }
530
- }
531
- return cellSelected;
532
- }
533
- renderCell(areaModel, areaIdent, rowIndex, columnIndex, left, top, width, height, parent, cellSelected) {
534
- const [div, fn] = this.addAndRenderCellDiv({
535
- areaModel,
536
- areaIdent,
537
- rowIndex,
538
- index: columnIndex,
539
- left,
540
- width,
541
- height,
542
- top,
543
- parent
544
- });
545
- if (cellSelected) {
546
- this.dom.addClass('ge-cell-selected', div);
547
- }
548
- if (fn) {
549
- this.cleanupFunctions[areaIdent].push(fn);
550
- }
551
- }
552
- renderHeaderCellResizeHandle(rowIndex, columnIndex, cellLeft, cellTop, cellWidth, cellHeight, parent) {
553
- const domService = this.dom.domService;
554
- const handleWidth = this.tableOptions.columnResizeHandleWidthInPx ?? 3;
555
- const div = domService.createElement('div');
556
- domService.setAttribute(div, 'data-col-index', `${columnIndex}`);
557
- domService.setAttribute(div, 'data-row-index', `${rowIndex}`);
558
- domService.setAttribute(div, 'data-area', 'header');
559
- domService.setAttribute(div, 'data-ge-action', 'resize-column');
560
- // domService.setAttribute(div, 'data-ge-action', 'column-resize');
561
- domService.addClass(div, `ge-table-col-resize-handle`);
562
- domService.setStyle(div, 'display', 'clip');
563
- domService.setStyle(div, 'position', 'absolute');
564
- domService.setStyle(div, 'cursor', 'col-resize');
565
- domService.setStyle(div, 'left', `${(cellLeft + cellWidth - handleWidth)}px`);
566
- domService.setStyle(div, 'top', `${cellTop}px`);
567
- domService.setStyle(div, 'width', `${handleWidth}px`);
568
- domService.setStyle(div, 'height', `${cellHeight}px`);
569
- domService.appendChild(parent, div);
570
- }
571
- sum(arr) {
572
- return arr.reduce((a, b) => a + b, 0);
573
- }
574
- }
575
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNjb3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90YWJsZS9zcmMvbGliL3RhYmxlL3JlbmRlci1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBYXJDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUcvQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDMUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBS3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBRXJGLE1BQU0sT0FBTyxXQUFZLFNBQVEsUUFBUTtJQStCdkMsWUFDRSxXQUEyQixFQUMzQixVQUF3QixFQUN4QixHQUEwQixFQUMxQixZQUE0QjtRQUU1QixLQUFLLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFoQzFDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFFVCxxQkFBZ0IsR0FJL0I7WUFDRixNQUFNLEVBQUUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFFO1lBQ1IsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBQ1EsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGNBQVMsR0FBcUIsRUFBRSxDQUFDO1FBRWpDLHlCQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFCLDhCQUF5QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBY3ZDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRTtZQUN4QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxD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LEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3RELFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLEdBQUcsQ0FBQyxHQUFhO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFbGVTY29wZX0gZnJvbSBcIi4vZWxlLXNjb3BlXCI7XG5pbXBvcnQge1RhYmxlTW9kZWxJZn0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL3RhYmxlLW1vZGVsLmlmXCI7XG5pbXBvcnQge0NvbnZlbmllbmNlRG9tU2VydmljZX0gZnJvbSBcIi4vc2VydmljZS9jb252ZW5pZW5jZS1kb20uc2VydmljZVwiO1xuaW1wb3J0IHtUYWJsZU9wdGlvbnNJZn0gZnJvbSBcIi4vZGF0YS9vcHRpb25zL3RhYmxlLW9wdGlvbnMuaWZcIjtcbmltcG9ydCB7Q2VsbFJhbmdlfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9jZWxsLXJhbmdlXCI7XG5pbXBvcnQge1JlbmRlcmVyQ2xlYW51cEZuVHlwZX0gZnJvbSBcIi4vcmVuZGVyZXIvcmVuZGVyZXItY2xlYW51cC1mbi50eXBlXCI7XG5pbXBvcnQge0FyZWFJZGVudH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL2FyZWEtaWRlbnQudHlwZVwiO1xuaW1wb3J0IHtTaWRlSWRlbnR9IGZyb20gXCIuL2RhdGEvc2lkZS1pZGVudC50eXBlXCI7XG5pbXBvcnQge0RpdlNjb3BlfSBmcm9tIFwiLi9kYXRhL2Rpdi1zY29wZS50eXBlXCI7XG5pbXBvcnQge0FyZWFNb2RlbElmfSBmcm9tIFwiLi9kYXRhL3RhYmxlbW9kZWwvYXJlYW1vZGVsL2FyZWEtbW9kZWwuaWZcIjtcbmltcG9ydCB7QXJnc0FkanVzdENvbHVtbnNUb1Jvd1BhcmVudFBhcmFtc30gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1hZGp1c3QtY29sdW1ucy10by1yb3ctcGFyZW50LXBhcmFtc1wiO1xuaW1wb3J0IHtBcmdzUmVuZGVyQ2VsbERpdn0gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1yZW5kZXItY2VsbC1kaXZcIjtcbmltcG9ydCB7VHJlZUFycm93VHlwZX0gZnJvbSBcIi4vZGF0YS9jb21tb24vdHJlZS1hcnJvdy50eXBlXCI7XG5pbXBvcnQge1RyZWVSb3d9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtcm93XCI7XG5pbXBvcnQge1N0b3JlU3RhdGVTY3JvbGxQb3NTZXJ2aWNlfSBmcm9tIFwiLi9zZXJ2aWNlL3N0b3JlLXN0YXRlLXNjcm9sbC1wb3Muc2VydmljZVwiO1xuaW1wb3J0IHtHZU1vdXNlRXZlbnR9IGZyb20gXCIuL2RhdGEvY29tbW9uL2V2ZW50L2dlLW1vdXNlLWV2ZW50XCI7XG5pbXBvcnQge0FyZWFNb2RlbFRyZWV9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvYXJlYS1tb2RlbC10cmVlXCI7XG5pbXBvcnQge0dlb0RhdGF9IGZyb20gXCIuL2RhdGEvZ2VvLWRhdGFcIjtcbmltcG9ydCB7Q2VsbFJlbmRlcmVySWZ9IGZyb20gXCIuL3JlbmRlcmVyL2NlbGwtcmVuZGVyLmlmXCI7XG5pbXBvcnQge1NlbGVjdGlvbk1vZGVsSWZ9IGZyb20gXCIuL3NlbGVjdGlvbi9zZWxlY3Rpb24tbW9kZWwuaWZcIjtcbmltcG9ydCB7R2V0VH0gZnJvbSBcIi4vZGF0YS9jb21tb24vZ2V0LXRcIjtcbmltcG9ydCB7Rm9jdXNNb2RlbElmfSBmcm9tIFwiLi9mb2N1cy9mb2N1cy1tb2RlbC5pZlwiO1xuaW1wb3J0IHtDb2xBbmRSb3dzcGFuTW9kZWx9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvY29sLWFuZC1yb3dzcGFuLW1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJTY29wZSBleHRlbmRzIEVsZVNjb3BlIHtcblxuICBwcm90ZWN0ZWQgc3RvcmVTY3JvbGxQb3NTdGF0ZVNlcnZpY2U/OiBTdG9yZVN0YXRlU2Nyb2xsUG9zU2VydmljZTtcbiAgcHJvdGVjdGVkIGdldFNlbGVjdGlvbk1vZGVsPzogR2V0VDxTZWxlY3Rpb25Nb2RlbElmPjtcbiAgcHJvdGVjdGVkIGdldEZvY3VzTW9kZWw/OiBHZXRUPEZvY3VzTW9kZWxJZj47IC8vIFRPRE8gdXNlIGl0IVxuICBwcm90ZWN0ZWQgc2Nyb2xsTGVmdCA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3cG9ydExlZnQgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsRmFjdG9yWSA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxGYWN0b3JYID0gMDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xlYW51cEZ1bmN0aW9uczoge1xuICAgIGhlYWRlcjogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgICBib2R5OiAoUmVuZGVyZXJDbGVhbnVwRm5UeXBlKVtdLFxuICAgIGZvb3RlcjogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgfSA9IHtcbiAgICBoZWFkZXI6IFtdLFxuICAgIGJvZHk6IFtdLFxuICAgIGZvb3RlcjogW10sXG4gIH07XG4gIHByb3RlY3RlZCB0cmVlID0gZmFsc2U7XG4gIHByb3RlY3RlZCByYW5nZUVsZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbEFuZFJvd3NwYW5Nb2RlbD86IENvbEFuZFJvd3NwYW5Nb2RlbDtcbiAgcHJvdGVjdGVkIGZpcnN0VmlzaWJsZVJvd0luZGV4ID0gLTE7XG5cbiAgcHJvdGVjdGVkIGRyYWdnaW5nVGFyZ2V0Q29sdW1uSW5kZXggPSAtMTtcblxuICBwcml2YXRlIGRlYm91bmNlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcbiAgcHJpdmF0ZSBlZGl0b3JSZW5kZXJlcj86IENlbGxSZW5kZXJlcklmO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyQ29sdW1uPzogbnVtYmVyO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyUm93PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICB0YWJsZU1vZGVsOiBUYWJsZU1vZGVsSWYsXG4gICAgZG9tOiBDb252ZW5pZW5jZURvbVNlcnZpY2UsXG4gICAgdGFibGVPcHRpb25zOiBUYWJsZU9wdGlvbnNJZlxuICApIHtcbiAgICBzdXBlcihob3N0RWxlbWVudCwgdGFibGVNb2RlbCwgZG9tLCB0YWJsZU9wdGlvbnMpO1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucz8uZ2V0U2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zPy5nZXRGb2N1c01vZGVsKSB7XG4gICAgICB0aGlzLmdldEZvY3VzTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRGb2N1c01vZGVsO1xuICAgIH1cbiAgICBpZiAodGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoJ2JvZHknKSBpbnN0YW5jZW9mIEFyZWFNb2RlbFRyZWUpIHtcbiAgICAgIHRoaXMudHJlZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsID0gbmV3IENvbEFuZFJvd3NwYW5Nb2RlbCh0YWJsZU1vZGVsLCB0YWJsZU1vZGVsLmdldEJvZHlNb2RlbCgpKTtcbiAgICB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbC5pbml0KCk7XG4gIH1cblxuICByZXNldEVkaXRvclJlbmRlcmVyKCkge1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSAtMTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBzbSA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHNtPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRSZW5kZXJFZGl0b3Iocm93SWR4OiBudW1iZXIsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgbGV0IHJuRm4gPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGNvbElkeCk/LmdldEVkaXRSZW5kZXJlcjtcbiAgICBpZiAoIXJuRm4pIHtcbiAgICAgIHJuRm4gPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRFZGl0UmVuZGVyZXI7XG4gICAgfVxuICAgIGlmIChybkZuKSB7XG4gICAgICB0aGlzLmVkaXRvclJlbmRlcmVyID0gcm5Gbihyb3dJZHgsIGNvbElkeCk7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRvclJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSByb3dJZHg7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSBjb2xJZHg7XG4gICAgICAgIHRoaXMucmVwYWludCgpO1xuICAgICAgICAvLyByZXF1ZXN0IGZvY3VzOlxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dC5nZS10YWJsZS1jZWxsLWVkaXRvci1pbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgICAgICB0aGlzLmVkaXRvclJlbmRlcmVyQ29sdW1uID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVwYWludCgpIHtcbiAgICB0aGlzLmFkanVzdEFmdGVyU2Nyb2xsaW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBhZGp1c3RBZnRlclNjcm9sbGluZygpIHtcbiAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG5cbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmRlYm91bmNlKHRoaXMuY2hlY2tGb3JTY3JvbGxQb3NTYXZpbmcuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB0aGlzLnNjcm9sbFRvcCAvICh0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbEhlaWdodCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnNjcm9sbEZhY3RvclggPSB0aGlzLnNjcm9sbExlZnQgLyAodGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxXaWR0aCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50V2lkdGgpO1xuXG4gICAgaWYgKGlzTmFOKHRoaXMuc2Nyb2xsRmFjdG9yWSkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDA7XG4gICAgfVxuICAgIGlmIChpc05hTih0aGlzLnNjcm9sbEZhY3RvclgpKSB7XG4gICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAwO1xuICAgIH1cblxuICAgIHRoaXMuYWRqdXN0Qm9keSgpO1xuICAgIHRoaXMuYWRqdXN0QXJlYSgnZm9vdGVyJyk7XG4gICAgdGhpcy5hZGp1c3RBcmVhKCdoZWFkZXInKTtcbiAgfVxuXG4gIGNoZWNrRm9yU2Nyb2xsUG9zU2F2aW5nKCkge1xuICAgIGlmICh0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlXG4gICAgICAmJiB0aGlzLnRhYmxlT3B0aW9ucz8uYXV0b1Jlc3RvcmVPcHRpb25zPy5hdXRvUmVzdG9yZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlLnVwZGF0ZVNjcm9sbE9mZnNldChbdGhpcy5zY3JvbGxMZWZ0LCB0aGlzLnNjcm9sbFRvcF0pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGdldEFyZWFBbmRTaWRlSWRlbnRCeUF0dHIoc3JjRWxlbWVudDogSFRNTEVsZW1lbnQpOiBbQXJlYUlkZW50IHwgdW5kZWZpbmVkLCBTaWRlSWRlbnQgfCB1bmRlZmluZWRdIHtcbiAgICBpZiAoc3JjRWxlbWVudCkge1xuICAgICAgY29uc3QgZGF0YUFyZWEgPSBzcmNFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1hcmVhJyk7XG4gICAgICBjb25zdCBkYXRhU2lkZSA9IHNyY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNpZGUnKTtcbiAgICAgIGlmIChkYXRhU2lkZSAmJiBkYXRhQXJlYSkge1xuICAgICAgICByZXR1cm4gW2RhdGFBcmVhLCBkYXRhU2lkZV0gYXMgW0FyZWFJZGVudCwgU2lkZUlkZW50XTtcbiAgICAgIH1cbiAgICAgIGlmIChzcmNFbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXJlYUFuZFNpZGVJZGVudEJ5QXR0cihzcmNFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmVhKHJvd0lkZW50OiBBcmVhSWRlbnQsIHNpZGVJZGVudDogU2lkZUlkZW50KTogRGl2U2NvcGUge1xuICAgIGlmIChyb3dJZGVudCA9PT0gJ2hlYWRlcicpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICd3ZXN0JykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlcldlc3Q7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnY2VudGVyJykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdlYXN0JykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gJ2JvZHknKSB7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnd2VzdCcpIHJldHVybiB0aGlzLmFyZWFCb2R5V2VzdDtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdjZW50ZXInKSByZXR1cm4gdGhpcy5hcmVhQm9keUNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdlYXN0JykgcmV0dXJuIHRoaXMuYXJlYUJvZHlFYXN0O1xuICAgIH0gZWxzZSBpZiAocm93SWRlbnQgPT09ICdmb290ZXInKSB7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnd2VzdCcpIHJldHVybiB0aGlzLmFyZWFGb290ZXJXZXN0O1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gJ2NlbnRlcicpIHJldHVybiB0aGlzLmFyZWFGb290ZXJDZW50ZXI7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnZWFzdCcpIHJldHVybiB0aGlzLmFyZWFGb290ZXJFYXN0O1xuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgV3JvbmcgYXJlYSBpZGVudGlmaWVyOiByb3c6JHtyb3dJZGVudH0sIGNvbDoke3NpZGVJZGVudH1gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RCb2R5KCkge1xuICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZUb3BGMSA9IHRoaXMuYXJlYUJvZHlDZW50ZXJHZW8uaGVpZ2h0IC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRIZWlnaHRJblBpeGVsKCk7XG4gICAgY29uc3QgdmlydHVhbFJvd0RpdlRvcCA9IHRoaXMuc2Nyb2xsRmFjdG9yWSAqIHZpcnR1YWxSb3dEaXZUb3BGMTtcblxuICAgIHRoaXMuZG9tLnNldFN0eWxlKHRoaXMuY29udGVudERpdiwgJ3RvcCcsIGAke3RoaXMuc2Nyb2xsVG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUodGhpcy5jb250ZW50RGl2LCAnbGVmdCcsIGAke3RoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdH1weGApO1xuXG4gICAgdGhpcy5hZGp1c3RBcmVhKCdib2R5JywgdmlydHVhbFJvd0RpdlRvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TnVtYmVyQnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBzcmNFbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWdlLWFjdGlvbl0nKT8uZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICBpZiAoYXR0cikgcmV0dXJuIE51bWJlcihhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgbW91c2VFdmVudD86IEdlTW91c2VFdmVudDtcblxuICBwcm90ZWN0ZWQgYWRqdXN0QXJlYShhcmVhSWRlbnQ6IEFyZWFJZGVudCwgeVN0YXJ0OiBudW1iZXIgPSAwKSB7XG4gICAgY29uc3Qgd2VzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnd2VzdCcpO1xuICAgIGNvbnN0IGNlbnRlckFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnY2VudGVyJyk7XG4gICAgY29uc3QgZWFzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnZWFzdCcpO1xuICAgIGNvbnN0IGRpdkhlaWdodCA9IGNlbnRlckFyZWEuY2hpbGQuY2xpZW50SGVpZ2h0O1xuXG4gICAgd2VzdEFyZWEuY2hpbGQuaW5uZXJUZXh0ID0gJyc7XG4gICAgY2VudGVyQXJlYS5jaGlsZC5pbm5lclRleHQgPSAnJztcbiAgICBlYXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSAnJztcblxuICAgIGNvbnN0IGxlZnQgPSAwO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50YWJsZU1vZGVsLmdldFBhZGRpbmcoKTtcbiAgICBjb25zdCBhcmVhTW9kZWwgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCk7XG4gICAgY29uc3Qgcm93Q291bnQgPSBhcmVhTW9kZWwuZ2V0Um93Q291bnQoKTtcbiAgICBjb25zdCBib2R5QXJlYSA9IGFyZWFJZGVudCA9PT0gJ2JvZHknO1xuXG4gICAgd2hpbGUgKHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLmxlbmd0aCkge1xuICAgICAgY29uc3QgZm4gPSB0aGlzLmNsZWFudXBGdW5jdGlvbnNbYXJlYUlkZW50XS5zaGlmdCgpO1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCB5ID0geVN0YXJ0O1xuICAgIGxldCBmaXJzdFZpc2libGVSb3cgPSB0cnVlO1xuICAgIGxldCBsYXN0VmlzaWJsZVJvd0luZGV4ID0gLTE7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93Q291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRvcCA9IHk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Um93SGVpZ2h0KGFyZWFJZGVudCwgaW5kZXgpO1xuXG4gICAgICBpZiAodG9wICsgaGVpZ2h0ID4gMCkge1xuICAgICAgICAvLyBWaXNpYmxlIVxuICAgICAgICB0aGlzLmZpcnN0VmlzaWJsZVJvd0luZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgLy8gY2VudGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgbGV0IGdlbyA9IHtsZWZ0LCB3aWR0aCwgaGVpZ2h0LCB0b3AsIGluZGV4fTtcbiAgICAgICAgbGV0IHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihjZW50ZXJBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5Db3VudCgpO1xuICAgICAgICBjb25zdCBjZW50ZXJTdGFydENvbCA9IHRoaXMudGFibGVNb2RlbC5nZXRGaXhlZExlZnRDb2x1bW5Db3VudCgpO1xuICAgICAgICBjb25zdCBmaXhlZFJpZ2h0Q29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Rml4ZWRSaWdodENvbHVtbkNvdW50KCk7XG5cbiAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zVG9Sb3dQYXJlbnQoe1xuICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICBzaWRlSWRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICBnZW8sXG4gICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNlbnRlclN0YXJ0Q29sLFxuICAgICAgICAgIGNvbHVtbkluZGV4RW5kOiBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCAtIDEsXG4gICAgICAgICAgdmVydGljYWxGaXhlZDogZmFsc2UsXG4gICAgICAgICAgZmlyc3RWaXNpYmxlUm93XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHdlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5sZWZ0ID4gMCkge1xuICAgICAgICAgIGdlbyA9IHtsZWZ0LCB3aWR0aDogdGhpcy5hcmVhQm9keVdlc3RHZW8ud2lkdGgsIGhlaWdodCwgdG9wLCBpbmRleH07XG4gICAgICAgICAgcm93RGl2ID0gdGhpcy5kb20uYWRkUm93RGl2KHdlc3RBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICAgIHNpZGVJZGVudDogJ3dlc3QnLFxuICAgICAgICAgICAgYXJlYU1vZGVsLFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgICByb3dJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW5JbmRleFN0YXJ0OiAwLFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNlbnRlclN0YXJ0Q29sIC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWUsXG4gICAgICAgICAgICBmaXJzdFZpc2libGVSb3dcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVhc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5yaWdodCA+IDApIHtcbiAgICAgICAgICBnZW8gPSB7bGVmdCwgd2lkdGg6IHRoaXMuYXJlYUJvZHlFYXN0R2VvLndpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXh9O1xuICAgICAgICAgIHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihlYXN0QXJlYSwgZ2VvLCBpbmRleCwgYXJlYUlkZW50KTtcbiAgICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNUb1Jvd1BhcmVudCh7XG4gICAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgICBzaWRlSWRlbnQ6ICdlYXN0JyxcbiAgICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICAgIGdlbyxcbiAgICAgICAgICAgIHBhcmVudDogcm93RGl2LFxuICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgY29sdW1uSW5kZXhTdGFydDogY29sdW1uQ291bnQgLSBmaXhlZFJpZ2h0Q29sdW1uQ291bnQsXG4gICAgICAgICAgICBjb2x1bW5JbmRleEVuZDogY29sdW1uQ291bnQgLSAxLFxuICAgICAgICAgICAgdmVydGljYWxGaXhlZDogdHJ1ZSxcbiAgICAgICAgICAgIGZpcnN0VmlzaWJsZVJvd1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpcnN0VmlzaWJsZVJvdyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNvbGxhcHNlIC8gZXhwYW5kIGFsbDpcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gJ2hlYWRlcicgJiYgdGhpcy50cmVlICYmIGluZGV4ID09PSByb3dDb3VudCAtIDEpIHtcbiAgICAgICAgICBjb25zdCBkaXYgPVxuICAgICAgICAgICAgdGhpcy5kb20uYXBwbHlTdHlsZShcbiAgICAgICAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFkZERpdihyb3dEaXYsIG5ldyBHZW9EYXRhKDE2LCAyMCwgMjAsIDgpKSxcbiAgICAgICAgICAgICAgICAnZGF0YS1nZS1hY3Rpb24nLCAndG9nZ2xlRXhwYW5kQ29sbGFwc2VBbGwnXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHsnY3Vyc29yJzogJ3BvaW50ZXInfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0cmVlT3B0aW9uc0Fycm93ID0gdGhpcy50YWJsZU9wdGlvbnMudHJlZU9wdGlvbnMuYXJyb3dFeHBhbmRDb2xsYXBzZUFsbDtcbiAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLmRvbS5kb21TZXJ2aWNlLmNyZWF0ZVRleHQodHJlZU9wdGlvbnNBcnJvdy5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQoZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdy5zdHlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlU3RyaW5nKGRpdiwgdHJlZU9wdGlvbnNBcnJvdy5zdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHkgPSB5ICsgaGVpZ2h0O1xuICAgICAgbGFzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKHkgPiBkaXZIZWlnaHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBmb3JcblxuICAgIC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRyYXcgdGhlIGJpZyBjb2wgYW5kIHJvd3NwYW4gY2VsbHMgYXQgdGhlIGVuZC5cbiAgICAvLyBUaGlzIGZpeGVzIHRoZSAnaGFsZiBjdXR0ZWQgYmlnIGNlbGwnIHByb2JsZW06XG4gICAgaWYgKGJvZHlBcmVhKSB7XG4gICAgICAvLyBkcmF3IGNvbC9yb3dzcGFuIGNlbGxzIGFnYWluOlxuICAgICAgY29uc3QgcmFuZ2VzID0gdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWw/LmdldFJhbmdlcygpID8/IFtdO1xuICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlydHVhbFJvd0RpdkxlZnRGMSA9ICh0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLndpZHRoKSAtIHRoaXMudGFibGVNb2RlbC5nZXRDb250ZW50V2lkdGhJblBpeGVsKCk7XG4gICAgICAgIGNvbnN0IHhTdGFydCA9IHRoaXMuc2Nyb2xsRmFjdG9yWCAqIHZpcnR1YWxSb3dEaXZMZWZ0RjE7XG5cbiAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgICB0aGlzLmRyYXdCaWdDZWxsKHJhbmdlLCB4U3RhcnQsIHlTdGFydCwgYXJlYU1vZGVsLCBjZW50ZXJBcmVhLmNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiAoIHRoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleD4tMSl7XG4gICAgLy8gICAvLyB3ZSB3aWxsIHJlbmRlciBhIGZseWluZyBkcmFnZ2luZyBjb2x1bW46XG4gICAgLy8gICBjb25zdCBkb21TZXJ2aWNlID0gdGhpcy5kb20uZG9tU2VydmljZTtcbiAgICAvLyAgIC8vZm9yIChsZXQgaW5kZXggPSB0aGlzLmZpcnN0VmlzaWJsZVJvd0luZGV4OyBpbmRleCA8PSBsYXN0VmlzaWJsZVJvd0luZGV4OyBpbmRleCsrKSB7XG4gICAgLy8gICAgIGNvbnN0IGRpdiA9IHRoaXMuZG9tLmRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oJ2RpdicpO1xuICAgIC8vICAgICBjb25zdCB3ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKHRoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleCk7XG4gICAgLy8gICAgIGNvbnN0IGggPSB0aGlzLmNvbnRlbnREaXYuY2xpZW50SGVpZ2h0O1xuICAgIC8vICAgICBsZXQgbGVmdCA9IHRoaXMubW91c2VFdmVudD8ub3JpZ2luYWxFdmVudD8ueCA/PyAwO1xuICAgIC8vXG4gICAgLy8gICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCAnZ2UtdGFibGUtZHJhZ2dlZC1jb2wtZGl2Jyk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCBgZ2UtdGFibGUtY29sLWRpdi0ke3RoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleH1gKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1jb2wtaW5kZXgnLCBgJHt0aGlzLmRyYWdnaW5nVGFyZ2V0Q29sdW1uSW5kZXh9YCk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnZGlzcGxheScsICdjbGlwJyk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnb3BhY2l0eScsICcwLjUnKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7MH1weGApO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ3dpZHRoJywgYCR7d31weGApO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2h9cHhgKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnREaXYsIGRpdik7XG4gICAgLy8gICAvL31cbiAgICAvLyB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYmlnIGNlbGxzIChyb3dzcGFuIGFuZCBvciBjb2xzcGFuKSBpbiBib2R5L2NlbnRlclxuICAgKiBAcGFyYW0gcmFuZ2VcbiAgICogQHBhcmFtIHlTdGFydFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJhd0JpZ0NlbGwocmFuZ2U6IENlbGxSYW5nZSwgeFN0YXJ0OiBudW1iZXIsIHlTdGFydDogbnVtYmVyLCBhcmVhTW9kZWw6IEFyZWFNb2RlbElmLCBwYXJlbnREaXY6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgY29uc3QgeTEgPSB5U3RhcnQgKyB0aGlzLmdldFJvd0hlaWdodHMoMCwgcmFuZ2UucjEgLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgIGNvbnN0IHgxID0geFN0YXJ0ICsgdGhpcy5nZXRDb2x1bW5XaWR0aHMoMCwgcmFuZ2UuYzEgLSAxKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBoID0gdGhpcy5nZXRSb3dIZWlnaHRzKHJhbmdlLnIxLCByYW5nZS5yMiwgYXJlYU1vZGVsKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCB3ID0gdGhpcy5nZXRDb2x1bW5XaWR0aHMocmFuZ2UuYzEsIHJhbmdlLmMyKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGxldCBjZWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPyB0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJhbmdlLnIxLCByYW5nZS5jMSk7XG4gICAgICBjZWxsU2VsZWN0ZWQgPSBjb3VudCA+IDA7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyQ2VsbChhcmVhTW9kZWwsICdib2R5JywgcmFuZ2UucjEsIHJhbmdlLmMxLCB4MSwgeTEsIHcsIGgsIHBhcmVudERpdiwgY2VsbFNlbGVjdGVkKTtcbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGZpbmRSb3dPZkltcG9ydGFudFJvd3NwYW5DZWxsKGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heFJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0TWF4Um93c3BhbigpO1xuICAgIGZvciAobGV0IHIgPSByb3dJbmRleCAtIDE7IHIgPiAtMTsgci0tKSB7XG4gICAgICBjb25zdCByb3dzcGFuID0gYXJlYU1vZGVsLmdldFJvd3NwYW5BdChyLCBjb2xJbmRleCk7XG4gICAgICBpZiAocm93c3BhbiA+IDEgJiYgciArIHJvd3NwYW4gKyAxID49IHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgaWYgKHJvd0luZGV4IC0gciA+IG1heFJvd3NwYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KFxuICAgIHtcbiAgICAgIGFyZWFJZGVudCxcbiAgICAgIHNpZGVJZGVudCxcbiAgICAgIGFyZWFNb2RlbCxcbiAgICAgIGdlbyxcbiAgICAgIHBhcmVudCxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgY29sdW1uSW5kZXhTdGFydCxcbiAgICAgIGNvbHVtbkluZGV4RW5kLFxuICAgICAgdmVydGljYWxGaXhlZCA9IGZhbHNlLFxuICAgICAgZmlyc3RWaXNpYmxlUm93ID0gZmFsc2VcbiAgICB9OiBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zLFxuICApOiB2b2lkIHtcblxuICAgIHRoaXMuc2Nyb2xsVmlld3BvcnRMZWZ0ID0gdGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxMZWZ0O1xuICAgIGxldCB2aXJ0dWFsUm93RGl2TGVmdCA9IDA7XG4gICAgaWYgKCF2ZXJ0aWNhbEZpeGVkKSB7XG4gICAgICBjb25zdCB2aXJ0dWFsUm93RGl2TGVmdEYxID0gKHRoaXMuYXJlYUJvZHlDZW50ZXJHZW8ud2lkdGgpIC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRXaWR0aEluUGl4ZWwoKTtcbiAgICAgIHZpcnR1YWxSb3dEaXZMZWZ0ID0gdGhpcy5zY3JvbGxGYWN0b3JYICogdmlydHVhbFJvd0RpdkxlZnRGMTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3AgPSAwO1xuICAgIC8vIGNvbnN0IHRyYWNrQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoID09PSAwICYmIGFyZWFJZGVudCA9PT0gJ2JvZHknICYmIHNpZGVJZGVudCA9PT0gJ2NlbnRlcic7XG4gICAgY29uc3QgcmVuZGVyU2VsZWN0aW9uID0gKGFyZWFJZGVudCA9PT0gJ2JvZHknKTtcblxuICAgIGxldCB4ID0gdmlydHVhbFJvd0RpdkxlZnQ7XG4gICAgZm9yIChsZXQgaW5kZXggPSBjb2x1bW5JbmRleFN0YXJ0OyBpbmRleCA8PSBjb2x1bW5JbmRleEVuZDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgbGVmdCA9IHg7XG4gICAgICBjb25zdCB3ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKGluZGV4KTtcbiAgICAgIGlmIChsZWZ0ICsgdyA+IDApIHtcbiAgICAgICAgLy8gVmlzaWJsZSEgUmVuZGVyIGNlbGwgZGl2OlxuXG4gICAgICAgIC8vIGNhbGMgaGVpZ2h0OlxuICAgICAgICBsZXQgaGVpZ2h0ID0gZ2VvLmhlaWdodDtcbiAgICAgICAgbGV0IHJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0Um93c3BhbkF0KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgIGxldCBjb2xzcGFuID0gYXJlYU1vZGVsLmdldENvbHNwYW5BdChyb3dJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgIGlmIChyb3dzcGFuID4gMSkge1xuICAgICAgICAgIGhlaWdodCA9IHRoaXMuZ2V0Um93SGVpZ2h0cyhyb3dJbmRleCwgcm93SW5kZXggKyByb3dzcGFuIC0gMSwgYXJlYU1vZGVsKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB3aWR0aCA9IHc7XG4gICAgICAgIGlmIChjb2xzcGFuID4gMSkge1xuICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aHMoaW5kZXgsIGluZGV4ICsgY29sc3BhbiAtIDEpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNraXAgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gJ2JvZHknKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsPy5pc0luUmFuZ2Uocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICAgICAgc2tpcCA9IHRydWU7IC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRvbid0IHdhbnQgdG8gdG8gcmVuZGVyIHRoZSBzbWFsbCBzaW5nbGUgY2VsbHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID09PSBpbmRleCAmJiBhcmVhSWRlbnQgIT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZW5kZXJEcmFnVGFyZ2V0RGl2KHBhcmVudCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLmRvbS5hZGRDb2x1bW5Cb3JkZXJEaXZzKHBhcmVudCwge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGNlbGxTZWxlY3RlZCA9IHRoaXMucmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXAsIHJlbmRlclNlbGVjdGlvbiwgYXJlYU1vZGVsLCByb3dJbmRleCwgaW5kZXgsIHBhcmVudCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgIGlmICghc2tpcCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDZWxsKGFyZWFNb2RlbCwgYXJlYUlkZW50LCByb3dJbmRleCwgaW5kZXgsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcGFyZW50LCBjZWxsU2VsZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJlYUlkZW50ID09PSAnaGVhZGVyJyAmJiB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5zUmVzaXphYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckhlYWRlckNlbGxSZXNpemVIYW5kbGUocm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHggPSB4ICsgdztcbiAgICAgIGlmICh4ID4gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTogMCB8IDEge1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy5zaG93Q2hlY2tib3hXaWhvdXRFeHRyYUNvbHVtbikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlTW9kZWwuaXNSb3dDaGVja2JveFZpc2libGUoKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEFuZFJlbmRlckNlbGxEaXYoXG4gICAge1xuICAgICAgYXJlYU1vZGVsLFxuICAgICAgYXJlYUlkZW50LFxuICAgICAgcm93SW5kZXgsXG4gICAgICBpbmRleCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRvcCxcbiAgICAgIHBhcmVudFxuICAgIH06IEFyZ3NSZW5kZXJDZWxsRGl2KTogW0hUTUxEaXZFbGVtZW50LCBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWRdIHtcblxuXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZW5kZXJlciAmJiB0aGlzLmVkaXRvclJlbmRlcmVyUm93ID09PSByb3dJbmRleCAmJiB0aGlzLmVkaXRvclJlbmRlcmVyQ29sdW1uID09PSBpbmRleDtcbiAgICBjb25zdCBjZWxsUmVuZGVyZXIgPSAoZWRpdG9yKSA/IHRoaXMuZWRpdG9yUmVuZGVyZXIgOiBhcmVhTW9kZWwuZ2V0Q2VsbFJlbmRlcmVyKHJvd0luZGV4LCBpbmRleCk7XG4gICAgY29uc3QgZ2VvID0ge2xlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXh9O1xuICAgIGNvbnN0IHJvd09iamVjdCA9IGFyZWFNb2RlbC5nZXRSb3dCeUluZGV4KHJvd0luZGV4KTtcbiAgICBsZXQgdHJlZUFycm93OiBUcmVlQXJyb3dUeXBlID0gJ25vbmUnO1xuXG4gICAgY29uc3QgYXJyb3dJbmRleE9rID0gaW5kZXggPT09IHRoaXMuZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTtcblxuICAgIGlmIChhcnJvd0luZGV4T2sgJiYgcm93T2JqZWN0IGluc3RhbmNlb2YgVHJlZVJvdykge1xuICAgICAgY29uc3QgdHIgPSByb3dPYmplY3QgYXMgVHJlZVJvdzxhbnk+O1xuICAgICAgaWYgKHRyLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRyLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdHJlZUFycm93ID0gJ2V4cGFuZGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmVlQXJyb3cgPSAnY29sbGFwc2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJlZUFycm93ID0gJ2hpZGRlbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNvcnRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJlYUlkZW50ID09PSAnaGVhZGVyJykge1xuICAgICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbkRlZihpbmRleCk7XG4gICAgICBpZiAoIWNvbHVtbkRlZj8uc29ydEljb25WaXNpYmxlIHx8IGNvbHVtbkRlZj8uc29ydEljb25WaXNpYmxlKCkpIHtcbiAgICAgICAgc29ydFN0YXRlID0gY29sdW1uRGVmPy5zb3J0U3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gYXJlYU1vZGVsLmdldFZhbHVlQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBjb25zdCB0ZXh0ID0gY2VsbFJlbmRlcmVyID8gJycgOiBgJHt2YWx9YDtcbiAgICBjb25zdCBjaGVja2VkVHlwZSA9IGFyZWFNb2RlbC5pc1Jvd0NoZWNrZWQocm93SW5kZXgpO1xuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmRvbS5hZGRDb2x1bW5EaXYocGFyZW50LCBnZW8sIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCB0ZXh0LCB0cmVlQXJyb3csIHRoaXMudGFibGVPcHRpb25zLCBjaGVja2VkVHlwZSwgc29ydFN0YXRlKTtcblxuICAgIGNvbnN0IHRvb2x0aXAgPSBhcmVhTW9kZWwuZ2V0VG9vbHRpcEF0KHJvd0luZGV4LCBpbmRleCk7XG4gICAgaWYgKHRvb2x0aXApIHtcbiAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShjZWxsLCAndGl0bGUnLCB0b29sdGlwKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICBpZiAoY29sdW1uRGVmICYmIGNvbHVtbkRlZi5jbGFzc2VzW2FyZWFJZGVudF0pIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY29sdW1uRGVmLmNsYXNzZXNbYXJlYUlkZW50XSwgY2VsbCk7XG4gICAgfVxuXG4gICAgbGV0IGZuOiBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgZm4gPSBjZWxsUmVuZGVyZXIucmVuZGVyKGNlbGwsIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCBhcmVhTW9kZWwsIHZhbCwgdGhpcy5kb20uZG9tU2VydmljZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGFyZWFNb2RlbC5nZXRDdXN0b21DbGFzc2VzQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY2xhc3NlcywgY2VsbCk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCBnZW8pO1xuICAgIGlmICh0aGlzLmdldEZvY3VzTW9kZWwgJiYgYXJlYUlkZW50ID09PSAnYm9keScpIHtcbiAgICAgIGNvbnN0IGZtID0gdGhpcy5nZXRGb2N1c01vZGVsKCk7XG4gICAgICBpZiAoZm0/Lmhhc0ZvY3VzKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgICAgdGhpcy5kb20uYWRkRm9jdXNCb3JkZXJEaXZzKHBhcmVudCwgZ2VvLCB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcmVhSWRlbnQgPT09ICdoZWFkZXInKSB7XG4gICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoY2VsbCwgJ2RhdGEtZ2UtYWN0aW9uJywgJ2RyYWctY29sdW1uJyk7XG4gICAgfVxuICAgIHJldHVybiBbY2VsbCwgZm5dO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbHVtbldpZHRocyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIHJldC5wdXNoKHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5XaWR0aChpKSlcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dIZWlnaHRzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2goYXJlYU1vZGVsLmdldFJvd0hlaWdodChpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0SG92ZXJSb3dzKG1vdXNlTW92ZUV2ZW50OiBHZU1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMuaG92ZXJSb3dWaXNpYmxlICYmIG1vdXNlTW92ZUV2ZW50LnJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoJ2JvZHknKS5nZXRSb3dIZWlnaHQobW91c2VNb3ZlRXZlbnQucm93SW5kZXgpO1xuICAgICAgY29uc3QgdG9wID0gbW91c2VNb3ZlRXZlbnQucm93VG9wICsgdGhpcy5hcmVhSGVhZGVyQ2VudGVyLnBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJSb3csIHtcbiAgICAgICAgJ2xlZnQnOiAnMCcsXG4gICAgICAgICd0b3AnOiB0b3AgKyAncHgnLFxuICAgICAgICAnd2lkdGgnOiB3aWR0aCArICdweCcsXG4gICAgICAgICdoZWlnaHQnOiByb3dIZWlnaHQgKyAncHgnLFxuICAgICAgICAnZGlzcGxheSc6ICdibG9jaydcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJSb3coKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICAnZGlzcGxheSc6ICdub25lJ1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkanVzdEhvdmVyQ29sdW1ucyhtb3VzZU1vdmVFdmVudDogR2VNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zLmhvdmVyQ29sdW1uVmlzaWJsZSAmJiBtb3VzZU1vdmVFdmVudC5yb3dJbmRleCA+IC0xKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhvc3RFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKG1vdXNlTW92ZUV2ZW50LmNvbHVtbkluZGV4KVxuICAgICAgY29uc3QgbGVmdCA9IG1vdXNlTW92ZUV2ZW50LmNvbHVtbkxlZnQgKyB0aGlzLnRhYmxlTW9kZWwuZ2V0UGFkZGluZygpLmxlZnQ7XG4gICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJDb2x1bW4sIHtcbiAgICAgICAgJ2xlZnQnOiAobGVmdCkgKyAncHgnLFxuICAgICAgICAndG9wJzogJzBweCcsXG4gICAgICAgICd3aWR0aCc6IHdpZHRoICsgJ3B4JyxcbiAgICAgICAgJ2hlaWdodCc6IGhlaWdodCArICdweCcsXG4gICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVIb3ZlckNvbHVtbigpIHtcbiAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJDb2x1bW4sIHtcbiAgICAgICdkaXNwbGF5JzogJ25vbmUnXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVib3VuY2UoZm46IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyID0gMTAwMCkge1xuICAgIGlmICh0aGlzLmRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZuLmJpbmQodGhpcyksIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRHJhZ1RhcmdldERpdihwYXJlbnQ6IEhUTUxEaXZFbGVtZW50LCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IEhUTUxEaXZFbGVtZW50IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLmRvbS5hcHBseVN0eWxlUG9zaXN0aW9uQWJzb2x1dGUoXG4gICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoJ2dlLXRhYmxlLWRyb3Atem9uZScsIHBhcmVudClcbiAgICApO1xuICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xuICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuXG4gIHByaXZhdGUgcmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXA6IGJvb2xlYW4sIHJlbmRlclNlbGVjdGlvbjogYm9vbGVhbiwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZiwgcm93SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBIVE1MRGl2RWxlbWVudCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKCFza2lwICYmIHJlbmRlclNlbGVjdGlvbiAmJiBhcmVhTW9kZWwuaXNTZWxlY3RhYmxlKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsID0gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5kb20uYXBwbHlTdHlsZVBvc2lzdGlvbkFic29sdXRlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoJ2dlLXRhYmxlLXNlbGVjdGVkLXJhbmdlJywgcGFyZW50KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgICAgICAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2VsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDZWxsKFxuICAgIGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsXG4gICAgYXJlYUlkZW50OiBBcmVhSWRlbnQsXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICB0b3A6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHBhcmVudDogSFRNTERpdkVsZW1lbnQsXG4gICAgY2VsbFNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgW2RpdiwgZm5dID0gdGhpcy5hZGRBbmRSZW5kZXJDZWxsRGl2KHtcbiAgICAgIGFyZWFNb2RlbCxcbiAgICAgIGFyZWFJZGVudCxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgaW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgbGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdG9wLFxuICAgICAgcGFyZW50XG4gICAgfSk7XG4gICAgaWYgKGNlbGxTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kb20uYWRkQ2xhc3MoJ2dlLWNlbGwtc2VsZWN0ZWQnLCBkaXYpO1xuICAgIH1cbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLnB1c2goZm4pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSByZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjZWxsTGVmdDogbnVtYmVyLFxuICAgIGNlbGxUb3A6IG51bWJlcixcbiAgICBjZWxsV2lkdGg6IG51bWJlcixcbiAgICBjZWxsSGVpZ2h0OiBudW1iZXIsXG4gICAgcGFyZW50OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgZG9tU2VydmljZSA9IHRoaXMuZG9tLmRvbVNlcnZpY2U7XG4gICAgY29uc3QgaGFuZGxlV2lkdGggPSB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5SZXNpemVIYW5kbGVXaWR0aEluUHggPz8gMztcblxuICAgIGNvbnN0IGRpdiA9IGRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oJ2RpdicpO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgJ2RhdGEtY29sLWluZGV4JywgYCR7Y29sdW1uSW5kZXh9YCk7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1yb3ctaW5kZXgnLCBgJHtyb3dJbmRleH1gKTtcbiAgICBkb21TZXJ2aWNlLnNldEF0dHJpYnV0ZShkaXYsICdkYXRhLWFyZWEnLCAnaGVhZGVyJyk7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1nZS1hY3Rpb24nLCAncmVzaXplLWNvbHVtbicpO1xuICAgIC8vIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgJ2RhdGEtZ2UtYWN0aW9uJywgJ2NvbHVtbi1yZXNpemUnKTtcbiAgICBkb21TZXJ2aWNlLmFkZENsYXNzKGRpdiwgYGdlLXRhYmxlLWNvbC1yZXNpemUtaGFuZGxlYCk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdkaXNwbGF5JywgJ2NsaXAnKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdjdXJzb3InLCAnY29sLXJlc2l6ZScpO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnbGVmdCcsIGAkeyhjZWxsTGVmdCArIGNlbGxXaWR0aCAtIGhhbmRsZVdpZHRoKX1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7Y2VsbFRvcH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnd2lkdGgnLCBgJHtoYW5kbGVXaWR0aH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnaGVpZ2h0JywgYCR7Y2VsbEhlaWdodH1weGApO1xuICAgIGRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQocGFyZW50LCBkaXYpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdW0oYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG59XG5cbiJdfQ==