@dicdikshaorg/video-player-v9
Version:
Contains Video player library components powered by angular. These components are designed to be used in sunbird consumption platforms *(mobile app, web portal, offline desktop app)* to drive reusability, maintainability hence reducing the redundant devel
444 lines • 49.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/sunbird-video-player.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { ErrorService, errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9';
import { ViewerService } from './services/viewer.service';
import { SunbirdVideoPlayerService } from './sunbird-video-player.service';
export class SunbirdVideoPlayerComponent {
/**
* @param {?} videoPlayerService
* @param {?} viewerService
* @param {?} cdr
* @param {?} renderer2
* @param {?} errorService
*/
constructor(videoPlayerService, viewerService, cdr, renderer2, errorService) {
this.videoPlayerService = videoPlayerService;
this.viewerService = viewerService;
this.cdr = cdr;
this.renderer2 = renderer2;
this.errorService = errorService;
this.telemetryEvent = new EventEmitter();
this.viewState = 'player';
this.showControls = true;
this.sideMenuConfig = {
showShare: true,
showDownload: true,
showReplay: true,
showExit: true
};
this.isPaused = false;
this.showQumlPlayer = false;
this.QumlPlayerConfig = {};
this.isFullScreen = false;
this.raiseInternetDisconnectionError = (/**
* @return {?}
*/
() => {
/** @type {?} */
const code = errorCode.internetConnectivity;
/** @type {?} */
const message = errorMessage.internetConnectivity;
/** @type {?} */
const stacktrace = `${code}: ${message}`;
this.viewerService.raiseExceptionLog(code, message, stacktrace, this.traceId);
});
this.playerEvent = this.viewerService.playerEvent;
this.viewerService.playerEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
if (event.type === 'pause') {
this.isPaused = true;
this.showControls = true;
}
if (event.type === 'play') {
this.isPaused = false;
}
if (event.type === 'loadstart') {
this.viewerService.raiseStartEvent(event);
}
if (event.type === 'ended') {
this.viewerService.endPageSeen = true;
this.viewerService.raiseEndEvent();
this.viewState = 'end';
}
if (event.type === 'error') {
// tslint:disable-next-line:one-variable-per-declaration
/** @type {?} */
let code = errorCode.contentLoadFails;
/** @type {?} */
let message = errorMessage.contentLoadFails;
if (this.viewerService.isAvailableLocally) {
code = errorCode.contentLoadFails;
message = errorMessage.contentLoadFails;
}
if (code === errorCode.contentLoadFails) {
this.showContentError = true;
}
this.viewerService.raiseExceptionLog(code, message, event, this.traceId);
}
// tslint:disable-next-line:max-line-length
/** @type {?} */
const events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' },
{ type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }];
events.forEach((/**
* @param {?} data
* @return {?}
*/
data => {
if (event.type === data.type) {
this.viewerService.raiseHeartBeatEvent(data.telemetryEvent);
}
}));
}));
console.log(this.playVideoFromTimestamp, 'this is playvideotime');
}
/**
* @param {?} event
* @return {?}
*/
onTelemetryEvent(event) {
this.telemetryEvent.emit(event.detail);
}
/**
* @return {?}
*/
ngOnInit() {
console.log('sunbird-video-player.component=====');
if (typeof this.playerConfig === 'string') {
try {
this.playerConfig = JSON.parse(this.playerConfig);
}
catch (error) {
console.error('Invalid playerConfig: ', error);
}
}
setInterval((/**
* @return {?}
*/
() => {
if (!this.isPaused) {
this.showControls = false;
}
}), 5000);
/* tslint:disable:no-string-literal */
this.nextContent = this.playerConfig.config.nextContent;
this.traceId = this.playerConfig.config['traceId'];
this.sideMenuConfig = Object.assign(Object.assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu);
this.videoPlayerService.initialize(this.playerConfig);
this.viewerService.initialize(this.playerConfig);
window.addEventListener('offline', this.raiseInternetDisconnectionError, true);
this.QumlPlayerConfig.config = this.playerConfig.config;
this.QumlPlayerConfig.config.sideMenu.enable = false;
this.QumlPlayerConfig.context = this.playerConfig.context;
this.setTelemetryObjectRollup(this.playerConfig.metadata.identifier);
// setTimeout(() => {
// console.log('sunbird-video-player.component=====setTimeout')
// this.playVideoFromTimestamp = 300;
// }, 5000);
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.action) {
if (!this.showQumlPlayer) {
this.playerAction = this.action;
}
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
/** @type {?} */
const videoPlayerElement = this.videoPlayerRef.nativeElement;
this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', (/**
* @return {?}
*/
() => {
this.showControls = true;
}));
this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', (/**
* @return {?}
*/
() => {
this.showControls = true;
}));
/** @type {?} */
const contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel'];
if (contentCompabilityLevel) {
/** @type {?} */
const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel);
if (!checkContentCompatible['isCompitable']) {
// tslint:disable-next-line:max-line-length
this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible['error']['message'], this.traceId);
}
}
}
/**
* @param {?} event
* @return {?}
*/
sideBarEvents(event) {
this.playerEvent.emit(event);
if (event.type === 'DOWNLOAD') {
this.downloadVideo();
}
/** @type {?} */
const events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE'];
events.forEach((/**
* @param {?} data
* @return {?}
*/
data => {
if (event.type === data) {
this.viewerService.raiseHeartBeatEvent(data);
}
if (event.type === 'EXIT') {
this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU');
}
}));
}
/**
* @param {?} id
* @return {?}
*/
setTelemetryObjectRollup(id) {
if (this.QumlPlayerConfig.context) {
/** @type {?} */
const hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup;
if (!hasObjectRollup) {
this.QumlPlayerConfig.context.objectRollup = {};
}
/** @type {?} */
const levels = Object.keys(this.QumlPlayerConfig.context.objectRollup);
this.QumlPlayerConfig.context.objectRollup[`l${levels.length + 1}`] = id;
}
}
/**
* @param {?} event
* @return {?}
*/
playContent(event) {
this.viewerService.raiseHeartBeatEvent(event.type);
}
/**
* @param {?} event
* @return {?}
*/
replayContent(event) {
this.playerEvent.emit(event);
this.viewState = 'player';
this.viewerService.isEndEventRaised = false;
this.viewerService.raiseHeartBeatEvent('REPLAY');
}
/**
* @param {?} event
* @return {?}
*/
exitContent(event) {
this.playerEvent.emit(event);
this.viewerService.raiseHeartBeatEvent('EXIT');
}
/**
* @return {?}
*/
downloadVideo() {
/** @type {?} */
const a = document.createElement('a');
a.href = this.viewerService.artifactUrl;
a.download = this.viewerService.contentName;
a.target = '_blank';
document.body.appendChild(a);
a.click();
a.remove();
this.viewerService.raiseHeartBeatEvent('DOWNLOAD');
}
/**
* @param {?} event
* @return {?}
*/
qumlPlayerEvents(event) {
if (event.eid === 'QUML_SUMMARY') {
this.showQumlPlayer = false;
/** @type {?} */
const score = parseInt(event.edata.extra.find((/**
* @param {?} p
* @return {?}
*/
p => p.id === 'score'))['value'], 10);
this.viewerService.interceptionResponses[this.currentInterceptionTime] = {
score,
isSkipped: false
};
/** @type {?} */
const interceptPointElement = document.querySelector(`[data-marker-time="${this.currentInterceptionTime}"]`);
if (interceptPointElement) {
interceptPointElement['style'].background = 'green';
}
this.videoInstance.play();
this.videoInstance.controls(true);
this.viewerService.raiseImpressionEvent('video');
// if currently video is not in full screen and was previously full screen then set it back to full screen again
if (!document.fullscreenElement && this.isFullScreen) {
if (document.getElementsByClassName('video-js')[0]) {
document.getElementsByClassName('video-js')[0].requestFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
(err) => console.error(err)));
}
}
}
}
/**
* @param {?} __0
* @return {?}
*/
questionSetData({ response, time, identifier }) {
this.QumlPlayerConfig.metadata = response;
this.QumlPlayerConfig.metadata['showStartPage'] = 'No';
this.QumlPlayerConfig.metadata['showEndPage'] = 'No';
this.currentInterceptionTime = time;
this.currentInterceptionUIId = identifier;
if (document.fullscreenElement) {
this.isFullScreen = true;
document.exitFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
(err) => console.error(err)));
}
else {
this.isFullScreen = false;
}
this.showQumlPlayer = true;
this.viewerService.raiseImpressionEvent('interactive-question-set', { id: identifier, type: 'QuestionSet' });
this.viewerService.raiseHeartBeatEvent('VIDEO_MARKER_SELECTED', {
identifier,
// Question set id,
type: 'QuestionSet',
// Type of interaction
interceptedAt: time // Time when the interception happened
});
}
/**
* @param {?} event
* @return {?}
*/
playerInstance(event) {
this.videoInstance = event;
}
/**
* @return {?}
*/
ngOnDestroy() {
this.viewerService.raiseEndEvent();
this.unlistenTouchStart();
this.unlistenMouseMove();
this.viewerService.isEndEventRaised = false;
window.removeEventListener('offline', this.raiseInternetDisconnectionError, true);
}
}
SunbirdVideoPlayerComponent.decorators = [
{ type: Component, args: [{
selector: 'sunbird-video-player',
template: "<div class=\"sunbird-video-player-container\" #videoPlayer [ngClass]=\"showQumlPlayer ? 'videoPlayerHide': 'videoPlayerShow'\">\r\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\r\n\r\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\r\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\" [playVideoFromTimestamp]=\"playVideoFromTimestamp\">\r\n </video-player>\r\n <sb-player-sidebar *ngIf=\"viewState ==='player'\"\r\n [title]=\"viewerService.contentName\"\r\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <sb-player-end-page \r\n [contentName]=\"viewerService.contentName\" \r\n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \r\n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\r\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \r\n [showExit]=\"sideMenuConfig.showExit\"\r\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \r\n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\r\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\r\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n\r\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\r\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\r\n</div>",
styles: [".sunbird-video-player-container{width:100%;height:100%;overflow:hidden;position:relative}.videoPlayerHide{display:none}.videoPlayerShow{display:block}pdf-menu{position:absolute;top:0;left:0;z-index:99}.BtmNotVisible,.notVisible{transition:1s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:0 0!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label{background:rgba(51,51,51,.5)}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-pdf-player{overflow:hidden}::ng-deep .pdfViewer .page{background:0 0!important;-o-border-image:none!important;border-image:none!important;border:0!important}::ng-deep #toolbarContainer{background:0 0!important;height:auto!important}::ng-deep #viewerContainer{position:relative!important;height:calc(100% - 3rem)}::ng-deep .body,::ng-deep .html,::ng-deep .pdf-viewer button,::ng-deep .pdf-viewer input,::ng-deep .pdf-viewer select{font-size:inherit!important}::ng-deep .findbar,::ng-deep .secondaryToolbar,::ng-deep html[dir=ltr] #toolbarContainer,::ng-deep html[dir=rtl] #toolbarContainer{box-shadow:none!important}::ng-deep .zoom{min-height:inherit!important}::ng-deep html[dir=rtl] .sb-pdf-reading-status{left:auto;right:1rem}.sb-pdf-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:1rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-pdf-reading-status span{background:var(--gray-800);width:.25rem;height:.25rem;display:block;margin:0 .5rem;border-radius:50%}.sbt-pdf-footer{background:var(--white);position:absolute;bottom:0;width:100%;height:3rem;display:flex;align-items:center;justify-content:flex-end;padding:.75rem .5rem}@media all and (orientation:landscape){::ng-deep .visible-only-potrait{display:none}}@media all and (orientation:portrait){::ng-deep #viewerContainer{height:calc(100% - 6rem)!important}::ng-deep .visible-only-landscape{display:none}::ng-deep .visible-only-potrait{display:block}::ng-deep .file-download__popup{height:15.125rem}::ng-deep .pdf-endpage{display:block!important;position:relative}::ng-deep .pdf-endpage__left-panel{margin-top:6rem}::ng-deep .pdf-endpage__right-panel .title-section{position:absolute;top:0;left:0;right:0}}@media all and (max-width:640px){.visible-only-landscape{display:none}.visible-only-potrait{display:block}}@media all and (min-width:640px){.visible-only-landscape{display:block}.visible-only-potrait{display:none}}"]
}] }
];
/** @nocollapse */
SunbirdVideoPlayerComponent.ctorParameters = () => [
{ type: SunbirdVideoPlayerService },
{ type: ViewerService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: ErrorService }
];
SunbirdVideoPlayerComponent.propDecorators = {
playerConfig: [{ type: Input }],
playVideoFromTimestamp: [{ type: Input }],
action: [{ type: Input }],
playerEvent: [{ type: Output }],
telemetryEvent: [{ type: Output }],
videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: true },] }],
onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }],
ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }]
};
if (false) {
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playVideoFromTimestamp;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.action;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.telemetryEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerRef;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewState;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.traceId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.nextContent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showContentError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showControls;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.sideMenuConfig;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenTouchStart;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenMouseMove;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isPaused;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showQumlPlayer;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.QumlPlayerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoInstance;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionTime;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionUIId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isFullScreen;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerAction;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.raiseInternetDisconnectionError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.renderer2;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.errorService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpY2Rpa3NoYW9yZy92aWRlby1wbGF5ZXItdjkvIiwic291cmNlcyI6WyJsaWIvc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFDakUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQWlCLFNBQVMsRUFDOUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRyxTQUFTLEVBQUcsWUFBWSxFQUFpQixNQUFNLHdDQUF3QyxDQUFDO0FBSWhILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU0zRSxNQUFNLE9BQU8sMkJBQTJCOzs7Ozs7OztJQThCdEMsWUFDUyxrQkFBNkMsRUFDN0MsYUFBNEIsRUFDNUIsR0FBc0IsRUFDckIsU0FBb0IsRUFDckIsWUFBMEI7UUFKMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBN0J6QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRFLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFJckIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsbUJBQWMsR0FBRztZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFD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QXlCO1lBRHpCLGFBQWE7WUFQcEIsaUJBQWlCO1lBQ21DLFNBQVM7WUFFdEQsWUFBWTs7OzJCQWFsQixLQUFLO3FDQUNMLEtBQUs7cUJBQ0wsS0FBSzswQkFDTCxNQUFNOzZCQUNOLE1BQU07NkJBQ04sU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7K0JBeUV6QyxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7MEJBbUxsRCxZQUFZLFNBQUMscUJBQXFCOzs7O0lBalFuQyxtREFBb0M7O0lBQ3BDLDZEQUF5Qzs7SUFDekMsNkNBQTBCOztJQUMxQixrREFBNEM7O0lBQzVDLHFEQUFzRTs7SUFDdEUscURBQXVFOztJQUN2RSxnREFBcUI7O0lBQ3JCLDhDQUF1Qjs7SUFDdkIsa0RBQXdCOztJQUN4Qix1REFBMEI7O0lBQzFCLG1EQUFvQjs7SUFDcEIscURBS0U7Ozs7O0lBQ0YseURBQXVDOzs7OztJQUN2Qyx3REFBc0M7O0lBQ3RDLCtDQUFpQjs7SUFDakIscURBQXVCOztJQUN2Qix1REFBMkI7O0lBQzNCLG9EQUFtQjs7SUFDbkIsOERBQXdCOztJQUN4Qiw4REFBd0I7O0lBQ3hCLG1EQUFxQjs7SUFDckIsbURBQXNCOztJQW1HdEIsc0VBS0M7O0lBckdDLHlEQUFvRDs7SUFDcEQsb0RBQW1DOztJQUNuQywwQ0FBNkI7Ozs7O0lBQzdCLGdEQUE0Qjs7SUFDNUIsbURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhyb3dTdG10IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIFJlbmRlcmVyMiwgT25EZXN0cm95XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVycm9yU2VydmljZSAsIGVycm9yQ29kZSAsIGVycm9yTWVzc2FnZSwgSVNpZGVCYXJFdmVudCB9IGZyb20gJ0Bwcm9qZWN0LXN1bmJpcmQvc3VuYmlyZC1wbGF5ZXItc2RrLXY5JztcclxuXHJcbmltcG9ydCB7IFBsYXllckNvbmZpZyB9IGZyb20gJy4vcGxheWVySW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IElBY3Rpb24gfSBmcm9tICcuL3BsYXllckludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy92aWV3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1bmJpcmRWaWRlb1BsYXllclNlcnZpY2UgfSBmcm9tICcuL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3N1bmJpcmQtdmlkZW8tcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFN1bmJpcmRWaWRlb1BsYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFBsYXllckNvbmZpZztcclxuICBASW5wdXQoKSBwbGF5VmlkZW9Gcm9tVGltZXN0YW1wOiBudW1iZXIgO1xyXG4gIEBJbnB1dCgpIGFjdGlvbj86IElBY3Rpb247XHJcbiAgQE91dHB1dCgpIHBsYXllckV2ZW50OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBAT3V0cHV0KCkgdGVsZW1ldHJ5RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQFZpZXdDaGlsZCgndmlkZW9QbGF5ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aWRlb1BsYXllclJlZjogRWxlbWVudFJlZjtcclxuICB2aWV3U3RhdGUgPSAncGxheWVyJztcclxuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xyXG4gIHB1YmxpYyBuZXh0Q29udGVudDogYW55O1xyXG4gIHNob3dDb250ZW50RXJyb3I6IGJvb2xlYW47XHJcbiAgc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICBzaWRlTWVudUNvbmZpZyA9IHtcclxuICAgIHNob3dTaGFyZTogdHJ1ZSxcclxuICAgIHNob3dEb3dubG9hZDogdHJ1ZSxcclxuICAgIHNob3dSZXBsYXk6IHRydWUsXHJcbiAgICBzaG93RXhpdDogdHJ1ZVxyXG4gIH07XHJcbiAgcHJpdmF0ZSB1bmxpc3RlblRvdWNoU3RhcnQ6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlTW92ZTogKCkgPT4gdm9pZDtcclxuICBpc1BhdXNlZCA9IGZhbHNlO1xyXG4gIHNob3dRdW1sUGxheWVyID0gZmFsc2U7XHJcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XHJcbiAgdmlkZW9JbnN0YW5jZTogYW55O1xyXG4gIGN1cnJlbnRJbnRlcmNlcHRpb25UaW1lO1xyXG4gIGN1cnJlbnRJbnRlcmNlcHRpb25VSUlkO1xyXG4gIGlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIHBsYXllckFjdGlvbjogSUFjdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXHJcbiAgICBwdWJsaWMgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQgPSB0aGlzLnZpZXdlclNlcnZpY2UucGxheWVyRXZlbnQ7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucGxheWVyRXZlbnQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYXVzZScpIHtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwbGF5Jykge1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xvYWRzdGFydCcpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2VuZGVkJykge1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5lbmRQYWdlU2VlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcclxuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9ICdlbmQnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cclxuICAgICAgICBsZXQgY29kZSA9IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzLFxyXG4gICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdlclNlcnZpY2UuaXNBdmFpbGFibGVMb2NhbGx5KSB7XHJcbiAgICAgICAgICAgIGNvZGUgPSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscztcclxuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29kZSA9PT0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHMpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhjb2RlLCBtZXNzYWdlLCBldmVudCwgdGhpcy50cmFjZUlkKTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBldmVudHMgPSBbeyB0eXBlOiAndm9sdW1lY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdWT0xVTUVfQ0hBTkdFJyB9LCB7IHR5cGU6ICdzZWVraW5nJywgdGVsZW1ldHJ5RXZlbnQ6ICdEUkFHJyB9LCB7IHR5cGU6ICdmdWxsc2NyZWVuJywgdGVsZW1ldHJ5RXZlbnQ6ICdGVUxMU0NSRUVOJyB9LFxyXG4gICAgICB7IHR5cGU6ICdyYXRlY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdSQVRFX0NIQU5HRScgfV07XHJcbiAgICAgIGV2ZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhLnR5cGUpIHtcclxuICAgICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGRhdGEudGVsZW1ldHJ5RXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMucGxheVZpZGVvRnJvbVRpbWVzdGFtcCwndGhpcyBpcyBwbGF5dmlkZW90aW1lJylcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcclxuICBvblRlbGVtZXRyeUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc29sZS5sb2coJ3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudD09PT09JylcclxuICAgIGlmICh0eXBlb2YgdGhpcy5wbGF5ZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXJDb25maWcgPSBKU09OLnBhcnNlKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHBsYXllckNvbmZpZzogJywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MDAwKTtcclxuXHJcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1zdHJpbmctbGl0ZXJhbCAqL1xyXG4gICAgdGhpcy5uZXh0Q29udGVudCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5uZXh0Q29udGVudDtcclxuICAgIHRoaXMudHJhY2VJZCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZ1sndHJhY2VJZCddO1xyXG4gICAgdGhpcy5zaWRlTWVudUNvbmZpZyA9IHsgLi4udGhpcy5zaWRlTWVudUNvbmZpZywgLi4udGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51IH07XHJcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdGhpcy5yYWlzZUludGVybmV0RGlzY29ubmVjdGlvbkVycm9yICwgdHJ1ZSk7XHJcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbmZpZy5zaWRlTWVudS5lbmFibGUgPSBmYWxzZTtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0ID0gdGhpcy5wbGF5ZXJDb25maWcuY29udGV4dDtcclxuICAgIHRoaXMuc2V0VGVsZW1ldHJ5T2JqZWN0Um9sbHVwKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIpO1xyXG5cclxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygnc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50PT09PT1zZXRUaW1lb3V0JylcclxuICAgIC8vICAgdGhpcy5wbGF5VmlkZW9Gcm9tVGltZXN0YW1wID0gMzAwO1xyXG4gICAgLy8gfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5hY3Rpb24pIHtcclxuICAgICAgaWYgKCF0aGlzLnNob3dRdW1sUGxheWVyKSB7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXJBY3Rpb24gPSB0aGlzLmFjdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciA9ICgpID0+IHtcclxuICAgIGNvbnN0IGNvZGUgPSBlcnJvckNvZGUuaW50ZXJuZXRDb25uZWN0aXZpdHk7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlLmludGVybmV0Q29ubmVjdGl2aXR5O1xyXG4gICAgY29uc3Qgc3RhY2t0cmFjZSA9IGAke2NvZGV9OiAke21lc3NhZ2V9YDtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhjb2RlLCBtZXNzYWdlLCBzdGFja3RyYWNlLCB0aGlzLnRyYWNlSWQpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgdmlkZW9QbGF5ZXJFbGVtZW50ID0gdGhpcy52aWRlb1BsYXllclJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTW92ZSA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICdtb3VzZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudW5saXN0ZW5Ub3VjaFN0YXJ0ID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKHZpZGVvUGxheWVyRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRDb21wYWJpbGl0eUxldmVsID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGFbJ2NvbXBhdGliaWxpdHlMZXZlbCddO1xyXG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrQ29udGVudENvbXBhdGlibGUgPSB0aGlzLmVycm9yU2VydmljZS5jaGVja0NvbnRlbnRDb21wYXRpYmlsaXR5KGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKTtcclxuICAgICAgaWYgKCFjaGVja0NvbnRlbnRDb21wYXRpYmxlWydpc0NvbXBpdGFibGUnXSkge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBlcnJvck1lc3NhZ2UuY29udGVudENvbXBhdGliaWxpdHksIGNoZWNrQ29udGVudENvbXBhdGlibGVbJ2Vycm9yJ11bJ21lc3NhZ2UnXSwgdGhpcy50cmFjZUlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2lkZUJhckV2ZW50cyhldmVudDogSVNpZGVCYXJFdmVudCkge1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIGlmIChldmVudC50eXBlID09PSAnRE9XTkxPQUQnKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRWaWRlbygpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZXZlbnRzID0gWydTSEFSRScsICdET1dOTE9BRF9NRU5VJywgJ0VYSVQnLCAnQ0xPU0VfTUVOVScsICdPUEVOX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJywgJ0RPV05MT0FEX1BPUFVQX0NMT1NFJ107XHJcbiAgICBldmVudHMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IGRhdGEpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0VYSVQnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNpZGViYXJNZW51RXZlbnQuZW1pdCgnQ0xPU0VfTUVOVScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFRlbGVtZXRyeU9iamVjdFJvbGx1cChpZCkge1xyXG4gICAgaWYgKHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0KSB7XHJcbiAgICAgIGNvbnN0IGhhc09iamVjdFJvbGx1cCA9IHRoaXMuUXVtbFBsYXllckNvbmZpZyAmJiB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCAmJiB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dC5vYmplY3RSb2xsdXA7XHJcbiAgICAgIGlmICghaGFzT2JqZWN0Um9sbHVwKSB7XHJcbiAgICAgICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwID0ge307XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGV2ZWxzID0gT2JqZWN0LmtleXModGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwKTtcclxuICAgICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwW2BsJHtsZXZlbHMubGVuZ3RoICsgIDF9YF0gPSBpZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBsYXlDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudC50eXBlKTtcclxuICB9XHJcblxyXG4gIHJlcGxheUNvbnRlbnQoZXZlbnQpIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICB0aGlzLnZpZXdTdGF0ZSA9ICdwbGF5ZXInO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdSRVBMQVknKTtcclxuICB9XHJcblxyXG4gIGV4aXRDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0VYSVQnKTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkVmlkZW8oKSB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdGhpcy52aWV3ZXJTZXJ2aWNlLmFydGlmYWN0VXJsO1xyXG4gICAgYS5kb3dubG9hZCA9IHRoaXMudmlld2VyU2VydmljZS5jb250ZW50TmFtZTtcclxuICAgIGEudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgYS5jbGljaygpO1xyXG4gICAgYS5yZW1vdmUoKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdET1dOTE9BRCcpO1xyXG4gIH1cclxuXHJcbiAgcXVtbFBsYXllckV2ZW50cyhldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmVpZCA9PT0gJ1FVTUxfU1VNTUFSWScpIHtcclxuICAgICAgdGhpcy5zaG93UXVtbFBsYXllciA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBzY29yZSA9IHBhcnNlSW50KGV2ZW50LmVkYXRhLmV4dHJhLmZpbmQocCA9PiBwLmlkID09PSAnc2NvcmUnKVsndmFsdWUnXSwgMTApO1xyXG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW50ZXJjZXB0aW9uUmVzcG9uc2VzW3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWVdID0ge1xyXG4gICAgICAgIHNjb3JlLFxyXG4gICAgICAgIGlzU2tpcHBlZDogZmFsc2VcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgaW50ZXJjZXB0UG9pbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbWFya2VyLXRpbWU9XCIke3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWV9XCJdYCk7XHJcbiAgICAgIGlmIChpbnRlcmNlcHRQb2ludEVsZW1lbnQpIHtcclxuICAgICAgICBpbnRlcmNlcHRQb2ludEVsZW1lbnRbJ3N0eWxlJ10uYmFja2dyb3VuZCA9ICdncmVlbic7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLmNvbnRyb2xzKHRydWUpO1xyXG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VJbXByZXNzaW9uRXZlbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIC8vIGlmIGN1cnJlbnRseSB2aWRlbyBpcyBub3QgaW4gZnVsbCBzY3JlZW4gYW5kIHdhcyBwcmV2aW91c2x5IGZ1bGwgc2NyZWVuIHRoZW4gc2V0IGl0IGJhY2sgdG8gZnVsbCBzY3JlZW4gYWdhaW5cclxuICAgICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAmJiB0aGlzLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlby1qcycpWzBdKSB7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlby1qcycpWzBdLnJlcXVlc3RGdWxsc2NyZWVuKClcclxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcXVlc3Rpb25TZXREYXRhKHtyZXNwb25zZSwgdGltZSwgaWRlbnRpZmllcn0pIHtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5tZXRhZGF0YSA9IHJlc3BvbnNlO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93U3RhcnRQYWdlJ10gPSAnTm8nO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93RW5kUGFnZSddID0gJ05vJztcclxuICAgIHRoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5jdXJyZW50SW50ZXJjZXB0aW9uVUlJZCA9IGlkZW50aWZpZXI7XHJcbiAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG4gICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCdpbnRlcmFjdGl2ZS1xdWVzdGlvbi1zZXQnLCB7IGlkOiBpZGVudGlmaWVyLCB0eXBlOiAnUXVlc3Rpb25TZXQnIH0pO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCcsIHtcclxuICAgICAgaWRlbnRpZmllciwgLy8gUXVlc3Rpb24gc2V0IGlkLFxyXG4gICAgICB0eXBlOiAnUXVlc3Rpb25TZXQnLCAvLyBUeXBlIG9mIGludGVyYWN0aW9uXHJcbiAgICAgIGludGVyY2VwdGVkQXQ6IHRpbWUgLy8gVGltZSB3aGVuIHRoZSBpbnRlcmNlcHRpb24gaGFwcGVuZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcGxheWVySW5zdGFuY2UoZXZlbnQpIHtcclxuICAgIHRoaXMudmlkZW9JbnN0YW5jZSA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcpXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFbmRFdmVudCgpO1xyXG4gICAgdGhpcy51bmxpc3RlblRvdWNoU3RhcnQoKTtcclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUoKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIHRoaXMucmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciAsIHRydWUpO1xyXG4gIH1cclxufVxyXG4iXX0=