@abp/ng.theme.shared 7.3.0 → 7.3.2

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.
@@ -47,7 +47,7 @@ class ExtensibleFormPropComponent {
47
47
  this.configState = configState;
48
48
  this.injector = injector;
49
49
  this.asterisk = '';
50
- this.containerClassName = 'mb-3';
50
+ this.containerClassName = 'mb-2';
51
51
  this.options$ = of([]);
52
52
  this.validators = [];
53
53
  this.passwordKey = "ThemeShared.Extensions.PasswordComponent" /* eThemeSharedComponents.PasswordComponent */;
@@ -159,7 +159,7 @@ class ExtensibleFormPropComponent {
159
159
  this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
160
160
  }
161
161
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: ExtensibleFormPropComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TrackByService }, { token: i1.ConfigStateService }, { token: i2.FormGroupDirective }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.6", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-3\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"form-text text-muted\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { 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: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { kind: "directive", type: i4.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i4.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i4.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i5.PasswordComponent, selector: "abp-password", inputs: ["inputId", "formControlName"] }, { kind: "directive", type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i7.DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }, { kind: "directive", type: i8.DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.LocalizationPipe, name: "abpLocalization" }], viewProviders: [
162
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.6", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-2\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"text-muted d-block\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { 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: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { kind: "directive", type: i4.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i4.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i4.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i5.PasswordComponent, selector: "abp-password", inputs: ["inputId", "formControlName"] }, { kind: "directive", type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "directive", type: i6.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i7.DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }, { kind: "directive", type: i8.DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.LocalizationPipe, name: "abpLocalization" }], viewProviders: [
163
163
  {
164
164
  provide: ControlContainer,
165
165
  useFactory: selfFactory,
@@ -180,7 +180,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImpor
180
180
  },
181
181
  { provide: NgbDateAdapter, useClass: DateAdapter },
182
182
  { provide: NgbTimeAdapter, useClass: TimeAdapter },
183
- ], template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-3\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"form-text text-muted\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n" }]
183
+ ], template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-2\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"text-muted d-block\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n" }]
184
184
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TrackByService }, { type: i1.ConfigStateService }, { type: i2.FormGroupDirective }, { type: i0.Injector }]; }, propDecorators: { data: [{
185
185
  type: Input
186
186
  }], prop: [{
@@ -196,4 +196,4 @@ function isRequired(validator) {
196
196
  validator === AbpValidators.required ||
197
197
  validator.name === 'required');
198
198
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUtc2hhcmVkL2V4dGVuc2lvbnMvc3JjL2xpYi9jb21wb25lbnRzL2V4dGVuc2libGUtZm9ybS9leHRlbnNpYmxlLWZvcm0tcHJvcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS1zaGFyZWQvZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZXh0ZW5zaWJsZS1mb3JtL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xHLE9BQU8sRUFBTyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RGLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFFTCxRQUFRLEVBRVIsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUdsQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdB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Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7YUFDM0Q7WUFDRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtZQUNsRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtTQUNuRDs7U0FFVSwyQkFBMkI7MkZBQTNCLDJCQUEyQjtrQkFkdkMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBRW5CLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDO3dCQUNiOzRCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLFVBQVUsRUFBRSxXQUFXOzRCQUN2QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUMzRDt3QkFDRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTt3QkFDbEQsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7cUJBQ25EOzhOQUdRLElBQUk7c0JBQVosS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVzQixRQUFRO3NCQUFuQyxTQUFTO3VCQUFDLE9BQU87O0FBZ0xwQixTQUFTLFVBQVUsQ0FBQyxTQUFzQjtJQUN4QyxPQUFPLENBQ0wsU0FBUyxLQUFLLFVBQVUsQ0FBQyxRQUFRO1FBQ2pDLFNBQVMsS0FBSyxhQUFhLENBQUMsUUFBUTtRQUNwQyxTQUFTLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FDOUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFWFRFTlNJT05TX0ZPUk1fUFJPUCwgRVhURU5TSU9OU19GT1JNX1BST1BfREFUQSB9IGZyb20gJy4vLi4vLi4vdG9rZW5zL2V4dGVuc2lvbnMudG9rZW4nO1xyXG5pbXBvcnQgeyBBQlAsIEFicFZhbGlkYXRvcnMsIENvbmZpZ1N0YXRlU2VydmljZSwgVHJhY2tCeVNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9wdGlvbmFsLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgU2tpcFNlbGYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xDb250YWluZXIsXHJcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5nYkRhdGVBZGFwdGVyLCBOZ2JUaW1lQWRhcHRlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2RhdGUuYWRhcHRlcic7XHJcbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdGltZS5hZGFwdGVyJztcclxuaW1wb3J0IHsgRVhUUkFfUFJPUEVSVElFU19LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZXh0cmEtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IGVQcm9wVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3Byb3BzLmVudW0nO1xyXG5pbXBvcnQgeyBGb3JtUHJvcCB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLXByb3BzJztcclxuaW1wb3J0IHsgUHJvcERhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvcHMnO1xyXG5pbXBvcnQgeyBzZWxmRmFjdG9yeSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZhY3RvcnkudXRpbCc7XHJcbmltcG9ydCB7IGFkZFR5cGVhaGVhZFRleHRTdWZmaXggfSBmcm9tICcuLi8uLi91dGlscy90eXBlYWhlYWQudXRpbCc7XHJcbmltcG9ydCB7IGVUaGVtZVNoYXJlZENvbXBvbmVudHMgfSBmcm9tICcuLi8uLi9lbnVtcy9jb21wb25lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWJwLWV4dGVuc2libGUtZm9ybS1wcm9wJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHZpZXdQcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcclxuICAgICAgdXNlRmFjdG9yeTogc2VsZkZhY3RvcnksXHJcbiAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIG5ldyBTa2lwU2VsZigpLCBDb250cm9sQ29udGFpbmVyXV0sXHJcbiAgICB9LFxyXG4gICAgeyBwcm92aWRlOiBOZ2JEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IERhdGVBZGFwdGVyIH0sXHJcbiAgICB7IHByb3ZpZGU6IE5nYlRpbWVBZGFwdGVyLCB1c2VDbGFzczogVGltZUFkYXB0ZXIgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXh0ZW5zaWJsZUZvcm1Qcm9wQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBkYXRhITogUHJvcERhdGE7XHJcblxyXG4gIEBJbnB1dCgpIHByb3AhOiBGb3JtUHJvcDtcclxuXHJcbiAgQElucHV0KCkgZmlyc3Q/OiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWVsZCcpIHByaXZhdGUgZmllbGRSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgcHVibGljIGluamVjdG9yRm9yQ3VzdG9tQ29tcG9uZW50PzogSW5qZWN0b3I7XHJcblxyXG4gIGFzdGVyaXNrID0gJyc7XHJcblxyXG4gIGNvbnRhaW5lckNsYXNzTmFtZSA9ICdtYi0zJztcclxuXHJcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8QUJQLk9wdGlvbjxhbnk+W10+ID0gb2YoW10pO1xyXG5cclxuICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gIHJlYWRvbmx5ITogYm9vbGVhbjtcclxuXHJcbiAgdHlwZWFoZWFkTW9kZWw6IGFueTtcclxuXHJcbiAgcGFzc3dvcmRLZXkgPSBlVGhlbWVTaGFyZWRDb21wb25lbnRzLlBhc3N3b3JkQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIGRpc2FibGVkRm4gPSAoZGF0YTogUHJvcERhdGEpID0+IGZhbHNlO1xyXG5cclxuICBnZXQgZGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZEZuKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBzZXRUeXBlYWhlYWRWYWx1ZShzZWxlY3RlZE9wdGlvbjogQUJQLk9wdGlvbjxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLnR5cGVhaGVhZE1vZGVsID0gc2VsZWN0ZWRPcHRpb24gfHwgeyBrZXk6IG51bGwsIHZhbHVlOiBudWxsIH07XHJcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHRoaXMudHlwZWFoZWFkTW9kZWw7XHJcbiAgICBjb25zdCBba2V5Q29udHJvbCwgdmFsdWVDb250cm9sXSA9IHRoaXMuZ2V0VHlwZWFoZWFkQ29udHJvbHMoKTtcclxuICAgIGlmICh2YWx1ZUNvbnRyb2w/LnZhbHVlICYmICF2YWx1ZSkgdmFsdWVDb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBrZXlDb250cm9sPy5zZXRWYWx1ZShrZXkpO1xyXG4gICAgdmFsdWVDb250cm9sPy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2ggPSAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cclxuICAgIHRleHQkXHJcbiAgICAgID8gdGV4dCQucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCh0ZXh0ID0+IHRoaXMucHJvcD8ub3B0aW9ucz8uKHRoaXMuZGF0YSwgdGV4dCkgfHwgb2YoW10pKSxcclxuICAgICAgICApXHJcbiAgICAgIDogb2YoW10pO1xyXG5cclxuICB0eXBlYWhlYWRGb3JtYXR0ZXIgPSAob3B0aW9uOiBBQlAuT3B0aW9uPGFueT4pID0+IG9wdGlvbi5rZXk7XHJcblxyXG4gIGdldCBtZXJpZGlhbigpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuY29uZmlnU3RhdGUuZ2V0RGVlcCgnbG9jYWxpemF0aW9uLmN1cnJlbnRDdWx0dXJlLmRhdGVUaW1lRm9ybWF0LnNob3J0VGltZVBhdHRlcm4nKSB8fCAnJ1xyXG4gICAgKS5pbmNsdWRlcygndHQnKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0ludmFsaWQoKSB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLnByb3AubmFtZSk7XHJcbiAgICByZXR1cm4gY29udHJvbD8udG91Y2hlZCAmJiBjb250cm9sLmludmFsaWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHJhY2s6IFRyYWNrQnlTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2UsXHJcbiAgICBncm91cERpcmVjdGl2ZTogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmZvcm0gPSBncm91cERpcmVjdGl2ZS5mb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUeXBlYWhlYWRDb250cm9scygpIHtcclxuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5wcm9wO1xyXG4gICAgY29uc3QgZXh0cmFQcm9wTmFtZSA9IGAke0VYVFJBX1BST1BFUlRJRVNfS0VZfS4ke25hbWV9YDtcclxuICAgIGNvbnN0IGtleUNvbnRyb2wgPVxyXG4gICAgICB0aGlzLmZvcm0uZ2V0KGFkZFR5cGVhaGVhZFRleHRTdWZmaXgoZXh0cmFQcm9wTmFtZSkpIHx8XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChuYW1lKSk7XHJcbiAgICBjb25zdCB2YWx1ZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGV4dHJhUHJvcE5hbWUpIHx8IHRoaXMuZm9ybS5nZXQobmFtZSk7XHJcbiAgICByZXR1cm4gW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEFzdGVyaXNrKCkge1xyXG4gICAgdGhpcy5hc3RlcmlzayA9IHRoaXMudmFsaWRhdG9ycy5zb21lKGlzUmVxdWlyZWQpID8gJyonIDogJyc7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5maXJzdCAmJiB0aGlzLmZpZWxkUmVmKSB7XHJcbiAgICAgIHRoaXMuZmllbGRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudChwcm9wOiBGb3JtUHJvcCk6IHN0cmluZyB7XHJcbiAgICBpZiAocHJvcC50ZW1wbGF0ZSkge1xyXG4gICAgICByZXR1cm4gJ3RlbXBsYXRlJztcclxuICAgIH1cclxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkRhdGU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRlJztcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZVRpbWU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRlVGltZSc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkhpZGRlbjpcclxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLk11bHRpU2VsZWN0OlxyXG4gICAgICAgIHJldHVybiAnbXVsdGlzZWxlY3QnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5UZXh0OlxyXG4gICAgICAgIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5UaW1lOlxyXG4gICAgICAgIHJldHVybiAndGltZSc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLlR5cGVhaGVhZDpcclxuICAgICAgICByZXR1cm4gJ3R5cGVhaGVhZCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLlBhc3N3b3JkSW5wdXRHcm91cDpcclxuICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkaW5wdXRncm91cCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHByb3Aub3B0aW9ucyA/ICdzZWxlY3QnIDogJ2lucHV0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFR5cGUocHJvcDogRm9ybVByb3ApOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZTpcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuU3RyaW5nOlxyXG4gICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLk51bWJlcjpcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkVtYWlsOlxyXG4gICAgICAgIHJldHVybiAnZW1haWwnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5QYXNzd29yZDpcclxuICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkJztcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuUGFzc3dvcmRJbnB1dEdyb3VwOlxyXG4gICAgICAgIHJldHVybiAncGFzc3dvcmRpbnB1dGdyb3VwJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyh7IHByb3AsIGRhdGEgfTogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgY29uc3QgY3VycmVudFByb3AgPSBwcm9wPy5jdXJyZW50VmFsdWUgYXMgRm9ybVByb3A7XHJcbiAgICBjb25zdCB7IG9wdGlvbnMsIHJlYWRvbmx5LCBkaXNhYmxlZCwgdmFsaWRhdG9ycywgY2xhc3NOYW1lLCB0ZW1wbGF0ZSB9ID0gY3VycmVudFByb3AgfHwge307XHJcbiAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbmplY3RvckZvckN1c3RvbUNvbXBvbmVudCA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEVYVEVOU0lPTlNfRk9STV9QUk9QLFxyXG4gICAgICAgICAgICB1c2VWYWx1ZTogY3VycmVudFByb3AsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBFWFRFTlNJT05TX0ZPUk1fUFJPUF9EQVRBLFxyXG4gICAgICAgICAgICB1c2VWYWx1ZTogKGRhdGE/LmN1cnJlbnRWYWx1ZSBhcyBQcm9wRGF0YSk/LnJlY29yZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBGb3JtR3JvdXBEaXJlY3RpdmUgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMpIHRoaXMub3B0aW9ucyQgPSBvcHRpb25zKHRoaXMuZGF0YSk7XHJcbiAgICBpZiAocmVhZG9ubHkpIHRoaXMucmVhZG9ubHkgPSByZWFkb25seSh0aGlzLmRhdGEpO1xyXG5cclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmRpc2FibGVkRm4gPSBkaXNhYmxlZDtcclxuICAgIH1cclxuICAgIGlmICh2YWxpZGF0b3JzKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnModGhpcy5kYXRhKTtcclxuICAgICAgdGhpcy5zZXRBc3RlcmlzaygpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtrZXlDb250cm9sLCB2YWx1ZUNvbnRyb2xdID0gdGhpcy5nZXRUeXBlYWhlYWRDb250cm9scygpO1xyXG4gICAgaWYgKGtleUNvbnRyb2wgJiYgdmFsdWVDb250cm9sKVxyXG4gICAgICB0aGlzLnR5cGVhaGVhZE1vZGVsID0geyBrZXk6IGtleUNvbnRyb2wudmFsdWUsIHZhbHVlOiB2YWx1ZUNvbnRyb2wudmFsdWUgfTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUmVxdWlyZWQodmFsaWRhdG9yOiBWYWxpZGF0b3JGbikge1xyXG4gIHJldHVybiAoXHJcbiAgICB2YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHxcclxuICAgIHZhbGlkYXRvciA9PT0gQWJwVmFsaWRhdG9ycy5yZXF1aXJlZCB8fFxyXG4gICAgdmFsaWRhdG9yLm5hbWUgPT09ICdyZXF1aXJlZCdcclxuICApO1xyXG59XHJcbiIsIjxuZy1jb250YWluZXJcclxuICBbbmdTd2l0Y2hdPVwiZ2V0Q29tcG9uZW50KHByb3ApXCJcclxuICAqYWJwUGVybWlzc2lvbj1cInByb3AucGVybWlzc2lvbjsgcnVuQ2hhbmdlRGV0ZWN0aW9uOiBmYWxzZVwiXHJcbj5cclxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGVtcGxhdGVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwicHJvcC50ZW1wbGF0ZTsgaW5qZWN0b3I6IGluamVjdG9yRm9yQ3VzdG9tQ29tcG9uZW50XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cImNvbnRhaW5lckNsYXNzTmFtZVwiIGNsYXNzPVwibWItM1wiPlxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImlucHV0XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgICNmaWVsZFxyXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcclxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXHJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgW3R5cGVdPVwiZ2V0VHlwZShwcm9wKVwiXHJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgLz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImhpZGRlblwiPlxyXG4gICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgLz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImNoZWNrYm94XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgdmFsaWRhdGlvblRhcmdldD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICNmaWVsZFxyXG4gICAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6ICdmb3JtLWNoZWNrLWxhYmVsJyB9XCJcclxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJzZWxlY3RcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPHNlbGVjdFxyXG4gICAgICAgICNmaWVsZFxyXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcclxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXHJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrQnk6IHRyYWNrLmJ5KCd2YWx1ZScpXCJcclxuICAgICAgICAgIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgb3B0aW9uLmtleSB9fVxyXG4gICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cIm11bHRpc2VsZWN0XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxzZWxlY3RcclxuICAgICAgICAjZmllbGRcclxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgIFthYnBEaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgbXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2xcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVwiXHJcbiAgICAgICAgICBbbmdWYWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IG9wdGlvbi5rZXkgfX1cclxuICAgICAgICA8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJ0eXBlYWhlYWRcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGRpdiAjdHlwZWFoZWFkIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiB2YWxpZGF0aW9uU3R5bGUgdmFsaWRhdGlvblRhcmdldD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICNmaWVsZFxyXG4gICAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJzZWFyY2hcIlxyXG4gICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJ0eXBlYWhlYWRGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgW3Jlc3VsdEZvcm1hdHRlcl09XCJ0eXBlYWhlYWRGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwidHlwZWFoZWFkTW9kZWxcIlxyXG4gICAgICAgICAgKHNlbGVjdEl0ZW0pPVwic2V0VHlwZWFoZWFkVmFsdWUoJGV2ZW50Lml0ZW0pXCJcclxuICAgICAgICAgIChibHVyKT1cInNldFR5cGVhaGVhZFZhbHVlKHR5cGVhaGVhZE1vZGVsKVwiXHJcbiAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ0eXBlYWhlYWQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1pbnZhbGlkJylcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCIgdHlwZT1cImhpZGRlblwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgIChjbGljayk9XCJkYXRlcGlja2VyLm9wZW4oKVwiXHJcbiAgICAgICAgKGtleXVwLnNwYWNlKT1cImRhdGVwaWNrZXIub3BlbigpXCJcclxuICAgICAgICBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgI2RhdGVwaWNrZXI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAvPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGltZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmdiLXRpbWVwaWNrZXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIj48L25nYi10aW1lcGlja2VyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVRpbWVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGFicC1kYXRlLXRpbWUtcGlja2VyIFtwcm9wXT1cInByb3BcIiBbbWVyaWRpYW5dPVwibWVyaWRpYW5cIj48L2FicC1kYXRlLXRpbWUtcGlja2VyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGV4dGFyZWFcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgI2ZpZWxkXHJcbiAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcclxuICAgICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICA+PC90ZXh0YXJlYT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cInBhc3N3b3JkaW5wdXRncm91cFwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8YWJwLXBhc3N3b3JkXHJcbiAgICAgICAgKmFicFJlcGxhY2VhYmxlVGVtcGxhdGU9XCJ7XHJcbiAgICAgICAgICBjb21wb25lbnRLZXk6IHBhc3N3b3JkS2V5LFxyXG4gICAgICAgICAgaW5wdXRzOiB7XHJcbiAgICAgICAgICAgIGlucHV0SWQ6IHsgdmFsdWU6IHByb3AuaWQgfSxcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lOiB7IHZhbHVlOiBwcm9wLm5hbWUgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIFtpbnB1dElkXT1cInByb3AuaWRcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcclxuICAgICAgPjwvYWJwLXBhc3N3b3JkPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8c21hbGwgKm5nSWY9XCJwcm9wLmZvcm1UZXh0XCIgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1tdXRlZFwiPnt7XHJcbiAgICAgIHByb3AuZm9ybVRleHQgfCBhYnBMb2NhbGl6YXRpb25cclxuICAgIH19PC9zbWFsbD5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI2xhYmVsIGxldC1jbGFzc2VzPlxyXG4gIDxsYWJlbCBbaHRtbEZvcl09XCJwcm9wLmlkXCIgW25nQ2xhc3NdPVwiY2xhc3NlcyB8fCAnZm9ybS1sYWJlbCdcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wLmRpc3BsYXlUZXh0UmVzb2x2ZXI7IGVsc2UgZGlzcGxheU5hbWVUZW1wbGF0ZVwiPlxyXG4gICAgICB7eyBwcm9wLmRpc3BsYXlUZXh0UmVzb2x2ZXIoZGF0YSkgfCBhYnBMb2NhbGl6YXRpb24gfX1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5TmFtZVRlbXBsYXRlPiB7eyBwcm9wLmRpc3BsYXlOYW1lIHwgYWJwTG9jYWxpemF0aW9uIH19PC9uZy10ZW1wbGF0ZT5cclxuICAgIHt7IGFzdGVyaXNrIH19XHJcbiAgPC9sYWJlbD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUtc2hhcmVkL2V4dGVuc2lvbnMvc3JjL2xpYi9jb21wb25lbnRzL2V4dGVuc2libGUtZm9ybS9leHRlbnNpYmxlLWZvcm0tcHJvcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS1zaGFyZWQvZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZXh0ZW5zaWJsZS1mb3JtL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xHLE9BQU8sRUFBTyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RGLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFFTCxRQUFRLEVBRVIsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUdsQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7O0FBR3BFLE1BY2EsMkJBQTJCO0lBNkJ0QyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxjQUFrQztRQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ25FLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9ELElBQUksWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUs7WUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUQsVUFBVSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixZQUFZLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFhRCxJQUFJLFFBQVE7UUFDVixPQUFPLENBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsNkRBQTZELENBQUMsSUFBSSxFQUFFLENBQzlGLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE9BQU8sT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUNrQixLQUF3QixFQUN4QixLQUFxQixFQUMzQixXQUErQixFQUN6QyxjQUFrQyxFQUMxQixRQUFrQjtRQUpWLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUVqQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBMUQ1QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsdUJBQWtCLEdBQUcsTUFBTSxDQUFDO1FBRTVCLGFBQVEsR0FBa0MsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWpELGVBQVUsR0FBa0IsRUFBRSxDQUFDO1FBTS9CLGdCQUFXLDZGQUE0QztRQUl2RCxlQUFVLEdBQUcsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztRQWV2QyxXQUFNLEdBQUcsQ0FBQyxLQUF5QixFQUFFLEVBQUUsQ0FDckMsS0FBSztZQUNILENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNSLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNuRTtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFYix1QkFBa0IsR0FBRyxDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFvQjNELElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzNCLE1BQU0sYUFBYSxHQUFHLEdBQUcsb0JBQW9CLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYztRQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakI7Z0JBQ0UsT0FBTyxVQUFVLENBQUM7WUFDcEI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7WUFDaEI7Z0JBQ0UsT0FBTyxVQUFVLENBQUM7WUFDcEI7Z0JBQ0UsT0FBTyxRQUFRLENBQUM7WUFDbEI7Z0JBQ0UsT0FBTyxhQUFhLENBQUM7WUFDdkI7Z0JBQ0UsT0FBTyxVQUFVLENBQUM7WUFDcEI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7WUFDaEI7Z0JBQ0UsT0FBTyxXQUFXLENBQUM7WUFDckI7Z0JBQ0UsT0FBTyxvQkFBb0IsQ0FBQztZQUM5QjtnQkFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFjO1FBQ3BCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixpQ0FBb0I7WUFDcEI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7WUFDaEI7Z0JBQ0UsT0FBTyxVQUFVLENBQUM7WUFDcEI7Z0JBQ0UsT0FBTyxRQUFRLENBQUM7WUFDbEI7Z0JBQ0UsT0FBTyxPQUFPLENBQUM7WUFDakI7Z0JBQ0UsT0FBTyxVQUFVLENBQUM7WUFDcEI7Z0JBQ0UsT0FBTyxvQkFBb0IsQ0FBQztZQUM5QjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFpQjtRQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEVBQUUsWUFBd0IsQ0FBQztRQUNuRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzNGLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLDBCQUEwQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsb0JBQW9CO3dCQUM3QixRQUFRLEVBQUUsV0FBVztxQkFDdEI7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLHlCQUF5Qjt3QkFDbEMsUUFBUSxFQUFHLElBQUksRUFBRSxZQUF5QixFQUFFLE1BQU07cUJBQ25EO29CQUNELEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRTtpQkFDL0Q7Z0JBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3RCLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRCxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7U0FDckM7UUFFRCxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9ELElBQUksVUFBVSxJQUFJLFlBQVk7WUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0UsQ0FBQzs4R0FwTFUsMkJBQTJCO2tHQUEzQiwyQkFBMkIsZ1BDbER4QyxtNUxBMktBLDJsSkRuSWlCO1lBQ2I7Z0JBQ0UsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsVUFBVSxFQUFFLFdBQVc7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7YUFDM0Q7WUFDRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtZQUNsRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtTQUNuRDs7U0FFVSwyQkFBMkI7MkZBQTNCLDJCQUEyQjtrQkFkdkMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBRW5CLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDO3dCQUNiOzRCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLFVBQVUsRUFBRSxXQUFXOzRCQUN2QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUMzRDt3QkFDRCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTt3QkFDbEQsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7cUJBQ25EOzhOQUdRLElBQUk7c0JBQVosS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVzQixRQUFRO3NCQUFuQyxTQUFTO3VCQUFDLE9BQU87O0FBZ0xwQixTQUFTLFVBQVUsQ0FBQyxTQUFzQjtJQUN4QyxPQUFPLENBQ0wsU0FBUyxLQUFLLFVBQVUsQ0FBQyxRQUFRO1FBQ2pDLFNBQVMsS0FBSyxhQUFhLENBQUMsUUFBUTtRQUNwQyxTQUFTLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FDOUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFWFRFTlNJT05TX0ZPUk1fUFJPUCwgRVhURU5TSU9OU19GT1JNX1BST1BfREFUQSB9IGZyb20gJy4vLi4vLi4vdG9rZW5zL2V4dGVuc2lvbnMudG9rZW4nO1xyXG5pbXBvcnQgeyBBQlAsIEFicFZhbGlkYXRvcnMsIENvbmZpZ1N0YXRlU2VydmljZSwgVHJhY2tCeVNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9wdGlvbmFsLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgU2tpcFNlbGYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xDb250YWluZXIsXHJcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5nYkRhdGVBZGFwdGVyLCBOZ2JUaW1lQWRhcHRlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2RhdGUuYWRhcHRlcic7XHJcbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdGltZS5hZGFwdGVyJztcclxuaW1wb3J0IHsgRVhUUkFfUFJPUEVSVElFU19LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZXh0cmEtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IGVQcm9wVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3Byb3BzLmVudW0nO1xyXG5pbXBvcnQgeyBGb3JtUHJvcCB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLXByb3BzJztcclxuaW1wb3J0IHsgUHJvcERhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvcHMnO1xyXG5pbXBvcnQgeyBzZWxmRmFjdG9yeSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZhY3RvcnkudXRpbCc7XHJcbmltcG9ydCB7IGFkZFR5cGVhaGVhZFRleHRTdWZmaXggfSBmcm9tICcuLi8uLi91dGlscy90eXBlYWhlYWQudXRpbCc7XHJcbmltcG9ydCB7IGVUaGVtZVNoYXJlZENvbXBvbmVudHMgfSBmcm9tICcuLi8uLi9lbnVtcy9jb21wb25lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWJwLWV4dGVuc2libGUtZm9ybS1wcm9wJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHZpZXdQcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcclxuICAgICAgdXNlRmFjdG9yeTogc2VsZkZhY3RvcnksXHJcbiAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIG5ldyBTa2lwU2VsZigpLCBDb250cm9sQ29udGFpbmVyXV0sXHJcbiAgICB9LFxyXG4gICAgeyBwcm92aWRlOiBOZ2JEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IERhdGVBZGFwdGVyIH0sXHJcbiAgICB7IHByb3ZpZGU6IE5nYlRpbWVBZGFwdGVyLCB1c2VDbGFzczogVGltZUFkYXB0ZXIgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXh0ZW5zaWJsZUZvcm1Qcm9wQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBkYXRhITogUHJvcERhdGE7XHJcblxyXG4gIEBJbnB1dCgpIHByb3AhOiBGb3JtUHJvcDtcclxuXHJcbiAgQElucHV0KCkgZmlyc3Q/OiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWVsZCcpIHByaXZhdGUgZmllbGRSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgcHVibGljIGluamVjdG9yRm9yQ3VzdG9tQ29tcG9uZW50PzogSW5qZWN0b3I7XHJcblxyXG4gIGFzdGVyaXNrID0gJyc7XHJcblxyXG4gIGNvbnRhaW5lckNsYXNzTmFtZSA9ICdtYi0yJztcclxuXHJcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8QUJQLk9wdGlvbjxhbnk+W10+ID0gb2YoW10pO1xyXG5cclxuICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gIHJlYWRvbmx5ITogYm9vbGVhbjtcclxuXHJcbiAgdHlwZWFoZWFkTW9kZWw6IGFueTtcclxuXHJcbiAgcGFzc3dvcmRLZXkgPSBlVGhlbWVTaGFyZWRDb21wb25lbnRzLlBhc3N3b3JkQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIGRpc2FibGVkRm4gPSAoZGF0YTogUHJvcERhdGEpID0+IGZhbHNlO1xyXG5cclxuICBnZXQgZGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZEZuKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBzZXRUeXBlYWhlYWRWYWx1ZShzZWxlY3RlZE9wdGlvbjogQUJQLk9wdGlvbjxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLnR5cGVhaGVhZE1vZGVsID0gc2VsZWN0ZWRPcHRpb24gfHwgeyBrZXk6IG51bGwsIHZhbHVlOiBudWxsIH07XHJcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHRoaXMudHlwZWFoZWFkTW9kZWw7XHJcbiAgICBjb25zdCBba2V5Q29udHJvbCwgdmFsdWVDb250cm9sXSA9IHRoaXMuZ2V0VHlwZWFoZWFkQ29udHJvbHMoKTtcclxuICAgIGlmICh2YWx1ZUNvbnRyb2w/LnZhbHVlICYmICF2YWx1ZSkgdmFsdWVDb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBrZXlDb250cm9sPy5zZXRWYWx1ZShrZXkpO1xyXG4gICAgdmFsdWVDb250cm9sPy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2ggPSAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cclxuICAgIHRleHQkXHJcbiAgICAgID8gdGV4dCQucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCh0ZXh0ID0+IHRoaXMucHJvcD8ub3B0aW9ucz8uKHRoaXMuZGF0YSwgdGV4dCkgfHwgb2YoW10pKSxcclxuICAgICAgICApXHJcbiAgICAgIDogb2YoW10pO1xyXG5cclxuICB0eXBlYWhlYWRGb3JtYXR0ZXIgPSAob3B0aW9uOiBBQlAuT3B0aW9uPGFueT4pID0+IG9wdGlvbi5rZXk7XHJcblxyXG4gIGdldCBtZXJpZGlhbigpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuY29uZmlnU3RhdGUuZ2V0RGVlcCgnbG9jYWxpemF0aW9uLmN1cnJlbnRDdWx0dXJlLmRhdGVUaW1lRm9ybWF0LnNob3J0VGltZVBhdHRlcm4nKSB8fCAnJ1xyXG4gICAgKS5pbmNsdWRlcygndHQnKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0ludmFsaWQoKSB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLnByb3AubmFtZSk7XHJcbiAgICByZXR1cm4gY29udHJvbD8udG91Y2hlZCAmJiBjb250cm9sLmludmFsaWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHJhY2s6IFRyYWNrQnlTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2UsXHJcbiAgICBncm91cERpcmVjdGl2ZTogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmZvcm0gPSBncm91cERpcmVjdGl2ZS5mb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUeXBlYWhlYWRDb250cm9scygpIHtcclxuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5wcm9wO1xyXG4gICAgY29uc3QgZXh0cmFQcm9wTmFtZSA9IGAke0VYVFJBX1BST1BFUlRJRVNfS0VZfS4ke25hbWV9YDtcclxuICAgIGNvbnN0IGtleUNvbnRyb2wgPVxyXG4gICAgICB0aGlzLmZvcm0uZ2V0KGFkZFR5cGVhaGVhZFRleHRTdWZmaXgoZXh0cmFQcm9wTmFtZSkpIHx8XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChuYW1lKSk7XHJcbiAgICBjb25zdCB2YWx1ZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGV4dHJhUHJvcE5hbWUpIHx8IHRoaXMuZm9ybS5nZXQobmFtZSk7XHJcbiAgICByZXR1cm4gW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEFzdGVyaXNrKCkge1xyXG4gICAgdGhpcy5hc3RlcmlzayA9IHRoaXMudmFsaWRhdG9ycy5zb21lKGlzUmVxdWlyZWQpID8gJyonIDogJyc7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5maXJzdCAmJiB0aGlzLmZpZWxkUmVmKSB7XHJcbiAgICAgIHRoaXMuZmllbGRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudChwcm9wOiBGb3JtUHJvcCk6IHN0cmluZyB7XHJcbiAgICBpZiAocHJvcC50ZW1wbGF0ZSkge1xyXG4gICAgICByZXR1cm4gJ3RlbXBsYXRlJztcclxuICAgIH1cclxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkRhdGU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRlJztcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZVRpbWU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRlVGltZSc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkhpZGRlbjpcclxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLk11bHRpU2VsZWN0OlxyXG4gICAgICAgIHJldHVybiAnbXVsdGlzZWxlY3QnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5UZXh0OlxyXG4gICAgICAgIHJldHVybiAndGV4dGFyZWEnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5UaW1lOlxyXG4gICAgICAgIHJldHVybiAndGltZSc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLlR5cGVhaGVhZDpcclxuICAgICAgICByZXR1cm4gJ3R5cGVhaGVhZCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLlBhc3N3b3JkSW5wdXRHcm91cDpcclxuICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkaW5wdXRncm91cCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHByb3Aub3B0aW9ucyA/ICdzZWxlY3QnIDogJ2lucHV0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFR5cGUocHJvcDogRm9ybVByb3ApOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZTpcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuU3RyaW5nOlxyXG4gICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLk51bWJlcjpcclxuICAgICAgICByZXR1cm4gJ251bWJlcic7XHJcbiAgICAgIGNhc2UgZVByb3BUeXBlLkVtYWlsOlxyXG4gICAgICAgIHJldHVybiAnZW1haWwnO1xyXG4gICAgICBjYXNlIGVQcm9wVHlwZS5QYXNzd29yZDpcclxuICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkJztcclxuICAgICAgY2FzZSBlUHJvcFR5cGUuUGFzc3dvcmRJbnB1dEdyb3VwOlxyXG4gICAgICAgIHJldHVybiAncGFzc3dvcmRpbnB1dGdyb3VwJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyh7IHByb3AsIGRhdGEgfTogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgY29uc3QgY3VycmVudFByb3AgPSBwcm9wPy5jdXJyZW50VmFsdWUgYXMgRm9ybVByb3A7XHJcbiAgICBjb25zdCB7IG9wdGlvbnMsIHJlYWRvbmx5LCBkaXNhYmxlZCwgdmFsaWRhdG9ycywgY2xhc3NOYW1lLCB0ZW1wbGF0ZSB9ID0gY3VycmVudFByb3AgfHwge307XHJcbiAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbmplY3RvckZvckN1c3RvbUNvbXBvbmVudCA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEVYVEVOU0lPTlNfRk9STV9QUk9QLFxyXG4gICAgICAgICAgICB1c2VWYWx1ZTogY3VycmVudFByb3AsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBFWFRFTlNJT05TX0ZPUk1fUFJPUF9EQVRBLFxyXG4gICAgICAgICAgICB1c2VWYWx1ZTogKGRhdGE/LmN1cnJlbnRWYWx1ZSBhcyBQcm9wRGF0YSk/LnJlY29yZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBGb3JtR3JvdXBEaXJlY3RpdmUgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnMpIHRoaXMub3B0aW9ucyQgPSBvcHRpb25zKHRoaXMuZGF0YSk7XHJcbiAgICBpZiAocmVhZG9ubHkpIHRoaXMucmVhZG9ubHkgPSByZWFkb25seSh0aGlzLmRhdGEpO1xyXG5cclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmRpc2FibGVkRm4gPSBkaXNhYmxlZDtcclxuICAgIH1cclxuICAgIGlmICh2YWxpZGF0b3JzKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnModGhpcy5kYXRhKTtcclxuICAgICAgdGhpcy5zZXRBc3RlcmlzaygpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtrZXlDb250cm9sLCB2YWx1ZUNvbnRyb2xdID0gdGhpcy5nZXRUeXBlYWhlYWRDb250cm9scygpO1xyXG4gICAgaWYgKGtleUNvbnRyb2wgJiYgdmFsdWVDb250cm9sKVxyXG4gICAgICB0aGlzLnR5cGVhaGVhZE1vZGVsID0geyBrZXk6IGtleUNvbnRyb2wudmFsdWUsIHZhbHVlOiB2YWx1ZUNvbnRyb2wudmFsdWUgfTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUmVxdWlyZWQodmFsaWRhdG9yOiBWYWxpZGF0b3JGbikge1xyXG4gIHJldHVybiAoXHJcbiAgICB2YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHxcclxuICAgIHZhbGlkYXRvciA9PT0gQWJwVmFsaWRhdG9ycy5yZXF1aXJlZCB8fFxyXG4gICAgdmFsaWRhdG9yLm5hbWUgPT09ICdyZXF1aXJlZCdcclxuICApO1xyXG59XHJcbiIsIjxuZy1jb250YWluZXJcclxuICBbbmdTd2l0Y2hdPVwiZ2V0Q29tcG9uZW50KHByb3ApXCJcclxuICAqYWJwUGVybWlzc2lvbj1cInByb3AucGVybWlzc2lvbjsgcnVuQ2hhbmdlRGV0ZWN0aW9uOiBmYWxzZVwiXHJcbj5cclxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGVtcGxhdGVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwicHJvcC50ZW1wbGF0ZTsgaW5qZWN0b3I6IGluamVjdG9yRm9yQ3VzdG9tQ29tcG9uZW50XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cImNvbnRhaW5lckNsYXNzTmFtZVwiIGNsYXNzPVwibWItMlwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImlucHV0XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgICNmaWVsZFxyXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcclxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXHJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgW3R5cGVdPVwiZ2V0VHlwZShwcm9wKVwiXHJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgLz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImhpZGRlblwiPlxyXG4gICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgLz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImNoZWNrYm94XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgdmFsaWRhdGlvblRhcmdldD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICNmaWVsZFxyXG4gICAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6ICdmb3JtLWNoZWNrLWxhYmVsJyB9XCJcclxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJzZWxlY3RcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPHNlbGVjdFxyXG4gICAgICAgICNmaWVsZFxyXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcclxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXHJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrQnk6IHRyYWNrLmJ5KCd2YWx1ZScpXCJcclxuICAgICAgICAgIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgb3B0aW9uLmtleSB9fVxyXG4gICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cIm11bHRpc2VsZWN0XCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxzZWxlY3RcclxuICAgICAgICAjZmllbGRcclxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgIFthYnBEaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgbXVsdGlwbGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2xcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVwiXHJcbiAgICAgICAgICBbbmdWYWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IG9wdGlvbi5rZXkgfX1cclxuICAgICAgICA8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJ0eXBlYWhlYWRcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGRpdiAjdHlwZWFoZWFkIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiB2YWxpZGF0aW9uU3R5bGUgdmFsaWRhdGlvblRhcmdldD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICNmaWVsZFxyXG4gICAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJzZWFyY2hcIlxyXG4gICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJ0eXBlYWhlYWRGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgW3Jlc3VsdEZvcm1hdHRlcl09XCJ0eXBlYWhlYWRGb3JtYXR0ZXJcIlxyXG4gICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwidHlwZWFoZWFkTW9kZWxcIlxyXG4gICAgICAgICAgKHNlbGVjdEl0ZW0pPVwic2V0VHlwZWFoZWFkVmFsdWUoJGV2ZW50Lml0ZW0pXCJcclxuICAgICAgICAgIChibHVyKT1cInNldFR5cGVhaGVhZFZhbHVlKHR5cGVhaGVhZE1vZGVsKVwiXHJcbiAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ0eXBlYWhlYWQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1pbnZhbGlkJylcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCIgdHlwZT1cImhpZGRlblwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxyXG4gICAgICAgIChjbGljayk9XCJkYXRlcGlja2VyLm9wZW4oKVwiXHJcbiAgICAgICAgKGtleXVwLnNwYWNlKT1cImRhdGVwaWNrZXIub3BlbigpXCJcclxuICAgICAgICBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgI2RhdGVwaWNrZXI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAvPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGltZVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmdiLXRpbWVwaWNrZXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIj48L25nYi10aW1lcGlja2VyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVRpbWVcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGFicC1kYXRlLXRpbWUtcGlja2VyIFtwcm9wXT1cInByb3BcIiBbbWVyaWRpYW5dPVwibWVyaWRpYW5cIj48L2FicC1kYXRlLXRpbWUtcGlja2VyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGV4dGFyZWFcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgI2ZpZWxkXHJcbiAgICAgICAgW2lkXT1cInByb3AuaWRcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcclxuICAgICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICA+PC90ZXh0YXJlYT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cInBhc3N3b3JkaW5wdXRncm91cFwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8YWJwLXBhc3N3b3JkXHJcbiAgICAgICAgKmFicFJlcGxhY2VhYmxlVGVtcGxhdGU9XCJ7XHJcbiAgICAgICAgICBjb21wb25lbnRLZXk6IHBhc3N3b3JkS2V5LFxyXG4gICAgICAgICAgaW5wdXRzOiB7XHJcbiAgICAgICAgICAgIGlucHV0SWQ6IHsgdmFsdWU6IHByb3AuaWQgfSxcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lOiB7IHZhbHVlOiBwcm9wLm5hbWUgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgIFtpbnB1dElkXT1cInByb3AuaWRcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcclxuICAgICAgPjwvYWJwLXBhc3N3b3JkPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8c21hbGwgKm5nSWY9XCJwcm9wLmZvcm1UZXh0XCIgY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj57e1xyXG4gICAgICBwcm9wLmZvcm1UZXh0IHwgYWJwTG9jYWxpemF0aW9uXHJcbiAgICB9fTwvc21hbGw+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLXRlbXBsYXRlICNsYWJlbCBsZXQtY2xhc3Nlcz5cclxuICA8bGFiZWwgW2h0bWxGb3JdPVwicHJvcC5pZFwiIFtuZ0NsYXNzXT1cImNsYXNzZXMgfHwgJ2Zvcm0tbGFiZWwnXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcC5kaXNwbGF5VGV4dFJlc29sdmVyOyBlbHNlIGRpc3BsYXlOYW1lVGVtcGxhdGVcIj5cclxuICAgICAge3sgcHJvcC5kaXNwbGF5VGV4dFJlc29sdmVyKGRhdGEpIHwgYWJwTG9jYWxpemF0aW9uIH19XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5hbWVUZW1wbGF0ZT4ge3sgcHJvcC5kaXNwbGF5TmFtZSB8IGFicExvY2FsaXphdGlvbiB9fTwvbmctdGVtcGxhdGU+XHJcbiAgICB7eyBhc3RlcmlzayB9fVxyXG4gIDwvbGFiZWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { AuthService, HttpErrorReporterService, RouterEvents, } from '@abp/ng.core';
1
+ import { AuthService, HttpErrorReporterService, RouterEvents, SessionStateService, } from '@abp/ng.core';
2
2
  import { HttpErrorResponse } from '@angular/common/http';
3
3
  import { ApplicationRef, ComponentFactoryResolver, Injectable, Injector, RendererFactory2, } from '@angular/core';
4
4
  import { ResolveEnd } from '@angular/router';
@@ -84,6 +84,7 @@ class ErrorHandler {
84
84
  this.rendererFactory = injector.get(RendererFactory2);
85
85
  this.httpErrorConfig = injector.get('HTTP_ERROR_CONFIG');
86
86
  this.authService = this.injector.get(AuthService);
87
+ this.sessionStateService = this.injector.get(SessionStateService);
87
88
  this.listenToRestError();
88
89
  this.listenToRouterError();
89
90
  this.listenToRouterDataResolved();
@@ -114,6 +115,7 @@ class ErrorHandler {
114
115
  defaultValue: DEFAULT_ERROR_MESSAGES.defaultError.title,
115
116
  };
116
117
  if (err instanceof HttpErrorResponse && err.headers.get('Abp-Tenant-Resolve-Error')) {
118
+ this.sessionStateService.setTenant(null);
117
119
  this.authService.logout().subscribe();
118
120
  return;
119
121
  }
@@ -291,4 +293,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImpor
291
293
  type: Injectable,
292
294
  args: [{ providedIn: 'root' }]
293
295
  }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lLXNoYXJlZC9zcmMvbGliL2hhbmRsZXJzL2Vycm9yLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCx3QkFBd0IsRUFFeEIsWUFBWSxHQUNiLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBR3hCLFVBQVUsRUFDVixRQUFRLEVBQ1IsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUcxRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFaEUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDcEMsWUFBWSxFQUFFO1FBQ1osS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixPQUFPLEVBQUUsa0NBQWtDO0tBQzVDO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLDRCQUE0QjtRQUNuQyxPQUFPLEVBQUUsMkVBQTJFO0tBQ3JGO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLHlCQUF5QjtRQUNoQyxPQUFPLEVBQUUsZ0RBQWdE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TUFBNkI7UUFDaEQsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWM7WUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDdkUsQ0FBQztJQUNKLENBQUM7OEdBNVFVLFlBQVk7a0hBQVosWUFBWSxjQURDLE1BQU07O1NBQ25CLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLFxyXG4gIEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSxcclxuICBMb2NhbGl6YXRpb25QYXJhbSxcclxuICBSb3V0ZXJFdmVudHMsXHJcbn0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25SZWYsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBFbWJlZGRlZFZpZXdSZWYsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbmplY3RvcixcclxuICBSZW5kZXJlckZhY3RvcnkyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRXJyb3IsIFJlc29sdmVFbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSHR0cEVycm9yV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvaHR0cC1lcnJvci13cmFwcGVyL2h0dHAtZXJyb3Itd3JhcHBlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFcnJvclNjcmVlbkVycm9yQ29kZXMsIEh0dHBFcnJvckNvbmZpZyB9IGZyb20gJy4uL21vZGVscy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb24gfSBmcm9tICcuLi9tb2RlbHMvY29uZmlybWF0aW9uJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpcm1hdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSFRUUF9FUlJPUl9IQU5ETEVSIH0gZnJvbSAnLi4vdG9rZW5zL2h0dHAtZXJyb3IudG9rZW4nO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgPSB7XHJcbiAgZGVmYXVsdEVycm9yOiB7XHJcbiAgICB0aXRsZTogJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCEnLFxyXG4gICAgZGV0YWlsczogJ0Vycm9yIGRldGFpbCBub3Qgc2VudCBieSBzZXJ2ZXIuJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjQwMToge1xyXG4gICAgdGl0bGU6ICdZb3UgYXJlIG5vdCBhdXRoZW50aWNhdGVkIScsXHJcbiAgICBkZXRhaWxzOiAnWW91IHNob3VsZCBiZSBhdXRoZW50aWNhdGVkIChzaWduIGluKSBpbiBvcmRlciB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLicsXHJcbiAgfSxcclxuICBkZWZhdWx0RXJyb3I0MDM6IHtcclxuICAgIHRpdGxlOiAnWW91IGFyZSBub3QgYXV0aG9yaXplZCEnLFxyXG4gICAgZGV0YWlsczogJ1lvdSBhcmUgbm90IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbi4nLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNDA0OiB7XHJcbiAgICB0aXRsZTogJ1Jlc291cmNlIG5vdCBmb3VuZCEnLFxyXG4gICAgZGV0YWlsczogJ1RoZSByZXNvdXJjZSByZXF1ZXN0ZWQgY291bGQgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjUwMDoge1xyXG4gICAgdGl0bGU6ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InLFxyXG4gICAgZGV0YWlsczogJ0Vycm9yIGRldGFpbCBub3Qgc2VudCBieSBzZXJ2ZXIuJyxcclxuICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUyA9IHtcclxuICBkZWZhdWx0RXJyb3I6IHtcclxuICAgIHRpdGxlOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2UnLFxyXG4gICAgZGV0YWlsczogJ0FicFVpOjpEZWZhdWx0RXJyb3JNZXNzYWdlRGV0YWlsJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjQwMToge1xyXG4gICAgdGl0bGU6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZTQwMScsXHJcbiAgICBkZXRhaWxzOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2U0MDFEZXRhaWwnLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNDAzOiB7XHJcbiAgICB0aXRsZTogJ0FicFVpOjpEZWZhdWx0RXJyb3JNZXNzYWdlNDAzJyxcclxuICAgIGRldGFpbHM6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZTQwM0RldGFpbCcsXHJcbiAgfSxcclxuICBkZWZhdWx0RXJyb3I0MDQ6IHtcclxuICAgIHRpdGxlOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2U0MDQnLFxyXG4gICAgZGV0YWlsczogJ0FicFVpOjpEZWZhdWx0RXJyb3JNZXNzYWdlNDA0RGV0YWlsJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjUwMDoge1xyXG4gICAgdGl0bGU6ICdBYnBVaTo6NTAwTWVzc2FnZScsXHJcbiAgICBkZXRhaWxzOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2UnLFxyXG4gIH0sXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgRXJyb3JIYW5kbGVyIHtcclxuICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxIdHRwRXJyb3JXcmFwcGVyQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgaHR0cEVycm9ySGFuZGxlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KEhUVFBfRVJST1JfSEFORExFUiwgKF8sIGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+XHJcbiAgICB0aHJvd0Vycm9yKGVyciksXHJcbiAgKTtcclxuXHJcbiAgcHJvdGVjdGVkIGh0dHBFcnJvclJlcG9ydGVyOiBIdHRwRXJyb3JSZXBvcnRlclNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlckV2ZW50czogUm91dGVyRXZlbnRzO1xyXG4gIHByb3RlY3RlZCBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBjZlJlczogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xyXG4gIHByb3RlY3RlZCByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTI7XHJcbiAgcHJvdGVjdGVkIGh0dHBFcnJvckNvbmZpZzogSHR0cEVycm9yQ29uZmlnO1xyXG4gIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyID0gaW5qZWN0b3IuZ2V0KEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlckV2ZW50cyA9IGluamVjdG9yLmdldChSb3V0ZXJFdmVudHMpO1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy5jZlJlcyA9IGluamVjdG9yLmdldChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gICAgdGhpcy5yZW5kZXJlckZhY3RvcnkgPSBpbmplY3Rvci5nZXQoUmVuZGVyZXJGYWN0b3J5Mik7XHJcbiAgICB0aGlzLmh0dHBFcnJvckNvbmZpZyA9IGluamVjdG9yLmdldCgnSFRUUF9FUlJPUl9DT05GSUcnKTtcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChBdXRoU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5Ub1Jlc3RFcnJvcigpO1xyXG4gICAgdGhpcy5saXN0ZW5Ub1JvdXRlckVycm9yKCk7XHJcbiAgICB0aGlzLmxpc3RlblRvUm91dGVyRGF0YVJlc29sdmVkKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuVG9Sb3V0ZXJFcnJvcigpIHtcclxuICAgIHRoaXMucm91dGVyRXZlbnRzXHJcbiAgICAgIC5nZXROYXZpZ2F0aW9uRXZlbnRzKCdFcnJvcicpXHJcbiAgICAgIC5waXBlKGZpbHRlcih0aGlzLmZpbHRlclJvdXRlRXJyb3JzKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3c0MDRQYWdlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlblRvUm91dGVyRGF0YVJlc29sdmVkKCkge1xyXG4gICAgdGhpcy5yb3V0ZXJFdmVudHNcclxuICAgICAgLmdldEV2ZW50cyhSZXNvbHZlRW5kKVxyXG4gICAgICAucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLmNvbXBvbmVudFJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5Ub1Jlc3RFcnJvcigpIHtcclxuICAgIHRoaXMuaHR0cEVycm9yUmVwb3J0ZXIucmVwb3J0ZXIkXHJcbiAgICAgIC5waXBlKGZpbHRlcih0aGlzLmZpbHRlclJlc3RFcnJvcnMpLCBzd2l0Y2hNYXAodGhpcy5leGVjdXRlRXJyb3JIYW5kbGVyKSlcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlRXJyb3JIYW5kbGVyID0gKGVycm9yOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGVyckhhbmRsZXIgPSB0aGlzLmh0dHBFcnJvckhhbmRsZXIodGhpcy5pbmplY3RvciwgZXJyb3IpO1xyXG4gICAgY29uc3QgaXNPYnNlcnZhYmxlID0gZXJySGFuZGxlciBpbnN0YW5jZW9mIE9ic2VydmFibGU7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGlzT2JzZXJ2YWJsZSA/IGVyckhhbmRsZXIgOiBvZihudWxsKTtcclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2UucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycjogYW55KSB7XHJcbiAgICBjb25zdCBib2R5ID0gZXJyPy5lcnJvcj8uZXJyb3IgfHwge1xyXG4gICAgICBrZXk6IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUy5kZWZhdWx0RXJyb3IudGl0bGUsXHJcbiAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3IudGl0bGUsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnIuaGVhZGVycy5nZXQoJ0FicC1UZW5hbnQtUmVzb2x2ZS1FcnJvcicpKSB7XHJcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgJiYgZXJyLmhlYWRlcnMuZ2V0KCdfQWJwRXJyb3JGb3JtYXQnKSkge1xyXG4gICAgICBjb25zdCBjb25maXJtYXRpb24kID0gdGhpcy5zaG93RXJyb3JXaXRoUmVxdWVzdEJvZHkoYm9keSk7XHJcblxyXG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgY29uZmlybWF0aW9uJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTG9naW4oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3dpdGNoIChlcnIuc3RhdHVzKSB7XHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICB0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKDQwMSlcclxuICAgICAgICAgICAgPyB0aGlzLnNob3c0MDFQYWdlKClcclxuICAgICAgICAgICAgOiB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAxLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDAxLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAxLmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I0MDEuZGV0YWlscyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uYXZpZ2F0ZVRvTG9naW4oKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRXJyb3JDb21wb25lbnQoe1xyXG4gICAgICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwMy50aXRsZSxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDAzLnRpdGxlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAzLmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwMy5kZXRhaWxzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdGF0dXM6IDQwMyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKDQwNClcclxuICAgICAgICAgICAgPyB0aGlzLnNob3c0MDRQYWdlKClcclxuICAgICAgICAgICAgOiB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDA0LmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I0MDQuZGV0YWlscyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgNTAwOlxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVFcnJvckNvbXBvbmVudCh7XHJcbiAgICAgICAgICAgIHRpdGxlOiB7XHJcbiAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNTAwLnRpdGxlLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I1MDAudGl0bGUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHtcclxuICAgICAgICAgICAgICBrZXk6IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUy5kZWZhdWx0RXJyb3I1MDAuZGV0YWlscyxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNTAwLmRldGFpbHMsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN0YXR1czogNTAwLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBpZiAoZXJyLnN0YXR1c1RleHQgPT09ICdVbmtub3duIEVycm9yJykge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUVycm9yQ29tcG9uZW50KHtcclxuICAgICAgICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGRldGFpbHM6IGVyci5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgIGlzSG9tZVNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci5kZXRhaWxzLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3IuZGV0YWlscyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2hvdzQwMVBhZ2UoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZUVycm9yQ29tcG9uZW50KHtcclxuICAgICAgdGl0bGU6IHtcclxuICAgICAgICBrZXk6IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUy5kZWZhdWx0RXJyb3I0MDEudGl0bGUsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwMS50aXRsZSxcclxuICAgICAgfSxcclxuICAgICAgc3RhdHVzOiA0MDEsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzaG93NDA0UGFnZSgpIHtcclxuICAgIHRoaXMuY3JlYXRlRXJyb3JDb21wb25lbnQoe1xyXG4gICAgICB0aXRsZToge1xyXG4gICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDA0LnRpdGxlLFxyXG4gICAgICB9LFxyXG4gICAgICBzdGF0dXM6IDQwNCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNob3dFcnJvcldpdGhSZXF1ZXN0Qm9keShib2R5OiBhbnkpIHtcclxuICAgIGxldCBtZXNzYWdlOiBMb2NhbGl6YXRpb25QYXJhbTtcclxuICAgIGxldCB0aXRsZTogTG9jYWxpemF0aW9uUGFyYW07XHJcblxyXG4gICAgaWYgKGJvZHkuZGV0YWlscykge1xyXG4gICAgICBtZXNzYWdlID0gYm9keS5kZXRhaWxzO1xyXG4gICAgICB0aXRsZSA9IGJvZHkubWVzc2FnZTtcclxuICAgIH0gZWxzZSBpZiAoYm9keS5tZXNzYWdlKSB7XHJcbiAgICAgIHRpdGxlID0ge1xyXG4gICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICB9O1xyXG4gICAgICBtZXNzYWdlID0gYm9keS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWVzc2FnZSA9IGJvZHkubWVzc2FnZSB8fCB7XHJcbiAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3IudGl0bGUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRpdGxlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yKG1lc3NhZ2UsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzaG93RXJyb3IoXHJcbiAgICBtZXNzYWdlOiBMb2NhbGl6YXRpb25QYXJhbSxcclxuICAgIHRpdGxlOiBMb2NhbGl6YXRpb25QYXJhbSxcclxuICApOiBPYnNlcnZhYmxlPENvbmZpcm1hdGlvbi5TdGF0dXM+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuZXJyb3IobWVzc2FnZSwgdGl0bGUsIHtcclxuICAgICAgaGlkZUNhbmNlbEJ0bjogdHJ1ZSxcclxuICAgICAgeWVzVGV4dDogJ0FicEFjY291bnQ6OkNsb3NlJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTG9naW4oKSB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLm5hdmlnYXRlVG9Mb2dpbigpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRXJyb3JDb21wb25lbnQoaW5zdGFuY2U6IFBhcnRpYWw8SHR0cEVycm9yV3JhcHBlckNvbXBvbmVudD4pIHtcclxuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XHJcbiAgICBjb25zdCBob3N0ID0gcmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQoZG9jdW1lbnQuYm9keSwgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmNmUmVzXHJcbiAgICAgIC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShIdHRwRXJyb3JXcmFwcGVyQ29tcG9uZW50KVxyXG4gICAgICAuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlKSB7XHJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UsIGtleSkpIHtcclxuICAgICAgICAodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmhpZGVDbG9zZUljb24gPSAhIXRoaXMuaHR0cEVycm9yQ29uZmlnLmVycm9yU2NyZWVuPy5oaWRlQ2xvc2VJY29uO1xyXG4gICAgY29uc3QgYXBwUmVmID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKGluc3RhbmNlLnN0YXR1cyBhcyBFcnJvclNjcmVlbkVycm9yQ29kZXMpKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmNmUmVzID0gdGhpcy5jZlJlcztcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYXBwUmVmID0gYXBwUmVmO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5pbmplY3RvciA9IHRoaXMuaW5qZWN0b3I7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmN1c3RvbUNvbXBvbmVudCA9IHRoaXMuaHR0cEVycm9yQ29uZmlnLmVycm9yU2NyZWVuPy5jb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQoaG9zdCwgKHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0pO1xyXG5cclxuICAgIGNvbnN0IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmRlc3Ryb3kkID0gZGVzdHJveSQ7XHJcbiAgICBkZXN0cm95JC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNhbkNyZWF0ZUN1c3RvbUVycm9yKHN0YXR1czogRXJyb3JTY3JlZW5FcnJvckNvZGVzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgIHRoaXMuaHR0cEVycm9yQ29uZmlnPy5lcnJvclNjcmVlbj8uY29tcG9uZW50ICYmXHJcbiAgICAgIHRoaXMuaHR0cEVycm9yQ29uZmlnPy5lcnJvclNjcmVlbj8uZm9yV2hpY2hFcnJvcnMgJiZcclxuICAgICAgdGhpcy5odHRwRXJyb3JDb25maWc/LmVycm9yU2NyZWVuPy5mb3JXaGljaEVycm9ycy5pbmRleE9mKHN0YXR1cykgPiAtMVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJSZXN0RXJyb3JzID0gKHsgc3RhdHVzIH06IEh0dHBFcnJvclJlc3BvbnNlKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHN0YXR1cyAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMuaHR0cEVycm9yQ29uZmlnLnNraXBIYW5kbGVkRXJyb3JDb2RlcyAmJlxyXG4gICAgICB0aGlzLmh0dHBFcnJvckNvbmZpZy5za2lwSGFuZGxlZEVycm9yQ29kZXMuZmluZEluZGV4KGNvZGUgPT4gY29kZSA9PT0gc3RhdHVzKSA8IDBcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlclJvdXRlRXJyb3JzID0gKG5hdmlnYXRpb25FcnJvcjogTmF2aWdhdGlvbkVycm9yKTogYm9vbGVhbiA9PiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBuYXZpZ2F0aW9uRXJyb3IuZXJyb3I/Lm1lc3NhZ2U/LmluZGV4T2YoJ0Nhbm5vdCBtYXRjaCcpID4gLTEgJiZcclxuICAgICAgISF0aGlzLmh0dHBFcnJvckNvbmZpZy5za2lwSGFuZGxlZEVycm9yQ29kZXMgJiZcclxuICAgICAgdGhpcy5odHRwRXJyb3JDb25maWcuc2tpcEhhbmRsZWRFcnJvckNvZGVzLmZpbmRJbmRleChjb2RlID0+IGNvZGUgPT09IDQwNCkgPCAwXHJcbiAgICApO1xyXG4gIH07XHJcbn1cclxuIl19
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lLXNoYXJlZC9zcmMvbGliL2hhbmRsZXJzL2Vycm9yLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUMsT0FBTyxFQUNOLFdBQVcsRUFDWCx3QkFBd0IsRUFFeEIsWUFBWSxFQUNaLG1CQUFtQixHQUNwQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUd4QixVQUFVLEVBQ1YsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFHMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWhFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLFlBQVksRUFBRTtRQUNaLEtBQUssRUFBRSx3QkFBd0I7UUFDL0IsT0FBTyxFQUFFLGtDQUFrQztLQUM1QztJQUNELGVBQWUsRUFBRTtRQUNmLEtBQUssRUFBRSw0QkFBNEI7UUFDbkMsT0FBTyxFQUFFLDJFQUEyRTtLQUNyRjtJQUNELGVBQWUsRUFBRTtRQUNmLEtBQUssRUFBRSx5QkFBeUI7UUFDaEMsT0FB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QVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUE2QjtRQUNoRCxPQUFPLENBQUMsQ0FBQyxDQUNQLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVM7WUFDNUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYztZQUNqRCxJQUFJLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQzs4R0FoUlUsWUFBWTtrSEFBWixZQUFZLGNBREMsTUFBTTs7U0FDbkIsWUFBWTsyRkFBWixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIiBpbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLFxyXG4gIEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSxcclxuICBMb2NhbGl6YXRpb25QYXJhbSxcclxuICBSb3V0ZXJFdmVudHMsXHJcbiAgU2Vzc2lvblN0YXRlU2VydmljZSxcclxufSBmcm9tICdAYWJwL25nLmNvcmUnO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvblJlZixcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVtYmVkZGVkVmlld1JlZixcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIFJlbmRlcmVyRmFjdG9yeTIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FcnJvciwgUmVzb2x2ZUVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9odHRwLWVycm9yLXdyYXBwZXIvaHR0cC1lcnJvci13cmFwcGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVycm9yU2NyZWVuRXJyb3JDb2RlcywgSHR0cEVycm9yQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbiB9IGZyb20gJy4uL21vZGVscy9jb25maXJtYXRpb24nO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIVFRQX0VSUk9SX0hBTkRMRVIgfSBmcm9tICcuLi90b2tlbnMvaHR0cC1lcnJvci50b2tlbic7XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcclxuICBkZWZhdWx0RXJyb3I6IHtcclxuICAgIHRpdGxlOiAnQW4gZXJyb3IgaGFzIG9jY3VycmVkIScsXHJcbiAgICBkZXRhaWxzOiAnRXJyb3IgZGV0YWlsIG5vdCBzZW50IGJ5IHNlcnZlci4nLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNDAxOiB7XHJcbiAgICB0aXRsZTogJ1lvdSBhcmUgbm90IGF1dGhlbnRpY2F0ZWQhJyxcclxuICAgIGRldGFpbHM6ICdZb3Ugc2hvdWxkIGJlIGF1dGhlbnRpY2F0ZWQgKHNpZ24gaW4pIGluIG9yZGVyIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjQwMzoge1xyXG4gICAgdGl0bGU6ICdZb3UgYXJlIG5vdCBhdXRob3JpemVkIScsXHJcbiAgICBkZXRhaWxzOiAnWW91IGFyZSBub3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLicsXHJcbiAgfSxcclxuICBkZWZhdWx0RXJyb3I0MDQ6IHtcclxuICAgIHRpdGxlOiAnUmVzb3VyY2Ugbm90IGZvdW5kIScsXHJcbiAgICBkZXRhaWxzOiAnVGhlIHJlc291cmNlIHJlcXVlc3RlZCBjb3VsZCBub3QgZm91bmQgb24gdGhlIHNlcnZlci4nLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNTAwOiB7XHJcbiAgICB0aXRsZTogJ0ludGVybmFsIHNlcnZlciBlcnJvcicsXHJcbiAgICBkZXRhaWxzOiAnRXJyb3IgZGV0YWlsIG5vdCBzZW50IGJ5IHNlcnZlci4nLFxyXG4gIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TID0ge1xyXG4gIGRlZmF1bHRFcnJvcjoge1xyXG4gICAgdGl0bGU6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZScsXHJcbiAgICBkZXRhaWxzOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2VEZXRhaWwnLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNDAxOiB7XHJcbiAgICB0aXRsZTogJ0FicFVpOjpEZWZhdWx0RXJyb3JNZXNzYWdlNDAxJyxcclxuICAgIGRldGFpbHM6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZTQwMURldGFpbCcsXHJcbiAgfSxcclxuICBkZWZhdWx0RXJyb3I0MDM6IHtcclxuICAgIHRpdGxlOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2U0MDMnLFxyXG4gICAgZGV0YWlsczogJ0FicFVpOjpEZWZhdWx0RXJyb3JNZXNzYWdlNDAzRGV0YWlsJyxcclxuICB9LFxyXG4gIGRlZmF1bHRFcnJvcjQwNDoge1xyXG4gICAgdGl0bGU6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZTQwNCcsXHJcbiAgICBkZXRhaWxzOiAnQWJwVWk6OkRlZmF1bHRFcnJvck1lc3NhZ2U0MDREZXRhaWwnLFxyXG4gIH0sXHJcbiAgZGVmYXVsdEVycm9yNTAwOiB7XHJcbiAgICB0aXRsZTogJ0FicFVpOjo1MDBNZXNzYWdlJyxcclxuICAgIGRldGFpbHM6ICdBYnBVaTo6RGVmYXVsdEVycm9yTWVzc2FnZScsXHJcbiAgfSxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBFcnJvckhhbmRsZXIge1xyXG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEh0dHBFcnJvcldyYXBwZXJDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByb3RlY3RlZCBodHRwRXJyb3JIYW5kbGVyID0gdGhpcy5pbmplY3Rvci5nZXQoSFRUUF9FUlJPUl9IQU5ETEVSLCAoXywgZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cclxuICAgIHRocm93RXJyb3IoZXJyKSxcclxuICApO1xyXG5cclxuICBwcm90ZWN0ZWQgaHR0cEVycm9yUmVwb3J0ZXI6IEh0dHBFcnJvclJlcG9ydGVyU2VydmljZTtcclxuICBwcm90ZWN0ZWQgcm91dGVyRXZlbnRzOiBSb3V0ZXJFdmVudHM7XHJcbiAgcHJvdGVjdGVkIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIGNmUmVzOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XHJcbiAgcHJvdGVjdGVkIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MjtcclxuICBwcm90ZWN0ZWQgaHR0cEVycm9yQ29uZmlnOiBIdHRwRXJyb3JDb25maWc7XHJcbiAgcHJvdGVjdGVkIHNlc3Npb25TdGF0ZVNlcnZpY2U6IFNlc3Npb25TdGF0ZVNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2U7XHJcbiAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHRoaXMuaHR0cEVycm9yUmVwb3J0ZXIgPSBpbmplY3Rvci5nZXQoSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlKTtcclxuICAgIHRoaXMucm91dGVyRXZlbnRzID0gaW5qZWN0b3IuZ2V0KFJvdXRlckV2ZW50cyk7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoQ29uZmlybWF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmNmUmVzID0gaW5qZWN0b3IuZ2V0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7XHJcbiAgICB0aGlzLnJlbmRlcmVyRmFjdG9yeSA9IGluamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyKTtcclxuICAgIHRoaXMuaHR0cEVycm9yQ29uZmlnID0gaW5qZWN0b3IuZ2V0KCdIVFRQX0VSUk9SX0NPTkZJRycpO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhTZXJ2aWNlKTtcclxuICAgIHRoaXMuc2Vzc2lvblN0YXRlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNlc3Npb25TdGF0ZVNlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMubGlzdGVuVG9SZXN0RXJyb3IoKTtcclxuICAgIHRoaXMubGlzdGVuVG9Sb3V0ZXJFcnJvcigpO1xyXG4gICAgdGhpcy5saXN0ZW5Ub1JvdXRlckRhdGFSZXNvbHZlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlblRvUm91dGVyRXJyb3IoKSB7XHJcbiAgICB0aGlzLnJvdXRlckV2ZW50c1xyXG4gICAgICAuZ2V0TmF2aWdhdGlvbkV2ZW50cygnRXJyb3InKVxyXG4gICAgICAucGlwZShmaWx0ZXIodGhpcy5maWx0ZXJSb3V0ZUVycm9ycykpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93NDA0UGFnZSgpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5Ub1JvdXRlckRhdGFSZXNvbHZlZCgpIHtcclxuICAgIHRoaXMucm91dGVyRXZlbnRzXHJcbiAgICAgIC5nZXRFdmVudHMoUmVzb2x2ZUVuZClcclxuICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5jb21wb25lbnRSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuVG9SZXN0RXJyb3IoKSB7XHJcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyLnJlcG9ydGVyJFxyXG4gICAgICAucGlwZShmaWx0ZXIodGhpcy5maWx0ZXJSZXN0RXJyb3JzKSwgc3dpdGNoTWFwKHRoaXMuZXhlY3V0ZUVycm9ySGFuZGxlcikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhlY3V0ZUVycm9ySGFuZGxlciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICBjb25zdCBlcnJIYW5kbGVyID0gdGhpcy5odHRwRXJyb3JIYW5kbGVyKHRoaXMuaW5qZWN0b3IsIGVycm9yKTtcclxuICAgIGNvbnN0IGlzT2JzZXJ2YWJsZSA9IGVyckhhbmRsZXIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBpc09ic2VydmFibGUgPyBlcnJIYW5kbGVyIDogb2YobnVsbCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnI6IGFueSkge1xyXG4gICAgY29uc3QgYm9keSA9IGVycj8uZXJyb3I/LmVycm9yIHx8IHtcclxuICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgJiYgZXJyLmhlYWRlcnMuZ2V0KCdBYnAtVGVuYW50LVJlc29sdmUtRXJyb3InKSkge1xyXG4gICAgICB0aGlzLnNlc3Npb25TdGF0ZVNlcnZpY2Uuc2V0VGVuYW50KG51bGwpXHJcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgJiYgZXJyLmhlYWRlcnMuZ2V0KCdfQWJwRXJyb3JGb3JtYXQnKSkge1xyXG4gICAgICBjb25zdCBjb25maXJtYXRpb24kID0gdGhpcy5zaG93RXJyb3JXaXRoUmVxdWVzdEJvZHkoYm9keSk7XHJcblxyXG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgY29uZmlybWF0aW9uJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTG9naW4oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3dpdGNoIChlcnIuc3RhdHVzKSB7XHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICB0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKDQwMSlcclxuICAgICAgICAgICAgPyB0aGlzLnNob3c0MDFQYWdlKClcclxuICAgICAgICAgICAgOiB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAxLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDAxLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAxLmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I0MDEuZGV0YWlscyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uYXZpZ2F0ZVRvTG9naW4oKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRXJyb3JDb21wb25lbnQoe1xyXG4gICAgICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwMy50aXRsZSxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDAzLnRpdGxlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDAzLmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwMy5kZXRhaWxzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdGF0dXM6IDQwMyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKDQwNClcclxuICAgICAgICAgICAgPyB0aGlzLnNob3c0MDRQYWdlKClcclxuICAgICAgICAgICAgOiB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNDA0LmRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I0MDQuZGV0YWlscyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgNTAwOlxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVFcnJvckNvbXBvbmVudCh7XHJcbiAgICAgICAgICAgIHRpdGxlOiB7XHJcbiAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yNTAwLnRpdGxlLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3I1MDAudGl0bGUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHtcclxuICAgICAgICAgICAgICBrZXk6IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUy5kZWZhdWx0RXJyb3I1MDAuZGV0YWlscyxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNTAwLmRldGFpbHMsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN0YXR1czogNTAwLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBpZiAoZXJyLnN0YXR1c1RleHQgPT09ICdVbmtub3duIEVycm9yJykge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUVycm9yQ29tcG9uZW50KHtcclxuICAgICAgICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGRldGFpbHM6IGVyci5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgIGlzSG9tZVNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci5kZXRhaWxzLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3IuZGV0YWlscyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2hvdzQwMVBhZ2UoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZUVycm9yQ29tcG9uZW50KHtcclxuICAgICAgdGl0bGU6IHtcclxuICAgICAgICBrZXk6IERFRkFVTFRfRVJST1JfTE9DQUxJWkFUSU9OUy5kZWZhdWx0RXJyb3I0MDEudGl0bGUsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRlZmF1bHRFcnJvcjQwMS50aXRsZSxcclxuICAgICAgfSxcclxuICAgICAgc3RhdHVzOiA0MDEsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzaG93NDA0UGFnZSgpIHtcclxuICAgIHRoaXMuY3JlYXRlRXJyb3JDb21wb25lbnQoe1xyXG4gICAgICB0aXRsZToge1xyXG4gICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvcjQwNC50aXRsZSxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yNDA0LnRpdGxlLFxyXG4gICAgICB9LFxyXG4gICAgICBzdGF0dXM6IDQwNCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNob3dFcnJvcldpdGhSZXF1ZXN0Qm9keShib2R5OiBhbnkpIHtcclxuICAgIGxldCBtZXNzYWdlOiBMb2NhbGl6YXRpb25QYXJhbTtcclxuICAgIGxldCB0aXRsZTogTG9jYWxpemF0aW9uUGFyYW07XHJcblxyXG4gICAgaWYgKGJvZHkuZGV0YWlscykge1xyXG4gICAgICBtZXNzYWdlID0gYm9keS5kZXRhaWxzO1xyXG4gICAgICB0aXRsZSA9IGJvZHkubWVzc2FnZTtcclxuICAgIH0gZWxzZSBpZiAoYm9keS5tZXNzYWdlKSB7XHJcbiAgICAgIHRpdGxlID0ge1xyXG4gICAgICAgIGtleTogREVGQVVMVF9FUlJPUl9MT0NBTElaQVRJT05TLmRlZmF1bHRFcnJvci50aXRsZSxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICB9O1xyXG4gICAgICBtZXNzYWdlID0gYm9keS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWVzc2FnZSA9IGJvZHkubWVzc2FnZSB8fCB7XHJcbiAgICAgICAga2V5OiBERUZBVUxUX0VSUk9SX0xPQ0FMSVpBVElPTlMuZGVmYXVsdEVycm9yLnRpdGxlLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kZWZhdWx0RXJyb3IudGl0bGUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRpdGxlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yKG1lc3NhZ2UsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzaG93RXJyb3IoXHJcbiAgICBtZXNzYWdlOiBMb2NhbGl6YXRpb25QYXJhbSxcclxuICAgIHRpdGxlOiBMb2NhbGl6YXRpb25QYXJhbSxcclxuICApOiBPYnNlcnZhYmxlPENvbmZpcm1hdGlvbi5TdGF0dXM+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuZXJyb3IobWVzc2FnZSwgdGl0bGUsIHtcclxuICAgICAgaGlkZUNhbmNlbEJ0bjogdHJ1ZSxcclxuICAgICAgeWVzVGV4dDogJ0FicEFjY291bnQ6OkNsb3NlJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTG9naW4oKSB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLm5hdmlnYXRlVG9Mb2dpbigpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRXJyb3JDb21wb25lbnQoaW5zdGFuY2U6IFBhcnRpYWw8SHR0cEVycm9yV3JhcHBlckNvbXBvbmVudD4pIHtcclxuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XHJcbiAgICBjb25zdCBob3N0ID0gcmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQoZG9jdW1lbnQuYm9keSwgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmNmUmVzXHJcbiAgICAgIC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShIdHRwRXJyb3JXcmFwcGVyQ29tcG9uZW50KVxyXG4gICAgICAuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlKSB7XHJcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UsIGtleSkpIHtcclxuICAgICAgICAodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmhpZGVDbG9zZUljb24gPSAhIXRoaXMuaHR0cEVycm9yQ29uZmlnLmVycm9yU2NyZWVuPy5oaWRlQ2xvc2VJY29uO1xyXG4gICAgY29uc3QgYXBwUmVmID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhbkNyZWF0ZUN1c3RvbUVycm9yKGluc3RhbmNlLnN0YXR1cyBhcyBFcnJvclNjcmVlbkVycm9yQ29kZXMpKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmNmUmVzID0gdGhpcy5jZlJlcztcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYXBwUmVmID0gYXBwUmVmO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5pbmplY3RvciA9IHRoaXMuaW5qZWN0b3I7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmN1c3RvbUNvbXBvbmVudCA9IHRoaXMuaHR0cEVycm9yQ29uZmlnLmVycm9yU2NyZWVuPy5jb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQoaG9zdCwgKHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0pO1xyXG5cclxuICAgIGNvbnN0IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmRlc3Ryb3kkID0gZGVzdHJveSQ7XHJcbiAgICBkZXN0cm95JC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNhbkNyZWF0ZUN1c3RvbUVycm9yKHN0YXR1czogRXJyb3JTY3JlZW5FcnJvckNvZGVzKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgIHRoaXMuaHR0cEVycm9yQ29uZmlnPy5lcnJvclNjcmVlbj8uY29tcG9uZW50ICYmXHJcbiAgICAgIHRoaXMuaHR0cEVycm9yQ29uZmlnPy5lcnJvclNjcmVlbj8uZm9yV2hpY2hFcnJvcnMgJiZcclxuICAgICAgdGhpcy5odHRwRXJyb3JDb25maWc/LmVycm9yU2NyZWVuPy5mb3JXaGljaEVycm9ycy5pbmRleE9mKHN0YXR1cykgPiAtMVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJSZXN0RXJyb3JzID0gKHsgc3RhdHVzIH06IEh0dHBFcnJvclJlc3BvbnNlKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHN0YXR1cyAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMuaHR0cEVycm9yQ29uZmlnLnNraXBIYW5kbGVkRXJyb3JDb2RlcyAmJlxyXG4gICAgICB0aGlzLmh0dHBFcnJvckNvbmZpZy5za2lwSGFuZGxlZEVycm9yQ29kZXMuZmluZEluZGV4KGNvZGUgPT4gY29kZSA9PT0gc3RhdHVzKSA8IDBcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlclJvdXRlRXJyb3JzID0gKG5hdmlnYXRpb25FcnJvcjogTmF2aWdhdGlvbkVycm9yKTogYm9vbGVhbiA9PiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBuYXZpZ2F0aW9uRXJyb3IuZXJyb3I/Lm1lc3NhZ2U/LmluZGV4T2YoJ0Nhbm5vdCBtYXRjaCcpID4gLTEgJiZcclxuICAgICAgISF0aGlzLmh0dHBFcnJvckNvbmZpZy5za2lwSGFuZGxlZEVycm9yQ29kZXMgJiZcclxuICAgICAgdGhpcy5odHRwRXJyb3JDb25maWcuc2tpcEhhbmRsZWRFcnJvckNvZGVzLmZpbmRJbmRleChjb2RlID0+IGNvZGUgPT09IDQwNCkgPCAwXHJcbiAgICApO1xyXG4gIH07XHJcbn1cclxuIl19
@@ -472,7 +472,7 @@ class ExtensibleFormPropComponent {
472
472
  this.configState = configState;
473
473
  this.injector = injector;
474
474
  this.asterisk = '';
475
- this.containerClassName = 'mb-3';
475
+ this.containerClassName = 'mb-2';
476
476
  this.options$ = of([]);
477
477
  this.validators = [];
478
478
  this.passwordKey = "ThemeShared.Extensions.PasswordComponent" /* eThemeSharedComponents.PasswordComponent */;
@@ -584,7 +584,7 @@ class ExtensibleFormPropComponent {
584
584
  this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
585
585
  }
586
586
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: ExtensibleFormPropComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TrackByService }, { token: i1.ConfigStateService }, { token: i2.FormGroupDirective }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
587
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.6", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-3\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"form-text text-muted\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { 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: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { kind: "directive", type: i4.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i4.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i4.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i4$2.PasswordComponent, selector: "abp-password", inputs: ["inputId", "formControlName"] }, { kind: "directive", type: i4$1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i4$1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "directive", type: i4$1.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }, { kind: "directive", type: DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.LocalizationPipe, name: "abpLocalization" }], viewProviders: [
587
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.6", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-2\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"text-muted d-block\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { 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: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: i1.ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }, { kind: "directive", type: i4.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i4.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i4.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i4$2.PasswordComponent, selector: "abp-password", inputs: ["inputId", "formControlName"] }, { kind: "directive", type: i4$1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i4$1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "directive", type: i4$1.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }, { kind: "directive", type: DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.LocalizationPipe, name: "abpLocalization" }], viewProviders: [
588
588
  {
589
589
  provide: ControlContainer,
590
590
  useFactory: selfFactory,
@@ -604,7 +604,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImpor
604
604
  },
605
605
  { provide: NgbDateAdapter, useClass: DateAdapter },
606
606
  { provide: NgbTimeAdapter, useClass: TimeAdapter },
607
- ], template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-3\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"form-text text-muted\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n" }]
607
+ ], template: "<ng-container\r\n [ngSwitch]=\"getComponent(prop)\"\r\n *abpPermission=\"prop.permission; runChangeDetection: false\"\r\n>\r\n <ng-template ngSwitchCase=\"template\">\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\">\r\n </ng-container>\r\n </ng-template>\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-2\">\r\n <ng-template ngSwitchCase=\"input\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"hidden\">\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"checkbox\">\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n ></ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"select\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"multiselect\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n multiple=\"multiple\"\r\n class=\"form-select form-control\"\r\n >\r\n <option\r\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\r\n [ngValue]=\"option.value\"\r\n >\r\n {{ option.key }}\r\n </option>\r\n </select>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"typeahead\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"date\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"time\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"dateTime\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"textarea\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n </ng-template>\r\n\r\n <ng-template ngSwitchCase=\"passwordinputgroup\">\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-password\r\n *abpReplaceableTemplate=\"{\r\n componentKey: passwordKey,\r\n inputs: {\r\n inputId: { value: prop.id },\r\n formControlName: { value: prop.name }\r\n }\r\n }\"\r\n [inputId]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n ></abp-password>\r\n </ng-template>\r\n\r\n <small *ngIf=\"prop.formText\" class=\"text-muted d-block\">{{\r\n prop.formText | abpLocalization\r\n }}</small>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\">\r\n <ng-container *ngIf=\"prop.displayTextResolver; else displayNameTemplate\">\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n </ng-container>\r\n <ng-template #displayNameTemplate> {{ prop.displayName | abpLocalization }}</ng-template>\r\n {{ asterisk }}\r\n </label>\r\n</ng-template>\r\n" }]
608
608
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TrackByService }, { type: i1.ConfigStateService }, { type: i2.FormGroupDirective }, { type: i0.Injector }]; }, propDecorators: { data: [{
609
609
  type: Input
610
610
  }], prop: [{