UNPKG

ngx-diagrams

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

603 lines 42.7 kB
/** * @fileoverview added by tsickle * Generated from: lib/services/engine.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, ComponentFactoryResolver, RendererFactory2 } from '@angular/core'; import { DiagramModel } from '../models/diagram.model'; import { DefaultNodeFactory } from '../defaults/factories/default-node.factory'; import { DefaultPortFactory } from '../defaults/factories/default-port.factory'; import { BehaviorSubject } from 'rxjs'; import { take, delay, filter } from 'rxjs/operators'; import { DefaultLinkFactory } from '../defaults/factories/default-link.factory'; import { NgxDiagramsModule } from '../ngx-diagrams.module'; import { DefaultLabelFactory } from '../defaults/factories/default-label.factory'; import * as i0 from "@angular/core"; import * as i1 from "../ngx-diagrams.module"; var DiagramEngine = /** @class */ (function () { function DiagramEngine(resolver, rendererFactory) { this.resolver = resolver; this.rendererFactory = rendererFactory; this._renderer = this.rendererFactory.createRenderer(null, null); this.nodeFactories = {}; this.linkFactories = {}; this.portFactories = {}; this.labelFactories = {}; this.canvas$ = new BehaviorSubject(null); } /** * @return {?} */ DiagramEngine.prototype.createDiagram = /** * @return {?} */ function () { this.diagramModel = new DiagramModel(this); return this.diagramModel; }; /** * @return {?} */ DiagramEngine.prototype.registerDefaultFactories = /** * @return {?} */ function () { this.registerNodeFactory(new DefaultNodeFactory(this.resolver, this._renderer)); this.registerPortFactory(new DefaultPortFactory(this.resolver, this._renderer)); this.registerLinkFactory(new DefaultLinkFactory(this.resolver, this._renderer)); this.registerLabelFactory(new DefaultLabelFactory(this.resolver, this._renderer)); }; //#region Factories // LABELS //#region Factories // LABELS /** * @param {?} labelFactory * @return {?} */ DiagramEngine.prototype.registerLabelFactory = //#region Factories // LABELS /** * @param {?} labelFactory * @return {?} */ function (labelFactory) { this.labelFactories[labelFactory.type] = labelFactory; }; /** * @return {?} */ DiagramEngine.prototype.getLabelFactories = /** * @return {?} */ function () { return this.labelFactories; }; /** * @param {?} type * @return {?} */ DiagramEngine.prototype.getLabelFactory = /** * @param {?} type * @return {?} */ function (type) { if (this.labelFactories[type]) { return this.labelFactories[type]; } throw new Error("cannot find factory for node of type: [" + type + "]"); }; /** * @param {?} label * @return {?} */ DiagramEngine.prototype.getFactoryForLabel = /** * @param {?} label * @return {?} */ function (label) { return this.getLabelFactory(label.getType()); }; /** * @param {?} label * @param {?} labelHost * @return {?} */ DiagramEngine.prototype.generateWidgetForLabel = /** * @param {?} label * @param {?} labelHost * @return {?} */ function (label, labelHost) { /** @type {?} */ var labelFactory = this.getFactoryForLabel(label); if (!labelFactory) { throw new Error("Cannot find widget factory for node: " + label.getType()); } return labelFactory.generateWidget(label, labelHost); }; // NODES // NODES /** * @param {?} nodeFactory * @return {?} */ DiagramEngine.prototype.registerNodeFactory = // NODES /** * @param {?} nodeFactory * @return {?} */ function (nodeFactory) { this.nodeFactories[nodeFactory.type] = nodeFactory; }; /** * @return {?} */ DiagramEngine.prototype.getNodeFactories = /** * @return {?} */ function () { return this.nodeFactories; }; /** * @param {?} type * @return {?} */ DiagramEngine.prototype.getNodeFactory = /** * @param {?} type * @return {?} */ function (type) { if (this.nodeFactories[type]) { return this.nodeFactories[type]; } throw new Error("cannot find factory for node of type: [" + type + "]"); }; /** * @param {?} node * @return {?} */ DiagramEngine.prototype.getFactoryForNode = /** * @param {?} node * @return {?} */ function (node) { return this.getNodeFactory(node.getType()); }; /** * @param {?} node * @param {?} nodesHost * @return {?} */ DiagramEngine.prototype.generateWidgetForNode = /** * @param {?} node * @param {?} nodesHost * @return {?} */ function (node, nodesHost) { /** @type {?} */ var nodeFactory = this.getFactoryForNode(node); if (!nodeFactory) { throw new Error("Cannot find widget factory for node: " + node.getType()); } return nodeFactory.generateWidget(this, node, nodesHost); }; // PORTS // PORTS /** * @param {?} factory * @return {?} */ DiagramEngine.prototype.registerPortFactory = // PORTS /** * @param {?} factory * @return {?} */ function (factory) { this.portFactories[factory.type] = factory; }; /** * @return {?} */ DiagramEngine.prototype.getPortFactories = /** * @return {?} */ function () { return this.portFactories; }; /** * @param {?} type * @return {?} */ DiagramEngine.prototype.getPortFactory = /** * @param {?} type * @return {?} */ function (type) { if (this.portFactories[type]) { return this.portFactories[type]; } throw new Error("cannot find factory for port of type: [" + type + "]"); }; /** * @param {?} port * @return {?} */ DiagramEngine.prototype.getFactoryForPort = /** * @param {?} port * @return {?} */ function (port) { return this.getPortFactory(port.getType()); }; /** * @param {?} port * @param {?} portsHost * @return {?} */ DiagramEngine.prototype.generateWidgetForPort = /** * @param {?} port * @param {?} portsHost * @return {?} */ function (port, portsHost) { /** @type {?} */ var portFactory = this.getFactoryForPort(port); if (!portFactory) { throw new Error("Cannot find widget factory for port: " + port.getType()); } return portFactory.generateWidget(port, portsHost); }; // LINKS // LINKS /** * @return {?} */ DiagramEngine.prototype.getLinkFactories = // LINKS /** * @return {?} */ function () { return this.linkFactories; }; /** * @param {?} factory * @return {?} */ DiagramEngine.prototype.registerLinkFactory = /** * @param {?} factory * @return {?} */ function (factory) { this.linkFactories[factory.type] = factory; }; /** * @param {?} type * @return {?} */ DiagramEngine.prototype.getLinkFactory = /** * @param {?} type * @return {?} */ function (type) { if (this.linkFactories[type]) { return this.linkFactories[type]; } throw new Error("cannot find factory for link of type: [" + type + "]"); }; /** * @param {?} link * @return {?} */ DiagramEngine.prototype.getFactoryForLink = /** * @param {?} link * @return {?} */ function (link) { return this.getLinkFactory(link.getType()); }; /** * @param {?} link * @param {?} linksHost * @return {?} */ DiagramEngine.prototype.generateWidgetForLink = /** * @param {?} link * @param {?} linksHost * @return {?} */ function (link, linksHost) { /** @type {?} */ var linkFactory = this.getFactoryForLink(link); if (!linkFactory) { throw new Error("Cannot find link factory for link: " + link.getType()); } return linkFactory.generateWidget(this, link, linksHost); }; //#endregion //#endregion /** * @param {?} node * @return {?} */ DiagramEngine.prototype.getNodeElement = //#endregion /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var selector = this.canvas$.getValue().querySelector("[data-nodeid=\"" + node.id + "\"]"); if (selector === null) { throw new Error('Cannot find Node element with node id: [' + node.id + ']'); } return (/** @type {?} */ (selector)); }; /** * @param {?} port * @return {?} */ DiagramEngine.prototype.getNodePortElement = /** * @param {?} port * @return {?} */ function (port) { /** @type {?} */ var selector = this.canvas$.getValue().querySelector("[data-nodeid=\"" + port.getParent().id + "\"] [data-portid=\"" + port.id + "\"]"); if (selector === null) { throw new Error('Cannot find Node Port element with node id: [' + port.getParent().id + '] and port id: [' + port.id + ']'); } return (/** @type {?} */ (selector)); }; /** * @param {?} port * @return {?} */ DiagramEngine.prototype.getPortCenter = /** * @param {?} port * @return {?} */ function (port) { /** @type {?} */ var sourceElement = this.getNodePortElement(port); /** @type {?} */ var sourceRect = sourceElement.getBoundingClientRect(); /** @type {?} */ var rel = this.getRelativePoint(sourceRect.left, sourceRect.top); return { x: sourceElement.offsetWidth / 2 + (rel.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100.0), y: sourceElement.offsetHeight / 2 + (rel.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100.0) }; }; /** * Calculate rectangular coordinates of the port passed in. */ /** * Calculate rectangular coordinates of the port passed in. * @param {?} port * @return {?} */ DiagramEngine.prototype.getPortCoords = /** * Calculate rectangular coordinates of the port passed in. * @param {?} port * @return {?} */ function (port) { /** @type {?} */ var sourceElement = this.getNodePortElement(port); /** @type {?} */ var sourceRect = (/** @type {?} */ (sourceElement.getBoundingClientRect())); /** @type {?} */ var canvasRect = (/** @type {?} */ (this.canvas$.getValue().getBoundingClientRect())); return { x: (sourceRect.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100.0) - canvasRect.left, y: (sourceRect.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100.0) - canvasRect.top, width: sourceRect.width, height: sourceRect.height }; }; /** * Determine the width and height of the node passed in. * It currently assumes nodes have a rectangular shape, can be overriden for customised shapes. */ /** * Determine the width and height of the node passed in. * It currently assumes nodes have a rectangular shape, can be overriden for customised shapes. * @param {?} node * @return {?} */ DiagramEngine.prototype.getNodeDimensions = /** * Determine the width and height of the node passed in. * It currently assumes nodes have a rectangular shape, can be overriden for customised shapes. * @param {?} node * @return {?} */ function (node) { if (!this.canvas$.getValue()) { return { width: 0, height: 0 }; } /** @type {?} */ var nodeElement = this.getNodeElement(node); /** @type {?} */ var nodeRect = nodeElement.getBoundingClientRect(); return { width: nodeRect.width, height: nodeRect.height }; }; /** * @param {?} canvas * @return {?} */ DiagramEngine.prototype.setCanvas = /** * @param {?} canvas * @return {?} */ function (canvas) { this.canvas$.next(canvas); }; /** * @param {?} event * @return {?} */ DiagramEngine.prototype.getRelativeMousePoint = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var point = this.getRelativePoint(event.clientX, event.clientY); return { x: (point.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100.0), y: (point.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100.0) }; }; /** * @param {?} x * @param {?} y * @return {?} */ DiagramEngine.prototype.getRelativePoint = /** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { /** @type {?} */ var canvasRect = this.canvas$.getValue().getBoundingClientRect(); return { x: x - canvasRect.left, y: y - canvasRect.top }; }; /** * @return {?} */ DiagramEngine.prototype.getDiagramModel = /** * @return {?} */ function () { return this.diagramModel; }; /** * @param {?} model * @return {?} */ DiagramEngine.prototype.isModelLocked = /** * @param {?} model * @return {?} */ function (model) { if (this.diagramModel.getLocked()) { return true; } return model.getLocked(); }; /** * auto arrange the graph */ /** * auto arrange the graph * @return {?} */ DiagramEngine.prototype.autoArrange = /** * auto arrange the graph * @return {?} */ function () { }; /** * fit the canvas zoom levels to the elements contained. * @param additionalZoomFactor allow for further zooming out to make sure edges doesn't cut */ /** * fit the canvas zoom levels to the elements contained. * @param {?=} additionalZoomFactor allow for further zooming out to make sure edges doesn't cut * @return {?} */ DiagramEngine.prototype.zoomToFit = /** * fit the canvas zoom levels to the elements contained. * @param {?=} additionalZoomFactor allow for further zooming out to make sure edges doesn't cut * @return {?} */ function (additionalZoomFactor) { var _this = this; if (additionalZoomFactor === void 0) { additionalZoomFactor = 0.005; } this.canvas$ .pipe(filter(Boolean), take(1), delay(0)) .subscribe((/** * @param {?} canvas * @return {?} */ function (canvas) { /** @type {?} */ var xFactor = canvas.clientWidth / canvas.scrollWidth; /** @type {?} */ var yFactor = canvas.clientHeight / canvas.scrollHeight; /** @type {?} */ var zoomFactor = xFactor < yFactor ? xFactor : yFactor; _this.diagramModel.setZoomLevel(_this.diagramModel.getZoomLevel() * (zoomFactor - additionalZoomFactor)); _this.diagramModel.setOffset(0, 0); })); }; DiagramEngine.decorators = [ { type: Injectable, args: [{ providedIn: NgxDiagramsModule },] } ]; /** @nocollapse */ DiagramEngine.ctorParameters = function () { return [ { type: ComponentFactoryResolver }, { type: RendererFactory2 } ]; }; /** @nocollapse */ DiagramEngine.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function DiagramEngine_Factory() { return new DiagramEngine(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(i0.RendererFactory2)); }, token: DiagramEngine, providedIn: i1.NgxDiagramsModule }); return DiagramEngine; }()); export { DiagramEngine }; if (false) { /** * @type {?} * @private */ DiagramEngine.prototype._renderer; /** * @type {?} * @private */ DiagramEngine.prototype.nodeFactories; /** * @type {?} * @private */ DiagramEngine.prototype.labelFactories; /** * @type {?} * @private */ DiagramEngine.prototype.linkFactories; /** * @type {?} * @private */ DiagramEngine.prototype.portFactories; /** * @type {?} * @private */ DiagramEngine.prototype.canvas$; /** @type {?} */ DiagramEngine.prototype.diagramModel; /** * @type {?} * @private */ DiagramEngine.prototype.resolver; /** * @type {?} * @private */ DiagramEngine.prototype.rendererFactory; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtZGlhZ3JhbXMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZW5naW5lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUE2QyxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUczRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7O0FBRWxGO0lBV0MsdUJBQW9CLFFBQWtDLEVBQVUsZUFBaUM7UUFBN0UsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFDaEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7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QUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDdkcsS0FBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBOVFELFVBQVUsU0FBQyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRTs7OztnQkFuQnhCLHdCQUF3QjtnQkFBNkMsZ0JBQWdCOzs7d0JBQTFHO0NBa1NDLEFBL1FELElBK1FDO1NBOVFZLGFBQWE7Ozs7OztJQUN6QixrQ0FBNkI7Ozs7O0lBQzdCLHNDQUE0RDs7Ozs7SUFDNUQsdUNBQThEOzs7OztJQUM5RCxzQ0FBNEQ7Ozs7O0lBQzVELHNDQUE0RDs7Ozs7SUFDNUQsZ0NBQTBDOztJQUUxQyxxQ0FBMkI7Ozs7O0lBRWYsaUNBQTBDOzs7OztJQUFFLHdDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgVmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50UmVmLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Tm9kZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvbm9kZS5mYWN0b3J5JztcbmltcG9ydCB7IERpYWdyYW1Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9kaWFncmFtLm1vZGVsJztcbmltcG9ydCB7IERlZmF1bHROb2RlRmFjdG9yeSB9IGZyb20gJy4uL2RlZmF1bHRzL2ZhY3Rvcmllcy9kZWZhdWx0LW5vZGUuZmFjdG9yeSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBBYnN0cmFjdExpbmtGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL2xpbmsuZmFjdG9yeSc7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcnRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL3BvcnQuZmFjdG9yeSc7XG5pbXBvcnQgeyBEZWZhdWx0UG9ydEZhY3RvcnkgfSBmcm9tICcuLi9kZWZhdWx0cy9mYWN0b3JpZXMvZGVmYXVsdC1wb3J0LmZhY3RvcnknO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2xpbmsubW9kZWwnO1xuaW1wb3J0IHsgUG9ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3BvcnQubW9kZWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCBkZWxheSwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGVmYXVsdExpbmtGYWN0b3J5IH0gZnJvbSAnLi4vZGVmYXVsdHMvZmFjdG9yaWVzL2RlZmF1bHQtbGluay5mYWN0b3J5JztcbmltcG9ydCB7IEJhc2VFbnRpdHkgfSBmcm9tICcuLi9iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBOZ3hEaWFncmFtc01vZHVsZSB9IGZyb20gJy4uL25neC1kaWFncmFtcy5tb2R1bGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RMYWJlbEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvbGFiZWwuZmFjdG9yeSc7XG5pbXBvcnQgeyBMYWJlbE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2xhYmVsLm1vZGVsJztcbmltcG9ydCB7IERlZmF1bHRMYWJlbEZhY3RvcnkgfSBmcm9tICcuLi9kZWZhdWx0cy9mYWN0b3JpZXMvZGVmYXVsdC1sYWJlbC5mYWN0b3J5JztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBOZ3hEaWFncmFtc01vZHVsZSB9KVxuZXhwb3J0IGNsYXNzIERpYWdyYW1FbmdpbmUge1xuXHRwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyO1xuXHRwcml2YXRlIG5vZGVGYWN0b3JpZXM6IHsgW3M6IHN0cmluZ106IEFic3RyYWN0Tm9kZUZhY3RvcnkgfTtcblx0cHJpdmF0ZSBsYWJlbEZhY3RvcmllczogeyBbczogc3RyaW5nXTogQWJzdHJhY3RMYWJlbEZhY3RvcnkgfTtcblx0cHJpdmF0ZSBsaW5rRmFjdG9yaWVzOiB7IFtzOiBzdHJpbmddOiBBYnN0cmFjdExpbmtGYWN0b3J5IH07XG5cdHByaXZhdGUgcG9ydEZhY3RvcmllczogeyBbczogc3RyaW5nXTogQWJzdHJhY3RQb3J0RmFjdG9yeSB9O1xuXHRwcml2YXRlIGNhbnZhcyQ6IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50PjtcblxuXHRkaWFncmFtTW9kZWw6IERpYWdyYW1Nb2RlbDtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyKSB7XG5cdFx0dGhpcy5fcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcblx0XHR0aGlzLm5vZGVGYWN0b3JpZXMgPSB7fTtcblx0XHR0aGlzLmxpbmtGYWN0b3JpZXMgPSB7fTtcblx0XHR0aGlzLnBvcnRGYWN0b3JpZXMgPSB7fTtcblx0XHR0aGlzLmxhYmVsRmFjdG9yaWVzID0ge307XG5cdFx0dGhpcy5jYW52YXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50PihudWxsKTtcblx0fVxuXG5cdGNyZWF0ZURpYWdyYW0oKSB7XG5cdFx0dGhpcy5kaWFncmFtTW9kZWwgPSBuZXcgRGlhZ3JhbU1vZGVsKHRoaXMpO1xuXHRcdHJldHVybiB0aGlzLmRpYWdyYW1Nb2RlbDtcblx0fVxuXG5cdHJlZ2lzdGVyRGVmYXVsdEZhY3RvcmllcygpIHtcblx0XHR0aGlzLnJlZ2lzdGVyTm9kZUZhY3RvcnkobmV3IERlZmF1bHROb2RlRmFjdG9yeSh0aGlzLnJlc29sdmVyLCB0aGlzLl9yZW5kZXJlcikpO1xuXHRcdHRoaXMucmVnaXN0ZXJQb3J0RmFjdG9yeShuZXcgRGVmYXVsdFBvcnRGYWN0b3J5KHRoaXMucmVzb2x2ZXIsIHRoaXMuX3JlbmRlcmVyKSk7XG5cdFx0dGhpcy5yZWdpc3RlckxpbmtGYWN0b3J5KG5ldyBEZWZhdWx0TGlua0ZhY3RvcnkodGhpcy5yZXNvbHZlciwgdGhpcy5fcmVuZGVyZXIpKTtcblx0XHR0aGlzLnJlZ2lzdGVyTGFiZWxGYWN0b3J5KG5ldyBEZWZhdWx0TGFiZWxGYWN0b3J5KHRoaXMucmVzb2x2ZXIsIHRoaXMuX3JlbmRlcmVyKSk7XG5cdH1cblxuXHQvLyNyZWdpb24gRmFjdG9yaWVzXG5cdC8vIExBQkVMU1xuXHRyZWdpc3RlckxhYmVsRmFjdG9yeShsYWJlbEZhY3Rvcnk6IEFic3RyYWN0TGFiZWxGYWN0b3J5KSB7XG5cdFx0dGhpcy5sYWJlbEZhY3Rvcmllc1tsYWJlbEZhY3RvcnkudHlwZV0gPSBsYWJlbEZhY3Rvcnk7XG5cdH1cblxuXHRnZXRMYWJlbEZhY3RvcmllcygpOiB7IFtzOiBzdHJpbmddOiBBYnN0cmFjdExhYmVsRmFjdG9yeSB9IHtcblx0XHRyZXR1cm4gdGhpcy5sYWJlbEZhY3Rvcmllcztcblx0fVxuXG5cdGdldExhYmVsRmFjdG9yeSh0eXBlOiBzdHJpbmcpOiBBYnN0cmFjdExhYmVsRmFjdG9yeSB7XG5cdFx0aWYgKHRoaXMubGFiZWxGYWN0b3JpZXNbdHlwZV0pIHtcblx0XHRcdHJldHVybiB0aGlzLmxhYmVsRmFjdG9yaWVzW3R5cGVdO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBmaW5kIGZhY3RvcnkgZm9yIG5vZGUgb2YgdHlwZTogWyR7dHlwZX1dYCk7XG5cdH1cblxuXHRnZXRGYWN0b3J5Rm9yTGFiZWwobGFiZWw6IExhYmVsTW9kZWwpOiBBYnN0cmFjdExhYmVsRmFjdG9yeSB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmdldExhYmVsRmFjdG9yeShsYWJlbC5nZXRUeXBlKCkpO1xuXHR9XG5cblx0Z2VuZXJhdGVXaWRnZXRGb3JMYWJlbChsYWJlbDogTGFiZWxNb2RlbCwgbGFiZWxIb3N0OiBWaWV3Q29udGFpbmVyUmVmKTogQ29tcG9uZW50UmVmPExhYmVsTW9kZWw+IHwgbnVsbCB7XG5cdFx0Y29uc3QgbGFiZWxGYWN0b3J5ID0gdGhpcy5nZXRGYWN0b3J5Rm9yTGFiZWwobGFiZWwpO1xuXHRcdGlmICghbGFiZWxGYWN0b3J5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHdpZGdldCBmYWN0b3J5IGZvciBub2RlOiAke2xhYmVsLmdldFR5cGUoKX1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGxhYmVsRmFjdG9yeS5nZW5lcmF0ZVdpZGdldChsYWJlbCwgbGFiZWxIb3N0KTtcblx0fVxuXG5cdC8vIE5PREVTXG5cdHJlZ2lzdGVyTm9kZUZhY3Rvcnkobm9kZUZhY3Rvcnk6IEFic3RyYWN0Tm9kZUZhY3RvcnkpIHtcblx0XHR0aGlzLm5vZGVGYWN0b3JpZXNbbm9kZUZhY3RvcnkudHlwZV0gPSBub2RlRmFjdG9yeTtcblx0fVxuXG5cdGdldE5vZGVGYWN0b3JpZXMoKTogeyBbczogc3RyaW5nXTogQWJzdHJhY3ROb2RlRmFjdG9yeSB9IHtcblx0XHRyZXR1cm4gdGhpcy5ub2RlRmFjdG9yaWVzO1xuXHR9XG5cblx0Z2V0Tm9kZUZhY3RvcnkodHlwZTogc3RyaW5nKTogQWJzdHJhY3ROb2RlRmFjdG9yeSB7XG5cdFx0aWYgKHRoaXMubm9kZUZhY3Rvcmllc1t0eXBlXSkge1xuXHRcdFx0cmV0dXJuIHRoaXMubm9kZUZhY3Rvcmllc1t0eXBlXTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZmluZCBmYWN0b3J5IGZvciBub2RlIG9mIHR5cGU6IFske3R5cGV9XWApO1xuXHR9XG5cblx0Z2V0RmFjdG9yeUZvck5vZGUobm9kZTogTm9kZU1vZGVsKTogQWJzdHJhY3ROb2RlRmFjdG9yeSB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmdldE5vZGVGYWN0b3J5KG5vZGUuZ2V0VHlwZSgpKTtcblx0fVxuXG5cdGdlbmVyYXRlV2lkZ2V0Rm9yTm9kZShub2RlOiBOb2RlTW9kZWwsIG5vZGVzSG9zdDogVmlld0NvbnRhaW5lclJlZik6IENvbXBvbmVudFJlZjxOb2RlTW9kZWw+IHwgbnVsbCB7XG5cdFx0Y29uc3Qgbm9kZUZhY3RvcnkgPSB0aGlzLmdldEZhY3RvcnlGb3JOb2RlKG5vZGUpO1xuXHRcdGlmICghbm9kZUZhY3RvcnkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgd2lkZ2V0IGZhY3RvcnkgZm9yIG5vZGU6ICR7bm9kZS5nZXRUeXBlKCl9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBub2RlRmFjdG9yeS5nZW5lcmF0ZVdpZGdldCh0aGlzLCBub2RlLCBub2Rlc0hvc3QpO1xuXHR9XG5cblx0Ly8gUE9SVFNcblx0cmVnaXN0ZXJQb3J0RmFjdG9yeShmYWN0b3J5OiBBYnN0cmFjdFBvcnRGYWN0b3J5KSB7XG5cdFx0dGhpcy5wb3J0RmFjdG9yaWVzW2ZhY3RvcnkudHlwZV0gPSBmYWN0b3J5O1xuXHR9XG5cblx0Z2V0UG9ydEZhY3RvcmllcygpIHtcblx0XHRyZXR1cm4gdGhpcy5wb3J0RmFjdG9yaWVzO1xuXHR9XG5cblx0Z2V0UG9ydEZhY3RvcnkodHlwZTogc3RyaW5nKTogQWJzdHJhY3RQb3J0RmFjdG9yeSB7XG5cdFx0aWYgKHRoaXMucG9ydEZhY3Rvcmllc1t0eXBlXSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucG9ydEZhY3Rvcmllc1t0eXBlXTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZmluZCBmYWN0b3J5IGZvciBwb3J0IG9mIHR5cGU6IFske3R5cGV9XWApO1xuXHR9XG5cblx0Z2V0RmFjdG9yeUZvclBvcnQocG9ydDogUG9ydE1vZGVsKTogQWJzdHJhY3RQb3J0RmFjdG9yeSB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmdldFBvcnRGYWN0b3J5KHBvcnQuZ2V0VHlwZSgpKTtcblx0fVxuXG5cdGdlbmVyYXRlV2lkZ2V0Rm9yUG9ydChwb3J0OiBQb3J0TW9kZWwsIHBvcnRzSG9zdDogVmlld0NvbnRhaW5lclJlZik6IENvbXBvbmVudFJlZjxQb3J0TW9kZWw+IHwgbnVsbCB7XG5cdFx0Y29uc3QgcG9ydEZhY3RvcnkgPSB0aGlzLmdldEZhY3RvcnlGb3JQb3J0KHBvcnQpO1xuXHRcdGlmICghcG9ydEZhY3RvcnkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgd2lkZ2V0IGZhY3RvcnkgZm9yIHBvcnQ6ICR7cG9ydC5nZXRUeXBlKCl9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBwb3J0RmFjdG9yeS5nZW5lcmF0ZVdpZGdldChwb3J0LCBwb3J0c0hvc3QpO1xuXHR9XG5cblx0Ly8gTElOS1Ncblx0Z2V0TGlua0ZhY3RvcmllcygpOiB7IFtzOiBzdHJpbmddOiBBYnN0cmFjdExpbmtGYWN0b3J5IH0ge1xuXHRcdHJldHVybiB0aGlzLmxpbmtGYWN0b3JpZXM7XG5cdH1cblxuXHRyZWdpc3RlckxpbmtGYWN0b3J5KGZhY3Rvcnk6IEFic3RyYWN0TGlua0ZhY3RvcnkpIHtcblx0XHR0aGlzLmxpbmtGYWN0b3JpZXNbZmFjdG9yeS50eXBlXSA9IGZhY3Rvcnk7XG5cdH1cblxuXHRnZXRMaW5rRmFjdG9yeSh0eXBlOiBzdHJpbmcpOiBBYnN0cmFjdExpbmtGYWN0b3J5IHtcblx0XHRpZiAodGhpcy5saW5rRmFjdG9yaWVzW3R5cGVdKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5saW5rRmFjdG9yaWVzW3R5cGVdO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBmaW5kIGZhY3RvcnkgZm9yIGxpbmsgb2YgdHlwZTogWyR7dHlwZX1dYCk7XG5cdH1cblxuXHRnZXRGYWN0b3J5Rm9yTGluayhsaW5rOiBMaW5rTW9kZWwpOiBBYnN0cmFjdExpbmtGYWN0b3J5IHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TGlua0ZhY3RvcnkobGluay5nZXRUeXBlKCkpO1xuXHR9XG5cblx0Z2VuZXJhdGVXaWRnZXRGb3JMaW5rKGxpbms6IExpbmtNb2RlbCwgbGlua3NIb3N0OiBWaWV3Q29udGFpbmVyUmVmKTogQ29tcG9uZW50UmVmPExpbmtNb2RlbD4gfCBudWxsIHtcblx0XHRjb25zdCBsaW5rRmFjdG9yeSA9IHRoaXMuZ2V0RmFjdG9yeUZvckxpbmsobGluayk7XG5cdFx0aWYgKCFsaW5rRmFjdG9yeSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBsaW5rIGZhY3RvcnkgZm9yIGxpbms6ICR7bGluay5nZXRUeXBlKCl9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBsaW5rRmFjdG9yeS5nZW5lcmF0ZVdpZGdldCh0aGlzLCBsaW5rLCBsaW5rc0hvc3QpO1xuXHR9XG5cdC8vI2VuZHJlZ2lvblxuXG5cdGdldE5vZGVFbGVtZW50KG5vZGU6IE5vZGVNb2RlbCk6IEhUTUxFbGVtZW50IHtcblx0XHRjb25zdCBzZWxlY3RvciA9IHRoaXMuY2FudmFzJC5nZXRWYWx1ZSgpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW5vZGVpZD1cIiR7bm9kZS5pZH1cIl1gKTtcblx0XHRpZiAoc2VsZWN0b3IgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgTm9kZSBlbGVtZW50IHdpdGggbm9kZSBpZDogWycgKyBub2RlLmlkICsgJ10nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdG9yIGFzIEhUTUxFbGVtZW50O1xuXHR9XG5cblx0Z2V0Tm9kZVBvcnRFbGVtZW50KHBvcnQ6IFBvcnRNb2RlbCk6IEhUTUxFbGVtZW50IHtcblx0XHRjb25zdCBzZWxlY3RvciA9IHRoaXMuY2FudmFzJC5nZXRWYWx1ZSgpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW5vZGVpZD1cIiR7cG9ydC5nZXRQYXJlbnQoKS5pZH1cIl0gW2RhdGEtcG9ydGlkPVwiJHtwb3J0LmlkfVwiXWApO1xuXHRcdGlmIChzZWxlY3RvciA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBOb2RlIFBvcnQgZWxlbWVudCB3aXRoIG5vZGUgaWQ6IFsnICsgcG9ydC5nZXRQYXJlbnQoKS5pZCArICddIGFuZCBwb3J0IGlkOiBbJyArIHBvcnQuaWQgKyAnXScpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZWN0b3IgYXMgSFRNTEVsZW1lbnQ7XG5cdH1cblxuXHRnZXRQb3J0Q2VudGVyKHBvcnQ6IFBvcnRNb2RlbCkge1xuXHRcdGNvbnN0IHNvdXJjZUVsZW1lbnQgPSB0aGlzLmdldE5vZGVQb3J0RWxlbWVudChwb3J0KTtcblx0XHRjb25zdCBzb3VyY2VSZWN0ID0gc291cmNlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCByZWwgPSB0aGlzLmdldFJlbGF0aXZlUG9pbnQoc291cmNlUmVjdC5sZWZ0LCBzb3VyY2VSZWN0LnRvcCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogc291cmNlRWxlbWVudC5vZmZzZXRXaWR0aCAvIDIgKyAocmVsLnggLSB0aGlzLmRpYWdyYW1Nb2RlbC5nZXRPZmZzZXRYKCkpIC8gKHRoaXMuZGlhZ3JhbU1vZGVsLmdldFpvb21MZXZlbCgpIC8gMTAwLjApLFxuXHRcdFx0eTogc291cmNlRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyICsgKHJlbC55IC0gdGhpcy5kaWFncmFtTW9kZWwuZ2V0T2Zmc2V0WSgpKSAvICh0aGlzLmRpYWdyYW1Nb2RlbC5nZXRab29tTGV2ZWwoKSAvIDEwMC4wKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIHJlY3Rhbmd1bGFyIGNvb3JkaW5hdGVzIG9mIHRoZSBwb3J0IHBhc3NlZCBpbi5cblx0ICovXG5cdGdldFBvcnRDb29yZHMoXG5cdFx0cG9ydDogUG9ydE1vZGVsXG5cdCk6IHtcblx0XHR4OiBudW1iZXI7XG5cdFx0eTogbnVtYmVyO1xuXHRcdHdpZHRoOiBudW1iZXI7XG5cdFx0aGVpZ2h0OiBudW1iZXI7XG5cdH0ge1xuXHRcdGNvbnN0IHNvdXJjZUVsZW1lbnQgPSB0aGlzLmdldE5vZGVQb3J0RWxlbWVudChwb3J0KTtcblx0XHRjb25zdCBzb3VyY2VSZWN0ID0gc291cmNlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBET01SZWN0O1xuXHRcdGNvbnN0IGNhbnZhc1JlY3QgPSB0aGlzLmNhbnZhcyQuZ2V0VmFsdWUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBDbGllbnRSZWN0O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IChzb3VyY2VSZWN0LnggLSB0aGlzLmRpYWdyYW1Nb2RlbC5nZXRPZmZzZXRYKCkpIC8gKHRoaXMuZGlhZ3JhbU1vZGVsLmdldFpvb21MZXZlbCgpIC8gMTAwLjApIC0gY2FudmFzUmVjdC5sZWZ0LFxuXHRcdFx0eTogKHNvdXJjZVJlY3QueSAtIHRoaXMuZGlhZ3JhbU1vZGVsLmdldE9mZnNldFkoKSkgLyAodGhpcy5kaWFncmFtTW9kZWwuZ2V0Wm9vbUxldmVsKCkgLyAxMDAuMCkgLSBjYW52YXNSZWN0LnRvcCxcblx0XHRcdHdpZHRoOiBzb3VyY2VSZWN0LndpZHRoLFxuXHRcdFx0aGVpZ2h0OiBzb3VyY2VSZWN0LmhlaWdodFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBub2RlIHBhc3NlZCBpbi5cblx0ICogSXQgY3VycmVudGx5IGFzc3VtZXMgbm9kZXMgaGF2ZSBhIHJlY3Rhbmd1bGFyIHNoYXBlLCBjYW4gYmUgb3ZlcnJpZGVuIGZvciBjdXN0b21pc2VkIHNoYXBlcy5cblx0ICovXG5cdGdldE5vZGVEaW1lbnNpb25zKG5vZGU6IE5vZGVNb2RlbCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG5cdFx0aWYgKCF0aGlzLmNhbnZhcyQuZ2V0VmFsdWUoKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0d2lkdGg6IDAsXG5cdFx0XHRcdGhlaWdodDogMFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCBub2RlRWxlbWVudCA9IHRoaXMuZ2V0Tm9kZUVsZW1lbnQobm9kZSk7XG5cdFx0Y29uc3Qgbm9kZVJlY3QgPSBub2RlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogbm9kZVJlY3Qud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IG5vZGVSZWN0LmhlaWdodFxuXHRcdH07XG5cdH1cblxuXHRzZXRDYW52YXMoY2FudmFzOiBFbGVtZW50KSB7XG5cdFx0dGhpcy5jYW52YXMkLm5leHQoY2FudmFzKTtcblx0fVxuXG5cdGdldFJlbGF0aXZlTW91c2VQb2ludChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG5cdFx0Y29uc3QgcG9pbnQgPSB0aGlzLmdldFJlbGF0aXZlUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IChwb2ludC54IC0gdGhpcy5kaWFncmFtTW9kZWwuZ2V0T2Zmc2V0WCgpKSAvICh0aGlzLmRpYWdyYW1Nb2RlbC5nZXRab29tTGV2ZWwoKSAvIDEwMC4wKSxcblx0XHRcdHk6IChwb2ludC55IC0gdGhpcy5kaWFncmFtTW9kZWwuZ2V0T2Zmc2V0WSgpKSAvICh0aGlzLmRpYWdyYW1Nb2RlbC5nZXRab29tTGV2ZWwoKSAvIDEwMC4wKVxuXHRcdH07XG5cdH1cblxuXHRnZXRSZWxhdGl2ZVBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgY2FudmFzUmVjdCA9IHRoaXMuY2FudmFzJC5nZXRWYWx1ZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdHJldHVybiB7IHg6IHggLSBjYW52YXNSZWN0LmxlZnQsIHk6IHkgLSBjYW52YXNSZWN0LnRvcCB9O1xuXHR9XG5cblx0Z2V0RGlhZ3JhbU1vZGVsKCkge1xuXHRcdHJldHVybiB0aGlzLmRpYWdyYW1Nb2RlbDtcblx0fVxuXG5cdGlzTW9kZWxMb2NrZWQobW9kZWw6IEJhc2VFbnRpdHkpIHtcblx0XHRpZiAodGhpcy5kaWFncmFtTW9kZWwuZ2V0TG9ja2VkKCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBtb2RlbC5nZXRMb2NrZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBhdXRvIGFycmFuZ2UgdGhlIGdyYXBoXG5cdCAqL1xuXHRhdXRvQXJyYW5nZSgpIHt9XG5cblx0LyoqXG5cdCAqIGZpdCB0aGUgY2FudmFzIHpvb20gbGV2ZWxzIHRvIHRoZSBlbGVtZW50cyBjb250YWluZWQuXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsWm9vbUZhY3RvciBhbGxvdyBmb3IgZnVydGhlciB6b29taW5nIG91dCB0byBtYWtlIHN1cmUgZWRnZXMgZG9lc24ndCBjdXRcblx0ICovXG5cdHpvb21Ub0ZpdChhZGRpdGlvbmFsWm9vbUZhY3RvcjogbnVtYmVyID0gMC4wMDUpIHtcblx0XHR0aGlzLmNhbnZhcyRcblx0XHRcdC5waXBlKFxuXHRcdFx0XHRmaWx0ZXIoQm9vbGVhbiksXG5cdFx0XHRcdHRha2UoMSksXG5cdFx0XHRcdGRlbGF5KDApXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKChjYW52YXM6IEhUTUxFbGVtZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHhGYWN0b3IgPSBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuc2Nyb2xsV2lkdGg7XG5cdFx0XHRcdGNvbnN0IHlGYWN0b3IgPSBjYW52YXMuY2xpZW50SGVpZ2h0IC8gY2FudmFzLnNjcm9sbEhlaWdodDtcblx0XHRcdFx0Y29uc3Qgem9vbUZhY3RvciA9IHhGYWN0b3IgPCB5RmFjdG9yID8geEZhY3RvciA6IHlGYWN0b3I7XG5cblx0XHRcdFx0dGhpcy5kaWFncmFtTW9kZWwuc2V0Wm9vbUxldmVsKHRoaXMuZGlhZ3JhbU1vZGVsLmdldFpvb21MZXZlbCgpICogKHpvb21GYWN0b3IgLSBhZGRpdGlvbmFsWm9vbUZhY3RvcikpO1xuXHRcdFx0XHR0aGlzLmRpYWdyYW1Nb2RlbC5zZXRPZmZzZXQoMCwgMCk7XG5cdFx0XHR9KTtcblx0fVxufVxuIl19