UNPKG

kepler.gl

Version:

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

220 lines (219 loc) 38.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); var _reactSortableHoc = require("react-sortable-hoc"); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _commonUtils = require("@kepler.gl/common-utils"); var _common = require("../../common"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // @ts-expect-error - react-sortable-hoc libdef does not match true exports 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; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var SliderInput = (0, _styledComponents["default"])(_common.Input)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: 48px;\n margin: 0 4px 0 8px;\n font-size: ", ";\n"])), function (props) { return props.theme.list1Size; }); var StyledInputRow = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n width: 100%;\n justify-content: space-between;\n .layer__drag-handle {\n visibility: ", ";\n }\n .side-panel-panel__label {\n margin-bottom: 0;\n text-transform: none;\n }\n"])), function (props) { return props.isEditing ? 'visible' : 'hidden'; }); var StyledTrash = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n display: flex;\n align-items: center;\n margin-left: 8px;\n visibility: ", ";\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) { return props.theme.subtextColor; }, function (props) { return props.isEditing ? 'visible' : 'hidden'; }, function (props) { return props.theme.subtextColorActive; }); var StyledDragHandle = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n opacity: 0;\n"]))); var dragHandleActive = (0, _styledComponents.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n .layer__drag-handle {\n color: ", ";\n opacity: 1;\n cursor: move;\n }\n"])), function (props) { return props.theme.textColorHl; }); var StyledSortableItem = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n padding: 4px 0;\n z-index: ", ";\n margin-left: -6px;\n\n &:not(.sorting) {\n &:hover {\n ", ";\n }\n }\n\n &.sorting-colors {\n background-color: ", ";\n ", ";\n }\n"])), function (props) { return props.theme.dropdownWrapperZ + 1; }, dragHandleActive, function (props) { return props.theme.panelBackgroundHover; }, dragHandleActive); var SortableContainer = (0, _reactSortableHoc.sortableContainer)(function (_ref) { var children = _ref.children; return /*#__PURE__*/_react["default"].createElement("div", null, children); }); var DragHandle = (0, _reactSortableHoc.sortableHandle)(function (_ref2) { var className = _ref2.className, children = _ref2.children; return /*#__PURE__*/_react["default"].createElement(StyledDragHandle, { className: className }, children); }); var SortableItem = (0, _reactSortableHoc.sortableElement)(function (_ref3) { var children = _ref3.children, isSorting = _ref3.isSorting; return /*#__PURE__*/_react["default"].createElement(StyledSortableItem, { className: (0, _classnames["default"])('custom-palette__sortable-items', { sorting: isSorting }) }, children); }); function stringToNumber(val) { return val === '' ? null : Number(val); } var InputRow = function InputRow(_ref4) { var idx = _ref4.idx, stop = _ref4.stop, value = _ref4.value, isSorting = _ref4.isSorting, isEditing = _ref4.isEditing, _onChange = _ref4.onChange, onRemove = _ref4.onRemove; return /*#__PURE__*/_react["default"].createElement(SortableItem, { key: idx, index: idx, isSorting: isSorting }, /*#__PURE__*/_react["default"].createElement(StyledInputRow, { isEditing: isEditing }, /*#__PURE__*/_react["default"].createElement(DragHandle, { className: "layer__drag-handle" }, /*#__PURE__*/_react["default"].createElement(_common.Icons.VertDots, { height: "20px" })), /*#__PURE__*/_react["default"].createElement(_common.PanelLabel, null, "zoom"), /*#__PURE__*/_react["default"].createElement(SliderInput, { className: "vis-config-zoom__input__stop", type: "number", id: "".concat(idx, "-stop"), key: "".concat(idx, "-stop"), value: stop, onChange: function onChange(e) { return _onChange([stringToNumber(e.target.value), value]); }, disabled: !isEditing }), /*#__PURE__*/_react["default"].createElement(SliderInput, { className: "vis-config-zoom__input__value", type: "number", id: "".concat(idx, "-value"), key: "".concat(idx, "-value"), value: value, onChange: function onChange(e) { return _onChange([stop, stringToNumber(e.target.value)]); }, disabled: !isEditing }), /*#__PURE__*/_react["default"].createElement(_common.PanelLabel, null, "px"), /*#__PURE__*/_react["default"].createElement(StyledTrash, { isEditing: isEditing }, /*#__PURE__*/_react["default"].createElement(_common.Icons.Trash, { onClick: onRemove, height: "16px" })))); }; function insertStop(stops) { var newStops = null; var i = 0; while (!newStops && i < stops.length) { if (stops[i][0] + 1 < stops[i + 1][0]) { var st = stops[i][0] + 1; var value = (stops[i][1] + stops[i + 1][1]) / 2; newStops = [].concat((0, _toConsumableArray2["default"])(stops.slice(0, i + 1)), [[st, value]], (0, _toConsumableArray2["default"])(stops.slice(i + 1))); } else { i++; } } if (!newStops) { newStops = [].concat((0, _toConsumableArray2["default"])(stops.slice(0, i)), [[stops[i][0], (stops[i][1] + stops[i + 1][1]) / 2]], (0, _toConsumableArray2["default"])(stops.slice(i))); } return newStops; } var VisConfigByZoomInputContainer = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n margin: 8px 8px 12px 8px;\n\n .bottom-action {\n margin-top: 8px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n }\n\n .bottom-action.editing {\n justify-content: space-between;\n }\n"])), function (props) { return props.isEditing ? props.theme.AZURE950 : 'transparent'; }); var VisConfigByZoomInput = function VisConfigByZoomInput(_ref5) { var _ref5$config = _ref5.config, config = _ref5$config === void 0 ? {} : _ref5$config, property = _ref5.property, onChange = _ref5.onChange; var _useState = (0, _react.useState)(config.stops || []), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), stopsState = _useState2[0], setStops = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), isSorting = _useState4[0], toggleSorting = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), isEditing = _useState6[0], toggleEditing = _useState6[1]; var onConfirm = (0, _react.useCallback)(function () { onChange((0, _defineProperty2["default"])({}, property, _objectSpread(_objectSpread({}, config), {}, { stops: stopsState }))); toggleEditing(false); }, [property, config, stopsState, onChange, toggleEditing]); var addStop = (0, _react.useCallback)(function () { return setStops(insertStop(stopsState)); }, [setStops, stopsState]); var removeStop = (0, _react.useCallback)(function (i) { return setStops([].concat((0, _toConsumableArray2["default"])(stopsState.slice(0, i)), (0, _toConsumableArray2["default"])(stopsState.slice(i + 1)))); }, [setStops, stopsState]); var onSortEnd = (0, _react.useCallback)(function (_ref6) { var oldIndex = _ref6.oldIndex, newIndex = _ref6.newIndex; var newStopsState = (0, _commonUtils.arrayMove)(stopsState, oldIndex, newIndex); setStops(newStopsState); toggleSorting(false); }, [stopsState, setStops, toggleSorting]); var onSortStart = (0, _react.useCallback)(function () { toggleSorting(true); }, [toggleSorting]); return /*#__PURE__*/_react["default"].createElement(VisConfigByZoomInputContainer, { isEditing: isEditing }, /*#__PURE__*/_react["default"].createElement(SortableContainer, { className: "custom-palette-container", onSortEnd: onSortEnd, onSortStart: onSortStart, lockAxis: "y", helperClass: "sorting-colors", useDragHandle: true }, stopsState.map(function (stop, idx) { return /*#__PURE__*/_react["default"].createElement(InputRow, { isEditing: isEditing, key: "input-".concat(idx), idx: idx, stop: stop[0], value: stop[1], isSorting: isSorting, onChange: function onChange(v) { return setStops(Object.assign((0, _toConsumableArray2["default"])(stopsState || []), (0, _defineProperty2["default"])({}, idx, v))); }, onRemove: function onRemove() { return removeStop(idx); } }); })), isEditing ? /*#__PURE__*/_react["default"].createElement("div", { className: "bottom-action editing" }, /*#__PURE__*/_react["default"].createElement(_common.Button, { secondary: true, onClick: addStop, small: true }, /*#__PURE__*/_react["default"].createElement(_common.Icons.Add, { height: "16px" }), " Add Stop"), /*#__PURE__*/_react["default"].createElement(_common.Button, { onClick: onConfirm, small: true }, "Confirm")) : /*#__PURE__*/_react["default"].createElement("div", { className: "bottom-action" }, /*#__PURE__*/_react["default"].createElement(_common.Button, { onClick: function onClick() { return toggleEditing(true); }, small: true }, "Edit"))); }; var _default = exports["default"] = VisConfigByZoomInput; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfcmVhY3RTb3J0YWJsZUhvYyIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2NvbW1vblV0aWxzIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX3RlbXBsYXRlT2JqZWN0NyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlNsaWRlcklucHV0Iiwic3R5bGVkIiwiSW5wdXQiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJsaXN0MVNpemUiLCJTdHlsZWRJbnB1dFJvdyIsImRpdiIsImlzRWRpdGluZyIsIlN0eWxlZFRyYXNoIiwic3VidGV4dENvbG9yIiwic3VidGV4dENvbG9yQWN0aXZlIiwiU3R5bGVkRHJhZ0hhbmRsZSIsImRyYWdIYW5kbGVBY3RpdmUiLCJjc3MiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFNvcnRhYmxlSXRlbSIsImRyb3Bkb3duV3JhcHBlcloiLCJwYW5lbEJhY2tncm91bmRIb3ZlciIsIlNvcnRhYmxlQ29udGFpbmVyIiwic29ydGFibGVDb250YWluZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJjcmVhdGVFbGVtZW50IiwiRHJhZ0hhbmRsZSIsInNvcnRhYmxlSGFuZGxlIiwiX3JlZjIiLCJjbGFzc05hbWUiLCJTb3J0YWJsZUl0ZW0iLCJzb3J0YWJsZUVsZW1lbnQiLCJfcmVmMyIsImlzU29ydGluZyIsImNsYXNzbmFtZXMiLCJzb3J0aW5nIiwic3RyaW5nVG9OdW1iZXIiLCJ2YWwiLCJOdW1iZXIiLCJJbnB1dFJvdyIsIl9yZWY0IiwiaWR4Iiwic3RvcCIsInZhbHVlIiwib25DaGFuZ2UiLCJvblJlbW92ZSIsImtleSIsImluZGV4IiwiSWNvbnMiLCJWZXJ0RG90cyIsImhlaWdodCIsIlBhbmVsTGFiZWwiLCJ0eXBlIiwiaWQiLCJjb25jYXQiLCJ0YXJnZXQiLCJkaXNhYmxlZCIsIlRyYXNoIiwib25DbGljayIsImluc2VydFN0b3AiLCJzdG9wcyIsIm5ld1N0b3BzIiwic3QiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwic2xpY2UiLCJWaXNDb25maWdCeVpvb21JbnB1dENvbnRhaW5lciIsIkFaVVJFOTUwIiwiVmlzQ29uZmlnQnlab29tSW5wdXQiLCJfcmVmNSIsIl9yZWY1JGNvbmZpZyIsImNvbmZpZyIsInByb3BlcnR5IiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwic3RvcHNTdGF0ZSIsInNldFN0b3BzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJ0b2dnbGVTb3J0aW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJ0b2dnbGVFZGl0aW5nIiwib25Db25maXJtIiwidXNlQ2FsbGJhY2siLCJhZGRTdG9wIiwicmVtb3ZlU3RvcCIsIm9uU29ydEVuZCIsIl9yZWY2Iiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIm5ld1N0b3BzU3RhdGUiLCJhcnJheU1vdmUiLCJvblNvcnRTdGFydCIsImxvY2tBeGlzIiwiaGVscGVyQ2xhc3MiLCJ1c2VEcmFnSGFuZGxlIiwibWFwIiwidiIsImFzc2lnbiIsIkJ1dHRvbiIsInNlY29uZGFyeSIsInNtYWxsIiwiQWRkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvcmFkaXVzLWJ5LXpvb20taW5wdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIC0gcmVhY3Qtc29ydGFibGUtaG9jIGxpYmRlZiBkb2VzIG5vdCBtYXRjaCB0cnVlIGV4cG9ydHNcbmltcG9ydCB7c29ydGFibGVDb250YWluZXIsIHNvcnRhYmxlRWxlbWVudCwgc29ydGFibGVIYW5kbGV9IGZyb20gJ3JlYWN0LXNvcnRhYmxlLWhvYyc7XG5pbXBvcnQgc3R5bGVkLCB7Y3NzfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7Wm9vbVN0b3BzLCBab29tU3RvcHNDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHthcnJheU1vdmV9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcblxuaW1wb3J0IHtJY29ucywgSW5wdXQsIFBhbmVsTGFiZWwsIEJ1dHRvbn0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuY29uc3QgU2xpZGVySW5wdXQgPSBzdHlsZWQoSW5wdXQpYFxuICB3aWR0aDogNDhweDtcbiAgbWFyZ2luOiAwIDRweCAwIDhweDtcbiAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpc3QxU2l6ZX07XG5gO1xuXG50eXBlIFN0eWxlZElucHV0Um93UHJvcHMgPSB7XG4gIGlzRWRpdGluZz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBTdHlsZWRJbnB1dFJvdyA9IHN0eWxlZC5kaXY8U3R5bGVkSW5wdXRSb3dQcm9wcz5gXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIC5sYXllcl9fZHJhZy1oYW5kbGUge1xuICAgIHZpc2liaWxpdHk6ICR7cHJvcHMgPT4gKHByb3BzLmlzRWRpdGluZyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKX07XG4gIH1cbiAgLnNpZGUtcGFuZWwtcGFuZWxfX2xhYmVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICB9XG5gO1xuXG50eXBlIFN0eWxlZFRyYXNoUHJvcHMgPSB7XG4gIGlzRWRpdGluZz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBTdHlsZWRUcmFzaCA9IHN0eWxlZC5kaXY8U3R5bGVkVHJhc2hQcm9wcz5gXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvcn07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbi1sZWZ0OiA4cHg7XG4gIHZpc2liaWxpdHk6ICR7cHJvcHMgPT4gKHByb3BzLmlzRWRpdGluZyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nKX07XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckFjdGl2ZX07XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdIYW5kbGUgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBvcGFjaXR5OiAwO1xuYDtcblxuY29uc3QgZHJhZ0hhbmRsZUFjdGl2ZSA9IGNzc2BcbiAgLmxheWVyX19kcmFnLWhhbmRsZSB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIG9wYWNpdHk6IDE7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRTb3J0YWJsZUl0ZW0gPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiA0cHggMDtcbiAgei1pbmRleDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bldyYXBwZXJaICsgMX07XG4gIG1hcmdpbi1sZWZ0OiAtNnB4O1xuXG4gICY6bm90KC5zb3J0aW5nKSB7XG4gICAgJjpob3ZlciB7XG4gICAgICAke2RyYWdIYW5kbGVBY3RpdmV9O1xuICAgIH1cbiAgfVxuXG4gICYuc29ydGluZy1jb2xvcnMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgICR7ZHJhZ0hhbmRsZUFjdGl2ZX07XG4gIH1cbmA7XG5cbmNvbnN0IFNvcnRhYmxlQ29udGFpbmVyID0gc29ydGFibGVDb250YWluZXIoKHtjaGlsZHJlbn0pID0+IDxkaXY+e2NoaWxkcmVufTwvZGl2Pik7XG5jb25zdCBEcmFnSGFuZGxlID0gc29ydGFibGVIYW5kbGUoKHtjbGFzc05hbWUsIGNoaWxkcmVufSkgPT4gKFxuICA8U3R5bGVkRHJhZ0hhbmRsZSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+e2NoaWxkcmVufTwvU3R5bGVkRHJhZ0hhbmRsZT5cbikpO1xuY29uc3QgU29ydGFibGVJdGVtID0gc29ydGFibGVFbGVtZW50KCh7Y2hpbGRyZW4sIGlzU29ydGluZ30pID0+IChcbiAgPFN0eWxlZFNvcnRhYmxlSXRlbVxuICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnY3VzdG9tLXBhbGV0dGVfX3NvcnRhYmxlLWl0ZW1zJywge3NvcnRpbmc6IGlzU29ydGluZ30pfVxuICA+XG4gICAge2NoaWxkcmVufVxuICA8L1N0eWxlZFNvcnRhYmxlSXRlbT5cbikpO1xuXG5mdW5jdGlvbiBzdHJpbmdUb051bWJlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCA9PT0gJycgPyBudWxsIDogTnVtYmVyKHZhbCk7XG59XG5cbnR5cGUgSW5wdXRSb3dQcm9wcyA9IHtcbiAgaWR4OiBudW1iZXI7XG4gIHN0b3A6IG51bWJlcjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgaXNTb3J0aW5nOiBib29sZWFuO1xuICBpc0VkaXRpbmc6IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiAodmFsdWU6IFtudW1iZXIgfCBudWxsLCBudW1iZXIgfCBudWxsXSkgPT4gdm9pZDtcbiAgb25SZW1vdmU6ICgpID0+IHZvaWQ7XG59O1xuY29uc3QgSW5wdXRSb3c6IFJlYWN0LkZDPElucHV0Um93UHJvcHM+ID0gKHtcbiAgaWR4LFxuICBzdG9wLFxuICB2YWx1ZSxcbiAgaXNTb3J0aW5nLFxuICBpc0VkaXRpbmcsXG4gIG9uQ2hhbmdlLFxuICBvblJlbW92ZVxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxTb3J0YWJsZUl0ZW0ga2V5PXtpZHh9IGluZGV4PXtpZHh9IGlzU29ydGluZz17aXNTb3J0aW5nfT5cbiAgICAgIDxTdHlsZWRJbnB1dFJvdyBpc0VkaXRpbmc9e2lzRWRpdGluZ30+XG4gICAgICAgIDxEcmFnSGFuZGxlIGNsYXNzTmFtZT1cImxheWVyX19kcmFnLWhhbmRsZVwiPlxuICAgICAgICAgIDxJY29ucy5WZXJ0RG90cyBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICAgICAgPC9EcmFnSGFuZGxlPlxuICAgICAgICA8UGFuZWxMYWJlbD56b29tPC9QYW5lbExhYmVsPlxuICAgICAgICA8U2xpZGVySW5wdXRcbiAgICAgICAgICBjbGFzc05hbWU9XCJ2aXMtY29uZmlnLXpvb21fX2lucHV0X19zdG9wXCJcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICBpZD17YCR7aWR4fS1zdG9wYH1cbiAgICAgICAgICBrZXk9e2Ake2lkeH0tc3RvcGB9XG4gICAgICAgICAgdmFsdWU9e3N0b3B9XG4gICAgICAgICAgb25DaGFuZ2U9e2UgPT4gb25DaGFuZ2UoW3N0cmluZ1RvTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSwgdmFsdWVdKX1cbiAgICAgICAgICBkaXNhYmxlZD17IWlzRWRpdGluZ31cbiAgICAgICAgLz5cbiAgICAgICAgPFNsaWRlcklucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwidmlzLWNvbmZpZy16b29tX19pbnB1dF9fdmFsdWVcIlxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgIGlkPXtgJHtpZHh9LXZhbHVlYH1cbiAgICAgICAgICBrZXk9e2Ake2lkeH0tdmFsdWVgfVxuICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBvbkNoYW5nZShbc3RvcCwgc3RyaW5nVG9OdW1iZXIoZS50YXJnZXQudmFsdWUpXSl9XG4gICAgICAgICAgZGlzYWJsZWQ9eyFpc0VkaXRpbmd9XG4gICAgICAgIC8+XG4gICAgICAgIDxQYW5lbExhYmVsPnB4PC9QYW5lbExhYmVsPlxuICAgICAgICA8U3R5bGVkVHJhc2ggaXNFZGl0aW5nPXtpc0VkaXRpbmd9PlxuICAgICAgICAgIDxJY29ucy5UcmFzaCBvbkNsaWNrPXtvblJlbW92ZX0gaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICAgIDwvU3R5bGVkVHJhc2g+XG4gICAgICA8L1N0eWxlZElucHV0Um93PlxuICAgIDwvU29ydGFibGVJdGVtPlxuICApO1xufTtcblxuZnVuY3Rpb24gaW5zZXJ0U3RvcChzdG9wczogWm9vbVN0b3BzKTogWm9vbVN0b3BzIHtcbiAgbGV0IG5ld1N0b3BzOiBab29tU3RvcHMgfCBudWxsID0gbnVsbDtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoIW5ld1N0b3BzICYmIGkgPCBzdG9wcy5sZW5ndGgpIHtcbiAgICBpZiAoc3RvcHNbaV1bMF0gKyAxIDwgc3RvcHNbaSArIDFdWzBdKSB7XG4gICAgICBjb25zdCBzdCA9IHN0b3BzW2ldWzBdICsgMTtcbiAgICAgIGNvbnN0IHZhbHVlID0gKHN0b3BzW2ldWzFdICsgc3RvcHNbaSArIDFdWzFdKSAvIDI7XG4gICAgICBuZXdTdG9wcyA9IFsuLi5zdG9wcy5zbGljZSgwLCBpICsgMSksIFtzdCwgdmFsdWVdLCAuLi5zdG9wcy5zbGljZShpICsgMSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFuZXdTdG9wcykge1xuICAgIG5ld1N0b3BzID0gW1xuICAgICAgLi4uc3RvcHMuc2xpY2UoMCwgaSksXG4gICAgICBbc3RvcHNbaV1bMF0sIChzdG9wc1tpXVsxXSArIHN0b3BzW2kgKyAxXVsxXSkgLyAyXSxcbiAgICAgIC4uLnN0b3BzLnNsaWNlKGkpXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdG9wcztcbn1cblxudHlwZSBWaXNDb25maWdCeVpvb21JbnB1dENvbnRhaW5lclByb3BzID0ge1xuICBpc0VkaXRpbmc/OiBib29sZWFuO1xufTtcblxuY29uc3QgVmlzQ29uZmlnQnlab29tSW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2PFZpc0NvbmZpZ0J5Wm9vbUlucHV0Q29udGFpbmVyUHJvcHM+YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IChwcm9wcy5pc0VkaXRpbmcgPyBwcm9wcy50aGVtZS5BWlVSRTk1MCA6ICd0cmFuc3BhcmVudCcpfTtcbiAgbWFyZ2luOiA4cHggOHB4IDEycHggOHB4O1xuXG4gIC5ib3R0b20tYWN0aW9uIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIH1cblxuICAuYm90dG9tLWFjdGlvbi5lZGl0aW5nIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cbmA7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIGNvbmZpZzogWm9vbVN0b3BzQ29uZmlnO1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB1bml0OiBzdHJpbmc7XG4gIG9uQ2hhbmdlOiAodXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCBab29tU3RvcHNDb25maWc+KSA9PiB2b2lkO1xufTtcblxuY29uc3QgVmlzQ29uZmlnQnlab29tSW5wdXQ6IFJlYWN0LkZDPFByb3BzPiA9ICh7Y29uZmlnID0ge30sIHByb3BlcnR5LCBvbkNoYW5nZX0pID0+IHtcbiAgY29uc3QgW3N0b3BzU3RhdGUsIHNldFN0b3BzXSA9IHVzZVN0YXRlKGNvbmZpZy5zdG9wcyB8fCBbXSk7XG4gIGNvbnN0IFtpc1NvcnRpbmcsIHRvZ2dsZVNvcnRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNFZGl0aW5nLCB0b2dnbGVFZGl0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBvbkNvbmZpcm0gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgb25DaGFuZ2Uoe1xuICAgICAgW3Byb3BlcnR5XToge1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIHN0b3BzOiBzdG9wc1N0YXRlXG4gICAgICB9XG4gICAgfSk7XG4gICAgdG9nZ2xlRWRpdGluZyhmYWxzZSk7XG4gIH0sIFtwcm9wZXJ0eSwgY29uZmlnLCBzdG9wc1N0YXRlLCBvbkNoYW5nZSwgdG9nZ2xlRWRpdGluZ10pO1xuICBjb25zdCBhZGRTdG9wID0gdXNlQ2FsbGJhY2soKCkgPT4gc2V0U3RvcHMoaW5zZXJ0U3RvcChzdG9wc1N0YXRlKSksIFtzZXRTdG9wcywgc3RvcHNTdGF0ZV0pO1xuICBjb25zdCByZW1vdmVTdG9wID0gdXNlQ2FsbGJhY2soXG4gICAgaSA9PiBzZXRTdG9wcyhbLi4uc3RvcHNTdGF0ZS5zbGljZSgwLCBpKSwgLi4uc3RvcHNTdGF0ZS5zbGljZShpICsgMSldKSxcbiAgICBbc2V0U3RvcHMsIHN0b3BzU3RhdGVdXG4gICk7XG4gIGNvbnN0IG9uU29ydEVuZCA9IHVzZUNhbGxiYWNrKFxuICAgICh7b2xkSW5kZXgsIG5ld0luZGV4fSkgPT4ge1xuICAgICAgY29uc3QgbmV3U3RvcHNTdGF0ZSA9IGFycmF5TW92ZShzdG9wc1N0YXRlLCBvbGRJbmRleCwgbmV3SW5kZXgpO1xuICAgICAgc2V0U3RvcHMobmV3U3RvcHNTdGF0ZSk7XG4gICAgICB0b2dnbGVTb3J0aW5nKGZhbHNlKTtcbiAgICB9LFxuICAgIFtzdG9wc1N0YXRlLCBzZXRTdG9wcywgdG9nZ2xlU29ydGluZ11cbiAgKTtcbiAgY29uc3Qgb25Tb3J0U3RhcnQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdG9nZ2xlU29ydGluZyh0cnVlKTtcbiAgfSwgW3RvZ2dsZVNvcnRpbmddKTtcblxuICByZXR1cm4gKFxuICAgIDxWaXNDb25maWdCeVpvb21JbnB1dENvbnRhaW5lciBpc0VkaXRpbmc9e2lzRWRpdGluZ30+XG4gICAgICA8U29ydGFibGVDb250YWluZXJcbiAgICAgICAgY2xhc3NOYW1lPVwiY3VzdG9tLXBhbGV0dGUtY29udGFpbmVyXCJcbiAgICAgICAgb25Tb3J0RW5kPXtvblNvcnRFbmR9XG4gICAgICAgIG9uU29ydFN0YXJ0PXtvblNvcnRTdGFydH1cbiAgICAgICAgbG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgaGVscGVyQ2xhc3M9XCJzb3J0aW5nLWNvbG9yc1wiXG4gICAgICAgIHVzZURyYWdIYW5kbGVcbiAgICAgID5cbiAgICAgICAge3N0b3BzU3RhdGUubWFwKChzdG9wLCBpZHgpID0+IChcbiAgICAgICAgICA8SW5wdXRSb3dcbiAgICAgICAgICAgIGlzRWRpdGluZz17aXNFZGl0aW5nfVxuICAgICAgICAgICAga2V5PXtgaW5wdXQtJHtpZHh9YH1cbiAgICAgICAgICAgIGlkeD17aWR4fVxuICAgICAgICAgICAgc3RvcD17c3RvcFswXX1cbiAgICAgICAgICAgIHZhbHVlPXtzdG9wWzFdfVxuICAgICAgICAgICAgaXNTb3J0aW5nPXtpc1NvcnRpbmd9XG4gICAgICAgICAgICBvbkNoYW5nZT17diA9PiBzZXRTdG9wcyhPYmplY3QuYXNzaWduKFsuLi4oc3RvcHNTdGF0ZSB8fCBbXSldLCB7W2lkeF06IHZ9KSl9XG4gICAgICAgICAgICBvblJlbW92ZT17KCkgPT4gcmVtb3ZlU3RvcChpZHgpfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9Tb3J0YWJsZUNvbnRhaW5lcj5cbiAgICAgIHtpc0VkaXRpbmcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm90dG9tLWFjdGlvbiBlZGl0aW5nXCI+XG4gICAgICAgICAgPEJ1dHRvbiBzZWNvbmRhcnkgb25DbGljaz17YWRkU3RvcH0gc21hbGw+XG4gICAgICAgICAgICA8SWNvbnMuQWRkIGhlaWdodD1cIjE2cHhcIiAvPiBBZGQgU3RvcFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17b25Db25maXJtfSBzbWFsbD5cbiAgICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvdHRvbS1hY3Rpb25cIj5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9eygpID0+IHRvZ2dsZUVkaXRpbmcodHJ1ZSl9IHNtYWxsPlxuICAgICAgICAgICAgRWRpdFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9WaXNDb25maWdCeVpvb21JbnB1dENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpc0NvbmZpZ0J5Wm9vbUlucHV0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