@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
227 lines • 47.4 kB
JavaScript
import { Component, EventEmitter, Input, Output, } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { Subject, ReplaySubject, of, BehaviorSubject } from "rxjs";
import { auditTime, catchError, filter, map, shareReplay, startWith, switchMap, tap } from "rxjs/operators";
import { PersonaGiuridicaDTO } from "../../models/persona-giuridica-dto";
import { ComponentOutputStatus } from "../../normalizzazione/component-output-status";
import { DelegheService } from "../../services/deleghe-services/deleghe.service";
import { MessageService } from "../../services/message.service";
import { ComponentReducer } from "../../utils/component-reducer";
import { given, is } from "../../utils/fnutils";
import { MatDialog } from '@angular/material/dialog';
import { GenericModalComponent } from '../../common-component/generic-modal/generic-modal.component';
import { Azione } from '../../common-component/generic-modal/generic-modal-data';
import { ValidationService } from "../../services/validation.service";
class PgValidation {
constructor(valid, pg) {
this.valid = valid;
this.pg = pg;
}
}
export class PersonaGiuridicaComponent {
constructor(msg, delegheService, dialog) {
this.msg = msg;
this.delegheService = delegheService;
this.dialog = dialog;
this.validatorFormControl = false;
this.couldBeDittaIndividuale = true;
this.done = new EventEmitter();
this.changeSedi$ = new ReplaySubject(1);
this.changePG$ = new ReplaySubject(1);
this.personaSelected$ = new BehaviorSubject(null);
this.CODICE_LEGALE = "LEGALE";
this.errorSedi$ = new Subject();
}
ngOnDestroy() {
var _a, _b, _c, _d;
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
(_b = this.subValidation) === null || _b === void 0 ? void 0 : _b.unsubscribe();
(_c = this.subCF) === null || _c === void 0 ? void 0 : _c.unsubscribe();
(_d = this.invalidPgsSubscriptions) === null || _d === void 0 ? void 0 : _d.unsubscribe();
}
ngOnInit() {
var _a, _b, _c;
//GESTIONE_SEDI
this.streamListaSedi$ = new ReplaySubject();
this.changeSedi$.next(ComponentOutputStatus.of(!this.gestioneSedi, (pg) => pg));
//SE_INPUT_DATI_SOSCIETA_ESISTE => RECUPERO LE SEDI
((_a = this.datisocieta) === null || _a === void 0 ? void 0 : _a.sedi) ?
this.streamListaSedi$.next((_b = this.datisocieta) === null || _b === void 0 ? void 0 : _b.sedi) :
null;
//VALIDAZIONE_INIZIALE
const valid = false;
this.form = new FormGroup({});
if (this.resetForm) {
this.subscription = this.resetForm.subscribe(val => val ? this.pulisciForm() : "");
}
if (!this.datisocieta) {
this.initDatiSocieta();
}
const codiceFiscale = new FormControl({ value: this.datisocieta.codiceFiscale, disabled: this.personaGiuridicaFromDeleghe$ == null ? false : true }, [
this.validatorFormControl ? Validators.required : Validators.nullValidator,
ValidationService.pattern(this.couldBeDittaIndividuale ? ValidationService._codiceFiscalePiva : ValidationService.partitaIva, "cfInvalidoFormalmente"),
]);
this.form.addControl("codiceFiscale", codiceFiscale);
const ragioneSociale = new FormControl({ value: this.datisocieta.ragioneSociale, disabled: true }, [
// this.validatorFormControl ? Validators.required : Validators.nullValidator
]);
this.form.addControl("ragioneSociale", ragioneSociale);
const partitaIVA = new FormControl({ value: this.datisocieta.partitaIVA, disabled: true }, [
// this.validatorFormControl ? Validators.required : Validators.nullValidator,
// ValidationService.pattern(
// ValidationService.partitaIva,
// "partitaIVAInvalida"
// ),
]);
this.form.addControl("partitaIVA", partitaIVA);
if (this.personaGiuridicaFromDeleghe$) {
this.personaGiuridica$ = this.personaGiuridicaFromDeleghe$
.pipe(map(pg => new PgValidation(true, pg)), catchError(_ => of(new PgValidation(false, null))), shareReplay());
}
else {
this.personaGiuridica$ = this.form.get('codiceFiscale').valueChanges
.pipe(auditTime(1000), switchMap(value => {
return ((this.couldBeDittaIndividuale && ((value === null || value === void 0 ? void 0 : value.length) == 11 || (value === null || value === void 0 ? void 0 : value.length) == 16))
||
(!this.couldBeDittaIndividuale && (value === null || value === void 0 ? void 0 : value.length) == 11))
?
this.delegheService.getPersonaGiuridicaCodiceFiscale(value)
.pipe(map(pg => new PgValidation(true, pg)), catchError(_ => this.catchPersonaGiuridicaError())) :
of(new PgValidation(false, null));
}), shareReplay(), tap((validationResult) => {
console.log('[validationResult]', validationResult);
}), shareReplay());
}
const validPgs$ = this.personaGiuridica$.pipe(filter(v => v.valid), map(v => v.pg));
const invalidPgs$ = this.personaGiuridica$.pipe(filter(pg => !pg.valid));
//EVOLUZIONE_PG
const pg$ = this.buildStreamChangePG$(validPgs$);
const pgChange$ = pg$.pipe(tap(pg => this.setSedi(pg['sedi'])), tap(pg => this.controlloSedeLegale(pg)), map(pg => {
var _a;
const validity = ((_a = pg['sedi']) === null || _a === void 0 ? void 0 : _a.find(sede => sede.tipoSede['codice'] == this.CODICE_LEGALE)) ?
!this.form.invalid
: false;
return ComponentOutputStatus.of(validity, (personaGiuridica) => Object.keys(pg)
.forEach(key => personaGiuridica[key] = pg[key]));
}));
//___Validazione___
const changes$ = ComponentReducer
.reducer2(pgChange$, this.changeSedi$, _ => true, ComponentOutputStatus.of(valid, this.datisocieta));
//____OUTPUT_COMPONENT____
this.subscription = changes$.subscribe((_) => this.done.emit(_));
this.invalidPgsSubscriptions = invalidPgs$.subscribe(_ => {
this.form.get('partitaIVA').setValue("");
this.form.get('ragioneSociale').setValue("");
this.personaSelected$.next(null);
this.done.emit(ComponentOutputStatus.of(false, new PersonaGiuridicaDTO()));
});
if (this.datisocieta) {
codiceFiscale.setValue((_c = this.datisocieta) === null || _c === void 0 ? void 0 : _c.codiceFiscale);
}
//CF_DALL'ESTERNO
if (this.cf$) {
this.subCF = this.cf$
.pipe(tap(cf => codiceFiscale.setValue(cf)))
.subscribe();
}
}
ngOnChanges(changes) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
console.log('ngOnChanges:', changes);
if ((_b = (_a = this.form) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.codiceFiscale) {
(_d = (_c = this.form) === null || _c === void 0 ? void 0 : _c.controls) === null || _d === void 0 ? void 0 : _d.codiceFiscale.setValidators(null);
(_f = (_e = this.form) === null || _e === void 0 ? void 0 : _e.controls) === null || _f === void 0 ? void 0 : _f.codiceFiscale.setValidators([
this.validatorFormControl ? Validators.required : Validators.nullValidator,
ValidationService.pattern(this.couldBeDittaIndividuale ? ValidationService._codiceFiscalePiva : ValidationService.partitaIva, "cfInvalidoFormalmente"),
]);
if (((_g = changes === null || changes === void 0 ? void 0 : changes.couldBeDittaIndividuale) === null || _g === void 0 ? void 0 : _g.currentValue) == true || ((_h = changes === null || changes === void 0 ? void 0 : changes.couldBeDittaIndividuale) === null || _h === void 0 ? void 0 : _h.currentValue) == false) {
if ((((_j = changes === null || changes === void 0 ? void 0 : changes.couldBeDittaIndividuale) === null || _j === void 0 ? void 0 : _j.currentValue) != ((_k = changes === null || changes === void 0 ? void 0 : changes.couldBeDittaIndividuale) === null || _k === void 0 ? void 0 : _k.previousValue)) || ((_l = changes === null || changes === void 0 ? void 0 : changes.couldBeDittaIndividuale) === null || _l === void 0 ? void 0 : _l.previousValue) === undefined) {
(_p = (_o = (_m = this.form) === null || _m === void 0 ? void 0 : _m.controls) === null || _o === void 0 ? void 0 : _o.codiceFiscale) === null || _p === void 0 ? void 0 : _p.patchValue(null);
}
}
//this.form?.controls?.codiceFiscale?.updateValueAndValidity();
}
}
catchPersonaGiuridicaError() {
this.dialog.open(GenericModalComponent, { data: { title: 'persona-giuridica-by-cf-error-titolo',
azioni: [new Azione('ok')],
paragrafi: ['modalita-pagamento-dialog-testo']
}, panelClass: 'custom-modalbox-ko' });
return of(new PgValidation(false, null));
}
controlloSedeLegale(pg) {
var _a, _b;
const sedeLegale = (_a = pg['sedi']) === null || _a === void 0 ? void 0 : _a.find(sede => sede.tipoSede['codice'] == this.CODICE_LEGALE);
let error;
if (((_b = pg['sedi']) === null || _b === void 0 ? void 0 : _b.length) == 0 || !pg['sedi']) {
error = "nessunaSede";
}
else if (!sedeLegale) {
error = "nessunaSedeLegale";
}
this.errorSedi$.next(error);
}
buildStreamChangePG$(personaGiuridica$) {
return personaGiuridica$
.pipe(tap(pg => this.personaSelected$.next(pg)), map(pg => {
var _a, _b, _c, _d;
return {
codiceFiscale: pg.datiPersonaGiuridica.codiceFiscale,
partitaIVA: pg.datiPersonaGiuridica.partitaIVA,
ragioneSociale: pg.datiPersonaGiuridica.ragioneSociale,
idPersonaGiuridica: pg.datiPersonaGiuridica.id,
codiceRegione: (_d = (_c = (_b = (_a = pg === null || pg === void 0 ? void 0 : pg.sedi) === null || _a === void 0 ? void 0 : _a.filter(sedeLegale => { var _a; return ((_a = sedeLegale === null || sedeLegale === void 0 ? void 0 : sedeLegale.tipoSede) === null || _a === void 0 ? void 0 : _a.codice) === "LEGALE"; })[0]) === null || _b === void 0 ? void 0 : _b.indirizzo) === null || _c === void 0 ? void 0 : _c.regione) === null || _d === void 0 ? void 0 : _d.sigla,
sedi: pg.sedi,
hasAmmUtenze: pg.hasAmmUtenze
};
}), tap(pg => {
this.form.get('partitaIVA').setValue(pg['partitaIVA']);
this.form.get('ragioneSociale').setValue(pg['ragioneSociale']);
}), startWith(ComponentOutputStatus.of(false, pg => pg)));
}
setSedi(sedi) {
given(sedi)
.when(is(null), () => this.streamListaSedi$.next([]))
.otherwise(() => this.streamListaSedi$.next(sedi))
.valueOf()();
}
sediReady(sedeSelectedStatus) {
// console.log("[sedeSelectedStatus]", sedeSelectedStatus);
this.changeSedi$.next(sedeSelectedStatus.mapValue((sede) => (pg) => pg.sedi = sede));
}
initDatiSocieta() {
this.datisocieta = new PersonaGiuridicaDTO();
}
pulisciForm() {
const keys = Object.keys(this.form.value);
keys.forEach(key => {
const control = this.form.get(key);
control.setValue("");
});
}
}
PersonaGiuridicaComponent.decorators = [
{ type: Component, args: [{
selector: "lib-persona-giuridica",
template: "<div [formGroup]=\"form\">\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}} {{'codice-fiscale' | traduzione}}\" -->\r\n\t\t\t\t<input matInput\r\n\t\t\t\t\tplaceholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'codice-fiscale' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"codiceFiscale\" uppercase style=\"text-transform: uppercase\" maxlength=\"16\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['codiceFiscale'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('codiceFiscaleInvalido', form.controls[ 'codiceFiscale']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'codice-fiscale'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- <div class=\"col-md-4\" [hidden]= \"!editingDisabled\"> -->\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'ragione-sociale' | traduzione}}\" -->\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'ragione-sociale' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{'ragione-sociale' | traduzione}}\" formControlName=\"ragioneSociale\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['ragioneSociale'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['ragioneSociale']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'ragione-sociale'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- <div class=\"col-md-4\" [hidden]= \"!editingDisabled\"> -->\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'partita-iva' | traduzione}}\" -->\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'partita-iva' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{'partita-iva' | traduzione}}\" formControlName=\"partitaIVA\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['partitaIVA'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('partitaIVAInvalida', form.controls['partitaIVA']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'partita-iva'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n\t<ng-container *ngIf=\"gestioneSedi; else noGestioneSedi\">\r\n\t\t<ng-container *ngIf=\"personaSelected$ | async\">\r\n\t\t\t<ng-container *ngIf=\"(personaGiuridicaFromDeleghe$ == null) && (personaSelected$ | async).hasAmmUtenze;\r\n\t\t\t\telse visualizzaSedi\">\r\n\t\t\t\t<mat-error>\r\n\t\t\t\t\t{{'contattare-amministratore' | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-template #visualizzaSedi>\r\n\t\t\t\t<lib-tabella-sedi [sedi$]=\"streamListaSedi$\" (done)=\"sediReady($event)\"\r\n\t\t\t\t\t[idSedeSelezionata]=\"idSedeSelezionata\">\r\n\t\t\t\t</lib-tabella-sedi>\r\n\t\t\t</ng-template>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\r\n\t<ng-template #noGestioneSedi>\r\n\t\t<div *ngIf=\" errorSedi$ | async as errorSedi\">\r\n\t\t\t<ng-container *ngIf=\"errorSedi=='nessunaSede'\">\r\n\t\t\t\t<mat-error>\r\n\t\t\t\t\t{{'nessunaSede' | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-container *ngIf=\"errorSedi=='nessunaSedeLegale'\">\r\n\t\t\t\t<mat-error>\r\n\t\t\t\t\t{{'nessunaSedeLegale' | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t</ng-template>\r\n</div>",
styles: [""]
},] }
];
PersonaGiuridicaComponent.ctorParameters = () => [
{ type: MessageService },
{ type: DelegheService },
{ type: MatDialog }
];
PersonaGiuridicaComponent.propDecorators = {
cf$: [{ type: Input }],
datisocieta: [{ type: Input }],
idSedeSelezionata: [{ type: Input }],
namespace: [{ type: Input }],
resetForm: [{ type: Input }],
validatorFormControl: [{ type: Input }],
gestioneSedi: [{ type: Input }],
couldBeDittaIndividuale: [{ type: Input }],
personaGiuridicaFromDeleghe$: [{ type: Input }],
done: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYS1naXVyaWRpY2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItc29mdHdhcmVmYWN0b3J5L2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tbW9uLWNvbXBvbmVudC9wZXJzb25hLWdpdXJpZGljYS9wZXJzb25hLWdpdXJpZGljYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FJTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckYsT0FBTyxFQUFnQixPQUFPLEVBQUUsYUFBYSxFQUFjLEVBQUUsRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxF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QUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixNQUFNLE9BQU8sR0FBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OztZQXJVRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsNi9HQUFpRDs7YUFFakQ7OztZQXZCUSxjQUFjO1lBRGQsY0FBYztZQUlkLFNBQVM7OztrQkF1QmhCLEtBQUs7MEJBR0wsS0FBSztnQ0FHTCxLQUFLO3dCQUdMLEtBQUs7d0JBR0wsS0FBSzttQ0FHTCxLQUFLOzJCQUdMLEtBQUs7c0NBR0wsS0FBSzsyQ0FHTCxLQUFLO21CQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdENvbXBvbmVudCxcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SW5wdXQsXHJcblx0T25Jbml0LFxyXG5cdE91dHB1dCxcclxuXHRPbkRlc3Ryb3ksXHJcblx0T25DaGFuZ2VzLFxyXG5cdFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIEJlaGF2aW9yU3ViamVjdCwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGF1ZGl0VGltZSwgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IFBlcnNvbmFHaXVyaWRpY2FEVE8gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BlcnNvbmEtZ2l1cmlkaWNhLWR0b1wiO1xyXG5pbXBvcnQgeyBQZXJzb25hR2l1cmlkaWNhIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wb3J0YWxlL3BlcnNvbmEtZ2l1cmlkaWNhLW1vZGVsXCI7XHJcbmltcG9ydCB7IFNlZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BvcnRhbGUvc2VkZVwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRPdXRwdXRTdGF0dXMgfSBmcm9tIFwiLi4vLi4vbm9ybWFsaXp6YXppb25lL2NvbXBvbmVudC1vdXRwdXQtc3RhdHVzXCI7XHJcbmltcG9ydCB7IERlbGVnaGVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2RlbGVnaGUtc2VydmljZXMvZGVsZWdoZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWR1Y2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbXBvbmVudC1yZWR1Y2VyXCI7XHJcbmltcG9ydCB7IGdpdmVuLCBpcyB9IGZyb20gXCIuLi8uLi91dGlscy9mbnV0aWxzXCI7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEdlbmVyaWNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi1jb21wb25lbnQvZ2VuZXJpYy1tb2RhbC9nZW5lcmljLW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEF6aW9uZSwgR2VuZXJpY01vZGFsRGF0YSB9IGZyb20gJy4uLy4uL2NvbW1vbi1jb21wb25lbnQvZ2VuZXJpYy1tb2RhbC9nZW5lcmljLW1vZGFsLWRhdGEnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2VcIjtcclxuXHJcblxyXG5pbnRlcmZhY2UgaW5mb1BlcnNvbmFHaXVyaWRpY2Ege1xyXG5cdGNvZGljZUZpc2NhbGU6IHN0cmluZyxcclxuXHRwSXZhOiBzdHJpbmcsXHJcblx0cmFnaW9uZVNvY2lhbGU6IHN0cmluZ1xyXG59XHJcblxyXG5jbGFzcyBQZ1ZhbGlkYXRpb24ge1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2YWxpZDogYm9vbGVhbiwgcHVibGljIHBnOiBQZXJzb25hR2l1cmlkaWNhKSB7fVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogXCJsaWItcGVyc29uYS1naXVyaWRpY2FcIixcclxuXHR0ZW1wbGF0ZVVybDogXCIuL3BlcnNvbmEtZ2l1cmlkaWNhLmNvbXBvbmVudC5odG1sXCIsXHJcblx0c3R5bGVVcmxzOiBbXCIuL3BlcnNvbmEtZ2l1cmlkaWNhLmNvbXBvbmVudC5jc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hR2l1cmlkaWNhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0Y2YkOiBSZXBsYXlTdWJqZWN0PHN0cmluZz47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0ZGF0aXNvY2lldGE6IFBlcnNvbmFHaXVyaWRpY2FEVE87XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0aWRTZWRlU2VsZXppb25hdGE6IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRuYW1lc3BhY2U6IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRyZXNldEZvcm06IFN1YmplY3Q8Ym9vbGVhbj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dmFsaWRhdG9yRm9ybUNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0QElucHV0KClcclxuXHRnZXN0aW9uZVNlZGk6IGJvb2xlYW47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0Y291bGRCZURpdHRhSW5kaXZpZHVhbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHBlcnNvbmFHaXVyaWRpY2FGcm9tRGVsZWdoZSQ6IE9ic2VydmFibGU8UGVyc29uYUdpdXJpZGljYT5cclxuXHJcblx0QE91dHB1dCgpXHJcblx0ZG9uZTogRXZlbnRFbWl0dGVyPFxyXG5cdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBlcnNvbmFHaXVyaWRpY2FEVE8+XHJcblx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBlcnNvbmFHaXVyaWRpY2FEVE8+PigpO1xyXG5cclxuXHRzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHRzdWJWYWxpZGF0aW9uOiBTdWJzY3JpcHRpb247XHJcblx0cGVyc29uYUdpdXJpZGljYSQ6IE9ic2VydmFibGU8UGdWYWxpZGF0aW9uPjtcclxuXHRjaGFuZ2VTZWRpJDogUmVwbGF5U3ViamVjdDxDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQZXJzb25hR2l1cmlkaWNhRFRPKSA9PiB2b2lkPj4gPSBuZXcgUmVwbGF5U3ViamVjdDxcclxuXHRcdENvbXBvbmVudE91dHB1dFN0YXR1czwodmFsdWU6IFBlcnNvbmFHaXVyaWRpY2FEVE8pID0+IHZvaWQ+XHJcblx0PigxKTtcclxuXHRjaGFuZ2VQRyQ6IFJlcGxheVN1YmplY3Q8Q29tcG9uZW50T3V0cHV0U3RhdHVzPCh2YWx1ZTogUGVyc29uYUdpdXJpZGljYURUTykgPT4gdm9pZD4+ID0gbmV3IFJlcGxheVN1YmplY3Q8XHJcblx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQZXJzb25hR2l1cmlkaWNhRFRPKSA9PiB2b2lkPlxyXG5cdD4oMSk7XHJcblx0JGNoYW5nZVBHOiBTdWJzY3JpcHRpb247XHJcblx0ZGF0aVNvY2lldGEkOiBPYnNlcnZhYmxlPFBlcnNvbmFHaXVyaWRpY2FEVE8+O1xyXG5cdHN0cmVhbUxpc3RhU2VkaSQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8U2VkZT4+O1xyXG5cdHBlcnNvbmFTZWxlY3RlZCQ6IEJlaGF2aW9yU3ViamVjdDxQZXJzb25hR2l1cmlkaWNhPiA9XHJcblx0XHRuZXcgQmVoYXZpb3JTdWJqZWN0PFBlcnNvbmFHaXVyaWRpY2E+KG51bGwpXHJcblx0JHNlZGk6IFN1YnNjcmlwdGlvbjtcclxuXHRzdWJDRjogU3Vic2NyaXB0aW9uO1xyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHRDT0RJQ0VfTEVHQUxFID0gXCJMRUdBTEVcIjtcclxuXHRlcnJvclNlZGkkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblx0aW52YWxpZFBnc1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIG1zZzogTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGRlbGVnaGVTZXJ2aWNlOiBEZWxlZ2hlU2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZ1xyXG5cdCkgeyB9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0XHR0aGlzLnN1YlZhbGlkYXRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0XHR0aGlzLnN1YkNGPy51bnN1YnNjcmliZSgpO1xyXG5cdFx0dGhpcy5pbnZhbGlkUGdzU3Vic2NyaXB0aW9ucz8udW5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cclxuXHRcdC8vR0VTVElPTkVfU0VESVxyXG5cdFx0dGhpcy5zdHJlYW1MaXN0YVNlZGkkID0gbmV3IFJlcGxheVN1YmplY3QoKTtcclxuXHRcdHRoaXMuY2hhbmdlU2VkaSQubmV4dChDb21wb25lbnRPdXRwdXRTdGF0dXMub2YoIXRoaXMuZ2VzdGlvbmVTZWRpLCAocGc6IFBlcnNvbmFHaXVyaWRpY2FEVE8pID0+IHBnKSk7XHJcblxyXG5cdFx0Ly9TRV9JTlBVVF9EQVRJX1NPU0NJRVRBX0VTSVNURSA9PiBSRUNVUEVSTyBMRSBTRURJXHJcblx0XHR0aGlzLmRhdGlzb2NpZXRhPy5zZWRpID9cclxuXHRcdFx0dGhpcy5zdHJlYW1MaXN0YVNlZGkkLm5leHQodGhpcy5kYXRpc29jaWV0YT8uc2VkaSkgOlxyXG5cdFx0XHRudWxsXHJcblx0XHQvL1ZBTElEQVpJT05FX0lOSVpJQUxFXHJcblx0XHRjb25zdCB2YWxpZCA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuXHRcdGlmICh0aGlzLnJlc2V0Rm9ybSkge1xyXG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMucmVzZXRGb3JtLnN1YnNjcmliZSh2YWwgPT5cclxuXHRcdFx0XHR2YWwgPyB0aGlzLnB1bGlzY2lGb3JtKCkgOiBcIlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuZGF0aXNvY2lldGEpIHtcclxuXHRcdFx0dGhpcy5pbml0RGF0aVNvY2lldGEoKTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjb2RpY2VGaXNjYWxlID0gbmV3IEZvcm1Db250cm9sKFxyXG5cdFx0XHR7IHZhbHVlOiB0aGlzLmRhdGlzb2NpZXRhLmNvZGljZUZpc2NhbGUsIGRpc2FibGVkOiB0aGlzLnBlcnNvbmFHaXVyaWRpY2FGcm9tRGVsZWdoZSQgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZSB9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IsXHJcblx0XHRcdFx0VmFsaWRhdGlvblNlcnZpY2UucGF0dGVybihcclxuXHRcdFx0XHRcdHRoaXMuY291bGRCZURpdHRhSW5kaXZpZHVhbGUgPyBWYWxpZGF0aW9uU2VydmljZS5fY29kaWNlRmlzY2FsZVBpdmEgOiBWYWxpZGF0aW9uU2VydmljZS5wYXJ0aXRhSXZhLFxyXG5cdFx0XHRcdFx0XCJjZkludmFsaWRvRm9ybWFsbWVudGVcIlxyXG5cdFx0XHRcdCksXHJcblx0XHRcdF0sXHJcblxyXG5cdFx0KTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKFwiY29kaWNlRmlzY2FsZVwiLCBjb2RpY2VGaXNjYWxlKTtcclxuXHJcblx0XHRjb25zdCByYWdpb25lU29jaWFsZSA9IG5ldyBGb3JtQ29udHJvbChcclxuXHRcdFx0eyB2YWx1ZTogdGhpcy5kYXRpc29jaWV0YS5yYWdpb25lU29jaWFsZSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuXHRcdFx0W1xyXG5cdFx0XHRcdC8vIHRoaXMudmFsaWRhdG9yRm9ybUNvbnRyb2wgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXHJcblx0XHRcdF1cclxuXHRcdCk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbChcInJhZ2lvbmVTb2NpYWxlXCIsIHJhZ2lvbmVTb2NpYWxlKTtcclxuXHJcblx0XHRjb25zdCBwYXJ0aXRhSVZBID0gbmV3IEZvcm1Db250cm9sKFxyXG5cdFx0XHR7IHZhbHVlOiB0aGlzLmRhdGlzb2NpZXRhLnBhcnRpdGFJVkEsIGRpc2FibGVkOiB0cnVlIH0sXHJcblx0XHRcdFtcclxuXHRcdFx0XHQvLyB0aGlzLnZhbGlkYXRvckZvcm1Db250cm9sID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcixcclxuXHRcdFx0XHQvLyBWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFxyXG5cdFx0XHRcdC8vIFx0VmFsaWRhdGlvblNlcnZpY2UucGFydGl0YUl2YSxcclxuXHRcdFx0XHQvLyBcdFwicGFydGl0YUlWQUludmFsaWRhXCJcclxuXHRcdFx0XHQvLyApLFxyXG5cdFx0XHRdXHJcblx0XHQpO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woXCJwYXJ0aXRhSVZBXCIsIHBhcnRpdGFJVkEpO1xyXG5cclxuXHRcdGlmICh0aGlzLnBlcnNvbmFHaXVyaWRpY2FGcm9tRGVsZWdoZSQpIHtcclxuXHRcdFx0dGhpcy5wZXJzb25hR2l1cmlkaWNhJCA9IHRoaXMucGVyc29uYUdpdXJpZGljYUZyb21EZWxlZ2hlJFxyXG5cdFx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdFx0bWFwKHBnID0+IG5ldyBQZ1ZhbGlkYXRpb24odHJ1ZSwgcGcpKSxcclxuXHRcdFx0XHRcdGNhdGNoRXJyb3IoXyA9PiAgb2YobmV3IFBnVmFsaWRhdGlvbihmYWxzZSwgbnVsbCkpICksXHJcblx0XHRcdFx0XHRzaGFyZVJlcGxheSgpXHJcblx0XHRcdFx0KVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wZXJzb25hR2l1cmlkaWNhJCA9IHRoaXMuZm9ybS5nZXQoJ2NvZGljZUZpc2NhbGUnKS52YWx1ZUNoYW5nZXNcclxuXHRcdFx0XHQucGlwZShcclxuXHRcdFx0XHRcdGF1ZGl0VGltZSgxMDAwKSxcclxuXHRcdFx0XHRcdHN3aXRjaE1hcCh2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiAoKHRoaXMuY291bGRCZURpdHRhSW5kaXZpZHVhbGUgJiYgKHZhbHVlPy5sZW5ndGggPT0gMTEgfHwgdmFsdWU/Lmxlbmd0aCA9PSAxNikpXHJcblx0XHRcdFx0XHRcdCAgICAgICAgfHwgXHJcblx0XHRcdFx0XHRcdFx0XHQoIXRoaXMuY291bGRCZURpdHRhSW5kaXZpZHVhbGUgJiYgdmFsdWU/Lmxlbmd0aCA9PSAxMSlcclxuXHRcdFx0XHRcdFx0ICAgICAgIClcclxuXHRcdFx0XHRcdFx0ID9cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWxlZ2hlU2VydmljZS5nZXRQZXJzb25hR2l1cmlkaWNhQ29kaWNlRmlzY2FsZSh2YWx1ZSlcclxuXHRcdFx0XHRcdFx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRtYXAocGcgPT4gbmV3IFBnVmFsaWRhdGlvbih0cnVlLCBwZykpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXRjaEVycm9yKF8gPT4gdGhpcy5jYXRjaFBlcnNvbmFHaXVyaWRpY2FFcnJvcigpKVxyXG5cdFx0XHRcdFx0XHRcdFx0KSA6XHJcblx0XHRcdFx0XHRcdCBcdG9mKG5ldyBQZ1ZhbGlkYXRpb24oZmFsc2UsIG51bGwpKVxyXG5cdFx0XHRcdFx0fSksXHJcblx0XHRcdFx0XHRzaGFyZVJlcGxheSgpLFxyXG5cdFx0XHRcdFx0dGFwKCh2YWxpZGF0aW9uUmVzdWx0KSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdbdmFsaWRhdGlvblJlc3VsdF0nLCB2YWxpZGF0aW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdH0pLFxyXG5cdFx0XHRcdFx0c2hhcmVSZXBsYXkoKVxyXG5cdFx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmFsaWRQZ3MkID0gdGhpcy5wZXJzb25hR2l1cmlkaWNhJC5waXBlKFxyXG5cdFx0XHRmaWx0ZXIodiA9PiB2LnZhbGlkKSxcclxuXHRcdFx0bWFwKHYgPT4gdi5wZylcclxuXHRcdClcclxuXHRcdFxyXG5cdFx0Y29uc3QgaW52YWxpZFBncyQgPSB0aGlzLnBlcnNvbmFHaXVyaWRpY2EkLnBpcGUoXHJcblx0XHRcdGZpbHRlcihwZyA9PiAhcGcudmFsaWQpXHJcblx0XHQpOyBcclxuXHJcblx0XHQvL0VWT0xVWklPTkVfUEdcclxuXHRcdGNvbnN0IHBnJCA9IHRoaXMuYnVpbGRTdHJlYW1DaGFuZ2VQRyQodmFsaWRQZ3MkKTtcclxuXHRcdGNvbnN0IHBnQ2hhbmdlJCA9IHBnJC5waXBlKFxyXG5cdFx0XHR0YXAocGcgPT4gdGhpcy5zZXRTZWRpKHBnWydzZWRpJ10pKSxcclxuXHRcdFx0dGFwKHBnID0+IHRoaXMuY29udHJvbGxvU2VkZUxlZ2FsZShwZykpLFxyXG5cdFx0XHRtYXAocGcgPT4geyBcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjb25zdCB2YWxpZGl0eSA9IHBnWydzZWRpJ10/LmZpbmQoc2VkZSA9PiBzZWRlLnRpcG9TZWRlWydjb2RpY2UnXSA9PSB0aGlzLkNPRElDRV9MRUdBTEUpID8gXHJcblx0XHRcdFx0XHQhdGhpcy5mb3JtLmludmFsaWRcclxuXHRcdFx0XHRcdDogZmFsc2U7XHJcblxyXG5cdFx0XHRcdHJldHVybiBDb21wb25lbnRPdXRwdXRTdGF0dXMub2YoXHJcblx0XHRcdFx0XHR2YWxpZGl0eVxyXG5cdFx0XHRcdFx0LCAocGVyc29uYUdpdXJpZGljYSkgPT4gT2JqZWN0LmtleXMocGcpXHJcblx0XHRcdFx0XHRcdC5mb3JFYWNoKGtleSA9PiBwZXJzb25hR2l1cmlkaWNhW2tleV0gPSBwZ1trZXldKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHQvL19fX1ZhbGlkYXppb25lX19fXHJcblx0XHRjb25zdCBjaGFuZ2VzJCA9IENvbXBvbmVudFJlZHVjZXJcclxuXHRcdFx0LnJlZHVjZXIyKFxyXG5cdFx0XHRcdHBnQ2hhbmdlJCxcclxuXHRcdFx0XHR0aGlzLmNoYW5nZVNlZGkkLFxyXG5cdFx0XHRcdF8gPT4gdHJ1ZSxcclxuXHRcdFx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodmFsaWQsIHRoaXMuZGF0aXNvY2lldGEpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly9fX19fT1VUUFVUX0NPTVBPTkVOVF9fX19cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gY2hhbmdlcyQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLmRvbmUuZW1pdChfKSk7XHJcblxyXG5cdFx0dGhpcy5pbnZhbGlkUGdzU3Vic2NyaXB0aW9ucyA9IGludmFsaWRQZ3MkLnN1YnNjcmliZShcclxuXHRcdFx0XyA9PiB7XHJcblx0XHRcdFx0dGhpcy5mb3JtLmdldCgncGFydGl0YUlWQScpLnNldFZhbHVlKFwiXCIpO1xyXG5cdFx0XHRcdHRoaXMuZm9ybS5nZXQoJ3JhZ2lvbmVTb2NpYWxlJykuc2V0VmFsdWUoXCJcIik7XHJcblx0XHRcdFx0dGhpcy5wZXJzb25hU2VsZWN0ZWQkLm5leHQobnVsbCk7XHJcblx0XHRcdFx0dGhpcy5kb25lLmVtaXQoQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKGZhbHNlLCBuZXcgUGVyc29uYUdpdXJpZGljYURUTygpKSk7XHJcblx0XHRcdH1cclxuXHRcdClcclxuXHJcblx0XHRpZiAodGhpcy5kYXRpc29jaWV0YSkge1xyXG5cdFx0XHRjb2RpY2VGaXNjYWxlLnNldFZhbHVlKHRoaXMuZGF0aXNvY2lldGE/LmNvZGljZUZpc2NhbGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vQ0ZfREFMTCdFU1RFUk5PXHJcblx0XHRpZiAodGhpcy5jZiQpIHtcclxuXHRcdFx0dGhpcy5zdWJDRiA9IHRoaXMuY2YkXHJcblx0XHRcdFx0LnBpcGUodGFwKGNmID0+IGNvZGljZUZpc2NhbGUuc2V0VmFsdWUoY2YpKSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZygnbmdPbkNoYW5nZXM6JyxjaGFuZ2VzKTtcclxuXHRcdGlmKHRoaXMuZm9ybT8uY29udHJvbHM/LmNvZGljZUZpc2NhbGUpIHtcclxuXHRcdFx0dGhpcy5mb3JtPy5jb250cm9scz8uY29kaWNlRmlzY2FsZS5zZXRWYWxpZGF0b3JzKG51bGwpO1xyXG5cdFx0XHR0aGlzLmZvcm0/LmNvbnRyb2xzPy5jb2RpY2VGaXNjYWxlLnNldFZhbGlkYXRvcnMoW1xyXG5cdFx0XHRcdHRoaXMudmFsaWRhdG9yRm9ybUNvbnRyb2wgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLnBhdHRlcm4oXHJcblx0XHRcdFx0XHR0aGlzLmNvdWxkQmVEaXR0YUluZGl2aWR1YWxlID8gVmFsaWRhdGlvblNlcnZpY2UuX2NvZGljZUZpc2NhbGVQaXZhIDogVmFsaWRhdGlvblNlcnZpY2UucGFydGl0YUl2YSxcclxuXHRcdFx0XHRcdFwiY2ZJbnZhbGlkb0Zvcm1hbG1lbnRlXCJcclxuXHRcdFx0XHQpLFxyXG5cdFx0XHRdKTtcclxuXHJcblx0XHRcdGlmKGNoYW5nZXM/LmNvdWxkQmVEaXR0YUluZGl2aWR1YWxlPy5jdXJyZW50VmFsdWUgPT0gdHJ1ZSB8fCBjaGFuZ2VzPy5jb3VsZEJlRGl0dGFJbmRpdmlkdWFsZT8uY3VycmVudFZhbHVlID09IGZhbHNlKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0aWYoKGNoYW5nZXM/LmNvdWxkQmVEaXR0YUluZGl2aWR1YWxlPy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcz8uY291bGRCZURpdHRhSW5kaXZpZHVhbGU/LnByZXZpb3VzVmFsdWUpIHx8IGNoYW5nZXM/LmNvdWxkQmVEaXR0YUluZGl2aWR1YWxlPy5wcmV2aW91c1ZhbHVlID09PSB1bmRlZmluZWQpe1xyXG5cdFx0XHRcdFx0dGhpcy5mb3JtPy5jb250cm9scz8uY29kaWNlRmlzY2FsZT8ucGF0Y2hWYWx1ZShudWxsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHRcdFx0Ly90aGlzLmZvcm0/LmNvbnRyb2xzPy5jb2RpY2VGaXNjYWxlPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNhdGNoUGVyc29uYUdpdXJpZGljYUVycm9yKCk6IE9ic2VydmFibGU8UGdWYWxpZGF0aW9uPiB7XHJcblxyXG5cdFx0dGhpcy5kaWFsb2cub3BlbihcclxuXHRcdFx0R2VuZXJpY01vZGFsQ29tcG9uZW50LFxyXG5cdFx0XHR7IGRhdGE6XHJcblx0XHRcdFx0eyB0aXRsZTogJ3BlcnNvbmEtZ2l1cmlkaWNhLWJ5LWNmLWVycm9yLXRpdG9sbydcclxuXHRcdFx0XHQsIGF6aW9uaTogWyBuZXcgQXppb25lKCdvaycpIF1cclxuXHRcdFx0XHQsIHBhcmFncmFmaTogWyAnbW9kYWxpdGEtcGFnYW1lbnRvLWRpYWxvZy10ZXN0byddXHJcblx0XHRcdFx0fSBhcyBHZW5lcmljTW9kYWxEYXRhXHJcblx0XHRcdCwgcGFuZWxDbGFzczogJ2N1c3RvbS1tb2RhbGJveC1rbydcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gb2YobmV3IFBnVmFsaWRhdGlvbihmYWxzZSwgbnVsbCkpO1xyXG5cdCAgfVxyXG5cclxuXHRjb250cm9sbG9TZWRlTGVnYWxlKHBnKSB7XHJcblx0XHRjb25zdCBzZWRlTGVnYWxlID0gcGdbJ3NlZGknXT8uZmluZChzZWRlID0+IHNlZGUudGlwb1NlZGVbJ2NvZGljZSddID09IHRoaXMuQ09ESUNFX0xFR0FMRSk7XHJcblx0XHRsZXQgZXJyb3I6IHN0cmluZ1xyXG5cdFx0aWYgKHBnWydzZWRpJ10/Lmxlbmd0aCA9PSAwIHx8ICFwZ1snc2VkaSddKSB7XHJcblx0XHRcdGVycm9yID0gXCJuZXNzdW5hU2VkZVwiXHJcblx0XHR9IGVsc2UgaWYgKCFzZWRlTGVnYWxlKSB7XHJcblx0XHRcdGVycm9yID0gXCJuZXNzdW5hU2VkZUxlZ2FsZVwiXHJcblx0XHR9XHJcblx0XHR0aGlzLmVycm9yU2VkaSQubmV4dChlcnJvcik7XHJcblx0fVxyXG5cdGJ1aWxkU3RyZWFtQ2hhbmdlUEckKHBlcnNvbmFHaXVyaWRpY2EkOiBPYnNlcnZhYmxlPFBlcnNvbmFHaXVyaWRpY2E+KSB7XHJcblx0XHRyZXR1cm4gcGVyc29uYUdpdXJpZGljYSRcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKHBnID0+IHRoaXMucGVyc29uYVNlbGVjdGVkJC5uZXh0KHBnKSksXHJcblx0XHRcdFx0bWFwKHBnID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGNvZGljZUZpc2NhbGU6IHBnLmRhdGlQZXJzb25hR2l1cmlkaWNhLmNvZGljZUZpc2NhbGUsXHJcblx0XHRcdFx0XHRcdHBhcnRpdGFJVkE6IHBnLmRhdGlQZXJzb25hR2l1cmlkaWNhLnBhcnRpdGFJVkEsXHJcblx0XHRcdFx0XHRcdHJhZ2lvbmVTb2NpYWxlOiBwZy5kYXRpUGVyc29uYUdpdXJpZGljYS5yYWdpb25lU29jaWFsZSxcclxuXHRcdFx0XHRcdFx0aWRQZXJzb25hR2l1cmlkaWNhOiBwZy5kYXRpUGVyc29uYUdpdXJpZGljYS5pZCxcclxuXHRcdFx0XHRcdFx0Y29kaWNlUmVnaW9uZTogcGc/LnNlZGlcclxuXHRcdFx0XHRcdFx0XHQ/LmZpbHRlcihzZWRlTGVnYWxlID0+XHJcblx0XHRcdFx0XHRcdFx0XHRzZWRlTGVnYWxlPy50aXBvU2VkZT8uY29kaWNlID09PSBcIkxFR0FMRVwiKVswXT8uaW5kaXJpenpvPy5yZWdpb25lPy5zaWdsYSxcclxuXHRcdFx0XHRcdFx0c2VkaTogcGcuc2VkaSxcclxuXHRcdFx0XHRcdFx0aGFzQW1tVXRlbnplOiBwZy5oYXNBbW1VdGVuemVcclxuXHRcdFx0XHRcdH0gYXMgUGVyc29uYUdpdXJpZGljYURUT1xyXG5cdFx0XHRcdH0pLFxyXG5cdFx0XHRcdHRhcChwZyA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmZvcm0uZ2V0KCdwYXJ0aXRhSVZBJykuc2V0VmFsdWUocGdbJ3BhcnRpdGFJVkEnXSk7XHJcblx0XHRcdFx0XHR0aGlzLmZvcm0uZ2V0KCdyYWdpb25lU29jaWFsZScpLnNldFZhbHVlKHBnWydyYWdpb25lU29jaWFsZSddKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHRzdGFydFdpdGgoQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKGZhbHNlLCBwZyA9PiBwZykpXHJcblx0XHRcdClcclxuXHJcblx0fVxyXG5cclxuXHRzZXRTZWRpKHNlZGk6IEFycmF5PFNlZGU+KSB7XHJcblx0XHQoZ2l2ZW4oc2VkaSlcclxuXHRcdFx0LndoZW4oaXMobnVsbCksICgpID0+IHRoaXMuc3RyZWFtTGlzdGFTZWRpJC5uZXh0KFtdKSlcclxuXHRcdFx0Lm90aGVyd2lzZSgoKSA9PiB0aGlzLnN0cmVhbUxpc3RhU2VkaSQubmV4dChzZWRpKSlcclxuXHRcdFx0LnZhbHVlT2YoKSBhcyBGdW5jdGlvblxyXG5cdFx0KSgpO1xyXG5cdH1cclxuXHJcblx0c2VkaVJlYWR5KHNlZGVTZWxlY3RlZFN0YXR1czogQ29tcG9uZW50T3V0cHV0U3RhdHVzPEFycmF5PFNlZGU+Pikge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coXCJbc2VkZVNlbGVjdGVkU3RhdHVzXVwiLCBzZWRlU2VsZWN0ZWRTdGF0dXMpO1xyXG5cdFx0dGhpcy5jaGFuZ2VTZWRpJC5uZXh0KFxyXG5cdFx0XHRzZWRlU2VsZWN0ZWRTdGF0dXMubWFwVmFsdWUoXHJcblx0XHRcdFx0KHNlZGU6IEFycmF5PFNlZGU+KSA9PiAocGc6IFBlcnNvbmFHaXVyaWRpY2FEVE8pID0+IHBnLnNlZGkgPSBzZWRlXHJcblx0XHRcdClcclxuXHRcdClcclxuXHR9XHJcblxyXG5cdGluaXREYXRpU29jaWV0YSgpIHtcclxuXHRcdHRoaXMuZGF0aXNvY2lldGEgPSBuZXcgUGVyc29uYUdpdXJpZGljYURUTygpO1xyXG5cdH1cclxuXHJcblx0cHVsaXNjaUZvcm0oKSB7XHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtLnZhbHVlKTtcclxuXHRcdGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRjb25zdCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XHJcblx0XHRcdGNvbnRyb2wuc2V0VmFsdWUoXCJcIik7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIl19