@one-paragon/angular-utilities 0.1.25 → 0.1.26

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 (229) hide show
  1. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -12
  2. package/action-state/action-state-ui/action-state-ui.module.d.ts +9 -9
  3. package/action-state/index.d.ts +4 -4
  4. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -8
  5. package/action-state/ngrx.d.ts +31 -31
  6. package/esm2020/action-state/action-state-spinner/action-state-spinner.component.mjs +23 -23
  7. package/esm2020/action-state/action-state-ui/action-state-ui.module.mjs +28 -28
  8. package/esm2020/action-state/index.mjs +8 -8
  9. package/esm2020/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -23
  10. package/esm2020/action-state/ngrx.mjs +42 -42
  11. package/esm2020/http-request-state/HttpRequestStateFactory.mjs +26 -26
  12. package/esm2020/http-request-state/HttpRequestStateStore.mjs +96 -96
  13. package/esm2020/http-request-state/directives/HttpStateDirectiveBase.mjs +33 -33
  14. package/esm2020/http-request-state/directives/http-error-state-directive.mjs +28 -28
  15. package/esm2020/http-request-state/directives/http-inProgress-state-directive.mjs +28 -28
  16. package/esm2020/http-request-state/directives/http-notStarted-state-directive.mjs +28 -28
  17. package/esm2020/http-request-state/directives/http-success-state-directive.mjs +34 -29
  18. package/esm2020/http-request-state/directives/index.mjs +5 -5
  19. package/esm2020/http-request-state/directives/request-state-directive.mjs +60 -60
  20. package/esm2020/http-request-state/helpers.mjs +21 -21
  21. package/esm2020/http-request-state/http-request-state.mjs +38 -38
  22. package/esm2020/http-request-state/http-state-module.mjs +40 -40
  23. package/esm2020/http-request-state/index.mjs +6 -6
  24. package/esm2020/http-request-state/rxjs/getRequestorBody.mjs +3 -3
  25. package/esm2020/http-request-state/rxjs/getRequestorState.mjs +2 -2
  26. package/esm2020/http-request-state/rxjs/index.mjs +4 -4
  27. package/esm2020/http-request-state/rxjs/tapError.mjs +11 -11
  28. package/esm2020/http-request-state/rxjs/tapSuccess.mjs +11 -11
  29. package/esm2020/http-request-state/types.mjs +16 -16
  30. package/esm2020/ngrx/actionable-selector.mjs +76 -76
  31. package/esm2020/ngrx/index.mjs +1 -1
  32. package/esm2020/one-paragon-angular-utilities.mjs +4 -4
  33. package/esm2020/public-api.mjs +19 -19
  34. package/esm2020/rxjs/defaultShareReplay.mjs +6 -6
  35. package/esm2020/rxjs/index.mjs +5 -5
  36. package/esm2020/rxjs/mapError.mjs +7 -7
  37. package/esm2020/rxjs/rxjs-operators.mjs +91 -91
  38. package/esm2020/rxjs/subjectifier.mjs +15 -15
  39. package/esm2020/table-builder/classes/DefaultSettings.mjs +5 -5
  40. package/esm2020/table-builder/classes/GenericTableDataSource.mjs +12 -12
  41. package/esm2020/table-builder/classes/MatTableObservableDataSource.mjs +21 -21
  42. package/esm2020/table-builder/classes/TableBuilderConfig.mjs +2 -2
  43. package/esm2020/table-builder/classes/TableState.mjs +31 -31
  44. package/esm2020/table-builder/classes/data-filter.mjs +26 -26
  45. package/esm2020/table-builder/classes/display-col.mjs +1 -1
  46. package/esm2020/table-builder/classes/filter-info.mjs +71 -71
  47. package/esm2020/table-builder/classes/table-builder-general-settings.mjs +67 -67
  48. package/esm2020/table-builder/classes/table-builder.mjs +61 -61
  49. package/esm2020/table-builder/classes/table-store.mjs +292 -292
  50. package/esm2020/table-builder/components/array-column.component.mjs +32 -32
  51. package/esm2020/table-builder/components/column-builder/column-builder.component.mjs +111 -111
  52. package/esm2020/table-builder/components/date-filter/date-filter.component.mjs +25 -25
  53. package/esm2020/table-builder/components/filter/filter.component.mjs +53 -53
  54. package/esm2020/table-builder/components/filter/in-list/in-list-filter.component.mjs +79 -79
  55. package/esm2020/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +45 -45
  56. package/esm2020/table-builder/components/generic-table/generic-table.component.mjs +202 -198
  57. package/esm2020/table-builder/components/generic-table/paginator.component.mjs +60 -60
  58. package/esm2020/table-builder/components/group-by-list/group-by-list.component.mjs +22 -22
  59. package/esm2020/table-builder/components/header-menu/header-menu.component.mjs +89 -89
  60. package/esm2020/table-builder/components/in-filter/in-filter.component.mjs +63 -63
  61. package/esm2020/table-builder/components/index.mjs +10 -10
  62. package/esm2020/table-builder/components/initialization-component/initialization-component.mjs +33 -33
  63. package/esm2020/table-builder/components/link-column.component.mjs +30 -30
  64. package/esm2020/table-builder/components/number-filter/number-filter.component.mjs +26 -26
  65. package/esm2020/table-builder/components/sort-menu/sort-menu.component-store.mjs +41 -41
  66. package/esm2020/table-builder/components/sort-menu/sort-menu.component.mjs +75 -75
  67. package/esm2020/table-builder/components/table-container/table-container.mjs +322 -312
  68. package/esm2020/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +42 -42
  69. package/esm2020/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +30 -30
  70. package/esm2020/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +24 -24
  71. package/esm2020/table-builder/directives/custom-cell-directive.mjs +58 -58
  72. package/esm2020/table-builder/directives/index.mjs +6 -6
  73. package/esm2020/table-builder/directives/multi-sort.directive.mjs +42 -42
  74. package/esm2020/table-builder/directives/resize-column.directive.mjs +85 -85
  75. package/esm2020/table-builder/directives/table-wrapper.directive.mjs +26 -26
  76. package/esm2020/table-builder/directives/tb-filter.directive.mjs +403 -403
  77. package/esm2020/table-builder/enums/filterTypes.mjs +59 -59
  78. package/esm2020/table-builder/functions/boolean-filter-function.mjs +9 -9
  79. package/esm2020/table-builder/functions/date-filter-function.mjs +32 -32
  80. package/esm2020/table-builder/functions/download-data.mjs +11 -11
  81. package/esm2020/table-builder/functions/null-filter-function.mjs +7 -7
  82. package/esm2020/table-builder/functions/number-filter-function.mjs +31 -31
  83. package/esm2020/table-builder/functions/sort-data-function.mjs +4 -4
  84. package/esm2020/table-builder/functions/string-filter-function.mjs +40 -40
  85. package/esm2020/table-builder/interfaces/ColumnInfo.mjs +1 -1
  86. package/esm2020/table-builder/interfaces/dictionary.mjs +1 -1
  87. package/esm2020/table-builder/interfaces/report-def.mjs +34 -34
  88. package/esm2020/table-builder/material.module.mjs +207 -207
  89. package/esm2020/table-builder/ngrx/actions.mjs +4 -4
  90. package/esm2020/table-builder/ngrx/effects.mjs +47 -47
  91. package/esm2020/table-builder/ngrx/reducer.mjs +51 -51
  92. package/esm2020/table-builder/ngrx/selectors.mjs +23 -23
  93. package/esm2020/table-builder/pipes/column-total.pipe.mjs +19 -19
  94. package/esm2020/table-builder/pipes/format-filter-type.pipe.mjs +17 -17
  95. package/esm2020/table-builder/pipes/format-filter-value.pipe.mjs +45 -45
  96. package/esm2020/table-builder/pipes/key-display.mjs +19 -19
  97. package/esm2020/table-builder/services/export-to-csv.service.mjs +84 -84
  98. package/esm2020/table-builder/services/link-creator.service.mjs +42 -42
  99. package/esm2020/table-builder/services/table-template-service.mjs +43 -43
  100. package/esm2020/table-builder/services/transform-creator.mjs +70 -70
  101. package/esm2020/table-builder/table-builder.module.mjs +204 -204
  102. package/esm2020/utilities/directives/auto-focus.directive.mjs +25 -25
  103. package/esm2020/utilities/directives/clickEmitterDirective.mjs +20 -20
  104. package/esm2020/utilities/directives/clickSubject.mjs +26 -26
  105. package/esm2020/utilities/directives/conditional-classes.directive.mjs +35 -35
  106. package/esm2020/utilities/directives/dialog-service.mjs +25 -25
  107. package/esm2020/utilities/directives/dialog.mjs +137 -137
  108. package/esm2020/utilities/directives/mat-toggle-group-directive.mjs +59 -59
  109. package/esm2020/utilities/directives/prevent-enter.directive.mjs +18 -18
  110. package/esm2020/utilities/directives/stop-propagation.directive.mjs +24 -24
  111. package/esm2020/utilities/directives/styler.mjs +25 -25
  112. package/esm2020/utilities/directives/trim-whitespace.directive.mjs +29 -29
  113. package/esm2020/utilities/index.mjs +16 -16
  114. package/esm2020/utilities/module.mjs +91 -91
  115. package/esm2020/utilities/pipes/function.pipe.mjs +20 -20
  116. package/esm2020/utilities/pipes/phone.pipe.mjs +19 -19
  117. package/esm2020/utilities/pipes/space-case.pipes.mjs +28 -28
  118. package/fesm2015/one-paragon-angular-utilities.mjs +4346 -4327
  119. package/fesm2015/one-paragon-angular-utilities.mjs.map +1 -1
  120. package/fesm2020/one-paragon-angular-utilities.mjs +4312 -4295
  121. package/fesm2020/one-paragon-angular-utilities.mjs.map +1 -1
  122. package/http-request-state/HttpRequestStateFactory.d.ts +14 -14
  123. package/http-request-state/HttpRequestStateStore.d.ts +48 -48
  124. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +16 -16
  125. package/http-request-state/directives/http-error-state-directive.d.ts +12 -12
  126. package/http-request-state/directives/http-inProgress-state-directive.d.ts +12 -12
  127. package/http-request-state/directives/http-notStarted-state-directive.d.ts +12 -12
  128. package/http-request-state/directives/http-success-state-directive.d.ts +21 -14
  129. package/http-request-state/directives/index.d.ts +5 -5
  130. package/http-request-state/directives/request-state-directive.d.ts +35 -30
  131. package/http-request-state/helpers.d.ts +9 -9
  132. package/http-request-state/http-request-state.d.ts +12 -12
  133. package/http-request-state/http-state-module.d.ts +11 -11
  134. package/http-request-state/index.d.ts +6 -6
  135. package/http-request-state/rxjs/getRequestorBody.d.ts +3 -3
  136. package/http-request-state/rxjs/getRequestorState.d.ts +3 -3
  137. package/http-request-state/rxjs/index.d.ts +4 -4
  138. package/http-request-state/rxjs/tapError.d.ts +3 -3
  139. package/http-request-state/rxjs/tapSuccess.d.ts +3 -3
  140. package/http-request-state/types.d.ts +36 -36
  141. package/index.d.ts +5 -5
  142. package/ngrx/actionable-selector.d.ts +15 -15
  143. package/ngrx/index.d.ts +1 -1
  144. package/package.json +1 -1
  145. package/public-api.d.ts +15 -15
  146. package/rxjs/defaultShareReplay.d.ts +2 -2
  147. package/rxjs/index.d.ts +4 -4
  148. package/rxjs/mapError.d.ts +2 -2
  149. package/rxjs/rxjs-operators.d.ts +12 -12
  150. package/rxjs/subjectifier.d.ts +9 -9
  151. package/table-builder/classes/DefaultSettings.d.ts +8 -8
  152. package/table-builder/classes/GenericTableDataSource.d.ts +8 -8
  153. package/table-builder/classes/MatTableObservableDataSource.d.ts +9 -9
  154. package/table-builder/classes/TableBuilderConfig.d.ts +19 -19
  155. package/table-builder/classes/TableState.d.ts +46 -46
  156. package/table-builder/classes/data-filter.d.ts +9 -9
  157. package/table-builder/classes/display-col.d.ts +5 -5
  158. package/table-builder/classes/filter-info.d.ts +40 -40
  159. package/table-builder/classes/table-builder-general-settings.d.ts +43 -43
  160. package/table-builder/classes/table-builder.d.ts +14 -14
  161. package/table-builder/classes/table-store.d.ts +114 -114
  162. package/table-builder/components/array-column.component.d.ts +14 -14
  163. package/table-builder/components/column-builder/column-builder.component.d.ts +50 -50
  164. package/table-builder/components/date-filter/date-filter.component.d.ts +10 -10
  165. package/table-builder/components/filter/filter.component.d.ts +294 -294
  166. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +27 -27
  167. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +16 -16
  168. package/table-builder/components/generic-table/generic-table.component.d.ts +73 -71
  169. package/table-builder/components/generic-table/paginator.component.d.ts +28 -28
  170. package/table-builder/components/group-by-list/group-by-list.component.d.ts +10 -10
  171. package/table-builder/components/header-menu/header-menu.component.d.ts +25 -25
  172. package/table-builder/components/in-filter/in-filter.component.d.ts +21 -21
  173. package/table-builder/components/index.d.ts +9 -9
  174. package/table-builder/components/initialization-component/initialization-component.d.ts +12 -12
  175. package/table-builder/components/link-column.component.d.ts +17 -17
  176. package/table-builder/components/number-filter/number-filter.component.d.ts +12 -12
  177. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -24
  178. package/table-builder/components/sort-menu/sort-menu.component.d.ts +25 -25
  179. package/table-builder/components/table-container/table-container.d.ts +68 -65
  180. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +17 -17
  181. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +14 -14
  182. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -14
  183. package/table-builder/directives/custom-cell-directive.d.ts +19 -19
  184. package/table-builder/directives/index.d.ts +5 -5
  185. package/table-builder/directives/multi-sort.directive.d.ts +11 -11
  186. package/table-builder/directives/resize-column.directive.d.ts +43 -43
  187. package/table-builder/directives/table-wrapper.directive.d.ts +11 -11
  188. package/table-builder/directives/tb-filter.directive.d.ts +120 -120
  189. package/table-builder/enums/filterTypes.d.ts +31 -31
  190. package/table-builder/functions/boolean-filter-function.d.ts +3 -3
  191. package/table-builder/functions/date-filter-function.d.ts +3 -3
  192. package/table-builder/functions/download-data.d.ts +1 -1
  193. package/table-builder/functions/null-filter-function.d.ts +2 -2
  194. package/table-builder/functions/number-filter-function.d.ts +4 -4
  195. package/table-builder/functions/sort-data-function.d.ts +3 -3
  196. package/table-builder/functions/string-filter-function.d.ts +7 -7
  197. package/table-builder/interfaces/ColumnInfo.d.ts +6 -6
  198. package/table-builder/interfaces/dictionary.d.ts +3 -3
  199. package/table-builder/interfaces/report-def.d.ts +135 -135
  200. package/table-builder/material.module.d.ts +32 -32
  201. package/table-builder/ngrx/actions.d.ts +23 -23
  202. package/table-builder/ngrx/effects.d.ts +19 -19
  203. package/table-builder/ngrx/reducer.d.ts +15 -15
  204. package/table-builder/ngrx/selectors.d.ts +22 -22
  205. package/table-builder/pipes/column-total.pipe.d.ts +8 -8
  206. package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -8
  207. package/table-builder/pipes/format-filter-value.pipe.d.ts +14 -14
  208. package/table-builder/pipes/key-display.d.ts +11 -11
  209. package/table-builder/services/export-to-csv.service.d.ts +22 -22
  210. package/table-builder/services/link-creator.service.d.ts +12 -12
  211. package/table-builder/services/table-template-service.d.ts +14 -14
  212. package/table-builder/services/transform-creator.d.ts +19 -19
  213. package/table-builder/table-builder.module.d.ts +45 -45
  214. package/utilities/directives/auto-focus.directive.d.ts +10 -10
  215. package/utilities/directives/clickEmitterDirective.d.ts +7 -7
  216. package/utilities/directives/clickSubject.d.ts +9 -9
  217. package/utilities/directives/conditional-classes.directive.d.ts +14 -14
  218. package/utilities/directives/dialog-service.d.ts +10 -10
  219. package/utilities/directives/dialog.d.ts +46 -46
  220. package/utilities/directives/mat-toggle-group-directive.d.ts +21 -21
  221. package/utilities/directives/prevent-enter.directive.d.ts +6 -6
  222. package/utilities/directives/stop-propagation.directive.d.ts +7 -7
  223. package/utilities/directives/styler.d.ts +9 -9
  224. package/utilities/directives/trim-whitespace.directive.d.ts +9 -9
  225. package/utilities/index.d.ts +15 -15
  226. package/utilities/module.d.ts +19 -19
  227. package/utilities/pipes/function.pipe.d.ts +7 -7
  228. package/utilities/pipes/phone.pipe.d.ts +7 -7
  229. package/utilities/pipes/space-case.pipes.d.ts +17 -17
@@ -1,403 +1,403 @@
1
- import { Directive, Input, Optional } from "@angular/core";
2
- import { BehaviorSubject, ReplaySubject, takeUntil, tap } from "rxjs";
3
- import { v4 as uuid } from 'uuid';
4
- import { FilterType } from "../enums/filterTypes";
5
- import { FieldType } from "../interfaces/report-def";
6
- import { ComponentStore } from "@ngrx/component-store";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- import * as i2 from "./table-wrapper.directive";
10
- import * as i3 from "rxjs";
11
- import * as i4 from "@angular/material/checkbox";
12
- import * as i5 from "@angular/material/slide-toggle";
13
- import * as i6 from "@angular/material/radio";
14
- import * as i7 from "@angular/material/core";
15
- import * as i8 from "@angular/material/button-toggle";
16
- const inputs = [
17
- 'predicate: tbCustomFilter',
18
- 'filterId: filterId',
19
- ];
20
- export class TableCustomFilterDirective {
21
- constructor() {
22
- this.savable = false;
23
- this.used = false;
24
- }
25
- }
26
- TableCustomFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
27
- TableCustomFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableCustomFilterDirective, selector: " ", ngImport: i0 });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirective, decorators: [{
29
- type: Directive,
30
- args: [{
31
- selector: ' '
32
- }]
33
- }] });
34
- export class TableFilterDirective extends ComponentStore {
35
- constructor(model, wrapper) {
36
- super();
37
- this.model = model;
38
- this.filter$ = this.state$;
39
- this.active = true;
40
- this.filterValue = null;
41
- this.used = false;
42
- this.savable = false;
43
- this.ready = false;
44
- this._userActive = true;
45
- if (wrapper) {
46
- wrapper.register(this);
47
- }
48
- if (model) {
49
- this.effect(() => {
50
- return model.valueChanges.pipe(tap(val => {
51
- this.filterValue = val;
52
- this.update();
53
- }));
54
- });
55
- }
56
- }
57
- reset() {
58
- this.filterValue = undefined;
59
- }
60
- setFilterValue(value) {
61
- if (this.model) {
62
- setTimeout(() => {
63
- this.model.reset(value);
64
- }, 0);
65
- }
66
- else {
67
- this.filterValue = value;
68
- }
69
- }
70
- ngOnChanges(changes) {
71
- this.update();
72
- }
73
- ngOnInit() {
74
- if (!this.filterId) {
75
- this.filterId = uuid();
76
- }
77
- else {
78
- this.savable = true;
79
- }
80
- this.ready = true;
81
- this.update();
82
- }
83
- setFilter(filter) {
84
- this.setState(filter);
85
- }
86
- update() {
87
- if (this.ready) {
88
- this.setFilter({
89
- filterId: this.filterId,
90
- key: this.key,
91
- filterType: this.filterType,
92
- fieldType: this.fieldType,
93
- filterValue: this.filterValue,
94
- active: this.active && this.filterValue !== undefined,
95
- _isExternalyManaged: true,
96
- });
97
- }
98
- }
99
- }
100
- TableFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterDirective, deps: [{ token: i1.NgControl, optional: true }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
101
- TableFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableFilterDirective, selector: "[tbFilter]", inputs: { filterType: "filterType", key: "key", fieldType: "fieldType", filterId: "filterId", active: "active", filterValue: "filterValue" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterDirective, decorators: [{
103
- type: Directive,
104
- args: [{
105
- selector: "[tbFilter]"
106
- }]
107
- }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
108
- type: Optional
109
- }] }, { type: i2.TableWrapperDirective, decorators: [{
110
- type: Optional
111
- }] }]; }, propDecorators: { filterType: [{
112
- type: Input
113
- }], key: [{
114
- type: Input
115
- }], fieldType: [{
116
- type: Input
117
- }], filterId: [{
118
- type: Input
119
- }], active: [{
120
- type: Input
121
- }], filterValue: [{
122
- type: Input
123
- }] } });
124
- export class TableFilterStringContainsDirective extends TableFilterDirective {
125
- constructor(model, wrapper) {
126
- super(model, wrapper);
127
- this.filterType = FilterType.StringContains;
128
- this.fieldType = FieldType.String;
129
- this.effect(() => {
130
- return model.valueChanges.pipe(tap(val => {
131
- this.filterValue = val;
132
- this.update();
133
- }));
134
- });
135
- }
136
- reset() {
137
- if (this.model) {
138
- this.model.reset();
139
- }
140
- super.reset();
141
- }
142
- setFilter(filter) {
143
- filter.active = filter.filterValue && this._userActive;
144
- super.setFilter(filter);
145
- }
146
- ngOnChanges(changes) {
147
- if (changes['active']) {
148
- this._userActive = changes['active'].currentValue;
149
- }
150
- super.ngOnChanges(changes);
151
- }
152
- }
153
- TableFilterStringContainsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterStringContainsDirective, deps: [{ token: i1.NgControl, optional: true }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
154
- TableFilterStringContainsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableFilterStringContainsDirective, selector: "[tbFilterStringContains]", inputs: { key: ["tbFilterStringContains", "key"], filterValue: "filterValue", filterId: "filterId", active: "active" }, providers: [{ provide: TableFilterDirective, useExisting: TableFilterStringContainsDirective }], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterStringContainsDirective, decorators: [{
156
- type: Directive,
157
- args: [{
158
- selector: '[tbFilterStringContains]',
159
- providers: [{ provide: TableFilterDirective, useExisting: TableFilterStringContainsDirective }],
160
- inputs: [
161
- 'key:tbFilterStringContains',
162
- 'filterValue:filterValue',
163
- 'filterId: filterId',
164
- 'active: active',
165
- ]
166
- }]
167
- }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
168
- type: Optional
169
- }] }, { type: i2.TableWrapperDirective, decorators: [{
170
- type: Optional
171
- }] }]; } });
172
- export class TableCustomFilterDirectiveBase extends TableCustomFilterDirective {
173
- constructor() {
174
- super(...arguments);
175
- this._active = false;
176
- this.ready = false;
177
- }
178
- set predicate(val) {
179
- this._predicate = val;
180
- this.update({ predicate: val });
181
- }
182
- update(val) {
183
- if (this.ready) {
184
- this.filter = { ...this.filter, ...val };
185
- this.filter$.next(this.filter);
186
- }
187
- }
188
- set active(val) {
189
- if (this._active !== val) {
190
- this._active = val;
191
- this.update({ active: val });
192
- }
193
- }
194
- get active() {
195
- return this._active;
196
- }
197
- ngOnInit() {
198
- if (!this.filterId) {
199
- this.filterId = uuid();
200
- }
201
- else {
202
- this.savable = true;
203
- }
204
- this.filter = {
205
- filterType: FilterType.Custom,
206
- filterId: this.filterId,
207
- active: this._active,
208
- predicate: this._predicate,
209
- };
210
- this.ready = true;
211
- this.filter$ = new BehaviorSubject(this.filter);
212
- }
213
- }
214
- TableCustomFilterDirectiveBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirectiveBase, deps: null, target: i0.ɵɵFactoryTarget.Directive });
215
- TableCustomFilterDirectiveBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableCustomFilterDirectiveBase, selector: "[tbCustomFilter]", inputs: { filterId: "filterId", predicate: ["tbCustomFilter", "predicate"], active: "active" }, usesInheritance: true, ngImport: i0 });
216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirectiveBase, decorators: [{
217
- type: Directive,
218
- args: [{
219
- selector: "[tbCustomFilter]",
220
- }]
221
- }], propDecorators: { filterId: [{
222
- type: Input
223
- }], predicate: [{
224
- type: Input,
225
- args: ['tbCustomFilter']
226
- }], active: [{
227
- type: Input
228
- }] } });
229
- export class TbSelectedFilterDirective extends TableCustomFilterDirectiveBase {
230
- constructor(change, isActive, wrapper) {
231
- super();
232
- this.change = change;
233
- this.isActive = isActive;
234
- this.destroySubject$ = new ReplaySubject(1);
235
- if (wrapper) {
236
- wrapper.register(this);
237
- }
238
- }
239
- reset() {
240
- this.active = false;
241
- }
242
- ngOnDestroy() {
243
- this.destroySubject$.next();
244
- }
245
- ngOnInit() {
246
- this._active = this.isActive();
247
- super.ngOnInit();
248
- this.change.pipe(takeUntil(this.destroySubject$)).subscribe(() => {
249
- this.active = this.isActive();
250
- });
251
- }
252
- }
253
- TbSelectedFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TbSelectedFilterDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
254
- TbSelectedFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TbSelectedFilterDirective, usesInheritance: true, ngImport: i0 });
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TbSelectedFilterDirective, decorators: [{
256
- type: Directive
257
- }], ctorParameters: function () { return [{ type: i3.Observable }, { type: undefined }, { type: i2.TableWrapperDirective, decorators: [{
258
- type: Optional
259
- }] }]; } });
260
- // Checkbox
261
- export class MatCheckboxTbFilterDirective extends TbSelectedFilterDirective {
262
- constructor(matCheckbox, wrapper) {
263
- super(matCheckbox.change, () => matCheckbox.checked, wrapper);
264
- this.matCheckbox = matCheckbox;
265
- }
266
- set active(val) {
267
- this.matCheckbox.checked = val;
268
- super.active = val;
269
- }
270
- }
271
- MatCheckboxTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatCheckboxTbFilterDirective, deps: [{ token: i4.MatCheckbox }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
272
- MatCheckboxTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatCheckboxTbFilterDirective, selector: "mat-checkbox[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatCheckboxTbFilterDirective }], usesInheritance: true, ngImport: i0 });
273
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatCheckboxTbFilterDirective, decorators: [{
274
- type: Directive,
275
- args: [{
276
- selector: 'mat-checkbox[tbCustomFilter]',
277
- inputs: [
278
- ...inputs
279
- ],
280
- providers: [{ provide: TableCustomFilterDirective, useExisting: MatCheckboxTbFilterDirective }]
281
- }]
282
- }], ctorParameters: function () { return [{ type: i4.MatCheckbox }, { type: i2.TableWrapperDirective, decorators: [{
283
- type: Optional
284
- }] }]; } });
285
- export class MatSlideToggleTbFilterDirective extends TbSelectedFilterDirective {
286
- constructor(matSlideToggle, wrapper) {
287
- super(matSlideToggle.change, () => matSlideToggle.checked, wrapper);
288
- this.matSlideToggle = matSlideToggle;
289
- }
290
- set active(val) {
291
- this.matSlideToggle.checked = val;
292
- super.active = val;
293
- }
294
- ngOnInit() {
295
- super.ngOnInit();
296
- }
297
- }
298
- MatSlideToggleTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatSlideToggleTbFilterDirective, deps: [{ token: i5.MatSlideToggle }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
299
- MatSlideToggleTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatSlideToggleTbFilterDirective, selector: "mat-slide-toggle[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatSlideToggleTbFilterDirective }], usesInheritance: true, ngImport: i0 });
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatSlideToggleTbFilterDirective, decorators: [{
301
- type: Directive,
302
- args: [{
303
- selector: 'mat-slide-toggle[tbCustomFilter]',
304
- inputs: [
305
- ...inputs
306
- ],
307
- providers: [{ provide: TableCustomFilterDirective, useExisting: MatSlideToggleTbFilterDirective }]
308
- }]
309
- }], ctorParameters: function () { return [{ type: i5.MatSlideToggle }, { type: i2.TableWrapperDirective, decorators: [{
310
- type: Optional
311
- }] }]; } });
312
- // Radio button
313
- export class MatRadioButtonTbFilterDirective extends TbSelectedFilterDirective {
314
- constructor(matRadioButton, wrapper) {
315
- super(matRadioButton.change, () => matRadioButton.checked, wrapper);
316
- this.matRadioButton = matRadioButton;
317
- }
318
- set active(val) {
319
- this.matRadioButton.checked = val;
320
- super.active = val;
321
- }
322
- ngOnInit() {
323
- super.ngOnInit();
324
- }
325
- }
326
- MatRadioButtonTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatRadioButtonTbFilterDirective, deps: [{ token: i6.MatRadioButton }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
327
- MatRadioButtonTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatRadioButtonTbFilterDirective, selector: "mat-radio-button[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"] }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatRadioButtonTbFilterDirective }], usesInheritance: true, ngImport: i0 });
328
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatRadioButtonTbFilterDirective, decorators: [{
329
- type: Directive,
330
- args: [{
331
- selector: 'mat-radio-button[tbCustomFilter]',
332
- inputs: ['predicate: tbCustomFilter'],
333
- providers: [{ provide: TableCustomFilterDirective, useExisting: MatRadioButtonTbFilterDirective }]
334
- }]
335
- }], ctorParameters: function () { return [{ type: i6.MatRadioButton }, { type: i2.TableWrapperDirective, decorators: [{
336
- type: Optional
337
- }] }]; } });
338
- // Option (select)
339
- export class MatOptionTbFilterDirective extends TbSelectedFilterDirective {
340
- constructor(matOption, wrapper) {
341
- super(matOption.onSelectionChange.pipe(tap(d => {
342
- if (!matOption.value) {
343
- matOption.value = uuid();
344
- }
345
- })), () => matOption.selected, wrapper);
346
- this.matOption = matOption;
347
- }
348
- set active(val) {
349
- if (val) {
350
- this.matOption.select();
351
- }
352
- else {
353
- this.matOption.deselect();
354
- }
355
- super.active = val;
356
- }
357
- ngOnInit() {
358
- super.ngOnInit();
359
- }
360
- }
361
- MatOptionTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatOptionTbFilterDirective, deps: [{ token: i7.MatOption }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
362
- MatOptionTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatOptionTbFilterDirective, selector: "mat-option[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatOptionTbFilterDirective }], usesInheritance: true, ngImport: i0 });
363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatOptionTbFilterDirective, decorators: [{
364
- type: Directive,
365
- args: [{
366
- selector: 'mat-option[tbCustomFilter]',
367
- inputs: [
368
- ...inputs
369
- ],
370
- providers: [{ provide: TableCustomFilterDirective, useExisting: MatOptionTbFilterDirective }]
371
- }]
372
- }], ctorParameters: function () { return [{ type: i7.MatOption }, { type: i2.TableWrapperDirective, decorators: [{
373
- type: Optional
374
- }] }]; } });
375
- // Button toggle
376
- export class MatButtonToggleFilterDirective extends TbSelectedFilterDirective {
377
- constructor(matButtonToggle, wrapper) {
378
- super(matButtonToggle.change, () => matButtonToggle.checked, wrapper);
379
- this.matButtonToggle = matButtonToggle;
380
- }
381
- set active(val) {
382
- this.matButtonToggle.checked = val;
383
- super.active = val;
384
- }
385
- ngOnInit() {
386
- super.ngOnInit();
387
- }
388
- }
389
- MatButtonToggleFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatButtonToggleFilterDirective, deps: [{ token: i8.MatButtonToggle }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
390
- MatButtonToggleFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatButtonToggleFilterDirective, selector: "mat-button-toggle[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatButtonToggleFilterDirective }], usesInheritance: true, ngImport: i0 });
391
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatButtonToggleFilterDirective, decorators: [{
392
- type: Directive,
393
- args: [{
394
- selector: 'mat-button-toggle[tbCustomFilter]',
395
- inputs: [
396
- ...inputs
397
- ],
398
- providers: [{ provide: TableCustomFilterDirective, useExisting: MatButtonToggleFilterDirective }]
399
- }]
400
- }], ctorParameters: function () { return [{ type: i8.MatButtonToggle }, { type: i2.TableWrapperDirective, decorators: [{
401
- type: Optional
402
- }] }]; } });
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGItZmlsdGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdXRpbGl0aWVzL3NyYy90YWJsZS1idWlsZGVyL2RpcmVjdGl2ZXMvdGItZmlsdGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFXLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0YsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7QUFLdkQsTUFBTSxNQUFNLEdBQUc7SUFDYiwyQkFBMkI7SUFDM0Isb0JBQW9CO0NBQ3JCLENBQUM7QUFNRixNQUFNLE9BQWdCLDBCQUEwQjtJQUhoRDtRQU1FLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEtBQUssQ0FBQztLQUdkOzt1SEFQcUIsMEJBQTBCOzJHQUExQiwwQkFBMEI7MkZBQTFCLDBCQUEwQjtrQkFIL0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsR0FBRztpQkFDZDs7QUFlRSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBMEI7SUFFckUsWUFBbUMsS0FBZ0IsRUFBYyxPQUE4QjtRQUM3RixLQUFLLEVBQUUsQ0FBQztRQUR5QixVQUFLLEdBQUwsS0FBSyxDQUFXO1FBbUJuRCxZQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQU1iLFdBQU0s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U0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUNBQW1DO29CQUM3QyxNQUFNLEVBQUU7d0JBQ04sR0FBRyxNQUFNO3FCQUNWO29CQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFdBQVcsZ0NBQWdDLEVBQUUsQ0FBQztpQkFDbEc7OzBCQU13RCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgT3B0aW9uYWwsIFByZWRpY2F0ZSwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21GaWx0ZXIsIEZpbHRlckluZm8gfSBmcm9tIFwiLi4vY2xhc3Nlcy9maWx0ZXItaW5mb1wiO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XHJcbmltcG9ydCB7IEZpbHRlclR5cGUgfSBmcm9tIFwiLi4vZW51bXMvZmlsdGVyVHlwZXNcIjtcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlXCI7XHJcbmltcG9ydCB7IE1hdFJhZGlvQnV0dG9uIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3JhZGlvXCI7XHJcbmltcG9ydCB7IE1hdEJ1dHRvblRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmXCI7XHJcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gXCJAbmdyeC9jb21wb25lbnQtc3RvcmVcIjtcclxuaW1wb3J0IHsgVGFibGVXcmFwcGVyRGlyZWN0aXZlIH0gZnJvbSBcIi4vdGFibGUtd3JhcHBlci5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgTWF0T3B0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcclxuXHJcblxyXG5jb25zdCBpbnB1dHMgPSBbXHJcbiAgJ3ByZWRpY2F0ZTogdGJDdXN0b21GaWx0ZXInLFxyXG4gICdmaWx0ZXJJZDogZmlsdGVySWQnLFxyXG5dO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnICdcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlPFQgPSBhbnk+IHtcclxuICBhYnN0cmFjdCBmaWx0ZXIkIDogT2JzZXJ2YWJsZTxDdXN0b21GaWx0ZXI+O1xyXG4gIGZpbHRlcklkITogc3RyaW5nO1xyXG4gIHNhdmFibGUgPSBmYWxzZTtcclxuICB1c2VkID0gZmFsc2U7XHJcbiAgYWJzdHJhY3QgYWN0aXZlOiBib29sZWFuO1xyXG4gIGFic3RyYWN0IHJlc2V0KCk6IHZvaWQ7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt0YkZpbHRlcl1cIlxyXG59KSBleHBvcnQgY2xhc3MgVGFibGVGaWx0ZXJEaXJlY3RpdmUgZXh0ZW5kcyBDb21wb25lbnRTdG9yZTxGaWx0ZXJJbmZvPiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByb3RlY3RlZCAgbW9kZWw6IE5nQ29udHJvbCwgQE9wdGlvbmFsKCkgd3JhcHBlcjogVGFibGVXcmFwcGVyRGlyZWN0aXZlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYod3JhcHBlcikge1xyXG4gICAgICB3cmFwcGVyLnJlZ2lzdGVyKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgaWYobW9kZWwpIHtcclxuICAgICAgdGhpcy5lZmZlY3QoICgpID0+IHtcclxuICAgICAgICByZXR1cm4gbW9kZWwudmFsdWVDaGFuZ2VzIS5waXBlKFxyXG4gICAgICAgICAgdGFwKCB2YWwgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgZmlsdGVyJCA9IHRoaXMuc3RhdGUkO1xyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJUeXBlITogRmlsdGVyVHlwZTtcclxuICBASW5wdXQoKSBrZXkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZmllbGRUeXBlITogRmllbGRUeXBlO1xyXG4gIEBJbnB1dCgpIGZpbHRlcklkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFjdGl2ZSA9IHRydWU7XHJcbiAgQElucHV0KCkgZmlsdGVyVmFsdWU6IGFueSA9IG51bGw7XHJcblxyXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmKHRoaXMubW9kZWwpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5yZXNldCh2YWx1ZSk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHVzZWQgPSBmYWxzZTtcclxuICBzYXZhYmxlID0gZmFsc2U7XHJcbiAgcmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgX3VzZXJBY3RpdmUgPSB0cnVlO1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZighdGhpcy5maWx0ZXJJZCkge1xyXG4gICAgICB0aGlzLmZpbHRlcklkID0gdXVpZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zYXZhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZXRGaWx0ZXIoZmlsdGVyOiBGaWx0ZXJJbmZvICkge1xyXG4gICAgdGhpcy5zZXRTdGF0ZShmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgaWYgKHRoaXMucmVhZHkpIHtcclxuICAgICAgdGhpcy5zZXRGaWx0ZXIoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmlsdGVySWQ6IHRoaXMuZmlsdGVySWQsXHJcbiAgICAgICAgICBrZXk6IHRoaXMua2V5LFxyXG4gICAgICAgICAgZmlsdGVyVHlwZTogdGhpcy5maWx0ZXJUeXBlLFxyXG4gICAgICAgICAgZmllbGRUeXBlOiB0aGlzLmZpZWxkVHlwZSxcclxuICAgICAgICAgIGZpbHRlclZhbHVlOiB0aGlzLmZpbHRlclZhbHVlLFxyXG4gICAgICAgICAgYWN0aXZlOiB0aGlzLmFjdGl2ZSAmJiB0aGlzLmZpbHRlclZhbHVlICE9PSB1bmRlZmluZWQsXHJcbiAgICAgICAgICBfaXNFeHRlcm5hbHlNYW5hZ2VkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t0YkZpbHRlclN0cmluZ0NvbnRhaW5zXScsXHJcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IFRhYmxlRmlsdGVyU3RyaW5nQ29udGFpbnNEaXJlY3RpdmUgfV0sXHJcbiAgaW5wdXRzOiBbXHJcbiAgICAna2V5OnRiRmlsdGVyU3RyaW5nQ29udGFpbnMnLFxyXG4gICAgJ2ZpbHRlclZhbHVlOmZpbHRlclZhbHVlJyxcclxuICAgICdmaWx0ZXJJZDogZmlsdGVySWQnLFxyXG4gICAgJ2FjdGl2ZTogYWN0aXZlJyxcclxuICBdXHJcbn0pIGV4cG9ydCBjbGFzcyBUYWJsZUZpbHRlclN0cmluZ0NvbnRhaW5zRGlyZWN0aXZlIGV4dGVuZHMgVGFibGVGaWx0ZXJEaXJlY3RpdmUge1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpICBtb2RlbDogTmdDb250cm9sLCBAT3B0aW9uYWwoKSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUpIHtcclxuICAgIHN1cGVyKG1vZGVsLHdyYXBwZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJUeXBlID0gRmlsdGVyVHlwZS5TdHJpbmdDb250YWlucztcclxuICAgIHRoaXMuZmllbGRUeXBlID0gRmllbGRUeXBlLlN0cmluZztcclxuICAgIHRoaXMuZWZmZWN0KCAoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb2RlbC52YWx1ZUNoYW5nZXMhLnBpcGUoXHJcbiAgICAgICAgdGFwKCB2YWwgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHJlc2V0KCkge1xyXG4gICAgaWYodGhpcy5tb2RlbCkge1xyXG4gICAgICB0aGlzLm1vZGVsLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICBzdXBlci5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgc2V0RmlsdGVyKGZpbHRlcjogRmlsdGVySW5mbykge1xyXG4gICAgZmlsdGVyLmFjdGl2ZSA9IGZpbHRlci5maWx0ZXJWYWx1ZSAmJiB0aGlzLl91c2VyQWN0aXZlO1xyXG4gICAgc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZihjaGFuZ2VzWydhY3RpdmUnXSkge1xyXG4gICAgICB0aGlzLl91c2VyQWN0aXZlID0gY2hhbmdlc1snYWN0aXZlJ10uY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogXCJbdGJDdXN0b21GaWx0ZXJdXCIsXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZUJhc2U8VCA9IGFueT4gZXh0ZW5kcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZTxUPiB7XHJcblxyXG4gIGZpbHRlciQhIDogU3ViamVjdDxDdXN0b21GaWx0ZXI+O1xyXG4gIGZpbHRlciE6IEN1c3RvbUZpbHRlcjtcclxuICBASW5wdXQoKSBmaWx0ZXJJZCEgOiBzdHJpbmc7XHJcblxyXG4gIF9wcmVkaWNhdGUhOiBQcmVkaWNhdGU8VD47XHJcbiAgQElucHV0KCd0YkN1c3RvbUZpbHRlcicpIHNldCBwcmVkaWNhdGUoIHZhbDogUHJlZGljYXRlPFQ+ICkge1xyXG4gICAgdGhpcy5fcHJlZGljYXRlID0gdmFsO1xyXG4gICAgdGhpcy51cGRhdGUoe3ByZWRpY2F0ZTp2YWx9KTtcclxuICB9XHJcblxyXG4gIF9hY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWFkeSA9IGZhbHNlO1xyXG5cclxuICB1cGRhdGUodmFsOiBQYXJ0aWFsPEN1c3RvbUZpbHRlcj4gKSB7XHJcbiAgICBpZih0aGlzLnJlYWR5KSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyID0gey4uLnRoaXMuZmlsdGVyLC4uLnZhbH07XHJcbiAgICAgIHRoaXMuZmlsdGVyJC5uZXh0KHRoaXMuZmlsdGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBhY3RpdmUodmFsOiBib29sZWFuKSB7XHJcbiAgICBpZih0aGlzLl9hY3RpdmUgIT09IHZhbCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmUgPSB2YWw7XHJcbiAgICAgIHRoaXMudXBkYXRlKHthY3RpdmU6dmFsfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZighdGhpcy5maWx0ZXJJZCkge1xyXG4gICAgICB0aGlzLmZpbHRlcklkID0gdXVpZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zYXZhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlciA9IHtcclxuICAgICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZS5DdXN0b20sXHJcbiAgICAgIGZpbHRlcklkOiB0aGlzLmZpbHRlcklkLFxyXG4gICAgICBhY3RpdmU6IHRoaXMuX2FjdGl2ZSxcclxuICAgICAgcHJlZGljYXRlOiB0aGlzLl9wcmVkaWNhdGUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XHJcbiAgICB0aGlzLmZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZmlsdGVyKTtcclxuICB9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZTxUID0gYW55PiAgZXh0ZW5kcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZUJhc2U8VD4ge1xyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlOiBPYnNlcnZhYmxlPGFueT4sIHByaXZhdGUgaXNBY3RpdmU6ICgpID0+IGJvb2xlYW4sIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmKHdyYXBwZXIpIHtcclxuICAgICAgd3JhcHBlci5yZWdpc3Rlcih0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3lTdWJqZWN0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95U3ViamVjdCQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgdGhpcy5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKS5zdWJzY3JpYmUoICgpID0+IHtcclxuICAgICAgdGhpcy5hY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENoZWNrYm94XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnbWF0LWNoZWNrYm94W3RiQ3VzdG9tRmlsdGVyXScsXHJcbiAgaW5wdXRzOiBbXHJcbiAgICAuLi5pbnB1dHNcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBNYXRDaGVja2JveFRiRmlsdGVyRGlyZWN0aXZlIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRDaGVja2JveFRiRmlsdGVyRGlyZWN0aXZlIGV4dGVuZHMgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZSB7XHJcblxyXG4gIG92ZXJyaWRlIHNldCBhY3RpdmUodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1hdENoZWNrYm94LmNoZWNrZWQgPSB2YWw7XHJcbiAgICBzdXBlci5hY3RpdmUgPSB2YWw7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF0Q2hlY2tib3g6IE1hdENoZWNrYm94LCBAT3B0aW9uYWwoKSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUpIHtcclxuICAgIHN1cGVyKG1hdENoZWNrYm94LmNoYW5nZSwgKCkgPT4gbWF0Q2hlY2tib3guY2hlY2tlZCwgd3JhcHBlcik7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdtYXQtc2xpZGUtdG9nZ2xlW3RiQ3VzdG9tRmlsdGVyXScsXHJcbiAgaW5wdXRzOiBbXHJcbiAgICAuLi5pbnB1dHNcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBNYXRTbGlkZVRvZ2dsZVRiRmlsdGVyRGlyZWN0aXZlIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRTbGlkZVRvZ2dsZVRiRmlsdGVyRGlyZWN0aXZlPFQgPSBhbnk+IGV4dGVuZHMgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZTxUPiB7XHJcbiAgb3ZlcnJpZGUgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWF0U2xpZGVUb2dnbGUuY2hlY2tlZCA9IHZhbDtcclxuICAgIHN1cGVyLmFjdGl2ZSA9IHZhbDtcclxuICB9XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRTbGlkZVRvZ2dsZTogTWF0U2xpZGVUb2dnbGUsIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xyXG4gICAgc3VwZXIobWF0U2xpZGVUb2dnbGUuY2hhbmdlLCAoKSA9PiBtYXRTbGlkZVRvZ2dsZS5jaGVja2VkLHdyYXBwZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gUmFkaW8gYnV0dG9uXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnbWF0LXJhZGlvLWJ1dHRvblt0YkN1c3RvbUZpbHRlcl0nLFxyXG4gIGlucHV0czogWydwcmVkaWNhdGU6IHRiQ3VzdG9tRmlsdGVyJ10sXHJcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IE1hdFJhZGlvQnV0dG9uVGJGaWx0ZXJEaXJlY3RpdmUgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdFJhZGlvQnV0dG9uVGJGaWx0ZXJEaXJlY3RpdmUgZXh0ZW5kcyBUYlNlbGVjdGVkRmlsdGVyRGlyZWN0aXZlIHtcclxuXHJcbiAgb3ZlcnJpZGUgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWF0UmFkaW9CdXR0b24uY2hlY2tlZCA9IHZhbDtcclxuICAgIHN1cGVyLmFjdGl2ZSA9IHZhbDtcclxuICB9XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRSYWRpb0J1dHRvbjogTWF0UmFkaW9CdXR0b24sIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xyXG4gICAgc3VwZXIobWF0UmFkaW9CdXR0b24uY2hhbmdlLCAoKSA9PiBtYXRSYWRpb0J1dHRvbi5jaGVja2VkLCB3cmFwcGVyKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIE9wdGlvbiAoc2VsZWN0KVxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ21hdC1vcHRpb25bdGJDdXN0b21GaWx0ZXJdJyxcclxuICBpbnB1dHM6IFtcclxuICAgIC4uLmlucHV0c1xyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IE1hdE9wdGlvblRiRmlsdGVyRGlyZWN0aXZlIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRPcHRpb25UYkZpbHRlckRpcmVjdGl2ZSBleHRlbmRzIFRiU2VsZWN0ZWRGaWx0ZXJEaXJlY3RpdmUge1xyXG5cclxuICBvdmVycmlkZSBzZXQgYWN0aXZlKHZhbDogYm9vbGVhbikge1xyXG4gICAgaWYodmFsKSB7XHJcbiAgICAgIHRoaXMubWF0T3B0aW9uLnNlbGVjdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYXRPcHRpb24uZGVzZWxlY3QoKTtcclxuICAgIH1cclxuICAgIHN1cGVyLmFjdGl2ZSA9IHZhbDtcclxuICB9XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRPcHRpb246IE1hdE9wdGlvbiwgQE9wdGlvbmFsKCkgd3JhcHBlcjogVGFibGVXcmFwcGVyRGlyZWN0aXZlKSB7XHJcbiAgICBzdXBlciggbWF0T3B0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlLnBpcGUodGFwKCBkID0+IHtcclxuICAgICAgaWYoIW1hdE9wdGlvbi52YWx1ZSkge1xyXG4gICAgICAgIG1hdE9wdGlvbi52YWx1ZSA9IHV1aWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICkpLCAoKSA9PiBtYXRPcHRpb24uc2VsZWN0ZWQsIHdyYXBwZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gQnV0dG9uIHRvZ2dsZVxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ21hdC1idXR0b24tdG9nZ2xlW3RiQ3VzdG9tRmlsdGVyXScsXHJcbiAgaW5wdXRzOiBbXHJcbiAgICAuLi5pbnB1dHNcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBNYXRCdXR0b25Ub2dnbGVGaWx0ZXJEaXJlY3RpdmUgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdEJ1dHRvblRvZ2dsZUZpbHRlckRpcmVjdGl2ZSBleHRlbmRzIFRiU2VsZWN0ZWRGaWx0ZXJEaXJlY3RpdmUge1xyXG4gIG92ZXJyaWRlIHNldCBhY3RpdmUodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1hdEJ1dHRvblRvZ2dsZS5jaGVja2VkID0gdmFsO1xyXG4gICAgc3VwZXIuYWN0aXZlID0gdmFsO1xyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdEJ1dHRvblRvZ2dsZTogTWF0QnV0dG9uVG9nZ2xlLCBAT3B0aW9uYWwoKSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUpIHtcclxuICAgIHN1cGVyKG1hdEJ1dHRvblRvZ2dsZS5jaGFuZ2UsICgpID0+IG1hdEJ1dHRvblRvZ2dsZS5jaGVja2VkLHdyYXBwZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { Directive, Input, Optional } from "@angular/core";
2
+ import { BehaviorSubject, ReplaySubject, takeUntil, tap } from "rxjs";
3
+ import { v4 as uuid } from 'uuid';
4
+ import { FilterType } from "../enums/filterTypes";
5
+ import { FieldType } from "../interfaces/report-def";
6
+ import { ComponentStore } from "@ngrx/component-store";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "./table-wrapper.directive";
10
+ import * as i3 from "rxjs";
11
+ import * as i4 from "@angular/material/checkbox";
12
+ import * as i5 from "@angular/material/slide-toggle";
13
+ import * as i6 from "@angular/material/radio";
14
+ import * as i7 from "@angular/material/core";
15
+ import * as i8 from "@angular/material/button-toggle";
16
+ const inputs = [
17
+ 'predicate: tbCustomFilter',
18
+ 'filterId: filterId',
19
+ ];
20
+ export class TableCustomFilterDirective {
21
+ constructor() {
22
+ this.savable = false;
23
+ this.used = false;
24
+ }
25
+ }
26
+ TableCustomFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
27
+ TableCustomFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableCustomFilterDirective, selector: " ", ngImport: i0 });
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirective, decorators: [{
29
+ type: Directive,
30
+ args: [{
31
+ selector: ' '
32
+ }]
33
+ }] });
34
+ export class TableFilterDirective extends ComponentStore {
35
+ constructor(model, wrapper) {
36
+ super();
37
+ this.model = model;
38
+ this.filter$ = this.state$;
39
+ this.active = true;
40
+ this.filterValue = null;
41
+ this.used = false;
42
+ this.savable = false;
43
+ this.ready = false;
44
+ this._userActive = true;
45
+ if (wrapper) {
46
+ wrapper.register(this);
47
+ }
48
+ if (model) {
49
+ this.effect(() => {
50
+ return model.valueChanges.pipe(tap(val => {
51
+ this.filterValue = val;
52
+ this.update();
53
+ }));
54
+ });
55
+ }
56
+ }
57
+ reset() {
58
+ this.filterValue = undefined;
59
+ }
60
+ setFilterValue(value) {
61
+ if (this.model) {
62
+ setTimeout(() => {
63
+ this.model.reset(value);
64
+ }, 0);
65
+ }
66
+ else {
67
+ this.filterValue = value;
68
+ }
69
+ }
70
+ ngOnChanges(changes) {
71
+ this.update();
72
+ }
73
+ ngOnInit() {
74
+ if (!this.filterId) {
75
+ this.filterId = uuid();
76
+ }
77
+ else {
78
+ this.savable = true;
79
+ }
80
+ this.ready = true;
81
+ this.update();
82
+ }
83
+ setFilter(filter) {
84
+ this.setState(filter);
85
+ }
86
+ update() {
87
+ if (this.ready) {
88
+ this.setFilter({
89
+ filterId: this.filterId,
90
+ key: this.key,
91
+ filterType: this.filterType,
92
+ fieldType: this.fieldType,
93
+ filterValue: this.filterValue,
94
+ active: this.active && this.filterValue !== undefined,
95
+ _isExternalyManaged: true,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ TableFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterDirective, deps: [{ token: i1.NgControl, optional: true }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
101
+ TableFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableFilterDirective, selector: "[tbFilter]", inputs: { filterType: "filterType", key: "key", fieldType: "fieldType", filterId: "filterId", active: "active", filterValue: "filterValue" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterDirective, decorators: [{
103
+ type: Directive,
104
+ args: [{
105
+ selector: "[tbFilter]"
106
+ }]
107
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
108
+ type: Optional
109
+ }] }, { type: i2.TableWrapperDirective, decorators: [{
110
+ type: Optional
111
+ }] }]; }, propDecorators: { filterType: [{
112
+ type: Input
113
+ }], key: [{
114
+ type: Input
115
+ }], fieldType: [{
116
+ type: Input
117
+ }], filterId: [{
118
+ type: Input
119
+ }], active: [{
120
+ type: Input
121
+ }], filterValue: [{
122
+ type: Input
123
+ }] } });
124
+ export class TableFilterStringContainsDirective extends TableFilterDirective {
125
+ constructor(model, wrapper) {
126
+ super(model, wrapper);
127
+ this.filterType = FilterType.StringContains;
128
+ this.fieldType = FieldType.String;
129
+ this.effect(() => {
130
+ return model.valueChanges.pipe(tap(val => {
131
+ this.filterValue = val;
132
+ this.update();
133
+ }));
134
+ });
135
+ }
136
+ reset() {
137
+ if (this.model) {
138
+ this.model.reset();
139
+ }
140
+ super.reset();
141
+ }
142
+ setFilter(filter) {
143
+ filter.active = filter.filterValue && this._userActive;
144
+ super.setFilter(filter);
145
+ }
146
+ ngOnChanges(changes) {
147
+ if (changes['active']) {
148
+ this._userActive = changes['active'].currentValue;
149
+ }
150
+ super.ngOnChanges(changes);
151
+ }
152
+ }
153
+ TableFilterStringContainsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterStringContainsDirective, deps: [{ token: i1.NgControl, optional: true }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
154
+ TableFilterStringContainsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableFilterStringContainsDirective, selector: "[tbFilterStringContains]", inputs: { key: ["tbFilterStringContains", "key"], filterValue: "filterValue", filterId: "filterId", active: "active" }, providers: [{ provide: TableFilterDirective, useExisting: TableFilterStringContainsDirective }], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableFilterStringContainsDirective, decorators: [{
156
+ type: Directive,
157
+ args: [{
158
+ selector: '[tbFilterStringContains]',
159
+ providers: [{ provide: TableFilterDirective, useExisting: TableFilterStringContainsDirective }],
160
+ inputs: [
161
+ 'key:tbFilterStringContains',
162
+ 'filterValue:filterValue',
163
+ 'filterId: filterId',
164
+ 'active: active',
165
+ ]
166
+ }]
167
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
168
+ type: Optional
169
+ }] }, { type: i2.TableWrapperDirective, decorators: [{
170
+ type: Optional
171
+ }] }]; } });
172
+ export class TableCustomFilterDirectiveBase extends TableCustomFilterDirective {
173
+ constructor() {
174
+ super(...arguments);
175
+ this._active = false;
176
+ this.ready = false;
177
+ }
178
+ set predicate(val) {
179
+ this._predicate = val;
180
+ this.update({ predicate: val });
181
+ }
182
+ update(val) {
183
+ if (this.ready) {
184
+ this.filter = { ...this.filter, ...val };
185
+ this.filter$.next(this.filter);
186
+ }
187
+ }
188
+ set active(val) {
189
+ if (this._active !== val) {
190
+ this._active = val;
191
+ this.update({ active: val });
192
+ }
193
+ }
194
+ get active() {
195
+ return this._active;
196
+ }
197
+ ngOnInit() {
198
+ if (!this.filterId) {
199
+ this.filterId = uuid();
200
+ }
201
+ else {
202
+ this.savable = true;
203
+ }
204
+ this.filter = {
205
+ filterType: FilterType.Custom,
206
+ filterId: this.filterId,
207
+ active: this._active,
208
+ predicate: this._predicate,
209
+ };
210
+ this.ready = true;
211
+ this.filter$ = new BehaviorSubject(this.filter);
212
+ }
213
+ }
214
+ TableCustomFilterDirectiveBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirectiveBase, deps: null, target: i0.ɵɵFactoryTarget.Directive });
215
+ TableCustomFilterDirectiveBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TableCustomFilterDirectiveBase, selector: "[tbCustomFilter]", inputs: { filterId: "filterId", predicate: ["tbCustomFilter", "predicate"], active: "active" }, usesInheritance: true, ngImport: i0 });
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableCustomFilterDirectiveBase, decorators: [{
217
+ type: Directive,
218
+ args: [{
219
+ selector: "[tbCustomFilter]",
220
+ }]
221
+ }], propDecorators: { filterId: [{
222
+ type: Input
223
+ }], predicate: [{
224
+ type: Input,
225
+ args: ['tbCustomFilter']
226
+ }], active: [{
227
+ type: Input
228
+ }] } });
229
+ export class TbSelectedFilterDirective extends TableCustomFilterDirectiveBase {
230
+ constructor(change, isActive, wrapper) {
231
+ super();
232
+ this.change = change;
233
+ this.isActive = isActive;
234
+ this.destroySubject$ = new ReplaySubject(1);
235
+ if (wrapper) {
236
+ wrapper.register(this);
237
+ }
238
+ }
239
+ reset() {
240
+ this.active = false;
241
+ }
242
+ ngOnDestroy() {
243
+ this.destroySubject$.next();
244
+ }
245
+ ngOnInit() {
246
+ this._active = this.isActive();
247
+ super.ngOnInit();
248
+ this.change.pipe(takeUntil(this.destroySubject$)).subscribe(() => {
249
+ this.active = this.isActive();
250
+ });
251
+ }
252
+ }
253
+ TbSelectedFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TbSelectedFilterDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
254
+ TbSelectedFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: TbSelectedFilterDirective, usesInheritance: true, ngImport: i0 });
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TbSelectedFilterDirective, decorators: [{
256
+ type: Directive
257
+ }], ctorParameters: function () { return [{ type: i3.Observable }, { type: undefined }, { type: i2.TableWrapperDirective, decorators: [{
258
+ type: Optional
259
+ }] }]; } });
260
+ // Checkbox
261
+ export class MatCheckboxTbFilterDirective extends TbSelectedFilterDirective {
262
+ constructor(matCheckbox, wrapper) {
263
+ super(matCheckbox.change, () => matCheckbox.checked, wrapper);
264
+ this.matCheckbox = matCheckbox;
265
+ }
266
+ set active(val) {
267
+ this.matCheckbox.checked = val;
268
+ super.active = val;
269
+ }
270
+ }
271
+ MatCheckboxTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatCheckboxTbFilterDirective, deps: [{ token: i4.MatCheckbox }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
272
+ MatCheckboxTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatCheckboxTbFilterDirective, selector: "mat-checkbox[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatCheckboxTbFilterDirective }], usesInheritance: true, ngImport: i0 });
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatCheckboxTbFilterDirective, decorators: [{
274
+ type: Directive,
275
+ args: [{
276
+ selector: 'mat-checkbox[tbCustomFilter]',
277
+ inputs: [
278
+ ...inputs
279
+ ],
280
+ providers: [{ provide: TableCustomFilterDirective, useExisting: MatCheckboxTbFilterDirective }]
281
+ }]
282
+ }], ctorParameters: function () { return [{ type: i4.MatCheckbox }, { type: i2.TableWrapperDirective, decorators: [{
283
+ type: Optional
284
+ }] }]; } });
285
+ export class MatSlideToggleTbFilterDirective extends TbSelectedFilterDirective {
286
+ constructor(matSlideToggle, wrapper) {
287
+ super(matSlideToggle.change, () => matSlideToggle.checked, wrapper);
288
+ this.matSlideToggle = matSlideToggle;
289
+ }
290
+ set active(val) {
291
+ this.matSlideToggle.checked = val;
292
+ super.active = val;
293
+ }
294
+ ngOnInit() {
295
+ super.ngOnInit();
296
+ }
297
+ }
298
+ MatSlideToggleTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatSlideToggleTbFilterDirective, deps: [{ token: i5.MatSlideToggle }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
299
+ MatSlideToggleTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatSlideToggleTbFilterDirective, selector: "mat-slide-toggle[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatSlideToggleTbFilterDirective }], usesInheritance: true, ngImport: i0 });
300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatSlideToggleTbFilterDirective, decorators: [{
301
+ type: Directive,
302
+ args: [{
303
+ selector: 'mat-slide-toggle[tbCustomFilter]',
304
+ inputs: [
305
+ ...inputs
306
+ ],
307
+ providers: [{ provide: TableCustomFilterDirective, useExisting: MatSlideToggleTbFilterDirective }]
308
+ }]
309
+ }], ctorParameters: function () { return [{ type: i5.MatSlideToggle }, { type: i2.TableWrapperDirective, decorators: [{
310
+ type: Optional
311
+ }] }]; } });
312
+ // Radio button
313
+ export class MatRadioButtonTbFilterDirective extends TbSelectedFilterDirective {
314
+ constructor(matRadioButton, wrapper) {
315
+ super(matRadioButton.change, () => matRadioButton.checked, wrapper);
316
+ this.matRadioButton = matRadioButton;
317
+ }
318
+ set active(val) {
319
+ this.matRadioButton.checked = val;
320
+ super.active = val;
321
+ }
322
+ ngOnInit() {
323
+ super.ngOnInit();
324
+ }
325
+ }
326
+ MatRadioButtonTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatRadioButtonTbFilterDirective, deps: [{ token: i6.MatRadioButton }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
327
+ MatRadioButtonTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatRadioButtonTbFilterDirective, selector: "mat-radio-button[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"] }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatRadioButtonTbFilterDirective }], usesInheritance: true, ngImport: i0 });
328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatRadioButtonTbFilterDirective, decorators: [{
329
+ type: Directive,
330
+ args: [{
331
+ selector: 'mat-radio-button[tbCustomFilter]',
332
+ inputs: ['predicate: tbCustomFilter'],
333
+ providers: [{ provide: TableCustomFilterDirective, useExisting: MatRadioButtonTbFilterDirective }]
334
+ }]
335
+ }], ctorParameters: function () { return [{ type: i6.MatRadioButton }, { type: i2.TableWrapperDirective, decorators: [{
336
+ type: Optional
337
+ }] }]; } });
338
+ // Option (select)
339
+ export class MatOptionTbFilterDirective extends TbSelectedFilterDirective {
340
+ constructor(matOption, wrapper) {
341
+ super(matOption.onSelectionChange.pipe(tap(d => {
342
+ if (!matOption.value) {
343
+ matOption.value = uuid();
344
+ }
345
+ })), () => matOption.selected, wrapper);
346
+ this.matOption = matOption;
347
+ }
348
+ set active(val) {
349
+ if (val) {
350
+ this.matOption.select();
351
+ }
352
+ else {
353
+ this.matOption.deselect();
354
+ }
355
+ super.active = val;
356
+ }
357
+ ngOnInit() {
358
+ super.ngOnInit();
359
+ }
360
+ }
361
+ MatOptionTbFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatOptionTbFilterDirective, deps: [{ token: i7.MatOption }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
362
+ MatOptionTbFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatOptionTbFilterDirective, selector: "mat-option[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatOptionTbFilterDirective }], usesInheritance: true, ngImport: i0 });
363
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatOptionTbFilterDirective, decorators: [{
364
+ type: Directive,
365
+ args: [{
366
+ selector: 'mat-option[tbCustomFilter]',
367
+ inputs: [
368
+ ...inputs
369
+ ],
370
+ providers: [{ provide: TableCustomFilterDirective, useExisting: MatOptionTbFilterDirective }]
371
+ }]
372
+ }], ctorParameters: function () { return [{ type: i7.MatOption }, { type: i2.TableWrapperDirective, decorators: [{
373
+ type: Optional
374
+ }] }]; } });
375
+ // Button toggle
376
+ export class MatButtonToggleFilterDirective extends TbSelectedFilterDirective {
377
+ constructor(matButtonToggle, wrapper) {
378
+ super(matButtonToggle.change, () => matButtonToggle.checked, wrapper);
379
+ this.matButtonToggle = matButtonToggle;
380
+ }
381
+ set active(val) {
382
+ this.matButtonToggle.checked = val;
383
+ super.active = val;
384
+ }
385
+ ngOnInit() {
386
+ super.ngOnInit();
387
+ }
388
+ }
389
+ MatButtonToggleFilterDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatButtonToggleFilterDirective, deps: [{ token: i8.MatButtonToggle }, { token: i2.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
390
+ MatButtonToggleFilterDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: MatButtonToggleFilterDirective, selector: "mat-button-toggle[tbCustomFilter]", inputs: { predicate: ["tbCustomFilter", "predicate"], filterId: "filterId" }, providers: [{ provide: TableCustomFilterDirective, useExisting: MatButtonToggleFilterDirective }], usesInheritance: true, ngImport: i0 });
391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: MatButtonToggleFilterDirective, decorators: [{
392
+ type: Directive,
393
+ args: [{
394
+ selector: 'mat-button-toggle[tbCustomFilter]',
395
+ inputs: [
396
+ ...inputs
397
+ ],
398
+ providers: [{ provide: TableCustomFilterDirective, useExisting: MatButtonToggleFilterDirective }]
399
+ }]
400
+ }], ctorParameters: function () { return [{ type: i8.MatButtonToggle }, { type: i2.TableWrapperDirective, decorators: [{
401
+ type: Optional
402
+ }] }]; } });
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGItZmlsdGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdXRpbGl0aWVzL3NyYy90YWJsZS1idWlsZGVyL2RpcmVjdGl2ZXMvdGItZmlsdGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFXLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0YsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7QUFLdkQsTUFBTSxNQUFNLEdBQUc7SUFDYiwyQkFBMkI7SUFDM0Isb0JBQW9CO0NBQ3JCLENBQUM7QUFNRixNQUFNLE9BQWdCLDBCQUEwQjtJQUhoRDtRQU1FLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEtBQUssQ0FBQztLQUdkOzt1SEFQcUIsMEJBQTBCOzJHQUExQiwwQkFBMEI7MkZBQTFCLDBCQUEwQjtrQkFIL0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsR0FBRztpQkFDZDs7QUFlRSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FBMEI7SUFFckUsWUFBbUMsS0FBZ0IsRUFBYyxPQUE4QjtRQUM3RixLQUFLLEVBQUUsQ0FBQztRQUR5QixVQUFLLEdBQUwsS0FBSyxDQUFXO1FBbUJuRCxZQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQU1iLFdBQU0s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U0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUNBQW1DO29CQUM3QyxNQUFNLEVBQUU7d0JBQ04sR0FBRyxNQUFNO3FCQUNWO29CQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFdBQVcsZ0NBQWdDLEVBQUUsQ0FBQztpQkFDbEc7OzBCQU13RCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgT3B0aW9uYWwsIFByZWRpY2F0ZSwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEN1c3RvbUZpbHRlciwgRmlsdGVySW5mbyB9IGZyb20gXCIuLi9jbGFzc2VzL2ZpbHRlci1pbmZvXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSBcIi4uL2VudW1zL2ZpbHRlclR5cGVzXCI7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGVcIjtcbmltcG9ydCB7IE1hdFJhZGlvQnV0dG9uIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3JhZGlvXCI7XG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IE1hdENoZWNrYm94IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94XCI7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmXCI7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSBcIkBuZ3J4L2NvbXBvbmVudC1zdG9yZVwiO1xuaW1wb3J0IHsgVGFibGVXcmFwcGVyRGlyZWN0aXZlIH0gZnJvbSBcIi4vdGFibGUtd3JhcHBlci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE1hdE9wdGlvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XG5cblxuY29uc3QgaW5wdXRzID0gW1xuICAncHJlZGljYXRlOiB0YkN1c3RvbUZpbHRlcicsXG4gICdmaWx0ZXJJZDogZmlsdGVySWQnLFxuXTtcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICcgJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZTxUID0gYW55PiB7XG4gIGFic3RyYWN0IGZpbHRlciQgOiBPYnNlcnZhYmxlPEN1c3RvbUZpbHRlcj47XG4gIGZpbHRlcklkITogc3RyaW5nO1xuICBzYXZhYmxlID0gZmFsc2U7XG4gIHVzZWQgPSBmYWxzZTtcbiAgYWJzdHJhY3QgYWN0aXZlOiBib29sZWFuO1xuICBhYnN0cmFjdCByZXNldCgpOiB2b2lkO1xufVxuXG5cblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW3RiRmlsdGVyXVwiXG59KSBleHBvcnQgY2xhc3MgVGFibGVGaWx0ZXJEaXJlY3RpdmUgZXh0ZW5kcyBDb21wb25lbnRTdG9yZTxGaWx0ZXJJbmZvPiB7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkICBtb2RlbDogTmdDb250cm9sLCBAT3B0aW9uYWwoKSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmKHdyYXBwZXIpIHtcbiAgICAgIHdyYXBwZXIucmVnaXN0ZXIodGhpcyk7XG4gICAgfVxuICAgIGlmKG1vZGVsKSB7XG4gICAgICB0aGlzLmVmZmVjdCggKCkgPT4ge1xuICAgICAgICByZXR1cm4gbW9kZWwudmFsdWVDaGFuZ2VzIS5waXBlKFxuICAgICAgICAgIHRhcCggdmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIHJlc2V0KCkge1xuICAgIHRoaXMuZmlsdGVyVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgZmlsdGVyJCA9IHRoaXMuc3RhdGUkO1xuXG4gIEBJbnB1dCgpIGZpbHRlclR5cGUhOiBGaWx0ZXJUeXBlO1xuICBASW5wdXQoKSBrZXkhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpZWxkVHlwZSE6IEZpZWxkVHlwZTtcbiAgQElucHV0KCkgZmlsdGVySWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFjdGl2ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGZpbHRlclZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZih0aGlzLm1vZGVsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbC5yZXNldCh2YWx1ZSk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG5cbiAgdXNlZCA9IGZhbHNlO1xuICBzYXZhYmxlID0gZmFsc2U7XG4gIHJlYWR5ID0gZmFsc2U7XG5cbiAgX3VzZXJBY3RpdmUgPSB0cnVlO1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzICkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZighdGhpcy5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5maWx0ZXJJZCA9IHV1aWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRGaWx0ZXIoZmlsdGVyOiBGaWx0ZXJJbmZvICkge1xuICAgIHRoaXMuc2V0U3RhdGUoZmlsdGVyKTtcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgdGhpcy5zZXRGaWx0ZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBmaWx0ZXJJZDogdGhpcy5maWx0ZXJJZCxcbiAgICAgICAgICBrZXk6IHRoaXMua2V5LFxuICAgICAgICAgIGZpbHRlclR5cGU6IHRoaXMuZmlsdGVyVHlwZSxcbiAgICAgICAgICBmaWVsZFR5cGU6IHRoaXMuZmllbGRUeXBlLFxuICAgICAgICAgIGZpbHRlclZhbHVlOiB0aGlzLmZpbHRlclZhbHVlLFxuICAgICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmUgJiYgdGhpcy5maWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIF9pc0V4dGVybmFseU1hbmFnZWQ6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RiRmlsdGVyU3RyaW5nQ29udGFpbnNdJyxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IFRhYmxlRmlsdGVyU3RyaW5nQ29udGFpbnNEaXJlY3RpdmUgfV0sXG4gIGlucHV0czogW1xuICAgICdrZXk6dGJGaWx0ZXJTdHJpbmdDb250YWlucycsXG4gICAgJ2ZpbHRlclZhbHVlOmZpbHRlclZhbHVlJyxcbiAgICAnZmlsdGVySWQ6IGZpbHRlcklkJyxcbiAgICAnYWN0aXZlOiBhY3RpdmUnLFxuICBdXG59KSBleHBvcnQgY2xhc3MgVGFibGVGaWx0ZXJTdHJpbmdDb250YWluc0RpcmVjdGl2ZSBleHRlbmRzIFRhYmxlRmlsdGVyRGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgIG1vZGVsOiBOZ0NvbnRyb2wsIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xuICAgIHN1cGVyKG1vZGVsLHdyYXBwZXIpO1xuICAgIHRoaXMuZmlsdGVyVHlwZSA9IEZpbHRlclR5cGUuU3RyaW5nQ29udGFpbnM7XG4gICAgdGhpcy5maWVsZFR5cGUgPSBGaWVsZFR5cGUuU3RyaW5nO1xuICAgIHRoaXMuZWZmZWN0KCAoKSA9PiB7XG4gICAgICByZXR1cm4gbW9kZWwudmFsdWVDaGFuZ2VzIS5waXBlKFxuICAgICAgICB0YXAoIHZhbCA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBvdmVycmlkZSByZXNldCgpIHtcbiAgICBpZih0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsLnJlc2V0KCk7XG4gICAgfVxuICAgIHN1cGVyLnJlc2V0KCk7XG4gIH1cblxuICBvdmVycmlkZSBzZXRGaWx0ZXIoZmlsdGVyOiBGaWx0ZXJJbmZvKSB7XG4gICAgZmlsdGVyLmFjdGl2ZSA9IGZpbHRlci5maWx0ZXJWYWx1ZSAmJiB0aGlzLl91c2VyQWN0aXZlO1xuICAgIHN1cGVyLnNldEZpbHRlcihmaWx0ZXIpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbJ2FjdGl2ZSddKSB7XG4gICAgICB0aGlzLl91c2VyQWN0aXZlID0gY2hhbmdlc1snYWN0aXZlJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW3RiQ3VzdG9tRmlsdGVyXVwiLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZUJhc2U8VCA9IGFueT4gZXh0ZW5kcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZTxUPiB7XG5cbiAgZmlsdGVyJCEgOiBTdWJqZWN0PEN1c3RvbUZpbHRlcj47XG4gIGZpbHRlciE6IEN1c3RvbUZpbHRlcjtcbiAgQElucHV0KCkgZmlsdGVySWQhIDogc3RyaW5nO1xuXG4gIF9wcmVkaWNhdGUhOiBQcmVkaWNhdGU8VD47XG4gIEBJbnB1dCgndGJDdXN0b21GaWx0ZXInKSBzZXQgcHJlZGljYXRlKCB2YWw6IFByZWRpY2F0ZTxUPiApIHtcbiAgICB0aGlzLl9wcmVkaWNhdGUgPSB2YWw7XG4gICAgdGhpcy51cGRhdGUoe3ByZWRpY2F0ZTp2YWx9KTtcbiAgfVxuXG4gIF9hY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcmVhZHkgPSBmYWxzZTtcblxuICB1cGRhdGUodmFsOiBQYXJ0aWFsPEN1c3RvbUZpbHRlcj4gKSB7XG4gICAgaWYodGhpcy5yZWFkeSkge1xuICAgICAgdGhpcy5maWx0ZXIgPSB7Li4udGhpcy5maWx0ZXIsLi4udmFsfTtcbiAgICAgIHRoaXMuZmlsdGVyJC5uZXh0KHRoaXMuZmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWN0aXZlKHZhbDogYm9vbGVhbikge1xuICAgIGlmKHRoaXMuX2FjdGl2ZSAhPT0gdmFsKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSB2YWw7XG4gICAgICB0aGlzLnVwZGF0ZSh7YWN0aXZlOnZhbH0pO1xuICAgIH1cbiAgfVxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZighdGhpcy5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5maWx0ZXJJZCA9IHV1aWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZhYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlciA9IHtcbiAgICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUuQ3VzdG9tLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuZmlsdGVySWQsXG4gICAgICBhY3RpdmU6IHRoaXMuX2FjdGl2ZSxcbiAgICAgIHByZWRpY2F0ZTogdGhpcy5fcHJlZGljYXRlLFxuICAgIH07XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5maWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLmZpbHRlcik7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZTxUID0gYW55PiAgZXh0ZW5kcyBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZUJhc2U8VD4ge1xuXG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlOiBPYnNlcnZhYmxlPGFueT4sIHByaXZhdGUgaXNBY3RpdmU6ICgpID0+IGJvb2xlYW4sIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYod3JhcHBlcikge1xuICAgICAgd3JhcHBlci5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgZGVzdHJveVN1YmplY3QkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveVN1YmplY3QkLm5leHQoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuaXNBY3RpdmUoKTtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSkuc3Vic2NyaWJlKCAoKSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuaXNBY3RpdmUoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBDaGVja2JveFxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWF0LWNoZWNrYm94W3RiQ3VzdG9tRmlsdGVyXScsXG4gIGlucHV0czogW1xuICAgIC4uLmlucHV0c1xuICBdLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB1c2VFeGlzdGluZzogTWF0Q2hlY2tib3hUYkZpbHRlckRpcmVjdGl2ZSB9XVxufSlcbmV4cG9ydCBjbGFzcyBNYXRDaGVja2JveFRiRmlsdGVyRGlyZWN0aXZlIGV4dGVuZHMgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZSB7XG5cbiAgb3ZlcnJpZGUgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1hdENoZWNrYm94LmNoZWNrZWQgPSB2YWw7XG4gICAgc3VwZXIuYWN0aXZlID0gdmFsO1xuICB9XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF0Q2hlY2tib3g6IE1hdENoZWNrYm94LCBAT3B0aW9uYWwoKSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUpIHtcbiAgICBzdXBlcihtYXRDaGVja2JveC5jaGFuZ2UsICgpID0+IG1hdENoZWNrYm94LmNoZWNrZWQsIHdyYXBwZXIpO1xuICB9XG59XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWF0LXNsaWRlLXRvZ2dsZVt0YkN1c3RvbUZpbHRlcl0nLFxuICBpbnB1dHM6IFtcbiAgICAuLi5pbnB1dHNcbiAgXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IE1hdFNsaWRlVG9nZ2xlVGJGaWx0ZXJEaXJlY3RpdmUgfV1cbn0pXG5leHBvcnQgY2xhc3MgTWF0U2xpZGVUb2dnbGVUYkZpbHRlckRpcmVjdGl2ZTxUID0gYW55PiBleHRlbmRzIFRiU2VsZWN0ZWRGaWx0ZXJEaXJlY3RpdmU8VD4ge1xuICBvdmVycmlkZSBzZXQgYWN0aXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMubWF0U2xpZGVUb2dnbGUuY2hlY2tlZCA9IHZhbDtcbiAgICBzdXBlci5hY3RpdmUgPSB2YWw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRTbGlkZVRvZ2dsZTogTWF0U2xpZGVUb2dnbGUsIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xuICAgIHN1cGVyKG1hdFNsaWRlVG9nZ2xlLmNoYW5nZSwgKCkgPT4gbWF0U2xpZGVUb2dnbGUuY2hlY2tlZCx3cmFwcGVyKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cbn1cblxuLy8gUmFkaW8gYnV0dG9uXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdtYXQtcmFkaW8tYnV0dG9uW3RiQ3VzdG9tRmlsdGVyXScsXG4gIGlucHV0czogWydwcmVkaWNhdGU6IHRiQ3VzdG9tRmlsdGVyJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBNYXRSYWRpb0J1dHRvblRiRmlsdGVyRGlyZWN0aXZlIH1dXG59KVxuZXhwb3J0IGNsYXNzIE1hdFJhZGlvQnV0dG9uVGJGaWx0ZXJEaXJlY3RpdmUgZXh0ZW5kcyBUYlNlbGVjdGVkRmlsdGVyRGlyZWN0aXZlIHtcblxuICBvdmVycmlkZSBzZXQgYWN0aXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMubWF0UmFkaW9CdXR0b24uY2hlY2tlZCA9IHZhbDtcbiAgICBzdXBlci5hY3RpdmUgPSB2YWw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRSYWRpb0J1dHRvbjogTWF0UmFkaW9CdXR0b24sIEBPcHRpb25hbCgpIHdyYXBwZXI6IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSkge1xuICAgIHN1cGVyKG1hdFJhZGlvQnV0dG9uLmNoYW5nZSwgKCkgPT4gbWF0UmFkaW9CdXR0b24uY2hlY2tlZCwgd3JhcHBlcik7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG59XG5cbi8vIE9wdGlvbiAoc2VsZWN0KVxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWF0LW9wdGlvblt0YkN1c3RvbUZpbHRlcl0nLFxuICBpbnB1dHM6IFtcbiAgICAuLi5pbnB1dHNcbiAgXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgdXNlRXhpc3Rpbmc6IE1hdE9wdGlvblRiRmlsdGVyRGlyZWN0aXZlIH1dXG59KVxuZXhwb3J0IGNsYXNzIE1hdE9wdGlvblRiRmlsdGVyRGlyZWN0aXZlIGV4dGVuZHMgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZSB7XG5cbiAgb3ZlcnJpZGUgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZih2YWwpIHtcbiAgICAgIHRoaXMubWF0T3B0aW9uLnNlbGVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hdE9wdGlvbi5kZXNlbGVjdCgpO1xuICAgIH1cbiAgICBzdXBlci5hY3RpdmUgPSB2YWw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRPcHRpb246IE1hdE9wdGlvbiwgQE9wdGlvbmFsKCkgd3JhcHBlcjogVGFibGVXcmFwcGVyRGlyZWN0aXZlKSB7XG4gICAgc3VwZXIoIG1hdE9wdGlvbi5vblNlbGVjdGlvbkNoYW5nZS5waXBlKHRhcCggZCA9PiB7XG4gICAgICBpZighbWF0T3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG1hdE9wdGlvbi52YWx1ZSA9IHV1aWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICApKSwgKCkgPT4gbWF0T3B0aW9uLnNlbGVjdGVkLCB3cmFwcGVyKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHRvZ2dsZVxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWF0LWJ1dHRvbi10b2dnbGVbdGJDdXN0b21GaWx0ZXJdJyxcbiAgaW5wdXRzOiBbXG4gICAgLi4uaW5wdXRzXG4gIF0sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBNYXRCdXR0b25Ub2dnbGVGaWx0ZXJEaXJlY3RpdmUgfV1cbn0pXG5leHBvcnQgY2xhc3MgTWF0QnV0dG9uVG9nZ2xlRmlsdGVyRGlyZWN0aXZlIGV4dGVuZHMgVGJTZWxlY3RlZEZpbHRlckRpcmVjdGl2ZSB7XG4gIG92ZXJyaWRlIHNldCBhY3RpdmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5tYXRCdXR0b25Ub2dnbGUuY2hlY2tlZCA9IHZhbDtcbiAgICBzdXBlci5hY3RpdmUgPSB2YWw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXRCdXR0b25Ub2dnbGU6IE1hdEJ1dHRvblRvZ2dsZSwgQE9wdGlvbmFsKCkgd3JhcHBlcjogVGFibGVXcmFwcGVyRGlyZWN0aXZlKSB7XG4gICAgc3VwZXIobWF0QnV0dG9uVG9nZ2xlLmNoYW5nZSwgKCkgPT4gbWF0QnV0dG9uVG9nZ2xlLmNoZWNrZWQsd3JhcHBlcik7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG59XG4iXX0=