ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
133 lines • 26.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ElementRef, forwardRef, Inject, Injector, Optional, ViewEncapsulation } from '@angular/core';
import { BooleanInputConverter, NumberInputConverter } from '../../../decorators/input-converter';
import { ORealPipe } from '../../../pipes/o-real.pipe';
import { NumberService } from '../../../services/number.service';
import { Util } from '../../../util/util';
import { OFormComponent } from '../../form/o-form.component';
import { OIntegerInputComponent } from '../integer-input/o-integer-input.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/flex-layout/flex";
import * as i3 from "@angular/forms";
import * as i4 from "../../../directives/o-mat-error.directive";
import * as i5 from "@angular/material/button";
import * as i6 from "@angular/material/icon";
import * as i7 from "@angular/material/input";
import * as i8 from "@angular/material/form-field";
import * as i9 from "@angular/material/tooltip";
import * as i10 from "../../../pipes/o-translate.pipe";
import * as i11 from "../../form/o-form.component";
export const DEFAULT_INPUTS_O_REAL_INPUT = [
'minDecimalDigits: min-decimal-digits',
'maxDecimalDigits: max-decimal-digits',
'decimalSeparator : decimal-separator',
'strict'
];
export class ORealInputComponent extends OIntegerInputComponent {
constructor(form, elRef, injector) {
super(form, elRef, injector);
this.minDecimalDigits = 2;
this.maxDecimalDigits = 2;
this.step = 0.01;
this.grouping = true;
this.strict = false;
this._defaultSQLTypeKey = 'FLOAT';
this.numberService = this.injector.get(NumberService);
}
setComponentPipe() {
this.componentPipe = new ORealPipe(this.injector);
}
initialize() {
super.initialize();
this.getFormControl().getValue = function () {
if (!isNaN(Number(this.value))) {
return Number(this.value);
}
else {
return this.value;
}
};
}
ngOnInit() {
super.ngOnInit();
this.pipeArguments.decimalSeparator = this.decimalSeparator;
this.pipeArguments.minDecimalDigits = this.minDecimalDigits;
this.pipeArguments.maxDecimalDigits = this.maxDecimalDigits;
this.pipeArguments.truncate = false;
if (!this.isEmpty()) {
this.ensureOFormValue(this.value);
}
}
resolveValidators() {
const validators = super.resolveValidators();
if (Util.isDefined(this.maxDecimalDigits)) {
validators.push(this.maxDecimalDigitsValidator.bind(this));
}
return validators;
}
ensureOFormValue(arg) {
super.ensureOFormValue(arg);
if (!this.isEmpty() && Util.isDefined(this.pipeArguments)) {
const formattedValue = this.numberService.getRealValue(this.value.value, this.pipeArguments);
if (!isNaN(Number(formattedValue))) {
this.value.value = formattedValue;
}
}
}
maxDecimalDigitsValidator(control) {
let ctrlValue = control.value;
if (typeof control.value === 'number') {
ctrlValue = ctrlValue.toString();
}
if (this.strict && ctrlValue && ctrlValue.length) {
const valArray = ctrlValue.split(this.decimalSeparator ? this.decimalSeparator : '.');
if (Util.isDefined(this.maxDecimalDigits) && (this.maxDecimalDigits > 0) && Util.isDefined(valArray[1]) && (valArray[1].length > this.maxDecimalDigits)) {
return {
maxDecimaldigits: {
requiredMaxDecimaldigits: this.maxDecimalDigits
}
};
}
}
return {};
}
initializeStep() {
if (this.step <= 0) {
this.step = 1 / Math.pow(10, this.maxDecimalDigits);
console.warn('`step` attribute must be greater than zero');
}
}
}
ORealInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORealInputComponent, deps: [{ token: forwardRef(() => OFormComponent), optional: true }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
ORealInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ORealInputComponent, selector: "o-real-input", inputs: { minDecimalDigits: ["min-decimal-digits", "minDecimalDigits"], maxDecimalDigits: ["max-decimal-digits", "maxDecimalDigits"], decimalSeparator: ["decimal-separator", "decimalSeparator"], strict: "strict" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\"\n [matTooltipHideDelay]=\"tooltipHideDelay\">\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.custom-width]=\"hasCustomWidth\" [class.icon-field]=\"showClearButton\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <input matInput [type]=\"inputType\" [id]=\"getAttribute()\" [formControlName]=\"getAttribute()\"\n [placeholder]=\"placeHolder\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\"\n (change)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly\" [min]=\"min\" [max]=\"max\" [step]=\"step\"\n [required]=\"isRequired\">\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('min')\">\n {{ 'FORM_VALIDATION.MIN_VALUE' | oTranslate }}: {{ getErrorValue('min', 'min') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('max')\">\n {{ 'FORM_VALIDATION.MAX_VALUE' | oTranslate }}: {{ getErrorValue('max', 'max') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('minDecimaldigits')\">\n {{ 'FORM_VALIDATION.MIN_DECIMAL_DIGITS' | oTranslate }}: {{ getErrorValue('minDecimaldigits', 'requiredMinDecimaldigits') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('maxDecimaldigits')\">\n {{ 'FORM_VALIDATION.MAX_DECIMAL_DIGITS' | oTranslate }}: {{ getErrorValue('maxDecimaldigits', 'requiredMaxDecimaldigits') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
__decorate([
NumberInputConverter(),
__metadata("design:type", Number)
], ORealInputComponent.prototype, "minDecimalDigits", void 0);
__decorate([
NumberInputConverter(),
__metadata("design:type", Number)
], ORealInputComponent.prototype, "maxDecimalDigits", void 0);
__decorate([
NumberInputConverter(),
__metadata("design:type", Number)
], ORealInputComponent.prototype, "step", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], ORealInputComponent.prototype, "grouping", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], ORealInputComponent.prototype, "strict", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORealInputComponent, decorators: [{
type: Component,
args: [{ selector: 'o-real-input', inputs: DEFAULT_INPUTS_O_REAL_INPUT, encapsulation: ViewEncapsulation.None, template: "<div [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\"\n [matTooltipHideDelay]=\"tooltipHideDelay\">\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\"\n [class.custom-width]=\"hasCustomWidth\" [class.icon-field]=\"showClearButton\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <input matInput [type]=\"inputType\" [id]=\"getAttribute()\" [formControlName]=\"getAttribute()\"\n [placeholder]=\"placeHolder\" (focus)=\"innerOnFocus($event)\" (blur)=\"innerOnBlur($event)\"\n (change)=\"onChangeEvent($event)\" [readonly]=\"isReadOnly\" [min]=\"min\" [max]=\"max\" [step]=\"step\"\n [required]=\"isRequired\">\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('min')\">\n {{ 'FORM_VALIDATION.MIN_VALUE' | oTranslate }}: {{ getErrorValue('min', 'min') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('max')\">\n {{ 'FORM_VALIDATION.MAX_VALUE' | oTranslate }}: {{ getErrorValue('max', 'max') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('minDecimaldigits')\">\n {{ 'FORM_VALIDATION.MIN_DECIMAL_DIGITS' | oTranslate }}: {{ getErrorValue('minDecimaldigits', 'requiredMinDecimaldigits') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('maxDecimaldigits')\">\n {{ 'FORM_VALIDATION.MAX_DECIMAL_DIGITS' | oTranslate }}: {{ getErrorValue('maxDecimaldigits', 'requiredMaxDecimaldigits') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i11.OFormComponent, decorators: [{
type: Optional
}, {
type: Inject,
args: [forwardRef(() => OFormComponent)]
}] }, { type: i0.ElementRef }, { type: i0.Injector }]; }, propDecorators: { minDecimalDigits: [], maxDecimalDigits: [], step: [], grouping: [], strict: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1yZWFsLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L3JlYWwtaW5wdXQvby1yZWFsLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L3JlYWwtaW5wdXQvby1yZWFsLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBVSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEcsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUdwRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxzQ0FBc0M7SUFDdEMsc0NBQXNDO0lBQ3RDLHNDQUFzQztJQUN0QyxRQUFRO0NBQ1QsQ0FBQztBQVNGLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxzQkFBc0I7SUFxQjdELFlBQ3dELElBQW9CLEVBQzFFLEtBQWlCLEVBQ2pCLFFBQWtCO1FBRWxCLEtBQUssQ0FBQyxJQUFJLEVB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QkFBcUIsRUFBRTs7cURBQ0M7QUFFekI7SUFBQyxxQkFBcUIsRUFBRTs7bURBQ0E7NEZBZmIsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGNBQWMsVUFFaEIsMkJBQTJCLGlCQUNwQixpQkFBaUIsQ0FBQyxJQUFJOzswQkF3QmxDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0RkFuQnRELGdCQUFnQixNQUdoQixnQkFBZ0IsTUFHaEIsSUFBSSxNQUdKLFFBQVEsTUFHUixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBPbkluaXQsIE9wdGlvbmFsLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyLCBOdW1iZXJJbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IElSZWFsUGlwZUFyZ3VtZW50LCBPUmVhbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9vLXJlYWwucGlwZSc7XG5pbXBvcnQgeyBOdW1iZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbnVtYmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0vby1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPSW50ZWdlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZWdlci1pbnB1dC9vLWludGVnZXItaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL28tZm9ybS1jb250cm9sLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fUkVBTF9JTlBVVCA9IFtcbiAgJ21pbkRlY2ltYWxEaWdpdHM6IG1pbi1kZWNpbWFsLWRpZ2l0cycsXG4gICdtYXhEZWNpbWFsRGlnaXRzOiBtYXgtZGVjaW1hbC1kaWdpdHMnLFxuICAnZGVjaW1hbFNlcGFyYXRvciA6IGRlY2ltYWwtc2VwYXJhdG9yJyxcbiAgJ3N0cmljdCdcbl07XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1yZWFsLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tcmVhbC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19SRUFMX0lOUFVULFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE9SZWFsSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBPSW50ZWdlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBATnVtYmVySW5wdXRDb252ZXJ0ZXIoKVxuICBtaW5EZWNpbWFsRGlnaXRzOiBudW1iZXIgPSAyO1xuXG4gIEBOdW1iZXJJbnB1dENvbnZlcnRlcigpXG4gIG1heERlY2ltYWxEaWdpdHM6IG51bWJlciA9IDI7XG5cbiAgQE51bWJlcklucHV0Q29udmVydGVyKClcbiAgc3RlcDogbnVtYmVyID0gMC4wMTtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZ3JvdXBpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzdHJpY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgZGVjaW1hbFNlcGFyYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcGlwZUFyZ3VtZW50czogSVJlYWxQaXBlQXJndW1lbnQ7XG4gIHByb3RlY3RlZCBudW1iZXJTZXJ2aWNlOiBOdW1iZXJTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBPRm9ybUNvbXBvbmVudCkpIGZvcm06IE9Gb3JtQ29tcG9uZW50LFxuICAgIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICBzdXBlcihmb3JtLCBlbFJlZiwgaW5qZWN0b3IpO1xuICAgIHRoaXMuX2RlZmF1bHRTUUxUeXBlS2V5ID0gJ0ZMT0FUJztcbiAgICB0aGlzLm51bWJlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChOdW1iZXJTZXJ2aWNlKTtcbiAgfVxuXG4gIHNldENvbXBvbmVudFBpcGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRQaXBlID0gbmV3IE9SZWFsUGlwZSh0aGlzLmluamVjdG9yKTtcbiAgfVxuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIC8vIE92ZXJyaWRlIEZvcm1Db250cm9sIGdldFZhbHVlIGluIG9yZGVyIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0dGVkIHZhbHVlXG4gICAgKHRoaXMuZ2V0Rm9ybUNvbnRyb2woKSBhcyBPRm9ybUNvbnRyb2wpLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFpc05hTihOdW1iZXIodGhpcy52YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnBpcGVBcmd1bWVudHMuZGVjaW1hbFNlcGFyYXRvciA9IHRoaXMuZGVjaW1hbFNlcGFyYXRvcjtcbiAgICB0aGlzLnBpcGVBcmd1bWVudHMubWluRGVjaW1hbERpZ2l0cyA9IHRoaXMubWluRGVjaW1hbERpZ2l0cztcbiAgICB0aGlzLnBpcGVBcmd1bWVudHMubWF4RGVjaW1hbERpZ2l0cyA9IHRoaXMubWF4RGVjaW1hbERpZ2l0cztcbiAgICB0aGlzLnBpcGVBcmd1bWVudHMudHJ1bmNhdGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmVuc3VyZU9Gb3JtVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZVZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IHN1cGVyLnJlc29sdmVWYWxpZGF0b3JzKCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMubWF4RGVjaW1hbERpZ2l0cykpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLm1heERlY2ltYWxEaWdpdHNWYWxpZGF0b3IuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgZW5zdXJlT0Zvcm1WYWx1ZShhcmc6IGFueSk6IHZvaWQge1xuICAgIHN1cGVyLmVuc3VyZU9Gb3JtVmFsdWUoYXJnKTtcbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMucGlwZUFyZ3VtZW50cykpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5udW1iZXJTZXJ2aWNlLmdldFJlYWxWYWx1ZSh0aGlzLnZhbHVlLnZhbHVlLCB0aGlzLnBpcGVBcmd1bWVudHMpO1xuICAgICAgaWYgKCFpc05hTihOdW1iZXIoZm9ybWF0dGVkVmFsdWUpKSkge1xuICAgICAgICB0aGlzLnZhbHVlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1heERlY2ltYWxEaWdpdHNWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgbGV0IGN0cmxWYWx1ZTogc3RyaW5nID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBjdHJsVmFsdWUgPSBjdHJsVmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaWN0ICYmIGN0cmxWYWx1ZSAmJiBjdHJsVmFsdWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWxBcnJheSA9IGN0cmxWYWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IgPyB0aGlzLmRlY2ltYWxTZXBhcmF0b3IgOiAnLicpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMubWF4RGVjaW1hbERpZ2l0cykgJiYgKHRoaXMubWF4RGVjaW1hbERpZ2l0cyA+IDApICYmIFV0aWwuaXNEZWZpbmVkKHZhbEFycmF5WzFdKSAmJiAodmFsQXJyYXlbMV0ubGVuZ3RoID4gdGhpcy5tYXhEZWNpbWFsRGlnaXRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1heERlY2ltYWxkaWdpdHM6IHtcbiAgICAgICAgICAgIHJlcXVpcmVkTWF4RGVjaW1hbGRpZ2l0czogdGhpcy5tYXhEZWNpbWFsRGlnaXRzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcCA8PSAwKSB7XG4gICAgICB0aGlzLnN0ZXAgPSAxIC8gTWF0aC5wb3coMTAsIHRoaXMubWF4RGVjaW1hbERpZ2l0cyk7XG4gICAgICBjb25zb2xlLndhcm4oJ2BzdGVwYCBhdHRyaWJ1dGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwKClcIiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwXCIgW21hdFRvb2x0aXBDbGFzc109XCJ0b29sdGlwQ2xhc3NcIlxuICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvblwiIFttYXRUb29sdGlwU2hvd0RlbGF5XT1cInRvb2x0aXBTaG93RGVsYXlcIlxuICBbbWF0VG9vbHRpcEhpZGVEZWxheV09XCJ0b29sdGlwSGlkZURlbGF5XCI+XG4gIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCIgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiaGlkZVJlcXVpcmVkTWFya2VyXCJcbiAgICBbY2xhc3MuY3VzdG9tLXdpZHRoXT1cImhhc0N1c3RvbVdpZHRoXCIgW2NsYXNzLmljb24tZmllbGRdPVwic2hvd0NsZWFyQnV0dG9uXCIgZnhGbGV4RmlsbCBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiPlxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFZpc2libGVcIj57eyBvbGFiZWwgfCBvVHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IG1hdElucHV0IFt0eXBlXT1cImlucHV0VHlwZVwiIFtpZF09XCJnZXRBdHRyaWJ1dGUoKVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZ2V0QXR0cmlidXRlKClcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCIgKGZvY3VzKT1cImlubmVyT25Gb2N1cygkZXZlbnQpXCIgKGJsdXIpPVwiaW5uZXJPbkJsdXIoJGV2ZW50KVwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIFtyZWFkb25seV09XCJpc1JlYWRPbmx5XCIgW21pbl09XCJtaW5cIiBbbWF4XT1cIm1heFwiIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dDbGVhckJ1dHRvblwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm9uQ2xpY2tDbGVhclZhbHVlKCRldmVudClcIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6Y2xvc2VcIj48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcignbWluJylcIj5cbiAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uTUlOX1ZBTFVFJyB8IG9UcmFuc2xhdGUgfX06IHt7IGdldEVycm9yVmFsdWUoJ21pbicsICdtaW4nKSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdtYXgnKVwiPlxuICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5NQVhfVkFMVUUnIHwgb1RyYW5zbGF0ZSB9fToge3sgZ2V0RXJyb3JWYWx1ZSgnbWF4JywgJ21heCcpIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwiaGFzRXJyb3IoJ21pbkRlY2ltYWxkaWdpdHMnKVwiPlxuICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5NSU5fREVDSU1BTF9ESUdJVFMnIHwgb1RyYW5zbGF0ZSB9fToge3sgZ2V0RXJyb3JWYWx1ZSgnbWluRGVjaW1hbGRpZ2l0cycsICdyZXF1aXJlZE1pbkRlY2ltYWxkaWdpdHMnKSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdtYXhEZWNpbWFsZGlnaXRzJylcIj5cbiAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uTUFYX0RFQ0lNQUxfRElHSVRTJyB8IG9UcmFuc2xhdGUgfX06IHt7IGdldEVycm9yVmFsdWUoJ21heERlY2ltYWxkaWdpdHMnLCAncmVxdWlyZWRNYXhEZWNpbWFsZGlnaXRzJykgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBvRXJyb3Igb2YgZ2V0QWN0aXZlT0Vycm9ycygpXCI+XG4gICAgICB7eyBvRXJyb3IudGV4dCB8IG9UcmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuIl19