@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
188 lines • 27.7 kB
JavaScript
import { Component, EventEmitter, Input, Output, } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { map, startWith, } from "rxjs/operators";
// TODO
// import { FormUtils } from "src/app/utils/form-utils";
import { InfoAnagrafichePFDTO } from "../../models/info-anagrafiche-pf";
import { ComponentOutputStatus } from "../../normalizzazione/component-output-status";
import { CodiceFiscaleService } from "../../services/codice-fiscale/codice-fiscale.service";
import { DelegheService } from "../../services/deleghe-services/deleghe.service";
import { MessageService } from "../../services/message.service";
import { ValidationService } from "../../services/validation.service";
export class InfoPfComponent {
constructor(msg, validationService, cfService, delegheService) {
this.msg = msg;
this.validationService = validationService;
this.cfService = cfService;
this.delegheService = delegheService;
this.readOnly = false;
this.validatorFormControl = false;
this.done = new EventEmitter();
this.codiceRegione = "";
}
ngOnInit() {
// console.log('[InfoAnagrafichePFDTO]', this.infopf);
this.form = new FormGroup({});
if (this.resetForm) {
this.subscription = this.resetForm.subscribe(val => val ? this.pulisciForm() : "");
}
if (!this.infopf) {
this.initInfoPf();
}
const cfValidators = [
Validators.required,
ValidationService.pattern(ValidationService.codiceFiscale, "cfInvalidoFormalmente"),
];
if (this.cfDifferentFrom != null) {
cfValidators.push(ValidationService.NotEquals(this.cfDifferentFrom, "cfDifferentRichiedente"));
}
const codiceFiscale = new FormControl({ value: this.infopf.codFiscale, disabled: false },
// cfValidators
// this.validatorFormControl ? cfValidators: Validators.nullValidator,
[
this.validatorFormControl ? Validators.required : Validators.nullValidator,
ValidationService.pattern(ValidationService.codiceFiscale, "cfInvalidoFormalmente"),
]
//TODO
// [this.validationService.userValidator(TipiPersona.PERSONA_FISICA)]
);
this.form.addControl("codiceFiscale", codiceFiscale);
const nome = new FormControl({ value: this.infopf.nome, disabled: false }, [
// Validators.required,
// ValidationService.ValidateName,
this.validatorFormControl ? Validators.required : Validators.nullValidator,
ValidationService.pattern(ValidationService.formatoName, "formatoName")
]);
this.form.addControl("nome", nome);
const cognome = new FormControl({ value: this.infopf.cognome, disabled: false }, [
//Validators.required,
//ValidationService.ValidateName
this.validatorFormControl ? Validators.required : Validators.nullValidator,
ValidationService.pattern(ValidationService.formatoName, "formatoName")
]);
this.form.addControl("cognome", cognome);
// TODO
// this.validationSub = codiceFiscale.valueChanges.pipe(
// filter(val => val.length == 16),
// auditTime(500)
// )
// .pipe(
// tap((_) => {
// if (codiceFiscale.errors) {
// delete codiceFiscale.errors["invalidCF"];
// }
// }),
// filter((cf) => codiceFiscale.valid),
// switchMap((cf) =>
// //TODO
// // this.cfService
// // .validaCodiceFiscale$(cf, "F")
// // .pipe(catchError((err) => empty()))
// this.delegheService.getPersonaFiscaleCodiceFiscale(cf)
// .pipe(
// //TODO
// // catchError((err) => empty())
// catchError(err => {
// codiceFiscale.setErrors({ invalidCF: true });
// return EMPTY;
// })
// )
// ),
// tap((validationResult) => {
// console.log('[validationResult]', validationResult);
// // if (!validationResult.valid) {
// if (validationResult == null) {
// codiceFiscale.setErrors({ invalidCF: true });
// } else {
// if (validationResult.residenza != undefined) {
// this.codiceRegione = validationResult?.residenza?.regione?.sigla;
// }
// }
// this.form.updateValueAndValidity();
// })
// )
// .subscribe();
const changes$ = this.form.valueChanges.pipe(map((_) => {
this.removeSpace(this.form.controls["codiceFiscale"].value);
const pf = new InfoAnagrafichePFDTO();
pf.codFiscale = this.form.controls["codiceFiscale"].value;
pf.nome = this.form.controls["nome"].value;
pf.cognome = this.form.controls["cognome"].value;
pf.codiceRegione = this.codiceRegione;
return pf;
}), startWith(this.infopf), map((pf) => {
// console.log(
// "pf form valid",
// FormUtils.getFormValidationErrors(this.form)
// );
const status = ComponentOutputStatus.of(!this.form.invalid || this.readOnly == true, pf);
// console.log("status", status);
return status;
}));
this.pfSub = changes$.subscribe((_) => this.done.emit(_));
if (this.readOnly) {
this.form.disable();
}
}
removeSpace(value) {
var reWhiteSpace = /\s/g;
if (reWhiteSpace.test(value)) {
this.form.get('codiceFiscale').setValue(value.replace(reWhiteSpace, ''));
}
}
ngOnDestroy() {
if (this.pfSub) {
this.pfSub.unsubscribe();
}
if (this.validationSub) {
this.validationSub.unsubscribe();
}
if (this.subscription) {
this.subscription.unsubscribe();
}
}
initInfoPf() {
const infoPfNew = new InfoAnagrafichePFDTO();
//TODO
// if (this.userDetail) {
// infoPfNew.codFiscale = this.userDetail["fiscalNumber"];
// infoPfNew.cognome = this.userDetail["familyName"];
// infoPfNew.nome = this.userDetail["name"];
// }
this.infopf = infoPfNew;
}
pulisciForm() {
const keys = Object.keys(this.form.value);
keys.forEach(key => {
const control = this.form.get(key);
control.setValue("");
});
}
_resetForm() {
var _a;
(_a = this.form) === null || _a === void 0 ? void 0 : _a.reset();
}
}
InfoPfComponent.decorators = [
{ type: Component, args: [{
selector: "lib-info-pf",
template: "<form [formGroup]=\"form\">\r\n\t<div class=\"row my-2\">\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 placeholder=\"{{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.produceCFMessage(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\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'nome' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'nome' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"nome\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['nome'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('obbligatorio',form.controls['nome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'nome'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\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}}{{'cognome' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'cognome' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"cognome\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['cognome'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('obbligatorio',form.controls['cognome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'cognome'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n</form>",
styles: [""]
},] }
];
InfoPfComponent.ctorParameters = () => [
{ type: MessageService },
{ type: ValidationService },
{ type: CodiceFiscaleService },
{ type: DelegheService }
];
InfoPfComponent.propDecorators = {
infopf: [{ type: Input }],
namespace: [{ type: Input }],
cfDifferentFrom: [{ type: Input }],
readOnly: [{ type: Input }],
resetForm: [{ type: Input }],
validatorFormControl: [{ type: Input }],
done: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1wZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiRDovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi10ZXJuaS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RlcG9zaXRpL2NvbW1vbi1jb21wb25lbnQvaW5mby1wZi9pbmZvLXBmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRixPQUFPLEVBRU4sR0FBRyxFQUNILFNBQVMsR0FLVCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU87QUFDUCx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQU90RSxNQUFNLE9BQU8sZUFBZTtJQWlDM0IsWUFDUyxHQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsU0FBK0IsRUFDL0IsY0FBOEI7UUFIOUIsUUFBRyxHQUFILEdBQUcsQ0FBZ0I7UUFDbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixt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TCxLQUFLO21CQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdENvbXBvbmVudCxcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SW5wdXQsXHJcblx0T25EZXN0cm95LFxyXG5cdE9uSW5pdCxcclxuXHRPdXRwdXQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24sIGVtcHR5LCBTdWJqZWN0LCBFTVBUWSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7XHJcblx0ZmlsdGVyLFxyXG5cdG1hcCxcclxuXHRzdGFydFdpdGgsXHJcblx0dGFwLFxyXG5cdHN3aXRjaE1hcCxcclxuXHRjYXRjaEVycm9yLFxyXG5cdGF1ZGl0VGltZSxcclxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuLy8gVE9ET1xyXG4vLyBpbXBvcnQgeyBGb3JtVXRpbHMgfSBmcm9tIFwic3JjL2FwcC91dGlscy9mb3JtLXV0aWxzXCI7XHJcbmltcG9ydCB7IEluZm9BbmFncmFmaWNoZVBGRFRPIH0gZnJvbSBcIi4uLy4uL21vZGVscy9pbmZvLWFuYWdyYWZpY2hlLXBmXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudE91dHB1dFN0YXR1cyB9IGZyb20gXCIuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXNcIjtcclxuaW1wb3J0IHsgQ29kaWNlRmlzY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY29kaWNlLWZpc2NhbGUvY29kaWNlLWZpc2NhbGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZWxlZ2hlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9kZWxlZ2hlLXNlcnZpY2VzL2RlbGVnaGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogXCJsaWItaW5mby1wZlwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vaW5mby1wZi5jb21wb25lbnQuaHRtbFwiLFxyXG5cdHN0eWxlVXJsczogW1wiLi9pbmZvLXBmLmNvbXBvbmVudC5jc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbmZvUGZDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0aW5mb3BmOiBJbmZvQW5hZ3JhZmljaGVQRkRUTztcclxuXHJcblx0QElucHV0KClcclxuXHRuYW1lc3BhY2U6IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRjZkRpZmZlcmVudEZyb206IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRyZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHJlc2V0Rm9ybTogU3ViamVjdDxib29sZWFuPjtcclxuXHJcblx0QElucHV0KClcclxuXHR2YWxpZGF0b3JGb3JtQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRkb25lOiBFdmVudEVtaXR0ZXI8XHJcblx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXM8SW5mb0FuYWdyYWZpY2hlUEZEVE8+XHJcblx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50T3V0cHV0U3RhdHVzPEluZm9BbmFncmFmaWNoZVBGRFRPPj4oKTtcclxuXHJcblx0Zm9ybTogRm9ybUdyb3VwO1xyXG5cdHBmU3ViOiBTdWJzY3JpcHRpb247XHJcblx0dmFsaWRhdGlvblN1YjogU3Vic2NyaXB0aW9uO1xyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRjb2RpY2VSZWdpb25lOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIG1zZzogTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2ZTZXJ2aWNlOiBDb2RpY2VGaXNjYWxlU2VydmljZSxcclxuXHRcdHByaXZhdGUgZGVsZWdoZVNlcnZpY2U6IERlbGVnaGVTZXJ2aWNlXHJcblx0KSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1tJbmZvQW5hZ3JhZmljaGVQRkRUT10nLCB0aGlzLmluZm9wZik7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMucmVzZXRGb3JtKSB7XHJcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXNldEZvcm0uc3Vic2NyaWJlKHZhbCA9PlxyXG5cdFx0XHRcdHZhbCA/IHRoaXMucHVsaXNjaUZvcm0oKSA6IFwiXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5pbmZvcGYpIHtcclxuXHRcdFx0dGhpcy5pbml0SW5mb1BmKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2ZWYWxpZGF0b3JzID0gW1xyXG5cdFx0XHRWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG5cdFx0XHRWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFxyXG5cdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLmNvZGljZUZpc2NhbGUsXHJcblx0XHRcdFx0XCJjZkludmFsaWRvRm9ybWFsbWVudGVcIlxyXG5cdFx0XHQpLFxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAodGhpcy5jZkRpZmZlcmVudEZyb20gIT0gbnVsbCkge1xyXG5cdFx0XHRjZlZhbGlkYXRvcnMucHVzaChcclxuXHRcdFx0XHRWYWxpZGF0aW9uU2VydmljZS5Ob3RFcXVhbHMoXHJcblx0XHRcdFx0XHR0aGlzLmNmRGlmZmVyZW50RnJvbSxcclxuXHRcdFx0XHRcdFwiY2ZEaWZmZXJlbnRSaWNoaWVkZW50ZVwiXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvZGljZUZpc2NhbGUgPSBuZXcgRm9ybUNvbnRyb2woXHJcblx0XHRcdHsgdmFsdWU6IHRoaXMuaW5mb3BmLmNvZEZpc2NhbGUsIGRpc2FibGVkOiBmYWxzZSB9LFxyXG5cdFx0XHQvLyBjZlZhbGlkYXRvcnNcclxuXHRcdFx0Ly8gdGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IGNmVmFsaWRhdG9yczogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IsXHJcblx0XHRcdFx0VmFsaWRhdGlvblNlcnZpY2UucGF0dGVybihcclxuXHRcdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLmNvZGljZUZpc2NhbGUsXHJcblx0XHRcdFx0XHRcImNmSW52YWxpZG9Gb3JtYWxtZW50ZVwiXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XVxyXG5cdFx0XHQvL1RPRE9cclxuXHRcdFx0Ly8gW3RoaXMudmFsaWRhdGlvblNlcnZpY2UudXNlclZhbGlkYXRvcihUaXBpUGVyc29uYS5QRVJTT05BX0ZJU0lDQSldXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKFwiY29kaWNlRmlzY2FsZVwiLCBjb2RpY2VGaXNjYWxlKTtcclxuXHJcblx0XHRjb25zdCBub21lID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuaW5mb3BmLm5vbWUsIGRpc2FibGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0Ly8gVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuXHRcdFx0XHQvL1x0VmFsaWRhdGlvblNlcnZpY2UuVmFsaWRhdGVOYW1lLFxyXG5cdFx0XHRcdHRoaXMudmFsaWRhdG9yRm9ybUNvbnRyb2wgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLnBhdHRlcm4oVmFsaWRhdGlvblNlcnZpY2UuZm9ybWF0b05hbWUsIFwiZm9ybWF0b05hbWVcIilcclxuXHRcdFx0XSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbChcIm5vbWVcIiwgbm9tZSk7XHJcblxyXG5cdFx0Y29uc3QgY29nbm9tZSA9IG5ldyBGb3JtQ29udHJvbChcclxuXHRcdFx0eyB2YWx1ZTogdGhpcy5pbmZvcGYuY29nbm9tZSwgZGlzYWJsZWQ6IGZhbHNlIH0sXHJcblx0XHRcdFtcclxuXHRcdFx0XHQvL1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcblx0XHRcdFx0Ly9WYWxpZGF0aW9uU2VydmljZS5WYWxpZGF0ZU5hbWVcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXRvckZvcm1Db250cm9sID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcixcclxuXHRcdFx0XHRWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFZhbGlkYXRpb25TZXJ2aWNlLmZvcm1hdG9OYW1lLCBcImZvcm1hdG9OYW1lXCIpXHJcblx0XHRcdF0pO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woXCJjb2dub21lXCIsIGNvZ25vbWUpO1xyXG5cclxuXHRcdC8vIFRPRE9cclxuXHRcdC8vIHRoaXMudmFsaWRhdGlvblN1YiA9IGNvZGljZUZpc2NhbGUudmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHQvLyBcdGZpbHRlcih2YWwgPT4gdmFsLmxlbmd0aCA9PSAxNiksXHJcblx0XHQvLyBcdGF1ZGl0VGltZSg1MDApXHJcblx0XHQvLyApXHJcblx0XHQvLyBcdC5waXBlKFxyXG5cdFx0Ly8gXHRcdHRhcCgoXykgPT4ge1xyXG5cdFx0Ly8gXHRcdFx0aWYgKGNvZGljZUZpc2NhbGUuZXJyb3JzKSB7XHJcblx0XHQvLyBcdFx0XHRcdGRlbGV0ZSBjb2RpY2VGaXNjYWxlLmVycm9yc1tcImludmFsaWRDRlwiXTtcclxuXHRcdC8vIFx0XHRcdH1cclxuXHRcdC8vIFx0XHR9KSxcclxuXHRcdC8vIFx0XHRmaWx0ZXIoKGNmKSA9PiBjb2RpY2VGaXNjYWxlLnZhbGlkKSxcclxuXHRcdC8vIFx0XHRzd2l0Y2hNYXAoKGNmKSA9PlxyXG5cdFx0Ly8gXHRcdFx0Ly9UT0RPXHJcblx0XHQvLyBcdFx0XHQvLyB0aGlzLmNmU2VydmljZVxyXG5cdFx0Ly8gXHRcdFx0Ly8gXHQudmFsaWRhQ29kaWNlRmlzY2FsZSQoY2YsIFwiRlwiKVxyXG5cdFx0Ly8gXHRcdFx0Ly8gXHQucGlwZShjYXRjaEVycm9yKChlcnIpID0+IGVtcHR5KCkpKVxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5kZWxlZ2hlU2VydmljZS5nZXRQZXJzb25hRmlzY2FsZUNvZGljZUZpc2NhbGUoY2YpXHJcblx0XHQvLyBcdFx0XHRcdC5waXBlKFxyXG5cdFx0Ly8gXHRcdFx0XHRcdC8vVE9ET1xyXG5cdFx0Ly8gXHRcdFx0XHRcdC8vIGNhdGNoRXJyb3IoKGVycikgPT4gZW1wdHkoKSlcclxuXHRcdC8vIFx0XHRcdFx0XHRjYXRjaEVycm9yKGVyciA9PiB7XHJcblx0XHQvLyBcdFx0XHRcdFx0XHRjb2RpY2VGaXNjYWxlLnNldEVycm9ycyh7IGludmFsaWRDRjogdHJ1ZSB9KTtcclxuXHRcdC8vIFx0XHRcdFx0XHRcdHJldHVybiBFTVBUWTtcclxuXHRcdC8vIFx0XHRcdFx0XHR9KVxyXG5cdFx0Ly8gXHRcdFx0XHQpXHJcblx0XHQvLyBcdFx0KSxcclxuXHRcdC8vIFx0XHR0YXAoKHZhbGlkYXRpb25SZXN1bHQpID0+IHtcclxuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdbdmFsaWRhdGlvblJlc3VsdF0nLCB2YWxpZGF0aW9uUmVzdWx0KTtcclxuXHRcdC8vIFx0XHRcdC8vIGlmICghdmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xyXG5cdFx0Ly8gXHRcdFx0aWYgKHZhbGlkYXRpb25SZXN1bHQgPT0gbnVsbCkge1xyXG5cdFx0Ly8gXHRcdFx0XHRjb2RpY2VGaXNjYWxlLnNldEVycm9ycyh7IGludmFsaWRDRjogdHJ1ZSB9KTtcclxuXHRcdC8vIFx0XHRcdH0gZWxzZSB7XHJcblx0XHQvLyBcdFx0XHRcdGlmICh2YWxpZGF0aW9uUmVzdWx0LnJlc2lkZW56YSAhPSB1bmRlZmluZWQpIHtcclxuXHRcdC8vIFx0XHRcdFx0XHR0aGlzLmNvZGljZVJlZ2lvbmUgPSB2YWxpZGF0aW9uUmVzdWx0Py5yZXNpZGVuemE/LnJlZ2lvbmU/LnNpZ2xhO1xyXG5cdFx0Ly8gXHRcdFx0XHR9XHJcblx0XHQvLyBcdFx0XHR9XHJcblx0XHQvLyBcdFx0XHR0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0Ly8gXHRcdH0pXHJcblx0XHQvLyBcdClcclxuXHRcdC8vIFx0LnN1YnNjcmliZSgpO1xyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXMkID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRtYXAoKF8pID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZVNwYWNlKHRoaXMuZm9ybS5jb250cm9sc1tcImNvZGljZUZpc2NhbGVcIl0udmFsdWUpO1xyXG5cdFx0XHRcdGNvbnN0IHBmID0gbmV3IEluZm9BbmFncmFmaWNoZVBGRFRPKCk7XHJcblx0XHRcdFx0cGYuY29kRmlzY2FsZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcImNvZGljZUZpc2NhbGVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYubm9tZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcIm5vbWVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYuY29nbm9tZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcImNvZ25vbWVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYuY29kaWNlUmVnaW9uZSA9IHRoaXMuY29kaWNlUmVnaW9uZTtcclxuXHRcdFx0XHRyZXR1cm4gcGY7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRzdGFydFdpdGgodGhpcy5pbmZvcGYpLFxyXG5cdFx0XHRtYXAoKHBmKSA9PiB7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXHJcblx0XHRcdFx0Ly8gXHRcInBmIGZvcm0gdmFsaWRcIixcclxuXHRcdFx0XHQvLyBcdEZvcm1VdGlscy5nZXRGb3JtVmFsaWRhdGlvbkVycm9ycyh0aGlzLmZvcm0pXHJcblx0XHRcdFx0Ly8gKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhdHVzID0gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0IXRoaXMuZm9ybS5pbnZhbGlkIHx8IHRoaXMucmVhZE9ubHkgPT0gdHJ1ZSxcclxuXHRcdFx0XHRcdHBmXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInN0YXR1c1wiLCBzdGF0dXMpO1xyXG5cdFx0XHRcdHJldHVybiBzdGF0dXM7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMucGZTdWIgPSBjaGFuZ2VzJC5zdWJzY3JpYmUoKF8pID0+IHRoaXMuZG9uZS5lbWl0KF8pKTtcclxuXHJcblx0XHRpZiAodGhpcy5yZWFkT25seSkge1xyXG5cdFx0XHR0aGlzLmZvcm0uZGlzYWJsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZW1vdmVTcGFjZSh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR2YXIgcmVXaGl0ZVNwYWNlID0gL1xccy9nO1xyXG5cdFx0aWYgKHJlV2hpdGVTcGFjZS50ZXN0KHZhbHVlKSkge1xyXG5cdFx0XHR0aGlzLmZvcm0uZ2V0KCdjb2RpY2VGaXNjYWxlJykuc2V0VmFsdWUodmFsdWUucmVwbGFjZShyZVdoaXRlU3BhY2UsICcnKSk7IFxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5wZlN1Yikge1xyXG5cdFx0XHR0aGlzLnBmU3ViLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudmFsaWRhdGlvblN1Yikge1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRpb25TdWIudW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGluaXRJbmZvUGYoKSB7XHJcblx0XHRjb25zdCBpbmZvUGZOZXcgPSBuZXcgSW5mb0FuYWdyYWZpY2hlUEZEVE8oKTtcclxuXHRcdC8vVE9ET1xyXG5cdFx0Ly8gaWYgKHRoaXMudXNlckRldGFpbCkge1xyXG5cdFx0Ly8gXHRpbmZvUGZOZXcuY29kRmlzY2FsZSA9IHRoaXMudXNlckRldGFpbFtcImZpc2NhbE51bWJlclwiXTtcclxuXHRcdC8vIFx0aW5mb1BmTmV3LmNvZ25vbWUgPSB0aGlzLnVzZXJEZXRhaWxbXCJmYW1pbHlOYW1lXCJdO1xyXG5cdFx0Ly8gXHRpbmZvUGZOZXcubm9tZSA9IHRoaXMudXNlckRldGFpbFtcIm5hbWVcIl07XHJcblx0XHQvLyB9XHJcblx0XHR0aGlzLmluZm9wZiA9IGluZm9QZk5ldztcclxuXHR9XHJcblxyXG5cdHB1bGlzY2lGb3JtKCkge1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS52YWx1ZSk7XHJcblx0XHRrZXlzLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0Y29uc3QgY29udHJvbDogQWJzdHJhY3RDb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xyXG5cdFx0XHRjb250cm9sLnNldFZhbHVlKFwiXCIpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgX3Jlc2V0Rm9ybSgpIHtcclxuXHRcdHRoaXMuZm9ybT8ucmVzZXQoKTtcclxuXHR9XHJcbn0iXX0=