@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
172 lines • 31.9 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { Subject } from 'rxjs';
import { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';
import { CodiceTipoPagamento } from '../../constants/tipo-pagamemto';
import { fromIdAndTipo } from '../../models/modalita-pagamento-dto';
import { PagamentoDTO } from '../../models/pagamento-dto';
import { ComponentOutputStatus } from '../../normalizzazione/component-output-status';
import { MessageService } from '../../services/message.service';
import { ComponentReducer } from '../../utils/component-reducer';
import { toBonificoExtraSepa, toBonificoSepa, toTesoreria, toVagliaBdi } from './modalita-pagamento-mapper';
export class PagamentoComponent {
constructor(msg) {
this.msg = msg;
this.nextStep = new EventEmitter();
this.salvaBozza = new EventEmitter();
this.previousStep = new EventEmitter();
this.direction = 'both-ways';
this.isFinal = false;
this.changesVagliaBdi$ = new Subject();
this.changesAttoPignoramento$ = new Subject();
}
ngOnInit() {
this.form = new FormGroup({});
let valid = true;
if (!this.pagamento) {
this.initPagamento();
valid = false;
}
// console.log('[PagamentoComponent] onInit', this.pagamento);
this.tipoModalitaPagamento = new FormControl({ value: this.pagamento.tipoPagamento, disabled: false }, [Validators.required]);
this.form.addControl('tipoModalitaPagamento', this.tipoModalitaPagamento);
const initalModalitaPagamento = fromIdAndTipo(this.pagamento.idModalitaPagamento, this.pagamento.tipoPagamento);
this.modalitaPagamento = new FormControl({ value: initalModalitaPagamento, disabled: false }, [Validators.required]);
this.form.addControl('modalitaPagamento', this.modalitaPagamento);
const changesTipoModalitaPagamento$ = this.tipoModalitaPagamento.valueChanges
.pipe(shareReplay());
this.modalitaPagamentoPerTipoSelezionato$ = changesTipoModalitaPagamento$
.pipe(tap(_ => this.modalitaPagamento.setValue(null)), tap(_ => this.resetPagamenti()), startWith(this.pagamento.tipoPagamento), switchMap(tipoModalitaPagamento => this.modalitaPagamento$.pipe(map(modalitaPagamentoPF => {
const modalitaPagamentoPerTipo = modalitaPagamentoPF.filter(mod => tipoModalitaPagamento == mod.tipologiaPagamento.codice);
return modalitaPagamentoPerTipo;
}))));
const changesTipoRimborso$ = changesTipoModalitaPagamento$.pipe(map(tipoRimborso => {
return ComponentOutputStatus.of(tipoRimborso != null, (pagamento) => pagamento.tipoPagamento = tipoRimborso);
}));
const changesModalitaRimborso$ = this.modalitaPagamento.valueChanges.pipe(map(rimborso => {
return ComponentOutputStatus.of(true, _ => {
// console.log('[PagamentoComponent] rimborso', rimborso);
if (rimborso != undefined && rimborso != '') {
this.setRimborso(rimborso);
}
});
}));
const pagamentoChanges$ = ComponentReducer.reducer4(changesTipoRimborso$, changesModalitaRimborso$, this.changesVagliaBdi$,
//TODO
this.changesAttoPignoramento$, this.pagamentoValid(), ComponentOutputStatus.of(valid, this.pagamento))
.pipe(shareReplay());
this.isFormValid$ = pagamentoChanges$.pipe(map(_ => _.status), startWith(valid));
pagamentoChanges$.subscribe((pagStatus) => {
console.log("[PagamentoComponent] status", pagStatus);
});
}
pagamentoValid() {
return pagamento => {
let pagamentoValid;
if (pagamento.tipoPagamento) {
switch (pagamento.tipoPagamento) {
case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA):
pagamentoValid = pagamento.bonifico != null;
break;
case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA):
pagamentoValid = pagamento.bonificoExtraSepa != null;
break;
case (CodiceTipoPagamento.CODICE_TESORERIA):
pagamentoValid = pagamento.tesoreria != null;
break;
case (CodiceTipoPagamento.CODICE_VAGLIA):
pagamentoValid = pagamento.vagliaBDI != null;
break;
default:
pagamentoValid = false;
}
}
else {
pagamentoValid = false;
}
return pagamentoValid;
};
}
modalitaComparator(m1, m2) {
return (m1 || {}).idModalitaPagamento == (m2 || {}).idModalitaPagamento;
}
resetPagamenti() {
this.changesVagliaBdi$.next(ComponentOutputStatus.of(true, (p) => p.vagliaBDI = null));
}
setRimborso(rimborso) {
// console.log('[setRimborso]', rimborso);
this.resetModalitaPagamento();
this.pagamento.idModalitaPagamento = rimborso.idModalitaPagamento;
switch (rimborso.tipologiaPagamento.codice) {
case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA):
this.pagamento.bonifico = toBonificoSepa(rimborso);
break;
case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA):
this.pagamento.bonificoExtraSepa = toBonificoExtraSepa(rimborso);
break;
case (CodiceTipoPagamento.CODICE_TESORERIA):
this.pagamento.tesoreria = toTesoreria(rimborso);
break;
case (CodiceTipoPagamento.CODICE_VAGLIA):
this.pagamento.vagliaBDI = toVagliaBdi(rimborso);
break;
default:
}
}
resetModalitaPagamento() {
this.pagamento.idModalitaPagamento = null;
this.pagamento.vagliaBDI = null;
this.pagamento.tesoreria = null;
this.pagamento.bonificoExtraSepa = null;
this.pagamento.bonifico = null;
}
hasSelectedModalitaDiPagamentoAnd(v) {
return this.hasSelectedModalitaDiPagamento() && v;
}
hasSelectedModalitaDiPagamento() {
return this.modalitaPagamento.value;
}
//TODO
isAutoritaGiudiziaria() {
return this.hasSelectedModalitaDiPagamentoAnd(CodiceTipoPagamento.CODICE_BONIFICO_SEPA == this.tipoModalitaPagamento.value);
}
forward(_) {
this.nextStep.emit(this.pagamento);
}
onSalvaBozza(_) {
this.salvaBozza.emit(this.pagamento);
}
backward(_) {
this.previousStep.emit(this.pagamento);
}
complete(_) { }
initPagamento() {
this.pagamento = new PagamentoDTO();
}
//TODO
attoPignoramentoReady(attoPignoramnetoStatus) {
// console.log('[attoPignoramentoReady]', attoPignoramnetoStatus);
this.changesAttoPignoramento$.next(attoPignoramnetoStatus.mapValue((pign) => (at) => at.tribunale = pign));
}
}
PagamentoComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-pagamento',
template: "<mat-expansion-panel class=\"panel\" [expanded]=\"true\">\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>{{'modalita-pagamento' | traduzione}}</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<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'tipologia-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"tipoModalitaPagamento\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let pagamento of tipologiePagamento$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"pagamento.codice\">\r\n\t\t\t\t\t\t\t\t{{pagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['tipoModalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['tipoModalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'modalita-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"modalitaPagamento\" [compareWith]=\"modalitaComparator\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let modalita of modalitaPagamentoPerTipoSelezionato$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"modalita\">\r\n\t\t\t\t\t\t\t\t{{modalita.conto || modalita.tipologiaPagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['modalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['modalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<lib-dati-tribunale *ngIf=\"isAutoritaGiudiziaria()\"\r\n\t\t\t\t(attoPignoramentoReady)=\"attoPignoramentoReady($event)\"\r\n\t\t\t\t[attoPignoramento]=\"attoPignoramento\"\r\n\t\t\t\t[province]=\"province\"\r\n\t\t\t>\r\n\t\t\t</lib-dati-tribunale>\r\n\t\t</div>\r\n\t</form>\r\n</mat-expansion-panel>\r\n<!-- TODO -->\r\n<!-- <div class=\"mt-4\"></div>\r\n<lp-stepper-navigator-rx\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t[isContainerValid]=\"isFormValid$\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(complete)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n>\r\n</lp-stepper-navigator-rx> -->\r\n",
styles: [".mat-card{border-radius:0!important;border-top:5px solid #0a2644}.divider{background-color:#737373;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-value{max-width:100%;width:100%!important}"]
},] }
];
PagamentoComponent.ctorParameters = () => [
{ type: MessageService }
];
PagamentoComponent.propDecorators = {
pagamento: [{ type: Input }],
tipologiePagamento$: [{ type: Input }],
modalitaPagamento$: [{ type: Input }],
province: [{ type: Input }],
attoPignoramento: [{ type: Input }],
nextStep: [{ type: Output }],
salvaBozza: [{ type: Output }],
previousStep: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnYW1lbnRvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJEOi9Qcm9nZXR0aS9EQUcvc29yZ2VudGkvZ2l0bGFiLXRlcm5pL2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tcG9uZW50cy9wYWdhbWVudG8vcGFnYW1lbnRvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsYUFBYSxFQUF3QixNQUFNLHFDQUFxQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUcxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFPNUcsTUFBTSxPQUFPLGtCQUFrQjtJQTRDOUIsWUFBb0IsR0FBbUI7UUFBbkIs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YUFFekM7OztZQVJRLGNBQWM7Ozt3QkFhckIsS0FBSztrQ0FHTCxLQUFLO2lDQUdMLEtBQUs7dUJBR0wsS0FBSzsrQkFHTCxLQUFLO3VCQUdMLE1BQU07eUJBR04sTUFBTTsyQkFHTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvZGljZVRpcG9QYWdhbWVudG8gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGlwby1wYWdhbWVtdG8nO1xyXG5pbXBvcnQgeyBBdHRvUGlnbm9yYW1uZXRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F0dG8tcGlnbm9yYW1lbnRvLWR0byc7XHJcbmltcG9ydCB7IGZyb21JZEFuZFRpcG8sIE1vZGFsaXRhUGFnYW1lbnRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21vZGFsaXRhLXBhZ2FtZW50by1kdG8nO1xyXG5pbXBvcnQgeyBQYWdhbWVudG9EVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFnYW1lbnRvLWR0byc7XHJcbmltcG9ydCB7IExvY2FsaXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvcnRhbGUvbG9jYWxpdGEnO1xyXG5pbXBvcnQgeyBUaXBvbG9naWNhRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RpcG9sb2dpY2EtZC10LW8nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRPdXRwdXRTdGF0dXMgfSBmcm9tICcuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXMnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlZHVjZXIgfSBmcm9tICcuLi8uLi91dGlscy9jb21wb25lbnQtcmVkdWNlcic7XHJcbmltcG9ydCB7IHRvQm9uaWZpY29FeHRyYVNlcGEsIHRvQm9uaWZpY29TZXBhLCB0b1Rlc29yZXJpYSwgdG9WYWdsaWFCZGkgfSBmcm9tICcuL21vZGFsaXRhLXBhZ2FtZW50by1tYXBwZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItcGFnYW1lbnRvJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcGFnYW1lbnRvLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9wYWdhbWVudG8uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdhbWVudG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHRmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cGFnYW1lbnRvOiBQYWdhbWVudG9EVE87XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dGlwb2xvZ2llUGFnYW1lbnRvJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bW9kYWxpdGFQYWdhbWVudG8kOiBPYnNlcnZhYmxlPEFycmF5PE1vZGFsaXRhUGFnYW1lbnRvRFRPPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHJvdmluY2U6IE9ic2VydmFibGU8QXJyYXk8TG9jYWxpdGE+PjtcclxuXHJcblx0QElucHV0KClcclxuXHRhdHRvUGlnbm9yYW1lbnRvOiBBdHRvUGlnbm9yYW1uZXRvRFRPO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRuZXh0U3RlcDogRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0c2FsdmFCb3p6YTogRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHJldmlvdXNTdGVwOiBFdmVudEVtaXR0ZXI8UGFnYW1lbnRvRFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnYW1lbnRvRFRPPigpO1xyXG5cclxuXHR0aXBvTW9kYWxpdGFQYWdhbWVudG86IEZvcm1Db250cm9sO1xyXG5cdG1vZGFsaXRhUGFnYW1lbnRvOiBGb3JtQ29udHJvbDtcclxuXHRwYXRpZW50Q2F0ZWdvcnk6IEZvcm1Db250cm9sO1xyXG5cdGRpcmVjdGlvbjogc3RyaW5nID0gJ2JvdGgtd2F5cyc7XHJcblx0aXNGaW5hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjaGFuZ2VzVmFnbGlhQmRpJCA9IG5ldyBTdWJqZWN0PENvbXBvbmVudE91dHB1dFN0YXR1czwodmFsdWU6IFBhZ2FtZW50b0RUTykgPT4gdm9pZD4+KCk7XHJcblxyXG5cdGlzRm9ybVZhbGlkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcblx0ZGVmYXVsdFZhbHVlTW9kYWxpdGFSaW1ib3JzbzogTW9kYWxpdGFQYWdhbWVudG9EVE87XHJcblxyXG5cdG1vZGFsaXRhUGFnYW1lbnRvUGVyVGlwb1NlbGV6aW9uYXRvJDogT2JzZXJ2YWJsZTxBcnJheTxNb2RhbGl0YVBhZ2FtZW50b0RUTz4+O1xyXG5cclxuXHRjaGFuZ2VzQXR0b1BpZ25vcmFtZW50byQgPSBuZXcgU3ViamVjdDxDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQYWdhbWVudG9EVE8pID0+IHZvaWQ+PigpO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIG1zZzogTWVzc2FnZVNlcnZpY2UpIHsgfVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIXRoaXMucGFnYW1lbnRvKSB7XHJcblx0XHRcdHRoaXMuaW5pdFBhZ2FtZW50bygpO1xyXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCdbUGFnYW1lbnRvQ29tcG9uZW50XSBvbkluaXQnLCB0aGlzLnBhZ2FtZW50byk7XHJcblxyXG5cdFx0dGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8gPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5wYWdhbWVudG8udGlwb1BhZ2FtZW50bywgZGlzYWJsZWQ6IGZhbHNlIH0sXHJcblx0XHRcdFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgndGlwb01vZGFsaXRhUGFnYW1lbnRvJywgdGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8pO1xyXG5cclxuXHRcdGNvbnN0IGluaXRhbE1vZGFsaXRhUGFnYW1lbnRvID0gZnJvbUlkQW5kVGlwbyh0aGlzLnBhZ2FtZW50by5pZE1vZGFsaXRhUGFnYW1lbnRvLCB0aGlzLnBhZ2FtZW50by50aXBvUGFnYW1lbnRvKTtcclxuXHJcblx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGluaXRhbE1vZGFsaXRhUGFnYW1lbnRvLCBkaXNhYmxlZDogZmFsc2UgfSxcclxuXHRcdFx0W1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdtb2RhbGl0YVBhZ2FtZW50bycsIHRoaXMubW9kYWxpdGFQYWdhbWVudG8pO1xyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXNUaXBvTW9kYWxpdGFQYWdhbWVudG8kID0gdGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8udmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHNoYXJlUmVwbGF5KClcclxuXHRcdFx0KTtcclxuXHJcblx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvUGVyVGlwb1NlbGV6aW9uYXRvJCA9IGNoYW5nZXNUaXBvTW9kYWxpdGFQYWdhbWVudG8kXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHRhcChfID0+IHRoaXMubW9kYWxpdGFQYWdhbWVudG8uc2V0VmFsdWUobnVsbCkpLFxyXG5cdFx0XHRcdHRhcChfID0+IHRoaXMucmVzZXRQYWdhbWVudGkoKSksXHJcblx0XHRcdFx0c3RhcnRXaXRoKHRoaXMucGFnYW1lbnRvLnRpcG9QYWdhbWVudG8pLFxyXG5cdFx0XHRcdHN3aXRjaE1hcCh0aXBvTW9kYWxpdGFQYWdhbWVudG8gPT5cclxuXHRcdFx0XHRcdHRoaXMubW9kYWxpdGFQYWdhbWVudG8kLnBpcGUoXHJcblx0XHRcdFx0XHRcdG1hcChtb2RhbGl0YVBhZ2FtZW50b1BGID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtb2RhbGl0YVBhZ2FtZW50b1BlclRpcG8gPSBtb2RhbGl0YVBhZ2FtZW50b1BGLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdG1vZCA9PiB0aXBvTW9kYWxpdGFQYWdhbWVudG8gPT0gbW9kLnRpcG9sb2dpYVBhZ2FtZW50by5jb2RpY2VcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtb2RhbGl0YVBhZ2FtZW50b1BlclRpcG87XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpXHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlc1RpcG9SaW1ib3JzbyQgPSBjaGFuZ2VzVGlwb01vZGFsaXRhUGFnYW1lbnRvJC5waXBlKFxyXG5cdFx0XHRtYXAodGlwb1JpbWJvcnNvID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0dGlwb1JpbWJvcnNvICE9IG51bGwsXHJcblx0XHRcdFx0XHQocGFnYW1lbnRvOiBQYWdhbWVudG9EVE8pID0+IHBhZ2FtZW50by50aXBvUGFnYW1lbnRvID0gdGlwb1JpbWJvcnNvKVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBjaGFuZ2VzTW9kYWxpdGFSaW1ib3JzbyQgPVxyXG5cdFx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdG1hcChyaW1ib3JzbyA9PiB7XHJcblx0XHRcdFx0XHRyZXR1cm4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0XHR0cnVlLFxyXG5cdFx0XHRcdFx0XHRfID0+IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnW1BhZ2FtZW50b0NvbXBvbmVudF0gcmltYm9yc28nLCByaW1ib3Jzbyk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJpbWJvcnNvICE9IHVuZGVmaW5lZCAmJiByaW1ib3JzbyAhPSAnJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRSaW1ib3JzbyhyaW1ib3Jzbyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgcGFnYW1lbnRvQ2hhbmdlcyQ6IE9ic2VydmFibGU8Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBhZ2FtZW50b0RUTz4+ID1cclxuXHRcdFx0Q29tcG9uZW50UmVkdWNlci5yZWR1Y2VyNChcclxuXHRcdFx0XHRjaGFuZ2VzVGlwb1JpbWJvcnNvJCxcclxuXHRcdFx0XHRjaGFuZ2VzTW9kYWxpdGFSaW1ib3JzbyQsXHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VzVmFnbGlhQmRpJCxcclxuXHRcdFx0XHQvL1RPRE9cclxuXHRcdFx0XHR0aGlzLmNoYW5nZXNBdHRvUGlnbm9yYW1lbnRvJCxcclxuXHRcdFx0XHR0aGlzLnBhZ2FtZW50b1ZhbGlkKCksXHJcblx0XHRcdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKHZhbGlkLCB0aGlzLnBhZ2FtZW50bylcclxuXHRcdFx0KVxyXG5cdFx0XHRcdC5waXBlKHNoYXJlUmVwbGF5KCkpO1xyXG5cclxuXHRcdHRoaXMuaXNGb3JtVmFsaWQkID0gcGFnYW1lbnRvQ2hhbmdlcyQucGlwZShtYXAoXyA9PiBfLnN0YXR1cyksIHN0YXJ0V2l0aCh2YWxpZCkpO1xyXG5cclxuXHRcdHBhZ2FtZW50b0NoYW5nZXMkLnN1YnNjcmliZSgocGFnU3RhdHVzKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiW1BhZ2FtZW50b0NvbXBvbmVudF0gc3RhdHVzXCIsIHBhZ1N0YXR1cylcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYWdhbWVudG9WYWxpZCgpOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gcGFnYW1lbnRvID0+IHtcclxuXHRcdFx0bGV0IHBhZ2FtZW50b1ZhbGlkOiBib29sZWFuO1xyXG5cdFx0XHRpZiAocGFnYW1lbnRvLnRpcG9QYWdhbWVudG8pIHtcclxuXHJcblx0XHRcdFx0c3dpdGNoIChwYWdhbWVudG8udGlwb1BhZ2FtZW50bykge1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fU0VQQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLmJvbmlmaWNvICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fRVhUUkFfU0VQQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLmJvbmlmaWNvRXh0cmFTZXBhICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfVEVTT1JFUklBKTpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBwYWdhbWVudG8udGVzb3JlcmlhICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfVkFHTElBKTpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBwYWdhbWVudG8udmFnbGlhQkRJICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHBhZ2FtZW50b1ZhbGlkO1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdG1vZGFsaXRhQ29tcGFyYXRvcihtMTogTW9kYWxpdGFQYWdhbWVudG9EVE8sIG0yOiBNb2RhbGl0YVBhZ2FtZW50b0RUTywpIHtcclxuXHRcdHJldHVybiAobTEgfHwge30pLmlkTW9kYWxpdGFQYWdhbWVudG8gPT0gKG0yIHx8IHt9KS5pZE1vZGFsaXRhUGFnYW1lbnRvO1xyXG5cdH1cclxuXHJcblx0cmVzZXRQYWdhbWVudGkoKSB7XHJcblx0XHR0aGlzLmNoYW5nZXNWYWdsaWFCZGkkLm5leHQoXHJcblx0XHRcdENvbXBvbmVudE91dHB1dFN0YXR1cy5vZih0cnVlLCAocDogUGFnYW1lbnRvRFRPKSA9PiBwLnZhZ2xpYUJESSA9IG51bGwpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c2V0UmltYm9yc28ocmltYm9yc286IE1vZGFsaXRhUGFnYW1lbnRvRFRPKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZygnW3NldFJpbWJvcnNvXScsIHJpbWJvcnNvKTtcclxuXHRcdHRoaXMucmVzZXRNb2RhbGl0YVBhZ2FtZW50bygpO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uaWRNb2RhbGl0YVBhZ2FtZW50byA9IHJpbWJvcnNvLmlkTW9kYWxpdGFQYWdhbWVudG87XHJcblx0XHRzd2l0Y2ggKHJpbWJvcnNvLnRpcG9sb2dpYVBhZ2FtZW50by5jb2RpY2UpIHtcclxuXHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fU0VQQSk6XHJcblx0XHRcdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY28gPSB0b0JvbmlmaWNvU2VwYShyaW1ib3Jzbyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX0JPTklGSUNPX0VYVFJBX1NFUEEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLmJvbmlmaWNvRXh0cmFTZXBhID0gdG9Cb25pZmljb0V4dHJhU2VwYShyaW1ib3Jzbyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX1RFU09SRVJJQSk6XHJcblx0XHRcdFx0dGhpcy5wYWdhbWVudG8udGVzb3JlcmlhID0gdG9UZXNvcmVyaWEocmltYm9yc28pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9WQUdMSUEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLnZhZ2xpYUJESSA9IHRvVmFnbGlhQmRpKHJpbWJvcnNvKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJlc2V0TW9kYWxpdGFQYWdhbWVudG8oKSB7XHJcblx0XHR0aGlzLnBhZ2FtZW50by5pZE1vZGFsaXRhUGFnYW1lbnRvID0gbnVsbDtcclxuXHRcdHRoaXMucGFnYW1lbnRvLnZhZ2xpYUJESSA9IG51bGw7XHJcblx0XHR0aGlzLnBhZ2FtZW50by50ZXNvcmVyaWEgPSBudWxsO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY29FeHRyYVNlcGEgPSBudWxsO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY28gPSBudWxsO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGhhc1NlbGVjdGVkTW9kYWxpdGFEaVBhZ2FtZW50b0FuZCh2OiBib29sZWFuKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5oYXNTZWxlY3RlZE1vZGFsaXRhRGlQYWdhbWVudG8oKSAmJiB2O1xyXG5cdH1cclxuXHRwdWJsaWMgaGFzU2VsZWN0ZWRNb2RhbGl0YURpUGFnYW1lbnRvKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubW9kYWxpdGFQYWdhbWVudG8udmFsdWU7XHJcblx0fVxyXG5cclxuXHQvL1RPRE9cclxuXHRwdWJsaWMgaXNBdXRvcml0YUdpdWRpemlhcmlhKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaGFzU2VsZWN0ZWRNb2RhbGl0YURpUGFnYW1lbnRvQW5kKFxyXG5cdFx0XHRDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9CT05JRklDT19TRVBBID09IHRoaXMudGlwb01vZGFsaXRhUGFnYW1lbnRvLnZhbHVlXHJcblx0XHQpXHJcblx0fVxyXG5cclxuXHRmb3J3YXJkKF8pIHtcclxuXHRcdHRoaXMubmV4dFN0ZXAuZW1pdCh0aGlzLnBhZ2FtZW50byk7XHJcblx0fVxyXG5cclxuXHRvblNhbHZhQm96emEoXykge1xyXG5cdFx0dGhpcy5zYWx2YUJvenphLmVtaXQodGhpcy5wYWdhbWVudG8pO1xyXG5cdH1cclxuXHJcblx0YmFja3dhcmQoXykge1xyXG5cdFx0dGhpcy5wcmV2aW91c1N0ZXAuZW1pdCh0aGlzLnBhZ2FtZW50byk7XHJcblx0fVxyXG5cclxuXHRjb21wbGV0ZShfKSB7IH1cclxuXHJcblx0aW5pdFBhZ2FtZW50bygpIHtcclxuXHRcdHRoaXMucGFnYW1lbnRvID0gbmV3IFBhZ2FtZW50b0RUTygpO1xyXG5cdH1cclxuXHJcblx0Ly9UT0RPXHJcblx0YXR0b1BpZ25vcmFtZW50b1JlYWR5KGF0dG9QaWdub3JhbW5ldG9TdGF0dXM6IENvbXBvbmVudE91dHB1dFN0YXR1czxBdHRvUGlnbm9yYW1uZXRvRFRPPikge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1thdHRvUGlnbm9yYW1lbnRvUmVhZHldJywgYXR0b1BpZ25vcmFtbmV0b1N0YXR1cyk7XHJcblx0XHR0aGlzLmNoYW5nZXNBdHRvUGlnbm9yYW1lbnRvJC5uZXh0KFxyXG5cdFx0XHRhdHRvUGlnbm9yYW1uZXRvU3RhdHVzLm1hcFZhbHVlKFxyXG5cdFx0XHRcdChwaWduKSA9PiAoYXQ6IFBhZ2FtZW50b0RUTykgPT5cclxuXHRcdFx0XHRcdGF0LnRyaWJ1bmFsZSA9IHBpZ25cclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19