kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
290 lines (237 loc) • 28.1 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = 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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _propTypes = _interopRequireDefault(require("prop-types"));
var _lodash = _interopRequireDefault(require("lodash.uniq"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector"));
var _styledComponents2 = require("../../common/styled-components");
var _rangeSlider = _interopRequireDefault(require("../../common/range-slider"));
var _switch = _interopRequireDefault(require("../../common/switch"));
var _colorPalette = _interopRequireDefault(require("./color-palette"));
var _colorRanges = require("../../../constants/color-ranges");
var _dataUtils = require("../../../utils/data-utils");
function _templateObject4() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px;\n :hover {\n background-color: ", ";\n cursor: pointer;\n }\n"]);
_templateObject4 = function _templateObject4() {
return data;
};
return data;
}
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n .color-palette__config__label {\n flex-grow: 1;\n }\n .color-palette__config__select {\n flex-grow: 1;\n }\n .item-selector .item-selector__dropdown {\n ", ";\n }\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
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 _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding-bottom: 12px;\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px 12px 0 12px;\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var ALL_TYPES = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (c) {
return c.type;
}).concat(['all']));
var ALL_STEPS = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (d) {
return d.colors.length;
})).sort(_dataUtils.numberSort);
var StyledColorConfig = _styledComponents["default"].div(_templateObject());
var ColorRangeSelector = _styledComponents["default"].div(_templateObject2());
var ColorRangeSelect =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(ColorRangeSelect, _Component);
function ColorRangeSelect() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, ColorRangeSelect);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(ColorRangeSelect)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
config: {
type: {
type: 'select',
value: 'all',
options: ALL_TYPES
},
steps: {
type: 'select',
value: 6,
options: ALL_STEPS
},
reversed: {
type: 'switch',
value: false,
options: [true, false]
}
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateConfig", function (_ref) {
var key = _ref.key,
value = _ref.value;
var currentValue = _this.state.config[key].value;
if (value !== currentValue) {
_this.setState({
config: _objectSpread({}, _this.state.config, (0, _defineProperty2["default"])({}, key, _objectSpread({}, _this.state.config[key], {
value: value
})))
});
}
});
return _this;
}
(0, _createClass2["default"])(ColorRangeSelect, [{
key: "render",
value: function render() {
var _this2 = this;
var config = this.state.config;
return _react["default"].createElement(ColorRangeSelector, {
className: "color-range-selector"
}, _react["default"].createElement(StyledColorConfig, null, Object.keys(config).map(function (key) {
return _react["default"].createElement(PaletteConfig, {
key: key,
label: key,
config: config[key],
onChange: function onChange(value) {
return _this2._updateConfig({
key: key,
value: value
});
}
});
})), _react["default"].createElement(ColorPaletteGroup, {
config: config,
colorRanges: this.props.colorRanges,
onSelect: this.props.onSelectColorRange,
selected: this.props.selectedColorRange
}));
}
}]);
return ColorRangeSelect;
}(_react.Component);
exports["default"] = ColorRangeSelect;
(0, _defineProperty2["default"])(ColorRangeSelect, "propTypes", {
colorRanges: _propTypes["default"].arrayOf(_propTypes["default"].any),
selectedColorRange: _propTypes["default"].object,
onSelectColorRange: _propTypes["default"].func.isRequired
});
(0, _defineProperty2["default"])(ColorRangeSelect, "defaultProps", {
colorRanges: _colorRanges.COLOR_RANGES,
onSelectColorRange: function onSelectColorRange() {}
});
var StyledPaletteConfig = _styledComponents["default"].div(_templateObject3(), function (props) {
return props.theme.secondaryInput;
});
var PaletteConfig = function PaletteConfig(_ref2) {
var category = _ref2.category,
label = _ref2.label,
_ref2$config = _ref2.config,
type = _ref2$config.type,
value = _ref2$config.value,
options = _ref2$config.options,
_onChange = _ref2.onChange;
return _react["default"].createElement(StyledPaletteConfig, {
className: "color-palette__config",
onClick: function onClick(e) {
return e.stopPropagation();
}
}, _react["default"].createElement("div", {
className: "color-palette__config__label"
}, _react["default"].createElement(_styledComponents2.PanelLabel, null, label)), type === 'select' && _react["default"].createElement("div", {
className: "color-palette__config__select"
}, _react["default"].createElement(_itemSelector["default"], {
selectedItems: value,
options: options,
multiSelect: false,
searchable: false,
onChange: _onChange
})), type === 'slider' && _react["default"].createElement("div", {
className: "color-palette__config__slider"
}, _react["default"].createElement("div", {
className: "color-palette__config__slider__slider"
}, _react["default"].createElement(_rangeSlider["default"], {
range: options,
value0: options[0],
value1: value,
step: 1,
isRanged: false,
showInput: false,
onChange: function onChange(val) {
return _onChange(val[1]);
}
})), _react["default"].createElement("div", {
className: "color-palette__config__slider__number"
}, value)), type === 'switch' && _react["default"].createElement(_switch["default"], {
checked: value,
id: "".concat(category, "-").concat(label, "-toggle"),
onChange: function onChange() {
return _onChange(!value);
},
secondary: true
}));
};
var StyledColorRange = _styledComponents["default"].div(_templateObject4(), function (props) {
return props.theme.panelBackgroundHover;
});
var ColorPaletteGroup = function ColorPaletteGroup(_ref3) {
var _ref3$config = _ref3.config,
config = _ref3$config === void 0 ? {} : _ref3$config,
onSelect = _ref3.onSelect,
selected = _ref3.selected,
colorRanges = _ref3.colorRanges;
var steps = config.steps,
reversed = config.reversed,
type = config.type;
var filtered = colorRanges.filter(function (colorRange) {
var isType = !type || type.value === 'all' || type.value === colorRange.type;
var isStep = !steps || Number(steps.value) === colorRange.colors.length;
return isType && isStep;
});
var isReversed = Boolean(reversed && reversed.value);
return _react["default"].createElement("div", {
className: "color-palette__group"
}, filtered.map(function (colorRange) {
return _react["default"].createElement(StyledColorRange, {
className: "color-ranges",
key: colorRange.name,
onClick: function onClick(e) {
return onSelect(_objectSpread({}, colorRange, {
reversed: isReversed,
colors: isReversed ? colorRange.colors.slice().reverse() : colorRange.colors
}), e);
}
}, _react["default"].createElement(_colorPalette["default"], {
colors: colorRange.colors,
isReversed: isReversed,
isSelected: colorRange.name === selected.name && isReversed === Boolean(selected.reversed)
}));
}));
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJjb25jYXQiLCJBTExfU1RFUFMiLCJkIiwiY29sb3JzIiwibGVuZ3RoIiwic29ydCIsIm51bWJlclNvcnQiLCJTdHlsZWRDb2xvckNvbmZpZyIsInN0eWxlZCIsImRpdiIsIkNvbG9yUmFuZ2VTZWxlY3RvciIsIkNvbG9yUmFuZ2VTZWxlY3QiLCJjb25maWciLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzdGVwcyIsInJldmVyc2VkIiwia2V5IiwiY3VycmVudFZhbHVlIiwic3RhdGUiLCJzZXRTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJfdXBkYXRlQ29uZmlnIiwicHJvcHMiLCJjb2xvclJhbmdlcyIsIm9uU2VsZWN0Q29sb3JSYW5nZSIsInNlbGVjdGVkQ29sb3JSYW5nZSIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJhbnkiLCJvYmplY3QiLCJmdW5jIiwiaXNSZXF1aXJlZCIsIlN0eWxlZFBhbGV0dGVDb25maWciLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiUGFsZXR0ZUNvbmZpZyIsImNhdGVnb3J5IiwibGFiZWwiLCJvbkNoYW5nZSIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJ2YWwiLCJTdHlsZWRDb2xvclJhbmdlIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJDb2xvclBhbGV0dGVHcm91cCIsIm9uU2VsZWN0Iiwic2VsZWN0ZWQiLCJmaWx0ZXJlZCIsImZpbHRlciIsImNvbG9yUmFuZ2UiLCJpc1R5cGUiLCJpc1N0ZXAiLCJOdW1iZXIiLCJpc1JldmVyc2VkIiwiQm9vbGVhbiIsIm5hbWUiLCJzbGljZSIsInJldmVyc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9C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Q3RCLGdDQUFDLGdCQUFEO0FBQ0UsTUFBQSxTQUFTLEVBQUMsY0FEWjtBQUVFLE1BQUEsR0FBRyxFQUFFQSxVQUFVLENBQUNNLElBRmxCO0FBR0UsTUFBQSxPQUFPLEVBQUUsaUJBQUFoQixDQUFDO0FBQUEsZUFDUk0sUUFBUSxtQkFFREksVUFGQztBQUdKcEMsVUFBQUEsUUFBUSxFQUFFd0MsVUFITjtBQUlKckQsVUFBQUEsTUFBTSxFQUFFcUQsVUFBVSxHQUNkSixVQUFVLENBQUNqRCxNQUFYLENBQWtCd0QsS0FBbEIsR0FBMEJDLE9BQTFCLEVBRGMsR0FFZFIsVUFBVSxDQUFDakQ7QUFOWCxZQVFOdUMsQ0FSTSxDQURBO0FBQUE7QUFIWixPQWdCRSxnQ0FBQyx3QkFBRDtBQUNFLE1BQUEsTUFBTSxFQUFFVSxVQUFVLENBQUNqRCxNQURyQjtBQUVFLE1BQUEsVUFBVSxFQUFFcUQsVUFGZDtBQUdFLE1BQUEsVUFBVSxFQUNSSixVQUFVLENBQUNNLElBQVgsS0FBb0JULFFBQVEsQ0FBQ1MsSUFBN0IsSUFDQUYsVUFBVSxLQUFLQyxPQUFPLENBQUNSLFFBQVEsQ0FBQ2pDLFFBQVY7QUFMMUIsTUFoQkYsQ0FEc0I7QUFBQSxHQUF2QixDQURILENBREY7QUErQkQsQ0E1Q0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBJdGVtU2VsZWN0b3IgZnJvbSAnY29tcG9uZW50cy9jb21tb24vaXRlbS1zZWxlY3Rvci9pdGVtLXNlbGVjdG9yJztcbmltcG9ydCB7UGFuZWxMYWJlbH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFJhbmdlU2xpZGVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3JhbmdlLXNsaWRlcic7XG5pbXBvcnQgU3dpdGNoIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N3aXRjaCc7XG5pbXBvcnQgQ29sb3JQYWxldHRlIGZyb20gJy4vY29sb3ItcGFsZXR0ZSc7XG5cbmltcG9ydCB7Q09MT1JfUkFOR0VTfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7bnVtYmVyU29ydH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5cbmNvbnN0IEFMTF9UWVBFUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChjID0+IGMudHlwZSkuY29uY2F0KFsnYWxsJ10pKTtcbmNvbnN0IEFMTF9TVEVQUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChkID0+IGQuY29sb3JzLmxlbmd0aCkpLnNvcnQobnVtYmVyU29ydCk7XG5cbmNvbnN0IFN0eWxlZENvbG9yQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMTJweCAxMnB4IDAgMTJweDtcbmA7XG5cbmNvbnN0IENvbG9yUmFuZ2VTZWxlY3RvciA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuYDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yUmFuZ2VTZWxlY3QgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNvbG9yUmFuZ2VzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBzZWxlY3RlZENvbG9yUmFuZ2U6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgb25TZWxlY3RDb2xvclJhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjb2xvclJhbmdlczogQ09MT1JfUkFOR0VTLFxuICAgIG9uU2VsZWN0Q29sb3JSYW5nZTogKCkgPT4ge31cbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBjb25maWc6IHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIHZhbHVlOiAnYWxsJyxcbiAgICAgICAgb3B0aW9uczogQUxMX1RZUEVTXG4gICAgICB9LFxuICAgICAgc3RlcHM6IHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIHZhbHVlOiA2LFxuICAgICAgICBvcHRpb25zOiBBTExfU1RFUFNcbiAgICAgIH0sXG4gICAgICByZXZlcnNlZDoge1xuICAgICAgICB0eXBlOiAnc3dpdGNoJyxcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbdHJ1ZSwgZmFsc2VdXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF91cGRhdGVDb25maWcgPSAoe2tleSwgdmFsdWV9KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zdGF0ZS5jb25maWdba2V5XS52YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGUuY29uZmlnLFxuICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbmZpZ1trZXldLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiAoXG4gICAgICA8Q29sb3JSYW5nZVNlbGVjdG9yIGNsYXNzTmFtZT1cImNvbG9yLXJhbmdlLXNlbGVjdG9yXCI+XG4gICAgICAgIDxTdHlsZWRDb2xvckNvbmZpZz5cbiAgICAgICAgICB7T2JqZWN0LmtleXMoY29uZmlnKS5tYXAoa2V5ID0+IChcbiAgICAgICAgICAgIDxQYWxldHRlQ29uZmlnXG4gICAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgICBsYWJlbD17a2V5fVxuICAgICAgICAgICAgICBjb25maWc9e2NvbmZpZ1trZXldfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dmFsdWUgPT4gdGhpcy5fdXBkYXRlQ29uZmlnKHtrZXksIHZhbHVlfSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L1N0eWxlZENvbG9yQ29uZmlnPlxuICAgICAgICA8Q29sb3JQYWxldHRlR3JvdXBcbiAgICAgICAgICBjb25maWc9e2NvbmZpZ31cbiAgICAgICAgICBjb2xvclJhbmdlcz17dGhpcy5wcm9wcy5jb2xvclJhbmdlc31cbiAgICAgICAgICBvblNlbGVjdD17dGhpcy5wcm9wcy5vblNlbGVjdENvbG9yUmFuZ2V9XG4gICAgICAgICAgc2VsZWN0ZWQ9e3RoaXMucHJvcHMuc2VsZWN0ZWRDb2xvclJhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9Db2xvclJhbmdlU2VsZWN0b3I+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBTdHlsZWRQYWxldHRlQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5jb2xvci1wYWxldHRlX19jb25maWdfX2xhYmVsIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0IHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLml0ZW0tc2VsZWN0b3IgLml0ZW0tc2VsZWN0b3JfX2Ryb3Bkb3duIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNlY29uZGFyeUlucHV0fTtcbiAgfVxuYDtcblxuY29uc3QgUGFsZXR0ZUNvbmZpZyA9ICh7XG4gIGNhdGVnb3J5LFxuICBsYWJlbCxcbiAgY29uZmlnOiB7dHlwZSwgdmFsdWUsIG9wdGlvbnN9LFxuICBvbkNoYW5nZVxufSkgPT4gKFxuICA8U3R5bGVkUGFsZXR0ZUNvbmZpZ1xuICAgIGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ1wiXG4gICAgb25DbGljaz17ZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICA+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX2xhYmVsXCI+XG4gICAgICA8UGFuZWxMYWJlbD57bGFiZWx9PC9QYW5lbExhYmVsPlxuICAgIDwvZGl2PlxuICAgIHt0eXBlID09PSAnc2VsZWN0JyAmJiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0XCI+XG4gICAgICAgIDxJdGVtU2VsZWN0b3JcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zPXt2YWx1ZX1cbiAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApfVxuICAgIHt0eXBlID09PSAnc2xpZGVyJyAmJiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2xpZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19zbGlkZXJfX3NsaWRlclwiPlxuICAgICAgICAgIDxSYW5nZVNsaWRlclxuICAgICAgICAgICAgcmFuZ2U9e29wdGlvbnN9XG4gICAgICAgICAgICB2YWx1ZTA9e29wdGlvbnNbMF19XG4gICAgICAgICAgICB2YWx1ZTE9e3ZhbHVlfVxuICAgICAgICAgICAgc3RlcD17MX1cbiAgICAgICAgICAgIGlzUmFuZ2VkPXtmYWxzZX1cbiAgICAgICAgICAgIHNob3dJbnB1dD17ZmFsc2V9XG4gICAgICAgICAgICBvbkNoYW5nZT17dmFsID0+IG9uQ2hhbmdlKHZhbFsxXSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19zbGlkZXJfX251bWJlclwiPnt2YWx1ZX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICl9XG4gICAge3R5cGUgPT09ICdzd2l0Y2gnICYmIChcbiAgICAgIDxTd2l0Y2hcbiAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgIGlkPXtgJHtjYXRlZ29yeX0tJHtsYWJlbH0tdG9nZ2xlYH1cbiAgICAgICAgb25DaGFuZ2U9eygpID0+IG9uQ2hhbmdlKCF2YWx1ZSl9XG4gICAgICAgIHNlY29uZGFyeVxuICAgICAgLz5cbiAgICApfVxuICA8L1N0eWxlZFBhbGV0dGVDb25maWc+XG4pO1xuXG5jb25zdCBTdHlsZWRDb2xvclJhbmdlID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMCA4cHg7XG4gIDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5gO1xuXG5jb25zdCBDb2xvclBhbGV0dGVHcm91cCA9ICh7Y29uZmlnID0ge30sIG9uU2VsZWN0LCBzZWxlY3RlZCwgY29sb3JSYW5nZXN9KSA9PiB7XG4gIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWQsIHR5cGV9ID0gY29uZmlnO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gY29sb3JSYW5nZXMuZmlsdGVyKGNvbG9yUmFuZ2UgPT4ge1xuICAgIGNvbnN0IGlzVHlwZSA9XG4gICAgICAhdHlwZSB8fCB0eXBlLnZhbHVlID09PSAnYWxsJyB8fCB0eXBlLnZhbHVlID09PSBjb2xvclJhbmdlLnR5cGU7XG4gICAgY29uc3QgaXNTdGVwID0gIXN0ZXBzIHx8IE51bWJlcihzdGVwcy52YWx1ZSkgPT09IGNvbG9yUmFuZ2UuY29sb3JzLmxlbmd0aDtcblxuICAgIHJldHVybiBpc1R5cGUgJiYgaXNTdGVwO1xuICB9KTtcblxuICBjb25zdCBpc1JldmVyc2VkID0gQm9vbGVhbihyZXZlcnNlZCAmJiByZXZlcnNlZC52YWx1ZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2dyb3VwXCI+XG4gICAgICB7ZmlsdGVyZWQubWFwKGNvbG9yUmFuZ2UgPT4gKFxuICAgICAgICA8U3R5bGVkQ29sb3JSYW5nZVxuICAgICAgICAgIGNsYXNzTmFtZT1cImNvbG9yLXJhbmdlc1wiXG4gICAgICAgICAga2V5PXtjb2xvclJhbmdlLm5hbWV9XG4gICAgICAgICAgb25DbGljaz17ZSA9PlxuICAgICAgICAgICAgb25TZWxlY3QoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5jb2xvclJhbmdlLFxuICAgICAgICAgICAgICAgIHJldmVyc2VkOiBpc1JldmVyc2VkLFxuICAgICAgICAgICAgICAgIGNvbG9yczogaXNSZXZlcnNlZFxuICAgICAgICAgICAgICAgICAgPyBjb2xvclJhbmdlLmNvbG9ycy5zbGljZSgpLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgICAgOiBjb2xvclJhbmdlLmNvbG9yc1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAgPENvbG9yUGFsZXR0ZVxuICAgICAgICAgICAgY29sb3JzPXtjb2xvclJhbmdlLmNvbG9yc31cbiAgICAgICAgICAgIGlzUmV2ZXJzZWQ9e2lzUmV2ZXJzZWR9XG4gICAgICAgICAgICBpc1NlbGVjdGVkPXtcbiAgICAgICAgICAgICAgY29sb3JSYW5nZS5uYW1lID09PSBzZWxlY3RlZC5uYW1lICYmXG4gICAgICAgICAgICAgIGlzUmV2ZXJzZWQgPT09IEJvb2xlYW4oc2VsZWN0ZWQucmV2ZXJzZWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdHlsZWRDb2xvclJhbmdlPlxuICAgICAgKSl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIl19