kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
243 lines (242 loc) • 40.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.PaletteConfig = exports.ColorPaletteItem = exports.ALL_TYPES = void 0;
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 _constants = require("@kepler.gl/constants");
var _localization = require("@kepler.gl/localization");
var _utils = require("@kepler.gl/utils");
var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector"));
var _styledComponents2 = require("../../common/styled-components");
var _switch = _interopRequireDefault(require("../../common/switch"));
var _colorPalette = _interopRequireDefault(require("./color-palette"));
var _customPalette = _interopRequireDefault(require("./custom-palette"));
var _d3Array = require("d3-array");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
// @ts-ignore cant concat 'all' to PALETTE_TYPES values
var ALL_TYPES = exports.ALL_TYPES = Object.values(_constants.PALETTE_TYPES).concat(['all']);
var MAX_STEPS = 20;
var ALL_STEPS = (0, _d3Array.range)(2, MAX_STEPS + 1, 1);
var StyledColorConfig = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px 12px 0 12px;\n"])));
var StyledColorRangeSelector = _styledComponents["default"].div.attrs({
className: 'color-range-selector'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding-bottom: 12px;\n"])));
var StyledColorPalette = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px 8px 8px;\n"])));
var StyledPaletteConfig = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .color-palette__config__select {\n width: 40%;\n display: flex;\n flex-direction: row-reverse;\n\n .item-selector {\n width: 100%;\n }\n }\n"])));
var CONFIG_SETTINGS = {
type: {
type: 'select',
options: ALL_TYPES
},
steps: {
type: 'select',
options: ALL_STEPS,
disabled: function disabled(colorRange) {
return (0, _utils.hasColorMap)(colorRange);
},
reason: 'color.disableStepReason'
},
reversed: {
type: 'switch',
options: [true, false]
},
colorBlindSafe: {
type: 'switch',
options: [true, false]
},
custom: {
label: 'customPalette',
type: 'switch',
options: [true, false]
}
};
var displayOption = function displayOption(d) {
return (0, _utils.capitalizeFirstLetter)(d);
};
var getOptionValue = function getOptionValue(d) {
return d;
};
var noop = function noop() {
// do nothing
};
ColorRangeSelectorFactory.deps = [_customPalette["default"]];
function ColorRangeSelectorFactory(CustomPalette) {
var ColorRangeSelector = function ColorRangeSelector(_ref) {
var _ref$colorPalettes = _ref.colorPalettes,
colorPalettes = _ref$colorPalettes === void 0 ? _constants.KEPLER_COLOR_PALETTES : _ref$colorPalettes,
colorPaletteUI = _ref.colorPaletteUI,
_ref$setColorPaletteU = _ref.setColorPaletteUI,
setColorPaletteUI = _ref$setColorPaletteU === void 0 ? noop : _ref$setColorPaletteU,
_ref$onSelectColorRan = _ref.onSelectColorRange,
onSelectColorRange = _ref$onSelectColorRan === void 0 ? noop : _ref$onSelectColorRan,
selectedColorRange = _ref.selectedColorRange;
var customPalette = colorPaletteUI.customPalette,
showSketcher = colorPaletteUI.showSketcher,
colorRangeConfig = colorPaletteUI.colorRangeConfig;
var type = colorRangeConfig.type,
steps = colorRangeConfig.steps,
colorBlindSafe = colorRangeConfig.colorBlindSafe,
reversed = colorRangeConfig.reversed;
var filteredColorPalettes = (0, _react.useMemo)(function () {
var _colorPalettes$filter;
return (_colorPalettes$filter = colorPalettes === null || colorPalettes === void 0 ? void 0 : colorPalettes.filter(function (palette) {
return (0, _utils.paletteIsType)(palette, type) && (0, _utils.paletteIsSteps)(palette, steps) && (0, _utils.paletteIsColorBlindSafe)(palette, colorBlindSafe);
})) !== null && _colorPalettes$filter !== void 0 ? _colorPalettes$filter : [];
}, [colorPalettes, colorBlindSafe, steps, type]);
var _updateConfig = (0, _react.useCallback)(function (_ref2) {
var key = _ref2.key,
value = _ref2.value;
setColorPaletteUI({
colorRangeConfig: (0, _defineProperty2["default"])({}, key, value)
});
}, [setColorPaletteUI]);
var _onCustomPaletteCancel = (0, _react.useCallback)(function () {
setColorPaletteUI({
showSketcher: false,
colorRangeConfig: {
custom: false
}
});
}, [setColorPaletteUI]);
var _onApply = (0, _react.useCallback)(function (e) {
return onSelectColorRange(customPalette, e);
}, [customPalette, onSelectColorRange]);
var _onSelectPalette = (0, _react.useCallback)(function (colorPalette, e) {
var newColorRange = (0, _utils.updateColorRangeBySelectedPalette)(selectedColorRange, colorPalette, {
steps: steps,
reversed: reversed
});
onSelectColorRange(newColorRange, e);
}, [selectedColorRange, reversed, steps, onSelectColorRange]);
return /*#__PURE__*/_react["default"].createElement(StyledColorRangeSelector, null, /*#__PURE__*/_react["default"].createElement(StyledColorConfig, null, (colorRangeConfig.custom ? ['custom'] : Object.keys(colorRangeConfig)).map(function (key) {
return CONFIG_SETTINGS[key] ? /*#__PURE__*/_react["default"].createElement(PaletteConfig, {
key: key,
prop: key,
label: CONFIG_SETTINGS[key].label || key,
config: CONFIG_SETTINGS[key],
value: colorRangeConfig[key],
onChange: _updateConfig,
disabled: CONFIG_SETTINGS[key].disabled ? CONFIG_SETTINGS[key].disabled(selectedColorRange) : false,
reason: CONFIG_SETTINGS[key].reason
}) : null;
})), colorRangeConfig.custom ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledColorPalette, null, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
colors: customPalette.colors
})), /*#__PURE__*/_react["default"].createElement(CustomPalette, {
customPalette: customPalette,
showSketcher: showSketcher,
onApply: _onApply,
setColorPaletteUI: setColorPaletteUI,
onCancel: _onCustomPaletteCancel
})) : /*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__group"
}, filteredColorPalettes.map(function (colorPalette, i) {
return /*#__PURE__*/_react["default"].createElement(ColorPaletteItem, {
key: "".concat(colorPalette.name, "-").concat(i),
colorPalette: colorPalette,
selectedColorRange: selectedColorRange,
onSelect: _onSelectPalette,
reversed: reversed,
steps: steps
});
})));
};
return ColorRangeSelector;
}
var PaletteConfig = exports.PaletteConfig = function PaletteConfig(_ref3) {
var prop = _ref3.prop,
label = _ref3.label,
value = _ref3.value,
_ref3$config = _ref3.config,
type = _ref3$config.type,
options = _ref3$config.options,
onChange = _ref3.onChange,
disabled = _ref3.disabled,
reason = _ref3.reason;
var updateSelect = (0, _react.useCallback)(function (val) {
return onChange({
key: prop,
value: val
});
}, [onChange, prop]);
var updateSwitch = (0, _react.useCallback)(function () {
return onChange({
key: prop,
value: !value
});
}, [onChange, prop, value]);
return /*#__PURE__*/_react["default"].createElement(StyledPaletteConfig, {
className: "color-palette__config",
onClick: function onClick(e) {
return e.stopPropagation();
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__config__label"
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "color.".concat(label)
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: "color-palette__config__select",
"data-tip": true,
"data-for": "color-range-config-".concat(prop)
}, type === 'select' && /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
selectedItems: value,
options: options,
multiSelect: false,
searchable: false,
onChange: updateSelect,
disabled: disabled,
inputTheme: "secondary",
displayOption: displayOption,
getOptionValue: getOptionValue
}), type === 'switch' && /*#__PURE__*/_react["default"].createElement(_switch["default"], {
checked: Boolean(value),
id: "".concat(label, "-toggle"),
onChange: updateSwitch,
disabled: disabled,
secondary: true
}), disabled && reason ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
id: "color-range-config-".concat(prop),
place: "right"
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
maxWidth: '214px'
}
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: reason
}))) : null));
};
var StyledColorRange = _styledComponents["default"].div.attrs({
className: 'color-palette-outer'
})(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px;\n &:hover {\n background-color: ", ";\n cursor: pointer;\n }\n"])), function (props) {
return props.theme.panelBackgroundHover;
});
var ColorPaletteItem = exports.ColorPaletteItem = function ColorPaletteItem(_ref4) {
var colorPalette = _ref4.colorPalette,
steps = _ref4.steps,
selectedColorRange = _ref4.selectedColorRange,
onSelect = _ref4.onSelect,
reversed = _ref4.reversed;
var colors = (0, _react.useMemo)(function () {
return colorPalette.colors(steps);
}, [colorPalette, steps]);
var onClick = (0, _react.useCallback)(function (e) {
return onSelect(colorPalette, e);
}, [colorPalette, onSelect]);
return /*#__PURE__*/_react["default"].createElement(StyledColorRange, {
onClick: onClick
}, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
colors: colors,
isReversed: reversed,
isSelected: colorPalette.name === selectedColorRange.name
}));
};
var _default = exports["default"] = ColorRangeSelectorFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29uc3RhbnRzIiwiX2xvY2FsaXphdGlvbiIsIl91dGlscyIsIl9pdGVtU2VsZWN0b3IiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfc3dpdGNoIiwiX2NvbG9yUGFsZXR0ZSIsIl9jdXN0b21QYWxldHRlIiwiX2QzQXJyYXkiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQUxMX1RZUEVTIiwiZXhwb3J0cyIsInZhbHVlcyIsIlBBTEVUVEVfVFlQRVMiLCJjb25jYXQiLCJNQVhfU1RFUFMiLCJBTExfU1RFUFMiLCJyYW5nZSIsIlN0eWxlZENvbG9yQ29uZmlnIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTdHlsZWRDb2xvclJhbmdlU2VsZWN0b3IiLCJhdHRycyIsImNsYXNzTmFtZSIsIlN0eWxlZENvbG9yUGFsZXR0ZSIsIlN0eWxlZFBhbGV0dGVDb25maWciLCJDT05GSUdfU0VUVElOR1MiLCJ0eXBlIiwib3B0aW9ucyIsInN0ZXBzIiwiZGlzYWJsZWQiLCJjb2xvclJhbmdlIiwiaGFzQ29sb3JNYXAiLCJyZWFzb24iLCJyZXZlcnNlZCIsImNvbG9yQmxpbmRTYWZlIiwiY3VzdG9tIiwibGFiZWwiLCJkaXNwbGF5T3B0aW9uIiwiZCIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImdldE9wdGlvblZhbHVlIiwibm9vcCIsIkNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnkiLCJkZXBzIiwiQ3VzdG9tUGFsZXR0ZUZhY3RvcnkiLCJDdXN0b21QYWxldHRlIiwiQ29sb3JSYW5nZVNlbGVjdG9yIiwiX3JlZiIsIl9yZWYkY29sb3JQYWxldHRlcyIsImNvbG9yUGFsZXR0ZXMiLCJLRVBMRVJfQ09MT1JfUEFMRVRURVMiLCJjb2xvclBhbGV0dGVVSSIsIl9yZWYkc2V0Q29sb3JQYWxldHRlVSIsInNldENvbG9yUGFsZXR0ZVVJIiwiX3JlZiRvblNlbGVjdENvbG9yUmFuIiwib25TZWxlY3RDb2xvclJhbmdlIiwic2VsZWN0ZWRDb2xvclJhbmdlIiwiY3VzdG9tUGFsZXR0ZSIsInNob3dTa2V0Y2hlciIsImNvbG9yUmFuZ2VDb25maWciLCJmaWx0ZXJlZENvbG9yUGFsZXR0ZXMiLCJ1c2VNZW1vIiwiX2NvbG9yUGFsZXR0ZXMkZmlsdGVyIiwiZmlsdGVyIiwicGFsZXR0ZSIsInBhbGV0dGVJc1R5cGUiLCJwYWxldHRlSXNTdGVwcyIsInBhbGV0dGVJc0NvbG9yQmxpbmRTYWZlIiwiX3VwZGF0ZUNvbmZpZyIsInVzZUNhbGxiYWNrIiwiX3JlZjIiLCJrZXkiLCJ2YWx1ZSIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJfb25DdXN0b21QYWxldHRlQ2FuY2VsIiwiX29uQXBwbHkiLCJfb25TZWxlY3RQYWxldHRlIiwiY29sb3JQYWxldHRlIiwibmV3Q29sb3JSYW5nZSIsInVwZGF0ZUNvbG9yUmFuZ2VCeVNlbGVjdGVkUGFsZXR0ZSIsImNyZWF0ZUVsZW1lbnQiLCJrZXlzIiwibWFwIiwiUGFsZXR0ZUNvbmZpZyIsInByb3AiLCJjb25maWciLCJvbkNoYW5nZSIsIkZyYWdtZW50IiwiY29sb3JzIiwib25BcHBseSIsIm9uQ2FuY2VsIiwiQ29sb3JQYWxldHRlSXRlbSIsIm5hbWUiLCJvblNlbGVjdCIsIl9yZWYzIiwiX3JlZjMkY29uZmlnIiwidXBkYXRlU2VsZWN0IiwidmFsIiwidXBkYXRlU3dpdGNoIiwib25DbGljayIsInN0b3BQcm9wYWdhdGlvbiIsIlBhbmVsTGFiZWwiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaWQiLCJzZWxlY3RlZEl0ZW1zIiwibXVsdGlTZWxlY3QiLCJzZWFyY2hhYmxlIiwiaW5wdXRUaGVtZSIsImNoZWNrZWQiLCJCb29sZWFuIiwic2Vjb25kYXJ5IiwiVG9vbHRpcCIsInBsYWNlIiwic3R5bGUiLCJtYXhXaWR0aCIsIlN0eWxlZENvbG9yUmFuZ2UiLCJwcm9wcyIsInRoZW1lIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJfcmVmNCIsImlzUmV2ZXJzZWQiLCJpc1NlbGVjdGVkIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2lkZS1wYW5lbC9sYXllci1wYW5lbC9jb2xvci1yYW5nZS1zZWxlY3Rvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7TW91c2VFdmVudCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtLRVBMRVJfQ09MT1JfUEFMRVRURVMsIFBBTEVUVEVfVFlQRVMsIENvbG9yUGFsZXR0ZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5pbXBvcnQge0NvbG9yUmFuZ2UsIENvbG9yVUksIE5lc3RlZFBhcnRpYWx9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtcbiAgaGFzQ29sb3JNYXAsXG4gIHVwZGF0ZUNvbG9yUmFuZ2VCeVNlbGVjdGVkUGFsZXR0ZSxcbiAgcGFsZXR0ZUlzU3RlcHMsXG4gIHBhbGV0dGVJc1R5cGUsXG4gIHBhbGV0dGVJc0NvbG9yQmxpbmRTYWZlXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IEl0ZW1TZWxlY3RvciBmcm9tICcuLi8uLi9jb21tb24vaXRlbS1zZWxlY3Rvci9pdGVtLXNlbGVjdG9yJztcbmltcG9ydCB7UGFuZWxMYWJlbCwgVG9vbHRpcH0gZnJvbSAnLi4vLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi4vLi4vY29tbW9uL3N3aXRjaCc7XG5pbXBvcnQgQ29sb3JQYWxldHRlUGFuZWwgZnJvbSAnLi9jb2xvci1wYWxldHRlJztcbmltcG9ydCBDdXN0b21QYWxldHRlRmFjdG9yeSBmcm9tICcuL2N1c3RvbS1wYWxldHRlJztcblxuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtyYW5nZX0gZnJvbSAnZDMtYXJyYXknO1xuXG50eXBlIENvbG9yUmFuZ2VTZWxlY3RvclByb3BzID0ge1xuICBjb2xvclBhbGV0dGVzPzogQ29sb3JQYWxldHRlW107XG4gIGNvbG9yUGFsZXR0ZVVJOiBDb2xvclVJO1xuICBzZWxlY3RlZENvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIG9uU2VsZWN0Q29sb3JSYW5nZTogKHA6IENvbG9yUmFuZ2UsIGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHNldENvbG9yUGFsZXR0ZVVJOiAobmV3Q29uZmlnOiBOZXN0ZWRQYXJ0aWFsPENvbG9yVUk+KSA9PiB2b2lkO1xufTtcblxudHlwZSBQYWxldHRlQ29uZmlnUHJvcHMgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICBjb25maWc6IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgb3B0aW9uczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG4gIH07XG4gIG9uQ2hhbmdlOiAodjogYW55KSA9PiB2b2lkO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHByb3A6IHN0cmluZztcbiAgcmVhc29uPzogc3RyaW5nO1xufTtcblxuLy8gQHRzLWlnbm9yZSBjYW50IGNvbmNhdCAnYWxsJyB0byBQQUxFVFRFX1RZUEVTIHZhbHVlc1xuZXhwb3J0IGNvbnN0IEFMTF9UWVBFUyA9IE9iamVjdC52YWx1ZXMoUEFMRVRURV9UWVBFUykuY29uY2F0KFsnYWxsJ10pO1xuY29uc3QgTUFYX1NURVBTID0gMjA7XG5jb25zdCBBTExfU1RFUFMgPSByYW5nZSgyLCBNQVhfU1RFUFMgKyAxLCAxKTtcblxuY29uc3QgU3R5bGVkQ29sb3JDb25maWcgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAxMnB4IDEycHggMCAxMnB4O1xuYDtcblxuY29uc3QgU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2NvbG9yLXJhbmdlLXNlbGVjdG9yJ1xufSlgXG4gIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuYDtcbmNvbnN0IFN0eWxlZENvbG9yUGFsZXR0ZSA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmc6IDAgOHB4IDhweCA4cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRQYWxldHRlQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0IHtcbiAgICB3aWR0aDogNDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuXG4gICAgLml0ZW0tc2VsZWN0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBDT05GSUdfU0VUVElOR1MgPSB7XG4gIHR5cGU6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfVFlQRVNcbiAgfSxcbiAgc3RlcHM6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfU1RFUFMsXG4gICAgZGlzYWJsZWQ6IGNvbG9yUmFuZ2UgPT4gaGFzQ29sb3JNYXAoY29sb3JSYW5nZSksXG4gICAgcmVhc29uOiAnY29sb3IuZGlzYWJsZVN0ZXBSZWFzb24nXG4gIH0sXG4gIHJldmVyc2VkOiB7XG4gICAgdHlwZTogJ3N3aXRjaCcsXG4gICAgb3B0aW9uczogW3RydWUsIGZhbHNlXVxuICB9LFxuICBjb2xvckJsaW5kU2FmZToge1xuICAgIHR5cGU6ICdzd2l0Y2gnLFxuICAgIG9wdGlvbnM6IFt0cnVlLCBmYWxzZV1cbiAgfSxcbiAgY3VzdG9tOiB7XG4gICAgbGFiZWw6ICdjdXN0b21QYWxldHRlJyxcbiAgICB0eXBlOiAnc3dpdGNoJyxcbiAgICBvcHRpb25zOiBbdHJ1ZSwgZmFsc2VdXG4gIH1cbn07XG5jb25zdCBkaXNwbGF5T3B0aW9uID0gZCA9PiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZCk7XG5jb25zdCBnZXRPcHRpb25WYWx1ZSA9IGQgPT4gZDtcbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG4gIC8vIGRvIG5vdGhpbmdcbn07XG5cbkNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnkuZGVwcyA9IFtDdXN0b21QYWxldHRlRmFjdG9yeV07XG5mdW5jdGlvbiBDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5KFxuICBDdXN0b21QYWxldHRlOiBSZXR1cm5UeXBlPHR5cGVvZiBDdXN0b21QYWxldHRlRmFjdG9yeT5cbik6IFJlYWN0LkZDPENvbG9yUmFuZ2VTZWxlY3RvclByb3BzPiB7XG4gIGNvbnN0IENvbG9yUmFuZ2VTZWxlY3RvcjogUmVhY3QuRkM8Q29sb3JSYW5nZVNlbGVjdG9yUHJvcHM+ID0gKHtcbiAgICBjb2xvclBhbGV0dGVzID0gS0VQTEVSX0NPTE9SX1BBTEVUVEVTLFxuICAgIGNvbG9yUGFsZXR0ZVVJLFxuICAgIHNldENvbG9yUGFsZXR0ZVVJID0gbm9vcCxcbiAgICBvblNlbGVjdENvbG9yUmFuZ2UgPSBub29wLFxuICAgIHNlbGVjdGVkQ29sb3JSYW5nZVxuICB9KSA9PiB7XG4gICAgY29uc3Qge2N1c3RvbVBhbGV0dGUsIHNob3dTa2V0Y2hlciwgY29sb3JSYW5nZUNvbmZpZ30gPSBjb2xvclBhbGV0dGVVSTtcbiAgICBjb25zdCB7dHlwZSwgc3RlcHMsIGNvbG9yQmxpbmRTYWZlLCByZXZlcnNlZH0gPSBjb2xvclJhbmdlQ29uZmlnO1xuXG4gICAgY29uc3QgZmlsdGVyZWRDb2xvclBhbGV0dGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2xvclBhbGV0dGVzPy5maWx0ZXIoXG4gICAgICAgICAgcGFsZXR0ZSA9PlxuICAgICAgICAgICAgcGFsZXR0ZUlzVHlwZShwYWxldHRlLCB0eXBlKSAmJlxuICAgICAgICAgICAgcGFsZXR0ZUlzU3RlcHMocGFsZXR0ZSwgc3RlcHMpICYmXG4gICAgICAgICAgICBwYWxldHRlSXNDb2xvckJsaW5kU2FmZShwYWxldHRlLCBjb2xvckJsaW5kU2FmZSlcbiAgICAgICAgKSA/PyBbXVxuICAgICAgKTtcbiAgICB9LCBbY29sb3JQYWxldHRlcywgY29sb3JCbGluZFNhZmUsIHN0ZXBzLCB0eXBlXSk7XG5cbiAgICBjb25zdCBfdXBkYXRlQ29uZmlnID0gdXNlQ2FsbGJhY2soXG4gICAgICAoe2tleSwgdmFsdWV9KSA9PiB7XG4gICAgICAgIHNldENvbG9yUGFsZXR0ZVVJKHtjb2xvclJhbmdlQ29uZmlnOiB7W2tleV06IHZhbHVlfX0pO1xuICAgICAgfSxcbiAgICAgIFtzZXRDb2xvclBhbGV0dGVVSV1cbiAgICApO1xuXG4gICAgY29uc3QgX29uQ3VzdG9tUGFsZXR0ZUNhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldENvbG9yUGFsZXR0ZVVJKHtcbiAgICAgICAgc2hvd1NrZXRjaGVyOiBmYWxzZSxcbiAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge2N1c3RvbTogZmFsc2V9XG4gICAgICB9KTtcbiAgICB9LCBbc2V0Q29sb3JQYWxldHRlVUldKTtcblxuICAgIGNvbnN0IF9vbkFwcGx5ID0gdXNlQ2FsbGJhY2soXG4gICAgICBlID0+IG9uU2VsZWN0Q29sb3JSYW5nZShjdXN0b21QYWxldHRlLCBlKSxcbiAgICAgIFtjdXN0b21QYWxldHRlLCBvblNlbGVjdENvbG9yUmFuZ2VdXG4gICAgKTtcblxuICAgIGNvbnN0IF9vblNlbGVjdFBhbGV0dGUgPSB1c2VDYWxsYmFjayhcbiAgICAgIChjb2xvclBhbGV0dGUsIGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV3Q29sb3JSYW5nZSA9IHVwZGF0ZUNvbG9yUmFuZ2VCeVNlbGVjdGVkUGFsZXR0ZShzZWxlY3RlZENvbG9yUmFuZ2UsIGNvbG9yUGFsZXR0ZSwge1xuICAgICAgICAgIHN0ZXBzLFxuICAgICAgICAgIHJldmVyc2VkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uU2VsZWN0Q29sb3JSYW5nZShuZXdDb2xvclJhbmdlLCBlKTtcbiAgICAgIH0sXG4gICAgICBbc2VsZWN0ZWRDb2xvclJhbmdlLCByZXZlcnNlZCwgc3RlcHMsIG9uU2VsZWN0Q29sb3JSYW5nZV1cbiAgICApO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yPlxuICAgICAgICA8U3R5bGVkQ29sb3JDb25maWc+XG4gICAgICAgICAgeyhjb2xvclJhbmdlQ29uZmlnLmN1c3RvbSA/IFsnY3VzdG9tJ10gOiBPYmplY3Qua2V5cyhjb2xvclJhbmdlQ29uZmlnKSkubWFwKGtleSA9PlxuICAgICAgICAgICAgQ09ORklHX1NFVFRJTkdTW2tleV0gPyAoXG4gICAgICAgICAgICAgIDxQYWxldHRlQ29uZmlnXG4gICAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgcHJvcD17a2V5fVxuICAgICAgICAgICAgICAgIGxhYmVsPXtDT05GSUdfU0VUVElOR1Nba2V5XS5sYWJlbCB8fCBrZXl9XG4gICAgICAgICAgICAgICAgY29uZmlnPXtDT05GSUdfU0VUVElOR1Nba2V5XX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Y29sb3JSYW5nZUNvbmZpZ1trZXldfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtfdXBkYXRlQ29uZmlnfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgIENPTkZJR19TRVRUSU5HU1trZXldLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgID8gQ09ORklHX1NFVFRJTkdTW2tleV0uZGlzYWJsZWQoc2VsZWN0ZWRDb2xvclJhbmdlKVxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlYXNvbj17Q09ORklHX1NFVFRJTkdTW2tleV0ucmVhc29ufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IG51bGxcbiAgICAgICAgICApfVxuICAgICAgICA8L1N0eWxlZENvbG9yQ29uZmlnPlxuICAgICAgICB7Y29sb3JSYW5nZUNvbmZpZy5jdXN0b20gPyAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxTdHlsZWRDb2xvclBhbGV0dGU+XG4gICAgICAgICAgICAgIDxDb2xvclBhbGV0dGVQYW5lbCBjb2xvcnM9e2N1c3RvbVBhbGV0dGUuY29sb3JzfSAvPlxuICAgICAgICAgICAgPC9TdHlsZWRDb2xvclBhbGV0dGU+XG4gICAgICAgICAgICA8Q3VzdG9tUGFsZXR0ZVxuICAgICAgICAgICAgICBjdXN0b21QYWxldHRlPXtjdXN0b21QYWxldHRlfVxuICAgICAgICAgICAgICBzaG93U2tldGNoZXI9e3Nob3dTa2V0Y2hlcn1cbiAgICAgICAgICAgICAgb25BcHBseT17X29uQXBwbHl9XG4gICAgICAgICAgICAgIHNldENvbG9yUGFsZXR0ZVVJPXtzZXRDb2xvclBhbGV0dGVVSX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9e19vbkN1c3RvbVBhbGV0dGVDYW5jZWx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fZ3JvdXBcIj5cbiAgICAgICAgICAgIHtmaWx0ZXJlZENvbG9yUGFsZXR0ZXMubWFwKChjb2xvclBhbGV0dGUsIGkpID0+IChcbiAgICAgICAgICAgICAgPENvbG9yUGFsZXR0ZUl0ZW1cbiAgICAgICAgICAgICAgICBrZXk9e2Ake2NvbG9yUGFsZXR0ZS5uYW1lfS0ke2l9YH1cbiAgICAgICAgICAgICAgICBjb2xvclBhbGV0dGU9e2NvbG9yUGFsZXR0ZX1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yUmFuZ2U9e3NlbGVjdGVkQ29sb3JSYW5nZX1cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17X29uU2VsZWN0UGFsZXR0ZX1cbiAgICAgICAgICAgICAgICByZXZlcnNlZD17cmV2ZXJzZWR9XG4gICAgICAgICAgICAgICAgc3RlcHM9e3N0ZXBzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L1N0eWxlZENvbG9yUmFuZ2VTZWxlY3Rvcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDb2xvclJhbmdlU2VsZWN0b3I7XG59XG5cbmV4cG9ydCBjb25zdCBQYWxldHRlQ29uZmlnOiBSZWFjdC5GQzxQYWxldHRlQ29uZmlnUHJvcHM+ID0gKHtcbiAgcHJvcCxcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICBjb25maWc6IHt0eXBlLCBvcHRpb25zfSxcbiAgb25DaGFuZ2UsXG4gIGRpc2FibGVkLFxuICByZWFzb25cbn0pID0+IHtcbiAgY29uc3QgdXBkYXRlU2VsZWN0ID0gdXNlQ2FsbGJhY2sodmFsID0+IG9uQ2hhbmdlKHtrZXk6IHByb3AsIHZhbHVlOiB2YWx9KSwgW29uQ2hhbmdlLCBwcm9wXSk7XG4gIGNvbnN0IHVwZGF0ZVN3aXRjaCA9IHVzZUNhbGxiYWNrKFxuICAgICgpID0+IG9uQ2hhbmdlKHtrZXk6IHByb3AsIHZhbHVlOiAhdmFsdWV9KSxcbiAgICBbb25DaGFuZ2UsIHByb3AsIHZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZFBhbGV0dGVDb25maWcgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnXCIgb25DbGljaz17ZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbFwiPlxuICAgICAgICA8UGFuZWxMYWJlbD5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17YGNvbG9yLiR7bGFiZWx9YH0gLz5cbiAgICAgICAgPC9QYW5lbExhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0XCJcbiAgICAgICAgZGF0YS10aXBcbiAgICAgICAgZGF0YS1mb3I9e2Bjb2xvci1yYW5nZS1jb25maWctJHtwcm9wfWB9XG4gICAgICA+XG4gICAgICAgIHt0eXBlID09PSAnc2VsZWN0JyAmJiAoXG4gICAgICAgICAgPEl0ZW1TZWxlY3RvclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcz17dmFsdWV9XG4gICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgbXVsdGlTZWxlY3Q9e2ZhbHNlfVxuICAgICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlU2VsZWN0fVxuICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgaW5wdXRUaGVtZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtkaXNwbGF5T3B0aW9ufVxuICAgICAgICAgICAgZ2V0T3B0aW9uVmFsdWU9e2dldE9wdGlvblZhbHVlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHt0eXBlID09PSAnc3dpdGNoJyAmJiAoXG4gICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgY2hlY2tlZD17Qm9vbGVhbih2YWx1ZSl9XG4gICAgICAgICAgICBpZD17YCR7bGFiZWx9LXRvZ2dsZWB9XG4gICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlU3dpdGNofVxuICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgc2Vjb25kYXJ5XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc2FibGVkICYmIHJlYXNvbiA/IChcbiAgICAgICAgICA8VG9vbHRpcCBpZD17YGNvbG9yLXJhbmdlLWNvbmZpZy0ke3Byb3B9YH0gcGxhY2U9XCJyaWdodFwiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17e21heFdpZHRoOiAnMjE0cHgnfX0+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtyZWFzb259IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgPC9TdHlsZWRQYWxldHRlQ29uZmlnPlxuICApO1xufTtcbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2UgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY29sb3ItcGFsZXR0ZS1vdXRlcidcbn0pYFxuICBwYWRkaW5nOiAwIDhweDtcbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5gO1xuXG50eXBlIENvbG9yUGFsZXR0ZUl0ZW1Qcm9wcyA9IHtcbiAgcmV2ZXJzZWQ/OiBib29sZWFuO1xuICBzZWxlY3RlZD86IENvbG9yUmFuZ2U7XG4gIGNvbG9yUGFsZXR0ZTogQ29sb3JQYWxldHRlO1xuICBzZWxlY3RlZENvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIG9uU2VsZWN0OiAoY29sb3JQYWxldHRlOiBDb2xvclBhbGV0dGUsIGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHN0ZXBzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgY29uc3QgQ29sb3JQYWxldHRlSXRlbTogUmVhY3QuRkM8Q29sb3JQYWxldHRlSXRlbVByb3BzPiA9ICh7XG4gIGNvbG9yUGFsZXR0ZSxcbiAgc3RlcHMsXG4gIHNlbGVjdGVkQ29sb3JSYW5nZSxcbiAgb25TZWxlY3QsXG4gIHJldmVyc2VkXG59KSA9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IHVzZU1lbW8oKCkgPT4gY29sb3JQYWxldHRlLmNvbG9ycyhzdGVwcyksIFtjb2xvclBhbGV0dGUsIHN0ZXBzXSk7XG4gIGNvbnN0IG9uQ2xpY2sgPSB1c2VDYWxsYmFjayhlID0+IG9uU2VsZWN0KGNvbG9yUGFsZXR0ZSwgZSksIFtjb2xvclBhbGV0dGUsIG9uU2VsZWN0XSk7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZENvbG9yUmFuZ2Ugb25DbGljaz17b25DbGlja30+XG4gICAgICA8Q29sb3JQYWxldHRlUGFuZWxcbiAgICAgICAgY29sb3JzPXtjb2xvcnN9XG4gICAgICAgIGlzUmV2ZXJzZWQ9e3JldmVyc2VkfVxuICAgICAgICBpc1NlbGVjdGVkPXtjb2xvclBhbGV0dGUubmFtZSA9PT0gc2VsZWN0ZWRDb2xvclJhbmdlLm5hbWV9XG4gICAgICAvPlxuICAgIDwvU3R5bGVkQ29sb3JSYW5nZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yUmFuZ2VTZWxlY3RvckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdB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