UNPKG

@future-grid/fgp-graph

Version:

fgp-graph is a chart lib based on Dygraphs

263 lines (208 loc) 30.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Synchronizer = void 0; var _dygraphs = _interopRequireDefault(require("dygraphs")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Synchronizer = function Synchronizer(graphs) { var _this = this; _classCallCheck(this, Synchronizer); _defineProperty(this, "args", void 0); _defineProperty(this, "graphs", void 0); _defineProperty(this, "synchronize", function () { if (_this.args.length === 0) { throw 'Invalid invocation of Dygraph.synchronize(). Need >= 1 argument.'; } var OPTIONS = ['selection', 'zoom', 'range']; var opts = { selection: true, zoom: true, range: false }; var dygraphs = []; var prevCallbacks = []; var parseOpts = function parseOpts(obj) { if (!(obj instanceof Object)) { throw 'Last argument must be either Dygraph or Object.'; } else { for (var i = 0; i < OPTIONS.length; i++) { var optName = OPTIONS[i]; if (obj.hasOwnProperty(optName)) opts[optName] = obj[optName]; } } }; var arraysAreEqual = function arraysAreEqual(a, b) { if (!Array.isArray(a) || !Array.isArray(b)) return false; var i = a.length; if (i !== b.length) return false; while (i--) { if (a[i] !== b[i]) return false; } return true; }; var attachZoomHandlers = function attachZoomHandlers(gs, syncOpts, prevCallbacks) { var block = false; for (var i = 0; i < gs.length; i++) { var g = gs[i]; g.updateOptions({ drawCallback: function drawCallback(me, initial) { if (block || initial) return; block = true; var opts = { dateWindow: me.xAxisRange() }; if (syncOpts.range) { opts.valueRange = me.yAxisRange(); } for (var j = 0; j < gs.length; j++) { if (gs[j] == me) { if (prevCallbacks[j] && prevCallbacks[j].drawCallback) { prevCallbacks[j].drawCallback.apply(this, arguments); } continue; } // Only redraw if there are new options (in this case only dateWindow changed!) //&& arraysAreEqual(opts.valueRange, gs[j].getOption('valueRange')) if (arraysAreEqual(opts.dateWindow, gs[j].getOption('dateWindow'))) { continue; } gs[j].updateOptions(opts); } block = false; } }, true /* no need to redraw */ ); } }; var attachSelectionHandlers = function attachSelectionHandlers(gs, prevCallbacks) { var block = false; for (var i = 0; i < gs.length; i++) { var g = gs[i]; g.updateOptions({ highlightCallback: function highlightCallback(event, x, points, row, seriesName) { if (block) return; block = true; var me = this; for (var _i = 0; _i < gs.length; _i++) { if (me == gs[_i]) { if (prevCallbacks[_i] && prevCallbacks[_i].highlightCallback) { prevCallbacks[_i].highlightCallback.apply(this, arguments); } continue; } var idx = gs[_i].getRowForX(x); if (idx !== null) { gs[_i].setSelection(idx, seriesName); } } block = false; }, unhighlightCallback: function unhighlightCallback(e) { if (block) return; block = true; var me = this; for (var _i2 = 0; _i2 < gs.length; _i2++) { if (me == gs[_i2]) { if (prevCallbacks[_i2] && prevCallbacks[_i2].unhighlightCallback) { prevCallbacks[_i2].unhighlightCallback.apply(this, arguments); } continue; } gs[_i2].clearSelection(); } block = false; } }, true /* no need to redraw */ ); } }; if (_this.args[0] instanceof _dygraphs["default"]) { // Arguments are Dygraph objects. var i; for (i = 0; i < _this.args.length; i++) { if (_this.args[i] instanceof _dygraphs["default"]) { dygraphs.push(_this.args[i]); } else { break; } } if (i < _this.args.length - 1) { throw 'Invalid invocation of Dygraph.synchronize(). ' + 'All but the last argument must be Dygraph objects.'; } else if (i == _this.args.length - 1) { parseOpts(_this.args[_this.args.length - 1]); } } else if (_this.args[0].length) { // Invoked w/ list of dygraphs, options for (var _i3 = 0; _i3 < _this.args[0].length; _i3++) { dygraphs.push(_this.args[0][_i3]); } if (_this.args.length == 2) { parseOpts(_this.args[1]); } else if (_this.args.length > 2) { throw 'Invalid invocation of Dygraph.synchronize(). ' + 'Expected two arguments: array and optional options argument.'; } // otherwise arguments.length == 1, which is fine. } else { throw 'Invalid invocation of Dygraph.synchronize(). ' + 'First parameter must be either Dygraph or list of Dygraphs.'; } if (dygraphs.length < 2) { throw 'Invalid invocation of Dygraph.synchronize(). ' + 'Need two or more dygraphs to synchronize.'; } var readycount = dygraphs.length; for (var _i4 = 0; _i4 < dygraphs.length; _i4++) { var g = dygraphs[_i4]; g.ready(function () { if (--readycount == 0) { // store original callbacks var callBackTypes = ['drawCallback', 'highlightCallback', 'unhighlightCallback']; for (var j = 0; j < dygraphs.length; j++) { if (!prevCallbacks[j]) { prevCallbacks[j] = {}; } for (var k = callBackTypes.length - 1; k >= 0; k--) { prevCallbacks[j][callBackTypes[k]] = dygraphs[j].getFunctionOption(callBackTypes[k]); } } // Listen for draw, highlight, unhighlight callbacks. if (opts.zoom) { attachZoomHandlers(dygraphs, opts, prevCallbacks); } if (opts.selection) { attachSelectionHandlers(dygraphs, prevCallbacks); } } }); } return { detach: function detach() { for (var _i5 = 0; _i5 < dygraphs.length; _i5++) { var _g = dygraphs[_i5]; if (opts.zoom) { _g.updateOptions({ drawCallback: prevCallbacks[_i5].drawCallback }); } if (opts.selection) { _g.updateOptions({ highlightCallback: prevCallbacks[_i5].highlightCallback, unhighlightCallback: prevCallbacks[_i5].unhighlightCallback }); } } // release references & make subsequent calls throw. dygraphs = []; opts = null; prevCallbacks = []; }, graphs: [_this.graphs] }; }); this.graphs = graphs; this.args = graphs.concat([{ zoom: true, selection: false }]); }; exports.Synchronizer = Synchronizer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRyYXMvc3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbIlN5bmNocm9uaXplciIsImdyYXBocyIsImFyZ3MiLCJsZW5ndGgiLCJPUFRJT05TIiwib3B0cyIsInNlbGVjdGlvbiIsInpvb20iLCJyYW5nZSIsImR5Z3JhcGhzIiwicHJldkNhbGxiYWNrcyIsInBhcnNlT3B0cyIsIm9iaiIsIk9iamVjdCIsImkiLCJvcHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcnJheXNBcmVFcXVhbCIsImEiLCJiIiwiQXJyYXkiLCJpc0FycmF5IiwiYXR0YWNoWm9vbUhhbmRsZXJzIiwiZ3MiLCJzeW5jT3B0cyIsImJsb2NrIiwiZyIsInVwZGF0ZU9wdGlvbnMiLCJkcmF3Q2FsbGJhY2siLCJtZSIsImluaXRpYWwiLCJkYXRlV2luZG93IiwieEF4aXNSYW5nZSIsInZhbHVlUmFuZ2UiLCJ5QXhpc1JhbmdlIiwiaiIsImFwcGx5IiwiYXJndW1lbnRzIiwiZ2V0T3B0aW9uIiwiYXR0YWNoU2VsZWN0aW9uSGFuZGxlcnMiLCJoaWdobGlnaHRDYWxsYmFjayIsImV2ZW50IiwieCIsInBvaW50cyIsInJvdyIsInNlcmllc05hbWUiLCJpZHgiLCJnZXRSb3dGb3JYIiwic2V0U2VsZWN0aW9uIiwidW5oaWdobGlnaHRDYWxsYmFjayIsImUiLCJjbGVhclNlbGVjdGlvbiIsIkR5Z3JhcGgiLCJwdXNoIiwicmVhZHljb3VudCIsInJlYWR5IiwiY2FsbEJhY2tUeXBlcyIsImsiLCJnZXRGdW5jdGlvbk9wdGlvbiIsImRldGFjaCIsImNvbmNhdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7Ozs7OztJQUVhQSxZLEdBS1Qsc0JBQVlDLE1BQVosRUFBMkI7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQSx1Q0FRYixZQUFNO0FBQ2hCLFFBQUksS0FBSSxDQUFDQyxJQUFMLENBQVVDLE1BQVYsS0FBcUIsQ0FBekIsRUFBNEI7QUFDeEIsWUFBTSxrRUFBTjtB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QWhCO0FBQ0g7O0FBQ0QsY0FBSXZCLElBQUksQ0FBQ0MsU0FBVCxFQUFvQjtBQUNoQm9CLFlBQUFBLEVBQUMsQ0FBQ0MsYUFBRixDQUFnQjtBQUNaYSxjQUFBQSxpQkFBaUIsRUFBRTlCLGFBQWEsQ0FBQ0ksR0FBRCxDQUFiLENBQWlCMEIsaUJBRHhCO0FBRVpTLGNBQUFBLG1CQUFtQixFQUFFdkMsYUFBYSxDQUFDSSxHQUFELENBQWIsQ0FBaUJtQztBQUYxQixhQUFoQjtBQUlIO0FBQ0osU0FaZSxDQWFoQjs7O0FBQ0F4QyxRQUFBQSxRQUFRLEdBQUcsRUFBWDtBQUNBSixRQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNBSyxRQUFBQSxhQUFhLEdBQUcsRUFBaEI7QUFDSCxPQWxCRTtBQW1CSFQsTUFBQUEsTUFBTSxFQUFFLENBQUMsS0FBSSxDQUFDQSxNQUFOO0FBbkJMLEtBQVA7QUFxQkgsR0FsTjBCOztBQUN2QixPQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxPQUFLQyxJQUFMLEdBQVlELE1BQU0sQ0FBQzJELE1BQVAsQ0FBYyxDQUFDO0FBQ3ZCckQsSUFBQUEsSUFBSSxFQUFFLElBRGlCO0FBRXZCRCxJQUFBQSxTQUFTLEVBQUU7QUFGWSxHQUFELENBQWQsQ0FBWjtBQUlILEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRHlncmFwaCBmcm9tICdkeWdyYXBocyc7XG5cbmV4cG9ydCBjbGFzcyBTeW5jaHJvbml6ZXIge1xuXG4gICAgYXJnczogQXJyYXk8YW55PjtcbiAgICBncmFwaHM6IEFycmF5PER5Z3JhcGg+O1xuXG4gICAgY29uc3RydWN0b3IoZ3JhcGhzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLmdyYXBocyA9IGdyYXBocztcbiAgICAgICAgdGhpcy5hcmdzID0gZ3JhcGhzLmNvbmNhdChbe1xuICAgICAgICAgICAgem9vbTogdHJ1ZSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2VcbiAgICAgICAgfV0pO1xuICAgIH1cblxuICAgIHN5bmNocm9uaXplID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuIE5lZWQgPj0gMSBhcmd1bWVudC4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IE9QVElPTlMgPSBbJ3NlbGVjdGlvbicsICd6b29tJywgJ3JhbmdlJ107XG4gICAgICAgIGxldCBvcHRzOiBhbnkgPSB7XG4gICAgICAgICAgICBzZWxlY3Rpb246IHRydWUsXG4gICAgICAgICAgICB6b29tOiB0cnVlLFxuICAgICAgICAgICAgcmFuZ2U6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBkeWdyYXBoczogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IHByZXZDYWxsYmFja3M6IGFueVtdID0gW107XG5cbiAgICAgICAgbGV0IHBhcnNlT3B0cyA9IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIHRocm93ICdMYXN0IGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIER5Z3JhcGggb3IgT2JqZWN0Lic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgT1BUSU9OUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0TmFtZSA9IE9QVElPTlNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkob3B0TmFtZSkpIG9wdHNbb3B0TmFtZV0gPSBvYmpbb3B0TmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhcnJheXNBcmVFcXVhbCA9IChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGEpIHx8ICFBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaSA9IGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGkgIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhdHRhY2hab29tSGFuZGxlcnMgPSAoZ3M6IER5Z3JhcGhbXSwgc3luY09wdHM6IGFueSwgcHJldkNhbGxiYWNrczogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZyA9IGdzW2ldO1xuICAgICAgICAgICAgICAgIGcudXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24gKG1lOiBEeWdyYXBoLCBpbml0aWFsOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sgfHwgaW5pdGlhbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wdHM6IHsgZGF0ZVdpbmRvdzogYW55LCB2YWx1ZVJhbmdlPzogYW55IH0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVdpbmRvdzogbWUueEF4aXNSYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNPcHRzLnJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy52YWx1ZVJhbmdlID0gbWUueUF4aXNSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdzW2pdID09IG1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q2FsbGJhY2tzW2pdICYmIHByZXZDYWxsYmFja3Nbal0uZHJhd0NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2pdLmRyYXdDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVkcmF3IGlmIHRoZXJlIGFyZSBuZXcgb3B0aW9ucyAgKGluIHRoaXMgY2FzZSBvbmx5IGRhdGVXaW5kb3cgY2hhbmdlZCEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8mJiBhcnJheXNBcmVFcXVhbChvcHRzLnZhbHVlUmFuZ2UsIGdzW2pdLmdldE9wdGlvbigndmFsdWVSYW5nZScpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheXNBcmVFcXVhbChvcHRzLmRhdGVXaW5kb3csIGdzW2pdLmdldE9wdGlvbignZGF0ZVdpbmRvdycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc1tqXS51cGRhdGVPcHRpb25zKG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRydWUgLyogbm8gbmVlZCB0byByZWRyYXcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dGFjaFNlbGVjdGlvbkhhbmRsZXJzID0gKGdzOiBhbnlbXSwgcHJldkNhbGxiYWNrczogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZyA9IGdzW2ldO1xuXG4gICAgICAgICAgICAgICAgZy51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0Q2FsbGJhY2s6IGZ1bmN0aW9uIChldmVudDogRXZlbnQsIHg6IGFueSwgcG9pbnRzOiBhbnlbXSwgcm93OiBhbnksIHNlcmllc05hbWU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWU6IGFueSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lID09IGdzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q2FsbGJhY2tzW2ldICYmIHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGdzW2ldLmdldFJvd0ZvclgoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc1tpXS5zZXRTZWxlY3Rpb24oaWR4LCBzZXJpZXNOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB1bmhpZ2hsaWdodENhbGxiYWNrOiBmdW5jdGlvbiAoZTogRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWUgPT0gZ3NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDYWxsYmFja3NbaV0gJiYgcHJldkNhbGxiYWNrc1tpXS51bmhpZ2hsaWdodENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2ldLnVuaGlnaGxpZ2h0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NbaV0uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0cnVlIC8qIG5vIG5lZWQgdG8gcmVkcmF3ICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3NbMF0gaW5zdGFuY2VvZiBEeWdyYXBoKSB7XG4gICAgICAgICAgICAvLyBBcmd1bWVudHMgYXJlIER5Z3JhcGggb2JqZWN0cy5cbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZ3NbaV0gaW5zdGFuY2VvZiBEeWdyYXBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGR5Z3JhcGhzLnB1c2godGhpcy5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA8IHRoaXMuYXJncy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuICcgK1xuICAgICAgICAgICAgICAgICdBbGwgYnV0IHRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgRHlncmFwaCBvYmplY3RzLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdHModGhpcy5hcmdzW3RoaXMuYXJncy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW52b2tlZCB3LyBsaXN0IG9mIGR5Z3JhcGhzLCBvcHRpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJnc1swXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGR5Z3JhcGhzLnB1c2godGhpcy5hcmdzWzBdW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3MubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdHModGhpcy5hcmdzWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBpbnZvY2F0aW9uIG9mIER5Z3JhcGguc3luY2hyb25pemUoKS4gJyArXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHR3byBhcmd1bWVudHM6IGFycmF5IGFuZCBvcHRpb25hbCBvcHRpb25zIGFyZ3VtZW50Lic7XG4gICAgICAgICAgICB9ICAvLyBvdGhlcndpc2UgYXJndW1lbnRzLmxlbmd0aCA9PSAxLCB3aGljaCBpcyBmaW5lLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuICcgK1xuICAgICAgICAgICAgJ0ZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBEeWdyYXBoIG9yIGxpc3Qgb2YgRHlncmFwaHMuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeWdyYXBocy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBpbnZvY2F0aW9uIG9mIER5Z3JhcGguc3luY2hyb25pemUoKS4gJyArXG4gICAgICAgICAgICAnTmVlZCB0d28gb3IgbW9yZSBkeWdyYXBocyB0byBzeW5jaHJvbml6ZS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlYWR5Y291bnQgPSBkeWdyYXBocy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHlncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBnID0gZHlncmFwaHNbaV07XG4gICAgICAgICAgICBnLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoLS1yZWFkeWNvdW50ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb3JpZ2luYWwgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWxsQmFja1R5cGVzID0gWydkcmF3Q2FsbGJhY2snLCAnaGlnaGxpZ2h0Q2FsbGJhY2snLCAndW5oaWdobGlnaHRDYWxsYmFjayddO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGR5Z3JhcGhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZDYWxsYmFja3Nbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2pdID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gY2FsbEJhY2tUeXBlcy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYWxsYmFja3Nbal1bY2FsbEJhY2tUeXBlc1trXV0gPSBkeWdyYXBoc1tqXS5nZXRGdW5jdGlvbk9wdGlvbihjYWxsQmFja1R5cGVzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgZHJhdywgaGlnaGxpZ2h0LCB1bmhpZ2hsaWdodCBjYWxsYmFja3MuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnpvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFpvb21IYW5kbGVycyhkeWdyYXBocywgb3B0cywgcHJldkNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFNlbGVjdGlvbkhhbmRsZXJzKGR5Z3JhcGhzLCBwcmV2Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRldGFjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHlncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGcgPSBkeWdyYXBoc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuem9vbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZy51cGRhdGVPcHRpb25zKHsgZHJhd0NhbGxiYWNrOiBwcmV2Q2FsbGJhY2tzW2ldLmRyYXdDYWxsYmFjayB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGcudXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0Q2FsbGJhY2s6IHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5oaWdobGlnaHRDYWxsYmFjazogcHJldkNhbGxiYWNrc1tpXS51bmhpZ2hsaWdodENhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHJlZmVyZW5jZXMgJiBtYWtlIHN1YnNlcXVlbnQgY2FsbHMgdGhyb3cuXG4gICAgICAgICAgICAgICAgZHlncmFwaHMgPSBbXTtcbiAgICAgICAgICAgICAgICBvcHRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ3JhcGhzOiBbdGhpcy5ncmFwaHNdXG4gICAgICAgIH07XG4gICAgfTtcbn0iXX0=