kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
369 lines (315 loc) • 38.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hexIdResolver = exports.hexIdRequiredColumns = exports.hexIdAccessor = exports["default"] = exports.HexagonIdVisConfigs = exports.HEXAGON_ID_FIELDS = 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 _deck = require("deck.gl");
var _enhancedColumnLayer = _interopRequireDefault(require("../../deckgl-layers/column-layer/enhanced-column-layer"));
var _h3Utils = require("./h3-utils");
var _h3HexagonLayerIcon = _interopRequireDefault(require("./h3-hexagon-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 HEXAGON_ID_FIELDS = exports.HEXAGON_ID_FIELDS = {
hex_id: ['hex_id', 'hexagon_id', 'h3_id']
};
var hexIdRequiredColumns = exports.hexIdRequiredColumns = ['hex_id'];
var hexIdAccessor = exports.hexIdAccessor = function hexIdAccessor(_ref) {
var hex_id = _ref.hex_id;
return function (d) {
return d[hex_id.fieldIdx];
};
};
var hexIdResolver = exports.hexIdResolver = function hexIdResolver(_ref2) {
var hex_id = _ref2.hex_id;
return hex_id.fieldIdx;
};
var HexagonIdVisConfigs = exports.HexagonIdVisConfigs = {
opacity: 'opacity',
colorRange: 'colorRange',
coverage: 'coverage',
sizeRange: 'elevationRange',
coverageRange: 'coverageRange',
elevationScale: 'elevationScale'
};
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
var r = parseInt(result[1], 16);
var g = parseInt(result[2], 16);
var b = parseInt(result[3], 16);
return [r, g, b];
}
var HexagonIdLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
(0, _inherits2["default"])(HexagonIdLayer, _Layer);
var _super = _createSuper(HexagonIdLayer);
function HexagonIdLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, HexagonIdLayer);
_this = _super.call(this, props);
_this.registerVisConfig(HexagonIdVisConfigs);
_this.getHexId = (0, _lodash["default"])(hexIdAccessor, hexIdResolver);
return _this;
}
(0, _createClass2["default"])(HexagonIdLayer, [{
key: "type",
get: function get() {
return 'hexagonId';
}
}, {
key: "name",
get: function get() {
return 'H3';
}
}, {
key: "requiredLayerColumns",
get: function get() {
return hexIdRequiredColumns;
}
}, {
key: "layerIcon",
get: function get() {
// use hexagon layer icon for now
return _h3HexagonLayerIcon["default"];
}
}, {
key: "visualChannels",
get: function get() {
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this)), {}, {
size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this).size), {}, {
property: 'height'
}),
coverage: {
property: 'coverage',
field: 'coverageField',
scale: 'coverageScale',
domain: 'coverageDomain',
range: 'coverageRange',
key: 'coverage',
channelScaleType: _defaultSettings.CHANNEL_SCALES.radius
}
});
}
}, {
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, {
// add height visual channel
coverageField: null,
coverageDomain: [0, 1],
coverageScale: 'linear'
});
} // TODO: fix complexity
/* eslint-disable complexity */
}, {
key: "formatLayerData",
value: 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,
coverageField = _this$config.coverageField,
coverageScale = _this$config.coverageScale,
coverageDomain = _this$config.coverageDomain,
_this$config$visConfi = _this$config.visConfig,
sizeRange = _this$config$visConfi.sizeRange,
colorRange = _this$config$visConfi.colorRange,
coverageRange = _this$config$visConfi.coverageRange; // color
var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(function (c) {
return hexToRgb(c);
})); // height
var sScale = sizeField && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange, 0); // coverage
var coScale = coverageField && this.getVisChannelScale(coverageScale, coverageDomain, coverageRange, 0);
var getHexId = this.getHexId(columns);
if (!oldLayerData || oldLayerData.getHexId !== getHexId) {
this.updateLayerMeta(allData, getHexId);
}
var data;
if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getHexId === getHexId) {
data = oldLayerData.data;
} else {
data = filteredIndex.reduce(function (accu, index, i) {
var id = getHexId(allData[index]);
var centroid = _this2.dataToFeature.centroids[index];
if (centroid) {
accu.push({
// keep a reference to the original data index
index: i,
data: allData[index],
id: id,
centroid: centroid
});
}
return accu;
}, []);
}
var getElevation = sScale ? function (d) {
return _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0);
} : 0;
var getColor = cScale ? function (d) {
return _this2.getEncodedChannelValue(cScale, d.data, colorField);
} : color;
var getCoverage = coScale ? function (d) {
return _this2.getEncodedChannelValue(coScale, d.data, coverageField, 0);
} : 1; // const layerData = {
return {
data: data,
getElevation: getElevation,
getColor: getColor,
getHexId: getHexId,
getCoverage: getCoverage,
hexagonVertices: this.dataToFeature.hexagonVertices,
hexagonCenter: this.dataToFeature.hexagonCenter
};
}
/* eslint-enable complexity */
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(allData, getHexId) {
var hexagonVertices;
var hexagonCenter;
var centroids = {};
allData.forEach(function (d, index) {
var id = getHexId(d);
if (!(0, _h3Utils.h3IsValid)(id)) {
return;
} // find hexagonVertices
// only need 1 instance of hexagonVertices
if (!hexagonVertices) {
hexagonVertices = (0, _h3Utils.getVertices)({
id: id
});
hexagonCenter = (0, _h3Utils.getCentroid)({
id: id
});
} // save a reference of centroids to dataToFeature
// so we don't have to re calculate it again
centroids[index] = (0, _h3Utils.getCentroid)({
id: id
});
});
var bounds = this.getPointsBounds(Object.values(centroids), function (d) {
return d;
});
this.dataToFeature = {
hexagonVertices: hexagonVertices,
hexagonCenter: hexagonCenter,
centroids: centroids
};
this.updateMeta({
bounds: bounds
});
}
}, {
key: "renderLayer",
value: function renderLayer(_ref3) {
var data = _ref3.data,
idx = _ref3.idx,
layerInteraction = _ref3.layerInteraction,
objectHovered = _ref3.objectHovered,
mapState = _ref3.mapState,
interactionConfig = _ref3.interactionConfig;
var zoomFactor = this.getZoomFactor(mapState);
var eleZoomFactor = this.getElevationZoomFactor(mapState);
var config = this.config;
var visConfig = config.visConfig;
var h3HexagonLayerTriggers = {
getColor: {
color: config.color,
colorField: config.colorField,
colorRange: config.visConfig.colorRange,
colorScale: config.colorScale
},
getElevation: {
sizeField: config.sizeField,
sizeRange: config.visConfig.sizeRange
}
};
var columnLayerTriggers = {
getCoverage: {
coverageField: config.coverageField,
coverageRange: config.visConfig.coverageRange
}
};
return [new _deck.H3HexagonLayer(_objectSpread(_objectSpread(_objectSpread({}, layerInteraction), data), {}, {
id: this.id,
idx: idx,
pickable: true,
getHexagon: function getHexagon(x) {
return x.id;
},
// coverage
coverage: config.coverageField ? 1 : visConfig.coverage,
// parameters
parameters: {
depthTest: Boolean(config.sizeField || mapState.dragRotate)
},
// highlight
autoHighlight: Boolean(config.sizeField),
highlightColor: _defaultSettings.HIGHLIGH_COLOR_3D,
// elevation
extruded: Boolean(config.sizeField),
elevationScale: visConfig.elevationScale * eleZoomFactor,
// color
opacity: visConfig.opacity,
// render
updateTriggers: h3HexagonLayerTriggers,
_subLayerProps: {
'hexagon-cell': {
type: _enhancedColumnLayer["default"],
getCoverage: data.getCoverage,
updateTriggers: columnLayerTriggers
}
}
}))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !config.sizeField ? [new _deck.GeoJsonLayer({
id: "".concat(this.id, "-hovered"),
data: [(0, _h3Utils.idToPolygonGeo)(objectHovered)],
getLineColor: config.highlightColor,
lineWidthScale: 8 * zoomFactor
})] : []));
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref4) {
var _ref4$fields = _ref4.fields,
fields = _ref4$fields === void 0 ? [] : _ref4$fields;
var foundColumns = this.findDefaultColumnField(HEXAGON_ID_FIELDS, fields);
if (!foundColumns || !foundColumns.length) {
return {
props: []
};
}
return {
props: foundColumns.map(function (columns) {
return {
isVisible: true,
label: 'H3 Hexagon',
columns: columns
};
})
};
}
}]);
return HexagonIdLayer;
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvaDMtaGV4YWdvbi1sYXllci9oMy1oZXhhZ29uLWxheWVyLmpzIl0sIm5hbWVzIjpbIkhFWEFHT05fSURfRklFTERTIiwiaGV4X2lkIiwiaGV4SWRSZXF1aXJlZENvbHVtbnMiLCJoZXhJZEFjY2Vzc29yIiwiZCIsImZpZWxkSWR4IiwiaGV4SWRSZXNvbHZlciIsIkhleGFnb25JZFZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwiY29sb3JSYW5nZSIsImNvdmVyYWdlIiwic2l6ZVJhbmdlIiwiY292ZXJhZ2VSYW5nZSIsImVsZXZhdGlvblNjYWxlIiwiaGV4VG9SZ2IiLCJoZXgiLCJyZXN1bHQiLCJleGVjIiwiciIsInBhcnNlSW50IiwiZyIsImIiLCJIZXhhZ29uSWRMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRIZXhJZCIsIkgzSGV4YWdvbkxheWVySWNvbiIsInNpemUiLCJwcm9wZXJ0eSIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInJhZGl1cyIsImNvdmVyYWdlRmllbGQiLCJjb3ZlcmFnZURvbWFpbiIsImNvdmVyYWdlU2NhbGUiLCJfIiwiYWxsRGF0YSIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb25maWciLCJjb2xvclNjYWxlIiwiY29sb3JEb21haW4iLCJjb2xvckZpZWxkIiwiY29sb3IiLCJjb2x1bW5zIiwic2l6ZUZpZWxkIiwic2l6ZVNjYWxlIiwic2l6ZURvbWFpbiIsInZpc0NvbmZpZyIsImNTY2FsZSIsImdldFZpc0NoYW5uZWxTY2FsZSIsImNvbG9ycyIsIm1hcCIsImMiLCJzU2NhbGUiLCJjb1NjYWxlIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YSIsInNhbWVEYXRhIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwiaSIsImlkIiwiY2VudHJvaWQiLCJkYXRhVG9GZWF0dXJlIiwiY2VudHJvaWRzIiwicHVzaCIsImdldEVsZXZhdGlvbiIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJnZXRDb2xvciIsImdldENvdmVyYWdlIiwiaGV4YWdvblZlcnRpY2VzIiwiaGV4YWdvbkNlbnRlciIsImZvckVhY2giLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJ1cGRhdGVNZXRhIiwiaWR4IiwibGF5ZXJJbnRlcmFjdGlvbiIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJlbGVab29tRmFjdG9yIiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsImgzSGV4YWdvbkxheWVyVHJpZ2dlcnMiLCJjb2x1bW5MYXllclRyaWdnZXJzIiwiSDNIZXhhZ29uTGF5ZXIiLCJwaWNrYWJsZSIsImdldEhleGFnb24iLCJ4IiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsIkJvb2xlYW4iLCJkcmFnUm90YXRlIiwiYXV0b0hpZ2hsaWdodCIsImhpZ2hsaWdodENvbG9yIiwiSElHSExJR0hfQ09MT1JfM0QiLCJleHRydWRlZCIsInVwZGF0ZVRyaWdnZXJzIiwiX3N1YkxheWVyUHJvcHMiLCJ0eXBlIiwiRW5oYW5jZWRDb2x1bW5MYXllciIsImlzTGF5ZXJIb3ZlcmVkIiwiR2VvSnNvbkxheWVyIiwiZ2V0TGluZUNvbG9yIiwibGluZVdpZHRoU2NhbGUiLCJmaWVsZHMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwibGVuZ3RoIiwiaXNWaXNpYmxlIiwibGFiZWwiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGlCQUFpQiwrQkFBRztBQUMvQkMsRUFBQUEsTUFBTSxFQUFFLENBQUMsUUFBRCxF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QUwsRUFBSztBQUMxQyxVQUFNQyxZQUFZLEdBQUcsS0FBS0Msc0JBQUwsQ0FBNEJ2SCxpQkFBNUIsRUFBK0NxSCxNQUEvQyxDQUFyQjs7QUFDQSxVQUFJLENBQUNDLFlBQUQsSUFBaUIsQ0FBQ0EsWUFBWSxDQUFDRSxNQUFuQyxFQUEyQztBQUN6QyxlQUFPO0FBQUNqRyxVQUFBQSxLQUFLLEVBQUU7QUFBUixTQUFQO0FBQ0Q7O0FBRUQsYUFBTztBQUNMQSxRQUFBQSxLQUFLLEVBQUUrRixZQUFZLENBQUM1RCxHQUFiLENBQWlCLFVBQUFSLE9BQU87QUFBQSxpQkFBSztBQUNsQ3VFLFlBQUFBLFNBQVMsRUFBRSxJQUR1QjtBQUVsQ0MsWUFBQUEsS0FBSyxFQUFFLFlBRjJCO0FBR2xDeEUsWUFBQUEsT0FBTyxFQUFQQTtBQUhrQyxXQUFMO0FBQUEsU0FBeEI7QUFERixPQUFQO0FBT0Q7OztFQXhEeUN5RSxxQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcblxuaW1wb3J0IExheWVyIGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHtHZW9Kc29uTGF5ZXIsIEgzSGV4YWdvbkxheWVyfSBmcm9tICdkZWNrLmdsJztcbmltcG9ydCBFbmhhbmNlZENvbHVtbkxheWVyIGZyb20gJ2RlY2tnbC1sYXllcnMvY29sdW1uLWxheWVyL2VuaGFuY2VkLWNvbHVtbi1sYXllcic7XG5pbXBvcnQge2dldFZlcnRpY2VzLCBnZXRDZW50cm9pZCwgaWRUb1BvbHlnb25HZW8sIGgzSXNWYWxpZH0gZnJvbSAnLi9oMy11dGlscyc7XG5pbXBvcnQgSDNIZXhhZ29uTGF5ZXJJY29uIGZyb20gJy4vaDMtaGV4YWdvbi1sYXllci1pY29uJztcbmltcG9ydCB7Q0hBTk5FTF9TQ0FMRVMsIEhJR0hMSUdIX0NPTE9SXzNEfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmV4cG9ydCBjb25zdCBIRVhBR09OX0lEX0ZJRUxEUyA9IHtcbiAgaGV4X2lkOiBbJ2hleF9pZCcsICdoZXhhZ29uX2lkJywgJ2gzX2lkJ11cbn07XG5cbmV4cG9ydCBjb25zdCBoZXhJZFJlcXVpcmVkQ29sdW1ucyA9IFsnaGV4X2lkJ107XG5leHBvcnQgY29uc3QgaGV4SWRBY2Nlc3NvciA9ICh7aGV4X2lkfSkgPT4gZCA9PiBkW2hleF9pZC5maWVsZElkeF07XG5leHBvcnQgY29uc3QgaGV4SWRSZXNvbHZlciA9ICh7aGV4X2lkfSkgPT4gaGV4X2lkLmZpZWxkSWR4O1xuXG5leHBvcnQgY29uc3QgSGV4YWdvbklkVmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIGNvdmVyYWdlOiAnY292ZXJhZ2UnLFxuICBzaXplUmFuZ2U6ICdlbGV2YXRpb25SYW5nZScsXG4gIGNvdmVyYWdlUmFuZ2U6ICdjb3ZlcmFnZVJhbmdlJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZSdcbn07XG5cbmZ1bmN0aW9uIGhleFRvUmdiKGhleCkge1xuICBjb25zdCByZXN1bHQgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWMoaGV4KTtcblxuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpO1xuXG4gIHJldHVybiBbciwgZywgYl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhleGFnb25JZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKEhleGFnb25JZFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0SGV4SWQgPSBtZW1vaXplKGhleElkQWNjZXNzb3IsIGhleElkUmVzb2x2ZXIpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdoZXhhZ29uSWQnO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuICdIMyc7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIGhleElkUmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICAvLyB1c2UgaGV4YWdvbiBsYXllciBpY29uIGZvciBub3dcbiAgICByZXR1cm4gSDNIZXhhZ29uTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscyxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSxcbiAgICAgICAgcHJvcGVydHk6ICdoZWlnaHQnXG4gICAgICB9LFxuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb3ZlcmFnZScsXG4gICAgICAgIGZpZWxkOiAnY292ZXJhZ2VGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY292ZXJhZ2VTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvdmVyYWdlRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb3ZlcmFnZVJhbmdlJyxcbiAgICAgICAga2V5OiAnY292ZXJhZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5yYWRpdXNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRzID0gW119KSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5zID0gdGhpcy5maW5kRGVmYXVsdENvbHVtbkZpZWxkKEhFWEFHT05fSURfRklFTERTLCBmaWVsZHMpO1xuICAgIGlmICghZm91bmRDb2x1bW5zIHx8ICFmb3VuZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge3Byb3BzOiBbXX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiBmb3VuZENvbHVtbnMubWFwKGNvbHVtbnMgPT4gKHtcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBsYWJlbDogJ0gzIEhleGFnb24nLFxuICAgICAgICBjb2x1bW5zXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzKSxcblxuICAgICAgLy8gYWRkIGhlaWdodCB2aXN1YWwgY2hhbm5lbFxuICAgICAgY292ZXJhZ2VGaWVsZDogbnVsbCxcbiAgICAgIGNvdmVyYWdlRG9tYWluOiBbMCwgMV0sXG4gICAgICBjb3ZlcmFnZVNjYWxlOiAnbGluZWFyJ1xuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBmaXggY29tcGxleGl0eVxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4gIGZvcm1hdExheWVyRGF0YShfLCBhbGxEYXRhLCBmaWx0ZXJlZEluZGV4LCBvbGRMYXllckRhdGEsIG9wdCA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3JTY2FsZSxcbiAgICAgIGNvbG9yRG9tYWluLFxuICAgICAgY29sb3JGaWVsZCxcbiAgICAgIGNvbG9yLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHNpemVGaWVsZCxcbiAgICAgIHNpemVTY2FsZSxcbiAgICAgIHNpemVEb21haW4sXG4gICAgICBjb3ZlcmFnZUZpZWxkLFxuICAgICAgY292ZXJhZ2VTY2FsZSxcbiAgICAgIGNvdmVyYWdlRG9tYWluLFxuICAgICAgdmlzQ29uZmlnOiB7c2l6ZVJhbmdlLCBjb2xvclJhbmdlLCBjb3ZlcmFnZVJhbmdlfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIC8vIGNvbG9yXG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICBjb2xvclNjYWxlLFxuICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgY29sb3JSYW5nZS5jb2xvcnMubWFwKGMgPT4gaGV4VG9SZ2IoYykpXG4gICAgICApO1xuXG4gICAgLy8gaGVpZ2h0XG4gICAgY29uc3Qgc1NjYWxlID1cbiAgICAgIHNpemVGaWVsZCAmJiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShzaXplU2NhbGUsIHNpemVEb21haW4sIHNpemVSYW5nZSwgMCk7XG5cbiAgICAvLyBjb3ZlcmFnZVxuICAgIGNvbnN0IGNvU2NhbGUgPVxuICAgICAgY292ZXJhZ2VGaWVsZCAmJlxuICAgICAgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoY292ZXJhZ2VTY2FsZSwgY292ZXJhZ2VEb21haW4sIGNvdmVyYWdlUmFuZ2UsIDApO1xuXG4gICAgY29uc3QgZ2V0SGV4SWQgPSB0aGlzLmdldEhleElkKGNvbHVtbnMpO1xuXG4gICAgaWYgKCFvbGRMYXllckRhdGEgfHwgb2xkTGF5ZXJEYXRhLmdldEhleElkICE9PSBnZXRIZXhJZCkge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0SGV4SWQpO1xuICAgIH1cblxuICAgIGxldCBkYXRhO1xuICAgIGlmIChcbiAgICAgIG9sZExheWVyRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmRhdGEgJiZcbiAgICAgIG9wdC5zYW1lRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmdldEhleElkID09PSBnZXRIZXhJZFxuICAgICkge1xuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gZmlsdGVyZWRJbmRleC5yZWR1Y2UoKGFjY3UsIGluZGV4LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0SGV4SWQoYWxsRGF0YVtpbmRleF0pO1xuICAgICAgICBjb25zdCBjZW50cm9pZCA9IHRoaXMuZGF0YVRvRmVhdHVyZS5jZW50cm9pZHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChjZW50cm9pZCkge1xuICAgICAgICAgIGFjY3UucHVzaCh7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBkYXRhIGluZGV4XG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGRhdGE6IGFsbERhdGFbaW5kZXhdLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjZW50cm9pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0RWxldmF0aW9uID0gc1NjYWxlXG4gICAgICA/IGQgPT4gdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHNTY2FsZSwgZC5kYXRhLCBzaXplRmllbGQsIDApXG4gICAgICA6IDA7XG5cbiAgICBjb25zdCBnZXRDb2xvciA9IGNTY2FsZVxuICAgICAgPyBkID0+IHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZClcbiAgICAgIDogY29sb3I7XG5cbiAgICBjb25zdCBnZXRDb3ZlcmFnZSA9IGNvU2NhbGVcbiAgICAgID8gZCA9PiB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY29TY2FsZSwgZC5kYXRhLCBjb3ZlcmFnZUZpZWxkLCAwKVxuICAgICAgOiAxO1xuXG4gICAgLy8gY29uc3QgbGF5ZXJEYXRhID0ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0RWxldmF0aW9uLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRIZXhJZCxcbiAgICAgIGdldENvdmVyYWdlLFxuICAgICAgaGV4YWdvblZlcnRpY2VzOiB0aGlzLmRhdGFUb0ZlYXR1cmUuaGV4YWdvblZlcnRpY2VzLFxuICAgICAgaGV4YWdvbkNlbnRlcjogdGhpcy5kYXRhVG9GZWF0dXJlLmhleGFnb25DZW50ZXJcbiAgICB9O1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4gIHVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRIZXhJZCkge1xuICAgIGxldCBoZXhhZ29uVmVydGljZXM7XG4gICAgbGV0IGhleGFnb25DZW50ZXI7XG4gICAgY29uc3QgY2VudHJvaWRzID0ge307XG5cbiAgICBhbGxEYXRhLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGdldEhleElkKGQpO1xuICAgICAgaWYgKCFoM0lzVmFsaWQoaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgaGV4YWdvblZlcnRpY2VzXG4gICAgICAvLyBvbmx5IG5lZWQgMSBpbnN0YW5jZSBvZiBoZXhhZ29uVmVydGljZXNcbiAgICAgIGlmICghaGV4YWdvblZlcnRpY2VzKSB7XG4gICAgICAgIGhleGFnb25WZXJ0aWNlcyA9IGdldFZlcnRpY2VzKHtpZH0pO1xuICAgICAgICBoZXhhZ29uQ2VudGVyID0gZ2V0Q2VudHJvaWQoe2lkfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNhdmUgYSByZWZlcmVuY2Ugb2YgY2VudHJvaWRzIHRvIGRhdGFUb0ZlYXR1cmVcbiAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gcmUgY2FsY3VsYXRlIGl0IGFnYWluXG4gICAgICBjZW50cm9pZHNbaW5kZXhdID0gZ2V0Q2VudHJvaWQoe2lkfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhPYmplY3QudmFsdWVzKGNlbnRyb2lkcyksIGQgPT4gZCk7XG4gICAgdGhpcy5kYXRhVG9GZWF0dXJlID0ge2hleGFnb25WZXJ0aWNlcywgaGV4YWdvbkNlbnRlciwgY2VudHJvaWRzfTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIGxheWVySW50ZXJhY3Rpb24sXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9KSB7XG4gICAgY29uc3Qgem9vbUZhY3RvciA9IHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3QgZWxlWm9vbUZhY3RvciA9IHRoaXMuZ2V0RWxldmF0aW9uWm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzO1xuICAgIGNvbnN0IHt2aXNDb25maWd9ID0gY29uZmlnO1xuXG4gICAgY29uc3QgaDNIZXhhZ29uTGF5ZXJUcmlnZ2VycyA9IHtcbiAgICAgIGdldENvbG9yOiB7XG4gICAgICAgIGNvbG9yOiBjb25maWcuY29sb3IsXG4gICAgICAgIGNvbG9yRmllbGQ6IGNvbmZpZy5jb2xvckZpZWxkLFxuICAgICAgICBjb2xvclJhbmdlOiBjb25maWcudmlzQ29uZmlnLmNvbG9yUmFuZ2UsXG4gICAgICAgIGNvbG9yU2NhbGU6IGNvbmZpZy5jb2xvclNjYWxlXG4gICAgICB9LFxuICAgICAgZ2V0RWxldmF0aW9uOiB7XG4gICAgICAgIHNpemVGaWVsZDogY29uZmlnLnNpemVGaWVsZCxcbiAgICAgICAgc2l6ZVJhbmdlOiBjb25maWcudmlzQ29uZmlnLnNpemVSYW5nZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb2x1bW5MYXllclRyaWdnZXJzID0ge1xuICAgICAgZ2V0Q292ZXJhZ2U6IHtcbiAgICAgICAgY292ZXJhZ2VGaWVsZDogY29uZmlnLmNvdmVyYWdlRmllbGQsXG4gICAgICAgIGNvdmVyYWdlUmFuZ2U6IGNvbmZpZy52aXNDb25maWcuY292ZXJhZ2VSYW5nZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IEgzSGV4YWdvbkxheWVyKHtcbiAgICAgICAgLi4ubGF5ZXJJbnRlcmFjdGlvbixcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGlkeCxcbiAgICAgICAgcGlja2FibGU6IHRydWUsXG4gICAgICAgIGdldEhleGFnb246IHggPT4geC5pZCxcblxuICAgICAgICAvLyBjb3ZlcmFnZVxuICAgICAgICBjb3ZlcmFnZTogY29uZmlnLmNvdmVyYWdlRmllbGQgPyAxIDogdmlzQ29uZmlnLmNvdmVyYWdlLFxuXG4gICAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkIHx8IG1hcFN0YXRlLmRyYWdSb3RhdGUpfSxcblxuICAgICAgICAvLyBoaWdobGlnaHRcbiAgICAgICAgYXV0b0hpZ2hsaWdodDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkKSxcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IEhJR0hMSUdIX0NPTE9SXzNELFxuXG4gICAgICAgIC8vIGVsZXZhdGlvblxuICAgICAgICBleHRydWRlZDogQm9vbGVhbihjb25maWcuc2l6ZUZpZWxkKSxcbiAgICAgICAgZWxldmF0aW9uU2NhbGU6IHZpc0NvbmZpZy5lbGV2YXRpb25TY2FsZSAqIGVsZVpvb21GYWN0b3IsXG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgb3BhY2l0eTogdmlzQ29uZmlnLm9wYWNpdHksXG5cbiAgICAgICAgLy8gcmVuZGVyXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiBoM0hleGFnb25MYXllclRyaWdnZXJzLFxuICAgICAgICBfc3ViTGF5ZXJQcm9wczoge1xuICAgICAgICAgICdoZXhhZ29uLWNlbGwnOiB7XG4gICAgICAgICAgICB0eXBlOiBFbmhhbmNlZENvbHVtbkxheWVyLFxuICAgICAgICAgICAgZ2V0Q292ZXJhZ2U6IGRhdGEuZ2V0Q292ZXJhZ2UsXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2VyczogY29sdW1uTGF5ZXJUcmlnZ2Vyc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAuLi4odGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RIb3ZlcmVkKSAmJiAhY29uZmlnLnNpemVGaWVsZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIG5ldyBHZW9Kc29uTGF5ZXIoe1xuICAgICAgICAgICAgICBpZDogYCR7dGhpcy5pZH0taG92ZXJlZGAsXG4gICAgICAgICAgICAgIGRhdGE6IFtpZFRvUG9seWdvbkdlbyhvYmplY3RIb3ZlcmVkKV0sXG4gICAgICAgICAgICAgIGdldExpbmVDb2xvcjogY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICAgICAgICBsaW5lV2lkdGhTY2FsZTogOCAqIHpvb21GYWN0b3JcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKVxuICAgIF07XG4gIH1cbn1cbiJdfQ==