@junte/ui
Version:
Quality Angular UI components kit
328 lines • 44.7 kB
JavaScript
import { __decorate, __metadata, __values } from "tslib";
import { Component, forwardRef, HostBinding, HostListener, Input } from '@angular/core';
import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms';
import { format as formatDate, parse } from 'date-fns';
import { NGXLogger } from 'ngx-logger';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
import { Feature } from '../../core/enums/feature';
import { JunteUIConfig } from '../../config';
import { PropertyApi } from '../../core/decorators/api';
import { Breakpoint } from '../../core/enums/breakpoint';
import { UI } from '../../core/enums/ui';
import { Width } from '../../core/enums/width';
import { isEqual } from '../../core/utils/equal';
import { BreakpointService } from '../../layout/responsive/breakpoint.service';
import { DatePickerType } from './enums';
var INPUT_DELAY = 500;
var DIGIT_MASK_CHAR = '_';
var HOURS_MAX = 23;
var MINUTES_MAX = 59;
var Meridian;
(function (Meridian) {
Meridian["am"] = " AM";
Meridian["pm"] = " PM";
})(Meridian || (Meridian = {}));
var DatePickerComponent = /** @class */ (function () {
function DatePickerComponent(logger, fb, breakpoint, config) {
var _this = this;
this.logger = logger;
this.fb = fb;
this.breakpoint = breakpoint;
this.config = config;
this.host = 'jnt-date-picker-host';
this.ui = UI;
this.datePickerType = DatePickerType;
this.meridians = Meridian;
this._type = DatePickerType.date;
this.reference = { popover: null };
this._width = Width.default;
this.dateControl = this.fb.control(null);
this.timeControl = this.fb.control(null);
this.hoursControl = this.fb.control(null);
this.minutesControl = this.fb.control(null);
this.calendarControl = this.fb.control(new Date());
this.form = this.fb.group({
date: this.dateControl,
time: this.timeControl,
hours: this.hoursControl,
minutes: this.minutesControl,
calendar: this.calendarControl
});
this.calendarOpened = false;
this.timeOpened = false;
this.placeholder = '';
this.features = [];
this.onChange = function () { return _this.logger.error('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.error('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
}
DatePickerComponent_1 = DatePickerComponent;
Object.defineProperty(DatePickerComponent.prototype, "mobile", {
get: function () {
return this.breakpoint.current === Breakpoint.mobile;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerComponent.prototype, "type", {
get: function () {
return this._type;
},
set: function (type) {
this.clear();
this._type = type || DatePickerType.date;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatePickerComponent.prototype, "width", {
set: function (width) {
this._width = width || Width.default;
},
enumerable: true,
configurable: true
});
DatePickerComponent.prototype.ngOnInit = function () {
var _this = this;
this.calendarControl.valueChanges.pipe(distinctUntilChanged())
.subscribe(function (date) {
_this.dateControl.setValue(!!date ? formatDate(date, 'P', { locale: _this.config.locale.dfns }).replace(/\D/gi, '') : null);
_this.calendarOpened = false;
if (!!_this.reference.popover) {
_this.reference.popover.hide();
_this.reference.popover = null;
}
});
this.hoursControl.valueChanges
.pipe(distinctUntilChanged(function (val1, val2) { return isEqual(val1, val2); }))
.subscribe(function () { return _this.setTime(); });
this.minutesControl.valueChanges
.pipe(distinctUntilChanged(function (val1, val2) { return isEqual(val1, val2); }))
.subscribe(function () { return _this.setTime(); });
this.dateControl.valueChanges.pipe(debounceTime(INPUT_DELAY), distinctUntilChanged())
.subscribe(function (date) { return _this.update(date, true); });
this.timeControl.valueChanges.pipe(debounceTime(INPUT_DELAY), distinctUntilChanged())
.subscribe(function (time) { return _this.update(time); });
};
DatePickerComponent.prototype.close = function () {
if (!!this.reference.popover) {
this.reference.popover.hide();
this.reference.popover = null;
}
};
DatePickerComponent.prototype.clear = function () {
this.dateControl.setValue(null, { emitEvent: false });
this.timeControl.setValue(null, { emitEvent: false });
this.hoursControl.setValue(null, { emitEvent: false });
this.minutesControl.setValue(null, { emitEvent: false });
};
DatePickerComponent.prototype.update = function (value, close) {
var e_1, _a, e_2, _b, e_3, _c;
if (close === void 0) { close = false; }
if (!!value || this.type === DatePickerType.dateTime) {
if (this.type !== DatePickerType.dateTime) {
var output = this.type === DatePickerType.date
? this.config.locale.ui.masks.date
: this.config.locale.ui.masks.time + (this.meridian || '');
try {
for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
var char = value_1_1.value;
output = output.replace(DIGIT_MASK_CHAR, char);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);
}
finally { if (e_1) throw e_1.error; }
}
var parsed = parse(output, this.type === DatePickerType.date
? 'P' : 'p', new Date(0), { locale: this.config.locale.dfns });
if (parsed instanceof Date && !isNaN(parsed.getTime())) {
if (this.type === DatePickerType.date) {
this.calendarControl.setValue(parsed);
}
else {
this.hoursControl.setValue(parsed.getHours());
this.minutesControl.setValue(parsed.getMinutes());
}
this.onChange(parsed);
if (close) {
this.close();
}
}
}
else if (!!this.dateControl.value && !!this.timeControl.value) {
var output = this.config.locale.ui.masks.datetime + (this.meridian || '');
try {
for (var _d = __values(this.dateControl.value), _e = _d.next(); !_e.done; _e = _d.next()) {
var char = _e.value;
output = output.replace(DIGIT_MASK_CHAR, char);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
}
finally { if (e_2) throw e_2.error; }
}
try {
for (var _f = __values(this.timeControl.value), _g = _f.next(); !_g.done; _g = _f.next()) {
var char = _g.value;
output = output.replace(DIGIT_MASK_CHAR, char);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_g && !_g.done && (_c = _f.return)) _c.call(_f);
}
finally { if (e_3) throw e_3.error; }
}
var parsed = parse(output, 'Pp', new Date(), { locale: this.config.locale.dfns });
if (parsed instanceof Date && !isNaN(parsed.getTime())) {
this.onChange(parsed);
if (close) {
this.close();
}
}
}
}
else {
this.onChange(null);
if (!this.dateControl.value) {
this.calendarControl.setValue(null, { emitEvent: false });
this.close();
}
else {
this.hoursControl.setValue(null, { emitEvent: false });
this.minutesControl.setValue(null, { emitEvent: false });
this.close();
}
}
};
DatePickerComponent.prototype.setTime = function () {
var hours = '00';
var minutes = '00';
if (this.hoursControl.value !== null) {
hours = Math.min(Math.max(+this.hoursControl.value, 0), HOURS_MAX).toString();
this.hoursControl.setValue(+hours, { emitEvent: false });
hours = hours.length === 1 ? "0" + hours : hours;
}
else {
this.hoursControl.setValue(0, { emitEvent: false });
}
if (this.minutesControl.value !== null) {
minutes = Math.min(Math.max(+this.minutesControl.value, 0), MINUTES_MAX).toString();
this.minutesControl.setValue(+minutes, { emitEvent: false });
minutes = minutes.length === 1 ? "0" + minutes : minutes;
}
else {
this.minutesControl.setValue(0, { emitEvent: false });
}
this.timeControl.setValue("" + hours + minutes);
};
DatePickerComponent.prototype.writeValue = function (date) {
if (date instanceof Date && !isNaN(date.getTime())) {
this.calendarControl.setValue(date, { emitEvent: false });
this.dateControl.setValue(formatDate(date, 'P', { locale: this.config.locale.dfns }), { emitEvent: false });
}
else {
this.clear();
}
};
DatePickerComponent.prototype.setDisabledState = function (disabled) {
disabled ? this.dateControl.disable({ emitEvent: false })
: this.dateControl.enable({ emitEvent: false });
};
var DatePickerComponent_1;
DatePickerComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: FormBuilder },
{ type: BreakpointService },
{ type: JunteUIConfig }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], DatePickerComponent.prototype, "host", void 0);
__decorate([
HostBinding('attr.data-width'),
__metadata("design:type", String)
], DatePickerComponent.prototype, "_width", void 0);
__decorate([
HostBinding('attr.calendar-opened'),
__metadata("design:type", Object)
], DatePickerComponent.prototype, "calendarOpened", void 0);
__decorate([
HostBinding('attr.time-opened'),
__metadata("design:type", Object)
], DatePickerComponent.prototype, "timeOpened", void 0);
__decorate([
PropertyApi({
description: 'Placeholder for date picker',
type: 'string'
}),
Input(),
__metadata("design:type", Object)
], DatePickerComponent.prototype, "placeholder", void 0);
__decorate([
PropertyApi({
description: 'Button for reset input',
path: 'ui.feature',
options: [Feature.allowEmpty],
}),
HostBinding('attr.data-features'),
Input(),
__metadata("design:type", Array)
], DatePickerComponent.prototype, "features", void 0);
__decorate([
PropertyApi({
description: 'Date picker type',
path: 'ui.type',
options: [DatePickerType.date, DatePickerType.time, DatePickerType.dateTime]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], DatePickerComponent.prototype, "type", null);
__decorate([
PropertyApi({
description: 'Input width',
path: 'ui.width',
default: Width.default,
options: [Width.default, Width.fluid]
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], DatePickerComponent.prototype, "width", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], DatePickerComponent.prototype, "onBlur", void 0);
DatePickerComponent = DatePickerComponent_1 = __decorate([
Component({
selector: 'jnt-date-picker',
template: "<jnt-form child-of=\"jnt-date-picker-host\" [formGroup]=\"form\">\n <jnt-stack child-of=\"jnt-date-picker-host\" [orientation]=\"ui.orientation.horizontal\" [gutter]=\"mobile ? ui.gutter.none : ui.gutter.normal\">\n <ng-container *ngIf=\"type === datePickerType.date || type === datePickerType.dateTime\">\n <jnt-input child-of=\"jnt-date-picker-host\" *jntMinFor=\"ui.breakpoint.tablet\"\n data-input data-date\n formControlName=\"date\"\n [placeholder]=\"placeholder || ''\"\n [jntPopover]=\"{\n contentTemplate: calendarTemplate,\n trigger: ui.trigger.click,\n behaviour: ui.behaviour.dropdown,\n minWidth: '300px'\n }\"\n (attached)=\"reference.popover = $event\"\n [icon]=\"ui.icons.calendar\"\n [mask]=\"config.locale.ui.masks.date\"\n [width]=\"ui.width.fluid\"\n [features]=\"features\">\n </jnt-input>\n\n <jnt-input child-of=\"jnt-date-picker-host\" *jntFor=\"ui.breakpoint.mobile\" data-input\n formControlName=\"date\"\n [placeholder]=\"placeholder || ''\"\n [icon]=\"ui.icons.calendar\"\n (click)=\"calendarOpened = !calendarOpened\"\n [mask]=\"config.locale.ui.masks.date\"\n [width]=\"ui.width.fluid\"\n [features]=\"features\">\n </jnt-input>\n </ng-container>\n\n <ng-container *ngIf=\"type === datePickerType.time || type === datePickerType.dateTime\">\n <jnt-input child-of=\"jnt-date-picker-host\" *jntMinFor=\"ui.breakpoint.tablet\"\n data-input data-time\n formControlName=\"time\"\n [icon]=\"ui.icons.time\"\n [jntPopover]=\"{\n contentTemplate: timeTemplate,\n trigger: ui.trigger.click,\n behaviour: ui.behaviour.dropdown,\n features: [ui.feature.smarty],\n minWidth: '150px'\n }\"\n (attached)=\"reference.popover = $event\"\n [mask]=\"config.locale.ui.masks.time + (meridian || '')\"\n [features]=\"features\">\n </jnt-input>\n\n <jnt-input child-of=\"jnt-date-picker-host\" *jntFor=\"ui.breakpoint.mobile\" data-input\n formControlName=\"time\"\n [icon]=\"ui.icons.time\"\n (click)=\"timeOpened = !timeOpened\"\n [mask]=\"config.locale.ui.masks.time + (meridian || '')\"\n [features]=\"features\">\n </jnt-input>\n </ng-container>\n </jnt-stack>\n\n <ng-template #calendarTemplate>\n <jnt-stack child-of=\"jnt-date-picker-host\" data-calendar-dropdown [align]=\"ui.align.stretch\">\n <jnt-calendar child-of=\"jnt-date-picker-host\" data-calendar [features]=\"[ui.feature.today]\" formControlName=\"calendar\"></jnt-calendar>\n </jnt-stack>\n </ng-template>\n\n <ng-template #timeTemplate>\n <jnt-stack child-of=\"jnt-date-picker-host\" data-time-dropdown [orientation]=\"ui.orientation.horizontal\"\n [align]=\"ui.align.center\">\n\n <jnt-stack child-of=\"jnt-date-picker-host\" [align]=\"ui.align.stretch\" [gutter]=\"ui.gutter.small\" data-time-col>\n <jnt-button child-of=\"jnt-date-picker-host\" [icon]=\"ui.icons.chevronUp\"\n [size]=\"ui.size.small\"\n (click)=\"hoursControl.setValue(+hoursControl.value + 1)\">\n </jnt-button>\n <jnt-input child-of=\"jnt-date-picker-host\" data-input\n formControlName=\"hours\"\n [type]=\"ui.input.type.number\">\n </jnt-input>\n <jnt-button child-of=\"jnt-date-picker-host\" [icon]=\"ui.icons.chevronDown\"\n [size]=\"ui.size.small\"\n (click)=\"hoursControl.setValue(+hoursControl.value - 1)\">\n </jnt-button>\n </jnt-stack>\n\n <jnt-stack child-of=\"jnt-date-picker-host\" [align]=\"ui.align.stretch\" [gutter]=\"ui.gutter.small\" data-time-col>\n <jnt-button child-of=\"jnt-date-picker-host\" [icon]=\"ui.icons.chevronUp\"\n [size]=\"ui.size.small\"\n (click)=\"minutesControl.setValue(+minutesControl.value + 1)\">\n </jnt-button>\n <jnt-input child-of=\"jnt-date-picker-host\" data-input\n formControlName=\"minutes\"\n [type]=\"ui.input.type.number\">\n </jnt-input>\n <jnt-button child-of=\"jnt-date-picker-host\" [icon]=\"ui.icons.chevronDown\"\n [size]=\"ui.size.small\"\n (click)=\"minutesControl.setValue(+minutesControl.value - 1)\">\n </jnt-button>\n </jnt-stack>\n\n <jnt-stack child-of=\"jnt-date-picker-host\" *ngIf=\"config.locale.dfns.code !== 'ru'\"\n [align]=\"ui.align.stretch\"\n [gutter]=\"ui.gutter.small\" data-time-col>\n <jnt-button child-of=\"jnt-date-picker-host\" [text]=\"meridians.am\" (click)=\"meridian = meridians.am\"></jnt-button>\n <jnt-button child-of=\"jnt-date-picker-host\" [text]=\"meridians.pm\" (click)=\"meridian = meridians.pm\"></jnt-button>\n </jnt-stack>\n </jnt-stack>\n </ng-template>\n\n <ng-container *ngIf=\"mobile\">\n <ng-container *ngTemplateOutlet=\"calendarTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"timeTemplate\"></ng-container>\n </ng-container>\n</jnt-form>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return DatePickerComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [NGXLogger,
FormBuilder,
BreakpointService,
JunteUIConfig])
], DatePickerComponent);
return DatePickerComponent;
}());
export { DatePickerComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsSUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQ3hCLElBQU0sZUFBZSxH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Q0FBQzs7dURBQWlDO0lBbkYzQyxtQkFBbUI7UUFYL0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixpaExBQThDO1lBQzlDLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxxQkFBbUIsRUFBbkIsQ0FBbUIsQ0FBQztvQkFDbEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7eUNBc0Y0QixTQUFTO1lBQ2IsV0FBVztZQUNILGlCQUFpQjtZQUN0QixhQUFhO09BeEY3QixtQkFBbUIsQ0ErTi9CO0lBQUQsMEJBQUM7Q0FBQSxBQS9ORCxJQStOQztTQS9OWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmb3JtYXQgYXMgZm9ybWF0RGF0ZSwgcGFyc2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICduZ3gtbG9nZ2VyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9mZWF0dXJlJztcbmltcG9ydCB7IEp1bnRlVUlDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IEJyZWFrcG9pbnQgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2JyZWFrcG9pbnQnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL3VpJztcbmltcG9ydCB7IFdpZHRoIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy93aWR0aCc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9lcXVhbCc7XG5pbXBvcnQgeyBCcmVha3BvaW50U2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2JyZWFrcG9pbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQb3BvdmVySW5zdGFuY2UgfSBmcm9tICcuLi8uLi9vdmVybGF5cy9wb3BvdmVyL3BvcG92ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyVHlwZSB9IGZyb20gJy4vZW51bXMnO1xuXG5jb25zdCBJTlBVVF9ERUxBWSA9IDUwMDtcbmNvbnN0IERJR0lUX01BU0tfQ0hBUiA9ICdfJztcbmNvbnN0IEhPVVJTX01BWCA9IDIzO1xuY29uc3QgTUlOVVRFU19NQVggPSA1OTtcblxuZW51bSBNZXJpZGlhbiB7XG4gIGFtID0gJyBBTScsXG4gIHBtID0gJyBQTSdcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWRhdGUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuaG9zdCcpIHJlYWRvbmx5IGhvc3QgPSAnam50LWRhdGUtcGlja2VyLWhvc3QnO1xuXG4gIHVpID0gVUk7XG4gIGRhdGVQaWNrZXJUeXBlID0gRGF0ZVBpY2tlclR5cGU7XG4gIG1lcmlkaWFucyA9IE1lcmlkaWFuO1xuICBwcml2YXRlIF90eXBlOiBEYXRlUGlja2VyVHlwZSA9IERhdGVQaWNrZXJUeXBlLmRhdGU7XG5cbiAgcmVmZXJlbmNlOiB7IHBvcG92ZXI6IFBvcG92ZXJJbnN0YW5jZSB9ID0ge3BvcG92ZXI6IG51bGx9O1xuICBtZXJpZGlhbjogTWVyaWRpYW47XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtd2lkdGgnKVxuICBfd2lkdGg6IFdpZHRoID0gV2lkdGguZGVmYXVsdDtcblxuICBkYXRlQ29udHJvbCA9IHRoaXMuZmIuY29udHJvbChudWxsKTtcbiAgdGltZUNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2wobnVsbCk7XG4gIGhvdXJzQ29udHJvbCA9IHRoaXMuZmIuY29udHJvbChudWxsKTtcbiAgbWludXRlc0NvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2wobnVsbCk7XG4gIGNhbGVuZGFyQ29udHJvbCA9IHRoaXMuZmIuY29udHJvbChuZXcgRGF0ZSgpKTtcbiAgZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIGRhdGU6IHRoaXMuZGF0ZUNvbnRyb2wsXG4gICAgdGltZTogdGhpcy50aW1lQ29udHJvbCxcbiAgICBob3VyczogdGhpcy5ob3Vyc0NvbnRyb2wsXG4gICAgbWludXRlczogdGhpcy5taW51dGVzQ29udHJvbCxcbiAgICBjYWxlbmRhcjogdGhpcy5jYWxlbmRhckNvbnRyb2xcbiAgfSk7XG5cbiAgZ2V0IG1vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5icmVha3BvaW50LmN1cnJlbnQgPT09IEJyZWFrcG9pbnQubW9iaWxlO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmNhbGVuZGFyLW9wZW5lZCcpXG4gIGNhbGVuZGFyT3BlbmVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRpbWUtb3BlbmVkJylcbiAgdGltZU9wZW5lZCA9IGZhbHNlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdQbGFjZWhvbGRlciBmb3IgZGF0ZSBwaWNrZXInLFxuICAgIHR5cGU6ICdzdHJpbmcnXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0J1dHRvbiBmb3IgcmVzZXQgaW5wdXQnLFxuICAgIHBhdGg6ICd1aS5mZWF0dXJlJyxcbiAgICBvcHRpb25zOiBbRmVhdHVyZS5hbGxvd0VtcHR5XSxcbiAgfSlcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZmVhdHVyZXMnKVxuICBASW5wdXQoKVxuICBmZWF0dXJlczogRmVhdHVyZVtdID0gW107XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ0RhdGUgcGlja2VyIHR5cGUnLFxuICAgIHBhdGg6ICd1aS50eXBlJyxcbiAgICBvcHRpb25zOiBbRGF0ZVBpY2tlclR5cGUuZGF0ZSwgRGF0ZVBpY2tlclR5cGUudGltZSwgRGF0ZVBpY2tlclR5cGUuZGF0ZVRpbWVdXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHR5cGU6IERhdGVQaWNrZXJUeXBlKSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlIHx8IERhdGVQaWNrZXJUeXBlLmRhdGU7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdJbnB1dCB3aWR0aCcsXG4gICAgcGF0aDogJ3VpLndpZHRoJyxcbiAgICBkZWZhdWx0OiBXaWR0aC5kZWZhdWx0LFxuICAgIG9wdGlvbnM6IFtXaWR0aC5kZWZhdWx0LCBXaWR0aC5mbHVpZF1cbiAgfSlcbiAgQElucHV0KCkgc2V0IHdpZHRoKHdpZHRoOiBXaWR0aCkge1xuICAgIHRoaXMuX3dpZHRoID0gd2lkdGggfHwgV2lkdGguZGVmYXVsdDtcbiAgfVxuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmVycm9yKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBicmVha3BvaW50OiBCcmVha3BvaW50U2VydmljZSxcbiAgICAgICAgICAgICAgcHVibGljIGNvbmZpZzogSnVudGVVSUNvbmZpZykge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jYWxlbmRhckNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoZGF0ZSA9PiB7XG4gICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoISFkYXRlID8gZm9ybWF0RGF0ZShkYXRlLCAnUCcsXG4gICAgICAgICAge2xvY2FsZTogdGhpcy5jb25maWcubG9jYWxlLmRmbnN9KS5yZXBsYWNlKC9cXEQvZ2ksICcnKSA6IG51bGwpO1xuICAgICAgICB0aGlzLmNhbGVuZGFyT3BlbmVkID0gZmFsc2U7XG4gICAgICAgIGlmICghIXRoaXMucmVmZXJlbmNlLnBvcG92ZXIpIHtcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZS5wb3BvdmVyLmhpZGUoKTtcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZS5wb3BvdmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmhvdXJzQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2YWwxLCB2YWwyKSA9PiBpc0VxdWFsKHZhbDEsIHZhbDIpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRUaW1lKCkpO1xuXG4gICAgdGhpcy5taW51dGVzQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2YWwxLCB2YWwyKSA9PiBpc0VxdWFsKHZhbDEsIHZhbDIpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRUaW1lKCkpO1xuXG4gICAgdGhpcy5kYXRlQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoSU5QVVRfREVMQVkpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZShkYXRlID0+IHRoaXMudXBkYXRlKGRhdGUsIHRydWUpKTtcblxuICAgIHRoaXMudGltZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKElOUFVUX0RFTEFZKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUodGltZSA9PiB0aGlzLnVwZGF0ZSh0aW1lKSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoISF0aGlzLnJlZmVyZW5jZS5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZS5wb3BvdmVyLmhpZGUoKTtcbiAgICAgIHRoaXMucmVmZXJlbmNlLnBvcG92ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLnRpbWVDb250cm9sLnNldFZhbHVlKG51bGwsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLm1pbnV0ZXNDb250cm9sLnNldFZhbHVlKG51bGwsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHN0cmluZywgY2xvc2UgPSBmYWxzZSkge1xuICAgIGlmICghIXZhbHVlIHx8IHRoaXMudHlwZSA9PT0gRGF0ZVBpY2tlclR5cGUuZGF0ZVRpbWUpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IERhdGVQaWNrZXJUeXBlLmRhdGVUaW1lKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSB0aGlzLnR5cGUgPT09IERhdGVQaWNrZXJUeXBlLmRhdGVcbiAgICAgICAgICA/IHRoaXMuY29uZmlnLmxvY2FsZS51aS5tYXNrcy5kYXRlXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZy5sb2NhbGUudWkubWFza3MudGltZSArICh0aGlzLm1lcmlkaWFuIHx8ICcnKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGFyIG9mIHZhbHVlKSB7XG4gICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoRElHSVRfTUFTS19DSEFSLCBjaGFyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShvdXRwdXQsIHRoaXMudHlwZSA9PT0gRGF0ZVBpY2tlclR5cGUuZGF0ZVxuICAgICAgICAgID8gJ1AnIDogJ3AnLCBuZXcgRGF0ZSgwKSxcbiAgICAgICAgICB7bG9jYWxlOiB0aGlzLmNvbmZpZy5sb2NhbGUuZGZuc30pO1xuICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4ocGFyc2VkLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBEYXRlUGlja2VyVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyQ29udHJvbC5zZXRWYWx1ZShwYXJzZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZShwYXJzZWQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXNDb250cm9sLnNldFZhbHVlKHBhcnNlZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHBhcnNlZCk7XG4gICAgICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCEhdGhpcy5kYXRlQ29udHJvbC52YWx1ZSAmJiAhIXRoaXMudGltZUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgbGV0IG91dHB1dCA9IHRoaXMuY29uZmlnLmxvY2FsZS51aS5tYXNrcy5kYXRldGltZSArICh0aGlzLm1lcmlkaWFuIHx8ICcnKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGFyIG9mIHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShESUdJVF9NQVNLX0NIQVIsIGNoYXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB0aGlzLnRpbWVDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoRElHSVRfTUFTS19DSEFSLCBjaGFyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShvdXRwdXQsICdQcCcsIG5ldyBEYXRlKCksXG4gICAgICAgICAge2xvY2FsZTogdGhpcy5jb25maWcubG9jYWxlLmRmbnN9KTtcbiAgICAgICAgaWYgKHBhcnNlZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgaWYgKCF0aGlzLmRhdGVDb250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJDb250cm9sLnNldFZhbHVlKG51bGwsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaG91cnNDb250cm9sLnNldFZhbHVlKG51bGwsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIHRoaXMubWludXRlc0NvbnRyb2wuc2V0VmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFRpbWUoKSB7XG4gICAgbGV0IGhvdXJzID0gJzAwJztcbiAgICBsZXQgbWludXRlcyA9ICcwMCc7XG5cbiAgICBpZiAodGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGhvdXJzID0gTWF0aC5taW4oTWF0aC5tYXgoK3RoaXMuaG91cnNDb250cm9sLnZhbHVlLCAwKSwgSE9VUlNfTUFYKS50b1N0cmluZygpO1xuICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoK2hvdXJzLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgaG91cnMgPSBob3Vycy5sZW5ndGggPT09IDEgPyBgMCR7aG91cnN9YCA6IGhvdXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSgwLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbnV0ZXNDb250cm9sLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICBtaW51dGVzID0gTWF0aC5taW4oTWF0aC5tYXgoK3RoaXMubWludXRlc0NvbnRyb2wudmFsdWUsIDApLCBNSU5VVEVTX01BWCkudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMubWludXRlc0NvbnRyb2wuc2V0VmFsdWUoK21pbnV0ZXMsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICBtaW51dGVzID0gbWludXRlcy5sZW5ndGggPT09IDEgPyBgMCR7bWludXRlc31gIDogbWludXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5taW51dGVzQ29udHJvbC5zZXRWYWx1ZSgwLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cblxuICAgIHRoaXMudGltZUNvbnRyb2wuc2V0VmFsdWUoYCR7aG91cnN9JHttaW51dGVzfWApO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJDb250cm9sLnNldFZhbHVlKGRhdGUsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKGZvcm1hdERhdGUoZGF0ZSwgJ1AnLFxuICAgICAgICB7bG9jYWxlOiB0aGlzLmNvbmZpZy5sb2NhbGUuZGZuc30pLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGRpc2FibGVkID8gdGhpcy5kYXRlQ29udHJvbC5kaXNhYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSlcbiAgICAgIDogdGhpcy5kYXRlQ29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxufVxuIl19