@thebigcrunch/sdk
Version:
The big crunch SDK library
294 lines (261 loc) • 42.7 kB
JavaScript
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./odo/index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./odo/index.js":
/*!**********************!*\
!*** ./odo/index.js ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports) {
// This file needs good browser support because it's included on everyone's websites.
// It's also not babeled meaning const, let, async await and other modern features don't work that well
// check caniuse before using anything too crazy.
var isMobile = false; // Mobile detection for resizing.
if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) {
isMobile = true;
}
var wafflebarHeight = 38;
var container = document.getElementById("container");
container.style.width = window.innerWidth + "px";
container.style.height = window.innerHeight - wafflebarHeight + "px";
var url = new URLSearchParams(window.location.search);
var spaceId = url.get("id");
var fullpage = url.get("fullpage");
var aspect = url.get("aspect") || "cellaspect";
var hideWaffleBar = url.get("disableBar") || false;
var lastValue;
var lastSpace;
var sockets;
function draw(value, space, options) {
if (lastSpace && lastSpace.type === TBC.types.visualisation && space.type === TBC.types.visualisation && lastValue === value && lastSpace.layers.length === space.layers.length) {
// Don't redraw vizzies that are the same
return;
}
container.innerHTML = "";
if (sockets) {
sockets.close();
}
if (space.layers && space.layers.length > 0) {
sockets = TBC.renderLayersToElement(space, container, options);
} else if (space.type === TBC.types.visualisation) {
TBC.renderVisualisationToElement(space, container, options);
} else if (space.value === null) {
// Don't render empty spaces. Visualizations don't have a value doh.
return;
} else {
TBC.renderCellToElement(space, container, options);
}
var innerContainer = container.firstChild;
var containerBox = innerContainer.getBoundingClientRect(); // Fudge 10% stretch mode.
// If the container is within 10% of the container stretch it so that there aren't any borders around it.
if (containerBox.width + containerBox.width * 0.1 >= window.innerWidth && containerBox.height + containerBox.height * 0.1 >= window.innerHeight && !options && fullpage === "true") {
draw(value, space, {
fit: "stretch"
});
}
}
function updateWaffleBar(space, user) {
if (!space) {
// This happens when the user callback comes back first.
return;
}
document.getElementById("SpaceLink").href = TBC.getWebViewLink(space);
if (user && user.profilePicture) {
document.getElementById("ProfilePicture").src = TBC.getProfilePictureUrl(user);
}
document.getElementById("ProfilePictureLink").href = TBC.getUserProfileUrl(user);
document.getElementById("LinkText").value = TBC.getWebViewLink(space);
document.getElementById("Embed").href = TBC.getWebViewLink(space);
document.getElementById("Weblink").href = TBC.getWebViewLink(space);
if (!space.name || space.name === "") {
document.getElementById("SpaceName").innerText = "Untitled";
} else {
document.getElementById("SpaceName").innerText = space.name;
}
}
var user = undefined;
function crunch() {
var options = {
fit: aspect,
odo: true
};
TBC.crunch(spaceId, function (value, space) {
updateWaffleBar(space, user);
document.getElementById("error").style.display = "none";
draw(value, space, options);
lastValue = value;
lastSpace = space;
}, function () {
document.getElementById("error").style.display = "block";
}, function (user) {
user = user;
updateWaffleBar(lastSpace, user);
});
} // Only resize on mobile.
// SIMON HACKED THIS! XXX
//if (!isMobile) {
window.addEventListener("resize", function () {
var options = {
fit: aspect
};
container.style.width = window.innerWidth + "px";
container.style.height = window.innerHeight - wafflebarHeight + "px"; // Need to maintain aspect ratio here.
if (container.querySelector("iframe") === null) {
draw(lastValue, lastSpace, options);
}
}); //}
WebFont.load({
google: {
families: ["Slabo", "Indie Flower", "Inconsolata", "Macondo", "Monoton", "Roboto Slab", "Roboto"]
},
active: function active() {
var options = {
fit: aspect
}; // Vizzies don't need to redraw when fonts are loaded because they're in an iframe.
if (lastSpace && lastSpace.type !== TBC.types.visualisation) draw(lastValue, lastSpace, options);
}
});
function analytics() {
var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" && dnt != "yes") {
(function (i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments);
}, i[r].l = 1 * new Date();
a = s.createElement(o), m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", {"gaCode":"UA-106748582-1","webViewUrl":"https://bigcrunch.io"}.gaCode, "auto");
ga("send", "pageview");
} else {
console.debug("Respecting Do-Not-Track, not loading analytics. See https://bigcrunch.io/google-analytics-dnt/");
}
} // Display something while fonts are loading.
crunch();
analytics();
function copyText(id, buttonId) {
var previousText = document.getElementById(buttonId).textContent;
var textToCopy = document.getElementById(id);
textToCopy.select();
document.getElementById(buttonId).textContent = "Copied";
document.execCommand("copy");
setTimeout(function () {
document.getElementById(buttonId).textContent = previousText;
}, 1000);
}
(function onLoad() {
if (!hideWaffleBar) {
document.getElementById("WaffleBar").style.display = "flex";
document.body.classList.add("body-border");
}
document.getElementById("ShareButton").addEventListener("click", function () {
document.getElementById("ShareModal").style.display = "flex";
document.getElementById("container").classList.add("blur-container");
});
document.getElementById("ModalClose").addEventListener("click", function () {
document.getElementById("ShareModal").style.display = "none";
document.getElementById("container").classList.remove("blur-container");
});
document.getElementById("CopyLinkText").addEventListener("click", function () {
copyText("LinkText", "CopyLinkText");
}); // Social buttons
document.getElementById("Facebook").addEventListener("click", function () {
window.open("https://www.facebook.com/sharer/sharer.php?u=".concat(TBC.getWebViewLink(lastSpace)), "", "height=400,width=550,centerscreen=yes");
});
document.getElementById("LinkedIn").addEventListener("click", function () {
window.open("https://linkedin.com/shareArticle?url=".concat(TBC.getWebViewLink(lastSpace)), "", "height=500,width=500,centerscreen=yes");
});
document.getElementById("Twitter").addEventListener("click", function () {
window.open("https://twitter.com/share?url=".concat(TBC.getWebViewLink(lastSpace)), "", "height=500,width=500,centerscreen=yes");
});
})();
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vb2RvL2luZGV4LmpzIl0sIm5hbWVzIjpbImlzTW9iaWxlIiwidGVzdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInN1YnN0ciIsIndhZmZsZWJhckhlaWdodCIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJzdHlsZSIsIndpZHRoIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwidXJsIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGFjZUlkIiwiZ2V0IiwiZnVsbHBhZ2UiLCJhc3BlY3QiLCJoaWRlV2FmZmxlQmFyIiwibGFzdFZhbHVlIiwibGFzdFNwYWNlIiwic29ja2V0cyIsImRyYXciLCJ2YWx1ZSIsInNwYWNlIiwib3B0aW9ucyIsInR5cGUiLCJUQkMiLCJ0eXBlcyIsInZpc3VhbGlzYXRpb24iLCJsYXllcnMiLCJsZW5ndGgiLCJpbm5lckhUTUwiLCJjbG9zZSIsInJlbmRlckxheWVyc1RvRWxlbWVudCIsInJlbmRlclZpc3VhbGlzYXRpb25Ub0VsZW1lbnQiLCJyZW5kZXJDZWxsVG9FbGVtZW50IiwiaW5uZXJDb250YWluZXIiLCJmaXJzdENoaWxkIiwiY29udGFpbmVyQm94IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZml0IiwidXBkYXRlV2FmZmxlQmFyIiwidXNlciIsImhyZWYiLCJnZXRXZWJWaWV3TGluayIsInByb2ZpbGVQaWN0dXJlIiwic3JjIiwiZ2V0UHJvZmlsZVBpY3R1cmVVcmwiLCJnZXRVc2VyUHJvZmlsZVVybCIsIm5hbWUiLCJpbm5lclRleHQiLCJ1bmRlZmluZWQiLCJjcnVuY2giLCJvZG8iLCJkaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsInF1ZXJ5U2VsZWN0b3IiLCJXZWJGb250IiwibG9hZCIsImdvb2dsZSIsImZhbWlsaWVzIiwiYWN0aXZlIiwiYW5hbHl0aWNzIiwiZG50IiwiZG9Ob3RUcmFjayIsIm1zRG9Ob3RUcmFjayIsImkiLCJzIiwibyIsImciLCJyIiwiYSIsIm0iLCJxIiwicHVzaCIsImFyZ3VtZW50cyIsImwiLCJEYXRlIiwiY3JlYXRlRWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXN5bmMiLCJwYXJlbnROb2RlIiwiaW5zZXJ0QmVmb3JlIiwiZ2EiLCJDT05GSUciLCJnYUNvZGUiLCJjb25zb2xlIiwiZGVidWciLCJjb3B5VGV4dCIsImlkIiwiYnV0dG9uSWQiLCJwcmV2aW91c1RleHQiLCJ0ZXh0Q29udGVudCIsInRleHRUb0NvcHkiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInNldFRpbWVvdXQiLCJvbkxvYWQiLCJib2R5IiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwib3BlbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQ0E7QUFD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X29kby5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL29kby9pbmRleC5qc1wiKTtcbiIsIi8vIFRoaXMgZmlsZSBuZWVkcyBnb29kIGJyb3dzZXIgc3VwcG9ydCBiZWNhdXNlIGl0J3MgaW5jbHVkZWQgb24gZXZlcnlvbmUncyB3ZWJzaXRlcy5cbi8vIEl0J3MgYWxzbyBub3QgYmFiZWxlZCBtZWFuaW5nIGNvbnN0LCBsZXQsIGFzeW5jIGF3YWl0IGFuZCBvdGhlciBtb2Rlcm4gZmVhdHVyZXMgZG9uJ3Qgd29yayB0aGF0IHdlbGxcbi8vIGNoZWNrIGNhbml1c2UgYmVmb3JlIHVzaW5nIGFueXRoaW5nIHRvbyBjcmF6eS5cblxudmFyIGlzTW9iaWxlID0gZmFsc2U7XG4vLyBNb2JpbGUgZGV0ZWN0aW9uIGZvciByZXNpemluZy5cbmlmIChcbiAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXBhZHxpcmlzfGtpbmRsZXxBbmRyb2lkfFNpbGt8bGdlIHxtYWVtb3xtaWRwfG1tcHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyAoY2V8cGhvbmUpfHhkYXx4aWluby9pLnRlc3QoXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnRcbiAgICApIHx8XG4gICAgLzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChcbiAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5zdWJzdHIoMCwgNClcbiAgICApXG4pIHtcbiAgICBpc01vYmlsZSA9IHRydWU7XG59XG52YXIgd2FmZmxlYmFySGVpZ2h0ID0gMzg7XG52YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIik7XG5jb250YWluZXIuc3R5bGUud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCArIFwicHhcIjtcbmNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB3YWZmbGViYXJIZWlnaHQgKyBcInB4XCI7XG5cbnZhciB1cmwgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xudmFyIHNwYWNlSWQgPSB1cmwuZ2V0KFwiaWRcIik7XG52YXIgZnVsbHBhZ2UgPSB1cmwuZ2V0KFwiZnVsbHBhZ2VcIik7XG52YXIgYXNwZWN0ID0gdXJsLmdldChcImFzcGVjdFwiKSB8fCBcImNlbGxhc3BlY3RcIjtcbnZhciBoaWRlV2FmZmxlQmFyID0gdXJsLmdldChcImRpc2FibGVCYXJcIikgfHwgZmFsc2U7XG52YXIgbGFzdFZhbHVlO1xudmFyIGxhc3RTcGFjZTtcbnZhciBzb2NrZXRzO1xuXG5mdW5jdGlvbiBkcmF3KHZhbHVlLCBzcGFjZSwgb3B0aW9ucykge1xuICAgIGlmIChcbiAgICAgICAgbGFzdFNwYWNlICYmXG4gICAgICAgIGxhc3RTcGFjZS50eXBlID09PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbiAmJlxuICAgICAgICBzcGFjZS50eXBlID09PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbiAmJlxuICAgICAgICBsYXN0VmFsdWUgPT09IHZhbHVlICYmXG4gICAgICAgIGxhc3RTcGFjZS5sYXllcnMubGVuZ3RoID09PSBzcGFjZS5sYXllcnMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAgIC8vIERvbid0IHJlZHJhdyB2aXp6aWVzIHRoYXQgYXJlIHRoZSBzYW1lXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgIGlmIChzb2NrZXRzKSB7XG4gICAgICAgIHNvY2tldHMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoc3BhY2UubGF5ZXJzICYmIHNwYWNlLmxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNvY2tldHMgPSBUQkMucmVuZGVyTGF5ZXJzVG9FbGVtZW50KHNwYWNlLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoc3BhY2UudHlwZSA9PT0gVEJDLnR5cGVzLnZpc3VhbGlzYXRpb24pIHtcbiAgICAgICAgVEJDLnJlbmRlclZpc3VhbGlzYXRpb25Ub0VsZW1lbnQoc3BhY2UsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChzcGFjZS52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBEb24ndCByZW5kZXIgZW1wdHkgc3BhY2VzLiBWaXN1YWxpemF0aW9ucyBkb24ndCBoYXZlIGEgdmFsdWUgZG9oLlxuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVEJDLnJlbmRlckNlbGxUb0VsZW1lbnQoc3BhY2UsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJDb250YWluZXIgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICBjb25zdCBjb250YWluZXJCb3ggPSBpbm5lckNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIEZ1ZGdlIDEwJSBzdHJldGNoIG1vZGUuXG4gICAgLy8gSWYgdGhlIGNvbnRhaW5lciBpcyB3aXRoaW4gMTAlIG9mIHRoZSBjb250YWluZXIgc3RyZXRjaCBpdCBzbyB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgYm9yZGVycyBhcm91bmQgaXQuXG4gICAgaWYgKFxuICAgICAgICBjb250YWluZXJCb3gud2lkdGggKyBjb250YWluZXJCb3gud2lkdGggKiAwLjEgPj0gd2luZG93LmlubmVyV2lkdGggJiZcbiAgICAgICAgY29udGFpbmVyQm94LmhlaWdodCArIGNvbnRhaW5lckJveC5oZWlnaHQgKiAwLjEgPj0gd2luZG93LmlubmVySGVpZ2h0ICYmXG4gICAgICAgICFvcHRpb25zICYmXG4gICAgICAgIGZ1bGxwYWdlID09PSBcInRydWVcIlxuICAgICkge1xuICAgICAgICBkcmF3KHZhbHVlLCBzcGFjZSwgeyBmaXQ6IFwic3RyZXRjaFwiIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlV2FmZmxlQmFyKHNwYWNlLCB1c2VyKSB7XG4gICAgaWYgKCFzcGFjZSkge1xuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlciBjYWxsYmFjayBjb21lcyBiYWNrIGZpcnN0LlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJTcGFjZUxpbmtcIikuaHJlZiA9IFRCQy5nZXRXZWJWaWV3TGluayhzcGFjZSk7XG5cbiAgICBpZiAodXNlciAmJiB1c2VyLnByb2ZpbGVQaWN0dXJlKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICAgXCJQcm9maWxlUGljdHVyZVwiXG4gICAgICAgICkuc3JjID0gVEJDLmdldFByb2ZpbGVQaWN0dXJlVXJsKHVzZXIpO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiUHJvZmlsZVBpY3R1cmVMaW5rXCIpLmhyZWYgPSBUQkMuZ2V0VXNlclByb2ZpbGVVcmwoXG4gICAgICAgIHVzZXJcbiAgICApO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJMaW5rVGV4dFwiKS52YWx1ZSA9IFRCQy5nZXRXZWJWaWV3TGluayhzcGFjZSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkVtYmVkXCIpLmhyZWYgPSBUQkMuZ2V0V2ViVmlld0xpbmsoc3BhY2UpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV2VibGlua1wiKS5ocmVmID0gVEJDLmdldFdlYlZpZXdMaW5rKHNwYWNlKTtcblxuICAgIGlmICghc3BhY2UubmFtZSB8fCBzcGFjZS5uYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiU3BhY2VOYW1lXCIpLmlubmVyVGV4dCA9IFwiVW50aXRsZWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIlNwYWNlTmFtZVwiKS5pbm5lclRleHQgPSBzcGFjZS5uYW1lO1xuICAgIH1cbn1cblxubGV0IHVzZXIgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNydW5jaCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgZml0OiBhc3BlY3QsIG9kbzogdHJ1ZSB9O1xuICAgIFRCQy5jcnVuY2goXG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgICh2YWx1ZSwgc3BhY2UpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVdhZmZsZUJhcihzcGFjZSwgdXNlcik7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXJyb3JcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgZHJhdyh2YWx1ZSwgc3BhY2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBsYXN0U3BhY2UgPSBzcGFjZTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlcnJvclwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9LFxuICAgICAgICB1c2VyID0+IHtcbiAgICAgICAgICAgIHVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgdXBkYXRlV2FmZmxlQmFyKGxhc3RTcGFjZSwgdXNlcik7XG4gICAgICAgIH1cbiAgICApO1xufVxuXG4vLyBPbmx5IHJlc2l6ZSBvbiBtb2JpbGUuXG4vLyBTSU1PTiBIQUNLRUQgVEhJUyEgWFhYXG4vL2lmICghaXNNb2JpbGUpIHtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvcHRpb25zID0geyBmaXQ6IGFzcGVjdCB9O1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgXCJweFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB3YWZmbGViYXJIZWlnaHQgKyBcInB4XCI7XG5cbiAgICAvLyBOZWVkIHRvIG1haW50YWluIGFzcGVjdCByYXRpbyBoZXJlLlxuXG4gICAgaWYgKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiaWZyYW1lXCIpID09PSBudWxsKSB7XG4gICAgICAgIGRyYXcobGFzdFZhbHVlLCBsYXN0U3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbn0pO1xuLy99XG5cbldlYkZvbnQubG9hZCh7XG4gICAgZ29vZ2xlOiB7XG4gICAgICAgIGZhbWlsaWVzOiBbXG4gICAgICAgICAgICBcIlNsYWJvXCIsXG4gICAgICAgICAgICBcIkluZGllIEZsb3dlclwiLFxuICAgICAgICAgICAgXCJJbmNvbnNvbGF0YVwiLFxuICAgICAgICAgICAgXCJNYWNvbmRvXCIsXG4gICAgICAgICAgICBcIk1vbm90b25cIixcbiAgICAgICAgICAgIFwiUm9ib3RvIFNsYWJcIixcbiAgICAgICAgICAgIFwiUm9ib3RvXCJcbiAgICAgICAgXVxuICAgIH0sXG4gICAgYWN0aXZlOiAoKSA9PiB7XG4gICAgICAgIHZhciBvcHRpb25zID0geyBmaXQ6IGFzcGVjdCB9O1xuICAgICAgICAvLyBWaXp6aWVzIGRvbid0IG5lZWQgdG8gcmVkcmF3IHdoZW4gZm9udHMgYXJlIGxvYWRlZCBiZWNhdXNlIHRoZXkncmUgaW4gYW4gaWZyYW1lLlxuICAgICAgICBpZiAobGFzdFNwYWNlICYmIGxhc3RTcGFjZS50eXBlICE9PSBUQkMudHlwZXMudmlzdWFsaXNhdGlvbilcbiAgICAgICAgICAgIGRyYXcobGFzdFZhbHVlLCBsYXN0U3BhY2UsIG9wdGlvbnMpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBhbmFseXRpY3MoKSB7XG4gICAgY29uc3QgZG50ID1cbiAgICAgICAgbmF2aWdhdG9yLmRvTm90VHJhY2sgfHwgd2luZG93LmRvTm90VHJhY2sgfHwgbmF2aWdhdG9yLm1zRG9Ob3RUcmFjaztcbiAgICBpZiAoZG50ICE9IFwiMVwiICYmIGRudCAhPSBcInllc1wiKSB7XG4gICAgICAgIChmdW5jdGlvbihpLCBzLCBvLCBnLCByLCBhLCBtKSB7XG4gICAgICAgICAgICBpW1wiR29vZ2xlQW5hbHl0aWNzT2JqZWN0XCJdID0gcjtcbiAgICAgICAgICAgIChpW3JdID1cbiAgICAgICAgICAgICAgICBpW3JdIHx8XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIChpW3JdLnEgPSBpW3JdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAoaVtyXS5sID0gMSAqIG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgKGEgPSBzLmNyZWF0ZUVsZW1lbnQobykpLCAobSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF0pO1xuICAgICAgICAgICAgYS5hc3luYyA9IDE7XG4gICAgICAgICAgICBhLnNyYyA9IGc7XG4gICAgICAgICAgICBtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pO1xuICAgICAgICB9KShcbiAgICAgICAgICAgIHdpbmRvdyxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgXCJzY3JpcHRcIixcbiAgICAgICAgICAgIFwiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzXCIsXG4gICAgICAgICAgICBcImdhXCJcbiAgICAgICAgKTtcblxuICAgICAgICBnYShcImNyZWF0ZVwiLCBDT05GSUcuZ2FDb2RlLCBcImF1dG9cIik7XG4gICAgICAgIGdhKFwic2VuZFwiLCBcInBhZ2V2aWV3XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICBcIlJlc3BlY3RpbmcgRG8tTm90LVRyYWNrLCBub3QgbG9hZGluZyBhbmFseXRpY3MuIFNlZSBodHRwczovL2JpZ2NydW5jaC5pby9nb29nbGUtYW5hbHl0aWNzLWRudC9cIlxuICAgICAgICApO1xuICAgIH1cbn1cblxuLy8gRGlzcGxheSBzb21ldGhpbmcgd2hpbGUgZm9udHMgYXJlIGxvYWRpbmcuXG5jcnVuY2goKTtcblxuYW5hbHl0aWNzKCk7XG5cbmZ1bmN0aW9uIGNvcHlUZXh0KGlkLCBidXR0b25JZCkge1xuICAgIGNvbnN0IHByZXZpb3VzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbklkKS50ZXh0Q29udGVudDtcbiAgICBjb25zdCB0ZXh0VG9Db3B5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIHRleHRUb0NvcHkuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uSWQpLnRleHRDb250ZW50ID0gXCJDb3BpZWRcIjtcblxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25JZCkudGV4dENvbnRlbnQgPSBwcmV2aW91c1RleHQ7XG4gICAgfSwgMTAwMCk7XG59XG5cbihmdW5jdGlvbiBvbkxvYWQoKSB7XG4gICAgaWYgKCFoaWRlV2FmZmxlQmFyKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV2FmZmxlQmFyXCIpLnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiYm9keS1ib3JkZXJcIik7XG4gICAgfVxuXG4gICAgZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRCeUlkKFwiU2hhcmVCdXR0b25cIilcbiAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiU2hhcmVNb2RhbFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZChcImNvbnRhaW5lclwiKVxuICAgICAgICAgICAgICAgIC5jbGFzc0xpc3QuYWRkKFwiYmx1ci1jb250YWluZXJcIik7XG4gICAgICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJNb2RhbENsb3NlXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJTaGFyZU1vZGFsXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250YWluZXJcIikuY2xhc3NMaXN0LnJlbW92ZShcImJsdXItY29udGFpbmVyXCIpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDb3B5TGlua1RleHRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgY29weVRleHQoXCJMaW5rVGV4dFwiLCBcIkNvcHlMaW5rVGV4dFwiKTtcbiAgICB9KTtcblxuICAgIC8vIFNvY2lhbCBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJGYWNlYm9va1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5vcGVuKFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSR7VEJDLmdldFdlYlZpZXdMaW5rKFxuICAgICAgICAgICAgICAgIGxhc3RTcGFjZVxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0PTQwMCx3aWR0aD01NTAsY2VudGVyc2NyZWVuPXllc1wiXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkxpbmtlZEluXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oXG4gICAgICAgICAgICBgaHR0cHM6Ly9saW5rZWRpbi5jb20vc2hhcmVBcnRpY2xlP3VybD0ke1RCQy5nZXRXZWJWaWV3TGluayhcbiAgICAgICAgICAgICAgICBsYXN0U3BhY2VcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBcImhlaWdodD01MDAsd2lkdGg9NTAwLGNlbnRlcnNjcmVlbj15ZXNcIlxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJUd2l0dGVyXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oXG4gICAgICAgICAgICBgaHR0cHM6Ly90d2l0dGVyLmNvbS9zaGFyZT91cmw9JHtUQkMuZ2V0V2ViVmlld0xpbmsobGFzdFNwYWNlKX1gLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0PTUwMCx3aWR0aD01MDAsY2VudGVyc2NyZWVuPXllc1wiXG4gICAgICAgICk7XG4gICAgfSk7XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==