@logo-software/timepicker
Version:
Timepicker helps users select and set a specific time in your timesheet in 24-hour format.
184 lines • 32.9 kB
JavaScript
/**
* @license
* Copyright LOGO YAZILIM SANAYİ VE TİCARET A.Ş. All Rights Reserved.
*
* Save to the extent permitted by law, you may not use, copy, modify,
* distribute or create derivative works of this material or any part
* of it without the prior written consent of LOGO YAZILIM SANAYİ VE TİCARET A.Ş. Limited.
* Any reproduction of this material must contain this notice.
*/
import { Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { PopoverPosition, PopoverService } from '@logo-software/popover';
/**
* IconPosition sets the clock icon position on the input. Default is left.
*/
export var IconPosition;
(function (IconPosition) {
IconPosition["ICON_LEFT"] = "left";
IconPosition["ICON_RIGHT"] = "right";
IconPosition["ICON_DEFAULT"] = "left";
})(IconPosition || (IconPosition = {}));
/**
* Set the sizes of the input. Default is medium.
*/
export var Sizes;
(function (Sizes) {
Sizes["LARGE"] = "large";
Sizes["MEDIUM"] = "medium";
Sizes["SMALL"] = "small";
Sizes["DEFAULT"] = "medium";
})(Sizes || (Sizes = {}));
/**
* The Timepicker is the component of itself. Provides a proxy to Timepicker options as well as custom picker options.
* Add the below code to your code stack and give initializer parameters.
*
* <sub>app.component.html</sub>
*
* ```html
* <logo-timepicker
* [id]="'myLogoTimer'"
* [(ngModel)]="setTime"
* [size]="'medium'"
* [iconPosition]="'left'"
* [cssClasses]="'my-own-theme-css'"
* >
* </logo-timepicker>
* ```
*/
export class TimepickerComponent {
constructor(popoverService) {
this.popoverService = popoverService;
/**
* The size of the timepicker. It accepts Sizes enum.
*/
this.size = Sizes.DEFAULT;
/**
* The position of the clock icon. It accepts IconPosition enum.
*/
this.iconPosition = IconPosition.ICON_DEFAULT;
/**
* Set disabled status of the element
*/
this.isDisabled = false;
this.hours = [];
this.minutes = [];
this.selectedHour = '00';
this.selectedMinute = '00';
this.time = null;
this.ngModelChange = new EventEmitter();
this.onChange = new EventEmitter();
this.PopoverPosition = PopoverPosition;
this.hours = Array.from({ length: 24 }, (x, i) => i < 10 ? '0' + i : '' + i);
this.minutes = Array.from({ length: 60 }, (x, i) => i < 10 ? '0' + i : '' + i);
if (!this.subscribtion) {
this.subscribtion = this.popoverService.openWatcher.subscribe((status) => {
if (!status) {
this.setInputTime(this.ngModel);
}
});
}
}
get ngModel() {
return this._ngModel;
}
/**
* Set model
*/
set ngModel(value) {
this._ngModel = value.trim();
this.setInputTime(value);
}
onResize(event) {
this.popoverService.closePopover();
}
ngOnDestroy() {
this.subscribtion.unsubscribe();
}
setInputTime(value) {
const split = value.trim().split(':');
this.selectedHour = split[0];
this.selectedMinute = split[1];
this.setTime();
}
/**
* This function shows the clock selection popover
*/
showClockSelector() {
this.popoverService.showPopover('timePopover-' + this.id);
}
/**
* This function closes the clock selection popover
*/
closeClockSelector() {
this.popoverService.closePopover();
}
/**
* This function sets the hour of the clock
*/
setHour($event) {
this.selectedHour = $event.target.value;
this.setTime();
}
/**
* This function sets the minutes of the clock
*/
setMin($event) {
this.selectedMinute = $event.target.value;
this.setTime();
}
/**
* This function sets the certain time with setted hours and minutes.
*/
setTime() {
this.time = this.selectedHour + ':' + this.selectedMinute;
}
/**
* This function handles the writing of the input
*/
handleWriteTime($event) {
const findTime = $event.target.value.split(':', 2);
findTime[0] === undefined || findTime[0].length < 2 ? this.selectedHour = '00' : this.selectedHour = findTime[0];
findTime[1] === undefined || findTime[1].length < 2 ? this.selectedMinute = '00' : this.selectedMinute = findTime[1];
}
apply() {
this.ngModelChange.emit(this.time);
this.onChange.emit(this.time);
this.popoverService.closePopover();
}
registerOnChange(fn) {
}
registerOnTouched(fn) {
}
writeValue(obj) {
}
setDisabledState(isDisabled) {
}
}
TimepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'logo-timepicker',
template: "<div class=\"logo-timepicker {{cssClasses}}\">\n <div class=\"input-w-icon {{iconPosition}} {{size}}\">\n <span class=\"le-time_clock_circle_2\"></span>\n <input\n [logoPopover]=\"'timePopover-' + id\"\n (keyup)=\"handleWriteTime($event)\"\n [ngModel]=\"time\"\n [placeholder]=\"'00:00'\"\n [regexp]=\"'^[0-2]{1}$|^[0-2]{1}[0-9]{1}$|^[0-2]{1}[0-9]{1}[0-5]{1}$|^[0-2]{1}[0-9]{1}[0-5]{1}[0-9]{1}$'\"\n [value]=\"time != null ? time : ''\"\n [disabled]=\"isDisabled\"\n class=\"icon-{{iconPosition}} bordered {{size}}\"\n id=\"{{id}}\"\n logoMask\n />\n </div>\n <logo-popover\n [hasSearch]=\"false\"\n [id]=\"'timePopover-' + id\"\n [isBackClick]=\"false\"\n [position]=\"PopoverPosition.POPOVER_BOTTOM_LEFT\"\n >\n <div class=\"selection-input\">\n <div class=\"selection\">\n <select (change)=\"setHour($event)\" [(ngModel)]=\"selectedHour\" class=\"popoverSelect\" id=\"{{id}}Hours\">\n <option *ngFor=\"let hour of hours\" [value]=\"hour\">{{hour}}</option>\n </select>\n </div>\n <div>:</div>\n <div class=\"selection\">\n <select (change)=\"setMin($event)\" [(ngModel)]=\"selectedMinute\" class=\"popoverSelect\" id=\"{{id}}Mins\">\n <option *ngFor=\"let min of minutes\" [value]=\"min\">{{min}}</option>\n </select>\n </div>\n </div>\n <div class=\"btn-area\">\n <button (click)=\"apply()\" class=\"approve-btn\">Uygula</button>\n </div>\n </logo-popover>\n</div>\n",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TimepickerComponent),
multi: true,
}],
styles: [".dotted{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.logo-tooltip .tip.on-bottom:after,.logo-tooltip .tip.on-top:after{border-left:7px solid transparent;border-right:7px solid transparent}.logo-tooltip .tip.on-left:after,.logo-tooltip .tip.on-right:after{border-top:7px solid transparent;border-bottom:7px solid transparent}.logo-tooltip{position:relative;color:#e94a34;cursor:pointer}.logo-tooltip .tip{position:absolute;width:180px;color:#fff;font-size:14px;font-style:normal;line-height:1.4;text-align:center;border-radius:3px;background:#333;padding:8px 12px;box-sizing:border-box;cursor:auto;z-index:10;opacity:0;visibility:hidden;transition:all .25s ease-in}.logo-tooltip .tip:after{position:absolute;width:0;height:0;content:\"\"}.logo-tooltip .tip.on-top{bottom:25px;left:0}.logo-tooltip .tip.on-top:after{bottom:-7px;left:10px;border-top:7px solid #333}.logo-tooltip .tip.on-right{top:-5px;left:103%}.logo-tooltip .tip.on-right:after{top:37%;left:-7px;border-right:7px solid #333}.logo-tooltip .tip.on-bottom{top:25px;left:0}.logo-tooltip .tip.on-bottom:after{top:-7px;left:10px;border-bottom:7px solid #333}.logo-tooltip .tip.on-left{top:-100%;right:103%}.logo-tooltip .tip.on-left:after{top:37%;right:-7px;border-left:7px solid #333}.logo-tooltip:hover .tip{opacity:1;visibility:visible}.logo-tooltip:hover .tip.on-top{transform:translateY(-15px)}.logo-tooltip:hover .tip.on-right{transform:translateX(15px)}.logo-tooltip:hover .tip.on-bottom{transform:translateY(15px)}.logo-tooltip:hover .tip.on-left{transform:translateX(-15px)}.test{content:\"a\";content:\"ba\";content:\"aa\";content:\"aade\";content:\"abde\"}:root .basic,:root .gray,:root .secondary{color:var(--leds-contrast-90pct)}:root .danger,:root .info,:root .success,:root .warning{color:var(--white)}:root .outline.primary,:root .outline.primary:active,:root .outline.primary:focus,:root .outline.primary:hover{border-color:var(--light-600)}:root .outline.primary:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--primary)}:root .outline.primary:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--primary)}:root .outline.primary:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--primary)}:root .outline.secondary{color:var(--leds-contrast-90pct)}:root .outline.secondary,:root .outline.secondary:active,:root .outline.secondary:focus,:root .outline.secondary:hover{border-color:var(--light-600)}:root .outline.secondary:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--leds-contrast-90pct)}:root .outline.secondary:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .outline.secondary:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--leds-contrast-90pct)}:root .outline.basic{color:var(--leds-contrast-90pct)}:root .outline.basic,:root .outline.basic:active,:root .outline.basic:focus,:root .outline.basic:hover{border-color:var(--light-600)}:root .outline.basic:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--leds-contrast-90pct)}:root .outline.basic:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .outline.basic:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--leds-contrast-90pct)}:root .outline.neutral,:root .outline.neutral:active,:root .outline.neutral:focus,:root .outline.neutral:hover{border-color:var(--light-600)}:root .outline.neutral:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--neutral)}:root .outline.neutral:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--neutral)}:root .outline.neutral:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--neutral)}:root .outline.light{border-color:rgba(var(--light-rgb),.5)}:root .outline.light:active,:root .outline.light:focus,:root .outline.light:hover{border-color:var(--light)}:root .outline.light:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--white)}:root .outline.light:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--white)}:root .outline.light:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--white)}:root .outline.dark,:root .outline.dark:active,:root .outline.dark:focus,:root .outline.dark:hover{border-color:var(--light-600)}:root .outline.dark:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--dark)}:root .outline.dark:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--dark)}:root .outline.dark:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--dark)}:root .outline.gray{color:var(--leds-contrast-90pct)}:root .outline.gray,:root .outline.gray:active,:root .outline.gray:focus,:root .outline.gray:hover{border-color:var(--light-600)}:root .outline.gray:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--leds-contrast-90pct)}:root .outline.gray:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .outline.gray:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--leds-contrast-90pct)}:root .outline.info{color:var(--info)}:root .outline.info,:root .outline.info:active,:root .outline.info:focus,:root .outline.info:hover{border-color:var(--light-600)}:root .outline.info:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--info)}:root .outline.info:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--info)}:root .outline.info:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--info)}:root .outline.danger{color:var(--danger)}:root .outline.danger,:root .outline.danger:active,:root .outline.danger:focus,:root .outline.danger:hover{border-color:var(--light-600)}:root .outline.danger:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--danger)}:root .outline.danger:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--danger)}:root .outline.danger:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--danger)}:root .outline.warning{color:var(--warning)}:root .outline.warning,:root .outline.warning:active,:root .outline.warning:focus,:root .outline.warning:hover{border-color:var(--light-600)}:root .outline.warning:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--warning)}:root .outline.warning:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--warning)}:root .outline.warning:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--warning)}:root .outline.success{color:var(--success)}:root .outline.success,:root .outline.success:active,:root .outline.success:focus,:root .outline.success:hover{border-color:var(--light-600)}:root .outline.success:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--success)}:root .outline.success:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--success)}:root .outline.success:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--success)}:root .ghost.primary:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--primary)}:root .ghost.primary:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--primary)}:root .ghost.primary:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--primary)}:root .ghost.secondary,:root .ghost.secondary:hover{color:var(--leds-contrast-90pct)}:root .ghost.secondary:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover))}:root .ghost.secondary:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .ghost.secondary:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus))}:root .ghost.basic,:root .ghost.basic:hover,:root .ghost.secondary:focus{color:var(--leds-contrast-90pct)}:root .ghost.basic:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover))}:root .ghost.basic:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .ghost.basic:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--leds-contrast-90pct)}:root .ghost.neutral:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--neutral)}:root .ghost.neutral:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--neutral)}:root .ghost.neutral:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--neutral)}:root .ghost.light:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--white)}:root .ghost.light:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--white)}:root .ghost.light:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--white)}:root .ghost.dark:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--dark)}:root .ghost.dark:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--dark)}:root .ghost.dark:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--dark)}:root .ghost.gray,:root .ghost.gray:hover{color:var(--leds-contrast-90pct)}:root .ghost.gray:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover))}:root .ghost.gray:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--leds-contrast-90pct)}:root .ghost.gray:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--leds-contrast-90pct)}:root .ghost.info{color:var(--info)}:root .ghost.info:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--info)}:root .ghost.info:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--info)}:root .ghost.info:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--info)}:root .ghost.danger{color:var(--danger)}:root .ghost.danger:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--danger)}:root .ghost.danger:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--danger)}:root .ghost.danger:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--danger)}:root .ghost.warning{color:var(--warning)}:root .ghost.warning:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--warning)}:root .ghost.warning:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--warning)}:root .ghost.warning:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--warning)}:root .ghost.success{color:var(--success)}:root .ghost.success:hover{background-color:rgba(var(--neutral-500-rgb),var(--ghost-hover));color:var(--success)}:root .ghost.success:active{background-color:rgba(var(--neutral-500-rgb),var(--ghost-active));color:var(--success)}:root .ghost.success:focus{background-color:rgba(var(--neutral-500-rgb),var(--ghost-focus));color:var(--success)}[class*=\" le-\"],[class^=le-]{position:relative}[class*=\" le-\"]:before,[class^=le-]:before{height:100%;top:0;-webkit-mask-size:14px;mask-size:14px}.le-time_clock_circle_2:before{-webkit-mask-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3E %3Cg id='time_clock_circle_2'%3E %3Cpath id='Shape' fill-rule='evenodd' clip-rule='evenodd' d='M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12C21.994 6.47963 17.5204 2.00597 12 2ZM16.3333 16.3508C16.0192 16.6833 15.4979 16.7061 15.1558 16.4025L11.0233 12.6142C10.85 12.4569 10.7508 12.234 10.75 12V7.41667C10.75 6.95643 11.1231 6.58333 11.5833 6.58333C12.0436 6.58333 12.4167 6.95643 12.4167 7.41667V11.6333L16.2783 15.1733C16.4421 15.3222 16.5399 15.5301 16.5502 15.7511C16.5605 15.9721 16.4825 16.1882 16.3333 16.3517V16.3508Z' fill='%235A5A5A'/%3E %3C/g%3E %3C/svg%3E\");-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;display:inline-block;content:\"\";position:absolute;background:currentColor}:host{display:inline-block}:host logo-popover{width:100%}:host ::ng-deep .selection-input{display:flex;width:160px;align-items:center;justify-content:space-between}:host ::ng-deep .selection-input .selection{width:40%;text-align:center}:host ::ng-deep .selection-input .selection select{width:100%}:host ::ng-deep .selection-input .selection:last-child{position:relative;z-index:1}:host ::ng-deep .btn-area{text-align:center;margin-top:10px}:host ::ng-deep .btn-area button{width:100%}"]
},] }
];
TimepickerComponent.ctorParameters = () => [
{ type: PopoverService }
];
TimepickerComponent.propDecorators = {
id: [{ type: Input }],
size: [{ type: Input }],
iconPosition: [{ type: Input }],
cssClasses: [{ type: Input }],
isDisabled: [{ type: Input }],
ngModelChange: [{ type: Output }],
onChange: [{ type: Output }],
ngModel: [{ type: Input }],
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sb2dvLXNvZnR3YXJlL3RpbWVwaWNrZXIvc3JjL2xpYi90aW1lcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpFOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksWUFJWDtBQUpELFdBQVksWUFBWTtJQUN0QixrQ0FBa0IsQ0FBQTtJQUNsQixvQ0FBb0IsQ0FBQTtJQUNwQixxQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBSlcsWUFBWSxLQUFaLFlBQVksUUFJdkI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLEtBS1g7QUFMRCxXQUFZLEtBQUs7SUFDZix3QkFBZSxDQUFBO0lBQ2YsMEJBQWlCLENBQUE7SUFDakIsd0JBQWUsQ0FBQTtJQUNmLDJCQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFMVyxLQUFLLEtBQUwsS0FBSyxRQUtoQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBV0gsTUFBTSxPQUFPLG1CQUFtQjtJQStCOUIsWUFBbUIsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBMUJqRDs7V0FFRztRQUNNLFNBQUksR0FBVSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3JDOztXQUVHO1FBQ00saUJBQVksR0FBaUIsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUtoRTs7V0FFRztRQUNNLGVBQVUsR0FB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QixDQUFDLEVBQU87SUFDekIsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFRO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtJQUNwQyxDQUFDOzs7WUFqSkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLDBnREFBMEM7Z0JBRTFDLFNBQVMsRUFBRSxDQUFDO3dCQUNWLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7d0JBQ2xELEtBQUssRUFBRSxJQUFJO3FCQUNaLENBQUM7O2FBQ0g7OztZQS9DeUIsY0FBYzs7O2lCQW9EckMsS0FBSzttQkFJTCxLQUFLOzJCQUlMLEtBQUs7eUJBSUwsS0FBSzt5QkFJTCxLQUFLOzRCQU1MLE1BQU07dUJBQ04sTUFBTTtzQkF5Qk4sS0FBSzt1QkFLTCxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IExPR08gWUFaSUxJTSBTQU5BWcSwIFZFIFTEsENBUkVUIEEuxZ4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogU2F2ZSB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcsIHlvdSBtYXkgbm90IHVzZSwgY29weSwgbW9kaWZ5LFxuICogZGlzdHJpYnV0ZSBvciBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGlzIG1hdGVyaWFsIG9yIGFueSBwYXJ0XG4gKiBvZiBpdCB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIGNvbnNlbnQgb2YgTE9HTyBZQVpJTElNIFNBTkFZxLAgVkUgVMSwQ0FSRVQgQS7Fni4gTGltaXRlZC5cbiAqIEFueSByZXByb2R1Y3Rpb24gb2YgdGhpcyBtYXRlcmlhbCBtdXN0IGNvbnRhaW4gdGhpcyBub3RpY2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgUG9wb3ZlclBvc2l0aW9uLCBQb3BvdmVyU2VydmljZSB9IGZyb20gJ0Bsb2dvLXNvZnR3YXJlL3BvcG92ZXInO1xuXG4vKipcbiAqIEljb25Qb3NpdGlvbiBzZXRzIHRoZSBjbG9jayBpY29uIHBvc2l0aW9uIG9uIHRoZSBpbnB1dC4gRGVmYXVsdCBpcyBsZWZ0LlxuICovXG5leHBvcnQgZW51bSBJY29uUG9zaXRpb24ge1xuICBJQ09OX0xFRlQgPSAnbGVmdCcsXG4gIElDT05fUklHSFQgPSAncmlnaHQnLFxuICBJQ09OX0RFRkFVTFQgPSAnbGVmdCcsXG59XG5cbi8qKlxuICogU2V0IHRoZSBzaXplcyBvZiB0aGUgaW5wdXQuIERlZmF1bHQgaXMgbWVkaXVtLlxuICovXG5leHBvcnQgZW51bSBTaXplcyB7XG4gIExBUkdFID0gJ2xhcmdlJyxcbiAgTUVESVVNID0gJ21lZGl1bScsXG4gIFNNQUxMID0gJ3NtYWxsJyxcbiAgREVGQVVMVCA9ICdtZWRpdW0nLFxufVxuXG4vKipcbiAqIFRoZSBUaW1lcGlja2VyIGlzIHRoZSBjb21wb25lbnQgb2YgaXRzZWxmLiBQcm92aWRlcyBhIHByb3h5IHRvIFRpbWVwaWNrZXIgb3B0aW9ucyBhcyB3ZWxsIGFzIGN1c3RvbSBwaWNrZXIgb3B0aW9ucy5cbiAqIEFkZCB0aGUgYmVsb3cgY29kZSB0byB5b3VyIGNvZGUgc3RhY2sgYW5kIGdpdmUgaW5pdGlhbGl6ZXIgcGFyYW1ldGVycy5cbiAqXG4gKiA8c3ViPmFwcC5jb21wb25lbnQuaHRtbDwvc3ViPlxuICpcbiAqIGBgYGh0bWxcbiAqIDxsb2dvLXRpbWVwaWNrZXJcbiAqICBbaWRdPVwiJ215TG9nb1RpbWVyJ1wiXG4gKiAgWyhuZ01vZGVsKV09XCJzZXRUaW1lXCJcbiAqICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gKiAgW2ljb25Qb3NpdGlvbl09XCInbGVmdCdcIlxuICogIFtjc3NDbGFzc2VzXT1cIidteS1vd24tdGhlbWUtY3NzJ1wiXG4gKiA+XG4gKiA8L2xvZ28tdGltZXBpY2tlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsb2dvLXRpbWVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVwaWNrZXJDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlLFxuICB9XSxcbn0pXG5leHBvcnQgY2xhc3MgVGltZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHRpbWVwaWNrZXIuIEl0IGFjY2VwdHMgU2l6ZXMgZW51bS5cbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IFNpemVzID0gU2l6ZXMuREVGQVVMVDtcbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2xvY2sgaWNvbi4gSXQgYWNjZXB0cyBJY29uUG9zaXRpb24gZW51bS5cbiAgICovXG4gIEBJbnB1dCgpIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uID0gSWNvblBvc2l0aW9uLklDT05fREVGQVVMVDtcbiAgLyoqXG4gICAqIFlvdXIgb3duIGNzcyBjbGFzcyB0byBkZXNpZ24gdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgY3NzQ2xhc3Nlczogc3RyaW5nO1xuICAvKipcbiAgICogU2V0IGRpc2FibGVkIHN0YXR1cyBvZiB0aGUgZWxlbWVudFxuICAgKi9cbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaG91cnMgPSBbXTtcbiAgcHVibGljIG1pbnV0ZXMgPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkSG91ciA9ICcwMCc7XG4gIHB1YmxpYyBzZWxlY3RlZE1pbnV0ZSA9ICcwMCc7XG4gIHB1YmxpYyB0aW1lID0gbnVsbDtcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHJpdmF0ZSBzdWJzY3JpYnRpb247XG4gIHB1YmxpYyBQb3BvdmVyUG9zaXRpb24gPSBQb3BvdmVyUG9zaXRpb247XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBvcG92ZXJTZXJ2aWNlOiBQb3BvdmVyU2VydmljZSkge1xuICAgIHRoaXMuaG91cnMgPSBBcnJheS5mcm9tKHtsZW5ndGg6IDI0fSwgKHgsIGkpID0+IGkgPCAxMCA/ICcwJyArIGkgOiAnJyArIGkpO1xuICAgIHRoaXMubWludXRlcyA9IEFycmF5LmZyb20oe2xlbmd0aDogNjB9LCAoeCwgaSkgPT4gaSA8IDEwID8gJzAnICsgaSA6ICcnICsgaSk7XG4gICAgaWYgKCF0aGlzLnN1YnNjcmlidGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpYnRpb24gPSB0aGlzLnBvcG92ZXJTZXJ2aWNlLm9wZW5XYXRjaGVyLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgdGhpcy5zZXRJbnB1dFRpbWUodGhpcy5uZ01vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmdNb2RlbDogc3RyaW5nO1xuXG4gIGdldCBuZ01vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLl9uZ01vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtb2RlbFxuICAgKi9cbiAgQElucHV0KCkgc2V0IG5nTW9kZWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25nTW9kZWwgPSB2YWx1ZS50cmltKCk7XG4gICAgdGhpcy5zZXRJbnB1dFRpbWUodmFsdWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplKGV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyU2VydmljZS5jbG9zZVBvcG92ZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaWJ0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRJbnB1dFRpbWUodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNwbGl0ID0gdmFsdWUudHJpbSgpLnNwbGl0KCc6Jyk7XG4gICAgdGhpcy5zZWxlY3RlZEhvdXIgPSBzcGxpdFswXTtcbiAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gc3BsaXRbMV07XG4gICAgdGhpcy5zZXRUaW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgY2xvY2sgc2VsZWN0aW9uIHBvcG92ZXJcbiAgICovXG4gIHB1YmxpYyBzaG93Q2xvY2tTZWxlY3RvcigpIHtcbiAgICB0aGlzLnBvcG92ZXJTZXJ2aWNlLnNob3dQb3BvdmVyKCd0aW1lUG9wb3Zlci0nICsgdGhpcy5pZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIGNsb2NrIHNlbGVjdGlvbiBwb3BvdmVyXG4gICAqL1xuICBwdWJsaWMgY2xvc2VDbG9ja1NlbGVjdG9yKCkge1xuICAgIHRoaXMucG9wb3ZlclNlcnZpY2UuY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBob3VyIG9mIHRoZSBjbG9ja1xuICAgKi9cbiAgcHVibGljIHNldEhvdXIoJGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEhvdXIgPSAkZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0VGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbWludXRlcyBvZiB0aGUgY2xvY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNaW4oJGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9ICRldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRUaW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjZXJ0YWluIHRpbWUgd2l0aCBzZXR0ZWQgaG91cnMgYW5kIG1pbnV0ZXMuXG4gICAqL1xuICBwdWJsaWMgc2V0VGltZSgpIHtcbiAgICB0aGlzLnRpbWUgPSB0aGlzLnNlbGVjdGVkSG91ciArICc6JyArIHRoaXMuc2VsZWN0ZWRNaW51dGU7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB3cml0aW5nIG9mIHRoZSBpbnB1dFxuICAgKi9cbiAgcHVibGljIGhhbmRsZVdyaXRlVGltZSgkZXZlbnQpIHtcbiAgICBjb25zdCBmaW5kVGltZSA9ICRldmVudC50YXJnZXQudmFsdWUuc3BsaXQoJzonLCAyKTtcbiAgICBmaW5kVGltZVswXSA9PT0gdW5kZWZpbmVkIHx8IGZpbmRUaW1lWzBdLmxlbmd0aCA8IDIgPyB0aGlzLnNlbGVjdGVkSG91ciA9ICcwMCcgOiB0aGlzLnNlbGVjdGVkSG91ciA9IGZpbmRUaW1lWzBdO1xuICAgIGZpbmRUaW1lWzFdID09PSB1bmRlZmluZWQgfHwgZmluZFRpbWVbMV0ubGVuZ3RoIDwgMiA/IHRoaXMuc2VsZWN0ZWRNaW51dGUgPSAnMDAnIDogdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IGZpbmRUaW1lWzFdO1xuICB9XG5cbiAgYXBwbHkoKSB7XG4gICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy50aW1lKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy50aW1lKTtcbiAgICB0aGlzLnBvcG92ZXJTZXJ2aWNlLmNsb3NlUG9wb3ZlcigpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgfVxufVxuIl19