kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
307 lines (263 loc) • 34.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.arcVisConfigs = exports.arcRequiredColumns = exports.arcPosResolver = exports.arcPosAccessor = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _lodash = _interopRequireDefault(require("lodash.memoize"));
var _baseLayer = _interopRequireDefault(require("../base-layer"));
var _arcBrushingLayer = _interopRequireDefault(require("../../deckgl-layers/arc-brushing-layer/arc-brushing-layer"));
var _colorUtils = require("../../utils/color-utils");
var _arcLayerIcon = _interopRequireDefault(require("./arc-layer-icon"));
var _defaultSettings = require("../../constants/default-settings");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var arcPosAccessor = exports.arcPosAccessor = function arcPosAccessor(_ref) {
var lat0 = _ref.lat0,
lng0 = _ref.lng0,
lat1 = _ref.lat1,
lng1 = _ref.lng1;
return function (d) {
return [d.data[lng0.fieldIdx], d.data[lat0.fieldIdx], 0, d.data[lng1.fieldIdx], d.data[lat1.fieldIdx], 0];
};
};
var arcPosResolver = exports.arcPosResolver = function arcPosResolver(_ref2) {
var lat0 = _ref2.lat0,
lng0 = _ref2.lng0,
lat1 = _ref2.lat1,
lng1 = _ref2.lng1;
return "".concat(lat0.fieldIdx, "-").concat(lng0.fieldIdx, "-").concat(lat1.fieldIdx, "-").concat(lat1.fieldIdx, "}");
};
var arcRequiredColumns = exports.arcRequiredColumns = ['lat0', 'lng0', 'lat1', 'lng1'];
var arcVisConfigs = exports.arcVisConfigs = {
opacity: 'opacity',
thickness: 'thickness',
colorRange: 'colorRange',
sizeRange: 'strokeWidthRange',
targetColor: 'targetColor'
};
var ArcLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
(0, _inherits2["default"])(ArcLayer, _Layer);
var _super = _createSuper(ArcLayer);
function ArcLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, ArcLayer);
_this = _super.call(this, props);
_this.registerVisConfig(arcVisConfigs);
_this.getPosition = (0, _lodash["default"])(arcPosAccessor, arcPosResolver);
return _this;
}
(0, _createClass2["default"])(ArcLayer, [{
key: "type",
get: function get() {
return 'arc';
}
}, {
key: "isAggregated",
get: function get() {
return false;
}
}, {
key: "layerIcon",
get: function get() {
return _arcLayerIcon["default"];
}
}, {
key: "requiredLayerColumns",
get: function get() {
return arcRequiredColumns;
}
}, {
key: "columnPairs",
get: function get() {
return this.defaultLinkColumnPairs;
}
}, {
key: "visualChannels",
get: function get() {
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(ArcLayer.prototype), "visualChannels", this)), {}, {
size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(ArcLayer.prototype), "visualChannels", this).size), {}, {
property: 'stroke'
})
});
}
}, {
key: "formatLayerData",
value: // TODO: fix complexity
/* eslint-disable complexity */
function formatLayerData(_, allData, filteredIndex, oldLayerData) {
var _this2 = this;
var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var _this$config = this.config,
colorScale = _this$config.colorScale,
colorDomain = _this$config.colorDomain,
colorField = _this$config.colorField,
color = _this$config.color,
columns = _this$config.columns,
sizeField = _this$config.sizeField,
sizeScale = _this$config.sizeScale,
sizeDomain = _this$config.sizeDomain,
_this$config$visConfi = _this$config.visConfig,
sizeRange = _this$config$visConfi.sizeRange,
colorRange = _this$config$visConfi.colorRange,
targetColor = _this$config$visConfi.targetColor; // arc color
var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // arc thickness
var sScale = sizeField && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange);
var getPosition = this.getPosition(columns);
if (!oldLayerData || oldLayerData.getPosition !== getPosition) {
this.updateLayerMeta(allData, getPosition);
}
var data;
if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getPosition === getPosition) {
data = oldLayerData.data;
} else {
data = filteredIndex.reduce(function (accu, index) {
var pos = getPosition({
data: allData[index]
}); // if doesn't have point lat or lng, do not add the arc
// deck.gl can't handle position == null
if (!pos.every(Number.isFinite)) {
return accu;
}
accu.push({
index: index,
sourcePosition: [pos[0], pos[1], pos[2]],
targetPosition: [pos[3], pos[4], pos[5]],
data: allData[index]
});
return accu;
}, []);
}
var getStrokeWidth = sScale ? function (d) {
return _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0);
} : 1;
var getColor = cScale ? function (d) {
return _this2.getEncodedChannelValue(cScale, d.data, colorField);
} : color;
var getTargetColor = cScale ? function (d) {
return _this2.getEncodedChannelValue(cScale, d.data, colorField);
} : targetColor || color;
return {
data: data,
getColor: getColor,
getSourceColor: getColor,
getTargetColor: getTargetColor,
getWidth: getStrokeWidth
};
}
/* eslint-enable complexity */
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(allData, getPosition) {
// get bounds from arcs
var sBounds = this.getPointsBounds(allData, function (d) {
var pos = getPosition({
data: d
});
return [pos[0], pos[1]];
});
var tBounds = this.getPointsBounds(allData, function (d) {
var pos = getPosition({
data: d
});
return [pos[3], pos[4]];
});
var bounds = tBounds && sBounds ? [Math.min(sBounds[0], tBounds[0]), Math.min(sBounds[1], tBounds[1]), Math.max(sBounds[2], tBounds[2]), Math.max(sBounds[3], tBounds[3])] : sBounds || tBounds;
this.updateMeta({
bounds: bounds
});
}
}, {
key: "renderLayer",
value: function renderLayer(_ref3) {
var data = _ref3.data,
idx = _ref3.idx,
objectHovered = _ref3.objectHovered,
layerInteraction = _ref3.layerInteraction,
mapState = _ref3.mapState,
interactionConfig = _ref3.interactionConfig;
var brush = interactionConfig.brush;
var colorUpdateTriggers = {
color: this.config.color,
colorField: this.config.colorField,
colorRange: this.config.visConfig.colorRange,
colorScale: this.config.colorScale,
targetColor: this.config.visConfig.targetColor
};
var interaction = {
// auto highlighting
pickable: true,
autoHighlight: !brush.enabled,
highlightColor: this.config.highlightColor,
// brushing
brushRadius: brush.config.size * 1000,
brushSource: true,
brushTarget: true,
enableBrushing: brush.enabled
};
return [new _arcBrushingLayer["default"](_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, data), interaction), layerInteraction), {}, {
id: this.id,
idx: idx,
opacity: this.config.visConfig.opacity,
pickedColor: this.config.highlightColor,
strokeScale: this.config.visConfig.thickness,
// parameters
parameters: {
depthTest: mapState.dragRotate
},
updateTriggers: {
getWidth: {
sizeField: this.config.sizeField,
sizeRange: this.config.visConfig.sizeRange
},
getSourceColor: colorUpdateTriggers,
getTargetColor: colorUpdateTriggers
}
}))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) ? [new _arcBrushingLayer["default"]({
id: "".concat(this.id, "-hovered"),
data: [objectHovered.object],
strokeScale: this.config.visConfig.thickness,
getSourceColor: this.config.highlightColor,
getTargetColor: this.config.highlightColor,
getWidth: data.getWidth,
pickable: false
})] : []));
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref4) {
var _ref4$fieldPairs = _ref4.fieldPairs,
fieldPairs = _ref4$fieldPairs === void 0 ? [] : _ref4$fieldPairs;
if (fieldPairs.length < 2) {
return {
props: []
};
}
var props = {
color: (0, _colorUtils.hexToRgb)(_defaultSettings.DEFAULT_LAYER_COLOR.tripArc)
}; // connect the first two point layer with arc
props.columns = {
lat0: fieldPairs[0].pair.lat,
lng0: fieldPairs[0].pair.lng,
lat1: fieldPairs[1].pair.lat,
lng1: fieldPairs[1].pair.lng
};
props.label = "".concat(fieldPairs[0].defaultName, " -> ").concat(fieldPairs[1].defaultName, " arc");
return {
props: [props]
};
}
}]);
return ArcLayer;
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYXJjLWxheWVyL2FyYy1sYXllci5qcyJdLCJuYW1lcyI6WyJhcmNQb3NBY2Nlc3NvciIsImxhdDAiLCJsbmcwIiwibGF0MSIsImxuZzEiLCJkIiwiZGF0YSIsImZpZWxkSWR4IiwiYXJjUG9zUmVzb2x2ZXIiLCJhcmNSZXF1aXJlZENvbHVtbnMiLCJhcmNWaXNDb25maWdzIiwib3BhY2l0eSIsInRoaWNrbmVzcyIsImNvbG9yUmFuZ2UiLCJzaXplUmFuZ2UiLCJ0YXJnZXRDb2xvciIsIkFyY0xheWVyIiwicHJvcHMiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uIiwiQXJjTGF5ZXJJY29uIiwiZGVmYXVsdExpbmtDb2x1bW5QYWlycyIsInNpemUiLCJwcm9wZXJ0eSIsIl8iLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsIm9sZExheWVyRGF0YSIsIm9wdCIsImNvbmZpZyIsImNvbG9yU2NhbGUiLCJjb2xvckRvbWFpbiIsImNvbG9yRmllbGQiLCJjb2xvciIsImNvbHVtbnMiLCJzaXplRmllbGQiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwidmlzQ29uZmlnIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiY29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJzU2NhbGUiLCJ1cGRhdGVMYXllck1ldGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwic291cmNlUG9zaXRpb24iLCJ0YXJnZXRQb3NpdGlvbiIsImdldFN0cm9rZVdpZHRoIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImdldENvbG9yIiwiZ2V0VGFyZ2V0Q29sb3IiLCJnZXRTb3VyY2VDb2xvciIsImdldFdpZHRoIiwic0JvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInRCb3VuZHMiLCJib3VuZHMiLCJNYXRoIiwibWluIiwibWF4IiwidXBkYXRlTWV0YSIsImlkeCIsIm9iamVjdEhvdmVyZWQiLCJsYXllckludGVyYWN0aW9uIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoIiwiY29sb3JVcGRhdGVUcmlnZ2VycyIsImludGVyYWN0aW9uIiwicGlja2FibGUiLCJhdXRvSGlnaGxpZ2h0IiwiZW5hYmxlZCIsImhpZ2hsaWdodENvbG9yIiwiYnJ1c2hSYWRpdXMiLCJicnVzaFNvdXJjZSIsImJydXNoVGFyZ2V0IiwiZW5hYmxlQnJ1c2hpbmciLCJBcmNCcnVzaGluZ0xheWVyIiwiaWQiLCJwaWNrZWRDb2xvciIsInN0cm9rZVNjYWxlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJ1cGRhdGVUcmlnZ2VycyIsImlzTGF5ZXJIb3ZlcmVkIiwib2JqZWN0IiwiZmllbGRQYWlycyIsImxlbmd0aCIsIkRFRkFVTFRfTEFZRVJfQ09MT1IiLCJ0cmlwQXJjIiwicGFpciIsImxhdCIsImxuZyIsImxhYmVsIiwiZGVmYXVsdE5hbWUiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGNBQWMsNEJBQUcsU0FBakJBLGNBQWlCO0FBQUEsTUFBRUMsSUFBRixRQUFFQSxJQUFGO0FBQUEsTUFBUUMsSUFBUixRQUFRQSxJQUFSO0FBQUEsTUFBY0MsSUFBZCxRQUFjQSxJQUFkO0FBQUEsTUFBb0JDLElBQXBCLFFBQW9CQSxJQUFwQjtBQUFBLFNBQThCLFVBQUFDLENBQUM7QUFBQSxXQUFJLENBQy9EQSxDQUFDLENBQUNDLElBQUYsQ0FBT0osSUFBSSxDQUFDSyxRQUFaLENBRCtELEVBRS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0wsSUFBSSxDQUFDTSxRQUFaLENBRitELEVBRy9ELENBSCtELEVBSS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0YsSUFBSSxDQUFDRyxRQUFaLENBSitE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O0FBQ3pCLGVBQU87QUFBQ2pGLFVBQUFBLEtBQUssRUFBRTtBQUFSLFNBQVA7QUFDRDs7QUFFRCxVQUFNQSxLQUFLLEdBQUc7QUFDWmdCLFFBQUFBLEtBQUssRUFBRSwwQkFBU2tFLHFDQUFvQkMsT0FBN0I7QUFESyxPQUFkLENBTDhDLENBUzlDOztBQUNBbkYsTUFBQUEsS0FBSyxDQUFDaUIsT0FBTixHQUFnQjtBQUNkakMsUUFBQUEsSUFBSSxFQUFFZ0csVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjSSxJQUFkLENBQW1CQyxHQURYO0FBRWRwRyxRQUFBQSxJQUFJLEVBQUUrRixVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWNJLElBQWQsQ0FBbUJFLEdBRlg7QUFHZHBHLFFBQUFBLElBQUksRUFBRThGLFVBQVUsQ0FBQyxDQUFELENBQVYsQ0FBY0ksSUFBZCxDQUFtQkMsR0FIWDtBQUlkbEcsUUFBQUEsSUFBSSxFQUFFNkYsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjSSxJQUFkLENBQW1CRTtBQUpYLE9BQWhCO0FBTUF0RixNQUFBQSxLQUFLLENBQUN1RixLQUFOLGFBQWlCUCxVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWNRLFdBQS9CLGlCQUFpRFIsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjUSxXQUEvRDtBQUVBLGFBQU87QUFBQ3hGLFFBQUFBLEtBQUssRUFBRSxDQUFDQSxLQUFEO0FBQVIsT0FBUDtBQUNEOzs7RUF4RG1DeUYscUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdsb2Rhc2gubWVtb2l6ZSc7XG5cbmltcG9ydCBMYXllciBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCBBcmNCcnVzaGluZ0xheWVyIGZyb20gJ2RlY2tnbC1sYXllcnMvYXJjLWJydXNoaW5nLWxheWVyL2FyYy1icnVzaGluZy1sYXllcic7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQgQXJjTGF5ZXJJY29uIGZyb20gJy4vYXJjLWxheWVyLWljb24nO1xuaW1wb3J0IHtERUZBVUxUX0xBWUVSX0NPTE9SfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmV4cG9ydCBjb25zdCBhcmNQb3NBY2Nlc3NvciA9ICh7bGF0MCwgbG5nMCwgbGF0MSwgbG5nMX0pID0+IGQgPT4gW1xuICBkLmRhdGFbbG5nMC5maWVsZElkeF0sXG4gIGQuZGF0YVtsYXQwLmZpZWxkSWR4XSxcbiAgMCxcbiAgZC5kYXRhW2xuZzEuZmllbGRJZHhdLFxuICBkLmRhdGFbbGF0MS5maWVsZElkeF0sXG4gIDBcbl07XG5cbmV4cG9ydCBjb25zdCBhcmNQb3NSZXNvbHZlciA9ICh7bGF0MCwgbG5nMCwgbGF0MSwgbG5nMX0pID0+XG4gIGAke2xhdDAuZmllbGRJZHh9LSR7bG5nMC5maWVsZElkeH0tJHtsYXQxLmZpZWxkSWR4fS0ke2xhdDEuZmllbGRJZHh9fWA7XG5cbmV4cG9ydCBjb25zdCBhcmNSZXF1aXJlZENvbHVtbnMgPSBbJ2xhdDAnLCAnbG5nMCcsICdsYXQxJywgJ2xuZzEnXTtcblxuZXhwb3J0IGNvbnN0IGFyY1Zpc0NvbmZpZ3MgPSB7XG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgdGhpY2tuZXNzOiAndGhpY2tuZXNzJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzaXplUmFuZ2U6ICdzdHJva2VXaWR0aFJhbmdlJyxcbiAgdGFyZ2V0Q29sb3I6ICd0YXJnZXRDb2xvcidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFyY0xheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKGFyY1Zpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBtZW1vaXplKGFyY1Bvc0FjY2Vzc29yLCBhcmNQb3NSZXNvbHZlcik7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2FyYyc7XG4gIH1cblxuICBnZXQgaXNBZ2dyZWdhdGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgcmV0dXJuIEFyY0xheWVySWNvbjtcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gYXJjUmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMaW5rQ29sdW1uUGFpcnM7XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZSdcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRQYWlycyA9IFtdfSkge1xuICAgIGlmIChmaWVsZFBhaXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB7cHJvcHM6IFtdfTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIGNvbG9yOiBoZXhUb1JnYihERUZBVUxUX0xBWUVSX0NPTE9SLnRyaXBBcmMpXG4gICAgfTtcblxuICAgIC8vIGNvbm5lY3QgdGhlIGZpcnN0IHR3byBwb2ludCBsYXllciB3aXRoIGFyY1xuICAgIHByb3BzLmNvbHVtbnMgPSB7XG4gICAgICBsYXQwOiBmaWVsZFBhaXJzWzBdLnBhaXIubGF0LFxuICAgICAgbG5nMDogZmllbGRQYWlyc1swXS5wYWlyLmxuZyxcbiAgICAgIGxhdDE6IGZpZWxkUGFpcnNbMV0ucGFpci5sYXQsXG4gICAgICBsbmcxOiBmaWVsZFBhaXJzWzFdLnBhaXIubG5nXG4gICAgfTtcbiAgICBwcm9wcy5sYWJlbCA9IGAke2ZpZWxkUGFpcnNbMF0uZGVmYXVsdE5hbWV9IC0+ICR7ZmllbGRQYWlyc1sxXS5kZWZhdWx0TmFtZX0gYXJjYDtcblxuICAgIHJldHVybiB7cHJvcHM6IFtwcm9wc119O1xuICB9XG5cbiAgLy8gVE9ETzogZml4IGNvbXBsZXhpdHlcbiAgLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuICBmb3JtYXRMYXllckRhdGEoXywgYWxsRGF0YSwgZmlsdGVyZWRJbmRleCwgb2xkTGF5ZXJEYXRhLCBvcHQgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbG9yU2NhbGUsXG4gICAgICBjb2xvckRvbWFpbixcbiAgICAgIGNvbG9yRmllbGQsXG4gICAgICBjb2xvcixcbiAgICAgIGNvbHVtbnMsXG4gICAgICBzaXplRmllbGQsXG4gICAgICBzaXplU2NhbGUsXG4gICAgICBzaXplRG9tYWluLFxuICAgICAgdmlzQ29uZmlnOiB7c2l6ZVJhbmdlLCBjb2xvclJhbmdlLCB0YXJnZXRDb2xvcn1cbiAgICB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAvLyBhcmMgY29sb3JcbiAgICBjb25zdCBjU2NhbGUgPVxuICAgICAgY29sb3JGaWVsZCAmJlxuICAgICAgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoXG4gICAgICAgIGNvbG9yU2NhbGUsXG4gICAgICAgIGNvbG9yRG9tYWluLFxuICAgICAgICBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpXG4gICAgICApO1xuXG4gICAgLy8gYXJjIHRoaWNrbmVzc1xuICAgIGNvbnN0IHNTY2FsZSA9XG4gICAgICBzaXplRmllbGQgJiYgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoc2l6ZVNjYWxlLCBzaXplRG9tYWluLCBzaXplUmFuZ2UpO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKGNvbHVtbnMpO1xuXG4gICAgaWYgKCFvbGRMYXllckRhdGEgfHwgb2xkTGF5ZXJEYXRhLmdldFBvc2l0aW9uICE9PSBnZXRQb3NpdGlvbikge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGxldCBkYXRhO1xuICAgIGlmIChcbiAgICAgIG9sZExheWVyRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmRhdGEgJiZcbiAgICAgIG9wdC5zYW1lRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmdldFBvc2l0aW9uID09PSBnZXRQb3NpdGlvblxuICAgICkge1xuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gZmlsdGVyZWRJbmRleC5yZWR1Y2UoKGFjY3UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBhbGxEYXRhW2luZGV4XX0pO1xuXG4gICAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBhcmNcbiAgICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICBpZiAoIXBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1LnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHNvdXJjZVBvc2l0aW9uOiBbcG9zWzBdLCBwb3NbMV0sIHBvc1syXV0sXG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb246IFtwb3NbM10sIHBvc1s0XSwgcG9zWzVdXSxcbiAgICAgICAgICBkYXRhOiBhbGxEYXRhW2luZGV4XVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWNjdTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTdHJva2VXaWR0aCA9IHNTY2FsZVxuICAgICAgPyBkID0+IHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShzU2NhbGUsIGQuZGF0YSwgc2l6ZUZpZWxkLCAwKVxuICAgICAgOiAxO1xuXG4gICAgY29uc3QgZ2V0Q29sb3IgPSBjU2NhbGVcbiAgICAgID8gZCA9PiB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY1NjYWxlLCBkLmRhdGEsIGNvbG9yRmllbGQpXG4gICAgICA6IGNvbG9yO1xuXG4gICAgY29uc3QgZ2V0VGFyZ2V0Q29sb3IgPSBjU2NhbGVcbiAgICAgID8gZCA9PiB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY1NjYWxlLCBkLmRhdGEsIGNvbG9yRmllbGQpXG4gICAgICA6IHRhcmdldENvbG9yIHx8IGNvbG9yO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRDb2xvcixcbiAgICAgIGdldFNvdXJjZUNvbG9yOiBnZXRDb2xvcixcbiAgICAgIGdldFRhcmdldENvbG9yLFxuICAgICAgZ2V0V2lkdGg6IGdldFN0cm9rZVdpZHRoXG4gICAgfTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cblxuICB1cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBnZXQgYm91bmRzIGZyb20gYXJjc1xuICAgIGNvbnN0IHNCb3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhhbGxEYXRhLCBkID0+IHtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBkfSk7XG4gICAgICByZXR1cm4gW3Bvc1swXSwgcG9zWzFdXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRCb3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhhbGxEYXRhLCBkID0+IHtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBkfSk7XG4gICAgICByZXR1cm4gW3Bvc1szXSwgcG9zWzRdXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvdW5kcyA9XG4gICAgICB0Qm91bmRzICYmIHNCb3VuZHNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBNYXRoLm1pbihzQm91bmRzWzBdLCB0Qm91bmRzWzBdKSxcbiAgICAgICAgICAgIE1hdGgubWluKHNCb3VuZHNbMV0sIHRCb3VuZHNbMV0pLFxuICAgICAgICAgICAgTWF0aC5tYXgoc0JvdW5kc1syXSwgdEJvdW5kc1syXSksXG4gICAgICAgICAgICBNYXRoLm1heChzQm91bmRzWzNdLCB0Qm91bmRzWzNdKVxuICAgICAgICAgIF1cbiAgICAgICAgOiBzQm91bmRzIHx8IHRCb3VuZHM7XG5cbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgbGF5ZXJJbnRlcmFjdGlvbixcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgY29uc3QgY29sb3JVcGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGNvbG9yOiB0aGlzLmNvbmZpZy5jb2xvcixcbiAgICAgIGNvbG9yRmllbGQ6IHRoaXMuY29uZmlnLmNvbG9yRmllbGQsXG4gICAgICBjb2xvclJhbmdlOiB0aGlzLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yU2NhbGU6IHRoaXMuY29uZmlnLmNvbG9yU2NhbGUsXG4gICAgICB0YXJnZXRDb2xvcjogdGhpcy5jb25maWcudmlzQ29uZmlnLnRhcmdldENvbG9yXG4gICAgfTtcblxuICAgIGNvbnN0IGludGVyYWN0aW9uID0ge1xuICAgICAgLy8gYXV0byBoaWdobGlnaHRpbmdcbiAgICAgIHBpY2thYmxlOiB0cnVlLFxuICAgICAgYXV0b0hpZ2hsaWdodDogIWJydXNoLmVuYWJsZWQsXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG5cbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBicnVzaFJhZGl1czogYnJ1c2guY29uZmlnLnNpemUgKiAxMDAwLFxuICAgICAgYnJ1c2hTb3VyY2U6IHRydWUsXG4gICAgICBicnVzaFRhcmdldDogdHJ1ZSxcbiAgICAgIGVuYWJsZUJydXNoaW5nOiBicnVzaC5lbmFibGVkXG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgQXJjQnJ1c2hpbmdMYXllcih7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLmludGVyYWN0aW9uLFxuICAgICAgICAuLi5sYXllckludGVyYWN0aW9uLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgaWR4LFxuICAgICAgICBvcGFjaXR5OiB0aGlzLmNvbmZpZy52aXNDb25maWcub3BhY2l0eSxcbiAgICAgICAgcGlja2VkQ29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICBzdHJva2VTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcblxuICAgICAgICAvLyBwYXJhbWV0ZXJzXG4gICAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IG1hcFN0YXRlLmRyYWdSb3RhdGV9LFxuXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0V2lkdGg6IHtcbiAgICAgICAgICAgIHNpemVGaWVsZDogdGhpcy5jb25maWcuc2l6ZUZpZWxkLFxuICAgICAgICAgICAgc2l6ZVJhbmdlOiB0aGlzLmNvbmZpZy52aXNDb25maWcuc2l6ZVJhbmdlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRTb3VyY2VDb2xvcjogY29sb3JVcGRhdGVUcmlnZ2VycyxcbiAgICAgICAgICBnZXRUYXJnZXRDb2xvcjogY29sb3JVcGRhdGVUcmlnZ2Vyc1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIC8vIGhvdmVyIGxheWVyXG4gICAgICAuLi4odGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RIb3ZlcmVkKVxuICAgICAgICA/IFtcbiAgICAgICAgICAgIG5ldyBBcmNCcnVzaGluZ0xheWVyKHtcbiAgICAgICAgICAgICAgaWQ6IGAke3RoaXMuaWR9LWhvdmVyZWRgLFxuICAgICAgICAgICAgICBkYXRhOiBbb2JqZWN0SG92ZXJlZC5vYmplY3RdLFxuICAgICAgICAgICAgICBzdHJva2VTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcbiAgICAgICAgICAgICAgZ2V0U291cmNlQ29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICAgICAgICBnZXRUYXJnZXRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldFdpZHRoOiBkYXRhLmdldFdpZHRoLFxuICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKVxuICAgIF07XG4gIH1cbn1cbiJdfQ==