ng-devui
Version:
DevUI components based on Angular
257 lines • 36.3 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Inject, Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class DatepickerProService {
set minDate(value) {
this._minDate = new Date(value) || new Date(this.calendarRange[0], 0, 1);
this.detectedChanges.next();
}
get minDate() {
return this._minDate;
}
set maxDate(value) {
this._maxDate = new Date(value) || new Date(this.calendarRange[1], 11, 31, 23, 59, 59);
this.detectedChanges.next();
}
get maxDate() {
return this._maxDate;
}
get closeAfterSelected() {
return !this.isRange && !this.showTime;
}
get curHour() {
if (this.isRange) {
return (this.currentActiveInput === 'start' ? this.curRangeDate[0]?.getHours() : this.curRangeDate[1]?.getHours()) || 0;
}
else {
return this.curDate?.getHours() || 0;
}
}
get curMin() {
if (this.isRange) {
return (this.currentActiveInput === 'start' ? this.curRangeDate[0]?.getMinutes() : this.curRangeDate[1]?.getMinutes()) || 0;
}
else {
return this.curDate?.getMinutes() || 0;
}
}
get curSec() {
if (this.isRange) {
return (this.currentActiveInput === 'start' ? this.curRangeDate[0]?.getSeconds() : this.curRangeDate[1]?.getSeconds()) || 0;
}
else {
return this.curDate?.getSeconds() || 0;
}
}
constructor(doc) {
this.doc = doc;
this.curRangeDate = [];
this.calendarRange = [1970, 2099];
this.currentActiveInput = 'start';
this._minDate = new Date(this.calendarRange[0], 0, 1);
this._maxDate = new Date(this.calendarRange[1], 11, 31, 23, 59, 59);
this.toggleEvent = new Subject();
this.closeDropdownEvent = new Subject();
this.activeInputChange = new Subject();
this.selectedDateChange = new Subject();
this.updateDateValue = new Subject();
this.selectedTimeChange = new Subject();
this.updateTimeChange = new Subject();
this.detectedChanges = new Subject();
this.document = this.doc;
}
dateInRange(date) {
if (!date) {
return true;
}
return (date.getTime() > this.minDate.getTime() && date.getTime() < this.maxDate.getTime()) ||
date.toDateString() === this.minDate.toDateString() || date.toDateString() === this.maxDate.toDateString();
}
resetMin() {
this.minDate = new Date(this.calendarRange[0], 0, 1);
}
resetMax() {
this.maxDate = new Date(this.calendarRange[1], 11, 31);
}
// 对范围模式下一些非法的选择进行修正
fixRangeDate() {
const start = this.curRangeDate[0]?.getTime();
const end = this.curRangeDate[1]?.getTime();
if (start && end && end < start) {
if (this.currentActiveInput === 'start') {
this.curRangeDate[1] = null;
}
else if (this.currentActiveInput === 'end') {
this.curRangeDate[0] = null;
}
}
}
// 判断日期是否为起始日期
isStartDate(date) {
if (!this.isRange) {
return false;
}
if (this.currentActiveInput === 'start') {
return date.toDateString() === this.curHoverDate?.toDateString() || date.toDateString() === this.curRangeDate[0]?.toDateString();
}
return date.toDateString() === this.curRangeDate[0]?.toDateString();
}
// 判断日期是否为结束日期
isEndDate(date) {
if (!this.isRange) {
return false;
}
if (this.currentActiveInput === 'end') {
return date.toDateString() === this.curHoverDate?.toDateString() || date.toDateString() === this.curRangeDate[1]?.toDateString();
}
return date.toDateString() === this.curRangeDate[1]?.toDateString();
}
// 判断日期是否在hover范围或者选中的范围内
isDateInRange(date) {
const dateTime = date.getTime();
const dateStr = date.toDateString();
if (this.isRange) {
if (this.currentActiveInput === 'start') {
return (this.curHoverDate || this.curRangeDate[0])?.getTime() < dateTime &&
(this.curHoverDate || this.curRangeDate[0])?.toDateString() !== dateStr &&
this.curRangeDate[1]?.getTime() > dateTime &&
this.curRangeDate[1]?.toDateString() !== dateStr;
}
else {
return this.curRangeDate[0]?.getTime() < dateTime &&
this.curRangeDate[0]?.toDateString() !== dateStr &&
(this.curHoverDate || this.curRangeDate[1])?.getTime() > dateTime &&
(this.curHoverDate || this.curRangeDate[1]).toDateString() !== dateStr;
}
}
else {
return false;
}
}
// 判断日期是否在已选中的范围内,与hover做区分
isDateInSelectRange(date) {
if (!this.isRange) {
return false;
}
if (!this.curRangeDate[0] || !this.curRangeDate[1]) {
return false;
}
return this.curRangeDate[0].getTime() < date.getTime() && this.curRangeDate[1].getTime() > date.getTime() &&
this.curRangeDate[1].toDateString() !== date.toDateString() && this.curRangeDate[0].toDateString() !== date.toDateString();
}
isDateActive(date) {
const dateStr = date.toDateString();
if (this.isRange) {
return dateStr === this.curRangeDate[0]?.toDateString() || dateStr === this.curRangeDate[1]?.toDateString();
}
else {
return dateStr === this.curDate?.toDateString();
}
}
isMonthActive(yearIndex, monthIndex) {
if (this.isRange) {
return (yearIndex === this.curRangeDate[0]?.getFullYear() && monthIndex === this.curRangeDate[0]?.getMonth()) ||
(yearIndex === this.curRangeDate[1]?.getFullYear() && monthIndex === this.curRangeDate[1]?.getMonth());
}
else {
return yearIndex === this.curDate?.getFullYear() && monthIndex === this.curDate?.getMonth();
}
}
isYearActive(yearIndex) {
if (this.isRange) {
return yearIndex === this.curRangeDate[0]?.getFullYear() || yearIndex === this.curRangeDate[1]?.getFullYear();
}
else {
return yearIndex === this.curDate?.getFullYear();
}
}
// 是否为范围选中日期中对应的input激活项
isActiveInputTypeDate(date) {
if (!this.isRange) {
return false;
}
if (this.currentActiveInput === 'start') {
return date.toDateString() === this.curRangeDate[0]?.toDateString();
}
else {
return date.toDateString() === this.curRangeDate[1]?.toDateString();
}
}
// 是否为选中日期且在废弃范围逻辑内
isDateAbandon(date) {
if (!this.isRange || (!this.curRangeDate[0] || !this.curRangeDate[1])) {
return false;
}
if (!this.isDateActive(date)) {
return false;
}
if (this.currentActiveInput === 'start') {
return this.curHoverDate?.getTime() > date.getTime();
}
else {
return this.curHoverDate?.getTime() < date.getTime();
}
}
isInSuggestList(date) {
if (!this.markedRangeDateList) {
return false;
}
for (let index = 0; index < this.markedRangeDateList.length; index++) {
const range = this.markedRangeDateList[index];
if (range[0]?.getTime() < date.getTime() && range[1]?.getTime() > date.getTime()) {
return true;
}
if (range[0]?.toDateString() === date.toDateString() || range[1]?.toDateString() === date.toDateString()) {
return true;
}
}
return false;
}
isMarkedDate(date) {
for (let index = 0; index < this.markedDateList?.length; index++) {
if (this.markedDateList[index]?.toDateString() === date.toDateString()) {
return true;
}
}
return false;
}
mearsureStrWidth(str) {
const mearsureDom = this.document.createElement('span');
mearsureDom.innerText = str;
mearsureDom.style.visibility = 'hidden';
this.document.body.appendChild(mearsureDom);
const domWidth = mearsureDom.offsetWidth;
this.document.body.removeChild(mearsureDom);
return domWidth;
}
ngOnDestroy() {
this.toggleEvent.complete();
this.selectedDateChange.complete();
this.closeDropdownEvent.complete();
this.updateDateValue.complete();
this.updateTimeChange.complete();
this.selectedTimeChange.complete();
this.activeInputChange.complete();
this.detectedChanges.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }] });
export class DatepickerProCommonDataService {
constructor() {
this.calendarDataCache = {};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProCommonDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProCommonDataService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerProCommonDataService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1wcm8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL2RhdGVwaWNrZXItcHJvL2RhdGVwaWNrZXItcHJvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcvQixNQUFNLE9BQU8sb0JBQW9CO0lBYS9CLElBQUksT0FBTyxDQUFDLEtBQVc7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQVc7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUgsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUgsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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bSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlclByb1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjdXJEYXRlOiBEYXRlO1xuICBjdXJSYW5nZURhdGU6IERhdGVbXSA9IFtdO1xuICBjdXJIb3ZlckRhdGU6IERhdGU7XG4gIHN0YXJ0SW5kZXhPZldlZWs6IG51bWJlcjtcbiAgaXNSYW5nZTogYm9vbGVhbjtcbiAgbWFya2VkUmFuZ2VEYXRlTGlzdDogRGF0ZVtdW107XG4gIG1hcmtEYXRlSW5mb1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBtYXJrZWREYXRlTGlzdDogRGF0ZVtdO1xuICBzaG93VGltZTogYm9vbGVhbjtcbiAgY2FsZW5kYXJSYW5nZSA9IFsxOTcwLCAyMDk5XTtcbiAgY3VycmVudEFjdGl2ZUlucHV0OiAnc3RhcnQnIHwgJ2VuZCcgPSAnc3RhcnQnO1xuICBfbWluRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJSYW5nZVswXSwgMCwgMSk7XG4gIHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgdGhpcy5fbWluRGF0ZSA9IG5ldyBEYXRlKHZhbHVlKSB8fCBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyUmFuZ2VbMF0sIDAsIDEpO1xuICAgIHRoaXMuZGV0ZWN0ZWRDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBnZXQgbWluRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgfVxuICBfbWF4RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJSYW5nZVsxXSwgMTEsIDMxLCAyMywgNTksIDU5KTtcbiAgc2V0IG1heERhdGUodmFsdWU6IERhdGUpIHtcbiAgICB0aGlzLl9tYXhEYXRlID0gbmV3IERhdGUodmFsdWUpIHx8IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJSYW5nZVsxXSwgMTEsIDMxLCAyMywgNTksIDU5KTtcbiAgICB0aGlzLmRldGVjdGVkQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XG4gIH1cbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBnZXQgY2xvc2VBZnRlclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc1JhbmdlICYmICF0aGlzLnNob3dUaW1lO1xuICB9XG5cbiAgZ2V0IGN1ckhvdXIoKSB7XG4gICAgaWYgKHRoaXMuaXNSYW5nZSkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ3N0YXJ0JyA/IHRoaXMuY3VyUmFuZ2VEYXRlWzBdPy5nZXRIb3VycygpIDogdGhpcy5jdXJSYW5nZURhdGVbMV0/LmdldEhvdXJzKCkpIHx8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmN1ckRhdGU/LmdldEhvdXJzKCkgfHwgMDtcbiAgICB9XG4gIH1cbiAgZ2V0IGN1ck1pbigpIHtcbiAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICByZXR1cm4gKHRoaXMuY3VycmVudEFjdGl2ZUlucHV0ID09PSAnc3RhcnQnID8gdGhpcy5jdXJSYW5nZURhdGVbMF0/LmdldE1pbnV0ZXMoKSA6IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy5nZXRNaW51dGVzKCkpIHx8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmN1ckRhdGU/LmdldE1pbnV0ZXMoKSB8fCAwO1xuICAgIH1cbiAgfVxuICBnZXQgY3VyU2VjKCkge1xuICAgIGlmICh0aGlzLmlzUmFuZ2UpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcgPyB0aGlzLmN1clJhbmdlRGF0ZVswXT8uZ2V0U2Vjb25kcygpIDogdGhpcy5jdXJSYW5nZURhdGVbMV0/LmdldFNlY29uZHMoKSkgfHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyRGF0ZT8uZ2V0U2Vjb25kcygpIHx8IDA7XG4gICAgfVxuICB9XG4gIHJlYWRvbmx5IHRvZ2dsZUV2ZW50ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xvc2VEcm9wZG93bkV2ZW50ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWN0aXZlSW5wdXRDaGFuZ2UgPSBuZXcgU3ViamVjdDwnc3RhcnQnIHwgJ2VuZCc+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBTdWJqZWN0PHtcbiAgICB0eXBlOiAnc2luZ2xlJyB8ICdyYW5nZSc7XG4gICAgdmFsdWU6IERhdGUgfCBEYXRlW107XG4gIH0+KCk7XG4gIHJlYWRvbmx5IHVwZGF0ZURhdGVWYWx1ZSA9IG5ldyBTdWJqZWN0PHtcbiAgICB0eXBlOiAnc2luZ2xlJyB8ICdyYW5nZSc7XG4gICAgdmFsdWU6IERhdGUgfCBEYXRlW107XG4gIH0+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkVGltZUNoYW5nZSA9IG5ldyBTdWJqZWN0PHtcbiAgICBhY3RpdmVJbnB1dD86ICdzdGFydCcgfCAnZW5kJztcbiAgICBob3VyOiBudW1iZXI7XG4gICAgbWluOiBudW1iZXI7XG4gICAgc2Vjb25kczogbnVtYmVyO1xuICB9PigpO1xuICByZWFkb25seSB1cGRhdGVUaW1lQ2hhbmdlID0gbmV3IFN1YmplY3Q8e1xuICAgIGFjdGl2ZUlucHV0PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBtaW46IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGRldGVjdGVkQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSkge1xuICAgIHRoaXMuZG9jdW1lbnQgPSB0aGlzLmRvYztcbiAgfVxuICBkYXRlSW5SYW5nZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChkYXRlLmdldFRpbWUoKSA+IHRoaXMubWluRGF0ZS5nZXRUaW1lKCkgJiYgZGF0ZS5nZXRUaW1lKCkgPCB0aGlzLm1heERhdGUuZ2V0VGltZSgpKSB8fFxuICAgICAgZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdGhpcy5taW5EYXRlLnRvRGF0ZVN0cmluZygpIHx8IGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IHRoaXMubWF4RGF0ZS50b0RhdGVTdHJpbmcoKTtcbiAgfVxuXG4gIHJlc2V0TWluKCkge1xuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJSYW5nZVswXSwgMCwgMSk7XG4gIH1cblxuICByZXNldE1heCgpIHtcbiAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyUmFuZ2VbMV0sIDExLCAzMSk7XG4gIH1cblxuICAvLyDlr7nojIPlm7TmqKHlvI/kuIvkuIDkupvpnZ7ms5XnmoTpgInmi6nov5vooYzkv67mraNcbiAgZml4UmFuZ2VEYXRlKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJSYW5nZURhdGVbMF0/LmdldFRpbWUoKTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLmN1clJhbmdlRGF0ZVsxXT8uZ2V0VGltZSgpO1xuXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCAmJiBlbmQgPCBzdGFydCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudEFjdGl2ZUlucHV0ID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHRoaXMuY3VyUmFuZ2VEYXRlWzFdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdlbmQnKSB7XG4gICAgICAgIHRoaXMuY3VyUmFuZ2VEYXRlWzBdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDliKTmlq3ml6XmnJ/mmK/lkKbkuLrotbflp4vml6XmnJ9cbiAgaXNTdGFydERhdGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3VycmVudEFjdGl2ZUlucHV0ID09PSAnc3RhcnQnKSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdGhpcy5jdXJIb3ZlckRhdGU/LnRvRGF0ZVN0cmluZygpIHx8IGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzBdPy50b0RhdGVTdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdGhpcy5jdXJSYW5nZURhdGVbMF0/LnRvRGF0ZVN0cmluZygpO1xuICB9XG5cbiAgLy8g5Yik5pat5pel5pyf5piv5ZCm5Li657uT5p2f5pel5pyfXG4gIGlzRW5kRGF0ZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdlbmQnKSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdGhpcy5jdXJIb3ZlckRhdGU/LnRvRGF0ZVN0cmluZygpIHx8IGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy50b0RhdGVTdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gdGhpcy5jdXJSYW5nZURhdGVbMV0/LnRvRGF0ZVN0cmluZygpO1xuICB9XG5cbiAgLy8g5Yik5pat5pel5pyf5piv5ZCm5ZyoaG92ZXLojIPlm7TmiJbogIXpgInkuK3nmoTojIPlm7TlhoVcbiAgaXNEYXRlSW5SYW5nZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBkYXRlLmdldFRpbWUoKTtcbiAgICBjb25zdCBkYXRlU3RyID0gZGF0ZS50b0RhdGVTdHJpbmcoKTtcbiAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmN1ckhvdmVyRGF0ZSB8fCB0aGlzLmN1clJhbmdlRGF0ZVswXSk/LmdldFRpbWUoKSA8IGRhdGVUaW1lICYmXG4gICAgICAgICAgKHRoaXMuY3VySG92ZXJEYXRlIHx8IHRoaXMuY3VyUmFuZ2VEYXRlWzBdKT8udG9EYXRlU3RyaW5nKCkgIT09IGRhdGVTdHIgJiZcbiAgICAgICAgICB0aGlzLmN1clJhbmdlRGF0ZVsxXT8uZ2V0VGltZSgpID4gZGF0ZVRpbWUgJiZcbiAgICAgICAgICB0aGlzLmN1clJhbmdlRGF0ZVsxXT8udG9EYXRlU3RyaW5nKCkgIT09IGRhdGVTdHI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJSYW5nZURhdGVbMF0/LmdldFRpbWUoKSA8IGRhdGVUaW1lICYmXG4gICAgICAgICAgdGhpcy5jdXJSYW5nZURhdGVbMF0/LnRvRGF0ZVN0cmluZygpICE9PSBkYXRlU3RyICYmXG4gICAgICAgICAgKHRoaXMuY3VySG92ZXJEYXRlIHx8IHRoaXMuY3VyUmFuZ2VEYXRlWzFdKT8uZ2V0VGltZSgpID4gZGF0ZVRpbWUgJiZcbiAgICAgICAgICAodGhpcy5jdXJIb3ZlckRhdGUgfHwgdGhpcy5jdXJSYW5nZURhdGVbMV0pLnRvRGF0ZVN0cmluZygpICE9PSBkYXRlU3RyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8g5Yik5pat5pel5pyf5piv5ZCm5Zyo5bey6YCJ5Lit55qE6IyD5Zu05YaF77yM5LiOaG92ZXLlgZrljLrliIZcbiAgaXNEYXRlSW5TZWxlY3RSYW5nZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY3VyUmFuZ2VEYXRlWzBdIHx8ICF0aGlzLmN1clJhbmdlRGF0ZVsxXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1clJhbmdlRGF0ZVswXS5nZXRUaW1lKCkgPCBkYXRlLmdldFRpbWUoKSAmJiB0aGlzLmN1clJhbmdlRGF0ZVsxXS5nZXRUaW1lKCkgPiBkYXRlLmdldFRpbWUoKSAmJlxuICAgICAgdGhpcy5jdXJSYW5nZURhdGVbMV0udG9EYXRlU3RyaW5nKCkgIT09IGRhdGUudG9EYXRlU3RyaW5nKCkgJiYgdGhpcy5jdXJSYW5nZURhdGVbMF0udG9EYXRlU3RyaW5nKCkgIT09IGRhdGUudG9EYXRlU3RyaW5nKCk7XG4gIH1cblxuICBpc0RhdGVBY3RpdmUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGVTdHIgPSBkYXRlLnRvRGF0ZVN0cmluZygpO1xuICAgIGlmICh0aGlzLmlzUmFuZ2UpIHtcbiAgICAgIHJldHVybiBkYXRlU3RyID09PSB0aGlzLmN1clJhbmdlRGF0ZVswXT8udG9EYXRlU3RyaW5nKCkgfHwgZGF0ZVN0ciA9PT0gdGhpcy5jdXJSYW5nZURhdGVbMV0/LnRvRGF0ZVN0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0ZVN0ciA9PT0gdGhpcy5jdXJEYXRlPy50b0RhdGVTdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBpc01vbnRoQWN0aXZlKHllYXJJbmRleDogbnVtYmVyLCBtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICByZXR1cm4gKHllYXJJbmRleCA9PT0gdGhpcy5jdXJSYW5nZURhdGVbMF0/LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA9PT0gdGhpcy5jdXJSYW5nZURhdGVbMF0/LmdldE1vbnRoKCkpIHx8XG4gICAgICAgICh5ZWFySW5kZXggPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy5nZXRGdWxsWWVhcigpICYmIG1vbnRoSW5kZXggPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy5nZXRNb250aCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHllYXJJbmRleCA9PT0gdGhpcy5jdXJEYXRlPy5nZXRGdWxsWWVhcigpICYmIG1vbnRoSW5kZXggPT09IHRoaXMuY3VyRGF0ZT8uZ2V0TW9udGgoKTtcbiAgICB9XG4gIH1cblxuICBpc1llYXJBY3RpdmUoeWVhckluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1JhbmdlKSB7XG4gICAgICByZXR1cm4geWVhckluZGV4ID09PSB0aGlzLmN1clJhbmdlRGF0ZVswXT8uZ2V0RnVsbFllYXIoKSB8fCB5ZWFySW5kZXggPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy5nZXRGdWxsWWVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geWVhckluZGV4ID09PSB0aGlzLmN1ckRhdGU/LmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g5piv5ZCm5Li66IyD5Zu06YCJ5Lit5pel5pyf5Lit5a+55bqU55qEaW5wdXTmv4DmtLvpoblcbiAgaXNBY3RpdmVJbnB1dFR5cGVEYXRlKGRhdGU6IERhdGUpIHtcbiAgICBpZiAoIXRoaXMuaXNSYW5nZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgcmV0dXJuIGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzBdPy50b0RhdGVTdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRhdGUudG9EYXRlU3RyaW5nKCkgPT09IHRoaXMuY3VyUmFuZ2VEYXRlWzFdPy50b0RhdGVTdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvLyDmmK/lkKbkuLrpgInkuK3ml6XmnJ/kuJTlnKjlup/lvIPojIPlm7TpgLvovpHlhoVcbiAgaXNEYXRlQWJhbmRvbihkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzUmFuZ2UgfHwgKCF0aGlzLmN1clJhbmdlRGF0ZVswXSB8fCAhdGhpcy5jdXJSYW5nZURhdGVbMV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzRGF0ZUFjdGl2ZShkYXRlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY3VySG92ZXJEYXRlPy5nZXRUaW1lKCkgPiBkYXRlLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY3VySG92ZXJEYXRlPy5nZXRUaW1lKCkgPCBkYXRlLmdldFRpbWUoKTtcbiAgICB9XG4gIH1cblxuICBpc0luU3VnZ2VzdExpc3QoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5tYXJrZWRSYW5nZURhdGVMaXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMubWFya2VkUmFuZ2VEYXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5tYXJrZWRSYW5nZURhdGVMaXN0W2luZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2VbMF0/LmdldFRpbWUoKSA8IGRhdGUuZ2V0VGltZSgpICYmIHJhbmdlWzFdPy5nZXRUaW1lKCkgPiBkYXRlLmdldFRpbWUoKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJhbmdlWzBdPy50b0RhdGVTdHJpbmcoKSA9PT0gZGF0ZS50b0RhdGVTdHJpbmcoKSB8fCByYW5nZVsxXT8udG9EYXRlU3RyaW5nKCkgPT09IGRhdGUudG9EYXRlU3RyaW5nKClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNNYXJrZWREYXRlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5tYXJrZWREYXRlTGlzdD8ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAodGhpcy5tYXJrZWREYXRlTGlzdFtpbmRleF0/LnRvRGF0ZVN0cmluZygpID09PSBkYXRlLnRvRGF0ZVN0cmluZygpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBtZWFyc3VyZVN0cldpZHRoKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtZWFyc3VyZURvbSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIG1lYXJzdXJlRG9tLmlubmVyVGV4dCA9IHN0cjtcbiAgICBtZWFyc3VyZURvbS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lYXJzdXJlRG9tKTtcblxuICAgIGNvbnN0IGRvbVdpZHRoID0gbWVhcnN1cmVEb20ub2Zmc2V0V2lkdGg7XG5cbiAgICB0aGlzLmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWVhcnN1cmVEb20pO1xuICAgIHJldHVybiBkb21XaWR0aDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlRXZlbnQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xvc2VEcm9wZG93bkV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy51cGRhdGVEYXRlVmFsdWUuY29tcGxldGUoKTtcbiAgICB0aGlzLnVwZGF0ZVRpbWVDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkVGltZUNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuYWN0aXZlSW5wdXRDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLmRldGVjdGVkQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJQcm9Db21tb25EYXRhU2VydmljZSB7XG4gIGNhbGVuZGFyRGF0YUNhY2hlID0ge307XG59XG4iXX0=