@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
153 lines • 27.7 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
import { BehaviorSubject, combineLatest, of, ReplaySubject } from "rxjs";
import { FormGroup } from "@angular/forms";
import { PersonaFisicaDTO } from "../../models/persona-fisica-dto";
import { ComponentOutputStatus } from "../../normalizzazione/component-output-status";
import { DelegheService } from '../../services/deleghe-services/deleghe.service';
import { isNotNull } from "../../utils/fnutils";
import { auditTime, catchError, concatMap, map, startWith, tap } from "rxjs/operators";
const SAMPLE_TIME = 1000;
const EMPTY_PF = {
id: null,
infoAnagrafiche: {
codFiscale: null,
codiceRegione: null,
cognome: null,
nome: null
},
infoNascita: {
comuneNascita: null,
dataNascita: null,
provinciaNascita: null,
nazioneNascita: null,
isNatoEstero: null,
codCatNazioneNascita: null
}
};
export class PersonaFisicaComponent {
constructor(delegheService) {
this.delegheService = delegheService;
this.done = new EventEmitter();
this.changesPF$ = new ReplaySubject(1);
this.changesNascita$ = new ReplaySubject(1);
this.readOnly = false;
this.isPersonaFisicaValid = new BehaviorSubject(false);
this.datiVerifica = {};
}
ngOnInit() {
this.form = new FormGroup({});
let valid = false;
if (!this.infoPersonaFisica) {
this.initPersonaFisica();
valid = false;
}
else {
this.readOnly = true;
}
if (this.idDelega == null || this.nuovaPersona) {
this.readOnly = false;
}
this.namespaceInfoPf = this.namespace + "infoPF";
this.namespaceInfoNascita = this.namespace + "infoNascita";
const mappaProvince$ = this.delegheService.getAllProvince();
this.personaFisicaChangedSub = combineLatest([this.changesPF$, this.changesNascita$, mappaProvince$])
.pipe(map(([validPF, changesNascita, allProvince]) => {
var _a;
let provincia = allProvince[(_a = changesNascita === null || changesNascita === void 0 ? void 0 : changesNascita.output) === null || _a === void 0 ? void 0 : _a.provinciaNascita];
return [validPF, changesNascita, provincia];
}), auditTime(SAMPLE_TIME), concatMap(([infoAnagrafiche, infoNascita, provincia]) => this.getPersonaFisicaValid(infoAnagrafiche, infoNascita, provincia)), startWith(ComponentOutputStatus.of(valid, this.infoPersonaFisica)), tap(pf => this.done.emit(pf)))
.subscribe();
}
getPersonaFisicaValid(infoAnagrafiche, infoNascita, provincia) {
console.log("FORM VALIDITY", infoNascita.status);
if (!infoNascita.status || !infoAnagrafiche.status) {
this.isPersonaFisicaValid.next(false);
return of(ComponentOutputStatus.of(false, EMPTY_PF));
}
return this.validatePersonaFisica(infoAnagrafiche.output, infoNascita.output)
.pipe(tap(() => this.isPersonaFisicaValid.next(true)), map((response) => {
const isPersonaFisicaValid = isNotNull(response);
return this.toValidPf(isPersonaFisicaValid, response, infoAnagrafiche.output, provincia, infoNascita);
}), tap(({ isValid }) => this.isPersonaFisicaValid.next(isValid)), tap(({ persona }) => this.infoPersonaFisica = persona), map(v => ComponentOutputStatus.of(v.isValid, v.persona)), catchError(_ => of(ComponentOutputStatus.of(false, EMPTY_PF))));
}
toValidPf(isPersonaFisicaValid, response, infoAnagrafiche, provincia, infoNascita) {
var _a, _b;
return {
isValid: isPersonaFisicaValid,
persona: {
id: response === null || response === void 0 ? void 0 : response.id,
infoAnagrafiche: {
codFiscale: String(infoAnagrafiche.codFiscale),
codiceRegione: String(provincia === null || provincia === void 0 ? void 0 : provincia.siglaReg),
cognome: String(infoAnagrafiche.cognome),
nome: String(infoAnagrafiche.nome)
},
infoNascita: {
comuneNascita: ((_a = infoNascita === null || infoNascita === void 0 ? void 0 : infoNascita.output) === null || _a === void 0 ? void 0 : _a.comuneNascita) ? String(infoNascita.output.comuneNascita) : null,
dataNascita: infoNascita.output.dataNascita,
provinciaNascita: String(infoNascita.output.provinciaNascita),
nazioneNascita: String(infoNascita.output.nazioneNascita),
codCatNazioneNascita: String(infoNascita.output.codCatNazioneNascita),
isNatoEstero: ((_b = infoNascita.output) === null || _b === void 0 ? void 0 : _b.isNatoEstero) ? infoNascita.output.isNatoEstero : false
}
}
};
}
validatePersonaFisica(infoAnagrafiche, infoNascita) {
// var d = new Date(infoNascita.dataNascita);
// d.toLocaleString('it-IT', { timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone })
return this.delegheService.getValidaPersonaFisica({
codiceFiscale: infoAnagrafiche.codFiscale,
cognome: infoAnagrafiche.cognome,
comune: (infoNascita === null || infoNascita === void 0 ? void 0 : infoNascita.isNatoEstero) ? null : infoNascita === null || infoNascita === void 0 ? void 0 : infoNascita.comuneNascita
// , dataNascita: new Date(moment(infoNascita.dataNascita, 'DD/MM/YYYY').add(23, 'hour').add(59, 'minute').add(59, 'second').toDate())
,
dataNascita: new Date(infoNascita.dataNascita).toISOString(),
nome: infoAnagrafiche.nome,
provinciaNascita: infoNascita.provinciaNascita,
siglaNazione: infoNascita.nazioneNascita,
codCatNazioneNascita: infoNascita === null || infoNascita === void 0 ? void 0 : infoNascita.codCatNazioneNascita
});
}
initPersonaFisica() {
this.infoPersonaFisica = new PersonaFisicaDTO();
}
infoPfReady(inFoPfStatus) {
// console.log("[infoPfReady]", inFoPfStatus);
this.changesPF$.next(inFoPfStatus);
}
infoNascitaReady(infoNascitaPf) {
// console.log("[infoNascitaReady]", infoNascitaPf);
this.changesNascita$.next(infoNascitaPf);
}
ngOnDestroy() {
this.personaFisicaChangedSub.unsubscribe();
}
resetForm() {
this.infoPF._resetForm();
this.infoNascita._resetForm();
}
}
PersonaFisicaComponent.decorators = [
{ type: Component, args: [{
selector: "lib-persona-fisica",
template: "<form [formGroup]=\"form\">\r\n\t<lib-info-pf\r\n\t\t[cfDifferentFrom]=\"cfDifferentFrom\"\r\n\t\t[namespace]=\"namespaceInfoPf\"\r\n\t\t(done)=\"infoPfReady($event)\"\r\n\t\t[infopf]=\"infoPersonaFisica?.infoAnagrafiche\"\r\n\t\t[readOnly]=\"readOnly\"\r\n\t\t[validatorFormControl]=\"true\"\r\n\t\t#infoPF\r\n\t>\r\n\t</lib-info-pf>\r\n\t<lib-info-nascita\r\n\t\t[province]=\"province\"\r\n\t\t(done)=\"infoNascitaReady($event)\"\r\n\t\t[infonascita]=\"infoPersonaFisica?.infoNascita\"\r\n\t\t[readOnly]=\"readOnly\"\r\n\t\t#infoNascita\r\n\t>\r\n\t</lib-info-nascita>\r\n\t<div class=\"collapse-body mt-2\">\r\n\t\t<div class=\"col-md-12\">\r\n\t\t\t<mat-error *ngIf=\"!(isPersonaFisicaValid | async)\">\r\n\t\t\t\t{{'validationPF' | traduzione }}\r\n\t\t\t</mat-error>\r\n\t\t</div>\r\n\t</div>\r\n</form>\r\n",
styles: [""]
},] }
];
PersonaFisicaComponent.ctorParameters = () => [
{ type: DelegheService }
];
PersonaFisicaComponent.propDecorators = {
infoPersonaFisica: [{ type: Input }],
cfDifferentFrom: [{ type: Input }],
province: [{ type: Input }],
nazioni: [{ type: Input }],
namespace: [{ type: Input }],
idDelega: [{ type: Input }],
nuovaPersona: [{ type: Input }],
done: [{ type: Output }],
infoPF: [{ type: ViewChild, args: ['infoPF',] }],
infoNascita: [{ type: ViewChild, args: ['infoNascita',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYS1maXNpY2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItc29mdHdhcmVmYWN0b3J5L2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tbW9uLWNvbXBvbmVudC9wZXJzb25hLWZpc2ljYS9wZXJzb25hLWZpc2ljYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQXFCLEVBQUUsRUFBRSxhQUFhLEVBQXlCLE1BQU0sTUFBTSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUt0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saURBQWlELENBQUM7QUFFakYsT0FBTyxFQUFFLFNBQVMsRUFBdUIsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQVUsR0FBRyxFQUFxQixTQUFTLEVBQWEsR0FBRyxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBTTdJLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUV6QixNQUFNLFFBQVEsR0FBcUI7SUFDbEMsRUFBRSxFQUFFLElBQUk7SUFDUixlQUFlLEVBQUU7UUFDaEIsVUFBVSxFQUFFLElBQUk7UUFDaEIsYUFBYSxFQUFFLElBQUk7UUFDbkIsT0FBTyxFQUFFLElBQUk7UUFDYixJQUFJLEVBQUUsSUFBSTtLQUNWO0lBQ0QsV0FBVyxFQUFFO1FBQ1osYUFBYSxFQUFFLElBQUk7UUFDbkIsV0FBVyxFQUFFLElBQUk7UUFDakIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixjQUFjLEVBQUUsSUFBSTtRQUNwQixZQUFZLEVBQUUsSUFBSTtRQUNsQixvQkFBb0IsRUFBRSxJQUFJO0tBQzFCO0NBQ0QsQ0FBQztBQU1GLE1BQU0sT0FBTyxzQkFBc0I7SUFpRGxDLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpCbEQsU0FBSSxHQUVBLElBQUksWUFBWSxFQUEyQyxDQUFDO1FBRWhFLGVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBOEMsQ0FBQyxDQUFDLENBQUM7UUFFL0Usb0JBQWUsR0FBRyxJQUFJLGFBQWEsQ0FBMEMsQ0FBQyxDQUFDLENBQUM7UUFPaEYsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQix5QkFBb0IsR0FBNkIsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUUsaUJBQVksR0FBRyxFQUF1QixDQUFDO0lBUWUsQ0FBQztJQUV2RCxRQUFRO1FBRVAsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUM1QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ2Q7YUFBTTtZQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUNqRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7UUFFM0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUU1RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUMzQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FDdkQ7YUFDQSxJQUFJLENBQ0osR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUU7O1lBQzlDLElBQUksU0FBUyxHQUFHLFdBQVcsT0FBQyxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsTUFBTSwwQ0FBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzVDLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFDdEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FDdkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQ25FLEVBQ0QsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFDbEUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0I7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxxQkFBcUIsQ0FDcEIsZUFBNEQsRUFDNUQsV0FBb0QsRUFDcEQsU0FBOEI7UUFHOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUVuRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQzthQUMzRSxJQUFJLENBRUosR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDL0MsR0FBRyxDQUFDLENBQUMsUUFBK0IsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDdEcsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUM3RCxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLEVBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUN4RCxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQzlELENBQUM7SUFDSixDQUFDO0lBRU8sU0FBUyxDQUNoQixvQkFBNkIsRUFBRSxRQUF5QixFQUFFLGVBQXFDLEVBQy9GLFNBQTZCLEVBQzdCLFdBQW9EOztRQUVwRCxPQUFPO1lBQ04sT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixPQUFPLEVBQUU7Z0JBQ1IsRUFBRSxFQUFFLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxFQUFFO2dCQUNoQixlQUFlLEVBQUU7b0JBQ2hCLFVBQVUsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztvQkFDOUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsUUFBUSxDQUFDO29CQUMxQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7b0JBQ3hDLElBQUksRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztpQkFDbEM7Z0JBQ0QsV0FBVyxFQUFFO29CQUNaLGFBQWEsRUFBRSxPQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxNQUFNLDBDQUFFLGFBQWEsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ25HLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVc7b0JBQzNDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO29CQUM3RCxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO29CQUN6RCxvQkFBb0IsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztvQkFDckUsWUFBWSxFQUFFLE9BQUEsV0FBVyxDQUFDLE1BQU0sMENBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSztpQkFDeEY7YUFDbUI7U0FDckIsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FDcEIsZUFBcUMsRUFDckMsV0FBNkI7UUFHN0IsNkNBQTZDO1FBQzdDLDRGQUE0RjtRQUM1RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQ2hEO1lBQ0MsYUFBYSxFQUFFLGVBQWUsQ0FBQyxVQUFVO1lBQ3ZDLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTztZQUNoQyxNQUFNLEVBQUUsQ0FBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxhQUFhO1lBQ3ZFLHNJQUFzSTs7WUFDcEksV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDNUQsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO1lBQzFCLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxnQkFBZ0I7WUFDOUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxjQUFjO1lBQ3hDLG9CQUFvQixFQUFFLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxvQkFBb0I7U0FDcEMsQ0FDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsV0FBVyxDQUFDLFlBQXlEO1FBQ3BFLDhDQUE4QztRQUU5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBc0Q7UUFDdEUsb0RBQW9EO1FBRXBELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxXQUFXO1FBQ1YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFTSxTQUFTO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQy9CLENBQUM7OztZQWxNRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIseXpCQUE4Qzs7YUFFOUM7OztZQWhDUSxjQUFjOzs7Z0NBcUNyQixLQUFLOzhCQUdMLEtBQUs7dUJBR0wsS0FBSztzQkFHTCxLQUFLO3dCQUdMLEtBQUs7dUJBR0wsS0FBSzsyQkFFTCxLQUFLO21CQUVMLE1BQU07cUJBb0JOLFNBQVMsU0FBQyxRQUFROzBCQUdsQixTQUFTLFNBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q29tcG9uZW50LFxyXG5cdEV2ZW50RW1pdHRlcixcclxuXHRJbnB1dCxcclxuXHRPbkRlc3Ryb3ksXHJcblx0T25Jbml0LFxyXG5cdE91dHB1dCxcclxuXHRWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIEVNUFRZLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFBlcnNvbmFGaXNpY2FEVE8gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BlcnNvbmEtZmlzaWNhLWR0b1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRPdXRwdXRTdGF0dXMgfSBmcm9tIFwiLi4vLi4vbm9ybWFsaXp6YXppb25lL2NvbXBvbmVudC1vdXRwdXQtc3RhdHVzXCI7XHJcbmltcG9ydCB7IEluZm9BbmFncmFmaWNoZVBGRFRPIH0gZnJvbSBcIi4uLy4uL21vZGVscy9pbmZvLWFuYWdyYWZpY2hlLXBmXCI7XHJcbmltcG9ydCB7IEluZm9OYXNjaXRhUEZEVE8gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2luZm8tbmFzY2l0YS1wZi5kdG9cIjtcclxuaW1wb3J0IHsgTG9jYWxpdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BvcnRhbGUvbG9jYWxpdGFcIjtcclxuaW1wb3J0IHsgTmF6aW9uZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcG9ydGFsZS9uYXppb25lXCI7XHJcbmltcG9ydCB7IERlbGVnaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVsZWdoZS1zZXJ2aWNlcy9kZWxlZ2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRpVmVyaWZpY2FDZkRUTyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGF0aS12ZXJpZmNhLWR0b1wiO1xyXG5pbXBvcnQgeyBpc05vdE51bGwsIGlzTm90VW5kZWZpbmVkLCBub3QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZm51dGlsc1wiO1xyXG5pbXBvcnQgeyBhdWRpdFRpbWUsIGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZmlsdGVyLCBtYXAsIHBsdWNrLCBzYW1wbGVUaW1lLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgeyBQcm92aW5jaWFFc3Rlc2FEVE8gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb3ZpbmNpYUVzdGVzYURUT1wiO1xyXG5pbXBvcnQgeyBJbmZvUGZDb21wb25lbnQgfSBmcm9tIFwiLi4vaW5mby1wZi9pbmZvLXBmLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0luZm9OYXNjaXRhQ29tcG9uZW50fSBmcm9tIFwiLi4vaW5mby1uYXNjaXRhL2luZm8tbmFzY2l0YS5jb21wb25lbnRcIlxyXG5cclxuY29uc3QgU0FNUExFX1RJTUUgPSAxMDAwO1xyXG5cclxuY29uc3QgRU1QVFlfUEY6IFBlcnNvbmFGaXNpY2FEVE8gPSB7XHJcblx0aWQ6IG51bGwsXHJcblx0aW5mb0FuYWdyYWZpY2hlOiB7XHJcblx0XHRjb2RGaXNjYWxlOiBudWxsLFxyXG5cdFx0Y29kaWNlUmVnaW9uZTogbnVsbCxcclxuXHRcdGNvZ25vbWU6IG51bGwsXHJcblx0XHRub21lOiBudWxsXHJcblx0fSxcclxuXHRpbmZvTmFzY2l0YToge1xyXG5cdFx0Y29tdW5lTmFzY2l0YTogbnVsbCxcclxuXHRcdGRhdGFOYXNjaXRhOiBudWxsLFxyXG5cdFx0cHJvdmluY2lhTmFzY2l0YTogbnVsbCxcclxuXHRcdG5hemlvbmVOYXNjaXRhOiBudWxsLFxyXG5cdFx0aXNOYXRvRXN0ZXJvOiBudWxsLFxyXG5cdFx0Y29kQ2F0TmF6aW9uZU5hc2NpdGE6IG51bGxcclxuXHR9XHJcbn07XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiBcImxpYi1wZXJzb25hLWZpc2ljYVwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vcGVyc29uYS1maXNpY2EuY29tcG9uZW50Lmh0bWxcIixcclxuXHRzdHlsZVVybHM6IFtcIi4vcGVyc29uYS1maXNpY2EuY29tcG9uZW50LmNzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBlcnNvbmFGaXNpY2FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHJcblx0QElucHV0KClcclxuXHRpbmZvUGVyc29uYUZpc2ljYTogUGVyc29uYUZpc2ljYURUTztcclxuXHJcblx0QElucHV0KClcclxuXHRjZkRpZmZlcmVudEZyb206IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRwcm92aW5jZTogT2JzZXJ2YWJsZTxBcnJheTxMb2NhbGl0YT4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdG5hemlvbmk6IE9ic2VydmFibGU8QXJyYXk8TmF6aW9uZT4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdG5hbWVzcGFjZTogc3RyaW5nO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGlkRGVsZWdhOiBzdHJpbmc7XHJcblx0QElucHV0KClcclxuXHRudW92YVBlcnNvbmE6IGJvb2xlYW47XHJcblx0QE91dHB1dCgpXHJcblx0ZG9uZTogRXZlbnRFbWl0dGVyPFxyXG5cdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBlcnNvbmFGaXNpY2FEVE8+XHJcblx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBlcnNvbmFGaXNpY2FEVE8+PigpO1xyXG5cclxuXHRjaGFuZ2VzUEYkID0gbmV3IFJlcGxheVN1YmplY3Q8Q29tcG9uZW50T3V0cHV0U3RhdHVzPEluZm9BbmFncmFmaWNoZVBGRFRPPj4oMSk7XHJcblxyXG5cdGNoYW5nZXNOYXNjaXRhJCA9IG5ldyBSZXBsYXlTdWJqZWN0PENvbXBvbmVudE91dHB1dFN0YXR1czxJbmZvTmFzY2l0YVBGRFRPPj4oMSk7XHJcblxyXG5cdG5hbWVzcGFjZUluZm9QZjogc3RyaW5nO1xyXG5cdG5hbWVzcGFjZUluZm9OYXNjaXRhOiBzdHJpbmc7XHJcblxyXG5cdHBlcnNvbmFGaXNpY2FDaGFuZ2VkU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG5cdHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdGlzUGVyc29uYUZpc2ljYVZhbGlkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcclxuXHJcblx0ZGF0aVZlcmlmaWNhID0ge30gYXMgRGF0aVZlcmlmaWNhQ2ZEVE87XHJcblxyXG5cdEBWaWV3Q2hpbGQoJ2luZm9QRicpXHJcblx0aW5mb1BGOiBJbmZvUGZDb21wb25lbnQ7XHJcblxyXG5cdEBWaWV3Q2hpbGQoJ2luZm9OYXNjaXRhJylcclxuXHRpbmZvTmFzY2l0YTogSW5mb05hc2NpdGFDb21wb25lbnQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZGVsZWdoZVNlcnZpY2U6IERlbGVnaGVTZXJ2aWNlKSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblx0XHRsZXQgdmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdGlmICghdGhpcy5pbmZvUGVyc29uYUZpc2ljYSkge1xyXG5cdFx0XHR0aGlzLmluaXRQZXJzb25hRmlzaWNhKCk7XHJcblx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlYWRPbmx5ID0gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5pZERlbGVnYSA9PSBudWxsIHx8IHRoaXMubnVvdmFQZXJzb25hKSB7XHJcblx0XHRcdHRoaXMucmVhZE9ubHkgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5hbWVzcGFjZUluZm9QZiA9IHRoaXMubmFtZXNwYWNlICsgXCJpbmZvUEZcIjtcclxuXHRcdHRoaXMubmFtZXNwYWNlSW5mb05hc2NpdGEgPSB0aGlzLm5hbWVzcGFjZSArIFwiaW5mb05hc2NpdGFcIjtcclxuXHJcblx0XHRjb25zdCBtYXBwYVByb3ZpbmNlJCA9IHRoaXMuZGVsZWdoZVNlcnZpY2UuZ2V0QWxsUHJvdmluY2UoKTtcclxuXHJcblx0XHR0aGlzLnBlcnNvbmFGaXNpY2FDaGFuZ2VkU3ViID0gY29tYmluZUxhdGVzdChcclxuXHRcdFx0W3RoaXMuY2hhbmdlc1BGJCwgdGhpcy5jaGFuZ2VzTmFzY2l0YSQsIG1hcHBhUHJvdmluY2UkXVxyXG5cdFx0KVxyXG5cdFx0LnBpcGUoXHJcblx0XHRcdG1hcCgoW3ZhbGlkUEYsIGNoYW5nZXNOYXNjaXRhLCBhbGxQcm92aW5jZV0pID0+IHtcclxuXHRcdFx0XHRsZXQgcHJvdmluY2lhID0gYWxsUHJvdmluY2VbY2hhbmdlc05hc2NpdGE/Lm91dHB1dD8ucHJvdmluY2lhTmFzY2l0YV07XHJcblx0XHRcdFx0cmV0dXJuIFt2YWxpZFBGLCBjaGFuZ2VzTmFzY2l0YSwgcHJvdmluY2lhXVxyXG5cdFx0XHR9KSxcclxuXHRcdFx0YXVkaXRUaW1lKFNBTVBMRV9USU1FKSxcclxuXHRcdFx0Y29uY2F0TWFwKChbaW5mb0FuYWdyYWZpY2hlLCBpbmZvTmFzY2l0YSwgcHJvdmluY2lhXSkgPT5cclxuXHRcdFx0XHR0aGlzLmdldFBlcnNvbmFGaXNpY2FWYWxpZChpbmZvQW5hZ3JhZmljaGUsIGluZm9OYXNjaXRhLCBwcm92aW5jaWEpXHJcblx0XHRcdCksXHJcblx0XHRcdHN0YXJ0V2l0aChDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodmFsaWQsIHRoaXMuaW5mb1BlcnNvbmFGaXNpY2EpKSxcclxuXHRcdFx0dGFwKHBmID0+IHRoaXMuZG9uZS5lbWl0KHBmKSlcclxuXHRcdClcclxuXHRcdC5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdGdldFBlcnNvbmFGaXNpY2FWYWxpZChcclxuXHRcdGluZm9BbmFncmFmaWNoZTogQ29tcG9uZW50T3V0cHV0U3RhdHVzPEluZm9BbmFncmFmaWNoZVBGRFRPPixcclxuXHRcdGluZm9OYXNjaXRhOiBDb21wb25lbnRPdXRwdXRTdGF0dXM8SW5mb05hc2NpdGFQRkRUTz4sXHJcblx0XHRwcm92aW5jaWE/OiBQcm92aW5jaWFFc3Rlc2FEVE9cclxuXHQpIHtcclxuXHJcblx0XHRjb25zb2xlLmxvZyhcIkZPUk0gVkFMSURJVFlcIiwgaW5mb05hc2NpdGEuc3RhdHVzKTtcclxuXHRcdGlmICghaW5mb05hc2NpdGEuc3RhdHVzIHx8ICFpbmZvQW5hZ3JhZmljaGUuc3RhdHVzKSB7XHJcblx0XHRcclxuXHRcdFx0dGhpcy5pc1BlcnNvbmFGaXNpY2FWYWxpZC5uZXh0KGZhbHNlKTtcclxuXHRcdFx0cmV0dXJuIG9mKENvbXBvbmVudE91dHB1dFN0YXR1cy5vZihmYWxzZSwgRU1QVFlfUEYpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2EoaW5mb0FuYWdyYWZpY2hlLm91dHB1dCwgaW5mb05hc2NpdGEub3V0cHV0KVxyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHRcclxuXHRcdFx0XHR0YXAoKCkgPT4gdGhpcy5pc1BlcnNvbmFGaXNpY2FWYWxpZC5uZXh0KHRydWUpKSxcclxuXHRcdFx0XHRtYXAoKHJlc3BvbnNlOiB7IGlkOiBzdHJpbmcgfSB8IG51bGwpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IGlzUGVyc29uYUZpc2ljYVZhbGlkID0gaXNOb3ROdWxsKHJlc3BvbnNlKTtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRvVmFsaWRQZihpc1BlcnNvbmFGaXNpY2FWYWxpZCwgcmVzcG9uc2UsIGluZm9BbmFncmFmaWNoZS5vdXRwdXQsIHByb3ZpbmNpYSwgaW5mb05hc2NpdGEpXHJcblx0XHRcdFx0fSksXHJcblx0XHRcdFx0dGFwKCh7IGlzVmFsaWQgfSkgPT4gdGhpcy5pc1BlcnNvbmFGaXNpY2FWYWxpZC5uZXh0KGlzVmFsaWQpKSxcclxuXHRcdFx0XHR0YXAoKHsgcGVyc29uYSB9KSA9PiB0aGlzLmluZm9QZXJzb25hRmlzaWNhID0gcGVyc29uYSksXHJcblx0XHRcdFx0bWFwKHYgPT4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKHYuaXNWYWxpZCwgdi5wZXJzb25hKSksXHJcblx0XHRcdFx0Y2F0Y2hFcnJvcihfID0+IG9mKENvbXBvbmVudE91dHB1dFN0YXR1cy5vZihmYWxzZSwgRU1QVFlfUEYpKSlcclxuXHRcdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdG9WYWxpZFBmKFxyXG5cdFx0aXNQZXJzb25hRmlzaWNhVmFsaWQ6IGJvb2xlYW4sIHJlc3BvbnNlOiB7IGlkOiBzdHJpbmc7IH0sIGluZm9BbmFncmFmaWNoZTogSW5mb0FuYWdyYWZpY2hlUEZEVE8sIFxyXG5cdFx0cHJvdmluY2lhOiBQcm92aW5jaWFFc3Rlc2FEVE8sIFxyXG5cdFx0aW5mb05hc2NpdGE6IENvbXBvbmVudE91dHB1dFN0YXR1czxJbmZvTmFzY2l0YVBGRFRPPik6IHsgaXNWYWxpZDogYm9vbGVhbjsgcGVyc29uYTogUGVyc29uYUZpc2ljYURUTzsgfSB7XHJcblx0XHRcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGlzVmFsaWQ6IGlzUGVyc29uYUZpc2ljYVZhbGlkLFxyXG5cdFx0XHRwZXJzb25hOiB7XHJcblx0XHRcdFx0aWQ6IHJlc3BvbnNlPy5pZCxcclxuXHRcdFx0XHRpbmZvQW5hZ3JhZmljaGU6IHtcclxuXHRcdFx0XHRcdGNvZEZpc2NhbGU6IFN0cmluZyhpbmZvQW5hZ3JhZmljaGUuY29kRmlzY2FsZSksXHJcblx0XHRcdFx0XHRjb2RpY2VSZWdpb25lOiBTdHJpbmcocHJvdmluY2lhPy5zaWdsYVJlZyksXHJcblx0XHRcdFx0XHRjb2dub21lOiBTdHJpbmcoaW5mb0FuYWdyYWZpY2hlLmNvZ25vbWUpLFxyXG5cdFx0XHRcdFx0bm9tZTogU3RyaW5nKGluZm9BbmFncmFmaWNoZS5ub21lKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aW5mb05hc2NpdGE6IHtcclxuXHRcdFx0XHRcdGNvbXVuZU5hc2NpdGE6IGluZm9OYXNjaXRhPy5vdXRwdXQ/LmNvbXVuZU5hc2NpdGEgPyBTdHJpbmcoaW5mb05hc2NpdGEub3V0cHV0LmNvbXVuZU5hc2NpdGEpIDogbnVsbCxcclxuXHRcdFx0XHRcdGRhdGFOYXNjaXRhOiBpbmZvTmFzY2l0YS5vdXRwdXQuZGF0YU5hc2NpdGEsXHJcblx0XHRcdFx0XHRwcm92aW5jaWFOYXNjaXRhOiBTdHJpbmcoaW5mb05hc2NpdGEub3V0cHV0LnByb3ZpbmNpYU5hc2NpdGEpLFxyXG5cdFx0XHRcdFx0bmF6aW9uZU5hc2NpdGE6IFN0cmluZyhpbmZvTmFzY2l0YS5vdXRwdXQubmF6aW9uZU5hc2NpdGEpLFxyXG5cdFx0XHRcdFx0Y29kQ2F0TmF6aW9uZU5hc2NpdGE6IFN0cmluZyhpbmZvTmFzY2l0YS5vdXRwdXQuY29kQ2F0TmF6aW9uZU5hc2NpdGEpLFxyXG5cdFx0XHRcdFx0aXNOYXRvRXN0ZXJvOiBpbmZvTmFzY2l0YS5vdXRwdXQ/LmlzTmF0b0VzdGVybyA/IGluZm9OYXNjaXRhLm91dHB1dC5pc05hdG9Fc3Rlcm8gOiBmYWxzZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBhcyBQZXJzb25hRmlzaWNhRFRPXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0dmFsaWRhdGVQZXJzb25hRmlzaWNhKFxyXG5cdFx0aW5mb0FuYWdyYWZpY2hlOiBJbmZvQW5hZ3JhZmljaGVQRkRUTyxcclxuXHRcdGluZm9OYXNjaXRhOiBJbmZvTmFzY2l0YVBGRFRPXHJcblx0KSB7XHJcblxyXG5cdFx0Ly8gdmFyIGQgPSBuZXcgRGF0ZShpbmZvTmFzY2l0YS5kYXRhTmFzY2l0YSk7XHJcblx0XHQvLyBkLnRvTG9jYWxlU3RyaW5nKCdpdC1JVCcsIHsgdGltZVpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB9KVxyXG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdoZVNlcnZpY2UuZ2V0VmFsaWRhUGVyc29uYUZpc2ljYShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGNvZGljZUZpc2NhbGU6IGluZm9BbmFncmFmaWNoZS5jb2RGaXNjYWxlXHJcblx0XHRcdFx0LCBjb2dub21lOiBpbmZvQW5hZ3JhZmljaGUuY29nbm9tZVxyXG5cdFx0XHRcdCwgY29tdW5lOiBpbmZvTmFzY2l0YT8uaXNOYXRvRXN0ZXJvID8gbnVsbCA6IGluZm9OYXNjaXRhPy5jb211bmVOYXNjaXRhXHJcblx0XHRcdFx0Ly8gLCBkYXRhTmFzY2l0YTogbmV3IERhdGUobW9tZW50KGluZm9OYXNjaXRhLmRhdGFOYXNjaXRhLCAnREQvTU0vWVlZWScpLmFkZCgyMywgJ2hvdXInKS5hZGQoNTksICdtaW51dGUnKS5hZGQoNTksICdzZWNvbmQnKS50b0RhdGUoKSlcclxuXHRcdFx0XHQsIGRhdGFOYXNjaXRhOiBuZXcgRGF0ZShpbmZvTmFzY2l0YS5kYXRhTmFzY2l0YSkudG9JU09TdHJpbmcoKVxyXG5cdFx0XHRcdCwgbm9tZTogaW5mb0FuYWdyYWZpY2hlLm5vbWVcclxuXHRcdFx0XHQsIHByb3ZpbmNpYU5hc2NpdGE6IGluZm9OYXNjaXRhLnByb3ZpbmNpYU5hc2NpdGFcclxuXHRcdFx0XHQsIHNpZ2xhTmF6aW9uZTogaW5mb05hc2NpdGEubmF6aW9uZU5hc2NpdGFcclxuXHRcdFx0XHQsIGNvZENhdE5hemlvbmVOYXNjaXRhOiBpbmZvTmFzY2l0YT8uY29kQ2F0TmF6aW9uZU5hc2NpdGFcclxuXHRcdFx0fSBhcyBEYXRpVmVyaWZpY2FDZkRUT1xyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdGluaXRQZXJzb25hRmlzaWNhKCkge1xyXG5cdFx0dGhpcy5pbmZvUGVyc29uYUZpc2ljYSA9IG5ldyBQZXJzb25hRmlzaWNhRFRPKCk7XHJcblx0fVxyXG5cclxuXHRpbmZvUGZSZWFkeShpbkZvUGZTdGF0dXM6IENvbXBvbmVudE91dHB1dFN0YXR1czxJbmZvQW5hZ3JhZmljaGVQRkRUTz4pIHtcclxuXHRcdC8vIGNvbnNvbGUubG9nKFwiW2luZm9QZlJlYWR5XVwiLCBpbkZvUGZTdGF0dXMpO1xyXG5cclxuXHRcdHRoaXMuY2hhbmdlc1BGJC5uZXh0KGluRm9QZlN0YXR1cyk7XHJcblx0fVxyXG5cclxuXHRpbmZvTmFzY2l0YVJlYWR5KGluZm9OYXNjaXRhUGY6IENvbXBvbmVudE91dHB1dFN0YXR1czxJbmZvTmFzY2l0YVBGRFRPPikge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coXCJbaW5mb05hc2NpdGFSZWFkeV1cIiwgaW5mb05hc2NpdGFQZik7XHJcblxyXG5cdFx0dGhpcy5jaGFuZ2VzTmFzY2l0YSQubmV4dChpbmZvTmFzY2l0YVBmKTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5wZXJzb25hRmlzaWNhQ2hhbmdlZFN1Yi51bnN1YnNjcmliZSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHJlc2V0Rm9ybSgpIHtcclxuXHRcdHRoaXMuaW5mb1BGLl9yZXNldEZvcm0oKTtcclxuXHRcdHRoaXMuaW5mb05hc2NpdGEuX3Jlc2V0Rm9ybSgpO1xyXG5cdH1cclxuXHJcblxyXG59XHJcbiJdfQ==