UNPKG

ngx-stimulsoft

Version:
188 lines 26.3 kB
import { Component, computed, effect, inject, input, output, signal } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { NgxSourceService } from 'ngx-source'; import { StimulsoftSourceName } from './stimulsoft-source-name.model'; import { StimulsoftService } from './stimulsoft.service'; import { UniqueComponentId } from './util'; import * as i0 from "@angular/core"; export class StimulsoftViewerComponent { stimulsoftService = inject(StimulsoftService); sourceService = inject(NgxSourceService); document = inject(DOCUMENT); id = input(UniqueComponentId()); baseUrl = input(this.stimulsoftService.baseUrl); fileName = input.required(); fonts = input(this.stimulsoftService.fonts); dataSet = input.required(); options = input(this.stimulsoftService.options); licenseKey = input(); licenseFile = input(); local = input('en'); dir = input('ltr'); ready = output(); loading = output(); onLoadResourceFailed = output(); viewerOptions; viewer; report; isLoadedSource = signal(false); failResourcesDownload = signal(false); canInitialize = computed(() => this.isLoadedSource() && !this.failResourcesDownload() && !!this.fileName() && !!this.dataSet()); constructor() { this.sourceService.addSources(...this.stimulsoftService.stimulsoftSourceStore); this.loadResources().then(); effect(() => { if (this.canInitialize()) { // eslint-disable-next-line const dependencies = [ this.options(), this.fonts(), this.dataSet(), this.fileName(), this.id(), this.licenseKey(), this.licenseFile(), this.local(), this.dir(), ]; this.initializeViewer(); } }); } async loadResources() { this.loading.emit(true); const sources = [StimulsoftSourceName.REPORTER_SCRIPT, StimulsoftSourceName.VIEWER_SCRIPT]; if (this.stimulsoftService.viewerCssUrl) { sources.push(StimulsoftSourceName.VIEWER_STYLE); } try { await this.sourceService.loadBySourceNames(...sources); this.isLoadedSource.set(true); } catch (error) { this.failResourcesDownload.set(true); this.onLoadResourceFailed.emit({ source: 'stimulsoft', error }); } finally { this.loading.emit(false); } } initializeViewer() { if (typeof Stimulsoft === 'undefined') { this.onLoadResourceFailed.emit({ error: 'Stimulsoft undefined', source: 'global' }); return; } this.ready.emit(false); this.viewerOptions = new Stimulsoft.Viewer.StiViewerOptions(); this.viewerOptions.appearance.rightToLeft = this.dir() === 'rtl'; this.viewer = new Stimulsoft.Viewer.StiViewer(this.viewerOptions, 'StiViewer', false); this.report = new Stimulsoft.Report.StiReport(); this.applyOptions(); this.setupReport(); } applyOptions() { const options = this.options(); this.deepMerge(this.stimulsoftService.options, options); this.deepMerge(options, this.viewerOptions); } deepMerge(source, target) { if (!source || !target) { return; } for (const [key, value] of Object.entries(source)) { if (typeof value === 'object' && value !== null) { this.deepMerge(value, (target[key] ??= {})); } else { target[key] = value; } } } setupReport() { if (!this.viewerOptions || !this.viewer || !this.report) { return; } this.applyFonts(); this.loadReportFile(); this.registerDataSet(); this.applyLicense(); this.setLocale(); const targetElement = this.document.getElementById(this.id()); if (!targetElement) { console.warn(`Element with id "${this.id()}" not found.`); return; } this.ready.emit(true); this.report.renderAsync(() => { this.viewer.report = this.report; this.viewer.renderHtml(this.id()); }); } applyFonts() { const fonts = this.fonts(); if (!fonts) { return; } for (const [name, url] of Object.entries(fonts)) { try { Stimulsoft.Base.StiFontCollection.addFontFile(url, name); } catch { console.error(`Can't load font: ${url}`); } } } registerDataSet() { const json = this.dataSet(); if (!json) { return; } const dataSet = new Stimulsoft.System.Data.DataSet('DataSet'); dataSet.readJson(JSON.stringify(json)); this.report.dictionary.databases.clear(); this.report.regData('DataSet', 'DataSet', dataSet); } applyLicense() { const key = this.licenseKey() ?? this.stimulsoftService.stimulsoftConfig.licenseKey; const file = this.licenseFile() ?? this.stimulsoftService.stimulsoftConfig.licenseFile; if (key) { Stimulsoft.Base.StiLicense.Key = key; } else if (file) { Stimulsoft.Base.StiLicense.loadFromFile(file); } } loadReportFile() { const name = this.fileName(); if (!name) { return; } const base = this.baseUrl() ?? ''; this.report.loadFile(base + name); } setLocale() { if (!this.stimulsoftService.localizationPath) { return; } const local = this.local(); const stiLocalization = Stimulsoft.Base.Localization.StiLocalization; if (local === 'en') { stiLocalization.cultureName = 'English'; } else { const path = [this.stimulsoftService.localizationPath.replace(/\/$/g, ''), `${local}.xml`].join('/'); stiLocalization.cultureName = stiLocalization.loadLocalizationFile(path); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StimulsoftViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: StimulsoftViewerComponent, isStandalone: true, selector: "ngx-stimulsoft-viewer", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, baseUrl: { classPropertyName: "baseUrl", publicName: "baseUrl", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: true, transformFunction: null }, fonts: { classPropertyName: "fonts", publicName: "fonts", isSignal: true, isRequired: false, transformFunction: null }, dataSet: { classPropertyName: "dataSet", publicName: "dataSet", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, licenseKey: { classPropertyName: "licenseKey", publicName: "licenseKey", isSignal: true, isRequired: false, transformFunction: null }, licenseFile: { classPropertyName: "licenseFile", publicName: "licenseFile", isSignal: true, isRequired: false, transformFunction: null }, local: { classPropertyName: "local", publicName: "local", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { ready: "ready", loading: "loading", onLoadResourceFailed: "onLoadResourceFailed" }, ngImport: i0, template: ` <div dir="ltr" [id]="id()"></div>`, isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StimulsoftViewerComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-stimulsoft-viewer', template: ` <div dir="ltr" [id]="id()"></div>`, standalone: true, }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpbXVsc29mdC12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0aW11bHNvZnQvc3RpbXVsc29mdC12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxRQUFRLENBQUM7O0FBUzNDLE1BQU0sT0FBTyx5QkFBeUI7SUFDM0IsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUIsRUFBRSxHQUFHLEtBQUssQ0FBUyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDeEMsT0FBTyxHQUFHLEtBQUssQ0FBcUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBcUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFPLENBQUM7SUFDaEMsT0FBTyxHQUFHLEtBQUssQ0FBZ0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9FLFVBQVUsR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDekMsV0FBVyxHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUMxQyxLQUFLLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDO0lBQzVCLEdBQUcsR0FBRyxLQUFLLENBQWdCLEtBQUssQ0FBQyxDQUFDO0lBRWxDLEtBQUssR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUMxQixPQUFPLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFDNUIsb0JBQW9CLEdBQUcsTUFBTSxFQUFrQyxDQUFDO0lBRWpFLGFBQWEsQ0FBTTtJQUNuQixNQUFNLENBQU07SUFDWixNQUFNLENBQU07SUFFSCxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLHFCQUFxQixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUUvQyxhQUFhLEdBQUcsUUFBUSxDQUN2QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQ3RHLENBQUM7SUFFRjtRQUNFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTVCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUN6QiwyQkFBMkI7Z0JBQzNCLE1BQU0sWUFBWSxHQUFHO29CQUNuQixJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNkLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDZCxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNmLElBQUksQ0FBQyxFQUFFLEVBQUU7b0JBQ1QsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDWixJQUFJLENBQUMsR0FBRyxFQUFFO2lCQUNYLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLENBQUMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTNGLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNwRixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxNQUFXLEVBQUUsTUFBVztRQUN4QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDO2dCQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sWUFBWTtRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztRQUNwRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztRQUV2RixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QyxDQUFDO2FBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztRQUVyRSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixlQUFlLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRyxlQUFlLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQzt3R0FsTVUseUJBQXlCOzRGQUF6Qix5QkFBeUIsdTVDQUgxQixvQ0FBb0M7OzRGQUduQyx5QkFBeUI7a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsUUFBUSxFQUFFLG9DQUFvQztvQkFDOUMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBOZ3hTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnbmd4LXNvdXJjZSc7XG5pbXBvcnQgeyBJU3RpbXVsc29mdE9wdGlvbiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFN0aW11bHNvZnRTb3VyY2VOYW1lIH0gZnJvbSAnLi9zdGltdWxzb2Z0LXNvdXJjZS1uYW1lLm1vZGVsJztcbmltcG9ydCB7IFN0aW11bHNvZnRTZXJ2aWNlIH0gZnJvbSAnLi9zdGltdWxzb2Z0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVW5pcXVlQ29tcG9uZW50SWQgfSBmcm9tICcuL3V0aWwnO1xuXG5kZWNsYXJlIGxldCBTdGltdWxzb2Z0OiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zdGltdWxzb2Z0LXZpZXdlcicsXG4gIHRlbXBsYXRlOiBgIDxkaXYgZGlyPVwibHRyXCIgW2lkXT1cImlkKClcIj48L2Rpdj5gLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTdGltdWxzb2Z0Vmlld2VyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgc3RpbXVsc29mdFNlcnZpY2UgPSBpbmplY3QoU3RpbXVsc29mdFNlcnZpY2UpO1xuICByZWFkb25seSBzb3VyY2VTZXJ2aWNlID0gaW5qZWN0KE5neFNvdXJjZVNlcnZpY2UpO1xuICByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cbiAgcmVhZG9ubHkgaWQgPSBpbnB1dDxzdHJpbmc+KFVuaXF1ZUNvbXBvbmVudElkKCkpO1xuICByZWFkb25seSBiYXNlVXJsID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih0aGlzLnN0aW11bHNvZnRTZXJ2aWNlLmJhc2VVcmwpO1xuICByZWFkb25seSBmaWxlTmFtZSA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZm9udHMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkPih0aGlzLnN0aW11bHNvZnRTZXJ2aWNlLmZvbnRzKTtcbiAgcmVhZG9ubHkgZGF0YVNldCA9IGlucHV0LnJlcXVpcmVkPGFueT4oKTtcbiAgcmVhZG9ubHkgb3B0aW9ucyA9IGlucHV0PElTdGltdWxzb2Z0T3B0aW9uIHwgdW5kZWZpbmVkPih0aGlzLnN0aW11bHNvZnRTZXJ2aWNlLm9wdGlvbnMpO1xuICByZWFkb25seSBsaWNlbnNlS2V5ID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBsaWNlbnNlRmlsZSA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbG9jYWwgPSBpbnB1dDxzdHJpbmc+KCdlbicpO1xuICByZWFkb25seSBkaXIgPSBpbnB1dDwnbHRyJyB8ICdydGwnPignbHRyJyk7XG5cbiAgcmVhZG9ubHkgcmVhZHkgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvbkxvYWRSZXNvdXJjZUZhaWxlZCA9IG91dHB1dDx7IHNvdXJjZTogc3RyaW5nOyBlcnJvcjogYW55IH0+KCk7XG5cbiAgcHJpdmF0ZSB2aWV3ZXJPcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgdmlld2VyOiBhbnk7XG4gIHByaXZhdGUgcmVwb3J0OiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0xvYWRlZFNvdXJjZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFpbFJlc291cmNlc0Rvd25sb2FkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkluaXRpYWxpemUgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmlzTG9hZGVkU291cmNlKCkgJiYgIXRoaXMuZmFpbFJlc291cmNlc0Rvd25sb2FkKCkgJiYgISF0aGlzLmZpbGVOYW1lKCkgJiYgISF0aGlzLmRhdGFTZXQoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNvdXJjZVNlcnZpY2UuYWRkU291cmNlcyguLi50aGlzLnN0aW11bHNvZnRTZXJ2aWNlLnN0aW11bHNvZnRTb3VyY2VTdG9yZSk7XG5cbiAgICB0aGlzLmxvYWRSZXNvdXJjZXMoKS50aGVuKCk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FuSW5pdGlhbGl6ZSgpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbXG4gICAgICAgICAgdGhpcy5vcHRpb25zKCksXG4gICAgICAgICAgdGhpcy5mb250cygpLFxuICAgICAgICAgIHRoaXMuZGF0YVNldCgpLFxuICAgICAgICAgIHRoaXMuZmlsZU5hbWUoKSxcbiAgICAgICAgICB0aGlzLmlkKCksXG4gICAgICAgICAgdGhpcy5saWNlbnNlS2V5KCksXG4gICAgICAgICAgdGhpcy5saWNlbnNlRmlsZSgpLFxuICAgICAgICAgIHRoaXMubG9jYWwoKSxcbiAgICAgICAgICB0aGlzLmRpcigpLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3ZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlc291cmNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvYWRpbmcuZW1pdCh0cnVlKTtcbiAgICBjb25zdCBzb3VyY2VzID0gW1N0aW11bHNvZnRTb3VyY2VOYW1lLlJFUE9SVEVSX1NDUklQVCwgU3RpbXVsc29mdFNvdXJjZU5hbWUuVklFV0VSX1NDUklQVF07XG5cbiAgICBpZiAodGhpcy5zdGltdWxzb2Z0U2VydmljZS52aWV3ZXJDc3NVcmwpIHtcbiAgICAgIHNvdXJjZXMucHVzaChTdGltdWxzb2Z0U291cmNlTmFtZS5WSUVXRVJfU1RZTEUpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNvdXJjZVNlcnZpY2UubG9hZEJ5U291cmNlTmFtZXMoLi4uc291cmNlcyk7XG4gICAgICB0aGlzLmlzTG9hZGVkU291cmNlLnNldCh0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5mYWlsUmVzb3VyY2VzRG93bmxvYWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5vbkxvYWRSZXNvdXJjZUZhaWxlZC5lbWl0KHsgc291cmNlOiAnc3RpbXVsc29mdCcsIGVycm9yIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVmlld2VyKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgU3RpbXVsc29mdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMub25Mb2FkUmVzb3VyY2VGYWlsZWQuZW1pdCh7IGVycm9yOiAnU3RpbXVsc29mdCB1bmRlZmluZWQnLCBzb3VyY2U6ICdnbG9iYWwnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVhZHkuZW1pdChmYWxzZSk7XG5cbiAgICB0aGlzLnZpZXdlck9wdGlvbnMgPSBuZXcgU3RpbXVsc29mdC5WaWV3ZXIuU3RpVmlld2VyT3B0aW9ucygpO1xuICAgIHRoaXMudmlld2VyT3B0aW9ucy5hcHBlYXJhbmNlLnJpZ2h0VG9MZWZ0ID0gdGhpcy5kaXIoKSA9PT0gJ3J0bCc7XG4gICAgdGhpcy52aWV3ZXIgPSBuZXcgU3RpbXVsc29mdC5WaWV3ZXIuU3RpVmlld2VyKHRoaXMudmlld2VyT3B0aW9ucywgJ1N0aVZpZXdlcicsIGZhbHNlKTtcbiAgICB0aGlzLnJlcG9ydCA9IG5ldyBTdGltdWxzb2Z0LlJlcG9ydC5TdGlSZXBvcnQoKTtcblxuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG4gICAgdGhpcy5zZXR1cFJlcG9ydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuICAgIHRoaXMuZGVlcE1lcmdlKHRoaXMuc3RpbXVsc29mdFNlcnZpY2Uub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5kZWVwTWVyZ2Uob3B0aW9ucywgdGhpcy52aWV3ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVlcE1lcmdlKHNvdXJjZTogYW55LCB0YXJnZXQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRlZXBNZXJnZSh2YWx1ZSwgKHRhcmdldFtrZXldID8/PSB7fSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVwb3J0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXJPcHRpb25zIHx8ICF0aGlzLnZpZXdlciB8fCAhdGhpcy5yZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5Rm9udHMoKTtcbiAgICB0aGlzLmxvYWRSZXBvcnRGaWxlKCk7XG4gICAgdGhpcy5yZWdpc3RlckRhdGFTZXQoKTtcbiAgICB0aGlzLmFwcGx5TGljZW5zZSgpO1xuICAgIHRoaXMuc2V0TG9jYWxlKCk7XG5cbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKCkpO1xuICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKGBFbGVtZW50IHdpdGggaWQgXCIke3RoaXMuaWQoKX1cIiBub3QgZm91bmQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWFkeS5lbWl0KHRydWUpO1xuICAgIHRoaXMucmVwb3J0LnJlbmRlckFzeW5jKCgpID0+IHtcbiAgICAgIHRoaXMudmlld2VyLnJlcG9ydCA9IHRoaXMucmVwb3J0O1xuICAgICAgdGhpcy52aWV3ZXIucmVuZGVySHRtbCh0aGlzLmlkKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvbnRzID0gdGhpcy5mb250cygpO1xuICAgIGlmICghZm9udHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdXJsXSBvZiBPYmplY3QuZW50cmllcyhmb250cykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIFN0aW11bHNvZnQuQmFzZS5TdGlGb250Q29sbGVjdGlvbi5hZGRGb250RmlsZSh1cmwsIG5hbWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbid0IGxvYWQgZm9udDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckRhdGFTZXQoKTogdm9pZCB7XG4gICAgY29uc3QganNvbiA9IHRoaXMuZGF0YVNldCgpO1xuICAgIGlmICghanNvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhU2V0ID0gbmV3IFN0aW11bHNvZnQuU3lzdGVtLkRhdGEuRGF0YVNldCgnRGF0YVNldCcpO1xuICAgIGRhdGFTZXQucmVhZEpzb24oSlNPTi5zdHJpbmdpZnkoanNvbikpO1xuICAgIHRoaXMucmVwb3J0LmRpY3Rpb25hcnkuZGF0YWJhc2VzLmNsZWFyKCk7XG4gICAgdGhpcy5yZXBvcnQucmVnRGF0YSgnRGF0YVNldCcsICdEYXRhU2V0JywgZGF0YVNldCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5TGljZW5zZSgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmxpY2Vuc2VLZXkoKSA/PyB0aGlzLnN0aW11bHNvZnRTZXJ2aWNlLnN0aW11bHNvZnRDb25maWcubGljZW5zZUtleTtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5saWNlbnNlRmlsZSgpID8/IHRoaXMuc3RpbXVsc29mdFNlcnZpY2Uuc3RpbXVsc29mdENvbmZpZy5saWNlbnNlRmlsZTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIFN0aW11bHNvZnQuQmFzZS5TdGlMaWNlbnNlLktleSA9IGtleTtcbiAgICB9IGVsc2UgaWYgKGZpbGUpIHtcbiAgICAgIFN0aW11bHNvZnQuQmFzZS5TdGlMaWNlbnNlLmxvYWRGcm9tRmlsZShmaWxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRSZXBvcnRGaWxlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZpbGVOYW1lKCk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZVVybCgpID8/ICcnO1xuICAgIHRoaXMucmVwb3J0LmxvYWRGaWxlKGJhc2UgKyBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9jYWxlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGltdWxzb2Z0U2VydmljZS5sb2NhbGl6YXRpb25QYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsID0gdGhpcy5sb2NhbCgpO1xuICAgIGNvbnN0IHN0aUxvY2FsaXphdGlvbiA9IFN0aW11bHNvZnQuQmFzZS5Mb2NhbGl6YXRpb24uU3RpTG9jYWxpemF0aW9uO1xuXG4gICAgaWYgKGxvY2FsID09PSAnZW4nKSB7XG4gICAgICBzdGlMb2NhbGl6YXRpb24uY3VsdHVyZU5hbWUgPSAnRW5nbGlzaCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhdGggPSBbdGhpcy5zdGltdWxzb2Z0U2VydmljZS5sb2NhbGl6YXRpb25QYXRoLnJlcGxhY2UoL1xcLyQvZywgJycpLCBgJHtsb2NhbH0ueG1sYF0uam9pbignLycpO1xuICAgICAgc3RpTG9jYWxpemF0aW9uLmN1bHR1cmVOYW1lID0gc3RpTG9jYWxpemF0aW9uLmxvYWRMb2NhbGl6YXRpb25GaWxlKHBhdGgpO1xuICAgIH1cbiAgfVxufVxuIl19