@3kles/kles-material-dynamicforms 14.0.4 → 14.0.6

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 (102) hide show
  1. package/README.md +24 -24
  2. package/esm2020/3kles-kles-material-dynamicforms.mjs +4 -4
  3. package/esm2020/lib/decorators/component.decorator.mjs +7 -7
  4. package/esm2020/lib/directive/dynamic-component.directive.mjs +44 -44
  5. package/esm2020/lib/directive/dynamic-field.directive.mjs +50 -50
  6. package/esm2020/lib/dynamic-form.component.mjs +287 -251
  7. package/esm2020/lib/enums/type.enum.mjs +19 -19
  8. package/esm2020/lib/fields/array.component.mjs +57 -57
  9. package/esm2020/lib/fields/badge.component.mjs +40 -40
  10. package/esm2020/lib/fields/button-form.component.mjs +44 -44
  11. package/esm2020/lib/fields/button-submit.component.mjs +38 -38
  12. package/esm2020/lib/fields/button-toogle-group.component.mjs +51 -51
  13. package/esm2020/lib/fields/buttonchecker-form.component.mjs +44 -44
  14. package/esm2020/lib/fields/buttonfile-form.component.mjs +42 -42
  15. package/esm2020/lib/fields/checkbox.component.mjs +50 -50
  16. package/esm2020/lib/fields/chip.component.mjs +41 -41
  17. package/esm2020/lib/fields/color.component.mjs +84 -84
  18. package/esm2020/lib/fields/date.component.mjs +52 -52
  19. package/esm2020/lib/fields/field.abstract.mjs +66 -66
  20. package/esm2020/lib/fields/group.component.mjs +48 -48
  21. package/esm2020/lib/fields/icon.component.mjs +28 -28
  22. package/esm2020/lib/fields/input.clearable.component.mjs +112 -112
  23. package/esm2020/lib/fields/input.component.mjs +158 -158
  24. package/esm2020/lib/fields/label.component.mjs +40 -40
  25. package/esm2020/lib/fields/line-break.component.mjs +23 -23
  26. package/esm2020/lib/fields/link.component.mjs +32 -32
  27. package/esm2020/lib/fields/list-field.component.mjs +114 -114
  28. package/esm2020/lib/fields/radio.component.mjs +49 -49
  29. package/esm2020/lib/fields/select.component.mjs +268 -211
  30. package/esm2020/lib/fields/select.search.component.mjs +357 -307
  31. package/esm2020/lib/fields/selection-list.component.mjs +63 -63
  32. package/esm2020/lib/fields/slide-toggle.component.mjs +43 -43
  33. package/esm2020/lib/fields/text.component.mjs +40 -40
  34. package/esm2020/lib/fields/textarea.component.mjs +56 -56
  35. package/esm2020/lib/forms/button-control.component.mjs +115 -115
  36. package/esm2020/lib/forms/buttonchecker-control.component.mjs +85 -85
  37. package/esm2020/lib/forms/buttonfile-control.component.mjs +118 -118
  38. package/esm2020/lib/interfaces/component.interface.mjs +2 -2
  39. package/esm2020/lib/interfaces/directive.interface.mjs +2 -2
  40. package/esm2020/lib/interfaces/field.config.interface.mjs +2 -2
  41. package/esm2020/lib/interfaces/field.interface.mjs +2 -2
  42. package/esm2020/lib/interfaces/validator.interface.mjs +2 -2
  43. package/esm2020/lib/kles-material-dynamicforms.module.mjs +196 -196
  44. package/esm2020/lib/matcher/form-error.matcher.mjs +16 -16
  45. package/esm2020/lib/modules/material.module.mjs +278 -278
  46. package/esm2020/lib/pipe/array.pipe.mjs +22 -22
  47. package/esm2020/lib/pipe/transform.pipe.mjs +27 -27
  48. package/esm2020/lib/validators/autocomplete.validator.mjs +23 -23
  49. package/esm2020/public-api.mjs +59 -59
  50. package/fesm2015/3kles-kles-material-dynamicforms.mjs +2843 -2705
  51. package/fesm2015/3kles-kles-material-dynamicforms.mjs.map +1 -1
  52. package/fesm2020/3kles-kles-material-dynamicforms.mjs +2839 -2701
  53. package/fesm2020/3kles-kles-material-dynamicforms.mjs.map +1 -1
  54. package/index.d.ts +5 -5
  55. package/lib/decorators/component.decorator.d.ts +8 -8
  56. package/lib/directive/dynamic-component.directive.d.ts +16 -16
  57. package/lib/directive/dynamic-field.directive.d.ts +18 -18
  58. package/lib/dynamic-form.component.d.ts +32 -31
  59. package/lib/enums/type.enum.d.ts +17 -17
  60. package/lib/fields/array.component.d.ts +11 -11
  61. package/lib/fields/badge.component.d.ts +9 -9
  62. package/lib/fields/button-form.component.d.ts +9 -9
  63. package/lib/fields/button-submit.component.d.ts +9 -9
  64. package/lib/fields/button-toogle-group.component.d.ts +11 -11
  65. package/lib/fields/buttonchecker-form.component.d.ts +9 -9
  66. package/lib/fields/buttonfile-form.component.d.ts +9 -9
  67. package/lib/fields/checkbox.component.d.ts +9 -9
  68. package/lib/fields/chip.component.d.ts +9 -9
  69. package/lib/fields/color.component.d.ts +10 -10
  70. package/lib/fields/date.component.d.ts +9 -9
  71. package/lib/fields/field.abstract.d.ts +21 -21
  72. package/lib/fields/group.component.d.ts +11 -11
  73. package/lib/fields/icon.component.d.ts +9 -9
  74. package/lib/fields/input.clearable.component.d.ts +8 -8
  75. package/lib/fields/input.component.d.ts +15 -15
  76. package/lib/fields/label.component.d.ts +9 -9
  77. package/lib/fields/line-break.component.d.ts +9 -9
  78. package/lib/fields/link.component.d.ts +9 -9
  79. package/lib/fields/list-field.component.d.ts +19 -19
  80. package/lib/fields/radio.component.d.ts +9 -9
  81. package/lib/fields/select.component.d.ts +20 -19
  82. package/lib/fields/select.search.component.d.ts +23 -22
  83. package/lib/fields/selection-list.component.d.ts +11 -11
  84. package/lib/fields/slide-toggle.component.d.ts +9 -9
  85. package/lib/fields/text.component.d.ts +9 -9
  86. package/lib/fields/textarea.component.d.ts +9 -9
  87. package/lib/forms/button-control.component.d.ts +36 -36
  88. package/lib/forms/buttonchecker-control.component.d.ts +14 -14
  89. package/lib/forms/buttonfile-control.component.d.ts +20 -20
  90. package/lib/interfaces/component.interface.d.ts +5 -5
  91. package/lib/interfaces/directive.interface.d.ts +3 -3
  92. package/lib/interfaces/field.config.interface.d.ts +59 -58
  93. package/lib/interfaces/field.interface.d.ts +7 -7
  94. package/lib/interfaces/validator.interface.d.ts +5 -5
  95. package/lib/kles-material-dynamicforms.module.d.ts +56 -56
  96. package/lib/matcher/form-error.matcher.d.ts +9 -9
  97. package/lib/modules/material.module.d.ts +42 -42
  98. package/lib/pipe/array.pipe.d.ts +7 -7
  99. package/lib/pipe/transform.pipe.d.ts +10 -10
  100. package/lib/validators/autocomplete.validator.d.ts +3 -3
  101. package/package.json +1 -3
  102. package/public-api.d.ts +54 -54
@@ -1,307 +1,357 @@
1
- import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
2
- import { Component, ViewChild, ViewChildren } from '@angular/core';
3
- import { UntypedFormControl } from '@angular/forms';
4
- import { MatOption } from '@angular/material/core';
5
- import { Observable, of, ReplaySubject } from 'rxjs';
6
- import { map, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
7
- import { KlesFieldAbstract } from './field.abstract';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "@angular/forms";
11
- import * as i3 from "@angular/flex-layout/extended";
12
- import * as i4 from "@angular/material/form-field";
13
- import * as i5 from "@angular/material/select";
14
- import * as i6 from "@angular/material/core";
15
- import * as i7 from "@angular/material/tooltip";
16
- import * as i8 from "@angular/material/checkbox";
17
- import * as i9 from "@angular/cdk/scrolling";
18
- import * as i10 from "ngx-mat-select-search";
19
- import * as i11 from "../directive/dynamic-component.directive";
20
- import * as i12 from "@ngx-translate/core";
21
- import * as i13 from "../pipe/transform.pipe";
22
- export class KlesFormSelectSearchComponent extends KlesFieldAbstract {
23
- constructor() {
24
- super(...arguments);
25
- this.searchControl = new UntypedFormControl();
26
- this.selectAllControl = new UntypedFormControl(false);
27
- this.optionsFiltered$ = new ReplaySubject(1);
28
- this.compareFn = (o1, o2) => {
29
- if (this.field.property && o1 && o2) {
30
- return o1[this.field.property] === o2[this.field.property];
31
- }
32
- return o1 === o2;
33
- };
34
- }
35
- ngOnInit() {
36
- super.ngOnInit();
37
- if (!(this.field.options instanceof Observable)) {
38
- this.options$ = of(this.field.options);
39
- }
40
- else {
41
- this.options$ = this.field.options;
42
- }
43
- this.searchControl.valueChanges.pipe(startWith(this.searchControl.value), takeUntil(this._onDestroy), switchMap(value => {
44
- if (value) {
45
- const search = value.toLowerCase();
46
- return this.options$.pipe(map(options => {
47
- return options
48
- .filter(option => {
49
- if (this.field.searchKeys && this.field.searchKeys.length) {
50
- return this.field.searchKeys.some(searchKey => {
51
- if (option[searchKey]) {
52
- return option[searchKey].toString().toLowerCase().indexOf(search) > -1;
53
- }
54
- return false;
55
- }) || (this.field.property ?
56
- option[this.field.property].toString().toLowerCase().indexOf(search) > -1 : false);
57
- }
58
- else {
59
- if (this.field.property) {
60
- return option[this.field.property].toString().toLowerCase().indexOf(search) > -1;
61
- }
62
- }
63
- return option.toString().toLowerCase().indexOf(search) > -1;
64
- });
65
- }));
66
- }
67
- else {
68
- return this.options$;
69
- }
70
- })).subscribe(this.optionsFiltered$);
71
- this.group.controls[this.field.name]
72
- .valueChanges.pipe(takeUntil(this._onDestroy), startWith(this.group.controls[this.field.name].value), switchMap(selected => {
73
- return this.optionsFiltered$.pipe(map((options) => options.filter((option) => !option?.disabled)), map(options => {
74
- if (!selected) {
75
- return false;
76
- }
77
- if (options.length < selected.length) {
78
- return options.length > 0 && options.every(o => selected.includes(o));
79
- }
80
- else {
81
- return options.length > 0 && options.length === selected.length && selected.every(s => options.includes(s));
82
- }
83
- }));
84
- })).subscribe(isChecked => {
85
- this.selectAllControl.setValue(isChecked);
86
- });
87
- }
88
- ngOnDestroy() {
89
- // this._onDestroy.next();
90
- super.ngOnDestroy();
91
- }
92
- toggleAllSelection(state) {
93
- if (state.checked) {
94
- this.optionsFiltered$.pipe(take(1), map((options) => options.filter((option) => !option?.disabled))).subscribe(options => {
95
- if (options.length > 0) {
96
- this.group.controls[this.field.name].patchValue(options.slice());
97
- }
98
- });
99
- }
100
- else {
101
- this.group.controls[this.field.name].patchValue([]);
102
- }
103
- }
104
- openChange($event) {
105
- if (this.field.virtualScroll) {
106
- if ($event) {
107
- this.cdkVirtualScrollViewport.scrollToIndex(0);
108
- this.cdkVirtualScrollViewport.checkViewportSize();
109
- }
110
- }
111
- }
112
- }
113
- KlesFormSelectSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: KlesFormSelectSearchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
114
- KlesFormSelectSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: KlesFormSelectSearchComponent, selector: "kles-form-select-search", viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "options", predicate: MatOption, descendants: true }], usesInheritance: true, ngImport: i0, template: `
115
- <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
116
- <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id" [ngClass]="field.ngClass"
117
- (openedChange)="openChange($event)" [compareWith]="compareFn"
118
- [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
119
- <mat-select-trigger *ngIf="field.triggerComponent">
120
- <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
121
- </mat-select-trigger>
122
-
123
- <ng-container *ngIf="field.virtualScroll">
124
- <mat-option>
125
- <ngx-mat-select-search [formControl]="searchControl"
126
- placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
127
- </mat-option>
128
-
129
- <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=4*48>
130
- <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
131
- (change)="toggleAllSelection($event)">
132
- {{'selectAll' | translate}}
133
- </mat-checkbox>
134
- <ng-container *ngIf="!field.autocompleteComponent">
135
- <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
136
-
137
- <ng-container *ngIf="field.multiple">
138
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
139
- style="display:none">
140
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
141
- </mat-option>
142
- </ng-container>
143
-
144
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
145
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
146
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
147
- </mat-option>
148
- </ng-container>
149
- </ng-container>
150
-
151
- <ng-container *ngIf="field.autocompleteComponent">
152
- <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
153
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
154
- </mat-option>
155
-
156
- <ng-container *ngIf="field.multiple">
157
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
158
- style="display:none">
159
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
160
- </mat-option>
161
- </ng-container>
162
-
163
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
164
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
165
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
166
- </mat-option>
167
- </ng-container>
168
- </ng-container>
169
- </cdk-virtual-scroll-viewport>
170
-
171
- </ng-container>
172
-
173
- <ng-container *ngIf="!field.virtualScroll">
174
-
175
- <mat-option>
176
- <ngx-mat-select-search [formControl]="searchControl"
177
- placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
178
- </mat-option>
179
-
180
- <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
181
- (change)="toggleAllSelection($event)">
182
- {{'selectAll' | translate}}
183
- </mat-checkbox>
184
-
185
- <ng-container *ngIf="!field.autocompleteComponent">
186
- <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
187
- </ng-container>
188
-
189
- <ng-container *ngIf="field.autocompleteComponent">
190
- <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
191
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
192
- </mat-option>
193
- </ng-container>
194
- </ng-container>
195
-
196
-
197
- </mat-select>
198
- <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
199
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
200
- </ng-container>
201
- <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
202
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
203
- </ng-container>
204
- </mat-form-field>
205
- `, isInline: true, styles: ["mat-form-field{width:100%}\n", ".selectAll{padding:10px 16px}\n"], 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i5.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i9.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i9.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i9.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i10.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "noEntriesFoundLabel", "indexAndLengthScreenReaderText", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toogleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"] }, { kind: "directive", type: i11.KlesComponentDirective, selector: "[klesComponent]", inputs: ["component", "value", "field"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.KlesTransformPipe, name: "klesTransform" }] });
206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: KlesFormSelectSearchComponent, decorators: [{
207
- type: Component,
208
- args: [{ selector: 'kles-form-select-search', template: `
209
- <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
210
- <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id" [ngClass]="field.ngClass"
211
- (openedChange)="openChange($event)" [compareWith]="compareFn"
212
- [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
213
- <mat-select-trigger *ngIf="field.triggerComponent">
214
- <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
215
- </mat-select-trigger>
216
-
217
- <ng-container *ngIf="field.virtualScroll">
218
- <mat-option>
219
- <ngx-mat-select-search [formControl]="searchControl"
220
- placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
221
- </mat-option>
222
-
223
- <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=4*48>
224
- <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
225
- (change)="toggleAllSelection($event)">
226
- {{'selectAll' | translate}}
227
- </mat-checkbox>
228
- <ng-container *ngIf="!field.autocompleteComponent">
229
- <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
230
-
231
- <ng-container *ngIf="field.multiple">
232
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
233
- style="display:none">
234
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
235
- </mat-option>
236
- </ng-container>
237
-
238
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
239
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
240
- {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
241
- </mat-option>
242
- </ng-container>
243
- </ng-container>
244
-
245
- <ng-container *ngIf="field.autocompleteComponent">
246
- <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
247
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
248
- </mat-option>
249
-
250
- <ng-container *ngIf="field.multiple">
251
- <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
252
- style="display:none">
253
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
254
- </mat-option>
255
- </ng-container>
256
-
257
- <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
258
- <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
259
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
260
- </mat-option>
261
- </ng-container>
262
- </ng-container>
263
- </cdk-virtual-scroll-viewport>
264
-
265
- </ng-container>
266
-
267
- <ng-container *ngIf="!field.virtualScroll">
268
-
269
- <mat-option>
270
- <ngx-mat-select-search [formControl]="searchControl"
271
- placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
272
- </mat-option>
273
-
274
- <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
275
- (change)="toggleAllSelection($event)">
276
- {{'selectAll' | translate}}
277
- </mat-checkbox>
278
-
279
- <ng-container *ngIf="!field.autocompleteComponent">
280
- <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
281
- </ng-container>
282
-
283
- <ng-container *ngIf="field.autocompleteComponent">
284
- <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
285
- <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
286
- </mat-option>
287
- </ng-container>
288
- </ng-container>
289
-
290
-
291
- </mat-select>
292
- <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
293
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
294
- </ng-container>
295
- <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
296
- <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
297
- </ng-container>
298
- </mat-form-field>
299
- `, styles: ["mat-form-field{width:100%}\n", ".selectAll{padding:10px 16px}\n"] }]
300
- }], propDecorators: { cdkVirtualScrollViewport: [{
301
- type: ViewChild,
302
- args: [CdkVirtualScrollViewport]
303
- }], options: [{
304
- type: ViewChildren,
305
- args: [MatOption]
306
- }] } });
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LnNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rbGVzLW1hdGVyaWFsLWR5bmFtaWNmb3Jtcy9zcmMvbGliL2ZpZWxkcy9zZWxlY3Quc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFnQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBa0dyRCxNQUFNLE9BQU8sNkJBQThCLFNBQVEsaUJBQWlCO0lBaEdwRTs7UUFrR0ksa0JBQWEsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDekMscUJBQWdCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUlqRCxxQkFBZ0IsR0FBRyxJQUFJLGFBQWEsQ0FBUSxDQUFDLENBQUMsQ0FBQztRQW1HL0MsY0FBUyxHQUFHLENBQUMsRUFBTyxFQUFFLEVBQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDakMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5RDtZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUE7S0FDSjtJQWxHRyxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUMxQixTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDZCxJQUFJLEtBQUssRUFBRTtnQkFDUCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNwQyxPQUFPLE9BQU87eUJBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUNiLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFOzRCQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQ0FDMUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7b0NBQ25CLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQ0FDMUU7Z0NBQ0QsT0FBTyxLQUFLLENBQUM7NEJBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFFMUY7NkJBQU07NEJBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQ0FDckIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkJBQ3BGO3lCQUNKO3dCQUNELE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNQO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN4QjtRQUNMLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQy9CLFlBQVksQ0FBQyxJQUFJLENBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFDMUIsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ3JELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFDL0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ1gsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUNsQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pFO3FCQUFNO29CQUNILE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9HO1lBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsV0FBVztRQUNQLDBCQUEwQjtRQUMxQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUdELGtCQUFrQixDQUFDLEtBQUs7UUFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNySCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDcEU7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUVOO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBZTtRQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzFCLElBQUksTUFBTSxFQUFFO2dCQUNSLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3JEO1NBQ0o7SUFDTCxDQUFDOzswSEF4R1EsNkJBQTZCOzhHQUE3Qiw2QkFBNkIseUhBVzNCLHdCQUF3Qiw2REFDckIsU0FBUyx1RUExR2I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyRmI7MkZBR1ksNkJBQTZCO2tCQWhHekMsU0FBUzsrQkFDSSx5QkFBeUIsWUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyRmI7OEJBY3dDLHdCQUF3QjtzQkFBNUQsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBQ1YsT0FBTztzQkFBL0IsWUFBWTt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRPcHRpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBLbGVzRmllbGRBYnN0cmFjdCB9IGZyb20gJy4vZmllbGQuYWJzdHJhY3QnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2tsZXMtZm9ybS1zZWxlY3Qtc2VhcmNoJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXJnaW4tdG9wXCIgW2NvbG9yXT1cImZpZWxkLmNvbG9yXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IG1hdFRvb2x0aXA9XCJ7e2ZpZWxkLnRvb2x0aXB9fVwiIFthdHRyLmlkXT1cImZpZWxkLmlkXCIgW25nQ2xhc3NdPVwiZmllbGQubmdDbGFzc1wiXHJcbiAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvcGVuQ2hhbmdlKCRldmVudClcIiBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGlwbGVcIj5cclxuICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyICpuZ0lmPVwiZmllbGQudHJpZ2dlckNvbXBvbmVudFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC50cmlnZ2VyQ29tcG9uZW50XCIgW3ZhbHVlXT1cImdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC52aXJ0dWFsU2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG5neC1tYXQtc2VsZWN0LXNlYXJjaCBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlckxhYmVsPVwiXCIgbm9FbnRyaWVzRm91bmRMYWJlbCA9XCJcIj48L25neC1tYXQtc2VsZWN0LXNlYXJjaD5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cImZpZWxkLml0ZW1TaXplIHx8IDUwXCIgW3N0eWxlLmhlaWdodC5weF09NCo0OD5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJmaWVsZC5tdWx0aXBsZVwiIGNsYXNzPVwic2VsZWN0QWxsXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdEFsbENvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J3NlbGVjdEFsbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpjZGtWaXJ0dWFsRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uc0ZpbHRlcmVkJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbT8uZGlzYWJsZWRcIj57eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWUgfCBzbGljZTowOjMwXCIgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLm11bHRpcGxlICYmIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtncm91cD8uY29udHJvbHNbZmllbGQubmFtZV0/LnZhbHVlXVwiIFt2YWx1ZV09XCJpdGVtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNGaWx0ZXJlZCQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiIFt2YWx1ZV09XCJpdGVtXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWUgfCBzbGljZTowOjMwXCIgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQubXVsdGlwbGUgJiYgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgW2dyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXT8udmFsdWVdXCIgW3ZhbHVlXT1cIml0ZW1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC52aXJ0dWFsU2Nyb2xsXCI+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG5neC1tYXQtc2VsZWN0LXNlYXJjaCBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlckxhYmVsPVwiXCIgbm9FbnRyaWVzRm91bmRMYWJlbCA9XCJcIj48L25neC1tYXQtc2VsZWN0LXNlYXJjaD5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cImZpZWxkLm11bHRpcGxlXCIgY2xhc3M9XCJzZWxlY3RBbGxcIiBbZm9ybUNvbnRyb2xdPVwic2VsZWN0QWxsQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J3NlbGVjdEFsbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zRmlsdGVyZWQkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtPy5kaXNhYmxlZFwiPnt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNGaWx0ZXJlZCQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucztcIiBuZ1Byb2plY3RBcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdyb3VwLmdldChmaWVsZC5uYW1lKS5oYXNFcnJvcih2YWxpZGF0aW9uLm5hbWUpXCI+e3t2YWxpZGF0aW9uLm1lc3NhZ2UgfCB0cmFuc2xhdGV9fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvbiBvZiBmaWVsZC5hc3luY1ZhbGlkYXRpb25zO1wiIG5nUHJvamVjdEFzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ3JvdXAuZ2V0KGZpZWxkLm5hbWUpLmhhc0Vycm9yKHZhbGlkYXRpb24ubmFtZSlcIj57e3ZhbGlkYXRpb24ubWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuYCxcclxuICAgIHN0eWxlczogWydtYXQtZm9ybS1maWVsZCB7d2lkdGg6IGNhbGMoMTAwJSl9JywgJy5zZWxlY3RBbGwge3BhZGRpbmc6IDEwcHggMTZweDt9J11cclxufSlcclxuZXhwb3J0IGNsYXNzIEtsZXNGb3JtU2VsZWN0U2VhcmNoQ29tcG9uZW50IGV4dGVuZHMgS2xlc0ZpZWxkQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgc2VhcmNoQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICAgIHNlbGVjdEFsbENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZhbHNlKTtcclxuXHJcblxyXG4gICAgb3B0aW9ucyQ6IE9ic2VydmFibGU8YW55W10+O1xyXG4gICAgb3B0aW9uc0ZpbHRlcmVkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueVtdPigxKTtcclxuXHJcbiAgICAvLyBwcml2YXRlIF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuICAgIEBWaWV3Q2hpbGRyZW4oTWF0T3B0aW9uKSBvcHRpb25zOiBRdWVyeUxpc3Q8TWF0T3B0aW9uPjtcclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICBpZiAoISh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gb2YodGhpcy5maWVsZC5vcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5maWVsZC5vcHRpb25zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICAgICAgICBzdGFydFdpdGgodGhpcy5zZWFyY2hDb250cm9sLnZhbHVlKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2ggPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMkLnBpcGUobWFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihvcHRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLnNlYXJjaEtleXMgJiYgdGhpcy5maWVsZC5zZWFyY2hLZXlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5zZWFyY2hLZXlzLnNvbWUoc2VhcmNoS2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25bc2VhcmNoS2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25bc2VhcmNoS2V5XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2gpID4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICh0aGlzLmZpZWxkLnByb3BlcnR5ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblt0aGlzLmZpZWxkLnByb3BlcnR5XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2gpID4gLTEgOiBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLnByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uW3RoaXMuZmllbGQucHJvcGVydHldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaCkgPiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaCkgPiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5zdWJzY3JpYmUodGhpcy5vcHRpb25zRmlsdGVyZWQkKTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLmZpZWxkLm5hbWVdXHJcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoc2VsZWN0ZWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNGaWx0ZXJlZCQucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChvcHRpb25zKSA9PiBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uPy5kaXNhYmxlZCkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAob3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoIDwgc2VsZWN0ZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KG8gPT4gc2VsZWN0ZWQuaW5jbHVkZXMobykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMubGVuZ3RoID09PSBzZWxlY3RlZC5sZW5ndGggJiYgc2VsZWN0ZWQuZXZlcnkocyA9PiBvcHRpb25zLmluY2x1ZGVzKHMpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoaXNDaGVja2VkID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ29udHJvbC5zZXRWYWx1ZShpc0NoZWNrZWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRvZ2dsZUFsbFNlbGVjdGlvbihzdGF0ZSkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0ZpbHRlcmVkJC5waXBlKHRha2UoMSksIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbj8uZGlzYWJsZWQpKSkuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS5wYXRjaFZhbHVlKG9wdGlvbnMuc2xpY2UoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0ucGF0Y2hWYWx1ZShbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5DaGFuZ2UoJGV2ZW50OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGQudmlydHVhbFNjcm9sbCkge1xyXG4gICAgICAgICAgICBpZiAoJGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUb0luZGV4KDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wYXJlRm4gPSAobzE6IGFueSwgbzI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkLnByb3BlcnR5ICYmIG8xICYmIG8yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvMVt0aGlzLmZpZWxkLnByb3BlcnR5XSA9PT0gbzJbdGhpcy5maWVsZC5wcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvMSA9PT0gbzI7XHJcbiAgICB9XHJcbn1cclxuIl19
1
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
2
+ import { Component, ViewChild, ViewChildren } from '@angular/core';
3
+ import { UntypedFormControl } from '@angular/forms';
4
+ import { MatOption } from '@angular/material/core';
5
+ import { BehaviorSubject, Observable, of, ReplaySubject } from 'rxjs';
6
+ import { map, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
7
+ import { KlesFieldAbstract } from './field.abstract';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "@angular/flex-layout/flex";
12
+ import * as i4 from "@angular/flex-layout/extended";
13
+ import * as i5 from "@angular/material/form-field";
14
+ import * as i6 from "@angular/material/select";
15
+ import * as i7 from "@angular/material/core";
16
+ import * as i8 from "@angular/material/tooltip";
17
+ import * as i9 from "@angular/material/progress-spinner";
18
+ import * as i10 from "@angular/material/checkbox";
19
+ import * as i11 from "@angular/cdk/scrolling";
20
+ import * as i12 from "ngx-mat-select-search";
21
+ import * as i13 from "../directive/dynamic-component.directive";
22
+ import * as i14 from "@ngx-translate/core";
23
+ import * as i15 from "../pipe/transform.pipe";
24
+ export class KlesFormSelectSearchComponent extends KlesFieldAbstract {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.searchControl = new UntypedFormControl();
28
+ this.selectAllControl = new UntypedFormControl(false);
29
+ this.isLoading = false;
30
+ this.optionsFiltered$ = new ReplaySubject(1);
31
+ this.compareFn = (o1, o2) => {
32
+ if (this.field.property && o1 && o2) {
33
+ return o1[this.field.property] === o2[this.field.property];
34
+ }
35
+ return o1 === o2;
36
+ };
37
+ }
38
+ ngOnInit() {
39
+ super.ngOnInit();
40
+ if (this.field.lazy) {
41
+ this.isLoading = true;
42
+ if (this.field.value) {
43
+ this.options$ = new BehaviorSubject(Array.isArray(this.field.value) ? this.field.value : [this.field.value]);
44
+ }
45
+ else {
46
+ this.options$ = new BehaviorSubject(null);
47
+ }
48
+ }
49
+ else {
50
+ if (!(this.field.options instanceof Observable)) {
51
+ this.options$ = of(this.field.options);
52
+ }
53
+ else {
54
+ this.options$ = this.field.options;
55
+ }
56
+ }
57
+ this.searchControl.valueChanges.pipe(startWith(this.searchControl.value), takeUntil(this._onDestroy), switchMap(value => {
58
+ if (value) {
59
+ const search = value.toLowerCase();
60
+ return this.options$.pipe(map(options => {
61
+ return options
62
+ .filter(option => {
63
+ if (this.field.searchKeys && this.field.searchKeys.length) {
64
+ return this.field.searchKeys.some(searchKey => {
65
+ if (option[searchKey]) {
66
+ return option[searchKey].toString().toLowerCase().indexOf(search) > -1;
67
+ }
68
+ return false;
69
+ }) || (this.field.property ?
70
+ option[this.field.property].toString().toLowerCase().indexOf(search) > -1 : false);
71
+ }
72
+ else {
73
+ if (this.field.property) {
74
+ return option[this.field.property].toString().toLowerCase().indexOf(search) > -1;
75
+ }
76
+ }
77
+ return option.toString().toLowerCase().indexOf(search) > -1;
78
+ });
79
+ }));
80
+ }
81
+ else {
82
+ return this.options$;
83
+ }
84
+ })).subscribe(this.optionsFiltered$);
85
+ this.group.controls[this.field.name]
86
+ .valueChanges.pipe(takeUntil(this._onDestroy), startWith(this.group.controls[this.field.name].value), switchMap(selected => {
87
+ return this.optionsFiltered$.pipe(map((options) => options?.filter((option) => !option?.disabled)), map(options => {
88
+ if (!selected) {
89
+ return false;
90
+ }
91
+ if (options.length < selected.length) {
92
+ return options.length > 0 && options.every(o => selected.includes(o));
93
+ }
94
+ else {
95
+ return options.length > 0 && options.length === selected.length && selected.every(s => options.includes(s));
96
+ }
97
+ }));
98
+ })).subscribe(isChecked => {
99
+ this.selectAllControl.setValue(isChecked);
100
+ });
101
+ }
102
+ ngOnDestroy() {
103
+ // this._onDestroy.next();
104
+ super.ngOnDestroy();
105
+ }
106
+ toggleAllSelection(state) {
107
+ if (state.checked) {
108
+ this.optionsFiltered$.pipe(take(1), map((options) => options.filter((option) => !option?.disabled))).subscribe(options => {
109
+ if (options.length > 0) {
110
+ this.group.controls[this.field.name].patchValue(options.slice());
111
+ }
112
+ });
113
+ }
114
+ else {
115
+ this.group.controls[this.field.name].patchValue([]);
116
+ }
117
+ }
118
+ openChange($event) {
119
+ if (this.field.lazy) {
120
+ if ($event) {
121
+ if (!(this.field.options instanceof Observable)) {
122
+ this.options$.next(this.field.options);
123
+ }
124
+ else {
125
+ this.isLoading = true;
126
+ this.field.options.pipe(take(1)).subscribe(options => {
127
+ this.options$.next(options);
128
+ this.isLoading = false;
129
+ });
130
+ }
131
+ }
132
+ }
133
+ if (this.field.virtualScroll) {
134
+ if ($event) {
135
+ this.cdkVirtualScrollViewport.scrollToIndex(0);
136
+ this.cdkVirtualScrollViewport.checkViewportSize();
137
+ }
138
+ }
139
+ }
140
+ }
141
+ KlesFormSelectSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: KlesFormSelectSearchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
142
+ KlesFormSelectSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: KlesFormSelectSearchComponent, selector: "kles-form-select-search", viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "options", predicate: MatOption, descendants: true }], usesInheritance: true, ngImport: i0, template: `
143
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
144
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id" [ngClass]="field.ngClass"
145
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
146
+ [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
147
+ <mat-select-trigger *ngIf="field.triggerComponent">
148
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
149
+ </mat-select-trigger>
150
+
151
+ <ng-container *ngIf="field.virtualScroll">
152
+ <mat-option>
153
+ <ngx-mat-select-search [formControl]="searchControl"
154
+ placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
155
+ </mat-option>
156
+
157
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=4*48>
158
+ <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
159
+ (change)="toggleAllSelection($event)">
160
+ {{'selectAll' | translate}}
161
+ </mat-checkbox>
162
+
163
+ <ng-container *ngIf="!isLoading; else emptyOption">
164
+ <ng-container *ngIf="!field.autocompleteComponent">
165
+ <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
166
+
167
+ <ng-container *ngIf="field.multiple">
168
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
169
+ style="display:none">
170
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
171
+ </mat-option>
172
+ </ng-container>
173
+
174
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
175
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
176
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
177
+ </mat-option>
178
+ </ng-container>
179
+ </ng-container>
180
+
181
+ <ng-container *ngIf="field.autocompleteComponent">
182
+ <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
183
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
184
+ </mat-option>
185
+
186
+ <ng-container *ngIf="field.multiple">
187
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
188
+ style="display:none">
189
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
190
+ </mat-option>
191
+ </ng-container>
192
+
193
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
194
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
195
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
196
+ </mat-option>
197
+ </ng-container>
198
+ </ng-container>
199
+ </ng-container>
200
+ <ng-template #emptyOption>
201
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
202
+ </ng-template>
203
+ </cdk-virtual-scroll-viewport>
204
+
205
+ </ng-container>
206
+
207
+ <ng-container *ngIf="!field.virtualScroll">
208
+ <mat-option>
209
+ <ngx-mat-select-search [formControl]="searchControl"
210
+ placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
211
+ </mat-option>
212
+
213
+ <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
214
+ (change)="toggleAllSelection($event)">
215
+ {{'selectAll' | translate}}
216
+ </mat-checkbox>
217
+
218
+ <ng-container *ngIf="!isLoading; else emptyOption">
219
+ <ng-container *ngIf="!field.autocompleteComponent">
220
+ <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
221
+ </ng-container>
222
+
223
+ <ng-container *ngIf="field.autocompleteComponent">
224
+ <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
225
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
226
+ </mat-option>
227
+ </ng-container>
228
+ </ng-container>
229
+
230
+ <ng-template #emptyOption>
231
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
232
+ </ng-template>
233
+ </ng-container>
234
+
235
+
236
+ </mat-select>
237
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
238
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
239
+ </ng-container>
240
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
241
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
242
+ </ng-container>
243
+ </mat-form-field>
244
+ `, isInline: true, styles: ["mat-form-field{width:100%}\n", ".selectAll{padding:10px 16px}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"], 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i6.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i11.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i11.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i11.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i12.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "noEntriesFoundLabel", "indexAndLengthScreenReaderText", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toogleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"] }, { kind: "directive", type: i13.KlesComponentDirective, selector: "[klesComponent]", inputs: ["component", "value", "field"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.KlesTransformPipe, name: "klesTransform" }] });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: KlesFormSelectSearchComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ selector: 'kles-form-select-search', template: `
248
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
249
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id" [ngClass]="field.ngClass"
250
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
251
+ [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
252
+ <mat-select-trigger *ngIf="field.triggerComponent">
253
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
254
+ </mat-select-trigger>
255
+
256
+ <ng-container *ngIf="field.virtualScroll">
257
+ <mat-option>
258
+ <ngx-mat-select-search [formControl]="searchControl"
259
+ placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
260
+ </mat-option>
261
+
262
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=4*48>
263
+ <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
264
+ (change)="toggleAllSelection($event)">
265
+ {{'selectAll' | translate}}
266
+ </mat-checkbox>
267
+
268
+ <ng-container *ngIf="!isLoading; else emptyOption">
269
+ <ng-container *ngIf="!field.autocompleteComponent">
270
+ <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
271
+
272
+ <ng-container *ngIf="field.multiple">
273
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
274
+ style="display:none">
275
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
276
+ </mat-option>
277
+ </ng-container>
278
+
279
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
280
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
281
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
282
+ </mat-option>
283
+ </ng-container>
284
+ </ng-container>
285
+
286
+ <ng-container *ngIf="field.autocompleteComponent">
287
+ <mat-option *cdkVirtualFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
288
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
289
+ </mat-option>
290
+
291
+ <ng-container *ngIf="field.multiple">
292
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
293
+ style="display:none">
294
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
295
+ </mat-option>
296
+ </ng-container>
297
+
298
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
299
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
300
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
301
+ </mat-option>
302
+ </ng-container>
303
+ </ng-container>
304
+ </ng-container>
305
+ <ng-template #emptyOption>
306
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
307
+ </ng-template>
308
+ </cdk-virtual-scroll-viewport>
309
+
310
+ </ng-container>
311
+
312
+ <ng-container *ngIf="!field.virtualScroll">
313
+ <mat-option>
314
+ <ngx-mat-select-search [formControl]="searchControl"
315
+ placeholderLabel="" noEntriesFoundLabel =""></ngx-mat-select-search>
316
+ </mat-option>
317
+
318
+ <mat-checkbox *ngIf="field.multiple" class="selectAll" [formControl]="selectAllControl"
319
+ (change)="toggleAllSelection($event)">
320
+ {{'selectAll' | translate}}
321
+ </mat-checkbox>
322
+
323
+ <ng-container *ngIf="!isLoading; else emptyOption">
324
+ <ng-container *ngIf="!field.autocompleteComponent">
325
+ <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
326
+ </ng-container>
327
+
328
+ <ng-container *ngIf="field.autocompleteComponent">
329
+ <mat-option *ngFor="let item of optionsFiltered$ | async" [value]="item" [disabled]="item?.disabled">
330
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
331
+ </mat-option>
332
+ </ng-container>
333
+ </ng-container>
334
+
335
+ <ng-template #emptyOption>
336
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
337
+ </ng-template>
338
+ </ng-container>
339
+
340
+
341
+ </mat-select>
342
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
343
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
344
+ </ng-container>
345
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
346
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
347
+ </ng-container>
348
+ </mat-form-field>
349
+ `, styles: ["mat-form-field{width:100%}\n", ".selectAll{padding:10px 16px}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"] }]
350
+ }], propDecorators: { cdkVirtualScrollViewport: [{
351
+ type: ViewChild,
352
+ args: [CdkVirtualScrollViewport]
353
+ }], options: [{
354
+ type: ViewChildren,
355
+ args: [MatOption]
356
+ }] } });
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LnNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rbGVzLW1hdGVyaWFsLWR5bmFtaWNmb3Jtcy9zcmMvbGliL2ZpZWxkcy9zZWxlY3Quc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsU0FBUyxFQUFnQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEdyRCxNQUFNLE9BQU8sNkJBQThCLFNBQVEsaUJBQWlCO0lBNUdwRTs7UUE4R0ksa0JBQWEsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDekMscUJBQWdCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2xCLHFCQUFnQixHQUFHLElBQUksYUFBYSxDQUFRLENBQUMsQ0FBQyxDQUFDO1FBMEgvQyxjQUFTLEdBQUcsQ0FBQyxFQUFPLEVBQUUsRUFBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxF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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXNHYjsyRkFJWSw2QkFBNkI7a0JBNUd6QyxTQUFTOytCQUNJLHlCQUF5QixZQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0diOzhCQWdCd0Msd0JBQXdCO3NCQUE1RCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFDVixPQUFPO3NCQUEvQixZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0T3B0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBLbGVzRmllbGRBYnN0cmFjdCB9IGZyb20gJy4vZmllbGQuYWJzdHJhY3QnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tsZXMtZm9ybS1zZWxlY3Qtc2VhcmNoJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hcmdpbi10b3BcIiBbY29sb3JdPVwiZmllbGQuY29sb3JcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gICAgICAgIDxtYXQtc2VsZWN0IG1hdFRvb2x0aXA9XCJ7e2ZpZWxkLnRvb2x0aXB9fVwiIFthdHRyLmlkXT1cImZpZWxkLmlkXCIgW25nQ2xhc3NdPVwiZmllbGQubmdDbGFzc1wiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib3BlbkNoYW5nZSgkZXZlbnQpXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFttdWx0aXBsZV09XCJmaWVsZC5tdWx0aXBsZVwiPlxuICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyICpuZ0lmPVwiZmllbGQudHJpZ2dlckNvbXBvbmVudFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQudHJpZ2dlckNvbXBvbmVudFwiIFt2YWx1ZV09XCJncm91cC5jb250cm9sc1tmaWVsZC5uYW1lXS52YWx1ZVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQudmlydHVhbFNjcm9sbFwiPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG5neC1tYXQtc2VsZWN0LXNlYXJjaCBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJMYWJlbD1cIlwiIG5vRW50cmllc0ZvdW5kTGFiZWwgPVwiXCI+PC9uZ3gtbWF0LXNlbGVjdC1zZWFyY2g+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cImZpZWxkLml0ZW1TaXplIHx8IDUwXCIgW3N0eWxlLmhlaWdodC5weF09NCo0OD5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIiBjbGFzcz1cInNlbGVjdEFsbFwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RBbGxDb250cm9sXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUFsbFNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J3NlbGVjdEFsbCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmc7IGVsc2UgZW1wdHlPcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpjZGtWaXJ0dWFsRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uc0ZpbHRlcmVkJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbT8uZGlzYWJsZWRcIj57eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLm11bHRpcGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWUgfCBzbGljZTowOjMwXCIgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQubXVsdGlwbGUgJiYgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbZ3JvdXA/LmNvbnRyb2xzW2ZpZWxkLm5hbWVdPy52YWx1ZV1cIiBbdmFsdWVdPVwiaXRlbVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpjZGtWaXJ0dWFsRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uc0ZpbHRlcmVkJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiBbZGlzYWJsZWRdPVwiaXRlbT8uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cC5jb250cm9sc1tmaWVsZC5uYW1lXS52YWx1ZSB8IHNsaWNlOjA6MzBcIiBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLm11bHRpcGxlICYmIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgW2dyb3VwPy5jb250cm9sc1tmaWVsZC5uYW1lXT8udmFsdWVdXCIgW3ZhbHVlXT1cIml0ZW1cIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5T3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGUtY2hlY2tib3hcIiBkaXNhYmxlZD48ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+e3snbG9hZGluZycgfCB0cmFuc2xhdGV9fS4uLiA8bWF0LXNwaW5uZXIgY2xhc3M9XCJzcGlubmVyXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+PC9kaXY+PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLnZpcnR1YWxTY3JvbGxcIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxuZ3gtbWF0LXNlbGVjdC1zZWFyY2ggW2Zvcm1Db250cm9sXT1cInNlYXJjaENvbnRyb2xcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyTGFiZWw9XCJcIiBub0VudHJpZXNGb3VuZExhYmVsID1cIlwiPjwvbmd4LW1hdC1zZWxlY3Qtc2VhcmNoPlxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIiBjbGFzcz1cInNlbGVjdEFsbFwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RBbGxDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICB7eydzZWxlY3RBbGwnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNGaWx0ZXJlZCQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+e3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNGaWx0ZXJlZCQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eU9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGUtY2hlY2tib3hcIiBkaXNhYmxlZD48ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+e3snbG9hZGluZycgfCB0cmFuc2xhdGV9fS4uLiA8bWF0LXNwaW5uZXIgY2xhc3M9XCJzcGlubmVyXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+PC9kaXY+PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnM7XCIgbmdQcm9qZWN0QXM9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ3JvdXAuZ2V0KGZpZWxkLm5hbWUpLmhhc0Vycm9yKHZhbGlkYXRpb24ubmFtZSlcIj57e3ZhbGlkYXRpb24ubWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhbGlkYXRpb24gb2YgZmllbGQuYXN5bmNWYWxpZGF0aW9ucztcIiBuZ1Byb2plY3RBcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJncm91cC5nZXQoZmllbGQubmFtZSkuaGFzRXJyb3IodmFsaWRhdGlvbi5uYW1lKVwiPnt7dmFsaWRhdGlvbi5tZXNzYWdlIHwgdHJhbnNsYXRlfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5gLFxuICAgIHN0eWxlczogWydtYXQtZm9ybS1maWVsZCB7d2lkdGg6IGNhbGMoMTAwJSl9JywgJy5zZWxlY3RBbGwge3BhZGRpbmc6IDEwcHggMTZweDt9JyxcbiAgICAgICAgYDo6bmctZGVlcCAuaGlkZS1jaGVja2JveCAubWF0LXBzZXVkby1jaGVja2JveCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgIH1gXSxcbn0pXG5leHBvcnQgY2xhc3MgS2xlc0Zvcm1TZWxlY3RTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBLbGVzRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHNlYXJjaENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gICAgc2VsZWN0QWxsQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpO1xuXG4gICAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICBvcHRpb25zJDogT2JzZXJ2YWJsZTxhbnlbXT47XG4gICAgb3B0aW9uc0ZpbHRlcmVkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueVtdPigxKTtcblxuICAgIC8vIHByaXZhdGUgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgQFZpZXdDaGlsZHJlbihNYXRPcHRpb24pIG9wdGlvbnM6IFF1ZXJ5TGlzdDxNYXRPcHRpb24+O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmllbGQubGF6eSkge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oQXJyYXkuaXNBcnJheSh0aGlzLmZpZWxkLnZhbHVlKSA/IHRoaXMuZmllbGQudmFsdWUgOiBbdGhpcy5maWVsZC52YWx1ZV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyQgPSBvZih0aGlzLmZpZWxkLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5maWVsZC5vcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuc2VhcmNoQ29udHJvbC52YWx1ZSksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaCA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMkLnBpcGUobWFwKG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLnNlYXJjaEtleXMgJiYgdGhpcy5maWVsZC5zZWFyY2hLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQuc2VhcmNoS2V5cy5zb21lKHNlYXJjaEtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbltzZWFyY2hLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25bc2VhcmNoS2V5XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2gpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICh0aGlzLmZpZWxkLnByb3BlcnR5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25bdGhpcy5maWVsZC5wcm9wZXJ0eV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoKSA+IC0xIDogZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZC5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25bdGhpcy5maWVsZC5wcm9wZXJ0eV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoKSA+IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoKSA+IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKS5zdWJzY3JpYmUodGhpcy5vcHRpb25zRmlsdGVyZWQkKTtcblxuICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV1cbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgodGhpcy5ncm91cC5jb250cm9sc1t0aGlzLmZpZWxkLm5hbWVdLnZhbHVlKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoc2VsZWN0ZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zRmlsdGVyZWQkLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKG9wdGlvbnMpID0+IG9wdGlvbnM/LmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uPy5kaXNhYmxlZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPCBzZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KG8gPT4gc2VsZWN0ZWQuaW5jbHVkZXMobykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5sZW5ndGggPT09IHNlbGVjdGVkLmxlbmd0aCAmJiBzZWxlY3RlZC5ldmVyeShzID0+IG9wdGlvbnMuaW5jbHVkZXMocykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoaXNDaGVja2VkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENvbnRyb2wuc2V0VmFsdWUoaXNDaGVja2VkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cblxuXG4gICAgdG9nZ2xlQWxsU2VsZWN0aW9uKHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNGaWx0ZXJlZCQucGlwZSh0YWtlKDEpLCBtYXAoKG9wdGlvbnMpID0+IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24/LmRpc2FibGVkKSkpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS5wYXRjaFZhbHVlKG9wdGlvbnMuc2xpY2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS5wYXRjaFZhbHVlKFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5DaGFuZ2UoJGV2ZW50OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLmxhenkpIHtcbiAgICAgICAgICAgIGlmICgkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zJCBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+KS5uZXh0KHRoaXMuZmllbGQub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLm9wdGlvbnMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5vcHRpb25zJCBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+KS5uZXh0KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmllbGQudmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhcmVGbiA9IChvMTogYW55LCBvMjogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLnByb3BlcnR5ICYmIG8xICYmIG8yKSB7XG4gICAgICAgICAgICByZXR1cm4gbzFbdGhpcy5maWVsZC5wcm9wZXJ0eV0gPT09IG8yW3RoaXMuZmllbGQucHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvMSA9PT0gbzI7XG4gICAgfVxufVxuIl19