diff --git a/games/media/js/undum.js b/games/media/js/undum.js index 08dd2f7..643e18d 100644 --- a/games/media/js/undum.js +++ b/games/media/js/undum.js @@ -1410,8 +1410,8 @@ var startOutputTransaction = function() { } // The default is "all the way down". scrollStack.push( - $("#content").height() + $("#title").height() + 60 - ); + document.getElementById("content").offsetHeight + document.getElementById("title").offsetHeight + 60 + ); }; var continueOutputTransaction = function() { if (pendingFirstWrite) { @@ -1462,7 +1462,7 @@ var processLink = function(code) { endOutputTransaction(); // We're able to save, if we weren't already. - $("#save").attr('disabled', false); + document.getElementById("save").setAttribute('disabled', false); }; /* This gets called to actually do the work of processing a code. @@ -1512,13 +1512,21 @@ var processOneLink = function(code) { } }; +/* This function listens on content block to filter out link clicks. */ +var linkClickHandler = function(event) { + if (event.target.tagName.toLowerCase() === 'a') { + event.preventDefault(); + processClick(event.target.href); + } +} + /* This gets called when the user clicks a link to carry out an * action. */ var processClick = function(code) { var now = (new Date()).getTime() * 0.001; system.time = now - startTime; progress.sequence.push({link:code, when:system.time}); - processLink(code); + return processLink(code); }; /* Transitions between situations. */ @@ -2076,6 +2084,9 @@ ready(function() { startGame(); } + // handle the link clicks + document.getElementById("content").addEventListener("click", linkClickHandler, false); + // Display the "click to begin" message. (We do this in code // so that, if Javascript is off, it doesn't happen.) showBlock("click_message"); @@ -2109,4 +2120,4 @@ ready(function() { */ }); })(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImludGVybmFsLmpzIiwiYXV0aG9yLmpzIiwic3lzdGVtLmpzIiwicHJpdmF0ZS5qcyIsInNldHVwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbmVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4MUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoidW5kdW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJuYWwgSW5mcmFzdHJ1Y3R1cmUgSW1wbGVtZW50YXRpb25zIFtOQjogVGhlc2UgaGF2ZSB0byBiZVxuLy8gYXQgdGhlIHRvcCwgYmVjYXVzZSB3ZSB1c2UgdGhlbSBiZWxvdywgYnV0IHlvdSBjYW4gc2FmZWx5XG4vLyBpZ25vcmUgdGhlbSBhbmQgc2tpcCBkb3duIHRvIHRoZSBuZXh0IHNlY3Rpb24uXVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyogQ3JvY2tmb3JkJ3MgaW5oZXJpdCBmdW5jdGlvbiAqL1xuRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzID0gZnVuY3Rpb24oUGFyZW50KSB7XG4gIHZhciBkID0ge30sIHAgPSAodGhpcy5wcm90b3R5cGUgPSBuZXcgUGFyZW50KCkpO1xuICB0aGlzLnByb3RvdHlwZS51YmVyID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gZCkpIGRbbmFtZV0gPSAwO1xuICAgIHZhciBmLCByLCB0ID0gZFtuYW1lXSwgdiA9IFBhcmVudC5wcm90b3R5cGU7XG4gICAgaWYgKHQpIHtcbiAgICAgIHdoaWxlICh0KSB7XG4gICAgICAgIHYgPSB2LmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICAgICAgdCAtPSAxO1xuICAgICAgfVxuICAgICAgZiA9IHZbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGYgPSBwW25hbWVdO1xuICAgICAgaWYgKGYgPT0gdGhpc1tuYW1lXSkge1xuICAgICAgICBmID0gdltuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZFtuYW1lXSArPSAxO1xuICAgIHIgPSBmLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMsIFsxXSkpO1xuICAgIGRbbmFtZV0gLT0gMTtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBGZWF0dXJlIGRldGVjdGlvblxuXG52YXIgaGFzTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBoYXNTdG9yYWdlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzU3RvcmFnZSA9ICgnbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpICYmXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSBudWxsICYmXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIC8vIEZpcmVmb3ggd2l0aCB0aGUgXCJBbHdheXMgQXNrXCIgY29va2llIGFjY2VwdCBzZXR0aW5nXG4gICAgLy8gd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGxvY2FsU3RvcmFnZVxuICAgIGhhc1N0b3JhZ2UgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gaGFzU3RvcmFnZTtcbn07XG5cbi8vLyBBbmltYXRpb25zIC0geW91IGNhbiB0b3RhbGx5IHJlZGVmaW5lIHRoZXNlISBGYWRlIGluIGFuZCBmYWRlIG91dCBieSBkZWZhdWx0LlxuLy8vIEBwYXJhbSBpZCBzdHJpbmcgb3Igb2JqZWN0XG52YXIgc2hvd0Jsb2NrID0gZnVuY3Rpb24oaWQpIHtcbiAgdmFyIGJsb2NrID0gaWQ7XG4gIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIH1cbiAgYmxvY2suY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICBibG9jay5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gIGJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG52YXIgaGlkZUJsb2NrID0gZnVuY3Rpb24oaWQpIHtcbiAgdmFyIGJsb2NrID0gaWQ7IC8vIHR5cGVvZiBibG9jayA9PT0gXCJlbGVtZW50XCJcbiAgaWYgKHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhciBibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfVxuICBpZiAodHlwZW9mIGlkID09PSBcIm9iamVjdFwiKSB7IC8vIHByb2JhYmx5IE5vZGVMaXN0XG4gICAgaWYgKGlkLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaWQsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIGJsb2NrLmNsYXNzTGlzdCA9PT0gXCJ1bmRlZmluZWRcIilcbiAge1xuICAgIGNvbnNvbGUubG9nKFwiVHJpZWQgdG8gaGlkZSBhbiB1bmRlZmluZWQgYmxvY2suXCIpO1xuICAgIGNvbnNvbGUubG9nKGlkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYmxvY2suY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICBibG9jay5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG59XG5cbi8vIEFzc2VydGlvblxuXG52YXIgQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9IEFzc2VydGlvbkVycm9yO1xufTtcbkFzc2VydGlvbkVycm9yLmluaGVyaXRzKEVycm9yKTtcblxudmFyIGFzc2VydCA9IGZ1bmN0aW9uKGV4cHJlc3Npb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpO1xuICB9XG59O1xuXG4vLyBPYmplY3QgZXh0ZW50aW9uXG52YXIgZXh0ZW5kID0gZnVuY3Rpb24ob3V0KSB7XG4gIG91dCA9IG91dCB8fCB7fTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2ldO1xuXG4gICAgaWYgKCFvYmopXG4gICAgICBjb250aW51ZTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JylcbiAgICAgICAgICBleHRlbmQob3V0W2tleV0sIG9ialtrZXldKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dFtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dDtcbn07XG4iLCIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHlwZXMgZm9yIEF1dGhvciBVc2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qIFRoZSBnYW1lIGlzIHNwbGl0IGludG8gc2l0dWF0aW9ucywgd2hpY2ggcmVzcG9uZCB0byB1c2VyXG4gKiBjaG9pY2VzLiBTaXR1YXRpb24gaXMgdGhlIGJhc2UgdHlwZS4gSXQgaGFzIHRocmVlIG1ldGhvZHM6XG4gKiBlbnRlciwgYWN0IGFuZCBleGl0LCB3aGljaCB5b3UgaW1wbGVtZW50IHRvIHBlcmZvcm0gYW55XG4gKiBwcm9jZXNzaW5nIGFuZCBvdXRwdXQgYW55IGNvbnRlbnQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uc1xuICogZG8gbm90aGluZy5cbiAqXG4gKiBZb3UgY2FuIGVpdGhlciBjcmVhdGUgeW91ciBvd24gdHlwZSBvZiBTaXR1YXRpb24sIGFuZCBhZGRcbiAqIGVudGVyLCBhY3QgYW5kL29yIGV4aXQgZnVuY3Rpb25zIHRvIHRoZSBwcm90b3R5cGUgKHNlZVxuICogU2ltcGxlU2l0dWF0aW9uIGluIHRoaXMgZmlsZSBmb3IgYW4gZXhhbXBsZSBvZiB0aGF0KSwgb3IgeW91XG4gKiBjYW4gZ2l2ZSB0aG9zZSBmdW5jdGlvbnMgaW4gdGhlIG9wdHMgcGFyYW1ldGVyLiBUaGUgb3B0c1xuICogcGFyYW1ldGVyIGlzIGFuIG9iamVjdC4gU28geW91IGNvdWxkIHdyaXRlOlxuICpcbiAqICAgIHZhciBzaXR1YXRpb24gPSBTaXR1YXRpb24oe1xuICogICAgICAgIGVudGVyOiBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgZnJvbSkge1xuICogICAgICAgICAgICAuLi4geW91ciBpbXBsZW1lbnRhdGlvbiAuLi5cbiAqICAgICAgICB9XG4gKiAgICB9KTtcbiAqXG4gKiBJZiB5b3UgcGFzcyBpbiBlbnRlciwgYWN0IGFuZC9vciBleGl0IHRocm91Z2ggdGhlc2Ugb3B0aW9ucyxcbiAqIHRoZW4gdGhleSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBzaWduYXR1cmUgYXMgdGhlIGZ1bGxcbiAqIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBiZWxvdy5cbiAqXG4gKiBOb3RlIHRoYXQgU2ltcGxlU2l0dWF0aW9uLCBhIGRlcml2ZWQgdHlwZSBvZiBTaXR1YXRpb24sIGNhbGxzXG4gKiBwYXNzZWQgaW4gZW50ZXIsIGFjdCBhbmQgZXhpdCBmdW5jdGlvbnMgQVMgV0VMTCBBUyB0aGVpciBub3JtYWxcbiAqIGFjdGlvbi4gVGhpcyBpcyBtb3N0IG9mdGVuIHdoYXQgeW91IHdhbnQ6IHRoZSBub3JtYWwgYmVoYXZpb3JcbiAqIHBsdXMgYSBsaXR0bGUgZXh0cmEgY3VzdG9tIGJlaGF2aW9yLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZVxuICogdGhlIGJlaGF2aW9yIG9mIGEgU2ltcGxlU2l0dWF0aW9uLCB5b3UnbGwgaGF2ZSB0byBjcmVhdGUgYVxuICogZGVyaXZlZCB0eXBlIGFuZCBzZXQgdGhlIGVudGVyLCBhY3QgYW5kL29yIGV4aXQgZnVuY3Rpb24gb25cbiAqIHRoZWlyIHByb3RvdHlwZXMuIEluIG1vc3QgY2FzZXMsIGhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIGRvXG4gKiBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQsIGl0IGlzIGJldHRlciB0byBkZXJpdmUgeW91clxuICogdHlwZSBmcm9tIHRoaXMgdHlwZTogU2l0dWF0aW9uLCByYXRoZXIgdGhhbiBvbmUgb2YgaXRzXG4gKiBjaGlsZHJlbi5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBlbnRlciwgZXhpdCBhbmQgYWN0LCB0aGUgZm9sbG93aW5nIG9wdGlvbnNcbiAqIHJlbGF0ZWQgdG8gaW1wbGljaXQgc2l0dWF0aW9uIHNlbGVjdGlvbiBhcmUgYXZhaWxhYmxlOlxuICpcbiAqIG9wdGlvblRleHQ6IGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sXG4gKiAgICAgc2l0dWF0aW9uKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZSBsYWJlbCB0byBwdXQgaW4gYW5cbiAqICAgICBvcHRpb24gYmxvY2sgd2hlcmUgYSBsaW5rIHRvIHRoaXMgc2l0dWF0aW9uIGNhbiBiZVxuICogICAgIGNob3Nlbi4gVGhlIHNpdHVhdGlvbiBwYXNzZWQgaW4gaXMgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGVcbiAqICAgICBvcHRpb24gYmxvY2sgaXMgYmVpbmcgZGlzcGxheWVkLlxuICpcbiAqIGNhblZpZXc6IGEgZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikgd2hpY2ggc2hvdWxkXG4gKiAgICAgcmV0dXJuIHRydWUgaWYgdGhpcyBzaXR1YXRpb24gc2hvdWxkIGJlIHZpc2libGUgaW4gYW5cbiAqICAgICBvcHRpb24gYmxvY2sgaW4gdGhlIGdpdmVuIHNpdHVhdGlvbi5cbiAqXG4gKiBjYW5DaG9vc2U6IGEgZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikgd2hpY2ggc2hvdWxkXG4gKiAgICAgcmV0dXJuIHRydWUgaWYgdGhpcyBzaXR1YXRpb24gc2hvdWxkIGFwcGVhciBjbGlja2FibGUgaW4gYW5cbiAqICAgICBvcHRpb24gYmxvY2suIFJldHVybmluZyBmYWxzZSBhbGxvd3MgeW91IHRvIHByZXNlbnQgdGhlXG4gKiAgICAgb3B0aW9uIGJ1dCBwcmV2ZW50IGl0IGJlaW5nIHNlbGVjdGVkLiBZb3UgbWF5IHdhbnQgdG9cbiAqICAgICBpbmRpY2F0ZSB0byB0aGUgcGxheWVyIHRoYXQgdGhleSBuZWVkIHRvIGNvbGxlY3Qgc29tZVxuICogICAgIGltcG9ydGFudCBvYmplY3QgYmVmb3JlIHRoZSBvcHRpb24gaXMgYXZhaWxhYmxlLCBmb3JcbiAqICAgICBleGFtcGxlLlxuICpcbiAqIHRhZ3M6IGEgbGlzdCBvZiB0YWdzIGZvciB0aGlzIHNpdHVhdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yXG4gKiAgICAgaW1wbGljaXQgc2l0dWF0aW9uIHNlbGVjdGlvbi4gVGhlIHRhZ3MgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAqICAgICBzcGFjZSwgdGFiIG9yIGNvbW1hIHNlcGFyYXRlZCB0YWdzIGluIGEgc3RyaW5nLiBOb3RlIHRoYXQsXG4gKiAgICAgd2hlbiBjYWxsaW5nIGBnZXRTaXR1YXRpb25JZENob2ljZXNgLCB0YWdzIGFyZSBwcmVmaXhlZCB3aXRoXG4gKiAgICAgYSBoYXNoLCBidXQgdGhhdCBzaG91bGQgbm90IGJlIHRoZSBjYXNlIGhlcmUuIEp1c3QgdXNlIHRoZVxuICogICAgIHBsYWluIHRhZyBuYW1lLlxuICpcbiAqIHByaW9yaXR5OiBhIG51bWVyaWMgcHJpb3JpdHkgdmFsdWUgKGRlZmF1bHQgPSAxKS4gV2hlblxuICogICAgIHNlbGVjdGluZyBzaXR1YXRpb25zIGltcGxpY2l0bHksIGhpZ2hlciBwcmlvcml0eSBzaXR1YXRpb25zXG4gKiAgICAgYXJlIGNvbnNpZGVyZWQgZmlyc3QuXG4gKlxuICogZnJlcXVlbmN5OiBhIG51bWVyaWMgcmVsYXRpdmUgZnJlcXVlbmN5IChkZWZhdWx0ID0gMSksIHNvIDEwMFxuICogICAgIHdvdWxkIGJlIDEwMCB0aW1lcyBtb3JlIGZyZXF1ZW50LiBXaGVuIHRoZXJlIGFyZSBtb3JlXG4gKiAgICAgb3B0aW9ucyB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQsIHNpdHVhdGlvbnMgd2lsbCBiZSBzZWxlY3RlZFxuICogICAgIHJhbmRvbWx5IGJhc2VkIG9uIHRoZWlyIGZyZXF1ZW5jeS5cbiAqXG4gKiBkaXNwbGF5T3JkZXI6IGEgbnVtZXJpYyBvcmRlcmluZyB2YWx1ZSAoZGVmYXVsdCA9IDEpLiBXaGVuXG4qICAgICBzaXR1YXRpb25zIGFyZSBzZWxlY3RlZCBpbXBsaWNpdGx5LCB0aGUgcmVzdWx0cyBhcmUgb3JkZXJlZFxuKiAgICAgYnkgaW5jcmVhc2luZyBkaXNwbGF5T3JkZXIuXG4qL1xudmFyIFNpdHVhdGlvbiA9IGZ1bmN0aW9uKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBpZiAob3B0cy5lbnRlcikgdGhpcy5fZW50ZXIgPSBvcHRzLmVudGVyO1xuICAgIGlmIChvcHRzLmFjdCkgdGhpcy5fYWN0ID0gb3B0cy5hY3Q7XG4gICAgaWYgKG9wdHMuZXhpdCkgdGhpcy5fZXhpdCA9IG9wdHMuZXhpdDtcblxuICAgIC8vIE9wdGlvbnMgcmVsYXRlZCB0byB0aGlzIHNpdHVhdGlvbiBiZWluZyBhdXRvbWF0aWNhbGx5XG4gICAgLy8gc2VsZWN0ZWQgYW5kIGRpc3BsYXllZCBpbiBhIGxpc3Qgb2Ygb3B0aW9ucy5cbiAgICB0aGlzLl9vcHRpb25UZXh0ID0gb3B0cy5vcHRpb25UZXh0O1xuICAgIHRoaXMuX2NhblZpZXcgPSBvcHRzLmNhblZpZXcgfHwgdHJ1ZTtcbiAgICB0aGlzLl9jYW5DaG9vc2UgPSBvcHRzLmNhbkNob29zZSB8fCB0cnVlO1xuICAgIHRoaXMuX3ByaW9yaXR5ID0gKG9wdHMucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkgPyBvcHRzLnByaW9yaXR5IDogMTtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPVxuICAgICAgKG9wdHMuZnJlcXVlbmN5ICE9PSB1bmRlZmluZWQpID8gb3B0cy5mcmVxdWVuY3kgOiAxO1xuICAgIHRoaXMuX2Rpc3BsYXlPcmRlciA9XG4gICAgICAob3B0cy5kaXNwbGF5T3JkZXIgIT09IHVuZGVmaW5lZCkgPyBvcHRzLmRpc3BsYXlPcmRlciA6IDE7XG5cbiAgICAvLyBUYWcgYXJlIG5vdCBzdG9yZWQgd2l0aCBhbiB1bmRlcnNjb3JlLCBiZWNhdXNlIHRoZXkgYXJlXG4gICAgLy8gYWNjZXNzZWQgZGlyZWN0eS4gVGhleSBzaG91bGQgbm90IGJlIGNvbnRleHQgc2Vuc2l0aXZlXG4gICAgLy8gKHVzZSB0aGUgY2FuVmlldyBmdW5jdGlvbiB0byBkbyBjb250ZXh0IHNlbnNpdGl2ZVxuICAgIC8vIG1hbmlwdWxhdGlvbikuXG4gICAgaWYgKG9wdHMudGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzLnRhZ3MpKSB7XG4gICAgICAgIHRoaXMudGFncyA9IG9wdHMudGFncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFncyA9IG9wdHMudGFncy5zcGxpdCgvWyBcXHQsXSsvKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWdzID0gW107XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX2NhblZpZXcgPSB0cnVlO1xuICAgIHRoaXMuX2NhbkNob29zZSA9IHRydWU7XG4gICAgdGhpcy5fcHJpb3JpdHkgPSAxO1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IDE7XG4gICAgdGhpcy5fZGlzcGxheU9yZGVyID0gMTtcbiAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgfVxufTtcbi8qIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhY3Rpb24gd2hlbiB3ZSBlbnRlciBhIHNpdHVhdGlvbi4gVGhlXG4gKiBsYXN0IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHNpdHVhdGlvbiB3ZSBoYXZlIGp1c3QgbGVmdDogaXRcbiAqIG1heSBiZSBudWxsIGlmIHRoaXMgaXMgdGhlIHN0YXJ0aW5nIHNpdHVhdGlvbi4gVW5saWtlIHRoZVxuICogZXhpdCgpIG1ldGhvZCwgdGhpcyBtZXRob2QgY2Fubm90IHByZXZlbnQgdGhlIHRyYW5zaXRpb25cbiAqIGhhcHBlbmluZzogaXRzIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiAqL1xuU2l0dWF0aW9uLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBmcm9tKSB7XG4gIGlmICh0aGlzLl9lbnRlcikgdGhpcy5fZW50ZXIoY2hhcmFjdGVyLCBzeXN0ZW0sIGZyb20pO1xufTtcbi8qIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhY3Rpb24gd2hlbiB3ZSBjYXJyeSBvdXQgc29tZSBhY3Rpb24gaW4gYVxuICogc2l0dWF0aW9uIHRoYXQgaXNuJ3QgaW50ZW5kZWQgdG8gbGVhZCB0byBhIG5ldyBzaXR1YXRpb24uICovXG5TaXR1YXRpb24ucHJvdG90eXBlLmFjdCA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pIHtcbiAgaWYgKHRoaXMuX2FjdCkgdGhpcy5fYWN0KGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pO1xufTtcbi8qIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhY3Rpb24gd2hlbiB3ZSBleGl0IGEgc2l0dWF0aW9uLiBUaGUgbGFzdFxuICogcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgc2l0dWF0aW9uIHdlIGFyZSBnb2luZyB0by4gKi9cblNpdHVhdGlvbi5wcm90b3R5cGUuZXhpdCA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCB0bykge1xuICBpZiAodGhpcy5fZXhpdCkgdGhpcy5fZXhpdChjaGFyYWN0ZXIsIHN5c3RlbSwgdG8pO1xufTtcbi8qIERldGVybWluZXMgd2hldGhlciB0aGlzIHNpdHVhdGlvbiBzaG91bGQgYmUgY29udGFpbmVkIHdpdGhpbiBhXG4gKiBsaXN0IG9mIG9wdGlvbnMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdpdmVuXG4gKiBzaXR1YXRpb24uICovXG5TaXR1YXRpb24ucHJvdG90eXBlLmNhblZpZXcgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0dWF0aW9uKSB7XG4gIGlmICh0eXBlb2YodGhpcy5fY2FuVmlldykgPT09IFwiZnVuY3Rpb25cIiApIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuVmlldyhjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0dWF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuVmlldztcbiAgfVxufTtcbi8qIERldGVybWluZXMgd2hldGhlciB0aGlzIHNpdHVhdGlvbiBzaG91bGQgYmUgY2xpY2thYmxlIHdpdGhpbiBhXG4gKiBsaXN0IG9mIG9wdGlvbnMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdpdmVuIHNpdHVhdGlvbi4gKi9cblNpdHVhdGlvbi5wcm90b3R5cGUuY2FuQ2hvb3NlID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikge1xuICBpZiAodHlwZW9mKHRoaXMuX2NhbkNob29zZSkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB0aGlzLl9jYW5DaG9vc2UoY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkNob29zZTtcbiAgfVxufTtcbi8qIFJldHVybnMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoaXMgc2l0dWF0aW9uXG4gKiBpbiBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBsaXN0IG9mIGNob2ljZXMuICovXG5TaXR1YXRpb24ucHJvdG90eXBlLm9wdGlvblRleHQgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0dWF0aW9uKSB7XG4gIGlmICh0eXBlb2YodGhpcy5fb3B0aW9uVGV4dCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25UZXh0KGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25UZXh0O1xuICB9XG59O1xuLyogUmV0dXJucyB0aGUgcHJpb3JpdHksIGZyZXF1ZW5jeSBhbmQgZGlzcGxheU9yZGVyIGZvciB0aGlzIHNpdHVhdGlvbixcbiAqIHdoZW4gYmVpbmcgc2VsZWN0ZWQgdXNpbmcgYHN5c3RlbS5nZXRTaXR1YXRpb25JZENob2ljZXNgLiAqL1xuU2l0dWF0aW9uLnByb3RvdHlwZS5jaG9pY2VEYXRhID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikge1xuICByZXR1cm4ge1xucHJpb3JpdHk6IHRoaXMuX3ByaW9yaXR5LFxuICAgICAgICAgICAgZnJlcXVlbmN5OiB0aGlzLl9mcmVxdWVuY3ksXG4gICAgICAgICAgICBkaXNwbGF5T3JkZXI6IHRoaXMuX2Rpc3BsYXlPcmRlclxuICB9O1xufTtcblxuLyogQSBzaW1wbGUgc2l0dWF0aW9uIGhhcyBhIGJsb2NrIG9mIGNvbnRlbnQgdGhhdCBpdCBkaXNwbGF5cyB3aGVuXG4gKiB0aGUgc2l0dWF0aW9uIGlzIGVudGVyZWQuIFRoZSBjb250ZW50IG11c3QgYmUgdmFsaWQgXCJEaXNwbGF5XG4gKiBDb250ZW50XCIgKHNlZSBgU3lzdGVtLnByb3RvdHlwZS53cml0ZWAgZm9yIGEgZGVmaW5pdGlvbikuIFRoaXNcbiAqIGNvbnN0cnVjdG9yIGhhcyBvcHRpb25zIHRoYXQgY29udHJvbCBpdHMgYmVoYXZpb3I6XG4gKlxuICogaGVhZGluZzogVGhlIG9wdGlvbmFsIGBoZWFkaW5nYCB3aWxsIGJlIHVzZWQgYXMgYSBzZWN0aW9uIHRpdGxlXG4gKiAgICAgYmVmb3JlIHRoZSBjb250ZW50IGlzIGRpc3BsYXllZC4gVGhlIGhlYWRpbmcgY2FuIGJlIGFueVxuICogICAgIEhUTUwgc3RyaW5nLCBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgXCJEaXNwbGF5IENvbnRlbnRcIi4gSWZcbiAqICAgICB0aGUgaGVhZGluZyBpcyBub3QgZ2l2ZW4sIG5vIGhlYWRpbmcgd2lsbCBiZSBkaXNwbGF5ZWQuIElmXG4gKiAgICAgYSBoZWFkaW5nIGlzIGdpdmVuLCBhbmQgbm8gb3B0aW9uVGV4dCBpcyBzcGVjaWZpZWQgKHNlZVxuICogICAgIGBTaXR1YXRpb25gIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGBvcHRpb25UZXh0YCksIHRoZW4gdGhlXG4gKiAgICAgaGVhZGluZyB3aWxsIGFsc28gYmUgdXNlZCBmb3IgdGhlIHNpdHVhdGlvbidzIG9wdGlvbiB0ZXh0LlxuICpcbiAqIGFjdGlvbnM6IFRoaXMgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGFjdGlvbiBJZHMgdG8gYVxuICogICAgIHJlc3BvbnNlLiBUaGUgcmVzcG9uc2Ugc2hvdWxkIGVpdGhlciBiZSBcIkRpc3BsYXkgQ29udGVudFwiXG4gKiAgICAgdG8gZGlzcGxheSBpZiB0aGlzIGFjdGlvbiBpcyBjYXJyaWVkIG91dCwgb3IgaXQgc2hvdWxkIGJlIGFcbiAqICAgICBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKSB0aGF0IHdpbGwgcHJvY2VzcyB0aGVcbiAqICAgICBhY3Rpb24uXG4gKlxuICogY2hvaWNlczogQSBsaXN0IG9mIHNpdHVhdGlvbiBpZHMgYW5kIHRhZ3MgdGhhdCwgaWYgZ2l2ZW4sIHdpbGxcbiAqICAgICBiZSB1c2VkIHRvIGNvbXBpbGUgYW4gaW1wbGljaXQgb3B0aW9uIGJsb2NrIHVzaW5nXG4gKiAgICAgYGdldFNpdHVhdGlvbklkQ2hvaWNlc2AgKHNlZSB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlIGRldGFpbHNcbiAqICAgICBvZiBob3cgdGhpcyB3b3JrcykuIFRhZ3MgaW4gdGhpcyBsaXN0IHNob3VsZCBiZSBwcmVmaXhlZFxuICogICAgIHdpdGggYSBoYXNoICMgc3ltYm9sLCB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20gc2l0dWF0aW9uXG4gKiAgICAgaWRzLiBJZiBqdXN0IGEgc2luZ2xlIHRhZyBvciBpZCBpcyBuZWVkZWQsIGl0IGNhbiBiZSBwYXNzZWRcbiAqICAgICBpbiBhcyBhIHN0cmluZyB3aXRob3V0IHdyYXBwaW5nIGludG8gYSBsaXN0LlxuICpcbiAqIG1pbkNob2ljZXM6IElmIGBjaG9pY2VzYCBpcyBnaXZlbiwgYW5kIGFuIGltcGxpY2l0IGNob2ljZSBibG9ja1xuICogICAgIHNob3VsZCBiZSBjb21waWxlZCwgc2V0IHRoaXMgb3B0aW9uIHRvIHJlcXVpcmUgYXQgbGVhc3RcbiAqICAgICB0aGlzIG51bWJlciBvZiBvcHRpb25zIHRvIGJlIGRpc3BsYXllZC4gU2VlXG4gKiAgICAgYGdldFNpdHVhdGlvbklkQ2hvaWNlc2AgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBieVxuICogICAgIHdoaWNoIHRoaXMgaGFwcGVucy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBgY2hvaWNlc2BcbiAqICAgICBvcHRpb24sIHRoZW4gdGhpcyBvcHRpb24gd2lsbCBiZSBpZ25vcmVkLlxuICpcbiAqIG1heENob2ljZXM6IElmIGBjaG9pY2VzYCBpcyBnaXZlbiwgYW5kIGFuIGltcGxpY2l0IGNob2ljZSBibG9ja1xuICogICAgIHNob3VsZCBiZSBjb21waWxlZCwgc2V0IHRoaXMgb3B0aW9uIHRvIHJlcXVpcmUgbm8gbW9yZSB0aGFuXG4gKiAgICAgdGhpcyBudW1iZXIgb2Ygb3B0aW9ucyB0byBiZSBkaXNwbGF5ZWQuIFNlZVxuICogICAgIGBnZXRTaXR1YXRpb25JZENob2ljZXNgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG1cbiAqICAgICBieSB3aGljaCB0aGlzIGhhcHBlbnMuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgYGNob2ljZXNgXG4gKiAgICAgb3B0aW9uLCB0aGVuIHRoaXMgb3B0aW9uIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgaW4gdGhlIGBvcHRzYCBwYXJhbWV0ZXIgYXJlIHRoZSBzYW1lIGFzIGZvclxuICogdGhlIGJhc2UgU2l0dWF0aW9uLlxuICovXG52YXIgU2ltcGxlU2l0dWF0aW9uID0gZnVuY3Rpb24oY29udGVudCwgb3B0cykge1xuICBTaXR1YXRpb24uY2FsbCh0aGlzLCBvcHRzKTtcbiAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgdGhpcy5oZWFkaW5nID0gb3B0cyAmJiBvcHRzLmhlYWRpbmc7XG4gIHRoaXMuYWN0aW9ucyA9IG9wdHMgJiYgb3B0cy5hY3Rpb25zO1xuXG4gIHRoaXMuY2hvaWNlcyA9IG9wdHMgJiYgb3B0cy5jaG9pY2VzO1xuICB0aGlzLm1pbkNob2ljZXMgPSBvcHRzICYmIG9wdHMubWluQ2hvaWNlcztcbiAgdGhpcy5tYXhDaG9pY2VzID0gb3B0cyAmJiBvcHRzLm1heENob2ljZXM7XG59O1xuU2ltcGxlU2l0dWF0aW9uLmluaGVyaXRzKFNpdHVhdGlvbik7XG5TaW1wbGVTaXR1YXRpb24ucHJvdG90eXBlLmVudGVyID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIGZyb20pIHtcbiAgaWYgKHRoaXMuaGVhZGluZykge1xuICAgIGlmICh0eXBlb2YodGhpcy5oZWFkaW5nKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBzeXN0ZW0ud3JpdGVIZWFkaW5nKHRoaXMuaGVhZGluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3lzdGVtLndyaXRlSGVhZGluZyh0aGlzLmhlYWRpbmcpO1xuICAgIH1cbiAgfVxuICBpZiAodGhpcy5fZW50ZXIpIHRoaXMuX2VudGVyKGNoYXJhY3Rlciwgc3lzdGVtLCBmcm9tKTtcbiAgaWYgKHRoaXMuY29udGVudCkge1xuICAgIGlmICh0eXBlb2YodGhpcy5jb250ZW50KSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBzeXN0ZW0ud3JpdGUodGhpcy5jb250ZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzeXN0ZW0ud3JpdGUodGhpcy5jb250ZW50KTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuY2hvaWNlcykge1xuICAgIHZhciBjaG9pY2VzID0gc3lzdGVtLmdldFNpdHVhdGlvbklkQ2hvaWNlcyh0aGlzLmNob2ljZXMsXG4gICAgICAgIHRoaXMubWluQ2hvaWNlcyxcbiAgICAgICAgdGhpcy5tYXhDaG9pY2VzKTtcbiAgICBzeXN0ZW0ud3JpdGVDaG9pY2VzKGNob2ljZXMpO1xuICB9XG59O1xuU2ltcGxlU2l0dWF0aW9uLnByb3RvdHlwZS5hY3QgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKSB7XG4gIHZhciByZXNwb25zZSA9IHRoaXMuYWN0aW9uc1thY3Rpb25dO1xuICB0cnkge1xuICAgIHJlc3BvbnNlKGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocmVzcG9uc2UpIHN5c3RlbS53cml0ZShyZXNwb25zZSk7XG4gIH1cbiAgaWYgKHRoaXMuX2FjdCkgdGhpcy5fYWN0KGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pO1xufTtcblNpbXBsZVNpdHVhdGlvbi5wcm90b3R5cGUub3B0aW9uVGV4dCA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXRuKSB7XG4gIHZhciBwYXJlbnRSZXN1bHQgPSBTaXR1YXRpb24ucHJvdG90eXBlLm9wdGlvblRleHQuY2FsbCh0aGlzLCBjaGFyYWN0ZXIsXG4gICAgICBzeXN0ZW0sIHNpdG4pO1xuICBpZiAocGFyZW50UmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkaW5nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJlbnRSZXN1bHQ7XG4gIH1cbn07XG5cbi8qIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGRlZmluZSB0aGUgcXVhbGl0aWVzIHRoYXQgY2hhcmFjdGVyc1xuICogbWF5IHBvc3Nlc3MuIFRoZSB0aXRsZSBzaG91bGQgYmUgYSBzdHJpbmcsIGFuZCBjYW4gY29udGFpblxuICogSFRNTC4gT3B0aW9ucyBhcmUgcGFzc2VkIGluIGluIHRoZSBvcHRzIHBhcmFtZXRlci4gVGhlXG4gKiBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLlxuICpcbiAqIHByaW9yaXR5IC0gQSBzdHJpbmcgdXNlZCB0byBzb3J0IHF1YWxpdGllcyB3aXRoaW4gdGhlaXJcbiAqICAgICBncm91cHMuIFdoZW4gdGhlIHN5c3RlbSBkaXNwbGF5cyBhIGxpc3Qgb2YgcXVhbGl0aWVzIHRoZXlcbiAqICAgICB3aWxsIGJlIHNvcnRlZCBieSB0aGlzIHN0cmluZy4gSWYgeW91IGRvbid0IGdpdmUgYVxuICogICAgIHByaW9yaXR5LCB0aGVuIHRoZSB0aXRsZSB3aWxsIGJlIHVzZWQsIHNvIHlvdSdsbCBnZXRcbiAqICAgICBhbHBoYWJldGljIG9yZGVyLiBOb3JtYWxseSB5b3UgZWl0aGVyIGRvbid0IGdpdmUgYVxuICogICAgIHByaW9yaXR5LCBvciBlbHNlIHVzZSBhIHByaW9yaXR5IHN0cmluZyBjb250YWluaW5nIDAtcGFkZGVkXG4gKiAgICAgbnVtYmVycyAoZS5nLiBcIjAwMDAxXCIpLlxuICpcbiAqIGdyb3VwIC0gVGhlIElkIG9mIGEgZ3JvdXAgaW4gd2hpY2ggdG8gZGlzcGxheSB0aGlzXG4gKiAgICAgcGFyYW1ldGVyLiBUaGUgY29ycmVzcG9uZGluZyBncm91cCBtdXN0IGJlIGRlZmluZWQgaW5cbiAqICAgICB5b3VyIGB1bmR1bS5nYW1lLnF1YWxpdHlHcm91cHNgIHByb3BlcnR5LlxuICpcbiAqIGV4dHJhQ2xhc3NlcyAtIFRoZXNlIGNsYXNzZXMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgPGRpdj4gdGFnXG4gKiAgICAgdGhhdCBzdXJyb3VuZHMgdGhlIHF1YWxpdHkgd2hlbiBpdCBpcyBkaXNwbGF5ZWQuIEEgY29tbW9uXG4gKiAgICAgdXNlIGZvciB0aGlzIGlzIHRvIGFkZCBpY29ucyByZXByZXNlbnRpbmcgdGhlIHF1YWxpdHkuIEluXG4gKiAgICAgeW91ciBDU1MgZGVmaW5lIGEgY2xhc3MgZm9yIGVhY2ggaWNvbiwgdGhlbiBwYXNzIHRob3NlXG4gKiAgICAgY2xhc3NlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBxdWFsaXR5IGRlZmluaXRpb25zLlxuICpcbiAqIE9uZSBrZXkgcHVycG9zZSBvZiBRdWFsaXR5RGVmaW5pdGlvbiBpcyB0byBmb3JtYXQgdGhlIHF1YWxpdHlcbiAqIHZhbHVlIGZvciBkaXNwbGF5LiBRdWFsaXR5IHZhbHVlcyBhcmUgYWx3YXlzIHN0b3JlZCBhcyBudW1lcmljXG4gKiB2YWx1ZXMsIGJ1dCBtYXkgYmUgZGlzcGxheWVkIGluIHdvcmRzIG9yIHN5bWJvbHMuIEEgbnVtYmVyIG9mXG4gKiBzdWItdHlwZXMgb2YgUXVhbGl0eURlZmluaXRpb24gYXJlIGdpdmVuIHRoYXQgZm9ybWF0IHRoZWlyXG4gKiB2YWx1ZXMgaW4gZGlmZmVyZW50IHdheXMuXG4gKi9cbnZhciBRdWFsaXR5RGVmaW5pdGlvbiA9IGZ1bmN0aW9uKHRpdGxlLCBvcHRzKSB7XG4gIHZhciBteU9wdHMgPSBleHRlbmQob3B0cywge1xuICAgIHByaW9yaXR5OiB0aXRsZSxcbiAgICBncm91cDogbnVsbCxcbiAgICBleHRyYUNsYXNzZXM6IG51bGxcbiAgfSk7XG4gIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgdGhpcy5wcmlvcml0eSA9IG15T3B0cy5wcmlvcml0eTtcbiAgdGhpcy5ncm91cCA9IG15T3B0cy5ncm91cDtcbiAgdGhpcy5leHRyYUNsYXNzZXMgPSBteU9wdHMuZXh0cmFDbGFzc2VzO1xufTtcbi8qIEZvcm1hdHMgdGhlIHZhbHVlICh3aGljaCBpcyBhbHdheXMgbnVtZXJpYykgaW50byB0aGUgdmFsdWUgdG9cbiAqIGJlIGRpc3BsYXllZC4gVGhlIHJlc3VsdCBzaG91bGQgYmUgSFRNTCAoYnV0IG5vIHRhZ3MgYXJlXG4gKiBuZWVkZWQpLiBJZiBudWxsIGlzIHJldHVybmVkLCB0aGVuIHRoZSBxdWFsaXR5IGRlZmluaXRpb24gd2lsbFxuICogbm90IGJlIGRpc3BsYXllZCwgc28gaWYgeW91IHdhbnQgYW4gZW1wdHkgdmFsdWUgcmV0dXJuIGFuIGVtcHR5XG4gKiBzdHJpbmcuICovXG5RdWFsaXR5RGVmaW5pdGlvbi5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn07XG5cbi8qIEEgcXVhbGl0eSB0aGF0IGlzIGFsd2F5cyBkaXNwbGF5ZWQgYXMgdGhlIG5lYXJlc3QgaW50ZWdlciBvZlxuICogdGhlIGN1cnJlbnQgdmFsdWUsIHJvdW5kZWQgZG93bi4gT3B0aW9ucyAoaW4gdGhlIG9wdHNcbiAqIHBhcmFtZXRlcikgYXJlIHRoZSBzYW1lIGFzIGZvciBRdWFsaXR5RGVmaW5pdGlvbi4gKi9cbnZhciBJbnRlZ2VyUXVhbGl0eSA9IGZ1bmN0aW9uKHRpdGxlLCBvcHRzKSB7XG4gIFF1YWxpdHlEZWZpbml0aW9uLmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xufTtcbkludGVnZXJRdWFsaXR5LmluaGVyaXRzKFF1YWxpdHlEZWZpbml0aW9uKTtcbkludGVnZXJRdWFsaXR5LnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKHZhbHVlKS50b1N0cmluZygpO1xufTtcblxuLyogQSBxdWFsaXR5IHRoYXQgZGlzcGxheXMgYXMgYW4gSW50ZWdlclF1YWxpdHksIHVubGVzcyBpdCBpc1xuICogemVybywgd2hlbiBpdCBpcyBvbWl0dGVkLiBPcHRpb25zIChpbiB0aGUgb3B0cyAqIHBhcmFtZXRlcikgYXJlXG4gKiB0aGUgc2FtZSBhcyBmb3IgUXVhbGl0eURlZmluaXRpb24uICovXG52YXIgTm9uWmVyb0ludGVnZXJRdWFsaXR5ID0gZnVuY3Rpb24odGl0bGUsIG9wdHMpIHtcbiAgSW50ZWdlclF1YWxpdHkuY2FsbCh0aGlzLCB0aXRsZSwgb3B0cyk7XG59O1xuTm9uWmVyb0ludGVnZXJRdWFsaXR5LmluaGVyaXRzKEludGVnZXJRdWFsaXR5KTtcbk5vblplcm9JbnRlZ2VyUXVhbGl0eS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSW50ZWdlclF1YWxpdHkucHJvdG90eXBlLmZvcm1hdC5jYWxsKFxuICAgICAgdGhpcywgY2hhcmFjdGVyLCB2YWx1ZVxuICAgICk7XG4gIH1cbn07XG5cbi8qIEEgcXVhbGl0eSB0aGF0IGRpc3BsYXlzIGl0cyBmdWxsIG51bWVyaWMgdmFsdWUsIGluY2x1ZGluZ1xuICogZGVjaW1hbCBjb21wb25lbnQuIFRoaXMgaXMgYWN0dWFsbHkgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kXG4gKiB0aGUgUXVhbGl0eURlZmluaXRpb24gY2xhc3MsIHdoaWNoIGZvcm1hdHMgaW4gdGhlIHNhbWVcbiAqIHdheS4gT3B0aW9ucyAoaW4gdGhlIG9wdHMgcGFyYW1ldGVyKSBhcmUgdGhlIHNhbWUgYXMgZm9yXG4gKiBRdWFsaXR5RGVmaW5pdGlvbi4gKi9cbnZhciBOdW1lcmljUXVhbGl0eSA9IGZ1bmN0aW9uKHRpdGxlLCBvcHRzKSB7XG4gIFF1YWxpdHlEZWZpbml0aW9uLmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xufTtcbk51bWVyaWNRdWFsaXR5LmluaGVyaXRzKFF1YWxpdHlEZWZpbml0aW9uKTtcblxuLyogQSBxdWFsaXR5IHRoYXQgZGlzcGxheXMgaXRzIHZhbHVlcyBhcyBvbmUgb2YgYSBzZXQgb2ZcbiAqIHdvcmRzLiBUaGUgcXVhbGl0eSB2YWx1ZSBpcyBmaXJzdCByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3RcbiAqIGludGVnZXIsIHRoZW4gdGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHNlbGVjdCBhIHdvcmQgdG9cbiAqIGRpc3BsYXkuIFRoZSBvZmZzZXQgcGFyYW1ldGVyIChvcHRpb25hbGx5IHBhc3NlZCBpbiBhcyBwYXJ0IG9mXG4gKiB0aGUgb3B0cyBvYmplY3QpIGNvbnRyb2xzIHdoYXQgbnVtYmVyIG1hcHMgdG8gd2hhdCB3b3JkLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyAoaW4gdGhlIG9wdHMgcGFyYW1ldGVyKSBhcmUgYXZhaWxhYmxlOlxuICpcbiAqIG9mZnNldCAtIFdpdGggb2Zmc2V0PTAgKHRoZSBkZWZhdWx0KSwgdGhlIHF1YW50aXR5IHZhbHVlIG9mIDBcbiAqICAgICB3aWxsIG1hcCB0byB0aGUgZmlyc3Qgd29yZCwgYW5kIHNvIG9uLiBJZiBvZmZzZXQgaXNcbiAqICAgICBub24temVybyB0aGVuIHRoZSB2YWx1ZSBnaXZlbiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGZpcnN0XG4gKiAgICAgd29yZCBpbiB0aGUgbGlzdC4gU28gaWYgb2Zmc2V0PTQsIHRoZW4gdGhlIGZpcnN0IHdvcmQgaW5cbiAqICAgICB0aGUgbGlzdCB3aWxsIGJlIHVzZWQgZm9yIHZhbHVlPTQuXG4gKlxuICogdXNlQm9udXNlcyAtIElmIHRoaXMgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGVuIHZhbHVlcyBvdXRzaWRlXG4gKiAgICAgdGhlIHJhbmdlIG9mIHdvcmRzIHdpbGwgYmUgY29uc3RydWNlZCBmcm9tIHRoZSB3b3JkIGFuZCBhXG4gKiAgICAgbnVtZXJpYyBib251cy4gU28gd2l0aCBvZmZzZXQ9MCBhbmQgZml2ZSB3b3JkcywgdGhlIGxhc3Qgb2ZcbiAqICAgICB3aGljaCBpcyAnYW1hemluZycsIGEgc2NvcmUgb2Ygc2l4IHdvdWxkIGdpdmUgJ2FtYXppbmcrMScuXG4gKiAgICAgaWYgdGhpcyBpcyBmYWxzZSwgdGhlbiB0aGUgYm9udXMgd291bGQgYmUgb21pdHRlZCwgc29cbiAqICAgICBhbnl0aGluZyBiZXlvbmQgJ2FtYXppbmcnIGlzIHN0aWxsICdhbWF6aW5nJy5cbiAqXG4gKiBPdGhlciBvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgUXVhbGl0eURlZmluaXRpb24uXG4gKi9cbnZhciBXb3JkU2NhbGVRdWFsaXR5ID0gZnVuY3Rpb24odGl0bGUsIHZhbHVlcywgb3B0cykge1xuICB2YXIgbXlPcHRzID0gZXh0ZW5kKG9wdHMsIHtcbiAgICBvZmZzZXQ6IG51bGwsXG4gICAgdXNlQm9udXNlczogdHJ1ZVxuICB9KTtcbiAgUXVhbGl0eURlZmluaXRpb24uY2FsbCh0aGlzLCB0aXRsZSwgb3B0cyk7XG4gIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICB0aGlzLm9mZnNldCA9IG15T3B0cy5vZmZzZXQ7XG4gIHRoaXMudXNlQm9udXNlcyA9IG15T3B0cy51c2VCb251c2VzO1xufTtcbldvcmRTY2FsZVF1YWxpdHkuaW5oZXJpdHMoUXVhbGl0eURlZmluaXRpb24pO1xuV29yZFNjYWxlUXVhbGl0eS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICB2YXIgdmFsID0gTWF0aC5mbG9vcih2YWx1ZSAtIHRoaXMub2Zmc2V0KTtcbiAgdmFyIG1vZCA9IFwiXCI7XG4gIGlmICh2YWwgPCAwKSB7XG4gICAgbW9kID0gdmFsLnRvU3RyaW5nKCk7XG4gICAgdmFsID0gMDtcbiAgfSBlbHNlIGlmICh2YWwgPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgbW9kID0gXCIrXCIgKyAodmFsIC0gdGhpcy52YWx1ZXMubGVuZ3RoICsgMSkudG9TdHJpbmcoKTtcbiAgICB2YWwgPSB0aGlzLnZhbHVlcy5sZW5ndGggLSAxO1xuICB9XG4gIGlmICghdGhpcy51c2VCb251c2VzKSBtb2QgPSBcIlwiO1xuICBpZiAodGhpcy52YWx1ZXNbdmFsXSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB0aGlzLnZhbHVlc1t2YWxdICsgbW9kOyAvLyBUeXBlIGNvZXJjaW9uXG59O1xuXG4vKiBBIHNwZWNpYWxpemF0aW9uIG9mIFdvcmRTY2FsZVF1YWxpdHkgdGhhdCB1c2VzIHRoZSBGVURHRSBSUEcnc1xuICogYWRqZWN0aXZlIHNjYWxlIChmcm9tICd0ZXJyaWJsZScgYXQgLTMgdG8gJ3N1cGVyYicgYXQgKzMpLiBUaGVcbiAqIG9wdGlvbnMgYXJlIGFzIGZvciBXb3JkU2NhbGVRdWFsaXR5LiBJbiBwYXJ0aWN1bGFyIHlvdSBjYW4gdXNlXG4gKiB0aGUgb2Zmc2V0IG9wdGlvbiB0byBjb250cm9sIHdoZXJlIHRoZSBzY2FsZSBzdGFydHMuIFNvIHlvdVxuICogY291bGQgbW9kZWwgYSBxdWFsaXR5IHRoYXQgZXZlcnlvbmUgc3RhcnRzIG9mZiBhcyAndGVycmlibGUnXG4gKiAoc3VjaCBhcyBOdWNsZWFyIFBoeXNpY3MpIHdpdGggYW4gb2Zmc2V0IG9mIDAsIHdoaWxlIGFub3RoZXIgdGhhdFxuICogaXMgbW9yZSBjb21tb24gKHN1Y2ggYXMgSGVhbHRoKSBjb3VsZCBoYXZlIGFuIG9mZnNldCBvZiAtNSBzb1xuICogZXZlcnlvbmUgc3RhcnRzIHdpdGggJ2dyZWF0Jy5cbiAqL1xudmFyIEZ1ZGdlQWRqZWN0aXZlc1F1YWxpdHkgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICBXb3JkU2NhbGVRdWFsaXR5LmNhbGwodGhpcywgdGl0bGUsIFtcbiAgICBcInRlcnJpYmxlXCIubCgpLFxuICAgIFwicG9vclwiLmwoKSxcbiAgICBcIm1lZGlvY3JlXCIubCgpLFxuICAgIFwiZmFpclwiLmwoKSxcbiAgICBcImdvb2RcIi5sKCksXG4gICAgXCJncmVhdFwiLmwoKSxcbiAgICBcInN1cGVyYlwiLmwoKVxuICBdLCBvcHRzKTtcbiAgaWYgKCEoJ29mZnNldCcgaW4gb3B0cykpIHRoaXMub2Zmc2V0ID0gLTM7XG59O1xuRnVkZ2VBZGplY3RpdmVzUXVhbGl0eS5pbmhlcml0cyhXb3JkU2NhbGVRdWFsaXR5KTtcblxuLyogQW4gYm9vbGVhbiBxdWFsaXR5IHRoYXQgcmVtb3ZlcyBpdHNlbGYgZnJvbSB0aGUgcXVhbGl0eSBsaXN0IGlmXG4gKiBpdCBoYXMgYSB6ZXJvIHZhbHVlLiBJZiBpdCBoYXMgYSBub24temVybyB2YWx1ZSwgaXRzIHZhbHVlXG4gKiBmaWVsZCBpcyB1c3VhbGx5IGxlZnQgZW1wdHksIGJ1dCB5b3UgY2FuIHNwZWNpZnkgeW91ciBvd25cbiAqIHN0cmluZyB0byBkaXNwbGF5IGFzIHRoZSBgb25EaXNwbGF5YCBwYXJhbWV0ZXIgb2YgdGhlIG9wdHNcbiAqIG9iamVjdC4gT3RoZXIgb3B0aW9ucyAoaW4gdGhlIG9wdHMgcGFyYW1ldGVyKSBhcmUgdGhlIHNhbWUgYXNcbiAqIGZvciBRdWFsaXR5RGVmaW5pdGlvbi4gKi9cbnZhciBPbk9mZlF1YWxpdHkgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICB2YXIgbXlPcHRzID0gZXh0ZW5kKG9wdHMsIHtcbiAgICBvbkRpc3BsYXk6IFwiXCJcbiAgfSk7XG4gIFF1YWxpdHlEZWZpbml0aW9uLmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xuICB0aGlzLm9uRGlzcGxheSA9IG15T3B0cy5vbkRpc3BsYXk7XG59O1xuT25PZmZRdWFsaXR5LmluaGVyaXRzKFF1YWxpdHlEZWZpbml0aW9uKTtcbk9uT2ZmUXVhbGl0eS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICBpZiAodmFsdWUpIHJldHVybiB0aGlzLm9uRGlzcGxheTtcbiAgZWxzZSByZXR1cm4gbnVsbDtcbn07XG5cbi8qIEEgYm9vbGVhbiBxdWFsaXR5IHRoYXQgaGFzIGRpZmZlcmVudCBvdXRwdXQgdGV4dCBmb3IgemVybyBvclxuICogbm9uLXplcm8gcXVhbGl0eSB2YWx1ZXMuIFVubGlrZSBPbk9mZlF1YWxpdHksIHRoaXMgZGVmaW5pdGlvblxuICogZG9lc24ndCByZW1vdmUgaXRzZWxmIGZyb20gdGhlIGxpc3Qgd2hlbiBpdCBpcyAwLiBUaGUgb3B0aW9uc1xuICogYXJlIGFzIGZvciBRdWFsaXR5RGVmaW5pdGlvbiwgd2l0aCB0aGUgYWRkaXRpb24gb2Ygb3B0aW9uc1xuICogJ3llc0Rpc3BsYXknIGFuZCAnbm9EaXNwbGF5Jywgd2hpY2ggY29udGFpbiB0aGUgSFRNTCBmcmFnbWVudHNcbiAqIHVzZWQgdG8gZGlzcGxheSB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMuIElmIG5vdCBnaXZlbiwgdGhlc2VcbiAqIGRlZmF1bHQgdG8gJ3llcycgYW5kICdubycuXG4gKi9cbnZhciBZZXNOb1F1YWxpdHkgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICB2YXIgbXlPcHRzID0gZXh0ZW5kKG9wdHMse1xuICAgIHllc0Rpc3BsYXk6IFwieWVzXCIubCgpLFxuICAgIG5vRGlzcGxheTogXCJub1wiLmwoKVxuICB9KTtcbiAgUXVhbGl0eURlZmluaXRpb24uY2FsbCh0aGlzLCB0aXRsZSwgb3B0cyk7XG4gIHRoaXMueWVzRGlzcGxheSA9IG15T3B0cy55ZXNEaXNwbGF5O1xuICB0aGlzLm5vRGlzcGxheSA9IG15T3B0cy5ub0Rpc3BsYXk7XG59O1xuWWVzTm9RdWFsaXR5LmluaGVyaXRzKFF1YWxpdHlEZWZpbml0aW9uKTtcblllc05vUXVhbGl0eS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICBpZiAodmFsdWUpIHJldHVybiB0aGlzLnllc0Rpc3BsYXk7XG4gIGVsc2UgcmV0dXJuIHRoaXMubm9EaXNwbGF5O1xufTtcblxuLyogRGVmaW5lcyBhIGdyb3VwIG9mIHF1YWxpdGllcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG9nZXRoZXIsXG4gKiB1bmRlciB0aGUgZ2l2ZW4gb3B0aW9uYWwgdGl0bGUuIFRoZXNlIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZVxuICogYHVuZHVtLmdhbWUucXVhbGl0eUdyb3Vwc2AgcGFyYW1ldGVyLiAqL1xudmFyIFF1YWxpdHlHcm91cCA9IGZ1bmN0aW9uKHRpdGxlLCBvcHRzKSB7XG4gIHZhciBteU9wdHMgPSBleHRlbmQob3B0cyx7XG4gICAgcHJpb3JpdHk6IHRpdGxlLFxuICAgIGV4dHJhQ2xhc3NlczogbnVsbFxuICB9KTtcbiAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB0aGlzLnByaW9yaXR5ID0gbXlPcHRzLnByaW9yaXR5O1xuICB0aGlzLmV4dHJhQ2xhc3NlcyA9IG15T3B0cy5leHRyYUNsYXNzZXM7XG59O1xuIiwiLyogQSBzeXN0ZW0gb2JqZWN0IGlzIHBhc3NlZCBpbnRvIHRoZSBlbnRlciwgYWN0IGFuZCBleGl0XG4gKiBmdW5jdGlvbnMgb2YgZWFjaCBzaXR1YXRpb24uIEl0IGlzIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGVcbiAqIFVJLlxuICovXG52YXIgU3lzdGVtID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucm5kID0gbnVsbDtcbiAgdGhpcy50aW1lID0gMDtcbn07XG5cbi8qIFJlbW92ZXMgYWxsIGNvbnRlbnQgZnJvbSB0aGUgcGFnZSwgY2xlYXJpbmcgdGhlIG1haW4gY29udGVudCBhcmVhLlxuICpcbiAqIElmIGFuIGVsZW1lbnRTZWxlY3RvciBpcyBnaXZlbiwgdGhlbiBvbmx5IHRoYXQgc2VsZWN0b3Igd2lsbCBiZVxuICogY2xlYXJlZC4gTm90ZSB0aGF0IGFsbCBjb250ZW50IGZyb20gdGhlIGNsZWFyZWQgZWxlbWVudCBpcyByZW1vdmVkLFxuICogYnV0IHRoZSBlbGVtZW50IGl0c2VsZiByZW1haW5zLCByZWFkeSB0byBiZSBmaWxsZWQgYWdhaW4gdXNpbmdcbiAqIFN5c3RlbS53cml0ZS5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS5jbGVhckNvbnRlbnQgPSBmdW5jdGlvbihlbGVtZW50U2VsZWN0b3IpIHtcbiAgdmFyICRlbGVtZW50O1xuICBpZiAoZWxlbWVudFNlbGVjdG9yKSAkZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudFNlbGVjdG9yKTtcbiAgaWYgKCEkZWxlbWVudCkgJGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIik7XG4gICRlbGVtZW50LmlubmVySFRNTCA9ICcnO1xufTtcblxuLyogT3V0cHV0cyByZWd1bGFyIGNvbnRlbnQgdG8gdGhlIHBhZ2UuIFRoZSBjb250ZW50IHN1cHBsaWVkIG11c3RcbiAqIGJlIHZhbGlkIFwiRGlzcGxheSBDb250ZW50XCIuXG4gKlxuICogXCJEaXNwbGF5IENvbnRlbnRcIiBpcyBhbnkgSFRNTCBzdHJpbmcgdGhhdCBiZWdpbnMgd2l0aCBhIEhUTUxcbiAqIHN0YXJ0IHRhZywgZW5kcyB3aXRoIGVpdGhlciBhbiBlbmQgb3IgYSBjbG9zZWQgdGFnLCBhbmQgaXMgYVxuICogdmFsaWQgYW5kIHNlbGYtY29udGFpbmVkIHNuaXBwZXQgb2YgSFRNTC4gTm90ZSB0aGF0IHRoZSBzdHJpbmdcbiAqIGRvZXNuJ3QgaGF2ZSB0byBjb25zaXN0IG9mIG9ubHkgb25lIEhUTUwgdGFnLiBZb3UgY291bGQgaGF2ZVxuICogc2V2ZXJhbCBwYXJhZ3JhcGhzLCBmb3IgZXhhbXBsZSwgYXMgbG9uZyBhcyB0aGUgY29udGVudCBzdGFydHNcbiAqIHdpdGggdGhlIDxwPiBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLCBhbmQgZW5kcyB3aXRoIHRoZSA8L3A+IG9mXG4gKiB0aGUgbGFzdC4gU28gXCI8cD5Gb288L3A+PGltZyBzcmM9J2Jhcic+XCIgaXMgdmFsaWQsIGJ1dCBcImZvbzxpbWdcbiAqIHNyYz0nYmFyJz5cIiBpcyBub3QuXG4gKlxuICogVGhlIGNvbnRlbnQgZ29lcyB0byB0aGUgZW5kIG9mIHRoZSBwYWdlLCB1bmxlc3MgeW91IHN1cHBseSB0aGVcbiAqIG9wdGlvbmFsIHNlbGVjdG9yIGFyZ3VtZW50LiBJZiB5b3UgZG8sIHRoZSBjb250ZW50IGFwcGVhcnNcbiAqIGFmdGVyIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGF0IHNlbGVjdG9yLlxuICovXG5TeXN0ZW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oY29udGVudCwgZWxlbWVudFNlbGVjdG9yKSB7XG4gIGRvV3JpdGUoY29udGVudCwgZWxlbWVudFNlbGVjdG9yKTtcbn07XG5cbi8qIE91dHB1dHMgdGhlIGdpdmVuIGNvbnRlbnQgaW4gYSBoZWFkaW5nIG9uIHRoZSBwYWdlLiBUaGUgY29udGVudFxuICogc3VwcGxpZWQgbXVzdCBiZSB2YWxpZCBcIkRpc3BsYXkgQ29udGVudFwiLlxuICpcbiAqIFRoZSBjb250ZW50IGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSwgdW5sZXNzIHlvdSBzdXBwbHkgdGhlXG4gKiBvcHRpb25hbCBzZWxlY3RvciBhcmd1bWVudC4gSWYgeW91IGRvLCB0aGUgY29udGVudCBhcHBlYXJzXG4gKiBhZnRlciB0aGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhhdCBzZWxlY3Rvci5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS53cml0ZUhlYWRpbmcgPSBmdW5jdGlvbihoZWFkaW5nQ29udGVudCwgZWxlbWVudFNlbGVjdG9yKSB7XG4gIHZhciBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIjxoMT5cIik7XG4gIGhlYWRpbmcuaW5uZXJIVE1MID0gaGVhZGluZ0NvbnRlbnQ7XG4gIGRvV3JpdGUoaGVhZGluZywgZWxlbWVudFNlbGVjdG9yKTtcbn07XG5cbi8qIE91dHB1dHMgcmVndWxhciBjb250ZW50IHRvIHRoZSBwYWdlLiBUaGUgY29udGVudCBzdXBwbGllZCBtdXN0XG4gKiBiZSB2YWxpZCBcIkRpc3BsYXkgQ29udGVudFwiLlxuICpcbiAqIFRoZSBjb250ZW50IGdvZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSwgdW5sZXNzIHlvdVxuICogc3VwcGx5IHRoZSBvcHRpb25hbCBzZWxlY3RvciBhcmd1bWVudC4gSWYgeW91IGRvLCB0aGUgY29udGVudFxuICogYXBwZWFycyBhZnRlciB0aGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhhdCBzZWxlY3Rvci5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS53cml0ZUJlZm9yZSA9IGZ1bmN0aW9uKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcikge1xuICBkb1dyaXRlKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3RvciwgJ3ByZXBlbmQnLCAnYmVmb3JlJyk7XG59O1xuXG4vKiBPdXRwdXRzIHJlZ3VsYXIgY29udGVudCB0byB0aGUgcGFnZS4gVGhlIGNvbnRlbnQgc3VwcGxpZWQgbXVzdFxuICogYmUgdmFsaWQgXCJEaXNwbGF5IENvbnRlbnRcIi5cbiAqXG4gKiBXaGVuIGEgc2VsZWN0b3IgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBiZWhhdmVzIGlkZW50aWNhbGx5IHRvXG4gKiBTeXN0ZW0ucHJvdG90eXBlLndyaXRlLiBJZiB5b3Ugc3VwcGx5IGEgc2VsZWN0b3IsIHRoZSBjb250ZW50XG4gKiBhcHBlYXJzIGFzIGEgY2hpbGQgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IG9mIHRoZVxuICogZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhhdCBzZWxlY3Rvci5cbiAqL1xuXG5TeXN0ZW0ucHJvdG90eXBlLndyaXRlSW50byA9IGZ1bmN0aW9uKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcikge1xuICBkb1dyaXRlKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3RvciwgJ2FwcGVuZCcsICdhcHBlbmQnKTtcbn07XG5cbi8qIFJlcGxhY2VzIGNvbnRlbnQgd2l0aCB0aGUgY29udGVudCBzdXBwbGllZCwgd2hpY2ggbXVzdCBiZSB2YWxpZFxuICogXCJEaXNwbGF5IENvbnRlbnRcIi5cbiAqXG4gKiBXaGVuIGEgc2VsZWN0b3IgaXMgbm90IHNwZWNpZmllZCwgdGhpcyByZXBsYWNlcyB0aGUgZW50aXJlXG4gKiBjb250ZW50IG9mIHRoZSBwYWdlLiBPdGhlcndpc2UsIGl0IHJlcGxhY2VzIHRoZSBlbGVtZW50IG1hdGNoZWRcbiAqIHdpdGggdGhlIHNlbGVjdG9yLiBUaGlzIHJlcGxhY2VzIHRoZSBlbnRpcmUgZWxlbWVudCwgaW5jbHVkaW5nXG4gKiB0aGUgbWF0Y2hlZCB0YWdzLCBzbyBpZGVhbGx5IHRoZSBjb250ZW50IHN1cHBsaWVkIHNob3VsZCBmaXRcbiAqIGluIGl0cyBwbGFjZSBpbiB0aGUgRE9NIHdpdGggdGhlIHNhbWUga2luZCBvZiBkaXNwbGF5IGVsZW1lbnQuXG4gKi9cblxuU3lzdGVtLnByb3RvdHlwZS5yZXBsYWNlV2l0aCA9IGZ1bmN0aW9uKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcikge1xuICBkb1dyaXRlKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3RvciwgJ3JlcGxhY2VXaXRoJywgJ3JlcGxhY2VXaXRoJyk7XG59O1xuXG4vKiBDYXJyaWVzIG91dCB0aGUgZ2l2ZW4gc2l0dWF0aW9uIGNoYW5nZSBvciBhY3Rpb24sIGFzIGlmIGl0IHdlcmVcbiAqIGluIGEgbGluayB0aGF0IGhhcyBiZWVuIGNsaWNrZWQuIFRoaXMgYWxsb3dzIHlvdSB0byBkb1xuICogcHJvY2VkdXJhbCB0cmFuc2l0aW9ucy4gWW91IG1pZ2h0IGhhdmUgYW4gYWN0aW9uIHRoYXQgYnVpbGRzIHVwXG4gKiB0aGUgY2hhcmFjdGVyJ3Mgc3RyZW5ndGgsIGFuZCBkZXBsZXRlcyB0aGVpciBtYWdpYy4gV2hlbiB0aGVcbiAqIG1hZ2ljIGlzIGFsbCBnb25lLCB5b3UgY2FuIGZvcmNlIGEgc2l0dWF0aW9uIGNoYW5nZSBieSBjYWxsaW5nXG4gKiB0aGlzIG1ldGhvZC4gKi9cblN5c3RlbS5wcm90b3R5cGUuZG9MaW5rID0gZnVuY3Rpb24oY29kZSkge1xuICBwcm9jZXNzTGluayhjb2RlKTtcbn07XG5cbi8qIFR1cm5zIGFueSBsaW5rcyB0aGF0IHRhcmdldCB0aGUgZ2l2ZW4gaHJlZiBpbnRvIHBsYWluXG4gKiB0ZXh0LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBhY3Rpb24gb3B0aW9ucyB3aGVuIGFuIGFjdGlvblxuICogaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gSXQgaXMgdXNlZCBhdXRvbWF0aWNhbGx5IHdoZW4geW91IGdpdmVcbiAqIGEgbGluayB0aGUgJ29uY2UnIGNsYXNzLiAqL1xuU3lzdGVtLnByb3RvdHlwZS5jbGVhckxpbmtzID0gZnVuY3Rpb24oY29kZSkge1xuICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYVtocmVmPSdcIiArIGNvZGUgKyBcIiddXCIpO1xuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGxpbmtzLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7XG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3BhblwiKS5jbGFzc0xpc3QuYWRkKFwiZXhfbGlua1wiKTtcbiAgfSk7XG59O1xuXG4vKiBHaXZlbiBhIGxpc3Qgb2Ygc2l0dWF0aW9uIGlkcywgdGhpcyBvdXRwdXRzIGEgc3RhbmRhcmQgb3B0aW9uXG4gKiBibG9jayB3aXRoIHRoZSBzaXR1YXRpb24gY2hvaWNlcyBpbiB0aGUgZ2l2ZW4gb3JkZXIuXG4gKlxuICogVGhlIGNvbnRlbnRzIG9mIGVhY2ggY2hvaWNlIHdpbGwgYmUgYSBsaW5rIHRvIHRoZSBzaXR1YXRpb24sXG4gKiB0aGUgdGV4dCBvZiB0aGUgbGluayB3aWxsIGJlIGdpdmVuIGJ5IHRoZSBzaXR1YXRpb24nc1xuICogb3V0cHV0VGV4dCBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoZSBjYW5DaG9vc2UgZnVuY3Rpb24gaXNcbiAqIGNhbGxlZCwgYW5kIGlmIGl0IHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIHRleHQgd2lsbCBhcHBlYXIsIGJ1dFxuICogdGhlIGxpbmsgd2lsbCBub3QgYmUgY2xpY2thYmxlLlxuICpcbiAqIEFsdGhvdWdoIGNhbkNob29zZSBpcyBob25vcmVkLCBjYW5WaWV3IGFuZCBkaXNwbGF5T3JkZXIgYXJlXG4gKiBub3QuIElmIHlvdSBuZWVkIHRvIGhvbm9yIHRoZXNlLCB5b3Ugc2hvdWxkIGVpdGhlciBkbyBzb1xuICogbWFudWFsbHksIG90IGVsc2UgdXNlIHRoZSBgZ2V0U2l0dWF0aW9uSWRDaG9pY2VzYCBtZXRob2QgdG9cbiAqIHJldHVybiBhbiBvcmRlcmVkIGxpc3Qgb2YgdmFsaWQgdmlld2FibGUgc2l0dWF0aW9uIGlkcy5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS53cml0ZUNob2ljZXMgPSBmdW5jdGlvbihsaXN0T2ZJZHMsIGVsZW1lbnRTZWxlY3Rvcikge1xuICBpZiAobGlzdE9mSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHZhciBjdXJyZW50U2l0dWF0aW9uID0gZ2V0Q3VycmVudFNpdHVhdGlvbigpO1xuICB2YXIgJG9wdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikucXVlcnlTZWxlY3RvckFsbChcInVsXCIpLmNsYXNzTGlzdC5hZGQoXCJvcHRpb25zXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RPZklkcy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBzaXR1YXRpb25JZCA9IGxpc3RPZklkc1tpXTtcbiAgICB2YXIgc2l0dWF0aW9uID0gZ2FtZS5zaXR1YXRpb25zW3NpdHVhdGlvbklkXTtcbiAgICBhc3NlcnQoc2l0dWF0aW9uLCBcInVua25vd25fc2l0dWF0aW9uXCIubCh7aWQ6c2l0dWF0aW9uSWR9KSk7XG5cbiAgICB2YXIgb3B0aW9uVGV4dCA9IHNpdHVhdGlvbi5vcHRpb25UZXh0KGNoYXJhY3RlciwgdGhpcyxcbiAgICAgICAgY3VycmVudFNpdHVhdGlvbik7XG4gICAgaWYgKCFvcHRpb25UZXh0KSBvcHRpb25UZXh0ID0gXCJjaG9pY2VcIi5sKHtudW1iZXI6aSsxfSk7XG4gICAgdmFyICRvcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikucXVlcnlTZWxlY3RvckFsbChcImxpXCIpO1xuICAgIHZhciAkYTtcbiAgICBpZiAoc2l0dWF0aW9uLmNhbkNob29zZShjaGFyYWN0ZXIsIHRoaXMsIGN1cnJlbnRTaXR1YXRpb24pKSB7XG4gICAgICAkYSA9IFwiPGEgaHJlZj0nXCIrc2l0dWF0aW9uSWQrXCInPlwiK29wdGlvblRleHQrXCI8L2E+XCJcbiAgICB9IGVsc2Uge1xuICAgICAgJGEgPSBcIjxzcGFuPlwiK29wdGlvblRleHQrXCI8L3NwYW4+XCI7XG4gICAgfVxuICAgICRvcHRpb24uaW5uZXJIVE1MID0gJGE7XG4gICAgJG9wdGlvbnMuYXBwZW5kQ2hpbGQoJG9wdGlvbik7XG4gIH1cbiAgZG9Xcml0ZSgkb3B0aW9ucywgZWxlbWVudFNlbGVjdG9yLCAnYXBwZW5kJywgJ2FmdGVyJyk7XG59O1xuXG4vKiBSZXR1cm5zIGEgbGlzdCBvZiBzaXR1YXRpb24gaWRzIHRvIGNob29zZSBmcm9tLCBnaXZlbiBhIHNldCBvZlxuICogc3BlY2lmaWNhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBhIGNvbXBsZXggYW5kIHBvd2VyZnVsIHdheSBvZiBjb21waWxpbmdcbiAqIGltcGxpY2l0IHNpdHVhdGlvbiBjaG9pY2VzLiBZb3UgZ2l2ZSBpdCBhIGxpc3Qgb2Ygc2l0dWF0aW9uIGlkc1xuICogYW5kIHNpdHVhdGlvbiB0YWdzIChpZiBhIHNpbmdsZSBpZCBvciB0YWcgaXMgbmVlZGVkIGp1c3QgdGhhdFxuICogc3RyaW5nIGNhbiBiZSBnaXZlbiwgaXQgZG9lc24ndCBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYVxuICogbGlzdCkuIFRhZ3Mgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggYSBoYXNoICMgdG8gZGlmZmVyZW50aWF0ZVxuICogdGhlbSBmcm9tIHNpdHVhdGlvbiBpZHMuIFRoZSBmdW5jdGlvbiB0aGVuIGNvbnNpZGVycyBhbGxcbiAqIG1hdGNoaW5nIHNpdHVhdGlvbnMgaW4gZGVzY2VuZGluZyBwcmlvcml0eSBvcmRlciwgY2FsbGluZyB0aGVpclxuICogY2FuVmlldyBmdW5jdGlvbnMgYW5kIGZpbHRlcmluZyBvdXQgYW55IHRoYXQgc2hvdWxkIG5vdCBiZVxuICogc2hvd24sIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiBXaXRob3V0IGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICogdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBsaXN0IG9mIHRoZSBzaXR1YXRpb24gaWRzIGF0IHRoZSBoaWdoZXN0XG4gKiBsZXZlbCBvZiBwcmlvcml0eSB0aGF0IGhhcyBhbnkgdmFsaWQgcmVzdWx0cy4gU28sIGZvciBleGFtcGxlLFxuICogaWYgYSB0YWcgI3BsYWNlcyBtYXRjaGVzIHRocmVlIHNpdHVhdGlvbnMsIG9uZSB3aXRoIHByaW9yaXR5IDIsXG4gKiBhbmQgdHdvIHdpdGggcHJpb3JpdHkgMywgYW5kIGFsbCBvZiB0aGVtIGNhbiBiZSB2aWV3ZWQgaW4gdGhlXG4gKiBjdXJyZW50IGNvbnRleHQsIHRoZW4gb25seSB0aGUgdHdvIHdpdGggcHJpb3JpdHkgMyB3aWxsIGJlXG4gKiByZXR1cm5lZC4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgaGlnaC1wcmlvcml0eSBzaXR1YXRpb25zIHRoYXRcbiAqIHRydW1wIGFueSBsb3dlciBzaXR1YXRpb25zIHdoZW4gdGhleSBhcmUgdmFsaWQsIHN1Y2ggYXNcbiAqIHNpdHVhdGlvbnMgdGhhdCBmb3JjZSB0aGUgcGxheWVyIHRvIGdvIHRvIG9uZSBkZXN0aW5hdGlvbiBpZlxuICogdGhlIHBsYXllciBpcyBvdXQgb2YgbW9uZXksIGZvciBleGFtcGxlLlxuICpcbiAqIElmIGEgbWluQ2hvaWNlcyB2YWx1ZSBpcyBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCBhdHRlbXB0XG4gKiB0byByZXR1cm4gYXQgbGVhc3QgdGhhdCBtYW55IHJlc3VsdHMuIElmIG5vdCBlbm91Z2ggcmVzdWx0cyBhcmVcbiAqIGF2YWlsYWJsZSBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiBsb3dlciBwcmlvcml0aWVzIHdpbGxcbiAqIGJlIGNvbnNpZGVyZWQgaW4gdHVybiwgdW50aWwgZW5vdWdoIHNpdHVhdGlvbnMgYXJlIGZvdW5kLiBJblxuICogdGhlIGV4YW1wbGUgYWJvdmUsIGlmIHdlIGhhZCBhIG1pbkNob2ljZXMgb2YgdGhyZWUsIHRoZW4gYWxsXG4gKiB0aHJlZSBzaXR1YXRpb25zIHdvdWxkIGJlIHJldHVybmVkLCBldmVuIHRob3VnaCB0aGV5IGhhdmVcbiAqIGRpZmZlcmVudCBwcmlvcml0aWVzLiBJZiB5b3UgbmVlZCB0byByZXR1cm4gYWxsIHZhbGlkXG4gKiBzaXR1YXRpb25zLCByZWdhcmRsZXNzIG9mIHRoZWlyIHByaW9yaXRpZXMsIHNldCBtaW5DaG9pY2VzIHRvIGFcbiAqIGxhcmdlIG51bWJlciwgc3VjaCBhcyBgTnVtYmVyLk1BWF9WQUxVRWAsIGFuZCBsZWF2ZSBtYXhDaG9pY2VzXG4gKiB1bmRlZmluZWQuXG4gKlxuICogSWYgYSBtYXhDaG9pY2VzIHZhbHVlIGlzIGdpdmVuLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIG5vdFxuICogcmV0dXJuIGFueSBtb3JlIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvZiByZXN1bHRzLiBJZiB0aGVyZSBhcmVcbiAqIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiByZXN1bHRzIHBvc3NpYmxlLCB0aGVuIHRoZSBoaWdoZXN0XG4gKiBwcmlvcml0eSByZXN1bHMgd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkLCBidXQgdGhlXG4gKiBsb3dlc3QgcHJpb3JpdHkgZ3JvdXAgd2lsbCBoYXZlIHRvIGZpZ2h0IGl0IG91dCBmb3IgdGhlXG4gKiByZW1haW5pbmcgcGxhY2VzLiBJbiB0aGlzIGNhc2UsIGEgcmFuZG9tIHNhbXBsZSBpcyBjaG9zZW4sXG4gKiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBzaXR1YXRpb24uIFNvIGFcbiAqIHNpdHVhdGlvbiB3aXRoIGEgZnJlcXVlbmN5IG9mIDEwMCB3aWxsIGJlIGNob3NlbiAxMDAgdGltZXMgbW9yZVxuICogb2Z0ZW4gdGhhbiBhIHNpdHVhdGlvbiB3aXRoIGEgZnJlcXVlbmN5IG9mIDEsIGlmIHRoZXJlIGlzIG9uZVxuICogc3BhY2UgYXZhaWxhYmxlLiBPZnRlbiB0aGVzZSBmcmVxdWVuY2llcyBoYXZlIHRvIGJlIHRha2VuIGFzIGFcbiAqIGd1aWRlbGluZSwgYW5kIHRoZSBhY3R1YWwgcHJvYmFiaWxpdGllcyB3aWxsIG9ubHkgYmVcbiAqIGFwcHJveGltYXRlLiBDb25zaWRlciB0aHJlZSBzaXR1YXRpb25zIHdpdGggZnJlcXVlbmNpZXMgb2YgMSxcbiAqIDEsIDEwMCwgY29tcGV0aW5nIGZvciB0d28gc3BhY2VzLiBUaGUgMTAwLWZyZXF1ZW5jeSBzaXR1YXRpb25cbiAqIHdpbGwgYmUgY2hvc2VuIGFsbW9zdCBldmVyeSB0aW1lLCBidXQgZm9yIHRoZSBvdGhlciBzcGFjZSwgb25lXG4gKiBvZiB0aGUgMS1mcmVxdWVuY3kgc2l0dWF0aW9ucyBtdXN0IGJlIGNob3Nlbi4gU28gdGhlIGFjdHVhbFxuICogcHJvYmFiaWxpdGllcyB3aWxsIGJlIHJvdWdobHkgNTAlLCA1MCUsIDEwMCUuIFdoZW4gc2VsZWN0aW5nXG4gKiBtb3JlIHRoYW4gb25lIHJlc3VsdCwgZnJlcXVlbmNpZXMgY2FuIG9ubHkgYmUgYSBndWlkZS5cbiAqXG4gKiBCZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGl0cyByZXN1bHQsIGl0IHNvcnRzIHRoZVxuICogc2l0dWF0aW9ucyBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHRoZWlyIGRpc3BsYXlPcmRlciB2YWx1ZXMuXG4gKi9cblN5c3RlbS5wcm90b3R5cGUuZ2V0U2l0dWF0aW9uSWRDaG9pY2VzID0gZnVuY3Rpb24obGlzdE9mT3JPbmVJZHNPclRhZ3MsXG4gICAgbWluQ2hvaWNlcywgbWF4Q2hvaWNlcylcbntcbiAgdmFyIGRhdHVtO1xuICB2YXIgaTtcblxuICAvLyBGaXJzdCBjaGVjayBpZiB3ZSBoYXZlIGEgc2luZ2xlIHN0cmluZyBmb3IgdGhlIGlkIG9yIHRhZy5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChsaXN0T2ZPck9uZUlkc09yVGFncykucmVwbGFjZSgvXlxcW29iamVjdCAoLispXFxdJC8sIFwiJDFcIikudG9Mb3dlckNhc2UoKSA9PSAnc3RyaW5nJykge1xuICAgIGxpc3RPZk9yT25lSWRzT3JUYWdzID0gW2xpc3RPZk9yT25lSWRzT3JUYWdzXTtcbiAgfVxuXG4gIC8vIEZpcnN0IHdlIGJ1aWxkIGEgbGlzdCBvZiBhbGwgY2FuZGlkYXRlIGlkcy5cbiAgdmFyIGFsbElkcyA9IHt9O1xuICBmb3IgKGkgPSAwOyBpIDwgbGlzdE9mT3JPbmVJZHNPclRhZ3MubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgdGFnT3JJZCA9IGxpc3RPZk9yT25lSWRzT3JUYWdzW2ldO1xuICAgIGlmICh0YWdPcklkLnN1YnN0cigwLCAxKSA9PSAnIycpIHtcbiAgICAgIHZhciBpZHMgPSBnZXRTaXR1YXRpb25JZHNXaXRoVGFnKHRhZ09ySWQuc3Vic3RyKDEpKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGFsbElkc1tpZHNbal1dID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxsSWRzW3RhZ09ySWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBGaWx0ZXIgb3V0IGFueXRoaW5nIHRoYXQgY2FuJ3QgYmUgdmlld2VkIHJpZ2h0IG5vdy5cbiAgdmFyIGN1cnJlbnRTaXR1YXRpb24gPSBnZXRDdXJyZW50U2l0dWF0aW9uKCk7XG4gIHZhciB2aWV3YWJsZVNpdHVhdGlvbkRhdGEgPSBbXTtcbiAgZm9yICh2YXIgc2l0dWF0aW9uSWQgaW4gYWxsSWRzKSB7XG4gICAgdmFyIHNpdHVhdGlvbiA9IGdhbWUuc2l0dWF0aW9uc1tzaXR1YXRpb25JZF07XG4gICAgYXNzZXJ0KHNpdHVhdGlvbiwgXCJ1bmtub3duX3NpdHVhdGlvblwiLmwoe2lkOnNpdHVhdGlvbklkfSkpO1xuXG4gICAgaWYgKHNpdHVhdGlvbi5jYW5WaWV3KGNoYXJhY3Rlciwgc3lzdGVtLCBjdXJyZW50U2l0dWF0aW9uKSkge1xuICAgICAgLy8gV2hpbGUgd2UncmUgaGVyZSwgZ2V0IHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgIHZhciB2aWV3YWJsZVNpdHVhdGlvbkRhdHVtID1cbiAgICAgICAgc2l0dWF0aW9uLmNob2ljZURhdGEoY2hhcmFjdGVyLCBzeXN0ZW0sIGN1cnJlbnRTaXR1YXRpb24pO1xuICAgICAgdmlld2FibGVTaXR1YXRpb25EYXR1bS5pZCA9IHNpdHVhdGlvbklkO1xuICAgICAgdmlld2FibGVTaXR1YXRpb25EYXRhLnB1c2godmlld2FibGVTaXR1YXRpb25EYXR1bSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlbiB3ZSBzb3J0IGluIGRlc2NlbmRpbmcgcHJpb3JpdHkgb3JkZXIuXG4gIHZpZXdhYmxlU2l0dWF0aW9uRGF0YS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTtcbiAgICAgIH0pO1xuXG4gIHZhciBjb21taXR0ZWQgPSBbXTtcbiAgdmFyIGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eSA9IFtdO1xuICB2YXIgbGFzdFByaW9yaXR5O1xuICAvLyBJbiBkZXNjZW5kaW5nIHByaW9yaXR5IG9yZGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgdmlld2FibGVTaXR1YXRpb25EYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgZGF0dW0gPSB2aWV3YWJsZVNpdHVhdGlvbkRhdGFbaV07XG4gICAgaWYgKGRhdHVtLnByaW9yaXR5ICE9IGxhc3RQcmlvcml0eSkge1xuICAgICAgaWYgKGxhc3RQcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGRyb3BwZWQgYSBwcmlvcml0eSBncm91cCwgc2VlIGlmIHdlIGhhdmUgZW5vdWdoXG4gICAgICAgIC8vIHNpdHVhdGlvbnMgc28gZmFyLCBhbmQgc3RvcCBpZiB3ZSBkby5cbiAgICAgICAgaWYgKG1pbkNob2ljZXMgPT09IHVuZGVmaW5lZCB8fCBpID49IG1pbkNob2ljZXMpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gQ29udGludWUgdG8gYWNjY3VtdWxhdGUgbW9yZSBvcHRpb25zLlxuICAgICAgY29tbWl0dGVkLnB1c2guYXBwbHkoY29tbWl0dGVkLCBjYW5kaWRhdGVzQXRMYXN0UHJpb3JpdHkpO1xuICAgICAgY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5ID0gW107XG4gICAgICBsYXN0UHJpb3JpdHkgPSBkYXR1bS5wcmlvcml0eTtcbiAgICB9XG4gICAgY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5LnB1c2goZGF0dW0pO1xuICB9XG5cbiAgLy8gU28gdGhlIHZhbHVlcyBpbiBjb21taXR0ZWQgd2UncmUgY29tbWl0dGVkIHRvLCBiZWNhdXNlIHdpdGhvdXRcbiAgLy8gdGhlbSB3ZSB3b3VsZG4ndCBoaXQgb3VyIG1pbmltdW0uIEJ1dCB0aG9zZSBpblxuICAvLyBjYW5kaWRhdGVzQXRMYXN0UHJpb3JpdHkgbWlnaHQgdGFrZSB1cyBvdmVyIG91ciBtYXhpbXVtLCBzb1xuICAvLyBmaWd1cmUgb3V0IGhvdyBtYW55IHdlIHNob3VsZCBjaG9vc2UuXG4gIHZhciB0b3RhbENob2ljZXMgPSBjb21taXR0ZWQubGVuZ3RoICsgY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5Lmxlbmd0aDtcbiAgaWYgKG1heENob2ljZXMgPT09IHVuZGVmaW5lZCB8fCBtYXhDaG9pY2VzID49IHRvdGFsQ2hvaWNlcykge1xuICAgIC8vIFdlIGNhbiB1c2UgYWxsIHRoZSBjaG9pY2VzLlxuICAgIGNvbW1pdHRlZC5wdXNoLmFwcGx5KGNvbW1pdHRlZCwgY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5KTtcbiAgfSBlbHNlIGlmIChtYXhDaG9pY2VzID49IGNvbW1pdHRlZC5sZW5ndGgpIHtcbiAgICAvLyBXZSBjYW4gb25seSB1c2UgdGhlIGNvbW1pdGVkIG9uZXMuXG4gICAgLy8gTk8tT1BcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBoYXZlIHRvIHNhbXBsZSB0aGUgY2FuZGlkYXRlcywgdXNpbmcgdGhlaXIgcmVsYXRpdmUgZnJlcXVlbmN5LlxuICAgIHZhciBjYW5kaWRhdGVzVG9JbmNsdWRlID0gbWF4Q2hvaWNlcyAtIGNvbW1pdHRlZC5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eS5sZW5ndGg7ICsraSkge1xuICAgICAgZGF0dW0gPSBjYW5kaWRhdGVzQXRMYXN0UHJpb3JpdHlbaV07XG4gICAgICBkYXR1bS5fZnJlcXVlbmN5VmFsdWUgPSB0aGlzLnJuZC5yYW5kb20oKSAvIGRhdHVtLmZyZXF1ZW5jeTtcbiAgICB9XG4gICAgY2FuZGlkYXRlc1RvSW5jbHVkZS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuX2ZyZXF1ZW5jeVZhbHVlIC0gYi5fZnJlcXVlbmN5VmFsdWU7XG4gICAgICAgIH0pO1xuICAgIHZhciBjaG9zZW4gPSBjYW5kaWRhdGVzVG9JbmNsdWRlLnNsaWNlKDAsIGNhbmRpZGF0ZXNUb0luY2x1ZGUpO1xuICAgIGNvbW1pdHRlZC5wdXNoLmFwcGx5KGNvbW1pdHRlZCwgY2hvc2VuKTtcbiAgfVxuXG4gIC8vIE5vdyBzb3J0IGluIGFzY2VuZGluZyBkaXNwbGF5IG9yZGVyLlxuICBjb21taXR0ZWQuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXNwbGF5T3JkZXIgLSBiLmRpc3BsYXlPcmRlcjtcbiAgICAgIH0pO1xuXG4gIC8vIEFuZCByZXR1cm4gYXMgYSBsaXN0IG9mIGlkcyBvbmx5LlxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCBjb21taXR0ZWQubGVuZ3RoOyArK2kpIHtcbiAgICByZXN1bHQucHVzaChjb21taXR0ZWRbaV0uaWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBDYWxsIHRoaXMgdG8gY2hhbmdlIHRoZSBjaGFyYWN0ZXIgdGV4dDogdGhlIHRleHQgaW4gdGhlIHJpZ2h0XG4gKiB0b29sYmFyIGJlZm9yZSB0aGUgcXVhbGl0aWVzIGxpc3QuIFRoaXMgdGV4dCBpcyBkZXNpZ25lZCB0byBiZVxuICogYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB5b3VyIGNoYXJhY3Rlci4gVGhlXG4gKiBjb250ZW50IHlvdSBnaXZlIHNob3VsZCBiZSBcIkRpc3BsYXkgQ29udGVudFwiIChzZWVcbiAqIGBTeXN0ZW0ucHJvdG90eXBlLndyaXRlYCBmb3IgdGhlIGRlZmluaXRpb24pLlxuICovXG5TeXN0ZW0ucHJvdG90eXBlLnNldENoYXJhY3RlclRleHQgPSBmdW5jdGlvbihjb250ZW50KSB7XG4gIHZhciBibG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcmFjdGVyX3RleHRfY29udGVudFwiKTtcbiAgdmFyIG9sZENvbnRlbnQgPSBibG9jay5pbm5lckhUTUw7XG4gIHZhciBuZXdDb250ZW50ID0gYXVnbWVudExpbmtzKGNvbnRlbnQpO1xuICBpZiAoaW50ZXJhY3RpdmUgJiYgYmxvY2sub2Zmc2V0V2lkdGggPiAwICYmIGJsb2NrLm9mZnNldEhlaWdodCA+IDApIHtcbiAgICBoaWRlQmxvY2soYmxvY2spO1xuICAgIGJsb2NrLmlubmVySFRNTCA9IG5ld0NvbnRlbnQ7XG4gICAgc2hvd0Jsb2NrKGJsb2NrKTtcbiAgICBzaG93SGlnaGxpZ2h0KGJsb2NrLnBhcmVudCk7XG4gIH0gZWxzZSB7XG4gICAgYmxvY2suaW5uZXJIVE1MID0gbmV3Q29udGVudDtcbiAgfVxufTtcblxuLyogQ2FsbCB0aGlzIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBjaGFyYWN0ZXIgcXVhbGl0eS4gRG9uJ3RcbiAqIGRpcmVjdGx5IGNoYW5nZSBxdWFsaXR5IHZhbHVlcywgYmVjYXVzZSB0aGF0IHdpbGwgbm90IHVwZGF0ZVxuICogdGhlIFVJLiAoWW91IGNhbiBjaGFuZ2UgYW55IGRhdGEgaW4gdGhlIGNoYXJhY3RlcidzIHNhbmRib3hcbiAqIGRpcmVjdGx5LCBob3dldmVyLCBzaW5jZSB0aGF0IGlzbid0IGRpc3BsYXllZCkuICovXG5TeXN0ZW0ucHJvdG90eXBlLnNldFF1YWxpdHkgPSBmdW5jdGlvbihxdWFsaXR5LCBuZXdWYWx1ZSkge1xuICB2YXIgb2xkVmFsdWUgPSBjaGFyYWN0ZXIucXVhbGl0aWVzW3F1YWxpdHldO1xuICBjaGFyYWN0ZXIucXVhbGl0aWVzW3F1YWxpdHldID0gbmV3VmFsdWU7XG4gIGlmICghaW50ZXJhY3RpdmUpIHJldHVybjtcblxuICAvLyBXb3JrIG91dCBob3cgdG8gZGlzcGxheSB0aGUgdmFsdWVzLlxuICB2YXIgbmV3RGlzcGxheTtcbiAgdmFyIHF1YWxpdHlEZWZpbml0aW9uID0gZ2FtZS5xdWFsaXRpZXNbcXVhbGl0eV07XG4gIGlmIChxdWFsaXR5RGVmaW5pdGlvbikge1xuICAgIG5ld0Rpc3BsYXkgPSBxdWFsaXR5RGVmaW5pdGlvbi5mb3JtYXQoY2hhcmFjdGVyLCBuZXdWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2Ugc2hvdWxkbid0IGRpc3BsYXkgcXVhbGl0aWVzIHRoYXQgaGF2ZSBubyBkZWZpbml0aW9uLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFkZCB0aGUgZGF0YSBibG9jaywgaWYgd2UgbmVlZCBpdC5cbiAgdmFyIHF1YWxpdHlCbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3FfXCIrcXVhbGl0eSk7XG4gIGlmIChxdWFsaXR5QmxvY2subGVuZ3RoIDw9IDApIHtcbiAgICBpZiAobmV3RGlzcGxheSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHF1YWxpdHlCbG9jayA9IGFkZFF1YWxpdHlCbG9jayhxdWFsaXR5KS5oaWRlKCkuZmFkZUluKDUwMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uXG4gICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlKSByZXR1cm47XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHZhbHVlLlxuICAgIGlmIChuZXdEaXNwbGF5ID09PSBudWxsKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGJsb2NrLCBhbmQgcG9zc2libHkgdGhlIHdob2xlIGdyb3VwLCBpZlxuICAgICAgLy8gaXQgaXMgdGhlIGxhc3QgcXVhbGl0eSBpbiB0aGUgZ3JvdXAuXG4gICAgICB2YXIgdG9SZW1vdmUgPSBudWxsO1xuICAgICAgdmFyIGdyb3VwQmxvY2sgPSBxdWFsaXR5QmxvY2sucGFyZW50cygnLnF1YWxpdHlfZ3JvdXAnKTtcbiAgICAgIGlmIChncm91cEJsb2NrLmZpbmQoJy5xdWFsaXR5JykubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgdG9SZW1vdmUgPSBncm91cEJsb2NrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9SZW1vdmUgPSBxdWFsaXR5QmxvY2s7XG4gICAgICB9XG5cbiAgICAgIHRvUmVtb3ZlLmZhZGVPdXQoMTAwMCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdG9SZW1vdmUucmVtb3ZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWxCbG9jayA9IHF1YWxpdHlCbG9jay5maW5kKFwiW2RhdGEtYXR0cj0ndmFsdWUnXVwiKTtcbiAgICAgIHZhbEJsb2NrLmZhZGVPdXQoMjUwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YWxCbG9jay5odG1sKG5ld0Rpc3BsYXkpO1xuICAgICAgICAgIHZhbEJsb2NrLmZhZGVJbig3NTApO1xuICAgICAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzaG93SGlnaGxpZ2h0KHF1YWxpdHlCbG9jayk7XG59O1xuXG4vKiBDaGFuZ2VzIGEgcXVhbGl0eSB0byBhIG5ldyB2YWx1ZSwgYnV0IGFsc28gc2hvdWxkIHNob3cgYSBwcm9ncmVzcyBiYXJcbiAqIGFuaW1hdGlvbiBvZiB0aGUgY2hhbmdlLiBSZW1vdmVkIHdpdGggdGhlIHByb2dyZXNzIGJhciBmdW5jdGlvbmFsaXR5LiAqL1xuU3lzdGVtLnByb3RvdHlwZS5hbmltYXRlUXVhbGl0eSA9IGZ1bmN0aW9uKHF1YWxpdHksIG5ld1ZhbHVlLCBvcHRzKSB7XG4gIHRoaXMuc2V0UXVhbGl0eShxdWFsaXR5LCBuZXdWYWx1ZSk7XG59O1xuXG4vKiBUaGUgY2hhcmFjdGVyIHRoYXQgaXMgcGFzc2VkIGludG8gZWFjaCBzaXR1YXRpb24gaXMgb2YgdGhpc1xuICogZm9ybS5cbiAqXG4gKiBUaGUgYHF1YWxpdGllc2AgZGF0YSBtZW1iZXIgbWFwcyB0aGUgSWRzIG9mIGVhY2ggcXVhbGl0eSB0byBpdHNcbiAqIGN1cnJlbnQgdmFsdWUuIFdoZW4gaW1wbGVtZW50aW5nIGVudGVyLCBhY3Qgb3IgZXhpdCBmdW5jdGlvbnMsXG4gKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHRoaXMgdG8gYmUgcmVhZC1vbmx5LiBNYWtlIGFsbFxuICogbW9kaWZpY2F0aW9ucyB0aHJvdWdoIGBTeXN0ZW0ucHJvdG90eXBlLnNldFF1YWxpdHlgLCBvclxuICogYFN5c3RlbS5wcm90b3R5cGUuYW5pbWF0ZVF1YWxpdHlgLiBJbiB5b3VyIGBpbml0YCBmdW5jdGlvbiwgeW91XG4gKiBjYW4gc2V0IHRoZXNlIHZhbHVlcyBkaXJlY3RseS5cbiAqXG4gKiBUaGUgYHNhbmRib3hgIGRhdGEgbWVtYmVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHlvdXIgY29kZSB0b1xuICogdHJhY2sgYW55IGRhdGEgaXQgbmVlZHMgdG8uIFRoZSBvbmx5IHByb3Zpc28gaXMgdGhhdCB0aGUgZGF0YVxuICogc3RydWN0dXJlIHNob3VsZCBiZSBzZXJpYWxpemFibGUgaW50byBKU09OICh0aGlzIG1lYW5zIGl0IG11c3RcbiAqIG9ubHkgY29uc2lzdCBvZiBwcmltaXRpdmUgdHlwZXMgW29iamVjdHMsIGFycmF5cywgbnVtYmVycyxcbiAqIGJvb2xlYW5zLCBzdHJpbmdzXSwgYW5kIGl0IG11c3Qgbm90IGNvbnRhaW4gY2lyY3VsYXIgc2VyaWVzIG9mXG4gKiByZWZlcmVuY2VzKS4gVGhlIGRhdGEgaW4gdGhlIHNhbmRib3ggaXMgbm90IGRpc3BsYXllZCBpbiB0aGVcbiAqIFVJLCBhbHRob3VnaCB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IHRvIGNyZWF0ZSBzdWl0YWJsZSBvdXRwdXRcbiAqIGZvciB0aGUgcGxheWVyLi5cbiAqL1xudmFyIENoYXJhY3RlciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnF1YWxpdGllcyA9IHt9O1xuICB0aGlzLnNhbmRib3ggPSB7fTtcbn07XG5cbi8qIFRoZSBkYXRhIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBjb250ZW50IGZvciB0aGUgZ2FtZS4gQnkgZGVmYXVsdFxuICogdGhpcyBob2xkcyBub3RoaW5nLiBJdCBpcyB0aGlzIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgcG9wdWxhdGVkXG4gKiBpbiB0aGUgYC5nYW1lLmpzYCBmaWxlLiBFYWNoIGVsZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSBpc1xuICogY29tbWVudGVkLCBiZWxvdy5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBzdGF0aWMgZGF0YSB0aGF0IG5ldmVyIGNoYW5nZXMgdGhyb3VnaCB0aGVcbiAqIGNvdXJzZSBvZiB0aGUgZ2FtZS4gSXQgaXMgbmV2ZXIgc2F2ZWQsIHNvIGFueXRoaW5nIHRoYXQgbWlnaHRcbiAqIGNoYW5nZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjaGFyYWN0ZXIuXG4gKi9cbnZhciBnYW1lID0ge1xuXG4gIC8vIFNpdHVhdGlvbnNcblxuICAvKiBBbiBvYmplY3QgbWFwcGluZyBmcm9tIHRoZSB1bmlxdWUgaWQgb2YgZWFjaCBzaXR1YXRpb24sIHRvXG4gICAqIHRoZSBzaXR1YXRpb24gb2JqZWN0IGl0c2VsZi4gVGhpcyBpcyB0aGUgaGVhcnQgb2YgdGhlIGdhbWVcbiAgICogc3BlY2lmaWNhdGlvbi4gKi9cbiAgc2l0dWF0aW9uczoge30sXG5cbiAgLyogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgc2l0dWF0aW9uIHRvIGVudGVyIGF0IHRoZSBzdGFydCBvZiBhXG4gICAqIG5ldyBnYW1lLiAqL1xuICBzdGFydDogXCJzdGFydFwiLFxuXG4gIC8vIFF1YWxpdHkgZGlzcGxheSBkZWZpbml0aW9uc1xuXG4gIC8qIEFuIG9iamVjdCBtYXBwaW5nIHRoZSB1bmlxdWUgaWQgb2YgZWFjaCBxdWFsaXR5IHRvIGl0c1xuICAgKiBRdWFsaXR5RGVmaW5pdGlvbi4gWW91IGRvbid0IG5lZWQgZGVmaW5pdGlvbnMgZm9yIGV2ZXJ5XG4gICAqIHF1YWxpdHksIGJ1dCBvbmx5IHF1YWxpdGllcyBpbiB0aGlzIG1hcHBpbmcgd2lsbCBiZVxuICAgKiBkaXNwbGF5ZWQgaW4gdGhlIGNoYXJhY3RlciBib3ggb2YgdGhlIFVJLiAqL1xuICBxdWFsaXRpZXM6IHt9LFxuXG4gIC8qIFF1YWxpdGllcyBjYW4gaGF2ZSBhbiBvcHRpb25hbCBncm91cCBJZC4gVGhpcyBtYXBzIHRob3NlXG4gICAqIElkcyB0byB0aGUgZ3JvdXAgZGVmaW5pdGlvbnMgdGhhdCBzYXlzIGhvdyB0byBmb3JtYXQgaXRzXG4gICAqIHF1YWxpdGllcy5cbiAgICovXG4gIHF1YWxpdHlHcm91cHM6IHt9LFxuXG4gIC8vIEhvb2tzXG5cbiAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBnYW1lLiBJdCBpc1xuICAgKiBub3JtYWxseSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgaW5pdGlhbCBjaGFyYWN0ZXIgY3JlYXRpb25cbiAgICogKHNldHRpbmcgaW5pdGlhbCBxdWFsaXR5IHZhbHVlcywgc2V0dGluZyB0aGVcbiAgICogY2hhcmFjdGVyLXRleHQuIFRoaXMgaXMgb3B0aW9uYWwsIGhvd2V2ZXIsIGFzIHNldC11cFxuICAgKiBwcm9jZXNzaW5nIGNvdWxkIGFsc28gYmUgZG9uZSBieSB0aGUgZmlyc3Qgc2l0dWF0aW9uJ3NcbiAgICogZW50ZXIgZnVuY3Rpb24uIElmIHRoaXMgZnVuY3Rpb24gaXMgZ2l2ZW4gaXQgc2hvdWxkIGhhdmVcbiAgICogdGhlIHNpZ25hdHVyZSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSkuXG4gICAqL1xuICBpbml0OiBudWxsLFxuXG4gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBlbnRlcmluZyBhbnkgbmV3XG4gICAqIHNpdHVhdGlvbi4gSXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBzaXR1YXRpb25cbiAgICogaGFzIGl0cyBgZW50ZXJgIG1ldGhvZCBjYWxsZWQuIEl0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudFxuICAgKiB0aW1lZCB0cmlnZ2VycywgYnV0IGlzIHRvdGFsbHkgb3B0aW9uYWwuIElmIHRoaXMgZnVuY3Rpb25cbiAgICogaXMgZ2l2ZW4gaXQgc2hvdWxkIGhhdmUgdGhlIHNpZ25hdHVyZTpcbiAgICpcbiAgICogZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIG9sZFNpdHVhdGlvbklkLCBuZXdTaXR1YXRpb25JZCk7XG4gICAqL1xuICBlbnRlcjogbnVsbCxcblxuICAvKiBIb29rIGZvciB3aGVuIHRoZSBzaXR1YXRpb24gaGFzIGFscmVhZHkgYmVlbiBjYXJyaWVkIG91dFxuICAgKiBhbmQgcHJpbnRlZC4gVGhlIHNpZ25hdHVyZSBpczpcbiAgICpcbiAgICogZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIG9sZFNpdHVhdGlvbklkLCBuZXdTaXR1YXRpb25JZCk7XG4gICAqL1xuICBhZnRlckVudGVyOiBudWxsLFxuXG4gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBjYXJyeWluZyBvdXQgYW55IGFjdGlvbiBpblxuICAgKiBhbnkgc2l0dWF0aW9uLiBJdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nXG4gICAqIHNpdHVhdGlvbiBoYXMgaXRzIGBhY3RgIG1ldGhvZCBjYWxsZWQuIElmIHRoaXMgb3B0aW9uYWxcbiAgICogZnVuY3Rpb24gaXMgZ2l2ZW4gaXQgc2hvdWxkIGhhdmUgdGhlIHNpZ25hdHVyZTpcbiAgICpcbiAgICogZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbklkLCBhY3Rpb25JZCk7XG4gICAqXG4gICAqIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZW4gaXQgaXMgaW5kaWNhdGluZyB0aGF0IGl0XG4gICAqIGhhcyBjb25zdW1lZCB0aGUgYWN0aW9uLCBhbmQgdGhlIGFjdGlvbiB3aWxsIG5vdCBiZSBwYXNzZWRcbiAgICogb24gdG8gdGhlIHNpdHVhdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgb25lIG9mXG4gICAqIHRoZXNlIGdsb2JhbCBoYW5kbGVycyB0aGF0IGNhbiBjb25zdW1lIHRoZSBldmVudC5cbiAgICovXG4gIGJlZm9yZUFjdGlvbjogbnVsbCxcblxuICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBjYXJyeWluZyBvdXQgYW55IGFjdGlvbiBpblxuICAgKiBhbnkgc2l0dWF0aW9uLiBJdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogc2l0dWF0aW9uIGhhcyBpdHMgYGFjdGAgbWV0aG9kIGNhbGxlZC4gSWYgdGhpcyBvcHRpb25hbFxuICAgKiBmdW5jdGlvbiBpcyBnaXZlbiBpdCBzaG91bGQgaGF2ZSB0aGUgc2lnbmF0dXJlOlxuICAgKlxuICAgKiBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0dWF0aW9uSWQsIGFjdGlvbklkKTtcbiAgICovXG4gIGFmdGVyQWN0aW9uOiBudWxsLFxuXG4gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGxlYXZpbmcgYW55IHNpdHVhdGlvbi4gSXQgaXNcbiAgICogY2FsbGVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIHNpdHVhdGlvbiBoYXMgaXRzIGBleGl0YFxuICAgKiBtZXRob2QgY2FsbGVkLiBJZiB0aGlzIG9wdGlvbmFsIGZ1bmN0aW9uIGlzIGdpdmVuIGl0IHNob3VsZFxuICAgKiBoYXZlIHRoZSBzaWduYXR1cmU6XG4gICAqXG4gICAqIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICAgKi9cbiAgZXhpdDogbnVsbFxufTtcbiIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENvZGUgYmVsb3cgZG9lc24ndCBmb3JtIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgZm9yIFVORFVNLCBzb1xuLy8geW91IHNob3VsZG4ndCBmaW5kIHlvdSBuZWVkIHRvIHVzZSBpdC5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVybmFsIERhdGFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qIFRoZSBnbG9iYWwgc3lzdGVtIG9iamVjdC4gKi9cbnZhciBzeXN0ZW0gPSBuZXcgU3lzdGVtKCk7XG5cbi8qIFRoaXMgaXMgdGhlIGRhdGEgb24gdGhlIHBsYXllcidzIHByb2dyZXNzIHRoYXQgZ2V0cyBzYXZlZC4gKi9cbnZhciBwcm9ncmVzcyA9IHtcbiAgLy8gQSByYW5kb20gc2VlZCBzdHJpbmcsIHVzZWQgaW50ZXJuYWxseSB0byBtYWtlIHJhbmRvbVxuICAvLyBzZXF1ZW5jZXMgcHJlZGljdGFibGUuXG5zZWVkOiBudWxsLFxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGxpbmtzIGNsaWNrZWQsIGFuZCB3aGVuLlxuICAgICAgc2VxdWVuY2U6IFtdLFxuICAgICAgLy8gVGhlIHRpbWUgd2hlbiB0aGUgcHJvZ3Jlc3Mgd2FzIHNhdmVkLlxuICAgICAgc2F2ZVRpbWU6IG51bGxcbn07XG5cbi8qIFRoZSBJZCBvZiB0aGUgY3VycmVudCBzaXR1YXRpb24gdGhlIHBsYXllciBpcyBpbi4gKi9cbnZhciBjdXJyZW50ID0gbnVsbDtcblxuLyogVGhpcyBpcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuIEl0IHNob3VsZCBiZSByZWNvbnN0cnVjdGFibGVcbiAqIGZyb20gdGhlIGFib3ZlIHByb2dyZXNzIGRhdGEuICovXG52YXIgY2hhcmFjdGVyID0gbnVsbDtcblxuLyogVHJhY2tzIHdoZXRoZXIgd2UncmUgaW4gaW50ZXJhY3RpdmUgbW9kZSBvciBiYXRjaCBtb2RlLiAqL1xudmFyIGludGVyYWN0aXZlID0gdHJ1ZTtcblxuLyogVGhlIHN5c3RlbSB0aW1lIHdoZW4gdGhlIGdhbWUgd2FzIGluaXRpYWxpemVkLiAqL1xudmFyIHN0YXJ0VGltZTtcblxuLyogVGhlIHN0YWNrIG9mIGxpbmtzLCByZXN1bHRpbmcgZnJvbSB0aGUgbGFzdCBhY3Rpb24sIHN0aWxsIGJlIHRvXG4gKiByZXNvbHZlZC4gKi9cbnZhciBsaW5rU3RhY2sgPSBudWxsO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBnZXRDdXJyZW50U2l0dWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGlmIChjdXJyZW50KSB7XG4gICAgcmV0dXJuIGdhbWUuc2l0dWF0aW9uc1tjdXJyZW50XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxudmFyIHBhcnNlID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgfVxufTtcblxudmFyIHBhcnNlTGlzdCA9IGZ1bmN0aW9uKHN0ciwgY2FuQmVVbmRlZmluZWQpIHtcbiAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkIHx8IHN0ciA9PT0gbnVsbCkge1xuICAgIGlmIChjYW5CZVVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyLnNwbGl0KC9bICxcXHRdKy8pO1xuICB9XG59O1xuXG52YXIgcGFyc2VGbiA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHZhciBmc3RyID0gXCIoZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikge1xcblwiICtcbiAgICAgIHN0ciArIFwiXFxufSlcIjtcbiAgICB2YXIgZm4gPSBldmFsKGZzdHIpO1xuICAgIHJldHVybiBmbjtcbiAgfVxufTtcblxudmFyIGxvYWRIVE1MU2l0dWF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgJGh0bWxTaXR1YXRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImRpdi5zaXR1YXRpb25cIik7XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoJGh0bWxTaXR1YXRpb25zLCBmdW5jdGlvbigkc2l0dWF0aW9uKXtcbiAgICB2YXIgaWQgPSAkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgIGFzc2VydChnYW1lLnNpdHVhdGlvbnNbaWRdID09PSB1bmRlZmluZWQsIFwiZXhpc3Rpbmdfc2l0dWF0aW9uXCIubCh7aWQ6aWR9KSk7XG5cbiAgICB2YXIgY29udGVudCA9ICRzaXR1YXRpb24uaW5uZXJIVE1MO1xuICAgIHZhciBvcHRzID0ge1xuICAgICAgLy8gU2l0dWF0aW9uIGNvbnRlbnRcbiAgICAgIG9wdGlvblRleHQ6ICRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1vcHRpb24tdGV4dFwiKSxcbiAgICAgIGNhblZpZXc6IHBhcnNlRm4oJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNhbi12aWV3XCIpKSxcbiAgICAgIGNhbkNob29zZTogcGFyc2VGbigkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImRhdGEtY2FuLWNob29zZVwiKSksXG4gICAgICBwcmlvcml0eTogcGFyc2UoJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXByaW9yaXR5XCIpKSxcbiAgICAgIGZyZXF1ZW5jeTogcGFyc2UoJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWZyZXF1ZW5jeVwiKSksXG4gICAgICBkaXNwbGF5T3JkZXI6IHBhcnNlKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1kaXNwbGF5LW9yZGVyXCIpKSxcbiAgICAgIHRhZ3M6IHBhcnNlTGlzdCgkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImRhdGEtdGFnc1wiKSwgZmFsc2UpLFxuICAgICAgLy8gU2ltcGxlIFNpdHVhdGlvbiBjb250ZW50LlxuICAgICAgaGVhZGluZzogJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhlYWRpbmdcIiksXG4gICAgICBjaG9pY2VzOiBwYXJzZUxpc3QoJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNob2ljZXNcIiksIHRydWUpLFxuICAgICAgbWluQ2hvaWNlczogcGFyc2UoJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1pbi1jaG9pY2VzXCIpKSxcbiAgICAgIG1heENob2ljZXM6IHBhcnNlKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1tYXgtY2hvaWNlc1wiKSlcbiAgICB9O1xuXG4gICAgZ2FtZS5zaXR1YXRpb25zW2lkXSA9IG5ldyBTaW1wbGVTaXR1YXRpb24oY29udGVudCwgb3B0cyk7XG4gIH0pO1xufTtcblxuXG4vKiBPdXRwdXRzIHJlZ3VsYXIgY29udGVudCB0byB0aGUgcGFnZS4gVXNlZCBieSB3cml0ZSBhbmRcbiAqIHdyaXRlQmVmb3JlLCB0aGUgbGFzdCB0d28gYXJndW1lbnRzIGNvbnRyb2wgd2hhdCBqUXVlcnkgbWV0aG9kc1xuICogYXJlIHVzZWQgdG8gYWRkIHRoZSBjb250ZW50LlxuICovXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIGNhbiBhcHBlbmQgdGV4dCwgcHJlcGVuZCB0ZXh0IG9yIHJlcGxhY2UgdGV4dCBpbiBzZWxlY3RvciB3aXRoIHRoZSBzdXBwbGllZCBvbmUuXG52YXIgZG9Xcml0ZSA9IGZ1bmN0aW9uKGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gIGNvbnRpbnVlT3V0cHV0VHJhbnNhY3Rpb24oKTtcbiAgdmFyIG91dHB1dCA9IGF1Z21lbnRMaW5rcyhjb250ZW50KTtcbiAgdmFyIGVsZW1lbnQ7XG4gIGlmIChzZWxlY3RvcikgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIC8vIFRPRE86IHNjcm9sbCB0byB0aGUgbGFzdCBwb3NpdGlvblxuICAgIGRpbWVuc2lvbnMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnNvbGUubG9nKGRpbWVuc2lvbnMpO1xuICAgIHdpbmRvdy5zY3JvbGwoMCwxNTApO1xuICAgIC8vIFRPRE86IHNjcm9sbFN0YWNrW3Njcm9sbFN0YWNrLmxlbmd0aC0xXSA9IHNjcm9sbFBvaW50OyovXG4gIH1cbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnQnKS5pbm5lckhUTUwgPSBvdXRwdXQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChvdXRwdXQpO1xuICB9XG4gIC8qIFdlIHdhbnQgdG8gc2Nyb2xsIHRoaXMgbmV3IGVsZW1lbnQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxuICAgKiB3aGlsZSBzdGlsbCBiZWluZyB2aXNpYmxlLiBUaGUgZWFzaWVzdCB3YXkgaXMgdG8gZmluZCB0aGVcbiAgICogdG9wIGVkZ2Ugb2YgdGhlICpmb2xsb3dpbmcqIGVsZW1lbnQgYW5kIG1vdmUgdGhhdCBleGFjdGx5XG4gICAqIHRvIHRoZSBib3R0b20gKHdoaWxlIHN0aWxsIGVuc3VyaW5nIHRoYXQgdGhpcyBlbGVtZW50IGlzIGZ1bGx5XG4gICAqIHZpc2libGUuKSAqL1xuICAvKnZhciBuZXh0ZWwgPSBvdXRwdXQubGFzdCgpLm5leHQoKTtcbiAgICB2YXIgc2Nyb2xsUG9pbnQ7XG4gICAgaWYgKCFuZXh0ZWwubGVuZ3RoKSB7XG4gICAgc2Nyb2xsUG9pbnQgPSAkKFwiI2NvbnRlbnRcIikuaGVpZ2h0KCkgKyAkKFwiI3RpdGxlXCIpLmhlaWdodCgpICsgNjA7XG4gICAgfSBlbHNlIHtcbiAgICBzY3JvbGxQb2ludCA9IG5leHRlbC5vZmZzZXQoKS50b3AgLSAkKHdpbmRvdykuaGVpZ2h0KCk7XG4gICAgfVxuICAgIGlmIChzY3JvbGxQb2ludCA+IG91dHB1dC5vZmZzZXQoKS50b3ApXG4gICAgc2Nyb2xsUG9pbnQgPSBvdXRwdXQub2Zmc2V0KCkudG9wO1xuICAgIHNjcm9sbFN0YWNrW3Njcm9sbFN0YWNrLmxlbmd0aC0xXSA9IHNjcm9sbFBvaW50OyovXG59O1xuXG4vKiBHZXRzIHRoZSB1bmlxdWUgaWQgdXNlZCB0byBpZGVudGlmeSBzYXZlZCBnYW1lcy4gKi9cbnZhciBnZXRTYXZlSWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICd1bmR1bV8nK2dhbWUuaWQrXCJfXCIrZ2FtZS52ZXJzaW9uO1xufTtcblxuLyogQWRkcyB0aGUgcXVhbGl0eSBibG9ja3MgdG8gdGhlIGNoYXJhY3RlciB0b29scy4gKi9cbnZhciBzaG93UXVhbGl0aWVzID0gZnVuY3Rpb24oKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVhbGl0aWVzXCIpLmlubmVySFRNTCA9ICcnO1xuICBmb3IgKHZhciBxdWFsaXR5SWQgaW4gY2hhcmFjdGVyLnF1YWxpdGllcykge1xuICAgIGFkZFF1YWxpdHlCbG9jayhxdWFsaXR5SWQpO1xuICB9XG59O1xuXG4vKiBGYWRlcyBpbiBhbmQgb3V0IGEgaGlnaGxpZ2h0IG9uIHRoZSBnaXZlbiBlbGVtZW50LiAqL1xudmFyIHNob3dIaWdobGlnaHQgPSBmdW5jdGlvbihkb21FbGVtZW50KSB7XG4gIHZhciBoaWdobGlnaHQgPSBkb21FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuaGlnaGxpZ2h0XCIpO1xuICBpZiAoaGlnaGxpZ2h0Lmxlbmd0aCA8PSAwKSB7XG4gICAgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIjxkaXY+PC9kaXY+XCIpLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodCcpO1xuICAgIGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoaGlnaGxpZ2h0KTtcbiAgfVxuICBzaG93QmxvY2soaGlnaGxpZ2h0KTtcbiAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICBoaWRlQmxvY2soaGlnaGxpZ2h0KTtcbiAgfSwgMjAwMCk7XG59O1xuXG4vKiBGaW5kcyB0aGUgY29ycmVjdCBsb2NhdGlvbiBhbmQgaW5zZXJ0cyBhIHBhcnRpY3VsYXIgRE9NIGVsZW1lbnRcbiAqIGZpdHMgaW50byBhbiBleGlzdGluZyBsaXN0IG9mIERPTSBlbGVtZW50cy4gVGhpcyBpcyBkb25lIGJ5XG4gKiBwcmlvcml0eSBvcmRlciwgc28gYWxsIGVsZW1lbnRzIChleGlzdGluZyBhbmQgbmV3KSBtdXN0IGhhdmVcbiAqIHRoZWlyIGRhdGEtcHJpb3JpdHkgYXR0cmlidXRlIHNldC4gKi9cbnZhciBpbnNlcnRBdENvcnJlY3RQb3NpdGlvbiA9IGZ1bmN0aW9uKHBhcmVudCwgbmV3SXRlbSkge1xuICB2YXIgbmV3UHJpb3JpdHkgPSBuZXdJdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1wcmlvcml0eScpO1xuICB2YXIgX2NoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuO1xuICBpZiAoX2NoaWxkcmVuICE9IHVuZGVmaW5lZClcbiAge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBfY2hpbGRyZW5baV07XG4gICAgICBpZiAobmV3UHJpb3JpdHkgPCBjaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJpb3JpdHknKSkge1xuICAgICAgICBjaGlsZC5iZWZvcmUobmV3SXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKG5ld0l0ZW0pO1xuICB9XG59O1xuXG4vKiBBZGRzIGEgbmV3IGdyb3VwIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIHRoZSBxdWFsaXR5IGxpc3QuICovXG52YXIgYWRkR3JvdXBCbG9jayA9IGZ1bmN0aW9uKGdyb3VwSWQpIHtcbiAgdmFyIGdyb3VwRGVmaW5pdGlvbiA9IGdhbWUucXVhbGl0eUdyb3Vwc1tncm91cElkXTtcblxuICAvLyBCdWlsZCB0aGUgZ3JvdXAgZGl2IHdpdGggYXBwcm9wcmlhdGUgaGVhZGluZy5cbiAgdmFyIGdyb3VwQmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YWxpdHlfZ3JvdXBcIikuY2xvbmVOb2RlKHRydWUpO1xuICBncm91cEJsb2NrLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiZ19cIitncm91cElkKTtcbiAgZ3JvdXBCbG9jay5zZXRBdHRyaWJ1dGUoXCJkYXRhLXByaW9yaXR5XCIsIGdyb3VwRGVmaW5pdGlvbi5wcmlvcml0eSk7XG5cbiAgdmFyIHRpdGxlRWxlbWVudCA9IGdyb3VwQmxvY2sucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWF0dHI9J3RpdGxlJ11cIik7XG4gIGlmIChncm91cERlZmluaXRpb24udGl0bGUpIHtcbiAgICB0aXRsZUVsZW1lbnQuaW5uZXJIVE1MID0gZ3JvdXBEZWZpbml0aW9uLnRpdGxlO1xuICB9IGVsc2Uge1xuICAgIGlmICh0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSAhPSB1bmRlZmluZWQpXG4gICAge1xuICAgICAgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGl0bGVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ3JvdXBEZWZpbml0aW9uLmV4dHJhQ2xhc3Nlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBEZWZpbml0aW9uLmV4dHJhQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgZ3JvdXBCbG9jay5hZGRDbGFzcyhncm91cERlZmluaXRpb24uZXh0cmFDbGFzc2VzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBjb3JyZWN0IHBsYWNlLlxuICB2YXIgcXVhbGl0aWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWFsaXRpZXNcIik7XG4gIGluc2VydEF0Q29ycmVjdFBvc2l0aW9uKHF1YWxpdGllcywgZ3JvdXBCbG9jayk7XG4gIHJldHVybiBncm91cEJsb2NrO1xufTtcblxuLyogQWRkcyBhIG5ldyBxdWFsaXR5IHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIHRoZSBxdWFsaXR5IGxpc3QuICovXG52YXIgYWRkUXVhbGl0eUJsb2NrID0gZnVuY3Rpb24ocXVhbGl0eUlkKSB7XG4gIC8vIE1ha2Ugc3VyZSB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyBxdWFsaXR5LlxuICB2YXIgcXVhbGl0eURlZmluaXRpb24gPSBnYW1lLnF1YWxpdGllc1txdWFsaXR5SWRdO1xuICBpZiAoIXF1YWxpdHlEZWZpbml0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZGlzcGxheSBhIHF1YWxpdHkgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkOiBcIitcbiAgICAgICAgcXVhbGl0eUlkKTtcbiAgfVxuXG4gIC8vIFdvcmsgb3V0IGhvdyB0aGUgdmFsdWUgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgdmFyIG5hbWUgPSBxdWFsaXR5RGVmaW5pdGlvbi50aXRsZTtcbiAgdmFyIHZhbCA9IHF1YWxpdHlEZWZpbml0aW9uLmZvcm1hdChcbiAgICAgIGNoYXJhY3RlciwgY2hhcmFjdGVyLnF1YWxpdGllc1txdWFsaXR5SWRdXG4gICAgICApO1xuICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAvLyBDcmVhdGUgdGhlIHF1YWxpdHkgb3V0cHV0LlxuICB2YXIgcXVhbGl0eUJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWFsaXR5XCIpLmNsb25lTm9kZSh0cnVlKTtcbiAgcXVhbGl0eUJsb2NrLnNldEF0dHJpYnV0ZShcImlkXCIsIFwicV9cIitxdWFsaXR5SWQpO1xuICBxdWFsaXR5QmxvY2suc2V0QXR0cmlidXRlKFwiZGF0YS1wcmlvcml0eVwiLCBxdWFsaXR5RGVmaW5pdGlvbi5wcmlvcml0eSk7XG4gIHF1YWxpdHlCbG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtYXR0cj0nbmFtZSddXCIpLmlubmVySFRNTCA9IG5hbWU7XG4gIHF1YWxpdHlCbG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtYXR0cj0ndmFsdWUnXVwiKS5pbm5lckhUTUwgPSB2YWw7XG4gIGlmIChxdWFsaXR5RGVmaW5pdGlvbi5leHRyYUNsYXNzZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1YWxpdHlEZWZpbml0aW9uLmV4dHJhQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVhbGl0eUJsb2NrLmNsYXNzTmFtZS5hZGQocXVhbGl0eURlZmluaXRpb24uZXh0cmFDbGFzc2VzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaW5kIG9yIGNyZWF0ZSB0aGUgZ3JvdXAgYmxvY2suXG4gIHZhciBncm91cEJsb2NrO1xuICB2YXIgZ3JvdXBJZCA9IHF1YWxpdHlEZWZpbml0aW9uLmdyb3VwO1xuICBpZiAoZ3JvdXBJZCkge1xuICAgIHZhciBncm91cCA9IGdhbWUucXVhbGl0eUdyb3Vwc1tncm91cElkXTtcbiAgICBhc3NlcnQoZ3JvdXAsIFwibm9fZ3JvdXBfZGVmaW5pdGlvblwiLmwoe2lkOiBncm91cElkfSkpO1xuICAgIGdyb3VwQmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdfXCIrZ3JvdXBJZCk7XG4gICAgaWYgKGdyb3VwQmxvY2sgPT0gbnVsbCB8fCBncm91cEJsb2NrLmxlbmd0aCA8PSAwKSB7XG4gICAgICBncm91cEJsb2NrID0gYWRkR3JvdXBCbG9jayhncm91cElkKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3NpdGlvbiBpdCBjb3JyZWN0bHkuXG4gIHZhciBncm91cFF1YWxpdHlMaXN0ID0gZ3JvdXBCbG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiLnF1YWxpdGllc19pbl9ncm91cFwiKTtcbiAgaW5zZXJ0QXRDb3JyZWN0UG9zaXRpb24oZ3JvdXBRdWFsaXR5TGlzdCwgcXVhbGl0eUJsb2NrKTtcbiAgcmV0dXJuIHF1YWxpdHlCbG9jaztcbn07XG5cbi8qIE91dHB1dCBldmVudHMgYXJlIHRyYWNrZWQsIHNvIHdlIGNhbiBtYWtlIHN1cmUgd2Ugc2Nyb2xsXG4gKiBjb3JyZWN0bHkuIFdlIGRvIHRoaXMgaW4gYSBzdGFjayBiZWNhdXNlIG9uZSBjbGljayBtaWdodCBjYXVzZVxuICogYSBjaGFpbiByZWFjdGlvbi4gT2Ygb3V0cHV0IGV2ZW50cywgb25seSB3aGVuIHdlIHJldHVybiB0byB0aGVcbiAqIHRvcCBsZXZlbCB3aWxsIHdlIGRvIHRoZSBzY3JvbGwuXG4gKlxuICogSG93ZXZlciwgdGhhdCBsZWF2ZXMgdGhlIHF1ZXN0aW9uIG9mIHdoZXJlIHRvIHNjcm9sbCAqdG8qLlxuICogKFJlbWVtYmVyIHRoYXQgZWxlbWVudHMgY291bGQgYmUgaW5zZXJ0ZWQgYW55d2hlcmUgaW4gdGhlXG4gKiBkb2N1bWVudC4pIFdoZW5ldmVyIHdlIGRvIGEgd3JpdGUoKSwgd2UnbGwgaGF2ZSB0byB1cGRhdGUgdGhlXG4gKiB0b3AgKGxhc3QpIHN0YWNrIGVsZW1lbnQgdG8gdGhhdCBwb3NpdGlvbi5cbiAqL1xudmFyIHNjcm9sbFN0YWNrID0gW107XG52YXIgcGVuZGluZ0ZpcnN0V3JpdGUgPSBmYWxzZTtcbnZhciBzdGFydE91dHB1dFRyYW5zYWN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGlmIChzY3JvbGxTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICBwZW5kaW5nRmlyc3RXcml0ZSA9IHRydWU7XG4gIH1cbiAgLy8gVGhlIGRlZmF1bHQgaXMgXCJhbGwgdGhlIHdheSBkb3duXCIuXG4gIHNjcm9sbFN0YWNrLnB1c2goXG4gICAgICAkKFwiI2NvbnRlbnRcIikuaGVpZ2h0KCkgKyAkKFwiI3RpdGxlXCIpLmhlaWdodCgpICsgNjBcbiAgICAgICk7XG59O1xudmFyIGNvbnRpbnVlT3V0cHV0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHBlbmRpbmdGaXJzdFdyaXRlKSB7XG4gICAgcGVuZGluZ0ZpcnN0V3JpdGUgPSBmYWxzZTtcbiAgICB2YXIgc2VwYXJhdG9yID0gJChcIiN1aV9saWJyYXJ5ICN0dXJuX3NlcGFyYXRvclwiKS5jbG9uZSgpO1xuICAgIHNlcGFyYXRvci5yZW1vdmVBdHRyKFwiaWRcIik7XG4gICAgJChcIiNjb250ZW50XCIpLmFwcGVuZChzZXBhcmF0b3IpO1xuICB9XG59O1xudmFyIGVuZE91dHB1dFRyYW5zYWN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzY3JvbGxQb2ludCA9IHNjcm9sbFN0YWNrLnBvcCgpO1xuICBpZiAoc2Nyb2xsU3RhY2subGVuZ3RoID09PSAwICYmIHNjcm9sbFBvaW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGludGVyYWN0aXZlKSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsKDAsc2Nyb2xsUG9pbnQpO1xuICAgIH1cbiAgICBzY3JvbGxQb2ludCA9IG51bGw7XG4gIH1cbn07XG5cbi8qIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGxpbmsgbmVlZHMgdG8gYmUgZm9sbG93ZWQsIHJlZ2FyZGxlc3NcbiAqIG9mIHdoZXRoZXIgaXQgd2FzIHVzZXIgYWN0aW9uIHRoYXQgaW5pdGlhdGVkIGl0LiAqL1xudmFyIGxpbmtSZSA9IC9eKFthLXowLTlfLV0rfFxcLikoXFwvKFswLTlhLXpfLV0rKSk/JC87XG52YXIgcHJvY2Vzc0xpbmsgPSBmdW5jdGlvbihjb2RlKSB7XG4gIC8vIENoZWNrIGlmIHdlIHNob3VsZCBkbyB0aGlzIG5vdywgb3IgaWYgcHJvY2Vzc2luZyBpcyBhbHJlYWR5XG4gIC8vIHVuZGVyd2F5LlxuICBpZiAobGlua1N0YWNrICE9PSBudWxsKSB7XG4gICAgbGlua1N0YWNrLnB1c2goY29kZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHJhY2sgd2hlcmUgd2UncmUgYWJvdXQgdG8gYWRkIG5ldyBjb250ZW50LlxuICBzdGFydE91dHB1dFRyYW5zYWN0aW9uKCk7XG5cbiAgLy8gV2UncmUgcHJvY2Vzc2luZywgc28gbWFrZSB0aGUgc3RhY2sgYXZhaWxhYmxlLlxuICBsaW5rU3RhY2sgPSBbXTtcblxuICAvLyBIYW5kbGUgZWFjaCBsaW5rIGluIHR1cm4uXG4gIHByb2Nlc3NPbmVMaW5rKGNvZGUpO1xuICB3aGlsZSAobGlua1N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb2RlID0gbGlua1N0YWNrLnNoaWZ0KCk7XG4gICAgcHJvY2Vzc09uZUxpbmsoY29kZSk7XG4gIH1cblxuICAvLyBXZSdyZSBkb25lLCBzbyByZW1vdmUgdGhlIHN0YWNrIHRvIHByZXZlbnQgZnV0dXJlIHB1c2hlcy5cbiAgbGlua1N0YWNrID0gbnVsbDtcblxuICAvLyBTY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgbmV3IGNvbnRlbnQuXG4gIGVuZE91dHB1dFRyYW5zYWN0aW9uKCk7XG5cbiAgLy8gV2UncmUgYWJsZSB0byBzYXZlLCBpZiB3ZSB3ZXJlbid0IGFscmVhZHkuXG4gICQoXCIjc2F2ZVwiKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbn07XG5cbi8qIFRoaXMgZ2V0cyBjYWxsZWQgdG8gYWN0dWFsbHkgZG8gdGhlIHdvcmsgb2YgcHJvY2Vzc2luZyBhIGNvZGUuXG4gKiBXaGVuIG9uZSBkb0xpbmsgaXMgY2FsbGVkIChvciBhIGxpbmsgaXMgY2xpY2tlZCksIHRoaXMgbWF5IHNldCBjYWxsXG4gKiBjb2RlIHRoYXQgZnVydGhlciBjYWxscyBkb0xpbmssIGFuZCBzbyBvbi4gVGhpcyBtZXRob2QgcHJvY2Vzc2VzXG4gKiBlYWNoIG9uZSwgYW5kIHByb2Nlc3NMaW5rIG1hbmFnZXMgdGhpcy5cbiAqL1xudmFyIHByb2Nlc3NPbmVMaW5rID0gZnVuY3Rpb24oY29kZSkge1xuICB2YXIgbWF0Y2ggPSBjb2RlLm1hdGNoKGxpbmtSZSk7XG4gIGFzc2VydChtYXRjaCwgXCJsaW5rX25vdF92YWxpZFwiLmwoe2xpbms6Y29kZX0pKTtcblxuICB2YXIgc2l0dWF0aW9uID0gbWF0Y2hbMV07XG4gIHZhciBhY3Rpb24gPSBtYXRjaFszXTtcblxuICAvLyBDaGFuZ2UgdGhlIHNpdHVhdGlvblxuICBpZiAoc2l0dWF0aW9uICE9PSAnLicpIHtcbiAgICBpZiAoc2l0dWF0aW9uICE9PSBjdXJyZW50KSB7XG4gICAgICBkb1RyYW5zaXRpb25UbyhzaXR1YXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbiBhY3Rpb24gaWYgd2UgaGF2ZSBubyBzaXR1YXRpb24gY2hhbmdlLlxuICAgIGFzc2VydChhY3Rpb24sIFwibGlua19ub19hY3Rpb25cIi5sKCkpO1xuICB9XG5cbiAgLy8gQ2Fycnkgb3V0IHRoZSBhY3Rpb25cbiAgaWYgKGFjdGlvbikge1xuICAgIHNpdHVhdGlvbiA9IGdldEN1cnJlbnRTaXR1YXRpb24oKTtcbiAgICBpZiAoc2l0dWF0aW9uKSB7XG4gICAgICBpZiAoZ2FtZS5iZWZvcmVBY3Rpb24pIHtcbiAgICAgICAgLy8gVHJ5IHRoZSBnbG9iYWwgYWN0IGhhbmRsZXIsIGFuZCBzZWUgaWYgd2UgbmVlZFxuICAgICAgICAvLyB0byBub3RpZnkgdGhlIHNpdHVhdGlvbi5cbiAgICAgICAgdmFyIGNvbnN1bWVkID0gZ2FtZS5iZWZvcmVBY3Rpb24oXG4gICAgICAgICAgICBjaGFyYWN0ZXIsIHN5c3RlbSwgY3VycmVudCwgYWN0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICBpZiAoY29uc3VtZWQgIT09IHRydWUpIHtcbiAgICAgICAgICBzaXR1YXRpb24uYWN0KGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSBoYXZlIG5vIGdsb2JhbCBhY3QgaGFuZGxlciwgYWx3YXlzIG5vdGlmeVxuICAgICAgICAvLyB0aGUgc2l0dWF0aW9uLlxuICAgICAgICBzaXR1YXRpb24uYWN0KGNoYXJhY3Rlciwgc3lzdGVtLCBhY3Rpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGdhbWUuYWZ0ZXJBY3Rpb24pIHtcbiAgICAgICAgZ2FtZS5hZnRlckFjdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgY3VycmVudCwgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8qIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBsaW5rIHRvIGNhcnJ5IG91dCBhblxuICogYWN0aW9uLiAqL1xudmFyIHByb2Nlc3NDbGljayA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgdmFyIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKiAwLjAwMTtcbiAgc3lzdGVtLnRpbWUgPSBub3cgLSBzdGFydFRpbWU7XG4gIHByb2dyZXNzLnNlcXVlbmNlLnB1c2goe2xpbms6Y29kZSwgd2hlbjpzeXN0ZW0udGltZX0pO1xuICBwcm9jZXNzTGluayhjb2RlKTtcbn07XG5cbi8qIFRyYW5zaXRpb25zIGJldHdlZW4gc2l0dWF0aW9ucy4gKi9cbnZhciBkb1RyYW5zaXRpb25UbyA9IGZ1bmN0aW9uKG5ld1NpdHVhdGlvbklkKSB7XG4gIHZhciBvbGRTaXR1YXRpb25JZCA9IGN1cnJlbnQ7XG4gIHZhciBvbGRTaXR1YXRpb24gPSBnZXRDdXJyZW50U2l0dWF0aW9uKCk7XG4gIHZhciBuZXdTaXR1YXRpb24gPSBnYW1lLnNpdHVhdGlvbnNbbmV3U2l0dWF0aW9uSWRdO1xuXG4gIGFzc2VydChuZXdTaXR1YXRpb24sIFwidW5rbm93bl9zaXR1YXRpb25cIi5sKHtpZDpuZXdTaXR1YXRpb25JZH0pKTtcblxuICAvLyBXZSBtaWdodCBub3QgaGF2ZSBhbiBvbGQgc2l0dWF0aW9uIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mXG4gIC8vIHRoZSBnYW1lLlxuICBpZiAob2xkU2l0dWF0aW9uKSB7XG4gICAgLy8gTm90aWZ5IHRoZSBleGl0aW5nIHNpdHVhdGlvbi5cbiAgICBvbGRTaXR1YXRpb24uZXhpdChjaGFyYWN0ZXIsIHN5c3RlbSwgbmV3U2l0dWF0aW9uSWQpO1xuICAgIGlmIChnYW1lLmV4aXQpIHtcbiAgICAgIGdhbWUuZXhpdChjaGFyYWN0ZXIsIHN5c3RlbSwgb2xkU2l0dWF0aW9uSWQsIG5ld1NpdHVhdGlvbklkKTtcbiAgICB9XG4gIH1cblxuICAvLyAgUmVtb3ZlIGxpbmtzIGFuZCB0cmFuc2llbnQgc2VjdGlvbnMuXG4gIHZhciBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpO1xuICBsaW5rcyA9IGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbChcImFcIik7XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGlua3MsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgdmFyIGEgPSBlbGVtZW50O1xuICAgIGlmIChhLmNsYXNzTGlzdC5jb250YWlucygnc3RpY2t5JykgfHwgYS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLm1hdGNoKC9bPyZdc3RpY2t5Wz0mXT8vKSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAoYS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLm1hdGNoKC9bPyZddHJhbnNpZW50Wz0mXT8vKSkge1xuICAgICAgaGlkZUJsb2NrKGEpO1xuICAgIH1cbiAgICBhLmlubmVySFRNTCA9IFwiPHNwYW4gY2xhc3M9J2V4X2xpbmsnPlwiK2EuaW5uZXJIVE1MK1wiPC9zcGFuPlwiO1xuICB9KTtcbiAgaGlkZUJsb2NrKGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbChcIi50cmFuc2llbnRcIikpO1xuICBoaWRlQmxvY2soY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKFwidWwub3B0aW9uc1wiKSk7XG5cbiAgLy8gTW92ZSB0aGUgY2hhcmFjdGVyLlxuICBjdXJyZW50ID0gbmV3U2l0dWF0aW9uSWQ7XG5cbiAgLy8gTm90aWZ5IHRoZSBpbmNvbWluZyBzaXR1YXRpb24uXG4gIGlmIChnYW1lLmVudGVyKSB7XG4gICAgZ2FtZS5lbnRlcihjaGFyYWN0ZXIsIHN5c3RlbSwgb2xkU2l0dWF0aW9uSWQsIG5ld1NpdHVhdGlvbklkKTtcbiAgfVxuICBuZXdTaXR1YXRpb24uZW50ZXIoY2hhcmFjdGVyLCBzeXN0ZW0sIG9sZFNpdHVhdGlvbklkKTtcblxuICAvLyBhZGRpdGlvbmFsIGhvb2sgZm9yIHdoZW4gdGhlIHNpdHVhdGlvbiB0ZXh0IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZFxuICBpZiAoZ2FtZS5hZnRlckVudGVyKSB7XG4gICAgZ2FtZS5hZnRlckVudGVyKGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICB9XG59O1xuXG4vKiBSZXR1cm5zIEhUTUwgZnJvbSB0aGUgZ2l2ZW4gY29udGVudCB3aXRoIHRoZSBub24tcmF3IGxpbmtzXG4gKiB3aXJlZCB1cC4gXG4gKiBAcGFyYW0gY29udGVudCBzdHJpbmcgSFRNTCBjb2RlIFxuICogQHJldHZhbCBzdHJpbmcgKi9cbnZhciBhdWdtZW50TGlua3MgPSBmdW5jdGlvbihjb250ZW50KSB7XG4gIC8vIFdpcmUgdXAgdGhlIGxpbmtzIGZvciByZWd1bGFyIDxhPiB0YWdzLlxuICBvdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3V0cHV0LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gIHZhciBsaW5rcyA9IG91dHB1dC5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsaW5rcywgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpe1xuICAgIHZhciBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBpZiAoIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmF3XCIpfHwgaHJlZi5tYXRjaCgvWz8mXXJhd1s9Jl0/LykpIHtcbiAgICAgIGlmIChocmVmLm1hdGNoKGxpbmtSZSkpIHtcbiAgICAgICAgZWxlbWVudC5vbmNsaWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYSBvbmNlLWNsaWNrLCByZW1vdmUgYWxsIG1hdGNoaW5nIGxpbmtzLlxuICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcIm9uY2VcIikgfHwgaHJlZi5tYXRjaCgvWz8mXW9uY2VbPSZdPy8pKSB7XG4gICAgICAgICAgICBzeXN0ZW0uY2xlYXJMaW5rcyhocmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm9jZXNzQ2xpY2soaHJlZik7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicmF3XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG91dHB1dC5pbm5lckhUTUw7XG59O1xuXG4vKiBFcmFzZXMgdGhlIGNoYXJhY3RlciBpbiBsb2NhbCBzdG9yYWdlLiBUaGlzIGlzIHBlcm1hbmVudCEgKi9cbnZhciBkb0VyYXNlID0gZnVuY3Rpb24oZm9yY2UpIHtcbiAgdmFyIHNhdmVJZCA9IGdldFNhdmVJZCgpO1xuICBpZiAobG9jYWxTdG9yYWdlW3NhdmVJZF0pIHtcbiAgICBpZiAoZm9yY2UgfHwgY29uZmlybShcImVyYXNlX21lc3NhZ2VcIi5sKCkpKSB7XG4gICAgICBkZWxldGUgbG9jYWxTdG9yYWdlW3NhdmVJZF07XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVyYXNlXCIpLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIHN0YXJ0R2FtZSgpO1xuICAgIH1cbiAgfVxufTtcblxuLyogRmluZCBhbmQgcmV0dXJuIGEgbGlzdCBvZiBpZHMgZm9yIGFsbCBzaXR1YXRpb25zIHdpdGggdGhlIGdpdmVuIHRhZy4gKi9cbnZhciBnZXRTaXR1YXRpb25JZHNXaXRoVGFnID0gZnVuY3Rpb24odGFnKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIgc2l0dWF0aW9uSWQgaW4gZ2FtZS5zaXR1YXRpb25zKSB7XG4gICAgdmFyIHNpdHVhdGlvbiA9IGdhbWUuc2l0dWF0aW9uc1tzaXR1YXRpb25JZF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpdHVhdGlvbi50YWdzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoc2l0dWF0aW9uLnRhZ3NbaV0gPT0gdGFnKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHNpdHVhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBTZXQgdXAgdGhlIHNjcmVlbiBmcm9tIHNjcmF0Y2ggdG8gcmVmbGVjdCB0aGUgY3VycmVudCBnYW1lXG4gKiBzdGF0ZS4gKi9cbnZhciBpbml0R2FtZURpc3BsYXkgPSBmdW5jdGlvbigpIHtcbiAgLy8gVHJhbnNpdGlvbiBpbnRvIHRoZSBmaXJzdCBzaXR1YXRpb24sXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGVudFwiKS5pbm5lckhUTUwgPSBcIlwiO1xuXG4gIHZhciBzaXR1YXRpb24gPSBnZXRDdXJyZW50U2l0dWF0aW9uKCk7XG4gIGFzc2VydChzaXR1YXRpb24sIFwibm9fY3VycmVudF9zaXR1YXRpb25cIi5sKCkpO1xuXG4gIHNob3dRdWFsaXRpZXMoKTtcbn07XG5cbi8qIENsZWFyIHRoZSBjdXJyZW50IGdhbWUgb3V0cHV0IGFuZCBzdGFydCBhZ2Fpbi4gKi9cbnZhciBzdGFydEdhbWUgPSBmdW5jdGlvbigpIHtcbiAgcHJvZ3Jlc3Muc2VlZCA9IG5ldyBEYXRlKCkudG9TdHJpbmcoKTtcblxuICBjaGFyYWN0ZXIgPSBuZXcgQ2hhcmFjdGVyKCk7XG4gIHN5c3RlbS5ybmQgPSBuZXcgUmFuZG9tKHByb2dyZXNzLnNlZWQpO1xuICBwcm9ncmVzcy5zZXF1ZW5jZSA9IFt7bGluazpnYW1lLnN0YXJ0LCB3aGVuOjB9XTtcblxuICAvLyBFbXB0eSB0aGUgZGlzcGxheVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikuaW5uZXJIVE1MID0gJyc7XG5cbiAgLy8gU3RhcnQgdGhlIGdhbWVcbiAgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKiAwLjAwMTtcbiAgc3lzdGVtLnRpbWUgPSAwO1xuICBpZiAoZ2FtZS5pbml0KSBnYW1lLmluaXQoY2hhcmFjdGVyLCBzeXN0ZW0pO1xuICBzaG93UXVhbGl0aWVzKCk7XG5cbiAgLy8gRG8gdGhlIGZpcnN0IHN0YXRlLlxuICBkb1RyYW5zaXRpb25UbyhnYW1lLnN0YXJ0KTtcbn07XG5cbi8qIFNhdmVzIHRoZSBjaGFyYWN0ZXIgdG8gbG9jYWwgc3RvcmFnZS4gKi9cbnZhciBzYXZlR2FtZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBTdG9yZSB3aGVuIHdlJ3JlIHNhdmluZyB0aGUgZ2FtZSwgdG8gYXZvaWQgZXhwbG9pdHMgd2hlcmUgYVxuICAvLyBwbGF5ZXIgbG9hZHMgdGhlaXIgZmlsZSB0byBnYWluIGV4dHJhIHRpbWUuXG4gIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpICogMC4wMDE7XG4gIHByb2dyZXNzLnNhdmVUaW1lID0gbm93IC0gc3RhcnRUaW1lO1xuXG4gIC8vIFNhdmUgdGhlIGdhbWUuXG4gIGxvY2FsU3RvcmFnZVtnZXRTYXZlSWQoKV0gPSBKU09OLnN0cmluZ2lmeShwcm9ncmVzcyk7XG5cbiAgLy8gU3dpdGNoIHRoZSBidXR0b24gaGlnaGxpZ2h0cy5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlcmFzZVwiKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgZmFsc2UpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhdmVcIikuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xufTtcblxuLyogTG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgZ2l2ZW4gZGF0YSAqL1xudmFyIGxvYWRHYW1lID0gZnVuY3Rpb24oY2hhcmFjdGVyRGF0YSkge1xuICBwcm9ncmVzcyA9IGNoYXJhY3RlckRhdGE7XG5cbiAgY2hhcmFjdGVyID0gbmV3IENoYXJhY3RlcigpO1xuICBzeXN0ZW0ucm5kID0gbmV3IFJhbmRvbShwcm9ncmVzcy5zZWVkKTtcblxuICAvLyBFbXB0eSB0aGUgZGlzcGxheVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikuaW5uZXJIVE1MID0gXCJcIjtcbiAgc2hvd1F1YWxpdGllcygpO1xuXG4gIC8vIE5vdyBwbGF5IHRocm91Z2ggdGhlIGFjdGlvbnMgc28gZmFyOlxuICBpZiAoZ2FtZS5pbml0KSBnYW1lLmluaXQoY2hhcmFjdGVyLCBzeXN0ZW0pO1xuXG4gIC8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgcGxheWVyJ3MgaGlzdG9yeS5cbiAgaW50ZXJhY3RpdmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9ncmVzcy5zZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdGVwID0gcHJvZ3Jlc3Muc2VxdWVuY2VbaV07XG4gICAgLy8gVGhlIGFjdGlvbiBtdXN0IGJlIGRvbmUgYXQgdGhlIHJlY29yZGVkIHRpbWUuXG4gICAgc3lzdGVtLnRpbWUgPSBzdGVwLndoZW47XG4gICAgcHJvY2Vzc0xpbmsoc3RlcC5saW5rKTtcbiAgfVxuICBpbnRlcmFjdGl2ZSA9IHRydWU7XG5cbiAgLy8gUmV2ZXJzZSBlbmdpbmVlciB0aGUgc3RhcnQgdGltZS5cbiAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICogMC4wMDE7XG4gIHN0YXJ0VGltZSA9IG5vdyAtIHByb2dyZXNzLnNhdmVUaW1lO1xuXG4gIC8vIEJlY2F1c2Ugd2UgZGlkIHRoZSBydW4gdGhyb3VnaCBub24taW50ZXJhY3RpdmVseSwgbm93IHdlXG4gIC8vIG5lZWQgdG8gdXBkYXRlIHRoZSBVSS5cbiAgc2hvd1F1YWxpdGllcygpO1xufTtcblxuLy8gSW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCBiYXNlZCBvbiB0aGUgY29kZSBwcm92aWRlZCBieSBPcmVvbGVrLlxuKGZ1bmN0aW9uKCkge1xuIHZhciBjb2Rlc1RvVHJ5ID0ge307XG4gLyogQ29tcGlsZXMgYSBsaXN0IG9mIGZhbGxiYWNrIGxhbmd1YWdlcyB0byB0cnkgaWYgdGhlIGdpdmVuIGNvZGVcbiAgKiBkb2Vzbid0IGhhdmUgdGhlIG1lc3NhZ2Ugd2UgbmVlZC4gQ2FjaGVzIGl0IGZvciBmdXR1cmUgdXNlLiAqL1xuIHZhciBnZXRDb2Rlc1RvVHJ5ID0gZnVuY3Rpb24obGFuZ3VhZ2VDb2RlKSB7XG4gdmFyIGNvZGVBcnJheSA9IGNvZGVzVG9UcnlbbGFuZ3VhZ2VDb2RlXTtcbiBpZiAoY29kZUFycmF5KSByZXR1cm4gY29kZUFycmF5O1xuXG4gY29kZUFycmF5ID0gW107XG4gaWYgKGxhbmd1YWdlQ29kZSBpbiB1bmR1bS5sYW5ndWFnZSkge1xuIGNvZGVBcnJheS5wdXNoKGxhbmd1YWdlQ29kZSk7XG4gfVxuIHZhciBlbGVtZW50cyA9IGxhbmd1YWdlQ29kZS5zcGxpdCgnLScpO1xuIGZvciAodmFyIGkgPSBlbGVtZW50cy5sZW5ndGgtMjsgaSA+IDA7IGktLSkge1xuIHZhciB0aGlzQ29kZSA9IGVsZW1lbnRzLnNsaWNlKDAsIGkpLmpvaW4oJy0nKTtcbiBpZiAodGhpc0NvZGUgaW4gdW5kdW0ubGFuZ3VhZ2UpIHtcbiBjb2RlQXJyYXkucHVzaCh0aGlzQ29kZSk7XG4gfVxuIH1cbiBjb2RlQXJyYXkucHVzaChcIlwiKTtcbiBjb2Rlc1RvVHJ5W2xhbmd1YWdlQ29kZV0gPSBjb2RlQXJyYXk7XG4gcmV0dXJuIGNvZGVBcnJheTtcbiB9O1xuIHZhciBsb29rdXAgPSBmdW5jdGlvbihsYW5ndWFnZUNvZGUsIG1lc3NhZ2UpIHtcbiAgIHZhciBsYW5ndWFnZURhdGEgPSB1bmR1bS5sYW5ndWFnZVtsYW5ndWFnZUNvZGVdO1xuICAgaWYgKCFsYW5ndWFnZURhdGEpIHJldHVybiBudWxsO1xuICAgcmV0dXJuIGxhbmd1YWdlRGF0YVttZXNzYWdlXTtcbiB9O1xuIHZhciBsb2NhbGl6ZSA9IGZ1bmN0aW9uKGxhbmd1YWdlQ29kZSwgbWVzc2FnZSkge1xuICAgdmFyIGxvY2FsaXplZCwgdGhpc0NvZGU7XG4gICB2YXIgbGFuZ3VhZ2VDb2RlcyA9IGdldENvZGVzVG9UcnkobGFuZ3VhZ2VDb2RlKTtcbiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFuZ3VhZ2VDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICB0aGlzQ29kZSA9IGxhbmd1YWdlQ29kZXNbaV07XG4gICAgIGxvY2FsaXplZCA9IGxvb2t1cCh0aGlzQ29kZSwgbWVzc2FnZSk7XG4gICAgIGlmIChsb2NhbGl6ZWQpIHJldHVybiBsb2NhbGl6ZWQ7XG4gICB9XG4gICByZXR1cm4gbWVzc2FnZTtcbiB9O1xuXG4gLy8gQVBJXG4gU3RyaW5nLnByb3RvdHlwZS5sID0gZnVuY3Rpb24oYXJncykge1xuICAgLy8gR2V0IGxhbmcgYXR0cmlidXRlIGZyb20gaHRtbCB0YWcuXG4gICB2YXIgbGFuZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpLmdldEF0dHJpYnV0ZShcImxhbmdcIikgfHwgXCJcIjtcblxuICAgLy8gRmluZCB0aGUgbG9jYWxpemVkIGZvcm0uXG4gICB2YXIgbG9jYWxpemVkID0gbG9jYWxpemUobGFuZywgdGhpcyk7XG5cbiAgIC8vIE1lcmdlIGluIGFueSByZXBsYWNlbWVudCBjb250ZW50LlxuICAgaWYgKGFyZ3MpIHtcbiAgICAgZm9yICh2YXIgbmFtZSBpbiBhcmdzKSB7XG4gICAgICAgbG9jYWxpemVkID0gbG9jYWxpemVkLnJlcGxhY2UoXG4gICAgICAgICAgIG5ldyBSZWdFeHAoXCJcXFxce1wiK25hbWUrXCJcXFxcfVwiKSwgYXJnc1tuYW1lXVxuICAgICAgICAgICApO1xuICAgICB9XG4gICB9XG4gICByZXR1cm4gbG9jYWxpemVkO1xuIH07XG59KSgpO1xuXG4vLyBSYW5kb20gTnVtYmVyIGdlbmVyYXRpb24gYmFzZWQgb24gc2VlZHJhbmRvbS5qcyBjb2RlIGJ5IERhdmlkIEJhdS5cbi8vIENvcHlyaWdodCAyMDEwIERhdmlkIEJhdSwgYWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yXG4vLyB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmdcbi8vIGNvbmRpdGlvbnMgYXJlIG1ldDpcbi8vXG4vLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmVcbi8vICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuLy8gICAgICBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vXG4vLyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbi8vICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZVxuLy8gICAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbi8vICAgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbi8vXG4vLyAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhpcyBtb2R1bGUgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbi8vICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuLy8gICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW5cbi8vICAgICAgcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkRcbi8vIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUyxcbi8vIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuLy8gRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUlxuLy8gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVRcbi8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuLy8gTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTilcbi8vIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuLy8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SXG4vLyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxuLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbnZhciBSYW5kb20gPSAoZnVuY3Rpb24oKSB7XG4gIC8vIFdpdGhpbiB0aGlzIGNsb3N1cmUgZnVuY3Rpb24gdGhlIGNvZGUgaXMgYmFzaWNhbGx5XG4gIC8vIERhdmlkJ3MuIFVuZHVtJ3MgY3VzdG9tIGV4dGVuc2lvbnMgYXJlIGFkZGVkIHRvIHRoZVxuICAvLyBwcm90b3R5cGUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgd2lkdGggPSAyNTY7XG4gIHZhciBjaHVua3MgPSA2O1xuICB2YXIgc2lnbmlmaWNhbmNlRXhwb25lbnQgPSA1MjtcbiAgdmFyIHN0YXJ0ZGVub20gPSBNYXRoLnBvdyh3aWR0aCwgY2h1bmtzKTtcbiAgdmFyIHNpZ25pZmljYW5jZSA9IE1hdGgucG93KDIsIHNpZ25pZmljYW5jZUV4cG9uZW50KTtcbiAgdmFyIG92ZXJmbG93ID0gc2lnbmlmaWNhbmNlICogMjtcblxuICB2YXIgUmFuZG9tID0gZnVuY3Rpb24oc2VlZCkge1xuICAgIHRoaXMucmFuZG9tID0gbnVsbDtcbiAgICBpZiAoIXNlZWQpIHRocm93IHtcbiAgICAgIG5hbWU6IFwiUmFuZG9tU2VlZEVycm9yXCIsXG4gICAgICBtZXNzYWdlOiBcInJhbmRvbV9zZWVkX2Vycm9yXCIubCgpXG4gICAgfTtcbiAgICB2YXIga2V5ID0gW107XG4gICAgbWl4a2V5KHNlZWQsIGtleSk7XG4gICAgdmFyIGFyYzQgPSBuZXcgQVJDNChrZXkpO1xuICAgIHRoaXMucmFuZG9tID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbiA9IGFyYzQuZyhjaHVua3MpO1xuICAgICAgdmFyIGQgPSBzdGFydGRlbm9tO1xuICAgICAgdmFyIHggPSAwO1xuICAgICAgd2hpbGUgKG4gPCBzaWduaWZpY2FuY2UpIHtcbiAgICAgICAgbiA9IChuICsgeCkgKiB3aWR0aDtcbiAgICAgICAgZCAqPSB3aWR0aDtcbiAgICAgICAgeCA9IGFyYzQuZygxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChuID49IG92ZXJmbG93KSB7XG4gICAgICAgIG4gLz0gMjtcbiAgICAgICAgZCAvPSAyO1xuICAgICAgICB4ID4+Pj0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobiArIHgpIC8gZDtcbiAgICB9O1xuICB9O1xuICAvLyBIZWxwZXIgdHlwZS5cbiAgdmFyIEFSQzQgPSBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgdCwgdSwgbWUgPSB0aGlzLCBrZXlsZW4gPSBrZXkubGVuZ3RoO1xuICAgIHZhciBpID0gMCwgaiA9IG1lLmkgPSBtZS5qID0gbWUubSA9IDA7XG4gICAgbWUuUyA9IFtdO1xuICAgIG1lLmMgPSBbXTtcbiAgICBpZiAoIWtleWxlbikgeyBrZXkgPSBba2V5bGVuKytdOyB9XG4gICAgd2hpbGUgKGkgPCB3aWR0aCkgeyBtZS5TW2ldID0gaSsrOyB9XG4gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgIHQgPSBtZS5TW2ldO1xuICAgICAgaiA9IGxvd2JpdHMoaiArIHQgKyBrZXlbaSAlIGtleWxlbl0pO1xuICAgICAgdSA9IG1lLlNbal07XG4gICAgICBtZS5TW2ldID0gdTtcbiAgICAgIG1lLlNbal0gPSB0O1xuICAgIH1cbiAgICBtZS5nID0gZnVuY3Rpb24gZ2V0bmV4dChjb3VudCkge1xuICAgICAgdmFyIHMgPSBtZS5TO1xuICAgICAgdmFyIGkgPSBsb3diaXRzKG1lLmkgKyAxKTsgdmFyIHQgPSBzW2ldO1xuICAgICAgdmFyIGogPSBsb3diaXRzKG1lLmogKyB0KTsgdmFyIHUgPSBzW2pdO1xuICAgICAgc1tpXSA9IHU7XG4gICAgICBzW2pdID0gdDtcbiAgICAgIHZhciByID0gc1tsb3diaXRzKHQgKyB1KV07XG4gICAgICB3aGlsZSAoLS1jb3VudCkge1xuICAgICAgICBpID0gbG93Yml0cyhpICsgMSk7IHQgPSBzW2ldO1xuICAgICAgICBqID0gbG93Yml0cyhqICsgdCk7IHUgPSBzW2pdO1xuICAgICAgICBzW2ldID0gdTtcbiAgICAgICAgc1tqXSA9IHQ7XG4gICAgICAgIHIgPSByICogd2lkdGggKyBzW2xvd2JpdHModCArIHUpXTtcbiAgICAgIH1cbiAgICAgIG1lLmkgPSBpO1xuICAgICAgbWUuaiA9IGo7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIG1lLmcod2lkdGgpO1xuICB9O1xuICAvLyBIZWxwZXIgZnVuY3Rpb25zLlxuICB2YXIgbWl4a2V5ID0gZnVuY3Rpb24oc2VlZCwga2V5KSB7XG4gICAgc2VlZCArPSAnJztcbiAgICB2YXIgc21lYXIgPSAwO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VlZC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxiID0gbG93Yml0cyhqKTtcbiAgICAgIHNtZWFyIF49IGtleVtsYl07XG4gICAgICBrZXlbbGJdID0gbG93Yml0cyhzbWVhcioxOSArIHNlZWQuY2hhckNvZGVBdChqKSk7XG4gICAgfVxuICAgIHNlZWQgPSAnJztcbiAgICBmb3IgKGogaW4ga2V5KSB7XG4gICAgICBzZWVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5W2pdKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlZWQ7XG4gIH07XG4gIHZhciBsb3diaXRzID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuICYgKHdpZHRoIC0gMSk7XG4gIH07XG5cbiAgcmV0dXJuIFJhbmRvbTtcbn0pKCk7XG4vKiBSZXR1cm5zIGEgcmFuZG9tIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZXR3ZWVuIHplcm8gYW5kXG4gKiBvbmUuIE5COiBUaGUgcHJvdG90eXBlIGltcGxlbWVudGF0aW9uIGJlbG93IGp1c3QgdGhyb3dzIGFuXG4gKiBlcnJvciwgaXQgd2lsbCBiZSBvdmVycmlkZGVuIGluIGVhY2ggUmFuZG9tIG9iamVjdCB3aGVuIHRoZVxuICogc2VlZCBoYXMgYmVlbiBjb3JyZWN0bHkgY29uZmlndXJlZC4gKi9cblJhbmRvbS5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IHtcbiAgICBuYW1lOlwiUmFuZG9tRXJyb3JcIixcbiAgICBtZXNzYWdlOiBcInJhbmRvbV9lcnJvclwiLmwoKVxuICB9O1xufTtcbi8qIFJldHVybnMgYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSBnaXZlbiBtaW4gYW5kIG1heCB2YWx1ZXMsXG4gKiBpbmNsdXNpdmUuICovXG5SYW5kb20ucHJvdG90eXBlLnJhbmRvbUludCA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gIHJldHVybiBtaW4gKyBNYXRoLmZsb29yKChtYXgtbWluKzEpKnRoaXMucmFuZG9tKCkpO1xufTtcbi8qIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb2xsaW5nIG4gZGljZSB3aXRoIGR4IHNpZGVzLCBhbmQgYWRkaW5nXG4gKiBwbHVzLiAqL1xuUmFuZG9tLnByb3RvdHlwZS5kaWNlID0gZnVuY3Rpb24obiwgZHgsIHBsdXMpIHtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgcmVzdWx0ICs9IHRoaXMucmFuZG9tSW50KDEsIGR4KTtcbiAgfVxuICBpZiAocGx1cykgcmVzdWx0ICs9IHBsdXM7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvbGxpbmcgbiBhdmVyYWdpbmcgZGljZSAoaS5lLiA2IHNpZGVkIGRpY2VcbiAqIHdpdGggc2lkZXMgMiwzLDMsNCw0LDUpLiBBbmQgYWRkaW5nIHBsdXMuICovXG5SYW5kb20ucHJvdG90eXBlLmF2ZURpY2UgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBtYXBwaW5nID0gWzIsMywzLDQsNCw1XTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG4sIHBsdXMpIHtcbiAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgcmVzdWx0ICs9IG1hcHBpbmdbdGhpcy5yYW5kb21JbnQoMCwgNSldO1xuICAgIH1cbiAgICBpZiAocGx1cykgcmVzdWx0ICs9IHBsdXM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0pKCk7XG4vKiBSZXR1cm5zIGEgZGljZS1yb2xsIHJlc3VsdCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgZGljZVxuICogc3BlY2lmaWNhdGlvbi4gVGhlIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtIHhkeSt6LFxuICogd2hlcmUgdGhlIHggY29tcG9uZW50IGFuZCB6IGNvbXBvbmVudCBhcmUgb3B0aW9uYWwuIFRoaXMgcm9sbHNcbiAqIHggZGljZSBvZiB3aXRoIHkgc2lkZXMsIGFuZCBhZGRzIHogdG8gdGhlIHJlc3VsdCwgdGhlIHpcbiAqIGNvbXBvbmVudCBjYW4gYWxzbyBiZSBuZWdhdGl2ZTogeGR5LXouIFRoZSB5IGNvbXBvbmVudCBjYW4gYmVcbiAqIGVpdGhlciBhIG51bWJlciBvZiBzaWRlcywgb3IgY2FuIGJlIHRoZSBzcGVjaWFsIHZhbHVlcyAnRicsIGZvclxuICogYSBmdWRnZSBkaWUgKHdpdGggMyBzaWRlcywgKywwLC0pLCAnJScgZm9yIGEgMTAwIHNpZGVkIGRpZSwgb3JcbiAqICdBJyBmb3IgYW4gYXZlcmFnaW5nIGRpZSAod2l0aCBzaWRlcyAyLDMsMyw0LDQsNSkuXG4gKi9cblJhbmRvbS5wcm90b3R5cGUuZGljZVN0cmluZyA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGRpY2VSZSA9IC9eKFsxLTldWzAtOV0qKT9kKFslRkFdfFsxLTldWzAtOV0qKShbLStdWzEtOV1bMC05XSopPyQvO1xuICByZXR1cm4gZnVuY3Rpb24oZGVmKSB7XG4gICAgdmFyIG1hdGNoID0gZGVmLm1hdGNoKGRpY2VSZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGljZV9zdHJpbmdfZXJyb3JcIi5sKHtzdHJpbmc6ZGVmfSkpO1xuICAgIH1cblxuICAgIHZhciBudW0gPSBtYXRjaFsxXT9wYXJzZUludChtYXRjaFsxXSwgMTApOjE7XG4gICAgdmFyIHNpZGVzO1xuICAgIHZhciBib251cyA9IG1hdGNoWzNdP3BhcnNlSW50KG1hdGNoWzNdLCAxMCk6MDtcblxuICAgIHN3aXRjaCAobWF0Y2hbMl0pIHtcbiAgICAgIGNhc2UgJ0EnOlxuICAgICAgICByZXR1cm4gdGhpcy5hdmVEaWNlKG51bSwgYm9udXMpO1xuICAgICAgY2FzZSAnRic6XG4gICAgICAgIHNpZGVzID0gMztcbiAgICAgICAgYm9udXMgLT0gbnVtKjI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJSc6XG4gICAgICAgIHNpZGVzID0gMTAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNpZGVzID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaWNlKG51bSwgc2lkZXMsIGJvbnVzKTtcbiAgfTtcbn0pKCk7XG4iLCIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2V0dXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qIEV4cG9ydCBvdXIgQVBJLiAqL1xud2luZG93LnVuZHVtID0ge1xuICBTaXR1YXRpb246IFNpdHVhdGlvbixcbiAgU2ltcGxlU2l0dWF0aW9uOiBTaW1wbGVTaXR1YXRpb24sXG5cbiAgUXVhbGl0eURlZmluaXRpb246IFF1YWxpdHlEZWZpbml0aW9uLFxuICBJbnRlZ2VyUXVhbGl0eTogSW50ZWdlclF1YWxpdHksXG4gIE5vblplcm9JbnRlZ2VyUXVhbGl0eTogTm9uWmVyb0ludGVnZXJRdWFsaXR5LFxuICBOdW1lcmljUXVhbGl0eTogTnVtZXJpY1F1YWxpdHksXG4gIFdvcmRTY2FsZVF1YWxpdHk6IFdvcmRTY2FsZVF1YWxpdHksXG4gIEZ1ZGdlQWRqZWN0aXZlc1F1YWxpdHk6IEZ1ZGdlQWRqZWN0aXZlc1F1YWxpdHksXG4gIE9uT2ZmUXVhbGl0eTogT25PZmZRdWFsaXR5LFxuICBZZXNOb1F1YWxpdHk6IFllc05vUXVhbGl0eSxcblxuICBRdWFsaXR5R3JvdXA6IFF1YWxpdHlHcm91cCxcblxuICBnYW1lOiBnYW1lLFxuXG4gIGlzSW50ZXJhY3RpdmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaW50ZXJhY3RpdmU7IH0sXG5cbiAgLy8gVGhlIHVuZHVtIHNldCBvZiB0cmFuc2xhdGVkIHN0cmluZ3MuXG4gIGxhbmd1YWdlOiB7fVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlZmF1bHQgTWVzc2FnZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgZW4gPSB7XG4gIHRlcnJpYmxlOiBcInRlcnJpYmxlXCIsXG4gIHBvb3I6IFwicG9vclwiLFxuICBtZWRpb2NyZTogXCJtZWRpb2NyZVwiLFxuICBmYWlyOiBcImZhaXJcIixcbiAgZ29vZDogXCJnb29kXCIsXG4gIGdyZWF0OiBcImdyZWF0XCIsXG4gIHN1cGVyYjogXCJzdXBlcmJcIixcbiAgeWVzOiBcInllc1wiLFxuICBubzogXCJub1wiLFxuICBjaG9pY2U6IFwiQ2hvaWNlIHtudW1iZXJ9XCIsXG4gIG5vX2dyb3VwX2RlZmluaXRpb246IFwiQ291bGRuJ3QgZmluZCBhIGdyb3VwIGRlZmluaXRpb24gZm9yIHtpZH0uXCIsXG4gIGxpbmtfbm90X3ZhbGlkOiBcIlRoZSBsaW5rICd7bGlua30nIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHZhbGlkLlwiLFxuICBsaW5rX25vX2FjdGlvbjogXCJBIGxpbmsgd2l0aCBhIHNpdHVhdGlvbiBvZiAnLicsIG11c3QgaGF2ZSBhbiBhY3Rpb24uXCIsXG4gIHVua25vd25fc2l0dWF0aW9uOiBcIllvdSBjYW4ndCBtb3ZlIHRvIGFuIHVua25vd24gc2l0dWF0aW9uOiB7aWR9LlwiLFxuICBleGlzdGluZ19zaXR1YXRpb246IFwiWW91IGNhbid0IG92ZXJyaWRlIHNpdHVhdGlvbiB7aWR9IGluIEhUTUwuXCIsXG4gIGVyYXNlX21lc3NhZ2U6IFwiVGhpcyB3aWxsIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGlzIGNoYXJhY3RlciBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIHlvdSB0byB0aGUgc3RhcnQgb2YgdGhlIGdhbWUuIEFyZSB5b3Ugc3VyZT9cIixcbiAgbm9fY3VycmVudF9zaXR1YXRpb246IFwiSSBjYW4ndCBkaXNwbGF5LCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50IHNpdHVhdGlvbi5cIixcbiAgbm9fbG9jYWxfc3RvcmFnZTogXCJObyBsb2NhbCBzdG9yYWdlIGF2YWlsYWJsZS5cIixcbiAgcmFuZG9tX3NlZWRfZXJyb3I6IFwiWW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIHJhbmRvbSBzZWVkLlwiLFxuICByYW5kb21fZXJyb3I6IFwiSW5pdGlhbGl6ZSB0aGUgUmFuZG9tIHdpdGggYSBub24tZW1wdHkgc2VlZCBiZWZvcmUgdXNlLlwiLFxuICBkaWNlX3N0cmluZ19lcnJvcjogXCJDb3VsZG4ndCBpbnRlcnByZXQgeW91ciBkaWNlIHN0cmluZzogJ3tzdHJpbmd9Jy5cIlxufTtcblxuLy8gU2V0IHRoaXMgZGF0YSBhcyBib3RoIHRoZSBkZWZhdWx0IGZhbGxiYWNrIGxhbmd1YWdlLCBhbmQgdGhlIGVuZ2xpc2hcbi8vIHByZWZlcnJlZCBsYW5ndWFnZS5cbnVuZHVtLmxhbmd1YWdlW1wiXCJdID0gZW47XG51bmR1bS5sYW5ndWFnZVtcImVuXCJdID0gZW47XG5cbi8qIFNldCB1cCB0aGUgZ2FtZSB3aGVuIGV2ZXJ5dGhpbmcgaXMgbG9hZGVkLiAqL1xuZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gJ2xvYWRpbmcnKXtcbiAgICBmbigpO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbik7XG4gIH1cbn1cblxucmVhZHkoZnVuY3Rpb24oKSB7XG4gIC8vIENvbXBpbGUgYWRkaXRpb25hbCBzaXR1YXRpb25zIGZyb20gSFRNTFxuICBsb2FkSFRNTFNpdHVhdGlvbnMoKTtcblxuICAvLyBIYW5kbGUgc3RvcmFnZS5cbiAgaWYgKGhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgdmFyIGVyYXNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlcmFzZVwiKTtcbiAgICBlcmFzZS5vbmNsaWNrID0gZG9FcmFzZTtcbiAgICBlcmFzZS5rZXlkb3duID0gZG9FcmFzZTtcbiAgICB2YXIgc2F2ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZVwiKTtcbiAgICBzYXZlLm9uY2xpY2sgPSBzYXZlR2FtZTtcbiAgICBzYXZlLmtleWRvd24gPSBzYXZlR2FtZTtcblxuICAgIHZhciBzdG9yZWRDaGFyYWN0ZXIgPSBsb2NhbFN0b3JhZ2VbZ2V0U2F2ZUlkKCldO1xuICAgIGlmIChzdG9yZWRDaGFyYWN0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvYWRHYW1lKEpTT04ucGFyc2Uoc3RvcmVkQ2hhcmFjdGVyKSk7XG4gICAgICAgIHNhdmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICBlcmFzZS5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICB9IGNhdGNoKGVycikge1xuICAgICAgICBkb0VyYXNlKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYXZlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIGVyYXNlLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgc3RhcnRHYW1lKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnV0dG9uc1wiKS5pbm5lckhUTUwgPSBcIjxwPlwiK1wibm9fbG9jYWxfc3RvcmFnZVwiLmwoKStcIjwvcD5cIjtcbiAgICBzdGFydEdhbWUoKTtcbiAgfVxuXG4gIC8vIERpc3BsYXkgdGhlIFwiY2xpY2sgdG8gYmVnaW5cIiBtZXNzYWdlLiAoV2UgZG8gdGhpcyBpbiBjb2RlXG4gIC8vIHNvIHRoYXQsIGlmIEphdmFzY3JpcHQgaXMgb2ZmLCBpdCBkb2Vzbid0IGhhcHBlbi4pXG4gIHNob3dCbG9jayhcImNsaWNrX21lc3NhZ2VcIik7XG5cbiAgLy8gU2hvdyB0aGUgZ2FtZSB3aGVuIHdlIGNsaWNrIG9uIHRoZSB0aXRsZS5cbiAgLy8gTm90ZTogaWYgeW91IGRvIGV2ZW50cyB3aXRoIG9uY2xpY2ssIHlvdSBoYXZlIHRvIGhhdmUgb25seSBvbmUgY2xpY2sgZXZlbnQgaGFuZGxlci5cbiAgLy8gWW91IGNhbiB1c2UgbW9yZSBjb21wbGV4IG1ldGhvZHMgaWYgeW91IGV4cGVjdCB0byBoYXZlIG1vcmUuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGl0bGVcIikub25jbGljayA9IGZ1bmN0aW9uKCkge1xuICAgIHNob3dCbG9jayhcImNvbnRlbnRcIilcbiAgICBzaG93QmxvY2soXCJjb250ZW50X3dyYXBwZXJcIik7XG4gICAgc2hvd0Jsb2NrKFwibGVnYWxcIik7XG4gICAgc2hvd0Jsb2NrKFwidG9vbHNfd3JhcHBlclwiKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpdGxlXCIpLnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiO1xuICAgIGhpZGVCbG9jayhcImNsaWNrX21lc3NhZ2VcIik7XG4gIH07XG5cbi8qXG4gIC8vIEFueSBwb2ludCB0aGF0IGFuIG9wdGlvbiBsaXN0IGFwcGVhcnMsIGl0cyBvcHRpb25zIGFyZSBpdHNcbiAgLy8gZmlyc3QgbGlua3MuXG4gIHZhciBvcHRpb25MaW5rRXZlbnQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIC8vIE1ha2Ugb3B0aW9uIGNsaWNrcyBwYXNzIHRocm91Z2ggdG8gdGhlaXIgZmlyc3QgbGluay5cbiAgICB2YXIgbGluayA9ICQoXCJhXCIsIHRoaXMpO1xuICAgIGlmIChsaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICQobGluay5nZXQoMCkpLmNsaWNrKCk7XG4gICAgfVxuICB9O1xuICBpdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ1bC5vcHRpb25zIGxpLCAjbWVudSBsaVwiKTtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpdGVtcywgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpe1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcHRpb25MaW5rRXZlbnQpO1xuICB9KTtcbiovXG59KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImludGVybmFsLmpzIiwiYXV0aG9yLmpzIiwic3lzdGVtLmpzIiwicHJpdmF0ZS5qcyIsInNldHVwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbmVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaDJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6InVuZHVtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEludGVybmFsIEluZnJhc3RydWN0dXJlIEltcGxlbWVudGF0aW9ucyBbTkI6IFRoZXNlIGhhdmUgdG8gYmVcbi8vIGF0IHRoZSB0b3AsIGJlY2F1c2Ugd2UgdXNlIHRoZW0gYmVsb3csIGJ1dCB5b3UgY2FuIHNhZmVseVxuLy8gaWdub3JlIHRoZW0gYW5kIHNraXAgZG93biB0byB0aGUgbmV4dCBzZWN0aW9uLl1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qIENyb2NrZm9yZCdzIGluaGVyaXQgZnVuY3Rpb24gKi9cbkZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyA9IGZ1bmN0aW9uKFBhcmVudCkge1xuICB2YXIgZCA9IHt9LCBwID0gKHRoaXMucHJvdG90eXBlID0gbmV3IFBhcmVudCgpKTtcbiAgdGhpcy5wcm90b3R5cGUudWJlciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoIShuYW1lIGluIGQpKSBkW25hbWVdID0gMDtcbiAgICB2YXIgZiwgciwgdCA9IGRbbmFtZV0sIHYgPSBQYXJlbnQucHJvdG90eXBlO1xuICAgIGlmICh0KSB7XG4gICAgICB3aGlsZSAodCkge1xuICAgICAgICB2ID0gdi5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgIHQgLT0gMTtcbiAgICAgIH1cbiAgICAgIGYgPSB2W25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gcFtuYW1lXTtcbiAgICAgIGlmIChmID09IHRoaXNbbmFtZV0pIHtcbiAgICAgICAgZiA9IHZbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGRbbmFtZV0gKz0gMTtcbiAgICByID0gZi5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLCBbMV0pKTtcbiAgICBkW25hbWVdIC09IDE7XG4gICAgcmV0dXJuIHI7XG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRmVhdHVyZSBkZXRlY3Rpb25cblxudmFyIGhhc0xvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaGFzU3RvcmFnZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc1N0b3JhZ2UgPSAoJ2xvY2FsU3RvcmFnZScgaW4gd2luZG93KSAmJlxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gbnVsbCAmJlxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gdW5kZWZpbmVkO1xuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICAvLyBGaXJlZm94IHdpdGggdGhlIFwiQWx3YXlzIEFza1wiIGNvb2tpZSBhY2NlcHQgc2V0dGluZ1xuICAgIC8vIHdpbGwgdGhyb3cgYW4gZXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBsb2NhbFN0b3JhZ2VcbiAgICBoYXNTdG9yYWdlID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGhhc1N0b3JhZ2U7XG59O1xuXG4vLy8gQW5pbWF0aW9ucyAtIHlvdSBjYW4gdG90YWxseSByZWRlZmluZSB0aGVzZSEgRmFkZSBpbiBhbmQgZmFkZSBvdXQgYnkgZGVmYXVsdC5cbi8vLyBAcGFyYW0gaWQgc3RyaW5nIG9yIG9iamVjdFxudmFyIHNob3dCbG9jayA9IGZ1bmN0aW9uKGlkKSB7XG4gIHZhciBibG9jayA9IGlkO1xuICBpZiAodHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFyIGJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9XG4gIGJsb2NrLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgYmxvY2suY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICBibG9jay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbn1cblxudmFyIGhpZGVCbG9jayA9IGZ1bmN0aW9uKGlkKSB7XG4gIHZhciBibG9jayA9IGlkOyAvLyB0eXBlb2YgYmxvY2sgPT09IFwiZWxlbWVudFwiXG4gIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBpZCA9PT0gXCJvYmplY3RcIikgeyAvLyBwcm9iYWJseSBOb2RlTGlzdFxuICAgIGlmIChpZC5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGlkLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBibG9jay5jbGFzc0xpc3QgPT09IFwidW5kZWZpbmVkXCIpXG4gIHtcbiAgICBjb25zb2xlLmxvZyhcIlRyaWVkIHRvIGhpZGUgYW4gdW5kZWZpbmVkIGJsb2NrLlwiKTtcbiAgICBjb25zb2xlLmxvZyhpZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJsb2NrLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgYmxvY2suY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xufVxuXG4vLyBBc3NlcnRpb25cblxudmFyIEFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSBBc3NlcnRpb25FcnJvcjtcbn07XG5Bc3NlcnRpb25FcnJvci5pbmhlcml0cyhFcnJvcik7XG5cbnZhciBhc3NlcnQgPSBmdW5jdGlvbihleHByZXNzaW9uLCBtZXNzYWdlKSB7XG4gIGlmICghZXhwcmVzc2lvbikge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlKTtcbiAgfVxufTtcblxuLy8gT2JqZWN0IGV4dGVudGlvblxudmFyIGV4dGVuZCA9IGZ1bmN0aW9uKG91dCkge1xuICBvdXQgPSBvdXQgfHwge307XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGlmICghb2JqKVxuICAgICAgY29udGludWU7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgZXh0ZW5kKG91dFtrZXldLCBvYmpba2V5XSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuIiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFR5cGVzIGZvciBBdXRob3IgVXNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiBUaGUgZ2FtZSBpcyBzcGxpdCBpbnRvIHNpdHVhdGlvbnMsIHdoaWNoIHJlc3BvbmQgdG8gdXNlclxuICogY2hvaWNlcy4gU2l0dWF0aW9uIGlzIHRoZSBiYXNlIHR5cGUuIEl0IGhhcyB0aHJlZSBtZXRob2RzOlxuICogZW50ZXIsIGFjdCBhbmQgZXhpdCwgd2hpY2ggeW91IGltcGxlbWVudCB0byBwZXJmb3JtIGFueVxuICogcHJvY2Vzc2luZyBhbmQgb3V0cHV0IGFueSBjb250ZW50LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnNcbiAqIGRvIG5vdGhpbmcuXG4gKlxuICogWW91IGNhbiBlaXRoZXIgY3JlYXRlIHlvdXIgb3duIHR5cGUgb2YgU2l0dWF0aW9uLCBhbmQgYWRkXG4gKiBlbnRlciwgYWN0IGFuZC9vciBleGl0IGZ1bmN0aW9ucyB0byB0aGUgcHJvdG90eXBlIChzZWVcbiAqIFNpbXBsZVNpdHVhdGlvbiBpbiB0aGlzIGZpbGUgZm9yIGFuIGV4YW1wbGUgb2YgdGhhdCksIG9yIHlvdVxuICogY2FuIGdpdmUgdGhvc2UgZnVuY3Rpb25zIGluIHRoZSBvcHRzIHBhcmFtZXRlci4gVGhlIG9wdHNcbiAqIHBhcmFtZXRlciBpcyBhbiBvYmplY3QuIFNvIHlvdSBjb3VsZCB3cml0ZTpcbiAqXG4gKiAgICB2YXIgc2l0dWF0aW9uID0gU2l0dWF0aW9uKHtcbiAqICAgICAgICBlbnRlcjogZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIGZyb20pIHtcbiAqICAgICAgICAgICAgLi4uIHlvdXIgaW1wbGVtZW50YXRpb24gLi4uXG4gKiAgICAgICAgfVxuICogICAgfSk7XG4gKlxuICogSWYgeW91IHBhc3MgaW4gZW50ZXIsIGFjdCBhbmQvb3IgZXhpdCB0aHJvdWdoIHRoZXNlIG9wdGlvbnMsXG4gKiB0aGVuIHRoZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gc2lnbmF0dXJlIGFzIHRoZSBmdWxsXG4gKiBmdW5jdGlvbiBkZWZpbml0aW9ucywgYmVsb3cuXG4gKlxuICogTm90ZSB0aGF0IFNpbXBsZVNpdHVhdGlvbiwgYSBkZXJpdmVkIHR5cGUgb2YgU2l0dWF0aW9uLCBjYWxsc1xuICogcGFzc2VkIGluIGVudGVyLCBhY3QgYW5kIGV4aXQgZnVuY3Rpb25zIEFTIFdFTEwgQVMgdGhlaXIgbm9ybWFsXG4gKiBhY3Rpb24uIFRoaXMgaXMgbW9zdCBvZnRlbiB3aGF0IHlvdSB3YW50OiB0aGUgbm9ybWFsIGJlaGF2aW9yXG4gKiBwbHVzIGEgbGl0dGxlIGV4dHJhIGN1c3RvbSBiZWhhdmlvci4gSWYgeW91IHdhbnQgdG8gb3ZlcnJpZGVcbiAqIHRoZSBiZWhhdmlvciBvZiBhIFNpbXBsZVNpdHVhdGlvbiwgeW91J2xsIGhhdmUgdG8gY3JlYXRlIGFcbiAqIGRlcml2ZWQgdHlwZSBhbmQgc2V0IHRoZSBlbnRlciwgYWN0IGFuZC9vciBleGl0IGZ1bmN0aW9uIG9uXG4gKiB0aGVpciBwcm90b3R5cGVzLiBJbiBtb3N0IGNhc2VzLCBob3dldmVyLCBpZiB5b3Ugd2FudCB0byBkb1xuICogc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBpdCBpcyBiZXR0ZXIgdG8gZGVyaXZlIHlvdXJcbiAqIHR5cGUgZnJvbSB0aGlzIHR5cGU6IFNpdHVhdGlvbiwgcmF0aGVyIHRoYW4gb25lIG9mIGl0c1xuICogY2hpbGRyZW4uXG4gKlxuICogSW4gYWRkaXRpb24gdG8gZW50ZXIsIGV4aXQgYW5kIGFjdCwgdGhlIGZvbGxvd2luZyBvcHRpb25zXG4gKiByZWxhdGVkIHRvIGltcGxpY2l0IHNpdHVhdGlvbiBzZWxlY3Rpb24gYXJlIGF2YWlsYWJsZTpcbiAqXG4gKiBvcHRpb25UZXh0OiBhIHN0cmluZyBvciBhIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLFxuICogICAgIHNpdHVhdGlvbikgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgbGFiZWwgdG8gcHV0IGluIGFuXG4gKiAgICAgb3B0aW9uIGJsb2NrIHdoZXJlIGEgbGluayB0byB0aGlzIHNpdHVhdGlvbiBjYW4gYmVcbiAqICAgICBjaG9zZW4uIFRoZSBzaXR1YXRpb24gcGFzc2VkIGluIGlzIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlXG4gKiAgICAgb3B0aW9uIGJsb2NrIGlzIGJlaW5nIGRpc3BsYXllZC5cbiAqXG4gKiBjYW5WaWV3OiBhIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pIHdoaWNoIHNob3VsZFxuICogICAgIHJldHVybiB0cnVlIGlmIHRoaXMgc2l0dWF0aW9uIHNob3VsZCBiZSB2aXNpYmxlIGluIGFuXG4gKiAgICAgb3B0aW9uIGJsb2NrIGluIHRoZSBnaXZlbiBzaXR1YXRpb24uXG4gKlxuICogY2FuQ2hvb3NlOiBhIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pIHdoaWNoIHNob3VsZFxuICogICAgIHJldHVybiB0cnVlIGlmIHRoaXMgc2l0dWF0aW9uIHNob3VsZCBhcHBlYXIgY2xpY2thYmxlIGluIGFuXG4gKiAgICAgb3B0aW9uIGJsb2NrLiBSZXR1cm5pbmcgZmFsc2UgYWxsb3dzIHlvdSB0byBwcmVzZW50IHRoZVxuICogICAgIG9wdGlvbiBidXQgcHJldmVudCBpdCBiZWluZyBzZWxlY3RlZC4gWW91IG1heSB3YW50IHRvXG4gKiAgICAgaW5kaWNhdGUgdG8gdGhlIHBsYXllciB0aGF0IHRoZXkgbmVlZCB0byBjb2xsZWN0IHNvbWVcbiAqICAgICBpbXBvcnRhbnQgb2JqZWN0IGJlZm9yZSB0aGUgb3B0aW9uIGlzIGF2YWlsYWJsZSwgZm9yXG4gKiAgICAgZXhhbXBsZS5cbiAqXG4gKiB0YWdzOiBhIGxpc3Qgb2YgdGFncyBmb3IgdGhpcyBzaXR1YXRpb24sIHdoaWNoIGNhbiBiZSB1c2VkIGZvclxuICogICAgIGltcGxpY2l0IHNpdHVhdGlvbiBzZWxlY3Rpb24uIFRoZSB0YWdzIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gKiAgICAgc3BhY2UsIHRhYiBvciBjb21tYSBzZXBhcmF0ZWQgdGFncyBpbiBhIHN0cmluZy4gTm90ZSB0aGF0LFxuICogICAgIHdoZW4gY2FsbGluZyBgZ2V0U2l0dWF0aW9uSWRDaG9pY2VzYCwgdGFncyBhcmUgcHJlZml4ZWQgd2l0aFxuICogICAgIGEgaGFzaCwgYnV0IHRoYXQgc2hvdWxkIG5vdCBiZSB0aGUgY2FzZSBoZXJlLiBKdXN0IHVzZSB0aGVcbiAqICAgICBwbGFpbiB0YWcgbmFtZS5cbiAqXG4gKiBwcmlvcml0eTogYSBudW1lcmljIHByaW9yaXR5IHZhbHVlIChkZWZhdWx0ID0gMSkuIFdoZW5cbiAqICAgICBzZWxlY3Rpbmcgc2l0dWF0aW9ucyBpbXBsaWNpdGx5LCBoaWdoZXIgcHJpb3JpdHkgc2l0dWF0aW9uc1xuICogICAgIGFyZSBjb25zaWRlcmVkIGZpcnN0LlxuICpcbiAqIGZyZXF1ZW5jeTogYSBudW1lcmljIHJlbGF0aXZlIGZyZXF1ZW5jeSAoZGVmYXVsdCA9IDEpLCBzbyAxMDBcbiAqICAgICB3b3VsZCBiZSAxMDAgdGltZXMgbW9yZSBmcmVxdWVudC4gV2hlbiB0aGVyZSBhcmUgbW9yZVxuICogICAgIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlzcGxheWVkLCBzaXR1YXRpb25zIHdpbGwgYmUgc2VsZWN0ZWRcbiAqICAgICByYW5kb21seSBiYXNlZCBvbiB0aGVpciBmcmVxdWVuY3kuXG4gKlxuICogZGlzcGxheU9yZGVyOiBhIG51bWVyaWMgb3JkZXJpbmcgdmFsdWUgKGRlZmF1bHQgPSAxKS4gV2hlblxuKiAgICAgc2l0dWF0aW9ucyBhcmUgc2VsZWN0ZWQgaW1wbGljaXRseSwgdGhlIHJlc3VsdHMgYXJlIG9yZGVyZWRcbiogICAgIGJ5IGluY3JlYXNpbmcgZGlzcGxheU9yZGVyLlxuKi9cbnZhciBTaXR1YXRpb24gPSBmdW5jdGlvbihvcHRzKSB7XG4gIGlmIChvcHRzKSB7XG4gICAgaWYgKG9wdHMuZW50ZXIpIHRoaXMuX2VudGVyID0gb3B0cy5lbnRlcjtcbiAgICBpZiAob3B0cy5hY3QpIHRoaXMuX2FjdCA9IG9wdHMuYWN0O1xuICAgIGlmIChvcHRzLmV4aXQpIHRoaXMuX2V4aXQgPSBvcHRzLmV4aXQ7XG5cbiAgICAvLyBPcHRpb25zIHJlbGF0ZWQgdG8gdGhpcyBzaXR1YXRpb24gYmVpbmcgYXV0b21hdGljYWxseVxuICAgIC8vIHNlbGVjdGVkIGFuZCBkaXNwbGF5ZWQgaW4gYSBsaXN0IG9mIG9wdGlvbnMuXG4gICAgdGhpcy5fb3B0aW9uVGV4dCA9IG9wdHMub3B0aW9uVGV4dDtcbiAgICB0aGlzLl9jYW5WaWV3ID0gb3B0cy5jYW5WaWV3IHx8IHRydWU7XG4gICAgdGhpcy5fY2FuQ2hvb3NlID0gb3B0cy5jYW5DaG9vc2UgfHwgdHJ1ZTtcbiAgICB0aGlzLl9wcmlvcml0eSA9IChvcHRzLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpID8gb3B0cy5wcmlvcml0eSA6IDE7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID1cbiAgICAgIChvcHRzLmZyZXF1ZW5jeSAhPT0gdW5kZWZpbmVkKSA/IG9wdHMuZnJlcXVlbmN5IDogMTtcbiAgICB0aGlzLl9kaXNwbGF5T3JkZXIgPVxuICAgICAgKG9wdHMuZGlzcGxheU9yZGVyICE9PSB1bmRlZmluZWQpID8gb3B0cy5kaXNwbGF5T3JkZXIgOiAxO1xuXG4gICAgLy8gVGFnIGFyZSBub3Qgc3RvcmVkIHdpdGggYW4gdW5kZXJzY29yZSwgYmVjYXVzZSB0aGV5IGFyZVxuICAgIC8vIGFjY2Vzc2VkIGRpcmVjdHkuIFRoZXkgc2hvdWxkIG5vdCBiZSBjb250ZXh0IHNlbnNpdGl2ZVxuICAgIC8vICh1c2UgdGhlIGNhblZpZXcgZnVuY3Rpb24gdG8gZG8gY29udGV4dCBzZW5zaXRpdmVcbiAgICAvLyBtYW5pcHVsYXRpb24pLlxuICAgIGlmIChvcHRzLnRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy50YWdzKSkge1xuICAgICAgICB0aGlzLnRhZ3MgPSBvcHRzLnRhZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhZ3MgPSBvcHRzLnRhZ3Muc3BsaXQoL1sgXFx0LF0rLyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFncyA9IFtdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9jYW5WaWV3ID0gdHJ1ZTtcbiAgICB0aGlzLl9jYW5DaG9vc2UgPSB0cnVlO1xuICAgIHRoaXMuX3ByaW9yaXR5ID0gMTtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPSAxO1xuICAgIHRoaXMuX2Rpc3BsYXlPcmRlciA9IDE7XG4gICAgdGhpcy50YWdzID0gW107XG4gIH1cbn07XG4vKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYWN0aW9uIHdoZW4gd2UgZW50ZXIgYSBzaXR1YXRpb24uIFRoZVxuICogbGFzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBzaXR1YXRpb24gd2UgaGF2ZSBqdXN0IGxlZnQ6IGl0XG4gKiBtYXkgYmUgbnVsbCBpZiB0aGlzIGlzIHRoZSBzdGFydGluZyBzaXR1YXRpb24uIFVubGlrZSB0aGVcbiAqIGV4aXQoKSBtZXRob2QsIHRoaXMgbWV0aG9kIGNhbm5vdCBwcmV2ZW50IHRoZSB0cmFuc2l0aW9uXG4gKiBoYXBwZW5pbmc6IGl0cyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4gKi9cblNpdHVhdGlvbi5wcm90b3R5cGUuZW50ZXIgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgZnJvbSkge1xuICBpZiAodGhpcy5fZW50ZXIpIHRoaXMuX2VudGVyKGNoYXJhY3Rlciwgc3lzdGVtLCBmcm9tKTtcbn07XG4vKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYWN0aW9uIHdoZW4gd2UgY2Fycnkgb3V0IHNvbWUgYWN0aW9uIGluIGFcbiAqIHNpdHVhdGlvbiB0aGF0IGlzbid0IGludGVuZGVkIHRvIGxlYWQgdG8gYSBuZXcgc2l0dWF0aW9uLiAqL1xuU2l0dWF0aW9uLnByb3RvdHlwZS5hY3QgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKSB7XG4gIGlmICh0aGlzLl9hY3QpIHRoaXMuX2FjdChjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKTtcbn07XG4vKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYWN0aW9uIHdoZW4gd2UgZXhpdCBhIHNpdHVhdGlvbi4gVGhlIGxhc3RcbiAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHNpdHVhdGlvbiB3ZSBhcmUgZ29pbmcgdG8uICovXG5TaXR1YXRpb24ucHJvdG90eXBlLmV4aXQgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgdG8pIHtcbiAgaWYgKHRoaXMuX2V4aXQpIHRoaXMuX2V4aXQoY2hhcmFjdGVyLCBzeXN0ZW0sIHRvKTtcbn07XG4vKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBzaXR1YXRpb24gc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYVxuICogbGlzdCBvZiBvcHRpb25zIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnaXZlblxuICogc2l0dWF0aW9uLiAqL1xuU2l0dWF0aW9uLnByb3RvdHlwZS5jYW5WaWV3ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikge1xuICBpZiAodHlwZW9mKHRoaXMuX2NhblZpZXcpID09PSBcImZ1bmN0aW9uXCIgKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhblZpZXcoY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhblZpZXc7XG4gIH1cbn07XG4vKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBzaXR1YXRpb24gc2hvdWxkIGJlIGNsaWNrYWJsZSB3aXRoaW4gYVxuICogbGlzdCBvZiBvcHRpb25zIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnaXZlbiBzaXR1YXRpb24uICovXG5TaXR1YXRpb24ucHJvdG90eXBlLmNhbkNob29zZSA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pIHtcbiAgaWYgKHR5cGVvZih0aGlzLl9jYW5DaG9vc2UpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuQ2hvb3NlKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLl9jYW5DaG9vc2U7XG4gIH1cbn07XG4vKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzcGxheSB0aGlzIHNpdHVhdGlvblxuICogaW4gYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbGlzdCBvZiBjaG9pY2VzLiAqL1xuU2l0dWF0aW9uLnByb3RvdHlwZS5vcHRpb25UZXh0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbikge1xuICBpZiAodHlwZW9mKHRoaXMuX29wdGlvblRleHQpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVGV4dChjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0dWF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVGV4dDtcbiAgfVxufTtcbi8qIFJldHVybnMgdGhlIHByaW9yaXR5LCBmcmVxdWVuY3kgYW5kIGRpc3BsYXlPcmRlciBmb3IgdGhpcyBzaXR1YXRpb24sXG4gKiB3aGVuIGJlaW5nIHNlbGVjdGVkIHVzaW5nIGBzeXN0ZW0uZ2V0U2l0dWF0aW9uSWRDaG9pY2VzYC4gKi9cblNpdHVhdGlvbi5wcm90b3R5cGUuY2hvaWNlRGF0YSA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pIHtcbiAgcmV0dXJuIHtcbnByaW9yaXR5OiB0aGlzLl9wcmlvcml0eSxcbiAgICAgICAgICAgIGZyZXF1ZW5jeTogdGhpcy5fZnJlcXVlbmN5LFxuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiB0aGlzLl9kaXNwbGF5T3JkZXJcbiAgfTtcbn07XG5cbi8qIEEgc2ltcGxlIHNpdHVhdGlvbiBoYXMgYSBibG9jayBvZiBjb250ZW50IHRoYXQgaXQgZGlzcGxheXMgd2hlblxuICogdGhlIHNpdHVhdGlvbiBpcyBlbnRlcmVkLiBUaGUgY29udGVudCBtdXN0IGJlIHZhbGlkIFwiRGlzcGxheVxuICogQ29udGVudFwiIChzZWUgYFN5c3RlbS5wcm90b3R5cGUud3JpdGVgIGZvciBhIGRlZmluaXRpb24pLiBUaGlzXG4gKiBjb25zdHJ1Y3RvciBoYXMgb3B0aW9ucyB0aGF0IGNvbnRyb2wgaXRzIGJlaGF2aW9yOlxuICpcbiAqIGhlYWRpbmc6IFRoZSBvcHRpb25hbCBgaGVhZGluZ2Agd2lsbCBiZSB1c2VkIGFzIGEgc2VjdGlvbiB0aXRsZVxuICogICAgIGJlZm9yZSB0aGUgY29udGVudCBpcyBkaXNwbGF5ZWQuIFRoZSBoZWFkaW5nIGNhbiBiZSBhbnlcbiAqICAgICBIVE1MIHN0cmluZywgaXQgZG9lc24ndCBuZWVkIHRvIGJlIFwiRGlzcGxheSBDb250ZW50XCIuIElmXG4gKiAgICAgdGhlIGhlYWRpbmcgaXMgbm90IGdpdmVuLCBubyBoZWFkaW5nIHdpbGwgYmUgZGlzcGxheWVkLiBJZlxuICogICAgIGEgaGVhZGluZyBpcyBnaXZlbiwgYW5kIG5vIG9wdGlvblRleHQgaXMgc3BlY2lmaWVkIChzZWVcbiAqICAgICBgU2l0dWF0aW9uYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBgb3B0aW9uVGV4dGApLCB0aGVuIHRoZVxuICogICAgIGhlYWRpbmcgd2lsbCBhbHNvIGJlIHVzZWQgZm9yIHRoZSBzaXR1YXRpb24ncyBvcHRpb24gdGV4dC5cbiAqXG4gKiBhY3Rpb25zOiBUaGlzIHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyBhY3Rpb24gSWRzIHRvIGFcbiAqICAgICByZXNwb25zZS4gVGhlIHJlc3BvbnNlIHNob3VsZCBlaXRoZXIgYmUgXCJEaXNwbGF5IENvbnRlbnRcIlxuICogICAgIHRvIGRpc3BsYXkgaWYgdGhpcyBhY3Rpb24gaXMgY2FycmllZCBvdXQsIG9yIGl0IHNob3VsZCBiZSBhXG4gKiAgICAgZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIGFjdGlvbikgdGhhdCB3aWxsIHByb2Nlc3MgdGhlXG4gKiAgICAgYWN0aW9uLlxuICpcbiAqIGNob2ljZXM6IEEgbGlzdCBvZiBzaXR1YXRpb24gaWRzIGFuZCB0YWdzIHRoYXQsIGlmIGdpdmVuLCB3aWxsXG4gKiAgICAgYmUgdXNlZCB0byBjb21waWxlIGFuIGltcGxpY2l0IG9wdGlvbiBibG9jayB1c2luZ1xuICogICAgIGBnZXRTaXR1YXRpb25JZENob2ljZXNgIChzZWUgdGhhdCBmdW5jdGlvbiBmb3IgbW9yZSBkZXRhaWxzXG4gKiAgICAgb2YgaG93IHRoaXMgd29ya3MpLiBUYWdzIGluIHRoaXMgbGlzdCBzaG91bGQgYmUgcHJlZml4ZWRcbiAqICAgICB3aXRoIGEgaGFzaCAjIHN5bWJvbCwgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHNpdHVhdGlvblxuICogICAgIGlkcy4gSWYganVzdCBhIHNpbmdsZSB0YWcgb3IgaWQgaXMgbmVlZGVkLCBpdCBjYW4gYmUgcGFzc2VkXG4gKiAgICAgaW4gYXMgYSBzdHJpbmcgd2l0aG91dCB3cmFwcGluZyBpbnRvIGEgbGlzdC5cbiAqXG4gKiBtaW5DaG9pY2VzOiBJZiBgY2hvaWNlc2AgaXMgZ2l2ZW4sIGFuZCBhbiBpbXBsaWNpdCBjaG9pY2UgYmxvY2tcbiAqICAgICBzaG91bGQgYmUgY29tcGlsZWQsIHNldCB0aGlzIG9wdGlvbiB0byByZXF1aXJlIGF0IGxlYXN0XG4gKiAgICAgdGhpcyBudW1iZXIgb2Ygb3B0aW9ucyB0byBiZSBkaXNwbGF5ZWQuIFNlZVxuICogICAgIGBnZXRTaXR1YXRpb25JZENob2ljZXNgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gYnlcbiAqICAgICB3aGljaCB0aGlzIGhhcHBlbnMuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgYGNob2ljZXNgXG4gKiAgICAgb3B0aW9uLCB0aGVuIHRoaXMgb3B0aW9uIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBtYXhDaG9pY2VzOiBJZiBgY2hvaWNlc2AgaXMgZ2l2ZW4sIGFuZCBhbiBpbXBsaWNpdCBjaG9pY2UgYmxvY2tcbiAqICAgICBzaG91bGQgYmUgY29tcGlsZWQsIHNldCB0aGlzIG9wdGlvbiB0byByZXF1aXJlIG5vIG1vcmUgdGhhblxuICogICAgIHRoaXMgbnVtYmVyIG9mIG9wdGlvbnMgdG8gYmUgZGlzcGxheWVkLiBTZWVcbiAqICAgICBgZ2V0U2l0dWF0aW9uSWRDaG9pY2VzYCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtXG4gKiAgICAgYnkgd2hpY2ggdGhpcyBoYXBwZW5zLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGBjaG9pY2VzYFxuICogICAgIG9wdGlvbiwgdGhlbiB0aGlzIG9wdGlvbiB3aWxsIGJlIGlnbm9yZWQuXG4gKlxuICogVGhlIHJlbWFpbmluZyBvcHRpb25zIGluIHRoZSBgb3B0c2AgcGFyYW1ldGVyIGFyZSB0aGUgc2FtZSBhcyBmb3JcbiAqIHRoZSBiYXNlIFNpdHVhdGlvbi5cbiAqL1xudmFyIFNpbXBsZVNpdHVhdGlvbiA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdHMpIHtcbiAgU2l0dWF0aW9uLmNhbGwodGhpcywgb3B0cyk7XG4gIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gIHRoaXMuaGVhZGluZyA9IG9wdHMgJiYgb3B0cy5oZWFkaW5nO1xuICB0aGlzLmFjdGlvbnMgPSBvcHRzICYmIG9wdHMuYWN0aW9ucztcblxuICB0aGlzLmNob2ljZXMgPSBvcHRzICYmIG9wdHMuY2hvaWNlcztcbiAgdGhpcy5taW5DaG9pY2VzID0gb3B0cyAmJiBvcHRzLm1pbkNob2ljZXM7XG4gIHRoaXMubWF4Q2hvaWNlcyA9IG9wdHMgJiYgb3B0cy5tYXhDaG9pY2VzO1xufTtcblNpbXBsZVNpdHVhdGlvbi5pbmhlcml0cyhTaXR1YXRpb24pO1xuU2ltcGxlU2l0dWF0aW9uLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBmcm9tKSB7XG4gIGlmICh0aGlzLmhlYWRpbmcpIHtcbiAgICBpZiAodHlwZW9mKHRoaXMuaGVhZGluZykgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgc3lzdGVtLndyaXRlSGVhZGluZyh0aGlzLmhlYWRpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN5c3RlbS53cml0ZUhlYWRpbmcodGhpcy5oZWFkaW5nKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuX2VudGVyKSB0aGlzLl9lbnRlcihjaGFyYWN0ZXIsIHN5c3RlbSwgZnJvbSk7XG4gIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICBpZiAodHlwZW9mKHRoaXMuY29udGVudCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgc3lzdGVtLndyaXRlKHRoaXMuY29udGVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3lzdGVtLndyaXRlKHRoaXMuY29udGVudCk7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLmNob2ljZXMpIHtcbiAgICB2YXIgY2hvaWNlcyA9IHN5c3RlbS5nZXRTaXR1YXRpb25JZENob2ljZXModGhpcy5jaG9pY2VzLFxuICAgICAgICB0aGlzLm1pbkNob2ljZXMsXG4gICAgICAgIHRoaXMubWF4Q2hvaWNlcyk7XG4gICAgc3lzdGVtLndyaXRlQ2hvaWNlcyhjaG9pY2VzKTtcbiAgfVxufTtcblNpbXBsZVNpdHVhdGlvbi5wcm90b3R5cGUuYWN0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIGFjdGlvbikge1xuICB2YXIgcmVzcG9uc2UgPSB0aGlzLmFjdGlvbnNbYWN0aW9uXTtcbiAgdHJ5IHtcbiAgICByZXNwb25zZShjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHJlc3BvbnNlKSBzeXN0ZW0ud3JpdGUocmVzcG9uc2UpO1xuICB9XG4gIGlmICh0aGlzLl9hY3QpIHRoaXMuX2FjdChjaGFyYWN0ZXIsIHN5c3RlbSwgYWN0aW9uKTtcbn07XG5TaW1wbGVTaXR1YXRpb24ucHJvdG90eXBlLm9wdGlvblRleHQgPSBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgc2l0bikge1xuICB2YXIgcGFyZW50UmVzdWx0ID0gU2l0dWF0aW9uLnByb3RvdHlwZS5vcHRpb25UZXh0LmNhbGwodGhpcywgY2hhcmFjdGVyLFxuICAgICAgc3lzdGVtLCBzaXRuKTtcbiAgaWYgKHBhcmVudFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZGluZztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyZW50UmVzdWx0O1xuICB9XG59O1xuXG4vKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkZWZpbmUgdGhlIHF1YWxpdGllcyB0aGF0IGNoYXJhY3RlcnNcbiAqIG1heSBwb3NzZXNzLiBUaGUgdGl0bGUgc2hvdWxkIGJlIGEgc3RyaW5nLCBhbmQgY2FuIGNvbnRhaW5cbiAqIEhUTUwuIE9wdGlvbnMgYXJlIHBhc3NlZCBpbiBpbiB0aGUgb3B0cyBwYXJhbWV0ZXIuIFRoZVxuICogZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS5cbiAqXG4gKiBwcmlvcml0eSAtIEEgc3RyaW5nIHVzZWQgdG8gc29ydCBxdWFsaXRpZXMgd2l0aGluIHRoZWlyXG4gKiAgICAgZ3JvdXBzLiBXaGVuIHRoZSBzeXN0ZW0gZGlzcGxheXMgYSBsaXN0IG9mIHF1YWxpdGllcyB0aGV5XG4gKiAgICAgd2lsbCBiZSBzb3J0ZWQgYnkgdGhpcyBzdHJpbmcuIElmIHlvdSBkb24ndCBnaXZlIGFcbiAqICAgICBwcmlvcml0eSwgdGhlbiB0aGUgdGl0bGUgd2lsbCBiZSB1c2VkLCBzbyB5b3UnbGwgZ2V0XG4gKiAgICAgYWxwaGFiZXRpYyBvcmRlci4gTm9ybWFsbHkgeW91IGVpdGhlciBkb24ndCBnaXZlIGFcbiAqICAgICBwcmlvcml0eSwgb3IgZWxzZSB1c2UgYSBwcmlvcml0eSBzdHJpbmcgY29udGFpbmluZyAwLXBhZGRlZFxuICogICAgIG51bWJlcnMgKGUuZy4gXCIwMDAwMVwiKS5cbiAqXG4gKiBncm91cCAtIFRoZSBJZCBvZiBhIGdyb3VwIGluIHdoaWNoIHRvIGRpc3BsYXkgdGhpc1xuICogICAgIHBhcmFtZXRlci4gVGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXAgbXVzdCBiZSBkZWZpbmVkIGluXG4gKiAgICAgeW91ciBgdW5kdW0uZ2FtZS5xdWFsaXR5R3JvdXBzYCBwcm9wZXJ0eS5cbiAqXG4gKiBleHRyYUNsYXNzZXMgLSBUaGVzZSBjbGFzc2VzIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIDxkaXY+IHRhZ1xuICogICAgIHRoYXQgc3Vycm91bmRzIHRoZSBxdWFsaXR5IHdoZW4gaXQgaXMgZGlzcGxheWVkLiBBIGNvbW1vblxuICogICAgIHVzZSBmb3IgdGhpcyBpcyB0byBhZGQgaWNvbnMgcmVwcmVzZW50aW5nIHRoZSBxdWFsaXR5LiBJblxuICogICAgIHlvdXIgQ1NTIGRlZmluZSBhIGNsYXNzIGZvciBlYWNoIGljb24sIHRoZW4gcGFzcyB0aG9zZVxuICogICAgIGNsYXNzZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgcXVhbGl0eSBkZWZpbml0aW9ucy5cbiAqXG4gKiBPbmUga2V5IHB1cnBvc2Ugb2YgUXVhbGl0eURlZmluaXRpb24gaXMgdG8gZm9ybWF0IHRoZSBxdWFsaXR5XG4gKiB2YWx1ZSBmb3IgZGlzcGxheS4gUXVhbGl0eSB2YWx1ZXMgYXJlIGFsd2F5cyBzdG9yZWQgYXMgbnVtZXJpY1xuICogdmFsdWVzLCBidXQgbWF5IGJlIGRpc3BsYXllZCBpbiB3b3JkcyBvciBzeW1ib2xzLiBBIG51bWJlciBvZlxuICogc3ViLXR5cGVzIG9mIFF1YWxpdHlEZWZpbml0aW9uIGFyZSBnaXZlbiB0aGF0IGZvcm1hdCB0aGVpclxuICogdmFsdWVzIGluIGRpZmZlcmVudCB3YXlzLlxuICovXG52YXIgUXVhbGl0eURlZmluaXRpb24gPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICB2YXIgbXlPcHRzID0gZXh0ZW5kKG9wdHMsIHtcbiAgICBwcmlvcml0eTogdGl0bGUsXG4gICAgZ3JvdXA6IG51bGwsXG4gICAgZXh0cmFDbGFzc2VzOiBudWxsXG4gIH0pO1xuICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gIHRoaXMucHJpb3JpdHkgPSBteU9wdHMucHJpb3JpdHk7XG4gIHRoaXMuZ3JvdXAgPSBteU9wdHMuZ3JvdXA7XG4gIHRoaXMuZXh0cmFDbGFzc2VzID0gbXlPcHRzLmV4dHJhQ2xhc3Nlcztcbn07XG4vKiBGb3JtYXRzIHRoZSB2YWx1ZSAod2hpY2ggaXMgYWx3YXlzIG51bWVyaWMpIGludG8gdGhlIHZhbHVlIHRvXG4gKiBiZSBkaXNwbGF5ZWQuIFRoZSByZXN1bHQgc2hvdWxkIGJlIEhUTUwgKGJ1dCBubyB0YWdzIGFyZVxuICogbmVlZGVkKS4gSWYgbnVsbCBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcXVhbGl0eSBkZWZpbml0aW9uIHdpbGxcbiAqIG5vdCBiZSBkaXNwbGF5ZWQsIHNvIGlmIHlvdSB3YW50IGFuIGVtcHR5IHZhbHVlIHJldHVybiBhbiBlbXB0eVxuICogc3RyaW5nLiAqL1xuUXVhbGl0eURlZmluaXRpb24ucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59O1xuXG4vKiBBIHF1YWxpdHkgdGhhdCBpcyBhbHdheXMgZGlzcGxheWVkIGFzIHRoZSBuZWFyZXN0IGludGVnZXIgb2ZcbiAqIHRoZSBjdXJyZW50IHZhbHVlLCByb3VuZGVkIGRvd24uIE9wdGlvbnMgKGluIHRoZSBvcHRzXG4gKiBwYXJhbWV0ZXIpIGFyZSB0aGUgc2FtZSBhcyBmb3IgUXVhbGl0eURlZmluaXRpb24uICovXG52YXIgSW50ZWdlclF1YWxpdHkgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICBRdWFsaXR5RGVmaW5pdGlvbi5jYWxsKHRoaXMsIHRpdGxlLCBvcHRzKTtcbn07XG5JbnRlZ2VyUXVhbGl0eS5pbmhlcml0cyhRdWFsaXR5RGVmaW5pdGlvbik7XG5JbnRlZ2VyUXVhbGl0eS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oY2hhcmFjdGVyLCB2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSkudG9TdHJpbmcoKTtcbn07XG5cbi8qIEEgcXVhbGl0eSB0aGF0IGRpc3BsYXlzIGFzIGFuIEludGVnZXJRdWFsaXR5LCB1bmxlc3MgaXQgaXNcbiAqIHplcm8sIHdoZW4gaXQgaXMgb21pdHRlZC4gT3B0aW9ucyAoaW4gdGhlIG9wdHMgKiBwYXJhbWV0ZXIpIGFyZVxuICogdGhlIHNhbWUgYXMgZm9yIFF1YWxpdHlEZWZpbml0aW9uLiAqL1xudmFyIE5vblplcm9JbnRlZ2VyUXVhbGl0eSA9IGZ1bmN0aW9uKHRpdGxlLCBvcHRzKSB7XG4gIEludGVnZXJRdWFsaXR5LmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xufTtcbk5vblplcm9JbnRlZ2VyUXVhbGl0eS5pbmhlcml0cyhJbnRlZ2VyUXVhbGl0eSk7XG5Ob25aZXJvSW50ZWdlclF1YWxpdHkucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEludGVnZXJRdWFsaXR5LnByb3RvdHlwZS5mb3JtYXQuY2FsbChcbiAgICAgIHRoaXMsIGNoYXJhY3RlciwgdmFsdWVcbiAgICApO1xuICB9XG59O1xuXG4vKiBBIHF1YWxpdHkgdGhhdCBkaXNwbGF5cyBpdHMgZnVsbCBudW1lcmljIHZhbHVlLCBpbmNsdWRpbmdcbiAqIGRlY2ltYWwgY29tcG9uZW50LiBUaGlzIGlzIGFjdHVhbGx5IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZFxuICogdGhlIFF1YWxpdHlEZWZpbml0aW9uIGNsYXNzLCB3aGljaCBmb3JtYXRzIGluIHRoZSBzYW1lXG4gKiB3YXkuIE9wdGlvbnMgKGluIHRoZSBvcHRzIHBhcmFtZXRlcikgYXJlIHRoZSBzYW1lIGFzIGZvclxuICogUXVhbGl0eURlZmluaXRpb24uICovXG52YXIgTnVtZXJpY1F1YWxpdHkgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICBRdWFsaXR5RGVmaW5pdGlvbi5jYWxsKHRoaXMsIHRpdGxlLCBvcHRzKTtcbn07XG5OdW1lcmljUXVhbGl0eS5pbmhlcml0cyhRdWFsaXR5RGVmaW5pdGlvbik7XG5cbi8qIEEgcXVhbGl0eSB0aGF0IGRpc3BsYXlzIGl0cyB2YWx1ZXMgYXMgb25lIG9mIGEgc2V0IG9mXG4gKiB3b3Jkcy4gVGhlIHF1YWxpdHkgdmFsdWUgaXMgZmlyc3Qgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0XG4gKiBpbnRlZ2VyLCB0aGVuIHRoaXMgdmFsdWUgaXMgdXNlZCB0byBzZWxlY3QgYSB3b3JkIHRvXG4gKiBkaXNwbGF5LiBUaGUgb2Zmc2V0IHBhcmFtZXRlciAob3B0aW9uYWxseSBwYXNzZWQgaW4gYXMgcGFydCBvZlxuICogdGhlIG9wdHMgb2JqZWN0KSBjb250cm9scyB3aGF0IG51bWJlciBtYXBzIHRvIHdoYXQgd29yZC5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgKGluIHRoZSBvcHRzIHBhcmFtZXRlcikgYXJlIGF2YWlsYWJsZTpcbiAqXG4gKiBvZmZzZXQgLSBXaXRoIG9mZnNldD0wICh0aGUgZGVmYXVsdCksIHRoZSBxdWFudGl0eSB2YWx1ZSBvZiAwXG4gKiAgICAgd2lsbCBtYXAgdG8gdGhlIGZpcnN0IHdvcmQsIGFuZCBzbyBvbi4gSWYgb2Zmc2V0IGlzXG4gKiAgICAgbm9uLXplcm8gdGhlbiB0aGUgdmFsdWUgZ2l2ZW4gd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdFxuICogICAgIHdvcmQgaW4gdGhlIGxpc3QuIFNvIGlmIG9mZnNldD00LCB0aGVuIHRoZSBmaXJzdCB3b3JkIGluXG4gKiAgICAgdGhlIGxpc3Qgd2lsbCBiZSB1c2VkIGZvciB2YWx1ZT00LlxuICpcbiAqIHVzZUJvbnVzZXMgLSBJZiB0aGlzIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiB2YWx1ZXMgb3V0c2lkZVxuICogICAgIHRoZSByYW5nZSBvZiB3b3JkcyB3aWxsIGJlIGNvbnN0cnVjZWQgZnJvbSB0aGUgd29yZCBhbmQgYVxuICogICAgIG51bWVyaWMgYm9udXMuIFNvIHdpdGggb2Zmc2V0PTAgYW5kIGZpdmUgd29yZHMsIHRoZSBsYXN0IG9mXG4gKiAgICAgd2hpY2ggaXMgJ2FtYXppbmcnLCBhIHNjb3JlIG9mIHNpeCB3b3VsZCBnaXZlICdhbWF6aW5nKzEnLlxuICogICAgIGlmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlIGJvbnVzIHdvdWxkIGJlIG9taXR0ZWQsIHNvXG4gKiAgICAgYW55dGhpbmcgYmV5b25kICdhbWF6aW5nJyBpcyBzdGlsbCAnYW1hemluZycuXG4gKlxuICogT3RoZXIgb3B0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIFF1YWxpdHlEZWZpbml0aW9uLlxuICovXG52YXIgV29yZFNjYWxlUXVhbGl0eSA9IGZ1bmN0aW9uKHRpdGxlLCB2YWx1ZXMsIG9wdHMpIHtcbiAgdmFyIG15T3B0cyA9IGV4dGVuZChvcHRzLCB7XG4gICAgb2Zmc2V0OiBudWxsLFxuICAgIHVzZUJvbnVzZXM6IHRydWVcbiAgfSk7XG4gIFF1YWxpdHlEZWZpbml0aW9uLmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xuICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgdGhpcy5vZmZzZXQgPSBteU9wdHMub2Zmc2V0O1xuICB0aGlzLnVzZUJvbnVzZXMgPSBteU9wdHMudXNlQm9udXNlcztcbn07XG5Xb3JkU2NhbGVRdWFsaXR5LmluaGVyaXRzKFF1YWxpdHlEZWZpbml0aW9uKTtcbldvcmRTY2FsZVF1YWxpdHkucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgdmFsdWUpIHtcbiAgdmFyIHZhbCA9IE1hdGguZmxvb3IodmFsdWUgLSB0aGlzLm9mZnNldCk7XG4gIHZhciBtb2QgPSBcIlwiO1xuICBpZiAodmFsIDwgMCkge1xuICAgIG1vZCA9IHZhbC50b1N0cmluZygpO1xuICAgIHZhbCA9IDA7XG4gIH0gZWxzZSBpZiAodmFsID49IHRoaXMudmFsdWVzLmxlbmd0aCkge1xuICAgIG1vZCA9IFwiK1wiICsgKHZhbCAtIHRoaXMudmFsdWVzLmxlbmd0aCArIDEpLnRvU3RyaW5nKCk7XG4gICAgdmFsID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgfVxuICBpZiAoIXRoaXMudXNlQm9udXNlcykgbW9kID0gXCJcIjtcbiAgaWYgKHRoaXMudmFsdWVzW3ZhbF0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4gdGhpcy52YWx1ZXNbdmFsXSArIG1vZDsgLy8gVHlwZSBjb2VyY2lvblxufTtcblxuLyogQSBzcGVjaWFsaXphdGlvbiBvZiBXb3JkU2NhbGVRdWFsaXR5IHRoYXQgdXNlcyB0aGUgRlVER0UgUlBHJ3NcbiAqIGFkamVjdGl2ZSBzY2FsZSAoZnJvbSAndGVycmlibGUnIGF0IC0zIHRvICdzdXBlcmInIGF0ICszKS4gVGhlXG4gKiBvcHRpb25zIGFyZSBhcyBmb3IgV29yZFNjYWxlUXVhbGl0eS4gSW4gcGFydGljdWxhciB5b3UgY2FuIHVzZVxuICogdGhlIG9mZnNldCBvcHRpb24gdG8gY29udHJvbCB3aGVyZSB0aGUgc2NhbGUgc3RhcnRzLiBTbyB5b3VcbiAqIGNvdWxkIG1vZGVsIGEgcXVhbGl0eSB0aGF0IGV2ZXJ5b25lIHN0YXJ0cyBvZmYgYXMgJ3RlcnJpYmxlJ1xuICogKHN1Y2ggYXMgTnVjbGVhciBQaHlzaWNzKSB3aXRoIGFuIG9mZnNldCBvZiAwLCB3aGlsZSBhbm90aGVyIHRoYXRcbiAqIGlzIG1vcmUgY29tbW9uIChzdWNoIGFzIEhlYWx0aCkgY291bGQgaGF2ZSBhbiBvZmZzZXQgb2YgLTUgc29cbiAqIGV2ZXJ5b25lIHN0YXJ0cyB3aXRoICdncmVhdCcuXG4gKi9cbnZhciBGdWRnZUFkamVjdGl2ZXNRdWFsaXR5ID0gZnVuY3Rpb24odGl0bGUsIG9wdHMpIHtcbiAgV29yZFNjYWxlUXVhbGl0eS5jYWxsKHRoaXMsIHRpdGxlLCBbXG4gICAgXCJ0ZXJyaWJsZVwiLmwoKSxcbiAgICBcInBvb3JcIi5sKCksXG4gICAgXCJtZWRpb2NyZVwiLmwoKSxcbiAgICBcImZhaXJcIi5sKCksXG4gICAgXCJnb29kXCIubCgpLFxuICAgIFwiZ3JlYXRcIi5sKCksXG4gICAgXCJzdXBlcmJcIi5sKClcbiAgXSwgb3B0cyk7XG4gIGlmICghKCdvZmZzZXQnIGluIG9wdHMpKSB0aGlzLm9mZnNldCA9IC0zO1xufTtcbkZ1ZGdlQWRqZWN0aXZlc1F1YWxpdHkuaW5oZXJpdHMoV29yZFNjYWxlUXVhbGl0eSk7XG5cbi8qIEFuIGJvb2xlYW4gcXVhbGl0eSB0aGF0IHJlbW92ZXMgaXRzZWxmIGZyb20gdGhlIHF1YWxpdHkgbGlzdCBpZlxuICogaXQgaGFzIGEgemVybyB2YWx1ZS4gSWYgaXQgaGFzIGEgbm9uLXplcm8gdmFsdWUsIGl0cyB2YWx1ZVxuICogZmllbGQgaXMgdXN1YWxseSBsZWZ0IGVtcHR5LCBidXQgeW91IGNhbiBzcGVjaWZ5IHlvdXIgb3duXG4gKiBzdHJpbmcgdG8gZGlzcGxheSBhcyB0aGUgYG9uRGlzcGxheWAgcGFyYW1ldGVyIG9mIHRoZSBvcHRzXG4gKiBvYmplY3QuIE90aGVyIG9wdGlvbnMgKGluIHRoZSBvcHRzIHBhcmFtZXRlcikgYXJlIHRoZSBzYW1lIGFzXG4gKiBmb3IgUXVhbGl0eURlZmluaXRpb24uICovXG52YXIgT25PZmZRdWFsaXR5ID0gZnVuY3Rpb24odGl0bGUsIG9wdHMpIHtcbiAgdmFyIG15T3B0cyA9IGV4dGVuZChvcHRzLCB7XG4gICAgb25EaXNwbGF5OiBcIlwiXG4gIH0pO1xuICBRdWFsaXR5RGVmaW5pdGlvbi5jYWxsKHRoaXMsIHRpdGxlLCBvcHRzKTtcbiAgdGhpcy5vbkRpc3BsYXkgPSBteU9wdHMub25EaXNwbGF5O1xufTtcbk9uT2ZmUXVhbGl0eS5pbmhlcml0cyhRdWFsaXR5RGVmaW5pdGlvbik7XG5Pbk9mZlF1YWxpdHkucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSByZXR1cm4gdGhpcy5vbkRpc3BsYXk7XG4gIGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vKiBBIGJvb2xlYW4gcXVhbGl0eSB0aGF0IGhhcyBkaWZmZXJlbnQgb3V0cHV0IHRleHQgZm9yIHplcm8gb3JcbiAqIG5vbi16ZXJvIHF1YWxpdHkgdmFsdWVzLiBVbmxpa2UgT25PZmZRdWFsaXR5LCB0aGlzIGRlZmluaXRpb25cbiAqIGRvZXNuJ3QgcmVtb3ZlIGl0c2VsZiBmcm9tIHRoZSBsaXN0IHdoZW4gaXQgaXMgMC4gVGhlIG9wdGlvbnNcbiAqIGFyZSBhcyBmb3IgUXVhbGl0eURlZmluaXRpb24sIHdpdGggdGhlIGFkZGl0aW9uIG9mIG9wdGlvbnNcbiAqICd5ZXNEaXNwbGF5JyBhbmQgJ25vRGlzcGxheScsIHdoaWNoIGNvbnRhaW4gdGhlIEhUTUwgZnJhZ21lbnRzXG4gKiB1c2VkIHRvIGRpc3BsYXkgdHJ1ZSBhbmQgZmFsc2UgdmFsdWVzLiBJZiBub3QgZ2l2ZW4sIHRoZXNlXG4gKiBkZWZhdWx0IHRvICd5ZXMnIGFuZCAnbm8nLlxuICovXG52YXIgWWVzTm9RdWFsaXR5ID0gZnVuY3Rpb24odGl0bGUsIG9wdHMpIHtcbiAgdmFyIG15T3B0cyA9IGV4dGVuZChvcHRzLHtcbiAgICB5ZXNEaXNwbGF5OiBcInllc1wiLmwoKSxcbiAgICBub0Rpc3BsYXk6IFwibm9cIi5sKClcbiAgfSk7XG4gIFF1YWxpdHlEZWZpbml0aW9uLmNhbGwodGhpcywgdGl0bGUsIG9wdHMpO1xuICB0aGlzLnllc0Rpc3BsYXkgPSBteU9wdHMueWVzRGlzcGxheTtcbiAgdGhpcy5ub0Rpc3BsYXkgPSBteU9wdHMubm9EaXNwbGF5O1xufTtcblllc05vUXVhbGl0eS5pbmhlcml0cyhRdWFsaXR5RGVmaW5pdGlvbik7XG5ZZXNOb1F1YWxpdHkucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSByZXR1cm4gdGhpcy55ZXNEaXNwbGF5O1xuICBlbHNlIHJldHVybiB0aGlzLm5vRGlzcGxheTtcbn07XG5cbi8qIERlZmluZXMgYSBncm91cCBvZiBxdWFsaXRpZXMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHRvZ2V0aGVyLFxuICogdW5kZXIgdGhlIGdpdmVuIG9wdGlvbmFsIHRpdGxlLiBUaGVzZSBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGVcbiAqIGB1bmR1bS5nYW1lLnF1YWxpdHlHcm91cHNgIHBhcmFtZXRlci4gKi9cbnZhciBRdWFsaXR5R3JvdXAgPSBmdW5jdGlvbih0aXRsZSwgb3B0cykge1xuICB2YXIgbXlPcHRzID0gZXh0ZW5kKG9wdHMse1xuICAgIHByaW9yaXR5OiB0aXRsZSxcbiAgICBleHRyYUNsYXNzZXM6IG51bGxcbiAgfSk7XG4gIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgdGhpcy5wcmlvcml0eSA9IG15T3B0cy5wcmlvcml0eTtcbiAgdGhpcy5leHRyYUNsYXNzZXMgPSBteU9wdHMuZXh0cmFDbGFzc2VzO1xufTtcbiIsIi8qIEEgc3lzdGVtIG9iamVjdCBpcyBwYXNzZWQgaW50byB0aGUgZW50ZXIsIGFjdCBhbmQgZXhpdFxuICogZnVuY3Rpb25zIG9mIGVhY2ggc2l0dWF0aW9uLiBJdCBpcyB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlXG4gKiBVSS5cbiAqL1xudmFyIFN5c3RlbSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJuZCA9IG51bGw7XG4gIHRoaXMudGltZSA9IDA7XG59O1xuXG4vKiBSZW1vdmVzIGFsbCBjb250ZW50IGZyb20gdGhlIHBhZ2UsIGNsZWFyaW5nIHRoZSBtYWluIGNvbnRlbnQgYXJlYS5cbiAqXG4gKiBJZiBhbiBlbGVtZW50U2VsZWN0b3IgaXMgZ2l2ZW4sIHRoZW4gb25seSB0aGF0IHNlbGVjdG9yIHdpbGwgYmVcbiAqIGNsZWFyZWQuIE5vdGUgdGhhdCBhbGwgY29udGVudCBmcm9tIHRoZSBjbGVhcmVkIGVsZW1lbnQgaXMgcmVtb3ZlZCxcbiAqIGJ1dCB0aGUgZWxlbWVudCBpdHNlbGYgcmVtYWlucywgcmVhZHkgdG8gYmUgZmlsbGVkIGFnYWluIHVzaW5nXG4gKiBTeXN0ZW0ud3JpdGUuXG4gKi9cblN5c3RlbS5wcm90b3R5cGUuY2xlYXJDb250ZW50ID0gZnVuY3Rpb24oZWxlbWVudFNlbGVjdG9yKSB7XG4gIHZhciAkZWxlbWVudDtcbiAgaWYgKGVsZW1lbnRTZWxlY3RvcikgJGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRTZWxlY3Rvcik7XG4gIGlmICghJGVsZW1lbnQpICRlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpO1xuICAkZWxlbWVudC5pbm5lckhUTUwgPSAnJztcbn07XG5cbi8qIE91dHB1dHMgcmVndWxhciBjb250ZW50IHRvIHRoZSBwYWdlLiBUaGUgY29udGVudCBzdXBwbGllZCBtdXN0XG4gKiBiZSB2YWxpZCBcIkRpc3BsYXkgQ29udGVudFwiLlxuICpcbiAqIFwiRGlzcGxheSBDb250ZW50XCIgaXMgYW55IEhUTUwgc3RyaW5nIHRoYXQgYmVnaW5zIHdpdGggYSBIVE1MXG4gKiBzdGFydCB0YWcsIGVuZHMgd2l0aCBlaXRoZXIgYW4gZW5kIG9yIGEgY2xvc2VkIHRhZywgYW5kIGlzIGFcbiAqIHZhbGlkIGFuZCBzZWxmLWNvbnRhaW5lZCBzbmlwcGV0IG9mIEhUTUwuIE5vdGUgdGhhdCB0aGUgc3RyaW5nXG4gKiBkb2Vzbid0IGhhdmUgdG8gY29uc2lzdCBvZiBvbmx5IG9uZSBIVE1MIHRhZy4gWW91IGNvdWxkIGhhdmVcbiAqIHNldmVyYWwgcGFyYWdyYXBocywgZm9yIGV4YW1wbGUsIGFzIGxvbmcgYXMgdGhlIGNvbnRlbnQgc3RhcnRzXG4gKiB3aXRoIHRoZSA8cD4gb2YgdGhlIGZpcnN0IHBhcmFncmFwaCwgYW5kIGVuZHMgd2l0aCB0aGUgPC9wPiBvZlxuICogdGhlIGxhc3QuIFNvIFwiPHA+Rm9vPC9wPjxpbWcgc3JjPSdiYXInPlwiIGlzIHZhbGlkLCBidXQgXCJmb288aW1nXG4gKiBzcmM9J2Jhcic+XCIgaXMgbm90LlxuICpcbiAqIFRoZSBjb250ZW50IGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSwgdW5sZXNzIHlvdSBzdXBwbHkgdGhlXG4gKiBvcHRpb25hbCBzZWxlY3RvciBhcmd1bWVudC4gSWYgeW91IGRvLCB0aGUgY29udGVudCBhcHBlYXJzXG4gKiBhZnRlciB0aGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhhdCBzZWxlY3Rvci5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcikge1xuICBkb1dyaXRlKGNvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcik7XG59O1xuXG4vKiBPdXRwdXRzIHRoZSBnaXZlbiBjb250ZW50IGluIGEgaGVhZGluZyBvbiB0aGUgcGFnZS4gVGhlIGNvbnRlbnRcbiAqIHN1cHBsaWVkIG11c3QgYmUgdmFsaWQgXCJEaXNwbGF5IENvbnRlbnRcIi5cbiAqXG4gKiBUaGUgY29udGVudCBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UsIHVubGVzcyB5b3Ugc3VwcGx5IHRoZVxuICogb3B0aW9uYWwgc2VsZWN0b3IgYXJndW1lbnQuIElmIHlvdSBkbywgdGhlIGNvbnRlbnQgYXBwZWFyc1xuICogYWZ0ZXIgdGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoYXQgc2VsZWN0b3IuXG4gKi9cblN5c3RlbS5wcm90b3R5cGUud3JpdGVIZWFkaW5nID0gZnVuY3Rpb24oaGVhZGluZ0NvbnRlbnQsIGVsZW1lbnRTZWxlY3Rvcikge1xuICB2YXIgaGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8aDE+XCIpO1xuICBoZWFkaW5nLmlubmVySFRNTCA9IGhlYWRpbmdDb250ZW50O1xuICBkb1dyaXRlKGhlYWRpbmcsIGVsZW1lbnRTZWxlY3Rvcik7XG59O1xuXG4vKiBPdXRwdXRzIHJlZ3VsYXIgY29udGVudCB0byB0aGUgcGFnZS4gVGhlIGNvbnRlbnQgc3VwcGxpZWQgbXVzdFxuICogYmUgdmFsaWQgXCJEaXNwbGF5IENvbnRlbnRcIi5cbiAqXG4gKiBUaGUgY29udGVudCBnb2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UsIHVubGVzcyB5b3VcbiAqIHN1cHBseSB0aGUgb3B0aW9uYWwgc2VsZWN0b3IgYXJndW1lbnQuIElmIHlvdSBkbywgdGhlIGNvbnRlbnRcbiAqIGFwcGVhcnMgYWZ0ZXIgdGhlIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoYXQgc2VsZWN0b3IuXG4gKi9cblN5c3RlbS5wcm90b3R5cGUud3JpdGVCZWZvcmUgPSBmdW5jdGlvbihjb250ZW50LCBlbGVtZW50U2VsZWN0b3IpIHtcbiAgZG9Xcml0ZShjb250ZW50LCBlbGVtZW50U2VsZWN0b3IsICdwcmVwZW5kJywgJ2JlZm9yZScpO1xufTtcblxuLyogT3V0cHV0cyByZWd1bGFyIGNvbnRlbnQgdG8gdGhlIHBhZ2UuIFRoZSBjb250ZW50IHN1cHBsaWVkIG11c3RcbiAqIGJlIHZhbGlkIFwiRGlzcGxheSBDb250ZW50XCIuXG4gKlxuICogV2hlbiBhIHNlbGVjdG9yIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgYmVoYXZlcyBpZGVudGljYWxseSB0b1xuICogU3lzdGVtLnByb3RvdHlwZS53cml0ZS4gSWYgeW91IHN1cHBseSBhIHNlbGVjdG9yLCB0aGUgY29udGVudFxuICogYXBwZWFycyBhcyBhIGNoaWxkIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudCBvZiB0aGVcbiAqIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoYXQgc2VsZWN0b3IuXG4gKi9cblxuU3lzdGVtLnByb3RvdHlwZS53cml0ZUludG8gPSBmdW5jdGlvbihjb250ZW50LCBlbGVtZW50U2VsZWN0b3IpIHtcbiAgZG9Xcml0ZShjb250ZW50LCBlbGVtZW50U2VsZWN0b3IsICdhcHBlbmQnLCAnYXBwZW5kJyk7XG59O1xuXG4vKiBSZXBsYWNlcyBjb250ZW50IHdpdGggdGhlIGNvbnRlbnQgc3VwcGxpZWQsIHdoaWNoIG11c3QgYmUgdmFsaWRcbiAqIFwiRGlzcGxheSBDb250ZW50XCIuXG4gKlxuICogV2hlbiBhIHNlbGVjdG9yIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgcmVwbGFjZXMgdGhlIGVudGlyZVxuICogY29udGVudCBvZiB0aGUgcGFnZS4gT3RoZXJ3aXNlLCBpdCByZXBsYWNlcyB0aGUgZWxlbWVudCBtYXRjaGVkXG4gKiB3aXRoIHRoZSBzZWxlY3Rvci4gVGhpcyByZXBsYWNlcyB0aGUgZW50aXJlIGVsZW1lbnQsIGluY2x1ZGluZ1xuICogdGhlIG1hdGNoZWQgdGFncywgc28gaWRlYWxseSB0aGUgY29udGVudCBzdXBwbGllZCBzaG91bGQgZml0XG4gKiBpbiBpdHMgcGxhY2UgaW4gdGhlIERPTSB3aXRoIHRoZSBzYW1lIGtpbmQgb2YgZGlzcGxheSBlbGVtZW50LlxuICovXG5cblN5c3RlbS5wcm90b3R5cGUucmVwbGFjZVdpdGggPSBmdW5jdGlvbihjb250ZW50LCBlbGVtZW50U2VsZWN0b3IpIHtcbiAgZG9Xcml0ZShjb250ZW50LCBlbGVtZW50U2VsZWN0b3IsICdyZXBsYWNlV2l0aCcsICdyZXBsYWNlV2l0aCcpO1xufTtcblxuLyogQ2FycmllcyBvdXQgdGhlIGdpdmVuIHNpdHVhdGlvbiBjaGFuZ2Ugb3IgYWN0aW9uLCBhcyBpZiBpdCB3ZXJlXG4gKiBpbiBhIGxpbmsgdGhhdCBoYXMgYmVlbiBjbGlja2VkLiBUaGlzIGFsbG93cyB5b3UgdG8gZG9cbiAqIHByb2NlZHVyYWwgdHJhbnNpdGlvbnMuIFlvdSBtaWdodCBoYXZlIGFuIGFjdGlvbiB0aGF0IGJ1aWxkcyB1cFxuICogdGhlIGNoYXJhY3RlcidzIHN0cmVuZ3RoLCBhbmQgZGVwbGV0ZXMgdGhlaXIgbWFnaWMuIFdoZW4gdGhlXG4gKiBtYWdpYyBpcyBhbGwgZ29uZSwgeW91IGNhbiBmb3JjZSBhIHNpdHVhdGlvbiBjaGFuZ2UgYnkgY2FsbGluZ1xuICogdGhpcyBtZXRob2QuICovXG5TeXN0ZW0ucHJvdG90eXBlLmRvTGluayA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgcHJvY2Vzc0xpbmsoY29kZSk7XG59O1xuXG4vKiBUdXJucyBhbnkgbGlua3MgdGhhdCB0YXJnZXQgdGhlIGdpdmVuIGhyZWYgaW50byBwbGFpblxuICogdGV4dC4gVGhpcyBjYW4gYmUgdXNlZCB0byByZW1vdmUgYWN0aW9uIG9wdGlvbnMgd2hlbiBhbiBhY3Rpb25cbiAqIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIEl0IGlzIHVzZWQgYXV0b21hdGljYWxseSB3aGVuIHlvdSBnaXZlXG4gKiBhIGxpbmsgdGhlICdvbmNlJyBjbGFzcy4gKi9cblN5c3RlbS5wcm90b3R5cGUuY2xlYXJMaW5rcyA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFbaHJlZj0nXCIgKyBjb2RlICsgXCInXVwiKTtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsaW5rcywgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpe1xuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNwYW5cIikuY2xhc3NMaXN0LmFkZChcImV4X2xpbmtcIik7XG4gIH0pO1xufTtcblxuLyogR2l2ZW4gYSBsaXN0IG9mIHNpdHVhdGlvbiBpZHMsIHRoaXMgb3V0cHV0cyBhIHN0YW5kYXJkIG9wdGlvblxuICogYmxvY2sgd2l0aCB0aGUgc2l0dWF0aW9uIGNob2ljZXMgaW4gdGhlIGdpdmVuIG9yZGVyLlxuICpcbiAqIFRoZSBjb250ZW50cyBvZiBlYWNoIGNob2ljZSB3aWxsIGJlIGEgbGluayB0byB0aGUgc2l0dWF0aW9uLFxuICogdGhlIHRleHQgb2YgdGhlIGxpbmsgd2lsbCBiZSBnaXZlbiBieSB0aGUgc2l0dWF0aW9uJ3NcbiAqIG91dHB1dFRleHQgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGUgY2FuQ2hvb3NlIGZ1bmN0aW9uIGlzXG4gKiBjYWxsZWQsIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIHRoZSB0ZXh0IHdpbGwgYXBwZWFyLCBidXRcbiAqIHRoZSBsaW5rIHdpbGwgbm90IGJlIGNsaWNrYWJsZS5cbiAqXG4gKiBBbHRob3VnaCBjYW5DaG9vc2UgaXMgaG9ub3JlZCwgY2FuVmlldyBhbmQgZGlzcGxheU9yZGVyIGFyZVxuICogbm90LiBJZiB5b3UgbmVlZCB0byBob25vciB0aGVzZSwgeW91IHNob3VsZCBlaXRoZXIgZG8gc29cbiAqIG1hbnVhbGx5LCBvdCBlbHNlIHVzZSB0aGUgYGdldFNpdHVhdGlvbklkQ2hvaWNlc2AgbWV0aG9kIHRvXG4gKiByZXR1cm4gYW4gb3JkZXJlZCBsaXN0IG9mIHZhbGlkIHZpZXdhYmxlIHNpdHVhdGlvbiBpZHMuXG4gKi9cblN5c3RlbS5wcm90b3R5cGUud3JpdGVDaG9pY2VzID0gZnVuY3Rpb24obGlzdE9mSWRzLCBlbGVtZW50U2VsZWN0b3IpIHtcbiAgaWYgKGxpc3RPZklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICB2YXIgY3VycmVudFNpdHVhdGlvbiA9IGdldEN1cnJlbnRTaXR1YXRpb24oKTtcbiAgdmFyICRvcHRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ1bFwiKS5jbGFzc0xpc3QuYWRkKFwib3B0aW9uc1wiKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0T2ZJZHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgc2l0dWF0aW9uSWQgPSBsaXN0T2ZJZHNbaV07XG4gICAgdmFyIHNpdHVhdGlvbiA9IGdhbWUuc2l0dWF0aW9uc1tzaXR1YXRpb25JZF07XG4gICAgYXNzZXJ0KHNpdHVhdGlvbiwgXCJ1bmtub3duX3NpdHVhdGlvblwiLmwoe2lkOnNpdHVhdGlvbklkfSkpO1xuXG4gICAgdmFyIG9wdGlvblRleHQgPSBzaXR1YXRpb24ub3B0aW9uVGV4dChjaGFyYWN0ZXIsIHRoaXMsXG4gICAgICAgIGN1cnJlbnRTaXR1YXRpb24pO1xuICAgIGlmICghb3B0aW9uVGV4dCkgb3B0aW9uVGV4dCA9IFwiY2hvaWNlXCIubCh7bnVtYmVyOmkrMX0pO1xuICAgIHZhciAkb3B0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKTtcbiAgICB2YXIgJGE7XG4gICAgaWYgKHNpdHVhdGlvbi5jYW5DaG9vc2UoY2hhcmFjdGVyLCB0aGlzLCBjdXJyZW50U2l0dWF0aW9uKSkge1xuICAgICAgJGEgPSBcIjxhIGhyZWY9J1wiK3NpdHVhdGlvbklkK1wiJz5cIitvcHRpb25UZXh0K1wiPC9hPlwiXG4gICAgfSBlbHNlIHtcbiAgICAgICRhID0gXCI8c3Bhbj5cIitvcHRpb25UZXh0K1wiPC9zcGFuPlwiO1xuICAgIH1cbiAgICAkb3B0aW9uLmlubmVySFRNTCA9ICRhO1xuICAgICRvcHRpb25zLmFwcGVuZENoaWxkKCRvcHRpb24pO1xuICB9XG4gIGRvV3JpdGUoJG9wdGlvbnMsIGVsZW1lbnRTZWxlY3RvciwgJ2FwcGVuZCcsICdhZnRlcicpO1xufTtcblxuLyogUmV0dXJucyBhIGxpc3Qgb2Ygc2l0dWF0aW9uIGlkcyB0byBjaG9vc2UgZnJvbSwgZ2l2ZW4gYSBzZXQgb2ZcbiAqIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21wbGV4IGFuZCBwb3dlcmZ1bCB3YXkgb2YgY29tcGlsaW5nXG4gKiBpbXBsaWNpdCBzaXR1YXRpb24gY2hvaWNlcy4gWW91IGdpdmUgaXQgYSBsaXN0IG9mIHNpdHVhdGlvbiBpZHNcbiAqIGFuZCBzaXR1YXRpb24gdGFncyAoaWYgYSBzaW5nbGUgaWQgb3IgdGFnIGlzIG5lZWRlZCBqdXN0IHRoYXRcbiAqIHN0cmluZyBjYW4gYmUgZ2l2ZW4sIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFcbiAqIGxpc3QpLiBUYWdzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIGEgaGFzaCAjIHRvIGRpZmZlcmVudGlhdGVcbiAqIHRoZW0gZnJvbSBzaXR1YXRpb24gaWRzLiBUaGUgZnVuY3Rpb24gdGhlbiBjb25zaWRlcnMgYWxsXG4gKiBtYXRjaGluZyBzaXR1YXRpb25zIGluIGRlc2NlbmRpbmcgcHJpb3JpdHkgb3JkZXIsIGNhbGxpbmcgdGhlaXJcbiAqIGNhblZpZXcgZnVuY3Rpb25zIGFuZCBmaWx0ZXJpbmcgb3V0IGFueSB0aGF0IHNob3VsZCBub3QgYmVcbiAqIHNob3duLCBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gV2l0aG91dCBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbGlzdCBvZiB0aGUgc2l0dWF0aW9uIGlkcyBhdCB0aGUgaGlnaGVzdFxuICogbGV2ZWwgb2YgcHJpb3JpdHkgdGhhdCBoYXMgYW55IHZhbGlkIHJlc3VsdHMuIFNvLCBmb3IgZXhhbXBsZSxcbiAqIGlmIGEgdGFnICNwbGFjZXMgbWF0Y2hlcyB0aHJlZSBzaXR1YXRpb25zLCBvbmUgd2l0aCBwcmlvcml0eSAyLFxuICogYW5kIHR3byB3aXRoIHByaW9yaXR5IDMsIGFuZCBhbGwgb2YgdGhlbSBjYW4gYmUgdmlld2VkIGluIHRoZVxuICogY3VycmVudCBjb250ZXh0LCB0aGVuIG9ubHkgdGhlIHR3byB3aXRoIHByaW9yaXR5IDMgd2lsbCBiZVxuICogcmV0dXJuZWQuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIGhpZ2gtcHJpb3JpdHkgc2l0dWF0aW9ucyB0aGF0XG4gKiB0cnVtcCBhbnkgbG93ZXIgc2l0dWF0aW9ucyB3aGVuIHRoZXkgYXJlIHZhbGlkLCBzdWNoIGFzXG4gKiBzaXR1YXRpb25zIHRoYXQgZm9yY2UgdGhlIHBsYXllciB0byBnbyB0byBvbmUgZGVzdGluYXRpb24gaWZcbiAqIHRoZSBwbGF5ZXIgaXMgb3V0IG9mIG1vbmV5LCBmb3IgZXhhbXBsZS5cbiAqXG4gKiBJZiBhIG1pbkNob2ljZXMgdmFsdWUgaXMgZ2l2ZW4sIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdFxuICogdG8gcmV0dXJuIGF0IGxlYXN0IHRoYXQgbWFueSByZXN1bHRzLiBJZiBub3QgZW5vdWdoIHJlc3VsdHMgYXJlXG4gKiBhdmFpbGFibGUgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gbG93ZXIgcHJpb3JpdGllcyB3aWxsXG4gKiBiZSBjb25zaWRlcmVkIGluIHR1cm4sIHVudGlsIGVub3VnaCBzaXR1YXRpb25zIGFyZSBmb3VuZC4gSW5cbiAqIHRoZSBleGFtcGxlIGFib3ZlLCBpZiB3ZSBoYWQgYSBtaW5DaG9pY2VzIG9mIHRocmVlLCB0aGVuIGFsbFxuICogdGhyZWUgc2l0dWF0aW9ucyB3b3VsZCBiZSByZXR1cm5lZCwgZXZlbiB0aG91Z2ggdGhleSBoYXZlXG4gKiBkaWZmZXJlbnQgcHJpb3JpdGllcy4gSWYgeW91IG5lZWQgdG8gcmV0dXJuIGFsbCB2YWxpZFxuICogc2l0dWF0aW9ucywgcmVnYXJkbGVzcyBvZiB0aGVpciBwcmlvcml0aWVzLCBzZXQgbWluQ2hvaWNlcyB0byBhXG4gKiBsYXJnZSBudW1iZXIsIHN1Y2ggYXMgYE51bWJlci5NQVhfVkFMVUVgLCBhbmQgbGVhdmUgbWF4Q2hvaWNlc1xuICogdW5kZWZpbmVkLlxuICpcbiAqIElmIGEgbWF4Q2hvaWNlcyB2YWx1ZSBpcyBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCBub3RcbiAqIHJldHVybiBhbnkgbW9yZSB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgcmVzdWx0cy4gSWYgdGhlcmUgYXJlXG4gKiBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YgcmVzdWx0cyBwb3NzaWJsZSwgdGhlbiB0aGUgaGlnaGVzdFxuICogcHJpb3JpdHkgcmVzdWxzIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZCwgYnV0IHRoZVxuICogbG93ZXN0IHByaW9yaXR5IGdyb3VwIHdpbGwgaGF2ZSB0byBmaWdodCBpdCBvdXQgZm9yIHRoZVxuICogcmVtYWluaW5nIHBsYWNlcy4gSW4gdGhpcyBjYXNlLCBhIHJhbmRvbSBzYW1wbGUgaXMgY2hvc2VuLFxuICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggc2l0dWF0aW9uLiBTbyBhXG4gKiBzaXR1YXRpb24gd2l0aCBhIGZyZXF1ZW5jeSBvZiAxMDAgd2lsbCBiZSBjaG9zZW4gMTAwIHRpbWVzIG1vcmVcbiAqIG9mdGVuIHRoYW4gYSBzaXR1YXRpb24gd2l0aCBhIGZyZXF1ZW5jeSBvZiAxLCBpZiB0aGVyZSBpcyBvbmVcbiAqIHNwYWNlIGF2YWlsYWJsZS4gT2Z0ZW4gdGhlc2UgZnJlcXVlbmNpZXMgaGF2ZSB0byBiZSB0YWtlbiBhcyBhXG4gKiBndWlkZWxpbmUsIGFuZCB0aGUgYWN0dWFsIHByb2JhYmlsaXRpZXMgd2lsbCBvbmx5IGJlXG4gKiBhcHByb3hpbWF0ZS4gQ29uc2lkZXIgdGhyZWUgc2l0dWF0aW9ucyB3aXRoIGZyZXF1ZW5jaWVzIG9mIDEsXG4gKiAxLCAxMDAsIGNvbXBldGluZyBmb3IgdHdvIHNwYWNlcy4gVGhlIDEwMC1mcmVxdWVuY3kgc2l0dWF0aW9uXG4gKiB3aWxsIGJlIGNob3NlbiBhbG1vc3QgZXZlcnkgdGltZSwgYnV0IGZvciB0aGUgb3RoZXIgc3BhY2UsIG9uZVxuICogb2YgdGhlIDEtZnJlcXVlbmN5IHNpdHVhdGlvbnMgbXVzdCBiZSBjaG9zZW4uIFNvIHRoZSBhY3R1YWxcbiAqIHByb2JhYmlsaXRpZXMgd2lsbCBiZSByb3VnaGx5IDUwJSwgNTAlLCAxMDAlLiBXaGVuIHNlbGVjdGluZ1xuICogbW9yZSB0aGFuIG9uZSByZXN1bHQsIGZyZXF1ZW5jaWVzIGNhbiBvbmx5IGJlIGEgZ3VpZGUuXG4gKlxuICogQmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0LCBpdCBzb3J0cyB0aGVcbiAqIHNpdHVhdGlvbnMgaW4gaW5jcmVhc2luZyBvcmRlciBvZiB0aGVpciBkaXNwbGF5T3JkZXIgdmFsdWVzLlxuICovXG5TeXN0ZW0ucHJvdG90eXBlLmdldFNpdHVhdGlvbklkQ2hvaWNlcyA9IGZ1bmN0aW9uKGxpc3RPZk9yT25lSWRzT3JUYWdzLFxuICAgIG1pbkNob2ljZXMsIG1heENob2ljZXMpXG57XG4gIHZhciBkYXR1bTtcbiAgdmFyIGk7XG5cbiAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhIHNpbmdsZSBzdHJpbmcgZm9yIHRoZSBpZCBvciB0YWcuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobGlzdE9mT3JPbmVJZHNPclRhZ3MpLnJlcGxhY2UoL15cXFtvYmplY3QgKC4rKVxcXSQvLCBcIiQxXCIpLnRvTG93ZXJDYXNlKCkgPT0gJ3N0cmluZycpIHtcbiAgICBsaXN0T2ZPck9uZUlkc09yVGFncyA9IFtsaXN0T2ZPck9uZUlkc09yVGFnc107XG4gIH1cblxuICAvLyBGaXJzdCB3ZSBidWlsZCBhIGxpc3Qgb2YgYWxsIGNhbmRpZGF0ZSBpZHMuXG4gIHZhciBhbGxJZHMgPSB7fTtcbiAgZm9yIChpID0gMDsgaSA8IGxpc3RPZk9yT25lSWRzT3JUYWdzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHRhZ09ySWQgPSBsaXN0T2ZPck9uZUlkc09yVGFnc1tpXTtcbiAgICBpZiAodGFnT3JJZC5zdWJzdHIoMCwgMSkgPT0gJyMnKSB7XG4gICAgICB2YXIgaWRzID0gZ2V0U2l0dWF0aW9uSWRzV2l0aFRhZyh0YWdPcklkLnN1YnN0cigxKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlkcy5sZW5ndGg7ICsraikge1xuICAgICAgICBhbGxJZHNbaWRzW2pdXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsbElkc1t0YWdPcklkXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlsdGVyIG91dCBhbnl0aGluZyB0aGF0IGNhbid0IGJlIHZpZXdlZCByaWdodCBub3cuXG4gIHZhciBjdXJyZW50U2l0dWF0aW9uID0gZ2V0Q3VycmVudFNpdHVhdGlvbigpO1xuICB2YXIgdmlld2FibGVTaXR1YXRpb25EYXRhID0gW107XG4gIGZvciAodmFyIHNpdHVhdGlvbklkIGluIGFsbElkcykge1xuICAgIHZhciBzaXR1YXRpb24gPSBnYW1lLnNpdHVhdGlvbnNbc2l0dWF0aW9uSWRdO1xuICAgIGFzc2VydChzaXR1YXRpb24sIFwidW5rbm93bl9zaXR1YXRpb25cIi5sKHtpZDpzaXR1YXRpb25JZH0pKTtcblxuICAgIGlmIChzaXR1YXRpb24uY2FuVmlldyhjaGFyYWN0ZXIsIHN5c3RlbSwgY3VycmVudFNpdHVhdGlvbikpIHtcbiAgICAgIC8vIFdoaWxlIHdlJ3JlIGhlcmUsIGdldCB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICB2YXIgdmlld2FibGVTaXR1YXRpb25EYXR1bSA9XG4gICAgICAgIHNpdHVhdGlvbi5jaG9pY2VEYXRhKGNoYXJhY3Rlciwgc3lzdGVtLCBjdXJyZW50U2l0dWF0aW9uKTtcbiAgICAgIHZpZXdhYmxlU2l0dWF0aW9uRGF0dW0uaWQgPSBzaXR1YXRpb25JZDtcbiAgICAgIHZpZXdhYmxlU2l0dWF0aW9uRGF0YS5wdXNoKHZpZXdhYmxlU2l0dWF0aW9uRGF0dW0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZW4gd2Ugc29ydCBpbiBkZXNjZW5kaW5nIHByaW9yaXR5IG9yZGVyLlxuICB2aWV3YWJsZVNpdHVhdGlvbkRhdGEuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gICAgICB9KTtcblxuICB2YXIgY29tbWl0dGVkID0gW107XG4gIHZhciBjYW5kaWRhdGVzQXRMYXN0UHJpb3JpdHkgPSBbXTtcbiAgdmFyIGxhc3RQcmlvcml0eTtcbiAgLy8gSW4gZGVzY2VuZGluZyBwcmlvcml0eSBvcmRlci5cbiAgZm9yIChpID0gMDsgaSA8IHZpZXdhYmxlU2l0dWF0aW9uRGF0YS5sZW5ndGg7ICsraSkge1xuICAgIGRhdHVtID0gdmlld2FibGVTaXR1YXRpb25EYXRhW2ldO1xuICAgIGlmIChkYXR1bS5wcmlvcml0eSAhPSBsYXN0UHJpb3JpdHkpIHtcbiAgICAgIGlmIChsYXN0UHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBXZSd2ZSBkcm9wcGVkIGEgcHJpb3JpdHkgZ3JvdXAsIHNlZSBpZiB3ZSBoYXZlIGVub3VnaFxuICAgICAgICAvLyBzaXR1YXRpb25zIHNvIGZhciwgYW5kIHN0b3AgaWYgd2UgZG8uXG4gICAgICAgIGlmIChtaW5DaG9pY2VzID09PSB1bmRlZmluZWQgfHwgaSA+PSBtaW5DaG9pY2VzKSBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIENvbnRpbnVlIHRvIGFjY2N1bXVsYXRlIG1vcmUgb3B0aW9ucy5cbiAgICAgIGNvbW1pdHRlZC5wdXNoLmFwcGx5KGNvbW1pdHRlZCwgY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5KTtcbiAgICAgIGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eSA9IFtdO1xuICAgICAgbGFzdFByaW9yaXR5ID0gZGF0dW0ucHJpb3JpdHk7XG4gICAgfVxuICAgIGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eS5wdXNoKGRhdHVtKTtcbiAgfVxuXG4gIC8vIFNvIHRoZSB2YWx1ZXMgaW4gY29tbWl0dGVkIHdlJ3JlIGNvbW1pdHRlZCB0bywgYmVjYXVzZSB3aXRob3V0XG4gIC8vIHRoZW0gd2Ugd291bGRuJ3QgaGl0IG91ciBtaW5pbXVtLiBCdXQgdGhvc2UgaW5cbiAgLy8gY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5IG1pZ2h0IHRha2UgdXMgb3ZlciBvdXIgbWF4aW11bSwgc29cbiAgLy8gZmlndXJlIG91dCBob3cgbWFueSB3ZSBzaG91bGQgY2hvb3NlLlxuICB2YXIgdG90YWxDaG9pY2VzID0gY29tbWl0dGVkLmxlbmd0aCArIGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eS5sZW5ndGg7XG4gIGlmIChtYXhDaG9pY2VzID09PSB1bmRlZmluZWQgfHwgbWF4Q2hvaWNlcyA+PSB0b3RhbENob2ljZXMpIHtcbiAgICAvLyBXZSBjYW4gdXNlIGFsbCB0aGUgY2hvaWNlcy5cbiAgICBjb21taXR0ZWQucHVzaC5hcHBseShjb21taXR0ZWQsIGNhbmRpZGF0ZXNBdExhc3RQcmlvcml0eSk7XG4gIH0gZWxzZSBpZiAobWF4Q2hvaWNlcyA+PSBjb21taXR0ZWQubGVuZ3RoKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgdXNlIHRoZSBjb21taXRlZCBvbmVzLlxuICAgIC8vIE5PLU9QXG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgaGF2ZSB0byBzYW1wbGUgdGhlIGNhbmRpZGF0ZXMsIHVzaW5nIHRoZWlyIHJlbGF0aXZlIGZyZXF1ZW5jeS5cbiAgICB2YXIgY2FuZGlkYXRlc1RvSW5jbHVkZSA9IG1heENob2ljZXMgLSBjb21taXR0ZWQubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjYW5kaWRhdGVzQXRMYXN0UHJpb3JpdHkubGVuZ3RoOyArK2kpIHtcbiAgICAgIGRhdHVtID0gY2FuZGlkYXRlc0F0TGFzdFByaW9yaXR5W2ldO1xuICAgICAgZGF0dW0uX2ZyZXF1ZW5jeVZhbHVlID0gdGhpcy5ybmQucmFuZG9tKCkgLyBkYXR1bS5mcmVxdWVuY3k7XG4gICAgfVxuICAgIGNhbmRpZGF0ZXNUb0luY2x1ZGUuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLl9mcmVxdWVuY3lWYWx1ZSAtIGIuX2ZyZXF1ZW5jeVZhbHVlO1xuICAgICAgICB9KTtcbiAgICB2YXIgY2hvc2VuID0gY2FuZGlkYXRlc1RvSW5jbHVkZS5zbGljZSgwLCBjYW5kaWRhdGVzVG9JbmNsdWRlKTtcbiAgICBjb21taXR0ZWQucHVzaC5hcHBseShjb21taXR0ZWQsIGNob3Nlbik7XG4gIH1cblxuICAvLyBOb3cgc29ydCBpbiBhc2NlbmRpbmcgZGlzcGxheSBvcmRlci5cbiAgY29tbWl0dGVkLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgcmV0dXJuIGEuZGlzcGxheU9yZGVyIC0gYi5kaXNwbGF5T3JkZXI7XG4gICAgICB9KTtcblxuICAvLyBBbmQgcmV0dXJuIGFzIGEgbGlzdCBvZiBpZHMgb25seS5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKGkgPSAwOyBpIDwgY29tbWl0dGVkLmxlbmd0aDsgKytpKSB7XG4gICAgcmVzdWx0LnB1c2goY29tbWl0dGVkW2ldLmlkKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogQ2FsbCB0aGlzIHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyIHRleHQ6IHRoZSB0ZXh0IGluIHRoZSByaWdodFxuICogdG9vbGJhciBiZWZvcmUgdGhlIHF1YWxpdGllcyBsaXN0LiBUaGlzIHRleHQgaXMgZGVzaWduZWQgdG8gYmVcbiAqIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgeW91ciBjaGFyYWN0ZXIuIFRoZVxuICogY29udGVudCB5b3UgZ2l2ZSBzaG91bGQgYmUgXCJEaXNwbGF5IENvbnRlbnRcIiAoc2VlXG4gKiBgU3lzdGVtLnByb3RvdHlwZS53cml0ZWAgZm9yIHRoZSBkZWZpbml0aW9uKS5cbiAqL1xuU3lzdGVtLnByb3RvdHlwZS5zZXRDaGFyYWN0ZXJUZXh0ID0gZnVuY3Rpb24oY29udGVudCkge1xuICB2YXIgYmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXJhY3Rlcl90ZXh0X2NvbnRlbnRcIik7XG4gIHZhciBvbGRDb250ZW50ID0gYmxvY2suaW5uZXJIVE1MO1xuICB2YXIgbmV3Q29udGVudCA9IGF1Z21lbnRMaW5rcyhjb250ZW50KTtcbiAgaWYgKGludGVyYWN0aXZlICYmIGJsb2NrLm9mZnNldFdpZHRoID4gMCAmJiBibG9jay5vZmZzZXRIZWlnaHQgPiAwKSB7XG4gICAgaGlkZUJsb2NrKGJsb2NrKTtcbiAgICBibG9jay5pbm5lckhUTUwgPSBuZXdDb250ZW50O1xuICAgIHNob3dCbG9jayhibG9jayk7XG4gICAgc2hvd0hpZ2hsaWdodChibG9jay5wYXJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGJsb2NrLmlubmVySFRNTCA9IG5ld0NvbnRlbnQ7XG4gIH1cbn07XG5cbi8qIENhbGwgdGhpcyB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgY2hhcmFjdGVyIHF1YWxpdHkuIERvbid0XG4gKiBkaXJlY3RseSBjaGFuZ2UgcXVhbGl0eSB2YWx1ZXMsIGJlY2F1c2UgdGhhdCB3aWxsIG5vdCB1cGRhdGVcbiAqIHRoZSBVSS4gKFlvdSBjYW4gY2hhbmdlIGFueSBkYXRhIGluIHRoZSBjaGFyYWN0ZXIncyBzYW5kYm94XG4gKiBkaXJlY3RseSwgaG93ZXZlciwgc2luY2UgdGhhdCBpc24ndCBkaXNwbGF5ZWQpLiAqL1xuU3lzdGVtLnByb3RvdHlwZS5zZXRRdWFsaXR5ID0gZnVuY3Rpb24ocXVhbGl0eSwgbmV3VmFsdWUpIHtcbiAgdmFyIG9sZFZhbHVlID0gY2hhcmFjdGVyLnF1YWxpdGllc1txdWFsaXR5XTtcbiAgY2hhcmFjdGVyLnF1YWxpdGllc1txdWFsaXR5XSA9IG5ld1ZhbHVlO1xuICBpZiAoIWludGVyYWN0aXZlKSByZXR1cm47XG5cbiAgLy8gV29yayBvdXQgaG93IHRvIGRpc3BsYXkgdGhlIHZhbHVlcy5cbiAgdmFyIG5ld0Rpc3BsYXk7XG4gIHZhciBxdWFsaXR5RGVmaW5pdGlvbiA9IGdhbWUucXVhbGl0aWVzW3F1YWxpdHldO1xuICBpZiAocXVhbGl0eURlZmluaXRpb24pIHtcbiAgICBuZXdEaXNwbGF5ID0gcXVhbGl0eURlZmluaXRpb24uZm9ybWF0KGNoYXJhY3RlciwgbmV3VmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIHNob3VsZG4ndCBkaXNwbGF5IHF1YWxpdGllcyB0aGF0IGhhdmUgbm8gZGVmaW5pdGlvbi5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBZGQgdGhlIGRhdGEgYmxvY2ssIGlmIHdlIG5lZWQgaXQuXG4gIHZhciBxdWFsaXR5QmxvY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNxX1wiK3F1YWxpdHkpO1xuICBpZiAocXVhbGl0eUJsb2NrLmxlbmd0aCA8PSAwKSB7XG4gICAgaWYgKG5ld0Rpc3BsYXkgPT09IG51bGwpIHJldHVybjtcbiAgICBxdWFsaXR5QmxvY2sgPSBhZGRRdWFsaXR5QmxvY2socXVhbGl0eSkuaGlkZSgpLmZhZGVJbig1MDApO1xuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUncyBub3RoaW5nIHRvIGRvLlxuICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSkgcmV0dXJuO1xuXG4gICAgLy8gQ2hhbmdlIHRoZSB2YWx1ZS5cbiAgICBpZiAobmV3RGlzcGxheSA9PT0gbnVsbCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBibG9jaywgYW5kIHBvc3NpYmx5IHRoZSB3aG9sZSBncm91cCwgaWZcbiAgICAgIC8vIGl0IGlzIHRoZSBsYXN0IHF1YWxpdHkgaW4gdGhlIGdyb3VwLlxuICAgICAgdmFyIHRvUmVtb3ZlID0gbnVsbDtcbiAgICAgIHZhciBncm91cEJsb2NrID0gcXVhbGl0eUJsb2NrLnBhcmVudHMoJy5xdWFsaXR5X2dyb3VwJyk7XG4gICAgICBpZiAoZ3JvdXBCbG9jay5maW5kKCcucXVhbGl0eScpLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHRvUmVtb3ZlID0gZ3JvdXBCbG9jaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvUmVtb3ZlID0gcXVhbGl0eUJsb2NrO1xuICAgICAgfVxuXG4gICAgICB0b1JlbW92ZS5mYWRlT3V0KDEwMDAsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRvUmVtb3ZlLnJlbW92ZSgpO1xuICAgICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmFsQmxvY2sgPSBxdWFsaXR5QmxvY2suZmluZChcIltkYXRhLWF0dHI9J3ZhbHVlJ11cIik7XG4gICAgICB2YWxCbG9jay5mYWRlT3V0KDI1MCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFsQmxvY2suaHRtbChuZXdEaXNwbGF5KTtcbiAgICAgICAgICB2YWxCbG9jay5mYWRlSW4oNzUwKTtcbiAgICAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgc2hvd0hpZ2hsaWdodChxdWFsaXR5QmxvY2spO1xufTtcblxuLyogQ2hhbmdlcyBhIHF1YWxpdHkgdG8gYSBuZXcgdmFsdWUsIGJ1dCBhbHNvIHNob3VsZCBzaG93IGEgcHJvZ3Jlc3MgYmFyXG4gKiBhbmltYXRpb24gb2YgdGhlIGNoYW5nZS4gUmVtb3ZlZCB3aXRoIHRoZSBwcm9ncmVzcyBiYXIgZnVuY3Rpb25hbGl0eS4gKi9cblN5c3RlbS5wcm90b3R5cGUuYW5pbWF0ZVF1YWxpdHkgPSBmdW5jdGlvbihxdWFsaXR5LCBuZXdWYWx1ZSwgb3B0cykge1xuICB0aGlzLnNldFF1YWxpdHkocXVhbGl0eSwgbmV3VmFsdWUpO1xufTtcblxuLyogVGhlIGNoYXJhY3RlciB0aGF0IGlzIHBhc3NlZCBpbnRvIGVhY2ggc2l0dWF0aW9uIGlzIG9mIHRoaXNcbiAqIGZvcm0uXG4gKlxuICogVGhlIGBxdWFsaXRpZXNgIGRhdGEgbWVtYmVyIG1hcHMgdGhlIElkcyBvZiBlYWNoIHF1YWxpdHkgdG8gaXRzXG4gKiBjdXJyZW50IHZhbHVlLiBXaGVuIGltcGxlbWVudGluZyBlbnRlciwgYWN0IG9yIGV4aXQgZnVuY3Rpb25zLFxuICogeW91IHNob3VsZCBjb25zaWRlciB0aGlzIHRvIGJlIHJlYWQtb25seS4gTWFrZSBhbGxcbiAqIG1vZGlmaWNhdGlvbnMgdGhyb3VnaCBgU3lzdGVtLnByb3RvdHlwZS5zZXRRdWFsaXR5YCwgb3JcbiAqIGBTeXN0ZW0ucHJvdG90eXBlLmFuaW1hdGVRdWFsaXR5YC4gSW4geW91ciBgaW5pdGAgZnVuY3Rpb24sIHlvdVxuICogY2FuIHNldCB0aGVzZSB2YWx1ZXMgZGlyZWN0bHkuXG4gKlxuICogVGhlIGBzYW5kYm94YCBkYXRhIG1lbWJlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB5b3VyIGNvZGUgdG9cbiAqIHRyYWNrIGFueSBkYXRhIGl0IG5lZWRzIHRvLiBUaGUgb25seSBwcm92aXNvIGlzIHRoYXQgdGhlIGRhdGFcbiAqIHN0cnVjdHVyZSBzaG91bGQgYmUgc2VyaWFsaXphYmxlIGludG8gSlNPTiAodGhpcyBtZWFucyBpdCBtdXN0XG4gKiBvbmx5IGNvbnNpc3Qgb2YgcHJpbWl0aXZlIHR5cGVzIFtvYmplY3RzLCBhcnJheXMsIG51bWJlcnMsXG4gKiBib29sZWFucywgc3RyaW5nc10sIGFuZCBpdCBtdXN0IG5vdCBjb250YWluIGNpcmN1bGFyIHNlcmllcyBvZlxuICogcmVmZXJlbmNlcykuIFRoZSBkYXRhIGluIHRoZSBzYW5kYm94IGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlXG4gKiBVSSwgYWx0aG91Z2ggeW91IGFyZSBmcmVlIHRvIHVzZSBpdCB0byBjcmVhdGUgc3VpdGFibGUgb3V0cHV0XG4gKiBmb3IgdGhlIHBsYXllci4uXG4gKi9cbnZhciBDaGFyYWN0ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5xdWFsaXRpZXMgPSB7fTtcbiAgdGhpcy5zYW5kYm94ID0ge307XG59O1xuXG4vKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgY29udGVudCBmb3IgdGhlIGdhbWUuIEJ5IGRlZmF1bHRcbiAqIHRoaXMgaG9sZHMgbm90aGluZy4gSXQgaXMgdGhpcyBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHBvcHVsYXRlZFxuICogaW4gdGhlIGAuZ2FtZS5qc2AgZmlsZS4gRWFjaCBlbGVtZW50IGluIHRoZSBzdHJ1Y3R1cmUgaXNcbiAqIGNvbW1lbnRlZCwgYmVsb3cuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgc3RhdGljIGRhdGEgdGhhdCBuZXZlciBjaGFuZ2VzIHRocm91Z2ggdGhlXG4gKiBjb3Vyc2Ugb2YgdGhlIGdhbWUuIEl0IGlzIG5ldmVyIHNhdmVkLCBzbyBhbnl0aGluZyB0aGF0IG1pZ2h0XG4gKiBjaGFuZ2Ugc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2hhcmFjdGVyLlxuICovXG52YXIgZ2FtZSA9IHtcblxuICAvLyBTaXR1YXRpb25zXG5cbiAgLyogQW4gb2JqZWN0IG1hcHBpbmcgZnJvbSB0aGUgdW5pcXVlIGlkIG9mIGVhY2ggc2l0dWF0aW9uLCB0b1xuICAgKiB0aGUgc2l0dWF0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXMgaXMgdGhlIGhlYXJ0IG9mIHRoZSBnYW1lXG4gICAqIHNwZWNpZmljYXRpb24uICovXG4gIHNpdHVhdGlvbnM6IHt9LFxuXG4gIC8qIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHNpdHVhdGlvbiB0byBlbnRlciBhdCB0aGUgc3RhcnQgb2YgYVxuICAgKiBuZXcgZ2FtZS4gKi9cbiAgc3RhcnQ6IFwic3RhcnRcIixcblxuICAvLyBRdWFsaXR5IGRpc3BsYXkgZGVmaW5pdGlvbnNcblxuICAvKiBBbiBvYmplY3QgbWFwcGluZyB0aGUgdW5pcXVlIGlkIG9mIGVhY2ggcXVhbGl0eSB0byBpdHNcbiAgICogUXVhbGl0eURlZmluaXRpb24uIFlvdSBkb24ndCBuZWVkIGRlZmluaXRpb25zIGZvciBldmVyeVxuICAgKiBxdWFsaXR5LCBidXQgb25seSBxdWFsaXRpZXMgaW4gdGhpcyBtYXBwaW5nIHdpbGwgYmVcbiAgICogZGlzcGxheWVkIGluIHRoZSBjaGFyYWN0ZXIgYm94IG9mIHRoZSBVSS4gKi9cbiAgcXVhbGl0aWVzOiB7fSxcblxuICAvKiBRdWFsaXRpZXMgY2FuIGhhdmUgYW4gb3B0aW9uYWwgZ3JvdXAgSWQuIFRoaXMgbWFwcyB0aG9zZVxuICAgKiBJZHMgdG8gdGhlIGdyb3VwIGRlZmluaXRpb25zIHRoYXQgc2F5cyBob3cgdG8gZm9ybWF0IGl0c1xuICAgKiBxdWFsaXRpZXMuXG4gICAqL1xuICBxdWFsaXR5R3JvdXBzOiB7fSxcblxuICAvLyBIb29rc1xuXG4gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZ2FtZS4gSXQgaXNcbiAgICogbm9ybWFsbHkgb3ZlcnJpZGRlbiB0byBwcm92aWRlIGluaXRpYWwgY2hhcmFjdGVyIGNyZWF0aW9uXG4gICAqIChzZXR0aW5nIGluaXRpYWwgcXVhbGl0eSB2YWx1ZXMsIHNldHRpbmcgdGhlXG4gICAqIGNoYXJhY3Rlci10ZXh0LiBUaGlzIGlzIG9wdGlvbmFsLCBob3dldmVyLCBhcyBzZXQtdXBcbiAgICogcHJvY2Vzc2luZyBjb3VsZCBhbHNvIGJlIGRvbmUgYnkgdGhlIGZpcnN0IHNpdHVhdGlvbidzXG4gICAqIGVudGVyIGZ1bmN0aW9uLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGdpdmVuIGl0IHNob3VsZCBoYXZlXG4gICAqIHRoZSBzaWduYXR1cmUgZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0pLlxuICAgKi9cbiAgaW5pdDogbnVsbCxcblxuICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgZW50ZXJpbmcgYW55IG5ld1xuICAgKiBzaXR1YXRpb24uIEl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgc2l0dWF0aW9uXG4gICAqIGhhcyBpdHMgYGVudGVyYCBtZXRob2QgY2FsbGVkLiBJdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnRcbiAgICogdGltZWQgdHJpZ2dlcnMsIGJ1dCBpcyB0b3RhbGx5IG9wdGlvbmFsLiBJZiB0aGlzIGZ1bmN0aW9uXG4gICAqIGlzIGdpdmVuIGl0IHNob3VsZCBoYXZlIHRoZSBzaWduYXR1cmU6XG4gICAqXG4gICAqIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICAgKi9cbiAgZW50ZXI6IG51bGwsXG5cbiAgLyogSG9vayBmb3Igd2hlbiB0aGUgc2l0dWF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY2FycmllZCBvdXRcbiAgICogYW5kIHByaW50ZWQuIFRoZSBzaWduYXR1cmUgaXM6XG4gICAqXG4gICAqIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICAgKi9cbiAgYWZ0ZXJFbnRlcjogbnVsbCxcblxuICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgY2Fycnlpbmcgb3V0IGFueSBhY3Rpb24gaW5cbiAgICogYW55IHNpdHVhdGlvbi4gSXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBzaXR1YXRpb24gaGFzIGl0cyBgYWN0YCBtZXRob2QgY2FsbGVkLiBJZiB0aGlzIG9wdGlvbmFsXG4gICAqIGZ1bmN0aW9uIGlzIGdpdmVuIGl0IHNob3VsZCBoYXZlIHRoZSBzaWduYXR1cmU6XG4gICAqXG4gICAqIGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb25JZCwgYWN0aW9uSWQpO1xuICAgKlxuICAgKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGVuIGl0IGlzIGluZGljYXRpbmcgdGhhdCBpdFxuICAgKiBoYXMgY29uc3VtZWQgdGhlIGFjdGlvbiwgYW5kIHRoZSBhY3Rpb24gd2lsbCBub3QgYmUgcGFzc2VkXG4gICAqIG9uIHRvIHRoZSBzaXR1YXRpb24uIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IG9uZSBvZlxuICAgKiB0aGVzZSBnbG9iYWwgaGFuZGxlcnMgdGhhdCBjYW4gY29uc3VtZSB0aGUgZXZlbnQuXG4gICAqL1xuICBiZWZvcmVBY3Rpb246IG51bGwsXG5cbiAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgY2Fycnlpbmcgb3V0IGFueSBhY3Rpb24gaW5cbiAgICogYW55IHNpdHVhdGlvbi4gSXQgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nXG4gICAqIHNpdHVhdGlvbiBoYXMgaXRzIGBhY3RgIG1ldGhvZCBjYWxsZWQuIElmIHRoaXMgb3B0aW9uYWxcbiAgICogZnVuY3Rpb24gaXMgZ2l2ZW4gaXQgc2hvdWxkIGhhdmUgdGhlIHNpZ25hdHVyZTpcbiAgICpcbiAgICogZnVuY3Rpb24oY2hhcmFjdGVyLCBzeXN0ZW0sIHNpdHVhdGlvbklkLCBhY3Rpb25JZCk7XG4gICAqL1xuICBhZnRlckFjdGlvbjogbnVsbCxcblxuICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBsZWF2aW5nIGFueSBzaXR1YXRpb24uIEl0IGlzXG4gICAqIGNhbGxlZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBzaXR1YXRpb24gaGFzIGl0cyBgZXhpdGBcbiAgICogbWV0aG9kIGNhbGxlZC4gSWYgdGhpcyBvcHRpb25hbCBmdW5jdGlvbiBpcyBnaXZlbiBpdCBzaG91bGRcbiAgICogaGF2ZSB0aGUgc2lnbmF0dXJlOlxuICAgKlxuICAgKiBmdW5jdGlvbihjaGFyYWN0ZXIsIHN5c3RlbSwgb2xkU2l0dWF0aW9uSWQsIG5ld1NpdHVhdGlvbklkKTtcbiAgICovXG4gIGV4aXQ6IG51bGxcbn07XG4iLCIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb2RlIGJlbG93IGRvZXNuJ3QgZm9ybSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGZvciBVTkRVTSwgc29cbi8vIHlvdSBzaG91bGRuJ3QgZmluZCB5b3UgbmVlZCB0byB1c2UgaXQuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnRlcm5hbCBEYXRhXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiBUaGUgZ2xvYmFsIHN5c3RlbSBvYmplY3QuICovXG52YXIgc3lzdGVtID0gbmV3IFN5c3RlbSgpO1xuXG4vKiBUaGlzIGlzIHRoZSBkYXRhIG9uIHRoZSBwbGF5ZXIncyBwcm9ncmVzcyB0aGF0IGdldHMgc2F2ZWQuICovXG52YXIgcHJvZ3Jlc3MgPSB7XG4gIC8vIEEgcmFuZG9tIHNlZWQgc3RyaW5nLCB1c2VkIGludGVybmFsbHkgdG8gbWFrZSByYW5kb21cbiAgLy8gc2VxdWVuY2VzIHByZWRpY3RhYmxlLlxuc2VlZDogbnVsbCxcbiAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBsaW5rcyBjbGlja2VkLCBhbmQgd2hlbi5cbiAgICAgIHNlcXVlbmNlOiBbXSxcbiAgICAgIC8vIFRoZSB0aW1lIHdoZW4gdGhlIHByb2dyZXNzIHdhcyBzYXZlZC5cbiAgICAgIHNhdmVUaW1lOiBudWxsXG59O1xuXG4vKiBUaGUgSWQgb2YgdGhlIGN1cnJlbnQgc2l0dWF0aW9uIHRoZSBwbGF5ZXIgaXMgaW4uICovXG52YXIgY3VycmVudCA9IG51bGw7XG5cbi8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLiBJdCBzaG91bGQgYmUgcmVjb25zdHJ1Y3RhYmxlXG4gKiBmcm9tIHRoZSBhYm92ZSBwcm9ncmVzcyBkYXRhLiAqL1xudmFyIGNoYXJhY3RlciA9IG51bGw7XG5cbi8qIFRyYWNrcyB3aGV0aGVyIHdlJ3JlIGluIGludGVyYWN0aXZlIG1vZGUgb3IgYmF0Y2ggbW9kZS4gKi9cbnZhciBpbnRlcmFjdGl2ZSA9IHRydWU7XG5cbi8qIFRoZSBzeXN0ZW0gdGltZSB3aGVuIHRoZSBnYW1lIHdhcyBpbml0aWFsaXplZC4gKi9cbnZhciBzdGFydFRpbWU7XG5cbi8qIFRoZSBzdGFjayBvZiBsaW5rcywgcmVzdWx0aW5nIGZyb20gdGhlIGxhc3QgYWN0aW9uLCBzdGlsbCBiZSB0b1xuICogcmVzb2x2ZWQuICovXG52YXIgbGlua1N0YWNrID0gbnVsbDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFV0aWxpdHkgRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZ2V0Q3VycmVudFNpdHVhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoY3VycmVudCkge1xuICAgIHJldHVybiBnYW1lLnNpdHVhdGlvbnNbY3VycmVudF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbnZhciBwYXJzZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cik7XG4gIH1cbn07XG5cbnZhciBwYXJzZUxpc3QgPSBmdW5jdGlvbihzdHIsIGNhbkJlVW5kZWZpbmVkKSB7XG4gIGlmIChzdHIgPT09IHVuZGVmaW5lZCB8fCBzdHIgPT09IG51bGwpIHtcbiAgICBpZiAoY2FuQmVVbmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5zcGxpdCgvWyAsXFx0XSsvKTtcbiAgfVxufTtcblxudmFyIHBhcnNlRm4gPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZnN0ciA9IFwiKGZ1bmN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBzaXR1YXRpb24pIHtcXG5cIiArXG4gICAgICBzdHIgKyBcIlxcbn0pXCI7XG4gICAgdmFyIGZuID0gZXZhbChmc3RyKTtcbiAgICByZXR1cm4gZm47XG4gIH1cbn07XG5cbnZhciBsb2FkSFRNTFNpdHVhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyICRodG1sU2l0dWF0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJkaXYuc2l0dWF0aW9uXCIpO1xuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCRodG1sU2l0dWF0aW9ucywgZnVuY3Rpb24oJHNpdHVhdGlvbil7XG4gICAgdmFyIGlkID0gJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICBhc3NlcnQoZ2FtZS5zaXR1YXRpb25zW2lkXSA9PT0gdW5kZWZpbmVkLCBcImV4aXN0aW5nX3NpdHVhdGlvblwiLmwoe2lkOmlkfSkpO1xuXG4gICAgdmFyIGNvbnRlbnQgPSAkc2l0dWF0aW9uLmlubmVySFRNTDtcbiAgICB2YXIgb3B0cyA9IHtcbiAgICAgIC8vIFNpdHVhdGlvbiBjb250ZW50XG4gICAgICBvcHRpb25UZXh0OiAkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImRhdGEtb3B0aW9uLXRleHRcIiksXG4gICAgICBjYW5WaWV3OiBwYXJzZUZuKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1jYW4tdmlld1wiKSksXG4gICAgICBjYW5DaG9vc2U6IHBhcnNlRm4oJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNhbi1jaG9vc2VcIikpLFxuICAgICAgcHJpb3JpdHk6IHBhcnNlKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmlvcml0eVwiKSksXG4gICAgICBmcmVxdWVuY3k6IHBhcnNlKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1mcmVxdWVuY3lcIikpLFxuICAgICAgZGlzcGxheU9yZGVyOiBwYXJzZSgkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImRhdGEtZGlzcGxheS1vcmRlclwiKSksXG4gICAgICB0YWdzOiBwYXJzZUxpc3QoJHNpdHVhdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRhZ3NcIiksIGZhbHNlKSxcbiAgICAgIC8vIFNpbXBsZSBTaXR1YXRpb24gY29udGVudC5cbiAgICAgIGhlYWRpbmc6ICRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1oZWFkaW5nXCIpLFxuICAgICAgY2hvaWNlczogcGFyc2VMaXN0KCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1jaG9pY2VzXCIpLCB0cnVlKSxcbiAgICAgIG1pbkNob2ljZXM6IHBhcnNlKCRzaXR1YXRpb24uZ2V0QXR0cmlidXRlKFwiZGF0YS1taW4tY2hvaWNlc1wiKSksXG4gICAgICBtYXhDaG9pY2VzOiBwYXJzZSgkc2l0dWF0aW9uLmdldEF0dHJpYnV0ZShcImRhdGEtbWF4LWNob2ljZXNcIikpXG4gICAgfTtcblxuICAgIGdhbWUuc2l0dWF0aW9uc1tpZF0gPSBuZXcgU2ltcGxlU2l0dWF0aW9uKGNvbnRlbnQsIG9wdHMpO1xuICB9KTtcbn07XG5cblxuLyogT3V0cHV0cyByZWd1bGFyIGNvbnRlbnQgdG8gdGhlIHBhZ2UuIFVzZWQgYnkgd3JpdGUgYW5kXG4gKiB3cml0ZUJlZm9yZSwgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBjb250cm9sIHdoYXQgalF1ZXJ5IG1ldGhvZHNcbiAqIGFyZSB1c2VkIHRvIGFkZCB0aGUgY29udGVudC5cbiAqL1xuLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBjYW4gYXBwZW5kIHRleHQsIHByZXBlbmQgdGV4dCBvciByZXBsYWNlIHRleHQgaW4gc2VsZWN0b3Igd2l0aCB0aGUgc3VwcGxpZWQgb25lLlxudmFyIGRvV3JpdGUgPSBmdW5jdGlvbihjb250ZW50LCBzZWxlY3Rvcikge1xuICBjb250aW51ZU91dHB1dFRyYW5zYWN0aW9uKCk7XG4gIHZhciBvdXRwdXQgPSBhdWdtZW50TGlua3MoY29udGVudCk7XG4gIHZhciBlbGVtZW50O1xuICBpZiAoc2VsZWN0b3IpIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICAvLyBUT0RPOiBzY3JvbGwgdG8gdGhlIGxhc3QgcG9zaXRpb25cbiAgICBkaW1lbnNpb25zID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zb2xlLmxvZyhkaW1lbnNpb25zKTtcbiAgICB3aW5kb3cuc2Nyb2xsKDAsMTUwKTtcbiAgICAvLyBUT0RPOiBzY3JvbGxTdGFja1tzY3JvbGxTdGFjay5sZW5ndGgtMV0gPSBzY3JvbGxQb2ludDsqL1xuICB9XG4gIGlmICghZWxlbWVudCkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50JykuaW5uZXJIVE1MID0gb3V0cHV0O1xuICB9XG4gIGVsc2Uge1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQob3V0cHV0KTtcbiAgfVxuICAvKiBXZSB3YW50IHRvIHNjcm9sbCB0aGlzIG5ldyBlbGVtZW50IHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi5cbiAgICogd2hpbGUgc3RpbGwgYmVpbmcgdmlzaWJsZS4gVGhlIGVhc2llc3Qgd2F5IGlzIHRvIGZpbmQgdGhlXG4gICAqIHRvcCBlZGdlIG9mIHRoZSAqZm9sbG93aW5nKiBlbGVtZW50IGFuZCBtb3ZlIHRoYXQgZXhhY3RseVxuICAgKiB0byB0aGUgYm90dG9tICh3aGlsZSBzdGlsbCBlbnN1cmluZyB0aGF0IHRoaXMgZWxlbWVudCBpcyBmdWxseVxuICAgKiB2aXNpYmxlLikgKi9cbiAgLyp2YXIgbmV4dGVsID0gb3V0cHV0Lmxhc3QoKS5uZXh0KCk7XG4gICAgdmFyIHNjcm9sbFBvaW50O1xuICAgIGlmICghbmV4dGVsLmxlbmd0aCkge1xuICAgIHNjcm9sbFBvaW50ID0gJChcIiNjb250ZW50XCIpLmhlaWdodCgpICsgJChcIiN0aXRsZVwiKS5oZWlnaHQoKSArIDYwO1xuICAgIH0gZWxzZSB7XG4gICAgc2Nyb2xsUG9pbnQgPSBuZXh0ZWwub2Zmc2V0KCkudG9wIC0gJCh3aW5kb3cpLmhlaWdodCgpO1xuICAgIH1cbiAgICBpZiAoc2Nyb2xsUG9pbnQgPiBvdXRwdXQub2Zmc2V0KCkudG9wKVxuICAgIHNjcm9sbFBvaW50ID0gb3V0cHV0Lm9mZnNldCgpLnRvcDtcbiAgICBzY3JvbGxTdGFja1tzY3JvbGxTdGFjay5sZW5ndGgtMV0gPSBzY3JvbGxQb2ludDsqL1xufTtcblxuLyogR2V0cyB0aGUgdW5pcXVlIGlkIHVzZWQgdG8gaWRlbnRpZnkgc2F2ZWQgZ2FtZXMuICovXG52YXIgZ2V0U2F2ZUlkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAndW5kdW1fJytnYW1lLmlkK1wiX1wiK2dhbWUudmVyc2lvbjtcbn07XG5cbi8qIEFkZHMgdGhlIHF1YWxpdHkgYmxvY2tzIHRvIHRoZSBjaGFyYWN0ZXIgdG9vbHMuICovXG52YXIgc2hvd1F1YWxpdGllcyA9IGZ1bmN0aW9uKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1YWxpdGllc1wiKS5pbm5lckhUTUwgPSAnJztcbiAgZm9yICh2YXIgcXVhbGl0eUlkIGluIGNoYXJhY3Rlci5xdWFsaXRpZXMpIHtcbiAgICBhZGRRdWFsaXR5QmxvY2socXVhbGl0eUlkKTtcbiAgfVxufTtcblxuLyogRmFkZXMgaW4gYW5kIG91dCBhIGhpZ2hsaWdodCBvbiB0aGUgZ2l2ZW4gZWxlbWVudC4gKi9cbnZhciBzaG93SGlnaGxpZ2h0ID0gZnVuY3Rpb24oZG9tRWxlbWVudCkge1xuICB2YXIgaGlnaGxpZ2h0ID0gZG9tRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmhpZ2hsaWdodFwiKTtcbiAgaWYgKGhpZ2hsaWdodC5sZW5ndGggPD0gMCkge1xuICAgIGhpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8ZGl2PjwvZGl2PlwiKS5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQnKTtcbiAgICBkb21FbGVtZW50LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XG4gIH1cbiAgc2hvd0Jsb2NrKGhpZ2hsaWdodCk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgaGlkZUJsb2NrKGhpZ2hsaWdodCk7XG4gIH0sIDIwMDApO1xufTtcblxuLyogRmluZHMgdGhlIGNvcnJlY3QgbG9jYXRpb24gYW5kIGluc2VydHMgYSBwYXJ0aWN1bGFyIERPTSBlbGVtZW50XG4gKiBmaXRzIGludG8gYW4gZXhpc3RpbmcgbGlzdCBvZiBET00gZWxlbWVudHMuIFRoaXMgaXMgZG9uZSBieVxuICogcHJpb3JpdHkgb3JkZXIsIHNvIGFsbCBlbGVtZW50cyAoZXhpc3RpbmcgYW5kIG5ldykgbXVzdCBoYXZlXG4gKiB0aGVpciBkYXRhLXByaW9yaXR5IGF0dHJpYnV0ZSBzZXQuICovXG52YXIgaW5zZXJ0QXRDb3JyZWN0UG9zaXRpb24gPSBmdW5jdGlvbihwYXJlbnQsIG5ld0l0ZW0pIHtcbiAgdmFyIG5ld1ByaW9yaXR5ID0gbmV3SXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJpb3JpdHknKTtcbiAgdmFyIF9jaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbjtcbiAgaWYgKF9jaGlsZHJlbiAhPSB1bmRlZmluZWQpXG4gIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gX2NoaWxkcmVuW2ldO1xuICAgICAgaWYgKG5ld1ByaW9yaXR5IDwgY2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLXByaW9yaXR5JykpIHtcbiAgICAgICAgY2hpbGQuYmVmb3JlKG5ld0l0ZW0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHBhcmVudC5hcHBlbmRDaGlsZChuZXdJdGVtKTtcbiAgfVxufTtcblxuLyogQWRkcyBhIG5ldyBncm91cCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiB0aGUgcXVhbGl0eSBsaXN0LiAqL1xudmFyIGFkZEdyb3VwQmxvY2sgPSBmdW5jdGlvbihncm91cElkKSB7XG4gIHZhciBncm91cERlZmluaXRpb24gPSBnYW1lLnF1YWxpdHlHcm91cHNbZ3JvdXBJZF07XG5cbiAgLy8gQnVpbGQgdGhlIGdyb3VwIGRpdiB3aXRoIGFwcHJvcHJpYXRlIGhlYWRpbmcuXG4gIHZhciBncm91cEJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWFsaXR5X2dyb3VwXCIpLmNsb25lTm9kZSh0cnVlKTtcbiAgZ3JvdXBCbG9jay5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcImdfXCIrZ3JvdXBJZCk7XG4gIGdyb3VwQmxvY2suc2V0QXR0cmlidXRlKFwiZGF0YS1wcmlvcml0eVwiLCBncm91cERlZmluaXRpb24ucHJpb3JpdHkpO1xuXG4gIHZhciB0aXRsZUVsZW1lbnQgPSBncm91cEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1hdHRyPSd0aXRsZSddXCIpO1xuICBpZiAoZ3JvdXBEZWZpbml0aW9uLnRpdGxlKSB7XG4gICAgdGl0bGVFbGVtZW50LmlubmVySFRNTCA9IGdyb3VwRGVmaW5pdGlvbi50aXRsZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodGl0bGVFbGVtZW50LnBhcmVudE5vZGUgIT0gdW5kZWZpbmVkKVxuICAgIHtcbiAgICAgIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRpdGxlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGdyb3VwRGVmaW5pdGlvbi5leHRyYUNsYXNzZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwRGVmaW5pdGlvbi5leHRyYUNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGdyb3VwQmxvY2suYWRkQ2xhc3MoZ3JvdXBEZWZpbml0aW9uLmV4dHJhQ2xhc3Nlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgY29ycmVjdCBwbGFjZS5cbiAgdmFyIHF1YWxpdGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVhbGl0aWVzXCIpO1xuICBpbnNlcnRBdENvcnJlY3RQb3NpdGlvbihxdWFsaXRpZXMsIGdyb3VwQmxvY2spO1xuICByZXR1cm4gZ3JvdXBCbG9jaztcbn07XG5cbi8qIEFkZHMgYSBuZXcgcXVhbGl0eSB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiB0aGUgcXVhbGl0eSBsaXN0LiAqL1xudmFyIGFkZFF1YWxpdHlCbG9jayA9IGZ1bmN0aW9uKHF1YWxpdHlJZCkge1xuICAvLyBNYWtlIHN1cmUgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgcXVhbGl0eS5cbiAgdmFyIHF1YWxpdHlEZWZpbml0aW9uID0gZ2FtZS5xdWFsaXRpZXNbcXVhbGl0eUlkXTtcbiAgaWYgKCFxdWFsaXR5RGVmaW5pdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGRpc3BsYXkgYSBxdWFsaXR5IHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZDogXCIrXG4gICAgICAgIHF1YWxpdHlJZCk7XG4gIH1cblxuICAvLyBXb3JrIG91dCBob3cgdGhlIHZhbHVlIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gIHZhciBuYW1lID0gcXVhbGl0eURlZmluaXRpb24udGl0bGU7XG4gIHZhciB2YWwgPSBxdWFsaXR5RGVmaW5pdGlvbi5mb3JtYXQoXG4gICAgICBjaGFyYWN0ZXIsIGNoYXJhY3Rlci5xdWFsaXRpZXNbcXVhbGl0eUlkXVxuICAgICAgKTtcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgLy8gQ3JlYXRlIHRoZSBxdWFsaXR5IG91dHB1dC5cbiAgdmFyIHF1YWxpdHlCbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVhbGl0eVwiKS5jbG9uZU5vZGUodHJ1ZSk7XG4gIHF1YWxpdHlCbG9jay5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInFfXCIrcXVhbGl0eUlkKTtcbiAgcXVhbGl0eUJsb2NrLnNldEF0dHJpYnV0ZShcImRhdGEtcHJpb3JpdHlcIiwgcXVhbGl0eURlZmluaXRpb24ucHJpb3JpdHkpO1xuICBxdWFsaXR5QmxvY2sucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWF0dHI9J25hbWUnXVwiKS5pbm5lckhUTUwgPSBuYW1lO1xuICBxdWFsaXR5QmxvY2sucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWF0dHI9J3ZhbHVlJ11cIikuaW5uZXJIVE1MID0gdmFsO1xuICBpZiAocXVhbGl0eURlZmluaXRpb24uZXh0cmFDbGFzc2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWFsaXR5RGVmaW5pdGlvbi5leHRyYUNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1YWxpdHlCbG9jay5jbGFzc05hbWUuYWRkKHF1YWxpdHlEZWZpbml0aW9uLmV4dHJhQ2xhc3Nlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBvciBjcmVhdGUgdGhlIGdyb3VwIGJsb2NrLlxuICB2YXIgZ3JvdXBCbG9jaztcbiAgdmFyIGdyb3VwSWQgPSBxdWFsaXR5RGVmaW5pdGlvbi5ncm91cDtcbiAgaWYgKGdyb3VwSWQpIHtcbiAgICB2YXIgZ3JvdXAgPSBnYW1lLnF1YWxpdHlHcm91cHNbZ3JvdXBJZF07XG4gICAgYXNzZXJ0KGdyb3VwLCBcIm5vX2dyb3VwX2RlZmluaXRpb25cIi5sKHtpZDogZ3JvdXBJZH0pKTtcbiAgICBncm91cEJsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnX1wiK2dyb3VwSWQpO1xuICAgIGlmIChncm91cEJsb2NrID09IG51bGwgfHwgZ3JvdXBCbG9jay5sZW5ndGggPD0gMCkge1xuICAgICAgZ3JvdXBCbG9jayA9IGFkZEdyb3VwQmxvY2soZ3JvdXBJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gaXQgY29ycmVjdGx5LlxuICB2YXIgZ3JvdXBRdWFsaXR5TGlzdCA9IGdyb3VwQmxvY2sucXVlcnlTZWxlY3RvckFsbChcIi5xdWFsaXRpZXNfaW5fZ3JvdXBcIik7XG4gIGluc2VydEF0Q29ycmVjdFBvc2l0aW9uKGdyb3VwUXVhbGl0eUxpc3QsIHF1YWxpdHlCbG9jayk7XG4gIHJldHVybiBxdWFsaXR5QmxvY2s7XG59O1xuXG4vKiBPdXRwdXQgZXZlbnRzIGFyZSB0cmFja2VkLCBzbyB3ZSBjYW4gbWFrZSBzdXJlIHdlIHNjcm9sbFxuICogY29ycmVjdGx5LiBXZSBkbyB0aGlzIGluIGEgc3RhY2sgYmVjYXVzZSBvbmUgY2xpY2sgbWlnaHQgY2F1c2VcbiAqIGEgY2hhaW4gcmVhY3Rpb24uIE9mIG91dHB1dCBldmVudHMsIG9ubHkgd2hlbiB3ZSByZXR1cm4gdG8gdGhlXG4gKiB0b3AgbGV2ZWwgd2lsbCB3ZSBkbyB0aGUgc2Nyb2xsLlxuICpcbiAqIEhvd2V2ZXIsIHRoYXQgbGVhdmVzIHRoZSBxdWVzdGlvbiBvZiB3aGVyZSB0byBzY3JvbGwgKnRvKi5cbiAqIChSZW1lbWJlciB0aGF0IGVsZW1lbnRzIGNvdWxkIGJlIGluc2VydGVkIGFueXdoZXJlIGluIHRoZVxuICogZG9jdW1lbnQuKSBXaGVuZXZlciB3ZSBkbyBhIHdyaXRlKCksIHdlJ2xsIGhhdmUgdG8gdXBkYXRlIHRoZVxuICogdG9wIChsYXN0KSBzdGFjayBlbGVtZW50IHRvIHRoYXQgcG9zaXRpb24uXG4gKi9cbnZhciBzY3JvbGxTdGFjayA9IFtdO1xudmFyIHBlbmRpbmdGaXJzdFdyaXRlID0gZmFsc2U7XG52YXIgc3RhcnRPdXRwdXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoc2Nyb2xsU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgcGVuZGluZ0ZpcnN0V3JpdGUgPSB0cnVlO1xuICB9XG4gIC8vIFRoZSBkZWZhdWx0IGlzIFwiYWxsIHRoZSB3YXkgZG93blwiLlxuICBzY3JvbGxTdGFjay5wdXNoKFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGVudFwiKS5vZmZzZXRIZWlnaHQgKyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpdGxlXCIpLm9mZnNldEhlaWdodCArIDYwXG4gICk7XG59O1xudmFyIGNvbnRpbnVlT3V0cHV0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHBlbmRpbmdGaXJzdFdyaXRlKSB7XG4gICAgcGVuZGluZ0ZpcnN0V3JpdGUgPSBmYWxzZTtcbiAgICB2YXIgc2VwYXJhdG9yID0gJChcIiN1aV9saWJyYXJ5ICN0dXJuX3NlcGFyYXRvclwiKS5jbG9uZSgpO1xuICAgIHNlcGFyYXRvci5yZW1vdmVBdHRyKFwiaWRcIik7XG4gICAgJChcIiNjb250ZW50XCIpLmFwcGVuZChzZXBhcmF0b3IpO1xuICB9XG59O1xudmFyIGVuZE91dHB1dFRyYW5zYWN0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzY3JvbGxQb2ludCA9IHNjcm9sbFN0YWNrLnBvcCgpO1xuICBpZiAoc2Nyb2xsU3RhY2subGVuZ3RoID09PSAwICYmIHNjcm9sbFBvaW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGludGVyYWN0aXZlKSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsKDAsc2Nyb2xsUG9pbnQpO1xuICAgIH1cbiAgICBzY3JvbGxQb2ludCA9IG51bGw7XG4gIH1cbn07XG5cbi8qIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGxpbmsgbmVlZHMgdG8gYmUgZm9sbG93ZWQsIHJlZ2FyZGxlc3NcbiAqIG9mIHdoZXRoZXIgaXQgd2FzIHVzZXIgYWN0aW9uIHRoYXQgaW5pdGlhdGVkIGl0LiAqL1xudmFyIGxpbmtSZSA9IC9eKFthLXowLTlfLV0rfFxcLikoXFwvKFswLTlhLXpfLV0rKSk/JC87XG52YXIgcHJvY2Vzc0xpbmsgPSBmdW5jdGlvbihjb2RlKSB7XG4gIC8vIENoZWNrIGlmIHdlIHNob3VsZCBkbyB0aGlzIG5vdywgb3IgaWYgcHJvY2Vzc2luZyBpcyBhbHJlYWR5XG4gIC8vIHVuZGVyd2F5LlxuICBpZiAobGlua1N0YWNrICE9PSBudWxsKSB7XG4gICAgbGlua1N0YWNrLnB1c2goY29kZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHJhY2sgd2hlcmUgd2UncmUgYWJvdXQgdG8gYWRkIG5ldyBjb250ZW50LlxuICBzdGFydE91dHB1dFRyYW5zYWN0aW9uKCk7XG5cbiAgLy8gV2UncmUgcHJvY2Vzc2luZywgc28gbWFrZSB0aGUgc3RhY2sgYXZhaWxhYmxlLlxuICBsaW5rU3RhY2sgPSBbXTtcblxuICAvLyBIYW5kbGUgZWFjaCBsaW5rIGluIHR1cm4uXG4gIHByb2Nlc3NPbmVMaW5rKGNvZGUpO1xuICB3aGlsZSAobGlua1N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb2RlID0gbGlua1N0YWNrLnNoaWZ0KCk7XG4gICAgcHJvY2Vzc09uZUxpbmsoY29kZSk7XG4gIH1cblxuICAvLyBXZSdyZSBkb25lLCBzbyByZW1vdmUgdGhlIHN0YWNrIHRvIHByZXZlbnQgZnV0dXJlIHB1c2hlcy5cbiAgbGlua1N0YWNrID0gbnVsbDtcblxuICAvLyBTY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgbmV3IGNvbnRlbnQuXG4gIGVuZE91dHB1dFRyYW5zYWN0aW9uKCk7XG5cbiAgLy8gV2UncmUgYWJsZSB0byBzYXZlLCBpZiB3ZSB3ZXJlbid0IGFscmVhZHkuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZVwiKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgZmFsc2UpO1xufTtcblxuLyogVGhpcyBnZXRzIGNhbGxlZCB0byBhY3R1YWxseSBkbyB0aGUgd29yayBvZiBwcm9jZXNzaW5nIGEgY29kZS5cbiAqIFdoZW4gb25lIGRvTGluayBpcyBjYWxsZWQgKG9yIGEgbGluayBpcyBjbGlja2VkKSwgdGhpcyBtYXkgc2V0IGNhbGxcbiAqIGNvZGUgdGhhdCBmdXJ0aGVyIGNhbGxzIGRvTGluaywgYW5kIHNvIG9uLiBUaGlzIG1ldGhvZCBwcm9jZXNzZXNcbiAqIGVhY2ggb25lLCBhbmQgcHJvY2Vzc0xpbmsgbWFuYWdlcyB0aGlzLlxuICovXG52YXIgcHJvY2Vzc09uZUxpbmsgPSBmdW5jdGlvbihjb2RlKSB7XG4gIHZhciBtYXRjaCA9IGNvZGUubWF0Y2gobGlua1JlKTtcbiAgYXNzZXJ0KG1hdGNoLCBcImxpbmtfbm90X3ZhbGlkXCIubCh7bGluazpjb2RlfSkpO1xuXG4gIHZhciBzaXR1YXRpb24gPSBtYXRjaFsxXTtcbiAgdmFyIGFjdGlvbiA9IG1hdGNoWzNdO1xuXG4gIC8vIENoYW5nZSB0aGUgc2l0dWF0aW9uXG4gIGlmIChzaXR1YXRpb24gIT09ICcuJykge1xuICAgIGlmIChzaXR1YXRpb24gIT09IGN1cnJlbnQpIHtcbiAgICAgIGRvVHJhbnNpdGlvblRvKHNpdHVhdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdlIHNob3VsZCBoYXZlIGFuIGFjdGlvbiBpZiB3ZSBoYXZlIG5vIHNpdHVhdGlvbiBjaGFuZ2UuXG4gICAgYXNzZXJ0KGFjdGlvbiwgXCJsaW5rX25vX2FjdGlvblwiLmwoKSk7XG4gIH1cblxuICAvLyBDYXJyeSBvdXQgdGhlIGFjdGlvblxuICBpZiAoYWN0aW9uKSB7XG4gICAgc2l0dWF0aW9uID0gZ2V0Q3VycmVudFNpdHVhdGlvbigpO1xuICAgIGlmIChzaXR1YXRpb24pIHtcbiAgICAgIGlmIChnYW1lLmJlZm9yZUFjdGlvbikge1xuICAgICAgICAvLyBUcnkgdGhlIGdsb2JhbCBhY3QgaGFuZGxlciwgYW5kIHNlZSBpZiB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIG5vdGlmeSB0aGUgc2l0dWF0aW9uLlxuICAgICAgICB2YXIgY29uc3VtZWQgPSBnYW1lLmJlZm9yZUFjdGlvbihcbiAgICAgICAgICAgIGNoYXJhY3Rlciwgc3lzdGVtLCBjdXJyZW50LCBhY3Rpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIGlmIChjb25zdW1lZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHNpdHVhdGlvbi5hY3QoY2hhcmFjdGVyLCBzeXN0ZW0sIGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gZ2xvYmFsIGFjdCBoYW5kbGVyLCBhbHdheXMgbm90aWZ5XG4gICAgICAgIC8vIHRoZSBzaXR1YXRpb24uXG4gICAgICAgIHNpdHVhdGlvbi5hY3QoY2hhcmFjdGVyLCBzeXN0ZW0sIGFjdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZ2FtZS5hZnRlckFjdGlvbikge1xuICAgICAgICBnYW1lLmFmdGVyQWN0aW9uKGNoYXJhY3Rlciwgc3lzdGVtLCBjdXJyZW50LCBhY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyogVGhpcyBmdW5jdGlvbiBsaXN0ZW5zIG9uIGNvbnRlbnQgYmxvY2sgdG8gZmlsdGVyIG91dCBsaW5rIGNsaWNrcy4gKi9cbnZhciBsaW5rQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhJykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcHJvY2Vzc0NsaWNrKGV2ZW50LnRhcmdldC5ocmVmKTtcbiAgfVxufVxuXG4vKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgbGluayB0byBjYXJyeSBvdXQgYW5cbiAqIGFjdGlvbi4gKi9cbnZhciBwcm9jZXNzQ2xpY2sgPSBmdW5jdGlvbihjb2RlKSB7XG4gIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpICogMC4wMDE7XG4gIHN5c3RlbS50aW1lID0gbm93IC0gc3RhcnRUaW1lO1xuICBwcm9ncmVzcy5zZXF1ZW5jZS5wdXNoKHtsaW5rOmNvZGUsIHdoZW46c3lzdGVtLnRpbWV9KTtcbiAgcmV0dXJuIHByb2Nlc3NMaW5rKGNvZGUpO1xufTtcblxuLyogVHJhbnNpdGlvbnMgYmV0d2VlbiBzaXR1YXRpb25zLiAqL1xudmFyIGRvVHJhbnNpdGlvblRvID0gZnVuY3Rpb24obmV3U2l0dWF0aW9uSWQpIHtcbiAgdmFyIG9sZFNpdHVhdGlvbklkID0gY3VycmVudDtcbiAgdmFyIG9sZFNpdHVhdGlvbiA9IGdldEN1cnJlbnRTaXR1YXRpb24oKTtcbiAgdmFyIG5ld1NpdHVhdGlvbiA9IGdhbWUuc2l0dWF0aW9uc1tuZXdTaXR1YXRpb25JZF07XG5cbiAgYXNzZXJ0KG5ld1NpdHVhdGlvbiwgXCJ1bmtub3duX3NpdHVhdGlvblwiLmwoe2lkOm5ld1NpdHVhdGlvbklkfSkpO1xuXG4gIC8vIFdlIG1pZ2h0IG5vdCBoYXZlIGFuIG9sZCBzaXR1YXRpb24gaWYgdGhpcyBpcyB0aGUgc3RhcnQgb2ZcbiAgLy8gdGhlIGdhbWUuXG4gIGlmIChvbGRTaXR1YXRpb24pIHtcbiAgICAvLyBOb3RpZnkgdGhlIGV4aXRpbmcgc2l0dWF0aW9uLlxuICAgIG9sZFNpdHVhdGlvbi5leGl0KGNoYXJhY3Rlciwgc3lzdGVtLCBuZXdTaXR1YXRpb25JZCk7XG4gICAgaWYgKGdhbWUuZXhpdCkge1xuICAgICAgZ2FtZS5leGl0KGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vICBSZW1vdmUgbGlua3MgYW5kIHRyYW5zaWVudCBzZWN0aW9ucy5cbiAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIik7XG4gIGxpbmtzID0gY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsaW5rcywgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICB2YXIgYSA9IGVsZW1lbnQ7XG4gICAgaWYgKGEuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3knKSB8fCBhLmdldEF0dHJpYnV0ZShcImhyZWZcIikubWF0Y2goL1s/Jl1zdGlja3lbPSZdPy8pKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChhLmdldEF0dHJpYnV0ZShcImhyZWZcIikubWF0Y2goL1s/Jl10cmFuc2llbnRbPSZdPy8pKSB7XG4gICAgICBoaWRlQmxvY2soYSk7XG4gICAgfVxuICAgIGEuaW5uZXJIVE1MID0gXCI8c3BhbiBjbGFzcz0nZXhfbGluayc+XCIrYS5pbm5lckhUTUwrXCI8L3NwYW4+XCI7XG4gIH0pO1xuICBoaWRlQmxvY2soY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRyYW5zaWVudFwiKSk7XG4gIGhpZGVCbG9jayhjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ1bC5vcHRpb25zXCIpKTtcblxuICAvLyBNb3ZlIHRoZSBjaGFyYWN0ZXIuXG4gIGN1cnJlbnQgPSBuZXdTaXR1YXRpb25JZDtcblxuICAvLyBOb3RpZnkgdGhlIGluY29taW5nIHNpdHVhdGlvbi5cbiAgaWYgKGdhbWUuZW50ZXIpIHtcbiAgICBnYW1lLmVudGVyKGNoYXJhY3Rlciwgc3lzdGVtLCBvbGRTaXR1YXRpb25JZCwgbmV3U2l0dWF0aW9uSWQpO1xuICB9XG4gIG5ld1NpdHVhdGlvbi5lbnRlcihjaGFyYWN0ZXIsIHN5c3RlbSwgb2xkU2l0dWF0aW9uSWQpO1xuXG4gIC8vIGFkZGl0aW9uYWwgaG9vayBmb3Igd2hlbiB0aGUgc2l0dWF0aW9uIHRleHQgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkXG4gIGlmIChnYW1lLmFmdGVyRW50ZXIpIHtcbiAgICBnYW1lLmFmdGVyRW50ZXIoY2hhcmFjdGVyLCBzeXN0ZW0sIG9sZFNpdHVhdGlvbklkLCBuZXdTaXR1YXRpb25JZCk7XG4gIH1cbn07XG5cbi8qIFJldHVybnMgSFRNTCBmcm9tIHRoZSBnaXZlbiBjb250ZW50IHdpdGggdGhlIG5vbi1yYXcgbGlua3NcbiAqIHdpcmVkIHVwLiBcbiAqIEBwYXJhbSBjb250ZW50IHN0cmluZyBIVE1MIGNvZGUgXG4gKiBAcmV0dmFsIHN0cmluZyAqL1xudmFyIGF1Z21lbnRMaW5rcyA9IGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgLy8gV2lyZSB1cCB0aGUgbGlua3MgZm9yIHJlZ3VsYXIgPGE+IHRhZ3MuXG4gIG91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdXRwdXQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgdmFyIGxpbmtzID0gb3V0cHV0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpO1xuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGxpbmtzLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7XG4gICAgdmFyIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyYXdcIil8fCBocmVmLm1hdGNoKC9bPyZdcmF3Wz0mXT8vKSkge1xuICAgICAgaWYgKGhyZWYubWF0Y2gobGlua1JlKSkge1xuICAgICAgICBlbGVtZW50Lm9uY2xpY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhIG9uY2UtY2xpY2ssIHJlbW92ZSBhbGwgbWF0Y2hpbmcgbGlua3MuXG4gICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwib25jZVwiKSB8fCBocmVmLm1hdGNoKC9bPyZdb25jZVs9Jl0/LykpIHtcbiAgICAgICAgICAgIHN5c3RlbS5jbGVhckxpbmtzKGhyZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHByb2Nlc3NDbGljayhocmVmKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJyYXdcIik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb3V0cHV0LmlubmVySFRNTDtcbn07XG5cbi8qIEVyYXNlcyB0aGUgY2hhcmFjdGVyIGluIGxvY2FsIHN0b3JhZ2UuIFRoaXMgaXMgcGVybWFuZW50ISAqL1xudmFyIGRvRXJhc2UgPSBmdW5jdGlvbihmb3JjZSkge1xuICB2YXIgc2F2ZUlkID0gZ2V0U2F2ZUlkKCk7XG4gIGlmIChsb2NhbFN0b3JhZ2Vbc2F2ZUlkXSkge1xuICAgIGlmIChmb3JjZSB8fCBjb25maXJtKFwiZXJhc2VfbWVzc2FnZVwiLmwoKSkpIHtcbiAgICAgIGRlbGV0ZSBsb2NhbFN0b3JhZ2Vbc2F2ZUlkXTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXJhc2VcIikuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgc3RhcnRHYW1lKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBGaW5kIGFuZCByZXR1cm4gYSBsaXN0IG9mIGlkcyBmb3IgYWxsIHNpdHVhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gdGFnLiAqL1xudmFyIGdldFNpdHVhdGlvbklkc1dpdGhUYWcgPSBmdW5jdGlvbih0YWcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBzaXR1YXRpb25JZCBpbiBnYW1lLnNpdHVhdGlvbnMpIHtcbiAgICB2YXIgc2l0dWF0aW9uID0gZ2FtZS5zaXR1YXRpb25zW3NpdHVhdGlvbklkXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l0dWF0aW9uLnRhZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChzaXR1YXRpb24udGFnc1tpXSA9PSB0YWcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc2l0dWF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIFNldCB1cCB0aGUgc2NyZWVuIGZyb20gc2NyYXRjaCB0byByZWZsZWN0IHRoZSBjdXJyZW50IGdhbWVcbiAqIHN0YXRlLiAqL1xudmFyIGluaXRHYW1lRGlzcGxheSA9IGZ1bmN0aW9uKCkge1xuICAvLyBUcmFuc2l0aW9uIGludG8gdGhlIGZpcnN0IHNpdHVhdGlvbixcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50XCIpLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgdmFyIHNpdHVhdGlvbiA9IGdldEN1cnJlbnRTaXR1YXRpb24oKTtcbiAgYXNzZXJ0KHNpdHVhdGlvbiwgXCJub19jdXJyZW50X3NpdHVhdGlvblwiLmwoKSk7XG5cbiAgc2hvd1F1YWxpdGllcygpO1xufTtcblxuLyogQ2xlYXIgdGhlIGN1cnJlbnQgZ2FtZSBvdXRwdXQgYW5kIHN0YXJ0IGFnYWluLiAqL1xudmFyIHN0YXJ0R2FtZSA9IGZ1bmN0aW9uKCkge1xuICBwcm9ncmVzcy5zZWVkID0gbmV3IERhdGUoKS50b1N0cmluZygpO1xuXG4gIGNoYXJhY3RlciA9IG5ldyBDaGFyYWN0ZXIoKTtcbiAgc3lzdGVtLnJuZCA9IG5ldyBSYW5kb20ocHJvZ3Jlc3Muc2VlZCk7XG4gIHByb2dyZXNzLnNlcXVlbmNlID0gW3tsaW5rOmdhbWUuc3RhcnQsIHdoZW46MH1dO1xuXG4gIC8vIEVtcHR5IHRoZSBkaXNwbGF5XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGVudFwiKS5pbm5lckhUTUwgPSAnJztcblxuICAvLyBTdGFydCB0aGUgZ2FtZVxuICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAqIDAuMDAxO1xuICBzeXN0ZW0udGltZSA9IDA7XG4gIGlmIChnYW1lLmluaXQpIGdhbWUuaW5pdChjaGFyYWN0ZXIsIHN5c3RlbSk7XG4gIHNob3dRdWFsaXRpZXMoKTtcblxuICAvLyBEbyB0aGUgZmlyc3Qgc3RhdGUuXG4gIGRvVHJhbnNpdGlvblRvKGdhbWUuc3RhcnQpO1xufTtcblxuLyogU2F2ZXMgdGhlIGNoYXJhY3RlciB0byBsb2NhbCBzdG9yYWdlLiAqL1xudmFyIHNhdmVHYW1lID0gZnVuY3Rpb24oKSB7XG4gIC8vIFN0b3JlIHdoZW4gd2UncmUgc2F2aW5nIHRoZSBnYW1lLCB0byBhdm9pZCBleHBsb2l0cyB3aGVyZSBhXG4gIC8vIHBsYXllciBsb2FkcyB0aGVpciBmaWxlIHRvIGdhaW4gZXh0cmEgdGltZS5cbiAgdmFyIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKiAwLjAwMTtcbiAgcHJvZ3Jlc3Muc2F2ZVRpbWUgPSBub3cgLSBzdGFydFRpbWU7XG5cbiAgLy8gU2F2ZSB0aGUgZ2FtZS5cbiAgbG9jYWxTdG9yYWdlW2dldFNhdmVJZCgpXSA9IEpTT04uc3RyaW5naWZ5KHByb2dyZXNzKTtcblxuICAvLyBTd2l0Y2ggdGhlIGJ1dHRvbiBoaWdobGlnaHRzLlxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVyYXNlXCIpLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCBmYWxzZSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZVwiKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG59O1xuXG4vKiBMb2FkcyB0aGUgZ2FtZSBmcm9tIHRoZSBnaXZlbiBkYXRhICovXG52YXIgbG9hZEdhbWUgPSBmdW5jdGlvbihjaGFyYWN0ZXJEYXRhKSB7XG4gIHByb2dyZXNzID0gY2hhcmFjdGVyRGF0YTtcblxuICBjaGFyYWN0ZXIgPSBuZXcgQ2hhcmFjdGVyKCk7XG4gIHN5c3RlbS5ybmQgPSBuZXcgUmFuZG9tKHByb2dyZXNzLnNlZWQpO1xuXG4gIC8vIEVtcHR5IHRoZSBkaXNwbGF5XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGVudFwiKS5pbm5lckhUTUwgPSBcIlwiO1xuICBzaG93UXVhbGl0aWVzKCk7XG5cbiAgLy8gTm93IHBsYXkgdGhyb3VnaCB0aGUgYWN0aW9ucyBzbyBmYXI6XG4gIGlmIChnYW1lLmluaXQpIGdhbWUuaW5pdChjaGFyYWN0ZXIsIHN5c3RlbSk7XG5cbiAgLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBwbGF5ZXIncyBoaXN0b3J5LlxuICBpbnRlcmFjdGl2ZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2dyZXNzLnNlcXVlbmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0ZXAgPSBwcm9ncmVzcy5zZXF1ZW5jZVtpXTtcbiAgICAvLyBUaGUgYWN0aW9uIG11c3QgYmUgZG9uZSBhdCB0aGUgcmVjb3JkZWQgdGltZS5cbiAgICBzeXN0ZW0udGltZSA9IHN0ZXAud2hlbjtcbiAgICBwcm9jZXNzTGluayhzdGVwLmxpbmspO1xuICB9XG4gIGludGVyYWN0aXZlID0gdHJ1ZTtcblxuICAvLyBSZXZlcnNlIGVuZ2luZWVyIHRoZSBzdGFydCB0aW1lLlxuICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKiAwLjAwMTtcbiAgc3RhcnRUaW1lID0gbm93IC0gcHJvZ3Jlc3Muc2F2ZVRpbWU7XG5cbiAgLy8gQmVjYXVzZSB3ZSBkaWQgdGhlIHJ1biB0aHJvdWdoIG5vbi1pbnRlcmFjdGl2ZWx5LCBub3cgd2VcbiAgLy8gbmVlZCB0byB1cGRhdGUgdGhlIFVJLlxuICBzaG93UXVhbGl0aWVzKCk7XG59O1xuXG4vLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0IGJhc2VkIG9uIHRoZSBjb2RlIHByb3ZpZGVkIGJ5IE9yZW9sZWsuXG4oZnVuY3Rpb24oKSB7XG4gdmFyIGNvZGVzVG9UcnkgPSB7fTtcbiAvKiBDb21waWxlcyBhIGxpc3Qgb2YgZmFsbGJhY2sgbGFuZ3VhZ2VzIHRvIHRyeSBpZiB0aGUgZ2l2ZW4gY29kZVxuICAqIGRvZXNuJ3QgaGF2ZSB0aGUgbWVzc2FnZSB3ZSBuZWVkLiBDYWNoZXMgaXQgZm9yIGZ1dHVyZSB1c2UuICovXG4gdmFyIGdldENvZGVzVG9UcnkgPSBmdW5jdGlvbihsYW5ndWFnZUNvZGUpIHtcbiB2YXIgY29kZUFycmF5ID0gY29kZXNUb1RyeVtsYW5ndWFnZUNvZGVdO1xuIGlmIChjb2RlQXJyYXkpIHJldHVybiBjb2RlQXJyYXk7XG5cbiBjb2RlQXJyYXkgPSBbXTtcbiBpZiAobGFuZ3VhZ2VDb2RlIGluIHVuZHVtLmxhbmd1YWdlKSB7XG4gY29kZUFycmF5LnB1c2gobGFuZ3VhZ2VDb2RlKTtcbiB9XG4gdmFyIGVsZW1lbnRzID0gbGFuZ3VhZ2VDb2RlLnNwbGl0KCctJyk7XG4gZm9yICh2YXIgaSA9IGVsZW1lbnRzLmxlbmd0aC0yOyBpID4gMDsgaS0tKSB7XG4gdmFyIHRoaXNDb2RlID0gZWxlbWVudHMuc2xpY2UoMCwgaSkuam9pbignLScpO1xuIGlmICh0aGlzQ29kZSBpbiB1bmR1bS5sYW5ndWFnZSkge1xuIGNvZGVBcnJheS5wdXNoKHRoaXNDb2RlKTtcbiB9XG4gfVxuIGNvZGVBcnJheS5wdXNoKFwiXCIpO1xuIGNvZGVzVG9UcnlbbGFuZ3VhZ2VDb2RlXSA9IGNvZGVBcnJheTtcbiByZXR1cm4gY29kZUFycmF5O1xuIH07XG4gdmFyIGxvb2t1cCA9IGZ1bmN0aW9uKGxhbmd1YWdlQ29kZSwgbWVzc2FnZSkge1xuICAgdmFyIGxhbmd1YWdlRGF0YSA9IHVuZHVtLmxhbmd1YWdlW2xhbmd1YWdlQ29kZV07XG4gICBpZiAoIWxhbmd1YWdlRGF0YSkgcmV0dXJuIG51bGw7XG4gICByZXR1cm4gbGFuZ3VhZ2VEYXRhW21lc3NhZ2VdO1xuIH07XG4gdmFyIGxvY2FsaXplID0gZnVuY3Rpb24obGFuZ3VhZ2VDb2RlLCBtZXNzYWdlKSB7XG4gICB2YXIgbG9jYWxpemVkLCB0aGlzQ29kZTtcbiAgIHZhciBsYW5ndWFnZUNvZGVzID0gZ2V0Q29kZXNUb1RyeShsYW5ndWFnZUNvZGUpO1xuICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYW5ndWFnZUNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgIHRoaXNDb2RlID0gbGFuZ3VhZ2VDb2Rlc1tpXTtcbiAgICAgbG9jYWxpemVkID0gbG9va3VwKHRoaXNDb2RlLCBtZXNzYWdlKTtcbiAgICAgaWYgKGxvY2FsaXplZCkgcmV0dXJuIGxvY2FsaXplZDtcbiAgIH1cbiAgIHJldHVybiBtZXNzYWdlO1xuIH07XG5cbiAvLyBBUElcbiBTdHJpbmcucHJvdG90eXBlLmwgPSBmdW5jdGlvbihhcmdzKSB7XG4gICAvLyBHZXQgbGFuZyBhdHRyaWJ1dGUgZnJvbSBodG1sIHRhZy5cbiAgIHZhciBsYW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImh0bWxcIikuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSB8fCBcIlwiO1xuXG4gICAvLyBGaW5kIHRoZSBsb2NhbGl6ZWQgZm9ybS5cbiAgIHZhciBsb2NhbGl6ZWQgPSBsb2NhbGl6ZShsYW5nLCB0aGlzKTtcblxuICAgLy8gTWVyZ2UgaW4gYW55IHJlcGxhY2VtZW50IGNvbnRlbnQuXG4gICBpZiAoYXJncykge1xuICAgICBmb3IgKHZhciBuYW1lIGluIGFyZ3MpIHtcbiAgICAgICBsb2NhbGl6ZWQgPSBsb2NhbGl6ZWQucmVwbGFjZShcbiAgICAgICAgICAgbmV3IFJlZ0V4cChcIlxcXFx7XCIrbmFtZStcIlxcXFx9XCIpLCBhcmdzW25hbWVdXG4gICAgICAgICAgICk7XG4gICAgIH1cbiAgIH1cbiAgIHJldHVybiBsb2NhbGl6ZWQ7XG4gfTtcbn0pKCk7XG5cbi8vIFJhbmRvbSBOdW1iZXIgZ2VuZXJhdGlvbiBiYXNlZCBvbiBzZWVkcmFuZG9tLmpzIGNvZGUgYnkgRGF2aWQgQmF1LlxuLy8gQ29weXJpZ2h0IDIwMTAgRGF2aWQgQmF1LCBhbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Jcbi8vIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZ1xuLy8gY29uZGl0aW9ucyBhcmUgbWV0OlxuLy9cbi8vICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZVxuLy8gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4vLyAgICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy9cbi8vICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlXG4vLyAgICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlclxuLy8gICAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuLy9cbi8vICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZSBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4vLyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlblxuLy8gICAgICBwZXJtaXNzaW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORFxuLy8gQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLFxuLy8gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4vLyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SXG4vLyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVFxuLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4vLyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKVxuLy8gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4vLyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Jcbi8vIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4vLyBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxudmFyIFJhbmRvbSA9IChmdW5jdGlvbigpIHtcbiAgLy8gV2l0aGluIHRoaXMgY2xvc3VyZSBmdW5jdGlvbiB0aGUgY29kZSBpcyBiYXNpY2FsbHlcbiAgLy8gRGF2aWQncy4gVW5kdW0ncyBjdXN0b20gZXh0ZW5zaW9ucyBhcmUgYWRkZWQgdG8gdGhlXG4gIC8vIHByb3RvdHlwZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciB3aWR0aCA9IDI1NjtcbiAgdmFyIGNodW5rcyA9IDY7XG4gIHZhciBzaWduaWZpY2FuY2VFeHBvbmVudCA9IDUyO1xuICB2YXIgc3RhcnRkZW5vbSA9IE1hdGgucG93KHdpZHRoLCBjaHVua3MpO1xuICB2YXIgc2lnbmlmaWNhbmNlID0gTWF0aC5wb3coMiwgc2lnbmlmaWNhbmNlRXhwb25lbnQpO1xuICB2YXIgb3ZlcmZsb3cgPSBzaWduaWZpY2FuY2UgKiAyO1xuXG4gIHZhciBSYW5kb20gPSBmdW5jdGlvbihzZWVkKSB7XG4gICAgdGhpcy5yYW5kb20gPSBudWxsO1xuICAgIGlmICghc2VlZCkgdGhyb3cge1xuICAgICAgbmFtZTogXCJSYW5kb21TZWVkRXJyb3JcIixcbiAgICAgIG1lc3NhZ2U6IFwicmFuZG9tX3NlZWRfZXJyb3JcIi5sKClcbiAgICB9O1xuICAgIHZhciBrZXkgPSBbXTtcbiAgICBtaXhrZXkoc2VlZCwga2V5KTtcbiAgICB2YXIgYXJjNCA9IG5ldyBBUkM0KGtleSk7XG4gICAgdGhpcy5yYW5kb20gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBuID0gYXJjNC5nKGNodW5rcyk7XG4gICAgICB2YXIgZCA9IHN0YXJ0ZGVub207XG4gICAgICB2YXIgeCA9IDA7XG4gICAgICB3aGlsZSAobiA8IHNpZ25pZmljYW5jZSkge1xuICAgICAgICBuID0gKG4gKyB4KSAqIHdpZHRoO1xuICAgICAgICBkICo9IHdpZHRoO1xuICAgICAgICB4ID0gYXJjNC5nKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHtcbiAgICAgICAgbiAvPSAyO1xuICAgICAgICBkIC89IDI7XG4gICAgICAgIHggPj4+PSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChuICsgeCkgLyBkO1xuICAgIH07XG4gIH07XG4gIC8vIEhlbHBlciB0eXBlLlxuICB2YXIgQVJDNCA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB0LCB1LCBtZSA9IHRoaXMsIGtleWxlbiA9IGtleS5sZW5ndGg7XG4gICAgdmFyIGkgPSAwLCBqID0gbWUuaSA9IG1lLmogPSBtZS5tID0gMDtcbiAgICBtZS5TID0gW107XG4gICAgbWUuYyA9IFtdO1xuICAgIGlmICgha2V5bGVuKSB7IGtleSA9IFtrZXlsZW4rK107IH1cbiAgICB3aGlsZSAoaSA8IHdpZHRoKSB7IG1lLlNbaV0gPSBpKys7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgICAgdCA9IG1lLlNbaV07XG4gICAgICBqID0gbG93Yml0cyhqICsgdCArIGtleVtpICUga2V5bGVuXSk7XG4gICAgICB1ID0gbWUuU1tqXTtcbiAgICAgIG1lLlNbaV0gPSB1O1xuICAgICAgbWUuU1tqXSA9IHQ7XG4gICAgfVxuICAgIG1lLmcgPSBmdW5jdGlvbiBnZXRuZXh0KGNvdW50KSB7XG4gICAgICB2YXIgcyA9IG1lLlM7XG4gICAgICB2YXIgaSA9IGxvd2JpdHMobWUuaSArIDEpOyB2YXIgdCA9IHNbaV07XG4gICAgICB2YXIgaiA9IGxvd2JpdHMobWUuaiArIHQpOyB2YXIgdSA9IHNbal07XG4gICAgICBzW2ldID0gdTtcbiAgICAgIHNbal0gPSB0O1xuICAgICAgdmFyIHIgPSBzW2xvd2JpdHModCArIHUpXTtcbiAgICAgIHdoaWxlICgtLWNvdW50KSB7XG4gICAgICAgIGkgPSBsb3diaXRzKGkgKyAxKTsgdCA9IHNbaV07XG4gICAgICAgIGogPSBsb3diaXRzKGogKyB0KTsgdSA9IHNbal07XG4gICAgICAgIHNbaV0gPSB1O1xuICAgICAgICBzW2pdID0gdDtcbiAgICAgICAgciA9IHIgKiB3aWR0aCArIHNbbG93Yml0cyh0ICsgdSldO1xuICAgICAgfVxuICAgICAgbWUuaSA9IGk7XG4gICAgICBtZS5qID0gajtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG4gICAgbWUuZyh3aWR0aCk7XG4gIH07XG4gIC8vIEhlbHBlciBmdW5jdGlvbnMuXG4gIHZhciBtaXhrZXkgPSBmdW5jdGlvbihzZWVkLCBrZXkpIHtcbiAgICBzZWVkICs9ICcnO1xuICAgIHZhciBzbWVhciA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWVkLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbGIgPSBsb3diaXRzKGopO1xuICAgICAgc21lYXIgXj0ga2V5W2xiXTtcbiAgICAgIGtleVtsYl0gPSBsb3diaXRzKHNtZWFyKjE5ICsgc2VlZC5jaGFyQ29kZUF0KGopKTtcbiAgICB9XG4gICAgc2VlZCA9ICcnO1xuICAgIGZvciAoaiBpbiBrZXkpIHtcbiAgICAgIHNlZWQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXlbal0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VlZDtcbiAgfTtcbiAgdmFyIGxvd2JpdHMgPSBmdW5jdGlvbihuKSB7XG4gICAgcmV0dXJuIG4gJiAod2lkdGggLSAxKTtcbiAgfTtcblxuICByZXR1cm4gUmFuZG9tO1xufSkoKTtcbi8qIFJldHVybnMgYSByYW5kb20gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gemVybyBhbmRcbiAqIG9uZS4gTkI6IFRoZSBwcm90b3R5cGUgaW1wbGVtZW50YXRpb24gYmVsb3cganVzdCB0aHJvd3MgYW5cbiAqIGVycm9yLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4gaW4gZWFjaCBSYW5kb20gb2JqZWN0IHdoZW4gdGhlXG4gKiBzZWVkIGhhcyBiZWVuIGNvcnJlY3RseSBjb25maWd1cmVkLiAqL1xuUmFuZG9tLnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbigpIHtcbiAgdGhyb3cge1xuICAgIG5hbWU6XCJSYW5kb21FcnJvclwiLFxuICAgIG1lc3NhZ2U6IFwicmFuZG9tX2Vycm9yXCIubCgpXG4gIH07XG59O1xuLyogUmV0dXJucyBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIGdpdmVuIG1pbiBhbmQgbWF4IHZhbHVlcyxcbiAqIGluY2x1c2l2ZS4gKi9cblJhbmRvbS5wcm90b3R5cGUucmFuZG9tSW50ID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgcmV0dXJuIG1pbiArIE1hdGguZmxvb3IoKG1heC1taW4rMSkqdGhpcy5yYW5kb20oKSk7XG59O1xuLyogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvbGxpbmcgbiBkaWNlIHdpdGggZHggc2lkZXMsIGFuZCBhZGRpbmdcbiAqIHBsdXMuICovXG5SYW5kb20ucHJvdG90eXBlLmRpY2UgPSBmdW5jdGlvbihuLCBkeCwgcGx1cykge1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gdGhpcy5yYW5kb21JbnQoMSwgZHgpO1xuICB9XG4gIGlmIChwbHVzKSByZXN1bHQgKz0gcGx1cztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4vKiBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm9sbGluZyBuIGF2ZXJhZ2luZyBkaWNlIChpLmUuIDYgc2lkZWQgZGljZVxuICogd2l0aCBzaWRlcyAyLDMsMyw0LDQsNSkuIEFuZCBhZGRpbmcgcGx1cy4gKi9cblJhbmRvbS5wcm90b3R5cGUuYXZlRGljZSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIG1hcHBpbmcgPSBbMiwzLDMsNCw0LDVdO1xuICByZXR1cm4gZnVuY3Rpb24obiwgcGx1cykge1xuICAgIHZhciByZXN1bHQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gbWFwcGluZ1t0aGlzLnJhbmRvbUludCgwLCA1KV07XG4gICAgfVxuICAgIGlmIChwbHVzKSByZXN1bHQgKz0gcGx1cztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSkoKTtcbi8qIFJldHVybnMgYSBkaWNlLXJvbGwgcmVzdWx0IGZyb20gdGhlIGdpdmVuIHN0cmluZyBkaWNlXG4gKiBzcGVjaWZpY2F0aW9uLiBUaGUgc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0geGR5K3osXG4gKiB3aGVyZSB0aGUgeCBjb21wb25lbnQgYW5kIHogY29tcG9uZW50IGFyZSBvcHRpb25hbC4gVGhpcyByb2xsc1xuICogeCBkaWNlIG9mIHdpdGggeSBzaWRlcywgYW5kIGFkZHMgeiB0byB0aGUgcmVzdWx0LCB0aGUgelxuICogY29tcG9uZW50IGNhbiBhbHNvIGJlIG5lZ2F0aXZlOiB4ZHktei4gVGhlIHkgY29tcG9uZW50IGNhbiBiZVxuICogZWl0aGVyIGEgbnVtYmVyIG9mIHNpZGVzLCBvciBjYW4gYmUgdGhlIHNwZWNpYWwgdmFsdWVzICdGJywgZm9yXG4gKiBhIGZ1ZGdlIGRpZSAod2l0aCAzIHNpZGVzLCArLDAsLSksICclJyBmb3IgYSAxMDAgc2lkZWQgZGllLCBvclxuICogJ0EnIGZvciBhbiBhdmVyYWdpbmcgZGllICh3aXRoIHNpZGVzIDIsMywzLDQsNCw1KS5cbiAqL1xuUmFuZG9tLnByb3RvdHlwZS5kaWNlU3RyaW5nID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgZGljZVJlID0gL14oWzEtOV1bMC05XSopP2QoWyVGQV18WzEtOV1bMC05XSopKFstK11bMS05XVswLTldKik/JC87XG4gIHJldHVybiBmdW5jdGlvbihkZWYpIHtcbiAgICB2YXIgbWF0Y2ggPSBkZWYubWF0Y2goZGljZVJlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaWNlX3N0cmluZ19lcnJvclwiLmwoe3N0cmluZzpkZWZ9KSk7XG4gICAgfVxuXG4gICAgdmFyIG51bSA9IG1hdGNoWzFdP3BhcnNlSW50KG1hdGNoWzFdLCAxMCk6MTtcbiAgICB2YXIgc2lkZXM7XG4gICAgdmFyIGJvbnVzID0gbWF0Y2hbM10/cGFyc2VJbnQobWF0Y2hbM10sIDEwKTowO1xuXG4gICAgc3dpdGNoIChtYXRjaFsyXSkge1xuICAgICAgY2FzZSAnQSc6XG4gICAgICAgIHJldHVybiB0aGlzLmF2ZURpY2UobnVtLCBib251cyk7XG4gICAgICBjYXNlICdGJzpcbiAgICAgICAgc2lkZXMgPSAzO1xuICAgICAgICBib251cyAtPSBudW0qMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICclJzpcbiAgICAgICAgc2lkZXMgPSAxMDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2lkZXMgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpY2UobnVtLCBzaWRlcywgYm9udXMpO1xuICB9O1xufSkoKTtcbiIsIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXR1cFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyogRXhwb3J0IG91ciBBUEkuICovXG53aW5kb3cudW5kdW0gPSB7XG4gIFNpdHVhdGlvbjogU2l0dWF0aW9uLFxuICBTaW1wbGVTaXR1YXRpb246IFNpbXBsZVNpdHVhdGlvbixcblxuICBRdWFsaXR5RGVmaW5pdGlvbjogUXVhbGl0eURlZmluaXRpb24sXG4gIEludGVnZXJRdWFsaXR5OiBJbnRlZ2VyUXVhbGl0eSxcbiAgTm9uWmVyb0ludGVnZXJRdWFsaXR5OiBOb25aZXJvSW50ZWdlclF1YWxpdHksXG4gIE51bWVyaWNRdWFsaXR5OiBOdW1lcmljUXVhbGl0eSxcbiAgV29yZFNjYWxlUXVhbGl0eTogV29yZFNjYWxlUXVhbGl0eSxcbiAgRnVkZ2VBZGplY3RpdmVzUXVhbGl0eTogRnVkZ2VBZGplY3RpdmVzUXVhbGl0eSxcbiAgT25PZmZRdWFsaXR5OiBPbk9mZlF1YWxpdHksXG4gIFllc05vUXVhbGl0eTogWWVzTm9RdWFsaXR5LFxuXG4gIFF1YWxpdHlHcm91cDogUXVhbGl0eUdyb3VwLFxuXG4gIGdhbWU6IGdhbWUsXG5cbiAgaXNJbnRlcmFjdGl2ZTogZnVuY3Rpb24oKSB7IHJldHVybiBpbnRlcmFjdGl2ZTsgfSxcblxuICAvLyBUaGUgdW5kdW0gc2V0IG9mIHRyYW5zbGF0ZWQgc3RyaW5ncy5cbiAgbGFuZ3VhZ2U6IHt9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVmYXVsdCBNZXNzYWdlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBlbiA9IHtcbiAgdGVycmlibGU6IFwidGVycmlibGVcIixcbiAgcG9vcjogXCJwb29yXCIsXG4gIG1lZGlvY3JlOiBcIm1lZGlvY3JlXCIsXG4gIGZhaXI6IFwiZmFpclwiLFxuICBnb29kOiBcImdvb2RcIixcbiAgZ3JlYXQ6IFwiZ3JlYXRcIixcbiAgc3VwZXJiOiBcInN1cGVyYlwiLFxuICB5ZXM6IFwieWVzXCIsXG4gIG5vOiBcIm5vXCIsXG4gIGNob2ljZTogXCJDaG9pY2Uge251bWJlcn1cIixcbiAgbm9fZ3JvdXBfZGVmaW5pdGlvbjogXCJDb3VsZG4ndCBmaW5kIGEgZ3JvdXAgZGVmaW5pdGlvbiBmb3Ige2lkfS5cIixcbiAgbGlua19ub3RfdmFsaWQ6IFwiVGhlIGxpbmsgJ3tsaW5rfScgZG9lc24ndCBhcHBlYXIgdG8gYmUgdmFsaWQuXCIsXG4gIGxpbmtfbm9fYWN0aW9uOiBcIkEgbGluayB3aXRoIGEgc2l0dWF0aW9uIG9mICcuJywgbXVzdCBoYXZlIGFuIGFjdGlvbi5cIixcbiAgdW5rbm93bl9zaXR1YXRpb246IFwiWW91IGNhbid0IG1vdmUgdG8gYW4gdW5rbm93biBzaXR1YXRpb246IHtpZH0uXCIsXG4gIGV4aXN0aW5nX3NpdHVhdGlvbjogXCJZb3UgY2FuJ3Qgb3ZlcnJpZGUgc2l0dWF0aW9uIHtpZH0gaW4gSFRNTC5cIixcbiAgZXJhc2VfbWVzc2FnZTogXCJUaGlzIHdpbGwgcGVybWFuZW50bHkgZGVsZXRlIHRoaXMgY2hhcmFjdGVyIGFuZCBpbW1lZGlhdGVseSByZXR1cm4geW91IHRvIHRoZSBzdGFydCBvZiB0aGUgZ2FtZS4gQXJlIHlvdSBzdXJlP1wiLFxuICBub19jdXJyZW50X3NpdHVhdGlvbjogXCJJIGNhbid0IGRpc3BsYXksIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnQgc2l0dWF0aW9uLlwiLFxuICBub19sb2NhbF9zdG9yYWdlOiBcIk5vIGxvY2FsIHN0b3JhZ2UgYXZhaWxhYmxlLlwiLFxuICByYW5kb21fc2VlZF9lcnJvcjogXCJZb3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgcmFuZG9tIHNlZWQuXCIsXG4gIHJhbmRvbV9lcnJvcjogXCJJbml0aWFsaXplIHRoZSBSYW5kb20gd2l0aCBhIG5vbi1lbXB0eSBzZWVkIGJlZm9yZSB1c2UuXCIsXG4gIGRpY2Vfc3RyaW5nX2Vycm9yOiBcIkNvdWxkbid0IGludGVycHJldCB5b3VyIGRpY2Ugc3RyaW5nOiAne3N0cmluZ30nLlwiXG59O1xuXG4vLyBTZXQgdGhpcyBkYXRhIGFzIGJvdGggdGhlIGRlZmF1bHQgZmFsbGJhY2sgbGFuZ3VhZ2UsIGFuZCB0aGUgZW5nbGlzaFxuLy8gcHJlZmVycmVkIGxhbmd1YWdlLlxudW5kdW0ubGFuZ3VhZ2VbXCJcIl0gPSBlbjtcbnVuZHVtLmxhbmd1YWdlW1wiZW5cIl0gPSBlbjtcblxuLyogU2V0IHVwIHRoZSBnYW1lIHdoZW4gZXZlcnl0aGluZyBpcyBsb2FkZWQuICovXG5mdW5jdGlvbiByZWFkeShmbikge1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSAnbG9hZGluZycpe1xuICAgIGZuKCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKTtcbiAgfVxufVxuXG5yZWFkeShmdW5jdGlvbigpIHtcbiAgLy8gQ29tcGlsZSBhZGRpdGlvbmFsIHNpdHVhdGlvbnMgZnJvbSBIVE1MXG4gIGxvYWRIVE1MU2l0dWF0aW9ucygpO1xuXG4gIC8vIEhhbmRsZSBzdG9yYWdlLlxuICBpZiAoaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICB2YXIgZXJhc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVyYXNlXCIpO1xuICAgIGVyYXNlLm9uY2xpY2sgPSBkb0VyYXNlO1xuICAgIGVyYXNlLmtleWRvd24gPSBkb0VyYXNlO1xuICAgIHZhciBzYXZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlXCIpO1xuICAgIHNhdmUub25jbGljayA9IHNhdmVHYW1lO1xuICAgIHNhdmUua2V5ZG93biA9IHNhdmVHYW1lO1xuXG4gICAgdmFyIHN0b3JlZENoYXJhY3RlciA9IGxvY2FsU3RvcmFnZVtnZXRTYXZlSWQoKV07XG4gICAgaWYgKHN0b3JlZENoYXJhY3Rlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9hZEdhbWUoSlNPTi5wYXJzZShzdG9yZWRDaGFyYWN0ZXIpKTtcbiAgICAgICAgc2F2ZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIGVyYXNlLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIGZhbHNlKTtcbiAgICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIGRvRXJhc2UodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNhdmUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgZXJhc2Uuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gICAgICBzdGFydEdhbWUoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5idXR0b25zXCIpLmlubmVySFRNTCA9IFwiPHA+XCIrXCJub19sb2NhbF9zdG9yYWdlXCIubCgpK1wiPC9wPlwiO1xuICAgIHN0YXJ0R2FtZSgpO1xuICB9XG5cbiAgLy8gaGFuZGxlIHRoZSBsaW5rIGNsaWNrc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRlbnRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGxpbmtDbGlja0hhbmRsZXIsIGZhbHNlKTtcblxuICAvLyBEaXNwbGF5IHRoZSBcImNsaWNrIHRvIGJlZ2luXCIgbWVzc2FnZS4gKFdlIGRvIHRoaXMgaW4gY29kZVxuICAvLyBzbyB0aGF0LCBpZiBKYXZhc2NyaXB0IGlzIG9mZiwgaXQgZG9lc24ndCBoYXBwZW4uKVxuICBzaG93QmxvY2soXCJjbGlja19tZXNzYWdlXCIpO1xuXG4gIC8vIFNob3cgdGhlIGdhbWUgd2hlbiB3ZSBjbGljayBvbiB0aGUgdGl0bGUuXG4gIC8vIE5vdGU6IGlmIHlvdSBkbyBldmVudHMgd2l0aCBvbmNsaWNrLCB5b3UgaGF2ZSB0byBoYXZlIG9ubHkgb25lIGNsaWNrIGV2ZW50IGhhbmRsZXIuXG4gIC8vIFlvdSBjYW4gdXNlIG1vcmUgY29tcGxleCBtZXRob2RzIGlmIHlvdSBleHBlY3QgdG8gaGF2ZSBtb3JlLlxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpdGxlXCIpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICBzaG93QmxvY2soXCJjb250ZW50XCIpXG4gICAgc2hvd0Jsb2NrKFwiY29udGVudF93cmFwcGVyXCIpO1xuICAgIHNob3dCbG9jayhcImxlZ2FsXCIpO1xuICAgIHNob3dCbG9jayhcInRvb2xzX3dyYXBwZXJcIik7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aXRsZVwiKS5zdHlsZS5jdXJzb3IgPSBcImRlZmF1bHRcIjtcbiAgICBoaWRlQmxvY2soXCJjbGlja19tZXNzYWdlXCIpO1xuICB9O1xuXG4vKlxuICAvLyBBbnkgcG9pbnQgdGhhdCBhbiBvcHRpb24gbGlzdCBhcHBlYXJzLCBpdHMgb3B0aW9ucyBhcmUgaXRzXG4gIC8vIGZpcnN0IGxpbmtzLlxuICB2YXIgb3B0aW9uTGlua0V2ZW50ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBNYWtlIG9wdGlvbiBjbGlja3MgcGFzcyB0aHJvdWdoIHRvIHRoZWlyIGZpcnN0IGxpbmsuXG4gICAgdmFyIGxpbmsgPSAkKFwiYVwiLCB0aGlzKTtcbiAgICBpZiAobGluay5sZW5ndGggPiAwKSB7XG4gICAgICAkKGxpbmsuZ2V0KDApKS5jbGljaygpO1xuICAgIH1cbiAgfTtcbiAgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwidWwub3B0aW9ucyBsaSwgI21lbnUgbGlcIik7XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaXRlbXMsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KXtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9uTGlua0V2ZW50KTtcbiAgfSk7XG4qL1xufSk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file diff --git a/src/private.js b/src/private.js index fcd68b1..16081f2 100644 --- a/src/private.js +++ b/src/private.js @@ -290,8 +290,8 @@ var startOutputTransaction = function() { } // The default is "all the way down". scrollStack.push( - $("#content").height() + $("#title").height() + 60 - ); + document.getElementById("content").offsetHeight + document.getElementById("title").offsetHeight + 60 + ); }; var continueOutputTransaction = function() { if (pendingFirstWrite) { @@ -342,7 +342,7 @@ var processLink = function(code) { endOutputTransaction(); // We're able to save, if we weren't already. - $("#save").attr('disabled', false); + document.getElementById("save").setAttribute('disabled', false); }; /* This gets called to actually do the work of processing a code. @@ -392,13 +392,21 @@ var processOneLink = function(code) { } }; +/* This function listens on content block to filter out link clicks. */ +var linkClickHandler = function(event) { + if (event.target.tagName.toLowerCase() === 'a') { + event.preventDefault(); + processClick(event.target.href); + } +} + /* This gets called when the user clicks a link to carry out an * action. */ var processClick = function(code) { var now = (new Date()).getTime() * 0.001; system.time = now - startTime; progress.sequence.push({link:code, when:system.time}); - processLink(code); + return processLink(code); }; /* Transitions between situations. */ diff --git a/src/setup.js b/src/setup.js index cd65981..71572d2 100644 --- a/src/setup.js +++ b/src/setup.js @@ -99,6 +99,9 @@ ready(function() { startGame(); } + // handle the link clicks + document.getElementById("content").addEventListener("click", linkClickHandler, false); + // Display the "click to begin" message. (We do this in code // so that, if Javascript is off, it doesn't happen.) showBlock("click_message");