kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
325 lines (267 loc) • 27.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends3 = require('babel-runtime/helpers/extends');
var _extends4 = _interopRequireDefault(_extends3);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _class, _temp2;
var _templateObject = (0, _taggedTemplateLiteral3.default)(['\n padding: 12px 12px 0 12px;\n'], ['\n padding: 12px 12px 0 12px;\n']),
_templateObject2 = (0, _taggedTemplateLiteral3.default)(['\n padding-bottom: 12px;\n'], ['\n padding-bottom: 12px;\n']),
_templateObject3 = (0, _taggedTemplateLiteral3.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'], ['\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']),
_templateObject4 = (0, _taggedTemplateLiteral3.default)(['\n padding: 0 8px;\n :hover {\n background-color: ', ';\n cursor: pointer;\n }\n'], ['\n padding: 0 8px;\n :hover {\n background-color: ', ';\n cursor: pointer;\n }\n']); // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _lodash = require('lodash.uniq');
var _lodash2 = _interopRequireDefault(_lodash);
var _styledComponents = require('styled-components');
var _styledComponents2 = _interopRequireDefault(_styledComponents);
var _itemSelector = require('../../common/item-selector/item-selector');
var _itemSelector2 = _interopRequireDefault(_itemSelector);
var _styledComponents3 = require('../../common/styled-components');
var _rangeSlider = require('../../common/range-slider');
var _rangeSlider2 = _interopRequireDefault(_rangeSlider);
var _switch = require('../../common/switch');
var _switch2 = _interopRequireDefault(_switch);
var _colorPalette = require('./color-palette');
var _colorPalette2 = _interopRequireDefault(_colorPalette);
var _colorRanges = require('../../../constants/color-ranges');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ALL_TYPES = (0, _lodash2.default)(_colorRanges.COLOR_RANGES.map(function (c) {
return c.type;
}).concat(['all']));
var ALL_STEPS = (0, _lodash2.default)(_colorRanges.COLOR_RANGES.map(function (d) {
return d.colors.length;
}));
var StyledColorConfig = _styledComponents2.default.div(_templateObject);
var ColorRangeSelector = _styledComponents2.default.div(_templateObject2);
var ColorRangeSelect = (_temp2 = _class = function (_Component) {
(0, _inherits3.default)(ColorRangeSelect, _Component);
function ColorRangeSelect() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, ColorRangeSelect);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = ColorRangeSelect.__proto__ || Object.getPrototypeOf(ColorRangeSelect)).call.apply(_ref, [this].concat(args))), _this), _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]
}
}
}, _this._updateConfig = function (_ref2) {
var key = _ref2.key,
value = _ref2.value;
var currentValue = _this.state.config[key].value;
if (value !== currentValue) {
_this.setState({
config: (0, _extends4.default)({}, _this.state.config, (0, _defineProperty3.default)({}, key, (0, _extends4.default)({}, _this.state.config[key], {
value: value
})))
});
}
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(ColorRangeSelect, [{
key: 'render',
value: function render() {
var _this2 = this;
var config = this.state.config;
return _react2.default.createElement(
ColorRangeSelector,
{ className: 'color-range-selector' },
_react2.default.createElement(
StyledColorConfig,
null,
Object.keys(config).map(function (key) {
return _react2.default.createElement(PaletteConfig, {
key: key,
label: key,
config: config[key],
onChange: function onChange(value) {
return _this2._updateConfig({ key: key, value: value });
}
});
})
),
_react2.default.createElement(ColorPaletteGroup, {
config: config,
colorRanges: this.props.colorRanges,
onSelect: this.props.onSelectColorRange,
selected: this.props.selectedColorRange
})
);
}
}]);
return ColorRangeSelect;
}(_react.Component), _class.propTypes = {
colorRanges: _propTypes2.default.arrayOf(_propTypes2.default.any),
selectedColorRange: _propTypes2.default.object,
onSelectColorRange: _propTypes2.default.func.isRequired
}, _class.defaultProps = {
colorRanges: _colorRanges.COLOR_RANGES,
onSelectColorRange: function onSelectColorRange() {}
}, _temp2);
exports.default = ColorRangeSelect;
var StyledPaletteConfig = _styledComponents2.default.div(_templateObject3, function (props) {
return props.theme.secondaryInput;
});
var PaletteConfig = function PaletteConfig(_ref3) {
var category = _ref3.category,
label = _ref3.label,
_ref3$config = _ref3.config,
type = _ref3$config.type,
value = _ref3$config.value,
options = _ref3$config.options,
_onChange = _ref3.onChange;
return _react2.default.createElement(
StyledPaletteConfig,
{
className: 'color-palette__config',
onClick: function onClick(e) {
return e.stopPropagation();
}
},
_react2.default.createElement(
'div',
{ className: 'color-palette__config__label' },
_react2.default.createElement(
_styledComponents3.PanelLabel,
null,
label
)
),
type === 'select' && _react2.default.createElement(
'div',
{ className: 'color-palette__config__select' },
_react2.default.createElement(_itemSelector2.default, {
selectedItems: value,
options: options,
multiSelect: false,
searchable: false,
onChange: _onChange
})
),
type === 'slider' && _react2.default.createElement(
'div',
{ className: 'color-palette__config__slider' },
_react2.default.createElement(
'div',
{ className: 'color-palette__config__slider__slider' },
_react2.default.createElement(_rangeSlider2.default, {
range: options,
value0: options[0],
value1: value,
step: 1,
isRanged: false,
showInput: false,
onChange: function onChange(val) {
return _onChange(val[1]);
}
})
),
_react2.default.createElement(
'div',
{ className: 'color-palette__config__slider__number' },
value
)
),
type === 'switch' && _react2.default.createElement(_switch2.default, {
checked: value,
id: category + '-' + label + '-toggle',
onChange: function onChange() {
return _onChange(!value);
},
secondary: true
})
);
};
var StyledColorRange = _styledComponents2.default.div(_templateObject4, function (props) {
return props.theme.panelBackgroundHover;
});
var ColorPaletteGroup = function ColorPaletteGroup(_ref4) {
var _ref4$config = _ref4.config,
config = _ref4$config === undefined ? {} : _ref4$config,
onSelect = _ref4.onSelect,
selected = _ref4.selected,
colorRanges = _ref4.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 _react2.default.createElement(
'div',
{ className: 'color-palette__group' },
filtered.map(function (colorRange) {
return _react2.default.createElement(
StyledColorRange,
{
className: 'color-ranges',
key: colorRange.name,
onClick: function onClick(e) {
return onSelect((0, _extends4.default)({}, colorRange, {
reversed: isReversed,
colors: isReversed ? colorRange.colors.slice().reverse() : colorRange.colors
}), e);
}
},
_react2.default.createElement(_colorPalette2.default, {
colors: colorRange.colors,
isReversed: isReversed,
isSelected: colorRange.name === selected.name && isReversed === Boolean(selected.reversed)
})
);
})
);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJjb25jYXQiLCJBTExfU1RFUFMiLCJkIiwiY29sb3JzIiwibGVuZ3RoIiwiU3R5bGVkQ29sb3JDb25maWciLCJzdHlsZWQiLCJkaXYiLCJDb2xvclJhbmdlU2VsZWN0b3IiLCJDb2xvclJhbmdlU2VsZWN0Iiwic3RhdGUiLCJjb25maWciLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzdGVwcyIsInJldmVyc2VkIiwiX3VwZGF0ZUNvbmZpZyIsImtleSIsImN1cnJlbnRWYWx1ZSIsInNldFN0YXRlIiwiT2JqZWN0Iiwia2V5cyIsInByb3BzIiwiY29sb3JSYW5nZXMiLCJvblNlbGVjdENvbG9yUmFuZ2UiLCJzZWxlY3RlZENvbG9yUmFuZ2UiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwiYW55Iiwib2JqZWN0IiwiZnVuYyIsImlzUmVxdWlyZWQiLCJkZWZhdWx0UHJvcHMiLCJTdHlsZWRQYWxldHRlQ29uZmlnIiwidGhlbWUiLCJzZWNvbmRhcnlJbnB1dCIsIlBhbGV0dGVDb25maWciLCJjYXRlZ29yeSIsImxhYmVsIiwib25DaGFuZ2UiLCJlIiwic3RvcFByb3BhZ2F0aW9uIiwidmFsIiwiU3R5bGVkQ29sb3JSYW5nZSIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiQ29sb3JQYWxldHRlR3JvdXAiLCJvblNlbGVjdCIsInNlbGVjdGVkIiwiZmlsdGVyZWQiLCJmaWx0ZXIiLCJpc1R5cGUiLCJjb2xvclJhbmdlIiwiaXNTdGVwIiwiTnVtYmVyIiwiaXNSZXZlcnNlZCIsIkJvb2xlYW4iLCJuYW1lIiwic2xpY2UiLCJyZXZlcnNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFXbEQsTUFBWCxDQUFrQkMsTUFBbkU7O0FBRUEsV0FBT2dELFVBQVVFLE1BQWpCO0FBQ0QsR0FOZ0IsQ0FBakI7O0FBUUEsTUFBTUUsYUFBYUMsUUFBUTFDLFlBQVlBLFNBQVNILEtBQTdCLENBQW5COztBQUVBLFNBQ0U7QUFBQTtBQUFBLE1BQUssV0FBVSxzQkFBZjtBQUNHc0MsYUFBU3JELEdBQVQsQ0FBYTtBQUFBLGFBQ1o7QUFBQyx3QkFBRDtBQUFBO0FBQ0UscUJBQVUsY0FEWjtBQUVFLGVBQUt3RCxXQUFXSyxJQUZsQjtBQUdFLG1CQUFTO0FBQUEsbUJBQ1BWLG9DQUVPSyxVQUZQO0FBR0l0Qyx3QkFBVXlDLFVBSGQ7QUFJSXJELHNCQUFRcUQsYUFDSkgsV0FBV2xELE1BQVgsQ0FBa0J3RCxLQUFsQixHQUEwQkMsT0FBMUIsRUFESSxHQUVKUCxXQUFXbEQ7QUFObkIsZ0JBUUV1QyxDQVJGLENBRE87QUFBQTtBQUhYO0FBZ0JFLHNDQUFDLHNCQUFEO0FBQ0Usa0JBQVFXLFdBQVdsRCxNQURyQjtBQUVFLHNCQUFZcUQsVUFGZDtBQUdFLHNCQUNFSCxXQUFXSyxJQUFYLEtBQW9CVCxTQUFTUyxJQUE3QixJQUNBRixlQUFlQyxRQUFRUixTQUFTbEMsUUFBakI7QUFMbkI7QUFoQkYsT0FEWTtBQUFBLEtBQWI7QUFESCxHQURGO0FBK0JELENBNUNEIiwiZmlsZSI6ImNvbG9yLXJhbmdlLXNlbGVjdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge1BhbmVsTGFiZWx9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBSYW5nZVNsaWRlciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9yYW5nZS1zbGlkZXInO1xuaW1wb3J0IFN3aXRjaCBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zd2l0Y2gnO1xuaW1wb3J0IENvbG9yUGFsZXR0ZSBmcm9tICcuL2NvbG9yLXBhbGV0dGUnO1xuXG5pbXBvcnQge0NPTE9SX1JBTkdFU30gZnJvbSAnY29uc3RhbnRzL2NvbG9yLXJhbmdlcyc7XG5cbmNvbnN0IEFMTF9UWVBFUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChjID0+IGMudHlwZSkuY29uY2F0KFsnYWxsJ10pKTtcbmNvbnN0IEFMTF9TVEVQUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChkID0+IGQuY29sb3JzLmxlbmd0aCkpO1xuXG5jb25zdCBTdHlsZWRDb2xvckNvbmZpZyA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmc6IDEycHggMTJweCAwIDEycHg7XG5gO1xuXG5jb25zdCBDb2xvclJhbmdlU2VsZWN0b3IgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbmA7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvclJhbmdlU2VsZWN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjb2xvclJhbmdlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgc2VsZWN0ZWRDb2xvclJhbmdlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG9uU2VsZWN0Q29sb3JSYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgY29sb3JSYW5nZXM6IENPTE9SX1JBTkdFUyxcbiAgICBvblNlbGVjdENvbG9yUmFuZ2U6ICgpID0+IHt9XG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgY29uZmlnOiB7XG4gICAgICB0eXBlOiB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICB2YWx1ZTogJ2FsbCcsXG4gICAgICAgIG9wdGlvbnM6IEFMTF9UWVBFU1xuICAgICAgfSxcbiAgICAgIHN0ZXBzOiB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICB2YWx1ZTogNixcbiAgICAgICAgb3B0aW9uczogQUxMX1NURVBTXG4gICAgICB9LFxuICAgICAgcmV2ZXJzZWQ6IHtcbiAgICAgICAgdHlwZTogJ3N3aXRjaCcsXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW3RydWUsIGZhbHNlXVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfdXBkYXRlQ29uZmlnID0gKHtrZXksIHZhbHVlfSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuc3RhdGUuY29uZmlnW2tleV0udmFsdWU7XG4gICAgaWYgKHZhbHVlICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLmNvbmZpZyxcbiAgICAgICAgICBba2V5XToge1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZS5jb25maWdba2V5XSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gKFxuICAgICAgPENvbG9yUmFuZ2VTZWxlY3RvciBjbGFzc05hbWU9XCJjb2xvci1yYW5nZS1zZWxlY3RvclwiPlxuICAgICAgICA8U3R5bGVkQ29sb3JDb25maWc+XG4gICAgICAgICAge09iamVjdC5rZXlzKGNvbmZpZykubWFwKGtleSA9PiAoXG4gICAgICAgICAgICA8UGFsZXR0ZUNvbmZpZ1xuICAgICAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICAgICAgbGFiZWw9e2tleX1cbiAgICAgICAgICAgICAgY29uZmlnPXtjb25maWdba2V5XX1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e3ZhbHVlID0+IHRoaXMuX3VwZGF0ZUNvbmZpZyh7a2V5LCB2YWx1ZX0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9TdHlsZWRDb2xvckNvbmZpZz5cbiAgICAgICAgPENvbG9yUGFsZXR0ZUdyb3VwXG4gICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgY29sb3JSYW5nZXM9e3RoaXMucHJvcHMuY29sb3JSYW5nZXN9XG4gICAgICAgICAgb25TZWxlY3Q9e3RoaXMucHJvcHMub25TZWxlY3RDb2xvclJhbmdlfVxuICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLnByb3BzLnNlbGVjdGVkQ29sb3JSYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIDwvQ29sb3JSYW5nZVNlbGVjdG9yPlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgU3R5bGVkUGFsZXR0ZUNvbmZpZyA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1ib3R0b206IDhweDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbCB7XG4gICAgZmxleC1ncm93OiAxO1xuICB9XG4gIC5jb2xvci1wYWxldHRlX19jb25maWdfX3NlbGVjdCB7XG4gICAgZmxleC1ncm93OiAxO1xuICB9XG4gIC5pdGVtLXNlbGVjdG9yIC5pdGVtLXNlbGVjdG9yX19kcm9wZG93biB7XG4gICAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zZWNvbmRhcnlJbnB1dH07XG4gIH1cbmA7XG5cbmNvbnN0IFBhbGV0dGVDb25maWcgPSAoe1xuICBjYXRlZ29yeSxcbiAgbGFiZWwsXG4gIGNvbmZpZzoge3R5cGUsIHZhbHVlLCBvcHRpb25zfSxcbiAgb25DaGFuZ2Vcbn0pID0+IChcbiAgPFN0eWxlZFBhbGV0dGVDb25maWdcbiAgICBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdcIlxuICAgIG9uQ2xpY2s9e2UgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbFwiPlxuICAgICAgPFBhbmVsTGFiZWw+e2xhYmVsfTwvUGFuZWxMYWJlbD5cbiAgICA8L2Rpdj5cbiAgICB7dHlwZSA9PT0gJ3NlbGVjdCcgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX3NlbGVjdFwiPlxuICAgICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz17dmFsdWV9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgICB7dHlwZSA9PT0gJ3NsaWRlcicgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX3NsaWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2xpZGVyX19zbGlkZXJcIj5cbiAgICAgICAgICA8UmFuZ2VTbGlkZXJcbiAgICAgICAgICAgIHJhbmdlPXtvcHRpb25zfVxuICAgICAgICAgICAgdmFsdWUwPXtvcHRpb25zWzBdfVxuICAgICAgICAgICAgdmFsdWUxPXt2YWx1ZX1cbiAgICAgICAgICAgIHN0ZXA9ezF9XG4gICAgICAgICAgICBpc1JhbmdlZD17ZmFsc2V9XG4gICAgICAgICAgICBzaG93SW5wdXQ9e2ZhbHNlfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3ZhbCA9PiBvbkNoYW5nZSh2YWxbMV0pfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2xpZGVyX19udW1iZXJcIj57dmFsdWV9PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApfVxuICAgIHt0eXBlID09PSAnc3dpdGNoJyAmJiAoXG4gICAgICA8U3dpdGNoXG4gICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICBpZD17YCR7Y2F0ZWdvcnl9LSR7bGFiZWx9LXRvZ2dsZWB9XG4gICAgICAgIG9uQ2hhbmdlPXsoKSA9PiBvbkNoYW5nZSghdmFsdWUpfVxuICAgICAgICBzZWNvbmRhcnlcbiAgICAgIC8+XG4gICAgKX1cbiAgPC9TdHlsZWRQYWxldHRlQ29uZmlnPlxuKTtcblxuY29uc3QgU3R5bGVkQ29sb3JSYW5nZSA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmc6IDAgOHB4O1xuICA6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuYDtcblxuY29uc3QgQ29sb3JQYWxldHRlR3JvdXAgPSAoe2NvbmZpZyA9IHt9LCBvblNlbGVjdCwgc2VsZWN0ZWQsIGNvbG9yUmFuZ2VzfSkgPT4ge1xuICBjb25zdCB7c3RlcHMsIHJldmVyc2VkLCB0eXBlfSA9IGNvbmZpZztcblxuICBjb25zdCBmaWx0ZXJlZCA9IGNvbG9yUmFuZ2VzLmZpbHRlcihjb2xvclJhbmdlID0+IHtcbiAgICBjb25zdCBpc1R5cGUgPVxuICAgICAgIXR5cGUgfHwgdHlwZS52YWx1ZSA9PT0gJ2FsbCcgfHwgdHlwZS52YWx1ZSA9PT0gY29sb3JSYW5nZS50eXBlO1xuICAgIGNvbnN0IGlzU3RlcCA9ICFzdGVwcyB8fCBOdW1iZXIoc3RlcHMudmFsdWUpID09PSBjb2xvclJhbmdlLmNvbG9ycy5sZW5ndGg7XG5cbiAgICByZXR1cm4gaXNUeXBlICYmIGlzU3RlcDtcbiAgfSk7XG5cbiAgY29uc3QgaXNSZXZlcnNlZCA9IEJvb2xlYW4ocmV2ZXJzZWQgJiYgcmV2ZXJzZWQudmFsdWUpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19ncm91cFwiPlxuICAgICAge2ZpbHRlcmVkLm1hcChjb2xvclJhbmdlID0+IChcbiAgICAgICAgPFN0eWxlZENvbG9yUmFuZ2VcbiAgICAgICAgICBjbGFzc05hbWU9XCJjb2xvci1yYW5nZXNcIlxuICAgICAgICAgIGtleT17Y29sb3JSYW5nZS5uYW1lfVxuICAgICAgICAgIG9uQ2xpY2s9e2UgPT5cbiAgICAgICAgICAgIG9uU2VsZWN0KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgICAgICAgICAgICByZXZlcnNlZDogaXNSZXZlcnNlZCxcbiAgICAgICAgICAgICAgICBjb2xvcnM6IGlzUmV2ZXJzZWRcbiAgICAgICAgICAgICAgICAgID8gY29sb3JSYW5nZS5jb2xvcnMuc2xpY2UoKS5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAgIDogY29sb3JSYW5nZS5jb2xvcnNcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIDxDb2xvclBhbGV0dGVcbiAgICAgICAgICAgIGNvbG9ycz17Y29sb3JSYW5nZS5jb2xvcnN9XG4gICAgICAgICAgICBpc1JldmVyc2VkPXtpc1JldmVyc2VkfVxuICAgICAgICAgICAgaXNTZWxlY3RlZD17XG4gICAgICAgICAgICAgIGNvbG9yUmFuZ2UubmFtZSA9PT0gc2VsZWN0ZWQubmFtZSAmJlxuICAgICAgICAgICAgICBpc1JldmVyc2VkID09PSBCb29sZWFuKHNlbGVjdGVkLnJldmVyc2VkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkQ29sb3JSYW5nZT5cbiAgICAgICkpfVxuICAgIDwvZGl2PlxuICApO1xufTtcbiJdfQ==