UNPKG

ngx-audio-player

Version:

[![npm version](https://img.shields.io/npm/v/ngx-audio-player.svg?colorB=red)](https://www.npmjs.com/package/ngx-audio-player) [![Downloads](https://img.shields.io/npm/dm/ngx-audio-player.svg)](https://www.npmjs.com/package/ngx-audio-player) [![licence](h

177 lines 19.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild } from '@angular/core'; import { AudioPlayerService } from '../../service/audio-player-service/audio-player.service'; import { MatPaginator, MatTableDataSource } from '@angular/material'; import { BaseAudioPlayerFunctions } from '../base/base-audio-player-components'; export class MatAdvancedAudioPlayerComponent extends BaseAudioPlayerFunctions { /** * @param {?} playlistService */ constructor(playlistService) { super(); this.playlistService = playlistService; this.displayedColumns = ['title', 'status']; this.dataSource = new MatTableDataSource(); } /** * @return {?} */ ngOnInit() { this.setDataSourceAttributes(); this.bindPlayerEvent(); this.playlistService.setPlaylist(this.playlistData); this.playlistService.getSubjectCurrentTrack().subscribe((playlistTrack) => { this.playlistTrack = playlistTrack; }); this.player.nativeElement.currentTime = 0; this.playlistService.init(); } /** * @param {?} mp * @return {?} */ set matPaginator(mp) { this.paginator = mp; this.setDataSourceAttributes(); } /** * @return {?} */ setDataSourceAttributes() { /** @type {?} */ let index = 1; if (this.playlistData) { this.playlistData.forEach(data => { data.index = index++; }); this.dataSource = new MatTableDataSource(this.playlistData); this.dataSource.paginator = this.paginator; } } /** * @return {?} */ nextSong() { if (((this.playlistService.indexSong + 1) % this.paginator.pageSize) === 0 || (this.playlistService.indexSong + 1) === this.paginator.length) { if (this.paginator.hasNextPage()) { this.paginator.nextPage(); } else if (!this.paginator.hasNextPage()) { this.paginator.firstPage(); } } this.currentTime = 0; this.duration = 0.01; this.playlistService.nextSong(); this.play(); } ; /** * @return {?} */ previousSong() { this.currentTime = 0; this.duration = 0.01; if (!this.checkIfSongHasStartedSinceAtleastTwoSeconds()) { if (((this.playlistService.indexSong) % this.paginator.pageSize) === 0 || (this.playlistService.indexSong) === 0) { if (this.paginator.hasPreviousPage()) { this.paginator.previousPage(); } else if (!this.paginator.hasPreviousPage()) { this.paginator.lastPage(); } } this.playlistService.previousSong(); } else { this.resetSong(); } this.play(); } ; /** * @return {?} */ resetSong() { this.player.nativeElement.src = this.playlistTrack[1].link; } ; /** * @param {?} index * @return {?} */ selectTrack(index) { console.log('selectTrack(index: number): void: ' + index); this.playlistService.selectATrack(index); setTimeout(() => { this.player.nativeElement.play(); }, 0); } ; /** * @return {?} */ checkIfSongHasStartedSinceAtleastTwoSeconds() { return this.player.nativeElement.currentTime > 2; } ; /** * @param {?} playlist * @return {?} */ set playlist(playlist) { this.playlistData = playlist; this.ngOnInit(); } } MatAdvancedAudioPlayerComponent.decorators = [ { type: Component, args: [{ selector: 'mat-advanced-audio-player', template: "<mat-card class=\"row d-flex justify-content-center ngx-advanced-audio-player\" style=\"margin: 0px;\">\n <audio [src]=\"playlistTrack[1].link\" #audioPlayer></audio>\n \n <button mat-button class=\"p-1\" style=\"border-left: 1px solid #ddd;\" (click)='previousSong();' [disabled]=\"loaderDisplay\">\n <fa-icon class=\"fa fa-lg\" [icon]=\"['fas','step-backward']\" aria-hidden=\"true\"></fa-icon>\n </button>\n <button mat-button class=\"p-1\" (click)='playBtnHandler();' style=\"border-left: 2px solid #ccc; border-right: 2px solid #ccc;\"\n [disabled]=\"loaderDisplay\">\n <fa-icon *ngIf=\"loaderDisplay\" title=\"loading...\" class=\"fa fa-2x loading-track\" [pulse]=\"true\" [icon]=\"['fas','spinner']\"\n aria-hidden=\"true\"></fa-icon>\n <fa-icon *ngIf=\"!loaderDisplay && !isPlaying\" class=\"fa fa-2x play-track\" style=\"color:#444\" [icon]=\"['fas','play']\"\n aria-hidden=\"true\"></fa-icon>\n <fa-icon *ngIf=\"!loaderDisplay && isPlaying\" class=\"fa fa-2x pause-track\" style=\"color:#444\" [icon]=\"['fas','pause']\"\n aria-hidden=\"true\"></fa-icon>\n </button>\n <button mat-button class=\"p-1\" style=\"border-right: 1px solid #ddd;\" (click)='nextSong();' [disabled]=\"loaderDisplay\">\n <fa-icon class=\"fa fa-lg next-track\" [icon]=\"['fas','step-forward']\" aria-hidden=\"true\"></fa-icon>\n </button>\n\n <div class=\"col\">\n <div class=\"d-flex flex-fill\">\n <div class=\"py-3 px-1\" style=\"font-size: 12px\">\n <span *ngIf=\"duration !== 0.01\">\n {{currentTime | secondsToMinutes}}\n </span>\n </div>\n <mat-slider class=\"flex-fill p-1\" style=\"width: 100%\" min=\"0\" max=\"{{duration}}\" value=\"{{currentTime}}\" (change)=\"currTimePosChanged($event)\"></mat-slider>\n\n <div class=\"py-3 px-1\" style=\"font-size: 12px; text-align: right\">\n <span *ngIf=\"duration !== 0.01\">\n -{{duration-currentTime | secondsToMinutes }}\n </span>\n </div>\n </div>\n </div>\n\n</mat-card>\n\n<mat-card *ngIf=\"displayTitle\" style=\"border: 1px solid #ddd; box-shadow: none;\">\n <div class=\"p-1\" style=\"text-align: center;\">\n <div style=\"padding:1px 3px;\">\n <span *ngIf=\"!isPlaying\">{{ playlistTrack[1].title }}</span>\n <marquee *ngIf=\"isPlaying\" behavior=\"scroll\" direction=\"left\">{{ playlistTrack[1].title }}</marquee>\n </div>\n <div class=\"clear\"></div>\n </div>\n</mat-card>\n\n<mat-accordion *ngIf=\"displayPlaylist\">\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n Play List\n </mat-expansion-panel-header>\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z6\">\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef> Title </th>\n <td mat-cell *matCellDef=\"let element\" (click)=\"selectTrack(element.index)\"> {{element.title}} </td>\n </ng-container>\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef> </th>\n <td mat-cell *matCellDef=\"let element\">\n <div *ngIf=\"playlistTrack[1].title === element.title\">\n <fa-icon *ngIf=\"isPlaying\" class=\"fa\" [icon]=\"['fas','play']\" [spin]=\"true\" aria-hidden=\"true\"></fa-icon>\n <fa-icon *ngIf=\"!isPlaying\" class=\"fa\" [icon]=\"['fas','play']\" aria-hidden=\"true\"></fa-icon>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr class=\"mat-select-content\" mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-paginator [pageSizeOptions]=\"[2, 5, 10]\" showFirstLastButtons></mat-paginator>\n </mat-expansion-panel>\n</mat-accordion>", styles: ["@import url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap-grid.min.css);mat-card{padding:0!important}mat-slider{max-height:30px}table{width:100%}button:focus,button:hover{outline:0!important}.ngx-advanced-audio-player{min-width:275px}"] }] } ]; /** @nocollapse */ MatAdvancedAudioPlayerComponent.ctorParameters = () => [ { type: AudioPlayerService } ]; MatAdvancedAudioPlayerComponent.propDecorators = { displayTitle: [{ type: Input }], displayPlaylist: [{ type: Input }], matPaginator: [{ type: ViewChild, args: [MatPaginator,] }], playlist: [{ type: Input }] }; if (false) { /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.displayedColumns; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.timeLineDuration; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.dataSource; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.paginator; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.playlistData; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.displayTitle; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.displayPlaylist; /** @type {?} */ MatAdvancedAudioPlayerComponent.prototype.playlistTrack; /** * @type {?} * @private */ MatAdvancedAudioPlayerComponent.prototype.playlistService; /* Skipping unhandled member: ;*/ /* Skipping unhandled member: ;*/ /* Skipping unhandled member: ;*/ /* Skipping unhandled member: ;*/ /* Skipping unhandled member: ;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWFkdmFuY2VkLWF1ZGlvLXBsYXllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYXVkaW8tcGxheWVyLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9tYXQtYWR2YW5jZWQtYXVkaW8tcGxheWVyL21hdC1hZHZhbmNlZC1hdWRpby1wbGF5ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDN0YsT0FBTyxFQUFhLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBT2hGLE1BQU0sT0FBTywrQkFBZ0MsU0FBUSx3QkFBd0I7Ozs7SUFtQnpFLFlBQW9CLGVBQW1DO1FBQ25ELEtBQUssRUFBRSxDQUFDO1FBRFEsb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBakJ2RCxxQkFBZ0IsR0FBYSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUdqRCxlQUFVLEdBQUcsSUFBSSxrQkFBa0IsRUFBUyxDQUFDO0lBZ0I3QyxDQUFDOzs7O0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3RFLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0gs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Q0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRCxDQUFDO0lBQUEsQ0FBQzs7Ozs7SUFFRixXQUFXLENBQUMsS0FBYTtRQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0lBQUEsQ0FBQzs7OztJQUVGLDJDQUEyQztRQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFBLENBQUM7Ozs7O0lBRUYsSUFDSSxRQUFRLENBQUMsUUFBaUI7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7OztZQTdHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsaXRIQUF5RDs7YUFFNUQ7Ozs7WUFUUSxrQkFBa0I7OzsyQkFxQnRCLEtBQUs7OEJBR0wsS0FBSzsyQkFvQkwsU0FBUyxTQUFDLFlBQVk7dUJBa0V0QixLQUFLOzs7O0lBbEdOLDJEQUFpRDs7SUFDakQsMkRBQTRCOztJQUU1QixxREFBNkM7O0lBRTdDLG9EQUF3Qjs7SUFFeEIsdURBQXNCOztJQUV0Qix1REFDbUI7O0lBRW5CLDBEQUNzQjs7SUFFdEIsd0RBQW1COzs7OztJQUVQLDBEQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdWRpb1BsYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2F1ZGlvLXBsYXllci1zZXJ2aWNlL2F1ZGlvLXBsYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFNsaWRlciwgTWF0UGFnaW5hdG9yLCBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uLy4uL21vZGVsL3RyYWNrLm1vZGVsJztcbmltcG9ydCB7IEJhc2VBdWRpb1BsYXllckZ1bmN0aW9ucyB9IGZyb20gJy4uL2Jhc2UvYmFzZS1hdWRpby1wbGF5ZXItY29tcG9uZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbWF0LWFkdmFuY2VkLWF1ZGlvLXBsYXllcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21hdC1hZHZhbmNlZC1hdWRpby1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL21hdC1hZHZhbmNlZC1hdWRpby1wbGF5ZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1hdEFkdmFuY2VkQXVkaW9QbGF5ZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQXVkaW9QbGF5ZXJGdW5jdGlvbnMgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ3RpdGxlJywgJ3N0YXR1cyddO1xuICAgIHRpbWVMaW5lRHVyYXRpb246IE1hdFNsaWRlcjtcblxuICAgIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFRyYWNrPigpO1xuXG4gICAgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgICBwbGF5bGlzdERhdGE6IFRyYWNrW107XG5cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlUaXRsZTogdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheVBsYXlsaXN0OiB0cnVlO1xuXG4gICAgcGxheWxpc3RUcmFjazogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwbGF5bGlzdFNlcnZpY2U6IEF1ZGlvUGxheWVyU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldERhdGFTb3VyY2VBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHRoaXMuYmluZFBsYXllckV2ZW50KCk7XG4gICAgICAgIHRoaXMucGxheWxpc3RTZXJ2aWNlLnNldFBsYXlsaXN0KHRoaXMucGxheWxpc3REYXRhKTtcbiAgICAgICAgdGhpcy5wbGF5bGlzdFNlcnZpY2UuZ2V0U3ViamVjdEN1cnJlbnRUcmFjaygpLnN1YnNjcmliZSgocGxheWxpc3RUcmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbGF5bGlzdFRyYWNrID0gcGxheWxpc3RUcmFjaztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICB0aGlzLnBsYXlsaXN0U2VydmljZS5pbml0KCk7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHNldCBtYXRQYWdpbmF0b3IobXA6IE1hdFBhZ2luYXRvcikge1xuICAgICAgICB0aGlzLnBhZ2luYXRvciA9IG1wO1xuICAgICAgICB0aGlzLnNldERhdGFTb3VyY2VBdHRyaWJ1dGVzKCk7XG4gICAgfVxuXG4gICAgc2V0RGF0YVNvdXJjZUF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICAgIGlmICh0aGlzLnBsYXlsaXN0RGF0YSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5bGlzdERhdGEuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxUcmFjaz4odGhpcy5wbGF5bGlzdERhdGEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dFNvbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICgoKHRoaXMucGxheWxpc3RTZXJ2aWNlLmluZGV4U29uZyArIDEpICUgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUpID09PSAwIHx8XG4gICAgICAgICAgICAodGhpcy5wbGF5bGlzdFNlcnZpY2UuaW5kZXhTb25nICsgMSkgPT09IHRoaXMucGFnaW5hdG9yLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yLmhhc05leHRQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5uZXh0UGFnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wYWdpbmF0b3IuaGFzTmV4dFBhZ2UoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMC4wMTtcbiAgICAgICAgdGhpcy5wbGF5bGlzdFNlcnZpY2UubmV4dFNvbmcoKTtcbiAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfTtcblxuICAgIHByZXZpb3VzU29uZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwLjAxO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tJZlNvbmdIYXNTdGFydGVkU2luY2VBdGxlYXN0VHdvU2Vjb25kcygpKSB7XG4gICAgICAgICAgICBpZiAoKCh0aGlzLnBsYXlsaXN0U2VydmljZS5pbmRleFNvbmcpICUgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUpID09PSAwIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMucGxheWxpc3RTZXJ2aWNlLmluZGV4U29uZykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IuaGFzUHJldmlvdXNQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucHJldmlvdXNQYWdlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wYWdpbmF0b3IuaGFzUHJldmlvdXNQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IubGFzdFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBsYXlsaXN0U2VydmljZS5wcmV2aW91c1NvbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTb25nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfTtcblxuICAgIHJlc2V0U29uZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIubmF0aXZlRWxlbWVudC5zcmMgPSB0aGlzLnBsYXlsaXN0VHJhY2tbMV0ubGluaztcbiAgICB9O1xuXG4gICAgc2VsZWN0VHJhY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnc2VsZWN0VHJhY2soaW5kZXg6IG51bWJlcik6IHZvaWQ6ICcgKyBpbmRleCk7XG4gICAgICAgIHRoaXMucGxheWxpc3RTZXJ2aWNlLnNlbGVjdEFUcmFjayhpbmRleCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIubmF0aXZlRWxlbWVudC5wbGF5KCk7XG4gICAgICAgIH0sIDApO1xuICAgIH07XG5cbiAgICBjaGVja0lmU29uZ0hhc1N0YXJ0ZWRTaW5jZUF0bGVhc3RUd29TZWNvbmRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSA+IDI7XG4gICAgfTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHBsYXlsaXN0KHBsYXlsaXN0OiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMucGxheWxpc3REYXRhID0gcGxheWxpc3Q7XG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG59Il19