UNPKG

ng-jalali-date-time

Version:

Jalali date / month / range picker for Angular with Material Design support

140 lines 29.4 kB
import { Component, Output, EventEmitter } from '@angular/core'; import { FormControl } from '@angular/forms'; import { trigger, state, style, transition, animate } from '@angular/animations'; import { JalaliLocale } from '../../shared/jalali.locale'; import { NgJalaliDateTimeService } from '../../ng-jalali-date-time.service'; export class NgJalaliDateTimeComponent { constructor(service) { this.service = service; this.show = false; this.random = Date.now().toString(); this.month = ''; this.today = ''; this.reset = false; this.jalaliLocale = new JalaliLocale(); this.week = this.jalaliLocale.dayNames; this.changed = new EventEmitter(); } ngOnInit() { this.month = this.value.jalali ? this.value.jalali.substr(0, 7) : this.service.jalali.now({ format: 'Y-M' }); this.calendar = this.service.getCalendar(this.month); this.today = this.service.jalali.now({ format: 'Y-M-D' }); const validators = []; if (this.config.required) validators.push(this.validate.bind(this)); this.form.addControl(this.name, new FormControl(this.value)); this.form.addControl(this.name + '-title', new FormControl('', validators)); this.setTitle(); } validate() { return this.value.jalali ? null : { required: true }; } showCalendar(show) { const input = document.querySelector('#input' + this.random); input.blur(); if (this.reset) { this.reset = false; show = false; } this.show = show; if (this.show) { this.form.get(this.name + '-title').markAsUntouched(); if (!this.value.jalali) this.value.time = '00:00:00'; this.month = this.value.jalali ? this.value.jalali.substr(0, 7) : this.service.jalali.now({ format: 'Y-M' }); this.calendar = this.service.getCalendar(this.month); } else this.form.get(this.name + '-title').markAsTouched(); } changeMonth(change) { const [Y, M] = this.month.split('-'); let year = Number(Y); let month = Number(M) + change; while (month > 12) { month -= 12; year++; } while (month < 1) { month += 12; year--; } this.month = year.toString() + '-' + (month < 10 ? '0' : '') + month.toString(); this.calendar = this.service.getCalendar(this.month); } setTitle() { this.form.get(this.name).setValue(this.value); const title = this.service.getDateTimeTitle(this.value, this.config.time); this.form.get(this.name + '-title').setValue(title); } setDate(jalali) { this.value = this.service.getDateTimeValue(jalali, this.value.time); this.setTitle(); this.showCalendar(false); this.changed.emit(this.value.jalali ? this.value : null); this.form.get(this.name + '-title').updateValueAndValidity(); } getTime(type) { if (!this.value.time) return 0; let value = 0; switch (type) { case 'H': value = Number(this.value.time.substr(0, 2)); break; case 'I': value = Number(this.value.time.substr(3, 2)); break; case 'S': value = Number(this.value.time.substr(6, 2)); break; } return isNaN(value) ? 0 : value; } setTime() { const hour = document.querySelector('#hour' + this.random); const minute = document.querySelector('#minute' + this.random); const second = document.querySelector('#second' + this.random); let H = Math.floor(Number(hour.value)); H = isNaN(H) || H < 0 || H > 23 ? 0 : H; hour.value = H.toString(); let I = Math.floor(Number(minute.value)); I = isNaN(I) || I < 0 || I > 59 ? 0 : I; minute.value = I.toString(); let S = Math.floor(Number(second.value)); S = isNaN(S) || S < 0 || S > 59 ? 0 : S; second.value = this.config.second ? S.toString() : '00'; const time = (H < 10 ? '0' : '') + H.toString() + ':' + ((I < 10 ? '0' : '') + I.toString()) + ':' + ((S < 10 ? '0' : '') + S.toString()); this.value = this.service.getDateTimeValue(this.value.jalali, time); this.setTitle(); this.changed.emit(this.value.jalali ? this.value : null); this.form.get(this.name + '-title').updateValueAndValidity(); } } NgJalaliDateTimeComponent.decorators = [ { type: Component, args: [{ template: "<div class=\"ng-jalali-back\" *ngIf=\"show\" (click)=\"showCalendar(false)\"></div>\n\n<div [formGroup]=\"form\" [ngStyle]=\"{ display: 'none' }\">\n <input type=\"text\" [formControlName]=\"name\" />\n</div>\n\n<content class=\"ng-jalali\" dir=\"rtl\">\n <mat-form-field [ngStyle]=\"css.field\" class=\"ng-jalali\" [formGroup]=\"form\" [appearance]=\"appearance\">\n <mat-label [ngStyle]=\"{ fontFamily: css.font }\">{{ label }}</mat-label>\n <input\n matInput\n id=\"input{{ random }}\"\n type=\"text\"\n [formControlName]=\"name + '-title'\"\n (focus)=\"showCalendar(true)\"\n [ngStyle]=\"css.input\"\n class=\"ng-jalali\"\n />\n <span *ngIf=\"config.reset && value.jalali !== ''\" matSuffix (click)=\"setDate(''); reset = true\">\n <button mat-button type=\"button\" [ngStyle]=\"css.reset\" class=\"ng-jalali-reset\">x</button>\n </span>\n <mat-error [ngStyle]=\"{ fontFamily: css.font }\" *ngIf=\"form.get(name + '-title').hasError('required')\">\n {{ config.error }}\n </mat-error>\n </mat-form-field>\n\n <div class=\"ng-jalali-calendar\" [ngStyle]=\"css.box\" [@calendar] *ngIf=\"show\">\n <div class=\"ng-jalali-header\">\n <div>\n <button\n mat-icon-button\n type=\"button\"\n [ngStyle]=\"css.arrow\"\n (click)=\"changeMonth(-12)\"\n [disabled]=\"month.substr(0, 4) === '1000'\"\n >\n &lt;&lt;\n </button>\n </div>\n <div>\n <button\n mat-icon-button\n type=\"button\"\n [ngStyle]=\"css.arrow\"\n (click)=\"changeMonth(-1)\"\n [disabled]=\"month === '1000-01'\"\n >\n &lt;\n </button>\n </div>\n <div class=\"ng-jalali-title\" [ngStyle]=\"css.header\">{{ calendar.title }}</div>\n <div>\n <button mat-icon-button type=\"button\" [ngStyle]=\"css.arrow\" (click)=\"changeMonth(1)\">&gt;</button>\n </div>\n <div>\n <button mat-icon-button type=\"button\" [ngStyle]=\"css.arrow\" (click)=\"changeMonth(12)\">&gt;&gt;</button>\n </div>\n </div>\n <div class=\"ng-jalali-date-time-header\">\n <div [ngStyle]=\"css.date.name\" *ngFor=\"let day of week\">{{ day }}</div>\n </div>\n <div *ngFor=\"let week of calendar.weeks\" class=\"ng-jalali-date-time-week\">\n <div *ngFor=\"let day of week.days\" class=\"ng-jalali-date-time-day\">\n <button\n mat-icon-button\n type=\"button\"\n [disabled]=\"\n day.month !== month ||\n (config.min && day.date < config.min) ||\n (config.max && day.date > config.max)\n \"\n [ngClass]=\"{\n 'ng-jalali-selected': day.date === value.jalali,\n 'ng-jalali-current': day.date === today\n }\"\n [ngStyle]=\"day.date === today ? css.current : day.date === value.jalali ? css.selected : css.item\"\n (click)=\"setDate(day.date)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n <ng-container *ngIf=\"config.time\">\n <mat-divider></mat-divider>\n <div class=\"ng-jalali-date-time-time\">\n <input\n type=\"number\"\n min=\"0\"\n max=\"23\"\n step=\"1\"\n [value]=\"getTime('H')\"\n [ngStyle]=\"css.date.time\"\n id=\"hour{{ random }}\"\n (blur)=\"setTime()\"\n />\n <div>:</div>\n <input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n step=\"1\"\n [value]=\"getTime('I')\"\n [ngStyle]=\"css.date.time\"\n id=\"minute{{ random }}\"\n (blur)=\"setTime()\"\n />\n <div>:</div>\n <input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n step=\"1\"\n [disabled]=\"!config.second\"\n [value]=\"config.second ? getTime('S') : '00'\"\n [ngStyle]=\"css.date.time\"\n id=\"second{{ random }}\"\n (blur)=\"setTime()\"\n /></div\n ></ng-container>\n </div>\n</content>\n", animations: [ trigger('calendar', [ state('init', style({ opacity: 1, transform: 'translateY(0) scaleY(1)' })), transition('void => *', [style({ opacity: 0, transform: 'translateY(-45%) scaleY(0)' }), animate(100)]), transition('* => void', animate(100, style({ opacity: 0, transform: 'translateY(-45%) scaleY(0)' }))) ]) ], styles: ["div.ng-jalali-date-time-header{display:flex}div.ng-jalali-date-time-header div{background-color:#ddd;flex:1;padding:1rem .2rem;text-align:center}div.ng-jalali-date-time-week{display:flex}div.ng-jalali-date-time-day{flex:1;padding:.2rem;text-align:center}div.ng-jalali-date-time-time{align-items:center;direction:ltr;display:flex;margin:.5rem}div.ng-jalali-date-time-time div{text-align:center;width:2rem}div.ng-jalali-date-time-time input{background-color:#eee;border:0;direction:rtl;flex:1;outline:none;padding:.5rem;text-align:center}", "div.ng-jalali-back{background-color:transparent;bottom:0;left:0;position:fixed;right:0;top:0;z-index:999}content.ng-jalali{display:block;position:relative}mat-form-field.ng-jalali{direction:rtl;margin:0;text-align:right;width:100%}input.ng-jalali{cursor:default;text-align:right}button.ng-jalali-reset{color:#555;line-height:30px;min-width:auto;padding:0 .5rem}div.ng-jalali-calendar{background-color:#fff;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);direction:rtl;position:absolute;right:0;top:45px;z-index:1000}div.ng-jalali-header{align-items:center;display:flex}div.ng-jalali-header div{flex:1;padding:.5rem .2rem;text-align:center}div.ng-jalali-header div.ng-jalali-title{flex:3}button.ng-jalali-selected{background-color:#eee;border:1px solid #999}button.ng-jalali-current{color:#009}"] },] } ]; NgJalaliDateTimeComponent.ctorParameters = () => [ { type: NgJalaliDateTimeService } ]; NgJalaliDateTimeComponent.propDecorators = { changed: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctamFsYWxpLWRhdGUtdGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1qYWxhbGktZGF0ZS10aW1lL3NyYy9saWIvY29tcG9uZW50L25nLWphbGFsaS1kYXRlLXRpbWUvbmctamFsYWxpLWRhdGUtdGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBYSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQWM1RSxNQUFNLE9BQU8seUJBQXlCO0lBc0JsQyxZQUE2QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQVp0RCxTQUFJLEdBQVksS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUVuQixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFdkIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLFNBQUksR0FBYSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUV6QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7SUFFUCxDQUFDO0lBRWpFLFFBQVE7UUFDSixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVELFlBQVksQ0FBQyxJ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QUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDakUsQ0FBQzs7O1lBekpKLFNBQVMsU0FBQztnQkFDUCx1N0pBQW1EO2dCQUVuRCxVQUFVLEVBQUU7b0JBQ1IsT0FBTyxDQUFDLFVBQVUsRUFBRTt3QkFDaEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7d0JBQzFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSw0QkFBNEIsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSw0QkFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDeEcsQ0FBQztpQkFDTDs7YUFDSjs7O1lBYlEsdUJBQXVCOzs7c0JBa0MzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmltcG9ydCB7IEphbGFsaUxvY2FsZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9qYWxhbGkubG9jYWxlJztcbmltcG9ydCB7IE5nSmFsYWxpRGF0ZVRpbWVWYWx1ZUludGVyZmFjZSB9IGZyb20gJy4vbmctamFsYWxpLWRhdGUtdGltZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSmFsYWxpQ2FsZW5kYXJJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvamFsYWxpLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOZ0phbGFsaURhdGVUaW1lU2VydmljZSB9IGZyb20gJy4uLy4uL25nLWphbGFsaS1kYXRlLXRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBOZ0phbGFsaURhdGVUaW1lQ29uZmlnSW50ZXJmYWNlLCBOZ0phbGFsaURhdGVUaW1lQ3NzSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vbmctamFsYWxpLWRhdGUtdGltZS5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmctamFsYWxpLWRhdGUtdGltZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmctamFsYWxpLWRhdGUtdGltZS5jb21wb25lbnQuY3NzJywgJy4uLy4uL3NoYXJlZC9uZy1qYWxhbGkuc3R5bGUuY3NzJ10sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdjYWxlbmRhcicsIFtcbiAgICAgICAgICAgIHN0YXRlKCdpbml0Jywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApIHNjYWxlWSgxKScgfSkpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNDUlKSBzY2FsZVkoMCknIH0pLCBhbmltYXRlKDEwMCldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIGFuaW1hdGUoMTAwLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTQ1JSkgc2NhbGVZKDApJyB9KSkpXG4gICAgICAgIF0pXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0phbGFsaURhdGVUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGFwcGVhcmFuY2U6IHN0cmluZztcbiAgICBwdWJsaWMgY29uZmlnOiBOZ0phbGFsaURhdGVUaW1lQ29uZmlnSW50ZXJmYWNlO1xuICAgIHB1YmxpYyBjc3M6IE5nSmFsYWxpRGF0ZVRpbWVDc3NJbnRlcmZhY2U7XG5cbiAgICBwdWJsaWMgdmFsdWU6IE5nSmFsYWxpRGF0ZVRpbWVWYWx1ZUludGVyZmFjZTtcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZztcblxuICAgIHB1YmxpYyBzaG93OiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHJhbmRvbTogc3RyaW5nID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyBtb250aDogc3RyaW5nID0gJyc7XG4gICAgcHVibGljIGNhbGVuZGFyOiBKYWxhbGlDYWxlbmRhckludGVyZmFjZTtcbiAgICBwdWJsaWMgdG9kYXk6IHN0cmluZyA9ICcnO1xuICAgIHB1YmxpYyByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGphbGFsaUxvY2FsZSA9IG5ldyBKYWxhbGlMb2NhbGUoKTtcbiAgICBwdWJsaWMgd2Vlazogc3RyaW5nW10gPSB0aGlzLmphbGFsaUxvY2FsZS5kYXlOYW1lcztcblxuICAgIEBPdXRwdXQoKSBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxOZ0phbGFsaURhdGVUaW1lVmFsdWVJbnRlcmZhY2U+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2U6IE5nSmFsYWxpRGF0ZVRpbWVTZXJ2aWNlKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubW9udGggPSB0aGlzLnZhbHVlLmphbGFsaSA/IHRoaXMudmFsdWUuamFsYWxpLnN1YnN0cigwLCA3KSA6IHRoaXMuc2VydmljZS5qYWxhbGkubm93KHsgZm9ybWF0OiAnWS1NJyB9KTtcbiAgICAgICAgdGhpcy5jYWxlbmRhciA9IHRoaXMuc2VydmljZS5nZXRDYWxlbmRhcih0aGlzLm1vbnRoKTtcbiAgICAgICAgdGhpcy50b2RheSA9IHRoaXMuc2VydmljZS5qYWxhbGkubm93KHsgZm9ybWF0OiAnWS1NLUQnIH0pO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IGFueVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wodGhpcy5uYW1lLCBuZXcgRm9ybUNvbnRyb2wodGhpcy52YWx1ZSkpO1xuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCh0aGlzLm5hbWUgKyAnLXRpdGxlJywgbmV3IEZvcm1Db250cm9sKCcnLCB2YWxpZGF0b3JzKSk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUoKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuamFsYWxpID8gbnVsbCA6IHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBzaG93Q2FsZW5kYXIoc2hvdzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBpbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dCcgKyB0aGlzLnJhbmRvbSk7XG4gICAgICAgIGlucHV0LmJsdXIoKTtcblxuICAgICAgICBpZiAodGhpcy5yZXNldCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgc2hvdyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93ID0gc2hvdztcbiAgICAgICAgaWYgKHRoaXMuc2hvdykge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLm5hbWUgKyAnLXRpdGxlJykubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmFsdWUuamFsYWxpKSB0aGlzLnZhbHVlLnRpbWUgPSAnMDA6MDA6MDAnO1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRoaXMudmFsdWUuamFsYWxpXG4gICAgICAgICAgICAgICAgPyB0aGlzLnZhbHVlLmphbGFsaS5zdWJzdHIoMCwgNylcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VydmljZS5qYWxhbGkubm93KHsgZm9ybWF0OiAnWS1NJyB9KTtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIgPSB0aGlzLnNlcnZpY2UuZ2V0Q2FsZW5kYXIodGhpcy5tb250aCk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZvcm0uZ2V0KHRoaXMubmFtZSArICctdGl0bGUnKS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgY2hhbmdlTW9udGgoY2hhbmdlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgW1ksIE1dID0gdGhpcy5tb250aC5zcGxpdCgnLScpO1xuICAgICAgICBsZXQgeWVhciA9IE51bWJlcihZKTtcbiAgICAgICAgbGV0IG1vbnRoID0gTnVtYmVyKE0pICsgY2hhbmdlO1xuXG4gICAgICAgIHdoaWxlIChtb250aCA+IDEyKSB7XG4gICAgICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgICAgICAgIHllYXIrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChtb250aCA8IDEpIHtcbiAgICAgICAgICAgIG1vbnRoICs9IDEyO1xuICAgICAgICAgICAgeWVhci0tO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb250aCA9IHllYXIudG9TdHJpbmcoKSArICctJyArIChtb250aCA8IDEwID8gJzAnIDogJycpICsgbW9udGgudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhciA9IHRoaXMuc2VydmljZS5nZXRDYWxlbmRhcih0aGlzLm1vbnRoKTtcbiAgICB9XG5cbiAgICBzZXRUaXRsZSgpIHtcbiAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLm5hbWUpLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlOiBzdHJpbmcgPSB0aGlzLnNlcnZpY2UuZ2V0RGF0ZVRpbWVUaXRsZSh0aGlzLnZhbHVlLCB0aGlzLmNvbmZpZy50aW1lKTtcbiAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLm5hbWUgKyAnLXRpdGxlJykuc2V0VmFsdWUodGl0bGUpO1xuICAgIH1cblxuICAgIHNldERhdGUoamFsYWxpOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc2VydmljZS5nZXREYXRlVGltZVZhbHVlKGphbGFsaSwgdGhpcy52YWx1ZS50aW1lKTtcbiAgICAgICAgdGhpcy5zZXRUaXRsZSgpO1xuICAgICAgICB0aGlzLnNob3dDYWxlbmRhcihmYWxzZSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMudmFsdWUuamFsYWxpID8gdGhpcy52YWx1ZSA6IG51bGwpO1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMubmFtZSArICctdGl0bGUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgZ2V0VGltZSh0eXBlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUudGltZSkgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IHZhbHVlOiBudW1iZXIgPSAwO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHRoaXMudmFsdWUudGltZS5zdWJzdHIoMCwgMikpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnSSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodGhpcy52YWx1ZS50aW1lLnN1YnN0cigzLCAyKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih0aGlzLnZhbHVlLnRpbWUuc3Vic3RyKDYsIDIpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xuICAgIH1cblxuICAgIHNldFRpbWUoKSB7XG4gICAgICAgIGNvbnN0IGhvdXI6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaG91cicgKyB0aGlzLnJhbmRvbSk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZTogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtaW51dGUnICsgdGhpcy5yYW5kb20pO1xuICAgICAgICBjb25zdCBzZWNvbmQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vjb25kJyArIHRoaXMucmFuZG9tKTtcblxuICAgICAgICBsZXQgSDogbnVtYmVyID0gTWF0aC5mbG9vcihOdW1iZXIoaG91ci52YWx1ZSkpO1xuICAgICAgICBIID0gaXNOYU4oSCkgfHwgSCA8IDAgfHwgSCA+IDIzID8gMCA6IEg7XG4gICAgICAgIGhvdXIudmFsdWUgPSBILnRvU3RyaW5nKCk7XG5cbiAgICAgICAgbGV0IEk6IG51bWJlciA9IE1hdGguZmxvb3IoTnVtYmVyKG1pbnV0ZS52YWx1ZSkpO1xuICAgICAgICBJID0gaXNOYU4oSSkgfHwgSSA8IDAgfHwgSSA+IDU5ID8gMCA6IEk7XG4gICAgICAgIG1pbnV0ZS52YWx1ZSA9IEkudG9TdHJpbmcoKTtcblxuICAgICAgICBsZXQgUzogbnVtYmVyID0gTWF0aC5mbG9vcihOdW1iZXIoc2Vjb25kLnZhbHVlKSk7XG4gICAgICAgIFMgPSBpc05hTihTKSB8fCBTIDwgMCB8fCBTID4gNTkgPyAwIDogUztcbiAgICAgICAgc2Vjb25kLnZhbHVlID0gdGhpcy5jb25maWcuc2Vjb25kID8gUy50b1N0cmluZygpIDogJzAwJztcblxuICAgICAgICBjb25zdCB0aW1lOiBzdHJpbmcgPVxuICAgICAgICAgICAgKEggPCAxMCA/ICcwJyA6ICcnKSArXG4gICAgICAgICAgICBILnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgJzonICtcbiAgICAgICAgICAgICgoSSA8IDEwID8gJzAnIDogJycpICsgSS50b1N0cmluZygpKSArXG4gICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgKChTIDwgMTAgPyAnMCcgOiAnJykgKyBTLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlcnZpY2UuZ2V0RGF0ZVRpbWVWYWx1ZSh0aGlzLnZhbHVlLmphbGFsaSwgdGltZSk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy52YWx1ZS5qYWxhbGkgPyB0aGlzLnZhbHVlIDogbnVsbCk7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5uYW1lICsgJy10aXRsZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG59XG4iXX0=