ng-tailwind 4.2.29 → 4.3.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/components/ngt-action/ngt-action.component.d.ts +15 -4
  2. package/components/ngt-button/ngt-button.component.d.ts +8 -5
  3. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +10 -6
  4. package/components/ngt-form/ngt-form.component.d.ts +6 -3
  5. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +3 -1
  6. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +10 -5
  7. package/components/ngt-section/ngt-section.component.d.ts +6 -3
  8. package/components/ngt-select/ngt-select.component.d.ts +8 -5
  9. package/esm2020/components/ngt-action/ngt-action.component.mjs +59 -9
  10. package/esm2020/components/ngt-button/ngt-button.component.mjs +35 -26
  11. package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +46 -19
  12. package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +4 -2
  13. package/esm2020/components/ngt-form/ngt-form.component.mjs +14 -4
  14. package/esm2020/components/ngt-input/ngt-input.component.mjs +2 -1
  15. package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +9 -4
  16. package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +46 -18
  17. package/esm2020/components/ngt-section/ngt-section.component.mjs +13 -3
  18. package/esm2020/components/ngt-select/ngt-select.component.mjs +66 -36
  19. package/esm2020/components/ngt-shining/ngt-shining.component.mjs +2 -2
  20. package/fesm2015/ng-tailwind.mjs +793 -610
  21. package/fesm2015/ng-tailwind.mjs.map +1 -1
  22. package/fesm2020/ng-tailwind.mjs +784 -617
  23. package/fesm2020/ng-tailwind.mjs.map +1 -1
  24. package/package.json +1 -1
@@ -26,6 +26,7 @@ export class NgtMultiSelectComponent extends NgtBaseNgModel {
26
26
  this.ngtFormComponent = ngtFormComponent;
27
27
  this.ngtTranslateService = ngtTranslateService;
28
28
  this.helpTextColor = 'text-green-500';
29
+ this.helperAutoXReverse = true;
29
30
  this.shining = false;
30
31
  this.loading = false;
31
32
  /** Behavior */
@@ -368,9 +369,9 @@ export class NgtMultiSelectComponent extends NgtBaseNgModel {
368
369
  }
369
370
  }
370
371
  NgtMultiSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtMultiSelectComponent, deps: [{ token: i1.NgtHttpService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.NgtStylizableDirective, optional: true, self: true }, { token: i3.ControlContainer, host: true, optional: true }, { token: i4.NgtFormComponent, optional: true, skipSelf: true }, { token: i5.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
371
- NgtMultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtMultiSelectComponent, selector: "ngt-multi-select", inputs: { customOptionTemplate: "customOptionTemplate", customHeaderTemplate: "customHeaderTemplate", label: "label", helpTitle: "helpTitle", helpText: "helpText", helpTextColor: "helpTextColor", shining: "shining", loading: "loading", bindLabel: "bindLabel", bindSearch: "bindSearch", itemsPerPage: "itemsPerPage", name: "name", remoteResource: "remoteResource", items: "items", searchable: "searchable", isRequired: "isRequired", isDisabled: "isDisabled" }, outputs: { onDataChange: "onDataChange" }, host: { listeners: { "scroll": "onScroll($event)" } }, providers: [
372
+ NgtMultiSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtMultiSelectComponent, selector: "ngt-multi-select", inputs: { customOptionTemplate: "customOptionTemplate", customHeaderTemplate: "customHeaderTemplate", label: "label", helpTitle: "helpTitle", helpText: "helpText", helpTextColor: "helpTextColor", helperReverseYPosition: "helperReverseYPosition", helperAutoXReverse: "helperAutoXReverse", shining: "shining", loading: "loading", bindLabel: "bindLabel", bindSearch: "bindSearch", itemsPerPage: "itemsPerPage", name: "name", remoteResource: "remoteResource", items: "items", searchable: "searchable", isRequired: "isRequired", isDisabled: "isDisabled" }, outputs: { onDataChange: "onDataChange" }, host: { listeners: { "scroll": "onScroll($event)" } }, providers: [
372
373
  NgtMakeProvider(NgtMultiSelectComponent)
373
- ], viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "elementCheckboxTemplate", first: true, predicate: ["elementCheckboxTemplate"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label && !shining\" class=\"flex text-sm\" [class.mb-2]='!hasValidationErrors()'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ngt-validation [hidden]='shining' class=\"block mb-1\" [control]='formControl' [container]='formContainer'>\n</ngt-validation>\n\n<div class=\"{{ shining ? 'hidden' : 'flex flex-col' }} border w-full rounded {{ ngtStyle.compile(['h']) }}\"\n style=\"min-height: 16rem;\" [class.border-red-500]='hasValidationErrors()' [class.disabled-background]='isDisabled'>\n <div class=\"flex items-center w-full p-2 border-b\">\n <ngt-checkbox class=\"flex\" title=\"Selecionar todos\" [label]=\"!searchable ? 'Selecionar todos' : ''\"\n [(ngModel)]=\"selectAllCheckbox\" [name]=\"selectAllCheckboxName\" [isClickDisabled]='true'\n [isDisabled]='loading || isDisabled' h='h-5' w='w-5' (click)='selectAll()' ngt-stylizable>\n </ngt-checkbox>\n\n <ngt-input *ngIf=\"searchable\" class=\"block w-full pl-2\" [name]='searchInputName' [(ngModel)]='searchTerm'\n placeholder='Buscar...' [allowClear]='true' [jit]='true' h='h-10' (ngModelChange)='search($event)'\n [loading]='loading' [isDisabled]='isDisabled' ngt-stylizable #inputSearch>\n </ngt-input>\n </div>\n\n <div *ngIf=\"loading\" class=\"flex justify-center items-center h-full w-full cursor-wait\">\n <div class=\"div-loader\"></div>\n </div>\n\n <div class=\"w-full overflow-y-auto text-sm {{ loading ? 'hidden' : 'flex flex-col' }}\" (scroll)='onScroll($event)'\n #containerRef>\n <ng-container *ngIf=\"customHeaderTemplate\" [ngTemplateOutlet]=\"customHeaderTemplate\">\n </ng-container>\n\n <ng-container *ngFor=\"let element of getSelectableElements(); let i = index\">\n <div class=\"flex w-full items-center hover:bg-gray-200 {{ isDisabled ? 'cursor-not-allowed' : 'cursor-pointer' }}\"\n [class.p-2]='!customOptionTemplate' (click)='toggleItem(element, $event)'>\n <ng-template let-element #elementCheckboxTemplate>\n <ngt-checkbox class=\"flex pr-2\" [name]='element.uuid' [(ngModel)]=\"element.isSelected\"\n (ngModelChange)='onNativeChange(element)' [isClickDisabled]='true' [isDisabled]='isDisabled'\n h='h-5' w='w-5' (click)='toggleItem(element, $event)' ngt-stylizable>\n </ngt-checkbox>\n </ng-template>\n\n <ng-template let-element #defaultOptionTemplate>\n {{ getSelectableElementValue(element) }}\n </ng-template>\n\n <ng-container *ngIf=\"!customOptionTemplate\" [ngTemplateOutlet]=\"elementCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element }\">\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"customOptionTemplate || defaultOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element, index: i }\">\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!getSelectableElements()?.length\" class=\"text-center mt-4\">\n {{ ngtTranslateService.ngtMultiSelectNoDataFound }}\n </p>\n </div>\n</div>\n\n<div class=\"{{ shining ? 'hidden' : 'flex' }} w-full items-center mt-2\">\n <span class=\"text-sm mr-4\">\n {{ selectedElements?.length || 0 }} / {{ itemsTotal || 0 }}\n </span>\n\n <ngt-checkbox class=\"flex\" label=\"Visualizar selecionados\" [name]='displayOnlySelectedName'\n [(ngModel)]=\"displayOnlySelected\" [isDisabled]='loading' h='h-5' w='w-5' ngt-stylizable>\n </ngt-checkbox>\n</div>\n\n<ngt-shining *ngIf='shining' class=\"block w-full {{ ngtStyle.compile(['h']) }}\" style=\"min-height: 16rem;\"\n rounded='rounded' ngt-stylizable>\n</ngt-shining>\n\n<input *ngIf='componentReady' type='hidden' [ngModel]='value' [name]='name' [value]='value'>", styles: [".disabled-background{border:solid #cbd5e0 1px!important;background-color:#fafafa!important;border-radius:.25rem!important;padding:1px!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtInputComponent, selector: "ngt-input", inputs: ["label", "placeholder", "shining", "loading", "helpTitle", "helpTextColor", "helpText", "innerLeftIcon", "innerLeftIconColor", "innerRightIcon", "innerRightIconColor", "decimalMaskPrecision", "showCharactersLength", "uppercase", "isDisabled", "isReadonly", "showRoundedIcon", "type", "name", "mask", "focus", "allowClear", "jit", "findExistingResource", "allowPhoneValidation", "validatePassword", "passwordableId", "passwordPolicyId", "isRequired", "uniqueResource", "minValue", "maxValue", "maxLength", "minLength", "match", "multipleOf", "validateMinValueOnMask", "externalServerDependency", "helperReverseYPosition", "helperAutoXReverse"], outputs: ["onClickLeftIcon", "onClickRightIcon", "validatePhoneResult"] }, { kind: "component", type: i11.NgtCheckboxComponent, selector: "ngt-checkbox", inputs: ["label", "shining", "isDisabled", "isClickDisabled", "name", "mode", "helpTitle", "helpTextColor", "helpText", "helperAutoXReverse"] }, { kind: "directive", type: i2.NgtStylizableDirective, selector: "[ngt-stylizable]", inputs: ["color", "color.text", "color.bg", "color.border", "h", "w", "p", "px", "py", "pt", "pr", "pb", "pl", "m", "mx", "my", "mt", "mr", "mb", "ml", "border", "shadow", "rounded", "font", "text", "breakWords", "overflow", "position", "justifyContent", "cursor", "fontCase"] }], viewProviders: [
374
+ ], viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "elementCheckboxTemplate", first: true, predicate: ["elementCheckboxTemplate"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label && !shining\" class=\"flex text-sm\" [class.mb-2]='!hasValidationErrors()'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\"\n class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ngt-validation [hidden]='shining' class=\"block mb-1\" [control]='formControl' [container]='formContainer'>\n</ngt-validation>\n\n<div class=\"{{ shining ? 'hidden' : 'flex flex-col' }} border w-full rounded {{ ngtStyle.compile(['h']) }}\"\n style=\"min-height: 16rem;\" [class.border-red-500]='hasValidationErrors()' [class.disabled-background]='isDisabled'>\n <div class=\"flex items-center w-full p-2 border-b\">\n <ngt-checkbox class=\"flex\" title=\"Selecionar todos\" [label]=\"!searchable ? 'Selecionar todos' : ''\"\n [(ngModel)]=\"selectAllCheckbox\" [name]=\"selectAllCheckboxName\" [isClickDisabled]='true'\n [isDisabled]='loading || isDisabled' h='h-5' w='w-5' (click)='selectAll()' ngt-stylizable>\n </ngt-checkbox>\n\n <ngt-input *ngIf=\"searchable\" class=\"block w-full pl-2\" [name]='searchInputName' [(ngModel)]='searchTerm'\n placeholder='Buscar...' [allowClear]='true' [jit]='true' h='h-10' (ngModelChange)='search($event)'\n [loading]='loading' [isDisabled]='isDisabled' ngt-stylizable #inputSearch>\n </ngt-input>\n </div>\n\n <div *ngIf=\"loading\" class=\"flex justify-center items-center h-full w-full cursor-wait\">\n <div class=\"div-loader\"></div>\n </div>\n\n <div class=\"w-full overflow-y-auto text-sm {{ loading ? 'hidden' : 'flex flex-col' }}\" (scroll)='onScroll($event)'\n #containerRef>\n <ng-container *ngIf=\"customHeaderTemplate\" [ngTemplateOutlet]=\"customHeaderTemplate\">\n </ng-container>\n\n <ng-container *ngFor=\"let element of getSelectableElements(); let i = index\">\n <div class=\"flex w-full items-center hover:bg-gray-200 {{ isDisabled ? 'cursor-not-allowed' : 'cursor-pointer' }}\"\n [class.p-2]='!customOptionTemplate' (click)='toggleItem(element, $event)'>\n <ng-template let-element #elementCheckboxTemplate>\n <ngt-checkbox class=\"flex pr-2\" [name]='element.uuid' [(ngModel)]=\"element.isSelected\"\n (ngModelChange)='onNativeChange(element)' [isClickDisabled]='true' [isDisabled]='isDisabled'\n h='h-5' w='w-5' (click)='toggleItem(element, $event)' ngt-stylizable>\n </ngt-checkbox>\n </ng-template>\n\n <ng-template let-element #defaultOptionTemplate>\n {{ getSelectableElementValue(element) }}\n </ng-template>\n\n <ng-container *ngIf=\"!customOptionTemplate\" [ngTemplateOutlet]=\"elementCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element }\">\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"customOptionTemplate || defaultOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element, index: i }\">\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!getSelectableElements()?.length\" class=\"text-center mt-4\">\n {{ ngtTranslateService.ngtMultiSelectNoDataFound }}\n </p>\n </div>\n</div>\n\n<div class=\"{{ shining ? 'hidden' : 'flex' }} w-full items-center mt-2\">\n <span class=\"text-sm mr-4\">\n {{ selectedElements?.length || 0 }} / {{ itemsTotal || 0 }}\n </span>\n\n <ngt-checkbox class=\"flex\" label=\"Visualizar selecionados\" [name]='displayOnlySelectedName'\n [(ngModel)]=\"displayOnlySelected\" [isDisabled]='loading' h='h-5' w='w-5' ngt-stylizable>\n </ngt-checkbox>\n</div>\n\n<ngt-shining *ngIf='shining' class=\"block w-full {{ ngtStyle.compile(['h']) }}\" style=\"min-height: 16rem;\"\n rounded='rounded' ngt-stylizable>\n</ngt-shining>\n\n<input *ngIf='componentReady' type='hidden' [ngModel]='value' [name]='name' [value]='value'>\n", styles: [".disabled-background{border:solid #cbd5e0 1px!important;background-color:#fafafa!important;border-radius:.25rem!important;padding:1px!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtInputComponent, selector: "ngt-input", inputs: ["label", "placeholder", "shining", "loading", "helpTitle", "helpTextColor", "helpText", "innerLeftIcon", "innerLeftIconColor", "innerRightIcon", "innerRightIconColor", "decimalMaskPrecision", "showCharactersLength", "uppercase", "isDisabled", "isReadonly", "showRoundedIcon", "type", "name", "mask", "focus", "allowClear", "jit", "findExistingResource", "allowPhoneValidation", "validatePassword", "passwordableId", "passwordPolicyId", "isRequired", "uniqueResource", "minValue", "maxValue", "maxLength", "minLength", "match", "multipleOf", "validateMinValueOnMask", "externalServerDependency", "helperReverseYPosition", "helperAutoXReverse"], outputs: ["onClickLeftIcon", "onClickRightIcon", "validatePhoneResult"] }, { kind: "component", type: i11.NgtCheckboxComponent, selector: "ngt-checkbox", inputs: ["label", "shining", "isDisabled", "isClickDisabled", "name", "mode", "helpTitle", "helpTextColor", "helpText", "helperAutoXReverse"] }, { kind: "directive", type: i2.NgtStylizableDirective, selector: "[ngt-stylizable]", inputs: ["color", "color.text", "color.bg", "color.border", "h", "w", "p", "px", "py", "pt", "pr", "pb", "pl", "m", "mx", "my", "mt", "mr", "mb", "ml", "border", "shadow", "rounded", "font", "text", "breakWords", "overflow", "position", "justifyContent", "cursor", "fontCase"] }], viewProviders: [
374
375
  { provide: ControlContainer, useExisting: NgForm }
375
376
  ], encapsulation: i0.ViewEncapsulation.None });
376
377
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtMultiSelectComponent, decorators: [{
@@ -379,7 +380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
379
380
  NgtMakeProvider(NgtMultiSelectComponent)
380
381
  ], viewProviders: [
381
382
  { provide: ControlContainer, useExisting: NgForm }
382
- ], template: "<label *ngIf=\"label && !shining\" class=\"flex text-sm\" [class.mb-2]='!hasValidationErrors()'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ngt-validation [hidden]='shining' class=\"block mb-1\" [control]='formControl' [container]='formContainer'>\n</ngt-validation>\n\n<div class=\"{{ shining ? 'hidden' : 'flex flex-col' }} border w-full rounded {{ ngtStyle.compile(['h']) }}\"\n style=\"min-height: 16rem;\" [class.border-red-500]='hasValidationErrors()' [class.disabled-background]='isDisabled'>\n <div class=\"flex items-center w-full p-2 border-b\">\n <ngt-checkbox class=\"flex\" title=\"Selecionar todos\" [label]=\"!searchable ? 'Selecionar todos' : ''\"\n [(ngModel)]=\"selectAllCheckbox\" [name]=\"selectAllCheckboxName\" [isClickDisabled]='true'\n [isDisabled]='loading || isDisabled' h='h-5' w='w-5' (click)='selectAll()' ngt-stylizable>\n </ngt-checkbox>\n\n <ngt-input *ngIf=\"searchable\" class=\"block w-full pl-2\" [name]='searchInputName' [(ngModel)]='searchTerm'\n placeholder='Buscar...' [allowClear]='true' [jit]='true' h='h-10' (ngModelChange)='search($event)'\n [loading]='loading' [isDisabled]='isDisabled' ngt-stylizable #inputSearch>\n </ngt-input>\n </div>\n\n <div *ngIf=\"loading\" class=\"flex justify-center items-center h-full w-full cursor-wait\">\n <div class=\"div-loader\"></div>\n </div>\n\n <div class=\"w-full overflow-y-auto text-sm {{ loading ? 'hidden' : 'flex flex-col' }}\" (scroll)='onScroll($event)'\n #containerRef>\n <ng-container *ngIf=\"customHeaderTemplate\" [ngTemplateOutlet]=\"customHeaderTemplate\">\n </ng-container>\n\n <ng-container *ngFor=\"let element of getSelectableElements(); let i = index\">\n <div class=\"flex w-full items-center hover:bg-gray-200 {{ isDisabled ? 'cursor-not-allowed' : 'cursor-pointer' }}\"\n [class.p-2]='!customOptionTemplate' (click)='toggleItem(element, $event)'>\n <ng-template let-element #elementCheckboxTemplate>\n <ngt-checkbox class=\"flex pr-2\" [name]='element.uuid' [(ngModel)]=\"element.isSelected\"\n (ngModelChange)='onNativeChange(element)' [isClickDisabled]='true' [isDisabled]='isDisabled'\n h='h-5' w='w-5' (click)='toggleItem(element, $event)' ngt-stylizable>\n </ngt-checkbox>\n </ng-template>\n\n <ng-template let-element #defaultOptionTemplate>\n {{ getSelectableElementValue(element) }}\n </ng-template>\n\n <ng-container *ngIf=\"!customOptionTemplate\" [ngTemplateOutlet]=\"elementCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element }\">\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"customOptionTemplate || defaultOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element, index: i }\">\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!getSelectableElements()?.length\" class=\"text-center mt-4\">\n {{ ngtTranslateService.ngtMultiSelectNoDataFound }}\n </p>\n </div>\n</div>\n\n<div class=\"{{ shining ? 'hidden' : 'flex' }} w-full items-center mt-2\">\n <span class=\"text-sm mr-4\">\n {{ selectedElements?.length || 0 }} / {{ itemsTotal || 0 }}\n </span>\n\n <ngt-checkbox class=\"flex\" label=\"Visualizar selecionados\" [name]='displayOnlySelectedName'\n [(ngModel)]=\"displayOnlySelected\" [isDisabled]='loading' h='h-5' w='w-5' ngt-stylizable>\n </ngt-checkbox>\n</div>\n\n<ngt-shining *ngIf='shining' class=\"block w-full {{ ngtStyle.compile(['h']) }}\" style=\"min-height: 16rem;\"\n rounded='rounded' ngt-stylizable>\n</ngt-shining>\n\n<input *ngIf='componentReady' type='hidden' [ngModel]='value' [name]='name' [value]='value'>", styles: [".disabled-background{border:solid #cbd5e0 1px!important;background-color:#fafafa!important;border-radius:.25rem!important;padding:1px!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
383
+ ], template: "<label *ngIf=\"label && !shining\" class=\"flex text-sm\" [class.mb-2]='!hasValidationErrors()'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\"\n class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ngt-validation [hidden]='shining' class=\"block mb-1\" [control]='formControl' [container]='formContainer'>\n</ngt-validation>\n\n<div class=\"{{ shining ? 'hidden' : 'flex flex-col' }} border w-full rounded {{ ngtStyle.compile(['h']) }}\"\n style=\"min-height: 16rem;\" [class.border-red-500]='hasValidationErrors()' [class.disabled-background]='isDisabled'>\n <div class=\"flex items-center w-full p-2 border-b\">\n <ngt-checkbox class=\"flex\" title=\"Selecionar todos\" [label]=\"!searchable ? 'Selecionar todos' : ''\"\n [(ngModel)]=\"selectAllCheckbox\" [name]=\"selectAllCheckboxName\" [isClickDisabled]='true'\n [isDisabled]='loading || isDisabled' h='h-5' w='w-5' (click)='selectAll()' ngt-stylizable>\n </ngt-checkbox>\n\n <ngt-input *ngIf=\"searchable\" class=\"block w-full pl-2\" [name]='searchInputName' [(ngModel)]='searchTerm'\n placeholder='Buscar...' [allowClear]='true' [jit]='true' h='h-10' (ngModelChange)='search($event)'\n [loading]='loading' [isDisabled]='isDisabled' ngt-stylizable #inputSearch>\n </ngt-input>\n </div>\n\n <div *ngIf=\"loading\" class=\"flex justify-center items-center h-full w-full cursor-wait\">\n <div class=\"div-loader\"></div>\n </div>\n\n <div class=\"w-full overflow-y-auto text-sm {{ loading ? 'hidden' : 'flex flex-col' }}\" (scroll)='onScroll($event)'\n #containerRef>\n <ng-container *ngIf=\"customHeaderTemplate\" [ngTemplateOutlet]=\"customHeaderTemplate\">\n </ng-container>\n\n <ng-container *ngFor=\"let element of getSelectableElements(); let i = index\">\n <div class=\"flex w-full items-center hover:bg-gray-200 {{ isDisabled ? 'cursor-not-allowed' : 'cursor-pointer' }}\"\n [class.p-2]='!customOptionTemplate' (click)='toggleItem(element, $event)'>\n <ng-template let-element #elementCheckboxTemplate>\n <ngt-checkbox class=\"flex pr-2\" [name]='element.uuid' [(ngModel)]=\"element.isSelected\"\n (ngModelChange)='onNativeChange(element)' [isClickDisabled]='true' [isDisabled]='isDisabled'\n h='h-5' w='w-5' (click)='toggleItem(element, $event)' ngt-stylizable>\n </ngt-checkbox>\n </ng-template>\n\n <ng-template let-element #defaultOptionTemplate>\n {{ getSelectableElementValue(element) }}\n </ng-template>\n\n <ng-container *ngIf=\"!customOptionTemplate\" [ngTemplateOutlet]=\"elementCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element }\">\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"customOptionTemplate || defaultOptionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: element, index: i }\">\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!getSelectableElements()?.length\" class=\"text-center mt-4\">\n {{ ngtTranslateService.ngtMultiSelectNoDataFound }}\n </p>\n </div>\n</div>\n\n<div class=\"{{ shining ? 'hidden' : 'flex' }} w-full items-center mt-2\">\n <span class=\"text-sm mr-4\">\n {{ selectedElements?.length || 0 }} / {{ itemsTotal || 0 }}\n </span>\n\n <ngt-checkbox class=\"flex\" label=\"Visualizar selecionados\" [name]='displayOnlySelectedName'\n [(ngModel)]=\"displayOnlySelected\" [isDisabled]='loading' h='h-5' w='w-5' ngt-stylizable>\n </ngt-checkbox>\n</div>\n\n<ngt-shining *ngIf='shining' class=\"block w-full {{ ngtStyle.compile(['h']) }}\" style=\"min-height: 16rem;\"\n rounded='rounded' ngt-stylizable>\n</ngt-shining>\n\n<input *ngIf='componentReady' type='hidden' [ngModel]='value' [name]='name' [value]='value'>\n", styles: [".disabled-background{border:solid #cbd5e0 1px!important;background-color:#fafafa!important;border-radius:.25rem!important;padding:1px!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
383
384
  }], ctorParameters: function () { return [{ type: i1.NgtHttpService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.NgtStylizableDirective, decorators: [{
384
385
  type: Optional
385
386
  }, {
@@ -415,6 +416,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
415
416
  type: Input
416
417
  }], helpTextColor: [{
417
418
  type: Input
419
+ }], helperReverseYPosition: [{
420
+ type: Input
421
+ }], helperAutoXReverse: [{
422
+ type: Input
418
423
  }], shining: [{
419
424
  type: Input
420
425
  }], loading: [{
@@ -443,4 +448,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
443
448
  type: HostListener,
444
449
  args: ['scroll', ['$event']]
445
450
  }] } });
446
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtbXVsdGktc2VsZWN0L25ndC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LW11bHRpLXNlbGVjdC9uZ3QtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUNaLElBQUksRUFDSixZQUFZLEVBRVosS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7Ozs7Ozs7QUFnQjVGLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxjQUFjO0lBa0V2RCxZQUNZLGNBQThCLEVBQzlCLFFBQWtCLEVBQ2xCLGNBQWlDLEVBR2xDLHNCQUE4QyxFQUc5QyxhQUErQixFQUcvQixnQkFBa0MsRUFHbEMsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBaEJBLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUdsQywyQkFBc0Is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QixRQUFROzswQkFBSSxRQUFROzswQkFHcEIsUUFBUTs0Q0EvRXFCLFlBQVk7c0JBQTdDLFNBQVM7dUJBQUMsY0FBYztnQkFDUSxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ3FCLHVCQUF1QjtzQkFBbkUsU0FBUzt1QkFBQyx5QkFBeUI7Z0JBR3BCLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBR1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFHVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBRVcsWUFBWTtzQkFBNUIsTUFBTTtnQkE2RUEsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZWxlbWVudCB9IGZyb20gJ3Byb3RyYWN0b3InO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vaGVscGVycy91dWlkJztcbmltcG9ydCB7IE5ndEh0dHBQYWdpbmF0aW9uLCBOZ3RIdHRwUmVzcG9uc2UsIE5ndEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC10cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1mb3JtL25ndC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtbXVsdGktc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTmd0TWFrZVByb3ZpZGVyKE5ndE11bHRpU2VsZWN0Q29tcG9uZW50KVxuICAgIF0sXG4gICAgdmlld1Byb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd0TXVsdGlTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBOZ3RCYXNlTmdNb2RlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lclJlZicpIHB1YmxpYyBjb250YWluZXJSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnaW5wdXRTZWFyY2gnKSBwdWJsaWMgaW5wdXRTZWFyY2g6IE5ndElucHV0Q29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2VsZW1lbnRDaGVja2JveFRlbXBsYXRlJykgcHVibGljIGVsZW1lbnRDaGVja2JveFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIFZpc3VhbCAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21PcHRpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tSGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC1ncmVlbi01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaGluaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBCZWhhdmlvciAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBiaW5kTGFiZWw6IHN0cmluZyB8IEZ1bmN0aW9uID0gJ25hbWUnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBiaW5kU2VhcmNoOiBzdHJpbmcgPSAnbmFtZSc7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTU7XG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVtb3RlUmVzb3VyY2U6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoYWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVmFsaWRhdGlvbiAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlcXVpcmVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc0Rpc2FibGVkOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkRhdGFDaGFuZ2U6IEV2ZW50RW1pdHRlcjxBcnJheTxOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZT4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIHNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICAgIHB1YmxpYyBzZWFyY2hJbnB1dE5hbWU6IHN0cmluZyA9IHV1aWQoKTtcblxuICAgIHB1YmxpYyBzZWxlY3RBbGxDaGVja2JveE5hbWU6IHN0cmluZyA9IHV1aWQoKTtcbiAgICBwdWJsaWMgZGlzcGxheU9ubHlTZWxlY3RlZE5hbWU6IHN0cmluZyA9IHV1aWQoKTtcblxuICAgIHB1YmxpYyBzZWxlY3RlZEVsZW1lbnRzOiBBcnJheTxOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZT4gPSBbXTtcbiAgICBwdWJsaWMgaXRlbXNUb3RhbDogbnVtYmVyO1xuICAgIHB1YmxpYyBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZGlzcGxheU9ubHlTZWxlY3RlZDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBuYXRpdmVOYW1lOiBzdHJpbmcgPSB1dWlkKCk7XG4gICAgcHVibGljIG5hdGl2ZVZhbHVlOiBhbnk7XG5cbiAgICBwdWJsaWMgbmd0U3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlO1xuICAgIHB1YmxpYyBzZWxlY3RhYmxlRWxlbWVudHM6IEFycmF5PE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlPiA9IFtdO1xuICAgIHB1YmxpYyBzZWxlY3RhYmxlRWxlbWVudHNPblNlYXJjaDogQXJyYXk8Tmd0U2VsZWN0Q29udGFpbmVyU2VsZWN0YWJsZUVsZW1lbnRJbnRlcmZhY2U+ID0gW107XG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uOiBOZ3RIdHRwUGFnaW5hdGlvbiA9IHtcbiAgICAgICAgY291bnQ6IG51bGwsXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2VzOiBudWxsLFxuICAgICAgICB0b3RhbDogbnVsbCxcbiAgICAgICAgZnJvbTogbnVsbCxcbiAgICAgICAgdG86IG51bGwsXG4gICAgICAgIHBlcl9wYWdlOiBudWxsXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICAgIHByaXZhdGUgaW5TZWFyY2g6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBwcmV2aW91c1NlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICAgIHByaXZhdGUgYmVjYW1lVmlzaWJsZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlbGVjdGFibGVSZXNvdXJjZXNDb3VudDogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG5ndEh0dHBTZXJ2aWNlOiBOZ3RIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKClcbiAgICAgICAgcHVibGljIG5ndFN0eWxpemFibGVEaXJlY3RpdmU6IE5ndFN0eWxpemFibGVEaXJlY3RpdmUsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKVxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwdWJsaWMgbmd0Rm9ybUNvbXBvbmVudDogTmd0Rm9ybUNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gc2hpbmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSB0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUuZ2V0Tmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmd0U3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0TXVsdGlTZWxlY3QnLCB7IGg6ICdoLTY0JyB9KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsRW5kID0gZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCAmJiBldmVudC50YXJnZXQub2Zmc2V0SGVpZ2h0ICsgZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCA+PSAoZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIDMwKTtcblxuICAgICAgICBpZiAoaXNTY3JvbGxFbmQgJiYgIXRoaXMubG9hZGluZyAmJiAhdGhpcy5kaXNwbGF5T25seVNlbGVjdGVkICYmIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzPy5sZW5ndGhcbiAgICAgICAgICAgICYmIHRoaXMucGFnaW5hdGlvbi5wZXJfcGFnZSA8IHRoaXMucGFnaW5hdGlvbi50b3RhbCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSB0eXBlb2YgdGhpcy5wYWdpbmF0aW9uLnBlcl9wYWdlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlSW50KHRoaXMucGFnaW5hdGlvbi5wZXJfcGFnZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMucGFnaW5hdGlvbi5wZXJfcGFnZTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWREYXRhKGN1cnJlbnRQZXJQYWdlICsgdGhpcy5pdGVtc1BlclBhZ2UsIHRoaXMuc2VhcmNoVGVybSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgYmUgaW5zaWRlIGEgPGZvcm0gI2Zvcm09J25nRm9ybSc+IHRhZyFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgY29udGFpbiBhIG5hbWUgYXR0cmlidXRlIVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5iZWNhbWVWaXNpYmxlICYmICF0aGlzLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYmVjYW1lVmlzaWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKS50aGVuKCgpID0+IHRoaXMuaW5pdENvbXBvbmVudFZhbGlkYXRpb24oKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5pc1JlcXVpcmVkICYmIHRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU9ubHlTZWxlY3RlZCA9IGNoYW5nZXMuaXNEaXNhYmxlZC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5iaW5kU2VsZWN0YWJsZUVsZW1lbnRzKGNoYW5nZXMuaXRlbXMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMucmVtb3RlUmVzb3VyY2UgJiYgdGhpcy5iZWNhbWVWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKCkudGhlbigoKSA9PiB0aGlzLmluaXRDb21wb25lbnRWYWxpZGF0aW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuaXRlbXNQZXJQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGVyX3BhZ2UgPSBjaGFuZ2VzLml0ZW1zUGVyUGFnZS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnB1dFNlYXJjaC5zZXRGb2N1cygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVmcmVzaChpdGVtc1BlclBhZ2U/OiBudW1iZXIsIHNlYXJjaFRlcm0/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBpdGVtc1BlclBhZ2UgIT09IHVuZGVmaW5lZCA/IGl0ZW1zUGVyUGFnZSA6IHRoaXMuaXRlbXNQZXJQYWdlO1xuICAgICAgICB0aGlzLnNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtICE9PSB1bmRlZmluZWQgPyBzZWFyY2hUZXJtIDogdGhpcy5zZWFyY2hUZXJtO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWREYXRhKHRoaXMuaXRlbXNQZXJQYWdlLCB0aGlzLnNlYXJjaFRlcm0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IFtdO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubG9hZGluZyAmJiAhdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrYm94ID0gIXRoaXMuc2VsZWN0QWxsQ2hlY2tib3g7XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBwZXJwYWdlID0gdGhpcy5zZWxlY3RBbGxDaGVja2JveCA/IHRoaXMucGFnaW5hdGlvbi50b3RhbCA6IHRoaXMuaXRlbXNQZXJQYWdlO1xuXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBlcnBhZ2UsIHRoaXMuc2VhcmNoVGVybSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxUbyh7IHRvcDogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3gpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEFsbENoZWNrYm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNlbGVjdGFibGVFbGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gdGhpcy5pc0NvbG9xdWVudFJlc291cmNlcygpID8gZWxlbWVudHMubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBcGlJZCgpKSA6IGVsZW1lbnRzO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChzZWxlY3RhYmxlRWxlbWVudDogTmd0U2VsZWN0Q29udGFpbmVyU2VsZWN0YWJsZUVsZW1lbnRJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzZWxlY3RhYmxlRWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmlzQ29sb3F1ZW50UmVzb3VyY2VzKCkgJiYgZWxlbWVudElkcy5pbmNsdWRlcyh2YWx1ZS5nZXRBcGlJZCgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtZW50SWRzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGVFbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oc2VsZWN0YWJsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVJdGVtKHNlbGVjdGFibGVFbGVtZW50OiBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudD8uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGFibGVFbGVtZW50LmlzU2VsZWN0ZWQgPSAhc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZDtcblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50U2VsZWN0aW9uKHNlbGVjdGFibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbk5hdGl2ZUNoYW5nZShzZWxlY3RhYmxlRWxlbWVudDogTmd0U2VsZWN0Q29udGFpbmVyU2VsZWN0YWJsZUVsZW1lbnRJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudFNlbGVjdGlvbihzZWxlY3RhYmxlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZXNCZXR3ZWVuQmluZGluZ3ModGhpcy52YWx1ZSwgdGhpcy5zZWxlY3RlZEVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMubWFwKGUgPT4gZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlKHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlc0JldHdlZW5CaW5kaW5ncyhzZWxlY3RlZEVsZW1lbnRzLCB0aGlzLnNlbGVjdGVkRWxlbWVudHMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlRWxlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFNlbGVjdGVkRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiB0aGlzLmlzU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHNPblNlYXJjaC5maWx0ZXIoZWxlbWVudCA9PiB0aGlzLmlzU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBzZWxlY3RlZEVsZW1lbnRzPy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gKHsgdXVpZDogdXVpZCgpLCBpc1NlbGVjdGVkOiB0cnVlLCB2YWx1ZTogZWxlbWVudCB9KVxuICAgICAgICAgICAgICAgICkgPz8gW107XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKHRlcm06IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVhZHkgfHwgdGVybSA9PT0gdW5kZWZpbmVkIHx8IHRlcm0gPT09IG51bGwgfHwgdGVybSA9PT0gdGhpcy5wcmV2aW91c1NlYXJjaFRlcm0gfHwgdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c1NlYXJjaFRlcm0gPSB0ZXJtO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxDaGVja2JveCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cz8ubGVuZ3RoID09IHRoaXMuc2VsZWN0YWJsZVJlc291cmNlc0NvdW50O1xuXG4gICAgICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluU2VhcmNoID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5TZWFyY2ggPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHNPblNlYXJjaCA9IHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9PiB0aGlzLmdldFNlbGVjdGFibGVFbGVtZW50VmFsdWUoaXRlbSkuaW5jbHVkZXModGVybSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHRoaXMuaXRlbXNQZXJQYWdlLCB0ZXJtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKCk6IEFycmF5PGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pblNlYXJjaCAmJiB0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGVFbGVtZW50c09uU2VhcmNoO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheU9ubHlTZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGVFbGVtZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VsZWN0YWJsZUVsZW1lbnRWYWx1ZShzZWxlY3RhYmxlSXRlbTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJpbmRMYWJlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluZExhYmVsKHNlbGVjdGFibGVJdGVtLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0YWJsZUl0ZW0udmFsdWVbJ2dldEF0dHJpYnV0ZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0YWJsZUl0ZW0udmFsdWUuZ2V0QXR0cmlidXRlKHRoaXMuYmluZExhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RhYmxlSXRlbS52YWx1ZVt0aGlzLmJpbmRMYWJlbF07XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1ZhbGlkYXRpb25FcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sPy5lcnJvcnMgJiYgKFxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5kaXJ0eSB8fCAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lclsnc3VibWl0dGVkJ10pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVFbGVtZW50U2VsZWN0aW9uKHNlbGVjdGFibGVFbGVtZW50OiBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSk6IHZvaWQge1xuICAgICAgICBpZiAoc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZCAmJiAhdGhpcy5pc1NlbGVjdGVkRWxlbWVudChzZWxlY3RhYmxlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5wdXNoKHNlbGVjdGFibGVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICghc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZCAmJiB0aGlzLmlzU2VsZWN0ZWRFbGVtZW50KHNlbGVjdGFibGVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnQgPT4gc2VsZWN0ZWRFbGVtZW50LnV1aWQgIT09IHNlbGVjdGFibGVFbGVtZW50LnV1aWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2Uoc2VsZWN0YWJsZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5T25seVNlbGVjdGVkICYmICF0aGlzLnNlbGVjdGVkRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5T25seVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWREYXRhKHBlcnBhZ2U6IG51bWJlciA9IHRoaXMuaXRlbXNQZXJQYWdlLCBzZWFyY2hUZXJtPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZW1vdGVSZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGVycGFnZSA9PSB0aGlzLml0ZW1zUGVyUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gcGVycGFnZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb246IE5ndEh0dHBQYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIC4uLnsgcGVyX3BhZ2U6IHBlcnBhZ2UgfSB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBzZWFyY2hUZXJtID8geyBbdGhpcy5iaW5kU2VhcmNoXTogc2VhcmNoVGVybSB9IDogbnVsbDtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndEh0dHBTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3RlUmVzb3VyY2UsIGZpbHRlcnMsIHBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2U6IE5ndEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFNlbGVjdGFibGVFbGVtZW50cyhyZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHJlc3BvbnNlLm1ldGEucGFnaW5hdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zVG90YWwgPSB0aGlzLnBhZ2luYXRpb24udG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0YWJsZVJlc291cmNlc0NvdW50ICYmICFzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZVJlc291cmNlc0NvdW50ID0gdGhpcy5wYWdpbmF0aW9uLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RhYmxlRWxlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc3BsYXlPbmx5U2VsZWN0ZWQgPSB0aGlzLmlzRGlzYWJsZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgcHJvcGVydHkgW3JlbW90ZVJlc291cmNlXSBuZWVkcyB0byBiZSBwcmVzZW50IHRvIGJlIGFibGUgdG8gbWFrZSByZW1vdGUgc2VhcmNoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFNlbGVjdGFibGVFbGVtZW50cyhkYXRhOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZEVsZW1lbnRzOiBBcnJheTxOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZT4gPSBbXTtcblxuICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5U2VsZWN0ZWQgPSB0aGlzLmZpbmRTZWxlY3RlZEVsZW1lbnQoaXRlbSk7XG5cbiAgICAgICAgICAgIGlmIChhbHJlYWR5U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRFbGVtZW50cy5wdXNoKGFscmVhZHlTZWxlY3RlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZEVsZW1lbnRzLnB1c2goeyB1dWlkOiB1dWlkKCksIGlzU2VsZWN0ZWQ6IGZhbHNlLCB2YWx1ZTogaXRlbSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHMgPSBmb3JtYXR0ZWRFbGVtZW50cztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRTZWxlY3RlZEVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHMuZm9yRWFjaChzZWxlY3RhYmxlRWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRCZVNlbGVjdGVkOiBib29sZWFuID0gISFzZWxlY3RlZEVsZW1lbnRzPy5maW5kKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudCA9PiB0aGlzLmNvbXBhcmVXaXRoKHNlbGVjdGVkRWxlbWVudCwgc2VsZWN0YWJsZUVsZW1lbnQudmFsdWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGVFbGVtZW50LmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudFNlbGVjdGlvbihzZWxlY3RhYmxlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbXBvbmVudFZhbGlkYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1Db250YWluZXI/LmNvbnRyb2wgJiYgKHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsaWRhdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN5bmNWYWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmlzUmVxdWlyZWRWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhzeW5jVmFsaWRhdG9ycyk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1JlcXVpcmVkVmFsaWRhdG9yKCk6IGFueSB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgJ3JlcXVpcmVkJzogdHJ1ZSB9O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFNlbGVjdGVkRWxlbWVudChpdGVtOiBhbnkpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRzLmZpbmQoc2VsZWN0ZWRFbGVtZW50ID0+IHRoaXMuY29tcGFyZVdpdGgoc2VsZWN0ZWRFbGVtZW50LnZhbHVlLCBpdGVtKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wYXJlV2l0aChhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIGFbJ2dldEFwaUlkJ10gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGJbJ2dldEFwaUlkJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmdldEFwaUlkKCkgPT0gYi5nZXRBcGlJZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGEuaWQgJiYgYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGEuaWQgPT0gYi5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNDaGFuZ2VzQmV0d2VlbkJpbmRpbmdzKHZhbHVlOiBBcnJheTxhbnk+LCBuYXRpdmVWYWx1ZTogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCAmJiAhdmFsdWVbMF0udXVpZCkge1xuICAgICAgICAgICAgbmF0aXZlVmFsdWUgPSBuYXRpdmVWYWx1ZS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KG5hdGl2ZVZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2VsZWN0ZWRFbGVtZW50KHNlbGVjdGFibGVFbGVtZW50OiBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmluZChzZWxlY3RlZEVsZW1lbnQgPT4gc2VsZWN0ZWRFbGVtZW50LnV1aWQgPT09IHNlbGVjdGFibGVFbGVtZW50LnV1aWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNDb2xvcXVlbnRSZXNvdXJjZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGVFbGVtZW50cz8ubGVuZ3RoICYmIHR5cGVvZiB0aGlzLnNlbGVjdGFibGVFbGVtZW50c1swXS52YWx1ZVsnZ2V0QXBpSWQnXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0U2VsZWN0Q29udGFpbmVyU2VsZWN0YWJsZUVsZW1lbnRJbnRlcmZhY2Uge1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICAgIHZhbHVlOiBhbnk7XG59XG4iLCI8bGFiZWwgKm5nSWY9XCJsYWJlbCAmJiAhc2hpbmluZ1wiIGNsYXNzPVwiZmxleCB0ZXh0LXNtXCIgW2NsYXNzLm1iLTJdPSchaGFzVmFsaWRhdGlvbkVycm9ycygpJz5cbiAgICB7eyBsYWJlbCB9fTpcblxuICAgIDxzcGFuICpuZ0lmPVwiaXNSZXF1aXJlZFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwIGZvbnQtYm9sZCB0ZXh0LW1kIG1sLTFcIj4qPC9zcGFuPlxuXG4gICAgPG5ndC1oZWxwZXIgKm5nSWY9XCJoZWxwVGV4dFwiIFtoZWxwVGl0bGVdPVwiaGVscFRpdGxlXCIgW2ljb25Db2xvcl09XCJoZWxwVGV4dENvbG9yXCIgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgIHt7IGhlbHBUZXh0IH19XG4gICAgPC9uZ3QtaGVscGVyPlxuPC9sYWJlbD5cblxuPG5ndC12YWxpZGF0aW9uIFtoaWRkZW5dPSdzaGluaW5nJyBjbGFzcz1cImJsb2NrIG1iLTFcIiBbY29udHJvbF09J2Zvcm1Db250cm9sJyBbY29udGFpbmVyXT0nZm9ybUNvbnRhaW5lcic+XG48L25ndC12YWxpZGF0aW9uPlxuXG48ZGl2IGNsYXNzPVwie3sgc2hpbmluZyA/ICdoaWRkZW4nIDogJ2ZsZXggZmxleC1jb2wnIH19IGJvcmRlciB3LWZ1bGwgcm91bmRlZCB7eyBuZ3RTdHlsZS5jb21waWxlKFsnaCddKSB9fVwiXG4gICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAxNnJlbTtcIiBbY2xhc3MuYm9yZGVyLXJlZC01MDBdPSdoYXNWYWxpZGF0aW9uRXJyb3JzKCknIFtjbGFzcy5kaXNhYmxlZC1iYWNrZ3JvdW5kXT0naXNEaXNhYmxlZCc+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbCBwLTIgYm9yZGVyLWJcIj5cbiAgICAgICAgPG5ndC1jaGVja2JveCBjbGFzcz1cImZsZXhcIiB0aXRsZT1cIlNlbGVjaW9uYXIgdG9kb3NcIiBbbGFiZWxdPVwiIXNlYXJjaGFibGUgPyAnU2VsZWNpb25hciB0b2RvcycgOiAnJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdEFsbENoZWNrYm94XCIgW25hbWVdPVwic2VsZWN0QWxsQ2hlY2tib3hOYW1lXCIgW2lzQ2xpY2tEaXNhYmxlZF09J3RydWUnXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09J2xvYWRpbmcgfHwgaXNEaXNhYmxlZCcgaD0naC01JyB3PSd3LTUnIChjbGljayk9J3NlbGVjdEFsbCgpJyBuZ3Qtc3R5bGl6YWJsZT5cbiAgICAgICAgPC9uZ3QtY2hlY2tib3g+XG5cbiAgICAgICAgPG5ndC1pbnB1dCAqbmdJZj1cInNlYXJjaGFibGVcIiBjbGFzcz1cImJsb2NrIHctZnVsbCBwbC0yXCIgW25hbWVdPSdzZWFyY2hJbnB1dE5hbWUnIFsobmdNb2RlbCldPSdzZWFyY2hUZXJtJ1xuICAgICAgICAgICAgcGxhY2Vob2xkZXI9J0J1c2Nhci4uLicgW2FsbG93Q2xlYXJdPSd0cnVlJyBbaml0XT0ndHJ1ZScgaD0naC0xMCcgKG5nTW9kZWxDaGFuZ2UpPSdzZWFyY2goJGV2ZW50KSdcbiAgICAgICAgICAgIFtsb2FkaW5nXT0nbG9hZGluZycgW2lzRGlzYWJsZWRdPSdpc0Rpc2FibGVkJyBuZ3Qtc3R5bGl6YWJsZSAjaW5wdXRTZWFyY2g+XG4gICAgICAgIDwvbmd0LWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtZnVsbCB3LWZ1bGwgY3Vyc29yLXdhaXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1sb2FkZXJcIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgb3ZlcmZsb3cteS1hdXRvIHRleHQtc20ge3sgbG9hZGluZyA/ICdoaWRkZW4nIDogJ2ZsZXggZmxleC1jb2wnIH19XCIgKHNjcm9sbCk9J29uU2Nyb2xsKCRldmVudCknXG4gICAgICAgICNjb250YWluZXJSZWY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21IZWFkZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUhlYWRlclRlbXBsYXRlXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgZ2V0U2VsZWN0YWJsZUVsZW1lbnRzKCk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgaG92ZXI6YmctZ3JheS0yMDAge3sgaXNEaXNhYmxlZCA/ICdjdXJzb3Itbm90LWFsbG93ZWQnIDogJ2N1cnNvci1wb2ludGVyJyB9fVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnAtMl09JyFjdXN0b21PcHRpb25UZW1wbGF0ZScgKGNsaWNrKT0ndG9nZ2xlSXRlbShlbGVtZW50LCAkZXZlbnQpJz5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWVsZW1lbnQgI2VsZW1lbnRDaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmd0LWNoZWNrYm94IGNsYXNzPVwiZmxleCBwci0yXCIgW25hbWVdPSdlbGVtZW50LnV1aWQnIFsobmdNb2RlbCldPVwiZWxlbWVudC5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT0nb25OYXRpdmVDaGFuZ2UoZWxlbWVudCknIFtpc0NsaWNrRGlzYWJsZWRdPSd0cnVlJyBbaXNEaXNhYmxlZF09J2lzRGlzYWJsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICBoPSdoLTUnIHc9J3ctNScgKGNsaWNrKT0ndG9nZ2xlSXRlbShlbGVtZW50LCAkZXZlbnQpJyBuZ3Qtc3R5bGl6YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZ3QtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZWxlbWVudCAjZGVmYXVsdE9wdGlvblRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRTZWxlY3RhYmxlRWxlbWVudFZhbHVlKGVsZW1lbnQpIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tT3B0aW9uVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJlbGVtZW50Q2hlY2tib3hUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZWxlbWVudCB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbU9wdGlvblRlbXBsYXRlIHx8IGRlZmF1bHRPcHRpb25UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZWxlbWVudCwgaW5kZXg6IGkgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxwICpuZ0lmPVwiIWdldFNlbGVjdGFibGVFbGVtZW50cygpPy5sZW5ndGhcIiBjbGFzcz1cInRleHQtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgIHt7IG5ndFRyYW5zbGF0ZVNlcnZpY2Uubmd0TXVsdGlTZWxlY3ROb0RhdGFGb3VuZCB9fVxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInt7IHNoaW5pbmcgPyAnaGlkZGVuJyA6ICdmbGV4JyB9fSB3LWZ1bGwgaXRlbXMtY2VudGVyIG10LTJcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gbXItNFwiPlxuICAgICAgICB7eyBzZWxlY3RlZEVsZW1lbnRzPy5sZW5ndGggfHwgMCB9fSAvIHt7IGl0ZW1zVG90YWwgfHwgMCB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDxuZ3QtY2hlY2tib3ggY2xhc3M9XCJmbGV4XCIgbGFiZWw9XCJWaXN1YWxpemFyIHNlbGVjaW9uYWRvc1wiIFtuYW1lXT0nZGlzcGxheU9ubHlTZWxlY3RlZE5hbWUnXG4gICAgICAgIFsobmdNb2RlbCldPVwiZGlzcGxheU9ubHlTZWxlY3RlZFwiIFtpc0Rpc2FibGVkXT0nbG9hZGluZycgaD0naC01JyB3PSd3LTUnIG5ndC1zdHlsaXphYmxlPlxuICAgIDwvbmd0LWNoZWNrYm94PlxuPC9kaXY+XG5cbjxuZ3Qtc2hpbmluZyAqbmdJZj0nc2hpbmluZycgY2xhc3M9XCJibG9jayB3LWZ1bGwge3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnXSkgfX1cIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDE2cmVtO1wiXG4gICAgcm91bmRlZD0ncm91bmRlZCcgbmd0LXN0eWxpemFibGU+XG48L25ndC1zaGluaW5nPlxuXG48aW5wdXQgKm5nSWY9J2NvbXBvbmVudFJlYWR5JyB0eXBlPSdoaWRkZW4nIFtuZ01vZGVsXT0ndmFsdWUnIFtuYW1lXT0nbmFtZScgW3ZhbHVlXT0ndmFsdWUnPiJdfQ==
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtbXVsdGktc2VsZWN0L25ndC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LW11bHRpLXNlbGVjdC9uZ3QtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUNaLElBQUksRUFDSixZQUFZLEVBRVosS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7Ozs7Ozs7QUFnQjVGLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxjQUFjO0lBb0V2RCxZQUNZLGNBQThCLEVBQzlCLFFBQWtCLEVBQ2xCLGNBQWlDLEVBR2xDLHNCQUE4QyxFQUc5QyxhQUErQixFQUcvQixnQkFBa0MsRUFHbEMsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBaEJBLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUdsQywyQkFBc0Is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R2hCLFFBQVE7OzBCQUFJLElBQUk7OzBCQUdoQixRQUFROzswQkFBSSxRQUFROzswQkFHcEIsUUFBUTs0Q0FqRnFCLFlBQVk7c0JBQTdDLFNBQVM7dUJBQUMsY0FBYztnQkFDUSxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ3FCLHVCQUF1QjtzQkFBbkUsU0FBUzt1QkFBQyx5QkFBeUI7Z0JBR3BCLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBQ1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFHVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUdVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVyxZQUFZO3NCQUE1QixNQUFNO2dCQTZFQSxRQUFRO3NCQURkLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdCxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNlbGYsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBTa2lwU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBlbGVtZW50IH0gZnJvbSAncHJvdHJhY3Rvcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmd0QmFzZU5nTW9kZWwsIE5ndE1ha2VQcm92aWRlciB9IGZyb20gJy4uLy4uL2Jhc2Uvbmd0LWJhc2UtbmctbW9kZWwnO1xuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IHV1aWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3V1aWQnO1xuaW1wb3J0IHsgTmd0SHR0cFBhZ2luYXRpb24sIE5ndEh0dHBSZXNwb25zZSwgTmd0SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1tdWx0aS1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHN0eWxlVXJsczogWycuL25ndC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LmNzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBOZ3RNYWtlUHJvdmlkZXIoTmd0TXVsdGlTZWxlY3RDb21wb25lbnQpXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3RNdWx0aVNlbGVjdENvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyUmVmJykgcHVibGljIGNvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbnB1dFNlYXJjaCcpIHB1YmxpYyBpbnB1dFNlYXJjaDogTmd0SW5wdXRDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnZWxlbWVudENoZWNrYm94VGVtcGxhdGUnKSBwdWJsaWMgZWxlbWVudENoZWNrYm94VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogVmlzdWFsICovXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU9wdGlvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21IZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBlclJldmVyc2VZUG9zaXRpb246IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBlckF1dG9YUmV2ZXJzZTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIHNoaW5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEJlaGF2aW9yICovXG4gICAgQElucHV0KCkgcHVibGljIGJpbmRMYWJlbDogc3RyaW5nIHwgRnVuY3Rpb24gPSAnbmFtZSc7XG4gICAgQElucHV0KCkgcHVibGljIGJpbmRTZWFyY2g6IHN0cmluZyA9ICduYW1lJztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxNTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBWYWxpZGF0aW9uICovXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRGF0YUNoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlPj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgc2VhcmNoVGVybTogc3RyaW5nID0gJyc7XG4gICAgcHVibGljIHNlYXJjaElucHV0TmFtZTogc3RyaW5nID0gdXVpZCgpO1xuXG4gICAgcHVibGljIHNlbGVjdEFsbENoZWNrYm94TmFtZTogc3RyaW5nID0gdXVpZCgpO1xuICAgIHB1YmxpYyBkaXNwbGF5T25seVNlbGVjdGVkTmFtZTogc3RyaW5nID0gdXVpZCgpO1xuXG4gICAgcHVibGljIHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlPiA9IFtdO1xuICAgIHB1YmxpYyBpdGVtc1RvdGFsOiBudW1iZXI7XG4gICAgcHVibGljIHNlbGVjdEFsbENoZWNrYm94OiBib29sZWFuO1xuICAgIHB1YmxpYyBkaXNwbGF5T25seVNlbGVjdGVkOiBib29sZWFuO1xuXG4gICAgcHVibGljIG5hdGl2ZU5hbWU6IHN0cmluZyA9IHV1aWQoKTtcbiAgICBwdWJsaWMgbmF0aXZlVmFsdWU6IGFueTtcblxuICAgIHB1YmxpYyBuZ3RTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2U7XG4gICAgcHVibGljIHNlbGVjdGFibGVFbGVtZW50czogQXJyYXk8Tmd0U2VsZWN0Q29udGFpbmVyU2VsZWN0YWJsZUVsZW1lbnRJbnRlcmZhY2U+ID0gW107XG4gICAgcHVibGljIHNlbGVjdGFibGVFbGVtZW50c09uU2VhcmNoOiBBcnJheTxOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZT4gPSBbXTtcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHk6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHBhZ2luYXRpb246IE5ndEh0dHBQYWdpbmF0aW9uID0ge1xuICAgICAgICBjb3VudDogbnVsbCxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcGFnZXM6IG51bGwsXG4gICAgICAgIHRvdGFsOiBudWxsLFxuICAgICAgICBmcm9tOiBudWxsLFxuICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgcGVyX3BhZ2U6IG51bGxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG4gICAgcHJpdmF0ZSBpblNlYXJjaDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHByZXZpb3VzU2VhcmNoVGVybTogc3RyaW5nID0gJyc7XG4gICAgcHJpdmF0ZSBiZWNhbWVWaXNpYmxlOiBib29sZWFuO1xuICAgIHByaXZhdGUgc2VsZWN0YWJsZVJlc291cmNlc0NvdW50OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbmd0SHR0cFNlcnZpY2U6IE5ndEh0dHBTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKVxuICAgICAgICBwdWJsaWMgbmd0U3R5bGl6YWJsZURpcmVjdGl2ZTogTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSxcblxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHB1YmxpYyBuZ3RGb3JtQ29tcG9uZW50OiBOZ3RGb3JtQ29tcG9uZW50LFxuXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIHB1YmxpYyBuZ3RUcmFuc2xhdGVTZXJ2aWNlOiBOZ3RUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubmd0Rm9ybUNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gdGhpcy5uZ3RGb3JtQ29tcG9uZW50LmlzU2hpbmluZygpO1xuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm5ndEZvcm1Db21wb25lbnQub25TaGluaW5nQ2hhbmdlLnN1YnNjcmliZSgoc2hpbmluZzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW5pbmcgPSBzaGluaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZS5nZXROZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IG5ldyBOZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZ3RTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3RNdWx0aVNlbGVjdCcsIHsgaDogJ2gtNjQnIH0pO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNTY3JvbGxFbmQgPSBldmVudC50YXJnZXQuc2Nyb2xsVG9wICYmIGV2ZW50LnRhcmdldC5vZmZzZXRIZWlnaHQgKyBldmVudC50YXJnZXQuc2Nyb2xsVG9wID49IChldmVudC50YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gMzApO1xuXG4gICAgICAgIGlmIChpc1Njcm9sbEVuZCAmJiAhdGhpcy5sb2FkaW5nICYmICF0aGlzLmRpc3BsYXlPbmx5U2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RhYmxlRWxlbWVudHM/Lmxlbmd0aFxuICAgICAgICAgICAgJiYgdGhpcy5wYWdpbmF0aW9uLnBlcl9wYWdlIDwgdGhpcy5wYWdpbmF0aW9uLnRvdGFsKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IHR5cGVvZiB0aGlzLnBhZ2luYXRpb24ucGVyX3BhZ2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VJbnQodGhpcy5wYWdpbmF0aW9uLnBlcl9wYWdlKVxuICAgICAgICAgICAgICAgIDogdGhpcy5wYWdpbmF0aW9uLnBlcl9wYWdlO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZERhdGEoY3VycmVudFBlclBhZ2UgKyB0aGlzLml0ZW1zUGVyUGFnZSwgdGhpcy5zZWFyY2hUZXJtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGVsZW1lbnQgbXVzdCBiZSBpbnNpZGUgYSA8Zm9ybSAjZm9ybT0nbmdGb3JtJz4gdGFnIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGVsZW1lbnQgbXVzdCBjb250YWluIGEgbmFtZSBhdHRyaWJ1dGUhXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmJlY2FtZVZpc2libGUgJiYgIXRoaXMuaXNIaWRkZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5iZWNhbWVWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSgpLnRoZW4oKCkgPT4gdGhpcy5pbml0Q29tcG9uZW50VmFsaWRhdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmlzUmVxdWlyZWQgJiYgdGhpcy5jb21wb25lbnRSZWFkeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5T25seVNlbGVjdGVkID0gY2hhbmdlcy5pc0Rpc2FibGVkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLml0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRTZWxlY3RhYmxlRWxlbWVudHMoY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5yZW1vdGVSZXNvdXJjZSAmJiB0aGlzLmJlY2FtZVZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKS50aGVuKCgpID0+IHRoaXMuaW5pdENvbXBvbmVudFZhbGlkYXRpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5pdGVtc1BlclBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wZXJfcGFnZSA9IGNoYW5nZXMuaXRlbXNQZXJQYWdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0U2VhcmNoLnNldEZvY3VzKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWZyZXNoKGl0ZW1zUGVyUGFnZT86IG51bWJlciwgc2VhcmNoVGVybT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IGl0ZW1zUGVyUGFnZSAhPT0gdW5kZWZpbmVkID8gaXRlbXNQZXJQYWdlIDogdGhpcy5pdGVtc1BlclBhZ2U7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHNlYXJjaFRlcm0gIT09IHVuZGVmaW5lZCA/IHNlYXJjaFRlcm0gOiB0aGlzLnNlYXJjaFRlcm07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZERhdGEodGhpcy5pdGVtc1BlclBhZ2UsIHRoaXMuc2VhcmNoVGVybSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nICYmICF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2tib3ggPSAhdGhpcy5zZWxlY3RBbGxDaGVja2JveDtcblxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVWYWx1ZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IHBlcnBhZ2UgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94ID8gdGhpcy5wYWdpbmF0aW9uLnRvdGFsIDogdGhpcy5pdGVtc1BlclBhZ2U7XG5cbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEocGVycGFnZSwgdGhpcy5zZWFyY2hUZXJtKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbFRvKHsgdG9wOiAwIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5pc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RBbGxDaGVja2JveCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0QWxsQ2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0RWxlbWVudHMoZWxlbWVudHM6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZHMgPSB0aGlzLmlzQ29sb3F1ZW50UmVzb3VyY2VzKCkgPyBlbGVtZW50cy5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmdldEFwaUlkKCkpIDogZWxlbWVudHM7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKHNlbGVjdGFibGVFbGVtZW50OiBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGVjdGFibGVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RhYmxlRWxlbWVudC5pc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaXNDb2xvcXVlbnRSZXNvdXJjZXMoKSAmJiBlbGVtZW50SWRzLmluY2x1ZGVzKHZhbHVlLmdldEFwaUlkKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRJZHMuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudFNlbGVjdGlvbihzZWxlY3RhYmxlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUl0ZW0oc2VsZWN0YWJsZUVsZW1lbnQ6IE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZCA9ICFzZWxlY3RhYmxlRWxlbWVudC5pc1NlbGVjdGVkO1xuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oc2VsZWN0YWJsZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHNlbGVjdGFibGVFbGVtZW50OiBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50U2VsZWN0aW9uKHNlbGVjdGFibGVFbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlc0JldHdlZW5CaW5kaW5ncyh0aGlzLnZhbHVlLCB0aGlzLnNlbGVjdGVkRWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5tYXAoZSA9PiBlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGFuZ2Uoc2VsZWN0ZWRFbGVtZW50czogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VzQmV0d2VlbkJpbmRpbmdzKHNlbGVjdGVkRWxlbWVudHMsIHRoaXMuc2VsZWN0ZWRFbGVtZW50cykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGVFbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IHRoaXMuaXNTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50c09uU2VhcmNoLmZpbHRlcihlbGVtZW50ID0+IHRoaXMuaXNTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IHNlbGVjdGVkRWxlbWVudHM/Lm1hcChcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiAoeyB1dWlkOiB1dWlkKCksIGlzU2VsZWN0ZWQ6IHRydWUsIHZhbHVlOiBlbGVtZW50IH0pXG4gICAgICAgICAgICAgICAgKSA/PyBbXTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkRWxlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2godGVybTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb21wb25lbnRSZWFkeSB8fCB0ZXJtID09PSB1bmRlZmluZWQgfHwgdGVybSA9PT0gbnVsbCB8fCB0ZXJtID09PSB0aGlzLnByZXZpb3VzU2VhcmNoVGVybSB8fCB0aGlzLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaFRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzU2VhcmNoVGVybSA9IHRlcm07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENoZWNrYm94ID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzPy5sZW5ndGggPT0gdGhpcy5zZWxlY3RhYmxlUmVzb3VyY2VzQ291bnQ7XG5cbiAgICAgICAgICAgIGlmICghdGVybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5TZWFyY2ggPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pblNlYXJjaCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50c09uU2VhcmNoID0gdGhpcy5zZWxlY3RhYmxlRWxlbWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBpdGVtID0+IHRoaXMuZ2V0U2VsZWN0YWJsZUVsZW1lbnRWYWx1ZShpdGVtKS5pbmNsdWRlcyh0ZXJtKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZERhdGEodGhpcy5pdGVtc1BlclBhZ2UsIHRlcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RhYmxlRWxlbWVudHMoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmluU2VhcmNoICYmIHRoaXMuaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzT25TZWFyY2g7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5T25seVNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RhYmxlRWxlbWVudFZhbHVlKHNlbGVjdGFibGVJdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmluZExhYmVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iaW5kTGFiZWwoc2VsZWN0YWJsZUl0ZW0udmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxlY3RhYmxlSXRlbS52YWx1ZVsnZ2V0QXR0cmlidXRlJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RhYmxlSXRlbS52YWx1ZS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kTGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdGFibGVJdGVtLnZhbHVlW3RoaXMuYmluZExhYmVsXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzVmFsaWRhdGlvbkVycm9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2w/LmVycm9ycyAmJiAoXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLmRpcnR5IHx8ICh0aGlzLmZvcm1Db250YWluZXIgJiYgdGhpcy5mb3JtQ29udGFpbmVyWydzdWJtaXR0ZWQnXSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUVsZW1lbnRTZWxlY3Rpb24oc2VsZWN0YWJsZUVsZW1lbnQ6IE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlKTogdm9pZCB7XG4gICAgICAgIGlmIChzZWxlY3RhYmxlRWxlbWVudC5pc1NlbGVjdGVkICYmICF0aGlzLmlzU2VsZWN0ZWRFbGVtZW50KHNlbGVjdGFibGVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzLnB1c2goc2VsZWN0YWJsZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3RhYmxlRWxlbWVudC5pc1NlbGVjdGVkICYmIHRoaXMuaXNTZWxlY3RlZEVsZW1lbnQoc2VsZWN0YWJsZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudCA9PiBzZWxlY3RlZEVsZW1lbnQudXVpZCAhPT0gc2VsZWN0YWJsZUVsZW1lbnQudXVpZFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShzZWxlY3RhYmxlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlPbmx5U2VsZWN0ZWQgJiYgIXRoaXMuc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlPbmx5U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZERhdGEocGVycGFnZTogbnVtYmVyID0gdGhpcy5pdGVtc1BlclBhZ2UsIHNlYXJjaFRlcm0/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbW90ZVJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwZXJwYWdlID09IHRoaXMuaXRlbXNQZXJQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxUbyh7IHRvcDogMCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBwZXJwYWdlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFnaW5hdGlvbjogTmd0SHR0cFBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgLi4ueyBwZXJfcGFnZTogcGVycGFnZSB9IH07XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHNlYXJjaFRlcm0gPyB7IFt0aGlzLmJpbmRTZWFyY2hdOiBzZWFyY2hUZXJtIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmd0SHR0cFNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdGVSZXNvdXJjZSwgZmlsdGVycywgcGFnaW5hdGlvblxuICAgICAgICAgICAgICAgICAgICApLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogTmd0SHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kU2VsZWN0YWJsZUVsZW1lbnRzKHJlc3BvbnNlLmRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0gcmVzcG9uc2UubWV0YS5wYWdpbmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNUb3RhbCA9IHRoaXMucGFnaW5hdGlvbi50b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RhYmxlUmVzb3VyY2VzQ291bnQgJiYgIXNlYXJjaFRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlUmVzb3VyY2VzQ291bnQgPSB0aGlzLnBhZ2luYXRpb24udG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGFibGVFbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlzcGxheU9ubHlTZWxlY3RlZCA9IHRoaXMuaXNEaXNhYmxlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBwcm9wZXJ0eSBbcmVtb3RlUmVzb3VyY2VdIG5lZWRzIHRvIGJlIHByZXNlbnQgdG8gYmUgYWJsZSB0byBtYWtlIHJlbW90ZSBzZWFyY2gnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kU2VsZWN0YWJsZUVsZW1lbnRzKGRhdGE6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRWxlbWVudHM6IEFycmF5PE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlPiA9IFtdO1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IHRoaXMuZmluZFNlbGVjdGVkRWxlbWVudChpdGVtKTtcblxuICAgICAgICAgICAgaWYgKGFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZEVsZW1lbnRzLnB1c2goYWxyZWFkeVNlbGVjdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRWxlbWVudHMucHVzaCh7IHV1aWQ6IHV1aWQoKSwgaXNTZWxlY3RlZDogZmFsc2UsIHZhbHVlOiBpdGVtIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cyA9IGZvcm1hdHRlZEVsZW1lbnRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFNlbGVjdGVkRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50czogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGFibGVFbGVtZW50cy5mb3JFYWNoKHNlbGVjdGFibGVFbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJlU2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXNlbGVjdGVkRWxlbWVudHM/LmZpbmQoXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50ID0+IHRoaXMuY29tcGFyZVdpdGgoc2VsZWN0ZWRFbGVtZW50LCBzZWxlY3RhYmxlRWxlbWVudC52YWx1ZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRCZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZUVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50U2VsZWN0aW9uKHNlbGVjdGFibGVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50VmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRhaW5lcj8uY29udHJvbCAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuaXNSZXF1aXJlZFZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVxdWlyZWRWYWxpZGF0b3IoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyAncmVxdWlyZWQnOiB0cnVlIH07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRFbGVtZW50KGl0ZW06IGFueSk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmluZChzZWxlY3RlZEVsZW1lbnQgPT4gdGhpcy5jb21wYXJlV2l0aChzZWxlY3RlZEVsZW1lbnQudmFsdWUsIGl0ZW0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBhcmVXaXRoKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0eXBlb2YgYVsnZ2V0QXBpSWQnXSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYlsnZ2V0QXBpSWQnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGEuZ2V0QXBpSWQoKSA9PSBiLmdldEFwaUlkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5pZCAmJiBiLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pZCA9PSBiLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0NoYW5nZXNCZXR3ZWVuQmluZGluZ3ModmFsdWU6IEFycmF5PGFueT4sIG5hdGl2ZVZhbHVlOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh2YWx1ZT8ubGVuZ3RoICYmICF2YWx1ZVswXS51dWlkKSB7XG4gICAgICAgICAgICBuYXRpdmVWYWx1ZSA9IG5hdGl2ZVZhbHVlLm1hcChlbGVtZW50ID0+IGVsZW1lbnQudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkobmF0aXZlVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTZWxlY3RlZEVsZW1lbnQoc2VsZWN0YWJsZUVsZW1lbnQ6IE5ndFNlbGVjdENvbnRhaW5lclNlbGVjdGFibGVFbGVtZW50SW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWRFbGVtZW50cy5maW5kKHNlbGVjdGVkRWxlbWVudCA9PiBzZWxlY3RlZEVsZW1lbnQudXVpZCA9PT0gc2VsZWN0YWJsZUVsZW1lbnQudXVpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvbG9xdWVudFJlc291cmNlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzPy5sZW5ndGggJiYgdHlwZW9mIHRoaXMuc2VsZWN0YWJsZUVsZW1lbnRzWzBdLnZhbHVlWydnZXRBcGlJZCddID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RTZWxlY3RDb250YWluZXJTZWxlY3RhYmxlRWxlbWVudEludGVyZmFjZSB7XG4gICAgdXVpZDogc3RyaW5nO1xuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgdmFsdWU6IGFueTtcbn1cbiIsIjxsYWJlbCAqbmdJZj1cImxhYmVsICYmICFzaGluaW5nXCIgY2xhc3M9XCJmbGV4IHRleHQtc21cIiBbY2xhc3MubWItMl09JyFoYXNWYWxpZGF0aW9uRXJyb3JzKCknPlxuICAgIHt7IGxhYmVsIH19OlxuXG4gICAgPHNwYW4gKm5nSWY9XCJpc1JlcXVpcmVkXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgZm9udC1ib2xkIHRleHQtbWQgbWwtMVwiPio8L3NwYW4+XG5cbiAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIlxuICAgICAgICAgICAgW2hlbHBlclJldmVyc2VZUG9zaXRpb25dPVwiaGVscGVyUmV2ZXJzZVlQb3NpdGlvblwiIFthdXRvWFJldmVyc2VdPVwiaGVscGVyQXV0b1hSZXZlcnNlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWwtMVwiPlxuICAgICAgICB7eyBoZWxwVGV4dCB9fVxuICAgIDwvbmd0LWhlbHBlcj5cbjwvbGFiZWw+XG5cbjxuZ3QtdmFsaWRhdGlvbiBbaGlkZGVuXT0nc2hpbmluZycgY2xhc3M9XCJibG9jayBtYi0xXCIgW2NvbnRyb2xdPSdmb3JtQ29udHJvbCcgW2NvbnRhaW5lcl09J2Zvcm1Db250YWluZXInPlxuPC9uZ3QtdmFsaWRhdGlvbj5cblxuPGRpdiBjbGFzcz1cInt7IHNoaW5pbmcgPyAnaGlkZGVuJyA6ICdmbGV4IGZsZXgtY29sJyB9fSBib3JkZXIgdy1mdWxsIHJvdW5kZWQge3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnXSkgfX1cIlxuICAgIHN0eWxlPVwibWluLWhlaWdodDogMTZyZW07XCIgW2NsYXNzLmJvcmRlci1yZWQtNTAwXT0naGFzVmFsaWRhdGlvbkVycm9ycygpJyBbY2xhc3MuZGlzYWJsZWQtYmFja2dyb3VuZF09J2lzRGlzYWJsZWQnPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGwgcC0yIGJvcmRlci1iXCI+XG4gICAgICAgIDxuZ3QtY2hlY2tib3ggY2xhc3M9XCJmbGV4XCIgdGl0bGU9XCJTZWxlY2lvbmFyIHRvZG9zXCIgW2xhYmVsXT1cIiFzZWFyY2hhYmxlID8gJ1NlbGVjaW9uYXIgdG9kb3MnIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxDaGVja2JveFwiIFtuYW1lXT1cInNlbGVjdEFsbENoZWNrYm94TmFtZVwiIFtpc0NsaWNrRGlzYWJsZWRdPSd0cnVlJ1xuICAgICAgICAgICAgW2lzRGlzYWJsZWRdPSdsb2FkaW5nIHx8IGlzRGlzYWJsZWQnIGg9J2gtNScgdz0ndy01JyAoY2xpY2spPSdzZWxlY3RBbGwoKScgbmd0LXN0eWxpemFibGU+XG4gICAgICAgIDwvbmd0LWNoZWNrYm94PlxuXG4gICAgICAgIDxuZ3QtaW5wdXQgKm5nSWY9XCJzZWFyY2hhYmxlXCIgY2xhc3M9XCJibG9jayB3LWZ1bGwgcGwtMlwiIFtuYW1lXT0nc2VhcmNoSW5wdXROYW1lJyBbKG5nTW9kZWwpXT0nc2VhcmNoVGVybSdcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSdCdXNjYXIuLi4nIFthbGxvd0NsZWFyXT0ndHJ1ZScgW2ppdF09J3RydWUnIGg9J2gtMTAnIChuZ01vZGVsQ2hhbmdlKT0nc2VhcmNoKCRldmVudCknXG4gICAgICAgICAgICBbbG9hZGluZ109J2xvYWRpbmcnIFtpc0Rpc2FibGVkXT0naXNEaXNhYmxlZCcgbmd0LXN0eWxpemFibGUgI2lucHV0U2VhcmNoPlxuICAgICAgICA8L25ndC1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBoLWZ1bGwgdy1mdWxsIGN1cnNvci13YWl0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbG9hZGVyXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG92ZXJmbG93LXktYXV0byB0ZXh0LXNtIHt7IGxvYWRpbmcgPyAnaGlkZGVuJyA6ICdmbGV4IGZsZXgtY29sJyB9fVwiIChzY3JvbGwpPSdvblNjcm9sbCgkZXZlbnQpJ1xuICAgICAgICAjY29udGFpbmVyUmVmPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tSGVhZGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21IZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGdldFNlbGVjdGFibGVFbGVtZW50cygpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGhvdmVyOmJnLWdyYXktMjAwIHt7IGlzRGlzYWJsZWQgPyAnY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicgfX1cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5wLTJdPSchY3VzdG9tT3B0aW9uVGVtcGxhdGUnIChjbGljayk9J3RvZ2dsZUl0ZW0oZWxlbWVudCwgJGV2ZW50KSc+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1lbGVtZW50ICNlbGVtZW50Q2hlY2tib3hUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5ndC1jaGVja2JveCBjbGFzcz1cImZsZXggcHItMlwiIFtuYW1lXT0nZWxlbWVudC51dWlkJyBbKG5nTW9kZWwpXT1cImVsZW1lbnQuaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9J29uTmF0aXZlQ2hhbmdlKGVsZW1lbnQpJyBbaXNDbGlja0Rpc2FibGVkXT0ndHJ1ZScgW2lzRGlzYWJsZWRdPSdpc0Rpc2FibGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaD0naC01JyB3PSd3LTUnIChjbGljayk9J3RvZ2dsZUl0ZW0oZWxlbWVudCwgJGV2ZW50KScgbmd0LXN0eWxpemFibGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWVsZW1lbnQgI2RlZmF1bHRPcHRpb25UZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0U2VsZWN0YWJsZUVsZW1lbnRWYWx1ZShlbGVtZW50KSB9fVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbU9wdGlvblRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZWxlbWVudENoZWNrYm94VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGVsZW1lbnQgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21PcHRpb25UZW1wbGF0ZSB8fCBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGVsZW1lbnQsIGluZGV4OiBpIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8cCAqbmdJZj1cIiFnZXRTZWxlY3RhYmxlRWxlbWVudHMoKT8ubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC00XCI+XG4gICAgICAgICAgICB7eyBuZ3RUcmFuc2xhdGVTZXJ2aWNlLm5ndE11bHRpU2VsZWN0Tm9EYXRhRm91bmQgfX1cbiAgICAgICAgPC9wPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ7eyBzaGluaW5nID8gJ2hpZGRlbicgOiAnZmxleCcgfX0gdy1mdWxsIGl0ZW1zLWNlbnRlciBtdC0yXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG1yLTRcIj5cbiAgICAgICAge3sgc2VsZWN0ZWRFbGVtZW50cz8ubGVuZ3RoIHx8IDAgfX0gLyB7eyBpdGVtc1RvdGFsIHx8IDAgfX1cbiAgICA8L3NwYW4+XG5cbiAgICA8bmd0LWNoZWNrYm94IGNsYXNzPVwiZmxleFwiIGxhYmVsPVwiVmlzdWFsaXphciBzZWxlY2lvbmFkb3NcIiBbbmFtZV09J2Rpc3BsYXlPbmx5U2VsZWN0ZWROYW1lJ1xuICAgICAgICBbKG5nTW9kZWwpXT1cImRpc3BsYXlPbmx5U2VsZWN0ZWRcIiBbaXNEaXNhYmxlZF09J2xvYWRpbmcnIGg9J2gtNScgdz0ndy01JyBuZ3Qtc3R5bGl6YWJsZT5cbiAgICA8L25ndC1jaGVja2JveD5cbjwvZGl2PlxuXG48bmd0LXNoaW5pbmcgKm5nSWY9J3NoaW5pbmcnIGNsYXNzPVwiYmxvY2sgdy1mdWxsIHt7IG5ndFN0eWxlLmNvbXBpbGUoWydoJ10pIH19XCIgc3R5bGU9XCJtaW4taGVpZ2h0OiAxNnJlbTtcIlxuICAgIHJvdW5kZWQ9J3JvdW5kZWQnIG5ndC1zdHlsaXphYmxlPlxuPC9uZ3Qtc2hpbmluZz5cblxuPGlucHV0ICpuZ0lmPSdjb21wb25lbnRSZWFkeScgdHlwZT0naGlkZGVuJyBbbmdNb2RlbF09J3ZhbHVlJyBbbmFtZV09J25hbWUnIFt2YWx1ZV09J3ZhbHVlJz5cbiJdfQ==
@@ -6,28 +6,25 @@ import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
7
  import * as i2 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
8
8
  import * as i3 from "../ngt-form/ngt-form.component";
9
- import * as i4 from "./ngt-radio-button-container/ngt-radio-button-container.component";
10
- import * as i5 from "@angular/common";
11
- import * as i6 from "../ngt-shining/ngt-shining.component";
12
- import * as i7 from "../ngt-helper/ngt-helper.component";
9
+ import * as i4 from "../ngt-section/ngt-section.component";
10
+ import * as i5 from "./ngt-radio-button-container/ngt-radio-button-container.component";
11
+ import * as i6 from "@angular/common";
12
+ import * as i7 from "../ngt-shining/ngt-shining.component";
13
+ import * as i8 from "../ngt-helper/ngt-helper.component";
13
14
  export class NgtRadioButtonComponent extends NgtBaseNgModel {
14
- constructor(injector, formContainer, renderer, ngtStylizableDirective, ngtFormComponent, ngtRadioButtonContainer) {
15
+ constructor(changeDetector, injector, formContainer, renderer, ngtStylizableDirective, ngtForm, ngtSection, ngtRadioButtonContainer) {
15
16
  super();
17
+ this.changeDetector = changeDetector;
16
18
  this.injector = injector;
17
19
  this.formContainer = formContainer;
18
20
  this.renderer = renderer;
19
21
  this.ngtStylizableDirective = ngtStylizableDirective;
20
- this.ngtFormComponent = ngtFormComponent;
22
+ this.ngtForm = ngtForm;
23
+ this.ngtSection = ngtSection;
21
24
  this.ngtRadioButtonContainer = ngtRadioButtonContainer;
22
25
  this.isSelectable = true;
23
26
  this.helpTextColor = 'text-green-500';
24
27
  this.subscriptions = [];
25
- if (this.ngtFormComponent) {
26
- this.shining = this.ngtFormComponent.isShining();
27
- this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
28
- this.shining = shining;
29
- }));
30
- }
31
28
  if (this.ngtRadioButtonContainer) {
32
29
  this.subscriptions.push(this.ngtRadioButtonContainer.onActiveRadioButtonChange.subscribe((activeRadioButton) => {
33
30
  this.value = (activeRadioButton.name === this.name);
@@ -50,6 +47,12 @@ export class NgtRadioButtonComponent extends NgtBaseNgModel {
50
47
  this.renderer.listen(this.element.nativeElement, 'change', (value) => {
51
48
  this.onNativeChange(this.element.nativeElement.checked);
52
49
  });
50
+ this.bindSubscriptions();
51
+ }
52
+ ngOnChanges(changes) {
53
+ if (changes.isDisabled && !changes.isDisabled.currentValue) {
54
+ this.isDisabled = this.ngtForm?.isDisabled || this.ngtSection?.isDisabled;
55
+ }
53
56
  }
54
57
  ngOnDestroy() {
55
58
  this.destroySubscriptions();
@@ -68,15 +71,36 @@ export class NgtRadioButtonComponent extends NgtBaseNgModel {
68
71
  this.ngtRadioButtonContainer.setActiveRadioButton(this);
69
72
  }
70
73
  }
74
+ bindSubscriptions() {
75
+ this.changeDetector.detectChanges();
76
+ if (!this.isDisabled) {
77
+ this.isDisabled = this.ngtForm?.isDisabled || this.ngtSection?.isDisabled;
78
+ }
79
+ if (this.ngtForm) {
80
+ this.subscriptions.push(this.ngtForm.onIsDisabledChange.subscribe((isDisabled) => {
81
+ if (!this.isDisabled) {
82
+ this.isDisabled = isDisabled || this.ngtSection?.isDisabled;
83
+ }
84
+ }));
85
+ }
86
+ if (this.ngtSection) {
87
+ this.subscriptions.push(this.ngtSection.onIsDisabledChange.subscribe((isDisabled) => {
88
+ if (!this.isDisabled) {
89
+ this.isDisabled = isDisabled || this.ngtForm?.isDisabled;
90
+ }
91
+ }));
92
+ }
93
+ this.changeDetector.detectChanges();
94
+ }
71
95
  destroySubscriptions() {
72
96
  this.subscriptions.forEach(subscription => subscription.unsubscribe());
73
97
  this.subscriptions = [];
74
98
  }
75
99
  }
76
- NgtRadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtRadioButtonComponent, deps: [{ token: i0.Injector }, { token: i1.ControlContainer, host: true, optional: true }, { token: i0.Renderer2 }, { token: i2.NgtStylizableDirective, optional: true, self: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtRadioButtonContainerComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
100
+ NgtRadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtRadioButtonComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i1.ControlContainer, host: true, optional: true }, { token: i0.Renderer2 }, { token: i2.NgtStylizableDirective, optional: true, self: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtSectionComponent, optional: true, skipSelf: true }, { token: i5.NgtRadioButtonContainerComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
77
101
  NgtRadioButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtRadioButtonComponent, selector: "ngt-radio-button", inputs: { label: "label", name: "name", shining: "shining", isSelectable: "isSelectable", isDisabled: "isDisabled", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText" }, providers: [
78
102
  NgtMakeProvider(NgtRadioButtonComponent),
79
- ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label class=\"inline-flex items-center {{ isDisabled || !isSelectable ? 'cursor-not-allowed' : 'cursor-pointer' }}\">\n <input type=\"checkbox\" [name]='name' class=\"hidden\" ([ngModel])='value' [disabled]='isDisabled || !isSelectable'\n #element>\n\n <div class=\"{{ value ? ngtStyle.compile(['color.border', 'color.text']) : 'border-gray-500' }}\n shadow rounded-full border border-gray-400 {{ !shining ? 'flex justify-center items-center' : 'hidden' }}\"\n style=\"width: 19px; height: 19px;\">\n <svg *ngIf=\"value\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29.107 29.107\"\n style=\"width: 13px; height: 13px;\">\n <path\n d=\"M14.554 0C6.561 0 0 6.562 0 14.552c0 7.996 6.561 14.555 14.554 14.555 7.996 0 14.553-6.559 14.553-14.555C29.106 6.562 22.55 0 14.554 0z\" />\n </svg>\n </div>\n\n <span *ngIf='label && !shining' class=\"text-sm ml-2\" [class.line-through]='!isSelectable'>\n {{ label }}\n </span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"w-16 h-12\"></ngt-shining>\n </div>\n</ng-container>\n", styles: ["label{margin-bottom:unset!important}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i7.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
103
+ ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label\n class=\"inline-flex items-center {{ isDisabled || !isSelectable ? 'cursor-not-allowed opacity-50' : 'cursor-pointer' }}\">\n <input type=\"checkbox\" [name]='name' class=\"hidden\" ([ngModel])='value' [disabled]='isDisabled || !isSelectable'\n #element>\n\n <div class=\"{{ value ? ngtStyle.compile(['color.border', 'color.text']) : 'border-gray-500' }}\n shadow rounded-full border border-gray-400 {{ !shining ? 'flex justify-center items-center' : 'hidden' }}\"\n style=\"width: 19px; height: 19px;\">\n <svg *ngIf=\"value\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29.107 29.107\"\n style=\"width: 13px; height: 13px;\">\n <path\n d=\"M14.554 0C6.561 0 0 6.562 0 14.552c0 7.996 6.561 14.555 14.554 14.555 7.996 0 14.553-6.559 14.553-14.555C29.106 6.562 22.55 0 14.554 0z\" />\n </svg>\n </div>\n\n <span *ngIf='label && !shining' class=\"text-sm ml-2\" [class.line-through]='!isSelectable'>\n {{ label }}\n </span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"w-16 h-12\"></ngt-shining>\n </div>\n</ng-container>", styles: ["label{margin-bottom:unset!important}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i8.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
80
104
  { provide: ControlContainer, useExisting: NgForm }
81
105
  ] });
82
106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtRadioButtonComponent, decorators: [{
@@ -85,8 +109,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
85
109
  NgtMakeProvider(NgtRadioButtonComponent),
86
110
  ], viewProviders: [
87
111
  { provide: ControlContainer, useExisting: NgForm }
88
- ], template: "<label class=\"inline-flex items-center {{ isDisabled || !isSelectable ? 'cursor-not-allowed' : 'cursor-pointer' }}\">\n <input type=\"checkbox\" [name]='name' class=\"hidden\" ([ngModel])='value' [disabled]='isDisabled || !isSelectable'\n #element>\n\n <div class=\"{{ value ? ngtStyle.compile(['color.border', 'color.text']) : 'border-gray-500' }}\n shadow rounded-full border border-gray-400 {{ !shining ? 'flex justify-center items-center' : 'hidden' }}\"\n style=\"width: 19px; height: 19px;\">\n <svg *ngIf=\"value\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29.107 29.107\"\n style=\"width: 13px; height: 13px;\">\n <path\n d=\"M14.554 0C6.561 0 0 6.562 0 14.552c0 7.996 6.561 14.555 14.554 14.555 7.996 0 14.553-6.559 14.553-14.555C29.106 6.562 22.55 0 14.554 0z\" />\n </svg>\n </div>\n\n <span *ngIf='label && !shining' class=\"text-sm ml-2\" [class.line-through]='!isSelectable'>\n {{ label }}\n </span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"w-16 h-12\"></ngt-shining>\n </div>\n</ng-container>\n", styles: ["label{margin-bottom:unset!important}\n"] }]
89
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.ControlContainer, decorators: [{
112
+ ], template: "<label\n class=\"inline-flex items-center {{ isDisabled || !isSelectable ? 'cursor-not-allowed opacity-50' : 'cursor-pointer' }}\">\n <input type=\"checkbox\" [name]='name' class=\"hidden\" ([ngModel])='value' [disabled]='isDisabled || !isSelectable'\n #element>\n\n <div class=\"{{ value ? ngtStyle.compile(['color.border', 'color.text']) : 'border-gray-500' }}\n shadow rounded-full border border-gray-400 {{ !shining ? 'flex justify-center items-center' : 'hidden' }}\"\n style=\"width: 19px; height: 19px;\">\n <svg *ngIf=\"value\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29.107 29.107\"\n style=\"width: 13px; height: 13px;\">\n <path\n d=\"M14.554 0C6.561 0 0 6.562 0 14.552c0 7.996 6.561 14.555 14.554 14.555 7.996 0 14.553-6.559 14.553-14.555C29.106 6.562 22.55 0 14.554 0z\" />\n </svg>\n </div>\n\n <span *ngIf='label && !shining' class=\"text-sm ml-2\" [class.line-through]='!isSelectable'>\n {{ label }}\n </span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n</label>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"w-16 h-12\"></ngt-shining>\n </div>\n</ng-container>", styles: ["label{margin-bottom:unset!important}\n"] }]
113
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.ControlContainer, decorators: [{
90
114
  type: Optional
91
115
  }, {
92
116
  type: Host
@@ -98,7 +122,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
98
122
  type: Optional
99
123
  }, {
100
124
  type: SkipSelf
101
- }] }, { type: i4.NgtRadioButtonContainerComponent, decorators: [{
125
+ }] }, { type: i4.NgtSectionComponent, decorators: [{
126
+ type: Optional
127
+ }, {
128
+ type: SkipSelf
129
+ }] }, { type: i5.NgtRadioButtonContainerComponent, decorators: [{
102
130
  type: Optional
103
131
  }, {
104
132
  type: SkipSelf
@@ -122,4 +150,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
122
150
  }], helpText: [{
123
151
  type: Input
124
152
  }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LXJhZGlvLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtcmFkaW8tYnV0dG9uL25ndC1yYWRpby1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LXJhZGlvLWJ1dHRvbi9uZ3QtcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsSUFBSSxFQUVKLEtBQUssRUFFTCxRQUFRLEVBRVIsSUFBSSxFQUNKLFFBQVEsRUFDUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7OztBQWU1RixNQUFNLE9BQU8sdUJBQXdCLFNBQVEsY0FBYztJQWlCdkQsWUFDWSxRQUFrQixFQUVuQixhQUErQixFQUM5QixRQUFtQixFQUVuQixzQkFBOEMsRUFFOUMsZ0JBQWtDLEVBRWxDLHVCQUF5RDtRQUVqRSxLQUFLLEVBQUUsQ0FBQztRQVhBLGFBQVEsR0FBUixRQUFRLENBQVU7UUFFbkIsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQzlCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFFbkIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUU5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRWxDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBa0M7UUFyQnJELGlCQUFZLEdBQVksSUFBSSxD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Q1gsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRTtLQUNyRDsyRkFFUSx1QkFBdUI7a0JBWG5DLFNBQVM7K0JBQ0ksa0JBQWtCLGFBR2pCO3dCQUNQLGVBQWUseUJBQXlCO3FCQUMzQyxpQkFDYzt3QkFDWCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFO3FCQUNyRDs7MEJBcUJJLFFBQVE7OzBCQUFJLElBQUk7OzBCQUdoQixJQUFJOzswQkFBSSxRQUFROzswQkFFaEIsUUFBUTs7MEJBQUksUUFBUTs7MEJBRXBCLFFBQVE7OzBCQUFJLFFBQVE7NENBekJzQixPQUFPO3NCQUFyRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXRCLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2VsZixcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1mb3JtL25ndC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RSYWRpb0J1dHRvbkNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vbmd0LXJhZGlvLWJ1dHRvbi1jb250YWluZXIvbmd0LXJhZGlvLWJ1dHRvbi1jb250YWluZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtcmFkaW8tYnV0dG9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LXJhZGlvLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LXJhZGlvLWJ1dHRvbi5jb21wb25lbnQuY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3RSYWRpb0J1dHRvbkNvbXBvbmVudCksXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSYWRpb0J1dHRvbkNvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKCdlbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaGluaW5nOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1NlbGVjdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc0Rpc2FibGVkOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC1ncmVlbi01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dDogc3RyaW5nO1xuXG4gICAgcHVibGljIG5ndFN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKVxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpXG4gICAgICAgIHByaXZhdGUgbmd0U3R5bGl6YWJsZURpcmVjdGl2ZTogTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtQ29tcG9uZW50OiBOZ3RGb3JtQ29tcG9uZW50LFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFJhZGlvQnV0dG9uQ29udGFpbmVyOiBOZ3RSYWRpb0J1dHRvbkNvbnRhaW5lckNvbXBvbmVudFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gc2hpbmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFJhZGlvQnV0dG9uQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm5ndFJhZGlvQnV0dG9uQ29udGFpbmVyLm9uQWN0aXZlUmFkaW9CdXR0b25DaGFuZ2Uuc3Vic2NyaWJlKChhY3RpdmVSYWRpb0J1dHRvbjogTmd0UmFkaW9CdXR0b25Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IChhY3RpdmVSYWRpb0J1dHRvbi5uYW1lID09PSB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZS5nZXROZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IG5ldyBOZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZ3RTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3RDaGVja2JveCcsIHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ3RleHQtZ3JheS01MDAnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ2JvcmRlci1ncmF5LTUwMCcsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY2hhbmdlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5uZ3RSYWRpb0J1dHRvbkNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMubmd0UmFkaW9CdXR0b25Db250YWluZXIuc2V0QWN0aXZlUmFkaW9CdXR0b24odGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25OYXRpdmVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlID8gdmFsdWUgOiAhdmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMubmd0UmFkaW9CdXR0b25Db250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMubmd0UmFkaW9CdXR0b25Db250YWluZXIuc2V0QWN0aXZlUmFkaW9CdXR0b24odGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG59XG4iLCI8bGFiZWwgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIge3sgaXNEaXNhYmxlZCB8fCAhaXNTZWxlY3RhYmxlID8gJ2N1cnNvci1ub3QtYWxsb3dlZCcgOiAnY3Vyc29yLXBvaW50ZXInIH19XCI+XG4gICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtuYW1lXT0nbmFtZScgY2xhc3M9XCJoaWRkZW5cIiAoW25nTW9kZWxdKT0ndmFsdWUnIFtkaXNhYmxlZF09J2lzRGlzYWJsZWQgfHwgIWlzU2VsZWN0YWJsZSdcbiAgICAgICAgI2VsZW1lbnQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwie3sgdmFsdWUgPyBuZ3RTdHlsZS5jb21waWxlKFsnY29sb3IuYm9yZGVyJywgJ2NvbG9yLnRleHQnXSkgOiAnYm9yZGVyLWdyYXktNTAwJyB9fVxuICAgICAgICAgICAgICAgICAgICBzaGFkb3cgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItZ3JheS00MDAge3sgIXNoaW5pbmcgPyAnZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXInIDogJ2hpZGRlbicgfX1cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxOXB4OyBoZWlnaHQ6IDE5cHg7XCI+XG4gICAgICAgIDxzdmcgKm5nSWY9XCJ2YWx1ZVwiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjkuMTA3IDI5LjEwN1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxM3B4OyBoZWlnaHQ6IDEzcHg7XCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMTQuNTU0IDBDNi41NjEgMCAwIDYuNTYyIDAgMTQuNTUyYzAgNy45OTYgNi41NjEgMTQuNTU1IDE0LjU1NCAxNC41NTUgNy45OTYgMCAxNC41NTMtNi41NTkgMTQuNTUzLTE0LjU1NUMyOS4xMDYgNi41NjIgMjIuNTUgMCAxNC41NTQgMHpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGFuICpuZ0lmPSdsYWJlbCAmJiAhc2hpbmluZycgY2xhc3M9XCJ0ZXh0LXNtIG1sLTJcIiBbY2xhc3MubGluZS10aHJvdWdoXT0nIWlzU2VsZWN0YWJsZSc+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPG5ndC1oZWxwZXIgKm5nSWY9XCJoZWxwVGV4dFwiIFtoZWxwVGl0bGVdPVwiaGVscFRpdGxlXCIgW2ljb25Db2xvcl09XCJoZWxwVGV4dENvbG9yXCIgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgIHt7IGhlbHBUZXh0IH19XG4gICAgPC9uZ3QtaGVscGVyPlxuPC9sYWJlbD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hpbmluZyc+XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwidy0xNiBoLTEyXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LXJhZGlvLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtcmFkaW8tYnV0dG9uL25ndC1yYWRpby1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LXJhZGlvLWJ1dHRvbi9uZ3QtcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsSUFBSSxFQUVKLEtBQUssRUFHTCxRQUFRLEVBRVIsSUFBSSxFQUVKLFFBQVEsRUFDUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7Ozs7QUFnQjVGLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxjQUFjO0lBaUJ2RCxZQUNZLGNBQWlDLEVBQ2pDLFFBQWtCLEVBRW5CLGFBQStCLEVBQzlCLFFBQW1CLEVBRW5CLHNCQUE4QyxFQUU5QyxPQUF5QixFQUUxQixVQUErQixFQUU5Qix1QkFBeUQ7UUFFakUsS0FBSyxFQUFFLENBQUM7UUFkQSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVuQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUVuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBRTlDLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBRTFCLGVB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YUFHakI7d0JBQ1AsZUFBZSx5QkFBeUI7cUJBQzNDLGlCQUNjO3dCQUNYLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUU7cUJBQ3JEOzswQkFzQkksUUFBUTs7MEJBQUksSUFBSTs7MEJBR2hCLElBQUk7OzBCQUFJLFFBQVE7OzBCQUVoQixRQUFROzswQkFBSSxRQUFROzswQkFFcEIsUUFBUTs7MEJBQUksUUFBUTs7MEJBRXBCLFFBQVE7OzBCQUFJLFFBQVE7NENBNUJzQixPQUFPO3NCQUFyRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXRCLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNlbGYsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBTa2lwU2VsZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1mb3JtL25ndC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LXNlY3Rpb24vbmd0LXNlY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFJhZGlvQnV0dG9uQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3QtcmFkaW8tYnV0dG9uLWNvbnRhaW5lci9uZ3QtcmFkaW8tYnV0dG9uLWNvbnRhaW5lci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1yYWRpby1idXR0b24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTmd0TWFrZVByb3ZpZGVyKE5ndFJhZGlvQnV0dG9uQ29tcG9uZW50KSxcbiAgICBdLFxuICAgIHZpZXdQcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5ndFJhZGlvQnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgTmd0QmFzZU5nTW9kZWwgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQFZpZXdDaGlsZCgnZWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hpbmluZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNTZWxlY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHRDb2xvcjogc3RyaW5nID0gJ3RleHQtZ3JlZW4tNTAwJztcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBuZ3RTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2U7XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RTdHlsaXphYmxlRGlyZWN0aXZlOiBOZ3RTdHlsaXphYmxlRGlyZWN0aXZlLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndEZvcm06IE5ndEZvcm1Db21wb25lbnQsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHB1YmxpYyBuZ3RTZWN0aW9uOiBOZ3RTZWN0aW9uQ29tcG9uZW50LFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFJhZGlvQnV0dG9uQ29udGFpbmVyOiBOZ3RSYWRpb0J1dHRvbkNvbnRhaW5lckNvbXBvbmVudFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndFJhZGlvQnV0dG9uQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm5ndFJhZGlvQnV0dG9uQ29udGFpbmVyLm9uQWN0aXZlUmFkaW9CdXR0b25DaGFuZ2Uuc3Vic2NyaWJlKChhY3RpdmVSYWRpb0J1dHRvbjogTmd0UmFkaW9CdXR0b25Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IChhY3RpdmVSYWRpb0J1dHRvbi5uYW1lID09PSB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZS5nZXROZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IG5ldyBOZ3RTdHlsaXphYmxlU2VydmljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZ3RTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3RDaGVja2JveCcsIHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ3RleHQtZ3JheS01MDAnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ2JvcmRlci1ncmF5LTUwMCcsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY2hhbmdlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJpbmRTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuaXNEaXNhYmxlZCAmJiAhY2hhbmdlcy5pc0Rpc2FibGVkLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gdGhpcy5uZ3RGb3JtPy5pc0Rpc2FibGVkIHx8IHRoaXMubmd0U2VjdGlvbj8uaXNEaXNhYmxlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm5ndFJhZGlvQnV0dG9uQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RSYWRpb0J1dHRvbkNvbnRhaW5lci5zZXRBY3RpdmVSYWRpb0J1dHRvbih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbk5hdGl2ZUNoYW5nZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6ICF2YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5uZ3RSYWRpb0J1dHRvbkNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5uZ3RSYWRpb0J1dHRvbkNvbnRhaW5lci5zZXRBY3RpdmVSYWRpb0J1dHRvbih0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0aGlzLm5ndEZvcm0/LmlzRGlzYWJsZWQgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0Rm9ybSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtLm9uSXNEaXNhYmxlZENoYW5nZS5zdWJzY3JpYmUoKGlzRGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZ3RTZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm5ndFNlY3Rpb24ub25Jc0Rpc2FibGVkQ2hhbmdlLnN1YnNjcmliZSgoaXNEaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gaXNEaXNhYmxlZCB8fCB0aGlzLm5ndEZvcm0/LmlzRGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cbiIsIjxsYWJlbFxuICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHt7IGlzRGlzYWJsZWQgfHwgIWlzU2VsZWN0YWJsZSA/ICdjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCcgOiAnY3Vyc29yLXBvaW50ZXInIH19XCI+XG4gICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtuYW1lXT0nbmFtZScgY2xhc3M9XCJoaWRkZW5cIiAoW25nTW9kZWxdKT0ndmFsdWUnIFtkaXNhYmxlZF09J2lzRGlzYWJsZWQgfHwgIWlzU2VsZWN0YWJsZSdcbiAgICAgICAgI2VsZW1lbnQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwie3sgdmFsdWUgPyBuZ3RTdHlsZS5jb21waWxlKFsnY29sb3IuYm9yZGVyJywgJ2NvbG9yLnRleHQnXSkgOiAnYm9yZGVyLWdyYXktNTAwJyB9fVxuICAgICAgICAgICAgICAgICAgICBzaGFkb3cgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItZ3JheS00MDAge3sgIXNoaW5pbmcgPyAnZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXInIDogJ2hpZGRlbicgfX1cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxOXB4OyBoZWlnaHQ6IDE5cHg7XCI+XG4gICAgICAgIDxzdmcgKm5nSWY9XCJ2YWx1ZVwiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjkuMTA3IDI5LjEwN1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxM3B4OyBoZWlnaHQ6IDEzcHg7XCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMTQuNTU0IDBDNi41NjEgMCAwIDYuNTYyIDAgMTQuNTUyYzAgNy45OTYgNi41NjEgMTQuNTU1IDE0LjU1NCAxNC41NTUgNy45OTYgMCAxNC41NTMtNi41NTkgMTQuNTUzLTE0LjU1NUMyOS4xMDYgNi41NjIgMjIuNTUgMCAxNC41NTQgMHpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGFuICpuZ0lmPSdsYWJlbCAmJiAhc2hpbmluZycgY2xhc3M9XCJ0ZXh0LXNtIG1sLTJcIiBbY2xhc3MubGluZS10aHJvdWdoXT0nIWlzU2VsZWN0YWJsZSc+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPG5ndC1oZWxwZXIgKm5nSWY9XCJoZWxwVGV4dFwiIFtoZWxwVGl0bGVdPVwiaGVscFRpdGxlXCIgW2ljb25Db2xvcl09XCJoZWxwVGV4dENvbG9yXCIgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgIHt7IGhlbHBUZXh0IH19XG4gICAgPC9uZ3QtaGVscGVyPlxuPC9sYWJlbD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hpbmluZyc+XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwidy0xNiBoLTEyXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPiJdfQ==