kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
349 lines (345 loc) • 43.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.asArray = asArray;
exports.canvasToBlob = canvasToBlob;
exports.concatAndResolveUrl = concatAndResolveUrl;
exports.dataAsUrl = dataAsUrl;
exports.delay = delay;
exports.escape = escape;
exports.escapeXhtml = escapeXhtml;
exports.fourRandomChars = fourRandomChars;
exports.getAndEncode = getAndEncode;
exports.getHeight = getHeight;
exports.getWidth = getWidth;
exports.isDataUrl = isDataUrl;
exports.isSrcAsDataUrl = isSrcAsDataUrl;
exports.makeImage = makeImage;
exports.mimeType = mimeType;
exports.processClone = processClone;
exports.resolveUrl = resolveUrl;
exports.setStyleSheetBaseHref = setStyleSheetBaseHref;
exports.toStyleSheet = toStyleSheet;
exports.uid = uid;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _console = _interopRequireDefault(require("global/console"));
var _window = _interopRequireDefault(require("global/window"));
var _document = _interopRequireDefault(require("global/document"));
var _constants = require("@kepler.gl/constants");
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function processClone(original, clone) {
if (!(clone instanceof _window["default"].Element)) {
return clone;
}
function copyProperties(sourceStyle, targetStyle) {
var propertyKeys = asArray(sourceStyle);
propertyKeys.forEach(function (name) {
targetStyle.setProperty(name, sourceStyle.getPropertyValue(name), sourceStyle.getPropertyPriority(name));
});
}
function copyStyle(source, target) {
if (source.cssText) {
target.cssText = source.cssText;
// add additional copy of composite styles
if (source.font) {
target.font = source.font;
}
} else {
copyProperties(source, target);
}
}
function cloneStyle(og, cln) {
var originalStyle = _window["default"].getComputedStyle(og);
copyStyle(originalStyle, cln.style);
}
function formatPseudoElementStyle(cln, elm, stl) {
var formatCssText = function formatCssText(stl1) {
var cnt = stl1.getPropertyValue('content');
return "".concat(stl.cssText, " content: ").concat(cnt, ";");
};
var formatProperty = function formatProperty(name) {
return "".concat(name, ":").concat(stl.getPropertyValue(name)).concat(stl.getPropertyPriority(name) ? ' !important' : '');
};
var formatCssProperties = function formatCssProperties(stl2) {
return "".concat(asArray(stl2).map(formatProperty).join('; '), ";");
};
var selector = ".".concat(cln, ":").concat(elm);
var cssText = stl.cssText ? formatCssText(stl) : formatCssProperties(stl);
return _document["default"].createTextNode("".concat(selector, "{").concat(cssText, "}"));
}
function clonePseudoElement(org, cln, element) {
var style = _window["default"].getComputedStyle(org, element);
var content = style.getPropertyValue('content');
if (content === '' || content === 'none') {
return;
}
var className = uid();
cln.className = "".concat(cln.className, " ").concat(className);
var styleElement = _document["default"].createElement('style');
styleElement.appendChild(formatPseudoElementStyle(className, element, style));
cln.appendChild(styleElement);
}
function clonePseudoElements(_ref) {
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
og = _ref2[0],
cln = _ref2[1];
[':before', ':after'].forEach(function (element) {
return clonePseudoElement(og, cln, element);
});
}
function copyUserInput(_ref3) {
var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
og = _ref4[0],
cln = _ref4[1];
if (og instanceof _window["default"].HTMLTextAreaElement) cln.innerHTML = og.value;
if (og instanceof _window["default"].HTMLInputElement) cln.setAttribute('value', og.value);
}
function fixSvg(cln) {
if (!(cln instanceof _window["default"].SVGElement)) return;
cln.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
if (!(cln instanceof _window["default"].SVGRectElement)) return;
['width', 'height'].forEach(function (attribute) {
var value = cln.getAttribute(attribute);
if (!value) return;
cln.style.setProperty(attribute, value);
});
}
return Promise.resolve([original, clone]).then(function (_ref5) {
var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2),
og = _ref6[0],
cln = _ref6[1];
cloneStyle(og, cln);
return [og, cln];
}).then(function (_ref7) {
var _ref8 = (0, _slicedToArray2["default"])(_ref7, 2),
og = _ref8[0],
cln = _ref8[1];
clonePseudoElements([og, cln]);
return [og, cln];
}).then(function (_ref9) {
var _ref10 = (0, _slicedToArray2["default"])(_ref9, 2),
og = _ref10[0],
cln = _ref10[1];
copyUserInput([og, cln]);
return [og, cln];
}).then(function (_ref11) {
var _ref12 = (0, _slicedToArray2["default"])(_ref11, 2),
og = _ref12[0],
cln = _ref12[1];
fixSvg(cln);
return [og, cln];
})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
.then(function (_ref13) {
var _ref14 = (0, _slicedToArray2["default"])(_ref13, 2),
og = _ref14[0],
cln = _ref14[1];
return cln;
});
}
/** **
* UTILS
****/
function asArray(arrayLike) {
var array = [];
var length = arrayLike.length;
for (var i = 0; i < length; i++) array.push(arrayLike[i]);
return array;
}
function fourRandomChars() {
return "0000".concat((Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4);
}
function uid() {
var index = 0;
return "u".concat(fourRandomChars()).concat(index++);
}
function makeImage(uri) {
return new Promise(function (resolve, reject) {
var image = new _window["default"].Image();
image.onload = function () {
resolve(image);
};
image.onerror = function (err) {
var message = _constants.IMAGE_EXPORT_ERRORS.dataUri;
_console["default"].log(uri);
// error is an Event Object
// https://www.w3schools.com/jsref/obj_event.asp
reject({
event: err,
message: message
});
};
image.src = uri;
});
}
function isDataUrl(url) {
return url.search(/^(data:)/) !== -1;
}
function parseExtension(url) {
var match = /\.([^./]*?)$/g.exec(url);
if (match) {
return match[1];
}
return '';
}
function mimes() {
/*
* Only WOFF and EOT mime types for fonts are 'real'
* see http://www.iana.org/assignments/media-types/media-types.xhtml
*/
var WOFF = 'application/font-woff';
var JPEG = 'image/jpeg';
return {
woff: WOFF,
woff2: WOFF,
ttf: 'application/font-truetype',
eot: 'application/vnd.ms-fontobject',
png: 'image/png',
jpg: JPEG,
jpeg: JPEG,
gif: 'image/gif',
tiff: 'image/tiff',
svg: 'image/svg+xml'
};
}
function mimeType(url) {
var extension = parseExtension(url).toLowerCase();
return mimes()[extension] || '';
}
function dataAsUrl(content, type) {
return "data:".concat(type, ";base64,").concat(content);
}
function escape(string) {
return string.replace(/([.*+?^${}()|[\]/\\])/g, '\\$1');
}
function delay(ms) {
return function (arg) {
return new Promise(function (resolve) {
_window["default"].setTimeout(function () {
resolve(arg);
}, ms);
});
};
}
function isSrcAsDataUrl(text) {
var DATA_URL_REGEX = /url\(['"]?(data:)([^'"]+?)['"]?\)/;
return text.search(DATA_URL_REGEX) !== -1;
}
function cvToBlob(canvas) {
return new Promise(function (resolve) {
var binaryString = _window["default"].atob(canvas.toDataURL().split(',')[1]);
var length = binaryString.length;
var binaryArray = new Uint8Array(length);
for (var i = 0; i < length; i++) binaryArray[i] = binaryString.charCodeAt(i);
resolve(new _window["default"].Blob([binaryArray], {
type: 'image/png'
}));
});
}
function canvasToBlob(canvas) {
if (canvas.toBlob) return new Promise(function (resolve) {
canvas.toBlob(resolve);
});
return cvToBlob(canvas);
}
function escapeXhtml(string) {
return string.replace(/#/g, '%23').replace(/\n/g, '%0A');
}
function getWidth(node) {
var leftBorder = px(node, 'border-left-width');
var rightBorder = px(node, 'border-right-width');
return node.scrollWidth + leftBorder + rightBorder;
}
function getHeight(node) {
var topBorder = px(node, 'border-top-width');
var bottomBorder = px(node, 'border-bottom-width');
return node.scrollHeight + topBorder + bottomBorder;
}
function px(node, styleProperty) {
var value = _window["default"].getComputedStyle(node).getPropertyValue(styleProperty);
return parseFloat(value.replace('px', ''));
}
function resolveUrl(url, baseUrl) {
var doc = _document["default"].implementation.createHTMLDocument();
var base = doc.createElement('base');
doc.head.appendChild(base);
var a = doc.createElement('a');
doc.body.appendChild(a);
base.href = baseUrl;
a.href = url;
return a.href;
}
function getAndEncode(url, options) {
var TIMEOUT = 30000;
if (options.cacheBust) {
// Cache bypass so we dont have CORS issues with cached images
// Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache
url += (/\?/.test(url) ? '&' : '?') + new Date().getTime();
}
return new Promise(function (resolve) {
var request = new _window["default"].XMLHttpRequest();
request.onreadystatechange = done;
request.ontimeout = timeout;
request.responseType = 'blob';
request.timeout = TIMEOUT;
request.open('GET', url, true);
request.send();
var placeholder;
if (options.imagePlaceholder) {
var split = options.imagePlaceholder.split(/,/);
if (split && split[1]) {
placeholder = split[1];
}
}
function done() {
if (request.readyState !== 4) return;
if (request.status !== 200) {
if (placeholder) {
resolve(placeholder);
} else {
fail("cannot fetch resource: ".concat(url, ", status: ").concat(request.status));
}
return;
}
var encoder = new _window["default"].FileReader();
encoder.onloadend = function () {
var content = encoder.result.split(/,/)[1];
resolve(content);
};
encoder.readAsDataURL(request.response);
}
function timeout() {
if (placeholder) {
resolve(placeholder);
} else {
fail("timeout of ".concat(TIMEOUT, "ms occurred while fetching resource: ").concat(url));
}
}
function fail(message) {
_console["default"].error(message);
resolve('');
}
});
}
function concatAndResolveUrl(base, url) {
return new URL(url, base).href;
}
// Set relative URL in stylesheet to absolute url
function setStyleSheetBaseHref(text, base) {
function addBaseHrefToUrl(match, p1) {
var url = /^http/i.test(p1) ? p1 : concatAndResolveUrl(base, p1);
return "url('".concat(url, "')");
}
return isSrcAsDataUrl(text) ? text : text.replace(/url\(['"]?([^'"]+?)['"]?\)/g, addBaseHrefToUrl);
}
function toStyleSheet(text) {
var doc = _document["default"].implementation.createHTMLDocument('');
var styleElement = _document["default"].createElement('style');
styleElement.textContent = text;
doc.body.appendChild(styleElement);
return styleElement.sheet;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9kb2N1bWVudCIsIl9jb25zdGFudHMiLCJwcm9jZXNzQ2xvbmUiLCJvcmlnaW5hbCIsImNsb25lIiwiV2luZG93IiwiRWxlbWVudCIsImNvcHlQcm9wZXJ0aWVzIiwic291cmNlU3R5bGUiLCJ0YXJnZXRTdHlsZSIsInByb3BlcnR5S2V5cyIsImFzQXJyYXkiLCJmb3JFYWNoIiwibmFtZSIsInNldFByb3BlcnR5IiwiZ2V0UHJvcGVydHlWYWx1ZSIsImdldFByb3BlcnR5UHJpb3JpdHkiLCJjb3B5U3R5bGUiLCJzb3VyY2UiLCJ0YXJnZXQiLCJjc3NUZXh0IiwiZm9udCIsImNsb25lU3R5bGUiLCJvZyIsImNsbiIsIm9yaWdpbmFsU3R5bGUiLCJnZXRDb21wdXRlZFN0eWxlIiwic3R5bGUiLCJmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUiLCJlbG0iLCJzdGwiLCJmb3JtYXRDc3NUZXh0Iiwic3RsMSIsImNudCIsImNvbmNhdCIsImZvcm1hdFByb3BlcnR5IiwiZm9ybWF0Q3NzUHJvcGVydGllcyIsInN0bDIiLCJtYXAiLCJqb2luIiwic2VsZWN0b3IiLCJkb2N1bWVudCIsImNyZWF0ZVRleHROb2RlIiwiY2xvbmVQc2V1ZG9FbGVtZW50Iiwib3JnIiwiZWxlbWVudCIsImNvbnRlbnQiLCJjbGFzc05hbWUiLCJ1aWQiLCJzdHlsZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJjbG9uZVBzZXVkb0VsZW1lbnRzIiwiX3JlZiIsIl9yZWYyIiwiX3NsaWNlZFRvQXJyYXkyIiwiY29weVVzZXJJbnB1dCIsIl9yZWYzIiwiX3JlZjQiLCJIVE1MVGV4dEFyZWFFbGVtZW50IiwiaW5uZXJIVE1MIiwidmFsdWUiLCJIVE1MSW5wdXRFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwiZml4U3ZnIiwiU1ZHRWxlbWVudCIsIlNWR1JlY3RFbGVtZW50IiwiYXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX3JlZjUiLCJfcmVmNiIsIl9yZWY3IiwiX3JlZjgiLCJfcmVmOSIsIl9yZWYxMCIsIl9yZWYxMSIsIl9yZWYxMiIsIl9yZWYxMyIsIl9yZWYxNCIsImFycmF5TGlrZSIsImFycmF5IiwibGVuZ3RoIiwiaSIsInB1c2giLCJmb3VyUmFuZG9tQ2hhcnMiLCJNYXRoIiwicmFuZG9tIiwicG93IiwidG9TdHJpbmciLCJzbGljZSIsImluZGV4IiwibWFrZUltYWdlIiwidXJpIiwicmVqZWN0IiwiaW1hZ2UiLCJJbWFnZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJlcnIiLCJtZXNzYWdlIiwiSU1BR0VfRVhQT1JUX0VSUk9SUyIsImRhdGFVcmkiLCJDb25zb2xlIiwibG9nIiwiZXZlbnQiLCJzcmMiLCJpc0RhdGFVcmwiLCJ1cmwiLCJzZWFyY2giLCJwYXJzZUV4dGVuc2lvbiIsIm1hdGNoIiwiZXhlYyIsIm1pbWVzIiwiV09GRiIsIkpQRUciLCJ3b2ZmIiwid29mZjIiLCJ0dGYiLCJlb3QiLCJwbmciLCJqcGciLCJqcGVnIiwiZ2lmIiwidGlmZiIsInN2ZyIsIm1pbWVUeXBlIiwiZXh0ZW5zaW9uIiwidG9Mb3dlckNhc2UiLCJkYXRhQXNVcmwiLCJ0eXBlIiwiZXNjYXBlIiwic3RyaW5nIiwicmVwbGFjZSIsImRlbGF5IiwibXMiLCJhcmciLCJzZXRUaW1lb3V0IiwiaXNTcmNBc0RhdGFVcmwiLCJ0ZXh0IiwiREFUQV9VUkxfUkVHRVgiLCJjdlRvQmxvYiIsImNhbnZhcyIsImJpbmFyeVN0cmluZyIsImF0b2IiLCJ0b0RhdGFVUkwiLCJzcGxpdCIsImJpbmFyeUFycmF5IiwiVWludDhBcnJheSIsImNoYXJDb2RlQXQiLCJCbG9iIiwiY2FudmFzVG9CbG9iIiwidG9CbG9iIiwiZXNjYXBlWGh0bWwiLCJnZXRXaWR0aCIsIm5vZGUiLCJsZWZ0Qm9yZGVyIiwicHgiLCJyaWdodEJvcmRlciIsInNjcm9sbFdpZHRoIiwiZ2V0SGVpZ2h0IiwidG9wQm9yZGVyIiwiYm90dG9tQm9yZGVyIiwic2Nyb2xsSGVpZ2h0Iiwic3R5bGVQcm9wZXJ0eSIsInBhcnNlRmxvYXQiLCJyZXNvbHZlVXJsIiwiYmFzZVVybCIsImRvYyIsImltcGxlbWVudGF0aW9uIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiYmFzZSIsImhlYWQiLCJhIiwiYm9keSIsImhyZWYiLCJnZXRBbmRFbmNvZGUiLCJvcHRpb25zIiwiVElNRU9VVCIsImNhY2hlQnVzdCIsInRlc3QiLCJEYXRlIiwiZ2V0VGltZSIsInJlcXVlc3QiLCJYTUxIdHRwUmVxdWVzdCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsImRvbmUiLCJvbnRpbWVvdXQiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwib3BlbiIsInNlbmQiLCJwbGFjZWhvbGRlciIsImltYWdlUGxhY2Vob2xkZXIiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwiZmFpbCIsImVuY29kZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkZW5kIiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsInJlc3BvbnNlIiwiZXJyb3IiLCJjb25jYXRBbmRSZXNvbHZlVXJsIiwiVVJMIiwic2V0U3R5bGVTaGVldEJhc2VIcmVmIiwiYWRkQmFzZUhyZWZUb1VybCIsInAxIiwidG9TdHlsZVNoZWV0IiwidGV4dENvbnRlbnQiLCJzaGVldCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kb20tdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IENvbnNvbGUgZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuaW1wb3J0IFdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuaW1wb3J0IHtJTUFHRV9FWFBPUlRfRVJST1JTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ2xvbmUob3JpZ2luYWwsIGNsb25lKSB7XG4gIGlmICghKGNsb25lIGluc3RhbmNlb2YgV2luZG93LkVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlU3R5bGUsIHRhcmdldFN0eWxlKSB7XG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gYXNBcnJheShzb3VyY2VTdHlsZSk7XG4gICAgcHJvcGVydHlLZXlzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICB0YXJnZXRTdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc291cmNlU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSxcbiAgICAgICAgc291cmNlU3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlTdHlsZShzb3VyY2UsIHRhcmdldCkge1xuICAgIGlmIChzb3VyY2UuY3NzVGV4dCkge1xuICAgICAgdGFyZ2V0LmNzc1RleHQgPSBzb3VyY2UuY3NzVGV4dDtcbiAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIGNvcHkgb2YgY29tcG9zaXRlIHN0eWxlc1xuICAgICAgaWYgKHNvdXJjZS5mb250KSB7XG4gICAgICAgIHRhcmdldC5mb250ID0gc291cmNlLmZvbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVN0eWxlKG9nLCBjbG4pIHtcbiAgICBjb25zdCBvcmlnaW5hbFN0eWxlID0gV2luZG93LmdldENvbXB1dGVkU3R5bGUob2cpO1xuICAgIGNvcHlTdHlsZShvcmlnaW5hbFN0eWxlLCBjbG4uc3R5bGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlKGNsbiwgZWxtLCBzdGwpIHtcbiAgICBjb25zdCBmb3JtYXRDc3NUZXh0ID0gc3RsMSA9PiB7XG4gICAgICBjb25zdCBjbnQgPSBzdGwxLmdldFByb3BlcnR5VmFsdWUoJ2NvbnRlbnQnKTtcbiAgICAgIHJldHVybiBgJHtzdGwuY3NzVGV4dH0gY29udGVudDogJHtjbnR9O2A7XG4gICAgfTtcblxuICAgIGNvbnN0IGZvcm1hdFByb3BlcnR5ID0gbmFtZSA9PiB7XG4gICAgICByZXR1cm4gYCR7bmFtZX06JHtzdGwuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKX0ke1xuICAgICAgICBzdGwuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKSA/ICcgIWltcG9ydGFudCcgOiAnJ1xuICAgICAgfWA7XG4gICAgfTtcblxuICAgIGNvbnN0IGZvcm1hdENzc1Byb3BlcnRpZXMgPSBzdGwyID0+IHtcbiAgICAgIHJldHVybiBgJHthc0FycmF5KHN0bDIpLm1hcChmb3JtYXRQcm9wZXJ0eSkuam9pbignOyAnKX07YDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgLiR7Y2xufToke2VsbX1gO1xuICAgIGNvbnN0IGNzc1RleHQgPSBzdGwuY3NzVGV4dCA/IGZvcm1hdENzc1RleHQoc3RsKSA6IGZvcm1hdENzc1Byb3BlcnRpZXMoc3RsKTtcblxuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtzZWxlY3Rvcn17JHtjc3NUZXh0fX1gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudChvcmcsIGNsbiwgZWxlbWVudCkge1xuICAgIGNvbnN0IHN0eWxlID0gV2luZG93LmdldENvbXB1dGVkU3R5bGUob3JnLCBlbGVtZW50KTtcbiAgICBjb25zdCBjb250ZW50ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuXG4gICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVpZCgpO1xuICAgIGNsbi5jbGFzc05hbWUgPSBgJHtjbG4uY2xhc3NOYW1lfSAke2NsYXNzTmFtZX1gO1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbGFzc05hbWUsIGVsZW1lbnQsIHN0eWxlKSk7XG4gICAgY2xuLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVBzZXVkb0VsZW1lbnRzKFtvZywgY2xuXSkge1xuICAgIFsnOmJlZm9yZScsICc6YWZ0ZXInXS5mb3JFYWNoKGVsZW1lbnQgPT4gY2xvbmVQc2V1ZG9FbGVtZW50KG9nLCBjbG4sIGVsZW1lbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlVc2VySW5wdXQoW29nLCBjbG5dKSB7XG4gICAgaWYgKG9nIGluc3RhbmNlb2YgV2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQpIGNsbi5pbm5lckhUTUwgPSBvZy52YWx1ZTtcbiAgICBpZiAob2cgaW5zdGFuY2VvZiBXaW5kb3cuSFRNTElucHV0RWxlbWVudCkgY2xuLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBvZy52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBmaXhTdmcoY2xuKSB7XG4gICAgaWYgKCEoY2xuIGluc3RhbmNlb2YgV2luZG93LlNWR0VsZW1lbnQpKSByZXR1cm47XG4gICAgY2xuLnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtcblxuICAgIGlmICghKGNsbiBpbnN0YW5jZW9mIFdpbmRvdy5TVkdSZWN0RWxlbWVudCkpIHJldHVybjtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLmZvckVhY2goYXR0cmlidXRlID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2xuLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICBjbG4uc3R5bGUuc2V0UHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIFByb21pc2UucmVzb2x2ZShbb3JpZ2luYWwsIGNsb25lXSlcbiAgICAgIC50aGVuKChbb2csIGNsbl0pID0+IHtcbiAgICAgICAgY2xvbmVTdHlsZShvZywgY2xuKTtcbiAgICAgICAgcmV0dXJuIFtvZywgY2xuXTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoW29nLCBjbG5dKSA9PiB7XG4gICAgICAgIGNsb25lUHNldWRvRWxlbWVudHMoW29nLCBjbG5dKTtcbiAgICAgICAgcmV0dXJuIFtvZywgY2xuXTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoW29nLCBjbG5dKSA9PiB7XG4gICAgICAgIGNvcHlVc2VySW5wdXQoW29nLCBjbG5dKTtcbiAgICAgICAgcmV0dXJuIFtvZywgY2xuXTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoW29nLCBjbG5dKSA9PiB7XG4gICAgICAgIGZpeFN2ZyhjbG4pO1xuICAgICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgICAgfSlcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIC50aGVuKChbb2csIGNsbl0pID0+IGNsbilcbiAgKTtcbn1cblxuLyoqICoqXG4gKiBVVElMU1xuICoqKiovXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheShhcnJheUxpa2UpIHtcbiAgY29uc3QgYXJyYXk6IGFueVtdID0gW107XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2goYXJyYXlMaWtlW2ldKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm91clJhbmRvbUNoYXJzKCkge1xuICByZXR1cm4gYDAwMDAkeygoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCA0KSkgPDwgMCkudG9TdHJpbmcoMzYpfWAuc2xpY2UoLTQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdWlkKCkge1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHJldHVybiBgdSR7Zm91clJhbmRvbUNoYXJzKCl9JHtpbmRleCsrfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW1hZ2UodXJpKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgV2luZG93LkltYWdlKCk7XG4gICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgfTtcbiAgICBpbWFnZS5vbmVycm9yID0gZXJyID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBJTUFHRV9FWFBPUlRfRVJST1JTLmRhdGFVcmk7XG4gICAgICBDb25zb2xlLmxvZyh1cmkpO1xuICAgICAgLy8gZXJyb3IgaXMgYW4gRXZlbnQgT2JqZWN0XG4gICAgICAvLyBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2pzcmVmL29ial9ldmVudC5hc3BcbiAgICAgIHJlamVjdCh7ZXZlbnQ6IGVyciwgbWVzc2FnZX0pO1xuICAgIH07XG4gICAgaW1hZ2Uuc3JjID0gdXJpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YVVybCh1cmwpIHtcbiAgcmV0dXJuIHVybC5zZWFyY2goL14oZGF0YTopLykgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4dGVuc2lvbih1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXFwuKFteLi9dKj8pJC9nLmV4ZWModXJsKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gbWltZXMoKSB7XG4gIC8qXG4gICAqIE9ubHkgV09GRiBhbmQgRU9UIG1pbWUgdHlwZXMgZm9yIGZvbnRzIGFyZSAncmVhbCdcbiAgICogc2VlIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWxcbiAgICovXG4gIGNvbnN0IFdPRkYgPSAnYXBwbGljYXRpb24vZm9udC13b2ZmJztcbiAgY29uc3QgSlBFRyA9ICdpbWFnZS9qcGVnJztcblxuICByZXR1cm4ge1xuICAgIHdvZmY6IFdPRkYsXG4gICAgd29mZjI6IFdPRkYsXG4gICAgdHRmOiAnYXBwbGljYXRpb24vZm9udC10cnVldHlwZScsXG4gICAgZW90OiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIHBuZzogJ2ltYWdlL3BuZycsXG4gICAganBnOiBKUEVHLFxuICAgIGpwZWc6IEpQRUcsXG4gICAgZ2lmOiAnaW1hZ2UvZ2lmJyxcbiAgICB0aWZmOiAnaW1hZ2UvdGlmZicsXG4gICAgc3ZnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbWVUeXBlKHVybCkge1xuICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbih1cmwpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBtaW1lcygpW2V4dGVuc2lvbl0gfHwgJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhQXNVcmwoY29udGVudCwgdHlwZSkge1xuICByZXR1cm4gYGRhdGE6JHt0eXBlfTtiYXNlNjQsJHtjb250ZW50fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXF0vXFxcXF0pL2csICdcXFxcJDEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGF5KG1zKSB7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIFdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTcmNBc0RhdGFVcmwodGV4dCkge1xuICBjb25zdCBEQVRBX1VSTF9SRUdFWCA9IC91cmxcXChbJ1wiXT8oZGF0YTopKFteJ1wiXSs/KVsnXCJdP1xcKS87XG4gIHJldHVybiB0ZXh0LnNlYXJjaChEQVRBX1VSTF9SRUdFWCkgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBjdlRvQmxvYihjYW52YXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IFdpbmRvdy5hdG9iKGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnLCcpWzFdKTtcbiAgICBjb25zdCBsZW5ndGggPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJpbmFyeUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGJpbmFyeUFycmF5W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICByZXNvbHZlKG5ldyBXaW5kb3cuQmxvYihbYmluYXJ5QXJyYXldLCB7dHlwZTogJ2ltYWdlL3BuZyd9KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzVG9CbG9iKGNhbnZhcykge1xuICBpZiAoY2FudmFzLnRvQmxvYilcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjYW52YXMudG9CbG9iKHJlc29sdmUpO1xuICAgIH0pO1xuXG4gIHJldHVybiBjdlRvQmxvYihjYW52YXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWGh0bWwoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvIy9nLCAnJTIzJykucmVwbGFjZSgvXFxuL2csICclMEEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpZHRoKG5vZGUpIHtcbiAgY29uc3QgbGVmdEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICBjb25zdCByaWdodEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgcmV0dXJuIG5vZGUuc2Nyb2xsV2lkdGggKyBsZWZ0Qm9yZGVyICsgcmlnaHRCb3JkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWlnaHQobm9kZSkge1xuICBjb25zdCB0b3BCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuICBjb25zdCBib3R0b21Cb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcpO1xuICByZXR1cm4gbm9kZS5zY3JvbGxIZWlnaHQgKyB0b3BCb3JkZXIgKyBib3R0b21Cb3JkZXI7XG59XG5cbmZ1bmN0aW9uIHB4KG5vZGUsIHN0eWxlUHJvcGVydHkpIHtcbiAgY29uc3QgdmFsdWUgPSBXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5yZXBsYWNlKCdweCcsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXJsKHVybCwgYmFzZVVybCkge1xuICBjb25zdCBkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgY29uc3QgYmFzZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7XG4gIGRvYy5oZWFkLmFwcGVuZENoaWxkKGJhc2UpO1xuICBjb25zdCBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gIGJhc2UuaHJlZiA9IGJhc2VVcmw7XG4gIGEuaHJlZiA9IHVybDtcbiAgcmV0dXJuIGEuaHJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZEVuY29kZSh1cmwsIG9wdGlvbnMpIHtcbiAgY29uc3QgVElNRU9VVCA9IDMwMDAwO1xuICBpZiAob3B0aW9ucy5jYWNoZUJ1c3QpIHtcbiAgICAvLyBDYWNoZSBieXBhc3Mgc28gd2UgZG9udCBoYXZlIENPUlMgaXNzdWVzIHdpdGggY2FjaGVkIGltYWdlc1xuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L1VzaW5nX1hNTEh0dHBSZXF1ZXN0I0J5cGFzc2luZ190aGVfY2FjaGVcbiAgICB1cmwgKz0gKC9cXD8vLnRlc3QodXJsKSA/ICcmJyA6ICc/JykgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBkb25lO1xuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gdGltZW91dDtcbiAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBUSU1FT1VUO1xuICAgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICByZXF1ZXN0LnNlbmQoKTtcblxuICAgIGxldCBwbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG9wdGlvbnMuaW1hZ2VQbGFjZWhvbGRlci5zcGxpdCgvLC8pO1xuICAgICAgaWYgKHNwbGl0ICYmIHNwbGl0WzFdKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gc3BsaXRbMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjtcblxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVzb2x2ZShwbGFjZWhvbGRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFpbChgY2Fubm90IGZldGNoIHJlc291cmNlOiAke3VybH0sIHN0YXR1czogJHtyZXF1ZXN0LnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBXaW5kb3cuRmlsZVJlYWRlcigpO1xuICAgICAgZW5jb2Rlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICByZXNvbHZlKGNvbnRlbnQpO1xuICAgICAgfTtcbiAgICAgIGVuY29kZXIucmVhZEFzRGF0YVVSTChyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aW1lb3V0KCkge1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHJlc29sdmUocGxhY2Vob2xkZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbChgdGltZW91dCBvZiAke1RJTUVPVVR9bXMgb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgcmVzb3VyY2U6ICR7dXJsfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgQ29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRBbmRSZXNvbHZlVXJsKGJhc2UsIHVybCkge1xuICByZXR1cm4gbmV3IFVSTCh1cmwsIGJhc2UpLmhyZWY7XG59XG5cbi8vIFNldCByZWxhdGl2ZSBVUkwgaW4gc3R5bGVzaGVldCB0byBhYnNvbHV0ZSB1cmxcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdHlsZVNoZWV0QmFzZUhyZWYodGV4dCwgYmFzZSkge1xuICBmdW5jdGlvbiBhZGRCYXNlSHJlZlRvVXJsKG1hdGNoLCBwMSkge1xuICAgIGNvbnN0IHVybCA9IC9eaHR0cC9pLnRlc3QocDEpID8gcDEgOiBjb25jYXRBbmRSZXNvbHZlVXJsKGJhc2UsIHAxKTtcbiAgICByZXR1cm4gYHVybCgnJHt1cmx9JylgO1xuICB9XG4gIHJldHVybiBpc1NyY0FzRGF0YVVybCh0ZXh0KVxuICAgID8gdGV4dFxuICAgIDogdGV4dC5yZXBsYWNlKC91cmxcXChbJ1wiXT8oW14nXCJdKz8pWydcIl0/XFwpL2csIGFkZEJhc2VIcmVmVG9VcmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHlsZVNoZWV0KHRleHQpIHtcbiAgY29uc3QgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTtcbiAgY29uc3Qgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblxuICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBkb2MuYm9keS5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXG4gIHJldHVybiBzdHlsZUVsZW1lbnQuc2hlZXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQU5BO0FBQ0E7O0FBT08sU0FBU0ksWUFBWUEsQ0FBQ0MsUUFBUSxFQUFFQyxLQUFLLEVBQUU7RUFDNUMsSUFBSSxFQUFFQSxLQUFL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
;