angular-cd-timer
Version:
Cd-Timer is a Angular CLI component with countup, countdown and multiple options.
270 lines • 30.7 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
export class CdTimerComponent {
constructor(elt, renderer) {
this.elt = elt;
this.renderer = renderer;
this.onStart = new EventEmitter();
this.onStop = new EventEmitter();
this.onTick = new EventEmitter();
this.onComplete = new EventEmitter();
// Initialization
this.autoStart = true;
this.startTime = 0;
this.endTime = 0;
this.timeoutId = null;
this.countdown = false;
this.format = 'default';
}
ngAfterViewInit() {
const ngContentNode = this.elt.nativeElement.lastChild; // Get last child, defined by user or span
this.ngContentSchema = ngContentNode ? ngContentNode.nodeValue : '';
if (this.autoStart === undefined || this.autoStart === true) {
this.start();
}
}
ngOnDestroy() {
this.resetTimeout();
}
/**
* Start the timer
*/
start() {
this.initVar();
this.resetTimeout();
this.computeTimeUnits();
this.startTickCount();
this.onStart.emit(this);
}
/**
* Resume the timer
*/
resume() {
this.resetTimeout();
this.startTickCount();
}
/**
* Stop the timer
*/
stop() {
this.clear();
this.onStop.emit(this);
}
/**
* Reset the timer
*/
reset() {
this.initVar();
this.resetTimeout();
this.clear();
this.computeTimeUnits();
this.renderText();
}
/**
* Get the time information
* @returns TimeInterface
*/
get() {
return {
seconds: this.seconds,
minutes: this.minutes,
hours: this.hours,
days: this.days,
timer: this.timeoutId,
tick_count: this.tickCounter
};
}
/**
* Initialize variable before start
*/
initVar() {
this.startTime = this.startTime || 0;
this.endTime = this.endTime || 0;
this.countdown = this.countdown || false;
this.tickCounter = this.startTime;
// Disable countdown if start time not defined
if (this.countdown && this.startTime === 0) {
this.countdown = false;
}
// Determine auto format
if (!this.format) {
this.format = (this.ngContentSchema.length > 5) ? 'user' : 'default';
}
}
/**
* Reset timeout
*/
resetTimeout() {
if (this.timeoutId) {
clearInterval(this.timeoutId);
}
}
/**
* Render the time to DOM
*/
renderText() {
let outputText;
if (this.format === 'user') {
// User presentation
const items = {
'seconds': this.seconds,
'minutes': this.minutes,
'hours': this.hours,
'days': this.days
};
outputText = this.ngContentSchema;
for (const key of Object.keys(items)) {
outputText = outputText.replace('[' + key + ']', items[key].toString());
}
}
else if (this.format === 'intelli') {
// Intelli presentation
outputText = '';
if (this.days > 0) {
outputText += this.days.toString() + 'day' + ((this.days > 1) ? 's' : '') + ' ';
}
if ((this.hours > 0) || (this.days > 0)) {
outputText += this.hours.toString() + 'h ';
}
if (((this.minutes > 0) || (this.hours > 0)) && (this.days === 0)) {
outputText += this.minutes.toString().padStart(2, '0') + 'min ';
}
if ((this.hours === 0) && (this.days === 0)) {
outputText += this.seconds.toString().padStart(2, '0') + 's';
}
}
else if (this.format === 'hms') {
// Hms presentation
outputText = this.hours.toString().padStart(2, '0') + ':';
outputText += this.minutes.toString().padStart(2, '0') + ':';
outputText += this.seconds.toString().padStart(2, '0');
}
else if (this.format === 'ms') {
// ms presentation
outputText = '';
if (this.hours > 0) {
outputText = this.hours.toString().padStart(2, '0') + ':';
}
outputText += this.minutes.toString().padStart(2, '0') + ':';
outputText += this.seconds.toString().padStart(2, '0');
}
else {
// Default presentation
outputText = this.days.toString() + 'd ';
outputText += this.hours.toString() + 'h ';
outputText += this.minutes.toString() + 'm ';
outputText += this.seconds.toString() + 's';
}
this.renderer.setProperty(this.elt.nativeElement, 'innerHTML', outputText);
}
clear() {
this.resetTimeout();
this.timeoutId = null;
}
/**
* Compute each unit (seconds, minutes, hours, days) for further manipulation
* @protected
*/
computeTimeUnits() {
if (!this.maxTimeUnit || this.maxTimeUnit === 'day') {
this.seconds = Math.floor(this.tickCounter % 60);
this.minutes = Math.floor((this.tickCounter / 60) % 60);
this.hours = Math.floor((this.tickCounter / 3600) % 24);
this.days = Math.floor((this.tickCounter / 3600) / 24);
}
else if (this.maxTimeUnit === 'second') {
this.seconds = this.tickCounter;
this.minutes = 0;
this.hours = 0;
this.days = 0;
}
else if (this.maxTimeUnit === 'minute') {
this.seconds = Math.floor(this.tickCounter % 60);
this.minutes = Math.floor(this.tickCounter / 60);
this.hours = 0;
this.days = 0;
}
else if (this.maxTimeUnit === 'hour') {
this.seconds = Math.floor(this.tickCounter % 60);
this.minutes = Math.floor((this.tickCounter / 60) % 60);
this.hours = Math.floor(this.tickCounter / 3600);
this.days = 0;
}
this.renderText();
}
/**
* Start tick count, base of this component
* @protected
*/
startTickCount() {
const that = this;
that.timeoutId = setInterval(function () {
let counter;
if (that.countdown) {
// Compute finish counter for countdown
counter = that.tickCounter;
if (that.startTime > that.endTime) {
counter = that.tickCounter - that.endTime - 1;
}
}
else {
// Compute finish counter for timer
counter = that.tickCounter - that.startTime;
if (that.endTime > that.startTime) {
counter = that.endTime - that.tickCounter - 1;
}
}
that.computeTimeUnits();
const timer = {
seconds: that.seconds,
minutes: that.minutes,
hours: that.hours,
days: that.days,
timer: that.timeoutId,
tick_count: that.tickCounter
};
that.onTick.emit(timer);
if (counter < 0) {
that.stop();
that.onComplete.emit(that);
return;
}
if (that.countdown) {
that.tickCounter--;
}
else {
that.tickCounter++;
}
}, 1000); // Each seconds
}
}
CdTimerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CdTimerComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
CdTimerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: CdTimerComponent, selector: "cd-timer", inputs: { startTime: "startTime", endTime: "endTime", countdown: "countdown", autoStart: "autoStart", maxTimeUnit: "maxTimeUnit", format: "format" }, outputs: { onStart: "onStart", onStop: "onStop", onTick: "onTick", onComplete: "onComplete" }, ngImport: i0, template: ' <ng-content></ng-content>', isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CdTimerComponent, decorators: [{
type: Component,
args: [{
selector: 'cd-timer',
template: ' <ng-content></ng-content>'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { startTime: [{
type: Input
}], endTime: [{
type: Input
}], countdown: [{
type: Input
}], autoStart: [{
type: Input
}], maxTimeUnit: [{
type: Input
}], format: [{
type: Input
}], onStart: [{
type: Output
}], onStop: [{
type: Output
}], onTick: [{
type: Output
}], onComplete: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1jZC10aW1lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNkLXRpbWVyL3NyYy9saWIvYW5ndWxhci1jZC10aW1lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFDOUQsTUFBTSxlQUFlLENBQUM7O0FBT3ZCLE1BQU0sT0FBTyxnQkFBZ0I7SUFxQjNCLFlBQW9CLEdBQWUsRUFBVSxRQUFtQjtRQUE1QyxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUx0RCxZQUFPLEdBQW1DLElBQUksWUFBWSxFQUFvQixDQUFDO1FBQy9FLFdBQU0sR0FBbUMsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDOUUsV0FBTSxHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUN4RSxlQUFVLEdBQW1DLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRzFGLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFJLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFNLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFJLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFJLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFPLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFJLDBDQUEwQztRQUNyRyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFD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QyxTQUFTO2dCQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDN0IsQ0FBQztZQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXhCLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRVosSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNwQjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFDM0IsQ0FBQzs7NkdBalJVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLHFTQUZqQiw0QkFBNEI7MkZBRTNCLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsUUFBUSxFQUFFLDRCQUE0QjtpQkFDdkM7eUhBV1UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RpbWVJbnRlcmZhY2V9IGZyb20gJy4vYW5ndWxhci1jZC10aW1lci5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjZC10aW1lcicsXG4gIHRlbXBsYXRlOiAnIDxuZy1jb250ZW50PjwvbmctY29udGVudD4nXG59KVxuZXhwb3J0IGNsYXNzIENkVGltZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHRpbWVvdXRJZDogYW55O1xuICBwcml2YXRlIHRpY2tDb3VudGVyOiBudW1iZXI7XG4gIHByaXZhdGUgbmdDb250ZW50U2NoZW1hOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgbWludXRlczogbnVtYmVyO1xuICBwcml2YXRlIGhvdXJzOiBudW1iZXI7XG4gIHByaXZhdGUgZGF5czogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIHN0YXJ0VGltZTogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRUaW1lOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvdW50ZG93bjogYm9vbGVhbjtcbiAgQElucHV0KCkgYXV0b1N0YXJ0OiBib29sZWFuO1xuICBASW5wdXQoKSBtYXhUaW1lVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZztcbiAgQE91dHB1dCgpIG9uU3RhcnQ6IEV2ZW50RW1pdHRlcjxDZFRpbWVyQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2RUaW1lckNvbXBvbmVudD4oKTtcbiAgQE91dHB1dCgpIG9uU3RvcDogRXZlbnRFbWl0dGVyPENkVGltZXJDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDZFRpbWVyQ29tcG9uZW50PigpO1xuICBAT3V0cHV0KCkgb25UaWNrOiBFdmVudEVtaXR0ZXI8VGltZUludGVyZmFjZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRpbWVJbnRlcmZhY2U+KCk7XG4gIEBPdXRwdXQoKSBvbkNvbXBsZXRlOiBFdmVudEVtaXR0ZXI8Q2RUaW1lckNvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENkVGltZXJDb21wb25lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbHQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIC8vIEluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5hdXRvU3RhcnQgID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0VGltZSAgPSAwO1xuICAgIHRoaXMuZW5kVGltZSAgICA9IDA7XG4gICAgdGhpcy50aW1lb3V0SWQgID0gbnVsbDtcbiAgICB0aGlzLmNvdW50ZG93biAgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1hdCAgICAgPSAnZGVmYXVsdCc7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgbmdDb250ZW50Tm9kZSA9IHRoaXMuZWx0Lm5hdGl2ZUVsZW1lbnQubGFzdENoaWxkOyAgICAvLyBHZXQgbGFzdCBjaGlsZCwgZGVmaW5lZCBieSB1c2VyIG9yIHNwYW5cbiAgICB0aGlzLm5nQ29udGVudFNjaGVtYSA9IG5nQ29udGVudE5vZGUgPyBuZ0NvbnRlbnROb2RlLm5vZGVWYWx1ZSA6ICcnO1xuICAgIGlmICh0aGlzLmF1dG9TdGFydCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYXV0b1N0YXJ0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZXNldFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgdGltZXJcbiAgICovXG4gIHB1YmxpYyBzdGFydCgpIHtcbiAgICB0aGlzLmluaXRWYXIoKTtcbiAgICB0aGlzLnJlc2V0VGltZW91dCgpO1xuICAgIHRoaXMuY29tcHV0ZVRpbWVVbml0cygpO1xuICAgIHRoaXMuc3RhcnRUaWNrQ291bnQoKTtcblxuICAgIHRoaXMub25TdGFydC5lbWl0KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgdGltZXJcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgdGhpcy5yZXNldFRpbWVvdXQoKTtcblxuICAgIHRoaXMuc3RhcnRUaWNrQ291bnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSB0aW1lclxuICAgKi9cbiAgcHVibGljIHN0b3AoKSB7XG4gICAgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5vblN0b3AuZW1pdCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdGltZXJcbiAgICovXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmluaXRWYXIoKTtcbiAgICB0aGlzLnJlc2V0VGltZW91dCgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXB1dGVUaW1lVW5pdHMoKTtcbiAgICB0aGlzLnJlbmRlclRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRpbWUgaW5mb3JtYXRpb25cbiAgICogQHJldHVybnMgVGltZUludGVyZmFjZVxuICAgKi9cbiAgcHVibGljIGdldCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vjb25kczogdGhpcy5zZWNvbmRzLFxuICAgICAgbWludXRlczogdGhpcy5taW51dGVzLFxuICAgICAgaG91cnM6IHRoaXMuaG91cnMsXG4gICAgICBkYXlzOiB0aGlzLmRheXMsXG4gICAgICB0aW1lcjogdGhpcy50aW1lb3V0SWQsXG4gICAgICB0aWNrX2NvdW50OiB0aGlzLnRpY2tDb3VudGVyXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHZhcmlhYmxlIGJlZm9yZSBzdGFydFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0VmFyKCkge1xuICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5zdGFydFRpbWUgfHwgMDtcbiAgICB0aGlzLmVuZFRpbWUgICA9IHRoaXMuZW5kVGltZSB8fCAwO1xuICAgIHRoaXMuY291bnRkb3duID0gdGhpcy5jb3VudGRvd24gfHwgZmFsc2U7XG4gICAgdGhpcy50aWNrQ291bnRlciA9IHRoaXMuc3RhcnRUaW1lO1xuXG4gICAgLy8gRGlzYWJsZSBjb3VudGRvd24gaWYgc3RhcnQgdGltZSBub3QgZGVmaW5lZFxuICAgIGlmICh0aGlzLmNvdW50ZG93biAmJiB0aGlzLnN0YXJ0VGltZSA9PT0gMCkge1xuICAgICAgdGhpcy5jb3VudGRvd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgYXV0byBmb3JtYXRcbiAgICBpZiAoIXRoaXMuZm9ybWF0KSB7XG4gICAgICB0aGlzLmZvcm1hdCA9ICh0aGlzLm5nQ29udGVudFNjaGVtYS5sZW5ndGggPiA1KSA/ICd1c2VyJyA6ICdkZWZhdWx0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGltZW91dFxuICAgKi9cbiAgcHJpdmF0ZSByZXNldFRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZW91dElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0aW1lIHRvIERPTVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJUZXh0KCkge1xuICAgIGxldCBvdXRwdXRUZXh0O1xuICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gJ3VzZXInKSB7XG4gICAgICAvLyBVc2VyIHByZXNlbnRhdGlvblxuICAgICAgY29uc3QgaXRlbXMgPSB7XG4gICAgICAgICdzZWNvbmRzJzogdGhpcy5zZWNvbmRzLFxuICAgICAgICAnbWludXRlcyc6IHRoaXMubWludXRlcyxcbiAgICAgICAgJ2hvdXJzJzogdGhpcy5ob3VycyxcbiAgICAgICAgJ2RheXMnOiB0aGlzLmRheXNcbiAgICAgIH07XG5cbiAgICAgIG91dHB1dFRleHQgPSB0aGlzLm5nQ29udGVudFNjaGVtYTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaXRlbXMpKSB7XG4gICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0LnJlcGxhY2UoJ1snICsga2V5ICsgJ10nLCAoaXRlbXMgYXMgYW55KVtrZXldLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtYXQgPT09ICdpbnRlbGxpJykge1xuICAgICAgLy8gSW50ZWxsaSBwcmVzZW50YXRpb25cbiAgICAgIG91dHB1dFRleHQgPSAnJztcbiAgICAgIGlmICh0aGlzLmRheXMgPiAwKSB7XG4gICAgICAgIG91dHB1dFRleHQgKz0gdGhpcy5kYXlzLnRvU3RyaW5nKCkgKyAnZGF5JyArICgodGhpcy5kYXlzID4gMSkgPyAncycgOiAnJykgKyAnICc7XG4gICAgICB9XG4gICAgICBpZiAoKHRoaXMuaG91cnMgPiAwKSB8fCAodGhpcy5kYXlzID4gMCkpIHtcbiAgICAgICAgb3V0cHV0VGV4dCArPSB0aGlzLmhvdXJzLnRvU3RyaW5nKCkgKyAnaCAnO1xuICAgICAgfVxuICAgICAgaWYgKCgodGhpcy5taW51dGVzID4gMCkgfHwgKHRoaXMuaG91cnMgPiAwKSkgJiYgKHRoaXMuZGF5cyA9PT0gMCkpIHtcbiAgICAgICAgb3V0cHV0VGV4dCArPSB0aGlzLm1pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpICsgJ21pbiAnO1xuICAgICAgfVxuICAgICAgaWYgKCh0aGlzLmhvdXJzID09PSAwKSAmJiAodGhpcy5kYXlzID09PSAwKSkge1xuICAgICAgICBvdXRwdXRUZXh0ICs9IHRoaXMuc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAncyc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PT0gJ2htcycpIHtcbiAgICAgIC8vIEhtcyBwcmVzZW50YXRpb25cbiAgICAgIG91dHB1dFRleHQgPSB0aGlzLmhvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICc6JztcbiAgICAgIG91dHB1dFRleHQgKz0gdGhpcy5taW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICc6JztcbiAgICAgIG91dHB1dFRleHQgKz0gdGhpcy5zZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWF0ID09PSAnbXMnKSB7XG4gICAgICAvLyBtcyBwcmVzZW50YXRpb25cbiAgICAgIG91dHB1dFRleHQgPSAnJztcbiAgICAgIGlmKHRoaXMuaG91cnM+MCkge1xuICAgICAgICBvdXRwdXRUZXh0ID0gdGhpcy5ob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOic7XG4gICAgICB9XG4gICAgICBvdXRwdXRUZXh0ICs9IHRoaXMubWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOic7XG4gICAgICBvdXRwdXRUZXh0ICs9IHRoaXMuc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgcHJlc2VudGF0aW9uXG4gICAgICBvdXRwdXRUZXh0ID0gdGhpcy5kYXlzLnRvU3RyaW5nKCkgKyAnZCAnO1xuICAgICAgb3V0cHV0VGV4dCArPSB0aGlzLmhvdXJzLnRvU3RyaW5nKCkgKyAnaCAnO1xuICAgICAgb3V0cHV0VGV4dCArPSB0aGlzLm1pbnV0ZXMudG9TdHJpbmcoKSArICdtICc7XG4gICAgICBvdXRwdXRUZXh0ICs9IHRoaXMuc2Vjb25kcy50b1N0cmluZygpICsgJ3MnO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbHQubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsIG91dHB1dFRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcigpIHtcbiAgICB0aGlzLnJlc2V0VGltZW91dCgpO1xuICAgIHRoaXMudGltZW91dElkID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGVhY2ggdW5pdCAoc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheXMpIGZvciBmdXJ0aGVyIG1hbmlwdWxhdGlvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcHV0ZVRpbWVVbml0cygpIHtcbiAgICBpZiAoIXRoaXMubWF4VGltZVVuaXQgfHwgdGhpcy5tYXhUaW1lVW5pdCA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuc2Vjb25kcyAgPSBNYXRoLmZsb29yKHRoaXMudGlja0NvdW50ZXIgJSA2MCk7XG4gICAgICB0aGlzLm1pbnV0ZXMgID0gTWF0aC5mbG9vcigodGhpcy50aWNrQ291bnRlciAvIDYwKSAlIDYwKTtcbiAgICAgIHRoaXMuaG91cnMgICAgPSBNYXRoLmZsb29yKCh0aGlzLnRpY2tDb3VudGVyIC8gMzYwMCkgJSAyNCk7XG4gICAgICB0aGlzLmRheXMgICAgID0gTWF0aC5mbG9vcigodGhpcy50aWNrQ291bnRlciAvIDM2MDApIC8gMjQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXhUaW1lVW5pdCA9PT0gJ3NlY29uZCcpIHtcbiAgICAgIHRoaXMuc2Vjb25kcyAgPSB0aGlzLnRpY2tDb3VudGVyO1xuICAgICAgdGhpcy5taW51dGVzICA9IDA7XG4gICAgICB0aGlzLmhvdXJzICAgID0gMDtcbiAgICAgIHRoaXMuZGF5cyAgICAgPSAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXhUaW1lVW5pdCA9PT0gJ21pbnV0ZScpIHtcbiAgICAgIHRoaXMuc2Vjb25kcyAgPSBNYXRoLmZsb29yKHRoaXMudGlja0NvdW50ZXIgJSA2MCk7XG4gICAgICB0aGlzLm1pbnV0ZXMgID0gTWF0aC5mbG9vcih0aGlzLnRpY2tDb3VudGVyIC8gNjApO1xuICAgICAgdGhpcy5ob3VycyAgICA9IDA7XG4gICAgICB0aGlzLmRheXMgICAgID0gMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF4VGltZVVuaXQgPT09ICdob3VyJykge1xuICAgICAgdGhpcy5zZWNvbmRzICA9IE1hdGguZmxvb3IodGhpcy50aWNrQ291bnRlciAlIDYwKTtcbiAgICAgIHRoaXMubWludXRlcyAgPSBNYXRoLmZsb29yKCh0aGlzLnRpY2tDb3VudGVyIC8gNjApICUgNjApO1xuICAgICAgdGhpcy5ob3VycyAgICA9IE1hdGguZmxvb3IodGhpcy50aWNrQ291bnRlciAvIDM2MDApO1xuICAgICAgdGhpcy5kYXlzICAgICA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJUZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGljayBjb3VudCwgYmFzZSBvZiB0aGlzIGNvbXBvbmVudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhcnRUaWNrQ291bnQgKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdGhhdC50aW1lb3V0SWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgIGxldCBjb3VudGVyO1xuXG4gICAgICBpZiAodGhhdC5jb3VudGRvd24pIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBmaW5pc2ggY291bnRlciBmb3IgY291bnRkb3duXG4gICAgICAgIGNvdW50ZXIgPSB0aGF0LnRpY2tDb3VudGVyO1xuXG4gICAgICAgIGlmICh0aGF0LnN0YXJ0VGltZSA+IHRoYXQuZW5kVGltZSkge1xuICAgICAgICAgIGNvdW50ZXIgPSB0aGF0LnRpY2tDb3VudGVyIC0gdGhhdC5lbmRUaW1lIC0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBmaW5pc2ggY291bnRlciBmb3IgdGltZXJcbiAgICAgICAgY291bnRlciA9IHRoYXQudGlja0NvdW50ZXIgLSB0aGF0LnN0YXJ0VGltZTtcblxuICAgICAgICBpZiAodGhhdC5lbmRUaW1lID4gdGhhdC5zdGFydFRpbWUpIHtcbiAgICAgICAgICBjb3VudGVyID0gdGhhdC5lbmRUaW1lIC0gdGhhdC50aWNrQ291bnRlciAtIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhhdC5jb21wdXRlVGltZVVuaXRzKCk7XG5cbiAgICAgIGNvbnN0IHRpbWVyOiBUaW1lSW50ZXJmYWNlID0ge1xuICAgICAgICBzZWNvbmRzOiB0aGF0LnNlY29uZHMsXG4gICAgICAgIG1pbnV0ZXM6IHRoYXQubWludXRlcyxcbiAgICAgICAgaG91cnM6IHRoYXQuaG91cnMsXG4gICAgICAgIGRheXM6IHRoYXQuZGF5cyxcbiAgICAgICAgdGltZXI6IHRoYXQudGltZW91dElkLFxuICAgICAgICB0aWNrX2NvdW50OiB0aGF0LnRpY2tDb3VudGVyXG4gICAgICB9O1xuXG4gICAgICB0aGF0Lm9uVGljay5lbWl0KHRpbWVyKTtcblxuICAgICAgaWYgKGNvdW50ZXIgPCAwKSB7XG4gICAgICAgIHRoYXQuc3RvcCgpO1xuXG4gICAgICAgIHRoYXQub25Db21wbGV0ZS5lbWl0KHRoYXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGF0LmNvdW50ZG93bikge1xuICAgICAgICB0aGF0LnRpY2tDb3VudGVyLS07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LnRpY2tDb3VudGVyKys7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7IC8vIEVhY2ggc2Vjb25kc1xuICB9XG5cbn1cbiJdfQ==