@gravityforms/components
Version:
UI components for use in Gravity Forms development. Both React and vanilla js flavors.
18 lines (16 loc) • 53 kB
JavaScript
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(self["webpackChunkgravityforms"] = self["webpackChunkgravityforms"] || []).push([["components_react_admin_modules_Chart_AreaChart_index_js"],{
/***/ "../components/react/admin/modules/Chart/AreaChart/index.js":
/*!******************************************************************************!*\
!*** ../components/react/admin/modules/Chart/AreaChart/index.js + 2 modules ***!
\******************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ Chart_AreaChart; }\n});\n\n// EXTERNAL MODULE: ../../../node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(\"../../../node_modules/@babel/runtime/helpers/esm/extends.js\");\n// EXTERNAL MODULE: ../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 3 modules\nvar slicedToArray = __webpack_require__(\"../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n// EXTERNAL MODULE: ../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n// EXTERNAL MODULE: external [\"gform\",\"libraries\"]\nvar external_gform_libraries_ = __webpack_require__(\"@gravityforms/libraries\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/component/ResponsiveContainer.js\nvar ResponsiveContainer = __webpack_require__(\"../../../node_modules/recharts/es6/component/ResponsiveContainer.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/chart/AreaChart.js + 16 modules\nvar AreaChart = __webpack_require__(\"../../../node_modules/recharts/es6/chart/AreaChart.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/cartesian/CartesianGrid.js\nvar CartesianGrid = __webpack_require__(\"../../../node_modules/recharts/es6/cartesian/CartesianGrid.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/cartesian/XAxis.js\nvar XAxis = __webpack_require__(\"../../../node_modules/recharts/es6/cartesian/XAxis.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/cartesian/YAxis.js\nvar YAxis = __webpack_require__(\"../../../node_modules/recharts/es6/cartesian/YAxis.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/component/Tooltip.js + 3 modules\nvar Tooltip = __webpack_require__(\"../../../node_modules/recharts/es6/component/Tooltip.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/component/Legend.js + 1 modules\nvar Legend = __webpack_require__(\"../../../node_modules/recharts/es6/component/Legend.js\");\n// EXTERNAL MODULE: ../../../node_modules/recharts/es6/cartesian/Area.js\nvar Area = __webpack_require__(\"../../../node_modules/recharts/es6/cartesian/Area.js\");\n// EXTERNAL MODULE: ../components/react/admin/elements/Box/index.js\nvar Box = __webpack_require__(\"../components/react/admin/elements/Box/index.js\");\n// EXTERNAL MODULE: ../components/react/admin/elements/Checkbox/index.js\nvar Checkbox = __webpack_require__(\"../components/react/admin/elements/Checkbox/index.js\");\n;// ../components/react/admin/modules/Chart/common/DataDot.js\n\nvar DataDot = function DataDot(_ref) {\n var cx = _ref.cx,\n cy = _ref.cy,\n stroke = _ref.stroke;\n return /*#__PURE__*/external_gform_libraries_.React.createElement(\"svg\", {\n x: cx - 6,\n y: cy - 6,\n width: 12,\n height: 12,\n viewBox: \"0 0 12 12\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(\"circle\", {\n cx: \"6\",\n cy: \"6\",\n r: \"5\",\n stroke: stroke,\n strokeWidth: \"2\",\n fill: \"white\"\n }));\n};\n/* harmony default export */ var common_DataDot = (DataDot);\n;// ../components/react/admin/modules/Chart/common/Tooltip.js\n\nvar tooltipStyles = {\n container: {\n backgroundColor: '#242748',\n // Dark blue background\n color: '#ffffff',\n // White text\n padding: '8px',\n borderRadius: '3px',\n position: 'relative',\n textAlign: 'left',\n fontSize: '12px'\n },\n label: {\n fontWeight: '600'\n },\n content: {\n fontWeight: 'normal'\n }\n};\n\n/**\n * @function capitalizeFirstLetter\n * @description Capitalize the first letter of a string.\n *\n * @since 4.4.4\n *\n * @param {string} string The string to capitalize the first letter of.\n *\n * @return {string} The string with the first letter capitalized.\n */\nfunction capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * @module Tooltip\n * @description The tooltip component for the chart.\n *\n * @since 4.4.4\n *\n * @param {boolean} active Whether the tooltip is active.\n * @param {Array} payload The payload of the tooltip.\n * @param {string} label The label of the tooltip.\n *\n * @return {JSX.Element|null} The tooltip component.\n */\nvar Tooltip_Tooltip = function Tooltip(_ref) {\n var active = _ref.active,\n payload = _ref.payload,\n label = _ref.label;\n if (active && payload && payload.length) {\n return /*#__PURE__*/external_gform_libraries_.React.createElement(\"div\", {\n style: tooltipStyles.container\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(\"div\", {\n style: tooltipStyles.label\n }, label), payload.map(function (entry, index) {\n return /*#__PURE__*/external_gform_libraries_.React.createElement(\"div\", {\n key: index,\n style: tooltipStyles.content\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(\"span\", null, capitalizeFirstLetter(entry.name), \": \"), /*#__PURE__*/external_gform_libraries_.React.createElement(\"span\", null, entry.value));\n }));\n }\n return null;\n};\n/* harmony default export */ var common_Tooltip = (Tooltip_Tooltip);\n;// ../components/react/admin/modules/Chart/AreaChart/index.js\n\n\n\nfunction 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; }\nfunction _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,defineProperty[\"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; }\n\n\n\n\n\n\nvar forwardRef = external_gform_libraries_.React.forwardRef,\n useState = external_gform_libraries_.React.useState,\n useEffect = external_gform_libraries_.React.useEffect;\n\n/**\n * @module GravityAreaChart\n * @description The AreaChart component. Loaded by the Chart renderer and displayed by passing type \"area\".\n *\n * @since 4.4.5\n *\n * @param {number} animationDuration The duration of the reveal animation in milliseconds.\n * @param {object} areaProps The props to pass to each Area (can also override the presets we use). Check Recharts docs for all available.\n * @param {object} cartesianGridProps The props to pass to the CartesianGrid (can also override the presets we use). Check Recharts docs for all available.\n * @param {object} checkboxProps The props to pass to each Checkbox. Check our docs for all available.\n * @param {node} children Any additional content to display below the chart.\n * @param {string} cursorColor The color of the cursor line in the chart that appears when the tooltip is hovered.\n * @param {object} customAttributes Custom attributes to apply to the chart wrapper.\n * @param {string|array|object} customClasses Custom classes to apply to the chart wrapper.\n * @param {array} data The data to display in the chart. Check Recharts docs for formats.\n * @param {string} gridColor The color of the grid lines and the x and y axis.\n * @param {number|string} height The height of the chart.\n * @param {object} legendProps The props to pass to the Legend (can also override the presets we use). Check Recharts docs for all available.\n * @param {array} options The options to display as checkboxes to toggle the visibility of each data set.\n * @param {boolean} showCheckboxes Whether to show the checkboxes to toggle the visibility of each data set.\n * @param {boolean} showLegend Whether to show the legend.\n * @param {object} tooltipProps The props to pass to the Tooltip (can also override the presets we use). Check Recharts docs for all available.\n * @param {number|string} width The width of the chart.\n * @param {object} xAxisProps The props to pass to the XAxis (can also override the presets we use). Check Recharts docs for all available.\n * @param {object} yAxisProps The props to pass to the YAxis (can also override the presets we use). Check Recharts docs for all available.\n * @param {object} ref The reference to the chart component.\n *\n * @return {JSX.Element|null} The AreaChart component.\n */\nvar GravityAreaChart = forwardRef(function (_ref, ref) {\n var _ref$animationDuratio = _ref.animationDuration,\n animationDuration = _ref$animationDuratio === void 0 ? 1000 : _ref$animationDuratio,\n _ref$areaProps = _ref.areaProps,\n areaProps = _ref$areaProps === void 0 ? {} : _ref$areaProps,\n _ref$cartesianGridPro = _ref.cartesianGridProps,\n cartesianGridProps = _ref$cartesianGridPro === void 0 ? {} : _ref$cartesianGridPro,\n _ref$checkboxProps = _ref.checkboxProps,\n checkboxProps = _ref$checkboxProps === void 0 ? {} : _ref$checkboxProps,\n _ref$children = _ref.children,\n children = _ref$children === void 0 ? null : _ref$children,\n _ref$cursorColor = _ref.cursorColor,\n cursorColor = _ref$cursorColor === void 0 ? '#9092b2' : _ref$cursorColor,\n _ref$customAttributes = _ref.customAttributes,\n customAttributes = _ref$customAttributes === void 0 ? {} : _ref$customAttributes,\n _ref$customClasses = _ref.customClasses,\n customClasses = _ref$customClasses === void 0 ? {} : _ref$customClasses,\n _ref$customInterval = _ref.customInterval,\n customInterval = _ref$customInterval === void 0 ? null : _ref$customInterval,\n _ref$data = _ref.data,\n data = _ref$data === void 0 ? [] : _ref$data,\n _ref$gridColor = _ref.gridColor,\n gridColor = _ref$gridColor === void 0 ? '#ecedf8' : _ref$gridColor,\n _ref$height = _ref.height,\n height = _ref$height === void 0 ? 400 : _ref$height,\n _ref$legendProps = _ref.legendProps,\n legendProps = _ref$legendProps === void 0 ? {} : _ref$legendProps,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? [] : _ref$options,\n _ref$showCheckboxes = _ref.showCheckboxes,\n showCheckboxes = _ref$showCheckboxes === void 0 ? true : _ref$showCheckboxes,\n _ref$showLegend = _ref.showLegend,\n showLegend = _ref$showLegend === void 0 ? false : _ref$showLegend,\n _ref$tooltipProps = _ref.tooltipProps,\n tooltipProps = _ref$tooltipProps === void 0 ? {} : _ref$tooltipProps,\n _ref$width = _ref.width,\n width = _ref$width === void 0 ? '100%' : _ref$width,\n _ref$xAxisProps = _ref.xAxisProps,\n xAxisProps = _ref$xAxisProps === void 0 ? {} : _ref$xAxisProps,\n _ref$yAxisProps = _ref.yAxisProps,\n yAxisProps = _ref$yAxisProps === void 0 ? {} : _ref$yAxisProps;\n var componentProps = _objectSpread(_objectSpread({\n className: (0,external_gform_libraries_.classnames)({\n 'gform-chart--area': true,\n 'gform-chart__wrapper': true\n }, customClasses)\n }, customAttributes), {}, {\n ref: ref\n });\n var initialCheckboxState = options.reduce(function (acc, option) {\n acc[option.dataKey] = option.defaultChecked || true; // Set default visibility, default to true\n return acc;\n }, {});\n var _useState = useState(initialCheckboxState),\n _useState2 = (0,slicedToArray[\"default\"])(_useState, 2),\n checkboxState = _useState2[0],\n setCheckboxState = _useState2[1];\n var _useState3 = useState(true),\n _useState4 = (0,slicedToArray[\"default\"])(_useState3, 2),\n animationActive = _useState4[0],\n setAnimationActive = _useState4[1];\n var _useState5 = useState(Math.floor(data.length / 10)),\n _useState6 = (0,slicedToArray[\"default\"])(_useState5, 2),\n interval = _useState6[0],\n setInterval = _useState6[1];\n var updateInterval = function updateInterval() {\n var screenWidth = window.innerWidth;\n setInterval(Math.floor(data.length / (screenWidth / 180)));\n };\n useEffect(function () {\n // Disable animation after the first render\n var timer = setTimeout(function () {\n setAnimationActive(false);\n }, animationDuration);\n return function () {\n return clearTimeout(timer);\n };\n }, []);\n useEffect(function () {\n if (customInterval) {\n customInterval(setInterval, data.length);\n } else {\n updateInterval();\n window.addEventListener('resize', updateInterval);\n return function () {\n window.removeEventListener('resize', updateInterval);\n };\n }\n }, [data.length, customInterval]);\n var handleCheckboxChange = function handleCheckboxChange(dataKey) {\n setCheckboxState(function (prevState) {\n return _objectSpread(_objectSpread({}, prevState), {}, (0,defineProperty[\"default\"])({}, dataKey, !prevState[dataKey]));\n });\n };\n var cartesianGridAttributes = _objectSpread({\n stroke: gridColor,\n strokeDasharray: '0',\n vertical: false\n }, cartesianGridProps);\n var yAxisAttributes = _objectSpread({\n axisLine: {\n stroke: gridColor\n },\n padding: {\n top: 10\n },\n tickLine: {\n stroke: gridColor\n }\n }, yAxisProps);\n var xAxisAttributes = _objectSpread({\n axisLine: {\n stroke: gridColor\n },\n tickLine: {\n stroke: gridColor\n },\n interval: interval\n }, xAxisProps);\n var tooltipAttributes = _objectSpread({\n content: /*#__PURE__*/external_gform_libraries_.React.createElement(common_Tooltip, null),\n cursor: {\n stroke: cursorColor\n }\n }, tooltipProps);\n var legendAttributes = _objectSpread({}, legendProps);\n return /*#__PURE__*/external_gform_libraries_.React.createElement(\"div\", componentProps, showCheckboxes && /*#__PURE__*/external_gform_libraries_.React.createElement(\"div\", {\n className: \"gform-chart__checkboxes\"\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(Box[\"default\"], {\n display: \"flex\",\n spacing: [0, 5, 0, 0]\n }, options.map(function (option) {\n var checkboxAttributes = _objectSpread({\n externalChecked: checkboxState[option.dataKey],\n externalControl: true,\n labelAttributes: {\n label: option.label,\n weight: 'normal'\n },\n onChange: function onChange() {\n return handleCheckboxChange(option.dataKey);\n },\n spacing: [0, 0, 4, 3]\n }, checkboxProps);\n return /*#__PURE__*/external_gform_libraries_.React.createElement(Checkbox[\"default\"], (0,esm_extends[\"default\"])({\n key: option.dataKey\n }, checkboxAttributes));\n }))), /*#__PURE__*/external_gform_libraries_.React.createElement(ResponsiveContainer.ResponsiveContainer, {\n width: width,\n height: height\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(AreaChart.AreaChart, {\n data: data,\n margin: {\n top: 0,\n right: 20,\n left: 0,\n bottom: 0\n }\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(\"defs\", null, options.map(function (option) {\n return /*#__PURE__*/external_gform_libraries_.React.createElement(\"linearGradient\", {\n key: option.dataKey,\n id: \"color\".concat(option.dataKey),\n x1: \"0\",\n y1: \"0\",\n x2: \"0\",\n y2: \"1\"\n }, /*#__PURE__*/external_gform_libraries_.React.createElement(\"stop\", {\n offset: \"5%\",\n stopColor: option.color,\n stopOpacity: 0.1\n }), /*#__PURE__*/external_gform_libraries_.React.createElement(\"stop\", {\n offset: \"95%\",\n stopColor: option.color,\n stopOpacity: 0\n }));\n })), /*#__PURE__*/external_gform_libraries_.React.createElement(CartesianGrid.CartesianGrid, cartesianGridAttributes), /*#__PURE__*/external_gform_libraries_.React.createElement(XAxis.XAxis, xAxisAttributes), /*#__PURE__*/external_gform_libraries_.React.createElement(YAxis.YAxis, yAxisAttributes), /*#__PURE__*/external_gform_libraries_.React.createElement(Tooltip.Tooltip, tooltipAttributes), showLegend && /*#__PURE__*/external_gform_libraries_.React.createElement(Legend.Legend, legendAttributes), options.map(function (option) {\n var areaAttributes = _objectSpread({\n type: 'monotone',\n dataKey: option.dataKey,\n stroke: option.color,\n fillOpacity: 1,\n fill: \"url(#color\".concat(option.dataKey, \")\"),\n strokeWidth: 2,\n dot: false,\n activeDot: /*#__PURE__*/external_gform_libraries_.React.createElement(common_DataDot, {\n stroke: option.color\n }),\n isAnimationActive: animationActive,\n animationBegin: 0,\n animationDuration: animationDuration\n }, areaProps);\n return checkboxState[option.dataKey] ? /*#__PURE__*/external_gform_libraries_.React.createElement(Area.Area, (0,esm_extends[\"default\"])({\n key: option.dataKey\n }, areaAttributes)) : null;\n }))), children);\n});\nGravityAreaChart.propTypes = {\n animationDuration: external_gform_libraries_.PropTypes.number,\n areaProps: external_gform_libraries_.PropTypes.object,\n cartesianGridProps: external_gform_libraries_.PropTypes.object,\n checkboxProps: external_gform_libraries_.PropTypes.object,\n children: external_gform_libraries_.PropTypes.oneOfType([external_gform_libraries_.PropTypes.arrayOf(external_gform_libraries_.PropTypes.node), external_gform_libraries_.PropTypes.node]),\n cursorColor: external_gform_libraries_.PropTypes.string,\n customAttributes: external_gform_libraries_.PropTypes.object,\n customClasses: external_gform_libraries_.PropTypes.oneOfType([external_gform_libraries_.PropTypes.string, external_gform_libraries_.PropTypes.array, external_gform_libraries_.PropTypes.object]),\n data: external_gform_libraries_.PropTypes.array,\n gridColor: external_gform_libraries_.PropTypes.string,\n height: external_gform_libraries_.PropTypes.oneOfType([external_gform_libraries_.PropTypes.string, external_gform_libraries_.PropTypes.number]),\n legendProps: external_gform_libraries_.PropTypes.object,\n options: external_gform_libraries_.PropTypes.array,\n showCheckboxes: external_gform_libraries_.PropTypes.bool,\n showLegend: external_gform_libraries_.PropTypes.bool,\n tooltipProps: external_gform_libraries_.PropTypes.object,\n width: external_gform_libraries_.PropTypes.oneOfType([external_gform_libraries_.PropTypes.string, external_gform_libraries_.PropTypes.number]),\n xAxisProps: external_gform_libraries_.PropTypes.object,\n yAxisProps: external_gform_libraries_.PropTypes.object\n};\nGravityAreaChart.displayName = 'AreaChart';\n/* harmony default export */ var Chart_AreaChart = (GravityAreaChart);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vY29tcG9uZW50cy9yZWFjdC9hZG1pbi9tb2R1bGVzL0NoYXJ0L0FyZWFDaGFydC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWdEO0FBRWhELElBQU1DLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFBQyxJQUFBLEVBQTZCO0VBQUEsSUFBdEJDLEVBQUUsR0FBQUQsSUFBQSxDQUFGQyxFQUFFO0lBQUVDLEVBQUUsR0FBQUYsSUFBQSxDQUFGRSxFQUFFO0lBQUVDLE1BQU0sR0FBQUgsSUFBQSxDQUFORyxNQUFNO0VBQ2pDLG9CQUNDTCwrQkFBQSxDQUFBTSxhQUFBO0lBQUtDLENBQUMsRUFBR0osRUFBRSxHQUFHLENBQUc7SUFBQ0ssQ0FBQyxFQUFHSixFQUFFLEdBQUcsQ0FBRztJQUFDSyxLQUFLLEVBQUcsRUFBSTtJQUFDQyxNQUFNLEVBQUcsRUFBSTtJQUFDQyxPQUFPLEVBQUMsV0FBVztJQUFDQyxJQUFJLEVBQUMsTUFBTTtJQUFDQyxLQUFLLEVBQUM7RUFBNEIsZ0JBQzNIYiwrQkFBQSxDQUFBTSxhQUFBO0lBQVFILEVBQUUsRUFBQyxHQUFHO0lBQUNDLEVBQUUsRUFBQyxHQUFHO0lBQUNVLENBQUMsRUFBQyxHQUFHO0lBQUNULE1BQU0sRUFBR0EsTUFBUTtJQUFDVSxXQUFXLEVBQUMsR0FBRztJQUFDSCxJQUFJLEVBQUM7RUFBTyxDQUFFLENBQ3hFLENBQUM7QUFFUixDQUFDO0FBRUQsbURBQWVYLE9BQU8sRTs7QUNWMEI7QUFFaEQsSUFBTWUsYUFBYSxHQUFHO0VBQ3JCQyxTQUFTLEVBQUU7SUFDVkMsZUFBZSxFQUFFLFNBQVM7SUFBRTtJQUM1QkMsS0FBSyxFQUFFLFNBQVM7SUFBRTtJQUNsQkMsT0FBTyxFQUFFLEtBQUs7SUFDZEMsWUFBWSxFQUFFLEtBQUs7SUFDbkJDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCQyxTQUFTLEVBQUUsTUFBTTtJQUNqQkMsUUFBUSxFQUFFO0VBQ1gsQ0FBQztFQUNEQyxLQUFLLEVBQUU7SUFDTkMsVUFBVSxFQUFFO0VBQ2IsQ0FBQztFQUNEQyxPQUFPLEVBQUU7SUFDUkQsVUFBVSxFQUFFO0VBQ2I7QUFDRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0UscUJBQXFCQSxDQUFFQyxNQUFNLEVBQUc7RUFDeEMsT0FBT0EsTUFBTSxDQUFDQyxNQUFNLENBQUUsQ0FBRSxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDLEdBQUdGLE1BQU0sQ0FBQ0csS0FBSyxDQUFFLENBQUUsQ0FBQztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxlQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBQS9CLElBQUEsRUFBcUM7RUFBQSxJQUE5QmdDLE1BQU0sR0FBQWhDLElBQUEsQ0FBTmdDLE1BQU07SUFBRUMsT0FBTyxHQUFBakMsSUFBQSxDQUFQaUMsT0FBTztJQUFFVixLQUFLLEdBQUF2QixJQUFBLENBQUx1QixLQUFLO0VBQ3pDLElBQUtTLE1BQU0sSUFBSUMsT0FBTyxJQUFJQSxPQUFPLENBQUNDLE1BQU0sRUFBRztJQUMxQyxvQkFDQ3BDLCtCQUFBLENBQUFNLGFBQUE7TUFBSytCLEtBQUssRUFBR3JCLGFBQWEsQ0FBQ0M7SUFBVyxnQkFDckNqQiwrQkFBQSxDQUFBTSxhQUFBO01BQUsrQixLQUFLLEVBQUdyQixhQUFhLENBQUNTO0lBQU8sR0FBR0EsS0FBWSxDQUFDLEVBQ2hEVSxPQUFPLENBQUNHLEdBQUcsQ0FBRSxVQUFFQyxLQUFLLEVBQUVDLEtBQUs7TUFBQSxvQkFDNUJ4QywrQkFBQSxDQUFBTSxhQUFBO1FBQUttQyxHQUFHLEVBQUdELEtBQU87UUFBQ0gsS0FBSyxFQUFHckIsYUFBYSxDQUFDVztNQUFTLGdCQUNqRDNCLCtCQUFBLENBQUFNLGFBQUEsZUFBUXNCLHFCQUFxQixDQUFFVyxLQUFLLENBQUNHLElBQUssQ0FBQyxFQUFFLElBQVEsQ0FBQyxlQUN0RDFDLCtCQUFBLENBQUFNLGFBQUEsZUFBUWlDLEtBQUssQ0FBQ0ksS0FBYSxDQUN2QixDQUFDO0lBQUEsQ0FDTCxDQUNFLENBQUM7RUFFUjtFQUVBLE9BQU8sSUFBSTtBQUNaLENBQUM7QUFFRCxtREFBZVYsZUFBTyxFOzs7Ozs7O0FDaEVpRDtBQUN1QztBQUNwRztBQUNLO0FBQ0Q7QUFDTTtBQUVwQixJQUFRdUIsVUFBVSxHQUEwQnhELCtCQUFLLENBQXpDd0QsVUFBVTtFQUFFQyxRQUFRLEdBQWdCekQsK0JBQUssQ0FBN0J5RCxRQUFRO0VBQUVDLFNBQVMsR0FBSzFELCtCQUFLLENBQW5CMEQsU0FBUzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLGdCQUFnQixHQUFHSCxVQUFVLENBQUUsVUFBQXRELElBQUEsRUFxQmxDMEQsR0FBRyxFQUFNO0VBQUEsSUFBQUMscUJBQUEsR0FBQTNELElBQUEsQ0FwQlg0RCxpQkFBaUI7SUFBakJBLGlCQUFpQixHQUFBRCxxQkFBQSxjQUFHLElBQUksR0FBQUEscUJBQUE7SUFBQUUsY0FBQSxHQUFBN0QsSUFBQSxDQUN4QjhELFNBQVM7SUFBVEEsU0FBUyxHQUFBRCxjQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLGNBQUE7SUFBQUUscUJBQUEsR0FBQS9ELElBQUEsQ0FDZGdFLGtCQUFrQjtJQUFsQkEsa0JBQWtCLEdBQUFELHFCQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLHFCQUFBO0lBQUFFLGtCQUFBLEdBQUFqRSxJQUFBLENBQ3ZCa0UsYUFBYTtJQUFiQSxhQUFhLEdBQUFELGtCQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLGtCQUFBO0lBQUFFLGFBQUEsR0FBQW5FLElBQUEsQ0FDbEJvRSxRQUFRO0lBQVJBLFFBQVEsR0FBQUQsYUFBQSxjQUFHLElBQUksR0FBQUEsYUFBQTtJQUFBRSxnQkFBQSxHQUFBckUsSUFBQSxDQUNmc0UsV0FBVztJQUFYQSxXQUFXLEdBQUFELGdCQUFBLGNBQUcsU0FBUyxHQUFBQSxnQkFBQTtJQUFBRSxxQkFBQSxHQUFBdkUsSUFBQSxDQUN2QndFLGdCQUFnQjtJQUFoQkEsZ0JBQWdCLEdBQUFELHFCQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLHFCQUFBO0lBQUFFLGtCQUFBLEdBQUF6RSxJQUFBLENBQ3JCMEUsYUFBYTtJQUFiQSxhQUFhLEdBQUFELGtCQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLGtCQUFBO0lBQUFFLG1CQUFBLEdBQUEzRSxJQUFBLENBQ2xCNEUsY0FBYztJQUFkQSxjQUFjLEdBQUFELG1CQUFBLGNBQUcsSUFBSSxHQUFBQSxtQkFBQTtJQUFBRSxTQUFBLEdBQUE3RSxJQUFBLENBQ3JCOEUsSUFBSTtJQUFKQSxJQUFJLEdBQUFELFNBQUEsY0FBRyxFQUFFLEdBQUFBLFNBQUE7SUFBQUUsY0FBQSxHQUFBL0UsSUFBQSxDQUNUZ0YsU0FBUztJQUFUQSxTQUFTLEdBQUFELGNBQUEsY0FBRyxTQUFTLEdBQUFBLGNBQUE7SUFBQUUsV0FBQSxHQUFBakYsSUFBQSxDQUNyQlEsTUFBTTtJQUFOQSxNQUFNLEdBQUF5RSxXQUFBLGNBQUcsR0FBRyxHQUFBQSxXQUFBO0lBQUFDLGdCQUFBLEdBQUFsRixJQUFBLENBQ1ptRixXQUFXO0lBQVhBLFdBQVcsR0FBQUQsZ0JBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsZ0JBQUE7SUFBQUUsWUFBQSxHQUFBcEYsSUFBQSxDQUNoQnFGLE9BQU87SUFBUEEsT0FBTyxHQUFBRCxZQUFBLGNBQUcsRUFBRSxHQUFBQSxZQUFBO0lBQUFFLG1CQUFBLEdBQUF0RixJQUFBLENBQ1p1RixjQUFjO0lBQWRBLGNBQWMsR0FBQUQsbUJBQUEsY0FBRyxJQUFJLEdBQUFBLG1CQUFBO0lBQUFFLGVBQUEsR0FBQXhGLElBQUEsQ0FDckJ5RixVQUFVO0lBQVZBLFVBQVUsR0FBQUQsZUFBQSxjQUFHLEtBQUssR0FBQUEsZUFBQTtJQUFBRSxpQkFBQSxHQUFBMUYsSUFBQSxDQUNsQjJGLFlBQVk7SUFBWkEsWUFBWSxHQUFBRCxpQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxpQkFBQTtJQUFBRSxVQUFBLEdBQUE1RixJQUFBLENBQ2pCTyxLQUFLO0lBQUxBLEtBQUssR0FBQXFGLFVBQUEsY0FBRyxNQUFNLEdBQUFBLFVBQUE7SUFBQUMsZUFBQSxHQUFBN0YsSUFBQSxDQUNkOEYsVUFBVTtJQUFWQSxVQUFVLEdBQUFELGVBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsZUFBQTtJQUFBRSxlQUFBLEdBQUEvRixJQUFBLENBQ2ZnRyxVQUFVO0lBQVZBLFVBQVUsR0FBQUQsZUFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxlQUFBO0VBRWYsSUFBTUUsY0FBYyxHQUFBQyxhQUFBLENBQUFBLGFBQUE7SUFDbkJDLFNBQVMsRUFBRXpELHdDQUFVLENBQUU7TUFDdEIsbUJBQW1CLEVBQUUsSUFBSTtNQUN6QixzQkFBc0IsRUFBRTtJQUN6QixDQUFDLEVBQUVnQyxhQUFjO0VBQUMsR0FDZkYsZ0JBQWdCO0lBQ25CZCxHQUFHLEVBQUhBO0VBQUcsRUFDSDtFQUNELElBQU0wQyxvQkFBb0IsR0FBR2YsT0FBTyxDQUFDZ0IsTUFBTSxDQUFFLFVBQUVDLEdBQUcsRUFBRUMsTUFBTSxFQUFNO0lBQy9ERCxHQUFHLENBQUVDLE1BQU0sQ0FBQ0MsT0FBTyxDQUFFLEdBQUdELE1BQU0sQ0FBQ0UsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE9BQU9ILEdBQUc7RUFDWCxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7RUFFUCxJQUFBSSxTQUFBLEdBQTRDbkQsUUFBUSxDQUFFNkMsb0JBQXFCLENBQUM7SUFBQU8sVUFBQSxHQUFBQyw0QkFBQSxDQUFBRixTQUFBO0lBQXBFRyxhQUFhLEdBQUFGLFVBQUE7SUFBRUcsZ0JBQWdCLEdBQUFILFVBQUE7RUFDdkMsSUFBQUksVUFBQSxHQUFnRHhELFFBQVEsQ0FBRSxJQUFLLENBQUM7SUFBQXlELFVBQUEsR0FBQUosNEJBQUEsQ0FBQUcsVUFBQTtJQUF4REUsZUFBZSxHQUFBRCxVQUFBO0lBQUVFLGtCQUFrQixHQUFBRixVQUFBO0VBQzNDLElBQUFHLFVBQUEsR0FBa0M1RCxRQUFRLENBQUU2RCxJQUFJLENBQUNDLEtBQUssQ0FBRXZDLElBQUksQ0FBQzVDLE1BQU0sR0FBRyxFQUFHLENBQUUsQ0FBQztJQUFBb0YsVUFBQSxHQUFBViw0QkFBQSxDQUFBTyxVQUFBO0lBQXBFSSxRQUFRLEdBQUFELFVBQUE7SUFBRUUsV0FBVyxHQUFBRixVQUFBO0VBRTdCLElBQU1HLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBQSxFQUFTO0lBQzVCLElBQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxVQUFVO0lBQ3JDSixXQUFXLENBQUVKLElBQUksQ0FBQ0MsS0FBSyxDQUFFdkMsSUFBSSxDQUFDNUMsTUFBTSxJQUFLd0YsV0FBVyxHQUFHLEdBQUcsQ0FBRyxDQUFFLENBQUM7RUFDakUsQ0FBQztFQUVEbEUsU0FBUyxDQUFFLFlBQU07SUFDaEI7SUFDQSxJQUFNcUUsS0FBSyxHQUFHQyxVQUFVLENBQUUsWUFBTTtNQUMvQlosa0JBQWtCLENBQUUsS0FBTSxDQUFDO0lBQzVCLENBQUMsRUFBRXRELGlCQUFrQixDQUFDO0lBRXRCLE9BQU87TUFBQSxPQUFNbUUsWUFBWSxDQUFFRixLQUFNLENBQUM7SUFBQTtFQUNuQyxDQUFDLEVBQUUsRUFBRyxDQUFDO0VBRVByRSxTQUFTLENBQUUsWUFBTTtJQUNoQixJQUFLb0IsY0FBYyxFQUFHO01BQ3JCQSxjQUFjLENBQUU0QyxXQUFXLEVBQUUxQyxJQUFJLENBQUM1QyxNQUFPLENBQUM7SUFDM0MsQ0FBQyxNQUFNO01BQ051RixjQUFjLENBQUMsQ0FBQztNQUNoQkUsTUFBTSxDQUFDSyxnQkFBZ0IsQ0FBRSxRQUFRLEVBQUVQLGNBQWUsQ0FBQztNQUVuRCxPQUFPLFlBQU07UUFDWkUsTUFBTSxDQUFDTSxtQkFBbUIsQ0FBRSxRQUFRLEVBQUVSLGNBQWUsQ0FBQztNQUN2RCxDQUFDO0lBQ0Y7RUFDRCxDQUFDLEVBQUUsQ0FBRTNDLElBQUksQ0FBQzVDLE1BQU0sRUFBRTBDLGNBQWMsQ0FBRyxDQUFDO0VBRXBDLElBQU1zRCxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFLMUIsT0FBTyxFQUFNO0lBQzNDTSxnQkFBZ0IsQ0FBRSxVQUFFcUIsU0FBUztNQUFBLE9BQUFqQyxhQUFBLENBQUFBLGFBQUEsS0FDekJpQyxTQUFTLE9BQUFDLDZCQUFBLEtBQ1Y1QixPQUFPLEVBQUksQ0FBRTJCLFNBQVMsQ0FBRTNCLE9BQU8sQ0FBRTtJQUFBLENBQ2hDLENBQUM7RUFDTixDQUFDO0VBRUQsSUFBTTZCLHVCQUF1QixHQUFBbkMsYUFBQTtJQUM1Qi9GLE1BQU0sRUFBRTZFLFNBQVM7SUFDakJzRCxlQUFlLEVBQUUsR0FBRztJQUNwQkMsUUFBUSxFQUFFO0VBQUssR0FDWnZFLGtCQUFrQixDQUNyQjtFQUVELElBQU13RSxlQUFlLEdBQUF0QyxhQUFBO0lBQ3BCdUMsUUFBUSxFQUFFO01BQUV0SSxNQUFNLEVBQUU2RTtJQUFVLENBQUM7SUFDL0I5RCxPQUFPLEVBQUU7TUFBRXdILEdBQUcsRUFBRTtJQUFHLENBQUM7SUFDcEJDLFFBQVEsRUFBRTtNQUFFeEksTUFBTSxFQUFFNkU7SUFBVTtFQUFDLEdBQzVCZ0IsVUFBVSxDQUNiO0VBRUQsSUFBTTRDLGVBQWUsR0FBQTFDLGFBQUE7SUFDcEJ1QyxRQUFRLEVBQUU7TUFBRXRJLE1BQU0sRUFBRTZFO0lBQVUsQ0FBQztJQUMvQjJELFFBQVEsRUFBRTtNQUFFeEksTUFBTSxFQUFFNkU7SUFBVSxDQUFDO0lBQy9CdUMsUUFBUSxFQUFSQTtFQUFRLEdBQ0x6QixVQUFVLENBQ2I7RUFFRCxJQUFNK0MsaUJBQWlCLEdBQUEzQyxhQUFBO0lBQ3RCekUsT0FBTyxlQUFFM0IsK0JBQUEsQ0FBQU0sYUFBQSxDQUFDaUQsY0FBYSxNQUFFLENBQUM7SUFDMUJ5RixNQUFNLEVBQUU7TUFBRTNJLE1BQU0sRUFBRW1FO0lBQVk7RUFBQyxHQUM1QnFCLFlBQVksQ0FDZjtFQUVELElBQU1vRCxnQkFBZ0IsR0FBQTdDLGFBQUEsS0FDbEJmLFdBQVcsQ0FDZDtFQUVELG9CQUNDckYsK0JBQUEsQ0FBQU0sYUFBQSxRQUFVNkYsY0FBYyxFQUNyQlYsY0FBYyxpQkFDZnpGLCtCQUFBLENBQUFNLGFBQUE7SUFBSytGLFNBQVMsRUFBQztFQUF5QixnQkFDdkNyRywrQkFBQSxDQUFBTSxhQUFBLENBQUMrQyxjQUFHO0lBQUM2RixPQUFPLEVBQUMsTUFBTTtJQUFDQyxPQUFPLEVBQUcsQ0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQUksR0FDM0M1RCxPQUFPLENBQUNqRCxHQUFHLENBQUUsVUFBRW1FLE1BQU0sRUFBTTtJQUM1QixJQUFNMkMsa0JBQWtCLEdBQUFoRCxhQUFBO01BQ3ZCaUQsZUFBZSxFQUFFdEMsYUFBYSxDQUFFTixNQUFNLENBQUNDLE9BQU8sQ0FBRTtNQUNoRDRDLGVBQWUsRUFBRSxJQUFJO01BQ3JCQyxlQUFlLEVBQUU7UUFDaEI5SCxLQUFLLEVBQUVnRixNQUFNLENBQUNoRixLQUFLO1FBQ25CK0gsTUFBTSxFQUFFO01BQ1QsQ0FBQztNQUNEQyxRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBQTtRQUFBLE9BQVFyQixvQkFBb0IsQ0FBRTNCLE1BQU0sQ0FBQ0MsT0FBUSxDQUFDO01BQUE7TUFDdER5QyxPQUFPLEVBQUUsQ0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQUUsR0FDcEIvRSxhQUFhLENBQ2hCO0lBQ0Qsb0JBQ0NwRSwrQkFBQSxDQUFBTSxhQUFBLENBQUNnRCxtQkFBUSxFQUFBb0csMEJBQUE7TUFBQ2pILEdBQUcsRUFBR2dFLE1BQU0sQ0FBQ0M7SUFBUyxHQUFNMEMsa0JBQWtCLENBQUksQ0FBQztFQUUvRCxDQUFFLENBQ0UsQ0FDRCxDQUNMLGVBQ0RwSiwrQkFBQSxDQUFBTSxhQUFBLENBQUM4Qyx1Q0FBbUI7SUFBQzNDLEtBQUssRUFBR0EsS0FBTztJQUFDQyxNQUFNLEVBQUdBO0VBQVEsZ0JBQ3JEViwrQkFBQSxDQUFBTSxhQUFBLENBQUN3QyxtQkFBUztJQUFDa0MsSUFBSSxFQUFHQSxJQUFNO0lBQUMyRSxNQUFNLEVBQUc7TUFBRWYsR0FBRyxFQUFFLENBQUM7TUFBRWdCLEtBQUssRUFBRSxFQUFFO01BQUVDLElBQUksRUFBRSxDQUFDO01BQUVDLE1BQU0sRUFBRTtJQUFFO0VBQUcsZ0JBQzVFOUosK0JBQUEsQ0FBQU0sYUFBQSxlQUNHaUYsT0FBTyxDQUFDakQsR0FBRyxDQUFFLFVBQUVtRSxNQUFNO0lBQUEsb0JBQ3RCekcsK0JBQUEsQ0FBQU0sYUFBQTtNQUFnQm1DLEdBQUcsRUFBR2dFLE1BQU0sQ0FBQ0MsT0FBUztNQUFDcUQsRUFBRSxVQUFBQyxNQUFBLENBQVl2RCxNQUFNLENBQUNDLE9BQU8sQ0FBSztNQUFDdUQsRUFBRSxFQUFDLEdBQUc7TUFBQ0MsRUFBRSxFQUFDLEdBQUc7TUFBQ0MsRUFBRSxFQUFDLEdBQUc7TUFBQ0MsRUFBRSxFQUFDO0lBQUcsZ0JBQ25HcEssK0JBQUEsQ0FBQU0sYUFBQTtNQUFNK0osTUFBTSxFQUFDLElBQUk7TUFBQ0MsU0FBUyxFQUFHN0QsTUFBTSxDQUFDdEYsS0FBTztNQUFDb0osV0FBVyxFQUFHO0lBQUssQ0FBRSxDQUFDLGVBQ25FdkssK0JBQUEsQ0FBQU0sYUFBQTtNQUFNK0osTUFBTSxFQUFDLEtBQUs7TUFBQ0MsU0FBUyxFQUFHN0QsTUFBTSxDQUFDdEYsS0FBTztNQUFDb0osV0FBVyxFQUFHO0lBQUcsQ0FBRSxDQUNsRCxDQUFDO0VBQUEsQ0FDaEIsQ0FDRyxDQUFDLGVBQ1B2SywrQkFBQSxDQUFBTSxhQUFBLENBQUM0QywyQkFBYSxFQUFNcUYsdUJBQTJCLENBQUMsZUFDaER2SSwrQkFBQSxDQUFBTSxhQUFBLENBQUMwQyxXQUFLLEVBQU04RixlQUFtQixDQUFDLGVBQ2hDOUksK0JBQUEsQ0FBQU0sYUFBQSxDQUFDMkMsV0FBSyxFQUFNeUYsZUFBbUIsQ0FBQyxlQUNoQzFJLCtCQUFBLENBQUFNLGFBQUEsQ0FBQzJCLGVBQU8sRUFBTThHLGlCQUFxQixDQUFDLEVBQ2xDcEQsVUFBVSxpQkFBSTNGLCtCQUFBLENBQUFNLGFBQUEsQ0FBQzZDLGFBQU0sRUFBTThGLGdCQUFvQixDQUFDLEVBQ2hEMUQsT0FBTyxDQUFDakQsR0FBRyxDQUNaLFVBQUVtRSxNQUFNLEVBQU07SUFDYixJQUFNK0QsY0FBYyxHQUFBcEUsYUFBQTtNQUNuQnFFLElBQUksRUFBRSxVQUFVO01BQ2hCL0QsT0FBTyxFQUFFRCxNQUFNLENBQUNDLE9BQU87TUFDdkJyRyxNQUFNLEVBQUVvRyxNQUFNLENBQUN0RixLQUFLO01BQ3BCdUosV0FBVyxFQUFFLENBQUM7TUFDZDlKLElBQUksZUFBQW9KLE1BQUEsQ0FBZ0J2RCxNQUFNLENBQUNDLE9BQU8sTUFBSTtNQUN0QzNGLFdBQVcsRUFBRSxDQUFDO01BQ2Q0SixHQUFHLEVBQUUsS0FBSztNQUNWQyxTQUFTLGVBQUU1SywrQkFBQSxDQUFBTSxhQUFBLENBQUNMLGNBQU87UUFBQ0ksTUFBTSxFQUFHb0csTUFBTSxDQUFDdEY7TUFBTyxDQUFFLENBQUM7TUFDOUMwSixpQkFBaUIsRUFBRTFELGVBQWU7TUFDbEMyRCxjQUFjLEVBQUUsQ0FBQztNQUNqQmhILGlCQUFpQixFQUFqQkE7SUFBaUIsR0FDZEUsU0FBUyxDQUNaO0lBQ0QsT0FBTytDLGFBQWEsQ0FBRU4sTUFBTSxDQUFDQyxPQUFPLENBQUUsZ0JBQ3JDMUcsK0JBQUEsQ0FBQU0sYUFBQSxDQUFDeUMsU0FBSSxFQUFBMkcsMEJBQUE7TUFBQ2pILEdBQUcsRUFBR2dFLE1BQU0sQ0FBQ0M7SUFBUyxHQUFNOEQsY0FBYyxDQUFJLENBQUMsR0FDbEQsSUFBSTtFQUNULENBQ0QsQ0FDVSxDQUNTLENBQUMsRUFDcEJsRyxRQUNFLENBQUM7QUFFUixDQUFFLENBQUM7QUFFSFgsZ0JBQWdCLENBQUNvSCxTQUFTLEdBQUc7RUFDNUJqSCxpQkFBaUIsRUFBRWpCLG1DQUFTLENBQUNtSSxNQUFNO0VBQ25DaEgsU0FBUyxFQUFFbkIsbUNBQVMsQ0FBQ29JLE1BQU07RUFDM0IvRyxrQkFBa0IsRUFBRXJCLG1DQUFTLENBQUNvSSxNQUFNO0VBQ3BDN0csYUFBYSxFQUFFdkIsbUNBQVMsQ0FBQ29JLE1BQU07RUFDL0IzRyxRQUFRLEVBQUV6QixtQ0FBUyxDQUFDcUksU0FBUyxDQUFFLENBQzlCckksbUNBQVMsQ0FBQ3NJLE9BQU8sQ0FBRXRJLG1DQUFTLENBQUN1SSxJQUFLLENBQUMsRUFDbkN2SSxtQ0FBUyxDQUFDdUksSUFBSSxDQUNiLENBQUM7RUFDSDVHLFdBQVcsRUFBRTNCLG1DQUFTLENBQUNoQixNQUFNO0VBQzdCNkMsZ0JBQWdCLEVBQUU3QixtQ0FBUyxDQUFDb0ksTUFBTTtFQUNsQ3JHLGFBQWEsRUFBRS9CLG1DQUFTLENBQUNxSSxTQUFTLENBQUUsQ0FDbkNySSxtQ0FBUyxDQUFDaEIsTUFBTSxFQUNoQmdCLG1DQUFTLENBQUN3SSxLQUFLLEVBQ2Z4SSxtQ0FBUyxDQUFDb0ksTUFBTSxDQUNmLENBQUM7RUFDSGpHLElBQUksRUFBRW5DLG1DQUFTLENBQUN3SSxLQUFLO0VBQ3JCbkcsU0FBUyxFQUFFckMsbUNBQVMsQ0FBQ2hCLE1BQU07RUFDM0JuQixNQUFNLEVBQUVtQyxtQ0FBUyxDQUFDcUksU0FBUyxDQUFFLENBQUVySSxtQ0FBUyxDQUFDaEIsTUFBTSxFQUFFZ0IsbUNBQVMsQ0FBQ21JLE1BQU0sQ0FBRyxDQUFDO0VBQ3JFM0YsV0FBVyxFQUFFeEMsbUNBQVMsQ0FBQ29JLE1BQU07RUFDN0IxRixPQUFPLEVBQUUxQyxtQ0FBUyxDQUFDd0ksS0FBSztFQUN4QjVGLGNBQWMsRUFBRTVDLG1DQUFTLENBQUN5SSxJQUFJO0VBQzlCM0YsVUFBVSxFQUFFOUMsbUNBQVMsQ0FBQ3lJLElBQUk7RUFDMUJ6RixZQUFZLEVBQUVoRCxtQ0FBUyxDQUFDb0ksTUFBTTtFQUM5QnhLLEtBQUssRUFBRW9DLG1DQUFTLENBQUNxSSxTQUFTLENBQUUsQ0FBRXJJLG1DQUFTLENBQUNoQixNQUFNLEVBQUVnQixtQ0FBUyxDQUFDbUksTUFBTSxDQUFHLENBQUM7RUFDcEVoRixVQUFVLEVBQUVuRCxtQ0FBUyxDQUFDb0ksTUFBTTtFQUM1Qi9FLFVBQVUsRUFBRXJELG1DQUFTLENBQUNvSTtBQUN2QixDQUFDO0FBRUR0SCxnQkFBZ0IsQ0FBQzRILFdBQVcsR0FBRyxXQUFXO0FBRTFDLG9EQUFlNUgsZ0JBQWdCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uL2NvbXBvbmVudHMvcmVhY3QvYWRtaW4vbW9kdWxlcy9DaGFydC9jb21tb24vRGF0YURvdC5qcz8wYjA1Iiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi9jb21wb25lbnRzL3JlYWN0L2FkbWluL21vZHVsZXMvQ2hhcnQvY29tbW9uL1Rvb2x0aXAuanM/YjM5ZiIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vY29tcG9uZW50cy9yZWFjdC9hZG1pbi9tb2R1bGVzL0NoYXJ0L0FyZWFDaGFydC9pbmRleC5qcz84MWU5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWN0IH0gZnJvbSAnQGdyYXZpdHlmb3Jtcy9saWJyYXJpZXMnO1xuXG5jb25zdCBEYXRhRG90ID0gKCB7IGN4LCBjeSwgc3Ryb2tlIH0gKSA9PiB7XG5cdHJldHVybiAoXG5cdFx0PHN2ZyB4PXsgY3ggLSA2IH0geT17IGN5IC0gNiB9IHdpZHRoPXsgMTIgfSBoZWlnaHQ9eyAxMiB9IHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cblx0XHRcdDxjaXJjbGUgY3g9XCI2XCIgY3k9XCI2XCIgcj1cIjVcIiBzdHJva2U9eyBzdHJva2UgfSBzdHJva2VXaWR0aD1cIjJcIiBmaWxsPVwid2hpdGVcIiAvPlxuXHRcdDwvc3ZnPlxuXHQpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0YURvdDtcbiIsImltcG9ydCB7IFJlYWN0IH0gZnJvbSAnQGdyYXZpdHlmb3Jtcy9saWJyYXJpZXMnO1xuXG5jb25zdCB0b29sdGlwU3R5bGVzID0ge1xuXHRjb250YWluZXI6IHtcblx0XHRiYWNrZ3JvdW5kQ29sb3I6ICcjMjQyNzQ4JywgLy8gRGFyayBibHVlIGJhY2tncm91bmRcblx0XHRjb2xvcjogJyNmZmZmZmYnLCAvLyBXaGl0ZSB0ZXh0XG5cdFx0cGFkZGluZzogJzhweCcsXG5cdFx0Ym9yZGVyUmFkaXVzOiAnM3B4Jyxcblx0XHRwb3NpdGlvbjogJ3JlbGF0aXZlJyxcblx0XHR0ZXh0QWxpZ246ICdsZWZ0Jyxcblx0XHRmb250U2l6ZTogJzEycHgnLFxuXHR9LFxuXHRsYWJlbDoge1xuXHRcdGZvbnRXZWlnaHQ6ICc2MDAnLFxuXHR9LFxuXHRjb250ZW50OiB7XG5cdFx0Zm9udFdlaWdodDogJ25vcm1hbCcsXG5cdH0sXG59O1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXJcbiAqIEBkZXNjcmlwdGlvbiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgYSBzdHJpbmcuXG4gKlxuICogQHNpbmNlIDQuNC40XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZi5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLlxuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5jaGFyQXQoIDAgKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKCAxICk7XG59XG5cbi8qKlxuICogQG1vZHVsZSBUb29sdGlwXG4gKiBAZGVzY3JpcHRpb24gVGhlIHRvb2x0aXAgY29tcG9uZW50IGZvciB0aGUgY2hhcnQuXG4gKlxuICogQHNpbmNlIDQuNC40XG4gKlxuICogQHBhcmFtIHtib29sZWFufSBhY3RpdmUgIFdoZXRoZXIgdGhlIHRvb2x0aXAgaXMgYWN0aXZlLlxuICogQHBhcmFtIHtBcnJheX0gICBwYXlsb2FkIFRoZSBwYXlsb2FkIG9mIHRoZSB0b29sdGlwLlxuICogQHBhcmFtIHtzdHJpbmd9ICBsYWJlbCAgIFRoZSBsYWJlbCBvZiB0aGUgdG9vbHRpcC5cbiAqXG4gKiBAcmV0dXJuIHtKU1guRWxlbWVudHxudWxsfSBUaGUgdG9vbHRpcCBjb21wb25lbnQuXG4gKi9cbmNvbnN0IFRvb2x0aXAgPSAoIHsgYWN0aXZlLCBwYXlsb2FkLCBsYWJlbCB9ICkgPT4ge1xuXHRpZiAoIGFjdGl2ZSAmJiBwYXlsb2FkICYmIHBheWxvYWQubGVuZ3RoICkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IHN0eWxlPXsgdG9vbHRpcFN0eWxlcy5jb250YWluZXIgfT5cblx0XHRcdFx0PGRpdiBzdHlsZT17IHRvb2x0aXBTdHlsZXMubGFiZWwgfT57IGxhYmVsIH08L2Rpdj5cblx0XHRcdFx0eyBwYXlsb2FkLm1hcCggKCBlbnRyeSwgaW5kZXggKSA9PiAoXG5cdFx0XHRcdFx0PGRpdiBrZXk9eyBpbmRleCB9IHN0eWxlPXsgdG9vbHRpcFN0eWxlcy5jb250ZW50IH0+XG5cdFx0XHRcdFx0XHQ8c3Bhbj57IGNhcGl0YWxpemVGaXJzdExldHRlciggZW50cnkubmFtZSApIH06IDwvc3Bhbj5cblx0XHRcdFx0XHRcdDxzcGFuPnsgZW50cnkudmFsdWUgfTwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0KSApIH1cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7XG4iLCJpbXBvcnQgeyBjbGFzc25hbWVzLCBQcm9wVHlwZXMsIFJlYWN0IH0gZnJvbSAnQGdyYXZpdHlmb3Jtcy9saWJyYXJpZXMnO1xuaW1wb3J0IHsgQXJlYUNoYXJ0LCBBcmVhLCBYQXhpcywgWUF4aXMsIENhcnRlc2lhbkdyaWQsIFRvb2x0aXAsIExlZ2VuZCwgUmVzcG9uc2l2ZUNvbnRhaW5lciB9IGZyb20gJ3JlY2hhcnRzJztcbmltcG9ydCBCb3ggZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvQm94JztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9DaGVja2JveCc7XG5pbXBvcnQgRGF0YURvdCBmcm9tICcuLi9jb21tb24vRGF0YURvdCc7XG5pbXBvcnQgQ3VzdG9tVG9vbHRpcCBmcm9tICcuLi9jb21tb24vVG9vbHRpcCc7XG5cbmNvbnN0IHsgZm9yd2FyZFJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9ID0gUmVhY3Q7XG5cbi8qKlxuICogQG1vZHVsZSBHcmF2aXR5QXJlYUNoYXJ0XG4gKiBAZGVzY3JpcHRpb24gVGhlIEFyZWFDaGFydCBjb21wb25lbnQuIExvYWRlZCBieSB0aGUgQ2hhcnQgcmVuZGVyZXIgYW5kIGRpc3BsYXllZCBieSBwYXNzaW5nIHR5cGUgXCJhcmVhXCIuXG4gKlxuICogQHNpbmNlIDQuNC41XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgICAgICBhbmltYXRpb25EdXJhdGlvbiAgVGhlIGR1cmF0aW9uIG9mIHRoZSByZXZlYWwgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgYXJlYVByb3BzICAgICAgICAgIFRoZSBwcm9wcyB0byBwYXNzIHRvIGVhY2ggQXJlYSAoY2FuIGFsc28gb3ZlcnJpZGUgdGhlIHByZXNldHMgd2UgdXNlKS4gQ2hlY2sgUmVjaGFydHMgZG9jcyBmb3IgYWxsIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgY2FydGVzaWFuR3JpZFByb3BzIFRoZSBwcm9wcyB0byBwYXNzIHRvIHRoZSBDYXJ0ZXNpYW5HcmlkIChjYW4gYWxzbyBvdmVycmlkZSB0aGUgcHJlc2V0cyB3ZSB1c2UpLiBDaGVjayBSZWNoYXJ0cyBkb2NzIGZvciBhbGwgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICBjaGVja2JveFByb3BzICAgICAgVGhlIHByb3BzIHRvIHBhc3MgdG8gZWFjaCBDaGVja2JveC4gQ2hlY2sgb3VyIGRvY3MgZm9yIGFsbCBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge25vZGV9ICAgICAgICAgICAgICAgIGNoaWxkcmVuICAgICAgICAgICBBbnkgYWRkaXRpb25hbCBjb250ZW50IHRvIGRpc3BsYXkgYmVsb3cgdGhlIGNoYXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICAgICBjdXJzb3JDb2xvciAgICAgICAgVGhlIGNvbG9yIG9mIHRoZSBjdXJzb3IgbGluZSBpbiB0aGUgY2hhcnQgdGhhdCBhcHBlYXJzIHdoZW4gdGhlIHRvb2x0aXAgaXMgaG92ZXJlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICAgICAgICAgY3VzdG9tQXR0cmlidXRlcyAgIEN1c3RvbSBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjaGFydCB3cmFwcGVyLlxuICogQHBhcmFtIHtzdHJpbmd8YXJyYXl8b2JqZWN0fSBjdXN0b21DbGFzc2VzICAgICAgQ3VzdG9tIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGNoYXJ0IHdyYXBwZXIuXG4gKiBAcGFyYW0ge2FycmF5fSAgICAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICBUaGUgZGF0YSB0byBkaXNwbGF5IGluIHRoZSBjaGFydC4gQ2hlY2sgUmVjaGFydHMgZG9jcyBmb3IgZm9ybWF0cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgZ3JpZENvbG9yICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgZ3JpZCBsaW5lcyBhbmQgdGhlIHggYW5kIHkgYXhpcy5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gICAgICAgaGVpZ2h0ICAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNoYXJ0LlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICBsZWdlbmRQcm9wcyAgICAgICAgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIExlZ2VuZCAoY2FuIGFsc28gb3ZlcnJpZGUgdGhlIHByZXNldHMgd2UgdXNlKS4gQ2hlY2sgUmVjaGFydHMgZG9jcyBmb3IgYWxsIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7YXJyYXl9ICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgICAgIFRoZSBvcHRpb25zIHRvIGRpc3BsYXkgYXMgY2hlY2tib3hlcyB0byB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgZWFjaCBkYXRhIHNldC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgc2hvd0NoZWNrYm94ZXMgICAgIFdoZXRoZXIgdG8gc2hvdyB0aGUgY2hlY2tib3hlcyB0byB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgZWFjaCBkYXRhIHNldC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gICAgICAgICAgICAgc2hvd0xlZ2VuZCAgICAgICAgIFdoZXRoZXIgdG8gc2hvdyB0aGUgbGVnZW5kLlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICB0b29sdGlwUHJvcHMgICAgICAgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIFRvb2x0aXAgKGNhbiBhbHNvIG92ZXJyaWRlIHRoZSBwcmVzZXRzIHdlIHVzZSkuIENoZWNrIFJlY2hhcnRzIGRvY3MgZm9yIGFsbCBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9ICAgICAgIHdpZHRoICAgICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGNoYXJ0LlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICB4QXhpc1Byb3BzICAgICAgICAgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIFhBeGlzIChjYW4gYWxzbyBvdmVycmlkZSB0aGUgcHJlc2V0cyB3ZSB1c2UpLiBDaGVjayBSZWNoYXJ0cyBkb2NzIGZvciBhbGwgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICB5QXhpc1Byb3BzICAgICAgICAgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIFlBeGlzIChjYW4gYWxzbyBvdmVycmlkZSB0aGUgcHJlc2V0cyB3ZSB1c2UpLiBDaGVjayBSZWNoYXJ0cyBkb2NzIGZvciBhbGwgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICByZWYgICAgICAgICAgICAgICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgY2hhcnQgY29tcG9uZW50LlxuICpcbiAqIEByZXR1cm4ge0pTWC5FbGVtZW50fG51bGx9IFRoZSBBcmVhQ2hhcnQgY29tcG9uZW50LlxuICovXG5jb25zdCBHcmF2aXR5QXJlYUNoYXJ0ID0gZm9yd2FyZFJlZiggKCB7XG5cdGFuaW1hdGlvbkR1cmF0aW9uID0gMTAwMCxcblx0YXJlYVByb3BzID0ge30sXG5cdGNhcnRlc2lhbkdyaWRQcm9wcyA9IHt9LFxuXHRjaGVja2JveFByb3BzID0ge30sXG5cdGNoaWxkcmVuID0gbnVsbCxcblx0Y3Vyc29yQ29sb3IgPSAnIzkwOTJiMicsXG5cdGN1c3RvbUF0dHJpYnV0ZXMgPSB7fSxcblx0Y3VzdG9tQ2xhc3NlcyA9IHt9LFxuXHRjdXN0b21JbnRlcnZhbCA9IG51bGwsXG5cdGRhdGEgPSBbXSxcblx0Z3JpZENvbG9yID0gJyNlY2VkZjgnLFxuXHRoZWlnaHQgPSA0MDAsXG5cdGxlZ2VuZFByb3BzID0ge30sXG5cdG9wdGlvbnMgPSBbXSxcblx0c2hvd0NoZWNrYm94ZXMgPSB0cnVlLFxuXHRzaG93TGVnZW5kID0gZmFsc2UsXG5cdHRvb2x0aXBQcm9wcyA9IHt9LFxuXHR3aWR0aCA9ICcxMDAlJyxcblx0eEF4aXNQcm9wcyA9IHt9LFxuXHR5QXhpc1Byb3BzID0ge30sXG59LCByZWYgKSA9PiB7XG5cdGNvbnN0IGNvbXBvbmVudFByb3BzID0ge1xuXHRcdGNsYXNzTmFtZTogY2xhc3NuYW1lcygge1xuXHRcdFx0J2dmb3JtLWNoYXJ0LS1hcmVhJzogdHJ1ZSxcblx0XHRcdCdnZm9ybS1jaGFydF9fd3JhcHBlcic6IHRydWUsXG5cdFx0fSwgY3VzdG9tQ2xhc3NlcyApLFxuXHRcdC4uLmN1c3RvbUF0dHJpYnV0ZXMsXG5cdFx0cmVmLFxuXHR9O1xuXHRjb25zdCBpbml0aWFsQ2hlY2tib3hTdGF0ZSA9IG9wdGlvbnMucmVkdWNlKCAoIGFjYywgb3B0aW9uICkgPT4ge1xuXHRcdGFjY1sgb3B0aW9uLmRhdGFLZXkgXSA9IG9wdGlvbi5kZWZhdWx0Q2hlY2tlZCB8fCB0cnVlOyAvLyBTZXQgZGVmYXVsdCB2aXNpYmlsaXR5LCBkZWZhdWx0IHRvIHRydWVcblx0XHRyZXR1cm4gYWNjO1xuXHR9LCB7fSApO1xuXG5cdGNvbnN0IFsgY2hlY2tib3hTdGF0ZSwgc2V0Q2hlY2tib3hTdGF0ZSBdID0gdXNlU3RhdGUoIGluaXRpYWxDaGVja2JveFN0YXRlICk7XG5cdGNvbnN0IFsgYW5pbWF0aW9uQWN0aXZlLCBzZXRBbmltYXRpb25BY3RpdmUgXSA9IHVzZVN0YXRlKCB0cnVlICk7XG5cdGNvbnN0IFsgaW50ZXJ2YWwsIHNldEludGVydmFsIF0gPSB1c2VTdGF0ZSggTWF0aC5mbG9vciggZGF0YS5sZW5ndGggLyAxMCApICk7XG5cblx0Y29uc3QgdXBkYXRlSW50ZXJ2YWwgPSAoKSA9PiB7XG5cdFx0Y29uc3Qgc2NyZWVuV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblx0XHRzZXRJbnRlcnZhbCggTWF0aC5mbG9vciggZGF0YS5sZW5ndGggLyAoIHNjcmVlbldpZHRoIC8gMTgwICkgKSApO1xuXHR9O1xuXG5cdHVzZUVmZmVjdCggKCkgPT4ge1xuXHRcdC8vIERpc2FibGUgYW5pbWF0aW9uIGFmdGVyIHRoZSBmaXJzdCByZW5kZXJcblx0XHRjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoICgpID0+IHtcblx0XHRcdHNldEFuaW1hdGlvbkFjdGl2ZSggZmFsc2UgKTtcblx0XHR9LCBhbmltYXRpb25EdXJhdGlvbiApO1xuXG5cdFx0cmV0dXJuICgpID0+IGNsZWFyVGltZW91dCggdGltZXIgKTtcblx0fSwgW10gKTtcblxuXHR1c2VFZmZlY3QoICgpID0+IHtcblx0XHRpZiAoIGN1c3RvbUludGVydmFsICkge1xuXHRcdFx0Y3VzdG9tSW50ZXJ2YWwoIHNldEludGVydmFsLCBkYXRhLmxlbmd0aCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1cGRhdGVJbnRlcnZhbCgpO1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB1cGRhdGVJbnRlcnZhbCApO1xuXG5cdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHVwZGF0ZUludGVydmFsICk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSwgWyBkYXRhLmxlbmd0aCwgY3VzdG9tSW50ZXJ2YWwgXSApO1xuXG5cdGNvbnN0IGhhbmRsZUNoZWNrYm94Q2hhbmdlID0gKCBkYXRhS2V5ICkgPT4ge1xuXHRcdHNldENoZWNrYm94U3RhdGUoICggcHJldlN0YXRlICkgPT4gKCB7XG5cdFx0XHQuLi5wcmV2U3RhdGUsXG5cdFx0XHRbIGRhdGFLZXkgXTogISBwcmV2U3RhdGVbIGRhdGFLZXkgXSxcblx0XHR9ICkgKTtcblx0fTtcblxuXHRjb25zdCBjYXJ0ZXNpYW5HcmlkQXR0cmlidXRlcyA9IHtcblx0XHRzdHJva2U6IGdyaWRDb2xvcixcblx0XHRzdHJva2VEYXNoYXJyYXk6ICcwJyxcblx0XHR2ZXJ0aWNhbDogZmFsc2UsXG5cdFx0Li4uY2FydGVzaWFuR3JpZFByb3BzLFxuXHR9O1xuXG5cdGNvbnN0IHlBeGlzQXR0cmlidXRlcyA9IHtcblx0XHRheGlzTGluZTogeyBzdHJva2U6IGdyaWRDb2xvciB9LFxuXHRcdHBhZGRpbmc6IHsgdG9wOiAxMCB9LFxuXHRcdHRpY2tMaW5lOiB7IHN0cm9rZTogZ3JpZENvbG9yIH0sXG5cdFx0Li4ueUF4aXNQcm9wcyxcblx0fTtcblxuXHRjb25zdCB4QXhpc0F0dHJpYnV0ZXMgPSB7XG5cdFx0YXhpc0xpbmU6IHsgc3Ryb2tlOiBncmlkQ29sb3IgfSxcblx0XHR0aWNrTGluZTogeyBzdHJva2U6IGdyaWRDb2xvciB9LFxuXHRcdGludGVydmFsLFxuXHRcdC4uLnhBeGlzUHJvcHMsXG5cdH07XG5cblx0Y29uc3QgdG9vbHRpcEF0dHJpYnV0ZXMgPSB7XG5cdFx0Y29udGVudDogPEN1c3RvbVRvb2x0aXAgLz4sXG5cdFx0Y3Vyc29yOiB7IHN0cm9rZTogY3Vyc29yQ29sb3IgfSxcblx0XHQuLi50b29sdGlwUHJvcHMsXG5cdH07XG5cblx0Y29uc3QgbGVnZW5kQXR0cmlidXRlcyA9IHtcblx0XHQuLi5sZWdlbmRQcm9wcyxcblx0fTtcblxuXHRyZXR1cm4gKFxuXHRcdDxkaXYgeyAuLi5jb21wb25lbnRQcm9wcyB9PlxuXHRcdFx0eyBzaG93Q2hlY2tib3hlcyAmJiAoXG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiZ2Zvcm0tY2hhcnRfX2NoZWNrYm94ZXNcIj5cblx0XHRcdFx0XHQ8Qm94IGRpc3BsYXk9XCJmbGV4XCIgc3BhY2luZz17IFsgMCwgNSwgMCwgMCBdIH0+XG5cdFx0XHRcdFx0XHR7IG9wdGlvbnMubWFwKCAoIG9wdGlvbiApID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hlY2tib3hBdHRyaWJ1dGVzID0ge1xuXHRcdFx0XHRcdFx0XHRcdGV4dGVybmFsQ2hlY2tlZDogY2hlY2tib3hTdGF0ZVsgb3B0aW9uLmRhdGFLZXkgXSxcblx0XHRcdFx0XHRcdFx0XHRleHRlcm5hbENvbnRyb2w6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWxBdHRyaWJ1dGVzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb3B0aW9uLmxhYmVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0d2VpZ2h0OiAnbm9ybWFsJyxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdG9uQ2hhbmdlOiAoKSA9PiBoYW5kbGVDaGVja2JveENoYW5nZSggb3B0aW9uLmRhdGFLZXkgKSxcblx0XHRcdFx0XHRcdFx0XHRzcGFjaW5nOiBbIDAsIDAsIDQsIDMgXSxcblx0XHRcdFx0XHRcdFx0XHQuLi5jaGVja2JveFByb3BzLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdDxDaGVja2JveCBrZXk9eyBvcHRpb24uZGF0YUtleSB9IHsgLi4uY2hlY2tib3hBdHRyaWJ1dGVzIH0gLz5cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gKSB9XG5cdFx0XHRcdFx0PC9Cb3g+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0KSB9XG5cdFx0XHQ8UmVzcG9uc2l2ZUNvbnRhaW5lciB3aWR0aD17IHdpZHRoIH0gaGVpZ2h0PXsgaGVpZ2h0IH0+XG5cdFx0XHRcdDxBcmVhQ2hhcnQgZGF0YT17IGRhdGEgfSBtYXJnaW49eyB7IHRvcDogMCwgcmlnaHQ6IDIwLCBsZWZ0OiAwLCBib3R0b206IDAgfSB9PlxuXHRcdFx0XHRcdDxkZWZzPlxuXHRcdFx0XHRcdFx0eyBvcHRpb25zLm1hcCggKCBvcHRpb24gKSA9PiAoXG5cdFx0XHRcdFx0XHRcdDxsaW5lYXJHcmFkaWVudCBrZXk9eyBvcHRpb24uZGF0YUtleSB9IGlkPXsgYGNvbG9yJHsgb3B0aW9uLmRhdGFLZXkgfWAgfSB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjBcIiB5Mj1cIjFcIj5cblx0XHRcdFx0XHRcdFx0XHQ8c3RvcCBvZmZzZXQ9XCI1JVwiIHN0b3BDb2xvcj17IG9wdGlvbi5jb2xvciB9IHN0b3BPcGFjaXR5PXsgMC4xIH0gLz5cblx0XHRcdFx0XHRcdFx0XHQ8c3RvcCBvZmZzZXQ9XCI5NSVcIiBzdG9wQ29sb3I9eyBvcHRpb24uY29sb3IgfSBzdG9wT3BhY2l0eT17IDAgfSAvPlxuXHRcdFx0XHRcdFx0XHQ8L2xpbmVhckdyYWRpZW50PlxuXHRcdFx0XHRcdFx0KSApIH1cblx0XHRcdFx0XHQ8L2RlZnM+XG5cdFx0XHRcdFx0PENhcnRlc2lhbkdyaWQgeyAuLi5jYXJ0ZXNpYW5HcmlkQXR0cmlidXRlcyB9IC8+XG5cdFx0XHRcdFx0PFhBeGlzIHsgLi4ueEF4aXNBdHRyaWJ1dGVzIH0gLz5cblx0XHRcdFx0XHQ8WUF4aXMgeyAuLi55QXhpc0F0dHJpYnV0ZXMgfSAvPlxuXHRcdFx0XHRcdDxUb29sdGlwIHsgLi4udG9vbHRpcEF0dHJpYnV0ZXMgfSAvPlxuXHRcdFx0XHRcdHsgc2hvd0xlZ2VuZCAmJiA8TGVnZW5kIHsgLi4ubGVnZW5kQXR0cmlidXRlcyB9IC8+IH1cblx0XHRcdFx0XHR7IG9wdGlvbnMubWFwKFxuXHRcdFx0XHRcdFx0KCBvcHRpb24gKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFyZWFBdHRyaWJ1dGVzID0ge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdtb25vdG9uZScsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YUtleTogb3B0aW9uLmRhdGFLZXksXG5cdFx0XHRcdFx0XHRcdFx0c3Ryb2tlOiBvcHRpb24uY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0ZmlsbE9wYWNpdHk6IDEsXG5cdFx0XHRcdFx0XHRcdFx0ZmlsbDogYHVybCgjY29sb3IkeyBvcHRpb24uZGF0YUtleSB9KWAsXG5cdFx0XHRcdFx0XHRcdFx0c3Ryb2tlV2lkdGg6IDIsXG5cdFx0XHRcdFx0XHRcdFx0ZG90OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRhY3RpdmVEb3Q6IDxEYXRhRG90IHN0cm9rZT17IG9wdGlvbi5jb2xvciB9IC8+LFxuXHRcdFx0XHRcdFx0XHRcdGlzQW5pbWF0aW9uQWN0aXZlOiBhbmltYXRpb25BY3RpdmUsXG5cdFx0XHRcdFx0XHRcdFx0YW5pbWF0aW9uQmVnaW46IDAsXG5cdFx0XHRcdFx0XHRcdFx0YW5pbWF0aW9uRHVyYXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0Li4uYXJlYVByb3BzLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gY2hlY2tib3hTdGF0ZVsgb3B0aW9uLmRhdGFLZXkgXSA/IChcblx0XHRcdFx0XHRcdFx0XHQ8QXJlYSBrZXk9eyBvcHRpb24uZGF0YUtleSB9IHsgLi4uYXJlYUF0dHJpYnV0ZXMgfSAvPlxuXHRcdFx0XHRcdFx0XHQpIDogbnVsbDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpIH1cblx0XHRcdFx0PC9BcmVhQ2hhcnQ+XG5cdFx0XHQ8L1Jlc3BvbnNpdmVDb250YWluZXI+XG5cdFx0XHR7IGNoaWxkcmVuIH1cblx0XHQ8L2Rpdj5cblx0KTtcbn0gKTtcblxuR3Jhdml0eUFyZWFDaGFydC5wcm9wVHlwZXMgPSB7XG5cdGFuaW1hdGlvbkR1cmF0aW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuXHRhcmVhUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cdGNhcnRlc2lhbkdyaWRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblx0Y2hlY2tib3hQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblx0Y2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoIFtcblx0XHRQcm9wVHlwZXMuYXJyYXlPZiggUHJvcFR5cGVzLm5vZGUgKSxcblx0XHRQcm9wVHlwZXMubm9kZSxcblx0XSApLFxuXHRjdXJzb3JDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcblx0Y3VzdG9tQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcblx0Y3VzdG9tQ2xhc3NlczogUHJvcFR5cGVzLm9uZU9mVHlwZSggW1xuXHRcdFByb3BUeXBlcy5zdHJpbmcsXG5cdFx0UHJvcFR5cGVzLmFycmF5LFxuXHRcdFByb3BUeXBlcy5vYmplY3QsXG5cdF0gKSxcblx0ZGF0YTogUHJvcFR5cGVzLmFycmF5LFxuXHRncmlkQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG5cdGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZSggWyBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyIF0gKSxcblx0bGVnZW5kUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cdG9wdGlvbnM6IFByb3BUeXBlcy5hcnJheSxcblx0c2hvd0NoZWNrYm94ZXM6IFByb3BUeXBlcy5ib29sLFxuXHRzaG93TGVnZW5kOiBQcm9wVHlwZXMuYm9vbCxcblx0dG9vbHRpcFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXHR3aWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZSggWyBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyIF0gKSxcblx0eEF4aXNQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblx0eUF4aXNQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbkdyYXZpdHlBcmVhQ2hhcnQuZGlzcGxheU5hbWUgPSAnQXJlYUNoYXJ0JztcblxuZXhwb3J0IGRlZmF1bHQgR3Jhdml0eUFyZWFDaGFydDtcbiJdLCJuYW1lcyI6WyJSZWFjdCIsIkRhdGFEb3QiLCJfcmVmIiwiY3giLCJjeSIsInN0cm9rZSIsImNyZWF0ZUVsZW1lbnQiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Iiwidmlld0JveCIsImZpbGwiLCJ4bWxucyIsInIiLCJzdHJva2VXaWR0aCIsInRvb2x0aXBTdHlsZXMiLCJjb250YWluZXIiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsInBhZGRpbmciLCJib3JkZXJSYWRpdXMiLCJwb3NpdGlvbiI