UNPKG

kepler.gl

Version:

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

275 lines (272 loc) 57.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.StyledColorSelectorWrapper = exports.PanelLabelWrapper = void 0; exports["default"] = EffectConfiguratorFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); 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 _reactIntl = require("react-intl"); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _rangeSlider = _interopRequireDefault(require("../common/range-slider")); var _icons = require("../common/icons"); var _effectTimeConfigurator = _interopRequireDefault(require("./effect-time-configurator")); var _compactColorPicker = _interopRequireDefault(require("./compact-color-picker")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12; // 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; } 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 StyledEffectConfigurator = _styledComponents["default"].div.attrs({ className: 'effect-panel__config' })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin: ", ";\n padding: ", ";\n"])), function (props) { return props.theme.effectConfiguratorMargin; }, function (props) { return props.theme.effectConfiguratorPadding; }); var PanelLabelWrapper = exports.PanelLabelWrapper = _styledComponents["default"].div.attrs({ className: 'side-panel-panel__label-wrapper' })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: self-start;\n margin-bottom: 11px;\n\n .side-panel-panel__label {\n margin-top: 2px;\n margin-bottom: 0px;\n }\n"]))); var StyledColorSelectorWrapper = exports.StyledColorSelectorWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-right: 5px;\n margin-left: 5px;\n margin-bottom: 6px;\n margin-top: 2px;\n"]))); var StyledVerticalSeparator = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n height: 1px;\n background-color: ", ";\n margin-top: 20px;\n margin-bottom: 20px;\n margin-left: -20px;\n"])), function (props) { return props.theme.inputBgd; }); var StyledWrapper = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ", "px;\n"])), function (props) { var _props$marginBottom; return (_props$marginBottom = props.marginBottom) !== null && _props$marginBottom !== void 0 ? _props$marginBottom : 9; }); var StyledConfigSection = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n"]))); var SectionTitle = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n margin-bottom: 5px;\n text-transform: capitalize;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary1; }); var SectionSubTitle = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n margin-bottom: 8px;\n margin-left: 6px;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary2; }); var StyleSliderWrapper = _styledComponents["default"].div(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n align-self: flex-start;\n width: 199px;\n height: 32px;\n display: flex;\n align-items: center;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"]))); var RegularOuterWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section' })(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n"]))); var RegularSectionTitleWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section-title' })(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n text-transform: capitalize;\n margin-bottom: -3px;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary1; }); var RegularSliderWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section-control' })(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n height: 32px;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"]))); var COMMON_SLIDER_PROPS = { showInput: true, isRanged: false, step: 0.001, label: 'value' }; EffectConfiguratorFactory.deps = [_rangeSlider["default"], _effectTimeConfigurator["default"]]; function EffectConfiguratorFactory(RangeSlider, EffectTimeConfigurator) { var ShadowEffectConfigurator = function ShadowEffectConfigurator(_ref) { var effect = _ref.effect, updateEffectConfig = _ref.updateEffectConfig; var parameters = effect.parameters, id = effect.id; var sliderProps = (0, _react.useMemo)(function () { var propNames = ['shadowIntensity', 'ambientLightIntensity', 'sunLightIntensity']; return propNames.map(function (propName) { return { value1: parameters[propName], range: [0, 1], value0: 0, onChange: function onChange(value, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, propName, value[1]) }); } }; }); }, [id, parameters, updateEffectConfig]); var onTimeParametersChanged = (0, _react.useCallback)(function (parameters) { updateEffectConfig(null, id, { parameters: _objectSpread(_objectSpread(_objectSpread({}, parameters.timestamp ? { timestamp: parameters.timestamp } : null), parameters.timezone ? { timezone: parameters.timezone } : null), parameters.timeMode ? { timeMode: parameters.timeMode } : null) }); }, [id, updateEffectConfig]); var colorPickerProps = (0, _react.useMemo)(function () { var propNames = ['ambientLightColor', 'sunLightColor', 'shadowColor']; return propNames.map(function (propName) { return { colorSets: [{ selectedColor: parameters[propName], setColor: function setColor(v) { return updateEffectConfig(null, id, { parameters: (0, _defineProperty2["default"])({}, propName, v) }); } }] }; }); }, [id, parameters, updateEffectConfig]); return /*#__PURE__*/_react["default"].createElement(StyledEffectConfigurator, { key: effect.id }, /*#__PURE__*/_react["default"].createElement(PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Date & Time')), /*#__PURE__*/_react["default"].createElement(EffectTimeConfigurator, { timestamp: parameters.timestamp, timezone: parameters.timezone, timeMode: parameters.timeMode, onChange: onTimeParametersChanged }), /*#__PURE__*/_react["default"].createElement(StyledVerticalSeparator, null), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Shadow')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 16 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[2].colorSets[0].selectedColor, onSetColor: colorPickerProps[2].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[0]))))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Ambient light')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 16 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[0].colorSets[0].selectedColor, onSetColor: colorPickerProps[0].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[1]))))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Sun light')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[1].colorSets[0].selectedColor, onSetColor: colorPickerProps[1].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[2])))))); }; var defaultUniforms = {}; var PostProcessingEffectConfigurator = function PostProcessingEffectConfigurator(_ref2) { var _effect$deckEffect; var effect = _ref2.effect, updateEffectConfig = _ref2.updateEffectConfig; var uniforms = ((_effect$deckEffect = effect.deckEffect) === null || _effect$deckEffect === void 0 ? void 0 : _effect$deckEffect.module.uniforms) || defaultUniforms; var parameterDescriptions = effect.getParameterDescriptions(); var parameters = effect.parameters, id = effect.id; var flatParameterDescriptions = (0, _react.useMemo)(function () { return parameterDescriptions.reduce(function (acc, description) { if (description.type === 'array') { // split arrays of controls into a separate controls for each component if (Array.isArray(description.defaultValue)) { description.defaultValue.forEach(function (_, index) { var _description$label; acc.push(_objectSpread(_objectSpread({}, description), {}, { index: index, label: (_description$label = description.label) === null || _description$label === void 0 ? void 0 : _description$label[index] })); }); } } else { acc.push(description); } return acc; }, []); }, [parameterDescriptions]); var controls = (0, _react.useMemo)(function () { return flatParameterDescriptions.map(function (desc) { var paramName = desc.name; var uniform = uniforms[desc.name]; if (!uniform && uniform !== 0 || uniform["private"]) { return null; } var prevValue = parameters[paramName]; var label = desc.label === false ? false : desc.label || desc.name; // the uniform is [number, number] array if (uniform.length === 2) { return { label: label, value1: prevValue[desc.index || 0] || 0, range: [0, 1], value0: 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, desc.index === 0 ? [newValue[1], prevValue[1]] : [prevValue[0], newValue[1]]) }); } }; } // the uniform is a plain number without any description else if ((0, _utils.isNumber)(uniform)) { var _desc$min, _desc$max, _desc$min2; return { label: label, value1: prevValue !== null && prevValue !== void 0 ? prevValue : 0, range: [(_desc$min = desc.min) !== null && _desc$min !== void 0 ? _desc$min : 0, (_desc$max = desc.max) !== null && _desc$max !== void 0 ? _desc$max : 500], value0: (_desc$min2 = desc.min) !== null && _desc$min2 !== void 0 ? _desc$min2 : 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, newValue[1]) }); } }; } // the uniform description is {value: 0, min: 0, max: 1, ...} else if ((0, _utils.isNumber)(uniform.value)) { var _ref3, _ref4, _desc$min3, _ref5, _ref6, _desc$max2, _ref7, _ref8, _desc$min4; return { label: label, value1: prevValue || 0, range: [(_ref3 = (_ref4 = (_desc$min3 = desc.min) !== null && _desc$min3 !== void 0 ? _desc$min3 : uniform.min) !== null && _ref4 !== void 0 ? _ref4 : uniform.softMin) !== null && _ref3 !== void 0 ? _ref3 : 0, (_ref5 = (_ref6 = (_desc$max2 = desc.max) !== null && _desc$max2 !== void 0 ? _desc$max2 : uniform.max) !== null && _ref6 !== void 0 ? _ref6 : uniform.softMax) !== null && _ref5 !== void 0 ? _ref5 : 1], value0: (_ref7 = (_ref8 = (_desc$min4 = desc.min) !== null && _desc$min4 !== void 0 ? _desc$min4 : uniform.min) !== null && _ref8 !== void 0 ? _ref8 : uniform.softMin) !== null && _ref7 !== void 0 ? _ref7 : 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, newValue[1]) }); } }; } // ignore everything else for now return null; }); }, [flatParameterDescriptions, id, parameters, updateEffectConfig, uniforms]); return /*#__PURE__*/_react["default"].createElement(StyledEffectConfigurator, { key: effect.id }, flatParameterDescriptions.map(function (desc, parameterIndex) { var control = controls[parameterIndex]; if (!control) { return null; } return /*#__PURE__*/_react["default"].createElement(RegularOuterWrapper, { key: "".concat(effect.id, "-").concat(parameterIndex) }, control.label ? /*#__PURE__*/_react["default"].createElement(RegularSectionTitleWrapper, null, control.label) : null, /*#__PURE__*/_react["default"].createElement(RegularSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({ key: parameterIndex }, COMMON_SLIDER_PROPS, control)))); })); }; var EffectConfigurator = function EffectConfigurator(_ref9) { var effect = _ref9.effect, updateEffectConfig = _ref9.updateEffectConfig; return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type ? /*#__PURE__*/_react["default"].createElement(ShadowEffectConfigurator, { effect: effect, updateEffectConfig: updateEffectConfig }) : /*#__PURE__*/_react["default"].createElement(PostProcessingEffectConfigurator, { effect: effect, updateEffectConfig: updateEffectConfig }); }; return (0, _reactIntl.injectIntl)(EffectConfigurator); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9yYW5nZVNsaWRlciIsIl9pY29ucyIsIl9lZmZlY3RUaW1lQ29uZmlndXJhdG9yIiwiX2NvbXBhY3RDb2xvclBpY2tlciIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX3RlbXBsYXRlT2JqZWN0NyIsIl90ZW1wbGF0ZU9iamVjdDgiLCJfdGVtcGxhdGVPYmplY3Q5IiwiX3RlbXBsYXRlT2JqZWN0MTAiLCJfdGVtcGxhdGVPYmplY3QxMSIsIl90ZW1wbGF0ZU9iamVjdDEyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiU3R5bGVkRWZmZWN0Q29uZmlndXJhdG9yIiwic3R5bGVkIiwiZGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJlZmZlY3RDb25maWd1cmF0b3JNYXJnaW4iLCJlZmZlY3RDb25maWd1cmF0b3JQYWRkaW5nIiwiUGFuZWxMYWJlbFdyYXBwZXIiLCJleHBvcnRzIiwiU3R5bGVkQ29sb3JTZWxlY3RvcldyYXBwZXIiLCJTdHlsZWRWZXJ0aWNhbFNlcGFyYXRvciIsImlucHV0QmdkIiwiU3R5bGVkV3JhcHBlciIsIl9wcm9wcyRtYXJnaW5Cb3R0b20iLCJtYXJnaW5Cb3R0b20iLCJTdHlsZWRDb25maWdTZWN0aW9uIiwiU2VjdGlvblRpdGxlIiwiaW5wdXRGb250U2l6ZSIsImVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTEiLCJTZWN0aW9uU3ViVGl0bGUiLCJlZmZlY3RQYW5lbFRleHRTZWNvbmRhcnkyIiwiU3R5bGVTbGlkZXJXcmFwcGVyIiwiUmVndWxhck91dGVyV3JhcHBlciIsIlJlZ3VsYXJTZWN0aW9uVGl0bGVXcmFwcGVyIiwiUmVndWxhclNsaWRlcldyYXBwZXIiLCJDT01NT05fU0xJREVSX1BST1BTIiwic2hvd0lucHV0IiwiaXNSYW5nZWQiLCJzdGVwIiwibGFiZWwiLCJFZmZlY3RDb25maWd1cmF0b3JGYWN0b3J5IiwiZGVwcyIsIlJhbmdlU2xpZGVyRmFjdG9yeSIsIkVmZmVjdFRpbWVDb25maWd1cmF0b3JGYWN0b3J5IiwiUmFuZ2VTbGlkZXIiLCJFZmZlY3RUaW1lQ29uZmlndXJhdG9yIiwiU2hhZG93RWZmZWN0Q29uZmlndXJhdG9yIiwiX3JlZiIsImVmZmVjdCIsInVwZGF0ZUVmZmVjdENvbmZpZyIsInBhcmFtZXRlcnMiLCJpZCIsInNsaWRlclByb3BzIiwidXNlTWVtbyIsInByb3BOYW1lcyIsIm1hcCIsInByb3BOYW1lIiwidmFsdWUxIiwicmFuZ2UiLCJ2YWx1ZTAiLCJvbkNoYW5nZSIsInZhbHVlIiwiZXZlbnQiLCJvblRpbWVQYXJhbWV0ZXJzQ2hhbmdlZCIsInVzZUNhbGxiYWNrIiwidGltZXN0YW1wIiwidGltZXpvbmUiLCJ0aW1lTW9kZSIsImNvbG9yUGlja2VyUHJvcHMiLCJjb2xvclNldHMiLCJzZWxlY3RlZENvbG9yIiwic2V0Q29sb3IiLCJ2IiwiY3JlYXRlRWxlbWVudCIsImtleSIsImNvbG9yIiwib25TZXRDb2xvciIsIkljb24iLCJBcnJvd0Rvd25TbWFsbCIsIl9leHRlbmRzMiIsImRlZmF1bHRVbmlmb3JtcyIsIlBvc3RQcm9jZXNzaW5nRWZmZWN0Q29uZmlndXJhdG9yIiwiX3JlZjIiLCJfZWZmZWN0JGRlY2tFZmZlY3QiLCJ1bmlmb3JtcyIsImRlY2tFZmZlY3QiLCJtb2R1bGUiLCJwYXJhbWV0ZXJEZXNjcmlwdGlvbnMiLCJnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMiLCJmbGF0UGFyYW1ldGVyRGVzY3JpcHRpb25zIiwicmVkdWNlIiwiYWNjIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiQXJyYXkiLCJpc0FycmF5IiwiZGVmYXVsdFZhbHVlIiwiXyIsImluZGV4IiwiX2Rlc2NyaXB0aW9uJGxhYmVsIiwiY29udHJvbHMiLCJkZXNjIiwicGFyYW1OYW1lIiwibmFtZSIsInVuaWZvcm0iLCJwcmV2VmFsdWUiLCJuZXdWYWx1ZSIsImlzTnVtYmVyIiwiX2Rlc2MkbWluIiwiX2Rlc2MkbWF4IiwiX2Rlc2MkbWluMiIsIm1pbiIsIm1heCIsIl9yZWYzIiwiX3JlZjQiLCJfZGVzYyRtaW4zIiwiX3JlZjUiLCJfcmVmNiIsIl9kZXNjJG1heDIiLCJfcmVmNyIsIl9yZWY4IiwiX2Rlc2MkbWluNCIsInNvZnRNaW4iLCJzb2Z0TWF4IiwicGFyYW1ldGVySW5kZXgiLCJjb250cm9sIiwiY29uY2F0IiwiRWZmZWN0Q29uZmlndXJhdG9yIiwiX3JlZjkiLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsImluamVjdEludGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWZmZWN0cy9lZmZlY3QtY29uZmlndXJhdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5cbmltcG9ydCB7TElHSFRfQU5EX1NIQURPV19FRkZFQ1R9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtFZmZlY3QsIEVmZmVjdFVwZGF0ZVByb3BzfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuaW1wb3J0IFJhbmdlU2xpZGVyRmFjdG9yeSBmcm9tICcuLi9jb21tb24vcmFuZ2Utc2xpZGVyJztcbmltcG9ydCB7QXJyb3dEb3duU21hbGx9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgRWZmZWN0VGltZUNvbmZpZ3VyYXRvckZhY3RvcnkgZnJvbSAnLi9lZmZlY3QtdGltZS1jb25maWd1cmF0b3InO1xuaW1wb3J0IENvbXBhY3RDb2xvclBpY2tlciBmcm9tICcuL2NvbXBhY3QtY29sb3ItcGlja2VyJztcblxuZXhwb3J0IHR5cGUgRWZmZWN0Q29uZmlndXJhdG9yUHJvcHMgPSB7XG4gIGVmZmVjdDogRWZmZWN0O1xuICB1cGRhdGVFZmZlY3RDb25maWc6IChcbiAgICBlOiBFdmVudCB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb25maWc6IFBhcnRpYWw8RWZmZWN0VXBkYXRlUHJvcHM+XG4gICkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IFN0eWxlZEVmZmVjdENvbmZpZ3VyYXRvciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdlZmZlY3QtcGFuZWxfX2NvbmZpZydcbn0pYFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lZmZlY3RDb25maWd1cmF0b3JNYXJnaW59O1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdENvbmZpZ3VyYXRvclBhZGRpbmd9O1xuYDtcblxuZXhwb3J0IGNvbnN0IFBhbmVsTGFiZWxXcmFwcGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtcGFuZWwtcGFuZWxfX2xhYmVsLXdyYXBwZXInXG59KWBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IHNlbGYtc3RhcnQ7XG4gIG1hcmdpbi1ib3R0b206IDExcHg7XG5cbiAgLnNpZGUtcGFuZWwtcGFuZWxfX2xhYmVsIHtcbiAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgU3R5bGVkQ29sb3JTZWxlY3RvcldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBtYXJnaW4tdG9wOiAycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRWZXJ0aWNhbFNlcGFyYXRvciA9IHN0eWxlZC5kaXZgXG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmlucHV0QmdkfTtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgbWFyZ2luLWxlZnQ6IC0yMHB4O1xuYDtcblxudHlwZSBTdHlsZWRXcmFwcGVyUHJvcHMgPSB7XG4gIG1hcmdpbkJvdHRvbT86IG51bWJlcjtcbn07XG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdjxTdHlsZWRXcmFwcGVyUHJvcHM+YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206ICR7cHJvcHMgPT4gcHJvcHMubWFyZ2luQm90dG9tID8/IDl9cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRDb25maWdTZWN0aW9uID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbmA7XG5cbmNvbnN0IFNlY3Rpb25UaXRsZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEZvbnRTaXplfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MX07XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG5gO1xuXG5jb25zdCBTZWN0aW9uU3ViVGl0bGUgPSBzdHlsZWQuZGl2YFxuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRGb250U2l6ZX07XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTJ9O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG5gO1xuXG5jb25zdCBTdHlsZVNsaWRlcldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICB3aWR0aDogMTk5cHg7XG4gIGhlaWdodDogMzJweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmtnLXJhbmdlLXNsaWRlcl9faW5wdXQge1xuICAgIGhlaWdodDogMzJweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogM3B4IDZweDtcbiAgfVxuICAua2ctc2xpZGVyIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgfVxuICAua2ctcmFuZ2Utc2xpZGVyIHtcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbiAgfVxuYDtcblxuY29uc3QgUmVndWxhck91dGVyV3JhcHBlciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdlZmZlY3QtY29uZmlndXJhdG9yX19wcC1zZWN0aW9uJ1xufSlgXG4gIG1hcmdpbi1ib3R0b206IDhweDtcbmA7XG5cbmNvbnN0IFJlZ3VsYXJTZWN0aW9uVGl0bGVXcmFwcGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2VmZmVjdC1jb25maWd1cmF0b3JfX3BwLXNlY3Rpb24tdGl0bGUnXG59KWBcbiAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmlucHV0Rm9udFNpemV9O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lZmZlY3RQYW5lbFRleHRTZWNvbmRhcnkxfTtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gIG1hcmdpbi1ib3R0b206IC0zcHg7XG5gO1xuXG5jb25zdCBSZWd1bGFyU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdlZmZlY3QtY29uZmlndXJhdG9yX19wcC1zZWN0aW9uLWNvbnRyb2wnXG59KWBcbiAgaGVpZ2h0OiAzMnB4O1xuICAua2ctcmFuZ2Utc2xpZGVyX19pbnB1dCB7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAzcHggNnB4O1xuICB9XG4gIC5rZy1zbGlkZXIge1xuICAgIHBhZGRpbmctbGVmdDogNnB4O1xuICB9XG4gIC5rZy1yYW5nZS1zbGlkZXIge1xuICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xuICB9XG5gO1xuXG5jb25zdCBDT01NT05fU0xJREVSX1BST1BTID0ge1xuICBzaG93SW5wdXQ6IHRydWUsXG4gIGlzUmFuZ2VkOiBmYWxzZSxcbiAgc3RlcDogMC4wMDEsXG4gIGxhYmVsOiAndmFsdWUnXG59O1xuXG50eXBlIEVmZmVjdFBhcmFtZXRlckRlc2NyaXB0aW9uRmxhdHRlbmVkID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nIHwgZmFsc2UgfCAoc3RyaW5nIHwgZmFsc2UpW107XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG59O1xuXG5FZmZlY3RDb25maWd1cmF0b3JGYWN0b3J5LmRlcHMgPSBbUmFuZ2VTbGlkZXJGYWN0b3J5LCBFZmZlY3RUaW1lQ29uZmlndXJhdG9yRmFjdG9yeV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVmZmVjdENvbmZpZ3VyYXRvckZhY3RvcnkoXG4gIFJhbmdlU2xpZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBSYW5nZVNsaWRlckZhY3Rvcnk+LFxuICBFZmZlY3RUaW1lQ29uZmlndXJhdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBFZmZlY3RUaW1lQ29uZmlndXJhdG9yRmFjdG9yeT5cbik6IFJlYWN0LkZDPEVmZmVjdENvbmZpZ3VyYXRvclByb3BzPiB7XG4gIGNvbnN0IFNoYWRvd0VmZmVjdENvbmZpZ3VyYXRvcjogUmVhY3QuRkM8RWZmZWN0Q29uZmlndXJhdG9yUHJvcHM+ID0gKHtcbiAgICBlZmZlY3QsXG4gICAgdXBkYXRlRWZmZWN0Q29uZmlnXG4gIH0pID0+IHtcbiAgICBjb25zdCB7cGFyYW1ldGVycywgaWR9ID0gZWZmZWN0O1xuXG4gICAgY29uc3Qgc2xpZGVyUHJvcHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BOYW1lcyA9IFsnc2hhZG93SW50ZW5zaXR5JywgJ2FtYmllbnRMaWdodEludGVuc2l0eScsICdzdW5MaWdodEludGVuc2l0eSddO1xuICAgICAgcmV0dXJuIHByb3BOYW1lcy5tYXAocHJvcE5hbWUgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlMTogcGFyYW1ldGVyc1twcm9wTmFtZV0sXG4gICAgICAgICAgcmFuZ2U6IFswLCAxXSxcbiAgICAgICAgICB2YWx1ZTA6IDAsXG4gICAgICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogbnVtYmVyW10sIGV2ZW50PzogRXZlbnQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVFZmZlY3RDb25maWcoZXZlbnQsIGlkLCB7cGFyYW1ldGVyczoge1twcm9wTmFtZV06IHZhbHVlWzFdfX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sIFtpZCwgcGFyYW1ldGVycywgdXBkYXRlRWZmZWN0Q29uZmlnXSk7XG5cbiAgICBjb25zdCBvblRpbWVQYXJhbWV0ZXJzQ2hhbmdlZCA9IHVzZUNhbGxiYWNrKFxuICAgICAgcGFyYW1ldGVycyA9PiB7XG4gICAgICAgIHVwZGF0ZUVmZmVjdENvbmZpZyhudWxsLCBpZCwge1xuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIC4uLihwYXJhbWV0ZXJzLnRpbWVzdGFtcCA/IHt0aW1lc3RhbXA6IHBhcmFtZXRlcnMudGltZXN0YW1wfSA6IG51bGwpLFxuICAgICAgICAgICAgLi4uKHBhcmFtZXRlcnMudGltZXpvbmUgPyB7dGltZXpvbmU6IHBhcmFtZXRlcnMudGltZXpvbmV9IDogbnVsbCksXG4gICAgICAgICAgICAuLi4ocGFyYW1ldGVycy50aW1lTW9kZSA/IHt0aW1lTW9kZTogcGFyYW1ldGVycy50aW1lTW9kZX0gOiBudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgW2lkLCB1cGRhdGVFZmZlY3RDb25maWddXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbG9yUGlja2VyUHJvcHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BOYW1lcyA9IFsnYW1iaWVudExpZ2h0Q29sb3InLCAnc3VuTGlnaHRDb2xvcicsICdzaGFkb3dDb2xvciddO1xuICAgICAgcmV0dXJuIHByb3BOYW1lcy5tYXAocHJvcE5hbWUgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbG9yU2V0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yOiBwYXJhbWV0ZXJzW3Byb3BOYW1lXSxcbiAgICAgICAgICAgICAgc2V0Q29sb3I6IHYgPT4gdXBkYXRlRWZmZWN0Q29uZmlnKG51bGwsIGlkLCB7cGFyYW1ldGVyczoge1twcm9wTmFtZV06IHZ9fSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LCBbaWQsIHBhcmFtZXRlcnMsIHVwZGF0ZUVmZmVjdENvbmZpZ10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRFZmZlY3RDb25maWd1cmF0b3Iga2V5PXtlZmZlY3QuaWR9PlxuICAgICAgICA8UGFuZWxMYWJlbFdyYXBwZXI+XG4gICAgICAgICAgPFNlY3Rpb25UaXRsZT57J0RhdGUgJiBUaW1lJ308L1NlY3Rpb25UaXRsZT5cbiAgICAgICAgPC9QYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgPEVmZmVjdFRpbWVDb25maWd1cmF0b3JcbiAgICAgICAgICB0aW1lc3RhbXA9e3BhcmFtZXRlcnMudGltZXN0YW1wfVxuICAgICAgICAgIHRpbWV6b25lPXtwYXJhbWV0ZXJzLnRpbWV6b25lfVxuICAgICAgICAgIHRpbWVNb2RlPXtwYXJhbWV0ZXJzLnRpbWVNb2RlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvblRpbWVQYXJhbWV0ZXJzQ2hhbmdlZH1cbiAgICAgICAgLz5cblxuICAgICAgICA8U3R5bGVkVmVydGljYWxTZXBhcmF0b3IgLz5cblxuICAgICAgICA8U3R5bGVkV3JhcHBlciBtYXJnaW5Cb3R0b209ezB9PlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+eydTaGFkb3cnfTwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyIG1hcmdpbkJvdHRvbT17MTZ9PlxuICAgICAgICAgIDxDb21wYWN0Q29sb3JQaWNrZXJcbiAgICAgICAgICAgIGxhYmVsPXsnQ29sb3InfVxuICAgICAgICAgICAgY29sb3I9e2NvbG9yUGlja2VyUHJvcHNbMl0uY29sb3JTZXRzWzBdLnNlbGVjdGVkQ29sb3J9XG4gICAgICAgICAgICBvblNldENvbG9yPXtjb2xvclBpY2tlclByb3BzWzJdLmNvbG9yU2V0c1swXS5zZXRDb2xvcn1cbiAgICAgICAgICAgIEljb249e0Fycm93RG93blNtYWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFN0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgICAgICA8U2VjdGlvblN1YlRpdGxlPkludGVuc2l0eTwvU2VjdGlvblN1YlRpdGxlPlxuICAgICAgICAgICAgPFN0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgICAgPFJhbmdlU2xpZGVyIHsuLi5DT01NT05fU0xJREVSX1BST1BTfSB7Li4uc2xpZGVyUHJvcHNbMF19IC8+XG4gICAgICAgICAgICA8L1N0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICA8L1N0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cblxuICAgICAgICA8U3R5bGVkV3JhcHBlciBtYXJnaW5Cb3R0b209ezB9PlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+eydBbWJpZW50IGxpZ2h0J308L1NlY3Rpb25UaXRsZT5cbiAgICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuICAgICAgICA8U3R5bGVkV3JhcHBlciBtYXJnaW5Cb3R0b209ezE2fT5cbiAgICAgICAgICA8Q29tcGFjdENvbG9yUGlja2VyXG4gICAgICAgICAgICBsYWJlbD17J0NvbG9yJ31cbiAgICAgICAgICAgIGNvbG9yPXtjb2xvclBpY2tlclByb3BzWzBdLmNvbG9yU2V0c1swXS5zZWxlY3RlZENvbG9yfVxuICAgICAgICAgICAgb25TZXRDb2xvcj17Y29sb3JQaWNrZXJQcm9wc1swXS5jb2xvclNldHNbMF0uc2V0Q29sb3J9XG4gICAgICAgICAgICBJY29uPXtBcnJvd0Rvd25TbWFsbH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTdHlsZWRDb25maWdTZWN0aW9uPlxuICAgICAgICAgICAgPFNlY3Rpb25TdWJUaXRsZT5JbnRlbnNpdHk8L1NlY3Rpb25TdWJUaXRsZT5cbiAgICAgICAgICAgIDxTdHlsZVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICAgIDxSYW5nZVNsaWRlciB7Li4uQ09NTU9OX1NMSURFUl9QUk9QU30gey4uLnNsaWRlclByb3BzWzFdfSAvPlxuICAgICAgICAgICAgPC9TdHlsZVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgPC9TdHlsZWRDb25maWdTZWN0aW9uPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG5cbiAgICAgICAgPFN0eWxlZFdyYXBwZXIgbWFyZ2luQm90dG9tPXswfT5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPnsnU3VuIGxpZ2h0J308L1NlY3Rpb25UaXRsZT5cbiAgICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuICAgICAgICA8U3R5bGVkV3JhcHBlciBtYXJnaW5Cb3R0b209ezB9PlxuICAgICAgICAgIDxDb21wYWN0Q29sb3JQaWNrZXJcbiAgICAgICAgICAgIGxhYmVsPXsnQ29sb3InfVxuICAgICAgICAgICAgY29sb3I9e2NvbG9yUGlja2VyUHJvcHNbMV0uY29sb3JTZXRzWzBdLnNlbGVjdGVkQ29sb3J9XG4gICAgICAgICAgICBvblNldENvbG9yPXtjb2xvclBpY2tlclByb3BzWzFdLmNvbG9yU2V0c1swXS5zZXRDb2xvcn1cbiAgICAgICAgICAgIEljb249e0Fycm93RG93blNtYWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFN0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgICAgICA8U2VjdGlvblN1YlRpdGxlPkludGVuc2l0eTwvU2VjdGlvblN1YlRpdGxlPlxuICAgICAgICAgICAgPFN0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgICAgPFJhbmdlU2xpZGVyIHsuLi5DT01NT05fU0xJREVSX1BST1BTfSB7Li4uc2xpZGVyUHJvcHNbMl19IC8+XG4gICAgICAgICAgICA8L1N0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICA8L1N0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cbiAgICAgIDwvU3R5bGVkRWZmZWN0Q29uZmlndXJhdG9yPlxuICAgICk7XG4gIH07XG4gIGNvbnN0IGRlZmF1bHRVbmlmb3JtcyA9IHt9O1xuXG4gIGNvbnN0IFBvc3RQcm9jZXNzaW5nRWZmZWN0Q29uZmlndXJhdG9yOiBSZWFjdC5GQzxFZmZlY3RDb25maWd1cmF0b3JQcm9wcz4gPSAoe1xuICAgIGVmZmVjdCxcbiAgICB1cGRhdGVFZmZlY3RDb25maWdcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHVuaWZvcm1zID0gZWZmZWN0LmRlY2tFZmZlY3Q/Lm1vZHVsZS51bmlmb3JtcyB8fCBkZWZhdWx0VW5pZm9ybXM7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVzY3JpcHRpb25zID0gZWZmZWN0LmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpO1xuICAgIGNvbnN0IHtwYXJhbWV0ZXJzLCBpZH0gPSBlZmZlY3Q7XG4gICAgY29uc3QgZmxhdFBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9ucy5yZWR1Y2UoKGFjYywgZGVzY3JpcHRpb24pID0+IHtcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAvLyBzcGxpdCBhcnJheXMgb2YgY29udHJvbHMgaW50byBhIHNlcGFyYXRlIGNvbnRyb2xzIGZvciBlYWNoIGNvbXBvbmVudFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlc2NyaXB0aW9uLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmRlZmF1bHRWYWx1ZS5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBhY2MucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGRlc2NyaXB0aW9uLmxhYmVsPy5baW5kZXhdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyBFZmZlY3RQYXJhbWV0ZXJEZXNjcmlwdGlvbkZsYXR0ZW5lZFtdKTtcbiAgICB9LCBbcGFyYW1ldGVyRGVzY3JpcHRpb25zXSk7XG5cbiAgICBjb25zdCBjb250cm9scyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZsYXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMubWFwKGRlc2MgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBkZXNjLm5hbWU7XG5cbiAgICAgICAgY29uc3QgdW5pZm9ybSA9IHVuaWZvcm1zW2Rlc2MubmFtZV07XG4gICAgICAgIGlmICgoIXVuaWZvcm0gJiYgdW5pZm9ybSAhPT0gMCkgfHwgdW5pZm9ybS5wcml2YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSBwYXJhbWV0ZXJzW3BhcmFtTmFtZV07XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBkZXNjLmxhYmVsID09PSBmYWxzZSA/IGZhbHNlIDogZGVzYy5sYWJlbCB8fCBkZXNjLm5hbWU7XG5cbiAgICAgICAgLy8gdGhlIHVuaWZvcm0gaXMgW251bWJlciwgbnVtYmVyXSBhcnJheVxuICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTE6IHByZXZWYWx1ZVtkZXNjLmluZGV4IHx8IDBdIHx8IDAsXG4gICAgICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICAgICAgdmFsdWUwOiAwLFxuICAgICAgICAgICAgb25DaGFuZ2U6IChuZXdWYWx1ZTogbnVtYmVyW10sIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIHVwZGF0ZUVmZmVjdENvbmZpZyhldmVudCwgaWQsIHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBbcGFyYW1OYW1lXTpcbiAgICAgICAgICAgICAgICAgICAgZGVzYy5pbmRleCA9PT0gMCA/IFtuZXdWYWx1ZVsxXSwgcHJldlZhbHVlWzFdXSA6IFtwcmV2VmFsdWVbMF0sIG5ld1ZhbHVlWzFdXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgdW5pZm9ybSBpcyBhIHBsYWluIG51bWJlciB3aXRob3V0IGFueSBkZXNjcmlwdGlvblxuICAgICAgICBlbHNlIGlmIChpc051bWJlcih1bmlmb3JtKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHZhbHVlMTogcHJldlZhbHVlID8/IDAsXG4gICAgICAgICAgICByYW5nZTogW2Rlc2MubWluID8/IDAsIGRlc2MubWF4ID8/IDUwMF0sXG4gICAgICAgICAgICB2YWx1ZTA6IGRlc2MubWluID8/IDAsXG4gICAgICAgICAgICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBudW1iZXJbXSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgdXBkYXRlRWZmZWN0Q29uZmlnKGV2ZW50LCBpZCwge3BhcmFtZXRlcnM6IHtbcGFyYW1OYW1lXTogbmV3VmFsdWVbMV19fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgdW5pZm9ybSBkZXNjcmlwdGlvbiBpcyB7dmFsdWU6IDAsIG1pbjogMCwgbWF4OiAxLCAuLi59XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyKHVuaWZvcm0udmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUxOiBwcmV2VmFsdWUgfHwgMCxcbiAgICAgICAgICAgIHJhbmdlOiBbXG4gICAgICAgICAgICAgIGRlc2MubWluID8/IHVuaWZvcm0ubWluID8/IHVuaWZvcm0uc29mdE1pbiA/PyAwLFxuICAgICAgICAgICAgICBkZXNjLm1heCA/PyB1bmlmb3JtLm1heCA/PyB1bmlmb3JtLnNvZnRNYXggPz8gMVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHZhbHVlMDogZGVzYy5taW4gPz8gdW5pZm9ybS5taW4gPz8gdW5pZm9ybS5zb2Z0TWluID8/IDAsXG4gICAgICAgICAgICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBudW1iZXJbXSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgdXBkYXRlRWZmZWN0Q29uZmlnKGV2ZW50LCBpZCwge3BhcmFtZXRlcnM6IHtbcGFyYW1OYW1lXTogbmV3VmFsdWVbMV19fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlnbm9yZSBldmVyeXRoaW5nIGVsc2UgZm9yIG5vd1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0sIFtmbGF0UGFyYW1ldGVyRGVzY3JpcHRpb25zLCBpZCwgcGFyYW1ldGVycywgdXBkYXRlRWZmZWN0Q29uZmlnLCB1bmlmb3Jtc10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRFZmZlY3RDb25maWd1cmF0b3Iga2V5PXtlZmZlY3QuaWR9PlxuICAgICAgICB7ZmxhdFBhcmFtZXRlckRlc2NyaXB0aW9ucy5tYXAoKGRlc2MsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xzW3BhcmFtZXRlckluZGV4XTtcbiAgICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8UmVndWxhck91dGVyV3JhcHBlciBrZXk9e2Ake2VmZmVjdC5pZH0tJHtwYXJhbWV0ZXJJbmRleH1gfT5cbiAgICAgICAgICAgICAge2NvbnRyb2wubGFiZWwgPyAoXG4gICAgICAgICAgICAgICAgPFJlZ3VsYXJTZWN0aW9uVGl0bGVXcmFwcGVyPntjb250cm9sLmxhYmVsfTwvUmVndWxhclNlY3Rpb25UaXRsZVdyYXBwZXI+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8UmVndWxhclNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICAgICAgPFJhbmdlU2xpZGVyIGtleT17cGFyYW1ldGVySW5kZXh9IHsuLi5DT01NT05fU0xJREVSX1BST1BTfSB7Li4uY29udHJvbH0gLz5cbiAgICAgICAgICAgICAgPC9SZWd1bGFyU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgIDwvUmVndWxhck91dGVyV3JhcHBlcj5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvU3R5bGVkRWZmZWN0Q29uZmlndXJhdG9yPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgRWZmZWN0Q29uZmlndXJhdG9yID0gKHtcbiAgICBlZmZlY3QsXG4gICAgdXBkYXRlRWZmZWN0Q29uZmlnXG4gIH06IEVmZmVjdENvbmZpZ3VyYXRvclByb3BzICYge2ludGw6IEludGxTaGFwZX0pID0+IHtcbiAgICByZXR1cm4gZWZmZWN0LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGUgPyAoXG4gICAgICA8U2hhZG93RWZmZWN0Q29uZmlndXJhdG9yIGVmZmVjdD17ZWZmZWN0fSB1cGRhdGVFZmZlY3RDb25maWc9e3VwZGF0ZUVmZmVjdENvbmZpZ30gLz5cbiAgICApIDogKFxuICAgICAgPFBvc3RQcm9jZXNzaW5nRWZmZWN0Q29uZmlndXJhdG9yIGVmZmVjdD17ZWZmZWN0fSB1cGRhdGVFZmZlY3RDb25maWc9e3VwZGF0ZUVmZmVjdENvbmZpZ30gLz5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBpbmplY3RJbnRsKEVmZmVjdENvbmZpZ3VyYXRvcik7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxZQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSx1QkFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsbUJBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUF3RCxJQUFBVSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBZHhEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFB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