UNPKG

@mescius/activereportsjs-angular

Version:

ActiveReportsJS components for Angular

255 lines 32.5 kB
import { Component, Input, ViewEncapsulation, EventEmitter, Output, Inject, Optional, ViewChild } from '@angular/core'; import { ReportViewer as ViewerNs } from '@mescius/activereportsjs'; import { AR_EXPORTS } from '../export-injectiontoken'; import * as i0 from "@angular/core"; export class ViewerComponent { get supportedExportKeys() { return (this.supportedExports || []).map(e => e.key); } constructor(supportedExports) { this.supportedExports = supportedExports; this._initProps = []; this.width = '100%'; this.height = '100%'; this.availableExports = []; this.init = new EventEmitter(); this.reportLoaded = new EventEmitter(); this.documentLoaded = new EventEmitter(); this._propSetters = { sidebarVisible: (value) => { this._viewer.toggleSidebar(value); }, toolbarVisible: (value) => { this._viewer.toggleToolbar(value); }, fullscreen: (value) => { this._viewer.toggleFullScreen(value); }, availableExports: (value) => { if (value && value.length > 0) { const supportedValues = value.filter((v) => this.supportedExportKeys.indexOf(v) >= 0); // set ['disabled'] to hide export panel if no exports supported this._viewer.availableExports = supportedValues.length ? supportedValues : ['disabled']; } else { // set explicit list to avoid side effects of global exports initialization this._viewer.availableExports = this.supportedExportKeys.length ? this.supportedExportKeys : ['disabled']; } }, mouseMode: (value) => { this._viewer.mouseMode = value; }, theme: (value) => { this._viewer.theme = value; }, renderMode: (value) => { this._viewer.renderMode = value; }, viewMode: (value) => { this._viewer.viewMode = value; }, zoom: (value) => { this._viewer.zoom = value; }, errorHandler: (value) => { this._viewer.errorHandler = value; }, showParametersOnOpen: (value) => { this._viewer.showParametersOnOpen = value; }, }; this._disposables = []; } ngOnChanges(changes) { for (const prop of Object.keys(changes)) { const setter = this._propSetters[prop]; if (!setter) { continue; } const value = changes[prop].currentValue; if (this._viewer) { setter(value); } else { this._initProps.push(() => setter(value)); } } } ngAfterViewInit() { this.initViewer() .then(() => this.init.emit(this)); } ngOnDestroy() { while (this._disposables.length) { this._disposables.shift()(); } this._viewer.dispose(); } get ref() { return this._viewer; } async initViewer() { for (const supportedExport of this.supportedExports || []) { await supportedExport.init(); } this._viewer = new ViewerNs.Viewer(this.rootElement.nativeElement, { language: this.language, themeConfig: this.themeConfig, PanelsLayout: this.panelsLayout, ParameterPanelLocation: this.parameterPanelLocation, memoizeData: this.memoizeData, ToolbarLayout: this.toolbarLayout, ExportsSettings: this.exportsSettings, }); this._disposables.push(this._viewer.reportLoaded.register(args => this.reportLoaded.emit(args)), this._viewer.documentLoaded.register(args => this.documentLoaded.emit(args))); this._propSetters.availableExports(this.availableExports); while (this._initProps.length) { this._initProps.shift()(); } } /** * Opens report from file or as definition (json string)). * * @param report The report template. Can be report URI, or report definition, or instance of PageReport class. * @param settings Additional settings for report (name, parameters). */ open(report, settings) { return this._viewer.open(report, settings); } /** * Exports currently displayed report to specified output format. Returns object which contains * result data as blob object | string and download function. So you could either use this blob object or download file immediately. * Please note that you can specify settings in PDF export as plain list * (like **{title: 'Title', author: 'Author Name', ownerPassword: '1'}** etc... * * ```javascript * var options = {filename:"Invoice List"}; * var cancelCallback = function(){ * return false; // continue export. Return true to cancel export process * } * viewer.export('pdf', options, {cancel: cancelCallback }).then(result => doSmthWithBlob(result.data)); * //or you can download file * viewer.export('pdf', options, {cancel: cancelCallback }).then(result => result.download('Invoice List')); * ``` * * @param format Export format identifier. One of 'pdf', 'xlsx', 'html', 'tabular-data'. * @param settings Format specific export settings. * @param params Additional export customization. */ export(format, settings, params) { return this._viewer.export(format, settings, params); } /** * Resets current viewer document */ resetDocument() { return this._viewer.resetDocument(); } /** * Prints currently displayed report. */ print() { return this._viewer.print(); } /** Gets current page number (1-based). Returns 0 if no document loaded. */ get currentPage() { return this._viewer.currentPage; } /** Gets the total number of pages available in report. */ get pageCount() { return this._viewer.pageCount; } /** Provides access to the "history" API. */ get history() { return this._viewer.history; } /** Gets the toolbar API */ get toolbar() { return this._viewer.toolbar; } /** Navigates to the first page. */ goToFirstPage() { return this._viewer.goToFirstPage(); } /** Navigates to the previous page. */ goToPrevPage() { return this._viewer.goToPrevPage(); } /** Navigates to the next page. */ goToNextPage() { return this._viewer.goToNextPage(); } /** Navigates to the last page. */ goToLastPage() { return this._viewer.goToLastPage(); } /** Navigates to the specified page (starting from 1). */ goToPage(pageNumber) { return this._viewer.goToPage(pageNumber); } /** Performs backToParent action which will return user to parent report. */ backToParent() { return this._viewer.backToParent(); } /** Performs refresh operation in report (re-render report). */ refresh() { return this._viewer.refresh(); } /** Gets **true** if backToParent command is applicable to current document. */ get canBackToParent() { return this._viewer.canBackToParent(); } /** * Performs search operation in currently rendered report. Allows you to create your own custom search pane. */ search(options, resultFn, progressFn, cancel) { return this._viewer.search(options, resultFn, progressFn, cancel); } /** * Highlights the search result returned by a search method. */ highlight(result) { return this._viewer.highlight(result); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerComponent, deps: [{ token: AR_EXPORTS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ViewerComponent, selector: "gc-activereports-viewer", inputs: { width: "width", height: "height", language: "language", theme: "theme", themeConfig: "themeConfig", panelsLayout: "panelsLayout", parameterPanelLocation: "parameterPanelLocation", showParametersOnOpen: "showParametersOnOpen", memoizeData: "memoizeData", toolbarLayout: "toolbarLayout", exportsSettings: "exportsSettings", availableExports: "availableExports", mouseMode: "mouseMode", renderMode: "renderMode", viewMode: "viewMode", zoom: "zoom", fullscreen: "fullscreen", toolbarVisible: "toolbarVisible", sidebarVisible: "sidebarVisible", errorHandler: "errorHandler" }, outputs: { init: "init", reportLoaded: "reportLoaded", documentLoaded: "documentLoaded" }, viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["viewerRoot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #viewerRoot [style.width]=\"width\" [style.height]=\"height\"></div>", encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerComponent, decorators: [{ type: Component, args: [{ selector: 'gc-activereports-viewer', encapsulation: ViewEncapsulation.None, template: "<div #viewerRoot [style.width]=\"width\" [style.height]=\"height\"></div>" }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [AR_EXPORTS] }, { type: Optional }] }]; }, propDecorators: { rootElement: [{ type: ViewChild, args: ['viewerRoot', { static: false }] }], width: [{ type: Input }], height: [{ type: Input }], language: [{ type: Input }], theme: [{ type: Input }], themeConfig: [{ type: Input }], panelsLayout: [{ type: Input }], parameterPanelLocation: [{ type: Input }], showParametersOnOpen: [{ type: Input }], memoizeData: [{ type: Input }], toolbarLayout: [{ type: Input }], exportsSettings: [{ type: Input }], availableExports: [{ type: Input }], mouseMode: [{ type: Input }], renderMode: [{ type: Input }], viewMode: [{ type: Input }], zoom: [{ type: Input }], fullscreen: [{ type: Input }], toolbarVisible: [{ type: Input }], sidebarVisible: [{ type: Input }], errorHandler: [{ type: Input }], init: [{ type: Output }], reportLoaded: [{ type: Output }], documentLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi92aWV3ZXIvdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi92aWV3ZXIvdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLEtBQUssRUFBRSxpQkFBaUIsRUFBNEIsWUFBWSxFQUFFLE1BQU0sRUFBYSxNQUFNLEVBQUUsUUFBUSxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2TCxPQUFPLEVBQUUsWUFBWSxJQUFJLFFBQVEsRUFBUSxNQUFNLDBCQUEwQixDQUFDO0FBRTFFLE9BQU8sRUFBVSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFVOUQsTUFBTSxPQUFPLGVBQWU7SUFRMUIsSUFBWSxtQkFBbUI7UUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFlBQTZELGdCQUEyQjtRQUEzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVc7UUFOaEYsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFRbEMsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUNmLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFxQmhCLHFCQUFnQixHQUFjLEVBQUUsQ0FBQztRQVVoQyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFM0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0MsQ0FBQztRQUNoRSxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBRXRFLGlCQUFZLEdBQXlD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LGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEFmdGVyVmlld0luaXQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25EZXN0cm95LCBJbmplY3QsIE9wdGlvbmFsLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0Vmlld2VyIGFzIFZpZXdlck5zLCBDb3JlIH0gZnJvbSAnQGdyYXBlY2l0eS9hY3RpdmVyZXBvcnRzJztcblxuaW1wb3J0IHsgRXhwb3J0LCBBUl9FWFBPUlRTIH0gZnJvbSAnLi4vZXhwb3J0LWluamVjdGlvbnRva2VuJztcblxuZXhwb3J0IHR5cGUgSVJlcG9ydCA9IENvcmUuUmRsLlJlcG9ydCB8IHN0cmluZztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ2MtYWN0aXZlcmVwb3J0cy12aWV3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBWaWV3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZCgndmlld2VyUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSByb290RWxlbWVudDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIF92aWV3ZXI6IFZpZXdlck5zLlZpZXdlcjtcblxuICBwcml2YXRlIF9pbml0UHJvcHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgcHJpdmF0ZSBnZXQgc3VwcG9ydGVkRXhwb3J0S2V5cygpIHtcbiAgICByZXR1cm4gKHRoaXMuc3VwcG9ydGVkRXhwb3J0cyB8fCBbXSkubWFwKGUgPT4gZS5rZXkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChBUl9FWFBPUlRTKSBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHN1cHBvcnRlZEV4cG9ydHM/OiBFeHBvcnRbXSkge31cblxuICBASW5wdXQoKSB3aWR0aCA9ICcxMDAlJztcbiAgQElucHV0KCkgaGVpZ2h0ID0gJzEwMCUnO1xuXG4gIEBJbnB1dCgpIGxhbmd1YWdlPzogc3RyaW5nO1xuXG4gIC8qKiBVSSB0aGVtZSAqL1xuICBASW5wdXQoKSB0aGVtZT86IFZpZXdlck5zLlVJVGhlbWU7XG5cbiAgLyoqIEluaXRpYWwgVUkgdGhlbWVzIHNldHRpbmdzICovXG4gIEBJbnB1dCgpIHRoZW1lQ29uZmlnPzogVmlld2VyTnMuVUlUaGVtZUNvbmZpZztcblxuICAvKiogTGF5b3V0IG9mIHBhbmVscyBiYXIuIENhbm5vdCBiZSBjaGFuZ2VkIG9uIHRoZSBmbHkuICovXG4gIEBJbnB1dCgpIHBhbmVsc0xheW91dD86IFZpZXdlck5zLlBhbmVsc0xvY2F0aW9uO1xuXG4gIC8qKiBQYXJhbWV0ZXJzIHBhbmVsIGxvY2F0aW9uLiAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJQYW5lbExvY2F0aW9uPzogVmlld2VyTnMuUGFyYW1ldGVyUGFuZWxMb2NhdGlvblxuICAvKiogUGFyYW1ldGVycyBwYW5lbCBiZWhhdmlvdXIuICovXG4gIEBJbnB1dCgpIHNob3dQYXJhbWV0ZXJzT25PcGVuPzogVmlld2VyTnMuU2hvd1BhcmFtZXRlcnNPbk9wZW5cbiAgQElucHV0KCkgbWVtb2l6ZURhdGE/OiBib29sZWFuO1xuICBASW5wdXQoKSB0b29sYmFyTGF5b3V0PzogVmlld2VyTnMuVG9vbGJhckxheW91dDtcbiAgQElucHV0KCkgZXhwb3J0c1NldHRpbmdzPzogUmVjb3JkPHN0cmluZywgVmlld2VyTnMuRXhwb3J0U2V0dGluZ3M+O1xuXG4gIEBJbnB1dCgpIGF2YWlsYWJsZUV4cG9ydHM/OiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBtb3VzZU1vZGU/OiBWaWV3ZXJOcy5WaWV3ZXJNb3VzZU1vZGU7XG4gIEBJbnB1dCgpIHJlbmRlck1vZGU/OiBWaWV3ZXJOcy5WaWV3ZXJSZW5kZXJNb2RlO1xuICBASW5wdXQoKSB2aWV3TW9kZT86IFZpZXdlck5zLlZpZXdlclZpZXdNb2RlIHwgVmlld2VyTnMuVmlld01vZGU7XG4gIEBJbnB1dCgpIHpvb20/OiBWaWV3ZXJOcy5WaWV3ZXJab29tTW9kZTtcbiAgQElucHV0KCkgZnVsbHNjcmVlbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRvb2xiYXJWaXNpYmxlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgc2lkZWJhclZpc2libGU/OiBib29sZWFuO1xuICBASW5wdXQoKSBlcnJvckhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuXG4gIEBPdXRwdXQoKSBpbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3ZXJDb21wb25lbnQ+KCk7XG5cbiAgQE91dHB1dCgpIHJlcG9ydExvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld2VyTnMuUmVwb3J0TG9hZEV2ZW50QXJncz4oKTtcbiAgQE91dHB1dCgpIGRvY3VtZW50TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxWaWV3ZXJOcy5Eb2N1bWVudExvYWRFdmVudEFyZ3M+KCk7XG5cbiAgcHJpdmF0ZSBfcHJvcFNldHRlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiB2b2lkPiA9IHtcbiAgICBzaWRlYmFyVmlzaWJsZTogKHZhbHVlKSA9PiB7IHRoaXMuX3ZpZXdlci50b2dnbGVTaWRlYmFyKHZhbHVlKTsgfSxcbiAgICB0b29sYmFyVmlzaWJsZTogKHZhbHVlKSA9PiB7IHRoaXMuX3ZpZXdlci50b2dnbGVUb29sYmFyKHZhbHVlKTsgfSxcbiAgICBmdWxsc2NyZWVuOiAodmFsdWUpID0+IHsgdGhpcy5fdmlld2VyLnRvZ2dsZUZ1bGxTY3JlZW4odmFsdWUpOyB9LFxuICAgIGF2YWlsYWJsZUV4cG9ydHM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmFsdWVzID0gdmFsdWUuZmlsdGVyKCh2OiBzdHJpbmcpID0+IHRoaXMuc3VwcG9ydGVkRXhwb3J0S2V5cy5pbmRleE9mKHYpID49IDApO1xuICAgICAgICAvLyBzZXQgWydkaXNhYmxlZCddIHRvIGhpZGUgZXhwb3J0IHBhbmVsIGlmIG5vIGV4cG9ydHMgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuX3ZpZXdlci5hdmFpbGFibGVFeHBvcnRzID0gc3VwcG9ydGVkVmFsdWVzLmxlbmd0aCA/IHN1cHBvcnRlZFZhbHVlcyA6IFsnZGlzYWJsZWQnXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBleHBsaWNpdCBsaXN0IHRvIGF2b2lkIHNpZGUgZWZmZWN0cyBvZiBnbG9iYWwgZXhwb3J0cyBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLl92aWV3ZXIuYXZhaWxhYmxlRXhwb3J0cyA9IHRoaXMuc3VwcG9ydGVkRXhwb3J0S2V5cy5sZW5ndGggPyB0aGlzLnN1cHBvcnRlZEV4cG9ydEtleXMgOiBbJ2Rpc2FibGVkJ107XG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VzZU1vZGU6ICh2YWx1ZSkgPT4geyB0aGlzLl92aWV3ZXIubW91c2VNb2RlID0gdmFsdWU7IH0sXG4gICAgdGhlbWU6ICh2YWx1ZSkgPT4geyB0aGlzLl92aWV3ZXIudGhlbWUgPSB2YWx1ZTsgfSxcbiAgICByZW5kZXJNb2RlOiAodmFsdWUpID0+IHsgdGhpcy5fdmlld2VyLnJlbmRlck1vZGUgPSB2YWx1ZTsgfSxcbiAgICB2aWV3TW9kZTogKHZhbHVlKSA9PiB7IHRoaXMuX3ZpZXdlci52aWV3TW9kZSA9IHZhbHVlOyB9LFxuICAgIHpvb206ICh2YWx1ZSkgPT4geyB0aGlzLl92aWV3ZXIuem9vbSA9IHZhbHVlOyB9LFxuICAgIGVycm9ySGFuZGxlcjogKHZhbHVlKSA9PiB7IHRoaXMuX3ZpZXdlci5lcnJvckhhbmRsZXIgPSB2YWx1ZTsgfSxcbiAgICBzaG93UGFyYW1ldGVyc09uT3BlbjogKHZhbHVlKSA9PiB7IHRoaXMuX3ZpZXdlci5zaG93UGFyYW1ldGVyc09uT3BlbiA9IHZhbHVlOyB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2Rpc3Bvc2FibGVzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoY2hhbmdlcykpIHtcbiAgICAgIGNvbnN0IHNldHRlciA9IHRoaXMuX3Byb3BTZXR0ZXJzW3Byb3BdO1xuICAgICAgaWYgKCFzZXR0ZXIpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzW3Byb3BdLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0aGlzLl92aWV3ZXIpIHtcbiAgICAgICAgc2V0dGVyKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luaXRQcm9wcy5wdXNoKCgpID0+IHNldHRlcih2YWx1ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmluaXRWaWV3ZXIoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5pbml0LmVtaXQodGhpcykpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuc2hpZnQoKSEoKTtcbiAgICB9XG4gICAgdGhpcy5fdmlld2VyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGdldCByZWYoKTogVmlld2VyTnMuVmlld2VyIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0Vmlld2VyKCkge1xuICAgIGZvciAoY29uc3Qgc3VwcG9ydGVkRXhwb3J0IG9mIHRoaXMuc3VwcG9ydGVkRXhwb3J0cyB8fCBbXSkge1xuICAgICAgYXdhaXQgc3VwcG9ydGVkRXhwb3J0LmluaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWV3ZXIgPSBuZXcgVmlld2VyTnMuVmlld2VyKHRoaXMucm9vdEVsZW1lbnQubmF0aXZlRWxlbWVudCwge1xuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICB0aGVtZUNvbmZpZzogdGhpcy50aGVtZUNvbmZpZyxcbiAgICAgIFBhbmVsc0xheW91dDogdGhpcy5wYW5lbHNMYXlvdXQsXG4gICAgICBQYXJhbWV0ZXJQYW5lbExvY2F0aW9uOiB0aGlzLnBhcmFtZXRlclBhbmVsTG9jYXRpb24sXG4gICAgICBtZW1vaXplRGF0YTogdGhpcy5tZW1vaXplRGF0YSxcbiAgICAgIFRvb2xiYXJMYXlvdXQ6IHRoaXMudG9vbGJhckxheW91dCxcbiAgICAgIEV4cG9ydHNTZXR0aW5nczogdGhpcy5leHBvcnRzU2V0dGluZ3MsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKFxuICAgICAgdGhpcy5fdmlld2VyLnJlcG9ydExvYWRlZC5yZWdpc3RlcihhcmdzID0+IHRoaXMucmVwb3J0TG9hZGVkLmVtaXQoYXJncykpLFxuICAgICAgdGhpcy5fdmlld2VyLmRvY3VtZW50TG9hZGVkLnJlZ2lzdGVyKGFyZ3MgPT4gdGhpcy5kb2N1bWVudExvYWRlZC5lbWl0KGFyZ3MpKSxcbiAgICApO1xuXG4gICAgdGhpcy5fcHJvcFNldHRlcnMuYXZhaWxhYmxlRXhwb3J0cyh0aGlzLmF2YWlsYWJsZUV4cG9ydHMpO1xuXG4gICAgd2hpbGUgKHRoaXMuX2luaXRQcm9wcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2luaXRQcm9wcy5zaGlmdCgpISgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyByZXBvcnQgZnJvbSBmaWxlIG9yIGFzIGRlZmluaXRpb24gKGpzb24gc3RyaW5nKSkuXG4gICAqXG4gICAqIEBwYXJhbSByZXBvcnQgIFRoZSByZXBvcnQgdGVtcGxhdGUuIENhbiBiZSByZXBvcnQgVVJJLCBvciByZXBvcnQgZGVmaW5pdGlvbiwgb3IgaW5zdGFuY2Ugb2YgUGFnZVJlcG9ydCBjbGFzcy5cbiAgICogQHBhcmFtIHNldHRpbmdzICBBZGRpdGlvbmFsIHNldHRpbmdzIGZvciByZXBvcnQgKG5hbWUsIHBhcmFtZXRlcnMpLlxuICAgKi9cbiAgb3BlbihyZXBvcnQ6IElSZXBvcnQsIHNldHRpbmdzPzogUGFydGlhbDxWaWV3ZXJOcy5SZXBvcnRTZXR0aW5ncz4pOiBQcm9taXNlPFZpZXdlck5zLkxvYWRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyLm9wZW4ocmVwb3J0LCBzZXR0aW5ncyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyBjdXJyZW50bHkgZGlzcGxheWVkIHJlcG9ydCB0byBzcGVjaWZpZWQgb3V0cHV0IGZvcm1hdC4gUmV0dXJucyBvYmplY3Qgd2hpY2ggY29udGFpbnNcbiAgICogcmVzdWx0IGRhdGEgYXMgYmxvYiBvYmplY3QgfCBzdHJpbmcgYW5kIGRvd25sb2FkIGZ1bmN0aW9uLiBTbyB5b3UgY291bGQgZWl0aGVyIHVzZSB0aGlzIGJsb2Igb2JqZWN0IG9yIGRvd25sb2FkIGZpbGUgaW1tZWRpYXRlbHkuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHNldHRpbmdzIGluIFBERiBleHBvcnQgYXMgcGxhaW4gbGlzdFxuICAgKiAobGlrZSAqKnt0aXRsZTogJ1RpdGxlJywgYXV0aG9yOiAnQXV0aG9yIE5hbWUnLCBvd25lclBhc3N3b3JkOiAnMSd9KiogZXRjLi4uXG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIG9wdGlvbnMgPSB7ZmlsZW5hbWU6XCJJbnZvaWNlIExpc3RcIn07XG4gICAqIHZhciBjYW5jZWxDYWxsYmFjayA9IGZ1bmN0aW9uKCl7XG4gICAqICAgICByZXR1cm4gZmFsc2U7IC8vIGNvbnRpbnVlIGV4cG9ydC4gUmV0dXJuIHRydWUgdG8gY2FuY2VsIGV4cG9ydCBwcm9jZXNzXG4gICAqIH1cbiAgICogdmlld2VyLmV4cG9ydCgncGRmJywgb3B0aW9ucywge2NhbmNlbDogY2FuY2VsQ2FsbGJhY2sgfSkudGhlbihyZXN1bHQgPT4gZG9TbXRoV2l0aEJsb2IocmVzdWx0LmRhdGEpKTtcbiAgICogLy9vciB5b3UgY2FuIGRvd25sb2FkIGZpbGVcbiAgICogdmlld2VyLmV4cG9ydCgncGRmJywgb3B0aW9ucywge2NhbmNlbDogY2FuY2VsQ2FsbGJhY2sgfSkudGhlbihyZXN1bHQgPT4gcmVzdWx0LmRvd25sb2FkKCdJbnZvaWNlIExpc3QnKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZm9ybWF0ICBFeHBvcnQgZm9ybWF0IGlkZW50aWZpZXIuIE9uZSBvZiAncGRmJywgJ3hsc3gnLCAnaHRtbCcsICd0YWJ1bGFyLWRhdGEnLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgIEZvcm1hdCBzcGVjaWZpYyBleHBvcnQgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSBwYXJhbXMgIEFkZGl0aW9uYWwgZXhwb3J0IGN1c3RvbWl6YXRpb24uXG4gICAqL1xuICBleHBvcnQoZm9ybWF0OiBzdHJpbmcsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8Ym9vbGVhbnxudW1iZXI+LCBwYXJhbXM/OiB7IGNhbmNlbD86ICgpID0+IGJvb2xlYW4gfSk6IFByb21pc2U8Vmlld2VyTnMuRXhwb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5leHBvcnQoZm9ybWF0LCBzZXR0aW5ncywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgY3VycmVudCB2aWV3ZXIgZG9jdW1lbnRcbiAgICovXG4gIHJlc2V0RG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5yZXNldERvY3VtZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogUHJpbnRzIGN1cnJlbnRseSBkaXNwbGF5ZWQgcmVwb3J0LlxuICAgKi9cbiAgcHJpbnQoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5wcmludCgpO1xuICB9XG5cbiAgLyoqIEdldHMgY3VycmVudCBwYWdlIG51bWJlciAoMS1iYXNlZCkuIFJldHVybnMgMCBpZiBubyBkb2N1bWVudCBsb2FkZWQuICovXG4gIGdldCBjdXJyZW50UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIuY3VycmVudFBhZ2U7XG4gIH1cbiAgLyoqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgaW4gcmVwb3J0LiAqL1xuICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5wYWdlQ291bnQ7XG4gIH1cbiAgLyoqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgXCJoaXN0b3J5XCIgQVBJLiAqL1xuICBnZXQgaGlzdG9yeSgpOiBWaWV3ZXJOcy5IaXN0b3J5QXBpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyLmhpc3Rvcnk7XG4gIH1cbiAgLyoqIEdldHMgdGhlIHRvb2xiYXIgQVBJICovXG4gIGdldCB0b29sYmFyKCk6IFZpZXdlck5zLlRvb2xiYXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIudG9vbGJhcjtcbiAgfVxuXG4gIC8qKiBOYXZpZ2F0ZXMgdG8gdGhlIGZpcnN0IHBhZ2UuICovXG4gIGdvVG9GaXJzdFBhZ2UoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5nb1RvRmlyc3RQYWdlKCk7XG4gIH1cblxuICAvKiogTmF2aWdhdGVzIHRvIHRoZSBwcmV2aW91cyBwYWdlLiAqL1xuICBnb1RvUHJldlBhZ2UoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5nb1RvUHJldlBhZ2UoKTtcbiAgfVxuICAvKiogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IHBhZ2UuICovXG4gIGdvVG9OZXh0UGFnZSgpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyLmdvVG9OZXh0UGFnZSgpO1xuICB9XG4gIC8qKiBOYXZpZ2F0ZXMgdG8gdGhlIGxhc3QgcGFnZS4gKi9cbiAgZ29Ub0xhc3RQYWdlKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIuZ29Ub0xhc3RQYWdlKCk7XG4gIH1cbiAgLyoqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIHBhZ2UgKHN0YXJ0aW5nIGZyb20gMSkuICovXG4gIGdvVG9QYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIuZ29Ub1BhZ2UocGFnZU51bWJlcik7XG4gIH1cbiAgLyoqIFBlcmZvcm1zIGJhY2tUb1BhcmVudCBhY3Rpb24gd2hpY2ggd2lsbCByZXR1cm4gdXNlciB0byBwYXJlbnQgcmVwb3J0LiAqL1xuICBiYWNrVG9QYXJlbnQoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlci5iYWNrVG9QYXJlbnQoKTtcbiAgfVxuICAvKiogUGVyZm9ybXMgcmVmcmVzaCBvcGVyYXRpb24gaW4gcmVwb3J0IChyZS1yZW5kZXIgcmVwb3J0KS4gKi9cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKiBHZXRzICoqdHJ1ZSoqIGlmIGJhY2tUb1BhcmVudCBjb21tYW5kIGlzIGFwcGxpY2FibGUgdG8gY3VycmVudCBkb2N1bWVudC4gKi9cbiAgZ2V0IGNhbkJhY2tUb1BhcmVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld2VyLmNhbkJhY2tUb1BhcmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHNlYXJjaCBvcGVyYXRpb24gaW4gY3VycmVudGx5IHJlbmRlcmVkIHJlcG9ydC4gQWxsb3dzIHlvdSB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIHNlYXJjaCBwYW5lLlxuICAgKi9cbiAgc2VhcmNoKG9wdGlvbnM6IFZpZXdlck5zLlNlYXJjaE9wdGlvbnMsXG4gICAgICAgICByZXN1bHRGbjogKHJlc3VsdDogVmlld2VyTnMuU2VhcmNoUmVzdWx0KSA9PiB2b2lkLFxuICAgICAgICAgcHJvZ3Jlc3NGbj86IChwcm9ncmVzczogeyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZUNvdW50OiBudW1iZXIgfCBudWxsOyB9KSA9PiB2b2lkLFxuICAgICAgICAgY2FuY2VsPzogVmlld2VyTnMuQ2FuY2VsbGF0aW9uVG9rZW4pOiBQcm9taXNlPFZpZXdlck5zLlNlYXJjaFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIuc2VhcmNoKG9wdGlvbnMsIHJlc3VsdEZuLCBwcm9ncmVzc0ZuLCBjYW5jZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodHMgdGhlIHNlYXJjaCByZXN1bHQgcmV0dXJuZWQgYnkgYSBzZWFyY2ggbWV0aG9kLlxuICAgKi9cbiAgaGlnaGxpZ2h0KHJlc3VsdDogVmlld2VyTnMuU2VhcmNoUmVzdWx0IHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3ZXIuaGlnaGxpZ2h0KHJlc3VsdCk7XG4gIH1cbn1cbiIsIjxkaXYgI3ZpZXdlclJvb3QgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIj48L2Rpdj4iXX0=