UNPKG

cytoscape-angular-ng17

Version:
233 lines 25.3 kB
import { Component, Input, ViewChild, } from '@angular/core'; import cytoscape from 'cytoscape'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "primeng/progressspinner"; /** * The API is a little odd to provide flexibility. * EITHER bind to cyOptions (type CytoscapeOptions), to control the options yourself * OR this component will build a CytoscapeOptions internally by using all the other inputs. * If cyOptions is supplied, all other inputs are ignored. * The cyOptions container (HTML element) is always ignored and set internally. */ export class CytoscapeGraphComponent { cyGraph; debug = false; nodes; edges; autolock; autoungrabify; autounselectify; boxSelectionEnabled; desktopTapThreshold; hideEdgesOnViewport; hideLabelsOnViewport; layoutOptions; maxZoom; minZoom; motionBlur; motionBlurOpacity; pan; panningEnabled; pixelRatio; selectionType; style; styleEnabled; textureOnViewport; touchTapThreshold; userPanningEnabled; userZoomingEnabled; wheelSensitivity; zoom; zoomingEnabled; showToolbar = true; cyOptions; cy; loading = false; constructor() { } ngOnChanges(changes) { console.log('cytoscape graph component ngOnChanges. changes:', JSON.stringify(changes)); if (changes['style']) { console.log('changes["style"]:', JSON.stringify(changes['style'])); this.runWhileLoading(this.updateStyles.bind(this)); } } getCy() { return this.cy; } centerElements(selector) { if (!this.cy) { return; } const elems = this.cy.$(selector); this.cy.center(elems); } zoomToElement(selector, level = 3) { let position = this.cy?.$(selector)?.position(); if (!position) { console.warn(`Cannot zoom to ${selector}`); } this.cy.zoom({ level: level, position: position, }); } render() { this.runWhileLoading(this.rerender.bind(this)); } runWhileLoading(f) { this.loading = true; setTimeout(() => { f(); setTimeout(() => { this.loading = false; }, 30); }, 0); } updateStyles() { if (this.cy && this.style) { this.cy.style(this.style); } } rerender() { //TODO : this takes a heavy-handed approach, refine for performance if (!this.cyGraph) { console.warn(`No cyGraph found`); return; } const cyOptions = this.cyOptions || { // ignored, use nodes and edges // elements: this.elements, autolock: this.autolock, autoungrabify: this.autoungrabify, autounselectify: this.autounselectify, boxSelectionEnabled: this.boxSelectionEnabled, container: this.cyGraph.nativeElement, desktopTapThreshold: this.desktopTapThreshold, hideEdgesOnViewport: this.hideEdgesOnViewport, hideLabelsOnViewport: this.hideLabelsOnViewport, layout: this.layoutOptions, maxZoom: this.maxZoom, minZoom: this.minZoom, motionBlur: this.motionBlur, motionBlurOpacity: this.motionBlurOpacity, pan: this.pan, panningEnabled: this.panningEnabled, pixelRatio: this.pixelRatio, selectionType: this.selectionType, style: this.style, styleEnabled: this.styleEnabled, textureOnViewport: this.textureOnViewport, touchTapThreshold: this.touchTapThreshold, userPanningEnabled: this.userPanningEnabled, userZoomingEnabled: this.userZoomingEnabled, wheelSensitivity: this.wheelSensitivity, zoomingEnabled: this.zoomingEnabled, zoom: this.zoom, }; // TODO do reset() instead? if (!this.cy) { this.cy = cytoscape(cyOptions); } this.cy.startBatch(); this.cy.boxSelectionEnabled(this.boxSelectionEnabled); this.cy.nodes().remove(); this.cy.edges().remove(); if (this.nodes) { this.cy.add(this.nodes); } if (this.edges) { this.cy.add(this.edges); } this.cy.endBatch(); if (this.layoutOptions) { this.cy.layout(this.layoutOptions).run(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CytoscapeGraphComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: CytoscapeGraphComponent, selector: "cytoscape-graph", inputs: { debug: "debug", nodes: "nodes", edges: "edges", autolock: "autolock", autoungrabify: "autoungrabify", autounselectify: "autounselectify", boxSelectionEnabled: "boxSelectionEnabled", desktopTapThreshold: "desktopTapThreshold", hideEdgesOnViewport: "hideEdgesOnViewport", hideLabelsOnViewport: "hideLabelsOnViewport", layoutOptions: "layoutOptions", maxZoom: "maxZoom", minZoom: "minZoom", motionBlur: "motionBlur", motionBlurOpacity: "motionBlurOpacity", pan: "pan", panningEnabled: "panningEnabled", pixelRatio: "pixelRatio", selectionType: "selectionType", style: "style", styleEnabled: "styleEnabled", textureOnViewport: "textureOnViewport", touchTapThreshold: "touchTapThreshold", userPanningEnabled: "userPanningEnabled", userZoomingEnabled: "userZoomingEnabled", wheelSensitivity: "wheelSensitivity", zoom: "zoom", zoomingEnabled: "zoomingEnabled", showToolbar: "showToolbar" }, viewQueries: [{ propertyName: "cyGraph", first: true, predicate: ["cyGraph"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <p-progressSpinner *ngIf="loading" class="spinner" strokeWidth="4" fill="#EEEEEE" animationDuration=".5s" ></p-progressSpinner> <div #cyGraph class="graphWrapper"></div> `, isInline: true, styles: [".spinner{position:absolute;left:\"350px\";z-index:10;width:\"250px\";height:\"250px\"}@keyframes ui-progress-spinner-color{to,0%{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.graphWrapper{height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CytoscapeGraphComponent, decorators: [{ type: Component, args: [{ selector: 'cytoscape-graph', template: ` <p-progressSpinner *ngIf="loading" class="spinner" strokeWidth="4" fill="#EEEEEE" animationDuration=".5s" ></p-progressSpinner> <div #cyGraph class="graphWrapper"></div> `, styles: [".spinner{position:absolute;left:\"350px\";z-index:10;width:\"250px\";height:\"250px\"}@keyframes ui-progress-spinner-color{to,0%{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.graphWrapper{height:100%;width:100%}\n"] }] }], ctorParameters: () => [], propDecorators: { cyGraph: [{ type: ViewChild, args: ['cyGraph'] }], debug: [{ type: Input }], nodes: [{ type: Input }], edges: [{ type: Input }], autolock: [{ type: Input }], autoungrabify: [{ type: Input }], autounselectify: [{ type: Input }], boxSelectionEnabled: [{ type: Input }], desktopTapThreshold: [{ type: Input }], hideEdgesOnViewport: [{ type: Input }], hideLabelsOnViewport: [{ type: Input }], layoutOptions: [{ type: Input }], maxZoom: [{ type: Input }], minZoom: [{ type: Input }], motionBlur: [{ type: Input }], motionBlurOpacity: [{ type: Input }], pan: [{ type: Input }], panningEnabled: [{ type: Input }], pixelRatio: [{ type: Input }], selectionType: [{ type: Input }], style: [{ type: Input }], styleEnabled: [{ type: Input }], textureOnViewport: [{ type: Input }], touchTapThreshold: [{ type: Input }], userPanningEnabled: [{ type: Input }], userZoomingEnabled: [{ type: Input }], wheelSensitivity: [{ type: Input }], zoom: [{ type: Input }], zoomingEnabled: [{ type: Input }], showToolbar: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxTQVFOLE1BQU0sV0FBVyxDQUFDOzs7O0FBR25COzs7Ozs7R0FNRztBQTZDSCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDLE9BQU8sQ0FBeUI7SUFHaEMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUdkLEtBQUssQ0FBK0I7SUFFcEMsS0FBSyxDQUErQjtJQUdwQyxRQUFRLENBQXNCO0lBRTlCLGFBQWEsQ0FBc0I7SUFFbkMsZUFBZSxDQUFzQjtJQUVyQyxtQkFBbUIsQ0FBc0I7SUFFekMsbUJBQW1CLENBQXFCO0lBRXhDLG1CQUFtQixDQUFzQjtJQUV6QyxvQkFBb0IsQ0FBc0I7SUFFMUMsYUFBYSxDQUE0QjtJQUV6QyxPQUFPLENBQXFCO0lBRTVCLE9BQU8sQ0FBcUI7SUFFNUIsVUFBVSxDQUFzQjtJQUVoQyxpQkFBaUIsQ0FBcUI7SUFFdEMsR0FBRyxDQUF1QjtJQUUxQixjQUFjLENBQXNCO0lBRXBDLFVBQVUsQ0FBOEI7SUFFeEMsYUFBYSxDQUE0QjtJQUV6QyxLQUFLLENBQTJCO0lBRWhDLFlBQVksQ0FBc0I7SUFFbEMsaUJBQWlCLENBQXNCO0lBRXZDLGlCQUFpQixDQUFxQjtJQUV0QyxrQkFBa0IsQ0FBc0I7SUFFeEMsa0JBQWtCLENBQXNCO0lBRXhDLGdCQUFnQixDQUFxQjtJQUVyQyxJQUFJLENBQWdCO0lBRXBCLGNBQWMsQ0FBc0I7SUFFcEMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUVuQixTQUFTLENBQStCO0lBQ2hDLEVBQUUsQ0FBVztJQUNyQixP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TixPQUFPO3NCQUROLEtBQUs7Z0JBR04sT0FBTztzQkFETixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBR04sR0FBRztzQkFERixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLEtBQUs7c0JBREosS0FBSztnQkFHTixZQUFZO3NCQURYLEtBQUs7Z0JBR04saUJBQWlCO3NCQURoQixLQUFLO2dCQUdOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFHTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBR04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUdOLElBQUk7c0JBREgsS0FBSztnQkFHTixjQUFjO3NCQURiLEtBQUs7Z0JBR04sV0FBVztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgY3kgZnJvbSAnY3l0b3NjYXBlJztcbmltcG9ydCBjeXRvc2NhcGUsIHtcbiAgQ3l0b3NjYXBlT3B0aW9ucyxcbiAgRWRnZURlZmluaXRpb24sXG4gIExheW91dE9wdGlvbnMsXG4gIE5vZGVEZWZpbml0aW9uLFxuICBQb3NpdGlvbixcbiAgU2VsZWN0aW9uVHlwZSxcbiAgU3R5bGVzaGVldCxcbn0gZnJvbSAnY3l0b3NjYXBlJztcblxuXG4vKipcbiAqIFRoZSBBUEkgaXMgYSBsaXR0bGUgb2RkIHRvIHByb3ZpZGUgZmxleGliaWxpdHkuXG4gKiBFSVRIRVIgYmluZCB0byBjeU9wdGlvbnMgKHR5cGUgQ3l0b3NjYXBlT3B0aW9ucyksIHRvIGNvbnRyb2wgdGhlIG9wdGlvbnMgeW91cnNlbGZcbiAqIE9SIHRoaXMgY29tcG9uZW50IHdpbGwgYnVpbGQgYSBDeXRvc2NhcGVPcHRpb25zIGludGVybmFsbHkgYnkgdXNpbmcgYWxsIHRoZSBvdGhlciBpbnB1dHMuXG4gKiBJZiBjeU9wdGlvbnMgaXMgc3VwcGxpZWQsIGFsbCBvdGhlciBpbnB1dHMgYXJlIGlnbm9yZWQuXG4gKiBUaGUgY3lPcHRpb25zIGNvbnRhaW5lciAoSFRNTCBlbGVtZW50KSBpcyBhbHdheXMgaWdub3JlZCBhbmQgc2V0IGludGVybmFsbHkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N5dG9zY2FwZS1ncmFwaCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHAtcHJvZ3Jlc3NTcGlubmVyXG4gICAgICAqbmdJZj1cImxvYWRpbmdcIlxuICAgICAgY2xhc3M9XCJzcGlubmVyXCJcbiAgICAgIHN0cm9rZVdpZHRoPVwiNFwiXG4gICAgICBmaWxsPVwiI0VFRUVFRVwiXG4gICAgICBhbmltYXRpb25EdXJhdGlvbj1cIi41c1wiXG4gICAgPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPGRpdiAjY3lHcmFwaCBjbGFzcz1cImdyYXBoV3JhcHBlclwiPjwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuc3Bpbm5lciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogJzM1MHB4JztcbiAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIHdpZHRoOiAnMjUwcHgnO1xuICAgICAgICBoZWlnaHQ6ICcyNTBweCc7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHVpLXByb2dyZXNzLXNwaW5uZXItY29sb3Ige1xuICAgICAgICAxMDAlLFxuICAgICAgICAwJSB7XG4gICAgICAgICAgc3Ryb2tlOiAjZDYyZDIwO1xuICAgICAgICB9XG4gICAgICAgIDQwJSB7XG4gICAgICAgICAgc3Ryb2tlOiAjMDA1N2U3O1xuICAgICAgICB9XG4gICAgICAgIDY2JSB7XG4gICAgICAgICAgc3Ryb2tlOiAjMDA4NzQ0O1xuICAgICAgICB9XG4gICAgICAgIDgwJSxcbiAgICAgICAgOTAlIHtcbiAgICAgICAgICBzdHJva2U6ICNmZmE3MDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC5ncmFwaFdyYXBwZXIge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEN5dG9zY2FwZUdyYXBoQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnY3lHcmFwaCcpXG4gIGN5R3JhcGg6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgZGVidWcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBub2RlczogTm9kZURlZmluaXRpb25bXSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgZWRnZXM6IEVkZ2VEZWZpbml0aW9uW10gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgYXV0b2xvY2s6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIGF1dG91bmdyYWJpZnk6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIGF1dG91bnNlbGVjdGlmeTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgZGVza3RvcFRhcFRocmVzaG9sZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBoaWRlTGFiZWxzT25WaWV3cG9ydDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgbWF4Wm9vbTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBtaW5ab29tOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIG1vdGlvbkJsdXI6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHBhbjogUG9zaXRpb24gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHBhbm5pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBwaXhlbFJhdGlvOiBudW1iZXIgfCAnYXV0bycgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHNlbGVjdGlvblR5cGU6IFNlbGVjdGlvblR5cGUgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHN0eWxlOiBTdHlsZXNoZWV0W10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHN0eWxlRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgdGV4dHVyZU9uVmlld3BvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHRvdWNoVGFwVGhyZXNob2xkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgdXNlclpvb21pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICB3aGVlbFNlbnNpdGl2aXR5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHpvb206IDEgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIHpvb21pbmdFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBzaG93VG9vbGJhciA9IHRydWU7XG5cbiAgY3lPcHRpb25zOiBDeXRvc2NhcGVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGN5ITogY3kuQ29yZTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGFueSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnY3l0b3NjYXBlIGdyYXBoIGNvbXBvbmVudCBuZ09uQ2hhbmdlcy4gY2hhbmdlczonLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcylcbiAgICApO1xuICAgIGlmIChjaGFuZ2VzWydzdHlsZSddKSB7XG4gICAgICBjb25zb2xlLmxvZygnY2hhbmdlc1tcInN0eWxlXCJdOicsIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3N0eWxlJ10pKTtcbiAgICAgIHRoaXMucnVuV2hpbGVMb2FkaW5nKHRoaXMudXBkYXRlU3R5bGVzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDeSgpIHtcbiAgICByZXR1cm4gdGhpcy5jeTtcbiAgfVxuXG4gIHB1YmxpYyBjZW50ZXJFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIGlmICghdGhpcy5jeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtcyA9IHRoaXMuY3kuJChzZWxlY3Rvcik7XG4gICAgdGhpcy5jeS5jZW50ZXIoZWxlbXMpO1xuICB9XG5cbiAgcHVibGljIHpvb21Ub0VsZW1lbnQoc2VsZWN0b3I6IHN0cmluZywgbGV2ZWwgPSAzKSB7XG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jeT8uJChzZWxlY3Rvcik/LnBvc2l0aW9uKCk7XG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3Qgem9vbSB0byAke3NlbGVjdG9yfWApO1xuICAgIH1cbiAgICB0aGlzLmN5Lnpvb20oe1xuICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICB0aGlzLnJ1bldoaWxlTG9hZGluZyh0aGlzLnJlcmVuZGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJ1bldoaWxlTG9hZGluZyhmOiBGdW5jdGlvbikge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LCAzMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlcygpIHtcbiAgICBpZiAodGhpcy5jeSAmJiB0aGlzLnN0eWxlKSB7XG4gICAgICB0aGlzLmN5LnN0eWxlKHRoaXMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXJlbmRlcigpIHtcbiAgICAvL1RPRE8gOiB0aGlzIHRha2VzIGEgaGVhdnktaGFuZGVkIGFwcHJvYWNoLCByZWZpbmUgZm9yIHBlcmZvcm1hbmNlXG4gICAgaWYgKCF0aGlzLmN5R3JhcGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTm8gY3lHcmFwaCBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN5T3B0aW9ucyA9IHRoaXMuY3lPcHRpb25zIHx8IHtcbiAgICAgIC8vIGlnbm9yZWQsIHVzZSBub2RlcyBhbmQgZWRnZXNcbiAgICAgIC8vIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxuICAgICAgYXV0b2xvY2s6IHRoaXMuYXV0b2xvY2ssXG4gICAgICBhdXRvdW5ncmFiaWZ5OiB0aGlzLmF1dG91bmdyYWJpZnksXG4gICAgICBhdXRvdW5zZWxlY3RpZnk6IHRoaXMuYXV0b3Vuc2VsZWN0aWZ5LFxuICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdGhpcy5ib3hTZWxlY3Rpb25FbmFibGVkLFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN5R3JhcGgubmF0aXZlRWxlbWVudCxcbiAgICAgIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IHRoaXMuZGVza3RvcFRhcFRocmVzaG9sZCxcbiAgICAgIGhpZGVFZGdlc09uVmlld3BvcnQ6IHRoaXMuaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIGhpZGVMYWJlbHNPblZpZXdwb3J0OiB0aGlzLmhpZGVMYWJlbHNPblZpZXdwb3J0LFxuICAgICAgbGF5b3V0OiB0aGlzLmxheW91dE9wdGlvbnMsXG4gICAgICBtYXhab29tOiB0aGlzLm1heFpvb20sXG4gICAgICBtaW5ab29tOiB0aGlzLm1pblpvb20sXG4gICAgICBtb3Rpb25CbHVyOiB0aGlzLm1vdGlvbkJsdXIsXG4gICAgICBtb3Rpb25CbHVyT3BhY2l0eTogdGhpcy5tb3Rpb25CbHVyT3BhY2l0eSxcbiAgICAgIHBhbjogdGhpcy5wYW4sXG4gICAgICBwYW5uaW5nRW5hYmxlZDogdGhpcy5wYW5uaW5nRW5hYmxlZCxcbiAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgIHNlbGVjdGlvblR5cGU6IHRoaXMuc2VsZWN0aW9uVHlwZSxcbiAgICAgIHN0eWxlOiB0aGlzLnN0eWxlLFxuICAgICAgc3R5bGVFbmFibGVkOiB0aGlzLnN0eWxlRW5hYmxlZCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0OiB0aGlzLnRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgdG91Y2hUYXBUaHJlc2hvbGQ6IHRoaXMudG91Y2hUYXBUaHJlc2hvbGQsXG4gICAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IHRoaXMudXNlclBhbm5pbmdFbmFibGVkLFxuICAgICAgdXNlclpvb21pbmdFbmFibGVkOiB0aGlzLnVzZXJab29taW5nRW5hYmxlZCxcbiAgICAgIHdoZWVsU2Vuc2l0aXZpdHk6IHRoaXMud2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHpvb21pbmdFbmFibGVkOiB0aGlzLnpvb21pbmdFbmFibGVkLFxuICAgICAgem9vbTogdGhpcy56b29tLFxuICAgIH07XG4gICAgLy8gVE9ETyBkbyByZXNldCgpIGluc3RlYWQ/XG5cbiAgICBpZiAoIXRoaXMuY3kpIHtcbiAgICAgIHRoaXMuY3kgPSBjeXRvc2NhcGUoY3lPcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5jeS5zdGFydEJhdGNoKCk7XG4gICAgdGhpcy5jeS5ib3hTZWxlY3Rpb25FbmFibGVkKHRoaXMuYm94U2VsZWN0aW9uRW5hYmxlZCk7XG4gICAgdGhpcy5jeS5ub2RlcygpLnJlbW92ZSgpO1xuICAgIHRoaXMuY3kuZWRnZXMoKS5yZW1vdmUoKTtcbiAgICBpZiAodGhpcy5ub2Rlcykge1xuICAgICAgdGhpcy5jeS5hZGQodGhpcy5ub2Rlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLmN5LmFkZCh0aGlzLmVkZ2VzKTtcbiAgICB9XG4gICAgdGhpcy5jeS5lbmRCYXRjaCgpO1xuICAgIGlmICh0aGlzLmxheW91dE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY3kubGF5b3V0KHRoaXMubGF5b3V0T3B0aW9ucykucnVuKCk7XG4gICAgfVxuICB9XG59XG5cbi8qXG5HcmFkaWVudDpcblxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyA6IFRoZSBjb2xvdXJzIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50IHN0b3BzIChlLmcuIGN5YW4gbWFnZW50YSB5ZWxsb3cpLlxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyA6IFRoZSBwb3NpdGlvbnMgb2YgdGhlIGJhY2tncm91bmQgZ3JhZGllbnQgc3RvcHMgKGUuZy4gMCUgNTAlIDEwMCUpLiBJZiBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWQsIHRoZSBzdG9wcyB3aWxsIGRpdmlkZSBlcXVhbGx5LlxuYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24gOiBGb3IgYmFja2dyb3VuZC1maWxsOiBsaW5lYXItZ3JhZGllbnQsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6XG50by1ib3R0b20gKGRlZmF1bHQpXG50by10b3BcbnRvLWxlZnRcbnRvLXJpZ2h0XG50by1ib3R0b20tcmlnaHRcbnRvLWJvdHRvbS1sZWZ0XG50by10b3AtcmlnaHRcbnRvLXRvcC1sZWZ0XG4gKi9cbiJdfQ==