@ciri/ngx-countdown
Version:
An angular countdown component.
324 lines • 20 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/countdown.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
import { interval } from 'rxjs';
import { animationFrame } from 'rxjs/internal/scheduler/animationFrame';
import { isSameSecond, parseFormat, parseTimeData } from './utils';
/**
* @record
*/
function CountdownData() { }
if (false) {
/** @type {?} */
CountdownData.prototype.remain;
/** @type {?} */
CountdownData.prototype.formattedTime;
/** @type {?} */
CountdownData.prototype.fragments;
}
/** @enum {number} */
var CountdownState = {
/** 暂停状态 */
paused: 0,
/** 运行状态 */
playing: 1,
/** 完成状态 */
finished: 2,
};
export { CountdownState };
CountdownState[CountdownState.paused] = 'paused';
CountdownState[CountdownState.playing] = 'playing';
CountdownState[CountdownState.finished] = 'finished';
/**
* 所有组件实例使用同一个 interval 流,以免实例多了后造成卡顿
* @type {?}
*/
var instances = [];
/** @type {?} */
var counter$ = interval(0, animationFrame);
/** @type {?} */
var counterSub;
/**
* @return {?}
*/
function setupCounter() {
destroyCounter();
counterSub = counter$.subscribe((/**
* @return {?}
*/
function () {
for (var i = 0; i < instances.length; i++) {
/** @type {?} */
var inst = instances[i];
if (inst.state !== CountdownState.playing) {
continue;
}
if (inst.remain <= 0) {
inst.state = CountdownState.finished;
inst.cdr.detectChanges();
inst.finish.emit();
continue;
}
/** @type {?} */
var remain = Math.max(inst.endTime - Date.now(), 0);
if (!inst.millisecond) {
if (!isSameSecond(remain, inst.remain) || remain === 0) {
inst.remain = remain;
inst.tick.emit(inst.remain);
}
}
else {
inst.remain = remain;
inst.tick.emit(inst.remain);
}
inst.cdr.detectChanges();
}
}));
}
/**
* @return {?}
*/
function destroyCounter() {
counterSub && counterSub.unsubscribe();
}
/**
* 倒计时组件
*/
var CountdownComponent = /** @class */ (function () {
function CountdownComponent(cdr) {
this.cdr = cdr;
/**
* 格式
*/
this.format = 'HH:mm:ss';
/**
* 是否自动开始
*/
this.autoStart = true;
/**
* 是否开启毫秒级渲染
*/
this.millisecond = false;
/**
* 倒计时完毕时触发
*/
this.finish = new EventEmitter();
/**
* 每倒计时一次都触发
*/
this.tick = new EventEmitter();
this.state = CountdownState.paused;
this._time = 60000;
}
Object.defineProperty(CountdownComponent.prototype, "time", {
get: /**
* @return {?}
*/
function () {
return this._time;
},
/** 总毫秒数 */
set: /**
* 总毫秒数
* @param {?} value
* @return {?}
*/
function (value) {
this._time = Math.max(value, 0);
this.reset();
},
enumerable: true,
configurable: true
});
Object.defineProperty(CountdownComponent.prototype, "data", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var noMillisecond = this.format.indexOf('S') === -1;
/** @type {?} */
var isPlaying = this.state === CountdownState.playing
// 即使 format 中没有设置毫秒,程序计算时候也会将毫秒计算进去,导致运行时秒数看上去总是小 1
// 此处在渲染时候手动 +1 秒,以追求视觉统一
;
// 即使 format 中没有设置毫秒,程序计算时候也会将毫秒计算进去,导致运行时秒数看上去总是小 1
// 此处在渲染时候手动 +1 秒,以追求视觉统一
/** @type {?} */
var timeData = parseTimeData(this.remain + (noMillisecond && isPlaying ? 1000 : 0));
/** @type {?} */
var formattedTime = parseFormat(this.format, timeData);
return {
formattedTime: formattedTime,
remain: this.remain,
fragments: formattedTime.split(':')
};
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
CountdownComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
instances.push(this);
if (instances.length === 1) {
setupCounter();
}
};
/**
* @return {?}
*/
CountdownComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.pause();
/** @type {?} */
var index = instances.indexOf(this);
if (index !== -1) {
instances.splice(index, 1);
}
if (instances.length === 0) {
destroyCounter();
}
};
/**
* 继续倒计时
*/
/**
* 继续倒计时
* @return {?}
*/
CountdownComponent.prototype.start = /**
* 继续倒计时
* @return {?}
*/
function () {
if (this.state === CountdownState.playing) {
return;
}
if (this.state === CountdownState.finished) {
this.remain = this.time;
}
this.endTime = Date.now() + this.remain;
this.state = CountdownState.playing;
};
/**
* 暂停倒计时
*/
/**
* 暂停倒计时
* @return {?}
*/
CountdownComponent.prototype.pause = /**
* 暂停倒计时
* @return {?}
*/
function () {
this.state = CountdownState.paused;
};
/**
* 重置倒计时
*/
/**
* 重置倒计时
* @return {?}
*/
CountdownComponent.prototype.reset = /**
* 重置倒计时
* @return {?}
*/
function () {
this.pause();
this.remain = this.time;
this.cdr.detectChanges();
if (this.autoStart) {
this.start();
}
};
CountdownComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-countdown',
template: "<ng-container *ngIf=\"!render\">{{ data.formattedTime }}</ng-container>\n<ng-container *ngTemplateOutlet=\"render; context: { $implicit: data }\"></ng-container>\n",
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
CountdownComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
CountdownComponent.propDecorators = {
format: [{ type: Input }],
autoStart: [{ type: Input }],
millisecond: [{ type: Input }],
render: [{ type: Input }],
time: [{ type: Input }],
finish: [{ type: Output }],
tick: [{ type: Output }]
};
return CountdownComponent;
}());
export { CountdownComponent };
if (false) {
/**
* 格式
* @type {?}
*/
CountdownComponent.prototype.format;
/**
* 是否自动开始
* @type {?}
*/
CountdownComponent.prototype.autoStart;
/**
* 是否开启毫秒级渲染
* @type {?}
*/
CountdownComponent.prototype.millisecond;
/**
* 自定义模版
* @type {?}
*/
CountdownComponent.prototype.render;
/**
* 倒计时完毕时触发
* @type {?}
*/
CountdownComponent.prototype.finish;
/**
* 每倒计时一次都触发
* @type {?}
*/
CountdownComponent.prototype.tick;
/** @type {?} */
CountdownComponent.prototype.state;
/**
* @type {?}
* @private
*/
CountdownComponent.prototype._time;
/**
* 剩余毫秒数
* @type {?}
* @private
*/
CountdownComponent.prototype.remain;
/**
* @type {?}
* @private
*/
CountdownComponent.prototype.endTime;
/**
* @type {?}
* @private
*/
CountdownComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjaXJpL25neC1jb3VudGRvd24vIiwic291cmNlcyI6WyJsaWIvY291bnRkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUE7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTs7OztBQUVsRSw0QkFJQzs7O0lBSEMsK0JBQWM7O0lBQ2Qsc0NBQXFCOztJQUNyQixrQ0FBZ0I7OztBQUVsQixJQUFZLGNBQWM7SUFDeEIsV0FBVztJQUNYLE1BQU0sR0FBQTtJQUNOLFdBQVc7SUFDWCxPQUFPLEdBQUE7SUFDUCxXQUFXO0lBQ1gsUUFBUSxHQUFBO0VBQ1Q7Ozs7Ozs7OztJQUtLLFNBQVMsR0FBRyxFQUFFOztJQUNkLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQzs7SUFDeEMsVUFBd0I7Ozs7QUFFNUIsU0FBUyxZQUFZO0lBQ25CLGNBQWMsRUFBRSxDQUFBO0lBQ2hCLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUzs7O0lBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUNuQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUV6QixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLE9BQU8sRUFBRTtnQkFD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QyxJQUFJLENBQUE7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUV4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1NBQ2I7SUFDSCxDQUFDOztnQkF4R0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QiwrS0FBeUM7b0JBQ3pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7OztnQkE5RUMsaUJBQWlCOzs7eUJBaUZoQixLQUFLOzRCQUVMLEtBQUs7OEJBRUwsS0FBSzt5QkFFTCxLQUFLO3VCQUVMLEtBQUs7eUJBVUwsTUFBTTt1QkFFTixNQUFNOztJQThFVCx5QkFBQztDQUFBLEFBekdELElBeUdDO1NBcEdZLGtCQUFrQjs7Ozs7O0lBRTdCLG9DQUFvQzs7Ozs7SUFFcEMsdUNBQWtDOzs7OztJQUVsQyx5Q0FBcUM7Ozs7O0lBRXJDLG9DQUFpQzs7Ozs7SUFZakMsb0NBQTBDOzs7OztJQUUxQyxrQ0FBMkM7O0lBRTNDLG1DQUE2Qzs7Ozs7SUFnQjdDLG1DQUE2Qjs7Ozs7O0lBRTdCLG9DQUFzQjs7Ozs7SUFDdEIscUNBQXVCOzs7OztJQUVYLGlDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvc2NoZWR1bGVyL2FuaW1hdGlvbkZyYW1lJ1xuaW1wb3J0IHsgaXNTYW1lU2Vjb25kLCBwYXJzZUZvcm1hdCwgcGFyc2VUaW1lRGF0YSB9IGZyb20gJy4vdXRpbHMnXG5cbmludGVyZmFjZSBDb3VudGRvd25EYXRhIHtcbiAgcmVtYWluOiBudW1iZXJcbiAgZm9ybWF0dGVkVGltZTogc3RyaW5nXG4gIGZyYWdtZW50czogYW55W11cbn1cbmV4cG9ydCBlbnVtIENvdW50ZG93blN0YXRlIHtcbiAgLyoqIOaaguWBnOeKtuaAgSAqL1xuICBwYXVzZWQsXG4gIC8qKiDov5DooYznirbmgIEgKi9cbiAgcGxheWluZyxcbiAgLyoqIOWujOaIkOeKtuaAgSAqL1xuICBmaW5pc2hlZFxufVxuXG4vKipcbiAqIOaJgOaciee7hOS7tuWunuS+i+S9v+eUqOWQjOS4gOS4qiBpbnRlcnZhbCDmtYHvvIzku6XlhY3lrp7kvovlpJrkuoblkI7pgKDmiJDljaHpob9cbiAqL1xuY29uc3QgaW5zdGFuY2VzID0gW11cbmNvbnN0IGNvdW50ZXIkID0gaW50ZXJ2YWwoMCwgYW5pbWF0aW9uRnJhbWUpXG5sZXQgY291bnRlclN1YjogU3Vic2NyaXB0aW9uXG5cbmZ1bmN0aW9uIHNldHVwQ291bnRlcigpIHtcbiAgZGVzdHJveUNvdW50ZXIoKVxuICBjb3VudGVyU3ViID0gY291bnRlciQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5zdCA9IGluc3RhbmNlc1tpXVxuXG4gICAgICBpZiAoaW5zdC5zdGF0ZSAhPT0gQ291bnRkb3duU3RhdGUucGxheWluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdC5yZW1haW4gPD0gMCkge1xuICAgICAgICBpbnN0LnN0YXRlID0gQ291bnRkb3duU3RhdGUuZmluaXNoZWRcbiAgICAgICAgaW5zdC5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIGluc3QuZmluaXNoLmVtaXQoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1haW4gPSBNYXRoLm1heChpbnN0LmVuZFRpbWUgLSBEYXRlLm5vdygpLCAwKVxuXG4gICAgICBpZiAoIWluc3QubWlsbGlzZWNvbmQpIHtcbiAgICAgICAgaWYgKCFpc1NhbWVTZWNvbmQocmVtYWluLCBpbnN0LnJlbWFpbikgfHwgcmVtYWluID09PSAwKSB7XG4gICAgICAgICAgaW5zdC5yZW1haW4gPSByZW1haW5cbiAgICAgICAgICBpbnN0LnRpY2suZW1pdChpbnN0LnJlbWFpbilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5yZW1haW4gPSByZW1haW5cbiAgICAgICAgaW5zdC50aWNrLmVtaXQoaW5zdC5yZW1haW4pXG4gICAgICB9XG5cbiAgICAgIGluc3QuY2RyLmRldGVjdENoYW5nZXMoKVxuICAgIH1cbiAgfSlcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lDb3VudGVyKCkge1xuICBjb3VudGVyU3ViICYmIGNvdW50ZXJTdWIudW5zdWJzY3JpYmUoKVxufVxuXG4vKipcbiAqIOWAkuiuoeaXtue7hOS7tlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY291bnRkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdW50ZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvdW50ZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIOagvOW8jyAqL1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9ICdISDptbTpzcydcbiAgLyoqIOaYr+WQpuiHquWKqOW8gOWniyAqL1xuICBASW5wdXQoKSBhdXRvU3RhcnQ6IGJvb2xlYW4gPSB0cnVlXG4gIC8qKiDmmK/lkKblvIDlkK/mr6vnp5LnuqfmuLLmn5MgKi9cbiAgQElucHV0KCkgbWlsbGlzZWNvbmQ6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiog6Ieq5a6a5LmJ5qih54mIICovXG4gIEBJbnB1dCgpIHJlbmRlcjogVGVtcGxhdGVSZWY8YW55PlxuICAvKiog5oC75q+r56eS5pWwICovXG4gIEBJbnB1dCgpXG4gIHNldCB0aW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90aW1lID0gTWF0aC5tYXgodmFsdWUsIDApXG4gICAgdGhpcy5yZXNldCgpXG4gIH1cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVcbiAgfVxuXG4gIC8qKiDlgJLorqHml7blrozmr5Xml7bop6blj5EgKi9cbiAgQE91dHB1dCgpIGZpbmlzaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIC8qKiDmr4/lgJLorqHml7bkuIDmrKHpg73op6blj5EgKi9cbiAgQE91dHB1dCgpIHRpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuXG4gIHN0YXRlOiBDb3VudGRvd25TdGF0ZSA9IENvdW50ZG93blN0YXRlLnBhdXNlZFxuICBnZXQgZGF0YSgpOiBDb3VudGRvd25EYXRhIHtcbiAgICBjb25zdCBub01pbGxpc2Vjb25kID0gdGhpcy5mb3JtYXQuaW5kZXhPZignUycpID09PSAtMSxcbiAgICAgIGlzUGxheWluZyA9IHRoaXMuc3RhdGUgPT09IENvdW50ZG93blN0YXRlLnBsYXlpbmdcblxuICAgIC8vIOWNs+S9vyBmb3JtYXQg5Lit5rKh5pyJ6K6+572u5q+r56eS77yM56iL5bqP6K6h566X5pe25YCZ5Lmf5Lya5bCG5q+r56eS6K6h566X6L+b5Y6777yM5a+86Ie06L+Q6KGM5pe256eS5pWw55yL5LiK5Y675oC75piv5bCPIDFcbiAgICAvLyDmraTlpITlnKjmuLLmn5Pml7blgJnmiYvliqggKzEg56eS77yM5Lul6L+95rGC6KeG6KeJ57uf5LiAXG4gICAgY29uc3QgdGltZURhdGEgPSBwYXJzZVRpbWVEYXRhKHRoaXMucmVtYWluICsgKG5vTWlsbGlzZWNvbmQgJiYgaXNQbGF5aW5nID8gMTAwMCA6IDApKVxuICAgIGNvbnN0IGZvcm1hdHRlZFRpbWUgPSBwYXJzZUZvcm1hdCh0aGlzLmZvcm1hdCwgdGltZURhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdHRlZFRpbWUsXG4gICAgICByZW1haW46IHRoaXMucmVtYWluLFxuICAgICAgZnJhZ21lbnRzOiBmb3JtYXR0ZWRUaW1lLnNwbGl0KCc6JylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90aW1lOiBudW1iZXIgPSA2MDAwMFxuICAvKiog5Ymp5L2Z5q+r56eS5pWwICovXG4gIHByaXZhdGUgcmVtYWluOiBudW1iZXJcbiAgcHJpdmF0ZSBlbmRUaW1lOiBudW1iZXJcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaW5zdGFuY2VzLnB1c2godGhpcylcbiAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2V0dXBDb3VudGVyKClcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgICBjb25zdCBpbmRleCA9IGluc3RhbmNlcy5pbmRleE9mKHRoaXMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlc3Ryb3lDb3VudGVyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog57un57ut5YCS6K6h5pe2XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ291bnRkb3duU3RhdGUucGxheWluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENvdW50ZG93blN0YXRlLmZpbmlzaGVkKSB7XG4gICAgICB0aGlzLnJlbWFpbiA9IHRoaXMudGltZVxuICAgIH1cblxuICAgIHRoaXMuZW5kVGltZSA9IERhdGUubm93KCkgKyB0aGlzLnJlbWFpblxuICAgIHRoaXMuc3RhdGUgPSBDb3VudGRvd25TdGF0ZS5wbGF5aW5nXG4gIH1cblxuICAvKipcbiAgICog5pqC5YGc5YCS6K6h5pe2XG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICB0aGlzLnN0YXRlID0gQ291bnRkb3duU3RhdGUucGF1c2VkXG4gIH1cblxuICAvKipcbiAgICog6YeN572u5YCS6K6h5pe2XG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgICB0aGlzLnJlbWFpbiA9IHRoaXMudGltZVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxuXG4gICAgaWYgKHRoaXMuYXV0b1N0YXJ0KSB7XG4gICAgICB0aGlzLnN0YXJ0KClcbiAgICB9XG4gIH1cbn1cbiJdfQ==