kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
295 lines (252 loc) • 32.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.arctVisConfigs = exports.arcRequiredColumns = exports.arcPosResolver = exports.arcPosAccessor = void 0;
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 arctVisConfigs = exports.arctVisConfigs = {
opacity: 'opacity',
thickness: 'thickness',
colorRange: 'colorRange',
sizeRange: 'strokeWidthRange',
targetColor: 'targetColor',
'hi-precision': 'hi-precision'
};
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(arctVisConfigs);
_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,
getStrokeWidth: 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,
fp64: this.config.visConfig['hi-precision'],
opacity: this.config.visConfig.opacity,
pickedColor: this.config.highlightColor,
strokeScale: this.config.visConfig.thickness,
// parameters
parameters: {
depthTest: mapState.dragRotate
},
updateTriggers: {
getStrokeWidth: {
sizeField: this.config.sizeField,
sizeRange: this.config.visConfig.sizeRange
},
getSourceColor: colorUpdateTriggers,
getTargetColor: colorUpdateTriggers
}
}))];
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref4) {
var _ref4$fieldPairs = _ref4.fieldPairs,
fieldPairs = _ref4$fieldPairs === void 0 ? [] : _ref4$fieldPairs;
if (fieldPairs.length < 2) {
return [];
}
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;
}
}]);
return ArcLayer;
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93aWRnZXRzL2FyYy1sYXllci9hcmMtbGF5ZXIuanMiXSwibmFtZXMiOlsiYXJjUG9zQWNjZXNzb3IiLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiZCIsImRhdGEiLCJmaWVsZElkeCIsImFyY1Bvc1Jlc29sdmVyIiwiYXJjUmVxdWlyZWRDb2x1bW5zIiwiYXJjdFZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwidGhpY2tuZXNzIiwiY29sb3JSYW5nZSIsInNpemVSYW5nZSIsInRhcmdldENvbG9yIiwiQXJjTGF5ZXIiLCJwcm9wcyIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb24iLCJBcmNMYXllckljb24iLCJkZWZhdWx0TGlua0NvbHVtblBhaXJzIiwic2l6ZSIsInByb3BlcnR5IiwiXyIsImFsbERhdGEiLCJmaWx0ZXJlZEluZGV4Iiwib2xkTGF5ZXJEYXRhIiwib3B0IiwiY29uZmlnIiwiY29sb3JTY2FsZSIsImNvbG9yRG9tYWluIiwiY29sb3JGaWVsZCIsImNvbG9yIiwiY29sdW1ucyIsInNpemVGaWVsZCIsInNpemVTY2FsZSIsInNpemVEb21haW4iLCJ2aXNDb25maWciLCJjU2NhbGUiLCJnZXRWaXNDaGFubmVsU2NhbGUiLCJjb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsInNTY2FsZSIsInVwZGF0ZUxheWVyTWV0YSIsInNhbWVEYXRhIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwicG9zIiwiZXZlcnkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInB1c2giLCJzb3VyY2VQb3NpdGlvbiIsInRhcmdldFBvc2l0aW9uIiwiZ2V0U3Ryb2tlV2lkdGgiLCJnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIiwiZ2V0Q29sb3IiLCJnZXRUYXJnZXRDb2xvciIsImdldFNvdXJjZUNvbG9yIiwic0JvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInRCb3VuZHMiLCJib3VuZHMiLCJNYXRoIiwibWluIiwibWF4IiwidXBkYXRlTWV0YSIsImlkeCIsIm9iamVjdEhvdmVyZWQiLCJsYXllckludGVyYWN0aW9uIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoIiwiY29sb3JVcGRhdGVUcmlnZ2VycyIsImludGVyYWN0aW9uIiwicGlja2FibGUiLCJhdXRvSGlnaGxpZ2h0IiwiZW5hYmxlZCIsImhpZ2hsaWdodENvbG9yIiwiYnJ1c2hSYWRpdXMiLCJicnVzaFNvdXJjZSIsImJydXNoVGFyZ2V0IiwiZW5hYmxlQnJ1c2hpbmciLCJBcmNCcnVzaGluZ0xheWVyIiwiaWQiLCJmcDY0IiwicGlja2VkQ29sb3IiLCJzdHJva2VTY2FsZSIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJkcmFnUm90YXRlIiwidXBkYXRlVHJpZ2dlcnMiLCJmaWVsZFBhaXJzIiwibGVuZ3RoIiwiREVGQVVMVF9MQVlFUl9DT0xPUiIsInRyaXBBcmMiLCJwYWlyIiwibGF0IiwibG5nIiwibGFiZWwiLCJkZWZhdWx0TmFtZSIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGNBQWMsNEJBQUcsU0FBakJBLGNBQWlCO0FBQUEsTUFBRUMsSUFBRixRQUFFQSxJQUFGO0FBQUEsTUFBUUMsSUFBUixRQUFRQSxJQUFSO0FBQUEsTUFBY0MsSUFBZCxRQUFjQSxJQUFkO0FBQUEsTUFBb0JDLElBQXBCLFFBQW9CQSxJQUFwQjtBQUFBLFNBQThCLFVBQUFDLENBQUM7QUFBQSxXQUFJLENBQy9EQSxDQUFDLENBQUNDLElBQUYsQ0FBT0osSUFBSSxDQUFDSyxRQUFaLENBRCtELEVBRS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0wsSUFBSSxDQUFDTSxRQUFaLENBRitELEVBRy9ELENBSCtELEVBSS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0YsSUFBSSxDQUFDRyxRQUFaLENBSitELEVBSy9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0gs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LEdBSFg7QUFJZGhHLFFBQUFBLElBQUksRUFBRTJGLFVBQVUsQ0FBQyxDQUFELENBQVYsQ0FBY0ksSUFBZCxDQUFtQkU7QUFKWCxPQUFoQjtBQU1BcEYsTUFBQUEsS0FBSyxDQUFDcUYsS0FBTixhQUFpQlAsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjUSxXQUEvQixpQkFDRVIsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjUSxXQURoQjtBQUlBLGFBQU90RixLQUFQO0FBQ0Q7OztFQXpEbUN1RixxQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcblxuaW1wb3J0IExheWVyIGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IEFyY0JydXNoaW5nTGF5ZXIgZnJvbSAnZGVja2dsLWxheWVycy9hcmMtYnJ1c2hpbmctbGF5ZXIvYXJjLWJydXNoaW5nLWxheWVyJztcbmltcG9ydCB7aGV4VG9SZ2J9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCBBcmNMYXllckljb24gZnJvbSAnLi9hcmMtbGF5ZXItaWNvbic7XG5pbXBvcnQge0RFRkFVTFRfTEFZRVJfQ09MT1J9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuZXhwb3J0IGNvbnN0IGFyY1Bvc0FjY2Vzc29yID0gKHtsYXQwLCBsbmcwLCBsYXQxLCBsbmcxfSkgPT4gZCA9PiBbXG4gIGQuZGF0YVtsbmcwLmZpZWxkSWR4XSxcbiAgZC5kYXRhW2xhdDAuZmllbGRJZHhdLFxuICAwLFxuICBkLmRhdGFbbG5nMS5maWVsZElkeF0sXG4gIGQuZGF0YVtsYXQxLmZpZWxkSWR4XSxcbiAgMFxuXTtcblxuZXhwb3J0IGNvbnN0IGFyY1Bvc1Jlc29sdmVyID0gKHtsYXQwLCBsbmcwLCBsYXQxLCBsbmcxfSkgPT5cbiAgYCR7bGF0MC5maWVsZElkeH0tJHtsbmcwLmZpZWxkSWR4fS0ke2xhdDEuZmllbGRJZHh9LSR7bGF0MS5maWVsZElkeH19YDtcblxuZXhwb3J0IGNvbnN0IGFyY1JlcXVpcmVkQ29sdW1ucyA9IFsnbGF0MCcsICdsbmcwJywgJ2xhdDEnLCAnbG5nMSddO1xuXG5leHBvcnQgY29uc3QgYXJjdFZpc0NvbmZpZ3MgPSB7XG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgdGhpY2tuZXNzOiAndGhpY2tuZXNzJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzaXplUmFuZ2U6ICdzdHJva2VXaWR0aFJhbmdlJyxcbiAgdGFyZ2V0Q29sb3I6ICd0YXJnZXRDb2xvcicsXG4gICdoaS1wcmVjaXNpb24nOiAnaGktcHJlY2lzaW9uJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJjTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcoYXJjdFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24gPSBtZW1vaXplKGFyY1Bvc0FjY2Vzc29yLCBhcmNQb3NSZXNvbHZlcik7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2FyYyc7XG4gIH1cblxuICBnZXQgaXNBZ2dyZWdhdGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgcmV0dXJuIEFyY0xheWVySWNvbjtcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gYXJjUmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMaW5rQ29sdW1uUGFpcnM7XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZSdcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRQYWlycyA9IFtdfSkge1xuICAgIGlmIChmaWVsZFBhaXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICBjb2xvcjogaGV4VG9SZ2IoREVGQVVMVF9MQVlFUl9DT0xPUi50cmlwQXJjKVxuICAgIH07XG5cbiAgICAvLyBjb25uZWN0IHRoZSBmaXJzdCB0d28gcG9pbnQgbGF5ZXIgd2l0aCBhcmNcbiAgICBwcm9wcy5jb2x1bW5zID0ge1xuICAgICAgbGF0MDogZmllbGRQYWlyc1swXS5wYWlyLmxhdCxcbiAgICAgIGxuZzA6IGZpZWxkUGFpcnNbMF0ucGFpci5sbmcsXG4gICAgICBsYXQxOiBmaWVsZFBhaXJzWzFdLnBhaXIubGF0LFxuICAgICAgbG5nMTogZmllbGRQYWlyc1sxXS5wYWlyLmxuZ1xuICAgIH07XG4gICAgcHJvcHMubGFiZWwgPSBgJHtmaWVsZFBhaXJzWzBdLmRlZmF1bHROYW1lfSAtPiAke1xuICAgICAgZmllbGRQYWlyc1sxXS5kZWZhdWx0TmFtZVxuICAgIH0gYXJjYDtcblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIC8vIFRPRE86IGZpeCBjb21wbGV4aXR5XG4gIC8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbiAgZm9ybWF0TGF5ZXJEYXRhKF8sIGFsbERhdGEsIGZpbHRlcmVkSW5kZXgsIG9sZExheWVyRGF0YSwgb3B0ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xvclNjYWxlLFxuICAgICAgY29sb3JEb21haW4sXG4gICAgICBjb2xvckZpZWxkLFxuICAgICAgY29sb3IsXG4gICAgICBjb2x1bW5zLFxuICAgICAgc2l6ZUZpZWxkLFxuICAgICAgc2l6ZVNjYWxlLFxuICAgICAgc2l6ZURvbWFpbixcbiAgICAgIHZpc0NvbmZpZzoge3NpemVSYW5nZSwgY29sb3JSYW5nZSwgdGFyZ2V0Q29sb3J9XG4gICAgfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgLy8gYXJjIGNvbG9yXG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICBjb2xvclNjYWxlLFxuICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKVxuICAgICAgKTtcblxuICAgIC8vIGFyYyB0aGlja25lc3NcbiAgICBjb25zdCBzU2NhbGUgPVxuICAgICAgc2l6ZUZpZWxkICYmIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKHNpemVTY2FsZSwgc2l6ZURvbWFpbiwgc2l6ZVJhbmdlKTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihjb2x1bW5zKTtcblxuICAgIGlmICghb2xkTGF5ZXJEYXRhIHx8IG9sZExheWVyRGF0YS5nZXRQb3NpdGlvbiAhPT0gZ2V0UG9zaXRpb24pIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGFsbERhdGEsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YTtcbiAgICBpZiAoXG4gICAgICBvbGRMYXllckRhdGEgJiZcbiAgICAgIG9sZExheWVyRGF0YS5kYXRhICYmXG4gICAgICBvcHQuc2FtZURhdGEgJiZcbiAgICAgIG9sZExheWVyRGF0YS5nZXRQb3NpdGlvbiA9PT0gZ2V0UG9zaXRpb25cbiAgICApIHtcbiAgICAgIGRhdGEgPSBvbGRMYXllckRhdGEuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IGZpbHRlcmVkSW5kZXgucmVkdWNlKChhY2N1LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSBnZXRQb3NpdGlvbih7ZGF0YTogYWxsRGF0YVtpbmRleF19KTtcblxuICAgICAgICAvLyBpZiBkb2Vzbid0IGhhdmUgcG9pbnQgbGF0IG9yIGxuZywgZG8gbm90IGFkZCB0aGUgYXJjXG4gICAgICAgIC8vIGRlY2suZ2wgY2FuJ3QgaGFuZGxlIHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgaWYgKCFwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSkge1xuICAgICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdS5wdXNoKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBzb3VyY2VQb3NpdGlvbjogW3Bvc1swXSwgcG9zWzFdLCBwb3NbMl1dLFxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uOiBbcG9zWzNdLCBwb3NbNF0sIHBvc1s1XV0sXG4gICAgICAgICAgZGF0YTogYWxsRGF0YVtpbmRleF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3Ryb2tlV2lkdGggPSBzU2NhbGUgPyBkID0+XG4gICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHNTY2FsZSwgZC5kYXRhLCBzaXplRmllbGQsIDApIDogMTtcblxuICAgIGNvbnN0IGdldENvbG9yID0gY1NjYWxlID8gZCA9PlxuICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZCkgOiBjb2xvcjtcblxuICAgIGNvbnN0IGdldFRhcmdldENvbG9yID0gY1NjYWxlID8gZCA9PlxuICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZClcbiAgICAgICAgOiB0YXJnZXRDb2xvciB8fCBjb2xvcjtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRTb3VyY2VDb2xvcjogZ2V0Q29sb3IsXG4gICAgICBnZXRUYXJnZXRDb2xvcixcbiAgICAgIGdldFN0cm9rZVdpZHRoXG4gICAgfTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cblxuICB1cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBnZXQgYm91bmRzIGZyb20gYXJjc1xuICAgIGNvbnN0IHNCb3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhhbGxEYXRhLCBkID0+IHtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBkfSk7XG4gICAgICByZXR1cm4gW3Bvc1swXSwgcG9zWzFdXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRCb3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhhbGxEYXRhLCBkID0+IHtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBkfSk7XG4gICAgICByZXR1cm4gW3Bvc1szXSwgcG9zWzRdXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvdW5kcyA9XG4gICAgICB0Qm91bmRzICYmIHNCb3VuZHNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBNYXRoLm1pbihzQm91bmRzWzBdLCB0Qm91bmRzWzBdKSxcbiAgICAgICAgICAgIE1hdGgubWluKHNCb3VuZHNbMV0sIHRCb3VuZHNbMV0pLFxuICAgICAgICAgICAgTWF0aC5tYXgoc0JvdW5kc1syXSwgdEJvdW5kc1syXSksXG4gICAgICAgICAgICBNYXRoLm1heChzQm91bmRzWzNdLCB0Qm91bmRzWzNdKVxuICAgICAgICAgIF1cbiAgICAgICAgOiBzQm91bmRzIHx8IHRCb3VuZHM7XG5cbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgbGF5ZXJJbnRlcmFjdGlvbixcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgY29uc3QgY29sb3JVcGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGNvbG9yOiB0aGlzLmNvbmZpZy5jb2xvcixcbiAgICAgIGNvbG9yRmllbGQ6IHRoaXMuY29uZmlnLmNvbG9yRmllbGQsXG4gICAgICBjb2xvclJhbmdlOiB0aGlzLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yU2NhbGU6IHRoaXMuY29uZmlnLmNvbG9yU2NhbGUsXG4gICAgICB0YXJnZXRDb2xvcjogdGhpcy5jb25maWcudmlzQ29uZmlnLnRhcmdldENvbG9yXG4gICAgfTtcblxuICAgIGNvbnN0IGludGVyYWN0aW9uID0ge1xuICAgICAgLy8gYXV0byBoaWdobGlnaHRpbmdcbiAgICAgIHBpY2thYmxlOiB0cnVlLFxuICAgICAgYXV0b0hpZ2hsaWdodDogIWJydXNoLmVuYWJsZWQsXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG5cbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBicnVzaFJhZGl1czogYnJ1c2guY29uZmlnLnNpemUgKiAxMDAwLFxuICAgICAgYnJ1c2hTb3VyY2U6IHRydWUsXG4gICAgICBicnVzaFRhcmdldDogdHJ1ZSxcbiAgICAgIGVuYWJsZUJydXNoaW5nOiBicnVzaC5lbmFibGVkXG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgQXJjQnJ1c2hpbmdMYXllcih7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLmludGVyYWN0aW9uLFxuICAgICAgICAuLi5sYXllckludGVyYWN0aW9uLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgaWR4LFxuICAgICAgICBmcDY0OiB0aGlzLmNvbmZpZy52aXNDb25maWdbJ2hpLXByZWNpc2lvbiddLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLmNvbmZpZy52aXNDb25maWcub3BhY2l0eSxcbiAgICAgICAgcGlja2VkQ29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICBzdHJva2VTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcblxuICAgICAgICAvLyBwYXJhbWV0ZXJzXG4gICAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IG1hcFN0YXRlLmRyYWdSb3RhdGV9LFxuXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0U3Ryb2tlV2lkdGg6IHtcbiAgICAgICAgICAgIHNpemVGaWVsZDogdGhpcy5jb25maWcuc2l6ZUZpZWxkLFxuICAgICAgICAgICAgc2l6ZVJhbmdlOiB0aGlzLmNvbmZpZy52aXNDb25maWcuc2l6ZVJhbmdlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRTb3VyY2VDb2xvcjogY29sb3JVcGRhdGVUcmlnZ2VycyxcbiAgICAgICAgICBnZXRUYXJnZXRDb2xvcjogY29sb3JVcGRhdGVUcmlnZ2Vyc1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIF07XG4gIH1cbn1cbiJdfQ==