UNPKG

@infordata-web/portal-common-component-lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.

130 lines 26.8 kB
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; import { FormGroupDirective, FormGroup, FormControl } from '@angular/forms'; import { MatTableDataSource } from '@angular/material/table'; import { Subject } from 'rxjs'; import { ComponentOutputStatus } from '../../normalizzazione/component-output-status'; import { DomicilioDTO } from '../../models/domicilio-dto'; import { ContattoDTO } from '../../models/contatto-dto'; import { SelectionModel } from '@angular/cdk/collections'; import { ComponentReducer } from '../../utils/component-reducer'; import { map, shareReplay, startWith, tap } from 'rxjs/operators'; import { MessageService } from '../../services/message.service'; export class DatiDomicilioComponent { constructor(msg) { this.msg = msg; this.done = new EventEmitter(); this.displayedColumns = ['tipo', 'presso', 'indirizzo', 'preferito', 'seleziona']; this.changesRecapito$ = new Subject(); this.validazioneDomicilio = false; this.tipoToltip = "tipo"; this.pressoToltip = "presso"; this.indirizzoToltip = "indirizzo"; this.selezionaToltip = "seleziona"; this.preferitoToltip = "preferito"; } ngOnInit() { // console.log('[domicilio]', this.domicilio); console.log('[domicili]', this.domicili); this.form = new FormGroup({}); let valid = true; if (!this.domicilio) { this.initDomicilio(); valid = false; } this.dataSource = new MatTableDataSource(this.domicili); this.selection = new SelectionModel(false, []); this.initialSelection(); const domicilio = new FormControl({ value: this.domicilio.hasSelezionatoDomicilio, disabled: false }); this.form.addControl('domicilio', domicilio); const selected = new FormControl({ value: '', disabled: false }); this.form.addControl('selected', selected); this.checkDomicilio$ = domicilio.valueChanges.pipe(shareReplay()) .pipe(tap(checkDomicilio => { if (checkDomicilio == false) { this.selection.clear(); } }), startWith(this.domicilio.idDomicilioSelezionato != null)); const changesCheckDomicilio$ = this.checkDomicilio$.pipe(map(checkDomicilio => ComponentOutputStatus.of(true, (domicilio) => { domicilio.hasSelezionatoDomicilio = checkDomicilio; if (checkDomicilio == false) { domicilio.contatto.email = null; domicilio.contatto.pec = null; domicilio.contatto.telefono = null; this.form.get('selected').setValue(''); } }))); const changesDomicilio$ = this.selection.changed.pipe(tap((value) => { // console.log("changesDomicilio$", value); this.validazioneDomicilio = value.added.length > 0 ? false : true; }), map(change => ComponentOutputStatus.of(true, domicilio => { domicilio.idDomicilioSelezionato = change.added.length > 0 ? change.added[0].id : null; }))); this.subscription = ComponentReducer.reducer3(changesCheckDomicilio$, changesDomicilio$, this.changesRecapito$, domicilio => { return domicilio.hasSelezionatoDomicilio ? domicilio.idDomicilioSelezionato != null : true; }, ComponentOutputStatus.of(true, this.domicilio)) .subscribe(domicilio => { // console.log('[DatiDomicilioComponent] status', status); this.done.emit(domicilio); }); this.form.setValidators(form => { if (form.get('domicilio').value && !form.get('selected').value) { this.validazioneDomicilio = true; return { requiredDomicilio: true }; } else { return null; } //TODO // return form.get('domicilio').value && // !form.get('selected').value ? // // this.selection.isEmpty() ? // // this.selection.selected.length === 1 ? // { requiredDomicilio: true } : null; }); } initialSelection() { if (this.domicilio.idDomicilioSelezionato) { setTimeout(() => { this.dataSource.data .forEach(row => { if (row.id == this.domicilio.idDomicilioSelezionato) { this.selection.select(row); this.validazioneDomicilio = false; } }); }, 0); } } initDomicilio() { this.domicilio = new DomicilioDTO(); this.domicilio.contatto = new ContattoDTO(); } recapitiReady(recapitiStatus) { // console.log('[recapitiReady]', recapitiStatus); this.changesRecapito$.next(recapitiStatus.mapValue((contatto) => (dich) => (dich.contatto = contatto))); } ngOnDestroy() { if (this.subscription != null) { this.subscription.unsubscribe(); } } } DatiDomicilioComponent.decorators = [ { type: Component, args: [{ selector: 'lib-dati-domicilio', template: "<mat-expansion-panel class=\"panel\" [expanded]=\"domicilio.hasSelezionatoDomicilio\">\r\n\t<mat-expansion-panel-header [collapsedHeight]=\"'48px'\" [expandedHeight]=\"'48px'\" class=\"custom-header\">\r\n\t\t<mat-panel-title>\r\n\t\t\t<!-- <h3>{{'domicilio' | traduzione}}</h3> -->\r\n\t\t\t<h3 class=\"mb-0 h5\"><info-tip-label label=\"domicilio\"></info-tip-label></h3>\r\n\t\t</mat-panel-title>\r\n\t</mat-expansion-panel-header>\r\n\t<form [formGroup]=\"form\">\r\n\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t<div class=\"row\">\r\n\t\t\t\t<section class=\"example-section col-md-2\">\r\n\t\t\t\t\t<mat-checkbox\r\n\t\t\t\t\t\tformControlName=\"domicilio\"\r\n\t\t\t\t\t\tclass=\"example-margin\">\r\n\t\t\t\t\t\t<!-- {{'seleziona-domicilio' | traduzione}} -->\r\n\t\t\t\t\t\t<info-tip-label label=\"seleziona-domicilio\"></info-tip-label>\r\n\t\t\t\t\t</mat-checkbox>\r\n\t\t\t\t</section>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<ng-container *ngIf=\"checkDomicilio$ | async\">\r\n\r\n\t\t<h4 class=\"border-bottom font-weight-bold mt-4 h5\"><info-tip-label label=\"domicili-inseriti\"></info-tip-label></h4>\r\n <ng-container *ngIf=\"domicili?.length > 0; else noDomicili\">\r\n\t\t\t<mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8 mt-3 border\">\r\n\r\n\t\t\t\t<!-- Tipo Column -->\r\n\t\t\t\t<ng-container matColumnDef=\"tipo\">\r\n\t\t\t\t\t<mat-header-cell *matHeaderCellDef> {{'tipo' | traduzione}} </mat-header-cell>\r\n\t\t\t\t\t<mat-cell *matCellDef=\"let element\"> {{element.tipoDomicilio.descrizione}} </mat-cell>\r\n\t\t\t\t\t<!-- <mat-hint *infoTip=\"tipoToltip\"></mat-hint> -->\r\n\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t<!-- Presso Column -->\r\n\t\t\t\t<ng-container matColumnDef=\"presso\">\r\n\t\t\t\t\t<mat-header-cell *matHeaderCellDef> {{'presso' | traduzione}} </mat-header-cell>\r\n\t\t\t\t\t<mat-cell *matCellDef=\"let element\"> {{element.indirizzo.presso}} </mat-cell>\r\n\t\t\t\t\t<!-- <mat-hint *infoTip=\"pressoToltip\"></mat-hint> -->\r\n\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t<!-- Indirizzo Column -->\r\n\t\t\t\t<ng-container matColumnDef=\"indirizzo\">\r\n\t\t\t\t\t<mat-header-cell *matHeaderCellDef> {{'indirizzo' | traduzione}} </mat-header-cell>\r\n\t\t\t\t\t<mat-cell *matCellDef=\"let element\">\r\n\t\t\t\t\t\t<span *ngIf=\"!element.indirizzo.estero\"> {{element.indirizzo.indirizzo}}\r\n\t\t\t\t\t\t\t{{element.indirizzo.civico}} {{element.indirizzo.cap}} -\r\n\t\t\t\t\t\t\t{{element.indirizzo.comune.denominazione}} {{element.indirizzo.provinciaLabel}}</span>\r\n\t\t\t\t\t\t<span *ngIf=\"element.indirizzo.estero\"> {{element.indirizzo.nazione.denominazione}} -\r\n\t\t\t\t\t\t\t{{element.indirizzo.indirizzo}} </span>\r\n\t\t\t\t\t</mat-cell>\r\n\t\t\t\t\t<!-- <mat-hint *infoTip=\"indirizzoToltip\"></mat-hint> -->\r\n\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t<!-- Preferito Column -->\r\n\t\t\t\t<ng-container matColumnDef=\"preferito\">\r\n\t\t\t\t\t<mat-header-cell *matHeaderCellDef> {{'preferito' | traduzione}} </mat-header-cell>\r\n\t\t\t\t\t<mat-cell *matCellDef=\"let element\">\r\n\t\t\t\t\t\t<!-- <mat-checkbox class=\"example-margin\" [disabled]=\"true\">\r\n\t\t\t\t\t\t</mat-checkbox> -->\r\n\t\t\t\t\t\t<!-- <mat-checkbox *ngIf=\"!element.preferito\" class=\"example-margin\" [disabled]=\"true\">\r\n\t\t\t\t\t\t</mat-checkbox> -->\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"element.preferito\" class=\"example-margin\" [checked]=\"true\"\r\n\t\t\t\t\t\t\t[disabled]=\"true\"></mat-checkbox>\r\n\t\t\t\t\t</mat-cell>\r\n\t\t\t\t\t<!-- <mat-hint *infoTip=\"preferitoToltip\"></mat-hint> -->\r\n\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t<!-- Selezione Column -->\r\n\t\t\t\t<ng-container matColumnDef=\"seleziona\">\r\n\t\t\t\t\t<mat-header-cell *matHeaderCellDef> {{'seleziona' | traduzione}}\r\n\t\t\t\t\t \t<!-- <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n\t\t\t\t\t\t\t\t\t[checked]=\"selection.hasValue() && isAllSelected()\"\r\n\t\t\t\t\t\t\t\t\t[indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"selected2\">\r\n\t\t\t\t\t\t</mat-checkbox> -->\r\n\t\t\t\t\t\t<!-- <mat-hint *infoTip=\"selezionaToltip\"></mat-hint> -->\r\n\t\t\t\t\t</mat-header-cell>\r\n\r\n\t\t\t\t\t<mat-cell *matCellDef=\"let row\">\r\n\t\t\t\t\t\t<mat-checkbox\r\n\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\r\n\t\t\t\t\t\t\t(change)=\"$event ? selection.toggle(row) : null\"\r\n\t\t\t\t\t\t\t[checked]=\"selection.isSelected(row)\"\r\n\t\t\t\t\t\t\tformControlName=\"selected\">\r\n\t\t\t\t\t\t</mat-checkbox>\r\n\t\t\t\t\t</mat-cell>\r\n\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t<mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\r\n\t\t\t\t<mat-row *matRowDef=\"let row; columns: displayedColumns;\"></mat-row>\r\n\r\n\t\t\t</mat-table>\r\n\t\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t\t<div class=\"col-md-12\">\r\n\t\t\t\t\t<mat-error *ngIf=\"validazioneDomicilio\">\r\n\t\t\t\t\t\t{{'validation-requiredDomicilio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t\t<ng-template #noDomicili>\r\n\t\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t\t<div class=\"col-md-12\">\r\n\t\t\t\t\t<mat-error >\r\n\t\t\t\t\t\t{{'no-domicili' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\r\n\t\t\t<div class=\"collapse-body mt-2\" *ngIf=\"(recapiti$ | async)\">\r\n\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t<div class=\"col-12\">\r\n\t\t\t\t\t\t<mat-card>\r\n\t\t\t\t\t\t\t<lib-contatti\r\n\t\t\t\t\t\t\t\t[contatti]=\"domicilio.contatto\"\r\n\t\t\t\t\t\t\t\t[recapiti$]=\"recapiti$\"\r\n\t\t\t\t\t\t\t\t(done)=\"recapitiReady($event)\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t</lib-contatti>\r\n\t\t\t\t\t\t</mat-card>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t</ng-container>\r\n\t</form>\r\n</mat-expansion-panel>\r\n", styles: [""] },] } ]; DatiDomicilioComponent.ctorParameters = () => [ { type: MessageService } ]; DatiDomicilioComponent.propDecorators = { domicili: [{ type: Input }], recapiti$: [{ type: Input }], domicilio: [{ type: Input }], done: [{ type: Output }], formGroupDirective: [{ type: ViewChild, args: [FormGroupDirective,] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0aS1kb21pY2lsaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItdGVybmkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kZXBvc2l0aS9jb21tb24tY29tcG9uZW50L2RhdGktZG9taWNpbGlvL2RhdGktZG9taWNpbGlvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFTaEUsTUFBTSxPQUFPLHNCQUFzQjtJQXNDbEMsWUFBb0IsR0FBbUI7UUFBbkIsUUFBRyxHQUFI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Q0FBQyxjQUFrRDtRQUN0RSxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDekIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FDNUQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUMxQixDQUNELENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtTQUMvQjtJQUNGLENBQUM7OztZQTFLRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsK3dMQUE4Qzs7YUFFOUM7OztZQVJRLGNBQWM7Ozt1QkFhckIsS0FBSzt3QkFFTCxLQUFLO3dCQUVMLEtBQUs7bUJBR0wsTUFBTTtpQ0FXTixTQUFTLFNBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwRGlyZWN0aXZlLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRPdXRwdXRTdGF0dXMgfSBmcm9tICcuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXMnO1xyXG5pbXBvcnQgeyBEb21pY2lsaW9EVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvZG9taWNpbGlvLWR0byc7XHJcbmltcG9ydCB7IENvbnRhdHRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbnRhdHRvLWR0byc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UmVkdWNlciB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbXBvbmVudC1yZWR1Y2VyJztcclxuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9taWNpbGlvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvcnRhbGUvZG9taWNpbGlvJztcclxuaW1wb3J0IHsgUmVjYXBpdG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9ydGFsZS9yZWNhcGl0byc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2xpYi1kYXRpLWRvbWljaWxpbycsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2RhdGktZG9taWNpbGlvLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9kYXRpLWRvbWljaWxpby5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGlEb21pY2lsaW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHJcblx0QElucHV0KCkgZG9taWNpbGk6IEFycmF5PERvbWljaWxpbz47XHJcblxyXG5cdEBJbnB1dCgpIHJlY2FwaXRpJDogT2JzZXJ2YWJsZTxBcnJheTxSZWNhcGl0bz4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGRvbWljaWxpbzogRG9taWNpbGlvRFRPO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRkb25lOiBFdmVudEVtaXR0ZXI8Q29tcG9uZW50T3V0cHV0U3RhdHVzPERvbWljaWxpb0RUTz4+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wb25lbnRPdXRwdXRTdGF0dXM8RG9taWNpbGlvRFRPPj4oKTtcclxuXHJcblx0c3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG5cdGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gWyd0aXBvJywgJ3ByZXNzbycsICdpbmRpcml6em8nLCAncHJlZmVyaXRvJywgJ3NlbGV6aW9uYSddO1xyXG5cclxuXHRkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuXHJcblx0c2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxEb21pY2lsaW8+O1xyXG5cclxuXHRAVmlld0NoaWxkKEZvcm1Hcm91cERpcmVjdGl2ZSkgZm9ybUdyb3VwRGlyZWN0aXZlOiBGb3JtR3JvdXBEaXJlY3RpdmU7XHJcblxyXG5cdGNoZWNrRG9taWNpbGlvJDogT2JzZXJ2YWJsZTxCb29sZWFuPjtcclxuXHJcblx0Y2hhbmdlc1JlY2FwaXRvJCA9IG5ldyBTdWJqZWN0PFxyXG5cdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzPCh2YWx1ZTogRG9taWNpbGlvRFRPKSA9PiB2b2lkPlxyXG5cdD4oKTtcclxuXHJcblx0dmFsaWRhemlvbmVEb21pY2lsaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0dGlwb1RvbHRpcCA9IFwidGlwb1wiO1xyXG5cdHByZXNzb1RvbHRpcCA9IFwicHJlc3NvXCI7XHJcblx0aW5kaXJpenpvVG9sdGlwID0gXCJpbmRpcml6em9cIjtcclxuXHRzZWxlemlvbmFUb2x0aXAgPSBcInNlbGV6aW9uYVwiO1xyXG5cdHByZWZlcml0b1RvbHRpcCA9IFwicHJlZmVyaXRvXCI7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgbXNnOiBNZXNzYWdlU2VydmljZSkgeyB9XHJcblxyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCdbZG9taWNpbGlvXScsIHRoaXMuZG9taWNpbGlvKTtcclxuXHRcdGNvbnNvbGUubG9nKCdbZG9taWNpbGldJywgdGhpcy5kb21pY2lsaSk7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xyXG5cclxuXHRcdGlmICghdGhpcy5kb21pY2lsaW8pIHtcclxuXHRcdFx0dGhpcy5pbml0RG9taWNpbGlvKCk7XHJcblx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmRvbWljaWxpKTtcclxuXHRcdHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPERvbWljaWxpbz4oZmFsc2UsIFtdKTtcclxuXHJcblx0XHR0aGlzLmluaXRpYWxTZWxlY3Rpb24oKTtcclxuXHJcblx0XHRjb25zdCBkb21pY2lsaW8gPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5kb21pY2lsaW8uaGFzU2VsZXppb25hdG9Eb21pY2lsaW8sIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdkb21pY2lsaW8nLCBkb21pY2lsaW8pO1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGVkID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgnc2VsZWN0ZWQnLCBzZWxlY3RlZCk7XHJcblxyXG5cdFx0dGhpcy5jaGVja0RvbWljaWxpbyQgPSBkb21pY2lsaW8udmFsdWVDaGFuZ2VzLnBpcGUoc2hhcmVSZXBsYXkoKSlcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKGNoZWNrRG9taWNpbGlvID0+IHtcclxuXHRcdFx0XHRcdGlmIChjaGVja0RvbWljaWxpbyA9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLFxyXG5cdFx0XHRcdHN0YXJ0V2l0aCh0aGlzLmRvbWljaWxpby5pZERvbWljaWxpb1NlbGV6aW9uYXRvICE9IG51bGwpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlc0NoZWNrRG9taWNpbGlvJCA9IHRoaXMuY2hlY2tEb21pY2lsaW8kLnBpcGUoXHJcblx0XHRcdG1hcChjaGVja0RvbWljaWxpbyA9PlxyXG5cdFx0XHRcdENvbXBvbmVudE91dHB1dFN0YXR1cy5vZih0cnVlLCAoZG9taWNpbGlvOiBEb21pY2lsaW9EVE8pID0+IHtcclxuXHRcdFx0XHRcdGRvbWljaWxpby5oYXNTZWxlemlvbmF0b0RvbWljaWxpbyA9IGNoZWNrRG9taWNpbGlvO1xyXG5cdFx0XHRcdFx0aWYgKGNoZWNrRG9taWNpbGlvID09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRcdGRvbWljaWxpby5jb250YXR0by5lbWFpbCA9IG51bGw7XHJcblx0XHRcdFx0XHRcdGRvbWljaWxpby5jb250YXR0by5wZWMgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRkb21pY2lsaW8uY29udGF0dG8udGVsZWZvbm8gPSBudWxsO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZCcpLnNldFZhbHVlKCcnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0KSlcclxuXHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlc0RvbWljaWxpbyQgPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnBpcGUoXHJcblx0XHRcdHRhcCgodmFsdWUpID0+IHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImNoYW5nZXNEb21pY2lsaW8kXCIsIHZhbHVlKTtcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXppb25lRG9taWNpbGlvID0gdmFsdWUuYWRkZWQubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZTtcclxuXHRcdFx0fSksXHJcblx0XHRcdG1hcChjaGFuZ2UgPT5cclxuXHRcdFx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodHJ1ZSwgZG9taWNpbGlvID0+IHtcclxuXHRcdFx0XHRcdGRvbWljaWxpby5pZERvbWljaWxpb1NlbGV6aW9uYXRvID0gY2hhbmdlLmFkZGVkLmxlbmd0aCA+IDAgPyBjaGFuZ2UuYWRkZWRbMF0uaWQgOiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQpKVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbiA9IENvbXBvbmVudFJlZHVjZXIucmVkdWNlcjMoXHJcblx0XHRcdGNoYW5nZXNDaGVja0RvbWljaWxpbyQsXHJcblx0XHRcdGNoYW5nZXNEb21pY2lsaW8kLFxyXG5cdFx0XHR0aGlzLmNoYW5nZXNSZWNhcGl0byQsXHJcblx0XHRcdGRvbWljaWxpbyA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIGRvbWljaWxpby5oYXNTZWxlemlvbmF0b0RvbWljaWxpbyA/XHJcblx0XHRcdFx0XHRkb21pY2lsaW8uaWREb21pY2lsaW9TZWxlemlvbmF0byAhPSBudWxsIDogdHJ1ZVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodHJ1ZSwgdGhpcy5kb21pY2lsaW8pXHJcblx0XHQpXHJcblx0XHRcdC5zdWJzY3JpYmUoZG9taWNpbGlvID0+IHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnW0RhdGlEb21pY2lsaW9Db21wb25lbnRdIHN0YXR1cycsIHN0YXR1cyk7XHJcblx0XHRcdFx0dGhpcy5kb25lLmVtaXQoZG9taWNpbGlvKVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmZvcm0uc2V0VmFsaWRhdG9ycyhmb3JtID0+IHtcclxuXHJcblx0XHRcdGlmIChmb3JtLmdldCgnZG9taWNpbGlvJykudmFsdWUgJiYgIWZvcm0uZ2V0KCdzZWxlY3RlZCcpLnZhbHVlKSB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF6aW9uZURvbWljaWxpbyA9IHRydWU7XHJcblx0XHRcdFx0cmV0dXJuIHsgcmVxdWlyZWREb21pY2lsaW86IHRydWUgfVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiBudWxsXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vVE9ET1xyXG5cdFx0XHQvLyByZXR1cm4gZm9ybS5nZXQoJ2RvbWljaWxpbycpLnZhbHVlICYmXHJcblx0XHRcdC8vIFx0IWZvcm0uZ2V0KCdzZWxlY3RlZCcpLnZhbHVlID9cclxuXHRcdFx0Ly8gXHQvLyB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkgP1xyXG5cdFx0XHQvLyBcdC8vIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gMSA/XHJcblx0XHRcdC8vIFx0eyByZXF1aXJlZERvbWljaWxpbzogdHJ1ZSB9IDogbnVsbDtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0aW5pdGlhbFNlbGVjdGlvbigpIHtcclxuXHRcdGlmICh0aGlzLmRvbWljaWxpby5pZERvbWljaWxpb1NlbGV6aW9uYXRvKSB7XHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuZGF0YVNvdXJjZS5kYXRhXHJcblx0XHRcdFx0XHQuZm9yRWFjaChyb3cgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAocm93LmlkID09IHRoaXMuZG9taWNpbGlvLmlkRG9taWNpbGlvU2VsZXppb25hdG8pIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnZhbGlkYXppb25lRG9taWNpbGlvID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9LCAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGluaXREb21pY2lsaW8oKSB7XHJcblx0XHR0aGlzLmRvbWljaWxpbyA9IG5ldyBEb21pY2lsaW9EVE8oKTtcclxuXHRcdHRoaXMuZG9taWNpbGlvLmNvbnRhdHRvID0gbmV3IENvbnRhdHRvRFRPKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVjYXBpdGlSZWFkeShyZWNhcGl0aVN0YXR1czogQ29tcG9uZW50T3V0cHV0U3RhdHVzPENvbnRhdHRvRFRPPikge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1tyZWNhcGl0aVJlYWR5XScsIHJlY2FwaXRpU3RhdHVzKTtcclxuXHRcdHRoaXMuY2hhbmdlc1JlY2FwaXRvJC5uZXh0KFxyXG5cdFx0XHRyZWNhcGl0aVN0YXR1cy5tYXBWYWx1ZSgoY29udGF0dG8pID0+IChkaWNoOiBEb21pY2lsaW9EVE8pID0+XHJcblx0XHRcdFx0KGRpY2guY29udGF0dG8gPSBjb250YXR0bylcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc3Vic2NyaXB0aW9uICE9IG51bGwpIHtcclxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iXX0=