@indice/ng-components 0.2.174 → 0.3.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 (219) hide show
  1. package/_styles.scss +63 -15
  2. package/{esm2020 → esm2022}/indice-ng-components.mjs +4 -4
  3. package/esm2022/lib/controls/advanced-search/advanced-search.component.mjs +156 -0
  4. package/esm2022/lib/controls/advanced-search/models.mjs +109 -0
  5. package/esm2022/lib/controls/avatar-initials/avatar-initials.component.mjs +48 -0
  6. package/{esm2020 → esm2022}/lib/controls/breadcrumb/breadcrumb-item.mjs +14 -14
  7. package/{esm2020 → esm2022}/lib/controls/breadcrumb/breadcrumb.component.mjs +26 -26
  8. package/{esm2020 → esm2022}/lib/controls/collapsible-panel/collapsible-panel.component.mjs +20 -20
  9. package/esm2022/lib/controls/combobox/combobox.component.mjs +121 -0
  10. package/esm2022/lib/controls/content-tile/content-tile-header/content-tile-header.component.mjs +17 -0
  11. package/esm2022/lib/controls/content-tile/content-tile-item/content-tile-item.component.mjs +19 -0
  12. package/esm2022/lib/controls/content-tile/content-tile.component.mjs +63 -0
  13. package/esm2022/lib/controls/date-picker/date-picker.component.mjs +300 -0
  14. package/esm2022/lib/controls/drop-down-menu/drop-down-menu.component.mjs +72 -0
  15. package/{esm2020 → esm2022}/lib/controls/kpi-tile/kpi-tile.component.mjs +43 -43
  16. package/esm2022/lib/controls/language-selection/language-selection.component.mjs +31 -0
  17. package/{esm2020 → esm2022}/lib/controls/list-view/list-column.component.mjs +25 -25
  18. package/{esm2020 → esm2022}/lib/controls/list-view/list-details-section.component.mjs +17 -17
  19. package/{esm2020 → esm2022}/lib/controls/list-view/list-tile.component.mjs +17 -17
  20. package/esm2022/lib/controls/list-view/list-view-empty-state.component.mjs +29 -0
  21. package/esm2022/lib/controls/list-view/list-view.component.mjs +210 -0
  22. package/{esm2020 → esm2022}/lib/controls/nav-links-list/nav-links-list.component.mjs +54 -54
  23. package/esm2022/lib/controls/notifications-indicator/notifications-indicator.component.mjs +79 -0
  24. package/esm2022/lib/controls/pager/pager.component.mjs +130 -0
  25. package/esm2022/lib/controls/progress-bar/progress-bar.component.mjs +46 -0
  26. package/esm2022/lib/controls/side-pane/side-pane.component.mjs +87 -0
  27. package/esm2022/lib/controls/skeleton-loader/skeleton-loader.component.mjs +29 -0
  28. package/esm2022/lib/controls/stats-grid/stats-grid.component.mjs +49 -0
  29. package/{esm2020 → esm2022}/lib/controls/stepper/lib-step-info.directive.mjs +16 -16
  30. package/{esm2020 → esm2022}/lib/controls/stepper/lib-step-label.directive.mjs +16 -16
  31. package/esm2022/lib/controls/stepper/lib-step.component.mjs +81 -0
  32. package/esm2022/lib/controls/stepper/lib-stepper.component.mjs +108 -0
  33. package/{esm2020 → esm2022}/lib/controls/stepper/types/step-selected-event.mjs +3 -3
  34. package/{esm2020 → esm2022}/lib/controls/stepper/types/stepper-type.mjs +11 -11
  35. package/esm2022/lib/controls/tabs/lib-tab-group.component.mjs +66 -0
  36. package/{esm2020 → esm2022}/lib/controls/tabs/lib-tab-label.directive.mjs +16 -16
  37. package/{esm2020 → esm2022}/lib/controls/tabs/lib-tab.component.mjs +57 -57
  38. package/{esm2020 → esm2022}/lib/controls/toaster/toaster-container.component.mjs +28 -28
  39. package/{esm2020 → esm2022}/lib/controls/toaster/toaster.component.mjs +31 -31
  40. package/esm2022/lib/controls/toggle/toggle.component.mjs +64 -0
  41. package/esm2022/lib/controls/toggle-button/toggle-button.component.mjs +87 -0
  42. package/esm2022/lib/controls/toggle-buttons-list/toggle-buttons-list.component.mjs +34 -0
  43. package/esm2022/lib/controls/user-profile-menu/user-profile-menu.component.mjs +71 -0
  44. package/esm2022/lib/directives/click-outside.directive.mjs +189 -0
  45. package/{esm2020 → esm2022}/lib/directives/dynamic-component-host.directive.mjs +17 -17
  46. package/esm2022/lib/helpers/base-list.component.mjs +230 -0
  47. package/esm2022/lib/icons.mjs +36 -0
  48. package/{esm2020 → esm2022}/lib/layouts/shell/shell-footer/shell-footer.component.mjs +19 -19
  49. package/esm2022/lib/layouts/shell/shell-header/shell-header.component.mjs +130 -0
  50. package/esm2022/lib/layouts/shell/shell-layout/shell-layout.component.mjs +90 -0
  51. package/{esm2020 → esm2022}/lib/layouts/shell/shell-sidebar/shell-sidebar.component.mjs +54 -54
  52. package/{esm2020 → esm2022}/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.mjs +45 -45
  53. package/esm2022/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.mjs +30 -0
  54. package/{esm2020 → esm2022}/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.mjs +20 -20
  55. package/esm2022/lib/layouts/views/form-layout/form-layout.component.mjs +86 -0
  56. package/esm2022/lib/layouts/views/model-view-layout/model-view-layout.component.mjs +101 -0
  57. package/esm2022/lib/layouts/views/side-view-layout/side-view-layout.component.mjs +106 -0
  58. package/esm2022/lib/layouts/views/view-layout/view-layout.component.mjs +104 -0
  59. package/esm2022/lib/ng-components.module.mjs +320 -0
  60. package/esm2022/lib/pages/auth/auth-callback/auth-callback.component.mjs +30 -0
  61. package/esm2022/lib/pages/auth/auth-renew/auth-renew.component.mjs +31 -0
  62. package/{esm2020 → esm2022}/lib/pages/auth/logged-out/logged-out.component.mjs +28 -28
  63. package/{esm2020 → esm2022}/lib/pages/http-status/error/error.component.mjs +17 -17
  64. package/{esm2020 → esm2022}/lib/pages/http-status/page-not-found/page-not-found.component.mjs +15 -15
  65. package/{esm2020 → esm2022}/lib/pages/http-status/unauthorized/unauthorized.component.mjs +14 -14
  66. package/esm2022/lib/pipes/address.pipe.mjs +21 -0
  67. package/esm2022/lib/pipes/duration-format.pipe.mjs +64 -0
  68. package/esm2022/lib/pipes/short-number.pipe.mjs +43 -0
  69. package/esm2022/lib/services/breadcrumb.service.mjs +174 -0
  70. package/{esm2020 → esm2022}/lib/services/component-loader/component-loader-options.class.mjs +7 -7
  71. package/esm2022/lib/services/component-loader/component-loader.class.mjs +188 -0
  72. package/esm2022/lib/services/component-loader/component-loader.factory.mjs +32 -0
  73. package/{esm2020 → esm2022}/lib/services/component-loader/content-ref.class.mjs +12 -12
  74. package/esm2022/lib/services/modal-service/modal-backdrop-component.mjs +44 -0
  75. package/esm2022/lib/services/modal-service/modal-container-component.mjs +126 -0
  76. package/{esm2020 → esm2022}/lib/services/modal-service/modal-options.class.mjs +35 -35
  77. package/esm2022/lib/services/modal-service/modal-service.mjs +220 -0
  78. package/{esm2020 → esm2022}/lib/services/modal-service/modal-styles.class.mjs +10 -10
  79. package/{esm2020 → esm2022}/lib/services/modal-service/modal.class.mjs +27 -27
  80. package/{esm2020 → esm2022}/lib/services/toaster.service.mjs +26 -26
  81. package/esm2022/lib/services/user-settings.service.mjs +35 -0
  82. package/esm2022/lib/services/utilities.service.mjs +47 -0
  83. package/{esm2020 → esm2022}/lib/tokens.mjs +7 -7
  84. package/esm2022/lib/types.mjs +133 -0
  85. package/{esm2020 → esm2022}/public-api.mjs +78 -70
  86. package/{fesm2020 → fesm2022}/indice-ng-components.mjs +4898 -4592
  87. package/fesm2022/indice-ng-components.mjs.map +1 -0
  88. package/index.d.ts +5 -5
  89. package/lib/controls/advanced-search/advanced-search.component.d.ts +40 -40
  90. package/lib/controls/advanced-search/models.d.ts +91 -91
  91. package/lib/controls/avatar-initials/avatar-initials.component.d.ts +14 -14
  92. package/lib/controls/breadcrumb/breadcrumb-item.d.ts +7 -7
  93. package/lib/controls/breadcrumb/breadcrumb.component.d.ts +12 -12
  94. package/lib/controls/collapsible-panel/collapsible-panel.component.d.ts +10 -10
  95. package/lib/controls/combobox/combobox.component.d.ts +35 -34
  96. package/lib/controls/content-tile/content-tile-header/content-tile-header.component.d.ts +7 -0
  97. package/lib/controls/content-tile/content-tile-item/content-tile-item.component.d.ts +8 -0
  98. package/lib/controls/content-tile/content-tile.component.d.ts +23 -0
  99. package/lib/controls/date-picker/date-picker.component.d.ts +53 -53
  100. package/lib/controls/drop-down-menu/drop-down-menu.component.d.ts +26 -26
  101. package/lib/controls/kpi-tile/kpi-tile.component.d.ts +15 -15
  102. package/lib/controls/language-selection/language-selection.component.d.ts +14 -14
  103. package/lib/controls/list-view/list-column.component.d.ts +9 -9
  104. package/lib/controls/list-view/list-details-section.component.d.ts +7 -7
  105. package/lib/controls/list-view/list-tile.component.d.ts +7 -7
  106. package/lib/controls/list-view/list-view-empty-state.component.d.ts +11 -11
  107. package/lib/controls/list-view/list-view.component.d.ts +62 -61
  108. package/lib/controls/nav-links-list/nav-links-list.component.d.ts +21 -21
  109. package/lib/controls/notifications-indicator/notifications-indicator.component.d.ts +22 -22
  110. package/lib/controls/pager/pager.component.d.ts +36 -36
  111. package/lib/controls/progress-bar/progress-bar.component.d.ts +16 -0
  112. package/lib/controls/side-pane/side-pane.component.d.ts +22 -18
  113. package/lib/controls/skeleton-loader/skeleton-loader.component.d.ts +12 -11
  114. package/lib/controls/stats-grid/stats-grid.component.d.ts +16 -0
  115. package/lib/controls/stepper/lib-step-info.directive.d.ts +8 -8
  116. package/lib/controls/stepper/lib-step-label.directive.d.ts +8 -8
  117. package/lib/controls/stepper/lib-step.component.d.ts +34 -34
  118. package/lib/controls/stepper/lib-stepper.component.d.ts +43 -43
  119. package/lib/controls/stepper/types/step-selected-event.d.ts +12 -12
  120. package/lib/controls/stepper/types/stepper-type.d.ts +10 -10
  121. package/lib/controls/tabs/lib-tab-group.component.d.ts +21 -21
  122. package/lib/controls/tabs/lib-tab-label.directive.d.ts +8 -8
  123. package/lib/controls/tabs/lib-tab.component.d.ts +24 -24
  124. package/lib/controls/toaster/toaster-container.component.d.ts +13 -13
  125. package/lib/controls/toaster/toaster.component.d.ts +15 -15
  126. package/lib/controls/toggle/toggle.component.d.ts +19 -19
  127. package/lib/controls/toggle-button/toggle-button.component.d.ts +25 -25
  128. package/lib/controls/toggle-buttons-list/toggle-buttons-list.component.d.ts +15 -14
  129. package/lib/controls/user-profile-menu/user-profile-menu.component.d.ts +24 -24
  130. package/lib/directives/click-outside.directive.d.ts +40 -40
  131. package/lib/directives/dynamic-component-host.directive.d.ts +9 -9
  132. package/lib/helpers/base-list.component.d.ts +54 -53
  133. package/lib/icons.d.ts +34 -34
  134. package/lib/layouts/shell/shell-footer/shell-footer.component.d.ts +8 -8
  135. package/lib/layouts/shell/shell-header/shell-header.component.d.ts +39 -39
  136. package/lib/layouts/shell/shell-layout/shell-layout.component.d.ts +26 -26
  137. package/lib/layouts/shell/shell-sidebar/shell-sidebar.component.d.ts +20 -20
  138. package/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.d.ts +14 -14
  139. package/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.d.ts +15 -15
  140. package/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.d.ts +10 -10
  141. package/lib/layouts/views/form-layout/form-layout.component.d.ts +26 -24
  142. package/lib/layouts/views/model-view-layout/model-view-layout.component.d.ts +42 -42
  143. package/lib/layouts/views/side-view-layout/side-view-layout.component.d.ts +29 -28
  144. package/lib/layouts/views/view-layout/view-layout.component.d.ts +31 -31
  145. package/lib/ng-components.module.d.ts +71 -65
  146. package/lib/pages/auth/auth-callback/auth-callback.component.d.ts +13 -13
  147. package/lib/pages/auth/auth-renew/auth-renew.component.d.ts +12 -12
  148. package/lib/pages/auth/logged-out/logged-out.component.d.ts +12 -12
  149. package/lib/pages/http-status/error/error.component.d.ts +8 -8
  150. package/lib/pages/http-status/page-not-found/page-not-found.component.d.ts +8 -8
  151. package/lib/pages/http-status/unauthorized/unauthorized.component.d.ts +8 -8
  152. package/lib/pipes/address.pipe.d.ts +8 -8
  153. package/lib/pipes/duration-format.pipe.d.ts +8 -8
  154. package/lib/pipes/short-number.pipe.d.ts +7 -0
  155. package/lib/services/breadcrumb.service.d.ts +29 -29
  156. package/lib/services/component-loader/component-loader-options.class.d.ts +30 -30
  157. package/lib/services/component-loader/component-loader.class.d.ts +92 -92
  158. package/lib/services/component-loader/component-loader.factory.d.ts +24 -24
  159. package/lib/services/component-loader/content-ref.class.d.ts +12 -12
  160. package/lib/services/modal-service/modal-backdrop-component.d.ts +20 -20
  161. package/lib/services/modal-service/modal-container-component.d.ts +33 -33
  162. package/lib/services/modal-service/modal-options.class.d.ts +81 -81
  163. package/lib/services/modal-service/modal-service.d.ts +58 -58
  164. package/lib/services/modal-service/modal-styles.class.d.ts +10 -10
  165. package/lib/services/modal-service/modal.class.d.ts +43 -43
  166. package/lib/services/toaster.service.d.ts +11 -11
  167. package/lib/services/user-settings.service.d.ts +13 -13
  168. package/lib/services/utilities.service.d.ts +11 -11
  169. package/lib/tokens.d.ts +10 -10
  170. package/lib/types.d.ts +179 -177
  171. package/package.json +14 -21
  172. package/public-api.d.ts +68 -60
  173. package/esm2020/lib/controls/advanced-search/advanced-search.component.mjs +0 -156
  174. package/esm2020/lib/controls/advanced-search/models.mjs +0 -109
  175. package/esm2020/lib/controls/avatar-initials/avatar-initials.component.mjs +0 -48
  176. package/esm2020/lib/controls/combobox/combobox.component.mjs +0 -117
  177. package/esm2020/lib/controls/date-picker/date-picker.component.mjs +0 -292
  178. package/esm2020/lib/controls/drop-down-menu/drop-down-menu.component.mjs +0 -72
  179. package/esm2020/lib/controls/language-selection/language-selection.component.mjs +0 -31
  180. package/esm2020/lib/controls/list-view/list-view-empty-state.component.mjs +0 -29
  181. package/esm2020/lib/controls/list-view/list-view.component.mjs +0 -206
  182. package/esm2020/lib/controls/notifications-indicator/notifications-indicator.component.mjs +0 -79
  183. package/esm2020/lib/controls/pager/pager.component.mjs +0 -130
  184. package/esm2020/lib/controls/side-pane/side-pane.component.mjs +0 -72
  185. package/esm2020/lib/controls/skeleton-loader/skeleton-loader.component.mjs +0 -25
  186. package/esm2020/lib/controls/stepper/lib-step.component.mjs +0 -81
  187. package/esm2020/lib/controls/stepper/lib-stepper.component.mjs +0 -108
  188. package/esm2020/lib/controls/tabs/lib-tab-group.component.mjs +0 -66
  189. package/esm2020/lib/controls/toggle/toggle.component.mjs +0 -64
  190. package/esm2020/lib/controls/toggle-button/toggle-button.component.mjs +0 -87
  191. package/esm2020/lib/controls/toggle-buttons-list/toggle-buttons-list.component.mjs +0 -31
  192. package/esm2020/lib/controls/user-profile-menu/user-profile-menu.component.mjs +0 -71
  193. package/esm2020/lib/directives/click-outside.directive.mjs +0 -189
  194. package/esm2020/lib/helpers/base-list.component.mjs +0 -226
  195. package/esm2020/lib/icons.mjs +0 -36
  196. package/esm2020/lib/layouts/shell/shell-header/shell-header.component.mjs +0 -130
  197. package/esm2020/lib/layouts/shell/shell-layout/shell-layout.component.mjs +0 -90
  198. package/esm2020/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.mjs +0 -30
  199. package/esm2020/lib/layouts/views/form-layout/form-layout.component.mjs +0 -80
  200. package/esm2020/lib/layouts/views/model-view-layout/model-view-layout.component.mjs +0 -101
  201. package/esm2020/lib/layouts/views/side-view-layout/side-view-layout.component.mjs +0 -98
  202. package/esm2020/lib/layouts/views/view-layout/view-layout.component.mjs +0 -104
  203. package/esm2020/lib/ng-components.module.mjs +0 -288
  204. package/esm2020/lib/pages/auth/auth-callback/auth-callback.component.mjs +0 -30
  205. package/esm2020/lib/pages/auth/auth-renew/auth-renew.component.mjs +0 -31
  206. package/esm2020/lib/pipes/address.pipe.mjs +0 -21
  207. package/esm2020/lib/pipes/duration-format.pipe.mjs +0 -64
  208. package/esm2020/lib/services/breadcrumb.service.mjs +0 -174
  209. package/esm2020/lib/services/component-loader/component-loader.class.mjs +0 -188
  210. package/esm2020/lib/services/component-loader/component-loader.factory.mjs +0 -32
  211. package/esm2020/lib/services/modal-service/modal-backdrop-component.mjs +0 -44
  212. package/esm2020/lib/services/modal-service/modal-container-component.mjs +0 -126
  213. package/esm2020/lib/services/modal-service/modal-service.mjs +0 -220
  214. package/esm2020/lib/services/user-settings.service.mjs +0 -35
  215. package/esm2020/lib/services/utilities.service.mjs +0 -47
  216. package/esm2020/lib/types.mjs +0 -132
  217. package/fesm2015/indice-ng-components.mjs +0 -4852
  218. package/fesm2015/indice-ng-components.mjs.map +0 -1
  219. package/fesm2020/indice-ng-components.mjs.map +0 -1
@@ -1,156 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { FilterClause, QueryParameters, Operators, OperatorOptions } from './models';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "../date-picker/date-picker.component";
7
- import * as i4 from "../drop-down-menu/drop-down-menu.component";
8
- export class AdvancedSearchComponent {
9
- constructor() {
10
- this.advancedSearchChanged = new EventEmitter();
11
- this.searchOptions = [];
12
- this.operatorsDisabled = false;
13
- this.filters = [];
14
- this.menuOptions = [];
15
- this.operatorMenuOptions = [];
16
- this.operatorOptions = OperatorOptions;
17
- this.operators = {};
18
- this.menuOptionsDictionary = {};
19
- }
20
- ngOnInit() {
21
- this.searchOptions.forEach((searchOption) => {
22
- this.menuOptions.push({
23
- text: searchOption.name,
24
- value: searchOption.field,
25
- data: searchOption.dataType,
26
- description: searchOption.placeholder,
27
- icon: undefined
28
- });
29
- if (searchOption.dataType === 'array') {
30
- let menuOpts = [];
31
- searchOption.options?.forEach((selectInputOption) => {
32
- menuOpts.push({
33
- text: selectInputOption.label,
34
- value: selectInputOption.value,
35
- data: undefined,
36
- description: selectInputOption.description,
37
- icon: undefined
38
- });
39
- });
40
- this.menuOptionsDictionary[searchOption.field] = menuOpts;
41
- }
42
- });
43
- }
44
- selectedFieldChanged(field) {
45
- this.selectedField = this.searchOptions.find((searchOption) => searchOption.field === field);
46
- this.selectedOperator = undefined;
47
- // Since we have special UI handling for the daterange, we don't need to fill the operatorMenuOptions in that case.
48
- if (this.selectedField?.dataType != 'daterange') {
49
- let operatorMenuOpts = [];
50
- // based on the data type that we are filtering, fill the operator dropdown with the correct operators. The default is the string with equals/not-equals/contains
51
- this.operatorOptions[this.selectedField?.dataType ?? 'string'].forEach(x => {
52
- operatorMenuOpts.push({
53
- text: x.description ?? x.label,
54
- value: x.value,
55
- data: undefined,
56
- description: x.description,
57
- icon: undefined
58
- });
59
- });
60
- this.operatorMenuOptions = operatorMenuOpts;
61
- // Preselect the first option from the operators menu so there will always be a default value, which is the 'equals' operator for all data types for now.
62
- this.selectedOperator = this.operatorMenuOptions[0].value;
63
- }
64
- this.fieldValue = undefined;
65
- }
66
- selectedOperatorChanged(operator) {
67
- this.selectedOperator = operator;
68
- }
69
- selectedFieldValueChanged(fieldValue) {
70
- this.fieldValue = fieldValue;
71
- }
72
- search() {
73
- if (!this.selectedField || !this.selectedField.dataType) {
74
- return;
75
- }
76
- // the filter is of type 'daterange'
77
- if (this.selectedField.dataType === 'daterange') {
78
- if (!this.selectedField.multiTerm) {
79
- this.filters = this.filters.filter((f) => {
80
- return f.member !== QueryParameters.FILTER_FROM && f.member !== QueryParameters.FILTER_TO;
81
- });
82
- }
83
- if (this.fieldValueDateFrom) {
84
- const filterClauseFrom = new FilterClause(QueryParameters.FILTER_FROM, this.fieldValueDateFrom, Operators.GREATER_THAN_EQUAL.value, 'datetime', this.searchOptions);
85
- this.filters.push(filterClauseFrom);
86
- }
87
- if (this.fieldValueDateTo) {
88
- const filterClauseTo = new FilterClause(QueryParameters.FILTER_TO, this.fieldValueDateTo, Operators.LESS_THAN_EQUAL.value, 'datetime', this.searchOptions);
89
- this.filters.push(filterClauseTo);
90
- }
91
- }
92
- // the filter isn't of type 'daterange' (everything else)
93
- else {
94
- if (this.fieldValue === undefined) { // handle empty field value
95
- return;
96
- }
97
- // if no operator was provided, it falls back to the default 'equals' operator
98
- this.selectedOperator = this.selectedOperator ?? Operators.EQUALS.value;
99
- // create the filterClause
100
- const filterClause = new FilterClause(this.selectedField.field, this.fieldValue, this.selectedOperator, this.selectedField.dataType, this.searchOptions);
101
- if (!this.selectedField.multiTerm) { // multiTerm means that we can have multiple filter values of the SAME filter clause (eg "filter case types that are Phone OR Address")
102
- this.filters = this.filters.filter((f) => {
103
- return f.member !== this.selectedField.field;
104
- });
105
- }
106
- else { // selectedField is multiTerm: just checking if we already have the newly selected filterClause in filters
107
- const isDuplicate = this.filters.some(f => f.toString() === filterClause.toString());
108
- if (isDuplicate) {
109
- return;
110
- }
111
- }
112
- this.filters.push(filterClause);
113
- this.fieldValue = undefined;
114
- }
115
- this.advancedSearchChanged.emit(this.filters);
116
- }
117
- removeFilter(index) {
118
- if (this.filters && this.filters.length >= index) {
119
- this.filters.splice(index, 1);
120
- this.advancedSearchChanged.emit(this.filters);
121
- }
122
- }
123
- isDateValueUnpicked() {
124
- return this.fieldValueDateFrom === undefined && this.fieldValueDateTo === undefined;
125
- }
126
- isFieldAndOperatorUnpicked() {
127
- // if the operators are enabled we need to check for both the field value and the operator value
128
- return this.operatorsDisabled ? this.fieldValue === undefined : (this.fieldValue === undefined || this.selectedOperator === undefined);
129
- }
130
- clear() {
131
- this.fieldValueDateFrom = undefined;
132
- this.fieldValueDateTo = undefined;
133
- this.selectedField = undefined;
134
- this.fieldValue = undefined;
135
- this.selectedOperator = undefined;
136
- this.filters = [];
137
- this.advancedSearchChanged.emit(this.filters);
138
- }
139
- }
140
- AdvancedSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
141
- AdvancedSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: AdvancedSearchComponent, selector: "lib-advanced-search", inputs: { searchOptions: ["search-options", "searchOptions"], operatorsDisabled: ["operators-disabled", "operatorsDisabled"], filters: "filters" }, outputs: { advancedSearchChanged: "advancedSearchChanged" }, ngImport: i0, template: "<div class=\"advanced-search-container\">\r\n <div class=\"advanced-search-filter\">\r\n <!--SEARCH FIELDS-->\r\n <div class=\"advanced-search-filter-field-container\">\r\n <label class=\"advanced-search-filter-field-label\"\r\n for=\"selectedField\">\r\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\r\n </label>\r\n <lib-drop-down-menu [options]=\"menuOptions\"\r\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n <!--SEARCH FIELDS OPERATOR MENU-->\r\n <div *ngIf=\"!operatorsDisabled && selectedField\"\r\n class=\"advanced-search-filter-operator-container\">\r\n <div *ngIf=\"selectedField.dataType === 'array' || selectedField.dataType === 'string'\">\r\n <label class=\"advanced-search-filter-operator-label\"\r\n for=\"selectedOperator\">\r\n &nbsp;\r\n </label>\r\n <lib-drop-down-menu [options]=\"operatorMenuOptions\"\r\n [selected]=\"selectedOperator\"\r\n (selectedChanged)=\"selectedOperatorChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n </div>\r\n <!--SEARCH FIELDS INPUT-->\r\n <div *ngIf=\"selectedField\"\r\n class=\"advanced-search-filter-value-container\">\r\n <div *ngIf=\"selectedField.dataType === 'array'\">\r\n <label class=\"advanced-search-filter-value-label\"\r\n for=\"fieldValue\">\r\n &nbsp;\r\n </label>\r\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\r\n [selected]=\"fieldValue\"\r\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n <div *ngIf=\"selectedField.dataType === 'string'\">\r\n <label class=\"advanced-search-filter-value-label\"\r\n for=\"fieldValue\">\r\n &nbsp;\r\n </label>\r\n <input (keyup.enter)=\"search()\"\r\n [(ngModel)]=\"fieldValue\"\r\n name=\"fieldValue\"\r\n type=\"text\"\r\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\r\n maxlength=\"300\"\r\n class=\"advanced-search-filter-value-input\">\r\n </div>\r\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\r\n <div>\r\n <span class=\"advanced-search-filter-value-input-daterange-from\">\r\n \u0391\u03C0\u03CC:\r\n </span>\r\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\r\n [(ngModel)]=\"fieldValueDateFrom\"\r\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\r\n </div>\r\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\r\n <span class=\"advanced-search-filter-value-input-daterange-to\">\r\n \u0388\u03C9\u03C2:\r\n </span>\r\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\r\n [(ngModel)]=\"fieldValueDateTo\"\r\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"selectedField\">\r\n <!--DO SEARCH-->\r\n <button type=\"button\"\r\n [ngClass]=\"{'opacity-50 cursor-not-allowed': isDateValueUnpicked() && isFieldAndOperatorUnpicked()}\"\r\n [disabled]=\"isDateValueUnpicked() && isFieldAndOperatorUnpicked()\"\r\n (click)=\"search()\">\r\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\r\n </button>\r\n <!--CLEAR-->\r\n <button type=\"button\"\r\n (click)=\"clear()\">\r\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <!--FILTER CHIPS-->\r\n <!-- This example requires Tailwind CSS v2.0+ -->\r\n <ng-container *ngFor=\"let filter of filters; let i = index\">\r\n <span *ngIf=\"filter && filter.member\"\r\n class=\"advanced-search-chips\">\r\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\r\n <button (click)=\"removeFilter(i)\"\r\n type=\"button\"\r\n class=\"advanced-search-chips-remove-filter\">\r\n <span class=\"sr-only\">Remove large option</span>\r\n <svg class=\"h-2 w-2\"\r\n stroke=\"currentColor\"\r\n fill=\"none\"\r\n viewBox=\"0 0 8 8\">\r\n <path stroke-linecap=\"round\"\r\n stroke-width=\"1.5\"\r\n d=\"M1 1l6 6m0-6L1 7\" />\r\n </svg>\r\n </button>\r\n </span>\r\n </ng-container>\r\n</div>", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.DatepickerComponent, selector: "lib-date-picker", inputs: ["readonly", "disabled", "inline", "display-format", "placeholder", "value", "minDate", "maxDate"], outputs: ["valueChange"] }, { kind: "component", type: i4.DropDownMenuComponent, selector: "lib-drop-down-menu", inputs: ["options", "selected", "multiple", "placeholder", "show-icons"], outputs: ["selectedChange", "selectedChanged"] }] });
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
143
- type: Component,
144
- args: [{ selector: 'lib-advanced-search', template: "<div class=\"advanced-search-container\">\r\n <div class=\"advanced-search-filter\">\r\n <!--SEARCH FIELDS-->\r\n <div class=\"advanced-search-filter-field-container\">\r\n <label class=\"advanced-search-filter-field-label\"\r\n for=\"selectedField\">\r\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\r\n </label>\r\n <lib-drop-down-menu [options]=\"menuOptions\"\r\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n <!--SEARCH FIELDS OPERATOR MENU-->\r\n <div *ngIf=\"!operatorsDisabled && selectedField\"\r\n class=\"advanced-search-filter-operator-container\">\r\n <div *ngIf=\"selectedField.dataType === 'array' || selectedField.dataType === 'string'\">\r\n <label class=\"advanced-search-filter-operator-label\"\r\n for=\"selectedOperator\">\r\n &nbsp;\r\n </label>\r\n <lib-drop-down-menu [options]=\"operatorMenuOptions\"\r\n [selected]=\"selectedOperator\"\r\n (selectedChanged)=\"selectedOperatorChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n </div>\r\n <!--SEARCH FIELDS INPUT-->\r\n <div *ngIf=\"selectedField\"\r\n class=\"advanced-search-filter-value-container\">\r\n <div *ngIf=\"selectedField.dataType === 'array'\">\r\n <label class=\"advanced-search-filter-value-label\"\r\n for=\"fieldValue\">\r\n &nbsp;\r\n </label>\r\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\r\n [selected]=\"fieldValue\"\r\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\r\n </div>\r\n <div *ngIf=\"selectedField.dataType === 'string'\">\r\n <label class=\"advanced-search-filter-value-label\"\r\n for=\"fieldValue\">\r\n &nbsp;\r\n </label>\r\n <input (keyup.enter)=\"search()\"\r\n [(ngModel)]=\"fieldValue\"\r\n name=\"fieldValue\"\r\n type=\"text\"\r\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\r\n maxlength=\"300\"\r\n class=\"advanced-search-filter-value-input\">\r\n </div>\r\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\r\n <div>\r\n <span class=\"advanced-search-filter-value-input-daterange-from\">\r\n \u0391\u03C0\u03CC:\r\n </span>\r\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\r\n [(ngModel)]=\"fieldValueDateFrom\"\r\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\r\n </div>\r\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\r\n <span class=\"advanced-search-filter-value-input-daterange-to\">\r\n \u0388\u03C9\u03C2:\r\n </span>\r\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\r\n [(ngModel)]=\"fieldValueDateTo\"\r\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"selectedField\">\r\n <!--DO SEARCH-->\r\n <button type=\"button\"\r\n [ngClass]=\"{'opacity-50 cursor-not-allowed': isDateValueUnpicked() && isFieldAndOperatorUnpicked()}\"\r\n [disabled]=\"isDateValueUnpicked() && isFieldAndOperatorUnpicked()\"\r\n (click)=\"search()\">\r\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\r\n </button>\r\n <!--CLEAR-->\r\n <button type=\"button\"\r\n (click)=\"clear()\">\r\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <!--FILTER CHIPS-->\r\n <!-- This example requires Tailwind CSS v2.0+ -->\r\n <ng-container *ngFor=\"let filter of filters; let i = index\">\r\n <span *ngIf=\"filter && filter.member\"\r\n class=\"advanced-search-chips\">\r\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\r\n <button (click)=\"removeFilter(i)\"\r\n type=\"button\"\r\n class=\"advanced-search-chips-remove-filter\">\r\n <span class=\"sr-only\">Remove large option</span>\r\n <svg class=\"h-2 w-2\"\r\n stroke=\"currentColor\"\r\n fill=\"none\"\r\n viewBox=\"0 0 8 8\">\r\n <path stroke-linecap=\"round\"\r\n stroke-width=\"1.5\"\r\n d=\"M1 1l6 6m0-6L1 7\" />\r\n </svg>\r\n </button>\r\n </span>\r\n </ng-container>\r\n</div>" }]
145
- }], ctorParameters: function () { return []; }, propDecorators: { advancedSearchChanged: [{
146
- type: Output
147
- }], searchOptions: [{
148
- type: Input,
149
- args: ['search-options']
150
- }], operatorsDisabled: [{
151
- type: Input,
152
- args: ['operators-disabled']
153
- }], filters: [{
154
- type: Input
155
- }] } });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFnQixZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7OztBQU1uRyxNQUFNLE9BQU8sdUJBQXVCO0lBZ0JsQztRQWZVLDBCQUFxQixHQUFpQyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUMxRSxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDL0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ3ZELFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUMvQix3QkFBbUIsR0FBaUIsRUFBRSxDQUFDO1FBQ3ZDLG9CQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ2xDLGNBQVMsR0FBb0MsRUFBRSxDQUFDO1FBTWhELDBCQUFxQixHQUFvQyxFQUFFLENBQUM7SUFFbkQsQ0FBQztJQUVWLFFBQVE7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JB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QUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDO0lBQ3RGLENBQUM7SUFFTSwwQkFBMEI7UUFDL0IsZ0dBQWdHO1FBQ2hHLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDekksQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDOztvSEFqSlUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsNFFDUnBDLHM1S0F3R007MkZEaEdPLHVCQUF1QjtrQkFKbkMsU0FBUzsrQkFDRSxxQkFBcUI7MEVBSXJCLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDa0IsYUFBYTtzQkFBckMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ00saUJBQWlCO3NCQUE3QyxLQUFLO3VCQUFDLG9CQUFvQjtnQkFDbEIsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51T3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBTZWFyY2hPcHRpb24sIEZpbHRlckNsYXVzZSwgUXVlcnlQYXJhbWV0ZXJzLCBPcGVyYXRvcnMsIE9wZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4vbW9kZWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWFkdmFuY2VkLXNlYXJjaCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAT3V0cHV0KCkgYWR2YW5jZWRTZWFyY2hDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8RmlsdGVyQ2xhdXNlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDbGF1c2VbXT4oKTtcclxuICBASW5wdXQoJ3NlYXJjaC1vcHRpb25zJykgc2VhcmNoT3B0aW9uczogU2VhcmNoT3B0aW9uW10gPSBbXTtcclxuICBASW5wdXQoJ29wZXJhdG9ycy1kaXNhYmxlZCcpIG9wZXJhdG9yc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZmlsdGVyczogRmlsdGVyQ2xhdXNlW10gPSBbXTtcclxuICBwdWJsaWMgbWVudU9wdGlvbnM6IE1lbnVPcHRpb25bXSA9IFtdO1xyXG4gIHB1YmxpYyBvcGVyYXRvck1lbnVPcHRpb25zOiBNZW51T3B0aW9uW10gPSBbXTtcclxuICBwdWJsaWMgb3BlcmF0b3JPcHRpb25zID0gT3BlcmF0b3JPcHRpb25zO1xyXG4gIHB1YmxpYyBvcGVyYXRvcnM6IHsgW2tleTogc3RyaW5nXTogTWVudU9wdGlvbltdIH0gPSB7fTtcclxuICBwdWJsaWMgc2VsZWN0ZWRPcGVyYXRvcj86IHN0cmluZztcclxuICBwdWJsaWMgc2VsZWN0ZWRGaWVsZD86IFNlYXJjaE9wdGlvbjtcclxuICBwdWJsaWMgZmllbGRWYWx1ZT86IHN0cmluZztcclxuICBwdWJsaWMgZmllbGRWYWx1ZURhdGVGcm9tOiBhbnk7XHJcbiAgcHVibGljIGZpZWxkVmFsdWVEYXRlVG86IGFueTtcclxuICBwdWJsaWMgbWVudU9wdGlvbnNEaWN0aW9uYXJ5OiB7IFtrZXk6IHN0cmluZ106IE1lbnVPcHRpb25bXSB9ID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoT3B0aW9ucy5mb3JFYWNoKChzZWFyY2hPcHRpb24pID0+IHtcclxuICAgICAgdGhpcy5tZW51T3B0aW9ucy5wdXNoKHtcclxuICAgICAgICB0ZXh0OiBzZWFyY2hPcHRpb24ubmFtZSxcclxuICAgICAgICB2YWx1ZTogc2VhcmNoT3B0aW9uLmZpZWxkLFxyXG4gICAgICAgIGRhdGE6IHNlYXJjaE9wdGlvbi5kYXRhVHlwZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogc2VhcmNoT3B0aW9uLnBsYWNlaG9sZGVyLFxyXG4gICAgICAgIGljb246IHVuZGVmaW5lZFxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHNlYXJjaE9wdGlvbi5kYXRhVHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgIGxldCBtZW51T3B0czogTWVudU9wdGlvbltdID0gW107XHJcbiAgICAgICAgc2VhcmNoT3B0aW9uLm9wdGlvbnM/LmZvckVhY2goKHNlbGVjdElucHV0T3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICBtZW51T3B0cy5wdXNoKHtcclxuICAgICAgICAgICAgdGV4dDogc2VsZWN0SW5wdXRPcHRpb24ubGFiZWwsXHJcbiAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RJbnB1dE9wdGlvbi52YWx1ZSxcclxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogc2VsZWN0SW5wdXRPcHRpb24uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGljb246IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm1lbnVPcHRpb25zRGljdGlvbmFyeVtzZWFyY2hPcHRpb24uZmllbGRdID0gbWVudU9wdHM7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdGVkRmllbGRDaGFuZ2VkKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCA9IHRoaXMuc2VhcmNoT3B0aW9ucy5maW5kKChzZWFyY2hPcHRpb24pID0+IHNlYXJjaE9wdGlvbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9wZXJhdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gU2luY2Ugd2UgaGF2ZSBzcGVjaWFsIFVJIGhhbmRsaW5nIGZvciB0aGUgZGF0ZXJhbmdlLCB3ZSBkb24ndCBuZWVkIHRvIGZpbGwgdGhlIG9wZXJhdG9yTWVudU9wdGlvbnMgaW4gdGhhdCBjYXNlLlxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWVsZD8uZGF0YVR5cGUgIT0gJ2RhdGVyYW5nZScpIHtcclxuICAgICAgbGV0IG9wZXJhdG9yTWVudU9wdHM6IE1lbnVPcHRpb25bXSA9IFtdO1xyXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgZGF0YSB0eXBlIHRoYXQgd2UgYXJlIGZpbHRlcmluZywgZmlsbCB0aGUgb3BlcmF0b3IgZHJvcGRvd24gd2l0aCB0aGUgY29ycmVjdCBvcGVyYXRvcnMuIFRoZSBkZWZhdWx0IGlzIHRoZSBzdHJpbmcgd2l0aCBlcXVhbHMvbm90LWVxdWFscy9jb250YWluc1xyXG4gICAgICB0aGlzLm9wZXJhdG9yT3B0aW9uc1t0aGlzLnNlbGVjdGVkRmllbGQ/LmRhdGFUeXBlID8/ICdzdHJpbmcnXS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgIG9wZXJhdG9yTWVudU9wdHMucHVzaCh7XHJcbiAgICAgICAgICB0ZXh0OiB4LmRlc2NyaXB0aW9uID8/IHgubGFiZWwsXHJcbiAgICAgICAgICB2YWx1ZTogeC52YWx1ZSxcclxuICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB4LmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgaWNvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5vcGVyYXRvck1lbnVPcHRpb25zID0gb3BlcmF0b3JNZW51T3B0cztcclxuICAgICAgLy8gUHJlc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24gZnJvbSB0aGUgb3BlcmF0b3JzIG1lbnUgc28gdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBkZWZhdWx0IHZhbHVlLCB3aGljaCBpcyB0aGUgJ2VxdWFscycgb3BlcmF0b3IgZm9yIGFsbCBkYXRhIHR5cGVzIGZvciBub3cuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcGVyYXRvciA9IHRoaXMub3BlcmF0b3JNZW51T3B0aW9uc1swXS52YWx1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmllbGRWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZE9wZXJhdG9yQ2hhbmdlZChvcGVyYXRvcjogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkT3BlcmF0b3IgPSBvcGVyYXRvcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZEZpZWxkVmFsdWVDaGFuZ2VkKGZpZWxkVmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCB8fCAhdGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIHRoZSBmaWx0ZXIgaXMgb2YgdHlwZSAnZGF0ZXJhbmdlJ1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVyYW5nZScpIHtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQubXVsdGlUZXJtKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gdGhpcy5maWx0ZXJzLmZpbHRlcigoZikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGYubWVtYmVyICE9PSBRdWVyeVBhcmFtZXRlcnMuRklMVEVSX0ZST00gJiYgZi5tZW1iZXIgIT09IFF1ZXJ5UGFyYW1ldGVycy5GSUxURVJfVE87XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZmllbGRWYWx1ZURhdGVGcm9tKSB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyQ2xhdXNlRnJvbSA9IG5ldyBGaWx0ZXJDbGF1c2UoUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9GUk9NLCB0aGlzLmZpZWxkVmFsdWVEYXRlRnJvbSwgT3BlcmF0b3JzLkdSRUFURVJfVEhBTl9FUVVBTC52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3AsICdkYXRldGltZScsIHRoaXMuc2VhcmNoT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLnB1c2goZmlsdGVyQ2xhdXNlRnJvbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkVmFsdWVEYXRlVG8pIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJDbGF1c2VUbyA9IG5ldyBGaWx0ZXJDbGF1c2UoUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9UTywgdGhpcy5maWVsZFZhbHVlRGF0ZVRvLCBPcGVyYXRvcnMuTEVTU19USEFOX0VRVUFMLnZhbHVlIGFzIEZpbHRlckNsYXVzZS5PcCwgJ2RhdGV0aW1lJywgdGhpcy5zZWFyY2hPcHRpb25zKTtcclxuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXJDbGF1c2VUbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBmaWx0ZXIgaXNuJ3Qgb2YgdHlwZSAnZGF0ZXJhbmdlJyAoZXZlcnl0aGluZyBlbHNlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCkgeyAvLyBoYW5kbGUgZW1wdHkgZmllbGQgdmFsdWVcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgbm8gb3BlcmF0b3Igd2FzIHByb3ZpZGVkLCBpdCBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0ICdlcXVhbHMnIG9wZXJhdG9yXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcGVyYXRvciA9IHRoaXMuc2VsZWN0ZWRPcGVyYXRvciA/PyBPcGVyYXRvcnMuRVFVQUxTLnZhbHVlO1xyXG4gICAgICAvLyBjcmVhdGUgdGhlIGZpbHRlckNsYXVzZVxyXG4gICAgICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBuZXcgRmlsdGVyQ2xhdXNlKHRoaXMuc2VsZWN0ZWRGaWVsZC5maWVsZCwgdGhpcy5maWVsZFZhbHVlLCB0aGlzLnNlbGVjdGVkT3BlcmF0b3IgYXMgRmlsdGVyQ2xhdXNlLk9wLCB0aGlzLnNlbGVjdGVkRmllbGQuZGF0YVR5cGUsIHRoaXMuc2VhcmNoT3B0aW9ucyk7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkLm11bHRpVGVybSkgeyAvLyBtdWx0aVRlcm0gbWVhbnMgdGhhdCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBmaWx0ZXIgdmFsdWVzIG9mIHRoZSBTQU1FIGZpbHRlciBjbGF1c2UgKGVnIFwiZmlsdGVyIGNhc2UgdHlwZXMgdGhhdCBhcmUgUGhvbmUgT1IgQWRkcmVzc1wiKVxyXG4gICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZmlsdGVycy5maWx0ZXIoKGYpID0+IHtcclxuICAgICAgICAgIHJldHVybiBmLm1lbWJlciAhPT0gdGhpcy5zZWxlY3RlZEZpZWxkIS5maWVsZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHsgLy8gc2VsZWN0ZWRGaWVsZCBpcyBtdWx0aVRlcm06IGp1c3QgY2hlY2tpbmcgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBuZXdseSBzZWxlY3RlZCBmaWx0ZXJDbGF1c2UgaW4gZmlsdGVyc1xyXG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gdGhpcy5maWx0ZXJzLnNvbWUoZiA9PiBmLnRvU3RyaW5nKCkgPT09IGZpbHRlckNsYXVzZS50b1N0cmluZygpKTtcclxuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmlsdGVycy5wdXNoKGZpbHRlckNsYXVzZSk7XHJcbiAgICAgIHRoaXMuZmllbGRWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hDaGFuZ2VkLmVtaXQodGhpcy5maWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVGaWx0ZXIoaW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID49IGluZGV4KSB7XHJcbiAgICAgIHRoaXMuZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoQ2hhbmdlZC5lbWl0KHRoaXMuZmlsdGVycyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXRlVmFsdWVVbnBpY2tlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkVmFsdWVEYXRlRnJvbSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZmllbGRWYWx1ZURhdGVUbyA9PT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRmllbGRBbmRPcGVyYXRvclVucGlja2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdGhlIG9wZXJhdG9ycyBhcmUgZW5hYmxlZCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBib3RoIHRoZSBmaWVsZCB2YWx1ZSBhbmQgdGhlIG9wZXJhdG9yIHZhbHVlXHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNEaXNhYmxlZCA/IHRoaXMuZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkIDogKHRoaXMuZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc2VsZWN0ZWRPcGVyYXRvciA9PT0gdW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhcigpIHtcclxuICAgIHRoaXMuZmllbGRWYWx1ZURhdGVGcm9tID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5maWVsZFZhbHVlRGF0ZVRvID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5maWVsZFZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9wZXJhdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5maWx0ZXJzID0gW107XHJcbiAgICB0aGlzLmFkdmFuY2VkU2VhcmNoQ2hhbmdlZC5lbWl0KHRoaXMuZmlsdGVycyk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXJcIj5cclxuICAgICAgICA8IS0tU0VBUkNIIEZJRUxEUy0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLWZpZWxkLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLWZpZWxkLWxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgIGZvcj1cInNlbGVjdGVkRmllbGRcIj5cclxuICAgICAgICAgICAgICAgIM6Rzr3Osc62zq7PhM63z4POtyDOsc69zqw6XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsaWItZHJvcC1kb3duLW1lbnUgW29wdGlvbnNdPVwibWVudU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwic2VsZWN0ZWRGaWVsZENoYW5nZWQoJGV2ZW50KVwiPjwvbGliLWRyb3AtZG93bi1tZW51PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS1TRUFSQ0ggRklFTERTIE9QRVJBVE9SIE1FTlUtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIW9wZXJhdG9yc0Rpc2FibGVkICYmIHNlbGVjdGVkRmllbGRcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLW9wZXJhdG9yLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2FycmF5JyB8fCBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci1vcGVyYXRvci1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwic2VsZWN0ZWRPcGVyYXRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItZHJvcC1kb3duLW1lbnUgW29wdGlvbnNdPVwib3BlcmF0b3JNZW51T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZE9wZXJhdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZE9wZXJhdG9yQ2hhbmdlZCgkZXZlbnQpXCI+PC9saWItZHJvcC1kb3duLW1lbnU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS1TRUFSQ0ggRklFTERTIElOUFVULS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGRcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2FycmF5J1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiZmllbGRWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsaWItZHJvcC1kb3duLW1lbnUgW29wdGlvbnNdPVwibWVudU9wdGlvbnNEaWN0aW9uYXJ5W3NlbGVjdGVkRmllbGQuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImZpZWxkVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cInNlbGVjdGVkRmllbGRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiPjwvbGliLWRyb3AtZG93bi1tZW51PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdzdHJpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJmaWVsZFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWVsZFZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmllbGRWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwizpHOvc6xzrbOrs+EzrfPg863XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIzMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlcmFuZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dC1kYXRlcmFuZ2UtZnJvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICDOkc+Az4w6XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItZGF0ZS1waWNrZXIgW21heERhdGVdPVwiZmllbGRWYWx1ZURhdGVUb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpZWxkVmFsdWVEYXRlRnJvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJzAxLzAxLzIwMjInXCI+PC9saWItZGF0ZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXJhbmdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dC1kYXRlcmFuZ2UtdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgzojPic+COlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWRhdGUtcGlja2VyIFttaW5EYXRlXT1cImZpZWxkVmFsdWVEYXRlRnJvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpZWxkVmFsdWVEYXRlVG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicwMS8wMS8yMDIyJ1wiPjwvbGliLWRhdGUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZpZWxkXCI+XHJcbiAgICAgICAgICAgIDwhLS1ETyBTRUFSQ0gtLT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktNTAgY3Vyc29yLW5vdC1hbGxvd2VkJzogaXNEYXRlVmFsdWVVbnBpY2tlZCgpICYmIGlzRmllbGRBbmRPcGVyYXRvclVucGlja2VkKCl9XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlVmFsdWVVbnBpY2tlZCgpICYmIGlzRmllbGRBbmRPcGVyYXRvclVucGlja2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidtcy1JY29uIG1zLUljb24tLVNlYXJjaCdcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8IS0tQ0xFQVItLT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidtcy1JY29uIG1zLUljb24tLUNhbmNlbCdcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tRklMVEVSIENISVBTLS0+XHJcbiAgICA8IS0tIFRoaXMgZXhhbXBsZSByZXF1aXJlcyBUYWlsd2luZCBDU1MgdjIuMCsgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVyICYmIGZpbHRlci5tZW1iZXJcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWNoaXBzXCI+XHJcbiAgICAgICAgICAgIHt7IGZpbHRlci51aU5hbWUgfX0ge3sgZmlsdGVyLnVpT3BlcmF0b3IgfX0gJ3t7IGZpbHRlci51aVZhbHVlIH19J1xyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWNoaXBzLXJlbW92ZS1maWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlJlbW92ZSBsYXJnZSBvcHRpb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC0yIHctMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA4IDhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMSAxbDYgNm0wLTZMMSA3XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+Il19
@@ -1,109 +0,0 @@
1
- import { formatDate } from "@angular/common";
2
- export var Operators;
3
- (function (Operators) {
4
- Operators.EQUALS = { label: '=', value: 'eq', description: 'Ίσο με' };
5
- Operators.NOT_EQUALS = { label: '≠', value: 'neq', description: 'Διάφορο του' };
6
- Operators.GREATER_THAN = { label: '>', value: 'gt', description: 'Μεγαλύτερο από' };
7
- Operators.LESS_THAN = { label: '<', value: 'lt', description: 'Μικρότερο από' };
8
- Operators.GREATER_THAN_EQUAL = { label: '≥', value: 'gte', description: 'Μεγαλύτερο ή ίσο με' };
9
- Operators.LESS_THAN_EQUAL = { label: '≤', value: 'lte', description: 'Μικρότερο ή ίσο με' };
10
- Operators.CONTAINS = { label: '∋', value: 'contains', description: 'Περιέχει' };
11
- Operators.IN = { label: '1..n', value: 'in', description: 'Μέσα σε' };
12
- })(Operators || (Operators = {}));
13
- export var QueryParameters;
14
- (function (QueryParameters) {
15
- QueryParameters["VIEW"] = "view";
16
- QueryParameters["PAGE_SIZE"] = "pagesize";
17
- QueryParameters["PAGE"] = "page";
18
- QueryParameters["SEARCH"] = "search";
19
- QueryParameters["SORT_FIELD"] = "sort";
20
- QueryParameters["SORT_DIRECTION"] = "dir";
21
- QueryParameters["FILTER"] = "filter";
22
- QueryParameters["FILTER_FROM"] = "from";
23
- QueryParameters["FILTER_TO"] = "to";
24
- })(QueryParameters || (QueryParameters = {}));
25
- export const OperatorOptions = {
26
- 'string': [Operators.EQUALS, Operators.NOT_EQUALS, Operators.CONTAINS],
27
- 'array': [Operators.EQUALS, Operators.NOT_EQUALS]
28
- };
29
- export class FilterClause {
30
- constructor(member, value, operator, dataType, searchOptions) {
31
- this.member = member;
32
- this.value = value;
33
- this.operator = operator || Operators.EQUALS.value;
34
- this.dataType = dataType === undefined ? 'string' : dataType;
35
- // uiName
36
- if (this.dataType === 'datetime') { // special treatment for dates
37
- this.uiName = this.member === QueryParameters.FILTER_FROM ? 'Από' : 'Έως';
38
- }
39
- else {
40
- this.uiName = this.member;
41
- let fo = {};
42
- if (searchOptions && searchOptions.length > 0) {
43
- fo = searchOptions.find((f) => {
44
- return f.field === this.member;
45
- });
46
- }
47
- if (fo) {
48
- this.uiName = fo.name;
49
- }
50
- }
51
- // We don't want a uiOperator for the datetime dataType. For strings and arrays we have the equals/not-equals/contains operators. The switch case can be expanded for more data types/operators when needed.
52
- if (this.dataType === 'datetime') {
53
- this.uiOperator = '';
54
- }
55
- else {
56
- switch (this.operator) {
57
- case (Operators.EQUALS.value):
58
- this.uiOperator = Operators.EQUALS.label;
59
- break;
60
- case (Operators.NOT_EQUALS.value):
61
- this.uiOperator = Operators.NOT_EQUALS.label;
62
- break;
63
- case (Operators.CONTAINS.value):
64
- this.uiOperator = Operators.CONTAINS.label;
65
- break;
66
- }
67
- }
68
- // uiValue
69
- this.uiValue = this.value;
70
- if ((this.dataType === 'datetime')) {
71
- this.uiValue = formatDate(new Date(this.value), 'dd/MM/yyyy', 'en-US');
72
- }
73
- let fo;
74
- if (searchOptions && searchOptions.length > 0) {
75
- fo = searchOptions.find((f) => {
76
- return f.field === this.member;
77
- });
78
- }
79
- if (fo && fo.options) { // special treatment for arrays, if there is an options property then it is an array
80
- this.dataType = 'array';
81
- this.uiValue = fo.options.find((option) => {
82
- return option.value === this.value;
83
- })?.label;
84
- }
85
- }
86
- static parse(text) {
87
- const pattern = /^\s*([A-Za-z_][A-Za-z0-9_\.]+)::(eq|neq|gt|lt|gte|lte|contains|in)::(\((string|integer|number|boolean|datetime)\))?(.+)\s*$/gi;
88
- if (text != null) {
89
- const matches = pattern.exec(text);
90
- if (matches != null) {
91
- const path = matches[1];
92
- const op = matches[2];
93
- const dt = matches[4];
94
- const v = matches[5];
95
- return new FilterClause(path, v, op, dt);
96
- }
97
- }
98
- return undefined;
99
- }
100
- toString() {
101
- if (this.dataType !== 'string' && this.dataType !== 'array') {
102
- return `${this.member}::${this.operator}::(${this.dataType})${this.value}`;
103
- }
104
- else {
105
- return `${this.member}::${this.operator}::${this.value}`;
106
- }
107
- }
108
- }
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2FkdmFuY2VkLXNlYXJjaC9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sS0FBVyxTQUFTLENBU3pCO0FBVEQsV0FBaUIsU0FBUztJQUNYLGdCQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVELG9CQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3RFLHNCQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDMUUsbUJBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDdEUsNEJBQWtCLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDdEYseUJBQWUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRixrQkFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUN0RSxZQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUs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QUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sRUFBRSxHQUFvQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxHQUFvQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFckIsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMxQztTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzNELE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDNUU7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgT3BlcmF0b3JzIHtcclxuICBleHBvcnQgY29uc3QgRVFVQUxTID0geyBsYWJlbDogJz0nLCB2YWx1ZTogJ2VxJywgZGVzY3JpcHRpb246ICfOis+Dzr8gzrzOtScgfTtcclxuICBleHBvcnQgY29uc3QgTk9UX0VRVUFMUyA9IHsgbGFiZWw6ICfiiaAnLCB2YWx1ZTogJ25lcScsIGRlc2NyaXB0aW9uOiAnzpTOuc6sz4bOv8+Bzr8gz4TOv8+FJyB9O1xyXG4gIGV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU4gPSB7IGxhYmVsOiAnPicsIHZhbHVlOiAnZ3QnLCBkZXNjcmlwdGlvbjogJ86czrXOs86xzrvPjc+EzrXPgc6/IM6xz4DPjCcgfTtcclxuICBleHBvcnQgY29uc3QgTEVTU19USEFOID0geyBsYWJlbDogJzwnLCB2YWx1ZTogJ2x0JywgZGVzY3JpcHRpb246ICfOnM65zrrPgc+Mz4TOtc+Bzr8gzrHPgM+MJyB9O1xyXG4gIGV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU5fRVFVQUwgPSB7IGxhYmVsOiAn4omlJywgdmFsdWU6ICdndGUnLCBkZXNjcmlwdGlvbjogJ86czrXOs86xzrvPjc+EzrXPgc6/IM6uIM6vz4POvyDOvM61JyB9O1xyXG4gIGV4cG9ydCBjb25zdCBMRVNTX1RIQU5fRVFVQUwgPSB7IGxhYmVsOiAn4omkJywgdmFsdWU6ICdsdGUnLCBkZXNjcmlwdGlvbjogJ86czrnOus+Bz4zPhM61z4HOvyDOriDOr8+Dzr8gzrzOtScgfTtcclxuICBleHBvcnQgY29uc3QgQ09OVEFJTlMgPSB7IGxhYmVsOiAn4oiLJywgdmFsdWU6ICdjb250YWlucycsIGRlc2NyaXB0aW9uOiAnzqDOtc+BzrnOrc+HzrXOuScgfTtcclxuICBleHBvcnQgY29uc3QgSU4gPSB7IGxhYmVsOiAnMS4ubicsIHZhbHVlOiAnaW4nLCBkZXNjcmlwdGlvbjogJ86czq3Pg86xIM+DzrUnIH07XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFF1ZXJ5UGFyYW1ldGVycyB7XHJcbiAgVklFVyA9ICd2aWV3JyxcclxuICBQQUdFX1NJWkUgPSAncGFnZXNpemUnLFxyXG4gIFBBR0UgPSAncGFnZScsXHJcbiAgU0VBUkNIID0gJ3NlYXJjaCcsXHJcbiAgU09SVF9GSUVMRCA9ICdzb3J0JyxcclxuICBTT1JUX0RJUkVDVElPTiA9ICdkaXInLFxyXG4gIEZJTFRFUiA9ICdmaWx0ZXInLFxyXG4gIEZJTFRFUl9GUk9NID0gJ2Zyb20nLFxyXG4gIEZJTFRFUl9UTyA9ICd0bydcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBGaWx0ZXJDbGF1c2UuRHQ7XHJcbiAgYXJyYXk/OiBib29sZWFuO1xyXG4gIG11bHRpVGVybT86IGJvb2xlYW47XHJcbiAgb3B0aW9ucz86IFNlbGVjdElucHV0T3B0aW9uW107XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0SW5wdXRPcHRpb24ge1xyXG4gIHZhbHVlOiBhbnk7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IG5hbWVzcGFjZSBGaWx0ZXJDbGF1c2Uge1xyXG4gIGV4cG9ydCB0eXBlIE9wID0gJ2VxJyB8ICduZXEnIHwgJ2d0JyB8ICdsdCcgfCAnZ3RlJyB8ICdsdGUnIHwgJ2NvbnRhaW5zJyB8ICdpbic7XHJcbiAgZXhwb3J0IHR5cGUgRHQgPSAnc3RyaW5nJyB8ICdpbnRlZ2VyJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ2RhdGV0aW1lJyB8ICdhcnJheScgfCAnZGF0ZXJhbmdlJyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLy8gRGljdGlvbmFyeSB3aXRoIHRoZSBEYXRhVHlwZSBhcyBhIGtleSBhbmQgdGhlIHZhbHVlIGFuIGFycmF5IG9mIGF2YWlsYWJsZSBvcGVyYXRvcnMuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpY3Rpb25hcnk8VD4ge1xyXG4gIFtrZXk6IHN0cmluZ106IFQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBPcGVyYXRvck9wdGlvbnM6IElEaWN0aW9uYXJ5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfVtdPiA9IHtcclxuICAnc3RyaW5nJzogW09wZXJhdG9ycy5FUVVBTFMsIE9wZXJhdG9ycy5OT1RfRVFVQUxTLCBPcGVyYXRvcnMuQ09OVEFJTlNdLFxyXG4gICdhcnJheSc6IFtPcGVyYXRvcnMuRVFVQUxTLCBPcGVyYXRvcnMuTk9UX0VRVUFMU11cclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDbGF1c2Uge1xyXG4gIC8vIE1lbWJlciBwYXRoIHRvIGNvbXBhcmVcclxuICBwdWJsaWMgbWVtYmVyOiBzdHJpbmc7XHJcbiAgLy8gVmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0XHJcbiAgcHVibGljIHZhbHVlOiBhbnk7XHJcbiAgLy8gVGhlIG9wZXJhdG9yIHRvIGFwcGx5IGJldHdlZW4gdGhlIEluZGljZS5UeXBlcy5GaWx0ZXJDbGF1c2UuTWVtYmVyIGFuZCBJbmRpY2UuVHlwZXMuRmlsdGVyQ2xhdXNlLlZhbHVlXHJcbiAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJDbGF1c2UuT3A7XHJcbiAgLy8gVGhlIEluZGljZS5UeXBlcy5Kc29uRGF0YVR5cGUgb2YgdGhlIGRhdGEgSW5kaWNlLlR5cGVzLkZpbHRlckNsYXVzZS5NZW1iZXJcclxuICBwdWJsaWMgZGF0YVR5cGU6IEZpbHRlckNsYXVzZS5EdDtcclxuXHJcbiAgcHVibGljIHVpTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyB1aU9wZXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHVpVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lbWJlcjogc3RyaW5nLCB2YWx1ZTogYW55LCBvcGVyYXRvcj86IEZpbHRlckNsYXVzZS5PcCwgZGF0YVR5cGU/OiBGaWx0ZXJDbGF1c2UuRHQsIHNlYXJjaE9wdGlvbnM/OiBTZWFyY2hPcHRpb25bXSkgeyAvLyB5ZWFwLCB3ZSBkbyBuZWVkIHNlYXJjaE9wdGlvbnMgZm9yIHRoZSB1aSB2aWV3IG1vZGVsXHJcbiAgICB0aGlzLm1lbWJlciA9IG1lbWJlcjtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvciB8fCBPcGVyYXRvcnMuRVFVQUxTLnZhbHVlIGFzIEZpbHRlckNsYXVzZS5PcDtcclxuICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZSA9PT0gdW5kZWZpbmVkID8gJ3N0cmluZycgOiBkYXRhVHlwZTtcclxuICAgIC8vIHVpTmFtZVxyXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHsgLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGRhdGVzXHJcbiAgICAgIHRoaXMudWlOYW1lID0gdGhpcy5tZW1iZXIgPT09IFF1ZXJ5UGFyYW1ldGVycy5GSUxURVJfRlJPTSA/ICfOkc+Az4wnIDogJ86Iz4nPgic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVpTmFtZSA9IHRoaXMubWVtYmVyO1xyXG4gICAgICBsZXQgZm8gPSA8YW55Pnt9O1xyXG4gICAgICBpZiAoc2VhcmNoT3B0aW9ucyAmJiBzZWFyY2hPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmbyA9IHNlYXJjaE9wdGlvbnMuZmluZCgoZikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGYuZmllbGQgPT09IHRoaXMubWVtYmVyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZm8pIHtcclxuICAgICAgICB0aGlzLnVpTmFtZSA9IGZvLm5hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFdlIGRvbid0IHdhbnQgYSB1aU9wZXJhdG9yIGZvciB0aGUgZGF0ZXRpbWUgZGF0YVR5cGUuIEZvciBzdHJpbmdzIGFuZCBhcnJheXMgd2UgaGF2ZSB0aGUgZXF1YWxzL25vdC1lcXVhbHMvY29udGFpbnMgb3BlcmF0b3JzLiBUaGUgc3dpdGNoIGNhc2UgY2FuIGJlIGV4cGFuZGVkIGZvciBtb3JlIGRhdGEgdHlwZXMvb3BlcmF0b3JzIHdoZW4gbmVlZGVkLlxyXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgdGhpcy51aU9wZXJhdG9yID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0b3IpIHtcclxuICAgICAgICBjYXNlIChPcGVyYXRvcnMuRVFVQUxTLnZhbHVlKTpcclxuICAgICAgICAgIHRoaXMudWlPcGVyYXRvciA9IE9wZXJhdG9ycy5FUVVBTFMubGFiZWw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIChPcGVyYXRvcnMuTk9UX0VRVUFMUy52YWx1ZSk6XHJcbiAgICAgICAgICB0aGlzLnVpT3BlcmF0b3IgPSBPcGVyYXRvcnMuTk9UX0VRVUFMUy5sYWJlbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgKE9wZXJhdG9ycy5DT05UQUlOUy52YWx1ZSk6XHJcbiAgICAgICAgICB0aGlzLnVpT3BlcmF0b3IgPSBPcGVyYXRvcnMuQ09OVEFJTlMubGFiZWw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdWlWYWx1ZVxyXG4gICAgdGhpcy51aVZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgIGlmICgodGhpcy5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykpIHtcclxuICAgICAgdGhpcy51aVZhbHVlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnZhbHVlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKTtcclxuICAgIH1cclxuICAgIGxldCBmbzogU2VhcmNoT3B0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKHNlYXJjaE9wdGlvbnMgJiYgc2VhcmNoT3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvID0gc2VhcmNoT3B0aW9ucy5maW5kKChmKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGYuZmllbGQgPT09IHRoaXMubWVtYmVyO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChmbyAmJiBmby5vcHRpb25zKSB7IC8vIHNwZWNpYWwgdHJlYXRtZW50IGZvciBhcnJheXMsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbnMgcHJvcGVydHkgdGhlbiBpdCBpcyBhbiBhcnJheVxyXG4gICAgICB0aGlzLmRhdGFUeXBlID0gJ2FycmF5JztcclxuICAgICAgdGhpcy51aVZhbHVlID0gZm8hLm9wdGlvbnMhLmZpbmQoKG9wdGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHRoaXMudmFsdWU7XHJcbiAgICAgIH0pPy5sYWJlbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2UodGV4dDogc3RyaW5nKTogRmlsdGVyQ2xhdXNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHBhdHRlcm4gPSAvXlxccyooW0EtWmEtel9dW0EtWmEtejAtOV9cXC5dKyk6OihlcXxuZXF8Z3R8bHR8Z3RlfGx0ZXxjb250YWluc3xpbik6OihcXCgoc3RyaW5nfGludGVnZXJ8bnVtYmVyfGJvb2xlYW58ZGF0ZXRpbWUpXFwpKT8oLispXFxzKiQvZ2k7XHJcbiAgICBpZiAodGV4dCAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBwYXR0ZXJuLmV4ZWModGV4dCk7XHJcbiAgICAgIGlmIChtYXRjaGVzICE9IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXRoID0gbWF0Y2hlc1sxXTtcclxuICAgICAgICBjb25zdCBvcCA9IDxGaWx0ZXJDbGF1c2UuT3A+bWF0Y2hlc1syXTtcclxuICAgICAgICBjb25zdCBkdCA9IDxGaWx0ZXJDbGF1c2UuRHQ+bWF0Y2hlc1s0XTtcclxuICAgICAgICBjb25zdCB2ID0gbWF0Y2hlc1s1XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJDbGF1c2UocGF0aCwgdiwgb3AsIGR0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgIT09ICdzdHJpbmcnICYmIHRoaXMuZGF0YVR5cGUgIT09ICdhcnJheScpIHtcclxuICAgICAgcmV0dXJuIGAke3RoaXMubWVtYmVyfTo6JHt0aGlzLm9wZXJhdG9yfTo6KCR7dGhpcy5kYXRhVHlwZX0pJHt0aGlzLnZhbHVlfWA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYCR7dGhpcy5tZW1iZXJ9Ojoke3RoaXMub3BlcmF0b3J9Ojoke3RoaXMudmFsdWV9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -1,48 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- export class AvatarInitialsComponent {
5
- constructor() {
6
- this.large = false;
7
- this.colors = [
8
- '#EB7181',
9
- '#468547',
10
- '#FFD558',
11
- '#3670B2', // blue
12
- ];
13
- }
14
- ngOnInit() {
15
- this.createInititals();
16
- const randomIndex = Math.floor(Math.random() * Math.floor(this.colors.length));
17
- // assign this to a class if you want to randomly change background colors of the circle.
18
- this.circleColor = this.colors[randomIndex];
19
- }
20
- createInititals() {
21
- if (this.name) {
22
- let initials = '';
23
- for (let i = 0; i < this.name.length; i++) {
24
- if (this.name.charAt(i) === ' ') {
25
- continue;
26
- }
27
- if (this.name.charAt(i) === this.name.charAt(i).toUpperCase()) {
28
- initials += this.name.charAt(i);
29
- if (initials.length === 2) {
30
- break;
31
- }
32
- }
33
- }
34
- this.initials = initials;
35
- }
36
- }
37
- }
38
- AvatarInitialsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AvatarInitialsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
- AvatarInitialsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: AvatarInitialsComponent, selector: "lib-avatar-initials", inputs: { name: "name", large: "large" }, ngImport: i0, template: "<div [ngClass]=\"large ? 'avatar-container-large': 'avatar-container'\">\r\n <span [ngClass]=\"large ? 'avatar-text-large': 'avatar-text'\">{{ initials }}</span>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AvatarInitialsComponent, decorators: [{
41
- type: Component,
42
- args: [{ selector: 'lib-avatar-initials', template: "<div [ngClass]=\"large ? 'avatar-container-large': 'avatar-container'\">\r\n <span [ngClass]=\"large ? 'avatar-text-large': 'avatar-text'\">{{ initials }}</span>\r\n</div>\r\n" }]
43
- }], ctorParameters: function () { return []; }, propDecorators: { name: [{
44
- type: Input
45
- }], large: [{
46
- type: Input
47
- }] } });
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLWluaXRpYWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hdmF0YXItaW5pdGlhbHMvYXZhdGFyLWluaXRpYWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hdmF0YXItaW5pdGlhbHMvYXZhdGFyLWluaXRpYWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFNekQsTUFBTSxPQUFPLHVCQUF1QjtJQWNsQztRQVZPLFVBQUssR0FBRyxLQUFLLENBQUM7UUFHYixXQUFNLEdBQUc7WUFDZixTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTLEVBQUUsT0FBTztTQUNuQixDQUFDO0lBRWMsQ0FBQztJQUVqQixRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9FLHlGQUF5RjtRQUN6RixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7b0JBQy9CLFNBQVM7aUJBQ1Y7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDN0QsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUN6QixNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUMxQjtJQUNILENBQUM7O29IQXZDVSx1QkFBdUI7d0dBQXZCLHVCQUF1QixxR0NOcEMsb0xBR0E7MkZER2EsdUJBQXVCO2tCQUpuQyxTQUFTOytCQUNFLHFCQUFxQjswRUFLeEIsSUFBSTtzQkFEVixLQUFLO2dCQUdDLEtBQUs7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXZhdGFyLWluaXRpYWxzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXZhdGFyLWluaXRpYWxzLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXZhdGFySW5pdGlhbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbGFyZ2UgPSBmYWxzZTtcclxuICBwdWJsaWMgaW5pdGlhbHM/OiBzdHJpbmc7XHJcbiAgcHVibGljIGNpcmNsZUNvbG9yITogc3RyaW5nO1xyXG4gIHByaXZhdGUgY29sb3JzID0gW1xyXG4gICAgJyNFQjcxODEnLCAvLyByZWRcclxuICAgICcjNDY4NTQ3JywgLy8gZ3JlZW5cclxuICAgICcjRkZENTU4JywgLy8geWVsbG93XHJcbiAgICAnIzM2NzBCMicsIC8vIGJsdWVcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlSW5pdGl0YWxzKCk7XHJcbiAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IodGhpcy5jb2xvcnMubGVuZ3RoKSk7XHJcbiAgICAvLyBhc3NpZ24gdGhpcyB0byBhIGNsYXNzIGlmIHlvdSB3YW50IHRvIHJhbmRvbWx5IGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9ycyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgdGhpcy5jaXJjbGVDb2xvciA9IHRoaXMuY29sb3JzW3JhbmRvbUluZGV4XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlSW5pdGl0YWxzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubmFtZSkge1xyXG4gICAgICBsZXQgaW5pdGlhbHMgPSAnJztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5hbWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdChpKSA9PT0gJyAnKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubmFtZS5jaGFyQXQoaSkgPT09IHRoaXMubmFtZS5jaGFyQXQoaSkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgaW5pdGlhbHMgKz0gdGhpcy5uYW1lLmNoYXJBdChpKTtcclxuICAgICAgICAgIGlmIChpbml0aWFscy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW5pdGlhbHMgPSBpbml0aWFscztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBbbmdDbGFzc109XCJsYXJnZSA/ICdhdmF0YXItY29udGFpbmVyLWxhcmdlJzogJ2F2YXRhci1jb250YWluZXInXCI+XHJcbiAgICA8c3BhbiBbbmdDbGFzc109XCJsYXJnZSA/ICdhdmF0YXItdGV4dC1sYXJnZSc6ICdhdmF0YXItdGV4dCdcIj57eyBpbml0aWFscyB9fTwvc3Bhbj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,117 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "../../directives/click-outside.directive";
8
- export class ComboboxComponent {
9
- constructor() {
10
- this._debouncer = new Subject();
11
- this._items = [];
12
- this._defaultItemsFilter = (item) => {
13
- const selectedItem = this.selectedItems.find(x => x == item);
14
- return selectedItem == null || selectedItem == undefined;
15
- };
16
- this.id = 'combobox';
17
- this.itemTemplate = undefined;
18
- this.selectedItemsFilter = () => true;
19
- this.selectedItemTemplate = undefined;
20
- this.noResultsTemplate = undefined;
21
- this.busy = false;
22
- this.multiple = true;
23
- this.debounceMs = 1000;
24
- this.onSearch = new EventEmitter();
25
- this.onItemSelected = new EventEmitter();
26
- this.showResults = false;
27
- this.selectedItems = [];
28
- }
29
- set items(items) {
30
- if (!this.itemTemplate) {
31
- this._items = items.filter(this._defaultItemsFilter);
32
- }
33
- else {
34
- this._items = items.filter(this.selectedItemsFilter);
35
- }
36
- }
37
- get items() {
38
- if (!this.itemTemplate) {
39
- return this._items.filter(this._defaultItemsFilter);
40
- }
41
- else {
42
- return this._items.filter(this.selectedItemsFilter);
43
- }
44
- }
45
- ngOnInit() {
46
- if (this.itemTemplate && !this.multiple) {
47
- this.multiple = true;
48
- console.warn('You cannot have a custom item template with single selection.');
49
- }
50
- this.emitSearchEvent();
51
- this._debouncer
52
- .pipe(debounceTime(this.debounceMs), distinctUntilChanged())
53
- .subscribe((value) => {
54
- this.searchTerm = value;
55
- this.emitSearchEvent(value);
56
- });
57
- }
58
- onInputClick() {
59
- this.showResults = true;
60
- }
61
- onInputClickOutside() {
62
- this.showResults = false;
63
- }
64
- onInputKeyUp(event) {
65
- this._debouncer.next(event.currentTarget.value);
66
- }
67
- onListItemSelected(item) {
68
- this.onItemSelected.emit(item);
69
- if (this.multiple) {
70
- this.selectedItems.push(item);
71
- }
72
- else {
73
- this.value = item;
74
- }
75
- }
76
- removeItem(item) {
77
- const index = this.selectedItems.indexOf(item);
78
- if (index > -1) {
79
- this.selectedItems.splice(index, 1);
80
- }
81
- }
82
- emitSearchEvent(searchTerm = undefined) {
83
- this.onSearch.emit(searchTerm);
84
- }
85
- }
86
- ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: ComboboxComponent, selector: "lib-combobox", inputs: { id: "id", placeholder: "placeholder", items: "items", itemTemplate: "itemTemplate", selectedItemsFilter: "selectedItemsFilter", selectedItemTemplate: "selectedItemTemplate", noResultsTemplate: "noResultsTemplate", busy: "busy", multiple: "multiple", debounceMs: "debounceMs" }, outputs: { onSearch: "onSearch", onItemSelected: "onItemSelected" }, ngImport: i0, template: "<div class=\"combobox-wrapper\">\r\n <form autocomplete=\"off\"\r\n [id]=\"id + '-form'\">\r\n <input [id]=\"id\"\r\n type=\"text\"\r\n (click)=\"onInputClick()\"\r\n (clickOutside)=\"onInputClickOutside()\"\r\n (keyup)=\"onInputKeyUp($event)\"\r\n class=\"combobox-input\"\r\n role=\"combobox\"\r\n aria-controls=\"options\"\r\n aria-expanded=\"false\"\r\n autocomplete=\"off\"\r\n list=\"autocomplete\"\r\n [value]=\"value || ''\"\r\n [placeholder]=\"placeholder || ''\">\r\n </form>\r\n <div class=\"combobox-icons\">\r\n <svg *ngIf=\"!busy\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"h-6 w-6 text-gray-400\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\r\n </svg>\r\n <svg *ngIf=\"busy\"\r\n class=\"animate-spin h-6 w-6 text-gray-400\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <circle class=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"4\">\r\n </circle>\r\n <path class=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\r\n </svg>\r\n </div>\r\n <ul [id]=\"id + '-results'\"\r\n *ngIf=\"showResults && items.length > 0\"\r\n class=\"combobox-results\"\r\n role=\"listbox\">\r\n <li *ngFor=\"let item of items; let i = index;\"\r\n [id]=\"'option-'+ i\"\r\n (click)=\"onListItemSelected(item)\"\r\n role=\"option\"\r\n tabindex=\"-1\">\r\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <div class=\"combobox-results\"\r\n *ngIf=\"noResultsTemplate && items.length === 0 && !busy\">\r\n <ng-container [ngTemplateOutlet]=\"noResultsTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: searchTerm }\">\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ul *ngIf=\"selectedItems.length > 0\"\r\n role=\"list\"\r\n class=\"grid grid-cols-1\">\r\n <li *ngFor=\"let item of selectedItems; let i = index;\"\r\n class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n </li>\r\n</ul>\r\n<ng-template #defaultItemTemplate\r\n let-item>\r\n <span class=\"combobox-default-item-template\">{{ item }}</span>\r\n</ng-template>\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n <div class=\"grid grid-cols-1\">\r\n <div class=\"combobox-selected-item-wrapper\">\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"focus:outline-none\">\r\n <span class=\"absolute\"\r\n aria-hidden=\"true\">\r\n </span>\r\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\r\n </div>\r\n </div>\r\n <div class=\"ml-4 flex-shrink-0 flex\">\r\n <button type=\"button\"\r\n (click)=\"removeItem(item)\"\r\n class=\"combobox-selected-item-remove-btn\">\r\n <span class=\"sr-only\">Close</span>\r\n <svg class=\"h-5 w-5\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\"\r\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\r\n clip-rule=\"evenodd\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }] });
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, decorators: [{
89
- type: Component,
90
- args: [{ selector: 'lib-combobox', template: "<div class=\"combobox-wrapper\">\r\n <form autocomplete=\"off\"\r\n [id]=\"id + '-form'\">\r\n <input [id]=\"id\"\r\n type=\"text\"\r\n (click)=\"onInputClick()\"\r\n (clickOutside)=\"onInputClickOutside()\"\r\n (keyup)=\"onInputKeyUp($event)\"\r\n class=\"combobox-input\"\r\n role=\"combobox\"\r\n aria-controls=\"options\"\r\n aria-expanded=\"false\"\r\n autocomplete=\"off\"\r\n list=\"autocomplete\"\r\n [value]=\"value || ''\"\r\n [placeholder]=\"placeholder || ''\">\r\n </form>\r\n <div class=\"combobox-icons\">\r\n <svg *ngIf=\"!busy\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"h-6 w-6 text-gray-400\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\r\n </svg>\r\n <svg *ngIf=\"busy\"\r\n class=\"animate-spin h-6 w-6 text-gray-400\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <circle class=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"4\">\r\n </circle>\r\n <path class=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\r\n </svg>\r\n </div>\r\n <ul [id]=\"id + '-results'\"\r\n *ngIf=\"showResults && items.length > 0\"\r\n class=\"combobox-results\"\r\n role=\"listbox\">\r\n <li *ngFor=\"let item of items; let i = index;\"\r\n [id]=\"'option-'+ i\"\r\n (click)=\"onListItemSelected(item)\"\r\n role=\"option\"\r\n tabindex=\"-1\">\r\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <div class=\"combobox-results\"\r\n *ngIf=\"noResultsTemplate && items.length === 0 && !busy\">\r\n <ng-container [ngTemplateOutlet]=\"noResultsTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: searchTerm }\">\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ul *ngIf=\"selectedItems.length > 0\"\r\n role=\"list\"\r\n class=\"grid grid-cols-1\">\r\n <li *ngFor=\"let item of selectedItems; let i = index;\"\r\n class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n </li>\r\n</ul>\r\n<ng-template #defaultItemTemplate\r\n let-item>\r\n <span class=\"combobox-default-item-template\">{{ item }}</span>\r\n</ng-template>\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n <div class=\"grid grid-cols-1\">\r\n <div class=\"combobox-selected-item-wrapper\">\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"focus:outline-none\">\r\n <span class=\"absolute\"\r\n aria-hidden=\"true\">\r\n </span>\r\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\r\n </div>\r\n </div>\r\n <div class=\"ml-4 flex-shrink-0 flex\">\r\n <button type=\"button\"\r\n (click)=\"removeItem(item)\"\r\n class=\"combobox-selected-item-remove-btn\">\r\n <span class=\"sr-only\">Close</span>\r\n <svg class=\"h-5 w-5\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\"\r\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\r\n clip-rule=\"evenodd\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>" }]
91
- }], ctorParameters: function () { return []; }, propDecorators: { id: [{
92
- type: Input
93
- }], placeholder: [{
94
- type: Input
95
- }], items: [{
96
- type: Input,
97
- args: ['items']
98
- }], itemTemplate: [{
99
- type: Input
100
- }], selectedItemsFilter: [{
101
- type: Input
102
- }], selectedItemTemplate: [{
103
- type: Input
104
- }], noResultsTemplate: [{
105
- type: Input
106
- }], busy: [{
107
- type: Input
108
- }], multiple: [{
109
- type: Input
110
- }], debounceMs: [{
111
- type: Input
112
- }], onSearch: [{
113
- type: Output
114
- }], onItemSelected: [{
115
- type: Output
116
- }] } });
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQU1wRSxNQUFNLE9BQU8saUJBQWlCO0lBUzFCO1FBUlEsZUFBVSxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BELFdBQU0sR0FBVSxFQUFFLENBQUM7UUFFbkIsd0JBQW1CLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM3RCxPQUFPLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFJYyxPQUFFLEdBQVcsVUFBVSxDQUFDO1FBbUJ4QixpQkFBWSxHQUF5QyxTQUFTLENBQUM7UUFDL0Qsd0JBQW1CLEdBQWtDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNoRSx5QkFBb0IsR0FBeUMsU0FBUyxDQUFDO1FBQ3ZFLHNCQUFpQixHQUF5QyxTQUFTLENBQUM7UUFDcEUsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUN0QixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFxQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hFLG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakUsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBVSxFQUFFLENBQUM7SUEvQmpCLENBQUM7SUFLakIsSUFBMkIsS0FBSyxDQUFDLEtBQVk7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDeEQ7SUFDTCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFnQk0sUUFBUTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVO2FBQ1YsSUFBSSxDQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQzdCLG9CQUFvQixFQUFFLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTSxZQUFZO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVNLG1CQUFtQjtRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBUztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDckI7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQVM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdkM7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLGFBQWlDLFNBQVM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7OEdBM0ZRLGlCQUFpQjtrR0FBakIsaUJBQWlCLHlaQ1Q5QiwrMEpBK0djOzJGRHRHRCxpQkFBaUI7a0JBSjdCLFNBQVM7K0JBQ0ksY0FBYzswRUFjUixFQUFFO3NCQUFqQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBRXFCLEtBQUs7c0JBQS9CLEtBQUs7dUJBQUMsT0FBTztnQkFnQkUsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBQ1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVyxRQUFRO3NCQUF4QixNQUFNO2dCQUNVLGNBQWM7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1jb21ib2JveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBwcml2YXRlIF9kZWJvdW5jZXI6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgX2RlZmF1bHRJdGVtc0ZpbHRlciA9IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmluZCh4ID0+IHggPT0gaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PSBudWxsIHx8IHNlbGVjdGVkSXRlbSA9PSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmcgPSAnY29tYm9ib3gnO1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgQElucHV0KCdpdGVtcycpIHB1YmxpYyBzZXQgaXRlbXMoaXRlbXM6IGFueVtdKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1UZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zLmZpbHRlcih0aGlzLl9kZWZhdWx0SXRlbXNGaWx0ZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMuZmlsdGVyKHRoaXMuc2VsZWN0ZWRJdGVtc0ZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogYW55W10ge1xyXG4gICAgICAgIGlmICghdGhpcy5pdGVtVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbHRlcih0aGlzLl9kZWZhdWx0SXRlbXNGaWx0ZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5maWx0ZXIodGhpcy5zZWxlY3RlZEl0ZW1zRmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkSXRlbXNGaWx0ZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW4gfCBudWxsID0gKCkgPT4gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZEl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vUmVzdWx0c1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYnVzeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWJvdW5jZU1zOiBudW1iZXIgPSAxMDAwO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZyB8IHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uSXRlbVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHB1YmxpYyBzaG93UmVzdWx0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XHJcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIHByb3RlY3RlZCBzZWFyY2hUZXJtOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1UZW1wbGF0ZSAmJiAhdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdZb3UgY2Fubm90IGhhdmUgYSBjdXN0b20gaXRlbSB0ZW1wbGF0ZSB3aXRoIHNpbmdsZSBzZWxlY3Rpb24uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fZGVib3VuY2VyXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VNcyksXHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hFdmVudCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbklucHV0Q2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zaG93UmVzdWx0cyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSW5wdXRDbGlja091dHNpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zaG93UmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbklucHV0S2V5VXAoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RlYm91bmNlci5uZXh0KGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxpc3RJdGVtU2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVtaXRTZWFyY2hFdmVudChzZWFyY2hUZXJtOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoc2VhcmNoVGVybSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbWJvYm94LXdyYXBwZXJcIj5cclxuICAgIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICBbaWRdPVwiaWQgKyAnLWZvcm0nXCI+XHJcbiAgICAgICAgPGlucHV0IFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrT3V0c2lkZSk9XCJvbklucHV0Q2xpY2tPdXRzaWRlKClcIlxyXG4gICAgICAgICAgICAgICAoa2V5dXApPVwib25JbnB1dEtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImNvbWJvYm94LWlucHV0XCJcclxuICAgICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcclxuICAgICAgICAgICAgICAgYXJpYS1jb250cm9scz1cIm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICBsaXN0PVwiYXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICcnXCI+XHJcbiAgICA8L2Zvcm0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtaWNvbnNcIj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWJ1c3lcIlxyXG4gICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImgtNiB3LTYgdGV4dC1ncmF5LTQwMFwiXHJcbiAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMjEgMjFsLTYtNm0yLTVhNyA3IDAgMTEtMTQgMCA3IDcgMCAwMTE0IDB6XCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiYnVzeVwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpbiBoLTYgdy02IHRleHQtZ3JheS00MDBcIlxyXG4gICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCJcclxuICAgICAgICAgICAgICAgICAgICBjeD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICBjeT1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICByPVwiMTBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNFwiPlxyXG4gICAgICAgICAgICA8L2NpcmNsZT5cclxuICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJvcGFjaXR5LTc1XCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx1bCBbaWRdPVwiaWQgKyAnLXJlc3VsdHMnXCJcclxuICAgICAgICAqbmdJZj1cInNob3dSZXN1bHRzICYmIGl0ZW1zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgIGNsYXNzPVwiY29tYm9ib3gtcmVzdWx0c1wiXHJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIj5cclxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7XCJcclxuICAgICAgICAgICAgW2lkXT1cIidvcHRpb24tJysgaVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkxpc3RJdGVtU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1yZXN1bHRzXCJcclxuICAgICAgICAgKm5nSWY9XCJub1Jlc3VsdHNUZW1wbGF0ZSAmJiBpdGVtcy5sZW5ndGggPT09IDAgJiYgIWJ1c3lcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vUmVzdWx0c1RlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogc2VhcmNoVGVybSB9XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjx1bCAqbmdJZj1cInNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiXHJcbiAgICByb2xlPVwibGlzdFwiXHJcbiAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTFcIj5cclxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyBsZXQgaSA9IGluZGV4O1wiXHJcbiAgICAgICAgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RlZEl0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtIH1cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbGk+XHJcbjwvdWw+XHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEl0ZW1UZW1wbGF0ZVxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiBjbGFzcz1cImNvbWJvYm94LWRlZmF1bHQtaXRlbS10ZW1wbGF0ZVwiPnt7IGl0ZW0gfX08L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXNlbGVjdGVkLWl0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG1pbi13LTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb2N1czpvdXRsaW5lLW5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFic29sdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj57eyBpdGVtIH19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtNCBmbGV4LXNocmluay0wIGZsZXhcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJdGVtKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb21ib2JveC1zZWxlY3RlZC1pdGVtLXJlbW92ZS1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC01IHctNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC4yOTMgNC4yOTNhMSAxIDAgMDExLjQxNCAwTDEwIDguNTg2bDQuMjkzLTQuMjkzYTEgMSAwIDExMS40MTQgMS40MTRMMTEuNDE0IDEwbDQuMjkzIDQuMjkzYTEgMSAwIDAxLTEuNDE0IDEuNDE0TDEwIDExLjQxNGwtNC4yOTMgNC4yOTNhMSAxIDAgMDEtMS40MTQtMS40MTRMOC41ODYgMTAgNC4yOTMgNS43MDdhMSAxIDAgMDEwLTEuNDE0elwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19