UNPKG

@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

129 lines 25.6 kB
/** * @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 } from '@angular/core'; import { AswConfirmDialog } from '@asoftwareworld/form-builder/form-control/confirm-dialog'; import { Constants, ObjectUtils } from '@asoftwareworld/form-builder/form-control/core'; import { AswCalculationDialog } from './calculation-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"; export class AswCalculation { dialog; constants = Constants; /** * Calculation control */ control = null; formControls = []; /** * Calculation control index to help update or delete button from drop area */ controlIndex; isPreviewTemplate = false; calculationUpdateEvent = new EventEmitter(); calculationDeleteEvent = new EventEmitter(); aswModelChange = new EventEmitter(); duplicateControl = new EventEmitter(); constructor(dialog) { this.dialog = dialog; } deleteCalculationDialog(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.calculationDeleteEvent.emit(controlIndex); } }); } editCalculationDialog(control, formControls, controlIndex) { const numberControls = formControls.filter(x => x.controlType === 'number'); if (!numberControls.length) { control.operations = []; } if (!control.operations.length) { numberControls.forEach((x, index) => { control.operations.push(this.setControloperations(x, index)); }); } else { control.operations.map((operation, index) => { const numberControl = numberControls.find(element => element.guid === operation.id); if (numberControl) { const updatedOperation = { id: numberControl.guid, label: numberControl.label, value: numberControl.value, operationValue: operation.operationValue, control: numberControl }; control.operations.splice(index, 1, updatedOperation); } }); } const dialogRef = this.dialog.open(AswCalculationDialog, { disableClose: true, width: '80%', minWidth: '70vw', data: { control, numberControls } }); dialogRef.afterClosed().subscribe(result => { if (result !== undefined) { result.value = ObjectUtils.calculateValue(result.operations).toString(); this.calculationUpdateEvent.emit({ control: result, index: controlIndex }); } }); } setControloperations(control, index) { const operation = { id: control.guid, label: control.label, value: control.value, operationValue: index === 0 ? '' : '+', control }; return operation; } onChange(control) { this.aswModelChange.emit(control); } duplicateCalculationControl(control) { this.duplicateControl.emit(control); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswCalculation, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswCalculation, selector: "asw-calculation", inputs: { control: "control", formControls: "formControls", controlIndex: "controlIndex", isPreviewTemplate: "isPreviewTemplate" }, outputs: { calculationUpdateEvent: "calculationUpdateEvent", calculationDeleteEvent: "calculationDeleteEvent", aswModelChange: "aswModelChange", duplicateControl: "duplicateControl" }, 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\"\r\n [placeholder]=\"control.placeholder\"\r\n [(ngModel)]=\"control.value\"\r\n #input=\"ngModel\"\r\n (ngModelChange)=\"onChange(control)\"\r\n [matTooltip]=\"control.tooltip\" [disabled]=\"true\">\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>\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)=\"duplicateCalculationControl(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)=\"editCalculationDialog(control, formControls, 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)=\"deleteCalculationDialog(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.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"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswCalculation, decorators: [{ type: Component, args: [{ selector: 'asw-calculation', 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\"\r\n [placeholder]=\"control.placeholder\"\r\n [(ngModel)]=\"control.value\"\r\n #input=\"ngModel\"\r\n (ngModelChange)=\"onChange(control)\"\r\n [matTooltip]=\"control.tooltip\" [disabled]=\"true\">\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>\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)=\"duplicateCalculationControl(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)=\"editCalculationDialog(control, formControls, 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)=\"deleteCalculationDialog(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 }], calculationUpdateEvent: [{ type: Output }], calculationDeleteEvent: [{ type: Output }], aswModelChange: [{ type: Output }], duplicateControl: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvY2FsY3VsYXRpb24vY2FsY3VsYXRpb24udHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvY2FsY3VsYXRpb24vY2FsY3VsYXRpb24uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFHeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFNNUQsTUFBTSxPQUFPLGNBQWM7SUFxQko7SUFuQm5CLFNBQVMsR0FBUSxTQUFTLENBQUM7SUFDM0I7O09BRUc7SUFDTSxPQUFPLEdBQThCLElBQUksQ0FBQztJQUMxQyxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBRWxDOztPQUVHO0lBQ00sWUFBWSxDQUFVO0lBRXRCLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUV6QixzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBa0QsQ0FBQztJQUM1RixzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3BELGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUN4RCxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUVwRSxZQUFtQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO0lBQ3BDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxPQUEyQixFQUFFLFlBQW9CO1FBQ3JFLE1BQU0sU0FBUyxHQUFH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Q0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBc0IsRUFBRSxLQUFhO1FBQzlELE1BQU0sU0FBUyxHQUFHO1lBQ2QsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2hCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDcEIsY0FBYyxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRztZQUN0QyxPQUFPO1NBQ1YsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBMkI7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELDJCQUEyQixDQUFDLE9BQTJCO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQzt3R0E1RlEsY0FBYzs0RkFBZCxjQUFjLG9YQ3BCM0IseXJFQTBDZTs7NEZEdEJGLGNBQWM7a0JBSjFCLFNBQVM7K0JBQ0ksaUJBQWlCOzhFQVNsQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBU1cgKEEgU29mdHdhcmUgV29ybGQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXHJcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcclxuICovXHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBBc3dDb25maXJtRGlhbG9nIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci9mb3JtLWNvbnRyb2wvY29uZmlybS1kaWFsb2cnO1xyXG5pbXBvcnQgeyBDb25zdGFudHMsIE9iamVjdFV0aWxzIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci9mb3JtLWNvbnRyb2wvY29yZSc7XHJcbmltcG9ydCB7IE51bWJlckNvbnRyb2wgfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyL2Zvcm0tY29udHJvbC9udW1iZXInO1xyXG5pbXBvcnQgeyBDYWxjdWxhdGlvbkNvbnRyb2wgfSBmcm9tICcuL2NhbGN1bGF0aW9uLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBBc3dDYWxjdWxhdGlvbkRpYWxvZyB9IGZyb20gJy4vY2FsY3VsYXRpb24tZGlhbG9nJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhc3ctY2FsY3VsYXRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGN1bGF0aW9uLmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3dDYWxjdWxhdGlvbiB7XHJcblxyXG4gICAgY29uc3RhbnRzOiBhbnkgPSBDb25zdGFudHM7XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0aW9uIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgY29udHJvbDogQ2FsY3VsYXRpb25Db250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgICBASW5wdXQoKSBmb3JtQ29udHJvbHM6IGFueVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGlvbiBjb250cm9sIGluZGV4IHRvIGhlbHAgdXBkYXRlIG9yIGRlbGV0ZSBidXR0b24gZnJvbSBkcm9wIGFyZWFcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgY29udHJvbEluZGV4ITogbnVtYmVyO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzUHJldmlld1RlbXBsYXRlID0gZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIGNhbGN1bGF0aW9uVXBkYXRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29udHJvbDogQ2FsY3VsYXRpb25Db250cm9sLCBpbmRleDogbnVtYmVyIH0+KCk7XHJcbiAgICBAT3V0cHV0KCkgY2FsY3VsYXRpb25EZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gICAgQE91dHB1dCgpIGFzd01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxjdWxhdGlvbkNvbnRyb2w+KCk7XHJcbiAgICBAT3V0cHV0KCkgZHVwbGljYXRlQ29udHJvbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsY3VsYXRpb25Db250cm9sPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykge1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZUNhbGN1bGF0aW9uRGlhbG9nKGNvbnRyb2w6IENhbGN1bGF0aW9uQ29udHJvbCwgY29udHJvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFzd0NvbmZpcm1EaWFsb2csIHtcclxuICAgICAgICAgICAgd2lkdGg6ICczNTBweCcsXHJcbiAgICAgICAgICAgIGRhdGE6IHsgbmFtZTogY29udHJvbC5jb250cm9sVHlwZSwgbWVzc2FnZTogdGhpcy5jb25zdGFudHMubWVzc2FnZXMud2FyaW5nTWVzc2FnZSB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGlvbkRlbGV0ZUV2ZW50LmVtaXQoY29udHJvbEluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRDYWxjdWxhdGlvbkRpYWxvZyhjb250cm9sOiBDYWxjdWxhdGlvbkNvbnRyb2wsIGZvcm1Db250cm9sczogYW55W10sIGNvbnRyb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbnVtYmVyQ29udHJvbHMgPSBmb3JtQ29udHJvbHMuZmlsdGVyKHggPT4geC5jb250cm9sVHlwZSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIGlmICghbnVtYmVyQ29udHJvbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wub3BlcmF0aW9ucyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbnRyb2wub3BlcmF0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbnVtYmVyQ29udHJvbHMuZm9yRWFjaCgoeCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wub3BlcmF0aW9ucy5wdXNoKHRoaXMuc2V0Q29udHJvbG9wZXJhdGlvbnMoeCwgaW5kZXgpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udHJvbC5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyQ29udHJvbCA9IG51bWJlckNvbnRyb2xzLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50Lmd1aWQgPT09IG9wZXJhdGlvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRPcGVyYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudW1iZXJDb250cm9sLmd1aWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBudW1iZXJDb250cm9sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVtYmVyQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uVmFsdWU6IG9wZXJhdGlvbi5vcGVyYXRpb25WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDogbnVtYmVyQ29udHJvbFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vcGVyYXRpb25zLnNwbGljZShpbmRleCwgMSwgdXBkYXRlZE9wZXJhdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBc3dDYWxjdWxhdGlvbkRpYWxvZywge1xyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiAnODAlJyxcclxuICAgICAgICAgICAgbWluV2lkdGg6ICc3MHZ3JyxcclxuICAgICAgICAgICAgZGF0YTogeyBjb250cm9sLCBudW1iZXJDb250cm9scyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gT2JqZWN0VXRpbHMuY2FsY3VsYXRlVmFsdWUocmVzdWx0Lm9wZXJhdGlvbnMpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0aW9uVXBkYXRlRXZlbnQuZW1pdCh7IGNvbnRyb2w6IHJlc3VsdCwgaW5kZXg6IGNvbnRyb2xJbmRleCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q29udHJvbG9wZXJhdGlvbnMoY29udHJvbDogTnVtYmVyQ29udHJvbCwgaW5kZXg6IG51bWJlcik6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xyXG4gICAgICAgICAgICBpZDogY29udHJvbC5ndWlkLFxyXG4gICAgICAgICAgICBsYWJlbDogY29udHJvbC5sYWJlbCxcclxuICAgICAgICAgICAgdmFsdWU6IGNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIG9wZXJhdGlvblZhbHVlOiBpbmRleCA9PT0gMCA/ICcnIDogJysnLFxyXG4gICAgICAgICAgICBjb250cm9sXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gb3BlcmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGNvbnRyb2w6IENhbGN1bGF0aW9uQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXN3TW9kZWxDaGFuZ2UuZW1pdChjb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBkdXBsaWNhdGVDYWxjdWxhdGlvbkNvbnRyb2woY29udHJvbDogQ2FsY3VsYXRpb25Db250cm9sKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kdXBsaWNhdGVDb250cm9sLmVtaXQoY29udHJvbCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wgYXMgY29udHJvbFwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImNvbnRyb2wuc3R5bGVcIiBjbGFzcz1cImFzdy1tYXQtZm9ybS1maWVsZCB7e2NvbnRyb2wuY3VzdG9tQ2xhc3N9fVwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3tjb250cm9sLmxhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29udHJvbC5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNpbnB1dD1cIm5nTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZShjb250cm9sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImNvbnRyb2wudG9vbHRpcFwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+XHJcbiAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImFzdy1tYXQtZXJyb3JcIiAqbmdJZj1cImlucHV0LmludmFsaWQgJiYgKGlucHV0LmRpcnR5IHx8IGlucHV0LnRvdWNoZWQpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJhc3ctbWF0LWVycm9yXCIgKm5nSWY9XCJpbnB1dD8uZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAge3tjb250cm9sLmxhYmVsfX0gaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzUHJldmlld1RlbXBsYXRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEdXBsaWNhdGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVDYWxjdWxhdGlvbkNvbnRyb2woY29udHJvbClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q2FsY3VsYXRpb25EaWFsb2coY29udHJvbCwgZm9ybUNvbnRyb2xzLCBjb250cm9sSW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2JlbG93J1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ2FsY3VsYXRpb25EaWFsb2coY29udHJvbCwgY29udHJvbEluZGV4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L25nLWNvbnRhaW5lcj4iXX0=