UNPKG

@future-grid/fgp-graph

Version:

fgp-graph is a chart lib based on Dygraphs

254 lines (201 loc) 36.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _utils = _interopRequireDefault(require("./utils")); 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 DygraphInteraction = function DygraphInteraction() { _classCallCheck(this, DygraphInteraction); _defineProperty(this, "nonInteractiveModel_", { mousedown: function mousedown(event, g, context) { context.initializeMouseDown(event, g, context); }, mouseup: DygraphInteraction.maybeTreatMouseOpAsClick }); }; exports["default"] = DygraphInteraction; _defineProperty(DygraphInteraction, "maybeTreatMouseOpAsClick", function (event, g, context) { context.dragEndX = _utils["default"].dragGetX(event, context); context.dragEndY = _utils["default"].dragGetY(event, context); var regionWidth = Math.abs(context.dragEndX - context.dragStartX); var regionHeight = Math.abs(context.dragEndY - context.dragStartY); if (regionWidth < 2 && regionHeight < 2 && g.lastx_ !== undefined && g.lastx_ != -1) { DygraphInteraction.treatMouseOpAsClick(g, event, context); } context.regionWidth = regionWidth; context.regionHeight = regionHeight; }); _defineProperty(DygraphInteraction, "treatMouseOpAsClick", function (g, event, context) { var clickCallback = g.getFunctionOption('clickCallback'); var pointClickCallback = g.getFunctionOption('pointClickCallback'); var selectedPoint = null; // Find out if the click occurs on a point. var closestIdx = -1; var closestDistance = Number.MAX_VALUE; // check if the click was on a particular point. for (var i = 0; i < g.selPoints_.length; i++) { var p = g.selPoints_[i]; var distance = Math.pow(p.canvasx - context.dragEndX, 2) + Math.pow(p.canvasy - context.dragEndY, 2); if (!isNaN(distance) && (closestIdx == -1 || distance < closestDistance)) { closestDistance = distance; closestIdx = i; } } // Allow any click within two pixels of the dot. var radius = g.getNumericOption('highlightCircleSize') + 2; if (closestDistance <= radius * radius) { selectedPoint = g.selPoints_[closestIdx]; } if (selectedPoint) { var _e = { cancelable: true, point: selectedPoint, canvasx: context.dragEndX, canvasy: context.dragEndY }; var defaultPrevented = g.cascadeEvents_('pointClick', _e); if (defaultPrevented) { // Note: this also prevents click / clickCallback from firing. return; } if (pointClickCallback) { pointClickCallback.call(g, event, selectedPoint); } } var e = { cancelable: true, xval: g.lastx_, // closest point by x value pts: g.selPoints_, canvasx: context.dragEndX, canvasy: context.dragEndY }; if (!g.cascadeEvents_('click', e)) { if (clickCallback) { clickCallback.call(g, event, g.lastx_, g.selPoints_); } } }); _defineProperty(DygraphInteraction, "startPan", function (event, g, context) { var i, axis; context.isPanning = true; var xRange = g.xAxisRange(); if (g.getOptionForAxis("logscale", "x")) { context.initialLeftmostDate = _utils["default"].log10(xRange[0]); context.dateRange = _utils["default"].log10(xRange[1]) - _utils["default"].log10(xRange[0]); } else { context.initialLeftmostDate = xRange[0]; context.dateRange = xRange[1] - xRange[0]; } context.xUnitsPerPixel = context.dateRange / (g.plotter_.area.w - 1); if (g.getNumericOption("panEdgeFraction")) { var maxXPixelsToDraw = g.width_ * g.getNumericOption("panEdgeFraction"); var xExtremes = g.xAxisExtremes(); // I REALLY WANT TO CALL THIS xTremes! var boundedLeftX = g.toDomXCoord(xExtremes[0]) - maxXPixelsToDraw; var boundedRightX = g.toDomXCoord(xExtremes[1]) + maxXPixelsToDraw; var boundedLeftDate = g.toDataXCoord(boundedLeftX); var boundedRightDate = g.toDataXCoord(boundedRightX); context.boundedDates = [boundedLeftDate, boundedRightDate]; var boundedValues = []; var maxYPixelsToDraw = g.height_ * g.getNumericOption("panEdgeFraction"); for (i = 0; i < g.axes_.length; i++) { axis = g.axes_[i]; var yExtremes = axis.extremeRange; var boundedTopY = g.toDomYCoord(yExtremes[0], i) + maxYPixelsToDraw; var boundedBottomY = g.toDomYCoord(yExtremes[1], i) - maxYPixelsToDraw; var boundedTopValue = g.toDataYCoord(boundedTopY, i); var boundedBottomValue = g.toDataYCoord(boundedBottomY, i); boundedValues[i] = [boundedTopValue, boundedBottomValue]; } context.boundedValues = boundedValues; } // Record the range of each y-axis at the start of the drag. // If any axis has a valueRange, then we want a 2D pan. // We can't store data directly in g.axes_, because it does not belong to us // and could change out from under us during a pan (say if there's a data // update). context.is2DPan = false; context.axes = []; for (i = 0; i < g.axes_.length; i++) { axis = g.axes_[i]; var axis_data = {}; var yRange = g.yAxisRange(i); // TODO(konigsberg): These values should be in |context|. // In log scale, initialTopValue, dragValueRange and unitsPerPixel are log scale. var logscale = g.attributes_.getForAxis("logscale", i); if (logscale) { axis_data.initialTopValue = _utils["default"].log10(yRange[1]); axis_data.dragValueRange = _utils["default"].log10(yRange[1]) - _utils["default"].log10(yRange[0]); } else { axis_data.initialTopValue = yRange[1]; axis_data.dragValueRange = yRange[1] - yRange[0]; } axis_data.unitsPerPixel = axis_data.dragValueRange / (g.plotter_.area.h - 1); context.axes.push(axis_data); // While calculating axes, set 2dpan. if (axis.valueRange) context.is2DPan = true; } }); _defineProperty(DygraphInteraction, "movePan", function (event, g, context) { context.dragEndX = _utils["default"].dragGetX(event, context); context.dragEndY = _utils["default"].dragGetY(event, context); var minDate = context.initialLeftmostDate - (context.dragEndX - context.dragStartX) * context.xUnitsPerPixel; if (context.boundedDates) { minDate = Math.max(minDate, context.boundedDates[0]); } var maxDate = minDate + context.dateRange; if (context.boundedDates) { if (maxDate > context.boundedDates[1]) { // Adjust minDate, and recompute maxDate. minDate = minDate - (maxDate - context.boundedDates[1]); maxDate = minDate + context.dateRange; } } if (g.getOptionForAxis("logscale", "x")) { g.dateWindow_ = [Math.pow(_utils["default"].LOG_SCALE, minDate), Math.pow(_utils["default"].LOG_SCALE, maxDate)]; } else { g.dateWindow_ = [minDate, maxDate]; } // y-axis scaling is automatic unless this is a full 2D pan. if (context.is2DPan) { var pixelsDragged = context.dragEndY - context.dragStartY; // Adjust each axis appropriately. for (var i = 0; i < g.axes_.length; i++) { var axis = g.axes_[i]; var axis_data = context.axes[i]; var unitsDragged = pixelsDragged * axis_data.unitsPerPixel; var boundedValue = context.boundedValues ? context.boundedValues[i] : null; // In log scale, maxValue and minValue are the logs of those values. var maxValue = axis_data.initialTopValue + unitsDragged; if (boundedValue) { maxValue = Math.min(maxValue, boundedValue[1]); } var minValue = maxValue - axis_data.dragValueRange; if (boundedValue) { if (minValue < boundedValue[0]) { // Adjust maxValue, and recompute minValue. maxValue = maxValue - (minValue - boundedValue[0]); minValue = maxValue - axis_data.dragValueRange; } } if (g.attributes_.getForAxis("logscale", i)) { axis.valueRange = [Math.pow(_utils["default"].LOG_SCALE, minValue), Math.pow(_utils["default"].LOG_SCALE, maxValue)]; } else { axis.valueRange = [minValue, maxValue]; } } } g.drawGraph_(false); }); _defineProperty(DygraphInteraction, "endPan", DygraphInteraction.maybeTreatMouseOpAsClick); _defineProperty(DygraphInteraction, "dragIsPanInteractionModel", { mousedown: function mousedown(event, g, context) { context.initializeMouseDown(event, g, context); DygraphInteraction.startPan(event, g, context); }, mousemove: function mousemove(event, g, context) { if (context.isPanning) { DygraphInteraction.movePan(event, g, context); } }, mouseup: function mouseup(event, g, context) { if (context.isPanning) { DygraphInteraction.endPan(event, g, context); } } }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRyYXMvRHlncmFwaEludGVyYWN0aW9uLnRzIl0sIm5hbWVzIjpbIkR5Z3JhcGhJbnRlcmFjdGlvbiIsIm1vdXNlZG93biIsImV2ZW50IiwiZyIsImNvbnRleHQiLCJpbml0aWFsaXplTW91c2VEb3duIiwibW91c2V1cCIsIm1heWJlVHJlYXRNb3VzZU9wQXNDbGljayIsImRyYWdFbmRYIiwidXRpbHMiLCJkcmFnR2V0WCIsImRyYWdFbmRZIiwiZHJhZ0dldFkiLCJyZWdpb25XaWR0aCIsIk1hdGgiLCJhYnMiLCJkcmFnU3RhcnRYIiwicmVnaW9uSGVpZ2h0IiwiZHJhZ1N0YXJ0WSIsImxhc3R4XyIsInVuZGVmaW5lZCIsInRyZWF0TW91c2VPcEFzQ2xpY2siLCJjbGlja0NhbGxiYWNrIiwiZ2V0RnVuY3Rpb25PcHRpb24iLCJwb2ludENsaWNrQ2FsbGJhY2siLCJzZWxlY3RlZFBvaW50IiwiY2xvc2VzdElkeCIsImNsb3Nlc3REaXN0YW5jZSIsIk51bWJlciIsIk1BWF9WQUxVRSIsImkiLCJzZWxQb2ludHNfIiwibGVuZ3RoIiwicCIsImRpc3RhbmNlIiwicG93IiwiY2FudmFzeCIsImNhbnZhc3kiLCJpc05hTiIsInJhZGl1cyIsImdldE51bWVyaWNPcHRpb24iLCJlIiwiY2FuY2VsYWJsZSIsInBvaW50IiwiZGVmYXVsdFByZXZlbnRlZCIsImNhc2NhZGVFdmVudHNfIiwiY2FsbCIsInh2YWwiLCJwdHMiLCJheGlzIiwiaXNQYW5uaW5nIiwieFJhbmdlIiwieEF4aXNSYW5nZSIsImdldE9wdGlvbkZvckF4aXMiLCJpbml0aWFsTGVmdG1vc3REYXRlIiwibG9nMTAiLCJkYXRlUmFuZ2UiLCJ4VW5pdHNQZXJQaXhlbCIsInBsb3R0ZXJfIiwiYXJlYSIsInciLCJtYXhYUGl4ZWxzVG9EcmF3Iiwid2lkdGhfIiwieEV4dHJlbWVzIiwieEF4aXNFeHRyZW1lcyIsImJvdW5kZWRMZWZ0WCIsInRvRG9tWENvb3JkIiwiYm91bmRlZFJpZ2h0WCIsImJvdW5kZWRMZWZ0RGF0ZSIsInRvRGF0YVhDb29yZCIsImJvdW5kZWRSaWdodERhdGUiLCJib3VuZGVkRGF0ZXMiLCJib3VuZGVkVmFsdWVzIiwibWF4WVBpeGVsc1RvRHJhdyIsImhlaWdodF8iLCJheGVzXyIsInlFeHRyZW1lcyIsImV4dHJlbWVSYW5nZSIsImJvdW5kZWRUb3BZIiwidG9Eb21ZQ29vcmQiLCJib3VuZGVkQm90dG9tWSIsImJvdW5kZWRUb3BWYWx1ZSIsInRvRGF0YVlDb29yZCIsImJvdW5kZWRCb3R0b21WYWx1ZSIsImlzMkRQYW4iLCJheGVzIiwiYXhpc19kYXRhIiwieVJhbmdlIiwieUF4aXNSYW5nZSIsImxvZ3NjYWxlIiwiYXR0cmlidXRlc18iLCJnZXRGb3JBeGlzIiwiaW5pdGlhbFRvcFZhbHVlIiwiZHJhZ1ZhbHVlUmFuZ2UiLCJ1bml0c1BlclBpeGVsIiwiaCIsInB1c2giLCJ2YWx1ZVJhbmdlIiwibWluRGF0ZSIsIm1heCIsIm1heERhdGUiLCJkYXRlV2luZG93XyIsIkxPR19TQ0FMRSIsInBpeGVsc0RyYWdnZWQiLCJ1bml0c0RyYWdnZWQiLCJib3VuZGVkVmFsdWUiLCJtYXhWYWx1ZSIsIm1pbiIsIm1pblZhbHVlIiwiZHJhd0dyYXBoXyIsInN0YXJ0UGFuIiwibW91c2Vtb3ZlIiwibW92ZVBhbiIsImVuZFBhbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7Ozs7OztJQUVxQkEsa0I7OztnREFrQmM7QUFFM0JDLElBQUFBLFNBQVMsRUFBRSxtQkFBQ0MsS0FBRCxFQUFhQyxDQUFiLEVBQXFCQyxPQUFyQixFQUFzQztBQUM3Q0EsTUFBQUEsT0FBTyxDQUFDQyxtQkFBUixDQUE0QkgsS0FBNUIsRUFBbUNDLENBQW5DLEVBQXNDQyxPQUF0QztBQUNILEtBSjBCO0FBTTNCRSxJQUFBQSxPQUFPLEVBQUVOLGtCQUFrQixDQUFDTztBQU5ELEc7Ozs7O2dCQWxCZFAsa0IsOEJBRWlCLFVBQUNFLEtBQUQsRUFBYUMsQ0FBYixFQUFxQkMsT0FBckIsRUFBc0M7QUFD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QSxDQUFDLENBQUMwRyxVQUFGLENBQWEsS0FBYjtBQUNILEM7O2dCQS9OZ0I3RyxrQixZQWlPREEsa0JBQWtCLENBQUNPLHdCOztnQkFqT2xCUCxrQiwrQkFvT2tCO0FBQy9CQyxFQUFBQSxTQUFTLEVBQUUsbUJBQVVDLEtBQVYsRUFBc0JDLENBQXRCLEVBQThCQyxPQUE5QixFQUE0QztBQUNuREEsSUFBQUEsT0FBTyxDQUFDQyxtQkFBUixDQUE0QkgsS0FBNUIsRUFBbUNDLENBQW5DLEVBQXNDQyxPQUF0QztBQUNBSixJQUFBQSxrQkFBa0IsQ0FBQzhHLFFBQW5CLENBQTRCNUcsS0FBNUIsRUFBbUNDLENBQW5DLEVBQXNDQyxPQUF0QztBQUNILEdBSjhCO0FBSy9CMkcsRUFBQUEsU0FBUyxFQUFFLG1CQUFVN0csS0FBVixFQUFzQkMsQ0FBdEIsRUFBOEJDLE9BQTlCLEVBQTRDO0FBQ25ELFFBQUlBLE9BQU8sQ0FBQzhDLFNBQVosRUFBdUI7QUFDbkJsRCxNQUFBQSxrQkFBa0IsQ0FBQ2dILE9BQW5CLENBQTJCOUcsS0FBM0IsRUFBa0NDLENBQWxDLEVBQXFDQyxPQUFyQztBQUNIO0FBQ0osR0FUOEI7QUFVL0JFLEVBQUFBLE9BQU8sRUFBRSxpQkFBVUosS0FBVixFQUFzQkMsQ0FBdEIsRUFBOEJDLE9BQTlCLEVBQTRDO0FBQ2pELFFBQUlBLE9BQU8sQ0FBQzhDLFNBQVosRUFBdUI7QUFDbkJsRCxNQUFBQSxrQkFBa0IsQ0FBQ2lILE1BQW5CLENBQTBCL0csS0FBMUIsRUFBaUNDLENBQWpDLEVBQW9DQyxPQUFwQztBQUNIO0FBQ0o7QUFkOEIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1dGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeWdyYXBoSW50ZXJhY3Rpb24ge1xuXG4gICAgc3RhdGljIG1heWJlVHJlYXRNb3VzZU9wQXNDbGljayA9IChldmVudDogYW55LCBnOiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgICAgICBjb250ZXh0LmRyYWdFbmRYID0gdXRpbHMuZHJhZ0dldFgoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0LmRyYWdFbmRZID0gdXRpbHMuZHJhZ0dldFkoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICBsZXQgcmVnaW9uV2lkdGggPSBNYXRoLmFicyhjb250ZXh0LmRyYWdFbmRYIC0gY29udGV4dC5kcmFnU3RhcnRYKTtcbiAgICAgICAgbGV0IHJlZ2lvbkhlaWdodCA9IE1hdGguYWJzKGNvbnRleHQuZHJhZ0VuZFkgLSBjb250ZXh0LmRyYWdTdGFydFkpO1xuXG4gICAgICAgIGlmIChyZWdpb25XaWR0aCA8IDIgJiYgcmVnaW9uSGVpZ2h0IDwgMiAmJlxuICAgICAgICAgICAgZy5sYXN0eF8gIT09IHVuZGVmaW5lZCAmJiBnLmxhc3R4XyAhPSAtMSkge1xuICAgICAgICAgICAgRHlncmFwaEludGVyYWN0aW9uLnRyZWF0TW91c2VPcEFzQ2xpY2soZywgZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5yZWdpb25XaWR0aCA9IHJlZ2lvbldpZHRoO1xuICAgICAgICBjb250ZXh0LnJlZ2lvbkhlaWdodCA9IHJlZ2lvbkhlaWdodDtcbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIG5vbkludGVyYWN0aXZlTW9kZWxfID0ge1xuXG4gICAgICAgIG1vdXNlZG93bjogKGV2ZW50OiBhbnksIGc6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb250ZXh0LmluaXRpYWxpemVNb3VzZURvd24oZXZlbnQsIGcsIGNvbnRleHQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1vdXNldXA6IER5Z3JhcGhJbnRlcmFjdGlvbi5tYXliZVRyZWF0TW91c2VPcEFzQ2xpY2tcbiAgICB9O1xuXG5cbiAgICBzdGF0aWMgdHJlYXRNb3VzZU9wQXNDbGljayA9IChnOiBhbnksIGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgICAgICBsZXQgY2xpY2tDYWxsYmFjayA9IGcuZ2V0RnVuY3Rpb25PcHRpb24oJ2NsaWNrQ2FsbGJhY2snKTtcbiAgICAgICAgbGV0IHBvaW50Q2xpY2tDYWxsYmFjayA9IGcuZ2V0RnVuY3Rpb25PcHRpb24oJ3BvaW50Q2xpY2tDYWxsYmFjaycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFBvaW50ID0gbnVsbDtcblxuICAgICAgICAvLyBGaW5kIG91dCBpZiB0aGUgY2xpY2sgb2NjdXJzIG9uIGEgcG9pbnQuXG4gICAgICAgIGxldCBjbG9zZXN0SWR4ID0gLTE7XG4gICAgICAgIGxldCBjbG9zZXN0RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGljayB3YXMgb24gYSBwYXJ0aWN1bGFyIHBvaW50LlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGcuc2VsUG9pbnRzXy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAgPSBnLnNlbFBvaW50c19baV07XG4gICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLnBvdyhwLmNhbnZhc3ggLSBjb250ZXh0LmRyYWdFbmRYLCAyKSArXG4gICAgICAgICAgICAgICAgTWF0aC5wb3cocC5jYW52YXN5IC0gY29udGV4dC5kcmFnRW5kWSwgMik7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGRpc3RhbmNlKSAmJlxuICAgICAgICAgICAgICAgIChjbG9zZXN0SWR4ID09IC0xIHx8IGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RJZHggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgYW55IGNsaWNrIHdpdGhpbiB0d28gcGl4ZWxzIG9mIHRoZSBkb3QuXG4gICAgICAgIGxldCByYWRpdXMgPSBnLmdldE51bWVyaWNPcHRpb24oJ2hpZ2hsaWdodENpcmNsZVNpemUnKSArIDI7XG4gICAgICAgIGlmIChjbG9zZXN0RGlzdGFuY2UgPD0gcmFkaXVzICogcmFkaXVzKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFBvaW50ID0gZy5zZWxQb2ludHNfW2Nsb3Nlc3RJZHhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCBlID0ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgcG9pbnQ6IHNlbGVjdGVkUG9pbnQsXG4gICAgICAgICAgICAgICAgY2FudmFzeDogY29udGV4dC5kcmFnRW5kWCxcbiAgICAgICAgICAgICAgICBjYW52YXN5OiBjb250ZXh0LmRyYWdFbmRZXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBnLmNhc2NhZGVFdmVudHNfKCdwb2ludENsaWNrJywgZSk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgYWxzbyBwcmV2ZW50cyBjbGljayAvIGNsaWNrQ2FsbGJhY2sgZnJvbSBmaXJpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvaW50Q2xpY2tDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHBvaW50Q2xpY2tDYWxsYmFjay5jYWxsKGcsIGV2ZW50LCBzZWxlY3RlZFBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlID0ge1xuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHh2YWw6IGcubGFzdHhfLCAgLy8gY2xvc2VzdCBwb2ludCBieSB4IHZhbHVlXG4gICAgICAgICAgICBwdHM6IGcuc2VsUG9pbnRzXyxcbiAgICAgICAgICAgIGNhbnZhc3g6IGNvbnRleHQuZHJhZ0VuZFgsXG4gICAgICAgICAgICBjYW52YXN5OiBjb250ZXh0LmRyYWdFbmRZXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZy5jYXNjYWRlRXZlbnRzXygnY2xpY2snLCBlKSkge1xuICAgICAgICAgICAgaWYgKGNsaWNrQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjbGlja0NhbGxiYWNrLmNhbGwoZywgZXZlbnQsIGcubGFzdHhfLCBnLnNlbFBvaW50c18pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgc3RhdGljIHN0YXJ0UGFuID0gKGV2ZW50OiBhbnksIGc6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgICAgIGxldCBpLCBheGlzO1xuICAgICAgICBjb250ZXh0LmlzUGFubmluZyA9IHRydWU7XG4gICAgICAgIGxldCB4UmFuZ2UgPSBnLnhBeGlzUmFuZ2UoKTtcblxuICAgICAgICBpZiAoZy5nZXRPcHRpb25Gb3JBeGlzKFwibG9nc2NhbGVcIiwgXCJ4XCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmluaXRpYWxMZWZ0bW9zdERhdGUgPSB1dGlscy5sb2cxMCh4UmFuZ2VbMF0pO1xuICAgICAgICAgICAgY29udGV4dC5kYXRlUmFuZ2UgPSB1dGlscy5sb2cxMCh4UmFuZ2VbMV0pIC0gdXRpbHMubG9nMTAoeFJhbmdlWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuaW5pdGlhbExlZnRtb3N0RGF0ZSA9IHhSYW5nZVswXTtcbiAgICAgICAgICAgIGNvbnRleHQuZGF0ZVJhbmdlID0geFJhbmdlWzFdIC0geFJhbmdlWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC54VW5pdHNQZXJQaXhlbCA9IGNvbnRleHQuZGF0ZVJhbmdlIC8gKGcucGxvdHRlcl8uYXJlYS53IC0gMSk7XG5cbiAgICAgICAgaWYgKGcuZ2V0TnVtZXJpY09wdGlvbihcInBhbkVkZ2VGcmFjdGlvblwiKSkge1xuICAgICAgICAgICAgbGV0IG1heFhQaXhlbHNUb0RyYXcgPSBnLndpZHRoXyAqIGcuZ2V0TnVtZXJpY09wdGlvbihcInBhbkVkZ2VGcmFjdGlvblwiKTtcbiAgICAgICAgICAgIGxldCB4RXh0cmVtZXMgPSBnLnhBeGlzRXh0cmVtZXMoKTsgLy8gSSBSRUFMTFkgV0FOVCBUTyBDQUxMIFRISVMgeFRyZW1lcyFcblxuICAgICAgICAgICAgbGV0IGJvdW5kZWRMZWZ0WCA9IGcudG9Eb21YQ29vcmQoeEV4dHJlbWVzWzBdKSAtIG1heFhQaXhlbHNUb0RyYXc7XG4gICAgICAgICAgICBsZXQgYm91bmRlZFJpZ2h0WCA9IGcudG9Eb21YQ29vcmQoeEV4dHJlbWVzWzFdKSArIG1heFhQaXhlbHNUb0RyYXc7XG5cbiAgICAgICAgICAgIGxldCBib3VuZGVkTGVmdERhdGUgPSBnLnRvRGF0YVhDb29yZChib3VuZGVkTGVmdFgpO1xuICAgICAgICAgICAgbGV0IGJvdW5kZWRSaWdodERhdGUgPSBnLnRvRGF0YVhDb29yZChib3VuZGVkUmlnaHRYKTtcbiAgICAgICAgICAgIGNvbnRleHQuYm91bmRlZERhdGVzID0gW2JvdW5kZWRMZWZ0RGF0ZSwgYm91bmRlZFJpZ2h0RGF0ZV07XG5cbiAgICAgICAgICAgIGxldCBib3VuZGVkVmFsdWVzID0gW107XG4gICAgICAgICAgICBsZXQgbWF4WVBpeGVsc1RvRHJhdyA9IGcuaGVpZ2h0XyAqIGcuZ2V0TnVtZXJpY09wdGlvbihcInBhbkVkZ2VGcmFjdGlvblwiKTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGcuYXhlc18ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBheGlzID0gZy5heGVzX1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgeUV4dHJlbWVzID0gYXhpcy5leHRyZW1lUmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBsZXQgYm91bmRlZFRvcFkgPSBnLnRvRG9tWUNvb3JkKHlFeHRyZW1lc1swXSwgaSkgKyBtYXhZUGl4ZWxzVG9EcmF3O1xuICAgICAgICAgICAgICAgIGxldCBib3VuZGVkQm90dG9tWSA9IGcudG9Eb21ZQ29vcmQoeUV4dHJlbWVzWzFdLCBpKSAtIG1heFlQaXhlbHNUb0RyYXc7XG5cbiAgICAgICAgICAgICAgICBsZXQgYm91bmRlZFRvcFZhbHVlID0gZy50b0RhdGFZQ29vcmQoYm91bmRlZFRvcFksIGkpO1xuICAgICAgICAgICAgICAgIGxldCBib3VuZGVkQm90dG9tVmFsdWUgPSBnLnRvRGF0YVlDb29yZChib3VuZGVkQm90dG9tWSwgaSk7XG5cbiAgICAgICAgICAgICAgICBib3VuZGVkVmFsdWVzW2ldID0gW2JvdW5kZWRUb3BWYWx1ZSwgYm91bmRlZEJvdHRvbVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuYm91bmRlZFZhbHVlcyA9IGJvdW5kZWRWYWx1ZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNvcmQgdGhlIHJhbmdlIG9mIGVhY2ggeS1heGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZHJhZy5cbiAgICAgICAgLy8gSWYgYW55IGF4aXMgaGFzIGEgdmFsdWVSYW5nZSwgdGhlbiB3ZSB3YW50IGEgMkQgcGFuLlxuICAgICAgICAvLyBXZSBjYW4ndCBzdG9yZSBkYXRhIGRpcmVjdGx5IGluIGcuYXhlc18sIGJlY2F1c2UgaXQgZG9lcyBub3QgYmVsb25nIHRvIHVzXG4gICAgICAgIC8vIGFuZCBjb3VsZCBjaGFuZ2Ugb3V0IGZyb20gdW5kZXIgdXMgZHVyaW5nIGEgcGFuIChzYXkgaWYgdGhlcmUncyBhIGRhdGFcbiAgICAgICAgLy8gdXBkYXRlKS5cbiAgICAgICAgY29udGV4dC5pczJEUGFuID0gZmFsc2U7XG4gICAgICAgIGNvbnRleHQuYXhlcyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZy5heGVzXy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXhpcyA9IGcuYXhlc19baV07XG4gICAgICAgICAgICBsZXQgYXhpc19kYXRhOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGxldCB5UmFuZ2UgPSBnLnlBeGlzUmFuZ2UoaSk7XG4gICAgICAgICAgICAvLyBUT0RPKGtvbmlnc2JlcmcpOiBUaGVzZSB2YWx1ZXMgc2hvdWxkIGJlIGluIHxjb250ZXh0fC5cbiAgICAgICAgICAgIC8vIEluIGxvZyBzY2FsZSwgaW5pdGlhbFRvcFZhbHVlLCBkcmFnVmFsdWVSYW5nZSBhbmQgdW5pdHNQZXJQaXhlbCBhcmUgbG9nIHNjYWxlLlxuICAgICAgICAgICAgbGV0IGxvZ3NjYWxlID0gZy5hdHRyaWJ1dGVzXy5nZXRGb3JBeGlzKFwibG9nc2NhbGVcIiwgaSk7XG4gICAgICAgICAgICBpZiAobG9nc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBheGlzX2RhdGEuaW5pdGlhbFRvcFZhbHVlID0gdXRpbHMubG9nMTAoeVJhbmdlWzFdKTtcbiAgICAgICAgICAgICAgICBheGlzX2RhdGEuZHJhZ1ZhbHVlUmFuZ2UgPSB1dGlscy5sb2cxMCh5UmFuZ2VbMV0pIC0gdXRpbHMubG9nMTAoeVJhbmdlWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXhpc19kYXRhLmluaXRpYWxUb3BWYWx1ZSA9IHlSYW5nZVsxXTtcbiAgICAgICAgICAgICAgICBheGlzX2RhdGEuZHJhZ1ZhbHVlUmFuZ2UgPSB5UmFuZ2VbMV0gLSB5UmFuZ2VbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBheGlzX2RhdGEudW5pdHNQZXJQaXhlbCA9IGF4aXNfZGF0YS5kcmFnVmFsdWVSYW5nZSAvIChnLnBsb3R0ZXJfLmFyZWEuaCAtIDEpO1xuICAgICAgICAgICAgY29udGV4dC5heGVzLnB1c2goYXhpc19kYXRhKTtcblxuICAgICAgICAgICAgLy8gV2hpbGUgY2FsY3VsYXRpbmcgYXhlcywgc2V0IDJkcGFuLlxuICAgICAgICAgICAgaWYgKGF4aXMudmFsdWVSYW5nZSkgY29udGV4dC5pczJEUGFuID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHN0YXRpYyBtb3ZlUGFuID0gKGV2ZW50OiBhbnksIGc6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgICAgIGNvbnRleHQuZHJhZ0VuZFggPSB1dGlscy5kcmFnR2V0WChldmVudCwgY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuZHJhZ0VuZFkgPSB1dGlscy5kcmFnR2V0WShldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgbGV0IG1pbkRhdGUgPSBjb250ZXh0LmluaXRpYWxMZWZ0bW9zdERhdGUgLVxuICAgICAgICAgICAgKGNvbnRleHQuZHJhZ0VuZFggLSBjb250ZXh0LmRyYWdTdGFydFgpICogY29udGV4dC54VW5pdHNQZXJQaXhlbDtcbiAgICAgICAgaWYgKGNvbnRleHQuYm91bmRlZERhdGVzKSB7XG4gICAgICAgICAgICBtaW5EYXRlID0gTWF0aC5tYXgobWluRGF0ZSwgY29udGV4dC5ib3VuZGVkRGF0ZXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXhEYXRlID0gbWluRGF0ZSArIGNvbnRleHQuZGF0ZVJhbmdlO1xuICAgICAgICBpZiAoY29udGV4dC5ib3VuZGVkRGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChtYXhEYXRlID4gY29udGV4dC5ib3VuZGVkRGF0ZXNbMV0pIHtcbiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgbWluRGF0ZSwgYW5kIHJlY29tcHV0ZSBtYXhEYXRlLlxuICAgICAgICAgICAgICAgIG1pbkRhdGUgPSBtaW5EYXRlIC0gKG1heERhdGUgLSBjb250ZXh0LmJvdW5kZWREYXRlc1sxXSk7XG4gICAgICAgICAgICAgICAgbWF4RGF0ZSA9IG1pbkRhdGUgKyBjb250ZXh0LmRhdGVSYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnLmdldE9wdGlvbkZvckF4aXMoXCJsb2dzY2FsZVwiLCBcInhcIikpIHtcbiAgICAgICAgICAgIGcuZGF0ZVdpbmRvd18gPSBbTWF0aC5wb3codXRpbHMuTE9HX1NDQUxFLCBtaW5EYXRlKSxcbiAgICAgICAgICAgICAgICBNYXRoLnBvdyh1dGlscy5MT0dfU0NBTEUsIG1heERhdGUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGcuZGF0ZVdpbmRvd18gPSBbbWluRGF0ZSwgbWF4RGF0ZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB5LWF4aXMgc2NhbGluZyBpcyBhdXRvbWF0aWMgdW5sZXNzIHRoaXMgaXMgYSBmdWxsIDJEIHBhbi5cbiAgICAgICAgaWYgKGNvbnRleHQuaXMyRFBhbikge1xuXG4gICAgICAgICAgICBsZXQgcGl4ZWxzRHJhZ2dlZCA9IGNvbnRleHQuZHJhZ0VuZFkgLSBjb250ZXh0LmRyYWdTdGFydFk7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCBlYWNoIGF4aXMgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZy5heGVzXy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBheGlzID0gZy5heGVzX1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgYXhpc19kYXRhID0gY29udGV4dC5heGVzW2ldO1xuICAgICAgICAgICAgICAgIGxldCB1bml0c0RyYWdnZWQgPSBwaXhlbHNEcmFnZ2VkICogYXhpc19kYXRhLnVuaXRzUGVyUGl4ZWw7XG5cbiAgICAgICAgICAgICAgICBsZXQgYm91bmRlZFZhbHVlID0gY29udGV4dC5ib3VuZGVkVmFsdWVzID8gY29udGV4dC5ib3VuZGVkVmFsdWVzW2ldIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIEluIGxvZyBzY2FsZSwgbWF4VmFsdWUgYW5kIG1pblZhbHVlIGFyZSB0aGUgbG9ncyBvZiB0aG9zZSB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgbGV0IG1heFZhbHVlID0gYXhpc19kYXRhLmluaXRpYWxUb3BWYWx1ZSArIHVuaXRzRHJhZ2dlZDtcbiAgICAgICAgICAgICAgICBpZiAoYm91bmRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlID0gTWF0aC5taW4obWF4VmFsdWUsIGJvdW5kZWRWYWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBtaW5WYWx1ZSA9IG1heFZhbHVlIC0gYXhpc19kYXRhLmRyYWdWYWx1ZVJhbmdlO1xuICAgICAgICAgICAgICAgIGlmIChib3VuZGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pblZhbHVlIDwgYm91bmRlZFZhbHVlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3QgbWF4VmFsdWUsIGFuZCByZWNvbXB1dGUgbWluVmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IG1heFZhbHVlIC0gKG1pblZhbHVlIC0gYm91bmRlZFZhbHVlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gbWF4VmFsdWUgLSBheGlzX2RhdGEuZHJhZ1ZhbHVlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGcuYXR0cmlidXRlc18uZ2V0Rm9yQXhpcyhcImxvZ3NjYWxlXCIsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF4aXMudmFsdWVSYW5nZSA9IFtNYXRoLnBvdyh1dGlscy5MT0dfU0NBTEUsIG1pblZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KHV0aWxzLkxPR19TQ0FMRSwgbWF4VmFsdWUpXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBheGlzLnZhbHVlUmFuZ2UgPSBbbWluVmFsdWUsIG1heFZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnLmRyYXdHcmFwaF8oZmFsc2UpO1xuICAgIH07XG5cbiAgICBzdGF0aWMgZW5kUGFuID0gRHlncmFwaEludGVyYWN0aW9uLm1heWJlVHJlYXRNb3VzZU9wQXNDbGljaztcblxuXG4gICAgc3RhdGljIGRyYWdJc1BhbkludGVyYWN0aW9uTW9kZWwgPSB7XG4gICAgICAgIG1vdXNlZG93bjogZnVuY3Rpb24gKGV2ZW50OiBhbnksIGc6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgICAgICAgICBjb250ZXh0LmluaXRpYWxpemVNb3VzZURvd24oZXZlbnQsIGcsIGNvbnRleHQpO1xuICAgICAgICAgICAgRHlncmFwaEludGVyYWN0aW9uLnN0YXJ0UGFuKGV2ZW50LCBnLCBjb250ZXh0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2Vtb3ZlOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSwgZzogYW55LCBjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmlzUGFubmluZykge1xuICAgICAgICAgICAgICAgIER5Z3JhcGhJbnRlcmFjdGlvbi5tb3ZlUGFuKGV2ZW50LCBnLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW91c2V1cDogZnVuY3Rpb24gKGV2ZW50OiBhbnksIGc6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5pc1Bhbm5pbmcpIHtcbiAgICAgICAgICAgICAgICBEeWdyYXBoSW50ZXJhY3Rpb24uZW5kUGFuKGV2ZW50LCBnLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cblxufSJdfQ==