@elderbyte/ngx-starter 14.5.2 → 14.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/esm2020/lib/common/enums/elder-enum-translation.service.mjs +3 -3
  2. package/esm2020/lib/common/forms/elder-form-field-control-base.directive.mjs +3 -3
  3. package/esm2020/lib/common/forms/elder-from-field-base.mjs +3 -3
  4. package/esm2020/lib/common/forms/elder-from-field-entity-base.mjs +3 -3
  5. package/esm2020/lib/common/forms/elder-from-field-multi-entity-base.mjs +3 -3
  6. package/esm2020/lib/common/forms/form-field-base.component.mjs +3 -3
  7. package/esm2020/lib/common/forms/multi-model-base.component.mjs +3 -3
  8. package/esm2020/lib/common/forms/template-composite-control.mjs +3 -3
  9. package/esm2020/lib/common/forms/value-accessor-base.mjs +3 -3
  10. package/esm2020/lib/common/http/http-client-builder.service.mjs +3 -3
  11. package/esm2020/lib/common/http/http-client-pristine.mjs +3 -3
  12. package/esm2020/lib/common/http/transfer/data-transfer-factory.mjs +3 -3
  13. package/esm2020/lib/common/url/elder-url-fragment-params.service.mjs +3 -3
  14. package/esm2020/lib/components/access-denied/elder-access-denied.component.mjs +3 -3
  15. package/esm2020/lib/components/access-denied/elder-access-denied.module.mjs +4 -4
  16. package/esm2020/lib/components/auditing/audited-entity/elder-audited-entity.component.mjs +8 -5
  17. package/esm2020/lib/components/auditing/elder-audit.module.mjs +4 -4
  18. package/esm2020/lib/components/button-group/elder-button-group/elder-button-group.component.mjs +3 -3
  19. package/esm2020/lib/components/button-group/elder-button-group.module.mjs +4 -4
  20. package/esm2020/lib/components/card-organizer/card-organizer/elder-card-organizer.component.mjs +3 -3
  21. package/esm2020/lib/components/card-organizer/card-organizer/elder-stack-card.directive.mjs +3 -3
  22. package/esm2020/lib/components/card-organizer/card-stack/elder-card-stack.component.mjs +3 -3
  23. package/esm2020/lib/components/card-organizer/elder-card-organizer.module.mjs +4 -4
  24. package/esm2020/lib/components/cards/elder-card/elder-card-header/elder-card-header.component.mjs +3 -3
  25. package/esm2020/lib/components/cards/elder-card/elder-card.component.mjs +18 -18
  26. package/esm2020/lib/components/cards/elder-card/elder-card.module.mjs +4 -4
  27. package/esm2020/lib/components/connectivity/elder-connectivity.module.mjs +4 -4
  28. package/esm2020/lib/components/connectivity/elder-connectivity.service.mjs +3 -3
  29. package/esm2020/lib/components/connectivity/offline-indicator/elder-offline-indicator.component.mjs +3 -3
  30. package/esm2020/lib/components/containers/elder-containers.module.mjs +4 -4
  31. package/esm2020/lib/components/containers/elder-scroll-container/elder-scroll-container.component.mjs +3 -3
  32. package/esm2020/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +3 -3
  33. package/esm2020/lib/components/csv/elder-csv-stream-exporter-builder.service.mjs +3 -3
  34. package/esm2020/lib/components/csv/elder-csv.module.mjs +4 -4
  35. package/esm2020/lib/components/currency/elder-currency.module.mjs +4 -4
  36. package/esm2020/lib/components/currency/elder-currency.pipe.mjs +3 -3
  37. package/esm2020/lib/components/data-transfer/elder-data-transfer.module.mjs +4 -4
  38. package/esm2020/lib/components/data-transfer/elder-data-transfer.service.mjs +3 -3
  39. package/esm2020/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.mjs +3 -3
  40. package/esm2020/lib/components/data-transfer/http-data-transfer-aggregate/http-data-transfer-aggregate.component.mjs +3 -3
  41. package/esm2020/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.mjs +3 -3
  42. package/esm2020/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +3 -3
  43. package/esm2020/lib/components/data-view/base/elder-data-view-base.mjs +3 -3
  44. package/esm2020/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.mjs +3 -3
  45. package/esm2020/lib/components/data-view/common/elder-data-common.module.mjs +4 -4
  46. package/esm2020/lib/components/data-view/common/elder-data-toolbar/elder-data-toolbar.component.mjs +6 -6
  47. package/esm2020/lib/components/data-view/common/elder-single-sort/elder-single-sort.component.mjs +3 -3
  48. package/esm2020/lib/components/data-view/common/selection/data-context-selection.directive.mjs +3 -3
  49. package/esm2020/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.mjs +3 -3
  50. package/esm2020/lib/components/data-view/grid/elder-grid/elder-grid.component.mjs +9 -9
  51. package/esm2020/lib/components/data-view/grid/elder-grid.module.mjs +4 -4
  52. package/esm2020/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.component.mjs +3 -3
  53. package/esm2020/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.module.mjs +4 -4
  54. package/esm2020/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +3 -3
  55. package/esm2020/lib/components/data-view/table/elder-number-cell.directive.mjs +3 -3
  56. package/esm2020/lib/components/data-view/table/elder-paginator-intl.mjs +3 -3
  57. package/esm2020/lib/components/data-view/table/elder-table/elder-table-toolbar.directive.mjs +3 -3
  58. package/esm2020/lib/components/data-view/table/elder-table/elder-table.component.mjs +3 -3
  59. package/esm2020/lib/components/data-view/table/elder-table-column.directive.mjs +3 -3
  60. package/esm2020/lib/components/data-view/table/elder-table-extension.directive.mjs +3 -3
  61. package/esm2020/lib/components/data-view/table/elder-table-root.directive.mjs +3 -3
  62. package/esm2020/lib/components/data-view/table/elder-table-row.directive.mjs +3 -3
  63. package/esm2020/lib/components/data-view/table/elder-table-sort.directive.mjs +3 -3
  64. package/esm2020/lib/components/data-view/table/elder-table.module.mjs +4 -4
  65. package/esm2020/lib/components/data-view/table/model/elder-table-model.mjs +3 -3
  66. package/esm2020/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.mjs +3 -3
  67. package/esm2020/lib/components/dialogs/elder-dialog.module.mjs +7 -7
  68. package/esm2020/lib/components/dialogs/elder-dialog.service.mjs +3 -3
  69. package/esm2020/lib/components/dialogs/question-dialog/elder-question-dialog.component.mjs +3 -3
  70. package/esm2020/lib/components/dialogs/selection-dialog/elder-selection-dialog/elder-selection-dialog.component.mjs +3 -3
  71. package/esm2020/lib/components/dialogs/selection-dialog/elder-selection-dialog.directive.mjs +3 -3
  72. package/esm2020/lib/components/errors/elder-error.module.mjs +4 -4
  73. package/esm2020/lib/components/errors/exception-detail/elder-exception-detail.component.mjs +3 -3
  74. package/esm2020/lib/components/expand-toggle-button/elder-expand-toggle-button.component.mjs +3 -3
  75. package/esm2020/lib/components/expand-toggle-button/elder-expand-toggle-button.module.mjs +4 -4
  76. package/esm2020/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +3 -3
  77. package/esm2020/lib/components/files/elder-file-drop-zone.directive.mjs +3 -3
  78. package/esm2020/lib/components/files/elder-file-select.directive.mjs +3 -3
  79. package/esm2020/lib/components/files/elder-file.module.mjs +4 -4
  80. package/esm2020/lib/components/files/file-select/file-select.component.mjs +3 -3
  81. package/esm2020/lib/components/files/file-upload/file-upload.component.mjs +3 -3
  82. package/esm2020/lib/components/forms/clipboard/elder-clipboard.service.mjs +3 -3
  83. package/esm2020/lib/components/forms/directives/base/elder-class-hostbinding-base.mjs +3 -3
  84. package/esm2020/lib/components/forms/directives/elder-clipboard-put.directive.mjs +3 -3
  85. package/esm2020/lib/components/forms/directives/elder-delayed-focus.directive.mjs +3 -3
  86. package/esm2020/lib/components/forms/directives/elder-form-field-dense.directive.mjs +3 -3
  87. package/esm2020/lib/components/forms/directives/elder-form-field-label.directive.mjs +3 -3
  88. package/esm2020/lib/components/forms/directives/elder-form-field-no-hint.directive.mjs +3 -3
  89. package/esm2020/lib/components/forms/directives/elder-form-field-no-spinner.directive.mjs +3 -3
  90. package/esm2020/lib/components/forms/directives/elder-forms-directives.module.mjs +13 -13
  91. package/esm2020/lib/components/forms/directives/elder-input-pattern.directive.mjs +3 -3
  92. package/esm2020/lib/components/forms/directives/elder-key-event.directive.mjs +3 -3
  93. package/esm2020/lib/components/forms/directives/elder-max.directive.mjs +3 -3
  94. package/esm2020/lib/components/forms/directives/elder-min.directive.mjs +3 -3
  95. package/esm2020/lib/components/forms/directives/elder-next-focusable.directive.mjs +3 -3
  96. package/esm2020/lib/components/forms/directives/elder-plug-parent-form.directive.mjs +3 -3
  97. package/esm2020/lib/components/forms/directives/elder-stop-event-propagation.directive.mjs +3 -3
  98. package/esm2020/lib/components/forms/directives/elder-tab-focus-trap.directive.mjs +3 -3
  99. package/esm2020/lib/components/forms/directives/elder-touched.directive.mjs +3 -3
  100. package/esm2020/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +3 -3
  101. package/esm2020/lib/components/forms/directives/validation/elder-multiple-of.validator.mjs +3 -3
  102. package/esm2020/lib/components/forms/directives/validation/elder-required-ignore-zero.validator.mjs +3 -3
  103. package/esm2020/lib/components/forms/elder-forms.module.mjs +4 -4
  104. package/esm2020/lib/components/forms/search/elder-search-context.directive.mjs +3 -3
  105. package/esm2020/lib/components/forms/search/elder-search-input.directive.mjs +9 -15
  106. package/esm2020/lib/components/forms/search/elder-search.module.mjs +4 -4
  107. package/esm2020/lib/components/forms/search/search-box/elder-search-box.component.mjs +3 -3
  108. package/esm2020/lib/components/forms/search/search-box/elder-search-panel.component.mjs +3 -3
  109. package/esm2020/lib/components/global-search/elder-global-search.component.mjs +3 -3
  110. package/esm2020/lib/components/global-search/elder-global-search.module.mjs +4 -4
  111. package/esm2020/lib/components/global-search/elder-global-search.service.mjs +3 -3
  112. package/esm2020/lib/components/graph/elder-progress-bar/elder-progress-bar.component.mjs +3 -3
  113. package/esm2020/lib/components/graph/elder-progress-bar/elder-progress-bar.module.mjs +4 -4
  114. package/esm2020/lib/components/headers/elder-header/elder-header.component.mjs +3 -3
  115. package/esm2020/lib/components/headers/elder-header.module.mjs +4 -4
  116. package/esm2020/lib/components/http-support/elder-http-client.service.mjs +3 -3
  117. package/esm2020/lib/components/i18n/entities/elder-i18n-entities.module.mjs +4 -4
  118. package/esm2020/lib/components/i18n/entities/elder-localized-input/elder-localized-input.component.mjs +3 -3
  119. package/esm2020/lib/components/i18n/entities/elder-localized-input-dialog/elder-localized-input-dialog.component.mjs +3 -3
  120. package/esm2020/lib/components/i18n/entities/elder-localized-input-dialog.service.mjs +3 -3
  121. package/esm2020/lib/components/i18n/entities/elder-localized-input-table/elder-localized-input-table.component.mjs +3 -3
  122. package/esm2020/lib/components/i18n/entities/elder-localized-text-column.directive.mjs +3 -3
  123. package/esm2020/lib/components/i18n/entities/elder-localized-texts.directive.mjs +3 -3
  124. package/esm2020/lib/components/i18n/entities/picker/i18n-pick-async.pipe.mjs +3 -3
  125. package/esm2020/lib/components/i18n/entities/picker/i18n-pick.pipe.mjs +3 -3
  126. package/esm2020/lib/components/i18n/entities/picker/localisation-picker.service.mjs +3 -3
  127. package/esm2020/lib/components/i18n/language/elder-language-interceptor.mjs +3 -3
  128. package/esm2020/lib/components/i18n/language/elder-language.module.mjs +4 -4
  129. package/esm2020/lib/components/i18n/language/elder-language.service.mjs +3 -3
  130. package/esm2020/lib/components/i18n/language/language-switcher/elder-language-switcher.component.mjs +3 -3
  131. package/esm2020/lib/components/i18n/locales/elder-locales-de-ch.module.mjs +4 -4
  132. package/esm2020/lib/components/iframes/data-view/data-view-iframe/data-view-iframe.component.mjs +3 -3
  133. package/esm2020/lib/components/iframes/data-view/data-view-iframe-adapter.directive.mjs +3 -3
  134. package/esm2020/lib/components/iframes/elder-iframe.module.mjs +4 -4
  135. package/esm2020/lib/components/iframes/iframe-close.directive.mjs +3 -3
  136. package/esm2020/lib/components/iframes/iframe-dialog/iframe-dialog.component.mjs +3 -3
  137. package/esm2020/lib/components/iframes/iframe-host/iframe-host.component.mjs +3 -3
  138. package/esm2020/lib/components/iframes/iframe-side-content/iframe-side-content.component.mjs +3 -3
  139. package/esm2020/lib/components/iframes/iframe.service.mjs +3 -3
  140. package/esm2020/lib/components/infinitescroll/elder-infinite-autocomplete.directive.mjs +3 -3
  141. package/esm2020/lib/components/infinitescroll/elder-infinite-scroll.directive.mjs +3 -3
  142. package/esm2020/lib/components/infinitescroll/elder-infinite-scroll.module.mjs +7 -7
  143. package/esm2020/lib/components/input/autocomplete/elder-autocomplete/elder-autocomplete-option-selected.mjs +9 -0
  144. package/esm2020/lib/components/input/autocomplete/elder-autocomplete/elder-autocomplete.component.mjs +42 -27
  145. package/esm2020/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +197 -0
  146. package/esm2020/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +11 -11
  147. package/esm2020/lib/components/input/autocomplete/elder-autocomplete.module.mjs +22 -11
  148. package/esm2020/lib/components/input/autocomplete/many/word-position-finder.mjs +58 -0
  149. package/esm2020/lib/components/labels/elder-labels.module.mjs +4 -4
  150. package/esm2020/lib/components/labels/labels-input/labels-input.component.mjs +3 -3
  151. package/esm2020/lib/components/measures/dimensions-input/elder-dimensions-input.component.mjs +3 -3
  152. package/esm2020/lib/components/measures/directives/elder-unit-select.directive.mjs +3 -3
  153. package/esm2020/lib/components/measures/elder-measures.module.mjs +8 -8
  154. package/esm2020/lib/components/measures/elder-quantity-transform.pipe.mjs +3 -3
  155. package/esm2020/lib/components/measures/elder-quantity.pipe.mjs +3 -3
  156. package/esm2020/lib/components/measures/elder-unit.service.mjs +3 -3
  157. package/esm2020/lib/components/measures/quantity-input/elder-quantity-input.component.mjs +3 -3
  158. package/esm2020/lib/components/measures/util/elder-quantity.service.mjs +3 -3
  159. package/esm2020/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.mjs +3 -3
  160. package/esm2020/lib/components/navigation/bread-crumbs/elder-bread-crumbs.module.mjs +4 -4
  161. package/esm2020/lib/components/navigation/nav/elder-nav.module.mjs +4 -4
  162. package/esm2020/lib/components/navigation/nav/nav-group/elder-nav-group.component.mjs +3 -3
  163. package/esm2020/lib/components/navigation/nav/nav-link/elder-nav-link.component.mjs +3 -3
  164. package/esm2020/lib/components/navigation/nav/nav-list/elder-nav-list.component.mjs +3 -3
  165. package/esm2020/lib/components/navigation/toolbar/elder-toolbar-column.directive.mjs +3 -3
  166. package/esm2020/lib/components/navigation/toolbar/elder-toolbar.module.mjs +4 -4
  167. package/esm2020/lib/components/navigation/toolbar/elder-toolbar.service.mjs +3 -3
  168. package/esm2020/lib/components/navigation/toolbar/toolbar/elder-toolbar.component.mjs +3 -3
  169. package/esm2020/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.mjs +3 -3
  170. package/esm2020/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.service.mjs +3 -3
  171. package/esm2020/lib/components/overlays/elder-overlay-origin.directive.mjs +3 -3
  172. package/esm2020/lib/components/overlays/elder-overlay-trigger.directive.mjs +3 -3
  173. package/esm2020/lib/components/overlays/elder-overlay.component.mjs +3 -3
  174. package/esm2020/lib/components/overlays/elder-overlay.module.mjs +4 -4
  175. package/esm2020/lib/components/panels/card-panel/elder-card-panel.component.mjs +3 -3
  176. package/esm2020/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.mjs +3 -3
  177. package/esm2020/lib/components/panels/elder-panel.module.mjs +4 -4
  178. package/esm2020/lib/components/panels/flat/elder-panel.component.mjs +3 -3
  179. package/esm2020/lib/components/public_api.mjs +1 -2
  180. package/esm2020/lib/components/select/auto/elder-auto-select-first.directive.mjs +3 -3
  181. package/esm2020/lib/components/select/elder-select-base.mjs +3 -3
  182. package/esm2020/lib/components/select/elder-select-chip.directive.mjs +9 -9
  183. package/esm2020/lib/components/select/elder-select-on-tab.directive.mjs +3 -3
  184. package/esm2020/lib/components/select/elder-select-value.directive.mjs +3 -3
  185. package/esm2020/lib/components/select/elder-select.module.mjs +5 -5
  186. package/esm2020/lib/components/select/multi/elder-multi-select-base.mjs +3 -3
  187. package/esm2020/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +22 -21
  188. package/esm2020/lib/components/select/multi/elder-multi-select-form-field.mjs +3 -3
  189. package/esm2020/lib/components/select/popup/selection-model-popup.directive.mjs +3 -3
  190. package/esm2020/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +3 -3
  191. package/esm2020/lib/components/select/single/elder-clear-select.directive.mjs +3 -3
  192. package/esm2020/lib/components/select/single/elder-select/elder-select.component.mjs +10 -9
  193. package/esm2020/lib/components/select/single/elder-select-form-field.mjs +3 -3
  194. package/esm2020/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.mjs +3 -3
  195. package/esm2020/lib/components/select-chip-list/elder-chip-list-select.module.mjs +4 -4
  196. package/esm2020/lib/components/select-list/elder-select-list.module.mjs +4 -4
  197. package/esm2020/lib/components/select-list/select-list/elder-select-list.component.mjs +3 -3
  198. package/esm2020/lib/components/select-list/select-list-item/elder-select-list-item.component.mjs +3 -3
  199. package/esm2020/lib/components/shell/drawers/elder-route-outlet-drawer.service.mjs +3 -3
  200. package/esm2020/lib/components/shell/drawers/elder-router-outlet.service.mjs +3 -3
  201. package/esm2020/lib/components/shell/elder-shell-slot.directive.mjs +3 -3
  202. package/esm2020/lib/components/shell/elder-shell.module.mjs +4 -4
  203. package/esm2020/lib/components/shell/elder-shell.service.mjs +3 -3
  204. package/esm2020/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +3 -3
  205. package/esm2020/lib/components/shell/shell/elder-shell.component.mjs +12 -12
  206. package/esm2020/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.mjs +3 -3
  207. package/esm2020/lib/components/tabs/elder-tab/elder-tab.directive.mjs +3 -3
  208. package/esm2020/lib/components/tabs/elder-tab-group-routing/elder-tab-group-routing.directive.mjs +3 -3
  209. package/esm2020/lib/components/tabs/elder-tab.module.mjs +4 -4
  210. package/esm2020/lib/components/theme/elder-theme-applier.directive.mjs +3 -3
  211. package/esm2020/lib/components/theme/elder-theme-preference.service.mjs +3 -3
  212. package/esm2020/lib/components/theme/elder-theme-toggle/elder-theme-toggle.component.mjs +3 -3
  213. package/esm2020/lib/components/theme/elder-theme.directive.mjs +3 -3
  214. package/esm2020/lib/components/theme/elder-theme.module.mjs +4 -4
  215. package/esm2020/lib/components/theme/elder-theme.service.mjs +3 -3
  216. package/esm2020/lib/components/time/date-adapters/custom-date-adapter.mjs +3 -3
  217. package/esm2020/lib/components/time/duration/elder-duration-input/elder-duration-input.component.mjs +3 -3
  218. package/esm2020/lib/components/time/elder-date-switcher/elder-date-switcher.component.mjs +3 -3
  219. package/esm2020/lib/components/time/elder-date-time-input/elder-date-time-input.component.mjs +3 -3
  220. package/esm2020/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +3 -3
  221. package/esm2020/lib/components/time/elder-local-date-input/elder-local-date-input.component.mjs +3 -3
  222. package/esm2020/lib/components/time/elder-local-time-input/elder-local-time-input.component.mjs +3 -3
  223. package/esm2020/lib/components/time/elder-time.module.mjs +8 -8
  224. package/esm2020/lib/components/time/period/elder-period-input/elder-period-input.component.mjs +3 -3
  225. package/esm2020/lib/components/toasts/elder-toast.module.mjs +4 -4
  226. package/esm2020/lib/components/toasts/elder-toast.service.mjs +9 -9
  227. package/esm2020/lib/components/toasts/standard-toast/standard-toast.component.mjs +3 -3
  228. package/esm2020/lib/components/url-fragment/elder-url-fragment.module.mjs +4 -4
  229. package/esm2020/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.mjs +3 -3
  230. package/esm2020/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.mjs +3 -3
  231. package/esm2020/lib/components/viewers/elder-viewers.module.mjs +4 -4
  232. package/esm2020/lib/features/event-source/elder-event-source.service.mjs +3 -3
  233. package/esm2020/lib/features/kafent/access-token-provider.mjs +3 -3
  234. package/esm2020/lib/features/kafent/kafent-config.mjs +3 -3
  235. package/esm2020/lib/features/kafent/kafent-event-stream.mjs +3 -3
  236. package/esm2020/lib/features/kafent/kafent-event.service.mjs +3 -3
  237. package/esm2020/lib/features/kafent/kafent.module.mjs +4 -4
  238. package/esm2020/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +3 -3
  239. package/esm2020/lib/pipes/bytes.pipe.mjs +3 -3
  240. package/esm2020/lib/pipes/elder-pipes.module.mjs +10 -10
  241. package/esm2020/lib/pipes/elder-repeat.pipe.mjs +3 -3
  242. package/esm2020/lib/pipes/elder-round.pipe.mjs +3 -3
  243. package/esm2020/lib/pipes/elder-safe-url.pipe.mjs +3 -3
  244. package/esm2020/lib/pipes/elder-truncate.pipe.mjs +3 -3
  245. package/esm2020/lib/pipes/iso-duration.pipe.mjs +3 -3
  246. package/esm2020/lib/pipes/iso-interval-parse.pipe.mjs +3 -3
  247. package/esm2020/lib/pipes/iso-interval.pipe.mjs +3 -3
  248. package/esm2020/lib/pipes/time-ago.pipe.mjs +3 -3
  249. package/esm2020/lib/pipes/time-duration.pipe.mjs +3 -3
  250. package/esm2020/lib/pipes/weight.pipe.mjs +3 -3
  251. package/fesm2015/elderbyte-ngx-starter.mjs +1217 -1104
  252. package/fesm2015/elderbyte-ngx-starter.mjs.map +1 -1
  253. package/fesm2020/elderbyte-ngx-starter.mjs +1214 -1104
  254. package/fesm2020/elderbyte-ngx-starter.mjs.map +1 -1
  255. package/lib/components/auditing/audited-entity/elder-audited-entity.component.d.ts +2 -1
  256. package/lib/components/forms/search/elder-search-input.directive.d.ts +6 -7
  257. package/lib/components/input/autocomplete/elder-autocomplete/elder-autocomplete-option-selected.d.ts +8 -0
  258. package/lib/components/input/autocomplete/elder-autocomplete/elder-autocomplete.component.d.ts +14 -14
  259. package/lib/components/{multi-autocomplete/elder-multi-autocomplete.component.d.ts → input/autocomplete/elder-autocomplete-many.directive.d.ts} +46 -27
  260. package/lib/components/input/autocomplete/elder-autocomplete.directive.d.ts +1 -1
  261. package/lib/components/input/autocomplete/elder-autocomplete.module.d.ts +11 -7
  262. package/lib/components/{multi-autocomplete/word-position.d.ts → input/autocomplete/many/word-position-finder.d.ts} +0 -0
  263. package/lib/components/public_api.d.ts +0 -1
  264. package/lib/components/select/elder-select.module.d.ts +1 -1
  265. package/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.d.ts +19 -8
  266. package/lib/components/select/single/elder-select/elder-select.component.d.ts +2 -1
  267. package/package.json +1 -1
  268. package/src/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.scss +8 -0
  269. package/esm2020/lib/components/multi-autocomplete/elder-multi-auto-complete.module.mjs +0 -30
  270. package/esm2020/lib/components/multi-autocomplete/elder-multi-autocomplete.component.mjs +0 -122
  271. package/esm2020/lib/components/multi-autocomplete/word-position.mjs +0 -38
  272. package/lib/components/multi-autocomplete/elder-multi-auto-complete.module.d.ts +0 -14
  273. package/src/lib/components/multi-autocomplete/elder-multi-autocomplete.component.scss +0 -0
@@ -10,18 +10,18 @@ export { ElderInfiniteAutocompleteDirective } from './elder-infinite-autocomplet
10
10
  */
11
11
  export class ElderInfiniteScrollLegacyDirective extends ElderInfiniteScrollDirective {
12
12
  }
13
- ElderInfiniteScrollLegacyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollLegacyDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
14
- ElderInfiniteScrollLegacyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.0", type: ElderInfiniteScrollLegacyDirective, selector: "[infiniteScroll]", usesInheritance: true, ngImport: i0 });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollLegacyDirective, decorators: [{
13
+ ElderInfiniteScrollLegacyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollLegacyDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
14
+ ElderInfiniteScrollLegacyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: ElderInfiniteScrollLegacyDirective, selector: "[infiniteScroll]", usesInheritance: true, ngImport: i0 });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollLegacyDirective, decorators: [{
16
16
  type: Directive,
17
17
  args: [{ selector: '[infiniteScroll]' }]
18
18
  }] });
19
19
  export class ElderInfiniteScrollModule {
20
20
  }
21
- ElderInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
- ElderInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollModule, declarations: [ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteAutocompleteDirective], imports: [CommonModule], exports: [ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteAutocompleteDirective] });
23
- ElderInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollModule, imports: [CommonModule] });
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderInfiniteScrollModule, decorators: [{
21
+ ElderInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ ElderInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollModule, declarations: [ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteAutocompleteDirective], imports: [CommonModule], exports: [ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteAutocompleteDirective] });
23
+ ElderInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollModule, imports: [CommonModule] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderInfiniteScrollModule, decorators: [{
25
25
  type: NgModule,
26
26
  args: [{
27
27
  declarations: [
@@ -0,0 +1,9 @@
1
+ export class ElderAutocompleteOptionSelected {
2
+ constructor(source, entityId, entity, optionValue) {
3
+ this.source = source;
4
+ this.entityId = entityId;
5
+ this.entity = entity;
6
+ this.optionValue = optionValue;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItYXV0b2NvbXBsZXRlLW9wdGlvbi1zZWxlY3RlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS9lbGRlci1hdXRvY29tcGxldGUtb3B0aW9uLXNlbGVjdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTywrQkFBK0I7SUFDMUMsWUFDa0IsTUFBMEMsRUFDMUMsUUFBYSxFQUNiLE1BQVMsRUFDVCxXQUFnQjtRQUhoQixXQUFNLEdBQU4sTUFBTSxDQUFvQztRQUMxQyxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQ2IsV0FBTSxHQUFOLE1BQU0sQ0FBRztRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO0lBRWxDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RWxkZXJBdXRvY29tcGxldGVDb21wb25lbnR9IGZyb20gJy4vZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBFbGRlckF1dG9jb21wbGV0ZU9wdGlvblNlbGVjdGVkPFQgPSBhbnksIFRJZCA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc291cmNlOiBFbGRlckF1dG9jb21wbGV0ZUNvbXBvbmVudDxULCBUSWQ+LFxuICAgIHB1YmxpYyByZWFkb25seSBlbnRpdHlJZDogVElkLFxuICAgIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IFQsXG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvblZhbHVlOiBhbnlcbiAgKSB7XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { Component, ChangeDetectionStrategy, Input, TemplateRef, ContentChild, Output, ViewChild } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, ContentChild, Input, Output, TemplateRef, ViewChild } from '@angular/core';
2
2
  import { LoggerFactory } from '@elderbyte/ts-logger';
3
3
  import { BehaviorSubject, of, Subject } from 'rxjs';
4
4
  import { isContinuableDataContext } from '../../../../common/data/data-context/data-context';
@@ -6,6 +6,7 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion';
6
6
  import { filter, switchMap } from 'rxjs/operators';
7
7
  import { runInZone } from '../../../../common/utils/ng-zone-utils';
8
8
  import { ElderSelectValueDirective } from '../../../select/elder-select-value.directive';
9
+ import { ElderAutocompleteOptionSelected } from './elder-autocomplete-option-selected';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "@angular/common";
11
12
  import * as i2 from "@angular/material/autocomplete";
@@ -37,24 +38,19 @@ export class ElderAutocompleteComponent {
37
38
  * The underlying Material Autocomplete
38
39
  */
39
40
  this.matAutocomplete$ = new BehaviorSubject(null);
40
- /** Underlying data context. */
41
- this.suggestionsDc$ = new BehaviorSubject(null);
41
+ /**
42
+ * The DataContext which holds the autocomplete suggestions.
43
+ */
44
+ this.dataContext$ = new BehaviorSubject(null);
42
45
  this.triggerReload$ = new Subject();
43
46
  this.displayPropertyResolver$ = new BehaviorSubject((value) => this.propertyStringValue(value, null));
44
47
  this.optionSelected = new Subject();
45
- this.dataState$ = this.suggestionsDc$.pipe(filter(dc => !!dc), switchMap(dc => dc.status), runInZone(this.zone));
46
- this.availableSuggestions$ = this.suggestionsDc$.pipe(switchMap(dc => dc ? dc.data : of([])), runInZone(this.zone));
48
+ this.dataState$ = this.dataContext$.pipe(filter(dc => !!dc), switchMap(dc => dc.status), runInZone(this.zone));
49
+ this.availableSuggestions$ = this.dataContext$.pipe(switchMap(dc => dc ? dc.data : of([])), runInZone(this.zone));
47
50
  }
48
51
  set matAutocomplete(auto) {
49
52
  this.matAutocomplete$.next(auto);
50
53
  }
51
- /***************************************************************************
52
- * *
53
- * Life Cycle *
54
- * *
55
- **************************************************************************/
56
- ngOnInit() {
57
- }
58
54
  /***************************************************************************
59
55
  * *
60
56
  * Properties *
@@ -72,11 +68,11 @@ export class ElderAutocompleteComponent {
72
68
  get valueTemplate() {
73
69
  return this._valueTemplate || this.valueTemplateQuery;
74
70
  }
75
- set suggestionsDc(data) {
76
- this.suggestionsDc$.next(data);
71
+ set dataContext(data) {
72
+ this.dataContext$.next(data);
77
73
  }
78
- get suggestionsDc() {
79
- return this.suggestionsDc$.getValue();
74
+ get dataContext() {
75
+ return this.dataContext$.getValue();
80
76
  }
81
77
  set displayPropertyResolver(resolver) {
82
78
  this.displayPropertyResolver$.next(resolver);
@@ -87,7 +83,16 @@ export class ElderAutocompleteComponent {
87
83
  * *
88
84
  **************************************************************************/
89
85
  onOptionSelected(event) {
90
- this.optionSelected.next(event.option.value);
86
+ const option = event.option;
87
+ const id = option.id;
88
+ this.optionSelected.next(new ElderAutocompleteOptionSelected(this, id, this.getEntityById(id), option.value));
89
+ }
90
+ getEntityById(id) {
91
+ const dc = this.dataContext;
92
+ if (dc) {
93
+ return dc.snapshot.data.find(e => this.getId(e) == id);
94
+ }
95
+ return undefined;
91
96
  }
92
97
  onAutocompleteOpened(event) {
93
98
  this.logger.debug('Autocomplete opened:', event);
@@ -97,9 +102,9 @@ export class ElderAutocompleteComponent {
97
102
  }
98
103
  onAutoCompleteCloseToEnd(event) {
99
104
  // this.logger.debug('Autocomplete is close to end!');
100
- if (isContinuableDataContext(this.suggestionsDc)) {
101
- if (!this.suggestionsDc.snapshot.isLoading) {
102
- this.suggestionsDc.loadMore();
105
+ if (isContinuableDataContext(this.dataContext)) {
106
+ if (!this.dataContext.snapshot.isLoading) {
107
+ this.dataContext.loadMore();
103
108
  }
104
109
  }
105
110
  }
@@ -107,7 +112,7 @@ export class ElderAutocompleteComponent {
107
112
  return String(this.getId(value));
108
113
  }
109
114
  getId(value) {
110
- return this.suggestionsDc?.dataSource?.getId(value) || value;
115
+ return this.dataContext?.dataSource?.getId(value) || value;
111
116
  }
112
117
  isOptionAvailable(option) {
113
118
  if (this.isOptionDisabledFn) {
@@ -125,6 +130,14 @@ export class ElderAutocompleteComponent {
125
130
  return true;
126
131
  }
127
132
  }
133
+ toOptionValue(option) {
134
+ if (this.optionValueConverterFn) {
135
+ return this.optionValueConverterFn(option);
136
+ }
137
+ else {
138
+ return option;
139
+ }
140
+ }
128
141
  /***************************************************************************
129
142
  * *
130
143
  * Private methods *
@@ -143,11 +156,11 @@ export class ElderAutocompleteComponent {
143
156
  return String(value);
144
157
  }
145
158
  }
146
- ElderAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderAutocompleteComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
147
- ElderAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ElderAutocompleteComponent, selector: "elder-autocomplete", inputs: { isOptionDisabledFn: "isOptionDisabledFn", isOptionHiddenFn: "isOptionHiddenFn", enabled: "enabled", valueTemplate: "valueTemplate", suggestionsDc: "suggestionsDc", displayPropertyResolver: "displayPropertyResolver" }, outputs: { optionSelected: "optionSelected" }, queries: [{ propertyName: "valueTemplateQuery", first: true, predicate: ElderSelectValueDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }], exportAs: ["elderAutocomplete"], ngImport: i0, template: "<mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n (opened)=\"onAutocompleteOpened($event)\"\n (optionSelected)=\"onOptionSelected($event)\"\n elderInfiniteScroll elderElderInfiniteAutocomplete (closeToEnd)=\"onAutoCompleteCloseToEnd($event)\"\n>\n <!--\n <mat-option *ngIf=\"allowNull\" [value]=\"null\">{{nullDisplay | translate}}</mat-option>\n -->\n\n <mat-option disabled *ngIf=\"!(suggestionsDc$ | async)\">\n <span class=\"mat-caption\">No DataSource / DataContext!</span>\n </mat-option>\n\n <ng-container *ngIf=\"suggestionsDc$ | async as dc\">\n\n <mat-option disabled *ngIf=\"dc.isClosed\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"mat-caption\">DataContext Closed!</span>\n </div>\n </mat-option>\n\n <ng-container *ngIf=\"availableSuggestions$ | async as suggestions\">\n\n <mat-option *ngIf=\"suggestions.length === 0\" disabled>\n No Data.\n </mat-option>\n\n <ng-container *ngFor=\"let suggestion of suggestions\">\n <mat-option\n *ngIf=\"isOptionVisible(suggestion)\"\n [value]=\"suggestion\"\n [id]=\"getIdAsString(suggestion)\"\n [disabled]=\"!isOptionAvailable(suggestion)\"\n >\n <ng-container\n *ngTemplateOutlet=\"valueTemplate || simpleValueTemplate; context: {$implicit: suggestion}\">\n </ng-container>\n </mat-option>\n </ng-container>\n\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"dataState$ | async as state\">\n\n <mat-option disabled *ngIf=\"!state.idle || state.loading\">\n <mat-progress-bar\n [value]=\"100\"\n [mode]=\"state.loading ? 'query' : 'determinate'\"\n [color]=\"state.error ? 'warn' : 'primary'\"\n ></mat-progress-bar>\n </mat-option>\n\n </ng-container>\n</mat-autocomplete>\n\n<ng-template #simpleValueTemplate let-value>\n <ng-container *ngIf=\"displayPropertyResolver$ | async as propertyResolver\">\n <p class=\"noselect\">{{propertyResolver(value)}}</p>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.ElderInfiniteScrollDirective, selector: "[elderInfiniteScroll]", inputs: ["listenToHost", "eventThrottle", "offsetFactor", "ignoreScrollEvent", "containerId", "scrollContainer"], outputs: ["closeToEnd", "scrolling"] }, { kind: "directive", type: i5.ElderInfiniteAutocompleteDirective, selector: "mat-autocomplete[elderElderInfiniteAutocomplete]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ElderAutocompleteComponent, decorators: [{
159
+ ElderAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderAutocompleteComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
160
+ ElderAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ElderAutocompleteComponent, selector: "elder-autocomplete", inputs: { isOptionDisabledFn: "isOptionDisabledFn", isOptionHiddenFn: "isOptionHiddenFn", optionValueConverterFn: "optionValueConverterFn", enabled: "enabled", valueTemplate: "valueTemplate", dataContext: "dataContext", displayPropertyResolver: "displayPropertyResolver" }, outputs: { optionSelected: "optionSelected" }, queries: [{ propertyName: "valueTemplateQuery", first: true, predicate: ElderSelectValueDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "matAutocomplete", first: true, predicate: ["auto"], descendants: true }], exportAs: ["elderAutocomplete"], ngImport: i0, template: "<mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n (opened)=\"onAutocompleteOpened($event)\"\n (optionSelected)=\"onOptionSelected($event)\"\n elderInfiniteScroll elderElderInfiniteAutocomplete (closeToEnd)=\"onAutoCompleteCloseToEnd($event)\"\n>\n <!--\n <mat-option *ngIf=\"allowNull\" [value]=\"null\">{{nullDisplay | translate}}</mat-option>\n -->\n\n <mat-option disabled *ngIf=\"!(dataContext$ | async)\">\n <span class=\"mat-caption\">No DataSource / DataContext!</span>\n </mat-option>\n\n <ng-container *ngIf=\"dataContext$ | async as dc\">\n\n <mat-option disabled *ngIf=\"dc.isClosed\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"mat-caption\">DataContext Closed!</span>\n </div>\n </mat-option>\n\n <ng-container *ngIf=\"availableSuggestions$ | async as suggestions\">\n\n <mat-option *ngIf=\"suggestions.length === 0\" disabled>\n No Data.\n </mat-option>\n\n <ng-container *ngFor=\"let suggestion of suggestions\">\n <mat-option\n *ngIf=\"isOptionVisible(suggestion)\"\n [value]=\"toOptionValue(suggestion)\"\n [id]=\"getIdAsString(suggestion)\"\n [disabled]=\"!isOptionAvailable(suggestion)\"\n >\n <ng-container\n *ngTemplateOutlet=\"valueTemplate || simpleValueTemplate; context: {$implicit: suggestion}\">\n </ng-container>\n <!--\n <span class=\"mat-caption\">value: {{toOptionValue(suggestion)}}</span>\n -->\n </mat-option>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"dataState$ | async as state\">\n\n <mat-option disabled *ngIf=\"!state.idle || state.loading\">\n <mat-progress-bar\n [value]=\"100\"\n [mode]=\"state.loading ? 'query' : 'determinate'\"\n [color]=\"state.error ? 'warn' : 'primary'\"\n ></mat-progress-bar>\n </mat-option>\n\n </ng-container>\n</mat-autocomplete>\n\n<ng-template #simpleValueTemplate let-value>\n <ng-container *ngIf=\"displayPropertyResolver$ | async as propertyResolver\">\n <span class=\"noselect\">{{propertyResolver(value)}}</span>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.ElderInfiniteScrollDirective, selector: "[elderInfiniteScroll]", inputs: ["listenToHost", "eventThrottle", "offsetFactor", "ignoreScrollEvent", "containerId", "scrollContainer"], outputs: ["closeToEnd", "scrolling"] }, { kind: "directive", type: i5.ElderInfiniteAutocompleteDirective, selector: "mat-autocomplete[elderElderInfiniteAutocomplete]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i7.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderAutocompleteComponent, decorators: [{
149
162
  type: Component,
150
- args: [{ selector: 'elder-autocomplete', exportAs: 'elderAutocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n (opened)=\"onAutocompleteOpened($event)\"\n (optionSelected)=\"onOptionSelected($event)\"\n elderInfiniteScroll elderElderInfiniteAutocomplete (closeToEnd)=\"onAutoCompleteCloseToEnd($event)\"\n>\n <!--\n <mat-option *ngIf=\"allowNull\" [value]=\"null\">{{nullDisplay | translate}}</mat-option>\n -->\n\n <mat-option disabled *ngIf=\"!(suggestionsDc$ | async)\">\n <span class=\"mat-caption\">No DataSource / DataContext!</span>\n </mat-option>\n\n <ng-container *ngIf=\"suggestionsDc$ | async as dc\">\n\n <mat-option disabled *ngIf=\"dc.isClosed\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"mat-caption\">DataContext Closed!</span>\n </div>\n </mat-option>\n\n <ng-container *ngIf=\"availableSuggestions$ | async as suggestions\">\n\n <mat-option *ngIf=\"suggestions.length === 0\" disabled>\n No Data.\n </mat-option>\n\n <ng-container *ngFor=\"let suggestion of suggestions\">\n <mat-option\n *ngIf=\"isOptionVisible(suggestion)\"\n [value]=\"suggestion\"\n [id]=\"getIdAsString(suggestion)\"\n [disabled]=\"!isOptionAvailable(suggestion)\"\n >\n <ng-container\n *ngTemplateOutlet=\"valueTemplate || simpleValueTemplate; context: {$implicit: suggestion}\">\n </ng-container>\n </mat-option>\n </ng-container>\n\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"dataState$ | async as state\">\n\n <mat-option disabled *ngIf=\"!state.idle || state.loading\">\n <mat-progress-bar\n [value]=\"100\"\n [mode]=\"state.loading ? 'query' : 'determinate'\"\n [color]=\"state.error ? 'warn' : 'primary'\"\n ></mat-progress-bar>\n </mat-option>\n\n </ng-container>\n</mat-autocomplete>\n\n<ng-template #simpleValueTemplate let-value>\n <ng-container *ngIf=\"displayPropertyResolver$ | async as propertyResolver\">\n <p class=\"noselect\">{{propertyResolver(value)}}</p>\n </ng-container>\n</ng-template>\n" }]
163
+ args: [{ selector: 'elder-autocomplete', exportAs: 'elderAutocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-autocomplete\n #auto=\"matAutocomplete\"\n [autoActiveFirstOption]=\"true\"\n (opened)=\"onAutocompleteOpened($event)\"\n (optionSelected)=\"onOptionSelected($event)\"\n elderInfiniteScroll elderElderInfiniteAutocomplete (closeToEnd)=\"onAutoCompleteCloseToEnd($event)\"\n>\n <!--\n <mat-option *ngIf=\"allowNull\" [value]=\"null\">{{nullDisplay | translate}}</mat-option>\n -->\n\n <mat-option disabled *ngIf=\"!(dataContext$ | async)\">\n <span class=\"mat-caption\">No DataSource / DataContext!</span>\n </mat-option>\n\n <ng-container *ngIf=\"dataContext$ | async as dc\">\n\n <mat-option disabled *ngIf=\"dc.isClosed\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"mat-caption\">DataContext Closed!</span>\n </div>\n </mat-option>\n\n <ng-container *ngIf=\"availableSuggestions$ | async as suggestions\">\n\n <mat-option *ngIf=\"suggestions.length === 0\" disabled>\n No Data.\n </mat-option>\n\n <ng-container *ngFor=\"let suggestion of suggestions\">\n <mat-option\n *ngIf=\"isOptionVisible(suggestion)\"\n [value]=\"toOptionValue(suggestion)\"\n [id]=\"getIdAsString(suggestion)\"\n [disabled]=\"!isOptionAvailable(suggestion)\"\n >\n <ng-container\n *ngTemplateOutlet=\"valueTemplate || simpleValueTemplate; context: {$implicit: suggestion}\">\n </ng-container>\n <!--\n <span class=\"mat-caption\">value: {{toOptionValue(suggestion)}}</span>\n -->\n </mat-option>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"dataState$ | async as state\">\n\n <mat-option disabled *ngIf=\"!state.idle || state.loading\">\n <mat-progress-bar\n [value]=\"100\"\n [mode]=\"state.loading ? 'query' : 'determinate'\"\n [color]=\"state.error ? 'warn' : 'primary'\"\n ></mat-progress-bar>\n </mat-option>\n\n </ng-container>\n</mat-autocomplete>\n\n<ng-template #simpleValueTemplate let-value>\n <ng-container *ngIf=\"displayPropertyResolver$ | async as propertyResolver\">\n <span class=\"noselect\">{{propertyResolver(value)}}</span>\n </ng-container>\n</ng-template>\n" }]
151
164
  }], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { valueTemplateQuery: [{
152
165
  type: ContentChild,
153
166
  args: [ElderSelectValueDirective, { read: TemplateRef, static: true }]
@@ -158,15 +171,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
158
171
  type: Input
159
172
  }], isOptionHiddenFn: [{
160
173
  type: Input
174
+ }], optionValueConverterFn: [{
175
+ type: Input
161
176
  }], optionSelected: [{
162
177
  type: Output
163
178
  }], enabled: [{
164
179
  type: Input
165
180
  }], valueTemplate: [{
166
181
  type: Input
167
- }], suggestionsDc: [{
182
+ }], dataContext: [{
168
183
  type: Input
169
184
  }], displayPropertyResolver: [{
170
185
  type: Input
171
186
  }] } });
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS9lbGRlci1hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9hdXRvY29tcGxldGUvZWxkZXItYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsZUFBZSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFlLHdCQUF3QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDekcsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFHakUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sOENBQThDLENBQUM7Ozs7Ozs7Ozs7QUFXdkYsTUFBTSxPQUFPLDBCQUEwQjtJQW9EckM7Ozs7Z0ZBSTRFO0lBRTVFLFlB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U0FBUyxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLFFBQVEsRUFBRTtZQUNaLE9BQWEsS0FBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQzs7dUhBOUxVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLDZYQWtCdkIseUJBQXlCLDJCQUFTLFdBQVcscUxDakQ3RCw2cEVBa0VBOzJGRG5DYSwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0Usb0JBQW9CLFlBQ3BCLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNOzZGQXFCeEMsa0JBQWtCO3NCQUR4QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQVUvRCxlQUFlO3NCQUR6QixTQUFTO3VCQUFDLE1BQU07Z0JBTVYsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFlVSxjQUFjO3NCQUQ3QixNQUFNO2dCQXlDSSxPQUFPO3NCQURqQixLQUFLO2dCQVVLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBVUssYUFBYTtzQkFEdkIsS0FBSztnQkFVSyx1QkFBdUI7c0JBRGpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIElucHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgQ29udGVudENoaWxkLFxuICBOZ1pvbmUsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJGYWN0b3J5fSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtJRGF0YUNvbnRleHQsIGlzQ29udGludWFibGVEYXRhQ29udGV4dH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2RhdGEvZGF0YS1jb250ZXh0L2RhdGEtY29udGV4dCc7XG5pbXBvcnQge2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7ZmlsdGVyLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7cnVuSW5ab25lfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vdXRpbHMvbmctem9uZS11dGlscyc7XG5pbXBvcnQge0RhdGFDb250ZXh0U3RhdHVzfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vZGF0YS9kYXRhLWNvbnRleHQvZGF0YS1jb250ZXh0LXN0YXR1cyc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7RWxkZXJTZWxlY3RWYWx1ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vLi4vc2VsZWN0L2VsZGVyLXNlbGVjdC12YWx1ZS5kaXJlY3RpdmUnO1xuXG50eXBlIFRleHRSZXNvbHZlckZuID0gKHZhbHVlOiBhbnkpID0+IHN0cmluZztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWxkZXItYXV0b2NvbXBsZXRlJyxcbiAgZXhwb3J0QXM6ICdlbGRlckF1dG9jb21wbGV0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbGRlci1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbGRlci1hdXRvY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRWxkZXJBdXRvY29tcGxldGVDb21wb25lbnQ8VCA9IGFueSwgVElkID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIGF1dG8tY29tcGxldGUgZW5hYmxlZD9cbiAgICovXG4gIHByaXZhdGUgX2VuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGVtcGxhdGUgdG8gY3VzdG9taXplIHRoZSB1aSBsb29rLlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChFbGRlclNlbGVjdFZhbHVlRGlyZWN0aXZlLCB7cmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZX0pXG4gIHB1YmxpYyB2YWx1ZVRlbXBsYXRlUXVlcnk6IFRlbXBsYXRlUmVmPGFueT47XG4gIHByaXZhdGUgX3ZhbHVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIE1hdGVyaWFsIEF1dG9jb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1hdEF1dG9jb21wbGV0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hdEF1dG9jb21wbGV0ZT4obnVsbCk7XG5cbiAgQFZpZXdDaGlsZCgnYXV0bycpXG4gIHB1YmxpYyBzZXQgbWF0QXV0b2NvbXBsZXRlKGF1dG86IE1hdEF1dG9jb21wbGV0ZSkge1xuICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlJC5uZXh0KGF1dG8pO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIGlzT3B0aW9uRGlzYWJsZWRGbjogKG9wdGlvbjogVCkgPT4gYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaXNPcHRpb25IaWRkZW5GbjogKG9wdGlvbjogVCkgPT4gYm9vbGVhbjtcblxuICAvKiogVW5kZXJseWluZyBkYXRhIGNvbnRleHQuICovXG4gIHB1YmxpYyByZWFkb25seSBzdWdnZXN0aW9uc0RjJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SURhdGFDb250ZXh0PFQ+PihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdHJpZ2dlclJlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlQcm9wZXJ0eVJlc29sdmVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGV4dFJlc29sdmVyRm4+KCh2YWx1ZTogVCkgPT4gdGhpcy5wcm9wZXJ0eVN0cmluZ1ZhbHVlKHZhbHVlLCBudWxsKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFTdGF0ZSQ6IE9ic2VydmFibGU8RGF0YUNvbnRleHRTdGF0dXM+O1xuXG4gIHB1YmxpYyByZWFkb25seSBhdmFpbGFibGVTdWdnZXN0aW9ucyQ6IE9ic2VydmFibGU8VFtdPjtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvblNlbGVjdGVkID0gbmV3IFN1YmplY3QoKTtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHpvbmU6IE5nWm9uZSxcbiAgKSB7XG4gICAgdGhpcy5kYXRhU3RhdGUkID0gdGhpcy5zdWdnZXN0aW9uc0RjJC5waXBlKFxuICAgICAgZmlsdGVyKGRjID0+ICEhZGMpLFxuICAgICAgc3dpdGNoTWFwKGRjID0+IGRjLnN0YXR1cyksXG4gICAgICBydW5JblpvbmUodGhpcy56b25lKVxuICAgICk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZVN1Z2dlc3Rpb25zJCA9IHRoaXMuc3VnZ2VzdGlvbnNEYyQucGlwZShcbiAgICAgIHN3aXRjaE1hcChkYyA9PiBkYyA/IGRjLmRhdGEgOiBvZihbXSkpLFxuICAgICAgcnVuSW5ab25lKHRoaXMuem9uZSlcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdmFsdWVUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMuX3ZhbHVlVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVUZW1wbGF0ZSB8fCB0aGlzLnZhbHVlVGVtcGxhdGVRdWVyeTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc3VnZ2VzdGlvbnNEYyhkYXRhOiBJRGF0YUNvbnRleHQ8VD4pIHtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zRGMkLm5leHQoZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN1Z2dlc3Rpb25zRGMoKTogSURhdGFDb250ZXh0PFQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9uc0RjJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNwbGF5UHJvcGVydHlSZXNvbHZlcihyZXNvbHZlcjogVGV4dFJlc29sdmVyRm4pIHtcbiAgICB0aGlzLmRpc3BsYXlQcm9wZXJ0eVJlc29sdmVyJC5uZXh0KHJlc29sdmVyKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25TZWxlY3RlZC5uZXh0KGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25BdXRvY29tcGxldGVPcGVuZWQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdBdXRvY29tcGxldGUgb3BlbmVkOicsIGV2ZW50KTtcbiAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWxvYWQkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQXV0b0NvbXBsZXRlQ2xvc2VUb0VuZChldmVudDogVUlFdmVudCk6IHZvaWQge1xuICAgIC8vIHRoaXMubG9nZ2VyLmRlYnVnKCdBdXRvY29tcGxldGUgaXMgY2xvc2UgdG8gZW5kIScpO1xuICAgIGlmIChpc0NvbnRpbnVhYmxlRGF0YUNvbnRleHQodGhpcy5zdWdnZXN0aW9uc0RjKSkge1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3Rpb25zRGMuc25hcHNob3QuaXNMb2FkaW5nKSB7XG4gICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNEYy5sb2FkTW9yZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRJZEFzU3RyaW5nKHZhbHVlOiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuZ2V0SWQodmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJZCh2YWx1ZTogVCk6IFRJZCB7XG4gICAgcmV0dXJuIHRoaXMuc3VnZ2VzdGlvbnNEYz8uZGF0YVNvdXJjZT8uZ2V0SWQodmFsdWUpIHx8IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGlzT3B0aW9uQXZhaWxhYmxlKG9wdGlvbjogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzT3B0aW9uRGlzYWJsZWRGbikge1xuICAgICAgcmV0dXJuICF0aGlzLmlzT3B0aW9uRGlzYWJsZWRGbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNPcHRpb25WaXNpYmxlKG9wdGlvbjogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzT3B0aW9uSGlkZGVuRm4pIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc09wdGlvbkhpZGRlbkZuKG9wdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBUT0RPIER1cGxpY2F0ZSBpbiBlbGRlci1zZWxlY3RcbiAgICovXG4gIHByaXZhdGUgcHJvcGVydHlTdHJpbmdWYWx1ZSh2YWx1ZTogVCwgcHJvcGVydHk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiAoPGFueT52YWx1ZSlbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iLCI8bWF0LWF1dG9jb21wbGV0ZVxuICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gIFthdXRvQWN0aXZlRmlyc3RPcHRpb25dPVwidHJ1ZVwiXG4gIChvcGVuZWQpPVwib25BdXRvY29tcGxldGVPcGVuZWQoJGV2ZW50KVwiXG4gIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxuICBlbGRlckluZmluaXRlU2Nyb2xsIGVsZGVyRWxkZXJJbmZpbml0ZUF1dG9jb21wbGV0ZSAoY2xvc2VUb0VuZCk9XCJvbkF1dG9Db21wbGV0ZUNsb3NlVG9FbmQoJGV2ZW50KVwiXG4+XG4gIDwhLS1cbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd051bGxcIiBbdmFsdWVdPVwibnVsbFwiPnt7bnVsbERpc3BsYXkgfCB0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cbiAgLS0+XG5cbiAgPG1hdC1vcHRpb24gZGlzYWJsZWQgICpuZ0lmPVwiIShzdWdnZXN0aW9uc0RjJCB8IGFzeW5jKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibWF0LWNhcHRpb25cIj5ObyBEYXRhU291cmNlIC8gRGF0YUNvbnRleHQhPC9zcGFuPlxuICA8L21hdC1vcHRpb24+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1Z2dlc3Rpb25zRGMkIHwgYXN5bmMgYXMgZGNcIj5cblxuICAgIDxtYXQtb3B0aW9uIGRpc2FibGVkICAqbmdJZj1cImRjLmlzQ2xvc2VkXCI+XG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4TGF5b3V0R2FwPVwiOHB4XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj53YXJuaW5nPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtY2FwdGlvblwiPkRhdGFDb250ZXh0IENsb3NlZCE8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1vcHRpb24+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXZhaWxhYmxlU3VnZ2VzdGlvbnMkIHwgYXN5bmMgYXMgc3VnZ2VzdGlvbnNcIj5cblxuICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJzdWdnZXN0aW9ucy5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgTm8gRGF0YS5cbiAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VnZ2VzdGlvbiBvZiBzdWdnZXN0aW9uc1wiPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNPcHRpb25WaXNpYmxlKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgICBbdmFsdWVdPVwic3VnZ2VzdGlvblwiXG4gICAgICAgICAgW2lkXT1cImdldElkQXNTdHJpbmcoc3VnZ2VzdGlvbilcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNPcHRpb25BdmFpbGFibGUoc3VnZ2VzdGlvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YWx1ZVRlbXBsYXRlIHx8IHNpbXBsZVZhbHVlVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHN1Z2dlc3Rpb259XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cblxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVN0YXRlJCB8IGFzeW5jIGFzIHN0YXRlXCI+XG5cbiAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCAqbmdJZj1cIiFzdGF0ZS5pZGxlIHx8IHN0YXRlLmxvYWRpbmdcIj5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyXG4gICAgICAgIFt2YWx1ZV09XCIxMDBcIlxuICAgICAgICBbbW9kZV09XCJzdGF0ZS5sb2FkaW5nID8gJ3F1ZXJ5JyA6ICdkZXRlcm1pbmF0ZSdcIlxuICAgICAgICBbY29sb3JdPVwic3RhdGUuZXJyb3IgPyAnd2FybicgOiAncHJpbWFyeSdcIlxuICAgICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8L21hdC1vcHRpb24+XG5cbiAgPC9uZy1jb250YWluZXI+XG48L21hdC1hdXRvY29tcGxldGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2ltcGxlVmFsdWVUZW1wbGF0ZSBsZXQtdmFsdWU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5UHJvcGVydHlSZXNvbHZlciQgfCBhc3luYyBhcyBwcm9wZXJ0eVJlc29sdmVyXCI+XG4gICAgPHAgY2xhc3M9XCJub3NlbGVjdFwiPnt7cHJvcGVydHlSZXNvbHZlcih2YWx1ZSl9fTwvcD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS9lbGRlci1hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9hdXRvY29tcGxldGUvZWxkZXItYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWtCLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RJLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsZUFBZSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFlLHdCQUF3QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDekcsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFHakUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7Ozs7QUFX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VyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBVS9ELGVBQWU7c0JBRHpCLFNBQVM7dUJBQUMsTUFBTTtnQkFNVixrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLHNCQUFzQjtzQkFENUIsS0FBSztnQkFpQlUsY0FBYztzQkFEN0IsTUFBTTtnQkErQkksT0FBTztzQkFEakIsS0FBSztnQkFVSyxhQUFhO3NCQUR2QixLQUFLO2dCQVVLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBVUssdUJBQXVCO3NCQURqQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7SURhdGFDb250ZXh0LCBpc0NvbnRpbnVhYmxlRGF0YUNvbnRleHR9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9kYXRhL2RhdGEtY29udGV4dC9kYXRhLWNvbnRleHQnO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge2ZpbHRlciwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge3J1bkluWm9uZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3V0aWxzL25nLXpvbmUtdXRpbHMnO1xuaW1wb3J0IHtEYXRhQ29udGV4dFN0YXR1c30gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2RhdGEvZGF0YS1jb250ZXh0L2RhdGEtY29udGV4dC1zdGF0dXMnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge0VsZGVyU2VsZWN0VmFsdWVEaXJlY3RpdmV9IGZyb20gJy4uLy4uLy4uL3NlbGVjdC9lbGRlci1zZWxlY3QtdmFsdWUuZGlyZWN0aXZlJztcbmltcG9ydCB7RWxkZXJBdXRvY29tcGxldGVPcHRpb25TZWxlY3RlZH0gZnJvbSAnLi9lbGRlci1hdXRvY29tcGxldGUtb3B0aW9uLXNlbGVjdGVkJztcblxudHlwZSBUZXh0UmVzb2x2ZXJGbiA9ICh2YWx1ZTogYW55KSA9PiBzdHJpbmc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2VsZGVyLWF1dG9jb21wbGV0ZScsXG4gIGV4cG9ydEFzOiAnZWxkZXJBdXRvY29tcGxldGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyQXV0b2NvbXBsZXRlQ29tcG9uZW50PFQgPSBhbnksIFRJZCA9IGFueT4ge1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcblxuICAvKipcbiAgICogSXMgdGhpcyBhdXRvLWNvbXBsZXRlIGVuYWJsZWQ/XG4gICAqL1xuICBwcml2YXRlIF9lbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRlbXBsYXRlIHRvIGN1c3RvbWl6ZSB0aGUgdWkgbG9vay5cbiAgICovXG4gIEBDb250ZW50Q2hpbGQoRWxkZXJTZWxlY3RWYWx1ZURpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgdmFsdWVUZW1wbGF0ZVF1ZXJ5OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIF92YWx1ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBNYXRlcmlhbCBBdXRvY29tcGxldGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXRBdXRvY29tcGxldGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRBdXRvY29tcGxldGU+KG51bGwpO1xuXG4gIEBWaWV3Q2hpbGQoJ2F1dG8nKVxuICBwdWJsaWMgc2V0IG1hdEF1dG9jb21wbGV0ZShhdXRvOiBNYXRBdXRvY29tcGxldGUpIHtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZSQubmV4dChhdXRvKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpc09wdGlvbkRpc2FibGVkRm46IChvcHRpb246IFQpID0+IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGlzT3B0aW9uSGlkZGVuRm46IChvcHRpb246IFQpID0+IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIG9wdGlvblZhbHVlQ29udmVydGVyRm46IChvcHRpb246IFQpID0+IGFueTtcblxuICAvKipcbiAgICogVGhlIERhdGFDb250ZXh0IHdoaWNoIGhvbGRzIHRoZSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YUNvbnRleHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRGF0YUNvbnRleHQ8VD4+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0cmlnZ2VyUmVsb2FkJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheVByb3BlcnR5UmVzb2x2ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZXh0UmVzb2x2ZXJGbj4oKHZhbHVlOiBUKSA9PiB0aGlzLnByb3BlcnR5U3RyaW5nVmFsdWUodmFsdWUsIG51bGwpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVN0YXRlJDogT2JzZXJ2YWJsZTxEYXRhQ29udGV4dFN0YXR1cz47XG5cbiAgcHVibGljIHJlYWRvbmx5IGF2YWlsYWJsZVN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxUW10+O1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxFbGRlckF1dG9jb21wbGV0ZU9wdGlvblNlbGVjdGVkPigpO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICApIHtcbiAgICB0aGlzLmRhdGFTdGF0ZSQgPSB0aGlzLmRhdGFDb250ZXh0JC5waXBlKFxuICAgICAgZmlsdGVyKGRjID0+ICEhZGMpLFxuICAgICAgc3dpdGNoTWFwKGRjID0+IGRjLnN0YXR1cyksXG4gICAgICBydW5JblpvbmUodGhpcy56b25lKVxuICAgICk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZVN1Z2dlc3Rpb25zJCA9IHRoaXMuZGF0YUNvbnRleHQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoZGMgPT4gZGMgPyBkYy5kYXRhIDogb2YoW10pKSxcbiAgICAgIHJ1bkluWm9uZSh0aGlzLnpvbmUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB2YWx1ZVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5fdmFsdWVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVRlbXBsYXRlIHx8IHRoaXMudmFsdWVUZW1wbGF0ZVF1ZXJ5O1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhQ29udGV4dChkYXRhOiBJRGF0YUNvbnRleHQ8VD4pIHtcbiAgICB0aGlzLmRhdGFDb250ZXh0JC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhQ29udGV4dCgpOiBJRGF0YUNvbnRleHQ8VD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFDb250ZXh0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNwbGF5UHJvcGVydHlSZXNvbHZlcihyZXNvbHZlcjogVGV4dFJlc29sdmVyRm4pIHtcbiAgICB0aGlzLmRpc3BsYXlQcm9wZXJ0eVJlc29sdmVyJC5uZXh0KHJlc29sdmVyKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uID0gZXZlbnQub3B0aW9uO1xuICAgIGNvbnN0IGlkID0gb3B0aW9uLmlkIGFzIHVua25vd24gYXMgVElkO1xuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQubmV4dChcbiAgICAgIG5ldyBFbGRlckF1dG9jb21wbGV0ZU9wdGlvblNlbGVjdGVkKFxuICAgICAgICB0aGlzLFxuICAgICAgICBpZCxcbiAgICAgICAgdGhpcy5nZXRFbnRpdHlCeUlkKGlkKSxcbiAgICAgICAgb3B0aW9uLnZhbHVlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50aXR5QnlJZChpZDogVElkKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGMgPSB0aGlzLmRhdGFDb250ZXh0O1xuICAgIGlmKGRjKXtcbiAgICAgIHJldHVybiBkYy5zbmFwc2hvdC5kYXRhLmZpbmQoZSA9PiB0aGlzLmdldElkKGUpID09IGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBvbkF1dG9jb21wbGV0ZU9wZW5lZChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0F1dG9jb21wbGV0ZSBvcGVuZWQ6JywgZXZlbnQpO1xuICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMudHJpZ2dlclJlbG9hZCQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25BdXRvQ29tcGxldGVDbG9zZVRvRW5kKGV2ZW50OiBVSUV2ZW50KTogdm9pZCB7XG4gICAgLy8gdGhpcy5sb2dnZXIuZGVidWcoJ0F1dG9jb21wbGV0ZSBpcyBjbG9zZSB0byBlbmQhJyk7XG4gICAgaWYgKGlzQ29udGludWFibGVEYXRhQ29udGV4dCh0aGlzLmRhdGFDb250ZXh0KSkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFDb250ZXh0LnNuYXBzaG90LmlzTG9hZGluZykge1xuICAgICAgICB0aGlzLmRhdGFDb250ZXh0LmxvYWRNb3JlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldElkQXNTdHJpbmcodmFsdWU6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5nZXRJZCh2YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldElkKHZhbHVlOiBUKTogVElkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29udGV4dD8uZGF0YVNvdXJjZT8uZ2V0SWQodmFsdWUpIHx8IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGlzT3B0aW9uQXZhaWxhYmxlKG9wdGlvbjogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzT3B0aW9uRGlzYWJsZWRGbikge1xuICAgICAgcmV0dXJuICF0aGlzLmlzT3B0aW9uRGlzYWJsZWRGbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNPcHRpb25WaXNpYmxlKG9wdGlvbjogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzT3B0aW9uSGlkZGVuRm4pIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc09wdGlvbkhpZGRlbkZuKG9wdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b09wdGlvblZhbHVlKG9wdGlvbjogVCk6IGFueSB7XG4gICAgaWYgKHRoaXMub3B0aW9uVmFsdWVDb252ZXJ0ZXJGbikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uVmFsdWVDb252ZXJ0ZXJGbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBUT0RPIER1cGxpY2F0ZSBpbiBlbGRlci1zZWxlY3RcbiAgICovXG4gIHByaXZhdGUgcHJvcGVydHlTdHJpbmdWYWx1ZSh2YWx1ZTogVCwgcHJvcGVydHk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiAoPGFueT52YWx1ZSlbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iLCI8bWF0LWF1dG9jb21wbGV0ZVxuICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gIFthdXRvQWN0aXZlRmlyc3RPcHRpb25dPVwidHJ1ZVwiXG4gIChvcGVuZWQpPVwib25BdXRvY29tcGxldGVPcGVuZWQoJGV2ZW50KVwiXG4gIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIlxuICBlbGRlckluZmluaXRlU2Nyb2xsIGVsZGVyRWxkZXJJbmZpbml0ZUF1dG9jb21wbGV0ZSAoY2xvc2VUb0VuZCk9XCJvbkF1dG9Db21wbGV0ZUNsb3NlVG9FbmQoJGV2ZW50KVwiXG4+XG4gIDwhLS1cbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd051bGxcIiBbdmFsdWVdPVwibnVsbFwiPnt7bnVsbERpc3BsYXkgfCB0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cbiAgLS0+XG5cbiAgPG1hdC1vcHRpb24gZGlzYWJsZWQgICpuZ0lmPVwiIShkYXRhQ29udGV4dCQgfCBhc3luYylcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm1hdC1jYXB0aW9uXCI+Tm8gRGF0YVNvdXJjZSAvIERhdGFDb250ZXh0ITwvc3Bhbj5cbiAgPC9tYXQtb3B0aW9uPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhQ29udGV4dCQgfCBhc3luYyBhcyBkY1wiPlxuXG4gICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgICpuZ0lmPVwiZGMuaXNDbG9zZWRcIj5cbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhMYXlvdXRHYXA9XCI4cHhcIj5cbiAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiPndhcm5pbmc8L21hdC1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1jYXB0aW9uXCI+RGF0YUNvbnRleHQgQ2xvc2VkITwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LW9wdGlvbj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdmFpbGFibGVTdWdnZXN0aW9ucyQgfCBhc3luYyBhcyBzdWdnZXN0aW9uc1wiPlxuXG4gICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cInN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMFwiIGRpc2FibGVkPlxuICAgICAgICBObyBEYXRhLlxuICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgKm5nSWY9XCJpc09wdGlvblZpc2libGUoc3VnZ2VzdGlvbilcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ0b09wdGlvblZhbHVlKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgICBbaWRdPVwiZ2V0SWRBc1N0cmluZyhzdWdnZXN0aW9uKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc09wdGlvbkF2YWlsYWJsZShzdWdnZXN0aW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInZhbHVlVGVtcGxhdGUgfHwgc2ltcGxlVmFsdWVUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogc3VnZ2VzdGlvbn1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8IS0tXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtY2FwdGlvblwiPnZhbHVlOiB7e3RvT3B0aW9uVmFsdWUoc3VnZ2VzdGlvbil9fTwvc3Bhbj5cbiAgICAgICAgICAtLT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU3RhdGUkIHwgYXN5bmMgYXMgc3RhdGVcIj5cblxuICAgIDxtYXQtb3B0aW9uIGRpc2FibGVkICpuZ0lmPVwiIXN0YXRlLmlkbGUgfHwgc3RhdGUubG9hZGluZ1wiPlxuICAgICAgPG1hdC1wcm9ncmVzcy1iYXJcbiAgICAgICAgW3ZhbHVlXT1cIjEwMFwiXG4gICAgICAgIFttb2RlXT1cInN0YXRlLmxvYWRpbmcgPyAncXVlcnknIDogJ2RldGVybWluYXRlJ1wiXG4gICAgICAgIFtjb2xvcl09XCJzdGF0ZS5lcnJvciA/ICd3YXJuJyA6ICdwcmltYXJ5J1wiXG4gICAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvbWF0LW9wdGlvbj5cblxuICA8L25nLWNvbnRhaW5lcj5cbjwvbWF0LWF1dG9jb21wbGV0ZT5cblxuPG5nLXRlbXBsYXRlICNzaW1wbGVWYWx1ZVRlbXBsYXRlIGxldC12YWx1ZT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlQcm9wZXJ0eVJlc29sdmVyJCB8IGFzeW5jIGFzIHByb3BlcnR5UmVzb2x2ZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm5vc2VsZWN0XCI+e3twcm9wZXJ0eVJlc29sdmVyKHZhbHVlKX19PC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,197 @@
1
+ import { Directive, HostListener, Input } from '@angular/core';
2
+ import { LoggerFactory } from '@elderbyte/ts-logger';
3
+ import { merge, Subject } from 'rxjs';
4
+ import { debounceTime, filter, map, skipWhile, takeUntil } from 'rxjs/operators';
5
+ import { Filter } from '../../../common/data/filter';
6
+ import { WordPositionFinder } from './many/word-position-finder';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/material/autocomplete";
9
+ export class ElderAutocompleteManyDirective {
10
+ /***************************************************************************
11
+ * *
12
+ * Constructor *
13
+ * *
14
+ **************************************************************************/
15
+ constructor(autoCompleteTrigger, inputRef) {
16
+ this.autoCompleteTrigger = autoCompleteTrigger;
17
+ this.inputRef = inputRef;
18
+ /***************************************************************************
19
+ * *
20
+ * Fields *
21
+ * *
22
+ **************************************************************************/
23
+ this.queryFilter = 'query';
24
+ this.filters = [];
25
+ this.sorts = [];
26
+ this.textPropertyResolverFn = (option) => {
27
+ if (!option) {
28
+ return option;
29
+ }
30
+ else if (typeof option === 'string') {
31
+ return option;
32
+ }
33
+ else if (this.textProperty) {
34
+ return option[this.textProperty];
35
+ }
36
+ else {
37
+ return undefined;
38
+ }
39
+ };
40
+ this.inputKeyup$ = new Subject();
41
+ this.ignoreKeys = ['ArrowRight', 'ArrowUp', 'ArrowDown', 'ArrowLeft'];
42
+ this.log = LoggerFactory.getLogger(this.constructor.name);
43
+ this.destroy$ = new Subject();
44
+ this.destroyAutocompleteBinding$ = new Subject();
45
+ this.wordFinder = new WordPositionFinder();
46
+ }
47
+ /***************************************************************************
48
+ * *
49
+ * Properties *
50
+ * *
51
+ **************************************************************************/
52
+ set autocomplete(auto) {
53
+ this._elderAutocomplete = auto;
54
+ this.destroyAutocompleteBinding$.next();
55
+ if (auto) {
56
+ auto.matAutocomplete$
57
+ .pipe(takeUntil(this.destroyAutocompleteBinding$), filter(matAuto => !!matAuto))
58
+ .subscribe(matAuto => this.autoCompleteTrigger.autocomplete = matAuto);
59
+ auto.optionSelected.pipe(takeUntil(this.destroyAutocompleteBinding$)).subscribe(event => this.onOptionSelected(event));
60
+ }
61
+ }
62
+ get autocomplete() {
63
+ return this._elderAutocomplete;
64
+ }
65
+ get cursorPosition() {
66
+ if (this.inputRef?.nativeElement) {
67
+ return this.inputRef.nativeElement.selectionStart;
68
+ }
69
+ return null;
70
+ }
71
+ set cursorPosition(position) {
72
+ if (this.inputRef?.nativeElement) {
73
+ this.inputRef.nativeElement.selectionStart = position;
74
+ this.inputRef.nativeElement.selectionEnd = position;
75
+ }
76
+ }
77
+ get dataContext() {
78
+ return this._elderAutocomplete.dataContext;
79
+ }
80
+ /***************************************************************************
81
+ * *
82
+ * Host Listener *
83
+ * *
84
+ **************************************************************************/
85
+ onKeyUp(event) {
86
+ if (this.ignoreKeys.some(k => k === event.key)) {
87
+ return;
88
+ }
89
+ this.inputKeyup$.next(event);
90
+ }
91
+ /***************************************************************************
92
+ * *
93
+ * Life Cycle *
94
+ * *
95
+ **************************************************************************/
96
+ ngOnInit() {
97
+ this._elderAutocomplete.displayPropertyResolver = this.textPropertyResolverFn;
98
+ this._elderAutocomplete.optionValueConverterFn = (option) => {
99
+ const suggestion = this.resolveSuggestionText(option);
100
+ return this.insertSuggestion(suggestion);
101
+ };
102
+ merge(this.inputKeyup$.pipe(skipWhile(e => !this._elderAutocomplete.enabled), debounceTime(150), map(e => e?.target?.value), map(value => this.extractWordAtCursor(value))), this.autocomplete.triggerReload$).pipe(takeUntil(this.destroy$), filter(value => !value || typeof (value) === 'string' || typeof (value) === 'number')).subscribe(value => this.updateSuggestions(value));
103
+ }
104
+ ngOnDestroy() {
105
+ this.destroy$.next();
106
+ this.destroy$.complete();
107
+ this.destroyAutocompleteBinding$.next();
108
+ this.destroyAutocompleteBinding$.complete();
109
+ }
110
+ /***************************************************************************
111
+ * *
112
+ * Private methods *
113
+ * *
114
+ **************************************************************************/
115
+ extractWordAtCursor(value) {
116
+ if (this.cursorPosition) {
117
+ const cursor = this.cursorPosition;
118
+ return this.extractWordFrom(value, cursor);
119
+ }
120
+ else {
121
+ return null;
122
+ }
123
+ }
124
+ rememberCursorPosition() {
125
+ this.cursorBeforeAutocomplete = this.cursorPosition;
126
+ }
127
+ extractWordFrom(text, position) {
128
+ const word = this.wordFinder.findWord(text, position);
129
+ return word.value;
130
+ }
131
+ updateSuggestions(value) {
132
+ const filters = [...this.filters, new Filter(this.queryFilter, value)];
133
+ const sorts = this.sorts;
134
+ if (this.dataContext) {
135
+ try {
136
+ this.rememberCursorPosition();
137
+ this.dataContext.start(sorts, filters);
138
+ }
139
+ catch (err) {
140
+ this.log.error('Failed to start DataContext!', err);
141
+ }
142
+ }
143
+ }
144
+ insertSuggestion(suggestion) {
145
+ const currentValue = this.currentInputValue();
146
+ if (!suggestion) {
147
+ return currentValue;
148
+ }
149
+ if (this.cursorPosition !== undefined) {
150
+ const cursor = this.cursorPosition;
151
+ const replacement = this.wordFinder.replaceWord(currentValue, cursor, suggestion);
152
+ return replacement.newText;
153
+ }
154
+ else {
155
+ this.log.warn('Insert not possible as no cursor-position was available!');
156
+ return currentValue;
157
+ }
158
+ }
159
+ currentInputValue() {
160
+ const input = this.inputRef?.nativeElement;
161
+ return input?.value ?? '';
162
+ }
163
+ resolveSuggestionText(option) {
164
+ return this.textPropertyResolverFn(option);
165
+ }
166
+ onOptionSelected(event) {
167
+ const wordAtCursor = this.wordFinder.findWord(this.currentInputValue(), this.cursorBeforeAutocomplete);
168
+ const autocompletedPhrase = this.resolveSuggestionText(event.entity);
169
+ // The wordAtCursor might not be the full autocompleted phrase (if there are multiple words)
170
+ this.cursorPosition = wordAtCursor.start + autocompletedPhrase.length;
171
+ }
172
+ }
173
+ ElderAutocompleteManyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderAutocompleteManyDirective, deps: [{ token: i1.MatAutocompleteTrigger }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
174
+ ElderAutocompleteManyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: ElderAutocompleteManyDirective, selector: "[elderAutocompleteMany]", inputs: { queryFilter: "queryFilter", filters: "filters", sorts: "sorts", textProperty: "textProperty", textPropertyResolverFn: "textPropertyResolverFn", autocomplete: ["elderAutocompleteMany", "autocomplete"] }, host: { listeners: { "keyup": "onKeyUp($event)" } }, ngImport: i0 });
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ElderAutocompleteManyDirective, decorators: [{
176
+ type: Directive,
177
+ args: [{
178
+ selector: '[elderAutocompleteMany]'
179
+ }]
180
+ }], ctorParameters: function () { return [{ type: i1.MatAutocompleteTrigger }, { type: i0.ElementRef }]; }, propDecorators: { queryFilter: [{
181
+ type: Input
182
+ }], filters: [{
183
+ type: Input
184
+ }], sorts: [{
185
+ type: Input
186
+ }], textProperty: [{
187
+ type: Input
188
+ }], textPropertyResolverFn: [{
189
+ type: Input
190
+ }], autocomplete: [{
191
+ type: Input,
192
+ args: ['elderAutocompleteMany']
193
+ }], onKeyUp: [{
194
+ type: HostListener,
195
+ args: ['keyup', ['$event']]
196
+ }] } });
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItYXV0b2NvbXBsZXRlLW1hbnkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dC9hdXRvY29tcGxldGUvZWxkZXItYXV0b2NvbXBsZXRlLW1hbnkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBUSxLQUFLLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBSW5ELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDOzs7QUFNL0QsTUFBTSxPQUFPLDhCQUE4QjtJQStDekM7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ21CLG1CQUEyQyxFQUMzQyxRQUFzQztRQUR0Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdCO1FBQzNDLGFBQVEsR0FBUixRQUFRLENBQThCO1FBdER6RDs7OztvRkFJNEU7UUFHckUsZ0JBQVcsR0FBRyxPQUFPLENBQUM7UUFHdEIsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUd2QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBVW5CLDJCQUFzQixHQUFtQixDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsT0FBTyxNQUFNLENBQUM7YUFDZjtpQkFBTSxJQUFJLE9B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QkFBOEI7K0dBQTlCLDhCQUE4QjsyRkFBOUIsOEJBQThCO2tCQUgxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7aUJBQ3BDO3NJQVNRLFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFRQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLHNCQUFzQjtzQkFENUIsS0FBSztnQkE0Q0ssWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyx1QkFBdUI7Z0JBK0N2QixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHtFTVBUWSwgbWVyZ2UsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBza2lwV2hpbGUsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFbGRlckF1dG9jb21wbGV0ZUNvbXBvbmVudH0gZnJvbSAnLi9lbGRlci1hdXRvY29tcGxldGUvZWxkZXItYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RhdGEvZmlsdGVyJztcbmltcG9ydCB7U29ydH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RhdGEvc29ydCc7XG5pbXBvcnQge0lEYXRhQ29udGV4dH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RhdGEvZGF0YS1jb250ZXh0L2RhdGEtY29udGV4dCc7XG5pbXBvcnQge1RleHRSZXNvbHZlckZufSBmcm9tICcuLi8uLi9zZWxlY3QvZWxkZXItc2VsZWN0LWJhc2UnO1xuaW1wb3J0IHtXb3JkUG9zaXRpb25GaW5kZXJ9IGZyb20gJy4vbWFueS93b3JkLXBvc2l0aW9uLWZpbmRlcic7XG5pbXBvcnQge0VsZGVyQXV0b2NvbXBsZXRlT3B0aW9uU2VsZWN0ZWR9IGZyb20gJy4vZWxkZXItYXV0b2NvbXBsZXRlL2VsZGVyLWF1dG9jb21wbGV0ZS1vcHRpb24tc2VsZWN0ZWQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZWxkZXJBdXRvY29tcGxldGVNYW55XSdcbn0pXG5leHBvcnQgY2xhc3MgRWxkZXJBdXRvY29tcGxldGVNYW55RGlyZWN0aXZlPFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBASW5wdXQoKVxuICBwdWJsaWMgcXVlcnlGaWx0ZXIgPSAncXVlcnknO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0czogU29ydFtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBvbiBhIHN1Z2dlc3Rpb24gb2JqZWN0IHdoaWNoIGlzIHVzZWRcbiAgICogYXMgdGhlIGRpc3BsYXkgYW5kIGluc2VydCB2YWx1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0ZXh0UHJvcGVydHk6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGV4dFByb3BlcnR5UmVzb2x2ZXJGbjogVGV4dFJlc29sdmVyRm4gPSAob3B0aW9uOiBhbnkpID0+IHtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb3B0aW9uIGFzIHN0cmluZztcbiAgICB9IGVsc2UgaWYgKHRoaXMudGV4dFByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gb3B0aW9uW3RoaXMudGV4dFByb3BlcnR5XSBhcyBzdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyByZWFkb25seSBpbnB1dEtleXVwJCA9IG5ldyBTdWJqZWN0PEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpZ25vcmVLZXlzID0gWydBcnJvd1JpZ2h0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0Fycm93TGVmdCddO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29yZEZpbmRlcjogV29yZFBvc2l0aW9uRmluZGVyO1xuXG4gIHByaXZhdGUgX2VsZGVyQXV0b2NvbXBsZXRlOiBFbGRlckF1dG9jb21wbGV0ZUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95QXV0b2NvbXBsZXRlQmluZGluZyQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0b0NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+XG4gICkge1xuICAgIHRoaXMud29yZEZpbmRlciA9IG5ldyBXb3JkUG9zaXRpb25GaW5kZXIoKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIEBJbnB1dCgnZWxkZXJBdXRvY29tcGxldGVNYW55JylcbiAgcHVibGljIHNldCBhdXRvY29tcGxldGUoYXV0bzogRWxkZXJBdXRvY29tcGxldGVDb21wb25lbnQpIHtcbiAgICB0aGlzLl9lbGRlckF1dG9jb21wbGV0ZSA9IGF1dG87XG4gICAgdGhpcy5kZXN0cm95QXV0b2NvbXBsZXRlQmluZGluZyQubmV4dCgpO1xuICAgIGlmIChhdXRvKSB7XG4gICAgICBhdXRvLm1hdEF1dG9jb21wbGV0ZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveUF1dG9jb21wbGV0ZUJpbmRpbmckKSxcbiAgICAgICAgICBmaWx0ZXIobWF0QXV0byA9PiAhIW1hdEF1dG8pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShtYXRBdXRvID0+IHRoaXMuYXV0b0NvbXBsZXRlVHJpZ2dlci5hdXRvY29tcGxldGUgPSBtYXRBdXRvKTtcblxuICAgICAgYXV0by5vcHRpb25TZWxlY3RlZC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95QXV0b2NvbXBsZXRlQmluZGluZyQpXG4gICAgICApLnN1YnNjcmliZShldmVudCA9PiB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQoZXZlbnQpKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXV0b2NvbXBsZXRlKCk6IEVsZGVyQXV0b2NvbXBsZXRlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5fZWxkZXJBdXRvY29tcGxldGU7XG4gIH1cblxuICBwcml2YXRlIGdldCBjdXJzb3JQb3NpdGlvbigpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pbnB1dFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNldCBjdXJzb3JQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHBvc2l0aW9uO1xuICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFDb250ZXh0KCk6IElEYXRhQ29udGV4dDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZWxkZXJBdXRvY29tcGxldGUuZGF0YUNvbnRleHQ7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogSG9zdCBMaXN0ZW5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaWdub3JlS2V5cy5zb21lKGsgPT4gayA9PT0gZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlucHV0S2V5dXAkLm5leHQoZXZlbnQpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2VsZGVyQXV0b2NvbXBsZXRlLmRpc3BsYXlQcm9wZXJ0eVJlc29sdmVyID0gdGhpcy50ZXh0UHJvcGVydHlSZXNvbHZlckZuO1xuICAgIHRoaXMuX2VsZGVyQXV0b2NvbXBsZXRlLm9wdGlvblZhbHVlQ29udmVydGVyRm4gPSAob3B0aW9uOiBUKSA9PiB7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uID0gdGhpcy5yZXNvbHZlU3VnZ2VzdGlvblRleHQob3B0aW9uKTtcbiAgICAgIHJldHVybiB0aGlzLmluc2VydFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbik7XG4gICAgfTtcblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5pbnB1dEtleXVwJC5waXBlKFxuICAgICAgICBza2lwV2hpbGUoZSA9PiAhdGhpcy5fZWxkZXJBdXRvY29tcGxldGUuZW5hYmxlZCksXG4gICAgICAgIGRlYm91bmNlVGltZSgxNTApLFxuICAgICAgICBtYXAoZSA9PiAoZT8udGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSksXG4gICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLmV4dHJhY3RXb3JkQXRDdXJzb3IodmFsdWUpKVxuICAgICAgKSxcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnRyaWdnZXJSZWxvYWQkXG4gICAgKS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgZmlsdGVyKHZhbHVlID0+ICF2YWx1ZSB8fCB0eXBlb2YgKHZhbHVlKSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mICh2YWx1ZSkgPT09ICdudW1iZXInKVxuICAgICkuc3Vic2NyaWJlKFxuICAgICAgdmFsdWUgPT4gdGhpcy51cGRhdGVTdWdnZXN0aW9ucyh2YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRlc3Ryb3lBdXRvY29tcGxldGVCaW5kaW5nJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95QXV0b2NvbXBsZXRlQmluZGluZyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgcHJpdmF0ZSBleHRyYWN0V29yZEF0Q3Vyc29yKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnNvclBvc2l0aW9uKSB7XG4gICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFdvcmRGcm9tKHZhbHVlLCBjdXJzb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGN1cnNvckJlZm9yZUF1dG9jb21wbGV0ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlbWVtYmVyQ3Vyc29yUG9zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5jdXJzb3JCZWZvcmVBdXRvY29tcGxldGUgPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0V29yZEZyb20odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB3b3JkID0gdGhpcy53b3JkRmluZGVyLmZpbmRXb3JkKHRleHQsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gd29yZC52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3VnZ2VzdGlvbnModmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gWy4uLnRoaXMuZmlsdGVycywgbmV3IEZpbHRlcih0aGlzLnF1ZXJ5RmlsdGVyLCA8YW55PnZhbHVlKV07XG4gICAgY29uc3Qgc29ydHMgPSB0aGlzLnNvcnRzO1xuICAgIGlmICh0aGlzLmRhdGFDb250ZXh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbWVtYmVyQ3Vyc29yUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5kYXRhQ29udGV4dC5zdGFydChzb3J0cywgZmlsdGVycyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBEYXRhQ29udGV4dCEnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0U3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuY3VycmVudElucHV0VmFsdWUoKTtcbiAgICBpZighc3VnZ2VzdGlvbil7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJzb3JQb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLndvcmRGaW5kZXIucmVwbGFjZVdvcmQoY3VycmVudFZhbHVlLCBjdXJzb3IsIHN1Z2dlc3Rpb24pO1xuICAgICAgcmV0dXJuIHJlcGxhY2VtZW50Lm5ld1RleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oJ0luc2VydCBub3QgcG9zc2libGUgYXMgbm8gY3Vyc29yLXBvc2l0aW9uIHdhcyBhdmFpbGFibGUhJyk7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3VycmVudElucHV0VmFsdWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIGlucHV0Py52YWx1ZSA/PyAnJztcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN1Z2dlc3Rpb25UZXh0KG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb3BlcnR5UmVzb2x2ZXJGbihvcHRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk9wdGlvblNlbGVjdGVkKFxuICAgIGV2ZW50OiBFbGRlckF1dG9jb21wbGV0ZU9wdGlvblNlbGVjdGVkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHdvcmRBdEN1cnNvciA9IHRoaXMud29yZEZpbmRlci5maW5kV29yZCh0aGlzLmN1cnJlbnRJbnB1dFZhbHVlKCksIHRoaXMuY3Vyc29yQmVmb3JlQXV0b2NvbXBsZXRlKTtcbiAgICBjb25zdCBhdXRvY29tcGxldGVkUGhyYXNlID0gdGhpcy5yZXNvbHZlU3VnZ2VzdGlvblRleHQoZXZlbnQuZW50aXR5KTtcbiAgICAvLyBUaGUgd29yZEF0Q3Vyc29yIG1pZ2h0IG5vdCBiZSB0aGUgZnVsbCBhdXRvY29tcGxldGVkIHBocmFzZSAoaWYgdGhlcmUgYXJlIG11bHRpcGxlIHdvcmRzKVxuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSB3b3JkQXRDdXJzb3Iuc3RhcnQgKyBhdXRvY29tcGxldGVkUGhyYXNlLmxlbmd0aDtcbiAgfVxufVxuIl19