UNPKG

@von-development-studio/primeng-form-validation

Version:
241 lines 29 kB
import { Directive, EventEmitter, HostListener, Input, Output, } from '@angular/core'; import { NG_VALIDATORS, } from '@angular/forms'; import { VALIDATION_MESSAGES } from './von-primeng-validation.constant'; import * as i0 from "@angular/core"; import * as i1 from "primeng/api"; export class VonPrimengValidationDirective { element; renderer; messageService; ngModel; ngModelChange = new EventEmitter(); name; customName; required; requiredMessage; equalTo; equalIgnoreCase; equalToMessage; manualVal; manualValMessage; validator = {}; message = ''; messages = { requiredMessage: '', equalToMessage: '', manualValMessage: '', }; $label; constructor(element, renderer, messageService) { this.element = element; this.renderer = renderer; this.messageService = messageService; } ngOnInit() { const $closestFormEl = this.element.nativeElement.form || this.getClosestForm(this.element.nativeElement); const isValidationEn = !$closestFormEl.hasAttribute('validation-es'); this.messages = isValidationEn ? VALIDATION_MESSAGES.EN : VALIDATION_MESSAGES.ES; this.$label = $closestFormEl.querySelector(`label[for='${this.name}']`); if (this.$label) { this.renderer.addClass(this.$label, 'field__label'); if (this.required) { this.renderer.addClass(this.$label, 'field__label--required'); } } this.renderer.setAttribute(this.element.nativeElement, 'validation', 'true'); this.renderer.addClass(this.element.nativeElement, this.verifyClassName(this.element.nativeElement)); } validate(formValue) { this.validator = this.getCustomValidators(formValue.value); this.runValidation(); return this.validator; } executeChangeEvent = (value) => { if (this.manualVal != null) { setTimeout(() => { this.validator = this.getCustomValidators(value); if (!this.fieldNotValid()) { this.renderer.removeClass(this.element.nativeElement, 'field__error'); this.renderer.removeClass(this.element.nativeElement, 'ng-invalid'); this.renderer.addClass(this.element.nativeElement, 'ng-valid'); } }, 10); } }; executeValidationEvent = () => { this.validator = this.getCustomValidators(this.ngModel); const labelText = this.getLabelText(); const { message, valid } = this.verifyValidationMessage(); if (!valid) { this.renderer.addClass(this.element.nativeElement, 'field__error'); this.messageService.add({ severity: 'error', detail: message.replace('${name}', labelText), }); } else { this.renderer.removeClass(this.element.nativeElement, 'field__error'); this.renderer.removeClass(this.element.nativeElement, 'ng-invalid'); this.renderer.addClass(this.element.nativeElement, 'ng-valid'); } this.element.nativeElement.setAttribute('validation', valid); }; cleanValidationEvent = () => { this.renderer.removeClass(this.element.nativeElement, 'field__error'); }; getClosestForm = (element) => { if (element.tagName === 'FORM' || element.tagName === 'BODY') { return element; } const parent = element.parentElement; if (parent) { return this.getClosestForm(parent); } return element; }; getLabelText = () => { let labelText = this.name || ''; if (this.customName) { labelText = this.customName; } if (this.$label && this.$label.innerText) { labelText = this.$label.innerText; } return labelText; }; runValidation = () => { const isNotValid = this.fieldNotValid(); if (isNotValid) { return; } this.renderer.removeClass(this.element.nativeElement, 'field__error'); }; verifyClassName = (element) => { switch (element.tagName) { case 'INPUT': return 'field__input'; case 'TEXTAREA': return 'field__textarea'; case 'P-DROPDOWN': return 'field__dropdown'; case 'P-CALENDAR': return 'field__calendar'; } return 'field__no-defined'; }; verifyValidationMessage = () => { let message = ''; let valid = false; if (this.validator['isEmpty']) { message = this.requiredMessage || this.messages.requiredMessage; } else if (this.validator['isNotEqual']) { message = this.equalToMessage || this.messages.equalToMessage; } else if (this.validator['manualNotValid']) { message = this.manualValMessage || this.messages.manualValMessage; } else { valid = true; } return { message, valid }; }; getCustomValidators = (formValue) => { return { ...this.validateRequired(formValue), ...this.validateEqualTo(formValue), ...this.validateManual(formValue), }; }; validateRequired = (value) => { let validation = {}; if (!this.required) { return {}; } if (this.required && (value == null || value === '')) { validation = { isEmpty: true }; } return validation; }; validateEqualTo = (value) => { if (!this.equalTo) { return {}; } let validation = {}; const isNotEqual = this.equalIgnoreCase ? `${value}`.toLowerCase() !== `${this.equalTo}`.toLowerCase() : value !== this.equalTo; if (isNotEqual) { validation = { isNotEqual: true }; } return validation; }; validateManual = (_) => { if (this.manualVal == null || this.manualVal) { return {}; } return { manualNotValid: true }; }; fieldNotValid = () => { return (this.validator['isEmpty'] || this.validator['isNotEqual'] || this.validator['manualNotValid']); }; static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VonPrimengValidationDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.MessageService }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: VonPrimengValidationDirective, selector: "[validation]", inputs: { ngModel: "ngModel", name: "name", customName: "customName", required: "required", requiredMessage: "requiredMessage", equalTo: "equalTo", equalIgnoreCase: "equalIgnoreCase", equalToMessage: "equalToMessage", manualVal: "manualVal", manualValMessage: "manualValMessage" }, outputs: { ngModelChange: "ngModelChange" }, host: { listeners: { "ngModelChange": "executeChangeEvent($event)", "executeValidation": "executeValidationEvent()", "cleanValidation": "cleanValidationEvent()" } }, providers: [ { provide: NG_VALIDATORS, useExisting: VonPrimengValidationDirective, multi: true, }, ], ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VonPrimengValidationDirective, decorators: [{ type: Directive, args: [{ selector: '[validation]', providers: [ { provide: NG_VALIDATORS, useExisting: VonPrimengValidationDirective, multi: true, }, ], standalone: false, }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.MessageService }], propDecorators: { ngModel: [{ type: Input }], ngModelChange: [{ type: Output }], name: [{ type: Input }], customName: [{ type: Input }], required: [{ type: Input }], requiredMessage: [{ type: Input }], equalTo: [{ type: Input }], equalIgnoreCase: [{ type: Input }], equalToMessage: [{ type: Input }], manualVal: [{ type: Input }], manualValMessage: [{ type: Input }], executeChangeEvent: [{ type: HostListener, args: ['ngModelChange', ['$event']] }], executeValidationEvent: [{ type: HostListener, args: ['executeValidation'] }], cleanValidationEvent: [{ type: HostListener, args: ['cleanValidation'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9uLXByaW1lbmctdmFsaWRhdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZW5nLWZvcm0tdmFsaWRhdGlvbi9zcmMvbGliL3Zvbi1wcmltZW5nLWZvcm0tdmFsaWRhdGlvbi92b24tcHJpbWVuZy12YWxpZGF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsYUFBYSxHQUlkLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7OztBQWN4RSxNQUFNLE9BQU8sNkJBQTZCO0lBd0I1QjtJQUNBO0lBQ0E7SUF6QkgsT0FBTyxDQUFPO0lBQ2IsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDekMsSUFBSSxDQUFVO0lBQ2QsVUFBVSxDQUFVO0lBRXBCLFFBQVEsQ0FBVztJQUNuQixlQUFlLENBQVU7SUFDekIsT0FBTyxDQUFPO0lBQ2QsZUFBZSxDQUFXO0lBQzFCLGNBQWMsQ0FBVTtJQUN4QixTQUFTLENBQVc7SUFDcEIsZ0JBQWdCLENBQVU7SUFFekIsU0FBUyxHQUFxQixFQUFFLENBQUM7SUFDakMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLFFBQVEsR0FBd0M7UUFDeEQsZUFBZSxFQUFFLEVBQUU7UUFDbkIsY0FBYyxFQUFFLEVBQUU7UUFDbEIsZ0JBQWdCLEVBQUUsRUFBRTtLQUNyQixDQUFDO0lBQ1EsTUFBTSxDQUFlO0lBRS9CLFlBQ1ksT0FBbUIsRUFDbkIsUUFBbUIsRUFDbkIsY0FBOEI7UUFGOUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG1CQUFj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QUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO3dHQXROUyw2QkFBNkI7NEZBQTdCLDZCQUE2QixvaEJBVDdCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSw2QkFBNkI7Z0JBQzFDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjs7NEZBR1UsNkJBQTZCO2tCQVh6QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsK0JBQStCOzRCQUMxQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxVQUFVLEVBQUUsS0FBSztpQkFDbEI7b0lBRVUsT0FBTztzQkFBZixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBa0RxQyxrQkFBa0I7c0JBQTVELFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWVOLHNCQUFzQjtzQkFBeEQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBbUJBLG9CQUFvQjtzQkFBcEQsWUFBWTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgTkdfVkFMSURBVE9SUyxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvcixcclxuICBWYWxpZGF0b3JGbixcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBWQUxJREFUSU9OX01FU1NBR0VTIH0gZnJvbSAnLi92b24tcHJpbWVuZy12YWxpZGF0aW9uLmNvbnN0YW50JztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VzTG9jYWxpemF0aW9uTW9kZWwgfSBmcm9tICcuL3Zvbi1wcmltZW5nLXZhbGlkYXRpb24ubW9kZWwnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbdmFsaWRhdGlvbl0nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gICAgICB1c2VFeGlzdGluZzogVm9uUHJpbWVuZ1ZhbGlkYXRpb25EaXJlY3RpdmUsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVm9uUHJpbWVuZ1ZhbGlkYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIFZhbGlkYXRvciB7XHJcbiAgQElucHV0KCkgbmdNb2RlbD86IGFueTtcclxuICBAT3V0cHV0KCkgbmdNb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3VzdG9tTmFtZT86IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkTWVzc2FnZT86IHN0cmluZztcclxuICBASW5wdXQoKSBlcXVhbFRvPzogYW55O1xyXG4gIEBJbnB1dCgpIGVxdWFsSWdub3JlQ2FzZT86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZXF1YWxUb01lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWFudWFsVmFsPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBtYW51YWxWYWxNZXNzYWdlPzogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBWYWxpZGF0aW9uRXJyb3JzID0ge307XHJcbiAgcHJvdGVjdGVkIG1lc3NhZ2UgPSAnJztcclxuICBwcm90ZWN0ZWQgbWVzc2FnZXM6IFZhbGlkYXRpb25NZXNzYWdlc0xvY2FsaXphdGlvbk1vZGVsID0ge1xyXG4gICAgcmVxdWlyZWRNZXNzYWdlOiAnJyxcclxuICAgIGVxdWFsVG9NZXNzYWdlOiAnJyxcclxuICAgIG1hbnVhbFZhbE1lc3NhZ2U6ICcnLFxyXG4gIH07XHJcbiAgcHJvdGVjdGVkICRsYWJlbD86IEhUTUxFbGVtZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0ICRjbG9zZXN0Rm9ybUVsID1cclxuICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9ybSB8fFxyXG4gICAgICB0aGlzLmdldENsb3Nlc3RGb3JtKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IGlzVmFsaWRhdGlvbkVuID0gISRjbG9zZXN0Rm9ybUVsLmhhc0F0dHJpYnV0ZSgndmFsaWRhdGlvbi1lcycpO1xyXG4gICAgdGhpcy5tZXNzYWdlcyA9IGlzVmFsaWRhdGlvbkVuXHJcbiAgICAgID8gVkFMSURBVElPTl9NRVNTQUdFUy5FTlxyXG4gICAgICA6IFZBTElEQVRJT05fTUVTU0FHRVMuRVM7XHJcblxyXG4gICAgdGhpcy4kbGFiZWwgPSAkY2xvc2VzdEZvcm1FbC5xdWVyeVNlbGVjdG9yKGBsYWJlbFtmb3I9JyR7dGhpcy5uYW1lfSddYCk7XHJcbiAgICBpZiAodGhpcy4kbGFiZWwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLiRsYWJlbCwgJ2ZpZWxkX19sYWJlbCcpO1xyXG4gICAgICBpZiAodGhpcy5yZXF1aXJlZCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy4kbGFiZWwsICdmaWVsZF9fbGFiZWwtLXJlcXVpcmVkJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxyXG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgJ3ZhbGlkYXRpb24nLFxyXG4gICAgICAndHJ1ZSdcclxuICAgICk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxyXG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgdGhpcy52ZXJpZnlDbGFzc05hbWUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoZm9ybVZhbHVlOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xyXG4gICAgdGhpcy52YWxpZGF0b3IgPSB0aGlzLmdldEN1c3RvbVZhbGlkYXRvcnMoZm9ybVZhbHVlLnZhbHVlKTtcclxuICAgIHRoaXMucnVuVmFsaWRhdGlvbigpO1xyXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pIGV4ZWN1dGVDaGFuZ2VFdmVudCA9IChcclxuICAgIHZhbHVlOiBhbnlcclxuICApID0+IHtcclxuICAgIGlmICh0aGlzLm1hbnVhbFZhbCAhPSBudWxsKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdG9yID0gdGhpcy5nZXRDdXN0b21WYWxpZGF0b3JzKHZhbHVlKTtcclxuICAgICAgICBpZiAoIXRoaXMuZmllbGROb3RWYWxpZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZmllbGRfX2Vycm9yJyk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnbmctaW52YWxpZCcpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ25nLXZhbGlkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZXhlY3V0ZVZhbGlkYXRpb24nKSBleGVjdXRlVmFsaWRhdGlvbkV2ZW50ID0gKCkgPT4ge1xyXG4gICAgdGhpcy52YWxpZGF0b3IgPSB0aGlzLmdldEN1c3RvbVZhbGlkYXRvcnModGhpcy5uZ01vZGVsKTtcclxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KCk7XHJcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHZhbGlkIH0gPSB0aGlzLnZlcmlmeVZhbGlkYXRpb25NZXNzYWdlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZmllbGRfX2Vycm9yJyk7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICBkZXRhaWw6IG1lc3NhZ2UucmVwbGFjZSgnJHtuYW1lfScsIGxhYmVsVGV4dCksXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2ZpZWxkX19lcnJvcicpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnbmctaW52YWxpZCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnbmctdmFsaWQnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsaWRhdGlvbicsIHZhbGlkKTtcclxuICB9O1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGVhblZhbGlkYXRpb24nKSBjbGVhblZhbGlkYXRpb25FdmVudCA9ICgpID0+IHtcclxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdmaWVsZF9fZXJyb3InKTtcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgZ2V0Q2xvc2VzdEZvcm0gPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCA9PiB7XHJcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScgfHwgZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScpIHtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgaWYgKHBhcmVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRDbG9zZXN0Rm9ybShwYXJlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIGdldExhYmVsVGV4dCA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgbGV0IGxhYmVsVGV4dCA9IHRoaXMubmFtZSB8fCAnJztcclxuICAgIGlmICh0aGlzLmN1c3RvbU5hbWUpIHtcclxuICAgICAgbGFiZWxUZXh0ID0gdGhpcy5jdXN0b21OYW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuJGxhYmVsICYmIHRoaXMuJGxhYmVsLmlubmVyVGV4dCkge1xyXG4gICAgICBsYWJlbFRleHQgPSB0aGlzLiRsYWJlbC5pbm5lclRleHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGFiZWxUZXh0O1xyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCBydW5WYWxpZGF0aW9uID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgaXNOb3RWYWxpZCA9IHRoaXMuZmllbGROb3RWYWxpZCgpO1xyXG4gICAgaWYgKGlzTm90VmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2ZpZWxkX19lcnJvcicpO1xyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCB2ZXJpZnlDbGFzc05hbWUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xyXG4gICAgc3dpdGNoIChlbGVtZW50LnRhZ05hbWUpIHtcclxuICAgICAgY2FzZSAnSU5QVVQnOlxyXG4gICAgICAgIHJldHVybiAnZmllbGRfX2lucHV0JztcclxuICAgICAgY2FzZSAnVEVYVEFSRUEnOlxyXG4gICAgICAgIHJldHVybiAnZmllbGRfX3RleHRhcmVhJztcclxuICAgICAgY2FzZSAnUC1EUk9QRE9XTic6XHJcbiAgICAgICAgcmV0dXJuICdmaWVsZF9fZHJvcGRvd24nO1xyXG4gICAgICBjYXNlICdQLUNBTEVOREFSJzpcclxuICAgICAgICByZXR1cm4gJ2ZpZWxkX19jYWxlbmRhcic7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2ZpZWxkX19uby1kZWZpbmVkJztcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgdmVyaWZ5VmFsaWRhdGlvbk1lc3NhZ2UgPSAoKSA9PiB7XHJcbiAgICBsZXQgbWVzc2FnZSA9ICcnO1xyXG4gICAgbGV0IHZhbGlkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRhdG9yWydpc0VtcHR5J10pIHtcclxuICAgICAgbWVzc2FnZSA9IHRoaXMucmVxdWlyZWRNZXNzYWdlIHx8IHRoaXMubWVzc2FnZXMucmVxdWlyZWRNZXNzYWdlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZhbGlkYXRvclsnaXNOb3RFcXVhbCddKSB7XHJcbiAgICAgIG1lc3NhZ2UgPSB0aGlzLmVxdWFsVG9NZXNzYWdlIHx8IHRoaXMubWVzc2FnZXMuZXF1YWxUb01lc3NhZ2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsaWRhdG9yWydtYW51YWxOb3RWYWxpZCddKSB7XHJcbiAgICAgIG1lc3NhZ2UgPSB0aGlzLm1hbnVhbFZhbE1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlcy5tYW51YWxWYWxNZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsaWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgbWVzc2FnZSwgdmFsaWQgfTtcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgZ2V0Q3VzdG9tVmFsaWRhdG9ycyA9IChmb3JtVmFsdWU6IGFueSk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4udGhpcy52YWxpZGF0ZVJlcXVpcmVkKGZvcm1WYWx1ZSksXHJcbiAgICAgIC4uLnRoaXMudmFsaWRhdGVFcXVhbFRvKGZvcm1WYWx1ZSksXHJcbiAgICAgIC4uLnRoaXMudmFsaWRhdGVNYW51YWwoZm9ybVZhbHVlKSxcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRlUmVxdWlyZWQ6IFZhbGlkYXRvckZuID0gKFxyXG4gICAgdmFsdWU6IGFueVxyXG4gICk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgIGxldCB2YWxpZGF0aW9uID0ge307XHJcbiAgICBpZiAoIXRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykpIHtcclxuICAgICAgdmFsaWRhdGlvbiA9IHsgaXNFbXB0eTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRpb247XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRlRXF1YWxUbzogVmFsaWRhdG9yRm4gPSAoXHJcbiAgICB2YWx1ZTogYW55XHJcbiAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgaWYgKCF0aGlzLmVxdWFsVG8pIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB2YWxpZGF0aW9uID0ge307XHJcbiAgICBjb25zdCBpc05vdEVxdWFsID0gdGhpcy5lcXVhbElnbm9yZUNhc2VcclxuICAgICAgPyBgJHt2YWx1ZX1gLnRvTG93ZXJDYXNlKCkgIT09IGAke3RoaXMuZXF1YWxUb31gLnRvTG93ZXJDYXNlKClcclxuICAgICAgOiB2YWx1ZSAhPT0gdGhpcy5lcXVhbFRvO1xyXG4gICAgaWYgKGlzTm90RXF1YWwpIHtcclxuICAgICAgdmFsaWRhdGlvbiA9IHsgaXNOb3RFcXVhbDogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRpb247XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRlTWFudWFsOiBWYWxpZGF0b3JGbiA9IChfOiBhbnkpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XHJcbiAgICBpZiAodGhpcy5tYW51YWxWYWwgPT0gbnVsbCB8fCB0aGlzLm1hbnVhbFZhbCkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgbWFudWFsTm90VmFsaWQ6IHRydWUgfTtcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgZmllbGROb3RWYWxpZCA9ICgpID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudmFsaWRhdG9yWydpc0VtcHR5J10gfHxcclxuICAgICAgdGhpcy52YWxpZGF0b3JbJ2lzTm90RXF1YWwnXSB8fFxyXG4gICAgICB0aGlzLnZhbGlkYXRvclsnbWFudWFsTm90VmFsaWQnXVxyXG4gICAgKTtcclxuICB9O1xyXG59XHJcbiJdfQ==