UNPKG

kepler.gl.geoiq

Version:

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

218 lines (187 loc) 28 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.VisualChannelMetric = exports.StyledMapControlLegend = exports.SingleColorLegend = exports.MultiColorLegend = exports.LayerSizeLegend = exports.LayerColorLegend = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _d3Color = require("d3-color"); var _colorLegend = _interopRequireDefault(require("../common/color-legend")); var _defaultSettings = require("../../constants/default-settings"); var _utils = require("../../utils/utils"); var _templateObject; var StyledMapControlLegend = exports.StyledMapControlLegend = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 10px 0 10px ", "px;\n font-size: 11px;\n border-bottom-color: ", ";\n border-bottom-style: solid;\n border-bottom-width: ", ";\n\n .legend--layer_name {\n font-size: 12px;\n padding-right: ", "px;\n color: ", ";\n font-weight: 500;\n }\n .legend--layer_type {\n color: ", ";\n font-weight: 500;\n font-size: 11px;\n padding-right: ", "px;\n }\n\n .legend--layer__title {\n padding-right: ", "px;\n }\n\n .legend--layer_by {\n color: ", ";\n }\n\n .legend--layer_color_field {\n color: ", ";\n font-weight: 500;\n }\n\n .legend--layer_color-legend {\n margin-top: 6px;\n }\n"])), function (props) { return props.theme.mapControl.padding; }, function (props) { return props.theme.panelBorderColor; }, function (props) { return props.last ? 0 : '1px'; }, function (props) { return props.theme.mapControl.padding; }, function (props) { return props.theme.textColorHl; }, function (props) { return props.theme.subtextColor; }, function (props) { return props.theme.mapControl.padding; }, function (props) { return props.theme.mapControl.padding; }, function (props) { return props.theme.subtextColor; }, function (props) { return props.theme.textColor; }); var VisualChannelMetric = exports.VisualChannelMetric = function VisualChannelMetric(_ref) { var name = _ref.name; return (/*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer__title" }, /*#__PURE__*/_react["default"].createElement("span", { className: "legend--layer_by" }, "by "), /*#__PURE__*/_react["default"].createElement("span", { className: "legend--layer_color_field" }, name)) ); }; var LayerSizeLegend = exports.LayerSizeLegend = function LayerSizeLegend(_ref2) { var label = _ref2.label, name = _ref2.name; return (/*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer_size-schema" }, /*#__PURE__*/_react["default"].createElement("p", null, /*#__PURE__*/_react["default"].createElement("span", { className: "legend--layer_by" }, label)), /*#__PURE__*/_react["default"].createElement(VisualChannelMetric, { name: name })) ); }; var propTypes = { layers: _propTypes["default"].arrayOf(_propTypes["default"].object) }; var SingleColorDomain = ['']; var SingleColorLegend = exports.SingleColorLegend = _react["default"].memo(function (_ref3) { var width = _ref3.width, color = _ref3.color; return (/*#__PURE__*/_react["default"].createElement(_colorLegend["default"], { scaleType: "ordinal", displayLabel: false, domain: SingleColorDomain, fieldType: null, range: [_d3Color.rgb.apply(void 0, (0, _toConsumableArray2["default"])(color)).toString()], width: width }) ); }); SingleColorLegend.displayName = 'SingleColorLegend'; var MultiColorLegend = exports.MultiColorLegend = _react["default"].memo(function (_ref4) { var colorRange = _ref4.colorRange, colorScale = _ref4.colorScale, colorDomain = _ref4.colorDomain, colorField = _ref4.colorField, width = _ref4.width, legend = _ref4.legend; return (/*#__PURE__*/_react["default"].createElement(_colorLegend["default"], { scaleType: colorScale, displayLabel: true, domain: colorDomain, fieldType: colorField && colorField.type || 'real', range: colorRange.colors, width: width, legend: legend }) ); }); MultiColorLegend.displayName = 'MultiColorLegend'; var LayerColorLegend = exports.LayerColorLegend = _react["default"].memo(function (_ref5) { var description = _ref5.description, config = _ref5.config, width = _ref5.width, colorChannel = _ref5.colorChannel; var enableColorBy = description.measure; var scale = colorChannel.scale, field = colorChannel.field, domain = colorChannel.domain, range = colorChannel.range, property = colorChannel.property, key = colorChannel.key; var _map = [scale, field, domain].map(function (k) { return config[k]; }), _map2 = (0, _slicedToArray2["default"])(_map, 3), colorScale = _map2[0], colorField = _map2[1], colorDomain = _map2[2]; var legend = config.legend; var colorRange = config.visConfig[range]; return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer_type" }, (0, _utils.camelToTitle)(key)), /*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer_color-schema" }, /*#__PURE__*/_react["default"].createElement("div", null, enableColorBy ? /*#__PURE__*/_react["default"].createElement(VisualChannelMetric, { name: enableColorBy }) : null, /*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer_color-legend" }, enableColorBy ? /*#__PURE__*/_react["default"].createElement(MultiColorLegend, { colorScale: colorScale, colorField: colorField, colorDomain: colorDomain, colorRange: colorRange, width: width, legend: legend }) : /*#__PURE__*/_react["default"].createElement(SingleColorLegend, { color: config.visConfig[property] || config[property] || config.color, width: width }))))) ); }); LayerColorLegend.displayName = 'LayerColorLegend'; var isColorChannel = function isColorChannel(visualChannel) { return [_defaultSettings.CHANNEL_SCALES.color, _defaultSettings.CHANNEL_SCALES.colorAggr].includes(visualChannel.channelScaleType); }; var MAP_LEGEND_WIDTH = _defaultSettings.DIMENSIONS.mapControl.width - 2 * _defaultSettings.DIMENSIONS.mapControl.padding; var MapLegend = function MapLegend(_ref6) { var _ref6$layers = _ref6.layers, layers = _ref6$layers === void 0 ? [] : _ref6$layers; return (/*#__PURE__*/_react["default"].createElement("div", null, layers.map(function (layer, index) { if (!layer.isValidToSave()) { return null; } var colorChannels = Object.values(layer.visualChannels).filter(isColorChannel); var nonColorChannels = Object.values(layer.visualChannels).filter(function (vc) { return !isColorChannel(vc); }); return (/*#__PURE__*/_react["default"].createElement(StyledMapControlLegend, { className: "legend--layer", last: index === layers.length - 1, key: index }, /*#__PURE__*/_react["default"].createElement("div", { className: "legend--layer_name" }, layer.config.label), colorChannels.map(function (colorChannel) { return !colorChannel.condition || colorChannel.condition(layer.config) ? /*#__PURE__*/_react["default"].createElement(LayerColorLegend, { key: colorChannel.key, description: layer.getVisualChannelDescription(colorChannel.key), config: layer.config, width: MAP_LEGEND_WIDTH, colorChannel: colorChannel }) : null; }), nonColorChannels.map(function (visualChannel) { var matchCondition = !visualChannel.condition || visualChannel.condition(layer.config); var enabled = layer.config[visualChannel.field] || visualChannel.defaultMeasure; var description = layer.getVisualChannelDescription(visualChannel.key); return matchCondition && enabled ? /*#__PURE__*/_react["default"].createElement(LayerSizeLegend, { key: visualChannel.key, label: description.label, name: description.measure }) : null; })) ); })) ); }; MapLegend.propTypes = propTypes; var _default = exports["default"] = MapLegend; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtbGVnZW5kLmpzIl0sIm5hbWVzIjpbIlN0eWxlZE1hcENvbnRyb2xMZWdlbmQiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwibWFwQ29udHJvbCIsInBhZGRpbmciLCJwYW5lbEJvcmRlckNvbG9yIiwibGFzdCIsInRleHRDb2xvckhsIiwic3VidGV4dENvbG9yIiwidGV4dENvbG9yIiwiVmlzdWFsQ2hhbm5lbE1ldHJpYyIsIm5hbWUiLCJMYXllclNpemVMZWdlbmQiLCJsYWJlbCIsInByb3BUeXBlcyIsImxheWVycyIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJvYmplY3QiLCJTaW5nbGVDb2xvckRvbWFpbiIsIlNpbmdsZUNvbG9yTGVnZW5kIiwiUmVhY3QiLCJtZW1vIiwid2lkdGgiLCJjb2xvciIsInJnYiIsInRvU3RyaW5nIiwiZGlzcGxheU5hbWUiLCJNdWx0aUNvbG9yTGVnZW5kIiwiY29sb3JSYW5nZSIsImNvbG9yU2NhbGUiLCJjb2xvckRvbWFpbiIsImNvbG9yRmllbGQiLCJsZWdlbmQiLCJ0eXBlIiwiY29sb3JzIiwiTGF5ZXJDb2xvckxlZ2VuZCIsImRlc2NyaXB0aW9uIiwiY29uZmlnIiwiY29sb3JDaGFubmVsIiwiZW5hYmxlQ29sb3JCeSIsIm1lYXN1cmUiLCJzY2FsZSIsImZpZWxkIiwiZG9tYWluIiwicmFuZ2UiLCJwcm9wZXJ0eSIsImtleSIsIm1hcCIsImsiLCJ2aXNDb25maWciLCJpc0NvbG9yQ2hhbm5lbCIsInZpc3VhbENoYW5uZWwiLCJDSEFOTkVMX1NDQUxFUyIsImNvbG9yQWdnciIsImluY2x1ZGVzIiwiY2hhbm5lbFNjYWxlVHlwZSIsIk1BUF9MRUdFTkRfV0lEVEgiLCJESU1FTlNJT05TIiwiTWFwTGVnZW5kIiwibGF5ZXIiLCJpbmRleCIsImlzVmFsaWRUb1NhdmUiLCJjb2xvckNoYW5uZWxzIiwiT2JqZWN0IiwidmFsdWVzIiwidmlzdWFsQ2hhbm5lbHMiLCJmaWx0ZXIiLCJub25Db2xvckNoYW5uZWxzIiwidmMiLCJsZW5ndGgiLCJjb25kaXRpb24iLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJtYXRjaENvbmRpdGlvbiIsImVuYWJsZWQiLCJkZWZhdWx0TWVhc3VyZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRU8sSUFBTUEsc0JBQXNCLG9DQUFHQyw2QkFBT0MsR0FBVix3dEJBQ1YsVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxVQUFaLENBQXVCQyxPQUEzQjtBQUFBLENBREssRUFHVixVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlHLGdCQUFoQjtBQUFBLENBSEssRUFLVixVQUFBSixLQUFLO0FBQUEsU0FBS0EsS0FBSyxDQUFDSyxJQUFOLEdBQWEsQ0FBYixHQUFpQixLQUF0QjtBQUFBLENBTEssRUFTZCxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFVBQVosQ0FBdUJDLE9BQTNCO0FBQUEsQ0FUUyxFQVV0QixVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLFdBQWhCO0FBQUEsQ0FWaUIsRUFjdEIsVUFBQU4sS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxZQUFoQjtBQUFBLENBZGlCLEVBaUJkLFVBQUFQLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsVUFBWixDQUF1QkMsT0FBM0I7QUFBQSxDQWpCUyxFQXFCZCxVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFVBQVosQ0FBdUJDLE9BQTNCO0FBQUEsQ0FyQlMsRUF5QnRCLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWU0sWUFBaEI7QUFBQSxDQXpCaUIs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LEtBQUssQ0FBQ1ksMkJBQU4sQ0FDbEJwQixhQUFhLENBQUNMLEdBREksQ0FBcEI7QUFJQSxpQkFBTzBCLGNBQWMsSUFBSUMsT0FBbEIsZ0JBQ0wsZ0NBQUMsZUFBRDtBQUNFLFlBQUEsR0FBRyxFQUFFdEIsYUFBYSxDQUFDTCxHQURyQjtBQUVFLFlBQUEsS0FBSyxFQUFFVixXQUFXLENBQUN4QixLQUZyQjtBQUdFLFlBQUEsSUFBSSxFQUFFd0IsV0FBVyxDQUFDSTtBQUhwQixZQURLLEdBTUgsSUFOSjtBQU9ELFNBakJBLENBbkJIO0FBREY7QUF3Q0QsS0FwREEsQ0FESDtBQURnQjtBQUFBLENBQWxCOztBQTBEQWtCLFNBQVMsQ0FBQzdDLFNBQVYsR0FBc0JBLFNBQXRCOztvQ0FFZTZDLFMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcbmltcG9ydCBDb2xvckxlZ2VuZCBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9jb2xvci1sZWdlbmQnO1xuaW1wb3J0IHtESU1FTlNJT05TLCBDSEFOTkVMX1NDQUxFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtjYW1lbFRvVGl0bGV9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFN0eWxlZE1hcENvbnRyb2xMZWdlbmQgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAxMHB4IDAgMTBweCAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQm9yZGVyQ29sb3J9O1xuICBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogJHtwcm9wcyA9PiAocHJvcHMubGFzdCA/IDAgOiAnMXB4Jyl9O1xuXG4gIC5sZWdlbmQtLWxheWVyX25hbWUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgfVxuICAubGVnZW5kLS1sYXllcl90eXBlIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubWFwQ29udHJvbC5wYWRkaW5nfXB4O1xuICB9XG5cbiAgLmxlZ2VuZC0tbGF5ZXJfX3RpdGxlIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgfVxuXG4gIC5sZWdlbmQtLWxheWVyX2J5IHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICB9XG5cbiAgLmxlZ2VuZC0tbGF5ZXJfY29sb3JfZmllbGQge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgfVxuXG4gIC5sZWdlbmQtLWxheWVyX2NvbG9yLWxlZ2VuZCB7XG4gICAgbWFyZ2luLXRvcDogNnB4O1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgVmlzdWFsQ2hhbm5lbE1ldHJpYyA9ICh7bmFtZX0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX190aXRsZVwiPlxuICAgIDxzcGFuIGNsYXNzTmFtZT1cImxlZ2VuZC0tbGF5ZXJfYnlcIj5ieSA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9jb2xvcl9maWVsZFwiPntuYW1lfTwvc3Bhbj5cbiAgPC9kaXY+XG4pO1xuXG5leHBvcnQgY29uc3QgTGF5ZXJTaXplTGVnZW5kID0gKHtsYWJlbCwgbmFtZX0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX3NpemUtc2NoZW1hXCI+XG4gICAgPHA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX2J5XCI+e2xhYmVsfTwvc3Bhbj5cbiAgICA8L3A+XG4gICAgPFZpc3VhbENoYW5uZWxNZXRyaWMgbmFtZT17bmFtZX0gLz5cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIGxheWVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdClcbn07XG5cbmNvbnN0IFNpbmdsZUNvbG9yRG9tYWluID0gWycnXTtcbmV4cG9ydCBjb25zdCBTaW5nbGVDb2xvckxlZ2VuZCA9IFJlYWN0Lm1lbW8oKHt3aWR0aCwgY29sb3J9KSA9PiAoXG4gIDxDb2xvckxlZ2VuZFxuICAgIHNjYWxlVHlwZT1cIm9yZGluYWxcIlxuICAgIGRpc3BsYXlMYWJlbD17ZmFsc2V9XG4gICAgZG9tYWluPXtTaW5nbGVDb2xvckRvbWFpbn1cbiAgICBmaWVsZFR5cGU9e251bGx9XG4gICAgcmFuZ2U9e1tyZ2IoLi4uY29sb3IpLnRvU3RyaW5nKCldfVxuICAgIHdpZHRoPXt3aWR0aH1cbiAgLz5cbikpO1xuXG5TaW5nbGVDb2xvckxlZ2VuZC5kaXNwbGF5TmFtZSA9ICdTaW5nbGVDb2xvckxlZ2VuZCc7XG5cbmV4cG9ydCBjb25zdCBNdWx0aUNvbG9yTGVnZW5kID0gUmVhY3QubWVtbyhcbiAgKHtjb2xvclJhbmdlLCBjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JGaWVsZCwgd2lkdGgsIGxlZ2VuZH0pID0+IChcbiAgICA8Q29sb3JMZWdlbmRcbiAgICAgIHNjYWxlVHlwZT17Y29sb3JTY2FsZX1cbiAgICAgIGRpc3BsYXlMYWJlbFxuICAgICAgZG9tYWluPXtjb2xvckRvbWFpbn1cbiAgICAgIGZpZWxkVHlwZT17KGNvbG9yRmllbGQgJiYgY29sb3JGaWVsZC50eXBlKSB8fCAncmVhbCd9XG4gICAgICByYW5nZT17Y29sb3JSYW5nZS5jb2xvcnN9XG4gICAgICB3aWR0aD17d2lkdGh9XG4gICAgICBsZWdlbmQ9e2xlZ2VuZH1cbiAgICAvPlxuICApXG4pO1xuXG5NdWx0aUNvbG9yTGVnZW5kLmRpc3BsYXlOYW1lID0gJ011bHRpQ29sb3JMZWdlbmQnO1xuXG5leHBvcnQgY29uc3QgTGF5ZXJDb2xvckxlZ2VuZCA9IFJlYWN0Lm1lbW8oXG4gICh7ZGVzY3JpcHRpb24sIGNvbmZpZywgd2lkdGgsIGNvbG9yQ2hhbm5lbH0pID0+IHtcbiAgICBjb25zdCBlbmFibGVDb2xvckJ5ID0gZGVzY3JpcHRpb24ubWVhc3VyZTtcbiAgICBjb25zdCB7c2NhbGUsIGZpZWxkLCBkb21haW4sIHJhbmdlLCBwcm9wZXJ0eSwga2V5fSA9IGNvbG9yQ2hhbm5lbDtcbiAgICBjb25zdCBbY29sb3JTY2FsZSwgY29sb3JGaWVsZCwgY29sb3JEb21haW5dID0gW3NjYWxlLCBmaWVsZCwgZG9tYWluXS5tYXAoXG4gICAgICBrID0+IGNvbmZpZ1trXVxuICAgICk7XG4gICAgY29uc3QgbGVnZW5kID0gY29uZmlnLmxlZ2VuZDtcbiAgICBjb25zdCBjb2xvclJhbmdlID0gY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX3R5cGVcIj57Y2FtZWxUb1RpdGxlKGtleSl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9jb2xvci1zY2hlbWFcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2VuYWJsZUNvbG9yQnkgPyAoXG4gICAgICAgICAgICAgIDxWaXN1YWxDaGFubmVsTWV0cmljIG5hbWU9e2VuYWJsZUNvbG9yQnl9IC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9jb2xvci1sZWdlbmRcIj5cbiAgICAgICAgICAgICAge2VuYWJsZUNvbG9yQnkgPyAoXG4gICAgICAgICAgICAgICAgPE11bHRpQ29sb3JMZWdlbmRcbiAgICAgICAgICAgICAgICAgIGNvbG9yU2NhbGU9e2NvbG9yU2NhbGV9XG4gICAgICAgICAgICAgICAgICBjb2xvckZpZWxkPXtjb2xvckZpZWxkfVxuICAgICAgICAgICAgICAgICAgY29sb3JEb21haW49e2NvbG9yRG9tYWlufVxuICAgICAgICAgICAgICAgICAgY29sb3JSYW5nZT17Y29sb3JSYW5nZX1cbiAgICAgICAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgICAgICAgIGxlZ2VuZD17bGVnZW5kfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFNpbmdsZUNvbG9yTGVnZW5kXG4gICAgICAgICAgICAgICAgICBjb2xvcj17XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy52aXNDb25maWdbcHJvcGVydHldIHx8XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wZXJ0eV0gfHxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbik7XG5cbkxheWVyQ29sb3JMZWdlbmQuZGlzcGxheU5hbWUgPSAnTGF5ZXJDb2xvckxlZ2VuZCc7XG5cbmNvbnN0IGlzQ29sb3JDaGFubmVsID0gdmlzdWFsQ2hhbm5lbCA9PlxuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3IsIENIQU5ORUxfU0NBTEVTLmNvbG9yQWdncl0uaW5jbHVkZXMoXG4gICAgdmlzdWFsQ2hhbm5lbC5jaGFubmVsU2NhbGVUeXBlXG4gICk7XG5cbmNvbnN0IE1BUF9MRUdFTkRfV0lEVEggPVxuICBESU1FTlNJT05TLm1hcENvbnRyb2wud2lkdGggLSAyICogRElNRU5TSU9OUy5tYXBDb250cm9sLnBhZGRpbmc7XG5cbmNvbnN0IE1hcExlZ2VuZCA9ICh7bGF5ZXJzID0gW119KSA9PiAoXG4gIDxkaXY+XG4gICAge2xheWVycy5tYXAoKGxheWVyLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFsYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yQ2hhbm5lbHMgPSBPYmplY3QudmFsdWVzKGxheWVyLnZpc3VhbENoYW5uZWxzKS5maWx0ZXIoXG4gICAgICAgIGlzQ29sb3JDaGFubmVsXG4gICAgICApO1xuICAgICAgY29uc3Qgbm9uQ29sb3JDaGFubmVscyA9IE9iamVjdC52YWx1ZXMobGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZpbHRlcihcbiAgICAgICAgdmMgPT4gIWlzQ29sb3JDaGFubmVsKHZjKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZE1hcENvbnRyb2xMZWdlbmRcbiAgICAgICAgICBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyXCJcbiAgICAgICAgICBsYXN0PXtpbmRleCA9PT0gbGF5ZXJzLmxlbmd0aCAtIDF9XG4gICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9uYW1lXCI+e2xheWVyLmNvbmZpZy5sYWJlbH08L2Rpdj5cbiAgICAgICAgICB7Y29sb3JDaGFubmVscy5tYXAoY29sb3JDaGFubmVsID0+XG4gICAgICAgICAgICAhY29sb3JDaGFubmVsLmNvbmRpdGlvbiB8fCBjb2xvckNoYW5uZWwuY29uZGl0aW9uKGxheWVyLmNvbmZpZykgPyAoXG4gICAgICAgICAgICAgIDxMYXllckNvbG9yTGVnZW5kXG4gICAgICAgICAgICAgICAga2V5PXtjb2xvckNoYW5uZWwua2V5fVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oXG4gICAgICAgICAgICAgICAgICBjb2xvckNoYW5uZWwua2V5XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBjb25maWc9e2xheWVyLmNvbmZpZ31cbiAgICAgICAgICAgICAgICB3aWR0aD17TUFQX0xFR0VORF9XSURUSH1cbiAgICAgICAgICAgICAgICBjb2xvckNoYW5uZWw9e2NvbG9yQ2hhbm5lbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICAgKX1cbiAgICAgICAgICB7bm9uQ29sb3JDaGFubmVscy5tYXAodmlzdWFsQ2hhbm5lbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaENvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICF2aXN1YWxDaGFubmVsLmNvbmRpdGlvbiB8fCB2aXN1YWxDaGFubmVsLmNvbmRpdGlvbihsYXllci5jb25maWcpO1xuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9XG4gICAgICAgICAgICAgIGxheWVyLmNvbmZpZ1t2aXN1YWxDaGFubmVsLmZpZWxkXSB8fCB2aXN1YWxDaGFubmVsLmRlZmF1bHRNZWFzdXJlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGxheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgdmlzdWFsQ2hhbm5lbC5rZXlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaENvbmRpdGlvbiAmJiBlbmFibGVkID8gKFxuICAgICAgICAgICAgICA8TGF5ZXJTaXplTGVnZW5kXG4gICAgICAgICAgICAgICAga2V5PXt2aXN1YWxDaGFubmVsLmtleX1cbiAgICAgICAgICAgICAgICBsYWJlbD17ZGVzY3JpcHRpb24ubGFiZWx9XG4gICAgICAgICAgICAgICAgbmFtZT17ZGVzY3JpcHRpb24ubWVhc3VyZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L1N0eWxlZE1hcENvbnRyb2xMZWdlbmQ+XG4gICAgICApO1xuICAgIH0pfVxuICA8L2Rpdj5cbik7XG5cbk1hcExlZ2VuZC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydCBkZWZhdWx0IE1hcExlZ2VuZDtcbiJdfQ==