UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

383 lines (323 loc) 39.3 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.MapPopover = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents2 = require("../common/styled-components"); var _icons = require("../common/icons"); var _defaultSettings = require("../../constants/default-settings"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 12px;\n letter-spacing: 0.43px;\n text-transform: capitalize;\n padding-left: 14px;\n margin-top: 12px;\n\n svg {\n margin-right: 4px;\n }\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n left: 50%;\n transform: rotate(30deg);\n top: 10px;\n color: ", ";\n\n :hover {\n cursor: pointer;\n color: ", ";\n }\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n ", "\n font-size: 11px;\n font-weight: 500;\n background-color: ", ";\n color: ", ";\n z-index: 1001;\n position: absolute;\n overflow-x: auto;\n\n .gutter {\n height: 6px;\n }\n\n table {\n margin: 2px 12px 12px 12px;\n width: auto;\n\n tbody {\n border-top: transparent;\n border-bottom: transparent;\n }\n\n td {\n border-color: transparent;\n padding: 4px;\n color: ", ";\n }\n\n td.row__value {\n text-align: right;\n font-weight: 500;\n color: ", ";\n }\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var MAX_WIDTH = 400; var MAX_HEIGHT = 600; var StyledMapPopover = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.scrollBar; }, function (props) { return props.theme.panelBackground; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.textColorHl; }); var StyledPin = _styledComponents["default"].div(_templateObject2(), function (props) { return props.theme.primaryBtnBgd; }, function (props) { return props.theme.linkBtnColor; }); var StyledLayerName = _styledComponents2.CenterFlexbox.extend(_templateObject3(), function (props) { return props.theme.textColorHl; }); var MapPopover = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(MapPopover, _Component); function MapPopover(props) { var _this; (0, _classCallCheck2["default"])(this, MapPopover); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(MapPopover).call(this, props)); _this.state = { isMouseOver: false, width: 380, height: 160 }; return _this; } (0, _createClass2["default"])(MapPopover, [{ key: "componentDidMount", value: function componentDidMount() { this._setContainerSize(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this._setContainerSize(); } }, { key: "_setContainerSize", value: function _setContainerSize() { var node = this.popover; if (!node) { return; } var width = Math.min(node.scrollWidth, MAX_WIDTH); var height = Math.min(node.scrollHeight, MAX_HEIGHT); if (width !== this.state.width || height !== this.state.height) { this.setState({ width: width, height: height }); } } }, { key: "_getPosition", value: function _getPosition(x, y) { var topOffset = 30; var leftOffset = 30; var mapState = this.props.mapState; var _this$state = this.state, width = _this$state.width, height = _this$state.height; var pos = {}; if (x + leftOffset + width > mapState.width) { pos.right = mapState.width - x + leftOffset; } else { pos.left = x + leftOffset; } if (y + topOffset + height > mapState.height) { pos.bottom = 10; } else { pos.top = y + topOffset; } return pos; } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, x = _this$props.x, y = _this$props.y, isVisible = _this$props.isVisible, data = _this$props.data, layer = _this$props.layer, freezed = _this$props.freezed, fields = _this$props.fields, _this$props$fieldsToS = _this$props.fieldsToShow, fieldsToShow = _this$props$fieldsToS === void 0 ? [] : _this$props$fieldsToS; var hidden = !isVisible && !this.state.isMouseOver; var width = this.state.width; if (!data || !layer || !fieldsToShow.length) { return null; } var infoProps = { data: data, layer: layer, fieldsToShow: fieldsToShow, fields: fields }; var style = Number.isFinite(x) && Number.isFinite(y) ? this._getPosition(x, y) : {}; return _react["default"].createElement(StyledMapPopover, { innerRef: function innerRef(comp) { _this2.popover = comp; }, className: (0, _classnames["default"])('map-popover', { hidden: hidden }), style: _objectSpread({}, style, { maxWidth: width }), onMouseEnter: function onMouseEnter() { _this2.setState({ isMouseOver: true }); }, onMouseLeave: function onMouseLeave() { _this2.setState({ isMouseOver: false }); } }, freezed ? _react["default"].createElement("div", { className: "map-popover__top" }, _react["default"].createElement("div", { className: "gutter" }), _react["default"].createElement(StyledPin, { className: "popover-pin", onClick: this.props.onClose }, _react["default"].createElement(_icons.Pin, { height: "16px" }))) : null, _react["default"].createElement(StyledLayerName, { className: "map-popover__layer-name" }, _react["default"].createElement(_icons.Layers, { height: "12px" }), layer.config.label), _react["default"].createElement("table", { className: "map-popover__table" }, layer.isAggregated ? layer.type === 'boundary' || layer.type === 'pincode' ? _react["default"].createElement(CellInfoBoundary, infoProps) : _react["default"].createElement(CellInfo, infoProps) : _react["default"].createElement(EntryInfo, infoProps))); } }]); return MapPopover; }(_react.Component); exports.MapPopover = MapPopover; (0, _defineProperty2["default"])(MapPopover, "propTypes", { fields: _propTypes["default"].arrayOf(_propTypes["default"].any), fieldsToShow: _propTypes["default"].arrayOf(_propTypes["default"].any), isVisible: _propTypes["default"].bool, layer: _propTypes["default"].object, data: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].any), _propTypes["default"].object]), freezed: _propTypes["default"].bool, x: _propTypes["default"].number, y: _propTypes["default"].number, onClose: _propTypes["default"].func, mapState: _propTypes["default"].object.isRequired }); var Row = function Row(_ref) { var name = _ref.name, value = _ref.value, url = _ref.url; // Set 'url' to 'value' if it looks like a url if (!url && value && typeof value === 'string' && value.match(/^http/)) { url = value; } var asImg = /<img>/.test(name); return _react["default"].createElement("tr", { className: "row", key: name }, _react["default"].createElement("td", { className: "row__name" }, name), _react["default"].createElement("td", { className: "row__value" }, asImg ? _react["default"].createElement("img", { src: value }) : url ? _react["default"].createElement("a", { target: "_blank", rel: "noopener noreferrer", href: url }, value) : value)); }; var EntryInfo = function EntryInfo(_ref2) { var fieldsToShow = _ref2.fieldsToShow, fields = _ref2.fields, data = _ref2.data; return _react["default"].createElement("tbody", null, fieldsToShow.map(function (name) { return _react["default"].createElement(EntryInfoRow, { key: name, name: name, fields: fields, data: data }); })); }; var EntryInfoRow = function EntryInfoRow(_ref3) { var name = _ref3.name, fields = _ref3.fields, data = _ref3.data; var field = fields.find(function (f) { return f.name === name; }); if (!field) { return null; } var valueIdx = field.tableFieldIndex - 1; var format = _getCellFormat(field.type); return _react["default"].createElement(Row, { name: name, value: format ? format(data[valueIdx]) : data[valueIdx] }); }; var CellInfo = function CellInfo(_ref4) { var data = _ref4.data, layer = _ref4.layer; var _layer$config = layer.config, colorField = _layer$config.colorField, sizeField = _layer$config.sizeField; return _react["default"].createElement("tbody", null, _react["default"].createElement(Row, { name: 'total points', key: "count", value: data.points && data.points.length }), colorField && layer.visualChannels.color ? _react["default"].createElement(Row, { name: layer.getVisualChannelDescription('color').measure, key: "color", value: data.colorValue || 'N/A' }) : null, sizeField && layer.visualChannels.size ? _react["default"].createElement(Row, { name: layer.getVisualChannelDescription('size').measure, key: "size", value: data.elevationValue || 'N/A' }) : null); }; var CellInfoBoundary = function CellInfoBoundary(_ref5) { var data = _ref5.data, layer = _ref5.layer; var _layer$config2 = layer.config, colorField = _layer$config2.colorField, heightField = _layer$config2.heightField; var enable3d = layer.config.visConfig.enable3d; var dataKeys = Object.keys(data.properties); dataKeys = dataKeys.filter(function (d) { if (d !== 'aggregatedData' && d !== 'count' && d !== 'values' && d != 'heightAggregatedData') { return d; } }); return _react["default"].createElement("tbody", null, _react["default"].createElement(Row, { name: 'total points', key: "count", value: data.properties.count }), colorField && layer.visualChannels.color ? _react["default"].createElement(Row, { name: layer.getVisualChannelDescription('color').measure, key: "color", value: data.properties.aggregatedData || 'N/A' }) : null, heightField && enable3d && layer.visualChannels.height ? _react["default"].createElement(Row, { name: layer.getVisualChannelDescription('height').measure, key: "height", value: data.properties.heightAggregatedData || 'N/A' }) : null, dataKeys.map(function (d) { return _react["default"].createElement(Row, { name: d, key: d, value: data.properties[d] }); })); }; function _getCellFormat(type) { return _defaultSettings.FIELD_DISPLAY_FORMAT[type]; } var MapPopoverFactory = function MapPopoverFactory() { return MapPopover; }; var _default = MapPopoverFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtcG9wb3Zlci5qcyJdLCJuYW1lcyI6WyJNQVhfV0lEVEgiLCJNQVhfSEVJR0hUIiwiU3R5bGVkTWFwUG9wb3ZlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzY3JvbGxCYXIiLCJwYW5lbEJhY2tncm91bmQiLCJ0ZXh0Q29sb3IiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFBpbiIsInByaW1hcnlCdG5CZ2QiLCJsaW5rQnRuQ29sb3IiLCJTdHlsZWRMYXllck5hbWUiLCJDZW50ZXJGbGV4Ym94IiwiZXh0ZW5kIiwiTWFwUG9wb3ZlciIsInN0YXRlIiwiaXNNb3VzZU92ZXIiLCJ3aWR0aCIsImhlaWdodCIsIl9zZXRDb250YWluZXJTaXplIiwibm9kZSIsInBvcG92ZXIiLCJNYXRoIiwibWluIiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJzZXRTdGF0ZSIsIngiLCJ5IiwidG9wT2Zmc2V0IiwibGVmdE9mZnNldCIsIm1hcFN0YXRlIiwicG9zIiwicmlnaHQiLCJsZWZ0IiwiYm90dG9tIiwidG9wIiwiaXNWaXNpYmxlIiwiZGF0YSIsImxheWVyIiwiZnJlZXplZCIsImZpZWxkcyIsImZpZWxkc1RvU2hvdyIsImhpZGRlbiIsImxlbmd0aCIsImluZm9Qcm9wcyIsInN0eWxlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJfZ2V0UG9zaXRpb24iLCJjb21wIiwibWF4V2lkdGgiLCJvbkNsb3NlIiwiY29uZmlnIiwibGFiZWwiLCJpc0FnZ3JlZ2F0ZWQiLCJ0eXBlIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiYXJyYXlPZiIsImFueSIsImJvb2wiLCJvYmplY3QiLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJmdW5jIiwiaXNSZXF1aXJlZCIsIlJvdyIsIm5hbWUiLCJ2YWx1ZSIsInVybCIsIm1hdGNoIiwiYXNJbWciLCJ0ZXN0IiwiRW50cnlJbmZvIiwibWFwIiwiRW50cnlJbmZvUm93IiwiZmllbGQiLCJmaW5kIiwiZiIsInZhbHVlSWR4IiwidGFibGVGaWVsZEluZGV4IiwiZm9ybWF0IiwiX2dldENlbGxGb3JtYXQiLCJDZWxsSW5mbyIsImNvbG9yRmllbGQiLCJzaXplRmllbGQiLCJwb2ludHMiLCJ2aXN1YWxDaGFubmVscyIsImNvbG9yIiwiZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uIiwibWVhc3VyZSIsImNvbG9yVmFsdWUiLCJzaXplIiwiZWxldmF0aW9uVmFsdWUiLCJDZWxsSW5mb0JvdW5kYXJ5IiwiaGVpZ2h0RmllbGQiLCJlbmFibGUzZCIsInZpc0NvbmZpZyIsImRhdGFLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJmaWx0ZXIiLCJkIiwiY291bnQiLCJhZ2dyZWdhdGVkRGF0YSIsImhlaWdodEFnZ3JlZ2F0ZWREYXRhIiwiRklFTERfRElTUExBWV9GT1JNQVQiLCJNYXBQb3BvdmVyRmFjdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBUyxHQUFHLEdBQWxCO0FBQ0EsSUFBTUMsVUFBVSxHQUFHLEdBQW5COztBQUVBLElBQU1DLGdCQUFnQixHQUFHQyw2QkFBT0MsR0FBVixvQkFDbEIsVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxTQUFoQjtBQUFBLENBRGEsRUFJQSxVQUFBRixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlFLGVBQWhCO0FBQUEsQ0FKTCxFQUtYLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsU0FBaEI7QUFBQSxDQUxNLEVBMEJQLFVBQUFKLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsU0FBaEI7QUFBQSxDQTFCRSxFQWdDUCxVQUFB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QUFsQyxFQUEyQ0MsT0FEbkQ7QUFFRSxJQUFBLEdBQUcsRUFBQyxPQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVyRCxJQUFJLENBQUNnRSxVQUFMLENBQWdCSSxjQUFoQixJQUFrQztBQUgzQyxJQURELEdBTUcsSUFiTixFQWNHVixXQUFXLElBQUlDLFFBQWYsSUFBMkIxRCxLQUFLLENBQUNpRCxjQUFOLENBQXFCdEUsTUFBaEQsR0FDQyxnQ0FBQyxHQUFEO0FBQ0UsSUFBQSxJQUFJLEVBQUVxQixLQUFLLENBQUNtRCwyQkFBTixDQUFrQyxRQUFsQyxFQUE0Q0MsT0FEcEQ7QUFFRSxJQUFBLEdBQUcsRUFBQyxRQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVyRCxJQUFJLENBQUNnRSxVQUFMLENBQWdCSyxvQkFBaEIsSUFBd0M7QUFIakQsSUFERCxHQU1HLElBcEJOLEVBcUJHUixRQUFRLENBQUN4QixHQUFULENBQWEsVUFBQTZCLENBQUM7QUFBQSxXQUNiLGdDQUFDLEdBQUQ7QUFBSyxNQUFBLElBQUksRUFBRUEsQ0FBWDtBQUFjLE1BQUEsR0FBRyxFQUFFQSxDQUFuQjtBQUFzQixNQUFBLEtBQUssRUFBRWxFLElBQUksQ0FBQ2dFLFVBQUwsQ0FBZ0JFLENBQWhCO0FBQTdCLE1BRGE7QUFBQSxHQUFkLENBckJILENBREY7QUEyQkQsQ0F6Q0Q7O0FBMkNBLFNBQVNyQixjQUFULENBQXdCM0IsSUFBeEIsRUFBOEI7QUFDNUIsU0FBT29ELHNDQUFxQnBELElBQXJCLENBQVA7QUFDRDs7QUFFRCxJQUFNcUQsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQjtBQUFBLFNBQU0vRixVQUFOO0FBQUEsQ0FBMUI7O2VBQ2UrRixpQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge0NlbnRlckZsZXhib3h9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7UGluLCBMYXllcnN9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCB7RklFTERfRElTUExBWV9GT1JNQVR9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgTUFYX1dJRFRIID0gNDAwO1xuY29uc3QgTUFYX0hFSUdIVCA9IDYwMDtcblxuY29uc3QgU3R5bGVkTWFwUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2Nyb2xsQmFyfVxuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgei1pbmRleDogMTAwMTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBvdmVyZmxvdy14OiBhdXRvO1xuXG4gIC5ndXR0ZXIge1xuICAgIGhlaWdodDogNnB4O1xuICB9XG5cbiAgdGFibGUge1xuICAgIG1hcmdpbjogMnB4IDEycHggMTJweCAxMnB4O1xuICAgIHdpZHRoOiBhdXRvO1xuXG4gICAgdGJvZHkge1xuICAgICAgYm9yZGVyLXRvcDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItYm90dG9tOiB0cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICB0ZCB7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgcGFkZGluZzogNHB4O1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgICB9XG5cbiAgICB0ZC5yb3dfX3ZhbHVlIHtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFBpbiA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgzMGRlZyk7XG4gIHRvcDogMTBweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucHJpbWFyeUJ0bkJnZH07XG5cbiAgOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTGF5ZXJOYW1lID0gQ2VudGVyRmxleGJveC5leHRlbmRgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsZXR0ZXItc3BhY2luZzogMC40M3B4O1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgcGFkZGluZy1sZWZ0OiAxNHB4O1xuICBtYXJnaW4tdG9wOiAxMnB4O1xuXG4gIHN2ZyB7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gIH1cbmA7XG5cbmV4cG9ydCBjbGFzcyBNYXBQb3BvdmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBmaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgIGZpZWxkc1RvU2hvdzogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgaXNWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkYXRhOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgUHJvcFR5cGVzLm9iamVjdFxuICAgIF0pLFxuICAgIGZyZWV6ZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgeTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBtYXBTdGF0ZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTW91c2VPdmVyOiBmYWxzZSxcbiAgICAgIHdpZHRoOiAzODAsXG4gICAgICBoZWlnaHQ6IDE2MFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9zZXRDb250YWluZXJTaXplKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyU2l6ZSgpO1xuICB9XG5cbiAgX3NldENvbnRhaW5lclNpemUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMucG9wb3ZlcjtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKG5vZGUuc2Nyb2xsV2lkdGgsIE1BWF9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4obm9kZS5zY3JvbGxIZWlnaHQsIE1BWF9IRUlHSFQpO1xuXG4gICAgaWYgKHdpZHRoICE9PSB0aGlzLnN0YXRlLndpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5zdGF0ZS5oZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3dpZHRoLCBoZWlnaHR9KTtcbiAgICB9XG4gIH1cblxuICBfZ2V0UG9zaXRpb24oeCwgeSkge1xuICAgIGNvbnN0IHRvcE9mZnNldCA9IDMwO1xuICAgIGNvbnN0IGxlZnRPZmZzZXQgPSAzMDtcbiAgICBjb25zdCB7bWFwU3RhdGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHBvcyA9IHt9O1xuICAgIGlmICh4ICsgbGVmdE9mZnNldCArIHdpZHRoID4gbWFwU3RhdGUud2lkdGgpIHtcbiAgICAgIHBvcy5yaWdodCA9IG1hcFN0YXRlLndpZHRoIC0geCArIGxlZnRPZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcy5sZWZ0ID0geCArIGxlZnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHkgKyB0b3BPZmZzZXQgKyBoZWlnaHQgPiBtYXBTdGF0ZS5oZWlnaHQpIHtcbiAgICAgIHBvcy5ib3R0b20gPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zLnRvcCA9IHkgKyB0b3BPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcztcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGRhdGEsXG4gICAgICBsYXllcixcbiAgICAgIGZyZWV6ZWQsXG4gICAgICBmaWVsZHMsXG4gICAgICBmaWVsZHNUb1Nob3cgPSBbXVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGhpZGRlbiA9ICFpc1Zpc2libGUgJiYgIXRoaXMuc3RhdGUuaXNNb3VzZU92ZXI7XG4gICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoIWRhdGEgfHwgIWxheWVyIHx8ICFmaWVsZHNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbmZvUHJvcHMgPSB7ZGF0YSwgbGF5ZXIsIGZpZWxkc1RvU2hvdywgZmllbGRzfTtcblxuICAgIGNvbnN0IHN0eWxlID1cbiAgICAgIE51bWJlci5pc0Zpbml0ZSh4KSAmJiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB0aGlzLl9nZXRQb3NpdGlvbih4LCB5KSA6IHt9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRNYXBQb3BvdmVyXG4gICAgICAgIGlubmVyUmVmPXtjb21wID0+IHtcbiAgICAgICAgICB0aGlzLnBvcG92ZXIgPSBjb21wO1xuICAgICAgICB9fVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ21hcC1wb3BvdmVyJywge2hpZGRlbn0pfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgIG1heFdpZHRoOiB3aWR0aFxuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpc01vdXNlT3ZlcjogdHJ1ZX0pO1xuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpc01vdXNlT3ZlcjogZmFsc2V9KTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2ZyZWV6ZWQgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fdG9wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImd1dHRlclwiIC8+XG4gICAgICAgICAgICA8U3R5bGVkUGluIGNsYXNzTmFtZT1cInBvcG92ZXItcGluXCIgb25DbGljaz17dGhpcy5wcm9wcy5vbkNsb3NlfT5cbiAgICAgICAgICAgICAgPFBpbiBoZWlnaHQ9XCIxNnB4XCIgLz5cbiAgICAgICAgICAgIDwvU3R5bGVkUGluPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPFN0eWxlZExheWVyTmFtZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fbGF5ZXItbmFtZVwiPlxuICAgICAgICAgIDxMYXllcnMgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAge2xheWVyLmNvbmZpZy5sYWJlbH1cbiAgICAgICAgPC9TdHlsZWRMYXllck5hbWU+XG4gICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fdGFibGVcIj5cbiAgICAgICAgICB7bGF5ZXIuaXNBZ2dyZWdhdGVkID8gKFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2JvdW5kYXJ5JyB8fCBsYXllci50eXBlID09PSAncGluY29kZScgPyAoXG4gICAgICAgICAgICAgIDxDZWxsSW5mb0JvdW5kYXJ5IHsuLi5pbmZvUHJvcHN9IC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8Q2VsbEluZm8gey4uLmluZm9Qcm9wc30gLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEVudHJ5SW5mbyB7Li4uaW5mb1Byb3BzfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L1N0eWxlZE1hcFBvcG92ZXI+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBSb3cgPSAoe25hbWUsIHZhbHVlLCB1cmx9KSA9PiB7XG4gIC8vIFNldCAndXJsJyB0byAndmFsdWUnIGlmIGl0IGxvb2tzIGxpa2UgYSB1cmxcbiAgaWYgKCF1cmwgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5tYXRjaCgvXmh0dHAvKSkge1xuICAgIHVybCA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgYXNJbWcgPSAvPGltZz4vLnRlc3QobmFtZSk7XG4gIHJldHVybiAoXG4gICAgPHRyIGNsYXNzTmFtZT1cInJvd1wiIGtleT17bmFtZX0+XG4gICAgICA8dGQgY2xhc3NOYW1lPVwicm93X19uYW1lXCI+e25hbWV9PC90ZD5cbiAgICAgIDx0ZCBjbGFzc05hbWU9XCJyb3dfX3ZhbHVlXCI+XG4gICAgICAgIHthc0ltZyA/IChcbiAgICAgICAgICA8aW1nIHNyYz17dmFsdWV9IC8+XG4gICAgICAgICkgOiB1cmwgPyAoXG4gICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIGhyZWY9e3VybH0+XG4gICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgPC9hPlxuICAgICAgICApIDogKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICl9XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICk7XG59O1xuXG5jb25zdCBFbnRyeUluZm8gPSAoe2ZpZWxkc1RvU2hvdywgZmllbGRzLCBkYXRhfSkgPT4gKFxuICA8dGJvZHk+XG4gICAge2ZpZWxkc1RvU2hvdy5tYXAobmFtZSA9PiAoXG4gICAgICA8RW50cnlJbmZvUm93IGtleT17bmFtZX0gbmFtZT17bmFtZX0gZmllbGRzPXtmaWVsZHN9IGRhdGE9e2RhdGF9IC8+XG4gICAgKSl9XG4gIDwvdGJvZHk+XG4pO1xuXG5jb25zdCBFbnRyeUluZm9Sb3cgPSAoe25hbWUsIGZpZWxkcywgZGF0YX0pID0+IHtcbiAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gIGlmICghZmllbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlSWR4ID0gZmllbGQudGFibGVGaWVsZEluZGV4IC0gMTtcbiAgY29uc3QgZm9ybWF0ID0gX2dldENlbGxGb3JtYXQoZmllbGQudHlwZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Um93IG5hbWU9e25hbWV9IHZhbHVlPXtmb3JtYXQgPyBmb3JtYXQoZGF0YVt2YWx1ZUlkeF0pIDogZGF0YVt2YWx1ZUlkeF19IC8+XG4gICk7XG59O1xuXG5jb25zdCBDZWxsSW5mbyA9ICh7ZGF0YSwgbGF5ZXJ9KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBzaXplRmllbGR9ID0gbGF5ZXIuY29uZmlnO1xuXG4gIHJldHVybiAoXG4gICAgPHRib2R5PlxuICAgICAgPFJvd1xuICAgICAgICBuYW1lPXsndG90YWwgcG9pbnRzJ31cbiAgICAgICAga2V5PVwiY291bnRcIlxuICAgICAgICB2YWx1ZT17ZGF0YS5wb2ludHMgJiYgZGF0YS5wb2ludHMubGVuZ3RofVxuICAgICAgLz5cbiAgICAgIHtjb2xvckZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmNvbG9yID8gKFxuICAgICAgICA8Um93XG4gICAgICAgICAgbmFtZT17bGF5ZXIuZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKCdjb2xvcicpLm1lYXN1cmV9XG4gICAgICAgICAga2V5PVwiY29sb3JcIlxuICAgICAgICAgIHZhbHVlPXtkYXRhLmNvbG9yVmFsdWUgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtzaXplRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSA/IChcbiAgICAgICAgPFJvd1xuICAgICAgICAgIG5hbWU9e2xheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignc2l6ZScpLm1lYXN1cmV9XG4gICAgICAgICAga2V5PVwic2l6ZVwiXG4gICAgICAgICAgdmFsdWU9e2RhdGEuZWxldmF0aW9uVmFsdWUgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICA8L3Rib2R5PlxuICApO1xufTtcblxuY29uc3QgQ2VsbEluZm9Cb3VuZGFyeSA9ICh7ZGF0YSwgbGF5ZXJ9KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBoZWlnaHRGaWVsZH0gPSBsYXllci5jb25maWc7XG4gIGNvbnN0IHtlbmFibGUzZH0gPSBsYXllci5jb25maWcudmlzQ29uZmlnO1xuICB2YXIgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhLnByb3BlcnRpZXMpO1xuICBkYXRhS2V5cyA9IGRhdGFLZXlzLmZpbHRlcihkID0+IHtcbiAgICBpZiAoXG4gICAgICBkICE9PSAnYWdncmVnYXRlZERhdGEnICYmXG4gICAgICBkICE9PSAnY291bnQnICYmXG4gICAgICBkICE9PSAndmFsdWVzJyAmJlxuICAgICAgZCAhPSAnaGVpZ2h0QWdncmVnYXRlZERhdGEnXG4gICAgKSB7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDx0Ym9keT5cbiAgICAgIDxSb3cgbmFtZT17J3RvdGFsIHBvaW50cyd9IGtleT1cImNvdW50XCIgdmFsdWU9e2RhdGEucHJvcGVydGllcy5jb3VudH0gLz5cbiAgICAgIHsvKiA8Um93XG4gICAgICAgIG5hbWU9eyd0b3RhbCBwb2ludHMnfVxuICAgICAgICBrZXk9XCJjb3VudFwiXG4gICAgICAgIHZhbHVlPXtkYXRhLnByb3BlcnRpZXMubG9jYWxpdHlfbmFtZX1cbiAgICAgIC8+ICovfVxuICAgICAge2NvbG9yRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuY29sb3IgPyAoXG4gICAgICAgIDxSb3dcbiAgICAgICAgICBuYW1lPXtsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oJ2NvbG9yJykubWVhc3VyZX1cbiAgICAgICAgICBrZXk9XCJjb2xvclwiXG4gICAgICAgICAgdmFsdWU9e2RhdGEucHJvcGVydGllcy5hZ2dyZWdhdGVkRGF0YSB8fCAnTi9BJ31cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2hlaWdodEZpZWxkICYmIGVuYWJsZTNkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmhlaWdodCA/IChcbiAgICAgICAgPFJvd1xuICAgICAgICAgIG5hbWU9e2xheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignaGVpZ2h0JykubWVhc3VyZX1cbiAgICAgICAgICBrZXk9XCJoZWlnaHRcIlxuICAgICAgICAgIHZhbHVlPXtkYXRhLnByb3BlcnRpZXMuaGVpZ2h0QWdncmVnYXRlZERhdGEgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtkYXRhS2V5cy5tYXAoZCA9PiAoXG4gICAgICAgIDxSb3cgbmFtZT17ZH0ga2V5PXtkfSB2YWx1ZT17ZGF0YS5wcm9wZXJ0aWVzW2RdfSAvPlxuICAgICAgKSl9XG4gICAgPC90Ym9keT5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRDZWxsRm9ybWF0KHR5cGUpIHtcbiAgcmV0dXJuIEZJRUxEX0RJU1BMQVlfRk9STUFUW3R5cGVdO1xufVxuXG5jb25zdCBNYXBQb3BvdmVyRmFjdG9yeSA9ICgpID0+IE1hcFBvcG92ZXI7XG5leHBvcnQgZGVmYXVsdCBNYXBQb3BvdmVyRmFjdG9yeTtcbiJdfQ==