UNPKG

kepler.gl

Version:

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

235 lines (224 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"] = PlotContainerFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _reactMapGl = require("react-map-gl"); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/reducers/src"); var _mapContainer = _interopRequireDefault(require("./map-container")); var _mapsLayout = _interopRequireDefault(require("./maps-layout")); var _mapViewStateContext = require("./map-view-state-context"); var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // libraries 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 CLASS_FILTER = ['maplibregl-control-container', 'mapboxgl-control-container', 'attrition-link', 'attrition-logo', 'map-control__panel-split-viewport-tools']; var DOM_FILTER_FUNC = function DOM_FILTER_FUNC(node) { return !CLASS_FILTER.includes(node.className); }; var OUT_OF_SCREEN_POSITION = -9999; PlotContainerFactory.deps = [_mapContainer["default"], _mapsLayout["default"]]; // Remove mapbox logo in exported map, because it contains non-ascii characters // Remove split viewport UI controls from exported images when the legend is shown var StyledPlotContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .maplibregl-ctrl-bottom-left,\n .maplibregl-ctrl-bottom-right,\n .maplibre-attribution-container,\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapbox-attribution-container,\n .map-control__panel-split-viewport-tools {\n display: none;\n }\n\n position: absolute;\n top: ", "px;\n left: ", "px;\n"])), OUT_OF_SCREEN_POSITION, OUT_OF_SCREEN_POSITION); var StyledMapContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n display: flex;\n"])), function (props) { return props.width; }, function (props) { return props.height; }); function PlotContainerFactory(MapContainer, MapsLayout) { function PlotContainer(_ref) { var ratio = _ref.ratio, resolution = _ref.resolution, _ref$legend = _ref.legend, legend = _ref$legend === void 0 ? false : _ref$legend, center = _ref.center, imageSize = _ref.imageSize, escapeXhtmlForWebpack = _ref.escapeXhtmlForWebpack, mapFields = _ref.mapFields, _ref$splitMaps = _ref.splitMaps, splitMaps = _ref$splitMaps === void 0 ? [] : _ref$splitMaps, setExportImageSetting = _ref.setExportImageSetting, setExportImageDataUri = _ref.setExportImageDataUri, setExportImageError = _ref.setExportImageError, addNotification = _ref.addNotification, enableErrorNotification = _ref.enableErrorNotification; var plottingAreaRef = (0, _react.useRef)(null); var _useState = (0, _react.useState)(function () { return mapFields.visState.effects.map(function (effect) { return effect.clone(); }); }), _useState2 = (0, _slicedToArray2["default"])(_useState, 1), plotEffects = _useState2[0]; var mapState = mapFields.mapState; // Memoize the scale calculation var scale = (0, _react.useMemo)(function () { if (imageSize.scale) { return imageSize.scale; } var calculatedScale = (0, _src.getScaleFromImageSize)(imageSize.imageW, imageSize.imageH, mapState.width * (mapState.isSplit ? 2 : 1), mapState.height); return calculatedScale > 0 ? calculatedScale : 1; }, [imageSize.scale, imageSize.imageW, imageSize.imageH, mapState.width, mapState.height, mapState.isSplit]); // Memoize the map style var scaledMapStyle = (0, _react.useMemo)(function () { var mapStyle = mapFields.mapStyle; return _objectSpread(_objectSpread({}, mapStyle), {}, { bottomMapStyle: (0, _src.scaleMapStyleByResolution)(mapStyle.bottomMapStyle, scale), topMapStyle: (0, _src.scaleMapStyleByResolution)(mapStyle.topMapStyle, scale) }); }, [mapFields.mapStyle, scale]); // Memoize the retrieveNewScreenshot callback var debouncedScreenshot = (0, _react.useMemo)(function () { return (0, _debounce["default"])(function () { if (plottingAreaRef.current) { (0, _src.convertToPng)(plottingAreaRef.current, { filter: DOM_FILTER_FUNC, width: imageSize.imageW, height: imageSize.imageH, escapeXhtmlForWebpack: escapeXhtmlForWebpack }).then(setExportImageDataUri)["catch"](function (err) { setExportImageError(err); if (enableErrorNotification) { addNotification((0, _src.exportImageError)({ err: err })); } }); } }, 500); }, [imageSize.imageW, imageSize.imageH, escapeXhtmlForWebpack, setExportImageDataUri, setExportImageError, enableErrorNotification, addNotification]); var retrieveNewScreenshot = (0, _react.useCallback)(debouncedScreenshot, [debouncedScreenshot]); // Memoize the onMapRender callback var debouncedMapRender = (0, _react.useMemo)(function () { return (0, _debounce["default"])(function (map) { if (map.isStyleLoaded()) { retrieveNewScreenshot(); } }, 500); }, [retrieveNewScreenshot]); var onMapRender = (0, _react.useCallback)(debouncedMapRender, [debouncedMapRender]); // Initial setup effect (0, _react.useEffect)(function () { setExportImageSetting({ processing: true }); }, [setExportImageSetting]); // Screenshot update effect (0, _react.useEffect)(function () { if (ratio !== undefined || resolution !== undefined || legend !== undefined) { setExportImageSetting({ processing: true }); retrieveNewScreenshot(); } }, [ratio, resolution, legend, setExportImageSetting, retrieveNewScreenshot]); // Memoize size calculations var _useMemo = (0, _react.useMemo)(function () { var size = { width: imageSize.imageW || 1, height: imageSize.imageH || 1 }; var isSplit = splitMaps.length > 1; return { size: size, width: size.width / (isSplit ? 2 : 1), height: size.height }; }, [imageSize.imageW, imageSize.imageH, splitMaps.length]), size = _useMemo.size, width = _useMemo.width, height = _useMemo.height; // Memoize map state var newMapState = (0, _react.useMemo)(function () { var baseMapState = _objectSpread(_objectSpread({}, mapState), {}, { width: width, height: height, zoom: mapState.zoom + (Math.log2(scale) || 0) }); if (center) { var renderedLayers = mapFields.visState.layers.filter(function (layer, idx) { return layer.id !== _src3.GEOCODER_LAYER_ID && layer.shouldRenderLayer(mapFields.visState.layerData[idx]); }); var bounds = (0, _src2.findMapBounds)(renderedLayers); var centerAndZoom = (0, _src.getCenterAndZoomFromBounds)(bounds, { width: width, height: height }); if (centerAndZoom) { var zoom = Number.isFinite(centerAndZoom.zoom) ? centerAndZoom.zoom : mapState.zoom; return _objectSpread(_objectSpread({}, baseMapState), {}, { longitude: centerAndZoom.center[0], latitude: centerAndZoom.center[1], zoom: zoom + Number(Math.log2(scale) || 0) }); } } return baseMapState; }, [mapState, width, height, scale, center, mapFields.visState]); // Memoize map props var mapProps = (0, _react.useMemo)(function () { return _objectSpread(_objectSpread({}, mapFields), {}, { mapStyle: scaledMapStyle, mapState: newMapState, mapControls: { mapLegend: { show: Boolean(legend), active: true } }, MapComponent: _reactMapGl.Map, onMapRender: onMapRender, isExport: true, deckGlProps: _objectSpread(_objectSpread({}, mapFields.deckGlProps), {}, { glOptions: { preserveDrawingBuffer: true, useDevicePixels: false } }), visState: _objectSpread(_objectSpread({}, mapFields.visState), {}, { effects: plotEffects }) }); }, [mapFields, scaledMapStyle, newMapState, legend, onMapRender, plotEffects]); var isSplit = splitMaps.length > 1; var mapContainers = !isSplit ? /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({ index: 0, primary: true }, mapProps)) : /*#__PURE__*/_react["default"].createElement(MapsLayout, { className: "plot-container-maps", mapState: newMapState }, splitMaps.map(function (settings, index) { return /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({ key: index, index: index, primary: index === 1 }, mapProps)); })); return /*#__PURE__*/_react["default"].createElement(StyledPlotContainer, { className: "export-map-instance" }, /*#__PURE__*/_react["default"].createElement(StyledMapContainer, { ref: plottingAreaRef, width: size.width, height: size.height }, /*#__PURE__*/_react["default"].createElement(_mapViewStateContext.MapViewStateContextProvider, { mapState: newMapState }, mapContainers))); } return _react["default"].memo(PlotContainer); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RNYXBHbCIsIl9kZWJvdW5jZSIsIl9zcmMiLCJfc3JjMiIsIl9tYXBDb250YWluZXIiLCJfbWFwc0xheW91dCIsIl9tYXBWaWV3U3RhdGVDb250ZXh0IiwiX3NyYzMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiQ0xBU1NfRklMVEVSIiwiRE9NX0ZJTFRFUl9GVU5DIiwibm9kZSIsImluY2x1ZGVzIiwiY2xhc3NOYW1lIiwiT1VUX09GX1NDUkVFTl9QT1NJVElPTiIsIlBsb3RDb250YWluZXJGYWN0b3J5IiwiZGVwcyIsIk1hcENvbnRhaW5lckZhY3RvcnkiLCJNYXBzTGF5b3V0RmFjdG9yeSIsIlN0eWxlZFBsb3RDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlN0eWxlZE1hcENvbnRhaW5lciIsInByb3BzIiwid2lkdGgiLCJoZWlnaHQiLCJNYXBDb250YWluZXIiLCJNYXBzTGF5b3V0IiwiUGxvdENvbnRhaW5lciIsIl9yZWYiLCJyYXRpbyIsInJlc29sdXRpb24iLCJfcmVmJGxlZ2VuZCIsImxlZ2VuZCIsImNlbnRlciIsImltYWdlU2l6ZSIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsIm1hcEZpZWxkcyIsIl9yZWYkc3BsaXRNYXBzIiwic3BsaXRNYXBzIiwic2V0RXhwb3J0SW1hZ2VTZXR0aW5nIiwic2V0RXhwb3J0SW1hZ2VEYXRhVXJpIiwic2V0RXhwb3J0SW1hZ2VFcnJvciIsImFkZE5vdGlmaWNhdGlvbiIsImVuYWJsZUVycm9yTm90aWZpY2F0aW9uIiwicGxvdHRpbmdBcmVhUmVmIiwidXNlUmVmIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJ2aXNTdGF0ZSIsImVmZmVjdHMiLCJtYXAiLCJlZmZlY3QiLCJjbG9uZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJwbG90RWZmZWN0cyIsIm1hcFN0YXRlIiwic2NhbGUiLCJ1c2VNZW1vIiwiY2FsY3VsYXRlZFNjYWxlIiwiZ2V0U2NhbGVGcm9tSW1hZ2VTaXplIiwiaW1hZ2VXIiwiaW1hZ2VIIiwiaXNTcGxpdCIsInNjYWxlZE1hcFN0eWxlIiwibWFwU3R5bGUiLCJib3R0b21NYXBTdHlsZSIsInNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24iLCJ0b3BNYXBTdHlsZSIsImRlYm91bmNlZFNjcmVlbnNob3QiLCJkZWJvdW5jZSIsImN1cnJlbnQiLCJjb252ZXJ0VG9QbmciLCJ0aGVuIiwiZXJyIiwiZXhwb3J0SW1hZ2VFcnJvciIsInJldHJpZXZlTmV3U2NyZWVuc2hvdCIsInVzZUNhbGxiYWNrIiwiZGVib3VuY2VkTWFwUmVuZGVyIiwiaXNTdHlsZUxvYWRlZCIsIm9uTWFwUmVuZGVyIiwidXNlRWZmZWN0IiwicHJvY2Vzc2luZyIsInVuZGVmaW5lZCIsIl91c2VNZW1vIiwic2l6ZSIsIm5ld01hcFN0YXRlIiwiYmFzZU1hcFN0YXRlIiwiem9vbSIsIk1hdGgiLCJsb2cyIiwicmVuZGVyZWRMYXllcnMiLCJsYXllcnMiLCJsYXllciIsImlkeCIsImlkIiwiR0VPQ09ERVJfTEFZRVJfSUQiLCJzaG91bGRSZW5kZXJMYXllciIsImxheWVyRGF0YSIsImJvdW5kcyIsImZpbmRNYXBCb3VuZHMiLCJjZW50ZXJBbmRab29tIiwiZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwibWFwUHJvcHMiLCJtYXBDb250cm9scyIsIm1hcExlZ2VuZCIsInNob3ciLCJCb29sZWFuIiwiYWN0aXZlIiwiTWFwQ29tcG9uZW50IiwiTWFwIiwiaXNFeHBvcnQiLCJkZWNrR2xQcm9wcyIsImdsT3B0aW9ucyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInVzZURldmljZVBpeGVscyIsIm1hcENvbnRhaW5lcnMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiaW5kZXgiLCJwcmltYXJ5Iiwic2V0dGluZ3MiLCJrZXkiLCJyZWYiLCJNYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXIiLCJSZWFjdCIsIm1lbW8iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvcGxvdC1jb250YWluZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGxpYnJhcmllc1xuaW1wb3J0IFJlYWN0LCB7dXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge01hcH0gZnJvbSAncmVhY3QtbWFwLWdsJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IHtcbiAgZXhwb3J0SW1hZ2VFcnJvcixcbiAgc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbixcbiAgZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMsXG4gIGNvbnZlcnRUb1BuZyxcbiAgZ2V0U2NhbGVGcm9tSW1hZ2VTaXplXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtmaW5kTWFwQm91bmRzfSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcbmltcG9ydCBNYXBDb250YWluZXJGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRhaW5lcic7XG5pbXBvcnQgTWFwc0xheW91dEZhY3RvcnkgZnJvbSAnLi9tYXBzLWxheW91dCc7XG5pbXBvcnQge01hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlcn0gZnJvbSAnLi9tYXAtdmlldy1zdGF0ZS1jb250ZXh0JztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtFZmZlY3QsIFNwbGl0TWFwLCBFeHBvcnRJbWFnZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBBY3Rpb25IYW5kbGVyLFxuICBhZGROb3RpZmljYXRpb24sXG4gIHNldEV4cG9ydEltYWdlRGF0YVVyaSxcbiAgc2V0RXhwb3J0SW1hZ2VFcnJvcixcbiAgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge21hcEZpZWxkc1NlbGVjdG9yfSBmcm9tICcuL2tlcGxlci1nbCc7XG5cbmNvbnN0IENMQVNTX0ZJTFRFUiA9IFtcbiAgJ21hcGxpYnJlZ2wtY29udHJvbC1jb250YWluZXInLFxuICAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLFxuICAnYXR0cml0aW9uLWxpbmsnLFxuICAnYXR0cml0aW9uLWxvZ28nLFxuICAnbWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzJ1xuXTtcbmNvbnN0IERPTV9GSUxURVJfRlVOQyA9IG5vZGUgPT4gIUNMQVNTX0ZJTFRFUi5pbmNsdWRlcyhub2RlLmNsYXNzTmFtZSk7XG5jb25zdCBPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OID0gLTk5OTk7XG5cblBsb3RDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbTWFwQ29udGFpbmVyRmFjdG9yeSwgTWFwc0xheW91dEZhY3RvcnldO1xuXG4vLyBSZW1vdmUgbWFwYm94IGxvZ28gaW4gZXhwb3J0ZWQgbWFwLCBiZWNhdXNlIGl0IGNvbnRhaW5zIG5vbi1hc2NpaSBjaGFyYWN0ZXJzXG4vLyBSZW1vdmUgc3BsaXQgdmlld3BvcnQgVUkgY29udHJvbHMgZnJvbSBleHBvcnRlZCBpbWFnZXMgd2hlbiB0aGUgbGVnZW5kIGlzIHNob3duXG5jb25zdCBTdHlsZWRQbG90Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tbGVmdCxcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBsaWJyZS1hdHRyaWJ1dGlvbi1jb250YWluZXIsXG4gIC5tYXBib3hnbC1jdHJsLWJvdHRvbS1sZWZ0LFxuICAubWFwYm94Z2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBib3gtYXR0cmlidXRpb24tY29udGFpbmVyLFxuICAubWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6ICR7T1VUX09GX1NDUkVFTl9QT1NJVElPTn1weDtcbiAgbGVmdDogJHtPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OfXB4O1xuYDtcblxuaW50ZXJmYWNlIFN0eWxlZE1hcENvbnRhaW5lclByb3BzIHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbn1cblxuY29uc3QgU3R5bGVkTWFwQ29udGFpbmVyID0gc3R5bGVkLmRpdjxTdHlsZWRNYXBDb250YWluZXJQcm9wcz5gXG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLndpZHRofXB4O1xuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMuaGVpZ2h0fXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuaW50ZXJmYWNlIFBsb3RDb250YWluZXJQcm9wcyB7XG4gIC8vIEltYWdlIGV4cG9ydCBzZXR0aW5nc1xuICByYXRpbz86IHN0cmluZztcbiAgcmVzb2x1dGlvbj86IHN0cmluZztcbiAgbGVnZW5kPzogYm9vbGVhbjtcbiAgY2VudGVyPzogYm9vbGVhbjtcbiAgaW1hZ2VTaXplOiBFeHBvcnRJbWFnZVsnaW1hZ2VTaXplJ107XG4gIGVzY2FwZVhodG1sRm9yV2VicGFjaz86IGJvb2xlYW47XG5cbiAgLy8gTWFwIHNldHRpbmdzXG4gIG1hcEZpZWxkczogUmV0dXJuVHlwZTx0eXBlb2YgbWFwRmllbGRzU2VsZWN0b3I+O1xuICBzcGxpdE1hcHM/OiBTcGxpdE1hcFtdO1xuXG4gIC8vIENhbGxiYWNrc1xuICBzZXRFeHBvcnRJbWFnZVNldHRpbmc6IHR5cGVvZiBzZXRFeHBvcnRJbWFnZVNldHRpbmc7XG4gIHNldEV4cG9ydEltYWdlRGF0YVVyaTogdHlwZW9mIHNldEV4cG9ydEltYWdlRGF0YVVyaTtcbiAgc2V0RXhwb3J0SW1hZ2VFcnJvcjogdHlwZW9mIHNldEV4cG9ydEltYWdlRXJyb3I7XG4gIGFkZE5vdGlmaWNhdGlvbjogQWN0aW9uSGFuZGxlcjx0eXBlb2YgYWRkTm90aWZpY2F0aW9uPjtcblxuICAvLyBGbGFnc1xuICBlbmFibGVFcnJvck5vdGlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBsb3RDb250YWluZXJGYWN0b3J5KFxuICBNYXBDb250YWluZXI6IFJldHVyblR5cGU8dHlwZW9mIE1hcENvbnRhaW5lckZhY3Rvcnk+LFxuICBNYXBzTGF5b3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBzTGF5b3V0RmFjdG9yeT5cbik6IFJlYWN0LkNvbXBvbmVudFR5cGU8UGxvdENvbnRhaW5lclByb3BzPiB7XG4gIGZ1bmN0aW9uIFBsb3RDb250YWluZXIoe1xuICAgIC8vIEltYWdlIGV4cG9ydCBzZXR0aW5nc1xuICAgIHJhdGlvLFxuICAgIHJlc29sdXRpb24sXG4gICAgbGVnZW5kID0gZmFsc2UsXG4gICAgY2VudGVyLFxuICAgIGltYWdlU2l6ZSxcbiAgICBlc2NhcGVYaHRtbEZvcldlYnBhY2ssXG5cbiAgICAvLyBNYXAgc2V0dGluZ3NcbiAgICBtYXBGaWVsZHMsXG4gICAgc3BsaXRNYXBzID0gW10sXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBzZXRFeHBvcnRJbWFnZVNldHRpbmcsXG4gICAgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpLFxuICAgIHNldEV4cG9ydEltYWdlRXJyb3IsXG4gICAgYWRkTm90aWZpY2F0aW9uLFxuXG4gICAgLy8gRmxhZ3NcbiAgICBlbmFibGVFcnJvck5vdGlmaWNhdGlvblxuICB9OiBQbG90Q29udGFpbmVyUHJvcHMpIHtcbiAgICBjb25zdCBwbG90dGluZ0FyZWFSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICAgIGNvbnN0IFtwbG90RWZmZWN0c10gPSB1c2VTdGF0ZTxFZmZlY3RbXT4oKCkgPT5cbiAgICAgIG1hcEZpZWxkcy52aXNTdGF0ZS5lZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmNsb25lKCkpXG4gICAgKTtcblxuICAgIGNvbnN0IHttYXBTdGF0ZX0gPSBtYXBGaWVsZHM7XG5cbiAgICAvLyBNZW1vaXplIHRoZSBzY2FsZSBjYWxjdWxhdGlvblxuICAgIGNvbnN0IHNjYWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAoaW1hZ2VTaXplLnNjYWxlKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVNpemUuc2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRTY2FsZSA9IGdldFNjYWxlRnJvbUltYWdlU2l6ZShcbiAgICAgICAgaW1hZ2VTaXplLmltYWdlVyxcbiAgICAgICAgaW1hZ2VTaXplLmltYWdlSCxcbiAgICAgICAgbWFwU3RhdGUud2lkdGggKiAobWFwU3RhdGUuaXNTcGxpdCA/IDIgOiAxKSxcbiAgICAgICAgbWFwU3RhdGUuaGVpZ2h0XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY2FsY3VsYXRlZFNjYWxlID4gMCA/IGNhbGN1bGF0ZWRTY2FsZSA6IDE7XG4gICAgfSwgW1xuICAgICAgaW1hZ2VTaXplLnNjYWxlLFxuICAgICAgaW1hZ2VTaXplLmltYWdlVyxcbiAgICAgIGltYWdlU2l6ZS5pbWFnZUgsXG4gICAgICBtYXBTdGF0ZS53aWR0aCxcbiAgICAgIG1hcFN0YXRlLmhlaWdodCxcbiAgICAgIG1hcFN0YXRlLmlzU3BsaXRcbiAgICBdKTtcblxuICAgIC8vIE1lbW9pemUgdGhlIG1hcCBzdHlsZVxuICAgIGNvbnN0IHNjYWxlZE1hcFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBjb25zdCBtYXBTdHlsZSA9IG1hcEZpZWxkcy5tYXBTdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1hcFN0eWxlLFxuICAgICAgICBib3R0b21NYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS5ib3R0b21NYXBTdHlsZSwgc2NhbGUpLFxuICAgICAgICB0b3BNYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS50b3BNYXBTdHlsZSwgc2NhbGUpXG4gICAgICB9O1xuICAgIH0sIFttYXBGaWVsZHMubWFwU3R5bGUsIHNjYWxlXSk7XG5cbiAgICAvLyBNZW1vaXplIHRoZSByZXRyaWV2ZU5ld1NjcmVlbnNob3QgY2FsbGJhY2tcbiAgICBjb25zdCBkZWJvdW5jZWRTY3JlZW5zaG90ID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICBpZiAocGxvdHRpbmdBcmVhUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnZlcnRUb1BuZyhwbG90dGluZ0FyZWFSZWYuY3VycmVudCwge1xuICAgICAgICAgICAgICBmaWx0ZXI6IERPTV9GSUxURVJfRlVOQyxcbiAgICAgICAgICAgICAgd2lkdGg6IGltYWdlU2l6ZS5pbWFnZVcsXG4gICAgICAgICAgICAgIGhlaWdodDogaW1hZ2VTaXplLmltYWdlSCxcbiAgICAgICAgICAgICAgZXNjYXBlWGh0bWxGb3JXZWJwYWNrXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAudGhlbihzZXRFeHBvcnRJbWFnZURhdGFVcmkpXG4gICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHNldEV4cG9ydEltYWdlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW5hYmxlRXJyb3JOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvbihleHBvcnRJbWFnZUVycm9yKHtlcnJ9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCksXG4gICAgICBbXG4gICAgICAgIGltYWdlU2l6ZS5pbWFnZVcsXG4gICAgICAgIGltYWdlU2l6ZS5pbWFnZUgsXG4gICAgICAgIGVzY2FwZVhodG1sRm9yV2VicGFjayxcbiAgICAgICAgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpLFxuICAgICAgICBzZXRFeHBvcnRJbWFnZUVycm9yLFxuICAgICAgICBlbmFibGVFcnJvck5vdGlmaWNhdGlvbixcbiAgICAgICAgYWRkTm90aWZpY2F0aW9uXG4gICAgICBdXG4gICAgKTtcblxuICAgIGNvbnN0IHJldHJpZXZlTmV3U2NyZWVuc2hvdCA9IHVzZUNhbGxiYWNrKGRlYm91bmNlZFNjcmVlbnNob3QsIFtkZWJvdW5jZWRTY3JlZW5zaG90XSk7XG5cbiAgICAvLyBNZW1vaXplIHRoZSBvbk1hcFJlbmRlciBjYWxsYmFja1xuICAgIGNvbnN0IGRlYm91bmNlZE1hcFJlbmRlciA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBkZWJvdW5jZShtYXAgPT4ge1xuICAgICAgICAgIGlmIChtYXAuaXNTdHlsZUxvYWRlZCgpKSB7XG4gICAgICAgICAgICByZXRyaWV2ZU5ld1NjcmVlbnNob3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCksXG4gICAgICBbcmV0cmlldmVOZXdTY3JlZW5zaG90XVxuICAgICk7XG5cbiAgICBjb25zdCBvbk1hcFJlbmRlciA9IHVzZUNhbGxiYWNrKGRlYm91bmNlZE1hcFJlbmRlciwgW2RlYm91bmNlZE1hcFJlbmRlcl0pO1xuXG4gICAgLy8gSW5pdGlhbCBzZXR1cCBlZmZlY3RcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nKHtwcm9jZXNzaW5nOiB0cnVlfSk7XG4gICAgfSwgW3NldEV4cG9ydEltYWdlU2V0dGluZ10pO1xuXG4gICAgLy8gU2NyZWVuc2hvdCB1cGRhdGUgZWZmZWN0XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChyYXRpbyAhPT0gdW5kZWZpbmVkIHx8IHJlc29sdXRpb24gIT09IHVuZGVmaW5lZCB8fCBsZWdlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRFeHBvcnRJbWFnZVNldHRpbmcoe3Byb2Nlc3Npbmc6IHRydWV9KTtcbiAgICAgICAgcmV0cmlldmVOZXdTY3JlZW5zaG90KCk7XG4gICAgICB9XG4gICAgfSwgW3JhdGlvLCByZXNvbHV0aW9uLCBsZWdlbmQsIHNldEV4cG9ydEltYWdlU2V0dGluZywgcmV0cmlldmVOZXdTY3JlZW5zaG90XSk7XG5cbiAgICAvLyBNZW1vaXplIHNpemUgY2FsY3VsYXRpb25zXG4gICAgY29uc3Qge3NpemUsIHdpZHRoLCBoZWlnaHR9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBjb25zdCBzaXplID0ge1xuICAgICAgICB3aWR0aDogaW1hZ2VTaXplLmltYWdlVyB8fCAxLFxuICAgICAgICBoZWlnaHQ6IGltYWdlU2l6ZS5pbWFnZUggfHwgMVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGlzU3BsaXQgPSBzcGxpdE1hcHMubGVuZ3RoID4gMTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNpemUsXG4gICAgICAgIHdpZHRoOiBzaXplLndpZHRoIC8gKGlzU3BsaXQgPyAyIDogMSksXG4gICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHRcbiAgICAgIH07XG4gICAgfSwgW2ltYWdlU2l6ZS5pbWFnZVcsIGltYWdlU2l6ZS5pbWFnZUgsIHNwbGl0TWFwcy5sZW5ndGhdKTtcblxuICAgIC8vIE1lbW9pemUgbWFwIHN0YXRlXG4gICAgY29uc3QgbmV3TWFwU3RhdGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VNYXBTdGF0ZSA9IHtcbiAgICAgICAgLi4ubWFwU3RhdGUsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHpvb206IG1hcFN0YXRlLnpvb20gKyAoTWF0aC5sb2cyKHNjYWxlKSB8fCAwKVxuICAgICAgfTtcblxuICAgICAgaWYgKGNlbnRlcikge1xuICAgICAgICBjb25zdCByZW5kZXJlZExheWVycyA9IG1hcEZpZWxkcy52aXNTdGF0ZS5sYXllcnMuZmlsdGVyKFxuICAgICAgICAgIChsYXllciwgaWR4KSA9PlxuICAgICAgICAgICAgbGF5ZXIuaWQgIT09IEdFT0NPREVSX0xBWUVSX0lEICYmXG4gICAgICAgICAgICBsYXllci5zaG91bGRSZW5kZXJMYXllcihtYXBGaWVsZHMudmlzU3RhdGUubGF5ZXJEYXRhW2lkeF0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IGZpbmRNYXBCb3VuZHMocmVuZGVyZWRMYXllcnMpO1xuICAgICAgICBjb25zdCBjZW50ZXJBbmRab29tID0gZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMoYm91bmRzLCB7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICBpZiAoY2VudGVyQW5kWm9vbSkge1xuICAgICAgICAgIGNvbnN0IHpvb20gPSBOdW1iZXIuaXNGaW5pdGUoY2VudGVyQW5kWm9vbS56b29tKSA/IGNlbnRlckFuZFpvb20uem9vbSA6IG1hcFN0YXRlLnpvb207XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2VNYXBTdGF0ZSxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMF0sXG4gICAgICAgICAgICBsYXRpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMV0sXG4gICAgICAgICAgICB6b29tOiB6b29tICsgTnVtYmVyKE1hdGgubG9nMihzY2FsZSkgfHwgMClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXNlTWFwU3RhdGU7XG4gICAgfSwgW21hcFN0YXRlLCB3aWR0aCwgaGVpZ2h0LCBzY2FsZSwgY2VudGVyLCBtYXBGaWVsZHMudmlzU3RhdGVdKTtcblxuICAgIC8vIE1lbW9pemUgbWFwIHByb3BzXG4gICAgY29uc3QgbWFwUHJvcHMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgLi4ubWFwRmllbGRzLFxuICAgICAgICBtYXBTdHlsZTogc2NhbGVkTWFwU3R5bGUsXG4gICAgICAgIG1hcFN0YXRlOiBuZXdNYXBTdGF0ZSxcbiAgICAgICAgbWFwQ29udHJvbHM6IHtcbiAgICAgICAgICBtYXBMZWdlbmQ6IHtcbiAgICAgICAgICAgIHNob3c6IEJvb2xlYW4obGVnZW5kKSxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgTWFwQ29tcG9uZW50OiBNYXAsXG4gICAgICAgIG9uTWFwUmVuZGVyLFxuICAgICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICAgICAgZGVja0dsUHJvcHM6IHtcbiAgICAgICAgICAuLi5tYXBGaWVsZHMuZGVja0dsUHJvcHMsXG4gICAgICAgICAgZ2xPcHRpb25zOiB7XG4gICAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXG4gICAgICAgICAgICB1c2VEZXZpY2VQaXhlbHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNTdGF0ZToge1xuICAgICAgICAgIC4uLm1hcEZpZWxkcy52aXNTdGF0ZSxcbiAgICAgICAgICBlZmZlY3RzOiBwbG90RWZmZWN0c1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFttYXBGaWVsZHMsIHNjYWxlZE1hcFN0eWxlLCBuZXdNYXBTdGF0ZSwgbGVnZW5kLCBvbk1hcFJlbmRlciwgcGxvdEVmZmVjdHNdXG4gICAgKTtcblxuICAgIGNvbnN0IGlzU3BsaXQgPSBzcGxpdE1hcHMubGVuZ3RoID4gMTtcbiAgICBjb25zdCBtYXBDb250YWluZXJzID0gIWlzU3BsaXQgPyAoXG4gICAgICA8TWFwQ29udGFpbmVyIGluZGV4PXswfSBwcmltYXJ5PXt0cnVlfSB7Li4ubWFwUHJvcHN9IC8+XG4gICAgKSA6IChcbiAgICAgIDxNYXBzTGF5b3V0IGNsYXNzTmFtZT1cInBsb3QtY29udGFpbmVyLW1hcHNcIiBtYXBTdGF0ZT17bmV3TWFwU3RhdGV9PlxuICAgICAgICB7c3BsaXRNYXBzLm1hcCgoc2V0dGluZ3MsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPE1hcENvbnRhaW5lciBrZXk9e2luZGV4fSBpbmRleD17aW5kZXh9IHByaW1hcnk9e2luZGV4ID09PSAxfSB7Li4ubWFwUHJvcHN9IC8+XG4gICAgICAgICkpfVxuICAgICAgPC9NYXBzTGF5b3V0PlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFBsb3RDb250YWluZXIgY2xhc3NOYW1lPVwiZXhwb3J0LW1hcC1pbnN0YW5jZVwiPlxuICAgICAgICA8U3R5bGVkTWFwQ29udGFpbmVyIHJlZj17cGxvdHRpbmdBcmVhUmVmfSB3aWR0aD17c2l6ZS53aWR0aH0gaGVpZ2h0PXtzaXplLmhlaWdodH0+XG4gICAgICAgICAgPE1hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlciBtYXBTdGF0ZT17bmV3TWFwU3RhdGV9PlxuICAgICAgICAgICAge21hcENvbnRhaW5lcnN9XG4gICAgICAgICAgPC9NYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXI+XG4gICAgICAgIDwvU3R5bGVkTWFwQ29udGFpbmVyPlxuICAgICAgPC9TdHlsZWRQbG90Q29udGFpbmVyPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gUmVhY3QubWVtbyhQbG90Q29udGFpbmVyKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQUwsT0FBQTtBQU9BLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGFBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLG9CQUFBLEdBQUFULE9BQUE7QUFFQSxJQUFBVSxLQUFBLEdBQUFWLE9BQUE7QUFBdUQsSUFBQVcsZUFBQSxFQUFBQyxnQkFBQSxFQXBCdkQ7QUFDQTtBQUVBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFmLHdCQUFBZSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JB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