ng2-date-picker
Version:
[](https://travis-ci.org/vlio20/angular-datepicker) [](#backers) [![Sponsor
339 lines • 33.7 kB
JavaScript
import * as tslib_1 from "tslib";
import { DatePickerDirectiveService } from './date-picker-directive.service';
import { DatePickerComponent } from './date-picker.component';
import { ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostListener, Input, Optional, Output, ViewContainerRef } from '@angular/core';
import { NgControl } from '@angular/forms';
import { UtilsService } from '../common/services/utils/utils.service';
var DatePickerDirective = /** @class */ (function () {
function DatePickerDirective(viewContainerRef, elemRef, componentFactoryResolver, service, formControl, utilsService) {
this.viewContainerRef = viewContainerRef;
this.elemRef = elemRef;
this.componentFactoryResolver = componentFactoryResolver;
this.service = service;
this.formControl = formControl;
this.utilsService = utilsService;
this._mode = 'day';
this.open = new EventEmitter();
this.close = new EventEmitter();
this.onChange = new EventEmitter();
this.onGoToCurrent = new EventEmitter();
this.onLeftNav = new EventEmitter();
this.onRightNav = new EventEmitter();
this.onSelect = new EventEmitter();
}
Object.defineProperty(DatePickerDirective.prototype, "config", {
get: function () {
return this._config;
},
set: function (config) {
this._config = this.service.getConfig(config, this.viewContainerRef.element, this.attachTo);
this.updateDatepickerConfig();
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "attachTo", {
get: function () {
return this._attachTo;
},
set: function (attachTo) {
this._attachTo = attachTo;
this._config = this.service.getConfig(this.config, this.viewContainerRef.element, this.attachTo);
this.updateDatepickerConfig();
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "theme", {
get: function () {
return this._theme;
},
set: function (theme) {
this._theme = theme;
if (this.datePicker) {
this.datePicker.theme = theme;
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "mode", {
get: function () {
return this._mode;
},
set: function (mode) {
this._mode = mode;
if (this.datePicker) {
this.datePicker.mode = mode;
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "minDate", {
get: function () {
return this._minDate;
},
set: function (minDate) {
this._minDate = minDate;
if (this.datePicker) {
this.datePicker.minDate = minDate;
this.datePicker.ngOnInit();
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "maxDate", {
get: function () {
return this._maxDate;
},
set: function (maxDate) {
this._maxDate = maxDate;
if (this.datePicker) {
this.datePicker.maxDate = maxDate;
this.datePicker.ngOnInit();
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "minTime", {
get: function () {
return this._minTime;
},
set: function (minTime) {
this._minTime = minTime;
if (this.datePicker) {
this.datePicker.minTime = minTime;
this.datePicker.ngOnInit();
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "maxTime", {
get: function () {
return this._maxTime;
},
set: function (maxTime) {
this._maxTime = maxTime;
if (this.datePicker) {
this.datePicker.maxTime = maxTime;
this.datePicker.ngOnInit();
}
this.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerDirective.prototype, "displayDate", {
get: function () {
return this._displayDate;
},
set: function (displayDate) {
this._displayDate = displayDate;
this.updateDatepickerConfig();
this.markForCheck();
},
enumerable: true,
configurable: true
});
DatePickerDirective.prototype.ngOnInit = function () {
this.datePicker = this.createDatePicker();
this.api = this.datePicker.api;
this.updateDatepickerConfig();
this.attachModelToDatePicker();
this.datePicker.theme = this.theme;
};
DatePickerDirective.prototype.createDatePicker = function () {
var factory = this.componentFactoryResolver.resolveComponentFactory(DatePickerComponent);
return this.viewContainerRef.createComponent(factory).instance;
};
DatePickerDirective.prototype.attachModelToDatePicker = function () {
var _this = this;
if (!this.formControl) {
return;
}
this.datePicker.onViewDateChange(this.formControl.value);
this.formControl.valueChanges.subscribe(function (value) {
if (value !== _this.datePicker.inputElementValue) {
var strVal = _this.utilsService.convertToString(value, _this.datePicker.componentConfig.format);
_this.datePicker.onViewDateChange(strVal);
}
});
var setup = true;
this.datePicker.registerOnChange(function (value, changedByInput) {
if (value) {
var isMultiselectEmpty = setup && Array.isArray(value) && !value.length;
if (!isMultiselectEmpty && !changedByInput) {
_this.formControl.control.setValue(_this.datePicker.inputElementValue);
}
}
var errors = _this.datePicker.validateFn(value);
if (!setup) {
_this.formControl.control.markAsDirty({
onlySelf: true
});
}
else {
setup = false;
}
if (errors) {
if (errors.hasOwnProperty('format')) {
var given = errors['format'].given;
_this.datePicker.inputElementValue = given;
if (!changedByInput) {
_this.formControl.control.setValue(given);
}
}
_this.formControl.control.setErrors(errors);
}
});
};
DatePickerDirective.prototype.onClick = function () {
this.datePicker.onClick();
};
DatePickerDirective.prototype.onFocus = function () {
this.datePicker.inputFocused();
};
DatePickerDirective.prototype.updateDatepickerConfig = function () {
if (this.datePicker) {
this.datePicker.minDate = this.minDate;
this.datePicker.maxDate = this.maxDate;
this.datePicker.minTime = this.minTime;
this.datePicker.maxTime = this.maxTime;
this.datePicker.mode = this.mode || 'day';
this.datePicker.displayDate = this.displayDate;
this.datePicker.config = this.config;
this.datePicker.open = this.open;
this.datePicker.close = this.close;
this.datePicker.onChange = this.onChange;
this.datePicker.onGoToCurrent = this.onGoToCurrent;
this.datePicker.onLeftNav = this.onLeftNav;
this.datePicker.onRightNav = this.onRightNav;
this.datePicker.onSelect = this.onSelect;
this.datePicker.init();
if (this.datePicker.componentConfig.disableKeypress) {
this.elemRef.nativeElement.setAttribute('readonly', true);
}
else {
this.elemRef.nativeElement.removeAttribute('readonly');
}
}
};
DatePickerDirective.prototype.markForCheck = function () {
if (this.datePicker) {
this.datePicker.cd.markForCheck();
}
};
tslib_1.__decorate([
Input('dpDayPicker'),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "config", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "attachTo", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], DatePickerDirective.prototype, "theme", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], DatePickerDirective.prototype, "mode", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "minDate", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "maxDate", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "minTime", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "maxTime", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], DatePickerDirective.prototype, "displayDate", null);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], DatePickerDirective.prototype, "open", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], DatePickerDirective.prototype, "close", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], DatePickerDirective.prototype, "onChange", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", EventEmitter)
], DatePickerDirective.prototype, "onGoToCurrent", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", EventEmitter)
], DatePickerDirective.prototype, "onLeftNav", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", EventEmitter)
], DatePickerDirective.prototype, "onRightNav", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", EventEmitter)
], DatePickerDirective.prototype, "onSelect", void 0);
tslib_1.__decorate([
HostListener('click'),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", []),
tslib_1.__metadata("design:returntype", void 0)
], DatePickerDirective.prototype, "onClick", null);
tslib_1.__decorate([
HostListener('focus'),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", []),
tslib_1.__metadata("design:returntype", void 0)
], DatePickerDirective.prototype, "onFocus", null);
DatePickerDirective = tslib_1.__decorate([
Directive({
exportAs: 'dpDayPicker',
providers: [DatePickerDirectiveService],
selector: '[dpDayPicker]'
}),
tslib_1.__param(4, Optional()),
tslib_1.__metadata("design:paramtypes", [ViewContainerRef,
ElementRef,
ComponentFactoryResolver,
DatePickerDirectiveService,
NgControl,
UtilsService])
], DatePickerDirective);
return DatePickerDirective;
}());
export { DatePickerDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcyLWRhdGUtcGlja2VyLyIsInNvdXJjZXMiOlsiZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXpDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQTtBQVFuRTtJQXdJRSw2QkFBbUIsZ0JBQWtDLEVBQ2xDLE9BQW1CLEVBQ25CLHdCQUFrRCxFQUNsRCxPQUFtQyxFQUN2QixXQUFzQixFQUNsQyxZQUEwQjtRQUwxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxZQUFPLEdBQVAsT0FBTyxDQUE0QjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBVztRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXpJckMsVUFBSyxHQUFpQixLQUFLLENBQUM7UUF5SDFCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2hDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUM3QyxrQkFBYSxHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZE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LG1CQUFtQjtRQUwvQixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsYUFBYTtZQUN2QixTQUFTLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztZQUN2QyxRQUFRLEVBQUUsZUFBZTtTQUMxQixDQUFDO1FBNklhLG1CQUFBLFFBQVEsRUFBRSxDQUFBO2lEQUpjLGdCQUFnQjtZQUN6QixVQUFVO1lBQ08sd0JBQXdCO1lBQ3pDLDBCQUEwQjtZQUNWLFNBQVM7WUFDcEIsWUFBWTtPQTdJbEMsbUJBQW1CLENBd1AvQjtJQUFELDBCQUFDO0NBQUEsQUF4UEQsSUF3UEM7U0F4UFksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYWxlbmRhck1vZGV9IGZyb20gJy4uL2NvbW1vbi90eXBlcy9jYWxlbmRhci1tb2RlJztcbmltcG9ydCB7SURhdGVQaWNrZXJEaXJlY3RpdmVDb25maWd9IGZyb20gJy4vZGF0ZS1waWNrZXItZGlyZWN0aXZlLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQge0RhdGVQaWNrZXJEaXJlY3RpdmVTZXJ2aWNlfSBmcm9tICcuL2RhdGUtcGlja2VyLWRpcmVjdGl2ZS5zZXJ2aWNlJztcbmltcG9ydCB7SURwRGF5UGlja2VyQXBpfSBmcm9tICcuL2RhdGUtcGlja2VyLmFwaSc7XG5pbXBvcnQge0RhdGVQaWNrZXJDb21wb25lbnR9IGZyb20gJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0NhbGVuZGFyVmFsdWV9IGZyb20gJy4uL2NvbW1vbi90eXBlcy9jYWxlbmRhci12YWx1ZSc7XG5pbXBvcnQge1NpbmdsZUNhbGVuZGFyVmFsdWV9IGZyb20gJy4uL2NvbW1vbi90eXBlcy9zaW5nbGUtY2FsZW5kYXItdmFsdWUnO1xuaW1wb3J0IHtJTmF2RXZlbnR9IGZyb20gJy4uL2NvbW1vbi9tb2RlbHMvbmF2aWdhdGlvbi1ldmVudC5tb2RlbCc7XG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vY29tbW9uL3NlcnZpY2VzL3V0aWxzL3V0aWxzLnNlcnZpY2UnXG5pbXBvcnQge0lTZWxlY3Rpb25FdmVudH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzL3NlbGVjdGlvbi1ldmV0Lm1vZGVsJztcblxuQERpcmVjdGl2ZSh7XG4gIGV4cG9ydEFzOiAnZHBEYXlQaWNrZXInLFxuICBwcm92aWRlcnM6IFtEYXRlUGlja2VyRGlyZWN0aXZlU2VydmljZV0sXG4gIHNlbGVjdG9yOiAnW2RwRGF5UGlja2VyXSdcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX2NvbmZpZzogSURhdGVQaWNrZXJEaXJlY3RpdmVDb25maWc7XG4gIHByaXZhdGUgX2F0dGFjaFRvOiBFbGVtZW50UmVmIHwgc3RyaW5nO1xuICBwcml2YXRlIF90aGVtZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBDYWxlbmRhck1vZGUgPSAnZGF5JztcbiAgcHJpdmF0ZSBfbWluRGF0ZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgcHJpdmF0ZSBfbWluVGltZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgcHJpdmF0ZSBfbWF4VGltZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgcHJpdmF0ZSBfZGlzcGxheURhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG5cbiAgZ2V0IGNvbmZpZygpOiBJRGF0ZVBpY2tlckRpcmVjdGl2ZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIEBJbnB1dCgnZHBEYXlQaWNrZXInKSBzZXQgY29uZmlnKGNvbmZpZzogSURhdGVQaWNrZXJEaXJlY3RpdmVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLnNlcnZpY2UuZ2V0Q29uZmlnKGNvbmZpZywgdGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQsIHRoaXMuYXR0YWNoVG8pO1xuICAgIHRoaXMudXBkYXRlRGF0ZXBpY2tlckNvbmZpZygpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgYXR0YWNoVG8oKTogRWxlbWVudFJlZiB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGFjaFRvO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGF0dGFjaFRvKGF0dGFjaFRvOiBFbGVtZW50UmVmIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5fYXR0YWNoVG8gPSBhdHRhY2hUbztcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLnNlcnZpY2UuZ2V0Q29uZmlnKHRoaXMuY29uZmlnLCB0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudCwgdGhpcy5hdHRhY2hUbyk7XG4gICAgdGhpcy51cGRhdGVEYXRlcGlja2VyQ29uZmlnKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0aGVtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aGVtZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0aGVtZSh0aGVtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhlbWUgPSB0aGVtZTtcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIudGhlbWUgPSB0aGVtZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IG1vZGUoKTogQ2FsZW5kYXJNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtb2RlKG1vZGU6IENhbGVuZGFyTW9kZSkge1xuICAgIHRoaXMuX21vZGUgPSBtb2RlO1xuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5tb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1pbkRhdGUobWluRGF0ZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZSkge1xuICAgIHRoaXMuX21pbkRhdGUgPSBtaW5EYXRlO1xuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5taW5EYXRlID0gbWluRGF0ZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgbWluRGF0ZSgpOiBTaW5nbGVDYWxlbmRhclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtYXhEYXRlKG1heERhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUpIHtcbiAgICB0aGlzLl9tYXhEYXRlID0gbWF4RGF0ZTtcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIubWF4RGF0ZSA9IG1heERhdGU7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IG1heERhdGUoKTogU2luZ2xlQ2FsZW5kYXJWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbWluVGltZShtaW5UaW1lOiBTaW5nbGVDYWxlbmRhclZhbHVlKSB7XG4gICAgdGhpcy5fbWluVGltZSA9IG1pblRpbWU7XG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlcikge1xuICAgICAgdGhpcy5kYXRlUGlja2VyLm1pblRpbWUgPSBtaW5UaW1lO1xuICAgICAgdGhpcy5kYXRlUGlja2VyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBtaW5UaW1lKCk6IFNpbmdsZUNhbGVuZGFyVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW5UaW1lO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1heFRpbWUobWF4VGltZTogU2luZ2xlQ2FsZW5kYXJWYWx1ZSkge1xuICAgIHRoaXMuX21heFRpbWUgPSBtYXhUaW1lO1xuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5tYXhUaW1lID0gbWF4VGltZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgbWF4VGltZSgpOiBTaW5nbGVDYWxlbmRhclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4VGltZTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5RGF0ZSgpOiBTaW5nbGVDYWxlbmRhclZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheURhdGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheURhdGUoZGlzcGxheURhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUpIHtcbiAgICB0aGlzLl9kaXNwbGF5RGF0ZSA9IGRpc3BsYXlEYXRlO1xuICAgIHRoaXMudXBkYXRlRGF0ZXBpY2tlckNvbmZpZygpO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBvcGVuID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJWYWx1ZT4oKTtcbiAgQE91dHB1dCgpIG9uR29Ub0N1cnJlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTGVmdE5hdjogRXZlbnRFbWl0dGVyPElOYXZFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblJpZ2h0TmF2OiBFdmVudEVtaXR0ZXI8SU5hdkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgZGF0ZVBpY2tlcjogRGF0ZVBpY2tlckNvbXBvbmVudDtcbiAgcHVibGljIGFwaTogSURwRGF5UGlja2VyQXBpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICBwdWJsaWMgZWxlbVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHVibGljIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc2VydmljZTogRGF0ZVBpY2tlckRpcmVjdGl2ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBmb3JtQ29udHJvbDogTmdDb250cm9sLFxuICAgICAgICAgICAgICBwdWJsaWMgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZVBpY2tlciA9IHRoaXMuY3JlYXRlRGF0ZVBpY2tlcigpO1xuICAgIHRoaXMuYXBpID0gdGhpcy5kYXRlUGlja2VyLmFwaTtcbiAgICB0aGlzLnVwZGF0ZURhdGVwaWNrZXJDb25maWcoKTtcbiAgICB0aGlzLmF0dGFjaE1vZGVsVG9EYXRlUGlja2VyKCk7XG4gICAgdGhpcy5kYXRlUGlja2VyLnRoZW1lID0gdGhpcy50aGVtZTtcbiAgfVxuXG4gIGNyZWF0ZURhdGVQaWNrZXIoKTogRGF0ZVBpY2tlckNvbXBvbmVudCB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KERhdGVQaWNrZXJDb21wb25lbnQpO1xuICAgIHJldHVybiB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpLmluc3RhbmNlO1xuICB9XG5cbiAgYXR0YWNoTW9kZWxUb0RhdGVQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlUGlja2VyLm9uVmlld0RhdGVDaGFuZ2UodGhpcy5mb3JtQ29udHJvbC52YWx1ZSk7XG5cbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuZGF0ZVBpY2tlci5pbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBjb25zdCBzdHJWYWwgPSB0aGlzLnV0aWxzU2VydmljZS5jb252ZXJ0VG9TdHJpbmcodmFsdWUsIHRoaXMuZGF0ZVBpY2tlci5jb21wb25lbnRDb25maWcuZm9ybWF0KTtcbiAgICAgICAgdGhpcy5kYXRlUGlja2VyLm9uVmlld0RhdGVDaGFuZ2Uoc3RyVmFsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBzZXR1cCA9IHRydWU7XG5cbiAgICB0aGlzLmRhdGVQaWNrZXIucmVnaXN0ZXJPbkNoYW5nZSgodmFsdWUsIGNoYW5nZWRCeUlucHV0KSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXNNdWx0aXNlbGVjdEVtcHR5ID0gc2V0dXAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aDtcblxuICAgICAgICBpZiAoIWlzTXVsdGlzZWxlY3RFbXB0eSAmJiAhY2hhbmdlZEJ5SW5wdXQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5kYXRlUGlja2VyLmlucHV0RWxlbWVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmRhdGVQaWNrZXIudmFsaWRhdGVGbih2YWx1ZSk7XG5cbiAgICAgIGlmICghc2V0dXApIHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5jb250cm9sLm1hcmtBc0RpcnR5KHtcbiAgICAgICAgICBvbmx5U2VsZjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldHVwID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eSgnZm9ybWF0JykpIHtcbiAgICAgICAgICBjb25zdCB7Z2l2ZW59ID0gZXJyb3JzWydmb3JtYXQnXTtcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXIuaW5wdXRFbGVtZW50VmFsdWUgPSBnaXZlbjtcbiAgICAgICAgICBpZiAoIWNoYW5nZWRCeUlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLmNvbnRyb2wuc2V0VmFsdWUoZ2l2ZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuY29udHJvbC5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgb25DbGljaygpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXIub25DbGljaygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuZGF0ZVBpY2tlci5pbnB1dEZvY3VzZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0ZXBpY2tlckNvbmZpZygpIHtcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5tYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuICAgICAgdGhpcy5kYXRlUGlja2VyLm1pblRpbWUgPSB0aGlzLm1pblRpbWU7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIubWF4VGltZSA9IHRoaXMubWF4VGltZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5tb2RlID0gdGhpcy5tb2RlIHx8ICdkYXknO1xuICAgICAgdGhpcy5kYXRlUGlja2VyLmRpc3BsYXlEYXRlID0gdGhpcy5kaXNwbGF5RGF0ZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5jb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vcGVuID0gdGhpcy5vcGVuO1xuICAgICAgdGhpcy5kYXRlUGlja2VyLmNsb3NlID0gdGhpcy5jbG9zZTtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2U7XG4gICAgICB0aGlzLmRhdGVQaWNrZXIub25Hb1RvQ3VycmVudCA9IHRoaXMub25Hb1RvQ3VycmVudDtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vbkxlZnROYXYgPSB0aGlzLm9uTGVmdE5hdjtcbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vblJpZ2h0TmF2ID0gdGhpcy5vblJpZ2h0TmF2O1xuICAgICAgdGhpcy5kYXRlUGlja2VyLm9uU2VsZWN0ID0gdGhpcy5vblNlbGVjdDtcblxuICAgICAgdGhpcy5kYXRlUGlja2VyLmluaXQoKTtcblxuICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlci5jb21wb25lbnRDb25maWcuZGlzYWJsZUtleXByZXNzKSB7XG4gICAgICAgIHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtYXJrRm9yQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlcikge1xuICAgICAgdGhpcy5kYXRlUGlja2VyLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxufVxuIl19