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.

227 lines 47.4 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYS1naXVyaWRpY2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItdGVybmkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kZXBvc2l0aS9jb21tb24tY29tcG9uZW50L3BlcnNvbmEtZ2l1cmlkaWNhL3BlcnNvbmEtZ2l1cmlkaWNhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUlOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQWdCLE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxF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QUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sT0FBTyxHQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7O1lBclVELFNBQVMsU0FBQztnQkFDVixRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyw2L0dBQWlEOzthQUVqRDs7O1lBdkJRLGNBQWM7WUFEZCxjQUFjO1lBSWQsU0FBUzs7O2tCQXVCaEIsS0FBSzswQkFHTCxLQUFLO2dDQUdMLEtBQUs7d0JBR0wsS0FBSzt3QkFHTCxLQUFLO21DQUdMLEtBQUs7MkJBR0wsS0FBSztzQ0FHTCxLQUFLOzJDQUdMLEtBQUs7bUJBR0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q29tcG9uZW50LFxyXG5cdEV2ZW50RW1pdHRlcixcclxuXHRJbnB1dCxcclxuXHRPbkluaXQsXHJcblx0T3V0cHV0LFxyXG5cdE9uRGVzdHJveSxcclxuXHRPbkNoYW5nZXMsXHJcblx0U2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgYXVkaXRUaW1lLCBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgUGVyc29uYUdpdXJpZGljYURUTyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGVyc29uYS1naXVyaWRpY2EtZHRvXCI7XHJcbmltcG9ydCB7IFBlcnNvbmFHaXVyaWRpY2EgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BvcnRhbGUvcGVyc29uYS1naXVyaWRpY2EtbW9kZWxcIjtcclxuaW1wb3J0IHsgU2VkZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcG9ydGFsZS9zZWRlXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudE91dHB1dFN0YXR1cyB9IGZyb20gXCIuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXNcIjtcclxuaW1wb3J0IHsgRGVsZWdoZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZGVsZWdoZS1zZXJ2aWNlcy9kZWxlZ2hlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlZHVjZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tcG9uZW50LXJlZHVjZXJcIjtcclxuaW1wb3J0IHsgZ2l2ZW4sIGlzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2ZudXRpbHNcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgR2VuZXJpY01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uLWNvbXBvbmVudC9nZW5lcmljLW1vZGFsL2dlbmVyaWMtbW9kYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQXppb25lLCBHZW5lcmljTW9kYWxEYXRhIH0gZnJvbSAnLi4vLi4vY29tbW9uLWNvbXBvbmVudC9nZW5lcmljLW1vZGFsL2dlbmVyaWMtbW9kYWwtZGF0YSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24uc2VydmljZVwiO1xyXG5cclxuXHJcbmludGVyZmFjZSBpbmZvUGVyc29uYUdpdXJpZGljYSB7XHJcblx0Y29kaWNlRmlzY2FsZTogc3RyaW5nLFxyXG5cdHBJdmE6IHN0cmluZyxcclxuXHRyYWdpb25lU29jaWFsZTogc3RyaW5nXHJcbn1cclxuXHJcbmNsYXNzIFBnVmFsaWRhdGlvbiB7XHJcblx0Y29uc3RydWN0b3IocHVibGljIHZhbGlkOiBib29sZWFuLCBwdWJsaWMgcGc6IFBlcnNvbmFHaXVyaWRpY2EpIHt9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiBcImxpYi1wZXJzb25hLWdpdXJpZGljYVwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vcGVyc29uYS1naXVyaWRpY2EuY29tcG9uZW50Lmh0bWxcIixcclxuXHRzdHlsZVVybHM6IFtcIi4vcGVyc29uYS1naXVyaWRpY2EuY29tcG9uZW50LmNzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBlcnNvbmFHaXVyaWRpY2FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuXHJcblx0QElucHV0KClcclxuXHRjZiQ6IFJlcGxheVN1YmplY3Q8c3RyaW5nPjtcclxuXHJcblx0QElucHV0KClcclxuXHRkYXRpc29jaWV0YTogUGVyc29uYUdpdXJpZGljYURUTztcclxuXHJcblx0QElucHV0KClcclxuXHRpZFNlZGVTZWxlemlvbmF0YTogc3RyaW5nO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdG5hbWVzcGFjZTogc3RyaW5nO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHJlc2V0Rm9ybTogU3ViamVjdDxib29sZWFuPjtcclxuXHJcblx0QElucHV0KClcclxuXHR2YWxpZGF0b3JGb3JtQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGdlc3Rpb25lU2VkaTogYm9vbGVhbjtcclxuXHJcblx0QElucHV0KClcclxuXHRjb3VsZEJlRGl0dGFJbmRpdmlkdWFsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cGVyc29uYUdpdXJpZGljYUZyb21EZWxlZ2hlJDogT2JzZXJ2YWJsZTxQZXJzb25hR2l1cmlkaWNhPlxyXG5cclxuXHRAT3V0cHV0KClcclxuXHRkb25lOiBFdmVudEVtaXR0ZXI8XHJcblx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXM8UGVyc29uYUdpdXJpZGljYURUTz5cclxuXHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wb25lbnRPdXRwdXRTdGF0dXM8UGVyc29uYUdpdXJpZGljYURUTz4+KCk7XHJcblxyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cdHN1YlZhbGlkYXRpb246IFN1YnNjcmlwdGlvbjtcclxuXHRwZXJzb25hR2l1cmlkaWNhJDogT2JzZXJ2YWJsZTxQZ1ZhbGlkYXRpb24+O1xyXG5cdGNoYW5nZVNlZGkkOiBSZXBsYXlTdWJqZWN0PENvbXBvbmVudE91dHB1dFN0YXR1czwodmFsdWU6IFBlcnNvbmFHaXVyaWRpY2FEVE8pID0+IHZvaWQ+PiA9IG5ldyBSZXBsYXlTdWJqZWN0PFxyXG5cdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzPCh2YWx1ZTogUGVyc29uYUdpdXJpZGljYURUTykgPT4gdm9pZD5cclxuXHQ+KDEpO1xyXG5cdGNoYW5nZVBHJDogUmVwbGF5U3ViamVjdDxDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQZXJzb25hR2l1cmlkaWNhRFRPKSA9PiB2b2lkPj4gPSBuZXcgUmVwbGF5U3ViamVjdDxcclxuXHRcdENvbXBvbmVudE91dHB1dFN0YXR1czwodmFsdWU6IFBlcnNvbmFHaXVyaWRpY2FEVE8pID0+IHZvaWQ+XHJcblx0PigxKTtcclxuXHQkY2hhbmdlUEc6IFN1YnNjcmlwdGlvbjtcclxuXHRkYXRpU29jaWV0YSQ6IE9ic2VydmFibGU8UGVyc29uYUdpdXJpZGljYURUTz47XHJcblx0c3RyZWFtTGlzdGFTZWRpJDogUmVwbGF5U3ViamVjdDxBcnJheTxTZWRlPj47XHJcblx0cGVyc29uYVNlbGVjdGVkJDogQmVoYXZpb3JTdWJqZWN0PFBlcnNvbmFHaXVyaWRpY2E+ID1cclxuXHRcdG5ldyBCZWhhdmlvclN1YmplY3Q8UGVyc29uYUdpdXJpZGljYT4obnVsbClcclxuXHQkc2VkaTogU3Vic2NyaXB0aW9uO1xyXG5cdHN1YkNGOiBTdWJzY3JpcHRpb247XHJcblx0Zm9ybTogRm9ybUdyb3VwO1xyXG5cdENPRElDRV9MRUdBTEUgPSBcIkxFR0FMRVwiO1xyXG5cdGVycm9yU2VkaSQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHRpbnZhbGlkUGdzU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgbXNnOiBNZXNzYWdlU2VydmljZSxcclxuXHRcdHByaXZhdGUgZGVsZWdoZVNlcnZpY2U6IERlbGVnaGVTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIGRpYWxvZzogTWF0RGlhbG9nXHJcblx0KSB7IH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHRcdHRoaXMuc3ViVmFsaWRhdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHRcdHRoaXMuc3ViQ0Y/LnVuc3Vic2NyaWJlKCk7XHJcblx0XHR0aGlzLmludmFsaWRQZ3NTdWJzY3JpcHRpb25zPy51bnN1YnNjcmliZSgpO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0Ly9HRVNUSU9ORV9TRURJXHJcblx0XHR0aGlzLnN0cmVhbUxpc3RhU2VkaSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG5cdFx0dGhpcy5jaGFuZ2VTZWRpJC5uZXh0KENvbXBvbmVudE91dHB1dFN0YXR1cy5vZighdGhpcy5nZXN0aW9uZVNlZGksIChwZzogUGVyc29uYUdpdXJpZGljYURUTykgPT4gcGcpKTtcclxuXHJcblx0XHQvL1NFX0lOUFVUX0RBVElfU09TQ0lFVEFfRVNJU1RFID0+IFJFQ1VQRVJPIExFIFNFRElcclxuXHRcdHRoaXMuZGF0aXNvY2lldGE/LnNlZGkgP1xyXG5cdFx0XHR0aGlzLnN0cmVhbUxpc3RhU2VkaSQubmV4dCh0aGlzLmRhdGlzb2NpZXRhPy5zZWRpKSA6XHJcblx0XHRcdG51bGxcclxuXHRcdC8vVkFMSURBWklPTkVfSU5JWklBTEVcclxuXHRcdGNvbnN0IHZhbGlkID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMucmVzZXRGb3JtKSB7XHJcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXNldEZvcm0uc3Vic2NyaWJlKHZhbCA9PlxyXG5cdFx0XHRcdHZhbCA/IHRoaXMucHVsaXNjaUZvcm0oKSA6IFwiXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5kYXRpc29jaWV0YSkge1xyXG5cdFx0XHR0aGlzLmluaXREYXRpU29jaWV0YSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvZGljZUZpc2NhbGUgPSBuZXcgRm9ybUNvbnRyb2woXHJcblx0XHRcdHsgdmFsdWU6IHRoaXMuZGF0aXNvY2lldGEuY29kaWNlRmlzY2FsZSwgZGlzYWJsZWQ6IHRoaXMucGVyc29uYUdpdXJpZGljYUZyb21EZWxlZ2hlJCA9PSBudWxsID8gZmFsc2UgOiB0cnVlIH0sXHJcblx0XHRcdFtcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXRvckZvcm1Db250cm9sID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcixcclxuXHRcdFx0XHRWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFxyXG5cdFx0XHRcdFx0dGhpcy5jb3VsZEJlRGl0dGFJbmRpdmlkdWFsZSA/IFZhbGlkYXRpb25TZXJ2aWNlLl9jb2RpY2VGaXNjYWxlUGl2YSA6IFZhbGlkYXRpb25TZXJ2aWNlLnBhcnRpdGFJdmEsXHJcblx0XHRcdFx0XHRcImNmSW52YWxpZG9Gb3JtYWxtZW50ZVwiXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XSxcclxuXHJcblx0XHQpO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woXCJjb2RpY2VGaXNjYWxlXCIsIGNvZGljZUZpc2NhbGUpO1xyXG5cclxuXHRcdGNvbnN0IHJhZ2lvbmVTb2NpYWxlID0gbmV3IEZvcm1Db250cm9sKFxyXG5cdFx0XHR7IHZhbHVlOiB0aGlzLmRhdGlzb2NpZXRhLnJhZ2lvbmVTb2NpYWxlLCBkaXNhYmxlZDogdHJ1ZSB9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0Ly8gdGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3JcclxuXHRcdFx0XVxyXG5cdFx0KTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKFwicmFnaW9uZVNvY2lhbGVcIiwgcmFnaW9uZVNvY2lhbGUpO1xyXG5cclxuXHRcdGNvbnN0IHBhcnRpdGFJVkEgPSBuZXcgRm9ybUNvbnRyb2woXHJcblx0XHRcdHsgdmFsdWU6IHRoaXMuZGF0aXNvY2lldGEucGFydGl0YUlWQSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuXHRcdFx0W1xyXG5cdFx0XHRcdC8vIHRoaXMudmFsaWRhdG9yRm9ybUNvbnRyb2wgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRcdC8vIFZhbGlkYXRpb25TZXJ2aWNlLnBhdHRlcm4oXHJcblx0XHRcdFx0Ly8gXHRWYWxpZGF0aW9uU2VydmljZS5wYXJ0aXRhSXZhLFxyXG5cdFx0XHRcdC8vIFx0XCJwYXJ0aXRhSVZBSW52YWxpZGFcIlxyXG5cdFx0XHRcdC8vICksXHJcblx0XHRcdF1cclxuXHRcdCk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbChcInBhcnRpdGFJVkFcIiwgcGFydGl0YUlWQSk7XHJcblxyXG5cdFx0aWYgKHRoaXMucGVyc29uYUdpdXJpZGljYUZyb21EZWxlZ2hlJCkge1xyXG5cdFx0XHR0aGlzLnBlcnNvbmFHaXVyaWRpY2EkID0gdGhpcy5wZXJzb25hR2l1cmlkaWNhRnJvbURlbGVnaGUkXHJcblx0XHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0XHRtYXAocGcgPT4gbmV3IFBnVmFsaWRhdGlvbih0cnVlLCBwZykpLFxyXG5cdFx0XHRcdFx0Y2F0Y2hFcnJvcihfID0+ICBvZihuZXcgUGdWYWxpZGF0aW9uKGZhbHNlLCBudWxsKSkgKSxcclxuXHRcdFx0XHRcdHNoYXJlUmVwbGF5KClcclxuXHRcdFx0XHQpXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnBlcnNvbmFHaXVyaWRpY2EkID0gdGhpcy5mb3JtLmdldCgnY29kaWNlRmlzY2FsZScpLnZhbHVlQ2hhbmdlc1xyXG5cdFx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdFx0YXVkaXRUaW1lKDEwMDApLFxyXG5cdFx0XHRcdFx0c3dpdGNoTWFwKHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICgodGhpcy5jb3VsZEJlRGl0dGFJbmRpdmlkdWFsZSAmJiAodmFsdWU/Lmxlbmd0aCA9PSAxMSB8fCB2YWx1ZT8ubGVuZ3RoID09IDE2KSlcclxuXHRcdFx0XHRcdFx0ICAgICAgICB8fCBcclxuXHRcdFx0XHRcdFx0XHRcdCghdGhpcy5jb3VsZEJlRGl0dGFJbmRpdmlkdWFsZSAmJiB2YWx1ZT8ubGVuZ3RoID09IDExKVxyXG5cdFx0XHRcdFx0XHQgICAgICAgKVxyXG5cdFx0XHRcdFx0XHQgP1x0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlbGVnaGVTZXJ2aWNlLmdldFBlcnNvbmFHaXVyaWRpY2FDb2RpY2VGaXNjYWxlKHZhbHVlKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdG1hcChwZyA9PiBuZXcgUGdWYWxpZGF0aW9uKHRydWUsIHBnKSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhdGNoRXJyb3IoXyA9PiB0aGlzLmNhdGNoUGVyc29uYUdpdXJpZGljYUVycm9yKCkpXHJcblx0XHRcdFx0XHRcdFx0XHQpIDpcclxuXHRcdFx0XHRcdFx0IFx0b2YobmV3IFBnVmFsaWRhdGlvbihmYWxzZSwgbnVsbCkpXHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRcdHNoYXJlUmVwbGF5KCksXHJcblx0XHRcdFx0XHR0YXAoKHZhbGlkYXRpb25SZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ1t2YWxpZGF0aW9uUmVzdWx0XScsIHZhbGlkYXRpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0fSksXHJcblx0XHRcdFx0XHRzaGFyZVJlcGxheSgpXHJcblx0XHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2YWxpZFBncyQgPSB0aGlzLnBlcnNvbmFHaXVyaWRpY2EkLnBpcGUoXHJcblx0XHRcdGZpbHRlcih2ID0+IHYudmFsaWQpLFxyXG5cdFx0XHRtYXAodiA9PiB2LnBnKVxyXG5cdFx0KVxyXG5cdFx0XHJcblx0XHRjb25zdCBpbnZhbGlkUGdzJCA9IHRoaXMucGVyc29uYUdpdXJpZGljYSQucGlwZShcclxuXHRcdFx0ZmlsdGVyKHBnID0+ICFwZy52YWxpZClcclxuXHRcdCk7IFxyXG5cclxuXHRcdC8vRVZPTFVaSU9ORV9QR1xyXG5cdFx0Y29uc3QgcGckID0gdGhpcy5idWlsZFN0cmVhbUNoYW5nZVBHJCh2YWxpZFBncyQpO1xyXG5cdFx0Y29uc3QgcGdDaGFuZ2UkID0gcGckLnBpcGUoXHJcblx0XHRcdHRhcChwZyA9PiB0aGlzLnNldFNlZGkocGdbJ3NlZGknXSkpLFxyXG5cdFx0XHR0YXAocGcgPT4gdGhpcy5jb250cm9sbG9TZWRlTGVnYWxlKHBnKSksXHJcblx0XHRcdG1hcChwZyA9PiB7IFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnN0IHZhbGlkaXR5ID0gcGdbJ3NlZGknXT8uZmluZChzZWRlID0+IHNlZGUudGlwb1NlZGVbJ2NvZGljZSddID09IHRoaXMuQ09ESUNFX0xFR0FMRSkgPyBcclxuXHRcdFx0XHRcdCF0aGlzLmZvcm0uaW52YWxpZFxyXG5cdFx0XHRcdFx0OiBmYWxzZTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIENvbXBvbmVudE91dHB1dFN0YXR1cy5vZihcclxuXHRcdFx0XHRcdHZhbGlkaXR5XHJcblx0XHRcdFx0XHQsIChwZXJzb25hR2l1cmlkaWNhKSA9PiBPYmplY3Qua2V5cyhwZylcclxuXHRcdFx0XHRcdFx0LmZvckVhY2goa2V5ID0+IHBlcnNvbmFHaXVyaWRpY2Fba2V5XSA9IHBnW2tleV0pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vX19fVmFsaWRhemlvbmVfX19cclxuXHRcdGNvbnN0IGNoYW5nZXMkID0gQ29tcG9uZW50UmVkdWNlclxyXG5cdFx0XHQucmVkdWNlcjIoXHJcblx0XHRcdFx0cGdDaGFuZ2UkLFxyXG5cdFx0XHRcdHRoaXMuY2hhbmdlU2VkaSQsXHJcblx0XHRcdFx0XyA9PiB0cnVlLFxyXG5cdFx0XHRcdENvbXBvbmVudE91dHB1dFN0YXR1cy5vZih2YWxpZCwgdGhpcy5kYXRpc29jaWV0YSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHQvL19fX19PVVRQVVRfQ09NUE9ORU5UX19fX1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24gPSBjaGFuZ2VzJC5zdWJzY3JpYmUoKF8pID0+IHRoaXMuZG9uZS5lbWl0KF8pKTtcclxuXHJcblx0XHR0aGlzLmludmFsaWRQZ3NTdWJzY3JpcHRpb25zID0gaW52YWxpZFBncyQuc3Vic2NyaWJlKFxyXG5cdFx0XHRfID0+IHtcclxuXHRcdFx0XHR0aGlzLmZvcm0uZ2V0KCdwYXJ0aXRhSVZBJykuc2V0VmFsdWUoXCJcIik7XHJcblx0XHRcdFx0dGhpcy5mb3JtLmdldCgncmFnaW9uZVNvY2lhbGUnKS5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdFx0XHR0aGlzLnBlcnNvbmFTZWxlY3RlZCQubmV4dChudWxsKTtcclxuXHRcdFx0XHR0aGlzLmRvbmUuZW1pdChDb21wb25lbnRPdXRwdXRTdGF0dXMub2YoZmFsc2UsIG5ldyBQZXJzb25hR2l1cmlkaWNhRFRPKCkpKTtcclxuXHRcdFx0fVxyXG5cdFx0KVxyXG5cclxuXHRcdGlmICh0aGlzLmRhdGlzb2NpZXRhKSB7XHJcblx0XHRcdGNvZGljZUZpc2NhbGUuc2V0VmFsdWUodGhpcy5kYXRpc29jaWV0YT8uY29kaWNlRmlzY2FsZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly9DRl9EQUxMJ0VTVEVSTk9cclxuXHRcdGlmICh0aGlzLmNmJCkge1xyXG5cdFx0XHR0aGlzLnN1YkNGID0gdGhpcy5jZiRcclxuXHRcdFx0XHQucGlwZSh0YXAoY2YgPT4gY29kaWNlRmlzY2FsZS5zZXRWYWx1ZShjZikpKVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdGNvbnNvbGUubG9nKCduZ09uQ2hhbmdlczonLGNoYW5nZXMpO1xyXG5cdFx0aWYodGhpcy5mb3JtPy5jb250cm9scz8uY29kaWNlRmlzY2FsZSkge1xyXG5cdFx0XHR0aGlzLmZvcm0/LmNvbnRyb2xzPy5jb2RpY2VGaXNjYWxlLnNldFZhbGlkYXRvcnMobnVsbCk7XHJcblx0XHRcdHRoaXMuZm9ybT8uY29udHJvbHM/LmNvZGljZUZpc2NhbGUuc2V0VmFsaWRhdG9ycyhbXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IsXHJcblx0XHRcdFx0VmFsaWRhdGlvblNlcnZpY2UucGF0dGVybihcclxuXHRcdFx0XHRcdHRoaXMuY291bGRCZURpdHRhSW5kaXZpZHVhbGUgPyBWYWxpZGF0aW9uU2VydmljZS5fY29kaWNlRmlzY2FsZVBpdmEgOiBWYWxpZGF0aW9uU2VydmljZS5wYXJ0aXRhSXZhLFxyXG5cdFx0XHRcdFx0XCJjZkludmFsaWRvRm9ybWFsbWVudGVcIlxyXG5cdFx0XHRcdCksXHJcblx0XHRcdF0pO1xyXG5cclxuXHRcdFx0aWYoY2hhbmdlcz8uY291bGRCZURpdHRhSW5kaXZpZHVhbGU/LmN1cnJlbnRWYWx1ZSA9PSB0cnVlIHx8IGNoYW5nZXM/LmNvdWxkQmVEaXR0YUluZGl2aWR1YWxlPy5jdXJyZW50VmFsdWUgPT0gZmFsc2UpXHJcblx0XHRcdHtcclxuXHRcdFx0XHRpZigoY2hhbmdlcz8uY291bGRCZURpdHRhSW5kaXZpZHVhbGU/LmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzPy5jb3VsZEJlRGl0dGFJbmRpdmlkdWFsZT8ucHJldmlvdXNWYWx1ZSkgfHwgY2hhbmdlcz8uY291bGRCZURpdHRhSW5kaXZpZHVhbGU/LnByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCl7XHJcblx0XHRcdFx0XHR0aGlzLmZvcm0/LmNvbnRyb2xzPy5jb2RpY2VGaXNjYWxlPy5wYXRjaFZhbHVlKG51bGwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHQvL3RoaXMuZm9ybT8uY29udHJvbHM/LmNvZGljZUZpc2NhbGU/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2F0Y2hQZXJzb25hR2l1cmlkaWNhRXJyb3IoKTogT2JzZXJ2YWJsZTxQZ1ZhbGlkYXRpb24+IHtcclxuXHJcblx0XHR0aGlzLmRpYWxvZy5vcGVuKFxyXG5cdFx0XHRHZW5lcmljTW9kYWxDb21wb25lbnQsXHJcblx0XHRcdHsgZGF0YTpcclxuXHRcdFx0XHR7IHRpdGxlOiAncGVyc29uYS1naXVyaWRpY2EtYnktY2YtZXJyb3ItdGl0b2xvJ1xyXG5cdFx0XHRcdCwgYXppb25pOiBbIG5ldyBBemlvbmUoJ29rJykgXVxyXG5cdFx0XHRcdCwgcGFyYWdyYWZpOiBbICdtb2RhbGl0YS1wYWdhbWVudG8tZGlhbG9nLXRlc3RvJ11cclxuXHRcdFx0XHR9IGFzIEdlbmVyaWNNb2RhbERhdGFcclxuXHRcdFx0LCBwYW5lbENsYXNzOiAnY3VzdG9tLW1vZGFsYm94LWtvJ1xyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBvZihuZXcgUGdWYWxpZGF0aW9uKGZhbHNlLCBudWxsKSk7XHJcblx0ICB9XHJcblxyXG5cdGNvbnRyb2xsb1NlZGVMZWdhbGUocGcpIHtcclxuXHRcdGNvbnN0IHNlZGVMZWdhbGUgPSBwZ1snc2VkaSddPy5maW5kKHNlZGUgPT4gc2VkZS50aXBvU2VkZVsnY29kaWNlJ10gPT0gdGhpcy5DT0RJQ0VfTEVHQUxFKTtcclxuXHRcdGxldCBlcnJvcjogc3RyaW5nXHJcblx0XHRpZiAocGdbJ3NlZGknXT8ubGVuZ3RoID09IDAgfHwgIXBnWydzZWRpJ10pIHtcclxuXHRcdFx0ZXJyb3IgPSBcIm5lc3N1bmFTZWRlXCJcclxuXHRcdH0gZWxzZSBpZiAoIXNlZGVMZWdhbGUpIHtcclxuXHRcdFx0ZXJyb3IgPSBcIm5lc3N1bmFTZWRlTGVnYWxlXCJcclxuXHRcdH1cclxuXHRcdHRoaXMuZXJyb3JTZWRpJC5uZXh0KGVycm9yKTtcclxuXHR9XHJcblx0YnVpbGRTdHJlYW1DaGFuZ2VQRyQocGVyc29uYUdpdXJpZGljYSQ6IE9ic2VydmFibGU8UGVyc29uYUdpdXJpZGljYT4pIHtcclxuXHRcdHJldHVybiBwZXJzb25hR2l1cmlkaWNhJFxyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHR0YXAocGcgPT4gdGhpcy5wZXJzb25hU2VsZWN0ZWQkLm5leHQocGcpKSxcclxuXHRcdFx0XHRtYXAocGcgPT4ge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0Y29kaWNlRmlzY2FsZTogcGcuZGF0aVBlcnNvbmFHaXVyaWRpY2EuY29kaWNlRmlzY2FsZSxcclxuXHRcdFx0XHRcdFx0cGFydGl0YUlWQTogcGcuZGF0aVBlcnNvbmFHaXVyaWRpY2EucGFydGl0YUlWQSxcclxuXHRcdFx0XHRcdFx0cmFnaW9uZVNvY2lhbGU6IHBnLmRhdGlQZXJzb25hR2l1cmlkaWNhLnJhZ2lvbmVTb2NpYWxlLFxyXG5cdFx0XHRcdFx0XHRpZFBlcnNvbmFHaXVyaWRpY2E6IHBnLmRhdGlQZXJzb25hR2l1cmlkaWNhLmlkLFxyXG5cdFx0XHRcdFx0XHRjb2RpY2VSZWdpb25lOiBwZz8uc2VkaVxyXG5cdFx0XHRcdFx0XHRcdD8uZmlsdGVyKHNlZGVMZWdhbGUgPT5cclxuXHRcdFx0XHRcdFx0XHRcdHNlZGVMZWdhbGU/LnRpcG9TZWRlPy5jb2RpY2UgPT09IFwiTEVHQUxFXCIpWzBdPy5pbmRpcml6em8/LnJlZ2lvbmU/LnNpZ2xhLFxyXG5cdFx0XHRcdFx0XHRzZWRpOiBwZy5zZWRpLFxyXG5cdFx0XHRcdFx0XHRoYXNBbW1VdGVuemU6IHBnLmhhc0FtbVV0ZW56ZVxyXG5cdFx0XHRcdFx0fSBhcyBQZXJzb25hR2l1cmlkaWNhRFRPXHJcblx0XHRcdFx0fSksXHJcblx0XHRcdFx0dGFwKHBnID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZm9ybS5nZXQoJ3BhcnRpdGFJVkEnKS5zZXRWYWx1ZShwZ1sncGFydGl0YUlWQSddKTtcclxuXHRcdFx0XHRcdHRoaXMuZm9ybS5nZXQoJ3JhZ2lvbmVTb2NpYWxlJykuc2V0VmFsdWUocGdbJ3JhZ2lvbmVTb2NpYWxlJ10pO1xyXG5cdFx0XHRcdH0pLFxyXG5cdFx0XHRcdHN0YXJ0V2l0aChDb21wb25lbnRPdXRwdXRTdGF0dXMub2YoZmFsc2UsIHBnID0+IHBnKSlcclxuXHRcdFx0KVxyXG5cclxuXHR9XHJcblxyXG5cdHNldFNlZGkoc2VkaTogQXJyYXk8U2VkZT4pIHtcclxuXHRcdChnaXZlbihzZWRpKVxyXG5cdFx0XHQud2hlbihpcyhudWxsKSwgKCkgPT4gdGhpcy5zdHJlYW1MaXN0YVNlZGkkLm5leHQoW10pKVxyXG5cdFx0XHQub3RoZXJ3aXNlKCgpID0+IHRoaXMuc3RyZWFtTGlzdGFTZWRpJC5uZXh0KHNlZGkpKVxyXG5cdFx0XHQudmFsdWVPZigpIGFzIEZ1bmN0aW9uXHJcblx0XHQpKCk7XHJcblx0fVxyXG5cclxuXHRzZWRpUmVhZHkoc2VkZVNlbGVjdGVkU3RhdHVzOiBDb21wb25lbnRPdXRwdXRTdGF0dXM8QXJyYXk8U2VkZT4+KSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZyhcIltzZWRlU2VsZWN0ZWRTdGF0dXNdXCIsIHNlZGVTZWxlY3RlZFN0YXR1cyk7XHJcblx0XHR0aGlzLmNoYW5nZVNlZGkkLm5leHQoXHJcblx0XHRcdHNlZGVTZWxlY3RlZFN0YXR1cy5tYXBWYWx1ZShcclxuXHRcdFx0XHQoc2VkZTogQXJyYXk8U2VkZT4pID0+IChwZzogUGVyc29uYUdpdXJpZGljYURUTykgPT4gcGcuc2VkaSA9IHNlZGVcclxuXHRcdFx0KVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0aW5pdERhdGlTb2NpZXRhKCkge1xyXG5cdFx0dGhpcy5kYXRpc29jaWV0YSA9IG5ldyBQZXJzb25hR2l1cmlkaWNhRFRPKCk7XHJcblx0fVxyXG5cclxuXHRwdWxpc2NpRm9ybSgpIHtcclxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0udmFsdWUpO1xyXG5cdFx0a2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdGNvbnN0IGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcclxuXHRcdFx0Y29udHJvbC5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iXX0=