@sumaris-net/ngx-components 18.2.31 → 18.2.32
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.
- package/doc/changelog.md +1031 -1028
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +1 -1
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +1 -1
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +3 -3
- package/esm2022/src/app/core/peer/select-peer.module.mjs +1 -1
- package/esm2022/src/app/core/services/config/core.config.mjs +1 -1
- package/esm2022/src/app/core/services/model/node-feature.model.mjs +1 -1
- package/esm2022/src/app/core/services/model/peer.model.mjs +1 -1
- package/esm2022/src/app/core/services/network.service.mjs +1 -1
- package/esm2022/src/app/core/services/network.utils.mjs +1 -1
- package/esm2022/src/app/core/services/storage/entity-store.class.mjs +1 -1
- package/esm2022/src/app/core/table/testing/table.testing.mjs +3 -3
- package/esm2022/src/app/shared/forms.mjs +1 -1
- package/esm2022/src/app/shared/inputs.mjs +1 -1
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +3 -3
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +3 -3
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +1 -1
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +5 -3
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +1 -1
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
- package/esm2022/src/app/shared/material/material.animations.mjs +1 -1
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +1 -1
- package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +1 -1
- package/esm2022/src/app/shared/validator/validators.mjs +1 -1
- package/esm2022/src/environments/environment.class.mjs +1 -1
- package/esm2022/src/environments/environment.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +14 -12
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/assets/i18n/en-US.json +735 -735
- package/src/assets/i18n/en.json +734 -734
- package/src/assets/i18n/fr.json +734 -734
- package/src/assets/manifest.json +17 -17
- package/src/theme/_material.scss +213 -213
- package/src/theme/_ngx-components.scss +955 -955
- package/src/theme/_ngx-components.table.scss +597 -597
|
@@ -279,11 +279,11 @@ export class MatBooleanField {
|
|
|
279
279
|
.concat(this.fakeInput ? [this.fakeInput.nativeElement] : []);
|
|
280
280
|
}
|
|
281
281
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatBooleanField, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
282
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatBooleanField, selector: "mat-boolean-field", inputs: { disabled: ["disabled", "disabled", booleanAttribute], formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: ["readonly", "readonly", booleanAttribute], required: ["required", "required", booleanAttribute], compact: ["compact", "compact", booleanAttribute], style: "style", buttonsColCount: ["buttonsColCount", "buttonsColCount", numberAttribute], classList: ["class", "classList"], yesLabel: "yesLabel", noLabel: "noLabel", showButtonIcons: ["showButtonIcons", "showButtonIcons", booleanAttribute], yesIcon: "yesIcon", noIcon: "noIcon", clearable: ["clearable", "clearable", booleanAttribute], labelPosition: "labelPosition", tabindex: ["tabindex", "tabindex", numberAttribute], showRadio: ["showRadio", "showRadio", booleanAttribute], value: "value" }, outputs: { keyupEnter: "keyup.enter", focussed: "focus", blurred: "blur" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }, { propertyName: "yesRadioButton", first: true, predicate: ["yesRadioButton"], descendants: true }, { propertyName: "noRadioButton", first: true, predicate: ["noRadioButton"], descendants: true }, { propertyName: "checkboxButton", first: true, predicate: ["checkboxButton"], descendants: true }], ngImport: i0, template: "@if (readonly) {\r\n <mat-form-field\r\n [floatLabel]=\"floatLabel | asFloatLabelType\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-form-field-disabled {{ classList }}\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label>{{ placeholder }}</mat-label>\r\n }\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\r\n <ion-text>\r\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\r\n </ion-text>\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n} @else {\r\n @switch (style) {\r\n <!-- Radio -->\r\n @case ('radio') {\r\n <mat-form-field\r\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label [title]=\"placeholder\">\r\n {{ placeholder }}\r\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\r\n </mat-label>\r\n }\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input\r\n matInput\r\n #fakeInput\r\n type=\"text\"\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.arrowLeft)=\"toggleValue($event)\"\r\n (keyup.arrowRight)=\"toggleValue($event)\"\r\n (keyup.arrowUp)=\"toggleValue($event)\"\r\n (keyup.arrowDown)=\"toggleValue($event)\"\r\n [required]=\"required\"\r\n [class.cdk-visually-hidden]=\"showRadio\"\r\n [tabindex]=\"tabindex\"\r\n />\r\n\r\n <!-- radio button -->\r\n <mat-radio-group\r\n [class.cdk-visually-hidden]=\"!showRadio\"\r\n [formControl]=\"formControl\"\r\n (change)=\"onRadioValueChanged($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n >\r\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\r\n <span>{{ yesLabel | translate }}</span>\r\n </mat-radio-button>\r\n \r\n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\r\n <span>{{ noLabel | translate }}</span>\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n (click)=\"clearValue($event)\"\r\n [hidden]=\"_value | isNil\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case ('checkbox') {\r\n <mat-form-field\r\n floatLabel=\"always\"\r\n [appearance]=\"appearance\"\r\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\r\n >\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input\r\n matInput\r\n #fakeInput\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n [required]=\"required\"\r\n [class.cdk-visually-hidden]=\"showRadio\"\r\n [tabindex]=\"tabindex\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n />\r\n\r\n <!-- checkbox, when compact -->\r\n <mat-checkbox\r\n #checkboxButton\r\n [formControl]=\"formControl\"\r\n [indeterminate]=\"value | isNil\"\r\n [class.cdk-visually-hidden]=\"!showRadio\"\r\n [labelPosition]=\"labelPosition\"\r\n [title]=\"placeholder || ''\"\r\n [tabIndex]=\"-1\"\r\n (change)=\"onCheckboxValueChanged($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n {{ placeholder || '' }}\r\n }\r\n </mat-checkbox>\r\n\r\n @if (floatLabel === 'never' || !placeholder) {\r\n <mat-label> </mat-label>\r\n }\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n (click)=\"clearValue($event)\"\r\n [hidden]=\"_value | isNil\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Buttons -->\r\n @case ('button') {\r\n <mat-form-field\r\n [floatLabel]=\"'always'\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\r\n >\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\r\n } @else {\r\n <mat-label> </mat-label>\r\n }\r\n\r\n <input\r\n #fakeInput\r\n matInput\r\n type=\"text\"\r\n class=\"cdk-visually-hidden\"\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.arrowLeft)=\"toggleValue($event)\"\r\n (keyup.arrowRight)=\"toggleValue($event)\"\r\n (keyup.arrowUp)=\"toggleValue($event)\"\r\n (keyup.arrowDown)=\"toggleValue($event)\"\r\n [required]=\"required\"\r\n [tabindex]=\"_tabindex\"\r\n />\r\n @if (formControl.disabled) {\r\n <ion-text>\r\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\r\n </ion-text>\r\n } @else {\r\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\r\n <!-- yes -->\r\n <ion-button\r\n #yesButton\r\n class=\"mat-form-field-button\"\r\n [tabIndex]=\"-1\"\r\n (click)=\"writeValue(true, $event)\"\r\n (keyup.enter)=\"writeValue(true, $event)\"\r\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\r\n >\r\n @if (showButtonIcons && yesIcon; as icon) {\r\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\r\n }\r\n {{ yesLabel | translate }}\r\n </ion-button>\r\n\r\n <!-- No button -->\r\n <ion-button\r\n #noButton\r\n class=\"mat-form-field-button\"\r\n [tabIndex]=\"-1\"\r\n (click)=\"writeValue(false, $event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.enter)=\"writeValue(false, $event)\"\r\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\r\n >\r\n @if (showButtonIcons && noIcon; as icon) {\r\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\r\n }\r\n {{ noLabel | translate }}\r\n </ion-button>\r\n </div>\r\n }\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <ion-button\r\n matSuffix\r\n fill=\"clear\"\r\n size=\"small\"\r\n color=\"medium\"\r\n tabindex=\"-1\"\r\n (click)=\"clearValue($event)\"\r\n [class.cdk-visually-hidden]=\"_value | isNil\"\r\n >\r\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\r\n </ion-button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n }\r\n}\r\n\r\n<ng-template #matPrefixTemplate>\r\n <ng-content select=\"[matPrefix]\"></ng-content>\r\n</ng-template>\r\n<ng-template #matSuffixTemplate>\r\n <ng-content select=\"[matSuffix]\"></ng-content>\r\n</ng-template>\r\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);text-transform:capitalize;white-space:normal;margin:0!important;padding-inline-end:var(--button-padding-end)!important;padding-bottom:var(--button-padding-end)!important;height:var(--mat-mdc-form-field-height, 40px)}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i6.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i11.IsNilPipe, name: "isNil" }, { kind: "pipe", type: i12.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
282
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatBooleanField, selector: "mat-boolean-field", inputs: { disabled: ["disabled", "disabled", booleanAttribute], formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: ["readonly", "readonly", booleanAttribute], required: ["required", "required", booleanAttribute], compact: ["compact", "compact", booleanAttribute], style: "style", buttonsColCount: ["buttonsColCount", "buttonsColCount", numberAttribute], classList: ["class", "classList"], yesLabel: "yesLabel", noLabel: "noLabel", showButtonIcons: ["showButtonIcons", "showButtonIcons", booleanAttribute], yesIcon: "yesIcon", noIcon: "noIcon", clearable: ["clearable", "clearable", booleanAttribute], labelPosition: "labelPosition", tabindex: ["tabindex", "tabindex", numberAttribute], showRadio: ["showRadio", "showRadio", booleanAttribute], value: "value" }, outputs: { keyupEnter: "keyup.enter", focussed: "focus", blurred: "blur" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }, { propertyName: "yesRadioButton", first: true, predicate: ["yesRadioButton"], descendants: true }, { propertyName: "noRadioButton", first: true, predicate: ["noRadioButton"], descendants: true }, { propertyName: "checkboxButton", first: true, predicate: ["checkboxButton"], descendants: true }], ngImport: i0, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n (blur)=\"onBlurInput($event)\"\n >\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\n <span>{{ yesLabel | translate }}</span>\n </mat-radio-button>\n \n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\n <span>{{ noLabel | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Checkbox -->\n @case ('checkbox') {\n <mat-form-field\n floatLabel=\"always\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n />\n\n <!-- checkbox, when compact -->\n <mat-checkbox\n #checkboxButton\n [formControl]=\"formControl\"\n [indeterminate]=\"value | isNil\"\n [class.cdk-visually-hidden]=\"!showRadio\"\n [labelPosition]=\"labelPosition\"\n [title]=\"placeholder || ''\"\n [tabIndex]=\"-1\"\n (change)=\"onCheckboxValueChanged($event)\"\n (blur)=\"onBlurInput($event)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n {{ placeholder || '' }}\n }\n </mat-checkbox>\n\n @if (floatLabel === 'never' || !placeholder) {\n <mat-label> </mat-label>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Buttons -->\n @case ('button') {\n <mat-form-field\n [floatLabel]=\"'always'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n } @else {\n <mat-label> </mat-label>\n }\n\n <input\n #fakeInput\n matInput\n type=\"text\"\n class=\"cdk-visually-hidden\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [tabindex]=\"_tabindex\"\n />\n @if (formControl.disabled) {\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n } @else {\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n <!-- yes -->\n <ion-button\n #yesButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && yesIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ yesLabel | translate }}\n </ion-button>\n\n <!-- No button -->\n <ion-button\n #noButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(false, $event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && noIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ noLabel | translate }}\n </ion-button>\n </div>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <ion-button\n matSuffix\n fill=\"clear\"\n size=\"small\"\n color=\"medium\"\n tabindex=\"-1\"\n (click)=\"clearValue($event)\"\n [class.cdk-visually-hidden]=\"_value | isNil\"\n >\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);text-transform:capitalize;white-space:normal;margin:0!important;padding-inline-end:var(--button-padding-end)!important;padding-bottom:var(--button-padding-end)!important;height:var(--mat-mdc-form-field-height, 40px)}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i6.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i11.IsNilPipe, name: "isNil" }, { kind: "pipe", type: i12.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
283
283
|
}
|
|
284
284
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatBooleanField, decorators: [{
|
|
285
285
|
type: Component,
|
|
286
|
-
args: [{ selector: 'mat-boolean-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (readonly) {\r\n <mat-form-field\r\n [floatLabel]=\"floatLabel | asFloatLabelType\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-form-field-disabled {{ classList }}\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label>{{ placeholder }}</mat-label>\r\n }\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\r\n <ion-text>\r\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\r\n </ion-text>\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n} @else {\r\n @switch (style) {\r\n <!-- Radio -->\r\n @case ('radio') {\r\n <mat-form-field\r\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label [title]=\"placeholder\">\r\n {{ placeholder }}\r\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\r\n </mat-label>\r\n }\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input\r\n matInput\r\n #fakeInput\r\n type=\"text\"\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.arrowLeft)=\"toggleValue($event)\"\r\n (keyup.arrowRight)=\"toggleValue($event)\"\r\n (keyup.arrowUp)=\"toggleValue($event)\"\r\n (keyup.arrowDown)=\"toggleValue($event)\"\r\n [required]=\"required\"\r\n [class.cdk-visually-hidden]=\"showRadio\"\r\n [tabindex]=\"tabindex\"\r\n />\r\n\r\n <!-- radio button -->\r\n <mat-radio-group\r\n [class.cdk-visually-hidden]=\"!showRadio\"\r\n [formControl]=\"formControl\"\r\n (change)=\"onRadioValueChanged($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n >\r\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\r\n <span>{{ yesLabel | translate }}</span>\r\n </mat-radio-button>\r\n \r\n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\r\n <span>{{ noLabel | translate }}</span>\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n (click)=\"clearValue($event)\"\r\n [hidden]=\"_value | isNil\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Checkbox -->\r\n @case ('checkbox') {\r\n <mat-form-field\r\n floatLabel=\"always\"\r\n [appearance]=\"appearance\"\r\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\r\n >\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n <input\r\n matInput\r\n #fakeInput\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n [required]=\"required\"\r\n [class.cdk-visually-hidden]=\"showRadio\"\r\n [tabindex]=\"tabindex\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n />\r\n\r\n <!-- checkbox, when compact -->\r\n <mat-checkbox\r\n #checkboxButton\r\n [formControl]=\"formControl\"\r\n [indeterminate]=\"value | isNil\"\r\n [class.cdk-visually-hidden]=\"!showRadio\"\r\n [labelPosition]=\"labelPosition\"\r\n [title]=\"placeholder || ''\"\r\n [tabIndex]=\"-1\"\r\n (change)=\"onCheckboxValueChanged($event)\"\r\n (blur)=\"onBlurInput($event)\"\r\n >\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n {{ placeholder || '' }}\r\n }\r\n </mat-checkbox>\r\n\r\n @if (floatLabel === 'never' || !placeholder) {\r\n <mat-label> </mat-label>\r\n }\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n (click)=\"clearValue($event)\"\r\n [hidden]=\"_value | isNil\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Buttons -->\r\n @case ('button') {\r\n <mat-form-field\r\n [floatLabel]=\"'always'\"\r\n [appearance]=\"appearance\"\r\n [subscriptSizing]=\"subscriptSizing\"\r\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\r\n >\r\n <div matPrefix>\r\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\r\n </div>\r\n\r\n @if (floatLabel !== 'never' && !!placeholder) {\r\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\r\n } @else {\r\n <mat-label> </mat-label>\r\n }\r\n\r\n <input\r\n #fakeInput\r\n matInput\r\n type=\"text\"\r\n class=\"cdk-visually-hidden\"\r\n readonly=\"true\"\r\n [formControl]=\"formControl\"\r\n (focus)=\"onFocusFakeInput($event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.arrowLeft)=\"toggleValue($event)\"\r\n (keyup.arrowRight)=\"toggleValue($event)\"\r\n (keyup.arrowUp)=\"toggleValue($event)\"\r\n (keyup.arrowDown)=\"toggleValue($event)\"\r\n [required]=\"required\"\r\n [tabindex]=\"_tabindex\"\r\n />\r\n @if (formControl.disabled) {\r\n <ion-text>\r\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\r\n </ion-text>\r\n } @else {\r\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\r\n <!-- yes -->\r\n <ion-button\r\n #yesButton\r\n class=\"mat-form-field-button\"\r\n [tabIndex]=\"-1\"\r\n (click)=\"writeValue(true, $event)\"\r\n (keyup.enter)=\"writeValue(true, $event)\"\r\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\r\n >\r\n @if (showButtonIcons && yesIcon; as icon) {\r\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\r\n }\r\n {{ yesLabel | translate }}\r\n </ion-button>\r\n\r\n <!-- No button -->\r\n <ion-button\r\n #noButton\r\n class=\"mat-form-field-button\"\r\n [tabIndex]=\"-1\"\r\n (click)=\"writeValue(false, $event)\"\r\n (keydown.space)=\"toggleValue($event)\"\r\n (keyup.enter)=\"writeValue(false, $event)\"\r\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\r\n >\r\n @if (showButtonIcons && noIcon; as icon) {\r\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\r\n }\r\n {{ noLabel | translate }}\r\n </ion-button>\r\n </div>\r\n }\r\n\r\n @if (formControl.hasError('required')) {\r\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\r\n }\r\n\r\n @if (clearable) {\r\n <ion-button\r\n matSuffix\r\n fill=\"clear\"\r\n size=\"small\"\r\n color=\"medium\"\r\n tabindex=\"-1\"\r\n (click)=\"clearValue($event)\"\r\n [class.cdk-visually-hidden]=\"_value | isNil\"\r\n >\r\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\r\n </ion-button>\r\n }\r\n\r\n <div matSuffix>\r\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\r\n </div>\r\n </mat-form-field>\r\n }\r\n }\r\n}\r\n\r\n<ng-template #matPrefixTemplate>\r\n <ng-content select=\"[matPrefix]\"></ng-content>\r\n</ng-template>\r\n<ng-template #matSuffixTemplate>\r\n <ng-content select=\"[matSuffix]\"></ng-content>\r\n</ng-template>\r\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);text-transform:capitalize;white-space:normal;margin:0!important;padding-inline-end:var(--button-padding-end)!important;padding-bottom:var(--button-padding-end)!important;height:var(--mat-mdc-form-field-height, 40px)}\n"] }]
|
|
286
|
+
args: [{ selector: 'mat-boolean-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (blur)=\"onBlurInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n (blur)=\"onBlurInput($event)\"\n >\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\n <span>{{ yesLabel | translate }}</span>\n </mat-radio-button>\n \n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\n <span>{{ noLabel | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Checkbox -->\n @case ('checkbox') {\n <mat-form-field\n floatLabel=\"always\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n readonly=\"true\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n />\n\n <!-- checkbox, when compact -->\n <mat-checkbox\n #checkboxButton\n [formControl]=\"formControl\"\n [indeterminate]=\"value | isNil\"\n [class.cdk-visually-hidden]=\"!showRadio\"\n [labelPosition]=\"labelPosition\"\n [title]=\"placeholder || ''\"\n [tabIndex]=\"-1\"\n (change)=\"onCheckboxValueChanged($event)\"\n (blur)=\"onBlurInput($event)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n {{ placeholder || '' }}\n }\n </mat-checkbox>\n\n @if (floatLabel === 'never' || !placeholder) {\n <mat-label> </mat-label>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Buttons -->\n @case ('button') {\n <mat-form-field\n [floatLabel]=\"'always'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n } @else {\n <mat-label> </mat-label>\n }\n\n <input\n #fakeInput\n matInput\n type=\"text\"\n class=\"cdk-visually-hidden\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [tabindex]=\"_tabindex\"\n />\n @if (formControl.disabled) {\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n } @else {\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n <!-- yes -->\n <ion-button\n #yesButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && yesIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ yesLabel | translate }}\n </ion-button>\n\n <!-- No button -->\n <ion-button\n #noButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(false, $event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && noIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ noLabel | translate }}\n </ion-button>\n </div>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <ion-button\n matSuffix\n fill=\"clear\"\n size=\"small\"\n color=\"medium\"\n tabindex=\"-1\"\n (click)=\"clearValue($event)\"\n [class.cdk-visually-hidden]=\"_value | isNil\"\n >\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);text-transform:capitalize;white-space:normal;margin:0!important;padding-inline-end:var(--button-padding-end)!important;padding-bottom:var(--button-padding-end)!important;height:var(--mat-mdc-form-field-height, 40px)}\n"] }]
|
|
287
287
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.FormGroupDirective, decorators: [{
|
|
288
288
|
type: Optional
|
|
289
289
|
}] }], propDecorators: { fakeInput: [{
|
|
@@ -364,4 +364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
364
364
|
type: Output,
|
|
365
365
|
args: ['blur']
|
|
366
366
|
}] } });
|
|
367
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxlQUFlLEVBR2YsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQUVwQyxNQUFNLHNCQUFzQixHQUFhO0lBQ3ZDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDOUMsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBU3RCLE1BQU0sT0FBTyxlQUFlO0lBdUZoQjtJQUNFO0lBQ1U7SUF4RmQsaUJBQWlCLEdBQXFCLElBQUksQ0FBQztJQUMzQyxrQkFBa0IsR0FBZSxJQUFJLENBQUM7SUFDN0IsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDNUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVmLE1BQU0sQ0FBVTtJQUNoQixTQUFT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c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLEtBQUs7c0JBQWIsS0FBSztnQkFDaUMsZUFBZTtzQkFBckQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBRXJCLFNBQVM7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFDTCxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDa0MsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDa0MsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFFcUMsUUFBUTtzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBWWpDLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFvQmxDLEtBQUs7c0JBRFIsS0FBSztnQkFZaUIsVUFBVTtzQkFBaEMsTUFBTTt1QkFBQyxhQUFhO2dCQUVKLFFBQVE7c0JBQXhCLE1BQU07dUJBQUMsT0FBTztnQkFFQyxPQUFPO3NCQUF0QixNQUFNO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgbnVtYmVyQXR0cmlidXRlLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFByb3ZpZGVyLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdFJhZGlvQnV0dG9uLCBNYXRSYWRpb0NoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3gsIE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xyXG5pbXBvcnQgeyBpc05pbCwgaXNOb3ROaWwsIHRvTnVtYmVyIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUgfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5jb25zdCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNYXRCb29sZWFuRmllbGQpLFxyXG4gIG11bHRpOiB0cnVlLFxyXG59O1xyXG5cclxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtYXQtYm9vbGVhbi1maWVsZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmJvb2xlYW4uaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwuYm9vbGVhbi5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUl0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRCb29sZWFuRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJbnB1dEVsZW1lbnQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XHJcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIF93cml0aW5nID0gZmFsc2U7XHJcblxyXG4gIHByb3RlY3RlZCBfdmFsdWU6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF90YWJpbmRleDogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfc2hvd1JhZGlvID0gZmFsc2U7IC8vIFdpbGwgYmUgY2hhbmdlZCB3aGVuIGZvY3VzIGluXHJcbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Zha2VJbnB1dCcpIGZha2VJbnB1dDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd5ZXNSYWRpb0J1dHRvbicpIHllc1JhZGlvQnV0dG9uOiBNYXRSYWRpb0J1dHRvbjtcclxuICBAVmlld0NoaWxkKCdub1JhZGlvQnV0dG9uJykgbm9SYWRpb0J1dHRvbjogTWF0UmFkaW9CdXR0b247XHJcbiAgQFZpZXdDaGlsZCgnY2hlY2tib3hCdXR0b24nKSBjaGVja2JveEJ1dHRvbjogTWF0Q2hlY2tib3g7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcclxuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xyXG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkb25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb21wYWN0ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc3R5bGU6ICdyYWRpbycgfCAnY2hlY2tib3gnIHwgJ2J1dHRvbic7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgYnV0dG9uc0NvbENvdW50OiBudW1iZXI7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgeWVzTGFiZWwgPSAnQ09NTU9OLllFUyc7XHJcbiAgQElucHV0KCkgbm9MYWJlbCA9ICdDT01NT04uTk8nO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QnV0dG9uSWNvbnMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHllc0ljb24gPSAnY2hlY2ttYXJrJztcclxuICBASW5wdXQoKSBub0ljb24gPSAnY2xvc2UnO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAnYWZ0ZXInIHwgJ2JlZm9yZScgPSAnYWZ0ZXInO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xyXG4gICAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlVGFiSW5kZXgoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIHNldCBzaG93UmFkaW8odjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fc2hvd1JhZGlvKSB7XHJcbiAgICAgIHRoaXMuX3Nob3dSYWRpbyA9IHY7XHJcbiAgICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd1JhZGlvKCk6IGFueSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLl9zaG93UmFkaW8gfHxcclxuICAgICAgdGhpcy5fZm9jdXNlZCB8fFxyXG4gICAgICB0aGlzLmZsb2F0TGFiZWwgPT09ICdhbHdheXMnIHx8XHJcbiAgICAgIHRoaXMuZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyB8fFxyXG4gICAgICB0aGlzLnN0eWxlID09PSAnY2hlY2tib3gnIHx8XHJcbiAgICAgIGlzTm90TmlsKHRoaXMuX3ZhbHVlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHY6IGFueSkge1xyXG4gICAgaWYgKHYgIT09IHRoaXMuX3ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXgsQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcclxuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICBAT3V0cHV0KCdmb2N1cycpIGZvY3Vzc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gIEBPdXRwdXQoJ2JsdXInKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmVcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbCA9XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XHJcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtYm9vbGVhbi1maWVsZD4uXCIpO1xyXG5cclxuICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN0eWxlIHx8ICh0aGlzLmNvbXBhY3QgPyAnY2hlY2tib3gnIDogJ3JhZGlvJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuc3R5bGUgPT09ICdidXR0b24nKSB7XHJcbiAgICAgIHRoaXMuYnV0dG9uc0NvbENvdW50ID0gdG9OdW1iZXIodGhpcy5idXR0b25zQ29sQ291bnQsIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy53cml0ZVZhbHVlKHZhbHVlKSkpO1xyXG5cclxuICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XHJcbiAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYmx1cnJlZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55LCBldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuO1xyXG5cclxuICAgIC8vIERFQlVHXHJcbiAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtYm9vbGVhbi1maWVsZF0gV3JpdGluZyB2YWx1ZScsIHZhbHVlKTtcclxuXHJcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fdmFsdWUgfHwgdmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy55ZXNSYWRpb0J1dHRvbikge1xyXG4gICAgICAgIHRoaXMueWVzUmFkaW9CdXR0b24uY2hlY2tlZCA9IHZhbHVlID09PSB0cnVlO1xyXG4gICAgICAgIHRoaXMubm9SYWRpb0J1dHRvbi5jaGVja2VkID0gdmFsdWUgPT09IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tib3hCdXR0b24pIHtcclxuICAgICAgICBpZiAoaXNOaWwodmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmNoZWNrZWQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcclxuICAgICAgaWYgKGV2ZW50KSB0aGlzLmtleXVwRW50ZXIuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25Gb2N1c0Zha2VJbnB1dChldmVudDogRm9jdXNFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dSYWRpbykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgLy8gSGlkZSB0aGUgZmFrZSBpbnB1dFxyXG4gICAgICB0aGlzLmZha2VJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9jdXMgb24gZmlyc3QgYnV0dG9uXHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25CbHVySW5wdXQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcclxuICAgIGNvbnN0IGludGVybmFsRXZlbnQgPSB0aGlzLmlucHV0c0VsZW1lbnRzLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldCk7XHJcbiAgICBpZiAoIWludGVybmFsRXZlbnQpIHtcclxuICAgICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XHJcbiAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1cygpIHtcclxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm47IC8vIEFscmVhZHkgZm9jdXNlZFxyXG5cclxuICAgIHRoaXMuX2ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcclxuICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25SYWRpb1ZhbHVlQ2hhbmdlZChldmVudDogTWF0UmFkaW9DaGFuZ2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXHJcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShldmVudC52YWx1ZSk7XHJcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25DaGVja2JveFZhbHVlQ2hhbmdlZChldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXHJcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShldmVudC5jaGVja2VkKTtcclxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVWYWx1ZShldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxyXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl92YWx1ZSA9ICF0aGlzLl92YWx1ZTtcclxuICAgIGlmICh0aGlzLnllc1JhZGlvQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMueWVzUmFkaW9CdXR0b24uY2hlY2tlZCA9IHRoaXMuX3ZhbHVlO1xyXG4gICAgICB0aGlzLm5vUmFkaW9CdXR0b24uY2hlY2tlZCA9ICF0aGlzLl92YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveEJ1dHRvbikge1xyXG4gICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmNoZWNrZWQgPSB0aGlzLl92YWx1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XHJcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuX3ZhbHVlKTtcclxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXHJcblxyXG4gIHByaXZhdGUgZW1pdENoYW5nZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXHJcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgY29udHJvbHNcclxuICAgICAgdGhpcy5fY2hlY2tJZlRvdWNoZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NoZWNrSWZUb3VjaGVkKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xyXG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdy9IaWRlIHRoZSBmYWtlIGlucHV0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVGYWtlSW5wdXQoKSB7XHJcbiAgICBpZiAodGhpcy5zaG93UmFkaW8gfHwgdGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcclxuICAgICAgdGhpcy5mYWtlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mYWtlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlLCB0aGlzIGNvbXBvbmVudCBoYXMgYSB0ZW1wb3JhcnkgY29tcG9uZW50IGRpc3BsYXllZCBiZWZvcmUgdGhlIGZpcnN0IGZvY3VzIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWJJbmRleCgpIHtcclxuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5mYWtlSW5wdXQpIHtcclxuICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IHRoaXMuX3RhYmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcclxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhclZhbHVlKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcclxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgcmFkaW9CdXR0b25FbGVtZW50cygpOiBIVE1MRWxlbWVudFtdIHtcclxuICAgIHJldHVybiB0aGlzLnllc1JhZGlvQnV0dG9uID8gW3RoaXMueWVzUmFkaW9CdXR0b24sIHRoaXMubm9SYWRpb0J1dHRvbl0ubWFwKChiKSA9PiBiLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCkgOiBbXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgaW5wdXRzRWxlbWVudHMoKTogSFRNTEVsZW1lbnRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yYWRpb0J1dHRvbkVsZW1lbnRzXHJcbiAgICAgIC5jb25jYXQodGhpcy5jaGVja2JveEJ1dHRvbiA/IFt0aGlzLmNoZWNrYm94QnV0dG9uLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudF0gOiBbXSlcclxuICAgICAgLmNvbmNhdCh0aGlzLmZha2VJbnB1dCA/IFt0aGlzLmZha2VJbnB1dC5uYXRpdmVFbGVtZW50XSA6IFtdKTtcclxuICB9XHJcbn1cclxuIiwiQGlmIChyZWFkb25seSkge1xyXG4gIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxyXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXHJcbiAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIHt7IGNsYXNzTGlzdCB9fVwiXHJcbiAgPlxyXG4gICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcclxuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxyXG4gICAgfVxyXG4gICAgPGRpdiBtYXRQcmVmaXg+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cclxuICAgIDxpb24tdGV4dD5cclxuICAgICAge3sgKHZhbHVlID09PSBudWxsID8gJ0NPTU1PTi5FTVBUWV9PUFRJT04nIDogdmFsdWUgPT09IHRydWUgPyB5ZXNMYWJlbCA6IG5vTGFiZWwpIHwgdHJhbnNsYXRlIH19XHJcbiAgICA8L2lvbi10ZXh0PlxyXG4gICAgPGRpdiBtYXRTdWZmaXg+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxufSBAZWxzZSB7XHJcbiAgQHN3aXRjaCAoc3R5bGUpIHtcclxuICAgIDwhLS0gUmFkaW8gLS0+XHJcbiAgICBAY2FzZSAoJ3JhZGlvJykge1xyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBbZmxvYXRMYWJlbF09XCJzaG93UmFkaW8gJiYgKCFmbG9hdExhYmVsIHx8IGZsb2F0TGFiZWwgPT09ICdhdXRvJykgPyAnYWx3YXlzJyA6IChmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZSlcIlxyXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxyXG4gICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcclxuICAgICAgICBjbGFzcz1cIm1hdC1ib29sZWFuLWZpZWxkIG1hdC1ib29sZWFuLWZpZWxkLXJhZGlvIHt7IGNsYXNzTGlzdCB9fVwiXHJcbiAgICAgID5cclxuICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgPG1hdC1sYWJlbCBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cclxuICAgICAgICAgICAgPHNwYW4gW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwic2hvd1JhZGlvXCI+KHt7IHllc0xhYmVsIHwgdHJhbnNsYXRlIH19L3t7IG5vTGFiZWwgfCB0cmFuc2xhdGUgfX0pPC9zcGFuPlxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxkaXYgbWF0UHJlZml4PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgI2Zha2VJbnB1dFxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcclxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1c0Zha2VJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cklucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dMZWZ0KT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgKGtleXVwLmFycm93UmlnaHQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dVcCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwic2hvd1JhZGlvXCJcclxuICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPCEtLSByYWRpbyBidXR0b24gLS0+XHJcbiAgICAgICAgPG1hdC1yYWRpby1ncm91cFxyXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dSYWRpb1wiXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvVmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVySW5wdXQoJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gI3llc1JhZGlvQnV0dG9uIFt2YWx1ZV09XCJ0cnVlXCIgdGFiSW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyB5ZXNMYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gI25vUmFkaW9CdXR0b24gW3ZhbHVlXT1cImZhbHNlXCIgdGFiSW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG5cclxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGlmIChjbGVhcmFibGUpIHtcclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cIl92YWx1ZSB8IGlzTmlsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIENoZWNrYm94IC0tPlxyXG4gICAgQGNhc2UgKCdjaGVja2JveCcpIHtcclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgZmxvYXRMYWJlbD1cImFsd2F5c1wiXHJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtYm9vbGVhbi1maWVsZCBtYXQtYm9vbGVhbi1maWVsZC1jaGVja2JveCB7eyBjbGFzc0xpc3QgfX1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBtYXRQcmVmaXg+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAjZmFrZUlucHV0XHJcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcclxuICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJzaG93UmFkaW9cIlxyXG4gICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzRmFrZUlucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPCEtLSBjaGVja2JveCwgd2hlbiBjb21wYWN0IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICNjaGVja2JveEJ1dHRvblxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcclxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInZhbHVlIHwgaXNOaWxcIlxyXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dSYWRpb1wiXHJcbiAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCJsYWJlbFBvc2l0aW9uXCJcclxuICAgICAgICAgIFt0aXRsZV09XCJwbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICBbdGFiSW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVySW5wdXQoJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfHwgJycgfX1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuXHJcbiAgICAgICAgQGlmIChmbG9hdExhYmVsID09PSAnbmV2ZXInIHx8ICFwbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgPG1hdC1sYWJlbD4mbmJzcDs8L21hdC1sYWJlbD5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcclxuICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBAaWYgKGNsZWFyYWJsZSkge1xyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiX3ZhbHVlIHwgaXNOaWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gQnV0dG9ucyAtLT5cclxuICAgIEBjYXNlICgnYnV0dG9uJykge1xyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBbZmxvYXRMYWJlbF09XCInYWx3YXlzJ1wiXHJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxyXG4gICAgICAgIGNsYXNzPVwibWF0LWJvb2xlYW4tZmllbGQgbWF0LWJvb2xlYW4tZmllbGQtYnV0dG9uIHt7IGNsYXNzTGlzdCB9fVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IG1hdFByZWZpeD5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgPG1hdC1sYWJlbCBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIj57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgPG1hdC1sYWJlbD4mbmJzcDs8L21hdC1sYWJlbD5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgI2Zha2VJbnB1dFxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiXHJcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzRmFrZUlucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dMZWZ0KT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgKGtleXVwLmFycm93UmlnaHQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dVcCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgW3RhYmluZGV4XT1cIl90YWJpbmRleFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICA8aW9uLXRleHQ+XHJcbiAgICAgICAgICAgIHt7ICh2YWx1ZSA9PT0gbnVsbCA/ICdDT01NT04uRU1QVFlfT1BUSU9OJyA6IHZhbHVlID09PSB0cnVlID8geWVzTGFiZWwgOiBub0xhYmVsKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgPC9pb24tdGV4dD5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1idXR0b25zXCIgW3N0eWxlLi0tYnV0dG9ucy1jb2wtY291bnRdPVwiYnV0dG9uc0NvbENvdW50XCI+XHJcbiAgICAgICAgICAgIDwhLS0geWVzIC0tPlxyXG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICN5ZXNCdXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgW3RhYkluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwid3JpdGVWYWx1ZSh0cnVlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwid3JpdGVWYWx1ZSh0cnVlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwiX3ZhbHVlID09PSBudWxsID8gJ3RlcnRpYXJ5JyA6IF92YWx1ZSA9PT0gdHJ1ZSA/ICdhY2NlbnQnIDogJ2xpZ2h0J1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25JY29ucyAmJiB5ZXNJY29uOyBhcyBpY29uKSB7XHJcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgW25hbWVdPVwiaWNvblwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHt7IHllc0xhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gTm8gYnV0dG9uIC0tPlxyXG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICNub0J1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiLTFcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJ3cml0ZVZhbHVlKGZhbHNlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwid3JpdGVWYWx1ZShmYWxzZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIl92YWx1ZSA9PT0gbnVsbCA/ICd0ZXJ0aWFyeScgOiBfdmFsdWUgPT09IGZhbHNlID8gJ2FjY2VudCcgOiAnbGlnaHQnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkljb25zICYmIG5vSWNvbjsgYXMgaWNvbikge1xyXG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIFtuYW1lXT1cImljb25cIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB7eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xyXG4gICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEBpZiAoY2xlYXJhYmxlKSB7XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvblxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgY29sb3I9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIl92YWx1ZSB8IGlzTmlsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvc2VcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxlQUFlLEVBR2YsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQUVwQyxNQUFNLHNCQUFzQixHQUFhO0lBQ3ZDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDOUMsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBU3RCLE1BQU0sT0FBTyxlQUFlO0lBdUZoQjtJQUNFO0lBQ1U7SUF4RmQsaUJBQWlCLEdBQXFCLElBQUksQ0FBQztJQUMzQyxrQkFBa0IsR0FBZSxJQUFJLENBQUM7SUFDN0IsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDNUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVmLE1BQU0sQ0FBVTtJQUNoQixTQUFT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c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLEtBQUs7c0JBQWIsS0FBSztnQkFDaUMsZUFBZTtzQkFBckQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBRXJCLFNBQVM7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFDTCxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDa0MsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDa0MsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFFcUMsUUFBUTtzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBWWpDLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFvQmxDLEtBQUs7c0JBRFIsS0FBSztnQkFZaUIsVUFBVTtzQkFBaEMsTUFBTTt1QkFBQyxhQUFhO2dCQUVKLFFBQVE7c0JBQXhCLE1BQU07dUJBQUMsT0FBTztnQkFFQyxPQUFPO3NCQUF0QixNQUFNO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRSYWRpb0J1dHRvbiwgTWF0UmFkaW9DaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRDaGVja2JveCwgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzTm90TmlsLCB0b051bWJlciB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0Qm9vbGVhbkZpZWxkKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1ib29sZWFuLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmJvb2xlYW4uaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmJvb2xlYW4uc2NzcyddLFxuICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdEJvb2xlYW5GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF93cml0aW5nID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIF92YWx1ZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIF90YWJpbmRleDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3Nob3dSYWRpbyA9IGZhbHNlOyAvLyBXaWxsIGJlIGNoYW5nZWQgd2hlbiBmb2N1cyBpblxuICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmYWtlSW5wdXQnKSBmYWtlSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3llc1JhZGlvQnV0dG9uJykgeWVzUmFkaW9CdXR0b246IE1hdFJhZGlvQnV0dG9uO1xuICBAVmlld0NoaWxkKCdub1JhZGlvQnV0dG9uJykgbm9SYWRpb0J1dHRvbjogTWF0UmFkaW9CdXR0b247XG4gIEBWaWV3Q2hpbGQoJ2NoZWNrYm94QnV0dG9uJykgY2hlY2tib3hCdXR0b246IE1hdENoZWNrYm94O1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb21wYWN0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0eWxlOiAncmFkaW8nIHwgJ2NoZWNrYm94JyB8ICdidXR0b24nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBidXR0b25zQ29sQ291bnQ6IG51bWJlcjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdjbGFzcycpIGNsYXNzTGlzdDogc3RyaW5nO1xuICBASW5wdXQoKSB5ZXNMYWJlbCA9ICdDT01NT04uWUVTJztcbiAgQElucHV0KCkgbm9MYWJlbCA9ICdDT01NT04uTk8nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0J1dHRvbkljb25zID0gdHJ1ZTtcbiAgQElucHV0KCkgeWVzSWNvbiA9ICdjaGVja21hcmsnO1xuICBASW5wdXQoKSBub0ljb24gPSAnY2xvc2UnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdhZnRlcicgfCAnYmVmb3JlJyA9ICdhZnRlcic7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fdGFiaW5kZXggIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVRhYkluZGV4KCkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgc2hvd1JhZGlvKHY6IGFueSkge1xuICAgIGlmICh2ICE9PSB0aGlzLl9zaG93UmFkaW8pIHtcbiAgICAgIHRoaXMuX3Nob3dSYWRpbyA9IHY7XG4gICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93UmFkaW8oKTogYW55IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fc2hvd1JhZGlvIHx8XG4gICAgICB0aGlzLl9mb2N1c2VkIHx8XG4gICAgICB0aGlzLmZsb2F0TGFiZWwgPT09ICdhbHdheXMnIHx8XG4gICAgICB0aGlzLmZsb2F0TGFiZWwgPT09ICduZXZlcicgfHxcbiAgICAgIHRoaXMuc3R5bGUgPT09ICdjaGVja2JveCcgfHxcbiAgICAgIGlzTm90TmlsKHRoaXMuX3ZhbHVlKVxuICAgICk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodjogYW55KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXgsQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgQE91dHB1dCgna2V5dXAuZW50ZXInKSBrZXl1cEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICBAT3V0cHV0KCdmb2N1cycpIGZvY3Vzc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWJvb2xlYW4tZmllbGQ+LlwiKTtcblxuICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN0eWxlIHx8ICh0aGlzLmNvbXBhY3QgPyAnY2hlY2tib3gnIDogJ3JhZGlvJyk7XG5cbiAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuYnV0dG9uc0NvbENvdW50ID0gdG9OdW1iZXIodGhpcy5idXR0b25zQ29sQ291bnQsIDIpO1xuICAgIH1cblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy53cml0ZVZhbHVlKHZhbHVlKSkpO1xuXG4gICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmJsdXJyZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1ib29sZWFuLWZpZWxkXSBXcml0aW5nIHZhbHVlJywgdmFsdWUpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl92YWx1ZSB8fCB2YWx1ZSAhPT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMueWVzUmFkaW9CdXR0b24pIHtcbiAgICAgICAgdGhpcy55ZXNSYWRpb0J1dHRvbi5jaGVja2VkID0gdmFsdWUgPT09IHRydWU7XG4gICAgICAgIHRoaXMubm9SYWRpb0J1dHRvbi5jaGVja2VkID0gdmFsdWUgPT09IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrYm94QnV0dG9uKSB7XG4gICAgICAgIGlmIChpc05pbCh2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2tib3hCdXR0b24uY2hlY2tlZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuc3R5bGUgPT09ICdidXR0b24nKSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMua2V5dXBFbnRlci5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZvY3VzRmFrZUlucHV0KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnNob3dSYWRpbykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gSGlkZSB0aGUgZmFrZSBpbnB1dFxuICAgICAgdGhpcy5mYWtlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xuICAgIH1cblxuICAgIC8vIEZvY3VzIG9uIGZpcnN0IGJ1dHRvblxuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJsdXJJbnB1dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGNvbnN0IGludGVybmFsRXZlbnQgPSB0aGlzLmlucHV0c0VsZW1lbnRzLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKCFpbnRlcm5hbEV2ZW50KSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xuICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm47IC8vIEFscmVhZHkgZm9jdXNlZFxuXG4gICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJhZGlvVmFsdWVDaGFuZ2VkKGV2ZW50OiBNYXRSYWRpb0NoYW5nZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKGV2ZW50LnZhbHVlKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGVja2JveFZhbHVlQ2hhbmdlZChldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW1pdENoYW5nZShldmVudC5jaGVja2VkKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICB0b2dnbGVWYWx1ZShldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gIXRoaXMuX3ZhbHVlO1xuICAgIGlmICh0aGlzLnllc1JhZGlvQnV0dG9uKSB7XG4gICAgICB0aGlzLnllc1JhZGlvQnV0dG9uLmNoZWNrZWQgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMubm9SYWRpb0J1dHRvbi5jaGVja2VkID0gIXRoaXMuX3ZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveEJ1dHRvbikge1xuICAgICAgdGhpcy5jaGVja2JveEJ1dHRvbi5jaGVja2VkID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgLy8gQ2hhbmdlcyBjb21lcyBmcm9tIGluc2lkZSBmdW5jdGlvbjogdXNlIHRoZSBjYWxsYmFja1xuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrSWZUb3VjaGVkKCkge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93L0hpZGUgdGhlIGZha2UgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRmFrZUlucHV0KCkge1xuICAgIGlmICh0aGlzLnNob3dSYWRpbyB8fCB0aGlzLnN0eWxlID09PSAnYnV0dG9uJykge1xuICAgICAgdGhpcy5mYWtlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZha2VJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlLCB0aGlzIGNvbXBvbmVudCBoYXMgYSB0ZW1wb3JhcnkgY29tcG9uZW50IGRpc3BsYXllZCBiZWZvcmUgdGhlIGZpcnN0IGZvY3VzIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRhYkluZGV4KCkge1xuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZha2VJbnB1dCkge1xuICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IHRoaXMuX3RhYmluZGV4O1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xlYXJWYWx1ZShldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcmFkaW9CdXR0b25FbGVtZW50cygpOiBIVE1MRWxlbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy55ZXNSYWRpb0J1dHRvbiA/IFt0aGlzLnllc1JhZGlvQnV0dG9uLCB0aGlzLm5vUmFkaW9CdXR0b25dLm1hcCgoYikgPT4gYi5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIDogW107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlucHV0c0VsZW1lbnRzKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLnJhZGlvQnV0dG9uRWxlbWVudHNcbiAgICAgIC5jb25jYXQodGhpcy5jaGVja2JveEJ1dHRvbiA/IFt0aGlzLmNoZWNrYm94QnV0dG9uLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudF0gOiBbXSlcbiAgICAgIC5jb25jYXQodGhpcy5mYWtlSW5wdXQgPyBbdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudF0gOiBbXSk7XG4gIH1cbn1cbiIsIkBpZiAocmVhZG9ubHkpIHtcbiAgPG1hdC1mb3JtLWZpZWxkXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIHt7IGNsYXNzTGlzdCB9fVwiXG4gID5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gdHlwZT1cInRleHRcIiByZWFkb25seSBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiAvPlxuICAgIDxpb24tdGV4dD5cbiAgICAgIHt7ICh2YWx1ZSA9PT0gbnVsbCA/ICdDT01NT04uRU1QVFlfT1BUSU9OJyA6IHZhbHVlID09PSB0cnVlID8geWVzTGFiZWwgOiBub0xhYmVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvaW9uLXRleHQ+XG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICBAc3dpdGNoIChzdHlsZSkge1xuICAgIDwhLS0gUmFkaW8gLS0+XG4gICAgQGNhc2UgKCdyYWRpbycpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBbZmxvYXRMYWJlbF09XCJzaG93UmFkaW8gJiYgKCFmbG9hdExhYmVsIHx8IGZsb2F0TGFiZWwgPT09ICdhdXRvJykgPyAnYWx3YXlzJyA6IChmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZSlcIlxuICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgICAgICBjbGFzcz1cIm1hdC1ib29sZWFuLWZpZWxkIG1hdC1ib29sZWFuLWZpZWxkLXJhZGlvIHt7IGNsYXNzTGlzdCB9fVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgPG1hdC1sYWJlbCBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJzaG93UmFkaW9cIj4oe3sgeWVzTGFiZWwgfCB0cmFuc2xhdGUgfX0ve3sgbm9MYWJlbCB8IHRyYW5zbGF0ZSB9fSk8L3NwYW4+XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICNmYWtlSW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzRmFrZUlucHV0KCRldmVudClcIlxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cklucHV0KCRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgIChrZXl1cC5hcnJvd0xlZnQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93UmlnaHQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93VXApPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInNob3dSYWRpb1wiXG4gICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgLz5cblxuICAgICAgICA8IS0tIHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFzaG93UmFkaW9cIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cklucHV0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gI3llc1JhZGlvQnV0dG9uIFt2YWx1ZV09XCJ0cnVlXCIgdGFiSW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgeWVzTGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICZuYnNwO1xuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uICNub1JhZGlvQnV0dG9uIFt2YWx1ZV09XCJmYWxzZVwiIHRhYkluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG5vTGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cblxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2xlYXJhYmxlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiX3ZhbHVlIHwgaXNOaWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cblxuICAgIDwhLS0gQ2hlY2tib3ggLS0+XG4gICAgQGNhc2UgKCdjaGVja2JveCcpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgIGNsYXNzPVwibWF0LWJvb2xlYW4tZmllbGQgbWF0LWJvb2xlYW4tZmllbGQtY2hlY2tib3gge3sgY2xhc3NMaXN0IH19XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICNmYWtlSW5wdXRcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJzaG93UmFkaW9cIlxuICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXNGYWtlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPCEtLSBjaGVja2JveCwgd2hlbiBjb21wYWN0IC0tPlxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgI2NoZWNrYm94QnV0dG9uXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJ2YWx1ZSB8IGlzTmlsXCJcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhc2hvd1JhZGlvXCJcbiAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCJsYWJlbFBvc2l0aW9uXCJcbiAgICAgICAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCItMVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cklucHV0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyIHx8ICcnIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICBAaWYgKGZsb2F0TGFiZWwgPT09ICduZXZlcicgfHwgIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgPG1hdC1sYWJlbD4mbmJzcDs8L21hdC1sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChjbGVhcmFibGUpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJfdmFsdWUgfCBpc05pbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuXG4gICAgPCEtLSBCdXR0b25zIC0tPlxuICAgIEBjYXNlICgnYnV0dG9uJykge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIFtmbG9hdExhYmVsXT1cIidhbHdheXMnXCJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICAgICAgY2xhc3M9XCJtYXQtYm9vbGVhbi1maWVsZCBtYXQtYm9vbGVhbi1maWVsZC1idXR0b24ge3sgY2xhc3NMaXN0IH19XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgPG1hdC1sYWJlbCBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIj57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bWF0LWxhYmVsPiZuYnNwOzwvbWF0LWxhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2Zha2VJbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiXG4gICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzRmFrZUlucHV0KCRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgIChrZXl1cC5hcnJvd0xlZnQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93UmlnaHQpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93VXApPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIFt0YWJpbmRleF09XCJfdGFiaW5kZXhcIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgICAgPGlvbi10ZXh0PlxuICAgICAgICAgICAge3sgKHZhbHVlID09PSBudWxsID8gJ0NPTU1PTi5FTVBUWV9PUFRJT04nIDogdmFsdWUgPT09IHRydWUgPyB5ZXNMYWJlbCA6IG5vTGFiZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvbnNcIiBbc3R5bGUuLS1idXR0b25zLWNvbC1jb3VudF09XCJidXR0b25zQ29sQ291bnRcIj5cbiAgICAgICAgICAgIDwhLS0geWVzIC0tPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgI3llc0J1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIFt0YWJJbmRleF09XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ3cml0ZVZhbHVlKHRydWUsICRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwid3JpdGVWYWx1ZSh0cnVlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIl92YWx1ZSA9PT0gbnVsbCA/ICd0ZXJ0aWFyeScgOiBfdmFsdWUgPT09IHRydWUgPyAnYWNjZW50JyA6ICdsaWdodCdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25JY29ucyAmJiB5ZXNJY29uOyBhcyBpY29uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIFtuYW1lXT1cImljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHt7IHllc0xhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gTm8gYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgI25vQnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW3RhYkluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndyaXRlVmFsdWUoZmFsc2UsICRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIndyaXRlVmFsdWUoZmFsc2UsICRldmVudClcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiX3ZhbHVlID09PSBudWxsID8gJ3RlcnRpYXJ5JyA6IF92YWx1ZSA9PT0gZmFsc2UgPyAnYWNjZW50JyA6ICdsaWdodCdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25JY29ucyAmJiBub0ljb247IGFzIGljb24pIHtcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgW25hbWVdPVwiaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAge3sgbm9MYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgY29sb3I9XCJtZWRpdW1cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIl92YWx1ZSB8IGlzTmlsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjbG9zZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICB9XG4gIH1cbn1cblxuPG5nLXRlbXBsYXRlICNtYXRQcmVmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19
|