UNPKG

kepler.gl

Version:

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

258 lines (253 loc) 40.4 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"] = exports.classList = exports.ListItem = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _constants = require("@kepler.gl/constants"); var _templateObject, _templateObject2; // 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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var LEFT_BUTTON = 0; var classList = exports.classList = { list: 'list-selector', listHeader: 'list__header', listSection: 'list__section', listItem: 'list__item', listItemAnchor: 'list__item__anchor', listItemFixed: 'list__item__fixed' }; var defaultDisplay = function defaultDisplay(d) { return d; }; var ListItem = exports.ListItem = function ListItem(_ref) { var value = _ref.value, _ref$displayOption = _ref.displayOption, displayOption = _ref$displayOption === void 0 ? defaultDisplay : _ref$displayOption, disabled = _ref.disabled; var displayValue = displayOption(value); return /*#__PURE__*/_react["default"].createElement("span", { title: displayValue, className: (0, _classnames["default"])(classList.listItemAnchor, { disabled: disabled }) }, displayValue); }; var DropdownListWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n border-top: 1px solid\n ", ";\n ", ";\n"])), function (props) { return props.light ? props.theme.dropdownListBgdLT : props.theme.dropdownListBgd; }, function (props) { return props.light ? props.theme.dropdownListBorderTopLT : props.theme.dropdownListBorderTop; }, function (props) { return props.light ? props.theme.dropdownListLT : props.theme.dropdownList; }); var DropdownFooterWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n height: '0px';\n"]))); // TODO: make Option a generic type var DropdownList = exports["default"] = /*#__PURE__*/function (_Component) { function DropdownList(props) { var _this; (0, _classCallCheck2["default"])(this, DropdownList); _this = _callSuper(this, DropdownList, [props]); (0, _defineProperty2["default"])(_this, "initNumberOfOptions", void 0); (0, _defineProperty2["default"])(_this, "page", void 0); (0, _defineProperty2["default"])(_this, "prevY", void 0); (0, _defineProperty2["default"])(_this, "loadingRef", void 0); (0, _defineProperty2["default"])(_this, "observer", void 0); (0, _defineProperty2["default"])(_this, "handleObserver", function (entities) { var y = entities[0].boundingClientRect.y; if (_this.prevY > y) { var options = _this._getOptions(_this.page); if (options) _this.setState({ options: options }); } _this.prevY = y; }); _this.state = { options: [] }; _this.initNumberOfOptions = _constants.INIT_FILTER_ITEMS_IN_DROPDOWN; _this.page = 0; _this.prevY = 0; _this.loadingRef = /*#__PURE__*/_react["default"].createRef(); return _this; } (0, _inherits2["default"])(DropdownList, _Component); return (0, _createClass2["default"])(DropdownList, [{ key: "componentDidMount", value: function componentDidMount() { var options = this._getOptions(this.page); this.setState({ options: options }); var divOptions = { root: null, rootMargin: '0%', threshold: 1.0 }; if (this.loadingRef.current) { this.observer = new IntersectionObserver(this.handleObserver, divOptions); this.observer.observe(this.loadingRef.current); } } }, { key: "getSnapshotBeforeUpdate", value: function getSnapshotBeforeUpdate(prevProps) { if (prevProps.options !== this.props.options) { // check if user searching, reset state.options at the first time var options = this._getOptions(0); this.setState({ options: options }); } return null; } // prevent console warning: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). }, { key: "componentDidUpdate", value: function componentDidUpdate() { return; } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.loadingRef.current) { var _this$observer, _this$loadingRef; (_this$observer = this.observer) === null || _this$observer === void 0 || _this$observer.unobserve((_this$loadingRef = this.loadingRef) === null || _this$loadingRef === void 0 ? void 0 : _this$loadingRef.current); this.page = 0; this.prevY = 0; } } }, { key: "_getOptions", value: function _getOptions(page) { if (!this.props.options) { return []; } var n = this.props.options.length; if (n === 0) { return []; } var start = page * this.initNumberOfOptions; var end = start + this.initNumberOfOptions > n ? n : start + this.initNumberOfOptions; if (start < end && end <= n) { this.page = page + 1; // in case of user searching, props.options will be updated // so "page" value will be set to 0 and previous state.options will be discarded return [].concat((0, _toConsumableArray2["default"])(page > 0 ? this.state.options || [] : []), (0, _toConsumableArray2["default"])(this.props.options.slice(start, end))); } return null; } }, { key: "_onClick", value: function _onClick(result, event) { event.preventDefault(); // only work when left is clicked if (event.type === 'mousedown' && event.button === LEFT_BUTTON || event.type === 'click') { var _this$props$onOptionS, _this$props; (_this$props$onOptionS = (_this$props = this.props).onOptionSelected) === null || _this$props$onOptionS === void 0 || _this$props$onOptionS.call(_this$props, result, event); } } }, { key: "render", value: function render() { var _this$props$options, _this$props$customCla, _this$props$customCla2, _this2 = this, _this$state$options; var _this$props2 = this.props, fixedOptions = _this$props2.fixedOptions, light = _this$props2.light, _this$props2$allowCus = _this$props2.allowCustomValues, allowCustomValues = _this$props2$allowCus === void 0 ? 0 : _this$props2$allowCus, _this$props2$customLi = _this$props2.customListItemComponent, CustomListItemComponent = _this$props2$customLi === void 0 ? ListItem : _this$props2$customLi; var _this$props$displayOp = this.props.displayOption, display = _this$props$displayOp === void 0 ? defaultDisplay : _this$props$displayOp; // Don't render if there are no options to display if (!((_this$props$options = this.props.options) !== null && _this$props$options !== void 0 && _this$props$options.length) && allowCustomValues <= 0) { return /*#__PURE__*/_react["default"].createElement("div", null); } var valueOffset = Array.isArray(fixedOptions) ? fixedOptions.length : 0; // For some reason onClick is not fired when clicked on an option // onMouseDown is used here as a workaround of #205 and other return /*#__PURE__*/_react["default"].createElement(DropdownListWrapper, { className: (0, _classnames["default"])(classList.list, (_this$props$customCla = this.props.customClasses) === null || _this$props$customCla === void 0 ? void 0 : _this$props$customCla.results), light: light }, this.props.customListHeaderComponent ? /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])(classList.listHeader, (_this$props$customCla2 = this.props.customClasses) === null || _this$props$customCla2 === void 0 ? void 0 : _this$props$customCla2.listHeader) }, /*#__PURE__*/_react["default"].createElement(this.props.customListHeaderComponent, null)) : null, valueOffset > 0 ? /*#__PURE__*/_react["default"].createElement("div", { className: classList.listSection }, fixedOptions === null || fixedOptions === void 0 ? void 0 : fixedOptions.map(function (value, i) { var _this2$props$customCl; return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])(classList.listItem, (0, _defineProperty2["default"])({ hover: _this2.props.selectionIndex === i }, classList.listItemFixed, true), (_this2$props$customCl = _this2.props.customClasses) === null || _this2$props$customCl === void 0 ? void 0 : _this2$props$customCl.listItem), key: "".concat(display(value), "_").concat(i), onMouseDown: function onMouseDown(e) { return _this2._onClick(value, e); }, onClick: function onClick(e) { return _this2._onClick(value, e); } }, /*#__PURE__*/_react["default"].createElement(CustomListItemComponent, { value: value, displayOption: display, light: light })); })) : null, (_this$state$options = this.state.options) === null || _this$state$options === void 0 ? void 0 : _this$state$options.map(function (value, i) { var _this2$props$customCl2; return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])(classList.listItem, { hover: _this2.props.selectionIndex === i + valueOffset, selected: (_this2.props.selectedItems || []).find(function (item) { return display(item) === display(value); }) }, (_this2$props$customCl2 = _this2.props.customClasses) === null || _this2$props$customCl2 === void 0 ? void 0 : _this2$props$customCl2.listItem), key: "".concat(display(value), "_").concat(i), onMouseDown: function onMouseDown(e) { return _this2._onClick(value, e); }, onClick: function onClick(e) { return _this2._onClick(value, e); } }, /*#__PURE__*/_react["default"].createElement(CustomListItemComponent, { value: value, displayOption: display })); }), /*#__PURE__*/_react["default"].createElement(DropdownFooterWrapper, { ref: this.loadingRef })); } }]); }(_react.Component); (0, _defineProperty2["default"])(DropdownList, "defaultProps", { customClasses: {}, customListItemComponent: ListItem, customListHeaderComponent: null, allowCustomValues: 0, customValues: [], displayOption: defaultDisplay, onOptionSelected: function onOptionSelected() { return; }, defaultClassNames: true, selectionIndex: null }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJMRUZUX0JVVFRPTiIsImNsYXNzTGlzdCIsImV4cG9ydHMiLCJsaXN0IiwibGlzdEhlYWRlciIsImxpc3RTZWN0aW9uIiwibGlzdEl0ZW0iLCJsaXN0SXRlbUFuY2hvciIsImxpc3RJdGVtRml4ZWQiLCJkZWZhdWx0RGlzcGxheSIsImQiLCJMaXN0SXRlbSIsIl9yZWYiLCJ2YWx1ZSIsIl9yZWYkZGlzcGxheU9wdGlvbiIsImRpc3BsYXlPcHRpb24iLCJkaXNhYmxlZCIsImRpc3BsYXlWYWx1ZSIsImNyZWF0ZUVsZW1lbnQiLCJ0aXRsZSIsImNsYXNzTmFtZSIsImNsYXNzTmFtZXMiLCJEcm9wZG93bkxpc3RXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsImxpZ2h0IiwidGhlbWUiLCJkcm9wZG93bkxpc3RCZ2RMVCIsImRyb3Bkb3duTGlzdEJnZCIsImRyb3Bkb3duTGlzdEJvcmRlclRvcExUIiwiZHJvcGRvd25MaXN0Qm9yZGVyVG9wIiwiZHJvcGRvd25MaXN0TFQiLCJkcm9wZG93bkxpc3QiLCJEcm9wZG93bkZvb3RlcldyYXBwZXIiLCJEcm9wZG93bkxpc3QiLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsImVudGl0aWVzIiwieSIsImJvdW5kaW5nQ2xpZW50UmVjdCIsInByZXZZIiwib3B0aW9ucyIsIl9nZXRPcHRpb25zIiwicGFnZSIsInNldFN0YXRlIiwic3RhdGUiLCJpbml0TnVtYmVyT2ZPcHRpb25zIiwiSU5JVF9GSUxURVJfSVRFTVNfSU5fRFJPUERPV04iLCJsb2FkaW5nUmVmIiwiUmVhY3QiLCJjcmVhdGVSZWYiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImNvbXBvbmVudERpZE1vdW50IiwiZGl2T3B0aW9ucyIsInJvb3QiLCJyb290TWFyZ2luIiwidGhyZXNob2xkIiwiY3VycmVudCIsIm9ic2VydmVyIiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJoYW5kbGVPYnNlcnZlciIsIm9ic2VydmUiLCJnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSIsInByZXZQcm9wcyIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiX3RoaXMkb2JzZXJ2ZXIiLCJfdGhpcyRsb2FkaW5nUmVmIiwidW5vYnNlcnZlIiwibGVuZ3RoIiwic3RhcnQiLCJlbmQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwic2xpY2UiLCJfb25DbGljayIsInJlc3VsdCIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJ0eXBlIiwiYnV0dG9uIiwiX3RoaXMkcHJvcHMkb25PcHRpb25TIiwiX3RoaXMkcHJvcHMiLCJvbk9wdGlvblNlbGVjdGVkIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMkb3B0aW9ucyIsIl90aGlzJHByb3BzJGN1c3RvbUNsYSIsIl90aGlzJHByb3BzJGN1c3RvbUNsYTIiLCJfdGhpczIiLCJfdGhpcyRzdGF0ZSRvcHRpb25zIiwiX3RoaXMkcHJvcHMyIiwiZml4ZWRPcHRpb25zIiwiX3RoaXMkcHJvcHMyJGFsbG93Q3VzIiwiYWxsb3dDdXN0b21WYWx1ZXMiLCJfdGhpcyRwcm9wczIkY3VzdG9tTGkiLCJjdXN0b21MaXN0SXRlbUNvbXBvbmVudCIsIkN1c3RvbUxpc3RJdGVtQ29tcG9uZW50IiwiX3RoaXMkcHJvcHMkZGlzcGxheU9wIiwiZGlzcGxheSIsInZhbHVlT2Zmc2V0IiwiQXJyYXkiLCJpc0FycmF5IiwiY3VzdG9tQ2xhc3NlcyIsInJlc3VsdHMiLCJjdXN0b21MaXN0SGVhZGVyQ29tcG9uZW50IiwibWFwIiwiX3RoaXMyJHByb3BzJGN1c3RvbUNsIiwiaG92ZXIiLCJzZWxlY3Rpb25JbmRleCIsIm9uTW91c2VEb3duIiwib25DbGljayIsIl90aGlzMiRwcm9wcyRjdXN0b21DbDIiLCJzZWxlY3RlZCIsInNlbGVjdGVkSXRlbXMiLCJmaW5kIiwiaXRlbSIsInJlZiIsIkNvbXBvbmVudCIsImN1c3RvbVZhbHVlcyIsImRlZmF1bHRDbGFzc05hbWVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2Ryb3Bkb3duLWxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgRWxlbWVudFR5cGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCwge0lTdHlsZWRDb21wb25lbnR9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7SU5JVF9GSUxURVJfSVRFTVNfSU5fRFJPUERPV059IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7QmFzZUNvbXBvbmVudFByb3BzfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IExFRlRfQlVUVE9OID0gMDtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTGlzdCA9IHtcbiAgbGlzdDogJ2xpc3Qtc2VsZWN0b3InLFxuICBsaXN0SGVhZGVyOiAnbGlzdF9faGVhZGVyJyxcbiAgbGlzdFNlY3Rpb246ICdsaXN0X19zZWN0aW9uJyxcbiAgbGlzdEl0ZW06ICdsaXN0X19pdGVtJyxcbiAgbGlzdEl0ZW1BbmNob3I6ICdsaXN0X19pdGVtX19hbmNob3InLFxuICBsaXN0SXRlbUZpeGVkOiAnbGlzdF9faXRlbV9fZml4ZWQnXG59O1xuXG5leHBvcnQgdHlwZSBMaXN0SXRlbVByb3BzPE9wdGlvbj4gPSB7XG4gIHZhbHVlOiBPcHRpb247XG4gIGRpc3BsYXlPcHRpb246IChvcHQ6IE9wdGlvbikgPT4gc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGxpZ2h0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IGRlZmF1bHREaXNwbGF5ID0gZCA9PiBkO1xuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gKHt2YWx1ZSwgZGlzcGxheU9wdGlvbiA9IGRlZmF1bHREaXNwbGF5LCBkaXNhYmxlZH06IExpc3RJdGVtUHJvcHM8YW55PikgPT4ge1xuICBjb25zdCBkaXNwbGF5VmFsdWUgPSBkaXNwbGF5T3B0aW9uKHZhbHVlKTtcbiAgcmV0dXJuIChcbiAgICA8c3BhbiB0aXRsZT17ZGlzcGxheVZhbHVlfSBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NMaXN0Lmxpc3RJdGVtQW5jaG9yLCB7ZGlzYWJsZWR9KX0+XG4gICAgICB7ZGlzcGxheVZhbHVlfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIERyb3Bkb3duTGlzdFdyYXBwZXJQcm9wcyA9IEJhc2VDb21wb25lbnRQcm9wcyAmIHtcbiAgbGlnaHQ/OiBib29sZWFuO1xufTtcblxuY29uc3QgRHJvcGRvd25MaXN0V3JhcHBlcjogSVN0eWxlZENvbXBvbmVudDxcbiAgJ3dlYicsXG4gIERyb3Bkb3duTGlzdFdyYXBwZXJQcm9wc1xuPiA9IHN0eWxlZC5kaXY8RHJvcGRvd25MaXN0V3JhcHBlclByb3BzPmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PlxuICAgIHByb3BzLmxpZ2h0ID8gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0QmdkTFQgOiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RCZ2R9O1xuICBib3JkZXItdG9wOiAxcHggc29saWRcbiAgICAke3Byb3BzID0+XG4gICAgICBwcm9wcy5saWdodCA/IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEJvcmRlclRvcExUIDogcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0Qm9yZGVyVG9wfTtcbiAgJHtwcm9wcyA9PiAocHJvcHMubGlnaHQgPyBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RMVCA6IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdCl9O1xuYDtcblxuY29uc3QgRHJvcGRvd25Gb290ZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgaGVpZ2h0OiAnMHB4JztcbmA7XG5cbnR5cGUgT3B0aW9uID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG9iamVjdCB8IGFueTtcbi8vIFRPRE86IG1ha2UgT3B0aW9uIGEgZ2VuZXJpYyB0eXBlXG5pbnRlcmZhY2UgRHJvcGRvd25MaXN0UHJvcHMge1xuICBvcHRpb25zPzogT3B0aW9uW107XG4gIGFsbG93Q3VzdG9tVmFsdWVzPzogbnVtYmVyO1xuICBjdXN0b21DbGFzc2VzPzoge2xpc3RIZWFkZXI/OiBzdHJpbmc7IGxpc3RJdGVtPzogc3RyaW5nOyByZXN1bHRzPzogc3RyaW5nfTtcbiAgY3VzdG9tVmFsdWVzPzogYW55W107XG4gIGN1c3RvbUxpc3RJdGVtQ29tcG9uZW50PzogRWxlbWVudFR5cGU7XG4gIGN1c3RvbUxpc3RIZWFkZXJDb21wb25lbnQ/OiBFbGVtZW50VHlwZTtcbiAgc2VsZWN0aW9uSW5kZXg/OiBudW1iZXI7XG4gIG9uT3B0aW9uU2VsZWN0ZWQ/OiAob3B0aW9uOiBPcHRpb24sIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBkaXNwbGF5T3B0aW9uPzogKG9wdGlvbjogT3B0aW9uKSA9PiBzdHJpbmc7XG4gIGRlZmF1bHRDbGFzc05hbWVzPzogYm9vbGVhbjtcbiAgYXJlUmVzdWx0c1RydW5jYXRlZD86IGJvb2xlYW47XG4gIHJlc3VsdHNUcnVuY2F0ZWRNZXNzYWdlPzogc3RyaW5nO1xuICBsaXN0SXRlbUNvbXBvbmVudD86IEVsZW1lbnRUeXBlO1xuICBsaWdodD86IGJvb2xlYW47XG4gIGZpeGVkT3B0aW9ucz86IGFueVtdO1xuICBzZWxlY3RlZEl0ZW1zPzogYW55W107IC8vIFBhc3NlZCB0aHJvdWdoIGJ5IFR5cGVhaGVhZFxufVxuXG5pbnRlcmZhY2UgRHJvcGRvd25MaXN0U3RhdGUge1xuICBvcHRpb25zOiBBcnJheTxhbnk+IHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJvcGRvd25MaXN0IGV4dGVuZHMgQ29tcG9uZW50PERyb3Bkb3duTGlzdFByb3BzLCBEcm9wZG93bkxpc3RTdGF0ZT4ge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGN1c3RvbUNsYXNzZXM6IHt9LFxuICAgIGN1c3RvbUxpc3RJdGVtQ29tcG9uZW50OiBMaXN0SXRlbSxcbiAgICBjdXN0b21MaXN0SGVhZGVyQ29tcG9uZW50OiBudWxsLFxuICAgIGFsbG93Q3VzdG9tVmFsdWVzOiAwLFxuICAgIGN1c3RvbVZhbHVlczogW10sXG4gICAgZGlzcGxheU9wdGlvbjogZGVmYXVsdERpc3BsYXksXG4gICAgb25PcHRpb25TZWxlY3RlZDogKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0sXG4gICAgZGVmYXVsdENsYXNzTmFtZXM6IHRydWUsXG4gICAgc2VsZWN0aW9uSW5kZXg6IG51bGxcbiAgfTtcblxuICBpbml0TnVtYmVyT2ZPcHRpb25zOiBudW1iZXI7XG4gIHBhZ2U6IG51bWJlcjtcbiAgcHJldlk6IG51bWJlcjtcbiAgbG9hZGluZ1JlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PjtcbiAgb2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtvcHRpb25zOiBbXX07XG4gICAgdGhpcy5pbml0TnVtYmVyT2ZPcHRpb25zID0gSU5JVF9GSUxURVJfSVRFTVNfSU5fRFJPUERPV047XG4gICAgdGhpcy5wYWdlID0gMDtcbiAgICB0aGlzLnByZXZZID0gMDtcbiAgICB0aGlzLmxvYWRpbmdSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRPcHRpb25zKHRoaXMucGFnZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7b3B0aW9uc30pO1xuXG4gICAgY29uc3QgZGl2T3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IG51bGwsXG4gICAgICByb290TWFyZ2luOiAnMCUnLFxuICAgICAgdGhyZXNob2xkOiAxLjBcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubG9hZGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMuaGFuZGxlT2JzZXJ2ZXIsIGRpdk9wdGlvbnMpO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMubG9hZGluZ1JlZi5jdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHM6IERyb3Bkb3duTGlzdFByb3BzKSB7XG4gICAgaWYgKHByZXZQcm9wcy5vcHRpb25zICE9PSB0aGlzLnByb3BzLm9wdGlvbnMpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHVzZXIgc2VhcmNoaW5nLCByZXNldCBzdGF0ZS5vcHRpb25zIGF0IHRoZSBmaXJzdCB0aW1lXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucygwKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe29wdGlvbnN9KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBwcmV2ZW50IGNvbnNvbGUgd2FybmluZzogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLlxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICB0aGlzLm9ic2VydmVyPy51bm9ic2VydmUodGhpcy5sb2FkaW5nUmVmPy5jdXJyZW50KTtcbiAgICAgIHRoaXMucGFnZSA9IDA7XG4gICAgICB0aGlzLnByZXZZID0gMDtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVPYnNlcnZlciA9IGVudGl0aWVzID0+IHtcbiAgICBjb25zdCB5ID0gZW50aXRpZXNbMF0uYm91bmRpbmdDbGllbnRSZWN0Lnk7XG4gICAgaWYgKHRoaXMucHJldlkgPiB5KSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucyh0aGlzLnBhZ2UpO1xuICAgICAgaWYgKG9wdGlvbnMpIHRoaXMuc2V0U3RhdGUoe29wdGlvbnN9KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2WSA9IHk7XG4gIH07XG5cbiAgX2dldE9wdGlvbnMocGFnZSkge1xuICAgIGlmICghdGhpcy5wcm9wcy5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbiA9IHRoaXMucHJvcHMub3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlICogdGhpcy5pbml0TnVtYmVyT2ZPcHRpb25zO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5pbml0TnVtYmVyT2ZPcHRpb25zID4gbiA/IG4gOiBzdGFydCArIHRoaXMuaW5pdE51bWJlck9mT3B0aW9ucztcblxuICAgIGlmIChzdGFydCA8IGVuZCAmJiBlbmQgPD0gbikge1xuICAgICAgdGhpcy5wYWdlID0gcGFnZSArIDE7XG4gICAgICAvLyBpbiBjYXNlIG9mIHVzZXIgc2VhcmNoaW5nLCBwcm9wcy5vcHRpb25zIHdpbGwgYmUgdXBkYXRlZFxuICAgICAgLy8gc28gXCJwYWdlXCIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMCBhbmQgcHJldmlvdXMgc3RhdGUub3B0aW9ucyB3aWxsIGJlIGRpc2NhcmRlZFxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uKHBhZ2UgPiAwID8gdGhpcy5zdGF0ZS5vcHRpb25zIHx8IFtdIDogW10pLFxuICAgICAgICAuLi50aGlzLnByb3BzLm9wdGlvbnMuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBfb25DbGljayhyZXN1bHQsIGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBvbmx5IHdvcmsgd2hlbiBsZWZ0IGlzIGNsaWNrZWRcbiAgICBpZiAoKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmIGV2ZW50LmJ1dHRvbiA9PT0gTEVGVF9CVVRUT04pIHx8IGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIHRoaXMucHJvcHMub25PcHRpb25TZWxlY3RlZD8uKHJlc3VsdCwgZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBmaXhlZE9wdGlvbnMsXG4gICAgICBsaWdodCxcbiAgICAgIGFsbG93Q3VzdG9tVmFsdWVzID0gMCxcbiAgICAgIGN1c3RvbUxpc3RJdGVtQ29tcG9uZW50OiBDdXN0b21MaXN0SXRlbUNvbXBvbmVudCA9IExpc3RJdGVtXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2Rpc3BsYXlPcHRpb246IGRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheX0gPSB0aGlzLnByb3BzO1xuXG4gICAgLy8gRG9uJ3QgcmVuZGVyIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zIHRvIGRpc3BsYXlcbiAgICBpZiAoIXRoaXMucHJvcHMub3B0aW9ucz8ubGVuZ3RoICYmIGFsbG93Q3VzdG9tVmFsdWVzIDw9IDApIHtcbiAgICAgIHJldHVybiA8ZGl2IC8+O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gQXJyYXkuaXNBcnJheShmaXhlZE9wdGlvbnMpID8gZml4ZWRPcHRpb25zLmxlbmd0aCA6IDA7XG5cbiAgICAvLyBGb3Igc29tZSByZWFzb24gb25DbGljayBpcyBub3QgZmlyZWQgd2hlbiBjbGlja2VkIG9uIGFuIG9wdGlvblxuICAgIC8vIG9uTW91c2VEb3duIGlzIHVzZWQgaGVyZSBhcyBhIHdvcmthcm91bmQgb2YgIzIwNSBhbmQgb3RoZXJcbiAgICByZXR1cm4gKFxuICAgICAgPERyb3Bkb3duTGlzdFdyYXBwZXJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGNsYXNzTGlzdC5saXN0LCB0aGlzLnByb3BzLmN1c3RvbUNsYXNzZXM/LnJlc3VsdHMpfVxuICAgICAgICBsaWdodD17bGlnaHR9XG4gICAgICA+XG4gICAgICAgIHt0aGlzLnByb3BzLmN1c3RvbUxpc3RIZWFkZXJDb21wb25lbnQgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NMaXN0Lmxpc3RIZWFkZXIsIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3Nlcz8ubGlzdEhlYWRlcil9PlxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY3VzdG9tTGlzdEhlYWRlckNvbXBvbmVudCAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbnVsbH1cblxuICAgICAgICB7dmFsdWVPZmZzZXQgPiAwID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc0xpc3QubGlzdFNlY3Rpb259PlxuICAgICAgICAgICAge2ZpeGVkT3B0aW9ucz8ubWFwKCh2YWx1ZSwgaSkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0Lmxpc3RJdGVtLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBob3ZlcjogdGhpcy5wcm9wcy5zZWxlY3Rpb25JbmRleCA9PT0gaSxcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzTGlzdC5saXN0SXRlbUZpeGVkXTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY3VzdG9tQ2xhc3Nlcz8ubGlzdEl0ZW1cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIGtleT17YCR7ZGlzcGxheSh2YWx1ZSl9XyR7aX1gfVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXtlID0+IHRoaXMuX29uQ2xpY2sodmFsdWUsIGUpfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT4gdGhpcy5fb25DbGljayh2YWx1ZSwgZSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q3VzdG9tTGlzdEl0ZW1Db21wb25lbnQgdmFsdWU9e3ZhbHVlfSBkaXNwbGF5T3B0aW9uPXtkaXNwbGF5fSBsaWdodD17bGlnaHR9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgIHt0aGlzLnN0YXRlLm9wdGlvbnM/Lm1hcCgodmFsdWUsIGkpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICAgICAgIGNsYXNzTGlzdC5saXN0SXRlbSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhvdmVyOiB0aGlzLnByb3BzLnNlbGVjdGlvbkluZGV4ID09PSBpICsgdmFsdWVPZmZzZXQsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6ICh0aGlzLnByb3BzLnNlbGVjdGVkSXRlbXMgfHwgW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICBpdGVtID0+IGRpc3BsYXkoaXRlbSkgPT09IGRpc3BsYXkodmFsdWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnByb3BzLmN1c3RvbUNsYXNzZXM/Lmxpc3RJdGVtXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAga2V5PXtgJHtkaXNwbGF5KHZhbHVlKX1fJHtpfWB9XG4gICAgICAgICAgICBvbk1vdXNlRG93bj17ZSA9PiB0aGlzLl9vbkNsaWNrKHZhbHVlLCBlKX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT4gdGhpcy5fb25DbGljayh2YWx1ZSwgZSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEN1c3RvbUxpc3RJdGVtQ29tcG9uZW50IHZhbHVlPXt2YWx1ZX0gZGlzcGxheU9wdGlvbj17ZGlzcGxheX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG5cbiAgICAgICAgPERyb3Bkb3duRm9vdGVyV3JhcHBlciByZWY9e3RoaXMubG9hZGluZ1JlZn0gLz5cbiAgICAgIDwvRHJvcGRvd25MaXN0V3JhcHBlcj5cbiAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxpQkFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksVUFBQSxHQUFBSixPQUFBO0FBQW1FLElBQUFLLGVBQUEsRUFBQUMsZ0JBQUEsRUFObkU7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBVCx3QkFBQVMsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLGdCQUFBSyxPQUFBLENBQUFMLENBQUEsMEJBQUFBLENBQUEsc0JBQUFBLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxjQUFBUixDQUFBLEVBQUFHLENBQUEsSUFBQUEsQ0FBQSxDQUFBZSxHQUFBLENBQUFsQixDQUFBLEVBQUFRLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFXLFdBQUFoQixDQUFBLEVBQUFpQixDQUFBLEVBQUFwQixDQUFBLFdBQUFvQixDQUFBLE9BQUFDLGdCQUFBLGFBQUFELENBQUEsT0FBQUUsMkJBQUEsYUFBQW5CLENBQUEsRUFBQW9CLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBTCxDQUFBLEVBQUFwQixDQUFBLFlBQUFxQixnQkFBQSxhQUFBbEIsQ0FBQSxFQUFBdUIsV0FBQSxJQUFBTixDQUFBLENBQUFPLEtBQUEsQ0FBQXhCLENBQUEsRUFBQUgsQ0FBQTtBQUFBLFNBQUF1QiwwQkFBQSxjQUFBcEIsQ0FBQSxJQUFBeUIsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQWQsSUFBQSxDQUFBUSxPQUFBLENBQUFDLFNBQUEsQ0FBQUcsT0FBQSxpQ0FBQXpCLENBQUEsYUFBQW9CLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFwQixDQUFBO0FBUUEsSUFBTTRCLFdBQVcsR0FBRyxDQUFDO0FBRWQsSUFBTUMsU0FBUyxHQUFBQyxPQUFBLENBQUFELFNBQUEsR0FBRztFQUN2QkUsSUFBSSxFQUFFLGVBQWU7RUFDckJDLFVBQVUsRUFBRSxjQUFjO0VBQzFCQyxXQUFXLEVBQUUsZUFBZTtFQUM1QkMsUUFBUSxFQUFFLFlBQVk7RUFDdEJDLGNBQWMsRUFBRSxvQkFBb0I7RUFDcENDLGFBQWEsRUFBRTtBQUNqQixDQUFDO0FBU0QsSUFBTUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFHQyxDQUFDO0VBQUEsT0FBSUEsQ0FBQztBQUFBO0FBQ3RCLElBQU1DLFFBQVEsR0FBQVQsT0FBQSxDQUFBUyxRQUFBLEdBQUcsU0FBWEEsUUFBUUEsQ0FBQUMsSUFBQSxFQUE4RTtFQUFBLElBQXpFQyxLQUFLLEdBQUFELElBQUEsQ0FBTEMsS0FBSztJQUFBQyxrQkFBQSxHQUFBRixJQUFBLENBQUVHLGFBQWE7SUFBYkEsYUFBYSxHQUFBRCxrQkFBQSxjQUFHTCxjQUFjLEdBQUFLLGtCQUFBO0lBQUVFLFFBQVEsR0FBQUosSUFBQSxDQUFSSSxRQUFRO0VBQ3ZFLElBQU1DLFlBQVksR0FBR0YsYUFBYSxDQUFDRixLQUFLLENBQUM7RUFDekMsb0JBQ0V0RCxNQUFBLFlBQUEyRCxhQUFBO0lBQU1DLEtBQUssRUFBRUYsWUFBYTtJQUFDRyxTQUFTLEVBQUUsSUFBQUMsc0JBQVUsRUFBQ3BCLFNBQVMsQ0FBQ00sY0FBYyxFQUFFO01BQUNTLFFBQVEsRUFBUkE7SUFBUSxDQUFDO0VBQUUsR0FDcEZDLFlBQ0csQ0FBQztBQUVYLENBQUM7QUFNRCxJQUFNSyxtQkFHTCxHQUFHQyw0QkFBTSxDQUFDQyxHQUFHLENBQUExRCxlQUFBLEtBQUFBLGVBQUEsT0FBQTJELHVCQUFBLCtGQUNRLFVBQUFDLEtBQUs7RUFBQSxPQUN2QkEsS0FBSyxDQUFDQyxLQUFLLEdBQUdELEtBQUssQ0FBQ0UsS0FBSyxDQUFDQyxpQkFBaUIsR0FBR0gsS0FBSyxDQUFDRSxLQUFLLENBQUNFLGVBQWU7QUFBQSxHQUV2RSxVQUFBSixLQUFLO0VBQUEsT0FDTEEsS0FBSyxDQUFDQyxLQUFLLEdBQUdELEtBQUssQ0FBQ0UsS0FBSyxDQUFDRyx1QkFBdUIsR0FBR0wsS0FBSyxDQUFDRSxLQUFLLENBQUNJLHFCQUFxQjtBQUFBLEdBQ3ZGLFVBQUFOLEtBQUs7RUFBQSxPQUFLQSxLQUFLLENBQUNDLEtBQUssR0FBR0QsS0FBSyxDQUFDRSxLQUFLLENBQUNLLGNBQWMsR0FBR1AsS0FBSyxDQUFDRSxLQUFLLENBQUNNLFlBQVk7QUFBQSxDQUFDLENBQ2pGO0FBRUQsSUFBTUMscUJBQXFCLEdBQUdaLDRCQUFNLENBQUNDLEdBQUcsQ0FBQXpELGdCQUFBLEtBQUFBLGdCQUFBLE9BQUEwRCx1QkFBQSx3Q0FFdkM7O0FBR0Q7QUFBQSxJQXdCcUJXLFlBQVksR0FBQWxDLE9BQUEscUNBQUFtQyxVQUFBO0VBcUIvQixTQUFBRCxhQUFZVixLQUFLLEVBQUU7SUFBQSxJQUFBWSxLQUFBO0lBQUEsSUFBQUMsZ0JBQUEsbUJBQUFILFlBQUE7SUFDakJFLEtBQUEsR0FBQWxELFVBQUEsT0FBQWdELFlBQUEsR0FBTVYsS0FBSztJQUFFLElBQUFjLGdCQUFBLGFBQUFGLEtBQUE7SUFBQSxJQUFBRSxnQkFBQSxhQUFBRixLQUFBO0lBQUEsSUFBQUUsZ0JBQUEsYUFBQUYsS0FBQTtJQUFBLElBQUFFLGdCQUFBLGFBQUFGLEtBQUE7SUFBQSxJQUFBRSxnQkFBQSxhQUFBRixLQUFBO0lBQUEsSUFBQUUsZ0JBQUEsYUFBQUYsS0FBQSxvQkErQ0UsVUFBQUcsUUFBUSxFQUFJO01BQzNCLElBQU1DLENBQUMsR0FBR0QsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDRSxrQkFBa0IsQ0FBQ0QsQ0FBQztNQUMxQyxJQUFJSixLQUFBLENBQUtNLEtBQUssR0FBR0YsQ0FBQyxFQUFFO1FBQ2xCLElBQU1HLE9BQU8sR0FBR1AsS0FBQSxDQUFLUSxXQUFXLENBQUNSLEtBQUEsQ0FBS1MsSUFBSSxDQUFDO1FBQzNDLElBQUlGLE9BQU8sRUFBRVAsS0FBQSxDQUFLVSxRQUFRLENBQUM7VUFBQ0gsT0FBTyxFQUFQQTtRQUFPLENBQUMsQ0FBQztNQUN2QztNQUNBUCxLQUFBLENBQUtNLEtBQUssR0FBR0YsQ0FBQztJQUNoQixDQUFDO0lBcERDSixLQUFBLENBQUtXLEtBQUssR0FBRztNQUFDSixPQUFPLEVBQUU7SUFBRSxDQUFDO0lBQzFCUCxLQUFBLENBQUtZLG1CQUFtQixHQUFHQyx3Q0FBNkI7SUFDeERiLEtBQUEsQ0FBS1MsSUFBSSxHQUFHLENBQUM7SUFDYlQsS0FBQSxDQUFLTSxLQUFLLEdBQUcsQ0FBQztJQUNkTixLQUFBLENBQUtjLFVBQVUsZ0JBQUdDLGlCQUFLLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0lBQUMsT0FBQWhCLEtBQUE7RUFDdEM7RUFBQyxJQUFBaUIsVUFBQSxhQUFBbkIsWUFBQSxFQUFBQyxVQUFBO0VBQUEsV0FBQW1CLGFBQUEsYUFBQXBCLFlBQUE7SUFBQXFCLEdBQUE7SUFBQTVDLEtBQUEsRUFFRCxTQUFBNkMsaUJBQWlCQSxDQUFBLEVBQUc7TUFDbEIsSUFBTWIsT0FBTyxHQUFHLElBQUksQ0FBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQ0MsSUFBSSxDQUFDO01BQzNDLElBQUksQ0FBQ0MsUUFBUSxDQUFDO1FBQUNILE9BQU8sRUFBUEE7TUFBTyxDQUFDLENBQUM7TUFFeEIsSUFBTWMsVUFBVSxHQUFHO1FBQ2pCQyxJQUFJLEVBQUUsSUFBSTtRQUNWQyxVQUFVLEVBQUUsSUFBSTtRQUNoQkMsU0FBUyxFQUFFO01BQ2IsQ0FBQztNQUVELElBQUksSUFBSSxDQUFDVixVQUFVLENBQUNXLE9BQU8sRUFBRTtRQUMzQixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUNDLGNBQWMsRUFBRVAsVUFBVSxDQUFDO1FBQ3pFLElBQUksQ0FBQ0ssUUFBUSxDQUFDRyxPQUFPLENBQUMsSUFBSSxDQUFDZixVQUFVLENBQUNXLE9BQU8sQ0FBQztNQUNoRDtJQUNGO0VBQUM7SUFBQU4sR0FBQTtJQUFBNUMsS0FBQSxFQUVELFNBQUF1RCx1QkFBdUJBLENBQUNDLFNBQTRCLEVBQUU7TUFDcEQsSUFBSUEsU0FBUyxDQUFDeEIsT0FBTyxLQUFLLElBQUksQ0FBQ25CLEtBQUssQ0FBQ21CLE9BQU8sRUFBRTtRQUM1QztRQUNBLElBQU1BLE9BQU8sR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDRSxRQUFRLENBQUM7VUFBQ0gsT0FBTyxFQUFQQTtRQUFPLENBQUMsQ0FBQztNQUMxQjtNQUNBLE9BQU8sSUFBSTtJQUNiOztJQUVBO0VBQUE7SUFBQVksR0FBQTtJQUFBNUMsS0FBQSxFQUNBLFNBQUF5RCxrQkFBa0JBLENBQUEsRUFBRztNQUNuQjtJQUNGO0VBQUM7SUFBQWIsR0FBQTtJQUFBNUMsS0FBQSxFQUVELFNBQUEwRCxvQkFBb0JBLENBQUEsRUFBRztNQUNyQixJQUFJLElBQUksQ0FBQ25CLFVBQVUsQ0FBQ1csT0FBTyxFQUFFO1FBQUEsSUFBQVMsY0FBQSxFQUFBQyxnQkFBQTtRQUMzQixDQUFBRCxjQUFBLE9BQUksQ0FBQ1IsUUFBUSxjQUFBUSxjQUFBLGVBQWJBLGNBQUEsQ0FBZUUsU0FBUyxFQUFBRCxnQkFBQSxHQUFDLElBQUksQ0FBQ3JCLFVBQVUsY0FBQXFCLGdCQUFBLHVCQUFmQSxnQkFBQSxDQUFpQlYsT0FBTyxDQUFDO1FBQ2xELElBQUksQ0FBQ2hCLElBQUksR0FBRyxDQUFDO1FBQ2IsSUFBSSxDQUFDSCxLQUFLLEdBQUcsQ0FBQztNQUNoQjtJQUNGO0VBQUM7SUFBQWEsR0FBQTtJQUFBNUMsS0FBQSxFQVdELFNBQUFpQyxXQUFXQSxDQUFDQyxJQUFJLEVBQUU7TUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQ3JCLEtBQUssQ0FBQ21CLE9BQU8sRUFBRTtRQUN2QixPQUFPLEVBQUU7TUFDWDtNQUVBLElBQU1wRSxDQUFDLEdBQUcsSUFBSSxDQUFDaUQsS0FBSyxDQUFDbUIsT0FBTyxDQUFDOEIsTUFBTTtNQUNuQyxJQUFJbEcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNYLE9BQU8sRUFBRTtNQUNYO01BQ0EsSUFBTW1HLEtBQUssR0FBRzdCLElBQUksR0FBRyxJQUFJLENBQUNHLG1CQUFtQjtNQUM3QyxJQUFNMkIsR0FBRyxHQUFHRCxLQUFLLEdBQUcsSUFBSSxDQUFDMUIsbUJBQW1CLEdBQUd6RSxDQUFDLEdBQUdBLENBQUMsR0FBR21HLEtBQUssR0FBRyxJQUFJLENBQUMxQixtQkFBbUI7TUFFdkYsSUFBSTBCLEtBQUssR0FBR0MsR0FBRyxJQUFJQSxHQUFHLElBQUlwRyxDQUFDLEVBQUU7UUFDM0IsSUFBSSxDQUFDc0UsSUFBSSxHQUFHQSxJQUFJLEdBQUcsQ0FBQztRQUNwQjtRQUNBO1FBQ0EsVUFBQStCLE1BQUEsS0FBQUMsbUJBQUEsYUFDTWhDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDRSxLQUFLLENBQUNKLE9BQU8sSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFBa0MsbUJBQUEsYUFDekMsSUFBSSxDQUFDckQsS0FBSyxDQUFDbUIsT0FBTyxDQUFDbUMsS0FBSyxDQUFDSixLQUFLLEVBQUVDLEdBQUcsQ0FBQztNQUUzQztNQUVBLE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQXBCLEdBQUE7SUFBQTVDLEtBQUEsRUFFRCxTQUFBb0UsUUFBUUEsQ0FBQ0MsTUFBTSxFQUFFQyxLQUFLLEVBQUU7TUFDdEJBLEtBQUssQ0FBQ0MsY0FBYyxDQUFDLENBQUM7TUFDdEI7TUFDQSxJQUFLRCxLQUFLLENBQUNFLElBQUksS0FBSyxXQUFXLElBQUlGLEtBQUssQ0FBQ0csTUFBTSxLQUFLdEYsV0FBVyxJQUFLbUYsS0FBSyxDQUFDRSxJQUFJLEtBQUssT0FBTyxFQUFFO1FBQUEsSUFBQUUscUJBQUEsRUFBQUMsV0FBQTtRQUMxRixDQUFBRCxxQkFBQSxJQUFBQyxXQUFBLE9BQUksQ0FBQzlELEtBQUssRUFBQytELGdCQUFnQixjQUFBRixxQkFBQSxlQUEzQkEscUJBQUEsQ0FBQXRHLElBQUEsQ0FBQXVHLFdBQUEsRUFBOEJOLE1BQU0sRUFBRUMsS0FBSyxDQUFDO01BQzlDO0lBQ0Y7RUFBQztJQUFBMUIsR0FBQTtJQUFBNUMsS0FBQSxFQUVELFNBQUE2RSxNQUFNQSxDQUFBLEVBQUc7TUFBQSxJQUFBQyxtQkFBQTtRQUFBQyxxQkFBQTtRQUFBQyxzQkFBQTtRQUFBQyxNQUFBO1FBQUFDLG1CQUFBO01BQ1AsSUFBQUMsWUFBQSxHQUtJLElBQUksQ0FBQ3RFLEtBQUs7UUFKWnVFLFlBQVksR0FBQUQsWUFBQSxDQUFaQyxZQUFZO1FBQ1p0RSxLQUFLLEdBQUFxRSxZQUFBLENBQUxyRSxLQUFLO1FBQUF1RSxxQkFBQSxHQUFBRixZQUFBLENBQ0xHLGlCQUFpQjtRQUFqQkEsaUJBQWlCLEdBQUFELHFCQUFBLGNBQUcsQ0FBQyxHQUFBQSxxQkFBQTtRQUFBRSxxQkFBQSxHQUFBSixZQUFBLENBQ3JCSyx1QkFBdUI7UUFBRUMsdUJBQXVCLEdBQUFGLHFCQUFBLGNBQUd6RixRQUFRLEdBQUF5RixxQkFBQTtNQUU3RCxJQUFBRyxxQkFBQSxHQUFrRCxJQUFJLENBQUM3RSxLQUFLLENBQXJEWCxhQUFhO1FBQUV5RixPQUFPLEdBQUFELHFCQUFBLGNBQUc5RixjQUFjLEdBQUE4RixxQkFBQTs7TUFFOUM7TUFDQSxJQUFJLEdBQUFaLG1CQUFBLEdBQUMsSUFBSSxDQUFDakUsS0FBSyxDQUFDbUIsT0FBTyxjQUFBOEMsbUJBQUEsZUFBbEJBLG1CQUFBLENBQW9CaEIsTUFBTSxLQUFJd0IsaUJBQWlCLElBQUksQ0FBQyxFQUFFO1FBQ3pELG9CQUFPNUksTUFBQSxZQUFBMkQsYUFBQSxZQUFNLENBQUM7TUFDaEI7TUFFQSxJQUFNdUYsV0FBVyxHQUFHQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ1YsWUFBWSxDQUFDLEdBQUdBLFlBQVksQ0FBQ3RCLE1BQU0sR0FBRyxDQUFDOztNQUV6RTtNQUNBO01BQ0Esb0JBQ0VwSCxNQUFBLFlBQUEyRCxhQUFBLENBQUNJLG1CQUFtQjtRQUNsQkYsU0FBUyxFQUFFLElBQUFDLHNCQUFVLEVBQUNwQixTQUFTLENBQUNFLElBQUksR0FBQXlGLHFCQUFBLEdBQUUsSUFBSSxDQUFDbEUsS0FBSyxDQUFDa0YsYUFBYSxjQUFBaEIscUJBQUEsdUJBQXhCQSxxQkFBQSxDQUEwQmlCLE9BQU8sQ0FBRTtRQUN6RWxGLEtBQUssRUFBRUE7TUFBTSxHQUVaLElBQUksQ0FBQ0QsS0FBSyxDQUFDb0YseUJBQXlCLGdCQUNuQ3ZKLE1BQUEsWUFBQTJELGFBQUE7UUFBS0UsU0FBUyxFQUFFLElBQUFDLHNCQUFVLEVBQUNwQixTQUFTLENBQUNHLFVBQVUsR0FBQXlGLHNCQUFBLEdBQUUsSUFBSSxDQUFDbkUsS0FBSyxDQUFDa0YsYUFBYSxjQUFBZixzQkFBQSx1QkFBeEJBLHNCQUFBLENBQTBCekYsVUFBVTtNQUFFLGdCQUNyRjdDLE1BQUEsWUFBQTJELGFBQUEsTUFBTVEsS0FBSyxDQUFDb0YseUJBQXlCLE1BQUUsQ0FDcEMsQ0FBQyxHQUNKLElBQUksRUFFUEwsV0FBVyxHQUFHLENBQUMsZ0JBQ2RsSixNQUFBLFlBQUEyRCxhQUFBO1FBQUtFLFNBQVMsRUFBRW5CLFNBQVMsQ0FBQ0k7TUFBWSxHQUNuQzRGLFlBQVksYUFBWkEsWUFBWSx1QkFBWkEsWUFBWSxDQUFFYyxHQUFHLENBQUMsVUFBQ2xHLEtBQUssRUFBRTNCLENBQUM7UUFBQSxJQUFBOEgscUJBQUE7UUFBQSxvQkFDMUJ6SixNQUFBLFlBQUEyRCxhQUFBO1VBQ0VFLFNBQVMsRUFBRSxJQUFBQyxzQkFBVSxFQUNuQnBCLFNBQVMsQ0FBQ0ssUUFBUSxNQUFBa0MsZ0JBQUE7WUFFaEJ5RSxLQUFLLEVBQUVuQixNQUFJLENBQUNwRSxLQUFLLENBQUN3RixjQUFjLEtBQUtoSTtVQUFDLEdBQ3JDZSxTQUFTLENBQUNPLGFBQWEsRUFBRyxJQUFJLElBQUF3RyxxQkFBQSxHQUVqQ2xCLE1BQUksQ0FBQ3BFLEtBQUssQ0FBQ2tGLGFBQWEsY0FBQUkscUJBQUEsdUJBQXhCQSxxQkFBQSxDQUEwQjFHLFFBQzVCLENBQUU7VUFDRm1ELEdBQUcsS0FBQXFCLE1BQUEsQ0FBSzBCLE9BQU8sQ0FBQzNGLEtBQUssQ0FBQyxPQUFBaUUsTUFBQSxDQUFJNUYsQ0FBQyxDQUFHO1VBQzlCaUksV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUVsSixDQUFDO1lBQUEsT0FBSTZILE1BQUksQ0FBQ2IsUUFBUSxDQUFDcEUsS0FBSyxFQUFFNUMsQ0FBQyxDQUFDO1VBQUEsQ0FBQztVQUMxQ21KLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFbkosQ0FBQztZQUFBLE9BQUk2SCxNQUFJLENBQUNiLFFBQVEsQ0FBQ3BFLEtBQUssRUFBRTVDLENBQUMsQ0FBQztVQUFBO1FBQUMsZ0JBRXRDVixNQUFBLFlBQUEyRCxhQUFBLENBQUNvRix1QkFBdUI7VUFBQ3pGLEtBQUssRUFBRUEsS0FBTTtVQUFDRSxhQUFhLEVBQUV5RixPQUFRO1VBQUM3RSxLQUFLLEVBQUVBO1FBQU0sQ0FBRSxDQUMzRSxDQUFDO01BQUEsQ0FDUCxDQUNFLENBQUMsR0FDSixJQUFJLEdBQUFvRSxtQkFBQSxHQUVQLElBQUksQ0FBQzlDLEtBQUssQ0FBQ0osT0FBTyxjQUFBa0QsbUJBQUEsdUJBQWxCQSxtQkFBQSxDQUFvQmdCLEdBQUcsQ0FBQyxVQUFDbEcsS0FBSyxFQUFFM0IsQ0FBQztRQUFBLElBQUFtSSxzQkFBQTtRQUFBLG9CQUNoQzlKLE1BQUEsWUFBQTJELGFBQUE7VUFDRUUsU0FBUyxFQUFFLElBQUFDLHNCQUFVLEVBQ25CcEIsU0FBUyxDQUFDSyxRQUFRLEVBQ2xCO1lBQ0UyRyxLQUFLLEVBQUVuQixNQUFJLENBQUNwRSxLQUFLLENBQUN3RixjQUFjLEtBQUtoSSxDQUFDLEdBQUd1SCxXQUFXO1lBQ3BEYSxRQUFRLEVBQUUsQ0FBQ3hCLE1BQUksQ0FBQ3BFLEtBQUssQ0FBQzZGLGFBQWEsSUFBSSxFQUFFLEVBQUVDLElBQUksQ0FDN0MsVUFBQUMsSUFBSTtjQUFBLE9BQUlqQixPQUFPLENBQUNpQixJQUFJLENBQUMsS0FBS2pCLE9BQU8sQ0FBQzNGLEtBQUssQ0FBQztZQUFBLENBQzFDO1VBQ0YsQ0FBQyxHQUFBd0csc0JBQUEsR0FDRHZCLE1BQUksQ0FBQ3BFLEtBQUssQ0FBQ2tGLGFBQWEsY0FBQVMsc0JBQUEsdUJBQXhCQSxzQkFBQSxDQUEwQi9HLFFBQzVCLENBQUU7VUFDRm1ELEdBQUcsS0FBQXFCLE1BQUEsQ0FBSzBCLE9BQU8sQ0FBQzNGLEtBQUssQ0FBQyxPQUFBaUUsTUFBQSxDQUFJNUYsQ0FBQyxDQUFHO1VBQzlCaUksV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUVsSixDQUFDO1lBQUEsT0FBSTZILE1BQUksQ0FBQ2IsUUFBUSxDQUFDcEUsS0FBSyxFQUFFNUMsQ0FBQyxDQUFDO1VBQUEsQ0FBQztVQUMxQ21KLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFbkosQ0FBQztZQUFBLE9BQUk2SCxNQUFJLENBQUNiLFFBQVEsQ0FBQ3BFLEtBQUssRUFBRTVDLENBQUMsQ0FBQztVQUFBO1FBQUMsZ0JBRXRDVixNQUFBLFlBQUEyRCxhQUFBLENBQUNvRix1QkFBdUI7VUFBQ3pGLEtBQUssRUFBRUEsS0FBTTtVQUFDRSxhQUFhLEVBQUV5RjtRQUFRLENBQUUsQ0FDN0QsQ0FBQztNQUFBLENBQ1AsQ0FBQyxlQUVGakosTUFBQSxZQUFBMkQsYUFBQSxDQUFDaUIscUJBQXFCO1FBQUN1RixHQUFHLEVBQUUsSUFBSSxDQUFDdEU7TUFBVyxDQUFFLENBQzNCLENBQUM7SUFFMUI7RUFBQztBQUFBLEVBekx1Q3VFLGdCQUFTO0FBQUEsSUFBQW5GLGdCQUFBLGFBQTlCSixZQUFZLGtCQUNUO0VBQ3BCd0UsYUFBYSxFQUFFLENBQUMsQ0FBQztFQUNqQlAsdUJBQXVCLEVBQUUxRixRQUFRO0VBQ2pDbUcseUJBQXlCLEVBQUUsSUFBSTtFQUMvQlgsaUJBQWlCLEVBQUUsQ0FBQztFQUNwQnlCLFlBQVksRUFBRSxFQUFFO0VBQ2hCN0csYUFBYSxFQUFFTixjQUFjO0VBQzdCZ0YsZ0JBQWdCLEVBQUUsU0FBbEJBLGdCQUFnQkEsQ0FBQSxFQUFRO0lBQ3RCO0VBQ0YsQ0FBQztFQUNEb0MsaUJBQWlCLEVBQUUsSUFBSTtFQUN2QlgsY0FBYyxFQUFFO0FBQ2xCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=