@dignite-ng/expand.cms 3.0.0-rc.43 → 3.0.0-rc.47

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 (32) hide show
  1. package/esm2022/lib/cms.module.mjs +6 -2
  2. package/esm2022/lib/components/admin/entries/create-or-edit-entries.component.mjs +33 -3
  3. package/esm2022/lib/components/admin/entries/create.component.mjs +39 -8
  4. package/esm2022/lib/components/admin/entries/edit.component.mjs +55 -50
  5. package/esm2022/lib/components/admin/entries/entries.component.mjs +4 -3
  6. package/esm2022/lib/components/admin/sections/entry-types/create-or-edit.-entry-type-input-base.mjs +7 -7
  7. package/esm2022/lib/components/admin/sections/entry-types/create-or-edit.component.mjs +40 -7
  8. package/esm2022/lib/components/dynamic-form/matrix/matrix-control.component.mjs +50 -10
  9. package/esm2022/lib/components/dynamic-form/table/table-control.component.mjs +44 -9
  10. package/esm2022/lib/pipes/get-localized-entries-by-slug.pipe.mjs +43 -0
  11. package/esm2022/lib/proxy/dignite/cms/admin/dynamic-forms/form-admin.service.mjs +1 -1
  12. package/esm2022/lib/proxy/dignite/cms/admin/entries/entry-admin.service.mjs +6 -1
  13. package/esm2022/lib/proxy/dignite/cms/admin/fields/models.mjs +1 -1
  14. package/esm2022/lib/proxy/dignite/cms/fields/models.mjs +1 -1
  15. package/esm2022/lib/proxy/dignite/cms/sections/models.mjs +1 -1
  16. package/esm2022/lib/resolvers/page-default-toolbar-actions.mjs +3 -3
  17. package/fesm2022/dignite-ng-expand.cms.mjs +311 -90
  18. package/fesm2022/dignite-ng-expand.cms.mjs.map +1 -1
  19. package/lib/cms.module.d.ts +2 -1
  20. package/lib/components/admin/entries/create-or-edit-entries.component.d.ts +5 -0
  21. package/lib/components/admin/entries/create.component.d.ts +3 -0
  22. package/lib/components/admin/entries/edit.component.d.ts +1 -0
  23. package/lib/components/admin/sections/entry-types/create-or-edit.-entry-type-input-base.d.ts +0 -6
  24. package/lib/components/admin/sections/entry-types/create-or-edit.component.d.ts +4 -0
  25. package/lib/components/dynamic-form/matrix/matrix-control.component.d.ts +4 -0
  26. package/lib/components/dynamic-form/table/table-control.component.d.ts +4 -0
  27. package/lib/pipes/get-localized-entries-by-slug.pipe.d.ts +10 -0
  28. package/lib/proxy/dignite/cms/admin/entries/entry-admin.service.d.ts +1 -0
  29. package/lib/proxy/dignite/cms/admin/fields/models.d.ts +2 -2
  30. package/lib/proxy/dignite/cms/fields/models.d.ts +1 -1
  31. package/lib/proxy/dignite/cms/sections/models.d.ts +2 -2
  32. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @angular-eslint/component-selector */
2
2
  import { ChangeDetectorRef, Component, ElementRef, inject, Input, ViewChild } from '@angular/core';
3
- import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
3
+ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
4
4
  import { CmsApiService } from '../../../services';
5
5
  import { moveItemInArray } from '@angular/cdk/drag-drop';
6
6
  import * as i0 from "@angular/core";
@@ -64,28 +64,68 @@ export class MatrixControlComponent {
64
64
  }
65
65
  }
66
66
  this._selected = '';
67
+ console.log(this.fieldNameControl, 'fieldNameControl', this._fields.field.name);
67
68
  }
68
69
  }
69
70
  AfterInit() {
70
71
  return new Promise((resolve, rejects) => {
71
72
  const formConfiguration = this._fields.field.formConfiguration;
72
- const newArrayGroup = this.fb.array([]);
73
+ const ValidatorsArray = [];
74
+ if (this._fields.required) {
75
+ ValidatorsArray.push(Validators.required);
76
+ }
77
+ const newArrayGroup = this.fb.array([], ValidatorsArray);
73
78
  this.extraProperties.setControl(this._fields.field.name, newArrayGroup);
74
79
  this.fieldNameControl = this.extraProperties.get(this._fields.field.name);
80
+ if (this._fields.required) {
81
+ this.fieldNameControl.addValidators(this.hasValueValidator);
82
+ // for (const element of formConfiguration.MatrixBlockTypes) {
83
+ // element.required = true;
84
+ // }
85
+ }
75
86
  if (this._selected) {
76
87
  this._selected.forEach(el => {
77
88
  this.addMatrixControl(formConfiguration.MatrixBlockTypes.find(item => item.name == el.matrixBlockTypeName));
78
89
  });
79
90
  }
80
- if (this._fields.required) {
81
- for (const element of formConfiguration.MatrixBlockTypes) {
82
- element.required = true;
83
- }
84
- }
85
91
  this.MatrixBlockTypesList = formConfiguration.MatrixBlockTypes;
86
92
  resolve(true);
87
93
  });
88
94
  }
95
+ /**是否带有值验证器 */
96
+ hasValueValidator(g) {
97
+ // 检查是否有任何控件包含有效值
98
+ const hasValue = g.controls.some(element => {
99
+ const extraProperties = element.get('extraProperties');
100
+ return Object.keys(extraProperties.value).some(key => {
101
+ const value = extraProperties.value[key];
102
+ // 检查数组类型值
103
+ if (Array.isArray(value)) {
104
+ return value.length > 0;
105
+ }
106
+ // 检查非空值
107
+ return value !== null && value !== undefined && value !== '';
108
+ });
109
+ });
110
+ // 根据验证结果设置表单状态
111
+ g.controls.forEach(element => {
112
+ const extraProperties = element.get('extraProperties');
113
+ Object.keys(extraProperties.value).forEach(key => {
114
+ if (!hasValue) {
115
+ // 如果没有值,设置所有字段为必填
116
+ extraProperties.get(key).setValidators(Validators.required);
117
+ extraProperties.get(key).setErrors({ required: true });
118
+ }
119
+ else {
120
+ // 如果有值,清除错误
121
+ extraProperties.get(key).setErrors(null);
122
+ }
123
+ });
124
+ });
125
+ // 返回验证结果
126
+ return hasValue ? null : { required: true };
127
+ // return hasValue? null : null;
128
+ }
89
129
  /**增加指定矩阵控件项 */
90
130
  addMatrixControl(item) {
91
131
  this.fieldNameControl.push(new FormGroup({
@@ -110,11 +150,11 @@ export class MatrixControlComponent {
110
150
  this.fieldNameControl.updateValueAndValidity();
111
151
  }
112
152
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: MatrixControlComponent, deps: [{ token: i1.FormBuilder }, { token: i2.CmsApiService }], target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: MatrixControlComponent, selector: "df-matrix-control", inputs: { fields: "fields", parentFiledName: "parentFiledName", selected: "selected", culture: "culture", entity: "entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\">\n <div class=\"mb-3\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div [class]=\"fieldNameControl?.controls?.length>0?'border p-2 rounded-2':''\">\n <div [formArrayName]=\"_fields.field.name\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls;let i=index\">\n <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\" (click.stop)=\"ExpandChange(i)\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2 \" [style]=\"{display: 'inline-block', transform: item.value.isOpen?'rotate(180deg)':'rotate(0deg)'}\" ></i>\n </div>\n </div>\n <div class=\"card-body\" style=\"overflow:hidden;transition: all 0.2s;\" [style]=\"item.value.isOpen?'height:auto;':'height:0px;padding-top:0px;padding-bottom:0px;'\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic [fields]=\"{ field: elf,displayName:elf.displayName,required:el?.required||false }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div ngbAccordion #accordion=\"ngbAccordion\">\n <div ngbAccordionItem=\"first\">\n <h2 ngbAccordionHeader>\n <button ngbAccordionButton>\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div>\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2\"></i>\n </div>\n </div>\n </button>\n </h2>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody>\n <ng-template>\n <div class=\"card-body\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic\n [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\"\n [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div> -->\n\n\n <!-- -->\n </ng-container>\n </div>\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n <ng-container *ngFor=\"let item of MatrixBlockTypesList;let i =index\">\n <button type=\"button\" class=\"btn btn-dark soft btn-sm\" (click.stop)=\"addMatrixControl(item)\"><i\n class=\"fas fa-plus me-1\"></i>{{item.displayName}}</button>\n </ng-container>\n </div>\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: i6.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
153
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.5", type: MatrixControlComponent, selector: "df-matrix-control", inputs: { fields: "fields", parentFiledName: "parentFiledName", selected: "selected", culture: "culture", entity: "entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\">\n <div class=\"mb-3\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div [class]=\"fieldNameControl?.controls?.length>0?'border p-2 rounded-2':''\">\n <div [formArrayName]=\"_fields.field.name\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls;let i=index\">\n <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\" (click.stop)=\"ExpandChange(i)\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2 \" [style]=\"{display: 'inline-block', transform: item.value.isOpen?'rotate(180deg)':'rotate(0deg)'}\" ></i>\n </div>\n </div>\n <div class=\"card-body\" style=\"overflow:hidden;transition: all 0.2s;\" [style]=\"item.value.isOpen?'height:auto;':'height:0px;padding-top:0px;padding-bottom:0px;'\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div ngbAccordion #accordion=\"ngbAccordion\">\n <div ngbAccordionItem=\"first\">\n <h2 ngbAccordionHeader>\n <button ngbAccordionButton>\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div>\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2\"></i>\n </div>\n </div>\n </button>\n </h2>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody>\n <ng-template>\n <div class=\"card-body\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic\n [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\"\n [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div> -->\n\n\n <!-- -->\n </ng-container>\n </div>\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n <ng-container *ngFor=\"let item of MatrixBlockTypesList;let i =index\">\n <button type=\"button\" class=\"btn btn-dark soft btn-sm\" (click.stop)=\"addMatrixControl(item)\"><i\n class=\"fas fa-plus me-1\"></i>{{item.displayName}}</button>\n </ng-container>\n </div>\n @if(fieldNameControl?.errors?.required && fieldNameControl.touched){\n <span class=\"form-text invalid-feedback d-block\">{{\"AbpValidation::ThisFieldIsRequired.\"|abpLocalization}}</span>\n }\n \n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: i6.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
114
154
  }
115
155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: MatrixControlComponent, decorators: [{
116
156
  type: Component,
117
- args: [{ selector: 'df-matrix-control', template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\">\n <div class=\"mb-3\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div [class]=\"fieldNameControl?.controls?.length>0?'border p-2 rounded-2':''\">\n <div [formArrayName]=\"_fields.field.name\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls;let i=index\">\n <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\" (click.stop)=\"ExpandChange(i)\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2 \" [style]=\"{display: 'inline-block', transform: item.value.isOpen?'rotate(180deg)':'rotate(0deg)'}\" ></i>\n </div>\n </div>\n <div class=\"card-body\" style=\"overflow:hidden;transition: all 0.2s;\" [style]=\"item.value.isOpen?'height:auto;':'height:0px;padding-top:0px;padding-bottom:0px;'\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic [fields]=\"{ field: elf,displayName:elf.displayName,required:el?.required||false }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div ngbAccordion #accordion=\"ngbAccordion\">\n <div ngbAccordionItem=\"first\">\n <h2 ngbAccordionHeader>\n <button ngbAccordionButton>\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div>\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2\"></i>\n </div>\n </div>\n </button>\n </h2>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody>\n <ng-template>\n <div class=\"card-body\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic\n [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\"\n [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div> -->\n\n\n <!-- -->\n </ng-container>\n </div>\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n <ng-container *ngFor=\"let item of MatrixBlockTypesList;let i =index\">\n <button type=\"button\" class=\"btn btn-dark soft btn-sm\" (click.stop)=\"addMatrixControl(item)\"><i\n class=\"fas fa-plus me-1\"></i>{{item.displayName}}</button>\n </ng-container>\n </div>\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>" }]
157
+ args: [{ selector: 'df-matrix-control', template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\">\n <div class=\"mb-3\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div [class]=\"fieldNameControl?.controls?.length>0?'border p-2 rounded-2':''\">\n <div [formArrayName]=\"_fields.field.name\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls;let i=index\">\n <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\" (click.stop)=\"ExpandChange(i)\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2 \" [style]=\"{display: 'inline-block', transform: item.value.isOpen?'rotate(180deg)':'rotate(0deg)'}\" ></i>\n </div>\n </div>\n <div class=\"card-body\" style=\"overflow:hidden;transition: all 0.2s;\" [style]=\"item.value.isOpen?'height:auto;':'height:0px;padding-top:0px;padding-bottom:0px;'\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- <div class=\"card mb-3 border \" [formGroupName]=\"i\" cdkDrag cdkDragLockAxis=\"y\"\n [cdkDragData]=\"item\">\n <div ngbAccordion #accordion=\"ngbAccordion\">\n <div ngbAccordionItem=\"first\">\n <h2 ngbAccordionHeader>\n <button ngbAccordionButton>\n <div type=\"button\"\n class=\"card-header d-flex align-items-center justify-content-between border-bottom pt-1\">\n <div class=\"d-flex\">\n <div class=\"drag-handle me-2\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>{{item.value.displayName}}\n </div>\n <div>\n <button class=\"btn btn-sm btn-light p-0\"\n (click.stop)=\"deleteMatrixControl(i,item)\"><i\n class=\"fas fa-trash p-2\"></i></button>\n <i class=\"bi bi-chevron-down ms-2\"></i>\n </div>\n </div>\n </button>\n </h2>\n <div ngbAccordionCollapse>\n <div ngbAccordionBody>\n <ng-template>\n <div class=\"card-body\">\n <ng-container *ngFor=\"let el of MatrixBlockTypesList;let il =index\">\n <ng-container *ngIf=\"el.name===item.value.matrixBlockTypeName\">\n <ng-container *ngFor=\"let elf of el.fields; let fi=index\">\n <ng-container *ngIf=\"item&&elf&&_culture\">\n <df-dynamic\n [fields]=\"{ field: elf,displayName:elf.displayName }\"\n [selected]=\"_selected ? _selected[i]?_selected[i][_parentFiledName][elf.name]:'': ''\"\n [parentFiledName]=\"'extraProperties'\"\n [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n </div> -->\n\n\n <!-- -->\n </ng-container>\n </div>\n <div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n <ng-container *ngFor=\"let item of MatrixBlockTypesList;let i =index\">\n <button type=\"button\" class=\"btn btn-dark soft btn-sm\" (click.stop)=\"addMatrixControl(item)\"><i\n class=\"fas fa-plus me-1\"></i>{{item.displayName}}</button>\n </ng-container>\n </div>\n @if(fieldNameControl?.errors?.required && fieldNameControl.touched){\n <span class=\"form-text invalid-feedback d-block\">{{\"AbpValidation::ThisFieldIsRequired.\"|abpLocalization}}</span>\n }\n \n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>" }]
118
158
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.CmsApiService }], propDecorators: { fields: [{
119
159
  type: Input
120
160
  }], parentFiledName: [{
@@ -129,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
129
169
  type: ViewChild,
130
170
  args: ['submitclick', { static: true }]
131
171
  }] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY21zL3NyYy9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vbWF0cml4L21hdHJpeC1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Ntcy9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL21hdHJpeC9tYXRyaXgtY29udHJvbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFhLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBUXpELE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFBb0IsRUFBZSxFQUFVLGNBQTZCO1FBQXRELE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUUxRSxZQUFZO1FBQ1osWUFBTyxHQUFRLEVBQUUsQ0FBQztRQW9EVixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUErQ3hDLFVBQVU7UUFDVix5QkFBb0IsR0FBVSxFQUFFLENBQUM7SUF2RzRDLENBQUM7SUFJOUUsSUFDVyxNQUFNLENBQUMsQ0FBTTtRQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ04sS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FB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V0FBVyxDQUFDLElBQUksQ0FBQztTQUM5QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhO0lBQ2IsWUFBWSxDQUFDLEtBQUs7UUFDaEIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBYyxDQUFDO1FBQ2hGLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELFlBQVk7SUFDWixtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxZQUFZO0lBQ1osSUFBSSxDQUFDLEtBQVU7UUFDYixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNqRCxDQUFDOzhHQW5JVSxzQkFBc0I7a0dBQXRCLHNCQUFzQixpVENabkMsOG5QQXNHTzs7MkZEMUZNLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxtQkFBbUI7NEdBVWxCLE1BQU07c0JBRGhCLEtBQUs7Z0JBa0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBT0ssUUFBUTtzQkFEbEIsS0FBSztnQkFVSyxPQUFPO3NCQURqQixLQUFLO2dCQU9LLE1BQU07c0JBRGhCLEtBQUs7Z0JBUXNDLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGluamVjdCwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENtc0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEFicFZhbGlkYXRvcnMgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZi1tYXRyaXgtY29udHJvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRyaXgtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1jb250cm9sLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1hdHJpeENvbnRyb2xDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBfQ21zQXBpU2VydmljZTogQ21zQXBpU2VydmljZSkge31cblxuICAvKirlrZfmrrXphY3nva7liJfooaggKi9cbiAgX2ZpZWxkczogYW55ID0gJyc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZmllbGRzKHY6IGFueSkge1xuICAgIGlmICh2KSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2LmZpZWxkPy5mb3JtQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2LmZpZWxkPy5mb3JtQ29uZmlndXJhdGlvbltrZXldKSkge1xuICAgICAgICAgIHYuZmllbGQuZm9ybUNvbmZpZ3VyYXRpb25ba2V5XSA9IHRoaXMuX0Ntc0FwaVNlcnZpY2UuY29udmVydEtleXNUb0NhbWVsQ2FzZShcbiAgICAgICAgICAgIHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uW2tleV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9maWVsZHMgPSB2O1xuICAgIH1cbiAgfVxuXG4gIC8qKueItue6p+Wtl+auteWQjeensO+8jOeUqOS6juS4uuihqOWNleiuvue9ruaOp+S7tui1i+WAvCAqL1xuICBfcGFyZW50RmlsZWROYW1lOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGFyZW50RmlsZWROYW1lKHY6IGFueSkge1xuICAgIHRoaXMuX3BhcmVudEZpbGVkTmFtZSA9IHY7XG4gIH1cbiAgLyoq54i257qn5a2X5q615ZCN56ew77yM55So5LqO5Li66KGo5Y2V6K6+572u5o6n5Lu26LWL5YC8ICovXG4gIF9zZWxlY3RlZDogYW55O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xuICAgIGlmICh2KSB7XG4gICAgICB2ID0gdGhpcy5fQ21zQXBpU2VydmljZS5jb252ZXJ0S2V5c1RvQ2FtZWxDYXNlKHYpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xuICAgIH1cbiAgfVxuICAvKiror63oqIAgKi9cbiAgX2N1bHR1cmU6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjdWx0dXJlKHY6IGFueSkge1xuICAgIHRoaXMuX2N1bHR1cmUgPSB2O1xuICB9XG4gIC8qKuihqOWNleWunuS9kyAqL1xuICBfZW50aXR5OiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZW50aXR5KHY6IGFueSkge1xuICAgIHRoaXMuX2VudGl0eSA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIOiOt+WPlueItue6p+Wtl+auteS7o+ihqOeahOihqOWNlee7hCovXG4gIGV4dHJhUHJvcGVydGllczogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgLyoq5pWw5o2u5Yqg6L295a6M5oiQICovXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XG4gICAgaWYgKHRoaXMuX2ZpZWxkcyAmJiB0aGlzLl9lbnRpdHkgJiYgdGhpcy5fcGFyZW50RmlsZWROYW1lKSB7XG4gICAgICB0aGlzLmV4dHJhUHJvcGVydGllcyA9IHRoaXMuX2VudGl0eS5nZXQodGhpcy5fcGFyZW50RmlsZWROYW1lKSBhcyBGb3JtR3JvdXA7XG4gICAgICBhd2FpdCB0aGlzLkFmdGVySW5pdCgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyDmiYvliqjop6blj5Hlj5jmm7Tmo4DmtYtcbiAgICAgIHRoaXMuc3VibWl0Y2xpY2s/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWNrKCk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnBhdGNoVmFsdWUodGhpcy5fc2VsZWN0ZWQpO1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIE9iamVjdC5rZXlzKHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scykpIHtcbiAgICAgICAgIGNvbnN0IGl0ZW09ICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuYXQoTnVtYmVyKGluZGV4KSkgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgaXRlbS5nZXQoJ2lzT3BlbicpLnBhdGNoVmFsdWUoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZm9ybUNvbmZpZ3VyYXRpb246IGFueTtcbiAgLyoq6I635Y+W6KGo5qC85a2X5q615Luj6KGo55qE5o6n5Lu2ICovXG4gIGZpZWxkTmFtZUNvbnRyb2w6IEZvcm1BcnJheSB8IHVuZGVmaW5lZDtcblxuICBBZnRlckluaXQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICBjb25zdCBmb3JtQ29uZmlndXJhdGlvbiA9IHRoaXMuX2ZpZWxkcy5maWVsZC5mb3JtQ29uZmlndXJhdGlvbjtcbiAgICAgIGNvbnN0IG5ld0FycmF5R3JvdXAgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuZXh0cmFQcm9wZXJ0aWVzLnNldENvbnRyb2wodGhpcy5fZmllbGRzLmZpZWxkLm5hbWUsIG5ld0FycmF5R3JvdXApO1xuICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sID0gdGhpcy5leHRyYVByb3BlcnRpZXMuZ2V0KHRoaXMuX2ZpZWxkcy5maWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRNYXRyaXhDb250cm9sKFxuICAgICAgICAgICAgZm9ybUNvbmZpZ3VyYXRpb24uTWF0cml4QmxvY2tUeXBlcy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09IGVsLm1hdHJpeEJsb2NrVHlwZU5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYodGhpcy5fZmllbGRzLnJlcXVpcmVkKXtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvcm1Db25maWd1cmF0aW9uLk1hdHJpeEJsb2NrVHlwZXMpIHtcbiAgICAgICAgICBlbGVtZW50LnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLk1hdHJpeEJsb2NrVHlwZXNMaXN0ID0gZm9ybUNvbmZpZ3VyYXRpb24uTWF0cml4QmxvY2tUeXBlcztcbiAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKirnn6npmLXliJfooaggKi9cbiAgTWF0cml4QmxvY2tUeXBlc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoq5aKe5Yqg5oyH5a6a55+p6Zi15o6n5Lu26aG5ICovXG4gIGFkZE1hdHJpeENvbnRyb2woaXRlbSkge1xuICAgIHRoaXMuZmllbGROYW1lQ29udHJvbC5wdXNoKFxuICAgICAgbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGV4dHJhUHJvcGVydGllczogbmV3IEZvcm1Hcm91cCh7fSksXG4gICAgICAgIG1hdHJpeEJsb2NrVHlwZU5hbWU6IG5ldyBGb3JtQ29udHJvbChpdGVtLm5hbWUpLFxuICAgICAgICBkaXNwbGF5TmFtZTogbmV3IEZvcm1Db250cm9sKGl0ZW0uZGlzcGxheU5hbWUpLFxuICAgICAgICBpc09wZW46IG5ldyBGb3JtQ29udHJvbCh0cnVlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKirlsZXlvIDvvIzmlLbnvKnnn6npmLUgKi9cbiAgRXhwYW5kQ2hhbmdlKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGROYW1lQ29udHJvbEl0ZW0gPSB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuY29udHJvbHNbaW5kZXhdIGFzIEZvcm1Hcm91cDtcbiAgICBmaWVsZE5hbWVDb250cm9sSXRlbS5nZXQoJ2lzT3BlbicpLnBhdGNoVmFsdWUoIWZpZWxkTmFtZUNvbnRyb2xJdGVtLmdldCgnaXNPcGVuJykudmFsdWUpO1xuICB9XG4gIC8qKuWIoOmZpOefqemYteaOp+S7tiAqL1xuICBkZWxldGVNYXRyaXhDb250cm9sKGluZGV4LCBpdGVtKSB7XG4gICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgZHJvcChldmVudDogYW55KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIl9lbnRpdHlcIj5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJleHRyYVByb3BlcnRpZXNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiAqbmdJZj1cIl9maWVsZHMuZGlzcGxheU5hbWVcIj57eyBfZmllbGRzLmRpc3BsYXlOYW1lIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZpZWxkTmFtZUNvbnRyb2w/LmNvbnRyb2xzPy5sZW5ndGg+MD8nYm9yZGVyIHAtMiByb3VuZGVkLTInOicnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbZm9ybUFycmF5TmFtZV09XCJfZmllbGRzLmZpZWxkLm5hbWVcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkTmFtZUNvbnRyb2wuY29udHJvbHM7bGV0IGk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTMgYm9yZGVyIFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjZGtEcmFnIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGJvcmRlci1ib3R0b20gcHQtMVwiIChjbGljay5zdG9wKT1cIkV4cGFuZENoYW5nZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGUgbWUtMlwiIGNka0RyYWdIYW5kbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaSBiaS1hcnJvd3MtbW92ZSBmcy01XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+e3tpdGVtLnZhbHVlLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJkZWxldGVNYXRyaXhDb250cm9sKGksaXRlbSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10cmFzaCBwLTJcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvd24gbXMtMiBcIiBbc3R5bGVdPVwie2Rpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCB0cmFuc2Zvcm06IGl0ZW0udmFsdWUuaXNPcGVuPydyb3RhdGUoMTgwZGVnKSc6J3JvdGF0ZSgwZGVnKSd9XCIgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246IGFsbCAwLjJzO1wiIFtzdHlsZV09XCJpdGVtLnZhbHVlLmlzT3Blbj8naGVpZ2h0OmF1dG87JzonaGVpZ2h0OjBweDtwYWRkaW5nLXRvcDowcHg7cGFkZGluZy1ib3R0b206MHB4OydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgTWF0cml4QmxvY2tUeXBlc0xpc3Q7bGV0IGlsID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsLm5hbWU9PT1pdGVtLnZhbHVlLm1hdHJpeEJsb2NrVHlwZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGYgb2YgZWwuZmllbGRzOyBsZXQgZmk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0mJmVsZiYmX2N1bHR1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZi1keW5hbWljIFtmaWVsZHNdPVwieyBmaWVsZDogZWxmLGRpc3BsYXlOYW1lOmVsZi5kaXNwbGF5TmFtZSxyZXF1aXJlZDplbD8ucmVxdWlyZWR8fGZhbHNlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0ZWQgPyBfc2VsZWN0ZWRbaV0/X3NlbGVjdGVkW2ldW19wYXJlbnRGaWxlZE5hbWVdW2VsZi5uYW1lXTonJzogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRGaWxlZE5hbWVdPVwiJ2V4dHJhUHJvcGVydGllcydcIiBbY3VsdHVyZV09XCJfY3VsdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJpdGVtXCI+PC9kZi1keW5hbWljPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FyZCBtYi0zIGJvcmRlciBcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2RrRHJhZyBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZmlyc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gYm9yZGVyLWJvdHRvbSBwdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlIG1lLTJcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpIGJpLWFycm93cy1tb3ZlIGZzLTVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+e3tpdGVtLnZhbHVlLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiZGVsZXRlTWF0cml4Q29udHJvbChpLGl0ZW0pXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRyYXNoIHAtMlwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZXZyb24tZG93biBtcy0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgTWF0cml4QmxvY2tUeXBlc0xpc3Q7bGV0IGlsID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWwubmFtZT09PWl0ZW0udmFsdWUubWF0cml4QmxvY2tUeXBlTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxmIG9mIGVsLmZpZWxkczsgbGV0IGZpPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0mJmVsZiYmX2N1bHR1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRmLWR5bmFtaWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwieyBmaWVsZDogZWxmLGRpc3BsYXlOYW1lOmVsZi5kaXNwbGF5TmFtZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0ZWQgPyBfc2VsZWN0ZWRbaV0/X3NlbGVjdGVkW2ldW19wYXJlbnRGaWxlZE5hbWVdW2VsZi5uYW1lXTonJzogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudEZpbGVkTmFtZV09XCInZXh0cmFQcm9wZXJ0aWVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VsdHVyZV09XCJfY3VsdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cIml0ZW1cIj48L2RmLWR5bmFtaWM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJCYXNpYyBleGFtcGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgTWF0cml4QmxvY2tUeXBlc0xpc3Q7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFyayBzb2Z0IGJ0bi1zbVwiIChjbGljay5zdG9wKT1cImFkZE1hdHJpeENvbnRyb2woaXRlbSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1wbHVzIG1lLTFcIj48L2k+e3tpdGVtLmRpc3BsYXlOYW1lfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtbXV0ZWQgZC1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX2ZpZWxkcy5maWVsZC5kZXNjcmlwdGlvblwiPnt7X2ZpZWxkcy5maWVsZC5kZXNjcmlwdGlvbn19PC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiAjc3VibWl0Y2xpY2s+PC9idXR0b24+XG48L2Zvcm0+Il19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY21zL3NyYy9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vbWF0cml4L21hdHJpeC1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Ntcy9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL21hdHJpeC9tYXRyaXgtY29udHJvbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFhLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7OztBQU96RCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQW9CLEVBQWUsRUFBVSxjQUE2QjtRQUF0RCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFFMUUsWUFBWTtRQUNaLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFvRFYsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBMEZ4QyxVQUFVO1FBQ1YseUJBQW9CLEdBQVUsRUFBRSxDQUFDO0lBbEo0QyxDQUFDO0lBSTlFLElBQ1csTUFBTSxDQUFDLENBQU07UUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNOLEtBQUssTUFBTSxHQUFHLElBQUksQ0FB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LElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELFlBQVk7SUFDWixJQUFJLENBQUMsS0FBVTtRQUNiLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2pELENBQUM7OEdBOUtVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLGlUQ1huQyx1MlBBMEdPOzsyRkQvRk0sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG1CQUFtQjs0R0FVbEIsTUFBTTtzQkFEaEIsS0FBSztnQkFrQkssZUFBZTtzQkFEekIsS0FBSztnQkFPSyxRQUFRO3NCQURsQixLQUFLO2dCQVVLLE9BQU87c0JBRGpCLEtBQUs7Z0JBT0ssTUFBTTtzQkFEaEIsS0FBSztnQkFRc0MsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ21zQXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZi1tYXRyaXgtY29udHJvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRyaXgtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1jb250cm9sLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1hdHJpeENvbnRyb2xDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBfQ21zQXBpU2VydmljZTogQ21zQXBpU2VydmljZSkge31cblxuICAvKirlrZfmrrXphY3nva7liJfooaggKi9cbiAgX2ZpZWxkczogYW55ID0gJyc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZmllbGRzKHY6IGFueSkge1xuICAgIGlmICh2KSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2LmZpZWxkPy5mb3JtQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2LmZpZWxkPy5mb3JtQ29uZmlndXJhdGlvbltrZXldKSkge1xuICAgICAgICAgIHYuZmllbGQuZm9ybUNvbmZpZ3VyYXRpb25ba2V5XSA9IHRoaXMuX0Ntc0FwaVNlcnZpY2UuY29udmVydEtleXNUb0NhbWVsQ2FzZShcbiAgICAgICAgICAgIHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uW2tleV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9maWVsZHMgPSB2O1xuICAgIH1cbiAgfVxuXG4gIC8qKueItue6p+Wtl+auteWQjeensO+8jOeUqOS6juS4uuihqOWNleiuvue9ruaOp+S7tui1i+WAvCAqL1xuICBfcGFyZW50RmlsZWROYW1lOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGFyZW50RmlsZWROYW1lKHY6IGFueSkge1xuICAgIHRoaXMuX3BhcmVudEZpbGVkTmFtZSA9IHY7XG4gIH1cbiAgLyoq54i257qn5a2X5q615ZCN56ew77yM55So5LqO5Li66KGo5Y2V6K6+572u5o6n5Lu26LWL5YC8ICovXG4gIF9zZWxlY3RlZDogYW55O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xuICAgIGlmICh2KSB7XG4gICAgICB2ID0gdGhpcy5fQ21zQXBpU2VydmljZS5jb252ZXJ0S2V5c1RvQ2FtZWxDYXNlKHYpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xuICAgIH1cbiAgfVxuICAvKiror63oqIAgKi9cbiAgX2N1bHR1cmU6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjdWx0dXJlKHY6IGFueSkge1xuICAgIHRoaXMuX2N1bHR1cmUgPSB2O1xuICB9XG4gIC8qKuihqOWNleWunuS9kyAqL1xuICBfZW50aXR5OiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZW50aXR5KHY6IGFueSkge1xuICAgIHRoaXMuX2VudGl0eSA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIOiOt+WPlueItue6p+Wtl+auteS7o+ihqOeahOihqOWNlee7hCovXG4gIGV4dHJhUHJvcGVydGllczogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgLyoq5pWw5o2u5Yqg6L295a6M5oiQICovXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XG4gICAgaWYgKHRoaXMuX2ZpZWxkcyAmJiB0aGlzLl9lbnRpdHkgJiYgdGhpcy5fcGFyZW50RmlsZWROYW1lKSB7XG4gICAgICB0aGlzLmV4dHJhUHJvcGVydGllcyA9IHRoaXMuX2VudGl0eS5nZXQodGhpcy5fcGFyZW50RmlsZWROYW1lKSBhcyBGb3JtR3JvdXA7XG4gICAgICBhd2FpdCB0aGlzLkFmdGVySW5pdCgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyDmiYvliqjop6blj5Hlj5jmm7Tmo4DmtYtcbiAgICAgIHRoaXMuc3VibWl0Y2xpY2s/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWNrKCk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnBhdGNoVmFsdWUodGhpcy5fc2VsZWN0ZWQpO1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIE9iamVjdC5rZXlzKHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scykpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5maWVsZE5hbWVDb250cm9sLmF0KE51bWJlcihpbmRleCkpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICBpdGVtLmdldCgnaXNPcGVuJykucGF0Y2hWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gJyc7XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpZWxkTmFtZUNvbnRyb2wsICdmaWVsZE5hbWVDb250cm9sJywgdGhpcy5fZmllbGRzLmZpZWxkLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1Db25maWd1cmF0aW9uOiBhbnk7XG4gIC8qKuiOt+WPluihqOagvOWtl+auteS7o+ihqOeahOaOp+S7tiAqL1xuICBmaWVsZE5hbWVDb250cm9sOiBGb3JtQXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgQWZ0ZXJJbml0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgY29uc3QgZm9ybUNvbmZpZ3VyYXRpb24gPSB0aGlzLl9maWVsZHMuZmllbGQuZm9ybUNvbmZpZ3VyYXRpb247XG4gICAgICBjb25zdCBWYWxpZGF0b3JzQXJyYXkgPSBbXTtcbiAgICAgIGlmICh0aGlzLl9maWVsZHMucmVxdWlyZWQpIHtcbiAgICAgICAgVmFsaWRhdG9yc0FycmF5LnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdBcnJheUdyb3VwID0gdGhpcy5mYi5hcnJheShbXSwgVmFsaWRhdG9yc0FycmF5KTtcbiAgICAgIHRoaXMuZXh0cmFQcm9wZXJ0aWVzLnNldENvbnRyb2wodGhpcy5fZmllbGRzLmZpZWxkLm5hbWUsIG5ld0FycmF5R3JvdXApO1xuICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sID0gdGhpcy5leHRyYVByb3BlcnRpZXMuZ2V0KHRoaXMuX2ZpZWxkcy5maWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgICBpZiAodGhpcy5fZmllbGRzLnJlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMuZmllbGROYW1lQ29udHJvbC5hZGRWYWxpZGF0b3JzKHRoaXMuaGFzVmFsdWVWYWxpZGF0b3IpO1xuICAgICAgICAvLyBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm9ybUNvbmZpZ3VyYXRpb24uTWF0cml4QmxvY2tUeXBlcykge1xuICAgICAgICAvLyAgIGVsZW1lbnQucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE1hdHJpeENvbnRyb2woXG4gICAgICAgICAgICBmb3JtQ29uZmlndXJhdGlvbi5NYXRyaXhCbG9ja1R5cGVzLmZpbmQoaXRlbSA9PiBpdGVtLm5hbWUgPT0gZWwubWF0cml4QmxvY2tUeXBlTmFtZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuTWF0cml4QmxvY2tUeXBlc0xpc3QgPSBmb3JtQ29uZmlndXJhdGlvbi5NYXRyaXhCbG9ja1R5cGVzO1xuICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuaYr+WQpuW4puacieWAvOmqjOivgeWZqCAqL1xuICBoYXNWYWx1ZVZhbGlkYXRvcihnOiBGb3JtQXJyYXkpIHtcbiAgICAvLyDmo4Dmn6XmmK/lkKbmnInku7vkvZXmjqfku7bljIXlkKvmnInmlYjlgLxcbiAgICBjb25zdCBoYXNWYWx1ZSA9IGcuY29udHJvbHMuc29tZShlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0KCdleHRyYVByb3BlcnRpZXMnKTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhleHRyYVByb3BlcnRpZXMudmFsdWUpLnNvbWUoa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleHRyYVByb3BlcnRpZXMudmFsdWVba2V5XTtcbiAgICAgICAgLy8g5qOA5p+l5pWw57uE57G75Z6L5YC8XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIOajgOafpemdnuepuuWAvFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIOagueaNrumqjOivgee7k+aenOiuvue9ruihqOWNleeKtuaAgVxuICAgIGcuY29udHJvbHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0KCdleHRyYVByb3BlcnRpZXMnKTtcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhUHJvcGVydGllcy52YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgLy8g5aaC5p6c5rKh5pyJ5YC877yM6K6+572u5omA5pyJ5a2X5q615Li65b+F5aGrXG4gICAgICAgICAgZXh0cmFQcm9wZXJ0aWVzLmdldChrZXkpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgZXh0cmFQcm9wZXJ0aWVzLmdldChrZXkpLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOWmguaenOacieWAvO+8jOa4hemZpOmUmeivr1xuICAgICAgICAgIGV4dHJhUHJvcGVydGllcy5nZXQoa2V5KS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8g6L+U5Zue6aqM6K+B57uT5p6cXG4gICAgcmV0dXJuIGhhc1ZhbHVlPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIC8vIHJldHVybiBoYXNWYWx1ZT8gbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKirnn6npmLXliJfooaggKi9cbiAgTWF0cml4QmxvY2tUeXBlc0xpc3Q6IGFueVtdID0gW107XG5cbiAgLyoq5aKe5Yqg5oyH5a6a55+p6Zi15o6n5Lu26aG5ICovXG4gIGFkZE1hdHJpeENvbnRyb2woaXRlbSkge1xuICAgIHRoaXMuZmllbGROYW1lQ29udHJvbC5wdXNoKFxuICAgICAgbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIGV4dHJhUHJvcGVydGllczogbmV3IEZvcm1Hcm91cCh7fSksXG4gICAgICAgIG1hdHJpeEJsb2NrVHlwZU5hbWU6IG5ldyBGb3JtQ29udHJvbChpdGVtLm5hbWUpLFxuICAgICAgICBkaXNwbGF5TmFtZTogbmV3IEZvcm1Db250cm9sKGl0ZW0uZGlzcGxheU5hbWUpLFxuICAgICAgICBpc09wZW46IG5ldyBGb3JtQ29udHJvbCh0cnVlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKirlsZXlvIDvvIzmlLbnvKnnn6npmLUgKi9cbiAgRXhwYW5kQ2hhbmdlKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGROYW1lQ29udHJvbEl0ZW0gPSB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuY29udHJvbHNbaW5kZXhdIGFzIEZvcm1Hcm91cDtcbiAgICBmaWVsZE5hbWVDb250cm9sSXRlbS5nZXQoJ2lzT3BlbicpLnBhdGNoVmFsdWUoIWZpZWxkTmFtZUNvbnRyb2xJdGVtLmdldCgnaXNPcGVuJykudmFsdWUpO1xuICB9XG4gIC8qKuWIoOmZpOefqemYteaOp+S7tiAqL1xuICBkZWxldGVNYXRyaXhDb250cm9sKGluZGV4LCBpdGVtKSB7XG4gICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgZHJvcChldmVudDogYW55KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIl9lbnRpdHlcIj5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJleHRyYVByb3BlcnRpZXNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiAqbmdJZj1cIl9maWVsZHMuZGlzcGxheU5hbWVcIj57eyBfZmllbGRzLmRpc3BsYXlOYW1lIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZpZWxkTmFtZUNvbnRyb2w/LmNvbnRyb2xzPy5sZW5ndGg+MD8nYm9yZGVyIHAtMiByb3VuZGVkLTInOicnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbZm9ybUFycmF5TmFtZV09XCJfZmllbGRzLmZpZWxkLm5hbWVcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkTmFtZUNvbnRyb2wuY29udHJvbHM7bGV0IGk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTMgYm9yZGVyIFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjZGtEcmFnIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGJvcmRlci1ib3R0b20gcHQtMVwiIChjbGljay5zdG9wKT1cIkV4cGFuZENoYW5nZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGUgbWUtMlwiIGNka0RyYWdIYW5kbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaSBiaS1hcnJvd3MtbW92ZSBmcy01XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+e3tpdGVtLnZhbHVlLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJkZWxldGVNYXRyaXhDb250cm9sKGksaXRlbSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10cmFzaCBwLTJcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvd24gbXMtMiBcIiBbc3R5bGVdPVwie2Rpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCB0cmFuc2Zvcm06IGl0ZW0udmFsdWUuaXNPcGVuPydyb3RhdGUoMTgwZGVnKSc6J3JvdGF0ZSgwZGVnKSd9XCIgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246IGFsbCAwLjJzO1wiIFtzdHlsZV09XCJpdGVtLnZhbHVlLmlzT3Blbj8naGVpZ2h0OmF1dG87JzonaGVpZ2h0OjBweDtwYWRkaW5nLXRvcDowcHg7cGFkZGluZy1ib3R0b206MHB4OydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgTWF0cml4QmxvY2tUeXBlc0xpc3Q7bGV0IGlsID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsLm5hbWU9PT1pdGVtLnZhbHVlLm1hdHJpeEJsb2NrVHlwZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGYgb2YgZWwuZmllbGRzOyBsZXQgZmk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0mJmVsZiYmX2N1bHR1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZi1keW5hbWljIFtmaWVsZHNdPVwieyBmaWVsZDogZWxmLGRpc3BsYXlOYW1lOmVsZi5kaXNwbGF5TmFtZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiX3NlbGVjdGVkID8gX3NlbGVjdGVkW2ldP19zZWxlY3RlZFtpXVtfcGFyZW50RmlsZWROYW1lXVtlbGYubmFtZV06Jyc6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50RmlsZWROYW1lXT1cIidleHRyYVByb3BlcnRpZXMnXCIgW2N1bHR1cmVdPVwiX2N1bHR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiaXRlbVwiPjwvZGYtZHluYW1pYz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhcmQgbWItMyBib3JkZXIgXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNka0RyYWcgY2RrRHJhZ0xvY2tBeGlzPVwieVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImZpcnN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGJvcmRlci1ib3R0b20gcHQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZSBtZS0yXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaSBiaS1hcnJvd3MtbW92ZSBmcy01XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pnt7aXRlbS52YWx1ZS5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IHAtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cImRlbGV0ZU1hdHJpeENvbnRyb2woaSxpdGVtKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10cmFzaCBwLTJcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvd24gbXMtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsIG9mIE1hdHJpeEJsb2NrVHlwZXNMaXN0O2xldCBpbCA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsLm5hbWU9PT1pdGVtLnZhbHVlLm1hdHJpeEJsb2NrVHlwZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZiBvZiBlbC5maWVsZHM7IGxldCBmaT1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtJiZlbGYmJl9jdWx0dXJlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZi1keW5hbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cInsgZmllbGQ6IGVsZixkaXNwbGF5TmFtZTplbGYuZGlzcGxheU5hbWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiX3NlbGVjdGVkID8gX3NlbGVjdGVkW2ldP19zZWxlY3RlZFtpXVtfcGFyZW50RmlsZWROYW1lXVtlbGYubmFtZV06Jyc6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRGaWxlZE5hbWVdPVwiJ2V4dHJhUHJvcGVydGllcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1bHR1cmVdPVwiX2N1bHR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJpdGVtXCI+PC9kZi1keW5hbWljPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQmFzaWMgZXhhbXBsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIE1hdHJpeEJsb2NrVHlwZXNMaXN0O2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhcmsgc29mdCBidG4tc21cIiAoY2xpY2suc3RvcCk9XCJhZGRNYXRyaXhDb250cm9sKGl0ZW0pXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtcGx1cyBtZS0xXCI+PC9pPnt7aXRlbS5kaXNwbGF5TmFtZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZihmaWVsZE5hbWVDb250cm9sPy5lcnJvcnM/LnJlcXVpcmVkICYmIGZpZWxkTmFtZUNvbnRyb2wudG91Y2hlZCl7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS10ZXh0IGludmFsaWQtZmVlZGJhY2sgZC1ibG9ja1wiPnt7XCJBYnBWYWxpZGF0aW9uOjpUaGlzRmllbGRJc1JlcXVpcmVkLlwifGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1tdXRlZCBkLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJfZmllbGRzLmZpZWxkLmRlc2NyaXB0aW9uXCI+e3tfZmllbGRzLmZpZWxkLmRlc2NyaXB0aW9ufX08L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiICNzdWJtaXRjbGljaz48L2J1dHRvbj5cbjwvZm9ybT4iXX0=
@@ -64,15 +64,16 @@ export class TableControlComponent {
64
64
  ValidatorsArray.push(Validators.required);
65
65
  }
66
66
  const formConfiguration = this._fields.field.formConfiguration;
67
- if (this._fields.required) {
68
- for (const element of formConfiguration.TableColumns) {
69
- element.required = true;
70
- }
71
- }
72
67
  this.formConfiguration = formConfiguration;
73
- const newArrayGroup = this.fb.array([]);
68
+ const newArrayGroup = this.fb.array([], ValidatorsArray);
74
69
  this.extraProperties.setControl(this._fields.field.name, newArrayGroup);
75
70
  this.fieldNameControl = this.extraProperties.get(this._fields.field.name);
71
+ if (this._fields.required) {
72
+ this.fieldNameControl.addValidators(this.hasValueValidator);
73
+ // for (const element of formConfiguration.TableColumns) {
74
+ // element.required = true;
75
+ // }
76
+ }
76
77
  if (this._selected) {
77
78
  this._selected.forEach(el => {
78
79
  this.addTableControlItem();
@@ -85,11 +86,45 @@ export class TableControlComponent {
85
86
  resolve(true);
86
87
  });
87
88
  }
89
+ /**是否带有值验证器 */
90
+ hasValueValidator(g) {
91
+ // 检查是否有任何控件包含有效值
92
+ const hasValue = g.controls.some(element => {
93
+ const extraProperties = element.get('extraProperties');
94
+ return Object.keys(extraProperties.value).some(key => {
95
+ const value = extraProperties.value[key];
96
+ // 检查数组类型值
97
+ if (Array.isArray(value)) {
98
+ return value.length > 0;
99
+ }
100
+ // 检查非空值
101
+ return value !== null && value !== undefined && value !== '';
102
+ });
103
+ });
104
+ // 根据验证结果设置表单状态
105
+ g.controls.forEach(element => {
106
+ const extraProperties = element.get('extraProperties');
107
+ Object.keys(extraProperties.value).forEach(key => {
108
+ if (!hasValue) {
109
+ // 如果没有值,设置所有字段为必填
110
+ extraProperties.get(key).setValidators(Validators.required);
111
+ extraProperties.get(key).setErrors({ required: true });
112
+ }
113
+ else {
114
+ // 如果有值,清除错误
115
+ extraProperties.get(key).setErrors(null);
116
+ }
117
+ });
118
+ });
119
+ // 返回验证结果
120
+ return hasValue && g.controls.length > 0 ? null : { required: true };
121
+ }
88
122
  /**增加表格项 */
89
123
  addTableControlItem() {
90
124
  this.fieldNameControl.push(this.fb.group({
91
125
  extraProperties: this.fb.group({}),
92
126
  }));
127
+ // this.fieldNameControl.updateValueAndValidity();
93
128
  }
94
129
  /**删除表格项 */
95
130
  minusTableControlItem(index) {
@@ -109,11 +144,11 @@ export class TableControlComponent {
109
144
  this.fieldNameControl.updateValueAndValidity();
110
145
  }
111
146
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: TableControlComponent, deps: [{ token: i1.CmsApiService }], target: i0.ɵɵFactoryTarget.Component }); }
112
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: TableControlComponent, selector: "df-table-control", inputs: { entity: "entity", fields: "fields", parentFiledName: "parentFiledName", selected: "selected", culture: "culture" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\" >\n <div class=\"mb-3 table-control\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div class=\"table-responsive table-fixed-header\">\n <table class=\"table overflow-nowrap mb-0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th ></th>\n <ng-container *ngFor=\"let item of formConfiguration.TableColumns\">\n <th [attr.field-type]=\"item.formControlName\" >{{ item.displayName }}</th>\n </ng-container>\n <th class=\"sticky-right-card-bg\" >\n <div class=\"flex-end\">\n <button class=\"btn btn-light btn-sm\" (click.stop)=\"addTableControlItem()\">\n <i class=\"fas fa-plus-circle\"></i>\n </button>\n </div>\n \n </th>\n </tr>\n </thead>\n <tbody [formArrayName]=\"_fields.field.name\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls; let i = index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <ng-container *ngFor=\"let el of formConfiguration.TableColumns\">\n <td>\n <ng-container *ngIf=\"item&&el\">\n <df-dynamic [fields]=\"{ field: el,required:el?.required||false }\"\n [selected]=\"_selected?_selected[i]?.extraProperties[''+el.name+'']:''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </td>\n </ng-container>\n <td scope=\"row\" class=\"sticky-right-card-bg\">\n <div class=\"flex-end mb-3\">\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"minusTableControlItem(i)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n <!-- <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('up',i)\" *ngIf=\"i!==0\">\n <i class=\"fas fa-arrow-up\"></i>\n </button>\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('down',i)\"\n *ngIf=\"i!==fieldNameControl.controls.length-1\">\n <i class=\"fas fa-arrow-down\"></i>\n </button> -->\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [".flex-end{display:flex;align-items:center;justify-content:flex-end}.flex-start{display:flex;align-items:center;justify-content:flex-start}.table-control .sticky-right-card-bg{position:sticky;right:0;background:var(--bs-card-bg)}.table-control .table th{white-space:nowrap}.table-control .table th[field-type=TextEdit],.table-control .table th[field-type=Select],.table-control .table th[field-type=DateEdit],.table-control .table th[field-type=NumericEdit],.table-control .table th[field-type=Entry]{min-width:200px}.table-control .table th[field-type=FileExplorer],.table-control .table th[field-type=CkEditor]{min-width:300px}.table-control .table th[field-type=Matrix]{min-width:400px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: i6.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
147
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.5", type: TableControlComponent, selector: "df-table-control", inputs: { entity: "entity", fields: "fields", parentFiledName: "parentFiledName", selected: "selected", culture: "culture" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\" >\n <div class=\"mb-3 table-control\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div class=\"table-responsive table-fixed-header\">\n <table class=\"table overflow-nowrap mb-0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th ></th>\n <ng-container *ngFor=\"let item of formConfiguration.TableColumns\">\n <th [attr.field-type]=\"item.formControlName\" >{{ item.displayName }}</th>\n </ng-container>\n <th class=\"sticky-right-card-bg\" >\n <div class=\"flex-end\">\n <button class=\"btn btn-light btn-sm\" (click.stop)=\"addTableControlItem()\">\n <i class=\"fas fa-plus-circle\"></i>\n </button>\n </div>\n \n </th>\n </tr>\n </thead>\n <tbody [formArrayName]=\"_fields.field.name\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls; let i = index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <ng-container *ngFor=\"let el of formConfiguration.TableColumns\">\n <td>\n <ng-container *ngIf=\"item&&el\">\n <df-dynamic [fields]=\"{ field: el }\"\n [selected]=\"_selected?_selected[i]?.extraProperties[''+el.name+'']:''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </td>\n </ng-container>\n <td scope=\"row\" class=\"sticky-right-card-bg\">\n <div class=\"flex-end mb-3\">\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"minusTableControlItem(i)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n <!-- <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('up',i)\" *ngIf=\"i!==0\">\n <i class=\"fas fa-arrow-up\"></i>\n </button>\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('down',i)\"\n *ngIf=\"i!==fieldNameControl.controls.length-1\">\n <i class=\"fas fa-arrow-down\"></i>\n </button> -->\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n @if(fieldNameControl?.errors?.required && fieldNameControl.touched){\n <span class=\"form-text invalid-feedback d-block\">{{\"AbpValidation::ThisFieldIsRequired.\"|abpLocalization}}</span>\n }\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [".flex-end{display:flex;align-items:center;justify-content:flex-end}.flex-start{display:flex;align-items:center;justify-content:flex-start}.table-control .sticky-right-card-bg{position:sticky;right:0;background:var(--bs-card-bg)}.table-control .table th{white-space:nowrap}.table-control .table th[field-type=TextEdit],.table-control .table th[field-type=Select],.table-control .table th[field-type=DateEdit],.table-control .table th[field-type=NumericEdit],.table-control .table th[field-type=Entry]{min-width:200px}.table-control .table th[field-type=FileExplorer],.table-control .table th[field-type=CkEditor]{min-width:300px}.table-control .table th[field-type=Matrix]{min-width:400px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: i6.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "culture", "parentFiledName", "fields", "entity"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
113
148
  }
114
149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: TableControlComponent, decorators: [{
115
150
  type: Component,
116
- args: [{ selector: 'df-table-control', template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\" >\n <div class=\"mb-3 table-control\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div class=\"table-responsive table-fixed-header\">\n <table class=\"table overflow-nowrap mb-0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th ></th>\n <ng-container *ngFor=\"let item of formConfiguration.TableColumns\">\n <th [attr.field-type]=\"item.formControlName\" >{{ item.displayName }}</th>\n </ng-container>\n <th class=\"sticky-right-card-bg\" >\n <div class=\"flex-end\">\n <button class=\"btn btn-light btn-sm\" (click.stop)=\"addTableControlItem()\">\n <i class=\"fas fa-plus-circle\"></i>\n </button>\n </div>\n \n </th>\n </tr>\n </thead>\n <tbody [formArrayName]=\"_fields.field.name\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls; let i = index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <ng-container *ngFor=\"let el of formConfiguration.TableColumns\">\n <td>\n <ng-container *ngIf=\"item&&el\">\n <df-dynamic [fields]=\"{ field: el,required:el?.required||false }\"\n [selected]=\"_selected?_selected[i]?.extraProperties[''+el.name+'']:''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </td>\n </ng-container>\n <td scope=\"row\" class=\"sticky-right-card-bg\">\n <div class=\"flex-end mb-3\">\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"minusTableControlItem(i)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n <!-- <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('up',i)\" *ngIf=\"i!==0\">\n <i class=\"fas fa-arrow-up\"></i>\n </button>\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('down',i)\"\n *ngIf=\"i!==fieldNameControl.controls.length-1\">\n <i class=\"fas fa-arrow-down\"></i>\n </button> -->\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [".flex-end{display:flex;align-items:center;justify-content:flex-end}.flex-start{display:flex;align-items:center;justify-content:flex-start}.table-control .sticky-right-card-bg{position:sticky;right:0;background:var(--bs-card-bg)}.table-control .table th{white-space:nowrap}.table-control .table th[field-type=TextEdit],.table-control .table th[field-type=Select],.table-control .table th[field-type=DateEdit],.table-control .table th[field-type=NumericEdit],.table-control .table th[field-type=Entry]{min-width:200px}.table-control .table th[field-type=FileExplorer],.table-control .table th[field-type=CkEditor]{min-width:300px}.table-control .table th[field-type=Matrix]{min-width:400px}\n"] }]
151
+ args: [{ selector: 'df-table-control', template: "<form [formGroup]=\"_entity\">\n <div formGroupName=\"extraProperties\" >\n <div class=\"mb-3 table-control\">\n <label class=\"form-label\" *ngIf=\"_fields.displayName\">{{ _fields.displayName }}</label>\n <div class=\"table-responsive table-fixed-header\">\n <table class=\"table overflow-nowrap mb-0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th ></th>\n <ng-container *ngFor=\"let item of formConfiguration.TableColumns\">\n <th [attr.field-type]=\"item.formControlName\" >{{ item.displayName }}</th>\n </ng-container>\n <th class=\"sticky-right-card-bg\" >\n <div class=\"flex-end\">\n <button class=\"btn btn-light btn-sm\" (click.stop)=\"addTableControlItem()\">\n <i class=\"fas fa-plus-circle\"></i>\n </button>\n </div>\n \n </th>\n </tr>\n </thead>\n <tbody [formArrayName]=\"_fields.field.name\">\n <ng-container *ngFor=\"let item of fieldNameControl.controls; let i = index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <ng-container *ngFor=\"let el of formConfiguration.TableColumns\">\n <td>\n <ng-container *ngIf=\"item&&el\">\n <df-dynamic [fields]=\"{ field: el }\"\n [selected]=\"_selected?_selected[i]?.extraProperties[''+el.name+'']:''\"\n [parentFiledName]=\"'extraProperties'\" [culture]=\"_culture\"\n [entity]=\"item\"></df-dynamic>\n </ng-container>\n </td>\n </ng-container>\n <td scope=\"row\" class=\"sticky-right-card-bg\">\n <div class=\"flex-end mb-3\">\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"minusTableControlItem(i)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n <!-- <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('up',i)\" *ngIf=\"i!==0\">\n <i class=\"fas fa-arrow-up\"></i>\n </button>\n <button class=\"btn btn-light btn-sm ms-1\"\n (click.stop)=\"TableArrowUpOrDown('down',i)\"\n *ngIf=\"i!==fieldNameControl.controls.length-1\">\n <i class=\"fas fa-arrow-down\"></i>\n </button> -->\n </div>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n @if(fieldNameControl?.errors?.required && fieldNameControl.touched){\n <span class=\"form-text invalid-feedback d-block\">{{\"AbpValidation::ThisFieldIsRequired.\"|abpLocalization}}</span>\n }\n <small class=\"form-text text-muted d-block\"\n *ngIf=\"_fields.field.description\">{{_fields.field.description}}</small>\n </div>\n </div>\n <button type=\"submit\" style=\"display: none\" #submitclick></button>\n</form>", styles: [".flex-end{display:flex;align-items:center;justify-content:flex-end}.flex-start{display:flex;align-items:center;justify-content:flex-start}.table-control .sticky-right-card-bg{position:sticky;right:0;background:var(--bs-card-bg)}.table-control .table th{white-space:nowrap}.table-control .table th[field-type=TextEdit],.table-control .table th[field-type=Select],.table-control .table th[field-type=DateEdit],.table-control .table th[field-type=NumericEdit],.table-control .table th[field-type=Entry]{min-width:200px}.table-control .table th[field-type=FileExplorer],.table-control .table th[field-type=CkEditor]{min-width:300px}.table-control .table th[field-type=Matrix]{min-width:400px}\n"] }]
117
152
  }], ctorParameters: () => [{ type: i1.CmsApiService }], propDecorators: { entity: [{
118
153
  type: Input
119
154
  }], fields: [{
@@ -128,4 +163,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
128
163
  type: ViewChild,
129
164
  args: ['submitclick', { static: true }]
130
165
  }] } });
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS90YWJsZS90YWJsZS1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Ntcy9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL3RhYmxlL3RhYmxlLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLGNBQTZCLENBQUMsMkJBQTJCOztRQUF6RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUUvQixPQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBVWpDLFlBQVk7UUFDWixZQUFPLEdBQVEsRUFBRSxDQUFDO1FBMkNWLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQXZEckMsQ0FBQztJQUtKLElBQ1csTUFBTSxDQUFDLENBQU07UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFJRCxJQUNXLE1BQU0sQ0FBQyxDQUFNO1FBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuRCxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQ3pFLENBQUMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQ2hDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFJRCxJQUNXLGVBQWUsQ0FBQyxDQUFNO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxJQUNXLFFBQVEsQ0FBQyxDQUFNO1FBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTixDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFHRCxJQUNXLE9BQU8sQ0FBQyxDQUFNO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFNRCxZQUFZO0lBQ1osS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBYyxDQUFDO1lBQzVFLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBTUQsU0FBUztRQUNQLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDL0QsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBQyxDQUFDO2dCQUN4QixLQUFLLE1BQU0sT0FBTyxJQUFJLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNyRCxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7WUFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWMsQ0FBQztZQUN2RixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXO0lBQ1gsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ1osZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNuQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxXQUFXO0lBQ1gscUJBQXFCLENBQUMsS0FBSztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxZQUFZO0lBQ1osa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFDRCxZQUFZO0lBQ1osSUFBSSxDQUFDLEtBQVU7UUFDYixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNqRCxDQUFDOzhHQTVIVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixnVENYbEMsMnRJQW1FTzs7MkZEeERNLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFFRSxrQkFBa0I7a0ZBYWpCLE1BQU07c0JBRGhCLEtBQUs7Z0JBU0ssTUFBTTtzQkFEaEIsS0FBSztnQkFrQkssZUFBZTtzQkFEekIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQVdLLE9BQU87c0JBRGpCLEtBQUs7Z0JBSXNDLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ21zQXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkZi10YWJsZS1jb250cm9sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb250cm9sLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29udHJvbENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2U6IENtc0FwaVNlcnZpY2UgLy8gcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICkge31cbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG5cbiAgLyoq6KGo5Y2V5a6e5L2TICovXG4gIF9lbnRpdHk6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlbnRpdHkodjogYW55KSB7XG4gICAgdGhpcy5fZW50aXR5ID0gdjtcbiAgICB0aGlzLmRhdGFMb2FkZWQoKTtcbiAgfVxuXG4gIC8qKuWtl+autemFjee9ruWIl+ihqCAqL1xuICBfZmllbGRzOiBhbnkgPSAnJztcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmaWVsZHModjogYW55KSB7XG4gICAgaWYgKHYpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uW2tleV0pKSB7XG4gICAgICAgICAgdi5maWVsZC5mb3JtQ29uZmlndXJhdGlvbltrZXldID0gdGhpcy5fQ21zQXBpU2VydmljZS5jb252ZXJ0S2V5c1RvQ2FtZWxDYXNlKFxuICAgICAgICAgICAgdi5maWVsZD8uZm9ybUNvbmZpZ3VyYXRpb25ba2V5XVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkcyA9IHY7XG4gICAgICB0aGlzLmRhdGFMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKirniLbnuqflrZfmrrXlkI3np7DvvIznlKjkuo7kuLrooajljZXorr7nva7mjqfku7botYvlgLwgKi9cbiAgX3BhcmVudEZpbGVkTmFtZTogYW55O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHBhcmVudEZpbGVkTmFtZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9wYXJlbnRGaWxlZE5hbWUgPSB2O1xuICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICB9XG4gIC8qKueItue6p+Wtl+auteWQjeensO+8jOeUqOS6juS4uuihqOWNleiuvue9ruaOp+S7tui1i+WAvCAqL1xuICBfc2VsZWN0ZWQ6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZCh2OiBhbnkpIHtcbiAgICBpZiAodikge1xuICAgICAgdiA9IHRoaXMuX0Ntc0FwaVNlcnZpY2UuY29udmVydEtleXNUb0NhbWVsQ2FzZSh2KTtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gdjtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICAgIH1cbiAgfVxuICAvKiror63oqIAgKi9cbiAgX2N1bHR1cmU6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjdWx0dXJlKHY6IGFueSkge1xuICAgIHRoaXMuX2N1bHR1cmUgPSB2O1xuICB9XG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIOiOt+WPlueItue6p+Wtl+auteS7o+ihqOeahOihqOWNlee7hCovXG4gIGV4dHJhUHJvcGVydGllczogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIC8qKuaVsOaNruWKoOi9veWujOaIkCAqL1xuICBhc3luYyBkYXRhTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLl9maWVsZHMgJiYgdGhpcy5fZW50aXR5ICYmIHRoaXMuX3BhcmVudEZpbGVkTmFtZSkge1xuICAgICAgdGhpcy5leHRyYVByb3BlcnRpZXMgPSB0aGlzLl9lbnRpdHkuZ2V0KHRoaXMuX3BhcmVudEZpbGVkTmFtZSkgYXMgRm9ybUdyb3VwO1xuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8g5omL5Yqo6Kem5Y+R5Y+Y5pu05qOA5rWLXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1Db25maWd1cmF0aW9uOiBhbnk7XG4gIC8qKuiOt+WPluihqOagvOWtl+auteS7o+ihqOeahOaOp+S7tiAqL1xuICBmaWVsZE5hbWVDb250cm9sOiBGb3JtQXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgQWZ0ZXJJbml0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgY29uc3QgVmFsaWRhdG9yc0FycmF5ID0gW107XG4gICAgICBpZiAodGhpcy5fZmllbGRzLnJlcXVpcmVkKSB7XG4gICAgICAgIFZhbGlkYXRvcnNBcnJheS5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUNvbmZpZ3VyYXRpb24gPSB0aGlzLl9maWVsZHMuZmllbGQuZm9ybUNvbmZpZ3VyYXRpb247XG4gICAgICBpZih0aGlzLl9maWVsZHMucmVxdWlyZWQpe1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm9ybUNvbmZpZ3VyYXRpb24uVGFibGVDb2x1bW5zKSB7XG4gICAgICAgICAgZWxlbWVudC5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24gPSBmb3JtQ29uZmlndXJhdGlvbjtcbiAgICAgIGNvbnN0IG5ld0FycmF5R3JvdXAgPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuZXh0cmFQcm9wZXJ0aWVzLnNldENvbnRyb2wodGhpcy5fZmllbGRzLmZpZWxkLm5hbWUsIG5ld0FycmF5R3JvdXApO1xuICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sID0gdGhpcy5leHRyYVByb3BlcnRpZXMuZ2V0KHRoaXMuX2ZpZWxkcy5maWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRUYWJsZUNvbnRyb2xJdGVtKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLl9zZWxlY3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFRhYmxlQ29udHJvbEl0ZW0oKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoq5aKe5Yqg6KGo5qC86aG5ICovXG4gIGFkZFRhYmxlQ29udHJvbEl0ZW0oKSB7XG4gICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgZXh0cmFQcm9wZXJ0aWVzOiB0aGlzLmZiLmdyb3VwKHt9KSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICAvKirliKDpmaTooajmoLzpobkgKi9cbiAgbWludXNUYWJsZUNvbnRyb2xJdGVtKGluZGV4KSB7XG4gICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgVGFibGVBcnJvd1VwT3JEb3duKHR5cGUsIGluZGV4KSB7XG4gICAgY29uc3QgY29udHJvbEF0ID0gdGhpcy5maWVsZE5hbWVDb250cm9sLmF0KGluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGNvbnN0IGxhc3RpbmRleCA9IHR5cGUgPT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuaW5zZXJ0KGxhc3RpbmRleCwgY29udHJvbEF0KTtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZmllbGROYW1lQ29udHJvbC52YWx1ZTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgZHJvcChldmVudDogYW55KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIl9lbnRpdHlcIj5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJleHRyYVByb3BlcnRpZXNcIiA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHRhYmxlLWNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiAqbmdJZj1cIl9maWVsZHMuZGlzcGxheU5hbWVcIj57eyBfZmllbGRzLmRpc3BsYXlOYW1lIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHRhYmxlLWZpeGVkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG92ZXJmbG93LW5vd3JhcCBtYi0wXCIgIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtQ29uZmlndXJhdGlvbi5UYWJsZUNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICBbYXR0ci5maWVsZC10eXBlXT1cIml0ZW0uZm9ybUNvbnRyb2xOYW1lXCIgPnt7IGl0ZW0uZGlzcGxheU5hbWUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAgY2xhc3M9XCJzdGlja3ktcmlnaHQtY2FyZC1iZ1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiAoY2xpY2suc3RvcCk9XCJhZGRUYWJsZUNvbnRyb2xJdGVtKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBbZm9ybUFycmF5TmFtZV09XCJfZmllbGRzLmZpZWxkLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmllbGROYW1lQ29udHJvbC5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjZGtEcmFnIGNka0RyYWdMb2NrQXhpcz1cInlcIiBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmkgYmktYXJyb3dzLW1vdmUgZnMtNVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbCBvZiBmb3JtQ29uZmlndXJhdGlvbi5UYWJsZUNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSYmZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRmLWR5bmFtaWMgW2ZpZWxkc109XCJ7IGZpZWxkOiBlbCxyZXF1aXJlZDplbD8ucmVxdWlyZWR8fGZhbHNlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIl9zZWxlY3RlZD9fc2VsZWN0ZWRbaV0/LmV4dHJhUHJvcGVydGllc1snJytlbC5uYW1lKycnXTonJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50RmlsZWROYW1lXT1cIidleHRyYVByb3BlcnRpZXMnXCIgW2N1bHR1cmVdPVwiX2N1bHR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJpdGVtXCI+PC9kZi1keW5hbWljPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzY29wZT1cInJvd1wiIGNsYXNzPVwic3RpY2t5LXJpZ2h0LWNhcmQtYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWVuZCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJtaW51c1RhYmxlQ29udHJvbEl0ZW0oaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbWludXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gbXMtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIlRhYmxlQXJyb3dVcE9yRG93bigndXAnLGkpXCIgKm5nSWY9XCJpIT09MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hcnJvdy11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gbXMtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIlRhYmxlQXJyb3dVcE9yRG93bignZG93bicsaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImkhPT1maWVsZE5hbWVDb250cm9sLmNvbnRyb2xzLmxlbmd0aC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWFycm93LWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LW11dGVkIGQtYmxvY2tcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiX2ZpZWxkcy5maWVsZC5kZXNjcmlwdGlvblwiPnt7X2ZpZWxkcy5maWVsZC5kZXNjcmlwdGlvbn19PC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxuPC9mb3JtPiJdfQ==
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS90YWJsZS90YWJsZS1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Ntcy9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy1mb3JtL3RhYmxlL3RhYmxlLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLGNBQTZCLENBQUMsMkJBQTJCOztRQUF6RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUUvQixPQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBVWpDLFlBQVk7UUFDWixZQUFPLEdBQVEsRUFBRSxDQUFDO1FBMkNWLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQXZEckMsQ0FBQztJQUtKLElBQ1csTUFBTSxDQUFDLENBQU07UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFJRCxJQUNXLE1BQU0sQ0FBQyxDQUFNO1FBQ3RCLElBQUks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LE9BQU87c0JBRGpCLEtBQUs7Z0JBSXNDLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ21zQXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkZi10YWJsZS1jb250cm9sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb250cm9sLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29udHJvbENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2U6IENtc0FwaVNlcnZpY2UgLy8gcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICkge31cbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG5cbiAgLyoq6KGo5Y2V5a6e5L2TICovXG4gIF9lbnRpdHk6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlbnRpdHkodjogYW55KSB7XG4gICAgdGhpcy5fZW50aXR5ID0gdjtcbiAgICB0aGlzLmRhdGFMb2FkZWQoKTtcbiAgfVxuXG4gIC8qKuWtl+autemFjee9ruWIl+ihqCAqL1xuICBfZmllbGRzOiBhbnkgPSAnJztcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmaWVsZHModjogYW55KSB7XG4gICAgaWYgKHYpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYuZmllbGQ/LmZvcm1Db25maWd1cmF0aW9uW2tleV0pKSB7XG4gICAgICAgICAgdi5maWVsZC5mb3JtQ29uZmlndXJhdGlvbltrZXldID0gdGhpcy5fQ21zQXBpU2VydmljZS5jb252ZXJ0S2V5c1RvQ2FtZWxDYXNlKFxuICAgICAgICAgICAgdi5maWVsZD8uZm9ybUNvbmZpZ3VyYXRpb25ba2V5XVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkcyA9IHY7XG4gICAgICB0aGlzLmRhdGFMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKirniLbnuqflrZfmrrXlkI3np7DvvIznlKjkuo7kuLrooajljZXorr7nva7mjqfku7botYvlgLwgKi9cbiAgX3BhcmVudEZpbGVkTmFtZTogYW55O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHBhcmVudEZpbGVkTmFtZSh2OiBhbnkpIHtcbiAgICB0aGlzLl9wYXJlbnRGaWxlZE5hbWUgPSB2O1xuICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICB9XG4gIC8qKueItue6p+Wtl+auteWQjeensO+8jOeUqOS6juS4uuihqOWNleiuvue9ruaOp+S7tui1i+WAvCAqL1xuICBfc2VsZWN0ZWQ6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZCh2OiBhbnkpIHtcbiAgICBpZiAodikge1xuICAgICAgdiA9IHRoaXMuX0Ntc0FwaVNlcnZpY2UuY29udmVydEtleXNUb0NhbWVsQ2FzZSh2KTtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gdjtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCgpO1xuICAgIH1cbiAgfVxuICAvKiror63oqIAgKi9cbiAgX2N1bHR1cmU6IGFueTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjdWx0dXJlKHY6IGFueSkge1xuICAgIHRoaXMuX2N1bHR1cmUgPSB2O1xuICB9XG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIOiOt+WPlueItue6p+Wtl+auteS7o+ihqOeahOihqOWNlee7hCovXG4gIGV4dHJhUHJvcGVydGllczogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIC8qKuaVsOaNruWKoOi9veWujOaIkCAqL1xuICBhc3luYyBkYXRhTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLl9maWVsZHMgJiYgdGhpcy5fZW50aXR5ICYmIHRoaXMuX3BhcmVudEZpbGVkTmFtZSkge1xuICAgICAgdGhpcy5leHRyYVByb3BlcnRpZXMgPSB0aGlzLl9lbnRpdHkuZ2V0KHRoaXMuX3BhcmVudEZpbGVkTmFtZSkgYXMgRm9ybUdyb3VwO1xuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8g5omL5Yqo6Kem5Y+R5Y+Y5pu05qOA5rWLXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1Db25maWd1cmF0aW9uOiBhbnk7XG4gIC8qKuiOt+WPluihqOagvOWtl+auteS7o+ihqOeahOaOp+S7tiAqL1xuICBmaWVsZE5hbWVDb250cm9sOiBGb3JtQXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgQWZ0ZXJJbml0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgY29uc3QgVmFsaWRhdG9yc0FycmF5ID0gW107XG4gICAgICBpZiAodGhpcy5fZmllbGRzLnJlcXVpcmVkKSB7XG4gICAgICAgIFZhbGlkYXRvcnNBcnJheS5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUNvbmZpZ3VyYXRpb24gPSB0aGlzLl9maWVsZHMuZmllbGQuZm9ybUNvbmZpZ3VyYXRpb247XG4gICAgIFxuICAgICAgdGhpcy5mb3JtQ29uZmlndXJhdGlvbiA9IGZvcm1Db25maWd1cmF0aW9uO1xuICAgICAgY29uc3QgbmV3QXJyYXlHcm91cCA9IHRoaXMuZmIuYXJyYXkoW10sVmFsaWRhdG9yc0FycmF5KTtcbiAgICAgIHRoaXMuZXh0cmFQcm9wZXJ0aWVzLnNldENvbnRyb2wodGhpcy5fZmllbGRzLmZpZWxkLm5hbWUsIG5ld0FycmF5R3JvdXApO1xuICAgICAgdGhpcy5maWVsZE5hbWVDb250cm9sID0gdGhpcy5leHRyYVByb3BlcnRpZXMuZ2V0KHRoaXMuX2ZpZWxkcy5maWVsZC5uYW1lKSBhcyBGb3JtQXJyYXk7XG4gICAgICBpZih0aGlzLl9maWVsZHMucmVxdWlyZWQpe1xuICAgICAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLmhhc1ZhbHVlVmFsaWRhdG9yKTtcbiAgICAgICAgLy8gZm9yIChjb25zdCBlbGVtZW50IG9mIGZvcm1Db25maWd1cmF0aW9uLlRhYmxlQ29sdW1ucykge1xuICAgICAgICAvLyAgIGVsZW1lbnQucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRUYWJsZUNvbnRyb2xJdGVtKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLl9zZWxlY3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFRhYmxlQ29udHJvbEl0ZW0oKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgfSk7XG4gIH1cbiAvKirmmK/lkKbluKbmnInlgLzpqozor4HlmaggKi9cbiBoYXNWYWx1ZVZhbGlkYXRvcihnOiBGb3JtQXJyYXkpIHtcbiAgLy8g5qOA5p+l5piv5ZCm5pyJ5Lu75L2V5o6n5Lu25YyF5ZCr5pyJ5pWI5YC8XG4gIGNvbnN0IGhhc1ZhbHVlID0gZy5jb250cm9scy5zb21lKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGV4dHJhUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0KCdleHRyYVByb3BlcnRpZXMnKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXh0cmFQcm9wZXJ0aWVzLnZhbHVlKS5zb21lKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGV4dHJhUHJvcGVydGllcy52YWx1ZVtrZXldO1xuICAgICAgLy8g5qOA5p+l5pWw57uE57G75Z6L5YC8XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICAvLyDmo4Dmn6XpnZ7nqbrlgLxcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8g5qC55o2u6aqM6K+B57uT5p6c6K6+572u6KGo5Y2V54q25oCBXG4gIGcuY29udHJvbHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBleHRyYVByb3BlcnRpZXMgPSBlbGVtZW50LmdldCgnZXh0cmFQcm9wZXJ0aWVzJyk7XG4gICAgT2JqZWN0LmtleXMoZXh0cmFQcm9wZXJ0aWVzLnZhbHVlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgIC8vIOWmguaenOayoeacieWAvO+8jOiuvue9ruaJgOacieWtl+auteS4uuW/heWhq1xuICAgICAgICBleHRyYVByb3BlcnRpZXMuZ2V0KGtleSkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgZXh0cmFQcm9wZXJ0aWVzLmdldChrZXkpLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5aaC5p6c5pyJ5YC877yM5riF6Zmk6ZSZ6K+vXG4gICAgICAgIGV4dHJhUHJvcGVydGllcy5nZXQoa2V5KS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIOi/lOWbnumqjOivgee7k+aenFxuICByZXR1cm4gaGFzVmFsdWUmJmcuY29udHJvbHMubGVuZ3RoPjAgPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xufVxuXG4gIC8qKuWinuWKoOihqOagvOmhuSAqL1xuICBhZGRUYWJsZUNvbnRyb2xJdGVtKCkge1xuICAgIHRoaXMuZmllbGROYW1lQ29udHJvbC5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGV4dHJhUHJvcGVydGllczogdGhpcy5mYi5ncm91cCh7fSksXG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gdGhpcy5maWVsZE5hbWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuICAvKirliKDpmaTooajmoLzpobkgKi9cbiAgbWludXNUYWJsZUNvbnRyb2xJdGVtKGluZGV4KSB7XG4gICAgdGhpcy5maWVsZE5hbWVDb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgVGFibGVBcnJvd1VwT3JEb3duKHR5cGUsIGluZGV4KSB7XG4gICAgY29uc3QgY29udHJvbEF0ID0gdGhpcy5maWVsZE5hbWVDb250cm9sLmF0KGluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGNvbnN0IGxhc3RpbmRleCA9IHR5cGUgPT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wuaW5zZXJ0KGxhc3RpbmRleCwgY29udHJvbEF0KTtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZmllbGROYW1lQ29udHJvbC52YWx1ZTtcbiAgfVxuICAvKirosIPmlbTooajmoLzkvY3nva4gKi9cbiAgZHJvcChldmVudDogYW55KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZmllbGROYW1lQ29udHJvbC5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZpZWxkTmFtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIl9lbnRpdHlcIj5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJleHRyYVByb3BlcnRpZXNcIiA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHRhYmxlLWNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiAqbmdJZj1cIl9maWVsZHMuZGlzcGxheU5hbWVcIj57eyBfZmllbGRzLmRpc3BsYXlOYW1lIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHRhYmxlLWZpeGVkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG92ZXJmbG93LW5vd3JhcCBtYi0wXCIgIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtQ29uZmlndXJhdGlvbi5UYWJsZUNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICBbYXR0ci5maWVsZC10eXBlXT1cIml0ZW0uZm9ybUNvbnRyb2xOYW1lXCIgPnt7IGl0ZW0uZGlzcGxheU5hbWUgfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAgY2xhc3M9XCJzdGlja3ktcmlnaHQtY2FyZC1iZ1wiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiAoY2xpY2suc3RvcCk9XCJhZGRUYWJsZUNvbnRyb2xJdGVtKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBbZm9ybUFycmF5TmFtZV09XCJfZmllbGRzLmZpZWxkLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmllbGROYW1lQ29udHJvbC5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjZGtEcmFnIGNka0RyYWdMb2NrQXhpcz1cInlcIiBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmkgYmktYXJyb3dzLW1vdmUgZnMtNVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbCBvZiBmb3JtQ29uZmlndXJhdGlvbi5UYWJsZUNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSYmZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRmLWR5bmFtaWMgW2ZpZWxkc109XCJ7IGZpZWxkOiBlbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0ZWQ/X3NlbGVjdGVkW2ldPy5leHRyYVByb3BlcnRpZXNbJycrZWwubmFtZSsnJ106JydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudEZpbGVkTmFtZV09XCInZXh0cmFQcm9wZXJ0aWVzJ1wiIFtjdWx0dXJlXT1cIl9jdWx0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiaXRlbVwiPjwvZGYtZHluYW1pYz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc2NvcGU9XCJyb3dcIiBjbGFzcz1cInN0aWNreS1yaWdodC1jYXJkLWJnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1lbmQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBtcy0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwibWludXNUYWJsZUNvbnRyb2xJdGVtKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJUYWJsZUFycm93VXBPckRvd24oJ3VwJyxpKVwiICpuZ0lmPVwiaSE9PTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYXJyb3ctdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJUYWJsZUFycm93VXBPckRvd24oJ2Rvd24nLGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpIT09ZmllbGROYW1lQ29udHJvbC5jb250cm9scy5sZW5ndGgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hcnJvdy1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYoZmllbGROYW1lQ29udHJvbD8uZXJyb3JzPy5yZXF1aXJlZCAmJiBmaWVsZE5hbWVDb250cm9sLnRvdWNoZWQpe1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS10ZXh0IGludmFsaWQtZmVlZGJhY2sgZC1ibG9ja1wiPnt7XCJBYnBWYWxpZGF0aW9uOjpUaGlzRmllbGRJc1JlcXVpcmVkLlwifGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtbXV0ZWQgZC1ibG9ja1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfZmllbGRzLmZpZWxkLmRlc2NyaXB0aW9uXCI+e3tfZmllbGRzLmZpZWxkLmRlc2NyaXB0aW9ufX08L3NtYWxsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiAjc3VibWl0Y2xpY2s+PC9idXR0b24+XG48L2Zvcm0+Il19