@dicdikshaorg/epub-player-v9
Version:
Contains Epub 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 develo
206 lines • 25.8 kB
JavaScript
import { __awaiter } from "tslib";
import { ViewChild, Component, ElementRef, Input, EventEmitter, Output } from '@angular/core';
import Epub from 'epubjs';
import { ViwerService } from '../services/viewerService/viwer-service';
import { epubPlayerConstants as fromConst } from '../sunbird-epub.constant';
import { errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9';
import { UtilService } from '../services/utilService/util.service';
const MAX_TIME_TO_LOAD_SPINE = 5 * 60 * 1000; // 5 minutes
export class EpubViewerComponent {
constructor(viwerService, utilService) {
this.viwerService = viwerService;
this.utilService = utilService;
this.actions = new EventEmitter();
this.showFullScreen = false;
this.viewerEvent = new EventEmitter();
}
ngOnInit() {
this.idForRendition = `${this.identifier}-content`;
}
ngOnChanges(changes) {
var _a;
if (this.rendition && !((_a = changes === null || changes === void 0 ? void 0 : changes.showFullScreen) === null || _a === void 0 ? void 0 : _a.firstChange)) {
this.rendition.resize();
}
}
ngAfterViewInit() {
return __awaiter(this, void 0, void 0, function* () {
try {
if (!this.viwerService.isAvailableLocally) {
this.epubBlob = yield this.viwerService.isValidEpubSrc(this.epubSrc);
this.eBook = Epub(this.epubBlob);
}
else if (this.viwerService.isAvailableLocally) {
this.eBook = Epub(this.epubSrc);
}
this.rendition = this.eBook.renderTo(this.idForRendition, {
flow: 'paginated',
width: '100%',
});
this.rendition.on('layout', (layout) => {
var _a, _b;
this.viwerService.totalNumberOfPages = (_b = (_a = this.eBook) === null || _a === void 0 ? void 0 : _a.navigation) === null || _b === void 0 ? void 0 : _b.length;
if (this.eBook.navigation.length > 2) {
this.rendition.spread('none');
this.rendition.flow('scrolled');
this.scrolled = true;
}
else {
this.rendition.spread('auto');
this.scrolled = false;
}
});
this.rendition.on('displayError', (error) => {
this.emitErrorEvent();
});
const spine = yield this.utilService.fulfillWithTimeLimit(MAX_TIME_TO_LOAD_SPINE, this.eBook.loaded.spine, null);
if (spine) {
this.displayEpub();
this.lastSection = spine.last();
this.viewerEvent.emit({
type: fromConst.EPUBLOADED,
data: spine
});
this.handleActions(spine);
}
else {
this.emitErrorEvent();
}
}
catch (error) {
this.emitErrorEvent();
}
});
}
displayEpub() {
const { currentLocation } = this.config;
if (!currentLocation) {
this.rendition.display();
}
this.eBook.ready.then(() => {
return this.eBook.locations.generate(1000);
}).then((locations) => {
var _a, _b;
const totalPages = (_b = (_a = this.eBook) === null || _a === void 0 ? void 0 : _a.spine) === null || _b === void 0 ? void 0 : _b.length;
this.viwerService.totalNumberOfPages = totalPages ? (totalPages - 1) : 0;
if (currentLocation) {
const cfi = this.eBook.locations.cfiFromPercentage(Number(currentLocation));
this.rendition.display(cfi);
}
});
}
handleActions(spine) {
this.actions.subscribe((event) => {
var _a, _b;
const type = event.type;
if ((_b = (_a = this.rendition) === null || _a === void 0 ? void 0 : _a.location) === null || _b === void 0 ? void 0 : _b.start) {
const data = this.rendition.location.start;
if (this.scrolled && data.href === this.lastSection.href) {
this.viwerService.metaData.currentLocation = 0;
this.emitEndEvent();
}
else {
if (this.rendition.location.atEnd || (spine.length === 1 &&
(this.rendition.location.end.displayed.page + 1 >= this.rendition.location.end.displayed.total))) {
this.viwerService.metaData.currentLocation = 0;
this.emitEndEvent();
}
}
if (type === fromConst.NEXT) {
this.rendition.next().then(() => {
this.saveCurrentLocation();
this.viewerEvent.emit({
type: fromConst.PAGECHANGE,
data,
interaction: fromConst.NEXT
});
});
}
else if (type === fromConst.PREVIOUS) {
this.rendition.prev().then(() => {
this.saveCurrentLocation();
this.viewerEvent.emit({
type: fromConst.PAGECHANGE,
data,
interaction: fromConst.PREVIOUS
});
});
}
if (type === fromConst.NAVIGATE_TO_PAGE) {
this.rendition.display(event.data);
this.viewerEvent.emit({
type: fromConst.NAVIGATE_TO_PAGE,
event,
interaction: fromConst.NAVIGATE_TO_PAGE
});
}
if (type === fromConst.INVALID_PAGE_ERROR) {
this.viewerEvent.emit({
type: fromConst.INVALID_PAGE_ERROR,
event,
interaction: fromConst.INVALID_PAGE_ERROR
});
}
}
});
}
saveCurrentLocation() {
var _a;
const currentLocation = this.rendition.currentLocation();
if ((_a = currentLocation === null || currentLocation === void 0 ? void 0 : currentLocation.start) === null || _a === void 0 ? void 0 : _a.cfi) {
// Get the Percentage (or location) from that CFI
const currentPageLocation = this.eBook.locations.percentageFromCfi(currentLocation.start.cfi);
this.viwerService.metaData.currentLocation = currentPageLocation;
}
}
emitEndEvent() {
this.viewerEvent.emit({
type: fromConst.END,
data: {
percentage: 100
}
});
}
emitErrorEvent() {
this.viewerEvent.emit({
type: fromConst.ERROR,
errorCode: errorCode.contentLoadFails,
errorMessage: errorMessage.contentLoadFails
});
}
ngOnDestroy() {
var _a;
(_a = this.eBook) === null || _a === void 0 ? void 0 : _a.destroy();
}
}
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
EpubViewerComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'epub-viewer',
template: "<div class=\"rendition\" [id]=\"idForRendition\" #epubViewer></div>",
styles: [""]
},] }
];
/**
* @type {function(): !Array<(null|{
* type: ?,
* decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
* })>}
* @nocollapse
*/
EpubViewerComponent.ctorParameters = () => [
{ type: ViwerService },
{ type: UtilService }
];
/** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
EpubViewerComponent.propDecorators = {
epubViewer: [{ type: ViewChild, args: ['epubViewer', { static: true },] }],
epubSrc: [{ type: Input }],
config: [{ type: Input }],
identifier: [{ type: Input }],
actions: [{ type: Input }],
showFullScreen: [{ type: Input }],
viewerEvent: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXB1Yi12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3VuYmlyZC1lcHViLXBsYXllci9zcmMvbGliL2VwdWItdmlld2VyL2VwdWItdmlld2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQzdELFlBQVksRUFBRSxNQUFNLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRW5FLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBTzFELE1BQU0sT0FBTyxtQkFBbUI7SUFlOUIsWUFDUyxZQUEwQixFQUN6QixXQUF3QjtRQUR6QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVJ6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNsQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFPNUMsQ0FBQztJQUNMLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsVUFBVSxDQUFDO0lBQ3JELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7O1FBQ2hDLElBQUksSUFB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LFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLG1CQUFtQixDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUc7WUFDbkIsSUFBSSxFQUFFO2dCQUNKLFVBQVUsRUFBRSxHQUFHO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixJQUFJLEVBQUUsU0FBUyxDQUFDLEtBQUs7WUFDckIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7WUFDckMsWUFBWSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7O1FBQ1QsTUFBQSxJQUFJLENBQUMsS0FBSywwQ0FBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7O1lBcExGLFNBQVMsU0FBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSxhQUFhO2dCQUN2QiwrRUFBMkM7O2FBRTVDOzs7Ozs7Ozs7O1lBWFEsWUFBWTtZQUdaLFdBQVc7Ozs7eUJBY2pCLFNBQVMsU0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3NCQUN4QyxLQUFLO3FCQUNMLEtBQUs7eUJBQ0wsS0FBSztzQkFDTCxLQUFLOzZCQUNMLEtBQUs7MEJBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCxcclxuICBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25Jbml0LCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgRXB1YiBmcm9tICdlcHVianMnO1xyXG5pbXBvcnQgeyBWaXdlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBlcHViUGxheWVyQ29uc3RhbnRzIGFzIGZyb21Db25zdCB9IGZyb20gJy4uL3N1bmJpcmQtZXB1Yi5jb25zdGFudCc7XHJcbmltcG9ydCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjknO1xyXG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3V0aWxTZXJ2aWNlL3V0aWwuc2VydmljZSc7XHJcblxyXG5jb25zdCBNQVhfVElNRV9UT19MT0FEX1NQSU5FID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW51dGVzXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2VwdWItdmlld2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXB1Yi12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2VwdWItdmlld2VyLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXB1YlZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIGVCb29rOiBhbnk7XHJcbiAgcmVuZGl0aW9uOiBhbnk7XHJcbiAgbGFzdFNlY3Rpb246IGFueTtcclxuICBzY3JvbGxlZDogYm9vbGVhbjtcclxuICBAVmlld0NoaWxkKCdlcHViVmlld2VyJywgeyBzdGF0aWM6IHRydWUgfSkgZXB1YlZpZXdlcjogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBlcHViU3JjOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY29uZmlnOiBhbnk7XHJcbiAgQElucHV0KCkgaWRlbnRpZmllcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBASW5wdXQoKSBzaG93RnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSB2aWV3ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIGlkRm9yUmVuZGl0aW9uOiBhbnk7XHJcbiAgZXB1YkJsb2I6IG9iamVjdDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdml3ZXJTZXJ2aWNlOiBWaXdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZVxyXG4gICkgeyB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlkRm9yUmVuZGl0aW9uID0gYCR7dGhpcy5pZGVudGlmaWVyfS1jb250ZW50YDtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLnJlbmRpdGlvbiAmJiAhY2hhbmdlcz8uc2hvd0Z1bGxTY3JlZW4/LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMucmVuZGl0aW9uLnJlc2l6ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLnZpd2VyU2VydmljZS5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcclxuICAgICAgICB0aGlzLmVwdWJCbG9iID0gYXdhaXQgdGhpcy52aXdlclNlcnZpY2UuaXNWYWxpZEVwdWJTcmModGhpcy5lcHViU3JjKTtcclxuICAgICAgICB0aGlzLmVCb29rID0gRXB1Yih0aGlzLmVwdWJCbG9iKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpd2VyU2VydmljZS5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcclxuICAgICAgICB0aGlzLmVCb29rID0gRXB1Yih0aGlzLmVwdWJTcmMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVuZGl0aW9uID0gdGhpcy5lQm9vay5yZW5kZXJUbyh0aGlzLmlkRm9yUmVuZGl0aW9uLCB7XHJcbiAgICAgICAgZmxvdzogJ3BhZ2luYXRlZCcsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucmVuZGl0aW9uLm9uKCdsYXlvdXQnLCAobGF5b3V0KSA9PiB7XHJcbiAgICAgICAgdGhpcy52aXdlclNlcnZpY2UudG90YWxOdW1iZXJPZlBhZ2VzID0gdGhpcy5lQm9vaz8ubmF2aWdhdGlvbj8ubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0aGlzLmVCb29rLm5hdmlnYXRpb24ubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uc3ByZWFkKCdub25lJyk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5mbG93KCdzY3JvbGxlZCcpO1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVuZGl0aW9uLnNwcmVhZCgnYXV0bycpO1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnJlbmRpdGlvbi5vbignZGlzcGxheUVycm9yJywgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbWl0RXJyb3JFdmVudCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHNwaW5lID0gYXdhaXQgdGhpcy51dGlsU2VydmljZS5mdWxmaWxsV2l0aFRpbWVMaW1pdChNQVhfVElNRV9UT19MT0FEX1NQSU5FLCB0aGlzLmVCb29rLmxvYWRlZC5zcGluZSwgbnVsbCk7XHJcblxyXG4gICAgICBpZiAoc3BpbmUpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlFcHViKCk7XHJcbiAgICAgICAgdGhpcy5sYXN0U2VjdGlvbiA9IHNwaW5lLmxhc3QoKTtcclxuICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xyXG4gICAgICAgICAgdHlwZTogZnJvbUNvbnN0LkVQVUJMT0FERUQsXHJcbiAgICAgICAgICBkYXRhOiBzcGluZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWN0aW9ucyhzcGluZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lbWl0RXJyb3JFdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmVtaXRFcnJvckV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5RXB1YigpIHtcclxuICAgIGNvbnN0IHsgY3VycmVudExvY2F0aW9uIH0gPSB0aGlzLmNvbmZpZztcclxuICAgIGlmICghY3VycmVudExvY2F0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVuZGl0aW9uLmRpc3BsYXkoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZUJvb2sucmVhZHkudGhlbigoKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVCb29rLmxvY2F0aW9ucy5nZW5lcmF0ZSgxMDAwKTtcclxuICAgIH0pLnRoZW4oKGxvY2F0aW9ucykgPT4ge1xyXG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5lQm9vaz8uc3BpbmU/Lmxlbmd0aDtcclxuICAgICAgdGhpcy52aXdlclNlcnZpY2UudG90YWxOdW1iZXJPZlBhZ2VzID0gdG90YWxQYWdlcyA/ICh0b3RhbFBhZ2VzIC0gMSkgOiAwO1xyXG4gICAgICBpZiAoY3VycmVudExvY2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgY2ZpID0gdGhpcy5lQm9vay5sb2NhdGlvbnMuY2ZpRnJvbVBlcmNlbnRhZ2UoTnVtYmVyKGN1cnJlbnRMb2NhdGlvbikpO1xyXG4gICAgICAgIHRoaXMucmVuZGl0aW9uLmRpc3BsYXkoY2ZpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBY3Rpb25zKHNwaW5lKSB7XHJcbiAgICB0aGlzLmFjdGlvbnMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCB0eXBlID0gZXZlbnQudHlwZTtcclxuICAgICAgaWYgKHRoaXMucmVuZGl0aW9uPy5sb2NhdGlvbj8uc3RhcnQpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZW5kaXRpb24ubG9jYXRpb24uc3RhcnQ7XHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsZWQgJiYgZGF0YS5ocmVmID09PSB0aGlzLmxhc3RTZWN0aW9uLmhyZWYpIHtcclxuICAgICAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLmN1cnJlbnRMb2NhdGlvbiA9IDA7XHJcbiAgICAgICAgICB0aGlzLmVtaXRFbmRFdmVudCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZW5kaXRpb24ubG9jYXRpb24uYXRFbmQgfHwgKHNwaW5lLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAgICAgICAodGhpcy5yZW5kaXRpb24ubG9jYXRpb24uZW5kLmRpc3BsYXllZC5wYWdlICsgMSA+PSB0aGlzLnJlbmRpdGlvbi5sb2NhdGlvbi5lbmQuZGlzcGxheWVkLnRvdGFsKSkpIHtcclxuICAgICAgICAgICAgdGhpcy52aXdlclNlcnZpY2UubWV0YURhdGEuY3VycmVudExvY2F0aW9uID0gMDtcclxuICAgICAgICAgICAgdGhpcy5lbWl0RW5kRXZlbnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IGZyb21Db25zdC5ORVhUKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5uZXh0KCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUN1cnJlbnRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5QQUdFQ0hBTkdFLFxyXG4gICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5ORVhUXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBmcm9tQ29uc3QuUFJFVklPVVMpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGl0aW9uLnByZXYoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudExvY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgdHlwZTogZnJvbUNvbnN0LlBBR0VDSEFOR0UsXHJcbiAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICBpbnRlcmFjdGlvbjogZnJvbUNvbnN0LlBSRVZJT1VTXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlID09PSBmcm9tQ29uc3QuTkFWSUdBVEVfVE9fUEFHRSkge1xyXG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uZGlzcGxheShldmVudC5kYXRhKTtcclxuICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5OQVZJR0FURV9UT19QQUdFLFxyXG4gICAgICAgICAgICBldmVudCxcclxuICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5OQVZJR0FURV9UT19QQUdFXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBmcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xyXG4gICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SLFxyXG4gICAgICAgICAgICBldmVudCxcclxuICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5JTlZBTElEX1BBR0VfRVJST1JcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlQ3VycmVudExvY2F0aW9uKCkge1xyXG4gICAgY29uc3QgY3VycmVudExvY2F0aW9uID0gdGhpcy5yZW5kaXRpb24uY3VycmVudExvY2F0aW9uKCk7XHJcbiAgICBpZiAoY3VycmVudExvY2F0aW9uPy5zdGFydD8uY2ZpKSB7XHJcbiAgICAgIC8vIEdldCB0aGUgUGVyY2VudGFnZSAob3IgbG9jYXRpb24pIGZyb20gdGhhdCBDRklcclxuICAgICAgY29uc3QgY3VycmVudFBhZ2VMb2NhdGlvbiA9IHRoaXMuZUJvb2subG9jYXRpb25zLnBlcmNlbnRhZ2VGcm9tQ2ZpKGN1cnJlbnRMb2NhdGlvbi5zdGFydC5jZmkpO1xyXG4gICAgICB0aGlzLnZpd2VyU2VydmljZS5tZXRhRGF0YS5jdXJyZW50TG9jYXRpb24gPSBjdXJyZW50UGFnZUxvY2F0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW1pdEVuZEV2ZW50KCkge1xyXG4gICAgdGhpcy52aWV3ZXJFdmVudC5lbWl0KHtcclxuICAgICAgdHlwZTogZnJvbUNvbnN0LkVORCxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHBlcmNlbnRhZ2U6IDEwMFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGVtaXRFcnJvckV2ZW50KCkge1xyXG4gICAgdGhpcy52aWV3ZXJFdmVudC5lbWl0KHtcclxuICAgICAgdHlwZTogZnJvbUNvbnN0LkVSUk9SLFxyXG4gICAgICBlcnJvckNvZGU6IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzLFxyXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5lQm9vaz8uZGVzdHJveSgpO1xyXG4gIH1cclxufVxyXG4iXX0=