UNPKG

kepler.gl

Version:

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

425 lines (342 loc) 41.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.processClone = processClone; exports.asArray = asArray; exports.fourRandomChars = fourRandomChars; exports.uid = uid; exports.makeImage = makeImage; exports.isDataUrl = isDataUrl; exports.mimeType = mimeType; exports.dataAsUrl = dataAsUrl; exports.escape = escape; exports.delay = delay; exports.isSrcAsDataUrl = isSrcAsDataUrl; exports.canvasToBlob = canvasToBlob; exports.escapeXhtml = escapeXhtml; exports.getWidth = getWidth; exports.getHeight = getHeight; exports.resolveUrl = resolveUrl; exports.getAndEncode = getAndEncode; 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 _userFeedbacks = require("../constants/user-feedbacks"); // Copyright (c) 2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. 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]; }).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() { /* see http://stackoverflow.com/a/6248722/2519373 */ 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 = _userFeedbacks.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(''); } }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kb20tdXRpbHMuanMiXSwibmFtZXMiOlsicHJvY2Vzc0Nsb25lIiwib3JpZ2luYWwiLCJjbG9uZSIsIndpbmRvdyIsIkVsZW1lbnQiLCJjb3B5UHJvcGVydGllcyIsInNvdXJjZVN0eWxlIiwidGFyZ2V0U3R5bGUiLCJwcm9wZXJ0eUtleXMiLCJhc0FycmF5IiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eVByaW9yaXR5IiwiY29weVN0eWxlIiwic291cmNlIiwidGFyZ2V0IiwiY3NzVGV4dCIsImZvbnQiLCJjbG9uZVN0eWxlIiwib2ciLCJjbG4iLCJvcmlnaW5hbFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInN0eWxlIiwiZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlIiwiZWxtIiwic3RsIiwiZm9ybWF0Q3NzVGV4dCIsInN0bDEiLCJjbnQiLCJmb3JtYXRQcm9wZXJ0eSIsImZvcm1hdENzc1Byb3BlcnRpZXMiLCJzdGwyIiwibWFwIiwiam9pbiIsInNlbGVjdG9yIiwiZG9jdW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsImNsb25lUHNldWRvRWxlbWVudCIsIm9yZyIsImVsZW1lbnQiLCJjb250ZW50IiwiY2xhc3NOYW1lIiwidWlkIiwic3R5bGVFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImFwcGVuZENoaWxkIiwiY2xvbmVQc2V1ZG9FbGVtZW50cyIsImNvcHlVc2VySW5wdXQiLCJIVE1MVGV4dEFyZWFFbGVtZW50IiwiaW5uZXJIVE1MIiwidmFsdWUiLCJIVE1MSW5wdXRFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwiZml4U3ZnIiwiU1ZHRWxlbWVudCIsIlNWR1JlY3RFbGVtZW50IiwiYXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiYXJyYXlMaWtlIiwiYXJyYXkiLCJsZW5ndGgiLCJpIiwicHVzaCIsImZvdXJSYW5kb21DaGFycyIsIk1hdGgiLCJyYW5kb20iLCJwb3ciLCJ0b1N0cmluZyIsInNsaWNlIiwiaW5kZXgiLCJtYWtlSW1hZ2UiLCJ1cmkiLCJyZWplY3QiLCJpbWFnZSIsIkltYWdlIiwib25sb2FkIiwib25lcnJvciIsImVyciIsIm1lc3NhZ2UiLCJJTUFHRV9FWFBPUlRfRVJST1JTIiwiZGF0YVVyaSIsImNvbnNvbGUiLCJsb2ciLCJldmVudCIsInNyYyIsImlzRGF0YVVybCIsInVybCIsInNlYXJjaCIsInBhcnNlRXh0ZW5zaW9uIiwibWF0Y2giLCJleGVjIiwibWltZXMiLCJXT0ZGIiwiSlBFRyIsIndvZmYiLCJ3b2ZmMiIsInR0ZiIsImVvdCIsInBuZyIsImpwZyIsImpwZWciLCJnaWYiLCJ0aWZmIiwic3ZnIiwibWltZVR5cGUiLCJleHRlbnNpb24iLCJ0b0xvd2VyQ2FzZSIsImRhdGFBc1VybCIsInR5cGUiLCJlc2NhcGUiLCJzdHJpbmciLCJyZXBsYWNlIiwiZGVsYXkiLCJtcyIsImFyZyIsInNldFRpbWVvdXQiLCJpc1NyY0FzRGF0YVVybCIsInRleHQiLCJEQVRBX1VSTF9SRUdFWCIsImN2VG9CbG9iIiwiY2FudmFzIiwiYmluYXJ5U3RyaW5nIiwiYXRvYiIsInRvRGF0YVVSTCIsInNwbGl0IiwiYmluYXJ5QXJyYXkiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsIkJsb2IiLCJjYW52YXNUb0Jsb2IiLCJ0b0Jsb2IiLCJlc2NhcGVYaHRtbCIsImdldFdpZHRoIiwibm9kZSIsImxlZnRCb3JkZXIiLCJweCIsInJpZ2h0Qm9yZGVyIiwic2Nyb2xsV2lkdGgiLCJnZXRIZWlnaHQiLCJ0b3BCb3JkZXIiLCJib3R0b21Cb3JkZXIiLCJzY3JvbGxIZWlnaHQiLCJzdHlsZVByb3BlcnR5IiwicGFyc2VGbG9hdCIsInJlc29sdmVVcmwiLCJiYXNlVXJsIiwiZG9jIiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJiYXNlIiwiaGVhZCIsImEiLCJib2R5IiwiaHJlZiIsImdldEFuZEVuY29kZSIsIm9wdGlvbnMiLCJUSU1FT1VUIiwiY2FjaGVCdXN0IiwidGVzdCIsIkRhdGUiLCJnZXRUaW1lIiwicmVxdWVzdCIsIlhNTEh0dHBSZXF1ZXN0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwiZG9uZSIsIm9udGltZW91dCIsInRpbWVvdXQiLCJyZXNwb25zZVR5cGUiLCJvcGVuIiwic2VuZCIsInBsYWNlaG9sZGVyIiwiaW1hZ2VQbGFjZWhvbGRlciIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJmYWlsIiwiZW5jb2RlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWRlbmQiLCJyZXN1bHQiLCJyZWFkQXNEYXRhVVJMIiwicmVzcG9uc2UiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQXZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9PLFNBQVNBLFlBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDQyxLQUFoQyxFQUF1QztBQUM1QyxNQUFJLEVBQUVBLEtBQUssWUFBWUMsbUJBQU9DLE9BQTFCLENBQUosRUFBd0M7QUFDdEMsV0FBT0YsS0FBUDtBQUNEOztBQUVELFdBQVNHLGNBQVQsQ0FBd0JDLFdBQXhCLEVBQXFDQyxXQUFyQyxFQUFrRDtBQUNoRCxRQUFNQyxZQUFZLEdBQUdDLE9BQU8sQ0FBQ0gsV0FBRCxDQUE1QjtBQUNBRSxJQUFBQSxZQUFZLENBQUNFLE9BQWIsQ0FBcUIsVUFBQUMsSUFBSSxFQUFJO0FBQzNCSixNQUFBQSxXQUFXLENBQUNLLFdBQVosQ0FDRUQsSUFERixFQUVFTCxXQUFXLENBQUNPLGdCQUFaLENBQTZCRixJQUE3QixDQUZGLEVBR0VMLFdBQVcsQ0FBQ1EsbUJBQVosQ0FBZ0NILElBQWhDLENBSEY7QUFLRCxLQU5EO0FBT0Q7O0FBRUQsV0FBU0ksU0FBVCxD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LFVBQVgsRUFBaEI7O0FBQ0FELE1BQUFBLE9BQU8sQ0FBQ0UsU0FBUixHQUFvQixZQUFNO0FBQ3hCLFlBQU01SSxPQUFPLEdBQUcwSSxPQUFPLENBQUNHLE1BQVIsQ0FBZXRELEtBQWYsQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsQ0FBaEI7QUFDQXBFLFFBQUFBLE9BQU8sQ0FBQ25CLE9BQUQsQ0FBUDtBQUNELE9BSEQ7O0FBSUEwSSxNQUFBQSxPQUFPLENBQUNJLGFBQVIsQ0FBc0JsQixPQUFPLENBQUNtQixRQUE5QjtBQUNEOztBQUVELGFBQVNkLE9BQVQsR0FBbUI7QUFDakIsVUFBSUksV0FBSixFQUFpQjtBQUNmbEgsUUFBQUEsT0FBTyxDQUFDa0gsV0FBRCxDQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0xJLFFBQUFBLElBQUksc0JBQWVsQixPQUFmLGtEQUE4RHRFLEdBQTlELEVBQUo7QUFDRDtBQUNGOztBQUVELGFBQVN3RixJQUFULENBQWNoRyxPQUFkLEVBQXVCO0FBQ3JCRywwQkFBUW9HLEtBQVIsQ0FBY3ZHLE9BQWQ7O0FBQ0F0QixNQUFBQSxPQUFPLENBQUMsRUFBRCxDQUFQO0FBQ0Q7QUFDRixHQW5ETSxDQUFQO0FBb0REIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IGNvbnNvbGUgZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuaW1wb3J0IHtJTUFHRV9FWFBPUlRfRVJST1JTfSBmcm9tICdjb25zdGFudHMvdXNlci1mZWVkYmFja3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0Nsb25lKG9yaWdpbmFsLCBjbG9uZSkge1xuICBpZiAoIShjbG9uZSBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSkge1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZVN0eWxlLCB0YXJnZXRTdHlsZSkge1xuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IGFzQXJyYXkoc291cmNlU3R5bGUpO1xuICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgdGFyZ2V0U3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvdXJjZVN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksXG4gICAgICAgIHNvdXJjZVN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5U3R5bGUoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoc291cmNlLmNzc1RleHQpIHtcbiAgICAgIHRhcmdldC5jc3NUZXh0ID0gc291cmNlLmNzc1RleHQ7XG4gICAgICAvLyBhZGQgYWRkaXRpb25hbCBjb3B5IG9mIGNvbXBvc2l0ZSBzdHlsZXNcbiAgICAgIGlmIChzb3VyY2UuZm9udCkge1xuICAgICAgICB0YXJnZXQuZm9udCA9IHNvdXJjZS5mb250O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5UHJvcGVydGllcyhzb3VyY2UsIHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVTdHlsZShvZywgY2xuKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9nKTtcbiAgICBjb3B5U3R5bGUob3JpZ2luYWxTdHlsZSwgY2xuLnN0eWxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbG4sIGVsbSwgc3RsKSB7XG4gICAgY29uc3QgZm9ybWF0Q3NzVGV4dCA9IHN0bDEgPT4ge1xuICAgICAgY29uc3QgY250ID0gc3RsMS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG4gICAgICByZXR1cm4gYCR7c3RsLmNzc1RleHR9IGNvbnRlbnQ6ICR7Y250fTtgO1xuICAgIH07XG5cbiAgICBjb25zdCBmb3JtYXRQcm9wZXJ0eSA9IG5hbWUgPT4ge1xuICAgICAgcmV0dXJuIGAke25hbWV9OiR7c3RsLmdldFByb3BlcnR5VmFsdWUobmFtZSl9JHtcbiAgICAgICAgc3RsLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkgPyAnICFpbXBvcnRhbnQnIDogJydcbiAgICAgIH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBmb3JtYXRDc3NQcm9wZXJ0aWVzID0gc3RsMiA9PiB7XG4gICAgICByZXR1cm4gYCR7YXNBcnJheShzdGwyKVxuICAgICAgICAubWFwKGZvcm1hdFByb3BlcnR5KVxuICAgICAgICAuam9pbignOyAnKX07YDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgLiR7Y2xufToke2VsbX1gO1xuICAgIGNvbnN0IGNzc1RleHQgPSBzdGwuY3NzVGV4dCA/IGZvcm1hdENzc1RleHQoc3RsKSA6IGZvcm1hdENzc1Byb3BlcnRpZXMoc3RsKTtcblxuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtzZWxlY3Rvcn17JHtjc3NUZXh0fX1gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudChvcmcsIGNsbiwgZWxlbWVudCkge1xuICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUob3JnLCBlbGVtZW50KTtcbiAgICBjb25zdCBjb250ZW50ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnY29udGVudCcpO1xuXG4gICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVpZCgpO1xuICAgIGNsbi5jbGFzc05hbWUgPSBgJHtjbG4uY2xhc3NOYW1lfSAke2NsYXNzTmFtZX1gO1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbGFzc05hbWUsIGVsZW1lbnQsIHN0eWxlKSk7XG4gICAgY2xuLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVBzZXVkb0VsZW1lbnRzKFtvZywgY2xuXSkge1xuICAgIFsnOmJlZm9yZScsICc6YWZ0ZXInXS5mb3JFYWNoKGVsZW1lbnQgPT4gY2xvbmVQc2V1ZG9FbGVtZW50KG9nLCBjbG4sIGVsZW1lbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlVc2VySW5wdXQoW29nLCBjbG5dKSB7XG4gICAgaWYgKG9nIGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQpIGNsbi5pbm5lckhUTUwgPSBvZy52YWx1ZTtcbiAgICBpZiAob2cgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElucHV0RWxlbWVudCkgY2xuLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBvZy52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBmaXhTdmcoY2xuKSB7XG4gICAgaWYgKCEoY2xuIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQpKSByZXR1cm47XG4gICAgY2xuLnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtcblxuICAgIGlmICghKGNsbiBpbnN0YW5jZW9mIHdpbmRvdy5TVkdSZWN0RWxlbWVudCkpIHJldHVybjtcbiAgICBbJ3dpZHRoJywgJ2hlaWdodCddLmZvckVhY2goYXR0cmlidXRlID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2xuLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICBjbG4uc3R5bGUuc2V0UHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtvcmlnaW5hbCwgY2xvbmVdKVxuICAgIC50aGVuKChbb2csIGNsbl0pID0+IHtcbiAgICAgIGNsb25lU3R5bGUob2csIGNsbik7XG4gICAgICByZXR1cm4gW29nLCBjbG5dO1xuICAgIH0pXG4gICAgLnRoZW4oKFtvZywgY2xuXSkgPT4ge1xuICAgICAgY2xvbmVQc2V1ZG9FbGVtZW50cyhbb2csIGNsbl0pO1xuICAgICAgcmV0dXJuIFtvZywgY2xuXTtcbiAgICB9KVxuICAgIC50aGVuKChbb2csIGNsbl0pID0+IHtcbiAgICAgIGNvcHlVc2VySW5wdXQoW29nLCBjbG5dKTtcbiAgICAgIHJldHVybiBbb2csIGNsbl07XG4gICAgfSlcbiAgICAudGhlbigoW29nLCBjbG5dKSA9PiB7XG4gICAgICBmaXhTdmcoY2xuKTtcbiAgICAgIHJldHVybiBbb2csIGNsbl07XG4gICAgfSlcbiAgICAudGhlbigoW29nLCBjbG5dKSA9PiBjbG4pO1xufVxuXG4vKioqKlxuICogVVRJTFNcbiAqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXkoYXJyYXlMaWtlKSB7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2goYXJyYXlMaWtlW2ldKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm91clJhbmRvbUNoYXJzKCkge1xuICAvKiBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjI0ODcyMi8yNTE5MzczICovXG4gIHJldHVybiBgMDAwMCR7KChNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMzYsIDQpKSA8PCAwKS50b1N0cmluZygzNil9YC5zbGljZSgtNCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1aWQoKSB7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgcmV0dXJuIGB1JHtmb3VyUmFuZG9tQ2hhcnMoKX0ke2luZGV4Kyt9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VJbWFnZSh1cmkpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyB3aW5kb3cuSW1hZ2UoKTtcbiAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICByZXNvbHZlKGltYWdlKTtcbiAgICB9O1xuICAgIGltYWdlLm9uZXJyb3IgPSBlcnIgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IElNQUdFX0VYUE9SVF9FUlJPUlMuZGF0YVVyaTtcbiAgICAgIGNvbnNvbGUubG9nKHVyaSk7XG4gICAgICAvLyBlcnJvciBpcyBhbiBFdmVudCBPYmplY3RcbiAgICAgIC8vIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvb2JqX2V2ZW50LmFzcFxuICAgICAgcmVqZWN0KHtldmVudDogZXJyLCBtZXNzYWdlfSk7XG4gICAgfTtcbiAgICBpbWFnZS5zcmMgPSB1cmk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhVXJsKHVybCkge1xuICByZXR1cm4gdXJsLnNlYXJjaCgvXihkYXRhOikvKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9uKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9cXC4oW15cXC5cXC9dKj8pJC9nLmV4ZWModXJsKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gbWltZXMoKSB7XG4gIC8qXG4gICAqIE9ubHkgV09GRiBhbmQgRU9UIG1pbWUgdHlwZXMgZm9yIGZvbnRzIGFyZSAncmVhbCdcbiAgICogc2VlIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWxcbiAgICovXG4gIGNvbnN0IFdPRkYgPSAnYXBwbGljYXRpb24vZm9udC13b2ZmJztcbiAgY29uc3QgSlBFRyA9ICdpbWFnZS9qcGVnJztcblxuICByZXR1cm4ge1xuICAgIHdvZmY6IFdPRkYsXG4gICAgd29mZjI6IFdPRkYsXG4gICAgdHRmOiAnYXBwbGljYXRpb24vZm9udC10cnVldHlwZScsXG4gICAgZW90OiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIHBuZzogJ2ltYWdlL3BuZycsXG4gICAganBnOiBKUEVHLFxuICAgIGpwZWc6IEpQRUcsXG4gICAgZ2lmOiAnaW1hZ2UvZ2lmJyxcbiAgICB0aWZmOiAnaW1hZ2UvdGlmZicsXG4gICAgc3ZnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbWVUeXBlKHVybCkge1xuICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbih1cmwpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBtaW1lcygpW2V4dGVuc2lvbl0gfHwgJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhQXNVcmwoY29udGVudCwgdHlwZSkge1xuICByZXR1cm4gYGRhdGE6JHt0eXBlfTtiYXNlNjQsJHtjb250ZW50fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFxcW1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxheShtcykge1xuICByZXR1cm4gYXJnID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYXJnKTtcbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3JjQXNEYXRhVXJsKHRleHQpIHtcbiAgY29uc3QgREFUQV9VUkxfUkVHRVggPSAvdXJsXFwoWydcIl0/KGRhdGE6KShbXidcIl0rPylbJ1wiXT9cXCkvO1xuXG4gIHJldHVybiB0ZXh0LnNlYXJjaChEQVRBX1VSTF9SRUdFWCkgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBjdlRvQmxvYihjYW52YXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IHdpbmRvdy5hdG9iKGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnLCcpWzFdKTtcbiAgICBjb25zdCBsZW5ndGggPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJpbmFyeUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGJpbmFyeUFycmF5W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICByZXNvbHZlKG5ldyB3aW5kb3cuQmxvYihbYmluYXJ5QXJyYXldLCB7dHlwZTogJ2ltYWdlL3BuZyd9KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzVG9CbG9iKGNhbnZhcykge1xuICBpZiAoY2FudmFzLnRvQmxvYilcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjYW52YXMudG9CbG9iKHJlc29sdmUpO1xuICAgIH0pO1xuXG4gIHJldHVybiBjdlRvQmxvYihjYW52YXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWGh0bWwoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvIy9nLCAnJTIzJykucmVwbGFjZSgvXFxuL2csICclMEEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpZHRoKG5vZGUpIHtcbiAgY29uc3QgbGVmdEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICBjb25zdCByaWdodEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItcmlnaHQtd2lkdGgnKTtcbiAgcmV0dXJuIG5vZGUuc2Nyb2xsV2lkdGggKyBsZWZ0Qm9yZGVyICsgcmlnaHRCb3JkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWlnaHQobm9kZSkge1xuICBjb25zdCB0b3BCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuICBjb25zdCBib3R0b21Cb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcpO1xuICByZXR1cm4gbm9kZS5zY3JvbGxIZWlnaHQgKyB0b3BCb3JkZXIgKyBib3R0b21Cb3JkZXI7XG59XG5cbmZ1bmN0aW9uIHB4KG5vZGUsIHN0eWxlUHJvcGVydHkpIHtcbiAgY29uc3QgdmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5yZXBsYWNlKCdweCcsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXJsKHVybCwgYmFzZVVybCkge1xuICBjb25zdCBkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgY29uc3QgYmFzZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7XG4gIGRvYy5oZWFkLmFwcGVuZENoaWxkKGJhc2UpO1xuICBjb25zdCBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gIGJhc2UuaHJlZiA9IGJhc2VVcmw7XG4gIGEuaHJlZiA9IHVybDtcbiAgcmV0dXJuIGEuaHJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZEVuY29kZSh1cmwsIG9wdGlvbnMpIHtcbiAgY29uc3QgVElNRU9VVCA9IDMwMDAwO1xuICBpZiAob3B0aW9ucy5jYWNoZUJ1c3QpIHtcbiAgICAvLyBDYWNoZSBieXBhc3Mgc28gd2UgZG9udCBoYXZlIENPUlMgaXNzdWVzIHdpdGggY2FjaGVkIGltYWdlc1xuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L1VzaW5nX1hNTEh0dHBSZXF1ZXN0I0J5cGFzc2luZ190aGVfY2FjaGVcbiAgICB1cmwgKz0gKC9cXD8vLnRlc3QodXJsKSA/ICcmJyA6ICc/JykgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBkb25lO1xuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gdGltZW91dDtcbiAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBUSU1FT1VUO1xuICAgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICByZXF1ZXN0LnNlbmQoKTtcblxuICAgIGxldCBwbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5pbWFnZVBsYWNlaG9sZGVyKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG9wdGlvbnMuaW1hZ2VQbGFjZWhvbGRlci5zcGxpdCgvLC8pO1xuICAgICAgaWYgKHNwbGl0ICYmIHNwbGl0WzFdKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gc3BsaXRbMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjtcblxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVzb2x2ZShwbGFjZWhvbGRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFpbChgY2Fubm90IGZldGNoIHJlc291cmNlOiAke3VybH0sIHN0YXR1czogJHtyZXF1ZXN0LnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyB3aW5kb3cuRmlsZVJlYWRlcigpO1xuICAgICAgZW5jb2Rlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICByZXNvbHZlKGNvbnRlbnQpO1xuICAgICAgfTtcbiAgICAgIGVuY29kZXIucmVhZEFzRGF0YVVSTChyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aW1lb3V0KCkge1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHJlc29sdmUocGxhY2Vob2xkZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbChgdGltZW91dCBvZiAke1RJTUVPVVR9bXMgb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgcmVzb3VyY2U6ICR7dXJsfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIHJlc29sdmUoJycpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=