@igo2/common 18.0.1-next.2 → 18.0.2

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 (312) hide show
  1. package/entity/src/entity-table/entity-table.theming.scss +1 -1
  2. package/esm2022/action/action.module.mjs +19 -0
  3. package/esm2022/action/actionbar/actionbar-item.component.mjs +192 -0
  4. package/esm2022/action/actionbar/actionbar.component.mjs +277 -0
  5. package/esm2022/action/actionbar/actionbar.module.mjs +19 -0
  6. package/esm2022/action/igo2-common-action.mjs +5 -0
  7. package/esm2022/action/public_api.mjs +5 -0
  8. package/esm2022/action/shared/action.enums.mjs +7 -0
  9. package/esm2022/action/shared/action.interfaces.mjs +2 -0
  10. package/esm2022/action/shared/index.mjs +4 -0
  11. package/esm2022/action/shared/store.mjs +8 -0
  12. package/esm2022/backdrop/backdrop.component.mjs +21 -0
  13. package/esm2022/backdrop/backdrop.module.mjs +25 -0
  14. package/esm2022/backdrop/igo2-common-backdrop.mjs +5 -0
  15. package/esm2022/backdrop/public_api.mjs +3 -0
  16. package/esm2022/badge/badge-icon.directive.mjs +149 -0
  17. package/esm2022/badge/badge-icon.module.mjs +25 -0
  18. package/esm2022/badge/igo2-common-badge.mjs +5 -0
  19. package/esm2022/badge/public_api.mjs +3 -0
  20. package/esm2022/clickout/clickout.directive.mjs +32 -0
  21. package/esm2022/clickout/clickout.module.mjs +25 -0
  22. package/esm2022/clickout/igo2-common-clickout.mjs +5 -0
  23. package/esm2022/clickout/public_api.mjs +3 -0
  24. package/esm2022/clone/clone.module.mjs +25 -0
  25. package/esm2022/clone/clone.pipe.mjs +25 -0
  26. package/esm2022/clone/igo2-common-clone.mjs +5 -0
  27. package/esm2022/clone/public_api.mjs +3 -0
  28. package/esm2022/collapsible/collapse.directive.mjs +57 -0
  29. package/esm2022/collapsible/collapsible.component.mjs +38 -0
  30. package/esm2022/collapsible/collapsible.module.mjs +26 -0
  31. package/esm2022/collapsible/igo2-common-collapsible.mjs +5 -0
  32. package/esm2022/collapsible/public_api.mjs +10 -0
  33. package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +104 -0
  34. package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +19 -0
  35. package/esm2022/color/color-picker-form-field/index.mjs +3 -0
  36. package/esm2022/color/igo2-common-color.mjs +5 -0
  37. package/esm2022/color/public_api.mjs +2 -0
  38. package/esm2022/confirm-dialog/confirm-dialog.component.mjs +31 -0
  39. package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +2 -0
  40. package/esm2022/confirm-dialog/confirm-dialog.module.mjs +27 -0
  41. package/esm2022/confirm-dialog/confirm-dialog.service.mjs +35 -0
  42. package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +5 -0
  43. package/esm2022/confirm-dialog/public_api.mjs +5 -0
  44. package/esm2022/context-menu/context-menu.directive.mjs +109 -0
  45. package/esm2022/context-menu/context-menu.module.mjs +26 -0
  46. package/esm2022/context-menu/igo2-common-context-menu.mjs +5 -0
  47. package/esm2022/context-menu/long-press.directive.mjs +65 -0
  48. package/esm2022/context-menu/public_api.mjs +10 -0
  49. package/esm2022/custom-html/custom-html.component.mjs +21 -0
  50. package/esm2022/custom-html/custom-html.module.mjs +25 -0
  51. package/esm2022/custom-html/custom-html.pipe.mjs +23 -0
  52. package/esm2022/custom-html/igo2-common-custom-html.mjs +5 -0
  53. package/esm2022/custom-html/public_api.mjs +10 -0
  54. package/esm2022/dom/dom.interfaces.mjs +2 -0
  55. package/esm2022/dom/dom.module.mjs +27 -0
  56. package/esm2022/dom/dom.service.mjs +35 -0
  57. package/esm2022/dom/igo2-common-dom.mjs +5 -0
  58. package/esm2022/dom/public_api.mjs +4 -0
  59. package/esm2022/drag-drop/drag-drop.directive.mjs +82 -0
  60. package/esm2022/drag-drop/drag-drop.module.mjs +26 -0
  61. package/esm2022/drag-drop/igo2-common-drag-drop.mjs +5 -0
  62. package/esm2022/drag-drop/public_api.mjs +4 -0
  63. package/esm2022/drag-drop/tree-drag-drop/index.mjs +3 -0
  64. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +391 -0
  65. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +2 -0
  66. package/esm2022/dynamic-component/dynamic-component.module.mjs +19 -0
  67. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +129 -0
  68. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +19 -0
  69. package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +5 -0
  70. package/esm2022/dynamic-component/public_api.mjs +5 -0
  71. package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -0
  72. package/esm2022/dynamic-component/shared/dynamic-component.mjs +183 -0
  73. package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +30 -0
  74. package/esm2022/dynamic-component/shared/index.mjs +4 -0
  75. package/esm2022/entity/entity-selector/entity-selector.component.mjs +174 -0
  76. package/esm2022/entity/entity-selector/entity-selector.module.mjs +19 -0
  77. package/esm2022/entity/entity-selector/index.mjs +3 -0
  78. package/esm2022/entity/entity-table/entity-table-row.directive.mjs +138 -0
  79. package/esm2022/entity/entity-table/entity-table.component.mjs +883 -0
  80. package/esm2022/entity/entity-table/entity-table.module.mjs +19 -0
  81. package/esm2022/entity/entity-table/index.mjs +3 -0
  82. package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +158 -0
  83. package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -0
  84. package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +19 -0
  85. package/esm2022/entity/entity-table-paginator/index.mjs +4 -0
  86. package/esm2022/entity/entity.module.mjs +30 -0
  87. package/esm2022/entity/igo2-common-entity.mjs +5 -0
  88. package/esm2022/entity/public_api.mjs +6 -0
  89. package/esm2022/entity/shared/entity.enums.mjs +28 -0
  90. package/esm2022/entity/shared/entity.interfaces.mjs +2 -0
  91. package/esm2022/entity/shared/entity.utils.mjs +73 -0
  92. package/esm2022/entity/shared/index.mjs +10 -0
  93. package/esm2022/entity/shared/state.mjs +194 -0
  94. package/esm2022/entity/shared/store.mjs +322 -0
  95. package/esm2022/entity/shared/strategies/filter-custom-function.mjs +80 -0
  96. package/esm2022/entity/shared/strategies/filter-selection.mjs +81 -0
  97. package/esm2022/entity/shared/strategies/index.mjs +4 -0
  98. package/esm2022/entity/shared/strategies/strategy.mjs +82 -0
  99. package/esm2022/entity/shared/transaction.mjs +329 -0
  100. package/esm2022/entity/shared/view.mjs +330 -0
  101. package/esm2022/entity/shared/watcher.mjs +135 -0
  102. package/esm2022/environment/environment.interface.mjs +2 -0
  103. package/esm2022/environment/igo2-common-environment.mjs +5 -0
  104. package/esm2022/environment/public_api.mjs +2 -0
  105. package/esm2022/flexible/flexible.component.mjs +137 -0
  106. package/esm2022/flexible/flexible.module.mjs +25 -0
  107. package/esm2022/flexible/flexible.type.mjs +2 -0
  108. package/esm2022/flexible/igo2-common-flexible.mjs +5 -0
  109. package/esm2022/flexible/public_api.mjs +4 -0
  110. package/esm2022/form/form/form.component.mjs +105 -0
  111. package/esm2022/form/form/form.module.mjs +19 -0
  112. package/esm2022/form/form/index.mjs +3 -0
  113. package/esm2022/form/form-dialog/form-dialog.component.mjs +94 -0
  114. package/esm2022/form/form-dialog/form-dialog.interface.mjs +2 -0
  115. package/esm2022/form/form-dialog/form-dialog.module.mjs +31 -0
  116. package/esm2022/form/form-dialog/form-dialog.service.mjs +30 -0
  117. package/esm2022/form/form-dialog/index.mjs +5 -0
  118. package/esm2022/form/form-field/form-field-select.component.mjs +117 -0
  119. package/esm2022/form/form-field/form-field-text.component.mjs +126 -0
  120. package/esm2022/form/form-field/form-field-textarea.component.mjs +95 -0
  121. package/esm2022/form/form-field/form-field.component.mjs +65 -0
  122. package/esm2022/form/form-field/form-field.directive.mjs +11 -0
  123. package/esm2022/form/form-field/form-field.module.mjs +23 -0
  124. package/esm2022/form/form-field/index.mjs +7 -0
  125. package/esm2022/form/form-group/form-group.component.mjs +81 -0
  126. package/esm2022/form/form-group/form-group.module.mjs +19 -0
  127. package/esm2022/form/form-group/index.mjs +3 -0
  128. package/esm2022/form/form.module.mjs +32 -0
  129. package/esm2022/form/igo2-common-form.mjs +5 -0
  130. package/esm2022/form/public_api.mjs +7 -0
  131. package/esm2022/form/shared/form-field-component.mjs +7 -0
  132. package/esm2022/form/shared/form-field.service.mjs +28 -0
  133. package/esm2022/form/shared/form.interfaces.mjs +2 -0
  134. package/esm2022/form/shared/form.service.mjs +82 -0
  135. package/esm2022/form/shared/form.utils.mjs +41 -0
  136. package/esm2022/form/shared/index.mjs +6 -0
  137. package/esm2022/home-button/home-button.component.mjs +25 -0
  138. package/esm2022/home-button/home-button.module.mjs +19 -0
  139. package/esm2022/home-button/igo2-common-home-button.mjs +5 -0
  140. package/esm2022/home-button/public_api.mjs +3 -0
  141. package/esm2022/icon/icon/icon.component.mjs +38 -0
  142. package/esm2022/icon/icon.provider.mjs +14 -0
  143. package/esm2022/icon/igo2-common-icon.mjs +5 -0
  144. package/esm2022/icon/public_api.mjs +4 -0
  145. package/esm2022/icon/shared/icon.interface.mjs +2 -0
  146. package/esm2022/icon/shared/icon.service.mjs +26 -0
  147. package/esm2022/icon/shared/icons.mjs +40 -0
  148. package/esm2022/icon/shared/index.mjs +4 -0
  149. package/esm2022/igo2-common.mjs +5 -0
  150. package/esm2022/image/igo2-common-image.mjs +5 -0
  151. package/esm2022/image/image-error.directive.mjs +35 -0
  152. package/esm2022/image/image.module.mjs +26 -0
  153. package/esm2022/image/public_api.mjs +7 -0
  154. package/esm2022/image/secure-image.pipe.mjs +66 -0
  155. package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +5 -0
  156. package/esm2022/interactive-tour/interactive-tour.component.mjs +131 -0
  157. package/esm2022/interactive-tour/interactive-tour.interface.mjs +2 -0
  158. package/esm2022/interactive-tour/interactive-tour.loader.mjs +49 -0
  159. package/esm2022/interactive-tour/interactive-tour.module.mjs +19 -0
  160. package/esm2022/interactive-tour/interactive-tour.service.mjs +303 -0
  161. package/esm2022/interactive-tour/public_api.mjs +6 -0
  162. package/esm2022/json-dialog/igo2-common-json-dialog.mjs +5 -0
  163. package/esm2022/json-dialog/json-dialog.component.mjs +38 -0
  164. package/esm2022/json-dialog/json-dialog.module.mjs +26 -0
  165. package/esm2022/json-dialog/json-dialog.service.mjs +26 -0
  166. package/esm2022/json-dialog/public_api.mjs +4 -0
  167. package/esm2022/keyvalue/igo2-common-keyvalue.mjs +5 -0
  168. package/esm2022/keyvalue/keyvalue.module.mjs +25 -0
  169. package/esm2022/keyvalue/keyvalue.pipe.mjs +19 -0
  170. package/esm2022/keyvalue/public_api.mjs +3 -0
  171. package/esm2022/list/igo2-common-list.mjs +5 -0
  172. package/esm2022/list/list-item.directive.mjs +166 -0
  173. package/esm2022/list/list.component.mjs +252 -0
  174. package/esm2022/list/list.module.mjs +26 -0
  175. package/esm2022/list/public_api.mjs +7 -0
  176. package/esm2022/panel/igo2-common-panel.mjs +5 -0
  177. package/esm2022/panel/panel.component.mjs +30 -0
  178. package/esm2022/panel/panel.module.mjs +19 -0
  179. package/esm2022/panel/public_api.mjs +3 -0
  180. package/esm2022/public_api.mjs +20 -0
  181. package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +5 -0
  182. package/esm2022/select-value-dialog/public_api.mjs +6 -0
  183. package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +103 -0
  184. package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +6 -0
  185. package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +2 -0
  186. package/esm2022/select-value-dialog/select-value-dialog.module.mjs +27 -0
  187. package/esm2022/select-value-dialog/select-value-dialog.service.mjs +29 -0
  188. package/esm2022/sidenav/igo2-common-sidenav.mjs +5 -0
  189. package/esm2022/sidenav/public_api.mjs +3 -0
  190. package/esm2022/sidenav/sidenav-shim.directive.mjs +58 -0
  191. package/esm2022/sidenav/sidenav.module.mjs +25 -0
  192. package/esm2022/spinner/igo2-common-spinner.mjs +5 -0
  193. package/esm2022/spinner/public_api.mjs +4 -0
  194. package/esm2022/spinner/spinner-activity.directive.mjs +56 -0
  195. package/esm2022/spinner/spinner.component.mjs +29 -0
  196. package/esm2022/spinner/spinner.module.mjs +26 -0
  197. package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +5 -0
  198. package/esm2022/stop-propagation/public_api.mjs +10 -0
  199. package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +21 -0
  200. package/esm2022/stop-propagation/stop-propagation.directive.mjs +20 -0
  201. package/esm2022/stop-propagation/stop-propagation.module.mjs +26 -0
  202. package/esm2022/table/igo2-common-table.mjs +5 -0
  203. package/esm2022/table/public_api.mjs +7 -0
  204. package/esm2022/table/table-action-color.enum.mjs +7 -0
  205. package/esm2022/table/table-database.mjs +28 -0
  206. package/esm2022/table/table-datasource.mjs +66 -0
  207. package/esm2022/table/table-model.interface.mjs +2 -0
  208. package/esm2022/table/table.component.mjs +143 -0
  209. package/esm2022/table/table.module.mjs +25 -0
  210. package/esm2022/tool/igo2-common-tool.mjs +5 -0
  211. package/esm2022/tool/public_api.mjs +4 -0
  212. package/esm2022/tool/shared/index.mjs +6 -0
  213. package/esm2022/tool/shared/tool-component.mjs +9 -0
  214. package/esm2022/tool/shared/tool.interface.mjs +2 -0
  215. package/esm2022/tool/shared/tool.service.mjs +43 -0
  216. package/esm2022/tool/shared/toolbox.enums.mjs +2 -0
  217. package/esm2022/tool/shared/toolbox.mjs +192 -0
  218. package/esm2022/tool/tool.module.mjs +28 -0
  219. package/esm2022/tool/toolbox/index.mjs +3 -0
  220. package/esm2022/tool/toolbox/toolbox.animation.mjs +10 -0
  221. package/esm2022/tool/toolbox/toolbox.component.mjs +241 -0
  222. package/esm2022/tool/toolbox/toolbox.module.mjs +19 -0
  223. package/esm2022/widget/igo2-common-widget.mjs +5 -0
  224. package/esm2022/widget/public_api.mjs +4 -0
  225. package/esm2022/widget/shared/index.mjs +4 -0
  226. package/esm2022/widget/shared/widget.interfaces.mjs +2 -0
  227. package/esm2022/widget/shared/widget.mjs +4 -0
  228. package/esm2022/widget/shared/widget.service.mjs +22 -0
  229. package/esm2022/widget/widget-outlet/index.mjs +3 -0
  230. package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +112 -0
  231. package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +19 -0
  232. package/esm2022/widget/widget.module.mjs +22 -0
  233. package/esm2022/workspace/igo2-common-workspace.mjs +5 -0
  234. package/esm2022/workspace/public_api.mjs +5 -0
  235. package/esm2022/workspace/shared/index.mjs +4 -0
  236. package/esm2022/workspace/shared/store.mjs +37 -0
  237. package/esm2022/workspace/shared/workspace.interfaces.mjs +2 -0
  238. package/esm2022/workspace/shared/workspace.mjs +143 -0
  239. package/esm2022/workspace/workspace-selector/index.mjs +3 -0
  240. package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +51 -0
  241. package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  242. package/esm2022/workspace/workspace-widget-outlet/index.mjs +3 -0
  243. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +73 -0
  244. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +19 -0
  245. package/esm2022/workspace/workspace.module.mjs +27 -0
  246. package/fesm2022/igo2-common-action.mjs +16 -16
  247. package/fesm2022/igo2-common-action.mjs.map +1 -1
  248. package/fesm2022/igo2-common-backdrop.mjs +8 -8
  249. package/fesm2022/igo2-common-backdrop.mjs.map +1 -1
  250. package/fesm2022/igo2-common-badge.mjs +7 -7
  251. package/fesm2022/igo2-common-badge.mjs.map +1 -1
  252. package/fesm2022/igo2-common-clickout.mjs +7 -7
  253. package/fesm2022/igo2-common-clickout.mjs.map +1 -1
  254. package/fesm2022/igo2-common-clone.mjs +7 -7
  255. package/fesm2022/igo2-common-clone.mjs.map +1 -1
  256. package/fesm2022/igo2-common-collapsible.mjs +11 -11
  257. package/fesm2022/igo2-common-collapsible.mjs.map +1 -1
  258. package/fesm2022/igo2-common-color.mjs +9 -9
  259. package/fesm2022/igo2-common-color.mjs.map +1 -1
  260. package/fesm2022/igo2-common-confirm-dialog.mjs +11 -11
  261. package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -1
  262. package/fesm2022/igo2-common-context-menu.mjs +10 -10
  263. package/fesm2022/igo2-common-context-menu.mjs.map +1 -1
  264. package/fesm2022/igo2-common-custom-html.mjs +11 -11
  265. package/fesm2022/igo2-common-custom-html.mjs.map +1 -1
  266. package/fesm2022/igo2-common-dom.mjs +7 -7
  267. package/fesm2022/igo2-common-dom.mjs.map +1 -1
  268. package/fesm2022/igo2-common-drag-drop.mjs +10 -10
  269. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
  270. package/fesm2022/igo2-common-dynamic-component.mjs +14 -14
  271. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -1
  272. package/fesm2022/igo2-common-entity.mjs +33 -33
  273. package/fesm2022/igo2-common-entity.mjs.map +1 -1
  274. package/fesm2022/igo2-common-flexible.mjs +7 -7
  275. package/fesm2022/igo2-common-flexible.mjs.map +1 -1
  276. package/fesm2022/igo2-common-form.mjs +57 -57
  277. package/fesm2022/igo2-common-form.mjs.map +1 -1
  278. package/fesm2022/igo2-common-home-button.mjs +8 -8
  279. package/fesm2022/igo2-common-home-button.mjs.map +1 -1
  280. package/fesm2022/igo2-common-icon.mjs +14 -13
  281. package/fesm2022/igo2-common-icon.mjs.map +1 -1
  282. package/fesm2022/igo2-common-image.mjs +10 -10
  283. package/fesm2022/igo2-common-image.mjs.map +1 -1
  284. package/fesm2022/igo2-common-interactive-tour.mjs +14 -14
  285. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -1
  286. package/fesm2022/igo2-common-json-dialog.mjs +11 -11
  287. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -1
  288. package/fesm2022/igo2-common-keyvalue.mjs +7 -7
  289. package/fesm2022/igo2-common-keyvalue.mjs.map +1 -1
  290. package/fesm2022/igo2-common-list.mjs +11 -11
  291. package/fesm2022/igo2-common-list.mjs.map +1 -1
  292. package/fesm2022/igo2-common-panel.mjs +8 -8
  293. package/fesm2022/igo2-common-panel.mjs.map +1 -1
  294. package/fesm2022/igo2-common-select-value-dialog.mjs +11 -11
  295. package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -1
  296. package/fesm2022/igo2-common-sidenav.mjs +7 -7
  297. package/fesm2022/igo2-common-sidenav.mjs.map +1 -1
  298. package/fesm2022/igo2-common-spinner.mjs +11 -11
  299. package/fesm2022/igo2-common-spinner.mjs.map +1 -1
  300. package/fesm2022/igo2-common-stop-propagation.mjs +10 -10
  301. package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -1
  302. package/fesm2022/igo2-common-table.mjs +8 -8
  303. package/fesm2022/igo2-common-table.mjs.map +1 -1
  304. package/fesm2022/igo2-common-tool.mjs +15 -15
  305. package/fesm2022/igo2-common-tool.mjs.map +1 -1
  306. package/fesm2022/igo2-common-widget.mjs +15 -15
  307. package/fesm2022/igo2-common-widget.mjs.map +1 -1
  308. package/fesm2022/igo2-common-workspace.mjs +20 -20
  309. package/fesm2022/igo2-common-workspace.mjs.map +1 -1
  310. package/package.json +76 -8
  311. package/src/style/style.scss +1 -1
  312. package/style/style.css +1 -4
@@ -0,0 +1,81 @@
1
+ import { EntityStoreStrategy } from './strategy';
2
+ /**
3
+ * When active, this strategy filters a store's stateView to return
4
+ * selected entities only.
5
+ */
6
+ export class EntityStoreFilterSelectionStrategy extends EntityStoreStrategy {
7
+ /**
8
+ * Store / filter ids map
9
+ */
10
+ filters = new Map();
11
+ /**
12
+ * Bind this strategy to a store and start filtering it
13
+ * @param store Entity store
14
+ */
15
+ bindStore(store) {
16
+ super.bindStore(store);
17
+ if (this.active === true) {
18
+ this.filterStore(store);
19
+ }
20
+ }
21
+ /**
22
+ * Unbind this strategy from a store and stop filtering it
23
+ * @param store Entity store
24
+ */
25
+ unbindStore(store) {
26
+ super.unbindStore(store);
27
+ if (this.active === true) {
28
+ this.unfilterStore(store);
29
+ }
30
+ }
31
+ /**
32
+ * Start filtering all stores
33
+ * @internal
34
+ */
35
+ doActivate() {
36
+ this.filterAll();
37
+ }
38
+ /**
39
+ * Stop filtering all stores
40
+ * @internal
41
+ */
42
+ doDeactivate() {
43
+ this.unfilterAll();
44
+ }
45
+ /**
46
+ * Filter all stores
47
+ */
48
+ filterAll() {
49
+ this.stores.forEach((store) => this.filterStore(store));
50
+ }
51
+ /**
52
+ * Unfilter all stores
53
+ */
54
+ unfilterAll() {
55
+ this.stores.forEach((store) => this.unfilterStore(store));
56
+ }
57
+ /**
58
+ * Filter a store and add it to the filters map
59
+ */
60
+ filterStore(store) {
61
+ if (this.filters.has(store)) {
62
+ return;
63
+ }
64
+ const filter = (record) => {
65
+ return record.state.selected === true;
66
+ };
67
+ this.filters.set(store, store.stateView.addFilter(filter));
68
+ }
69
+ /**
70
+ * Unfilter a store and delete it from the filters map
71
+ */
72
+ unfilterStore(store) {
73
+ const filterId = this.filters.get(store);
74
+ if (filterId === undefined) {
75
+ return;
76
+ }
77
+ store.stateView.removeFilter(filterId);
78
+ this.filters.delete(store);
79
+ }
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9lbnRpdHkvc3JjL3NoYXJlZC9zdHJhdGVnaWVzL2ZpbHRlci1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7SUFDekU7O09BRUc7SUFDSyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLEtBQWtCO1FBQzFCLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsS0FBa0I7UUFDNUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVU7UUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsS0FBa0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUE0QixFQUFFLEVBQUU7WUFDOUMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLEtBQWtCO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5UmVjb3JkIH0gZnJvbSAnLi4vZW50aXR5LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZVN0cmF0ZWd5IH0gZnJvbSAnLi9zdHJhdGVneSc7XG5cbi8qKlxuICogV2hlbiBhY3RpdmUsIHRoaXMgc3RyYXRlZ3kgZmlsdGVycyBhIHN0b3JlJ3Mgc3RhdGVWaWV3IHRvIHJldHVyblxuICogc2VsZWN0ZWQgZW50aXRpZXMgb25seS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBFbnRpdHlTdG9yZVN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIFN0b3JlIC8gZmlsdGVyIGlkcyBtYXBcbiAgICovXG4gIHByaXZhdGUgZmlsdGVycyA9IG5ldyBNYXA8RW50aXR5U3RvcmUsIHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQmluZCB0aGlzIHN0cmF0ZWd5IHRvIGEgc3RvcmUgYW5kIHN0YXJ0IGZpbHRlcmluZyBpdFxuICAgKiBAcGFyYW0gc3RvcmUgRW50aXR5IHN0b3JlXG4gICAqL1xuICBiaW5kU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgc3VwZXIuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyU3RvcmUoc3RvcmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmQgdGhpcyBzdHJhdGVneSBmcm9tIGEgc3RvcmUgYW5kIHN0b3AgZmlsdGVyaW5nIGl0XG4gICAqIEBwYXJhbSBzdG9yZSBFbnRpdHkgc3RvcmVcbiAgICovXG4gIHVuYmluZFN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZSkge1xuICAgIHN1cGVyLnVuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudW5maWx0ZXJTdG9yZShzdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvQWN0aXZhdGUoKSB7XG4gICAgdGhpcy5maWx0ZXJBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvRGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLnVuZmlsdGVyQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQWxsKCkge1xuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goKHN0b3JlOiBFbnRpdHlTdG9yZSkgPT4gdGhpcy5maWx0ZXJTdG9yZShzdG9yZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgdW5maWx0ZXJBbGwoKSB7XG4gICAgdGhpcy5zdG9yZXMuZm9yRWFjaCgoc3RvcmU6IEVudGl0eVN0b3JlKSA9PiB0aGlzLnVuZmlsdGVyU3RvcmUoc3RvcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYSBzdG9yZSBhbmQgYWRkIGl0IHRvIHRoZSBmaWx0ZXJzIG1hcFxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJTdG9yZShzdG9yZTogRW50aXR5U3RvcmUpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJzLmhhcyhzdG9yZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSAocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4ge1xuICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICB9O1xuICAgIHRoaXMuZmlsdGVycy5zZXQoc3RvcmUsIHN0b3JlLnN0YXRlVmlldy5hZGRGaWx0ZXIoZmlsdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5maWx0ZXIgYSBzdG9yZSBhbmQgZGVsZXRlIGl0IGZyb20gdGhlIGZpbHRlcnMgbWFwXG4gICAqL1xuICBwcml2YXRlIHVuZmlsdGVyU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgY29uc3QgZmlsdGVySWQgPSB0aGlzLmZpbHRlcnMuZ2V0KHN0b3JlKTtcbiAgICBpZiAoZmlsdGVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0b3JlLnN0YXRlVmlldy5yZW1vdmVGaWx0ZXIoZmlsdGVySWQpO1xuICAgIHRoaXMuZmlsdGVycy5kZWxldGUoc3RvcmUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from './strategy';
2
+ export * from './filter-custom-function';
3
+ export * from './filter-selection';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RyYXRlZ2llcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vZmlsdGVyLWN1c3RvbS1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2ZpbHRlci1zZWxlY3Rpb24nO1xuIl19
@@ -0,0 +1,82 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ /**
3
+ * Entity store strategies. They can do pretty much anything during a store's
4
+ * lifetime. For example, they may act as triggers when something happens.
5
+ * Sharing a strategy is a good idea when multiple strategies would have
6
+ * on cancelling effect on each other.
7
+ *
8
+ * At creation, strategy is inactive and needs to be manually activated.
9
+ */
10
+ export class EntityStoreStrategy {
11
+ options;
12
+ /**
13
+ * Feature store
14
+ * @internal
15
+ */
16
+ stores = [];
17
+ /**
18
+ * Whether this strategy is active
19
+ * @internal
20
+ */
21
+ get active() {
22
+ return this.active$.value;
23
+ }
24
+ active$ = new BehaviorSubject(false);
25
+ constructor(options = {}) {
26
+ this.options = options;
27
+ this.options = options;
28
+ }
29
+ /**
30
+ * Activate the strategy. If it's already active, it'll be deactivated
31
+ * and activated again.
32
+ */
33
+ activate() {
34
+ if (this.active === true) {
35
+ this.doDeactivate();
36
+ }
37
+ this.active$.next(true);
38
+ this.doActivate();
39
+ }
40
+ /**
41
+ * Activate the strategy. If it's already active, it'll be deactivated
42
+ * and activated again.
43
+ */
44
+ deactivate() {
45
+ this.active$.next(false);
46
+ this.doDeactivate();
47
+ }
48
+ /**
49
+ * Bind this strategy to a store
50
+ * @param store Feature store
51
+ */
52
+ bindStore(store) {
53
+ if (this.stores.indexOf(store) < 0) {
54
+ this.stores.push(store);
55
+ }
56
+ }
57
+ /**
58
+ * Unbind this strategy from store
59
+ * @param store Feature store
60
+ */
61
+ unbindStore(store) {
62
+ const index = this.stores.indexOf(store);
63
+ if (index >= 0) {
64
+ this.stores.splice(index, 1);
65
+ }
66
+ }
67
+ /**
68
+ * Do the stataegy activation
69
+ * @internal
70
+ */
71
+ doActivate() {
72
+ // empty
73
+ }
74
+ /**
75
+ * Do the strategy deactivation
76
+ * @internal
77
+ */
78
+ doDeactivate() {
79
+ // empty
80
+ }
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RyYXRlZ2llcy9zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS3ZDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBZ0JSO0lBZnRCOzs7T0FHRztJQUNPLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBRXJDOzs7T0FHRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUNRLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV2RCxZQUFzQixVQUFzQyxFQUFFO1FBQXhDLFlBQU8sR0FBUCxPQUFPLENBQWlDO1FBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBa0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxLQUFrQjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVU7UUFDbEIsUUFBUTtJQUNWLENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZO1FBQ3BCLFFBQVE7SUFDVixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRW50aXR5U3RvcmVTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuLi9lbnRpdHkuaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vc3RvcmUnO1xuXG4vKipcbiAqIEVudGl0eSBzdG9yZSBzdHJhdGVnaWVzLiBUaGV5IGNhbiBkbyBwcmV0dHkgbXVjaCBhbnl0aGluZyBkdXJpbmcgYSBzdG9yZSdzXG4gKiBsaWZldGltZS4gRm9yIGV4YW1wbGUsIHRoZXkgbWF5IGFjdCBhcyB0cmlnZ2VycyB3aGVuIHNvbWV0aGluZyBoYXBwZW5zLlxuICogU2hhcmluZyBhIHN0cmF0ZWd5IGlzIGEgZ29vZCBpZGVhIHdoZW4gbXVsdGlwbGUgc3RyYXRlZ2llcyB3b3VsZCBoYXZlXG4gKiBvbiBjYW5jZWxsaW5nIGVmZmVjdCBvbiBlYWNoIG90aGVyLlxuICpcbiAqIEF0IGNyZWF0aW9uLCBzdHJhdGVneSBpcyBpbmFjdGl2ZSBhbmQgbmVlZHMgdG8gYmUgbWFudWFsbHkgYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmVTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBGZWF0dXJlIHN0b3JlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0b3JlczogRW50aXR5U3RvcmVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RyYXRlZ3kgaXMgYWN0aXZlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUkLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IGFjdGl2ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogRW50aXR5U3RvcmVTdHJhdGVneU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHN0cmF0ZWd5LiBJZiBpdCdzIGFscmVhZHkgYWN0aXZlLCBpdCdsbCBiZSBkZWFjdGl2YXRlZFxuICAgKiBhbmQgYWN0aXZhdGVkIGFnYWluLlxuICAgKi9cbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmRvRGVhY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRvQWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc3RyYXRlZ3kuIElmIGl0J3MgYWxyZWFkeSBhY3RpdmUsIGl0J2xsIGJlIGRlYWN0aXZhdGVkXG4gICAqIGFuZCBhY3RpdmF0ZWQgYWdhaW4uXG4gICAqL1xuICBkZWFjdGl2YXRlKCkge1xuICAgIHRoaXMuYWN0aXZlJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmRvRGVhY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgdGhpcyBzdHJhdGVneSB0byBhIHN0b3JlXG4gICAqIEBwYXJhbSBzdG9yZSBGZWF0dXJlIHN0b3JlXG4gICAqL1xuICBiaW5kU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVzLmluZGV4T2Yoc3RvcmUpIDwgMCkge1xuICAgICAgdGhpcy5zdG9yZXMucHVzaChzdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCB0aGlzIHN0cmF0ZWd5IGZyb20gc3RvcmVcbiAgICogQHBhcmFtIHN0b3JlIEZlYXR1cmUgc3RvcmVcbiAgICovXG4gIHVuYmluZFN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdG9yZXMuaW5kZXhPZihzdG9yZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuc3RvcmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvIHRoZSBzdGF0YWVneSBhY3RpdmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvQWN0aXZhdGUoKSB7XG4gICAgLy8gZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEbyB0aGUgc3RyYXRlZ3kgZGVhY3RpdmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvRGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBlbXB0eVxuICB9XG59XG4iXX0=
@@ -0,0 +1,329 @@
1
+ import { of } from 'rxjs';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { catchError, tap } from 'rxjs/operators';
4
+ import { EntityOperationType } from './entity.enums';
5
+ import { getEntityId } from './entity.utils';
6
+ import { EntityStore } from './store';
7
+ /**
8
+ * This class holds a reference to the insert, update and delete
9
+ * operations performed on a store. This is useful to commit
10
+ * these operations in a single pass or to cancel them.
11
+ */
12
+ export class EntityTransaction {
13
+ /**
14
+ * Store holding the operations on another store
15
+ */
16
+ operations;
17
+ /**
18
+ * Method to get an entity's id
19
+ */
20
+ getKey;
21
+ /**
22
+ * Whether there are pending operations
23
+ */
24
+ get empty$() {
25
+ return this.operations.empty$;
26
+ }
27
+ /**
28
+ * Whether there are pending operations
29
+ */
30
+ get empty() {
31
+ return this.empty$.value;
32
+ }
33
+ /**
34
+ * Whether thise store is in commit phase
35
+ */
36
+ get inCommitPhase() {
37
+ return this.inCommitPhase$.value;
38
+ }
39
+ inCommitPhase$ = new BehaviorSubject(false);
40
+ constructor(options = {}) {
41
+ this.getKey = options.getKey ? options.getKey : getEntityId;
42
+ this.operations = new EntityStore([], {
43
+ getKey: (operation) => operation.key
44
+ });
45
+ }
46
+ destroy() {
47
+ this.operations.destroy();
48
+ }
49
+ /**
50
+ * Insert an entity into a store. If no store is specified, an insert
51
+ * operation is still created but the transaction won't add the new
52
+ * entity to the store.
53
+ * @param current The entity to insert
54
+ * @param store Optional: The store to insert the entity into
55
+ * @param meta Optional: Any metadata on the operation
56
+ */
57
+ insert(current, store, meta) {
58
+ const existingOperation = this.getOperationByEntity(current);
59
+ if (existingOperation !== undefined) {
60
+ this.removeOperation(existingOperation);
61
+ }
62
+ this.doInsert(current, store, meta);
63
+ }
64
+ /**
65
+ * Update an entity in a store. If no store is specified, an update
66
+ * operation is still created but the transaction won't update the
67
+ * entity into the store.
68
+ * @param previous The entity before update
69
+ * @param current The entity after update
70
+ * @param store Optional: The store to update the entity into
71
+ * @param meta Optional: Any metadata on the operation
72
+ */
73
+ update(previous, current, store, meta) {
74
+ const existingOperation = this.getOperationByEntity(current);
75
+ if (existingOperation !== undefined) {
76
+ this.removeOperation(existingOperation);
77
+ if (existingOperation.type === EntityOperationType.Insert) {
78
+ this.doInsert(current, store, meta);
79
+ return;
80
+ }
81
+ else if (existingOperation.type === EntityOperationType.Update) {
82
+ previous = existingOperation.previous;
83
+ }
84
+ }
85
+ this.doUpdate(previous, current, store, meta);
86
+ }
87
+ /**
88
+ * Delete an entity from a store. If no store is specified, a delete
89
+ * operation is still created but the transaction won't remove the
90
+ * entity from the store.
91
+ * @param previous The entity before delete
92
+ * @param store Optional: The store to delete the entity from
93
+ * @param meta Optional: Any metadata on the operation
94
+ */
95
+ delete(previous, store, meta) {
96
+ const existingOperation = this.getOperationByEntity(previous);
97
+ if (existingOperation !== undefined) {
98
+ this.removeOperation(existingOperation);
99
+ if (existingOperation.type === EntityOperationType.Insert) {
100
+ if (store !== undefined) {
101
+ store.delete(previous);
102
+ }
103
+ return;
104
+ }
105
+ }
106
+ this.doDelete(previous, store, meta);
107
+ }
108
+ /**
109
+ * Commit operations the transaction. This method doesn't do much
110
+ * in itself. The handler it receives does the hard work and it's
111
+ * implementation is left to the caller. This method simply wraps
112
+ * the handler into an error catching mechanism to update
113
+ * the transaction afterward. The caller needs to subscribe to this
114
+ * method's output (observable) for the commit to be performed.
115
+ * @param operations Operations to commit
116
+ * @param handler Function that handles the commit operation
117
+ * @returns The handler output (observable)
118
+ */
119
+ commit(operations, handler) {
120
+ this.inCommitPhase$.next(true);
121
+ return handler(this, operations).pipe(catchError(() => of(new Error())), tap((result) => {
122
+ if (result instanceof Error) {
123
+ this.onCommitError();
124
+ }
125
+ else {
126
+ this.onCommitSuccess(operations);
127
+ }
128
+ }));
129
+ }
130
+ /**
131
+ * Commit all the operations of the transaction.
132
+ * @param handler Function that handles the commit operation
133
+ * @returns The handler output (observable)
134
+ */
135
+ commitAll(handler) {
136
+ const operations = this.getOperationsInCommit();
137
+ return this.commit(operations, handler);
138
+ }
139
+ /**
140
+ * Rollback this transaction
141
+ */
142
+ rollback() {
143
+ this.rollbackOperations(this.operations.all());
144
+ }
145
+ /**
146
+ * Rollback specific operations
147
+ */
148
+ rollbackOperations(operations) {
149
+ this.checkInCommitPhase();
150
+ const operationsFactory = () => new Map([
151
+ [EntityOperationType.Delete, []],
152
+ [EntityOperationType.Update, []],
153
+ [EntityOperationType.Insert, []]
154
+ ]);
155
+ const storesOperations = new Map();
156
+ // Group operations by store and by operation type.
157
+ // Grouping operations allows us to revert them in bacth, thus, triggering
158
+ // observables only one per operation type.
159
+ for (const operation of operations) {
160
+ const store = operation.store;
161
+ if (operation.store === undefined) {
162
+ continue;
163
+ }
164
+ let storeOperations = storesOperations.get(store);
165
+ if (storeOperations === undefined) {
166
+ storeOperations = operationsFactory();
167
+ storesOperations.set(store, storeOperations);
168
+ }
169
+ storeOperations.get(operation.type).push(operation);
170
+ }
171
+ Array.from(storesOperations.keys()).forEach((store) => {
172
+ const storeOperations = storesOperations.get(store);
173
+ const deletes = storeOperations.get(EntityOperationType.Delete);
174
+ store.insertMany(deletes.map((_delete) => _delete.previous));
175
+ const updates = storeOperations.get(EntityOperationType.Update);
176
+ store.updateMany(updates.map((_update) => _update.previous));
177
+ const inserts = storeOperations.get(EntityOperationType.Insert);
178
+ store.deleteMany(inserts.map((_insert) => _insert.current));
179
+ });
180
+ this.operations.deleteMany(operations);
181
+ this.inCommitPhase$.next(false);
182
+ }
183
+ /**
184
+ * Clear this transaction
185
+ * @todo Raise event and synchronize stores?
186
+ */
187
+ clear() {
188
+ this.operations.clear();
189
+ this.inCommitPhase$.next(false);
190
+ }
191
+ /**
192
+ * Get any existing operation on an entity
193
+ * @param entity Entity
194
+ * @returns Either an insert, update or delete operation
195
+ */
196
+ getOperationByEntity(entity) {
197
+ return this.operations.get(this.getKey(entity));
198
+ }
199
+ /**
200
+ * Merge another transaction in this one
201
+ * @param transaction Another transaction
202
+ */
203
+ mergeTransaction(transaction) {
204
+ this.checkInCommitPhase();
205
+ const operations = transaction.operations.all();
206
+ operations.forEach((operation) => {
207
+ this.addOperation(operation);
208
+ });
209
+ }
210
+ /**
211
+ * Create an insert operation and add an entity to the store
212
+ * @param current The entity to insert
213
+ * @param store Optional: The store to insert the entity into
214
+ * @param meta Optional: Any metadata on the operation
215
+ */
216
+ doInsert(current, store, meta) {
217
+ this.addOperation({
218
+ key: this.getKey(current),
219
+ type: EntityOperationType.Insert,
220
+ previous: undefined,
221
+ current,
222
+ store,
223
+ meta
224
+ });
225
+ if (store !== undefined) {
226
+ store.insert(current);
227
+ }
228
+ }
229
+ /**
230
+ * Create an update operation and update an entity into the store
231
+ * @param previous The entity before update
232
+ * @param current The entity after update
233
+ * @param store Optional: The store to update the entity into
234
+ * @param meta Optional: Any metadata on the operation
235
+ */
236
+ doUpdate(previous, current, store, meta) {
237
+ this.addOperation({
238
+ key: this.getKey(current),
239
+ type: EntityOperationType.Update,
240
+ previous,
241
+ current,
242
+ store,
243
+ meta
244
+ });
245
+ if (store !== undefined) {
246
+ store.update(current);
247
+ }
248
+ }
249
+ /**
250
+ * Create a delete operation and delete an entity from the store
251
+ * @param previous The entity before delete
252
+ * @param store Optional: The store to delete the entity from
253
+ * @param meta Optional: Any metadata on the operation
254
+ */
255
+ doDelete(previous, store, meta) {
256
+ this.addOperation({
257
+ key: this.getKey(previous),
258
+ type: EntityOperationType.Delete,
259
+ previous,
260
+ current: undefined,
261
+ store,
262
+ meta
263
+ });
264
+ if (store !== undefined) {
265
+ store.delete(previous);
266
+ }
267
+ }
268
+ /**
269
+ * Remove committed operations from store
270
+ * @param operations Commited operations
271
+ * @todo Raise event and synchronize stores?
272
+ */
273
+ resolveOperations(operations) {
274
+ this.operations.deleteMany(operations);
275
+ }
276
+ /**
277
+ * On commit success, resolve commited operations and exit commit phase
278
+ * @param operations Commited operations
279
+ */
280
+ onCommitSuccess(operations) {
281
+ this.resolveOperations(operations);
282
+ this.inCommitPhase$.next(false);
283
+ }
284
+ /**
285
+ * On commit error, abort transaction
286
+ * @param operations Commited operations
287
+ */
288
+ onCommitError() {
289
+ this.inCommitPhase$.next(false);
290
+ }
291
+ /**
292
+ * Add an operation to the operations store
293
+ * @param operation Operation to add
294
+ */
295
+ addOperation(operation) {
296
+ this.checkInCommitPhase();
297
+ this.operations.insert(operation);
298
+ this.operations.state.update(operation, { added: true });
299
+ }
300
+ /**
301
+ * Remove an operation from the operations store
302
+ * @param operation Operation to remove
303
+ */
304
+ removeOperation(operation) {
305
+ this.checkInCommitPhase();
306
+ this.operations.delete(operation);
307
+ this.operations.state.update(operation, { added: false });
308
+ }
309
+ /**
310
+ * Get all the operations to commit
311
+ * @returns Operations to commit
312
+ */
313
+ getOperationsInCommit() {
314
+ return this.operations.stateView
315
+ .manyBy((value) => {
316
+ return value.state.added === true;
317
+ })
318
+ .map((value) => value.entity);
319
+ }
320
+ /**
321
+ * Check if the transaction is in the commit phase and throw an error if it is
322
+ */
323
+ checkInCommitPhase() {
324
+ if (this.inCommitPhase === true) {
325
+ throw new Error('This transaction is in the commit phase. Cannot complete this operation.');
326
+ }
327
+ }
328
+ }
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFnQnRDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCOztPQUVHO0lBQ00sVUFBVSxDQUFxRDtJQUV4RTs7T0FFRztJQUNNLE1BQU0sQ0FBbUI7SUFFbEM7O09BRUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBQ1EsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTlELFlBQVksVUFBb0MsRUFBRTtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcs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S0FBSyxDQUNiLDBFQUEwRSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRW50aXR5T3BlcmF0aW9uVHlwZSB9IGZyb20gJy4vZW50aXR5LmVudW1zJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgRW50aXR5T3BlcmF0aW9uU3RhdGUsXG4gIEVudGl0eVRyYW5zYWN0aW9uT3B0aW9uc1xufSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldEVudGl0eUlkIH0gZnJvbSAnLi9lbnRpdHkudXRpbHMnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuL3N0b3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlPcGVyYXRpb248RSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICBrZXk6IEVudGl0eUtleTtcbiAgdHlwZTogRW50aXR5T3BlcmF0aW9uVHlwZTtcbiAgcHJldmlvdXM6IEUgfCB1bmRlZmluZWQ7XG4gIGN1cnJlbnQ6IEUgfCB1bmRlZmluZWQ7XG4gIHN0b3JlPzogRW50aXR5U3RvcmU8RT47XG4gIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBFbnRpdHlUcmFuc2FjdGlvbkNvbW1pdEhhbmRsZXIgPSAoXG4gIHRyYW5zYWN0aW9uOiBFbnRpdHlUcmFuc2FjdGlvbixcbiAgb3BlcmF0aW9uczogRW50aXR5T3BlcmF0aW9uW11cbikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGluc2VydCwgdXBkYXRlIGFuZCBkZWxldGVcbiAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIGEgc3RvcmUuIFRoaXMgaXMgdXNlZnVsIHRvIGNvbW1pdFxuICogdGhlc2Ugb3BlcmF0aW9ucyBpbiBhIHNpbmdsZSBwYXNzIG9yIHRvIGNhbmNlbCB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VHJhbnNhY3Rpb24ge1xuICAvKipcbiAgICogU3RvcmUgaG9sZGluZyB0aGUgb3BlcmF0aW9ucyBvbiBhbm90aGVyIHN0b3JlXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25zOiBFbnRpdHlTdG9yZTxFbnRpdHlPcGVyYXRpb24sIEVudGl0eU9wZXJhdGlvblN0YXRlPjtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBpZFxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0S2V5OiAoRSkgPT4gRW50aXR5S2V5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBwZW5kaW5nIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldCBlbXB0eSQoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zLmVtcHR5JDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBwZW5kaW5nIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbXB0eSQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzZSBzdG9yZSBpcyBpbiBjb21taXQgcGhhc2VcbiAgICovXG4gIGdldCBpbkNvbW1pdFBoYXNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluQ29tbWl0UGhhc2UkLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IGluQ29tbWl0UGhhc2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRW50aXR5VHJhbnNhY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmdldEtleSA9IG9wdGlvbnMuZ2V0S2V5ID8gb3B0aW9ucy5nZXRLZXkgOiBnZXRFbnRpdHlJZDtcbiAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgRW50aXR5U3RvcmU8RW50aXR5T3BlcmF0aW9uLCBFbnRpdHlPcGVyYXRpb25TdGF0ZT4oXG4gICAgICBbXSxcbiAgICAgIHtcbiAgICAgICAgZ2V0S2V5OiAob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pID0+IG9wZXJhdGlvbi5rZXlcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbiBlbnRpdHkgaW50byBhIHN0b3JlLiBJZiBubyBzdG9yZSBpcyBzcGVjaWZpZWQsIGFuIGluc2VydFxuICAgKiBvcGVyYXRpb24gaXMgc3RpbGwgY3JlYXRlZCBidXQgdGhlIHRyYW5zYWN0aW9uIHdvbid0IGFkZCB0aGUgbmV3XG4gICAqIGVudGl0eSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBjdXJyZW50IFRoZSBlbnRpdHkgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGluc2VydCB0aGUgZW50aXR5IGludG9cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBpbnNlcnQoXG4gICAgY3VycmVudDogb2JqZWN0LFxuICAgIHN0b3JlPzogRW50aXR5U3RvcmU8b2JqZWN0PixcbiAgICBtZXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCBleGlzdGluZ09wZXJhdGlvbiA9IHRoaXMuZ2V0T3BlcmF0aW9uQnlFbnRpdHkoY3VycmVudCk7XG4gICAgaWYgKGV4aXN0aW5nT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlT3BlcmF0aW9uKGV4aXN0aW5nT3BlcmF0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvSW5zZXJ0KGN1cnJlbnQsIHN0b3JlLCBtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZW50aXR5IGluIGEgc3RvcmUuIElmIG5vIHN0b3JlIGlzIHNwZWNpZmllZCwgYW4gdXBkYXRlXG4gICAqIG9wZXJhdGlvbiBpcyBzdGlsbCBjcmVhdGVkIGJ1dCB0aGUgdHJhbnNhY3Rpb24gd29uJ3QgdXBkYXRlIHRoZVxuICAgKiBlbnRpdHkgaW50byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBwcmV2aW91cyBUaGUgZW50aXR5IGJlZm9yZSB1cGRhdGVcbiAgICogQHBhcmFtIGN1cnJlbnQgVGhlIGVudGl0eSBhZnRlciB1cGRhdGVcbiAgICogQHBhcmFtIHN0b3JlIE9wdGlvbmFsOiBUaGUgc3RvcmUgdG8gdXBkYXRlIHRoZSBlbnRpdHkgaW50b1xuICAgKiBAcGFyYW0gbWV0YSBPcHRpb25hbDogQW55IG1ldGFkYXRhIG9uIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHVwZGF0ZShcbiAgICBwcmV2aW91czogb2JqZWN0LFxuICAgIGN1cnJlbnQ6IG9iamVjdCxcbiAgICBzdG9yZT86IEVudGl0eVN0b3JlPG9iamVjdD4sXG4gICAgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmdPcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbkJ5RW50aXR5KGN1cnJlbnQpO1xuICAgIGlmIChleGlzdGluZ09wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZU9wZXJhdGlvbihleGlzdGluZ09wZXJhdGlvbik7XG4gICAgICBpZiAoZXhpc3RpbmdPcGVyYXRpb24udHlwZSA9PT0gRW50aXR5T3BlcmF0aW9uVHlwZS5JbnNlcnQpIHtcbiAgICAgICAgdGhpcy5kb0luc2VydChjdXJyZW50LCBzdG9yZSwgbWV0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdPcGVyYXRpb24udHlwZSA9PT0gRW50aXR5T3BlcmF0aW9uVHlwZS5VcGRhdGUpIHtcbiAgICAgICAgcHJldmlvdXMgPSBleGlzdGluZ09wZXJhdGlvbi5wcmV2aW91cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRvVXBkYXRlKHByZXZpb3VzLCBjdXJyZW50LCBzdG9yZSwgbWV0YSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSBmcm9tIGEgc3RvcmUuIElmIG5vIHN0b3JlIGlzIHNwZWNpZmllZCwgYSBkZWxldGVcbiAgICogb3BlcmF0aW9uIGlzIHN0aWxsIGNyZWF0ZWQgYnV0IHRoZSB0cmFuc2FjdGlvbiB3b24ndCByZW1vdmUgdGhlXG4gICAqIGVudGl0eSBmcm9tIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHByZXZpb3VzIFRoZSBlbnRpdHkgYmVmb3JlIGRlbGV0ZVxuICAgKiBAcGFyYW0gc3RvcmUgT3B0aW9uYWw6IFRoZSBzdG9yZSB0byBkZWxldGUgdGhlIGVudGl0eSBmcm9tXG4gICAqIEBwYXJhbSBtZXRhIE9wdGlvbmFsOiBBbnkgbWV0YWRhdGEgb24gdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgZGVsZXRlKFxuICAgIHByZXZpb3VzOiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nT3BlcmF0aW9uID0gdGhpcy5nZXRPcGVyYXRpb25CeUVudGl0eShwcmV2aW91cyk7XG4gICAgaWYgKGV4aXN0aW5nT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlT3BlcmF0aW9uKGV4aXN0aW5nT3BlcmF0aW9uKTtcbiAgICAgIGlmIChleGlzdGluZ09wZXJhdGlvbi50eXBlID09PSBFbnRpdHlPcGVyYXRpb25UeXBlLkluc2VydCkge1xuICAgICAgICBpZiAoc3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLmRlbGV0ZShwcmV2aW91cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZG9EZWxldGUocHJldmlvdXMsIHN0b3JlLCBtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgb3BlcmF0aW9ucyB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZG8gbXVjaFxuICAgKiBpbiBpdHNlbGYuIFRoZSBoYW5kbGVyIGl0IHJlY2VpdmVzIGRvZXMgdGhlIGhhcmQgd29yayBhbmQgaXQnc1xuICAgKiBpbXBsZW1lbnRhdGlvbiBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgbWV0aG9kIHNpbXBseSB3cmFwc1xuICAgKiB0aGUgaGFuZGxlciBpbnRvIGFuIGVycm9yIGNhdGNoaW5nIG1lY2hhbmlzbSB0byB1cGRhdGVcbiAgICogdGhlIHRyYW5zYWN0aW9uIGFmdGVyd2FyZC4gVGhlIGNhbGxlciBuZWVkcyB0byBzdWJzY3JpYmUgdG8gdGhpc1xuICAgKiBtZXRob2QncyBvdXRwdXQgKG9ic2VydmFibGUpIGZvciB0aGUgY29tbWl0IHRvIGJlIHBlcmZvcm1lZC5cbiAgICogQHBhcmFtIG9wZXJhdGlvbnMgT3BlcmF0aW9ucyB0byBjb21taXRcbiAgICogQHBhcmFtIGhhbmRsZXIgRnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRoZSBjb21taXQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBoYW5kbGVyIG91dHB1dCAob2JzZXJ2YWJsZSlcbiAgICovXG4gIGNvbW1pdChcbiAgICBvcGVyYXRpb25zOiBFbnRpdHlPcGVyYXRpb25bXSxcbiAgICBoYW5kbGVyOiBFbnRpdHlUcmFuc2FjdGlvbkNvbW1pdEhhbmRsZXJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQodHJ1ZSk7XG5cbiAgICByZXR1cm4gaGFuZGxlcih0aGlzLCBvcGVyYXRpb25zKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihuZXcgRXJyb3IoKSkpLFxuICAgICAgdGFwKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLm9uQ29tbWl0RXJyb3IoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ29tbWl0U3VjY2VzcyhvcGVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhbGwgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gaGFuZGxlciBGdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIGNvbW1pdCBvcGVyYXRpb25cbiAgICogQHJldHVybnMgVGhlIGhhbmRsZXIgb3V0cHV0IChvYnNlcnZhYmxlKVxuICAgKi9cbiAgY29tbWl0QWxsKGhhbmRsZXI6IEVudGl0eVRyYW5zYWN0aW9uQ29tbWl0SGFuZGxlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMuZ2V0T3BlcmF0aW9uc0luQ29tbWl0KCk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWl0KG9wZXJhdGlvbnMsIGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIHRoaXMgdHJhbnNhY3Rpb25cbiAgICovXG4gIHJvbGxiYWNrKCkge1xuICAgIHRoaXMucm9sbGJhY2tPcGVyYXRpb25zKHRoaXMub3BlcmF0aW9ucy5hbGwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgc3BlY2lmaWMgb3BlcmF0aW9uc1xuICAgKi9cbiAgcm9sbGJhY2tPcGVyYXRpb25zKG9wZXJhdGlvbnM6IEVudGl0eU9wZXJhdGlvbltdKSB7XG4gICAgdGhpcy5jaGVja0luQ29tbWl0UGhhc2UoKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnNGYWN0b3J5ID0gKCkgPT5cbiAgICAgIG5ldyBNYXAoW1xuICAgICAgICBbRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUsIFtdXSxcbiAgICAgICAgW0VudGl0eU9wZXJhdGlvblR5cGUuVXBkYXRlLCBbXV0sXG4gICAgICAgIFtFbnRpdHlPcGVyYXRpb25UeXBlLkluc2VydCwgW11dXG4gICAgICBdKTtcbiAgICBjb25zdCBzdG9yZXNPcGVyYXRpb25zID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gR3JvdXAgb3BlcmF0aW9ucyBieSBzdG9yZSBhbmQgYnkgb3BlcmF0aW9uIHR5cGUuXG4gICAgLy8gR3JvdXBpbmcgb3BlcmF0aW9ucyBhbGxvd3MgdXMgdG8gcmV2ZXJ0IHRoZW0gaW4gYmFjdGgsIHRodXMsIHRyaWdnZXJpbmdcbiAgICAvLyBvYnNlcnZhYmxlcyBvbmx5IG9uZSBwZXIgb3BlcmF0aW9uIHR5cGUuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgY29uc3Qgc3RvcmUgPSBvcGVyYXRpb24uc3RvcmU7XG4gICAgICBpZiAob3BlcmF0aW9uLnN0b3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdG9yZU9wZXJhdGlvbnMgPSBzdG9yZXNPcGVyYXRpb25zLmdldChzdG9yZSk7XG4gICAgICBpZiAoc3RvcmVPcGVyYXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RvcmVPcGVyYXRpb25zID0gb3BlcmF0aW9uc0ZhY3RvcnkoKTtcbiAgICAgICAgc3RvcmVzT3BlcmF0aW9ucy5zZXQoc3RvcmUsIHN0b3JlT3BlcmF0aW9ucyk7XG4gICAgICB9XG4gICAgICBzdG9yZU9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbi50eXBlKS5wdXNoKG9wZXJhdGlvbik7XG4gICAgfVxuXG4gICAgQXJyYXkuZnJvbShzdG9yZXNPcGVyYXRpb25zLmtleXMoKSkuZm9yRWFjaChcbiAgICAgIChzdG9yZTogRW50aXR5U3RvcmU8b2JqZWN0PikgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZU9wZXJhdGlvbnMgPSBzdG9yZXNPcGVyYXRpb25zLmdldChzdG9yZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlcyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUpO1xuICAgICAgICBzdG9yZS5pbnNlcnRNYW55KFxuICAgICAgICAgIGRlbGV0ZXMubWFwKChfZGVsZXRlOiBFbnRpdHlPcGVyYXRpb24pID0+IF9kZWxldGUucHJldmlvdXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5VcGRhdGUpO1xuICAgICAgICBzdG9yZS51cGRhdGVNYW55KFxuICAgICAgICAgIHVwZGF0ZXMubWFwKChfdXBkYXRlOiBFbnRpdHlPcGVyYXRpb24pID0+IF91cGRhdGUucHJldmlvdXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0cyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5JbnNlcnQpO1xuICAgICAgICBzdG9yZS5kZWxldGVNYW55KFxuICAgICAgICAgIGluc2VydHMubWFwKChfaW5zZXJ0OiBFbnRpdHlPcGVyYXRpb24pID0+IF9pbnNlcnQuY3VycmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5vcGVyYXRpb25zLmRlbGV0ZU1hbnkob3BlcmF0aW9ucyk7XG4gICAgdGhpcy5pbkNvbW1pdFBoYXNlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHRyYW5zYWN0aW9uXG4gICAqIEB0b2RvIFJhaXNlIGV2ZW50IGFuZCBzeW5jaHJvbml6ZSBzdG9yZXM/XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9uIG9uIGFuIGVudGl0eVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKiBAcmV0dXJucyBFaXRoZXIgYW4gaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgKi9cbiAgZ2V0T3BlcmF0aW9uQnlFbnRpdHkoZW50aXR5OiBvYmplY3QpOiBFbnRpdHlPcGVyYXRpb24ge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnMuZ2V0KHRoaXMuZ2V0S2V5KGVudGl0eSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFub3RoZXIgdHJhbnNhY3Rpb24gaW4gdGhpcyBvbmVcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFub3RoZXIgdHJhbnNhY3Rpb25cbiAgICovXG4gIG1lcmdlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IEVudGl0eVRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja0luQ29tbWl0UGhhc2UoKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSB0cmFuc2FjdGlvbi5vcGVyYXRpb25zLmFsbCgpO1xuICAgIG9wZXJhdGlvbnMuZm9yRWFjaCgob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc2VydCBvcGVyYXRpb24gYW5kIGFkZCBhbiBlbnRpdHkgdG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBjdXJyZW50IFRoZSBlbnRpdHkgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGluc2VydCB0aGUgZW50aXR5IGludG9cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRvSW5zZXJ0KFxuICAgIGN1cnJlbnQ6IG9iamVjdCxcbiAgICBzdG9yZT86IEVudGl0eVN0b3JlPG9iamVjdD4sXG4gICAgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgdGhpcy5hZGRPcGVyYXRpb24oe1xuICAgICAga2V5OiB0aGlzLmdldEtleShjdXJyZW50KSxcbiAgICAgIHR5cGU6IEVudGl0eU9wZXJhdGlvblR5cGUuSW5zZXJ0LFxuICAgICAgcHJldmlvdXM6IHVuZGVmaW5lZCxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBzdG9yZSxcbiAgICAgIG1ldGFcbiAgICB9KTtcblxuICAgIGlmIChzdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdG9yZS5pbnNlcnQoY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1cGRhdGUgb3BlcmF0aW9uIGFuZCB1cGRhdGUgYW4gZW50aXR5IGludG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBwcmV2aW91cyBUaGUgZW50aXR5IGJlZm9yZSB1cGRhdGVcbiAgICogQHBhcmFtIGN1cnJlbnQgVGhlIGVudGl0eSBhZnRlciB1cGRhdGVcbiAgICogQHBhcmFtIHN0b3JlIE9wdGlvbmFsOiBUaGUgc3RvcmUgdG8gdXBkYXRlIHRoZSBlbnRpdHkgaW50b1xuICAgKiBAcGFyYW0gbWV0YSBPcHRpb25hbDogQW55IG1ldGFkYXRhIG9uIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgZG9VcGRhdGUoXG4gICAgcHJldmlvdXM6IG9iamVjdCxcbiAgICBjdXJyZW50OiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIHRoaXMuYWRkT3BlcmF0aW9uKHtcbiAgICAgIGtleTogdGhpcy5nZXRLZXkoY3VycmVudCksXG4gICAgICB0eXBlOiBFbnRpdHlPcGVyYXRpb25UeXBlLlVwZGF0ZSxcbiAgICAgIHByZXZpb3VzLFxuICAgICAgY3VycmVudCxcbiAgICAgIHN0b3JlLFxuICAgICAgbWV0YVxuICAgIH0pO1xuXG4gICAgaWYgKHN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0b3JlLnVwZGF0ZShjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVsZXRlIG9wZXJhdGlvbiBhbmQgZGVsZXRlIGFuIGVudGl0eSBmcm9tIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIGVudGl0eSBiZWZvcmUgZGVsZXRlXG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGRlbGV0ZSB0aGUgZW50aXR5IGZyb21cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRvRGVsZXRlKFxuICAgIHByZXZpb3VzOiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIHRoaXMuYWRkT3BlcmF0aW9uKHtcbiAgICAgIGtleTogdGhpcy5nZXRLZXkocHJldmlvdXMpLFxuICAgICAgdHlwZTogRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIGN1cnJlbnQ6IHVuZGVmaW5lZCxcbiAgICAgIHN0b3JlLFxuICAgICAgbWV0YVxuICAgIH0pO1xuXG4gICAgaWYgKHN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0b3JlLmRlbGV0ZShwcmV2aW91cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjb21taXR0ZWQgb3BlcmF0aW9ucyBmcm9tIHN0b3JlXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIENvbW1pdGVkIG9wZXJhdGlvbnNcbiAgICogQHRvZG8gUmFpc2UgZXZlbnQgYW5kIHN5bmNocm9uaXplIHN0b3Jlcz9cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbnMob3BlcmF0aW9uczogRW50aXR5T3BlcmF0aW9uW10pIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuZGVsZXRlTWFueShvcGVyYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21taXQgc3VjY2VzcywgcmVzb2x2ZSBjb21taXRlZCBvcGVyYXRpb25zIGFuZCBleGl0IGNvbW1pdCBwaGFzZVxuICAgKiBAcGFyYW0gb3BlcmF0aW9ucyBDb21taXRlZCBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uQ29tbWl0U3VjY2VzcyhvcGVyYXRpb25zOiBFbnRpdHlPcGVyYXRpb25bXSkge1xuICAgIHRoaXMucmVzb2x2ZU9wZXJhdGlvbnMob3BlcmF0aW9ucyk7XG4gICAgdGhpcy5pbkNvbW1pdFBoYXNlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21taXQgZXJyb3IsIGFib3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIENvbW1pdGVkIG9wZXJhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25Db21taXRFcnJvcigpIHtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvcGVyYXRpb24gdG8gdGhlIG9wZXJhdGlvbnMgc3RvcmVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiBPcGVyYXRpb24gdG8gYWRkXG4gICAqL1xuICBwcml2YXRlIGFkZE9wZXJhdGlvbihvcGVyYXRpb246IEVudGl0eU9wZXJhdGlvbikge1xuICAgIHRoaXMuY2hlY2tJbkNvbW1pdFBoYXNlKCk7XG5cbiAgICB0aGlzLm9wZXJhdGlvbnMuaW5zZXJ0KG9wZXJhdGlvbik7XG4gICAgdGhpcy5vcGVyYXRpb25zLnN0YXRlLnVwZGF0ZShvcGVyYXRpb24sIHsgYWRkZWQ6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIG9wZXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb25zIHN0b3JlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gT3BlcmF0aW9uIHRvIHJlbW92ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVPcGVyYXRpb24ob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pIHtcbiAgICB0aGlzLmNoZWNrSW5Db21taXRQaGFzZSgpO1xuXG4gICAgdGhpcy5vcGVyYXRpb25zLmRlbGV0ZShvcGVyYXRpb24pO1xuICAgIHRoaXMub3BlcmF0aW9ucy5zdGF0ZS51cGRhdGUob3BlcmF0aW9uLCB7IGFkZGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGNvbW1pdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25zIHRvIGNvbW1pdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPcGVyYXRpb25zSW5Db21taXQoKTogRW50aXR5T3BlcmF0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnMuc3RhdGVWaWV3XG4gICAgICAubWFueUJ5KFxuICAgICAgICAodmFsdWU6IHsgZW50aXR5OiBFbnRpdHlPcGVyYXRpb247IHN0YXRlOiBFbnRpdHlPcGVyYXRpb25TdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnN0YXRlLmFkZGVkID09PSB0cnVlO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAubWFwKFxuICAgICAgICAodmFsdWU6IHsgZW50aXR5OiBFbnRpdHlPcGVyYXRpb247IHN0YXRlOiBFbnRpdHlPcGVyYXRpb25TdGF0ZSB9KSA9PlxuICAgICAgICAgIHZhbHVlLmVudGl0eVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gdGhlIGNvbW1pdCBwaGFzZSBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgaXQgaXNcbiAgICovXG4gIHByaXZhdGUgY2hlY2tJbkNvbW1pdFBoYXNlKCkge1xuICAgIGlmICh0aGlzLmluQ29tbWl0UGhhc2UgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoaXMgdHJhbnNhY3Rpb24gaXMgaW4gdGhlIGNvbW1pdCBwaGFzZS4gQ2Fubm90IGNvbXBsZXRlIHRoaXMgb3BlcmF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=