@asoftwareworld/form-builder
Version:
ASW Form Builder helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same befor
122 lines • 26.7 kB
JavaScript
/**
* @license
* Copyright ASW (A Software World) All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file
*/
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { AswConfirmDialog } from '@asoftwareworld/form-builder/form-control/confirm-dialog';
import { Constants, ObjectUtils } from '@asoftwareworld/form-builder/form-control/core';
import { AswNumberDialog } from './number-dialog';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/material/input";
import * as i5 from "@angular/material/form-field";
import * as i6 from "@angular/material/tooltip";
import * as i7 from "@angular/material/icon";
import * as i8 from "@angular/material/button";
import * as i9 from "./numbers-only.directive";
export class AswNumber {
dialog;
constants = Constants;
objectUtils = ObjectUtils;
decimals = 100;
/**
* Number control
*/
control = null;
formControls = [];
/**
* Number control index to help update or delete button from drop area
*/
controlIndex;
isPreviewTemplate = false;
numberUpdateEvent = new EventEmitter();
numberDeleteEvent = new EventEmitter();
aswModelChange = new EventEmitter();
duplicateControl = new EventEmitter();
input;
constructor(dialog) {
this.dialog = dialog;
}
ngOnInit() {
// tslint:disable-next-line:no-bitwise
const id = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
if (this.control) {
this.control.guid = this.control.guid ? this.control.guid : id;
}
}
ngAfterViewInit() {
this.input.valueChanges.subscribe(() => {
this.onChange(this.control ? this.control : null);
});
}
deleteNumberDialog(control, controlIndex) {
const dialogRef = this.dialog.open(AswConfirmDialog, {
width: '350px',
data: { name: control.controlType, message: this.constants.messages.waringMessage }
});
dialogRef.afterClosed().subscribe(result => {
if (result !== undefined) {
this.numberDeleteEvent.emit(controlIndex);
}
});
}
editNumberDialog(control, controlIndex) {
const dialogRef = this.dialog.open(AswNumberDialog, {
disableClose: true,
width: '80%',
minWidth: '70vw',
data: control
});
dialogRef.afterClosed().subscribe(result => {
if (result !== undefined) {
this.numberUpdateEvent.emit({ control: result, index: controlIndex });
}
});
}
onChange(control) {
const calculationControls = this.formControls.filter(x => x.controlType === 'calculation');
calculationControls.forEach(calculation => {
const updateControls = calculation.operations.filter((x) => x.id === control.guid);
updateControls.forEach((y) => {
y.label = control.label;
y.value = control.value;
});
calculation.value = this.objectUtils.calculateValue(calculation.operations);
});
this.aswModelChange.emit(control);
}
duplicateNumberControl(control) {
this.duplicateControl.emit(control);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswNumber, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswNumber, selector: "asw-number", inputs: { control: "control", formControls: "formControls", controlIndex: "controlIndex", isPreviewTemplate: "isPreviewTemplate" }, outputs: { numberUpdateEvent: "numberUpdateEvent", numberDeleteEvent: "numberDeleteEvent", aswModelChange: "aswModelChange", duplicateControl: "duplicateControl" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"control as control\">\r\n <mat-form-field [appearance]=\"control.style\" class=\"asw-mat-form-field {{control.customClass}}\">\r\n <mat-label>{{control.label}}</mat-label>\r\n <input matInput type=\"text\" aswNumbersOnly\r\n [id]=\"control.id\"\r\n [placeholder]=\"control.label\"\r\n [(ngModel)]=\"control.value\"\r\n #input=\"ngModel\"\r\n (ngModelChange)=\"onChange(control)\"\r\n [decimals]=\"decimals\"\r\n [matTooltip]=\"control.tooltip\"\r\n [maxlength]=\"control.maxlength\"\r\n [minlength]=\"control.minlength\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input.invalid && (input.dirty || input.touched)\">\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input?.errors?.required\">\r\n {{control.label}} is required\r\n </mat-error>\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input?.errors?.minlength\">\r\n Sorry, {{control.label}} must be at least {{control.minlength}} characters long.\r\n </mat-error>\r\n </mat-error>\r\n </mat-form-field>\r\n <ng-template [ngIf]=\"isPreviewTemplate\">\r\n <div class=\"row mb-2\">\r\n <div class=\"col-md-12\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Duplicate\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateNumberControl(control)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Edit\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editNumberDialog(control, controlIndex)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Delete\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteNumberDialog(control, controlIndex)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div> \r\n </div>\r\n </ng-template>\r\n</ng-container>", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i9.AswNumberDirective, selector: "[aswNumbersOnly]", inputs: ["decimals", "negative"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswNumber, decorators: [{
type: Component,
args: [{ selector: 'asw-number', template: "<ng-container *ngIf=\"control as control\">\r\n <mat-form-field [appearance]=\"control.style\" class=\"asw-mat-form-field {{control.customClass}}\">\r\n <mat-label>{{control.label}}</mat-label>\r\n <input matInput type=\"text\" aswNumbersOnly\r\n [id]=\"control.id\"\r\n [placeholder]=\"control.label\"\r\n [(ngModel)]=\"control.value\"\r\n #input=\"ngModel\"\r\n (ngModelChange)=\"onChange(control)\"\r\n [decimals]=\"decimals\"\r\n [matTooltip]=\"control.tooltip\"\r\n [maxlength]=\"control.maxlength\"\r\n [minlength]=\"control.minlength\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input.invalid && (input.dirty || input.touched)\">\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input?.errors?.required\">\r\n {{control.label}} is required\r\n </mat-error>\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input?.errors?.minlength\">\r\n Sorry, {{control.label}} must be at least {{control.minlength}} characters long.\r\n </mat-error>\r\n </mat-error>\r\n </mat-form-field>\r\n <ng-template [ngIf]=\"isPreviewTemplate\">\r\n <div class=\"row mb-2\">\r\n <div class=\"col-md-12\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Duplicate\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateNumberControl(control)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Edit\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editNumberDialog(control, controlIndex)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Delete\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteNumberDialog(control, controlIndex)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div> \r\n </div>\r\n </ng-template>\r\n</ng-container>" }]
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { control: [{
type: Input
}], formControls: [{
type: Input
}], controlIndex: [{
type: Input
}], isPreviewTemplate: [{
type: Input
}], numberUpdateEvent: [{
type: Output
}], numberDeleteEvent: [{
type: Output
}], aswModelChange: [{
type: Output
}], duplicateControl: [{
type: Output
}], input: [{
type: ViewChild,
args: ['input']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZm9ybS1jb250cm9sL251bWJlci9udW1iZXIudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvbnVtYmVyL251bWJlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM1RixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFNbEQsTUFBTSxPQUFPLFNBQVM7SUF3QkM7SUF0Qm5CLFNBQVMsR0FBUSxTQUFTLENBQUM7SUFDM0IsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUMxQixRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ2Y7O09BRUc7SUFDTSxPQUFPLEdBQXlCLElBQUksQ0FBQztJQUNyQyxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBQ2xDOztPQUVHO0lBQ00sWUFBWSxDQUFVO0lBRXRCLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUV6QixpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBNkMsQ0FBQztJQUNsRixpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQy9DLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUNuRCxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUUzQyxLQUFLLENBQU07SUFFL0IsWUFBbUIsTUFBaUI7UUFBakIsV0FBTSxHQUFOLE1BQU0sQ0FBVztJQUNwQyxDQUFDO0lB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QUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBc0I7UUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO3dHQW5GUSxTQUFTOzRGQUFULFNBQVMsMmJDbkJ0Qiw0c0ZBbURlOzs0RkRoQ0YsU0FBUztrQkFKckIsU0FBUzsrQkFDSSxZQUFZOzhFQVdiLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRWEsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBU1cgKEEgU29mdHdhcmUgV29ybGQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXHJcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcclxuICovXHJcblxyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQXN3Q29uZmlybURpYWxvZyB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXIvZm9ybS1jb250cm9sL2NvbmZpcm0tZGlhbG9nJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzLCBPYmplY3RVdGlscyB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXIvZm9ybS1jb250cm9sL2NvcmUnO1xyXG5pbXBvcnQgeyBOdW1iZXJDb250cm9sIH0gZnJvbSAnLi9udW1iZXItY29udHJvbCc7XHJcbmltcG9ydCB7IEFzd051bWJlckRpYWxvZyB9IGZyb20gJy4vbnVtYmVyLWRpYWxvZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXN3LW51bWJlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbnVtYmVyLmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3dOdW1iZXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuICAgIGNvbnN0YW50czogYW55ID0gQ29uc3RhbnRzO1xyXG4gICAgb2JqZWN0VXRpbHMgPSBPYmplY3RVdGlscztcclxuICAgIGRlY2ltYWxzID0gMTAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBOdW1iZXIgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBjb250cm9sOiBOdW1iZXJDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgICBASW5wdXQoKSBmb3JtQ29udHJvbHM6IGFueVtdID0gW107XHJcbiAgICAvKipcclxuICAgICAqIE51bWJlciBjb250cm9sIGluZGV4IHRvIGhlbHAgdXBkYXRlIG9yIGRlbGV0ZSBidXR0b24gZnJvbSBkcm9wIGFyZWFcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgY29udHJvbEluZGV4ITogbnVtYmVyO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzUHJldmlld1RlbXBsYXRlID0gZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIG51bWJlclVwZGF0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbnRyb2w6IE51bWJlckNvbnRyb2wsIGluZGV4OiBudW1iZXIgfT4oKTtcclxuICAgIEBPdXRwdXQoKSBudW1iZXJEZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gICAgQE91dHB1dCgpIGFzd01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOdW1iZXJDb250cm9sPigpO1xyXG4gICAgQE91dHB1dCgpIGR1cGxpY2F0ZUNvbnRyb2wgPSBuZXcgRXZlbnRFbWl0dGVyPE51bWJlckNvbnRyb2w+KCk7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXHJcbiAgICAgICAgY29uc3QgaWQgPSAoKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKSB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuZ3VpZCA9IHRoaXMuY29udHJvbC5ndWlkID8gdGhpcy5jb250cm9sLmd1aWQgOiBpZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5wdXQudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sIDogbnVsbCBhcyBhbnkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZU51bWJlckRpYWxvZyhjb250cm9sOiBOdW1iZXJDb250cm9sLCBjb250cm9sSW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXN3Q29uZmlybURpYWxvZywge1xyXG4gICAgICAgICAgICB3aWR0aDogJzM1MHB4JyxcclxuICAgICAgICAgICAgZGF0YTogeyBuYW1lOiBjb250cm9sLmNvbnRyb2xUeXBlLCBtZXNzYWdlOiB0aGlzLmNvbnN0YW50cy5tZXNzYWdlcy53YXJpbmdNZXNzYWdlIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm51bWJlckRlbGV0ZUV2ZW50LmVtaXQoY29udHJvbEluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXROdW1iZXJEaWFsb2coY29udHJvbDogTnVtYmVyQ29udHJvbCwgY29udHJvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFzd051bWJlckRpYWxvZywge1xyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiAnODAlJyxcclxuICAgICAgICAgICAgbWluV2lkdGg6ICc3MHZ3JyxcclxuICAgICAgICAgICAgZGF0YTogY29udHJvbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVXBkYXRlRXZlbnQuZW1pdCh7IGNvbnRyb2w6IHJlc3VsdCwgaW5kZXg6IGNvbnRyb2xJbmRleCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGNvbnRyb2w6IE51bWJlckNvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjYWxjdWxhdGlvbkNvbnRyb2xzID0gdGhpcy5mb3JtQ29udHJvbHMuZmlsdGVyKHggPT4geC5jb250cm9sVHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyk7XHJcbiAgICAgICAgY2FsY3VsYXRpb25Db250cm9scy5mb3JFYWNoKGNhbGN1bGF0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlQ29udHJvbHMgPSBjYWxjdWxhdGlvbi5vcGVyYXRpb25zLmZpbHRlcigoeDogYW55KSA9PiB4LmlkID09PSBjb250cm9sLmd1aWQpO1xyXG4gICAgICAgICAgICB1cGRhdGVDb250cm9scy5mb3JFYWNoKCh5OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHkubGFiZWwgPSBjb250cm9sLmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgeS52YWx1ZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYWxjdWxhdGlvbi52YWx1ZSA9IHRoaXMub2JqZWN0VXRpbHMuY2FsY3VsYXRlVmFsdWUoY2FsY3VsYXRpb24ub3BlcmF0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXN3TW9kZWxDaGFuZ2UuZW1pdChjb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBkdXBsaWNhdGVOdW1iZXJDb250cm9sKGNvbnRyb2w6IE51bWJlckNvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmR1cGxpY2F0ZUNvbnRyb2wuZW1pdChjb250cm9sKTtcclxuICAgIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbCBhcyBjb250cm9sXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgW2FwcGVhcmFuY2VdPVwiY29udHJvbC5zdHlsZVwiIGNsYXNzPVwiYXN3LW1hdC1mb3JtLWZpZWxkIHt7Y29udHJvbC5jdXN0b21DbGFzc319XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57e2NvbnRyb2wubGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIGFzd051bWJlcnNPbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRyb2wudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoY29udHJvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVjaW1hbHNdPVwiZGVjaW1hbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJjb250cm9sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cImNvbnRyb2wubWF4bGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJjb250cm9sLm1pbmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJjb250cm9sLmlzUmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5pc0Rpc2FibGVkID8gdHJ1ZSA6IGZhbHNlXCI+XHJcbiAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImFzdy1tYXQtZXJyb3JcIiAqbmdJZj1cImlucHV0LmludmFsaWQgJiYgKGlucHV0LmRpcnR5IHx8IGlucHV0LnRvdWNoZWQpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3ctbWF0LWVycm9yXCIgKm5nSWY9XCJpbnB1dD8uZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAge3tjb250cm9sLmxhYmVsfX0gaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3ctbWF0LWVycm9yXCIgKm5nSWY9XCJpbnB1dD8uZXJyb3JzPy5taW5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIFNvcnJ5LCB7e2NvbnRyb2wubGFiZWx9fSBtdXN0IGJlIGF0IGxlYXN0IHt7Y29udHJvbC5taW5sZW5ndGh9fSBjaGFyYWN0ZXJzIGxvbmcuXHJcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc1ByZXZpZXdUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRHVwbGljYXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2JlbG93J1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlTnVtYmVyQ29udHJvbChjb250cm9sKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRWRpdFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXROdW1iZXJEaWFsb2coY29udHJvbCwgY29udHJvbEluZGV4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZU51bWJlckRpYWxvZyhjb250cm9sLCBjb250cm9sSW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==