UNPKG

@rishovt/angular-nepali-datepicker

Version:

A lightweight Angular wrapper and fully customizable, non-typeable Nepali datepicker component for Angular with support for Unicode-rendered Nepali dates, BS↔AD conversion, and flexible date formats. Ideal for forms requiring calendar-based input with nat

161 lines 21.5 kB
import { Component, Input, Output, EventEmitter, forwardRef, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { RtcNepaliDatepickerService } from './angular-nepali-datepicker.service'; export class RtcNepaliDatepickerComponent { constructor(service) { this.service = service; this.options = {}; this.dateChange = new EventEmitter(); this.pickerId = 'angular-nepali-datepicker-default'; this.disabled = false; this.onChange = () => { }; this.onTouched = () => { }; this.todayDate = { year: 0, month: 0, day: 0, value: '' }; } ngOnInit() { this.service.BSGetCurrentDate().then(currentDate => { this.todayDate = currentDate; this.defaultOptions = { classes: 'form-control', placeholder: 'Select Nepali Date', dateFormat: 'YYYY-MM-DD', closeOnDateSelect: true, minDate: { year: 1800, month: 1, day: 1 }, maxDate: currentDate, disabled: false, unicodeDate: true, language: 'nepali', }; }); } onKeyDown(event) { event.preventDefault(); return false; } ngAfterViewInit() { this.service.loadLibrary().then(() => { this.service.BSGetCurrentDate().then(currentDate => { this.todayDate = Object.assign(Object.assign({}, currentDate), { value: this.service.formatDate(currentDate, this.options.dateFormat || 'YYYY-MM-DD') }); this.defaultOptions = { classes: 'form-control', placeholder: 'Select Nepali Date', dateFormat: 'YYYY-MM-DD', closeOnDateSelect: true, minDate: { year: 1800, month: 1, day: 1 }, maxDate: currentDate, disabled: false, unicodeDate: true, language: 'nepali', tooltip: 'Select Date' }; this.initializeDatePicker(); this.service.registerComponent(this.pickerId, this); }); }).catch((error) => { console.error('Failed to load Nepali Date Picker library:', error); }); } initializeDatePicker() { const input = this.inputElementRef.nativeElement; if (!input || typeof input.NepaliDatePicker !== 'function') { console.error('Nepali Date Picker is not loaded. Make sure the assets is included in consumer angular.json.'); return; } const config = Object.assign(Object.assign(Object.assign({}, this.defaultOptions), this.options), { onSelect: (bsDate) => { this.dateChange.emit(bsDate); input.dispatchEvent(new Event('change')); } }); input.NepaliDatePicker(config); } setDate(bsDate) { const input = this.inputElementRef.nativeElement; if (!input || typeof input.NepaliDatePicker !== 'function') return; try { input.NepaliDatePicker('destroy'); const updatedOptions = Object.assign(Object.assign(Object.assign({}, this.defaultOptions), this.options), { value: bsDate, onSelect: (selectedDate) => { this.dateChange.emit(selectedDate); input.dispatchEvent(new Event('change')); } }); const setValueAndInit = (displayValue) => { input.NepaliDatePicker(updatedOptions); input.value = displayValue; }; if (updatedOptions.unicodeDate) { const convertFullString = (str) => { return Promise.all(str.split('').map(d => this.service.ConvertToUnicode(+d))) .then(digits => digits.join('')); }; const [year, month, day] = bsDate.split('-'); Promise.all([ convertFullString(year), convertFullString(month), convertFullString(day) ]).then(([unicodeYear, unicodeMonth, unicodeDay]) => { setValueAndInit(`${unicodeYear}-${unicodeMonth}-${unicodeDay}`); }); } else { setValueAndInit(bsDate); } } catch (err) { console.warn('Failed to set date via NepaliDatePicker:', err); } } writeValue(value) { this.value = value; if (value) this.service.setDate(this.pickerId, value); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } ngOnDestroy() { this.service.unregisterComponent(this.pickerId); const input = this.inputElementRef.nativeElement; if (input && typeof input.NepaliDatePicker === 'function') { input.NepaliDatePicker('destroy'); } } } RtcNepaliDatepickerComponent.decorators = [ { type: Component, args: [{ selector: 'rtc-nepali-datepicker', template: ` <input #nepaliInput type="text" [id]="pickerId" [class]="options.classes || 'form-control'" [placeholder]="options.placeholder || 'Select Nepali Date'" [disabled]="options.disabled || false" (keydown)="onKeyDown($event)" /> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RtcNepaliDatepickerComponent), multi: true } ] },] } ]; RtcNepaliDatepickerComponent.ctorParameters = () => [ { type: RtcNepaliDatepickerService } ]; RtcNepaliDatepickerComponent.propDecorators = { options: [{ type: Input }], dateChange: [{ type: Output }], value: [{ type: Input }], pickerId: [{ type: Input }], inputElementRef: [{ type: ViewChild, args: ['nepaliInput', { static: true },] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1uZXBhbGktZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW5lcGFsaS1kYXRlcGlja2VyLXZlL3NyYy9saWIvYW5ndWxhci1uZXBhbGktZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUIsVUFBVSxFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQXdCakYsTUFBTSxPQUFPLDRCQUE0QjtJQXdCdkMsWUFBb0IsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUF2QjlDLFlBQU8sR0FXWixFQUFFLENBQUM7UUFFRyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0QyxhQUFRLEdBQVcsbUNBQW1DLENBQUM7UUFDekQsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUN6QixhQUFRLEdBQXlCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBSTFDLGNBQVMsR0FBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFFNUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7WUFDN0Is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QWUsQ0FBQyxhQUFhLENBQUM7UUFDakQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO1lBQ3pELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7OztZQS9LRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7Z0JBQ0QsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQTRCLENBQUM7d0JBQzNELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7OztZQXZCUSwwQkFBMEI7OztzQkF5QmhDLEtBQUs7eUJBYUwsTUFBTTtvQkFDTixLQUFLO3VCQUNMLEtBQUs7OEJBS0wsU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFJ0Y05lcGFsaURhdGVwaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLW5lcGFsaS1kYXRlcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3J0Yy1uZXBhbGktZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxpbnB1dFxyXG4gICAgICAjbmVwYWxpSW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBbaWRdPVwicGlja2VySWRcIlxyXG4gICAgICBbY2xhc3NdPVwib3B0aW9ucy5jbGFzc2VzIHx8ICdmb3JtLWNvbnRyb2wnXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cIm9wdGlvbnMucGxhY2Vob2xkZXIgfHwgJ1NlbGVjdCBOZXBhbGkgRGF0ZSdcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJ0Y05lcGFsaURhdGVwaWNrZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJ0Y05lcGFsaURhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IHtcclxuICAgIGNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICAgIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XHJcbiAgICBjbG9zZU9uRGF0ZVNlbGVjdD86IGJvb2xlYW47XHJcbiAgICBtaW5EYXRlPzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IGRheTogbnVtYmVyIH07XHJcbiAgICBtYXhEYXRlPzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IGRheTogbnVtYmVyIH07XHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgICB1bmljb2RlRGF0ZT86IGJvb2xlYW47XHJcbiAgICBsYW5ndWFnZT86IHN0cmluZztcclxuICAgIG9uU2VsZWN0PzogKGRhdGU6IGFueSkgPT4gdm9pZDtcclxuICB9ID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKSBwaWNrZXJJZDogc3RyaW5nID0gJ2FuZ3VsYXItbmVwYWxpLWRhdGVwaWNrZXItZGVmYXVsdCc7XHJcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ25lcGFsaUlucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXRFbGVtZW50UmVmITogRWxlbWVudFJlZjtcclxuICBkZWZhdWx0T3B0aW9uczogYW55O1xyXG4gIHRvZGF5RGF0ZTogRGF0ZU9iamVjdCA9IHsgeWVhcjogMCwgbW9udGg6IDAsIGRheTogMCwgdmFsdWU6ICcnIH07XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBSdGNOZXBhbGlEYXRlcGlja2VyU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXJ2aWNlLkJTR2V0Q3VycmVudERhdGUoKS50aGVuKGN1cnJlbnREYXRlID0+IHtcclxuICAgICAgdGhpcy50b2RheURhdGUgPSBjdXJyZW50RGF0ZTtcclxuICAgICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgICAgICBjbGFzc2VzOiAnZm9ybS1jb250cm9sJyxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBOZXBhbGkgRGF0ZScsXHJcbiAgICAgICAgZGF0ZUZvcm1hdDogJ1lZWVktTU0tREQnLFxyXG4gICAgICAgIGNsb3NlT25EYXRlU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIG1pbkRhdGU6IHsgeWVhcjogMTgwMCwgbW9udGg6IDEsIGRheTogMSB9LFxyXG4gICAgICAgIG1heERhdGU6IGN1cnJlbnREYXRlLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICB1bmljb2RlRGF0ZTogdHJ1ZSxcclxuICAgICAgICBsYW5ndWFnZTogJ25lcGFsaScsXHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UubG9hZExpYnJhcnkoKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLkJTR2V0Q3VycmVudERhdGUoKS50aGVuKGN1cnJlbnREYXRlID0+IHtcclxuICAgICAgICB0aGlzLnRvZGF5RGF0ZSA9IHtcclxuICAgICAgICAgIC4uLmN1cnJlbnREYXRlLFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuc2VydmljZS5mb3JtYXREYXRlKGN1cnJlbnREYXRlLCB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdCB8fCAnWVlZWS1NTS1ERCcpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xyXG4gICAgICAgICAgY2xhc3NlczogJ2Zvcm0tY29udHJvbCcsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBOZXBhbGkgRGF0ZScsXHJcbiAgICAgICAgICBkYXRlRm9ybWF0OiAnWVlZWS1NTS1ERCcsXHJcbiAgICAgICAgICBjbG9zZU9uRGF0ZVNlbGVjdDogdHJ1ZSxcclxuICAgICAgICAgIG1pbkRhdGU6IHsgeWVhcjogMTgwMCwgbW9udGg6IDEsIGRheTogMSB9LFxyXG4gICAgICAgICAgbWF4RGF0ZTogY3VycmVudERhdGUsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICB1bmljb2RlRGF0ZTogdHJ1ZSxcclxuICAgICAgICAgIGxhbmd1YWdlOiAnbmVwYWxpJyxcclxuICAgICAgICAgIHRvb2x0aXA6ICdTZWxlY3QgRGF0ZSdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGVQaWNrZXIoKTtcclxuICAgICAgICB0aGlzLnNlcnZpY2UucmVnaXN0ZXJDb21wb25lbnQodGhpcy5waWNrZXJJZCwgdGhpcyk7XHJcbiAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgTmVwYWxpIERhdGUgUGlja2VyIGxpYnJhcnk6JywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEYXRlUGlja2VyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQuTmVwYWxpRGF0ZVBpY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdOZXBhbGkgRGF0ZSBQaWNrZXIgaXMgbm90IGxvYWRlZC4gTWFrZSBzdXJlIHRoZSBhc3NldHMgaXMgaW5jbHVkZWQgaW4gY29uc3VtZXIgYW5ndWxhci5qc29uLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcclxuICAgICAgb25TZWxlY3Q6IChic0RhdGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGJzRGF0ZSk7XHJcbiAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScpKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGlucHV0Lk5lcGFsaURhdGVQaWNrZXIoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRlKGJzRGF0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dC5OZXBhbGlEYXRlUGlja2VyICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBpbnB1dC5OZXBhbGlEYXRlUGlja2VyKCdkZXN0cm95Jyk7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxyXG4gICAgICAgIHZhbHVlOiBic0RhdGUsXHJcbiAgICAgICAgb25TZWxlY3Q6IChzZWxlY3RlZERhdGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoc2VsZWN0ZWREYXRlKTtcclxuICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNldFZhbHVlQW5kSW5pdCA9IChkaXNwbGF5VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlucHV0Lk5lcGFsaURhdGVQaWNrZXIodXBkYXRlZE9wdGlvbnMpO1xyXG4gICAgICAgIGlucHV0LnZhbHVlID0gZGlzcGxheVZhbHVlO1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAodXBkYXRlZE9wdGlvbnMudW5pY29kZURhdGUpIHtcclxuICAgICAgICBjb25zdCBjb252ZXJ0RnVsbFN0cmluZyA9IChzdHI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3RyLnNwbGl0KCcnKS5tYXAoZCA9PiB0aGlzLnNlcnZpY2UuQ29udmVydFRvVW5pY29kZSgrZCkpKVxyXG4gICAgICAgICAgICAudGhlbihkaWdpdHMgPT4gZGlnaXRzLmpvaW4oJycpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGJzRGF0ZS5zcGxpdCgnLScpO1xyXG4gICAgICAgIFByb21pc2UuYWxsKFtcclxuICAgICAgICAgIGNvbnZlcnRGdWxsU3RyaW5nKHllYXIpLFxyXG4gICAgICAgICAgY29udmVydEZ1bGxTdHJpbmcobW9udGgpLFxyXG4gICAgICAgICAgY29udmVydEZ1bGxTdHJpbmcoZGF5KVxyXG4gICAgICAgIF0pLnRoZW4oKFt1bmljb2RlWWVhciwgdW5pY29kZU1vbnRoLCB1bmljb2RlRGF5XSkgPT4ge1xyXG4gICAgICAgICAgc2V0VmFsdWVBbmRJbml0KGAke3VuaWNvZGVZZWFyfS0ke3VuaWNvZGVNb250aH0tJHt1bmljb2RlRGF5fWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFZhbHVlQW5kSW5pdChic0RhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2V0IGRhdGUgdmlhIE5lcGFsaURhdGVQaWNrZXI6JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB0aGlzLnNlcnZpY2Uuc2V0RGF0ZSh0aGlzLnBpY2tlcklkLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UudW5yZWdpc3RlckNvbXBvbmVudCh0aGlzLnBpY2tlcklkKTtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQuTmVwYWxpRGF0ZVBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBpbnB1dC5OZXBhbGlEYXRlUGlja2VyKCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSJdfQ==