@sumaris-net/ngx-components 2.4.23-rc2 → 2.5.0-beta1

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 (41) hide show
  1. package/doc/changelog.md +0 -3
  2. package/esm2020/public_api.mjs +2 -1
  3. package/esm2020/src/app/core/account/account.module.mjs +8 -4
  4. package/esm2020/src/app/core/account/account.page.mjs +78 -32
  5. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +28 -10
  6. package/esm2020/src/app/core/form/properties/properties.module.mjs +14 -6
  7. package/esm2020/src/app/core/form/properties/properties.table.mjs +218 -0
  8. package/esm2020/src/app/core/form/properties/property.validator.mjs +1 -1
  9. package/esm2020/src/app/core/services/account.service.mjs +31 -7
  10. package/esm2020/src/app/core/services/config/core.config.mjs +8 -1
  11. package/esm2020/src/app/core/services/model/account.model.mjs +72 -4
  12. package/esm2020/src/app/core/services/model/settings.model.mjs +1 -73
  13. package/esm2020/src/app/core/services/validator/account.validator.mjs +13 -10
  14. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +7 -9
  15. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +1 -1
  16. package/esm2020/src/app/shared/dates.mjs +1 -7
  17. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +7 -11
  18. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +3 -3
  19. package/esm2020/src/app/shared/toolbar/toolbar.mjs +6 -7
  20. package/fesm2015/sumaris-net.ngx-components.mjs +4144 -3848
  21. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  22. package/fesm2020/sumaris-net.ngx-components.mjs +4030 -3756
  23. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  24. package/package.json +1 -1
  25. package/public_api.d.ts +1 -0
  26. package/src/app/core/account/account.module.d.ts +2 -1
  27. package/src/app/core/account/account.page.d.ts +17 -13
  28. package/src/app/core/form/entity/entity-editor.class.d.ts +1 -1
  29. package/src/app/core/form/properties/properties.module.d.ts +5 -3
  30. package/src/app/core/form/properties/properties.table.d.ts +66 -0
  31. package/src/app/core/services/account.service.d.ts +16 -7
  32. package/src/app/core/services/config/core.config.d.ts +1 -0
  33. package/src/app/core/services/model/account.model.d.ts +16 -2
  34. package/src/app/core/services/model/settings.model.d.ts +0 -15
  35. package/src/app/core/services/validator/account.validator.d.ts +3 -1
  36. package/src/app/core/services/validator/user-settings.validator.d.ts +1 -1
  37. package/src/app/shared/dates.d.ts +0 -1
  38. package/src/app/shared/toolbar/toolbar.d.ts +2 -2
  39. package/src/assets/i18n/en-US.json +12 -1
  40. package/src/assets/i18n/en.json +12 -1
  41. package/src/assets/i18n/fr.json +17 -13
@@ -0,0 +1,218 @@
1
+ import { __decorate } from "tslib";
2
+ import { AppInMemoryTable } from '../../table/memory-table.class';
3
+ import { ChangeDetectionStrategy, Component, Directive, Inject, Input } from '@angular/core';
4
+ import { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../../table/table.model';
5
+ import { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';
6
+ import { Entity, EntityUtils } from '../../services/model/entity.model';
7
+ import { AppValidatorService } from '../../services/validator/base.validator.class';
8
+ import { Validators } from '@angular/forms';
9
+ import { isNotNil, isNotNilOrBlank } from '../../../shared/functions';
10
+ import { BehaviorSubject } from 'rxjs';
11
+ import { ENVIRONMENT } from '../../../../environments/environment.class';
12
+ import { EntityClass } from '../../services/model/entity.decorators';
13
+ import { EntityFilter } from '../../services/model/filter.model';
14
+ import { debounceTime, filter, tap } from 'rxjs/operators';
15
+ import { AppFormUtils } from '../form.utils';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/forms";
18
+ import * as i2 from "@angular/common";
19
+ import * as i3 from "@ionic/angular";
20
+ import * as i4 from "@ngx-translate/core";
21
+ import * as i5 from "@angular/material/table";
22
+ import * as i6 from "@angular/material/sort";
23
+ import * as i7 from "@angular/material/toolbar";
24
+ import * as i8 from "@angular/material/icon";
25
+ import * as i9 from "@angular/material/button";
26
+ import * as i10 from "@angular/material/slide-toggle";
27
+ import * as i11 from "@angular/cdk/a11y";
28
+ import * as i12 from "../../../shared/material/autocomplete/material.autocomplete";
29
+ import * as i13 from "../../../shared/form/field.component";
30
+ import * as i14 from "../../table/actions-column.component";
31
+ import * as i15 from "../../../shared/pipes/property.pipes";
32
+ import * as i16 from "../../../shared/pipes/form.pipes";
33
+ import * as i17 from "../../../../environments/environment.class";
34
+ let PropertyEntity = class PropertyEntity extends Entity {
35
+ constructor() {
36
+ super(...arguments);
37
+ this.definition = null;
38
+ this.value = null;
39
+ }
40
+ fromObject(source) {
41
+ super.fromObject(source);
42
+ this.id = source.definition?.key || source.id;
43
+ this.definition = source.definition;
44
+ this.value = source.value;
45
+ }
46
+ asObject(opts) {
47
+ const target = super.asObject(opts);
48
+ target.id = this.definition.key;
49
+ delete target.definition;
50
+ return target;
51
+ }
52
+ };
53
+ PropertyEntity = __decorate([
54
+ EntityClass({ typename: 'PropertyEntity' })
55
+ ], PropertyEntity);
56
+ export { PropertyEntity };
57
+ export class PropertyEntityFilter extends EntityFilter {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.all = false;
61
+ }
62
+ fromObject(source) {
63
+ super.fromObject(source);
64
+ this.all = source.all;
65
+ }
66
+ asObject(opts) {
67
+ return super.asObject(opts);
68
+ }
69
+ buildFilter() {
70
+ const filterFns = super.buildFilter();
71
+ if (!this.all) {
72
+ filterFns.push(data => isNotNil(data.value));
73
+ }
74
+ return filterFns;
75
+ }
76
+ }
77
+ export class PropertyEntityValidator extends AppValidatorService {
78
+ constructor(formBuilder) {
79
+ super(formBuilder, null);
80
+ this.formBuilder = formBuilder;
81
+ }
82
+ getFormGroupConfig(data) {
83
+ return {
84
+ id: [data?.id || null],
85
+ definition: [data?.definition || null, Validators.required],
86
+ value: [data?.value || null]
87
+ };
88
+ }
89
+ }
90
+ PropertyEntityValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyEntityValidator, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Directive });
91
+ PropertyEntityValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: PropertyEntityValidator, usesInheritance: true, ngImport: i0 });
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyEntityValidator, decorators: [{
93
+ type: Directive
94
+ }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; } });
95
+ export class AppPropertiesTable extends AppInMemoryTable {
96
+ constructor(injector, formBuilder, validatorService, environment) {
97
+ super(injector, [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS], PropertyEntity, new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {
98
+ sortByReplacement: { definition: 'definition.translatedLabel' }
99
+ }), validatorService);
100
+ this.injector = injector;
101
+ this.formBuilder = formBuilder;
102
+ this.validatorService = validatorService;
103
+ this.showToolbar = true;
104
+ this.availableDefinitions$ = new BehaviorSubject([]);
105
+ this.definitionsMapByKey = {};
106
+ this.translationsByKey = {};
107
+ this.toTranslatedFormFieldDefinition = (definition) => ({ ...definition, translatedLabel: this.translationsByKey[definition.label] });
108
+ this.inlineEdition = true;
109
+ this.defaultSortBy = 'definition';
110
+ this.defaultSortDirection = 'asc';
111
+ this.debug = !environment?.production;
112
+ this.filterForm = formBuilder.group({
113
+ all: [null]
114
+ });
115
+ this.autoLoad = false;
116
+ }
117
+ ngOnInit() {
118
+ super.ngOnInit();
119
+ // Fill options map
120
+ this.definitionsMapByKey = {};
121
+ this.definitions?.forEach(o => {
122
+ this.definitionsMapByKey[o.key] = o;
123
+ });
124
+ this.registerAutocompleteField('definition', {
125
+ attributes: ['translatedLabel'],
126
+ columnNames: [this.i18nColumnPrefix + 'DEFINITION'],
127
+ items: this.availableDefinitions$,
128
+ equals: (o1, o2) => o1?.key === o2?.key,
129
+ });
130
+ this.registerCellValueChanges('definition').subscribe((definition) => {
131
+ if (isNotNil(definition) && this.editedRow?.id === -1) {
132
+ this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });
133
+ }
134
+ });
135
+ this.registerCellValueChanges('value').subscribe(() => {
136
+ this.markAsDirty();
137
+ });
138
+ this.registerSubscription(this.filterForm.valueChanges
139
+ .pipe(debounceTime(250), filter((_) => {
140
+ const valid = this.filterForm.valid;
141
+ if (!valid && this.debug)
142
+ AppFormUtils.logFormErrors(this.filterForm);
143
+ return valid;
144
+ }),
145
+ // Update the filter
146
+ tap(json => this.setFilter(json)))
147
+ .subscribe());
148
+ this.markAsReady();
149
+ }
150
+ get value() {
151
+ let values = super.value || [];
152
+ // remove unset options
153
+ values = values.filter(property => isNotNil(property.value));
154
+ return values;
155
+ }
156
+ set value(data) {
157
+ super.value = data;
158
+ }
159
+ setValue(value, opts) {
160
+ // Update translations
161
+ this.translationsByKey = this.translate.instant(this.definitions.map(def => def.label));
162
+ const properties = (value || []).slice();
163
+ // Affect definition
164
+ properties.forEach(property => {
165
+ const definition = this.definitionsMapByKey[property.id];
166
+ property.definition = this.toTranslatedFormFieldDefinition(definition);
167
+ });
168
+ // Add other definitions (no value)
169
+ properties.push(...this.definitions
170
+ .filter(definition => !properties.map(property => property.id).includes(definition.key))
171
+ .map(definition => PropertyEntity.fromObject({
172
+ id: definition.key,
173
+ definition: this.toTranslatedFormFieldDefinition(definition),
174
+ value: null
175
+ })));
176
+ // init filter
177
+ this.filterForm.patchValue({ all: false });
178
+ super.setValue(properties, opts);
179
+ }
180
+ confirmEditCreate(event, row) {
181
+ try {
182
+ return super.confirmEditCreate(event, row);
183
+ }
184
+ finally {
185
+ this.updateAvailableDefinitions();
186
+ }
187
+ }
188
+ async updateView(res, opts) {
189
+ await super.updateView(res, opts);
190
+ this.updateAvailableDefinitions();
191
+ }
192
+ async updateAvailableDefinitions() {
193
+ const usedDefinitionsKeys = this.dataSource.getRows().map(row => row.currentData?.id).filter(isNotNilOrBlank) || [];
194
+ const availableDefinitions = (this.definitions || []).slice()
195
+ .filter(value => !usedDefinitionsKeys.includes(value.key))
196
+ .map(this.toTranslatedFormFieldDefinition);
197
+ EntityUtils.sort(availableDefinitions, 'translatedLabel', 'asc');
198
+ this.availableDefinitions$.next(availableDefinitions);
199
+ }
200
+ }
201
+ AppPropertiesTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AppPropertiesTable, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: PropertyEntityValidator }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
202
+ AppPropertiesTable.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [
203
+ { provide: PropertyEntityValidator, useClass: PropertyEntityValidator }
204
+ ], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\">\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n hidden-xs hidden-sm hidden-mobile\n *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- Delete -->\n <button mat-icon-button *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n </ng-template>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n\n <ion-text translate>SETTINGS.BTN_SHOW_ALL_PROPERTIES</ion-text>\n <mat-slide-toggle formControlName=\"all\" style=\"padding-left: 5px\">\n </mat-slide-toggle>\n\n </form>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"(row.validator | formGetValue : ['definition', 'defaultValue']) === (row.validator | formGetValue : 'value')\">\n <mat-autocomplete-field\n *ngIf=\"row.id === -1; else readOnlyDefinition\"\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl : 'definition'\"\n [config]=\"autocompleteFields.definition\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n <ng-template #readOnlyDefinition>\n {{ row.currentData | propertyGet : 'definition.translatedLabel' }}\n </ng-template>\n </td>\n </ng-container>\n\n <!-- value column -->\n <ng-container matColumnDef=\"value\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label>{{ i18nColumnPrefix + 'VALUE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-form-field\n *ngIf=\"row.validator | formGetValue: 'id'\"\n floatLabel=\"never\"\n [definition]=\"definitionsMapByKey[row.validator | formGetValue: 'id']\"\n [formControl]=\"row.validator | formGetControl:'value'\"\n [placeholder]=\"i18nColumnPrefix + 'VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button type=\"button\" mat-icon-button\n *ngIf=\"!mobile && !disabled\"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteRow($event, row)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i11.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i12.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i13.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "chipColor", "class"], outputs: ["keyup.enter"] }, { kind: "component", type: i14.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i16.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AppPropertiesTable, decorators: [{
206
+ type: Component,
207
+ args: [{ selector: 'app-properties-table', providers: [
208
+ { provide: PropertyEntityValidator, useClass: PropertyEntityValidator }
209
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar *ngIf=\"showToolbar\">\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n hidden-xs hidden-sm hidden-mobile\n *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- Delete -->\n <button mat-icon-button *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n </ng-template>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n\n <ion-text translate>SETTINGS.BTN_SHOW_ALL_PROPERTIES</ion-text>\n <mat-slide-toggle formControlName=\"all\" style=\"padding-left: 5px\">\n </mat-slide-toggle>\n\n </form>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"(row.validator | formGetValue : ['definition', 'defaultValue']) === (row.validator | formGetValue : 'value')\">\n <mat-autocomplete-field\n *ngIf=\"row.id === -1; else readOnlyDefinition\"\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl : 'definition'\"\n [config]=\"autocompleteFields.definition\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n <ng-template #readOnlyDefinition>\n {{ row.currentData | propertyGet : 'definition.translatedLabel' }}\n </ng-template>\n </td>\n </ng-container>\n\n <!-- value column -->\n <ng-container matColumnDef=\"value\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label>{{ i18nColumnPrefix + 'VALUE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-form-field\n *ngIf=\"row.validator | formGetValue: 'id'\"\n floatLabel=\"never\"\n [definition]=\"definitionsMapByKey[row.validator | formGetValue: 'id']\"\n [formControl]=\"row.validator | formGetControl:'value'\"\n [placeholder]=\"i18nColumnPrefix + 'VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button type=\"button\" mat-icon-button\n *ngIf=\"!mobile && !disabled\"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteRow($event, row)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n" }]
210
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: i17.Environment, decorators: [{
211
+ type: Inject,
212
+ args: [ENVIRONMENT]
213
+ }] }]; }, propDecorators: { definitions: [{
214
+ type: Input
215
+ }], showToolbar: [{
216
+ type: Input
217
+ }] } });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxNQUFNLEVBQXlCLFdBQVcsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzdGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBdUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBYyxXQUFXLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FB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QW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwSW5NZW1vcnlUYWJsZX0gZnJvbSAnLi4vLi4vdGFibGUvbWVtb3J5LXRhYmxlLmNsYXNzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGlyZWN0aXZlLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UkVTRVJWRURfRU5EX0NPTFVNTlMsIFJFU0VSVkVEX1NUQVJUX0NPTFVNTlN9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7SW5NZW1vcnlFbnRpdGllc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9tZW1vcnktZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eUFzT2JqZWN0T3B0aW9ucywgRW50aXR5VXRpbHN9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0FwcFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRvci9iYXNlLnZhbGlkYXRvci5jbGFzcyc7XG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3JtRmllbGREZWZpbml0aW9uLCBGb3JtRmllbGREZWZpbml0aW9uTWFwfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQge2lzTm90TmlsLCBpc05vdE5pbE9yQmxhbmt9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtGaWx0ZXJGbiwgTG9hZFJlc3VsdH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIEVOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtUYWJsZUVsZW1lbnR9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0VudGl0eUNsYXNzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkuZGVjb3JhdG9ycyc7XG5pbXBvcnQge0VudGl0eUZpbHRlcn0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7T2JqZWN0TWFwfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FwcEZvcm1VdGlsc30gZnJvbSAnLi4vZm9ybS51dGlscyc7XG5cbmludGVyZmFjZSBUcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbiBleHRlbmRzIEZvcm1GaWVsZERlZmluaXRpb24ge1xuICB0cmFuc2xhdGVkTGFiZWw/OiBzdHJpbmc7XG59XG5cbkBFbnRpdHlDbGFzcyh7dHlwZW5hbWU6ICdQcm9wZXJ0eUVudGl0eSd9KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RW50aXR5IGV4dGVuZHMgRW50aXR5PFByb3BlcnR5RW50aXR5LCBzdHJpbmc+IHtcbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gUHJvcGVydHlFbnRpdHk7XG5cbiAgZGVmaW5pdGlvbjogVHJhbnNsYXRlZEZvcm1GaWVsZERlZmluaXRpb24gPSBudWxsO1xuICB2YWx1ZTogYW55ID0gbnVsbDtcblxuICBmcm9tT2JqZWN0KHNvdXJjZTogYW55KSB7XG4gICAgc3VwZXIuZnJvbU9iamVjdChzb3VyY2UpO1xuICAgIHRoaXMuaWQgPSBzb3VyY2UuZGVmaW5pdGlvbj8ua2V5IHx8IHNvdXJjZS5pZDtcbiAgICB0aGlzLmRlZmluaXRpb24gPSBzb3VyY2UuZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZhbHVlID0gc291cmNlLnZhbHVlO1xuICB9XG5cbiAgYXNPYmplY3Qob3B0cz86IEVudGl0eUFzT2JqZWN0T3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc3VwZXIuYXNPYmplY3Qob3B0cyk7XG4gICAgdGFyZ2V0LmlkID0gdGhpcy5kZWZpbml0aW9uLmtleTtcbiAgICBkZWxldGUgdGFyZ2V0LmRlZmluaXRpb247XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFbnRpdHlGaWx0ZXIgZXh0ZW5kcyBFbnRpdHlGaWx0ZXI8UHJvcGVydHlFbnRpdHlGaWx0ZXIsIFByb3BlcnR5RW50aXR5PiB7XG4gIHN0YXRpYyBmcm9tT2JqZWN0OiAoc291cmNlLCBvcHRzPzogYW55KSA9PiBQcm9wZXJ0eUVudGl0eUZpbHRlcjtcblxuICBhbGwgPSBmYWxzZTtcblxuICBmcm9tT2JqZWN0KHNvdXJjZTogYW55KSB7XG4gICAgc3VwZXIuZnJvbU9iamVjdChzb3VyY2UpO1xuICAgIHRoaXMuYWxsID0gc291cmNlLmFsbDtcbiAgfVxuXG4gIGFzT2JqZWN0KG9wdHM/OiBFbnRpdHlBc09iamVjdE9wdGlvbnMpOiBhbnkge1xuICAgIHJldHVybiBzdXBlci5hc09iamVjdChvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEZpbHRlcigpOiBGaWx0ZXJGbjxQcm9wZXJ0eUVudGl0eT5bXSB7XG4gICAgY29uc3QgZmlsdGVyRm5zID0gc3VwZXIuYnVpbGRGaWx0ZXIoKTtcblxuICAgIGlmICghdGhpcy5hbGwpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKGRhdGEgPT4gaXNOb3ROaWwoZGF0YS52YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJGbnM7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IgZXh0ZW5kcyBBcHBWYWxpZGF0b3JTZXJ2aWNlPFByb3BlcnR5RW50aXR5PiB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgc3VwZXIoZm9ybUJ1aWxkZXIsIG51bGwpO1xuICB9XG5cbiAgZ2V0Rm9ybUdyb3VwQ29uZmlnKGRhdGE/OiBQcm9wZXJ0eUVudGl0eSk6IHsgW3A6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IFtkYXRhPy5pZCB8fCBudWxsXSxcbiAgICAgIGRlZmluaXRpb246IFtkYXRhPy5kZWZpbml0aW9uIHx8IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFtkYXRhPy52YWx1ZSB8fCBudWxsXVxuICAgIH07XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb3BlcnRpZXMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJ3Byb3BlcnRpZXMudGFibGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWydwcm9wZXJ0aWVzLnRhYmxlLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IFByb3BlcnR5RW50aXR5VmFsaWRhdG9yLCB1c2VDbGFzczogUHJvcGVydHlFbnRpdHlWYWxpZGF0b3J9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFwcFByb3BlcnRpZXNUYWJsZSBleHRlbmRzIEFwcEluTWVtb3J5VGFibGU8UHJvcGVydHlFbnRpdHksIFByb3BlcnR5RW50aXR5RmlsdGVyLCBzdHJpbmc+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBkZWZpbml0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuICBASW5wdXQoKSBzaG93VG9vbGJhciA9IHRydWU7XG5cbiAgYXZhaWxhYmxlRGVmaW5pdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbltdPihbXSk7XG4gIGRlZmluaXRpb25zTWFwQnlLZXk6IEZvcm1GaWVsZERlZmluaXRpb25NYXAgPSB7fTtcbiAgdHJhbnNsYXRpb25zQnlLZXk6IE9iamVjdE1hcDxzdHJpbmc+ID0ge307XG4gIGZpbHRlckZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBbLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUywgJ2RlZmluaXRpb24nLCAndmFsdWUnLCAuLi5SRVNFUlZFRF9FTkRfQ09MVU1OU10sXG4gICAgICBQcm9wZXJ0eUVudGl0eSxcbiAgICAgIG5ldyBJbk1lbW9yeUVudGl0aWVzU2VydmljZShQcm9wZXJ0eUVudGl0eSwgUHJvcGVydHlFbnRpdHlGaWx0ZXIsIHtcbiAgICAgICAgc29ydEJ5UmVwbGFjZW1lbnQ6IHtkZWZpbml0aW9uOiAnZGVmaW5pdGlvbi50cmFuc2xhdGVkTGFiZWwnfVxuICAgICAgfSksXG4gICAgICB2YWxpZGF0b3JTZXJ2aWNlXG4gICAgKTtcblxuICAgIHRoaXMuaW5saW5lRWRpdGlvbiA9IHRydWU7XG4gICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gJ2RlZmluaXRpb24nO1xuICAgIHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gPSAnYXNjJztcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50Py5wcm9kdWN0aW9uO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgYWxsOiBbbnVsbF1cbiAgICB9KTtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBGaWxsIG9wdGlvbnMgbWFwXG4gICAgdGhpcy5kZWZpbml0aW9uc01hcEJ5S2V5ID0ge307XG4gICAgdGhpcy5kZWZpbml0aW9ucz8uZm9yRWFjaChvID0+IHtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleVtvLmtleV0gPSBvO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckF1dG9jb21wbGV0ZUZpZWxkKCdkZWZpbml0aW9uJywge1xuICAgICAgYXR0cmlidXRlczogWyd0cmFuc2xhdGVkTGFiZWwnXSxcbiAgICAgIGNvbHVtbk5hbWVzOiBbdGhpcy5pMThuQ29sdW1uUHJlZml4ICsgJ0RFRklOSVRJT04nXSxcbiAgICAgIGl0ZW1zOiB0aGlzLmF2YWlsYWJsZURlZmluaXRpb25zJCxcbiAgICAgIGVxdWFsczogKG8xLCBvMikgPT4gbzE/LmtleSA9PT0gbzI/LmtleSxcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJDZWxsVmFsdWVDaGFuZ2VzKCdkZWZpbml0aW9uJykuc3Vic2NyaWJlKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICBpZiAoaXNOb3ROaWwoZGVmaW5pdGlvbikgJiYgdGhpcy5lZGl0ZWRSb3c/LmlkID09PSAtMSkge1xuICAgICAgICB0aGlzLmVkaXRlZFJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7aWQ6IGRlZmluaXRpb24ua2V5LCB2YWx1ZTogZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWV9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJDZWxsVmFsdWVDaGFuZ2VzKCd2YWx1ZScpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy5maWx0ZXJGb3JtLnZhbGlkO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCAmJiB0aGlzLmRlYnVnKSBBcHBGb3JtVXRpbHMubG9nRm9ybUVycm9ycyh0aGlzLmZpbHRlckZvcm0pO1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZmlsdGVyXG4gICAgICAgICAgdGFwKGpzb24gPT4gdGhpcy5zZXRGaWx0ZXIoanNvbikpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogUHJvcGVydHlFbnRpdHlbXSB7XG4gICAgbGV0IHZhbHVlcyA9IHN1cGVyLnZhbHVlIHx8IFtdO1xuXG4gICAgLy8gcmVtb3ZlIHVuc2V0IG9wdGlvbnNcbiAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHByb3BlcnR5ID0+IGlzTm90TmlsKHByb3BlcnR5LnZhbHVlKSk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgc2V0IHZhbHVlKGRhdGE6IFByb3BlcnR5RW50aXR5W10pIHtcbiAgICBzdXBlci52YWx1ZSA9IGRhdGE7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZTogUHJvcGVydHlFbnRpdHlbXSwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG5cbiAgICAvLyBVcGRhdGUgdHJhbnNsYXRpb25zXG4gICAgdGhpcy50cmFuc2xhdGlvbnNCeUtleSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5kZWZpbml0aW9ucy5tYXAoZGVmID0+IGRlZi5sYWJlbCkpO1xuXG4gICAgY29uc3QgcHJvcGVydGllcyA9ICh2YWx1ZSB8fCBbXSkuc2xpY2UoKTtcblxuICAgIC8vIEFmZmVjdCBkZWZpbml0aW9uXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLmRlZmluaXRpb25zTWFwQnlLZXlbcHJvcGVydHkuaWRdO1xuICAgICAgcHJvcGVydHkuZGVmaW5pdGlvbiA9IHRoaXMudG9UcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbihkZWZpbml0aW9uKTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBvdGhlciBkZWZpbml0aW9ucyAobm8gdmFsdWUpXG4gICAgcHJvcGVydGllcy5wdXNoKFxuICAgICAgLi4udGhpcy5kZWZpbml0aW9uc1xuICAgICAgICAuZmlsdGVyKGRlZmluaXRpb24gPT4gIXByb3BlcnRpZXMubWFwKHByb3BlcnR5ID0+IHByb3BlcnR5LmlkKS5pbmNsdWRlcyhkZWZpbml0aW9uLmtleSkpXG4gICAgICAgIC5tYXAoZGVmaW5pdGlvbiA9PiBQcm9wZXJ0eUVudGl0eS5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBpZDogZGVmaW5pdGlvbi5rZXksXG4gICAgICAgICAgZGVmaW5pdGlvbjogdGhpcy50b1RyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uKGRlZmluaXRpb24pLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH0pKVxuICAgICk7XG5cbiAgICAvLyBpbml0IGZpbHRlclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHthbGw6IGZhbHNlfSk7XG5cbiAgICBzdXBlci5zZXRWYWx1ZShwcm9wZXJ0aWVzLCBvcHRzKTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50PzogRXZlbnQsIHJvdz86IFRhYmxlRWxlbWVudDxQcm9wZXJ0eUVudGl0eT4pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN1cGVyLmNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50LCByb3cpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZURlZmluaXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVmlldyhyZXM6IExvYWRSZXN1bHQ8UHJvcGVydHlFbnRpdHk+IHwgdW5kZWZpbmVkLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci51cGRhdGVWaWV3KHJlcywgb3B0cyk7XG4gICAgdGhpcy51cGRhdGVBdmFpbGFibGVEZWZpbml0aW9ucygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUF2YWlsYWJsZURlZmluaXRpb25zKCkge1xuICAgIGNvbnN0IHVzZWREZWZpbml0aW9uc0tleXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93cygpLm1hcChyb3cgPT4gcm93LmN1cnJlbnREYXRhPy5pZCkuZmlsdGVyKGlzTm90TmlsT3JCbGFuaykgfHwgW107XG4gICAgY29uc3QgYXZhaWxhYmxlRGVmaW5pdGlvbnM6IFRyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uW10gPSAodGhpcy5kZWZpbml0aW9ucyB8fCBbXSkuc2xpY2UoKVxuICAgICAgLmZpbHRlcih2YWx1ZSA9PiAhdXNlZERlZmluaXRpb25zS2V5cy5pbmNsdWRlcyh2YWx1ZS5rZXkpKVxuICAgICAgLm1hcCh0aGlzLnRvVHJhbnNsYXRlZEZvcm1GaWVsZERlZmluaXRpb24pO1xuXG4gICAgRW50aXR5VXRpbHMuc29ydChhdmFpbGFibGVEZWZpbml0aW9ucywgJ3RyYW5zbGF0ZWRMYWJlbCcsICdhc2MnKTtcblxuICAgIHRoaXMuYXZhaWxhYmxlRGVmaW5pdGlvbnMkLm5leHQoYXZhaWxhYmxlRGVmaW5pdGlvbnMpO1xuICB9XG5cbiAgdG9UcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbiA9IChkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogVHJhbnNsYXRlZEZvcm1GaWVsZERlZmluaXRpb24gPT5cbiAgICAoey4uLmRlZmluaXRpb24sIHRyYW5zbGF0ZWRMYWJlbDogdGhpcy50cmFuc2xhdGlvbnNCeUtleVtkZWZpbml0aW9uLmxhYmVsXX0pO1xuXG59XG4iLCI8bWF0LXRvb2xiYXIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0aW9uLmhhc1ZhbHVlKCk7IGVsc2UgaGFzU2VsZWN0aW9uXCI+XG4gICAgPCEtLSBBZGQgLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZVxuICAgICAgICAgICAgKm5nSWY9XCJlbmFibGVkXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIFJlZnJlc2ggLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9SRUZSRVNIJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaC5lbWl0KClcIj5cbiAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIGlmIHJvdyBzZWxlY3Rpb24gLS0+XG4gIDxuZy10ZW1wbGF0ZSAjaGFzU2VsZWN0aW9uPlxuXG4gICAgPCEtLSBEZWxldGUgLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJlbmFibGVkXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGlvbi1pdGVtICpuZ0lmPVwiIW1vYmlsZSAmJiBlcnJvcjsgbGV0IGVycm9yXCIgbGluZXM9XCJub25lXCI+XG4gICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXItc3BhY2VyXCI+PC9kaXY+XG5cbiAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblJlZnJlc2guZW1pdCgpXCI+XG5cbiAgICA8aW9uLXRleHQgdHJhbnNsYXRlPlNFVFRJTkdTLkJUTl9TSE9XX0FMTF9QUk9QRVJUSUVTPC9pb24tdGV4dD5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSBmb3JtQ29udHJvbE5hbWU9XCJhbGxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogNXB4XCI+XG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gIDwvZm9ybT5cblxuPC9tYXQtdG9vbGJhcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cblxuICA8IS0tIHRhYmxlIC0tPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyXG4gICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJkZWZhdWx0U29ydEJ5XCJcbiAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiZGVmYXVsdFNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5Rm5cIj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJ0cnVlXCI+PC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInRydWVcIj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gaWQgY29sdW1uIChoaWRkZW4pIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFkZWJ1Z1wiPjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhZGVidWdcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEuaWQgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGRlZmluaXRpb24gY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWZpbml0aW9uXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdERUZJTklUSU9OJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cIihyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlIDogWydkZWZpbml0aW9uJywgJ2RlZmF1bHRWYWx1ZSddKSA9PT0gKHJvdy52YWxpZGF0b3IgfCBmb3JtR2V0VmFsdWUgOiAndmFsdWUnKVwiPlxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlLWZpZWxkXG4gICAgICAgICAgICAqbmdJZj1cInJvdy5pZCA9PT0gLTE7IGVsc2UgcmVhZE9ubHlEZWZpbml0aW9uXCJcbiAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvciB8IGZvcm1HZXRDb250cm9sIDogJ2RlZmluaXRpb24nXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiYXV0b2NvbXBsZXRlRmllbGRzLmRlZmluaXRpb25cIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgID48L21hdC1hdXRvY29tcGxldGUtZmllbGQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkT25seURlZmluaXRpb24+XG4gICAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICdkZWZpbml0aW9uLnRyYW5zbGF0ZWRMYWJlbCcgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gdmFsdWUgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ2YWx1ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdWQUxVRScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxhcHAtZm9ybS1maWVsZFxuICAgICAgICAgICAgKm5nSWY9XCJyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlOiAnaWQnXCJcbiAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXG4gICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJkZWZpbml0aW9uc01hcEJ5S2V5W3Jvdy52YWxpZGF0b3IgfCBmb3JtR2V0VmFsdWU6ICdpZCddXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yIHwgZm9ybUdldENvbnRyb2w6J3ZhbHVlJ1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaTE4bkNvbHVtblByZWZpeCArICdWQUxVRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgICAgICA8L2FwcC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQWN0aW9ucyBidXR0b25zIGNvbHVtbiAtLT5cbiAgICAgIDxhcHAtYWN0aW9ucy1jb2x1bW5cbiAgICAgICAgW3N0aWNreUVuZF09XCJ0cnVlXCJcbiAgICAgICAgW2NhbkNhbmNlbF09XCJmYWxzZVwiXG4gICAgICAgIFtjYW5EZWxldGVdPVwiZmFsc2VcIlxuICAgICAgICBbZGlydHlJY29uXT1cImZhbHNlXCJcbiAgICAgICAgW2NlbGxUZW1wbGF0ZV09XCJjZWxsSW5qZWN0aW9uXCI+XG5cbiAgICAgICAgPCEtLSBjZWxsIGluamVjdGlvbi0tPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGxJbmplY3Rpb24gbGV0LXJvdz5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIW1vYmlsZSAmJiAhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnZpc2libGUtaG92ZXItcm93XT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUm93KCRldmVudCwgcm93KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8L2FwcC1hY3Rpb25zLWNvbHVtbj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1zZWxlY3RlZF09XCJyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctZXJyb3JdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAgIChjbGljayk9XCJjbGlja1JvdygkZXZlbnQsIHJvdylcIlxuICAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJlc2NhcGVFZGl0aW5nUm93KCRldmVudClcIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nU3ViamVjdHxhc3luYzsgZWxzZSBub1Jlc3VsdFwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQ+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vUmVzdWx0PlxuICAgICAgPGlvbi1pdGVtICpuZ0lmPVwidG90YWxSb3dDb3VudCA9PT0gMFwiPlxuICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cInRleHQtaXRhbGljXCIgdHJhbnNsYXRlPkNPTU1PTi5OT19SRVNVTFQ8L2lvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gIDwvZGl2PlxuPC9pb24tY29udGVudD5cbiJdfQ==
@@ -20,4 +20,4 @@ PropertyValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", vers
20
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyValidator, decorators: [{
21
21
  type: Directive
22
22
  }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; } });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0eS52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQXFCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDOzs7QUFHbEYsTUFBTSxPQUFPLGlCQUFrQixTQUFRLG1CQUE2QjtJQUVsRSxZQUNZLFdBQStCO1FBRXpDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFGZixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFHM0MsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQWU7UUFDaEMsT0FBTztZQUNMLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RixLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6RCxDQUFBO0lBQ0gsQ0FBQzs7K0dBYlUsaUJBQWlCO21HQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1Byb3BlcnR5fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtBcHBWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0b3IvYmFzZS52YWxpZGF0b3IuY2xhc3MnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRvciBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8UHJvcGVydHk+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlclxuICApIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlciwgbnVsbCk7XG4gIH1cblxuICBnZXRGb3JtR3JvdXBDb25maWcoZGF0YT86IFByb3BlcnR5KTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IFtkYXRhICYmIGRhdGEua2V5IHx8IG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgoNTApXSldLFxuICAgICAgdmFsdWU6IFtkYXRhICYmIGRhdGEudmFsdWUgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9XG4gIH1cbn1cblxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0eS52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQXFCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDOzs7QUFHbEYsTUFBTSxPQUFPLGlCQUFrQixTQUFRLG1CQUE2QjtJQUVsRSxZQUNZLFdBQStCO1FBRXpDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFGZixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFHM0MsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQWU7UUFDaEMsT0FBTztZQUNMLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RixLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs7K0dBYlUsaUJBQWlCO21HQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1Byb3BlcnR5fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtBcHBWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0b3IvYmFzZS52YWxpZGF0b3IuY2xhc3MnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRvciBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8UHJvcGVydHk+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlclxuICApIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlciwgbnVsbCk7XG4gIH1cblxuICBnZXRGb3JtR3JvdXBDb25maWcoZGF0YT86IFByb3BlcnR5KTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IFtkYXRhICYmIGRhdGEua2V5IHx8IG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgoNTApXSldLFxuICAgICAgdmFsdWU6IFtkYXRhICYmIGRhdGEudmFsdWUgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9O1xuICB9XG59XG5cbiJdfQ==